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