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;

Reply via email to