aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLubomir Rintel <lkundrak@v3.sk>2020-03-02 01:02:24 +0100
committerLubomir Rintel <lkundrak@v3.sk>2020-03-23 19:02:10 +0100
commit0987d12a150c386cc9c41c5c4833d85f499fe58c (patch)
treeaa95d3528b6e175b306e0c2d0648c73c86832712
parentbf575678045589173476c451514e8441e7043308 (diff)
downloadopenfirmware-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.fth5
-rw-r--r--dev/usb2/device/net/ethernet.fth12
-rw-r--r--dev/usb2/device/net/pegasus.fth9
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!