Author: wmb Date: 2010-01-15 03:48:23 +0100 (Fri, 15 Jan 2010) New Revision: 1675
Modified: dev/usb2/device/net/ax8817x.fth dev/usb2/device/net/common.fth dev/usb2/device/net/ethernet.fth dev/usb2/device/net/pegasus.fth Log: OLPC trac 9691 - changed the order of some steps in the USB ethernet start code in hopes of eliminating the "lost first receive packet" syndrome. With these changes, the two Asix-based adapters that I have in hand both start reliably with no DHCP retries.
Modified: dev/usb2/device/net/ax8817x.fth =================================================================== --- dev/usb2/device/net/ax8817x.fth 2010-01-14 06:27:28 UTC (rev 1674) +++ dev/usb2/device/net/ax8817x.fth 2010-01-15 02:48:23 UTC (rev 1675) @@ -217,8 +217,7 @@
h# 88 value def-rx-ctl \ SO (MAC ON) and AB (accept broadcast)
-: ax-start-nic ( -- ) - ax-auto-neg-wait +: ax-start-mac ( -- ) h# 88 use-promiscuous? if 1 or @@ -228,9 +227,13 @@ to def-rx-ctl def-rx-ctl rx-ctl! ; + +: ax-start-phy ( -- ) + ax-auto-neg-wait +; : ax-promiscuous ( -- ) rx-ctl@ 1 or rx-ctl! ; : ax-set-multicast ( adr len -- ) 2drop rx-ctl@ 2 or rx-ctl! ; -: ax-stop-nic ( -- ) 0 rx-ctl! ; +: ax-stop-mac ( -- ) 0 rx-ctl! ;
: ax-init-nic ( -- ) \ Per ax8817x_bind bulk-out-pipe 3 > if @@ -249,8 +252,7 @@ ax-toggle-gpio ax-get-phyid select-phy - h# 80 rx-ctl! \ Turn off receiver during setup - \ ax-stop-nic + ax-stop-mac ax-get-mac-address 2drop ax-set-ipg ax-init-mii @@ -273,8 +275,9 @@ : init-ax ( -- ) ['] ax-init-nic to init-nic ['] ax-link-up? to link-up? - ['] ax-start-nic to start-nic - ['] ax-stop-nic to stop-nic + ['] ax-start-mac to start-mac + ['] ax-start-phy to start-phy + ['] ax-stop-mac to stop-mac ['] ax-get-mac-address to get-mac-address ['] ax-mii@ to mii@ ['] ax-mii! to mii!
Modified: dev/usb2/device/net/common.fth =================================================================== --- dev/usb2/device/net/common.fth 2010-01-14 06:27:28 UTC (rev 1674) +++ dev/usb2/device/net/common.fth 2010-01-15 02:48:23 UTC (rev 1675) @@ -18,12 +18,13 @@ false value use-multicast?
defer init-nic ( -- ) ' noop to init-nic +defer reset-nic ( -- ) ' noop to reset-nic defer wrap-msg ( adr len -- adr' len' ) ' noop to wrap-msg defer unwrap-msg ( adr len -- adr' len' ) ' noop to unwrap-msg defer link-up? ( -- up? ) ' true to link-up? -defer reset-nic ( -- ) ' noop to reset-nic -defer start-nic ( -- ) ' noop to start-nic -defer stop-nic ( -- ) ' noop to stop-nic +defer start-phy ( -- ) ' noop to start-phy +defer start-mac ( -- ) ' noop to start-mac +defer stop-mac ( -- ) ' noop to stop-mac defer mii{ ( -- ) ' noop to mii{ \ Acquire defer }mii ( -- ) ' noop to }mii \ Release defer mii@ ( reg -- val ) ' noop to mii@ @@ -80,7 +81,7 @@
: property-or-abort ( name$ -- n ) 2dup get-my-property if ( name$ ) - ." Can't find property " type cr stop-nic abort + ." Can't find property " type cr stop-mac abort then ( name$ value$ ) 2swap 2drop decode-int nip nip ( n ) ;
Modified: dev/usb2/device/net/ethernet.fth =================================================================== --- dev/usb2/device/net/ethernet.fth 2010-01-14 06:27:28 UTC (rev 1674) +++ dev/usb2/device/net/ethernet.fth 2010-01-15 02:48:23 UTC (rev 1675) @@ -28,7 +28,7 @@ ;
: stop-net ( -- ) - stop-nic + stop-mac end-bulk-in free-buf ; @@ -41,7 +41,7 @@
: copy-packet ( adr len -- len' ) dup multi-packet? if 4 + then ( adr len len' ) - /outbuf > if ." USB Ethernet write packet too long" cr stop-nic abort then ( adr len ) + /outbuf > if ." USB Ethernet write packet too long" cr stop-mac abort then ( adr len )
multi-packet? if ( adr len ) dup wbsplit ( adr len len.low len.high ) @@ -71,7 +71,7 @@ \ The data format is: \ length.leword ~length.leword data [ pad-to-even ] : extract-packet ( -- data-adr len ) - residue 4 < if ." Short residue from USB Ethernet" cr stop-nic abort then + residue 4 < if ." Short residue from USB Ethernet" cr stop-mac abort then
pkt-adr dup 4 + swap >r r@ c@ r@ 1+ c@ bwjoin ( data-adr length ) @@ -130,7 +130,7 @@ 0 ( adr 0 ) then ( adr ihandle|0 )
- dup 0= if ." Can't open obp-tftp support package" stop-nic abort then + dup 0= if ." Can't open obp-tftp support package" stop-mac abort then ( adr ihandle )
>r @@ -181,23 +181,25 @@ clear-rx 5 0 do try-loopback? ?leave loop }loopback + d# 20 ms \ Settling time after switching back scratch-buf d# 2000 free-mem ;
: do-start? ( -- error? ) - start-nic + start-phy
link-up? 0= if ." Network not connected." cr - stop-nic + end-bulk-in + free-buf true exit then
init-buf inbuf /inbuf bulk-in-pipe begin-bulk-in + start-mac
loopback-test - false ;
Modified: dev/usb2/device/net/pegasus.fth =================================================================== --- dev/usb2/device/net/pegasus.fth 2010-01-14 06:27:28 UTC (rev 1674) +++ dev/usb2/device/net/pegasus.fth 2010-01-15 02:48:23 UTC (rev 1675) @@ -127,8 +127,7 @@ pg-sync-link-status ;
-: pg-start-nic ( -- ) - pg-sync-link-status +: pg-start-mac ( -- ) \ force 100Mbps full-duplex h# 0130c9 use-promiscuous? if @@ -138,10 +137,15 @@ then ectl0 3 pg-write-reg ; + +: pg-start-phy ( -- ) + pg-sync-link-status +; + : pg-promiscuous ( -- ) ectl2 pg-reg-c@ 4 or ectl2 pg-reg-c! ; : pg-set-multicast ( -- ) ectl0 pg-reg-c@ 2 or ectl0 pg-reg-c! ;
-: pg-stop-nic ( -- ) +: pg-stop-mac ( -- ) 0 ectl0 2 pg-write-reg ;
@@ -155,8 +159,9 @@ : init-pegasus ( -- ) ['] pg-init-nic to init-nic ['] pg-link-up? to link-up? - ['] pg-start-nic to start-nic - ['] pg-stop-nic to stop-nic + ['] pg-start-phy to start-phy + ['] pg-start-mac to start-mac + ['] pg-stop-mac to stop-mac ['] pg-get-mac-address to get-mac-address ['] pg-unwrap-msg to unwrap-msg ['] pg-mii@ to mii@