diff options
author | Lubomir Rintel <lkundrak@v3.sk> | 2020-03-02 01:02:24 +0100 |
---|---|---|
committer | Lubomir Rintel <lkundrak@v3.sk> | 2020-03-23 19:02:10 +0100 |
commit | 0987d12a150c386cc9c41c5c4833d85f499fe58c (patch) | |
tree | aa95d3528b6e175b306e0c2d0648c73c86832712 | |
parent | bf575678045589173476c451514e8441e7043308 (diff) | |
download | openfirmware-0987d12a150c386cc9c41c5c4833d85f499fe58c.tar.gz |
usb2/net: add length-header callback
This allows the drivers to prepend extra headers to the packet data for
hardware that requires that. It is a more flexible replacement for
length-header? logic that only prepends Pegasus-style length header.
-rw-r--r-- | dev/usb2/device/net/common.fth | 5 | ||||
-rw-r--r-- | dev/usb2/device/net/ethernet.fth | 12 | ||||
-rw-r--r-- | dev/usb2/device/net/pegasus.fth | 9 |
3 files changed, 16 insertions, 10 deletions
diff --git a/dev/usb2/device/net/common.fth b/dev/usb2/device/net/common.fth index 3bf8455b..465f60dd 100644 --- a/dev/usb2/device/net/common.fth +++ b/dev/usb2/device/net/common.fth @@ -31,6 +31,9 @@ defer mii! ( val reg -- ) ' drop to mii@ external defer promiscuous ( -- ) ' noop to promiscuous defer set-multicast ( adr len -- ) ' 2drop to set-multicast + +: no-header ( adr len -- hdrlen ) 2drop 0 ; +defer length-header ( adr len -- hdrlen ) ' no-header to length-header headers : phy-loopback{ ( -- ) @@ -51,8 +54,6 @@ headers 0 value multi-packet? \ True if a single USB transaction can \ transfer multiple network packets, e.g. ax88772 -0 value length-header? \ True if 16-bit little-endian length header is - \ prefixed to outgoing frames (pegasus) 0 value residue \ Remaining bytes in the packet buffer 0 value pkt-adr \ Offset into the packet buffer diff --git a/dev/usb2/device/net/ethernet.fth b/dev/usb2/device/net/ethernet.fth index 466557d7..b838575b 100644 --- a/dev/usb2/device/net/ethernet.fth +++ b/dev/usb2/device/net/ethernet.fth @@ -50,13 +50,11 @@ external tuck outbuf 4 + swap move ( len ) 4 + ( len' ) else - length-header? if ( adr len ) - dup outbuf le-w! ( adr len ) - tuck outbuf 2 + swap move ( len ) - 2 + ( len ) - else - tuck outbuf swap move ( len ) - then ( len ) + outbuf over length-header ( adr len hdrlen ) + 2dup + ( adr len hdrlen len' ) + swap 2swap rot ( len' adr len hdrlen ) + outbuf + ( len' adr len adr' ) + swap move ( len' ) then ; diff --git a/dev/usb2/device/net/pegasus.fth b/dev/usb2/device/net/pegasus.fth index a0da9b84..23efdcbb 100644 --- a/dev/usb2/device/net/pegasus.fth +++ b/dev/usb2/device/net/pegasus.fth @@ -119,7 +119,6 @@ h# f1 constant SET_REG ; : pg-init-nic ( -- ) - true to length-header? init-buf pg-get-mac-address 2drop pg-init-mac @@ -149,6 +148,13 @@ h# f1 constant SET_REG 0 ectl0 2 pg-write-reg ; +\ Outgoing frames need to be prefixed with a 16-bit little-endian +\ length header +: pg-length-header ( adr len -- hdrlen ) + over le-w! ( adr ) + 2 ( hdrlen ) +; + \ Process the length header that's inlined after the frame : pg-unwrap-msg ( adr len -- adr len ) over + 4 - ( len-adr ) @@ -163,6 +169,7 @@ h# f1 constant SET_REG ['] pg-start-mac to start-mac ['] pg-stop-mac to stop-mac ['] pg-get-mac-address to get-mac-address + ['] pg-length-header to length-header ['] pg-unwrap-msg to unwrap-msg ['] pg-mii@ to mii@ ['] pg-mii! to mii! |