Module Name: src Committed By: mlelstv Date: Sat Jan 5 07:56:07 UTC 2019
Modified Files: src/sys/dev/usb: if_mue.c if_muevar.h Log Message: Enable multiple outstanding transfers. iperf3 now shows 250MBit/s for sending and 225MBit/s for receiving. To generate a diff of this commit: cvs rdiff -u -r1.26 -r1.27 src/sys/dev/usb/if_mue.c cvs rdiff -u -r1.3 -r1.4 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.26 src/sys/dev/usb/if_mue.c:1.27 --- src/sys/dev/usb/if_mue.c:1.26 Fri Dec 28 22:55:20 2018 +++ src/sys/dev/usb/if_mue.c Sat Jan 5 07:56:07 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: if_mue.c,v 1.26 2018/12/28 22:55:20 rin Exp $ */ +/* $NetBSD: if_mue.c,v 1.27 2019/01/05 07:56: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.26 2018/12/28 22:55:20 rin Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_mue.c,v 1.27 2019/01/05 07:56:07 mlelstv Exp $"); #ifdef _KERNEL_OPT #include "opt_usb.h" @@ -1155,6 +1155,9 @@ mue_tx_list_init(struct mue_softc *sc) } } + cd->mue_tx_prod = 0; + cd->mue_tx_cnt = 0; + return 0; } @@ -1258,8 +1261,6 @@ mue_encap(struct mue_softc *sc, struct m return EIO; } - sc->mue_cdata.mue_tx_cnt++; - return 0; } @@ -1566,6 +1567,7 @@ mue_txeof(struct usbd_xfer *xfer, void * { struct mue_chain *c = priv; struct mue_softc *sc = c->mue_sc; + struct mue_cdata *cd = &sc->mue_cdata; struct ifnet *ifp = GET_IFP(sc); int s; @@ -1573,7 +1575,8 @@ mue_txeof(struct usbd_xfer *xfer, void * return; s = splnet(); - + KASSERT(cd->mue_tx_cnt > 0); + cd->mue_tx_cnt--; if (__predict_false(status != USBD_NORMAL_COMPLETION)) { if (status == USBD_NOT_STARTED || status == USBD_CANCELLED) { splx(s); @@ -1757,6 +1760,8 @@ mue_start(struct ifnet *ifp) { struct mue_softc *sc = ifp->if_softc; struct mbuf *m; + struct mue_cdata *cd = &sc->mue_cdata; + int idx; if (__predict_false(!sc->mue_link)) { DPRINTF(sc, "no link\n"); @@ -1769,20 +1774,29 @@ mue_start(struct ifnet *ifp) return; } - IFQ_POLL(&ifp->if_snd, m); - if (m == NULL) - return; + idx = cd->mue_tx_prod; + while (cd->mue_tx_cnt < MUE_TX_LIST_CNT) { + IFQ_POLL(&ifp->if_snd, m); + if (m == NULL) + break; - if (__predict_false(mue_encap(sc, m, 0))) { - ifp->if_oerrors++; - return; - } - IFQ_DEQUEUE(&ifp->if_snd, m); + if (__predict_false(mue_encap(sc, m, idx))) { + ifp->if_oerrors++; + break; + } + IFQ_DEQUEUE(&ifp->if_snd, m); - bpf_mtap(ifp, m, BPF_D_OUT); - m_freem(m); + bpf_mtap(ifp, m, BPF_D_OUT); + m_freem(m); + + idx = (idx + 1) % MUE_TX_LIST_CNT; + cd->mue_tx_cnt++; + + } + cd->mue_tx_prod = idx; - ifp->if_flags |= IFF_OACTIVE; + if (cd->mue_tx_cnt >= MUE_TX_LIST_CNT) + ifp->if_flags |= IFF_OACTIVE; /* Set a timeout in case the chip goes out to lunch. */ ifp->if_timer = 5; Index: src/sys/dev/usb/if_muevar.h diff -u src/sys/dev/usb/if_muevar.h:1.3 src/sys/dev/usb/if_muevar.h:1.4 --- src/sys/dev/usb/if_muevar.h:1.3 Tue Dec 11 08:16:57 2018 +++ src/sys/dev/usb/if_muevar.h Sat Jan 5 07:56:07 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: if_muevar.h,v 1.3 2018/12/11 08:16:57 rin Exp $ */ +/* $NetBSD: if_muevar.h,v 1.4 2019/01/05 07:56:07 mlelstv Exp $ */ /* $OpenBSD: if_muereg.h,v 1.1 2018/08/03 01:50:15 kevlo Exp $ */ /* @@ -31,9 +31,9 @@ struct mue_chain { }; struct mue_cdata { -#define MUE_TX_LIST_CNT 1 +#define MUE_TX_LIST_CNT 4 struct mue_chain mue_tx_chain[MUE_TX_LIST_CNT]; -#define MUE_RX_LIST_CNT 1 +#define MUE_RX_LIST_CNT 4 struct mue_chain mue_rx_chain[MUE_RX_LIST_CNT]; int mue_tx_prod; int mue_tx_cons;