Module Name: src Committed By: rin Date: Tue Dec 11 13:35:03 UTC 2018
Modified Files: src/sys/dev/usb: if_mue.c if_muereg.h Log Message: Determine the frame size as a function of MTU. XXX Jumbo frame is not yet supported. To generate a diff of this commit: cvs rdiff -u -r1.21 -r1.22 src/sys/dev/usb/if_mue.c cvs rdiff -u -r1.3 -r1.4 src/sys/dev/usb/if_muereg.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_mue.c diff -u src/sys/dev/usb/if_mue.c:1.21 src/sys/dev/usb/if_mue.c:1.22 --- src/sys/dev/usb/if_mue.c:1.21 Tue Dec 11 09:05:50 2018 +++ src/sys/dev/usb/if_mue.c Tue Dec 11 13:35:02 2018 @@ -1,4 +1,4 @@ -/* $NetBSD: if_mue.c,v 1.21 2018/12/11 09:05:50 rin Exp $ */ +/* $NetBSD: if_mue.c,v 1.22 2018/12/11 13:35:02 rin Exp $ */ /* $OpenBSD: if_mue.c,v 1.3 2018/08/04 16:42:46 jsg Exp $ */ /* @@ -20,7 +20,7 @@ /* Driver for Microchip LAN7500/LAN7800 chipsets. */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_mue.c,v 1.21 2018/12/11 09:05:50 rin Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_mue.c,v 1.22 2018/12/11 13:35:02 rin Exp $"); #ifdef _KERNEL_OPT #include "opt_usb.h" @@ -150,6 +150,7 @@ static void mue_tx_offload(struct mue_so static void mue_setmulti(struct mue_softc *); static void mue_sethwcsum(struct mue_softc *); +static void mue_setmtu(struct mue_softc *); static void mue_rxeof(struct usbd_xfer *, void *, usbd_status); static void mue_txeof(struct usbd_xfer *, void *, usbd_status); @@ -772,14 +773,6 @@ mue_chip_init(struct mue_softc *sc) MUE_SETBIT(sc, (sc->mue_flags & LAN7500) ? MUE_7500_FCT_TX_CTL : MUE_7800_FCT_TX_CTL, MUE_FCT_TX_CTL_EN); - /* Set the maximum frame size. */ - MUE_CLRBIT(sc, MUE_MAC_RX, MUE_MAC_RX_RXEN); - val = mue_csr_read(sc, MUE_MAC_RX); - val &= ~MUE_MAC_RX_MAX_SIZE_MASK; - val |= MUE_MAC_RX_MAX_LEN(ETHER_MAX_LEN + ETHER_VLAN_ENCAP_LEN); - mue_csr_write(sc, MUE_MAC_RX, val); - MUE_SETBIT(sc, MUE_MAC_RX, MUE_MAC_RX_RXEN); - MUE_SETBIT(sc, (sc->mue_flags & LAN7500) ? MUE_7500_FCT_RX_CTL : MUE_7800_FCT_RX_CTL, MUE_FCT_RX_CTL_EN); @@ -1014,6 +1007,9 @@ mue_attach(device_t parent, device_t sel IFCAP_CSUM_UDPv6_Tx | IFCAP_CSUM_UDPv6_Rx; sc->mue_ec.ec_capabilities = ETHERCAP_VLAN_MTU; +#if 0 /* XXX not yet */ + sc->mue_ec.ec_capabilities = ETHERCAP_VLAN_MTU | ETHERCAP_JUMBO_MTU; +#endif /* Initialize MII/media info. */ mii = GET_MII(sc); @@ -1222,8 +1218,8 @@ mue_encap(struct mue_softc *sc, struct m M_CSUM_TCPv6 | M_CSUM_UDPv6); len = m->m_pkthdr.len; - if (__predict_false((!tso && len > MUE_MAX_TX_LEN) || - ( tso && len > MUE_MAX_TSO_LEN))) { + if (__predict_false((!tso && len > MUE_FRAME_LEN(ifp->if_mtu)) || + ( tso && len > MUE_TSO_FRAME_LEN))) { MUE_PRINTF(sc, "packet length %d\n too long", len); return EINVAL; } @@ -1419,6 +1415,20 @@ mue_sethwcsum(struct mue_softc *sc) mue_csr_write(sc, reg, val); } +static void +mue_setmtu(struct mue_softc *sc) +{ + struct ifnet *ifp = GET_IFP(sc); + uint32_t val; + + /* Set the maximum frame size. */ + MUE_CLRBIT(sc, MUE_MAC_RX, MUE_MAC_RX_RXEN); + val = mue_csr_read(sc, MUE_MAC_RX); + val &= ~MUE_MAC_RX_MAX_SIZE_MASK; + val |= MUE_MAC_RX_MAX_LEN(MUE_FRAME_LEN(ifp->if_mtu)); + mue_csr_write(sc, MUE_MAC_RX, val); + MUE_SETBIT(sc, MUE_MAC_RX, MUE_MAC_RX_RXEN); +} static void mue_rxeof(struct usbd_xfer *xfer, void *priv, usbd_status status) @@ -1488,7 +1498,7 @@ mue_rxeof(struct usbd_xfer *xfer, void * pktlen -= 2; if (__predict_false(pktlen < ETHER_HDR_LEN + ETHER_CRC_LEN || - pktlen > MCLBYTES - ETHER_ALIGN || + pktlen > MCLBYTES - ETHER_ALIGN || /* XXX */ pktlen + sizeof(*hdrp) > totlen)) { MUE_PRINTF(sc, "invalid packet length %d\n", pktlen); ifp->if_ierrors++; @@ -1621,6 +1631,9 @@ mue_init(struct ifnet *ifp) /* TCP/UDP checksum offload engines. */ mue_sethwcsum(sc); + /* Set MTU. */ + mue_setmtu(sc); + if (mue_open_pipes(sc)) { splx(s); return EIO; @@ -1661,7 +1674,7 @@ mue_ioctl(struct ifnet *ifp, u_long cmd, s = splnet(); - switch(cmd) { + switch (cmd) { case SIOCSIFFLAGS: if ((error = ifioctl_common(ifp, cmd, data)) != 0) break; @@ -1690,10 +1703,20 @@ mue_ioctl(struct ifnet *ifp, u_long cmd, if ((error = ether_ioctl(ifp, cmd, data)) != ENETRESET) break; error = 0; - if (cmd == SIOCSIFCAP) - mue_sethwcsum(sc); - if (cmd == SIOCADDMULTI || cmd == SIOCDELMULTI) + switch (cmd) { + case SIOCADDMULTI: + case SIOCDELMULTI: mue_setmulti(sc); + break; + case SIOCSIFCAP: + mue_sethwcsum(sc); + break; + case SIOCSIFMTU: + mue_setmtu(sc); + break; + default: + break; + } break; } splx(s); Index: src/sys/dev/usb/if_muereg.h diff -u src/sys/dev/usb/if_muereg.h:1.3 src/sys/dev/usb/if_muereg.h:1.4 --- src/sys/dev/usb/if_muereg.h:1.3 Sun Sep 16 01:23:09 2018 +++ src/sys/dev/usb/if_muereg.h Tue Dec 11 13:35:02 2018 @@ -1,4 +1,4 @@ -/* $NetBSD: if_muereg.h,v 1.3 2018/09/16 01:23:09 rin Exp $ */ +/* $NetBSD: if_muereg.h,v 1.4 2018/12/11 13:35:02 rin Exp $ */ /* $OpenBSD: if_muereg.h,v 1.1 2018/08/03 01:50:15 kevlo Exp $ */ /* @@ -122,11 +122,11 @@ #define MUE_7800_RX_BUFSIZE (12 * 1024) #define MUE_7800_MAX_RX_FIFO_SIZE MUE_7800_RX_BUFSIZE #define MUE_7800_MAX_TX_FIFO_SIZE MUE_7800_RX_BUFSIZE -#define MUE_MAX_TX_LEN (ETHER_MAX_LEN + ETHER_VLAN_ENCAP_LEN) -#define MUE_MAX_TSO_LEN \ - (ETHER_HDR_LEN + ETHER_VLAN_ENCAP_LEN + IP_MAXPACKET) +#define MUE_FRAME_LEN(mtu) \ + (mtu + ETHER_HDR_LEN + ETHER_CRC_LEN + ETHER_VLAN_ENCAP_LEN) +#define MUE_TSO_FRAME_LEN MUE_FRAME_LEN(IP_MAXPACKET) #define MUE_TX_BUFSIZE \ - (sizeof(struct mue_txbuf_hdr) + MUE_MAX_TSO_LEN) + (sizeof(struct mue_txbuf_hdr) + MUE_TSO_FRAME_LEN) /* interrupt endpoint control register */ #define MUE_INT_EP_CTL_PHY_INT 0x20000