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;