Module Name:    src
Committed By:   rin
Date:           Wed Feb  6 08:06:59 UTC 2019

Modified Files:
        src/sys/dev/usb: if_axen.c if_axenreg.h

Log Message:
Enable multiple outstanding transfers.
XXX Linux driver uses much larger numbers of transfers.


To generate a diff of this commit:
cvs rdiff -u -r1.32 -r1.33 src/sys/dev/usb/if_axen.c
cvs rdiff -u -r1.8 -r1.9 src/sys/dev/usb/if_axenreg.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_axen.c
diff -u src/sys/dev/usb/if_axen.c:1.32 src/sys/dev/usb/if_axen.c:1.33
--- src/sys/dev/usb/if_axen.c:1.32	Wed Feb  6 08:04:08 2019
+++ src/sys/dev/usb/if_axen.c	Wed Feb  6 08:06:59 2019
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_axen.c,v 1.32 2019/02/06 08:04:08 rin Exp $	*/
+/*	$NetBSD: if_axen.c,v 1.33 2019/02/06 08:06:59 rin Exp $	*/
 /*	$OpenBSD: if_axen.c,v 1.3 2013/10/21 10:10:22 yuo Exp $	*/
 
 /*
@@ -23,7 +23,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_axen.c,v 1.32 2019/02/06 08:04:08 rin Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_axen.c,v 1.33 2019/02/06 08:06:59 rin Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_inet.h"
@@ -987,6 +987,8 @@ axen_tx_list_init(struct axen_softc *sc)
 		}
 	}
 
+	cd->axen_tx_prod = cd->axen_tx_cnt = 0;
+
 	return 0;
 }
 
@@ -1197,6 +1199,7 @@ axen_txeof(struct usbd_xfer *xfer, void 
 {
 	struct axen_chain *c = (struct axen_chain *)priv;
 	struct axen_softc *sc = c->axen_sc;
+	struct axen_cdata *cd = &sc->axen_cdata;
 	struct ifnet *ifp = GET_IFP(sc);
 	int s;
 
@@ -1204,7 +1207,8 @@ axen_txeof(struct usbd_xfer *xfer, void 
 		return;
 
 	s = splnet();
-
+	KASSERT(cd->axen_tx_cnt > 0);
+	cd->axen_tx_cnt--;
 	if (status != USBD_NORMAL_COMPLETION) {
 		if (status == USBD_NOT_STARTED || status == USBD_CANCELLED) {
 			splx(s);
@@ -1328,18 +1332,16 @@ axen_encap(struct axen_softc *sc, struct
 		return EIO;
 	}
 
-	sc->axen_cdata.axen_tx_cnt++;
-
 	return 0;
 }
 
 static void
 axen_start(struct ifnet *ifp)
 {
-	struct axen_softc *sc;
+	struct axen_softc *sc = ifp->if_softc;
 	struct mbuf *m;
-
-	sc = ifp->if_softc;
+	struct axen_cdata *cd = &sc->axen_cdata;
+	int idx;
 
 	if (sc->axen_link == 0)
 		return;
@@ -1347,24 +1349,33 @@ axen_start(struct ifnet *ifp)
 	if ((ifp->if_flags & (IFF_OACTIVE|IFF_RUNNING)) != IFF_RUNNING)
 		return;
 
-	IFQ_POLL(&ifp->if_snd, m);
-	if (m == NULL)
-		return;
+	idx = cd->axen_tx_prod;
+	while (cd->axen_tx_cnt < AXEN_TX_LIST_CNT) {
+		IFQ_POLL(&ifp->if_snd, m);
+		if (m == NULL)
+			break;
 
-	if (axen_encap(sc, m, 0)) {
-		ifp->if_flags |= IFF_OACTIVE;
-		return;
-	}
-	IFQ_DEQUEUE(&ifp->if_snd, m);
+		if (axen_encap(sc, m, idx)) {
+			ifp->if_flags |= IFF_OACTIVE; /* XXX */
+			ifp->if_oerrors++;
+			break;
+		}
+		IFQ_DEQUEUE(&ifp->if_snd, m);
 
-	/*
-	 * If there's a BPF listener, bounce a copy of this frame
-	 * to him.
-	 */
-	bpf_mtap(ifp, m, BPF_D_OUT);
-	m_freem(m);
+		/*
+		 * If there's a BPF listener, bounce a copy of this frame
+		 * to him.
+		 */
+		bpf_mtap(ifp, m, BPF_D_OUT);
+		m_freem(m);
 
-	ifp->if_flags |= IFF_OACTIVE;
+		idx = (idx + 1) % AXEN_TX_LIST_CNT;
+		cd->axen_tx_cnt++;
+	}
+	cd->axen_tx_prod = idx;
+
+	if (cd->axen_tx_cnt >= AXEN_TX_LIST_CNT)
+		ifp->if_flags |= IFF_OACTIVE;
 
 	/*
 	 * Set a timeout in case the chip goes out to lunch.

Index: src/sys/dev/usb/if_axenreg.h
diff -u src/sys/dev/usb/if_axenreg.h:1.8 src/sys/dev/usb/if_axenreg.h:1.9
--- src/sys/dev/usb/if_axenreg.h:1.8	Wed Feb  6 07:56:14 2019
+++ src/sys/dev/usb/if_axenreg.h	Wed Feb  6 08:06:59 2019
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_axenreg.h,v 1.8 2019/02/06 07:56:14 rin Exp $	*/
+/*	$NetBSD: if_axenreg.h,v 1.9 2019/02/06 08:06:59 rin Exp $	*/
 /*	$OpenBSD: if_axenreg.h,v 1.1 2013/10/07 05:37:41 yuo Exp $	*/
 
 /*
@@ -210,8 +210,12 @@
 
 #define AXEN_TIMEOUT		1000
 
-#define AXEN_RX_LIST_CNT	1
-#define AXEN_TX_LIST_CNT	1
+#ifndef AXEN_RX_LIST_CNT
+#define AXEN_RX_LIST_CNT	4	/* 22 for SS mode in Linux driver */
+#endif
+#ifndef AXEN_TX_LIST_CNT
+#define AXEN_TX_LIST_CNT	4	/* 60 */
+#endif
 
 
 #define AXEN_CONFIG_NO		1

Reply via email to