Module Name: src Committed By: mlelstv Date: Sun Feb 3 13:11:07 UTC 2019
Modified Files: src/sys/dev/usb: if_mue.c if_muereg.h if_muevar.h Log Message: Make size of transmit/receive queues variable. Restrict queue size again to 1 for LAN7500 as some chips fail. Read Chip revision register and report value. Maybe we can identify chisp better now. To generate a diff of this commit: cvs rdiff -u -r1.30 -r1.31 src/sys/dev/usb/if_mue.c cvs rdiff -u -r1.4 -r1.5 src/sys/dev/usb/if_muereg.h cvs rdiff -u -r1.5 -r1.6 src/sys/dev/usb/if_muevar.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.30 src/sys/dev/usb/if_mue.c:1.31 --- src/sys/dev/usb/if_mue.c:1.30 Thu Jan 31 05:25:48 2019 +++ src/sys/dev/usb/if_mue.c Sun Feb 3 13:11:07 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: if_mue.c,v 1.30 2019/01/31 05:25:48 rin Exp $ */ +/* $NetBSD: if_mue.c,v 1.31 2019/02/03 13:11:07 mlelstv 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.30 2019/01/31 05:25:48 rin Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_mue.c,v 1.31 2019/02/03 13:11:07 mlelstv Exp $"); #ifdef _KERNEL_OPT #include "opt_usb.h" @@ -897,6 +897,7 @@ mue_attach(device_t parent, device_t sel struct mii_data *mii; struct ifnet *ifp; usbd_status err; + const char *descr; uint8_t i; int s; @@ -932,12 +933,19 @@ mue_attach(device_t parent, device_t sel sc->mue_product = uaa->uaa_product; sc->mue_flags = MUE_LOOKUP(uaa)->mue_flags; + sc->mue_id_rev = mue_csr_read(sc, MUE_ID_REV); + /* Decide on what our bufsize will be. */ - if (sc->mue_flags & LAN7500) + if (sc->mue_flags & LAN7500) { sc->mue_rxbufsz = (sc->mue_udev->ud_speed == USB_SPEED_HIGH) ? MUE_7500_HS_RX_BUFSIZE : MUE_7500_FS_RX_BUFSIZE; - else + sc->mue_rx_list_cnt = 1; + sc->mue_tx_list_cnt = 1; + } else { sc->mue_rxbufsz = MUE_7800_RX_BUFSIZE; + sc->mue_rx_list_cnt = MUE_RX_LIST_CNT; + sc->mue_tx_list_cnt = MUE_TX_LIST_CNT; + } sc->mue_txbufsz = MUE_TX_BUFSIZE; /* Find endpoints. */ @@ -974,10 +982,10 @@ mue_attach(device_t parent, device_t sel } /* A Microchip chip was detected. Inform the world. */ - if (sc->mue_flags & LAN7500) - aprint_normal_dev(self, "LAN7500\n"); - else - aprint_normal_dev(self, "LAN7800\n"); + descr = (sc->mue_flags & LAN7500) ? "LAN7500" : "LAN7800"; + aprint_normal_dev(self, "%s id 0x%x rev 0x%x\n", descr, + (unsigned)__SHIFTOUT(sc->mue_id_rev, MUE_ID_REV_ID), + (unsigned)__SHIFTOUT(sc->mue_id_rev, MUE_ID_REV_REV)); if (mue_get_macaddr(sc, dict)) { aprint_error_dev(self, "failed to read MAC address\n"); @@ -1125,7 +1133,7 @@ mue_rx_list_init(struct mue_softc *sc) int err; cd = &sc->mue_cdata; - for (i = 0; i < __arraycount(cd->mue_rx_chain); i++) { + for (i = 0; i < sc->mue_rx_list_cnt; i++) { c = &cd->mue_rx_chain[i]; c->mue_sc = sc; c->mue_idx = i; @@ -1150,7 +1158,7 @@ mue_tx_list_init(struct mue_softc *sc) int err; cd = &sc->mue_cdata; - for (i = 0; i < __arraycount(cd->mue_tx_chain); i++) { + for (i = 0; i < sc->mue_tx_list_cnt; i++) { c = &cd->mue_tx_chain[i]; c->mue_sc = sc; c->mue_idx = i; @@ -1198,7 +1206,7 @@ mue_startup_rx_pipes(struct mue_softc *s size_t i; /* Start up the receive pipe. */ - for (i = 0; i < __arraycount(sc->mue_cdata.mue_rx_chain); i++) { + for (i = 0; i < sc->mue_rx_list_cnt; i++) { c = &sc->mue_cdata.mue_rx_chain[i]; usbd_setup_xfer(c->mue_xfer, c, c->mue_buf, sc->mue_rxbufsz, USBD_SHORT_XFER_OK, USBD_NO_TIMEOUT, mue_rxeof); @@ -1461,11 +1469,6 @@ mue_rxeof(struct usbd_xfer *xfer, void * return; } - if (__predict_false(!(ifp->if_flags & IFF_RUNNING))) { - DPRINTF(sc, "not running\n"); - return; - } - if (__predict_false(status != USBD_NORMAL_COMPLETION)) { DPRINTF(sc, "%s\n", usbd_errstr(status)); if (status == USBD_NOT_STARTED || status == USBD_CANCELLED) @@ -1790,7 +1793,7 @@ mue_start(struct ifnet *ifp) } idx = cd->mue_tx_prod; - while (cd->mue_tx_cnt < MUE_TX_LIST_CNT) { + while ((unsigned)cd->mue_tx_cnt < sc->mue_tx_list_cnt) { IFQ_POLL(&ifp->if_snd, m); if (m == NULL) break; @@ -1804,13 +1807,13 @@ mue_start(struct ifnet *ifp) bpf_mtap(ifp, m, BPF_D_OUT); m_freem(m); - idx = (idx + 1) % MUE_TX_LIST_CNT; + idx = (idx + 1) % sc->mue_tx_list_cnt; cd->mue_tx_cnt++; } cd->mue_tx_prod = idx; - if (cd->mue_tx_cnt >= MUE_TX_LIST_CNT) + if ((unsigned)cd->mue_tx_cnt >= sc->mue_tx_list_cnt) ifp->if_flags |= IFF_OACTIVE; /* Set a timeout in case the chip goes out to lunch. */ @@ -1841,7 +1844,7 @@ mue_stop(struct ifnet *ifp, int disable } /* Free RX resources. */ - for (i = 0; i < __arraycount(sc->mue_cdata.mue_rx_chain); i++) + for (i = 0; i < sc->mue_rx_list_cnt; i++) if (sc->mue_cdata.mue_rx_chain[i].mue_xfer != NULL) { usbd_destroy_xfer( sc->mue_cdata.mue_rx_chain[i].mue_xfer); @@ -1849,7 +1852,7 @@ mue_stop(struct ifnet *ifp, int disable } /* Free TX resources. */ - for (i = 0; i < __arraycount(sc->mue_cdata.mue_tx_chain); i++) + for (i = 0; i < sc->mue_tx_list_cnt; i++) if (sc->mue_cdata.mue_tx_chain[i].mue_xfer != NULL) { usbd_destroy_xfer( sc->mue_cdata.mue_tx_chain[i].mue_xfer); Index: src/sys/dev/usb/if_muereg.h diff -u src/sys/dev/usb/if_muereg.h:1.4 src/sys/dev/usb/if_muereg.h:1.5 --- src/sys/dev/usb/if_muereg.h:1.4 Tue Dec 11 13:35:02 2018 +++ src/sys/dev/usb/if_muereg.h Sun Feb 3 13:11:07 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: if_muereg.h,v 1.4 2018/12/11 13:35:02 rin Exp $ */ +/* $NetBSD: if_muereg.h,v 1.5 2019/02/03 13:11:07 mlelstv Exp $ */ /* $OpenBSD: if_muereg.h,v 1.1 2018/08/03 01:50:15 kevlo Exp $ */ /* @@ -34,6 +34,7 @@ #define MUE_UR_READREG 0xa1 /* registers */ +#define MUE_ID_REV 0x000 #define MUE_INT_STATUS 0x00c #define MUE_HW_CFG 0x010 #define MUE_PMT_CTL 0x014 @@ -81,6 +82,10 @@ #define MUE_7800_ADDR_FILTX(i) (MUE_7800_ADDR_FILTX_BASE + 8 * (i)) #define MUE_NUM_ADDR_FILTX 33 +/* device ID and revision register */ +#define MUE_ID_REV_ID __BITS(16,31) +#define MUE_ID_REV_REV __BITS(0,15) + /* hardware configuration register */ #define MUE_HW_CFG_SRST 0x00000001 #define MUE_HW_CFG_LRST 0x00000002 Index: src/sys/dev/usb/if_muevar.h diff -u src/sys/dev/usb/if_muevar.h:1.5 src/sys/dev/usb/if_muevar.h:1.6 --- src/sys/dev/usb/if_muevar.h:1.5 Thu Jan 31 05:25:07 2019 +++ src/sys/dev/usb/if_muevar.h Sun Feb 3 13:11:07 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: if_muevar.h,v 1.5 2019/01/31 05:25:07 rin Exp $ */ +/* $NetBSD: if_muevar.h,v 1.6 2019/02/03 13:11:07 mlelstv Exp $ */ /* $OpenBSD: if_muereg.h,v 1.1 2018/08/03 01:50:15 kevlo Exp $ */ /* @@ -111,6 +111,7 @@ struct mue_softc { uint16_t mue_product; uint16_t mue_flags; + uint32_t mue_id_rev; int mue_if_flags; int mue_refcnt; @@ -121,6 +122,9 @@ struct mue_softc { uint32_t mue_rxbufsz; uint32_t mue_txbufsz; int mue_link; + + unsigned mue_rx_list_cnt; + unsigned mue_tx_list_cnt; }; #endif /* _IF_MUEVAR_H_ */