Module Name: src
Committed By: rin
Date: Wed Feb 6 07:56:14 UTC 2019
Modified Files:
src/sys/dev/usb: if_axen.c if_axenreg.h
Log Message:
Support TSOv4 (They call it LSOv1).
The adapter does not support TSOv6 (aka LSOv2).
To generate a diff of this commit:
cvs rdiff -u -r1.28 -r1.29 src/sys/dev/usb/if_axen.c
cvs rdiff -u -r1.7 -r1.8 src/sys/dev/usb/if_axenreg.h
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/dev/usb/if_axen.c
diff -u src/sys/dev/usb/if_axen.c:1.28 src/sys/dev/usb/if_axen.c:1.29
--- src/sys/dev/usb/if_axen.c:1.28 Wed Feb 6 07:48:33 2019
+++ src/sys/dev/usb/if_axen.c Wed Feb 6 07:56:14 2019
@@ -1,4 +1,4 @@
-/* $NetBSD: if_axen.c,v 1.28 2019/02/06 07:48:33 rin Exp $ */
+/* $NetBSD: if_axen.c,v 1.29 2019/02/06 07:56:14 rin Exp $ */
/* $OpenBSD: if_axen.c,v 1.3 2013/10/21 10:10:22 yuo Exp $ */
/*
@@ -23,7 +23,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_axen.c,v 1.28 2019/02/06 07:48:33 rin Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_axen.c,v 1.29 2019/02/06 07:56:14 rin Exp $");
#ifdef _KERNEL_OPT
#include "opt_inet.h"
@@ -50,6 +50,9 @@ __KERNEL_RCSID(0, "$NetBSD: if_axen.c,v
#include <net/bpf.h>
+#include <netinet/in.h> /* XXX for netinet/ip.h */
+#include <netinet/ip.h> /* XXX for IP_MAXPACKET */
+
#include <dev/mii/mii.h>
#include <dev/mii/miivar.h>
@@ -718,16 +721,20 @@ axen_attach(device_t parent, device_t se
/* decide on what our bufsize will be */
switch (sc->axen_udev->ud_speed) {
case USB_SPEED_SUPER:
- sc->axen_bufsz = AXEN_BUFSZ_SS * 1024;
+ sc->axen_rx_bufsz = AXEN_BUFSZ_SS * 1024;
break;
case USB_SPEED_HIGH:
- sc->axen_bufsz = AXEN_BUFSZ_HS * 1024;
+ sc->axen_rx_bufsz = AXEN_BUFSZ_HS * 1024;
break;
default:
- sc->axen_bufsz = AXEN_BUFSZ_LS * 1024;
+ sc->axen_rx_bufsz = AXEN_BUFSZ_LS * 1024;
break;
}
+ sc->axen_tx_bufsz = IP_MAXPACKET +
+ ETHER_HDR_LEN + ETHER_CRC_LEN + ETHER_VLAN_ENCAP_LEN +
+ sizeof(struct axen_sframe_hdr);
+
/* Find endpoints. */
for (i = 0; i < id->bNumEndpoints; i++) {
ed = usbd_interface2endpoint_descriptor(sc->axen_iface, i);
@@ -791,7 +798,10 @@ axen_attach(device_t parent, device_t se
IFQ_SET_READY(&ifp->if_snd);
sc->axen_ec.ec_capabilities = ETHERCAP_VLAN_MTU;
- ifp->if_capabilities |= IFCAP_CSUM_IPv4_Rx | IFCAP_CSUM_IPv4_Tx |
+
+ /* Adapter does not support TSOv6 (They call it LSOv2). */
+ ifp->if_capabilities |= IFCAP_TSOv4 |
+ IFCAP_CSUM_IPv4_Rx | IFCAP_CSUM_IPv4_Tx |
IFCAP_CSUM_TCPv4_Rx | IFCAP_CSUM_TCPv4_Tx |
IFCAP_CSUM_UDPv4_Rx | IFCAP_CSUM_UDPv4_Tx |
IFCAP_CSUM_TCPv6_Rx | IFCAP_CSUM_TCPv6_Tx |
@@ -943,7 +953,7 @@ axen_rx_list_init(struct axen_softc *sc)
c->axen_idx = i;
if (c->axen_xfer == NULL) {
int err = usbd_create_xfer(sc->axen_ep[AXEN_ENDPT_RX],
- sc->axen_bufsz, 0, 0, &c->axen_xfer);
+ sc->axen_rx_bufsz, 0, 0, &c->axen_xfer);
if (err)
return err;
c->axen_buf = usbd_get_buffer(c->axen_xfer);
@@ -969,7 +979,7 @@ axen_tx_list_init(struct axen_softc *sc)
c->axen_idx = i;
if (c->axen_xfer == NULL) {
int err = usbd_create_xfer(sc->axen_ep[AXEN_ENDPT_TX],
- sc->axen_bufsz, USBD_FORCE_SHORT_XFER, 0,
+ sc->axen_tx_bufsz, USBD_FORCE_SHORT_XFER, 0,
&c->axen_xfer);
if (err)
return err;
@@ -1124,7 +1134,7 @@ nextpkt:
done:
/* Setup new transfer. */
- usbd_setup_xfer(xfer, c, c->axen_buf, sc->axen_bufsz,
+ usbd_setup_xfer(xfer, c, c->axen_buf, sc->axen_rx_bufsz,
USBD_SHORT_XFER_OK, USBD_NO_TIMEOUT, axen_rxeof);
usbd_transfer(xfer);
@@ -1291,6 +1301,7 @@ axen_encap(struct axen_softc *sc, struct
}
length = m->m_pkthdr.len + sizeof(hdr);
+ KASSERT(length <= sc->axen_tx_bufsz);
hdr.plen = htole32(m->m_pkthdr.len);
@@ -1437,7 +1448,7 @@ axen_init(struct ifnet *ifp)
for (i = 0; i < AXEN_RX_LIST_CNT; i++) {
c = &sc->axen_cdata.axen_rx_chain[i];
- usbd_setup_xfer(c->axen_xfer, c, c->axen_buf, sc->axen_bufsz,
+ usbd_setup_xfer(c->axen_xfer, c, c->axen_buf, sc->axen_rx_bufsz,
USBD_SHORT_XFER_OK, USBD_NO_TIMEOUT, axen_rxeof);
usbd_transfer(c->axen_xfer);
}
Index: src/sys/dev/usb/if_axenreg.h
diff -u src/sys/dev/usb/if_axenreg.h:1.7 src/sys/dev/usb/if_axenreg.h:1.8
--- src/sys/dev/usb/if_axenreg.h:1.7 Wed Feb 6 07:28:34 2019
+++ src/sys/dev/usb/if_axenreg.h Wed Feb 6 07:56:14 2019
@@ -1,4 +1,4 @@
-/* $NetBSD: if_axenreg.h,v 1.7 2019/02/06 07:28:34 rin Exp $ */
+/* $NetBSD: if_axenreg.h,v 1.8 2019/02/06 07:56:14 rin Exp $ */
/* $OpenBSD: if_axenreg.h,v 1.1 2013/10/07 05:37:41 yuo Exp $ */
/*
@@ -295,7 +295,8 @@ struct axen_softc {
int axen_phyno;
struct timeval axen_rx_notice;
- u_int axen_bufsz;
+ u_int axen_rx_bufsz;
+ u_int axen_tx_bufsz;
int axen_rev;
#define sc_if axen_ec.ec_if