kue0 not receiving patch

Joerg Sonnenberger joerg at britannica.bec.de
Wed Feb 16 09:19:59 PST 2005


On Mon, Feb 14, 2005 at 08:06:00PM -0800, Scott Michel wrote:
> This patch ought to fix the USB Ethernet transmit/receive problems for 
> all adaptors, not just kue (cue too!?)
> 
> Plenty of opportunity to clean this code up to remove usbq_rx and 
> usbq_tx, since the messages handle the queuing for us. But this fix gets 
> things working...

I'd prefer to do the right thing and just remove the intermediate queues.

Does the attached patch work?

Joerg
Index: bus/usb/usb_ethersubr.c
===================================================================
RCS file: /home/joerg/wd/repository/dragonflybsd/src/sys/bus/usb/usb_ethersubr.c,v
retrieving revision 1.11
diff -u -r1.11 usb_ethersubr.c
--- bus/usb/usb_ethersubr.c	15 Feb 2005 10:30:11 -0000	1.11
+++ bus/usb/usb_ethersubr.c	16 Feb 2005 17:08:27 -0000
@@ -73,44 +73,18 @@
 #include "usb.h"
 #include "usb_ethersubr.h"
 
-Static struct ifqueue usbq_rx;
-Static struct ifqueue usbq_tx;
-Static int mtx_inited = 0;
+Static int netisr_inited = 0;
 
 Static int usbintr(struct netmsg *msg)
 {
 	struct mbuf *m = ((struct netmsg_packet *)msg)->nm_packet;
-	struct usb_qdat		*q;
-	struct ifnet		*ifp;
-	int			s;
+	struct ifnet *ifp;
+	int s;
 
 	s = splimp();
 
-	/* Check the RX queue */
-	while(1) {
-		IF_DEQUEUE(&usbq_rx, m);
-		if (m == NULL)
-			break;
-		q = (struct usb_qdat *)m->m_pkthdr.rcvif;
-		ifp = q->ifp;
-		(*ifp->if_input)(ifp, m);
-
-		/* Re-arm the receiver */
-		(*q->if_rxstart)(ifp);
-		if (!ifq_is_empty(&ifp->if_snd))
-			(*ifp->if_start)(ifp);
-	}
-
-	/* Check the TX queue */
-	while(1) {
-		IF_DEQUEUE(&usbq_tx, m);
-		if (m == NULL)
-			break;
-		ifp = m->m_pkthdr.rcvif;
-		m_freem(m);
-		if (!ifq_is_empty(&ifp->if_snd))
-			(*ifp->if_start)(ifp);
-	}
+	ifp = m->m_pkthdr.rcvif;
+	(*ifp->if_input)(ifp, m);
 
 	splx(s);
 
@@ -121,11 +95,10 @@
 void
 usb_register_netisr(void)
 {
-	if (mtx_inited)
-		return;
-	mtx_inited = 1;
-	netisr_register(NETISR_USB, cpu0_portfn, usbintr);
-	return;
+	if (netisr_inited == 0) {
+		netisr_inited = 1;
+		netisr_register(NETISR_USB, cpu0_portfn, usbintr);
+	}
 }
 
 /*
@@ -137,9 +110,3 @@
 {
 	netisr_queue(NETISR_USB, m);
 }
-
-void
-usb_tx_done(struct mbuf *m)
-{
-	netisr_queue(NETISR_USB, m);
-}
Index: bus/usb/usb_ethersubr.h
===================================================================
RCS file: /home/joerg/wd/repository/dragonflybsd/src/sys/bus/usb/usb_ethersubr.h,v
retrieving revision 1.4
diff -u -r1.4 usb_ethersubr.h
--- bus/usb/usb_ethersubr.h	30 Dec 2003 01:01:44 -0000	1.4
+++ bus/usb/usb_ethersubr.h	16 Feb 2005 16:42:56 -0000
@@ -43,6 +43,5 @@
 
 void usb_register_netisr	(void);
 void usb_ether_input		(struct mbuf *);
-void usb_tx_done		(struct mbuf *);
 
 #endif
Index: dev/netif/aue/if_aue.c
===================================================================
RCS file: /home/joerg/wd/repository/dragonflybsd/src/sys/dev/netif/aue/if_aue.c,v
retrieving revision 1.16
diff -u -r1.16 if_aue.c
--- dev/netif/aue/if_aue.c	15 Feb 2005 16:44:23 -0000	1.16
+++ dev/netif/aue/if_aue.c	16 Feb 2005 17:13:14 -0000
@@ -173,8 +173,6 @@
 };
 #define aue_lookup(v, p) ((const struct aue_type *)usb_lookup(aue_devs, v, p))
 
-Static struct usb_qdat aue_qdat;
-
 Static int aue_match(device_ptr_t);
 Static int aue_attach(device_ptr_t);
 Static int aue_detach(device_ptr_t);
@@ -767,9 +765,6 @@
 		USB_ATTACH_ERROR_RETURN;
 	}
 
-	aue_qdat.ifp = ifp;
-	aue_qdat.if_rxstart = aue_rxstart;
-
 	/*
 	 * Call MI attach routine.
 	 */
@@ -1025,11 +1020,12 @@
 	total_len -= (4 + ETHER_CRC_LEN);
 
 	ifp->if_ipackets++;
-	m->m_pkthdr.rcvif = (struct ifnet *)&aue_qdat;
+	m->m_pkthdr.rcvif = ifp;
 	m->m_pkthdr.len = m->m_len = total_len;
 
 	/* Put the packet on the special USB input queue. */
 	usb_ether_input(m);
+	aue_start(ifp);
 	AUE_UNLOCK(sc);
 	return;
 done:
@@ -1078,8 +1074,7 @@
 	usbd_get_xfer_status(c->aue_xfer, NULL, NULL, NULL, &err);
 
 	if (c->aue_mbuf != NULL) {
-		c->aue_mbuf->m_pkthdr.rcvif = ifp;
-		usb_tx_done(c->aue_mbuf);
+		m_free(c->aue_mbuf);
 		c->aue_mbuf = NULL;
 	}
 
Index: dev/netif/axe/if_axe.c
===================================================================
RCS file: /home/joerg/wd/repository/dragonflybsd/src/sys/dev/netif/axe/if_axe.c,v
retrieving revision 1.8
diff -u -r1.8 if_axe.c
--- dev/netif/axe/if_axe.c	15 Feb 2005 19:19:11 -0000	1.8
+++ dev/netif/axe/if_axe.c	16 Feb 2005 17:12:54 -0000
@@ -112,8 +112,6 @@
 	{ 0, 0 }
 };
 
-Static struct usb_qdat axe_qdat;
-
 Static int axe_match(device_ptr_t);
 Static int axe_attach(device_ptr_t);
 Static int axe_detach(device_ptr_t);
@@ -504,9 +502,6 @@
 	ifq_set_maxlen(&ifp->if_snd, IFQ_MAXLEN);
 	ifq_set_ready(&ifp->if_snd);
 
-	axe_qdat.ifp = ifp;
-	axe_qdat.if_rxstart = axe_rxstart;
-
 	if (mii_phy_probe(self, &sc->axe_miibus,
 	    axe_ifmedia_upd, axe_ifmedia_sts)) {
 		printf("axe%d: MII without any PHY!\n", sc->axe_unit);
@@ -704,11 +699,12 @@
 	}
 
 	ifp->if_ipackets++;
-	m->m_pkthdr.rcvif = (struct ifnet *)&axe_qdat;
+	m->m_pkthdr.rcvif = ifp;
 	m->m_pkthdr.len = m->m_len = total_len;
 
 	/* Put the packet on the special USB input queue. */
 	usb_ether_input(m);
+	axe_rxstart(ifp);
 	splx(s);
 
 	return;
@@ -761,8 +757,7 @@
 	usbd_get_xfer_status(c->axe_xfer, NULL, NULL, NULL, &err);
 
 	if (c->axe_mbuf != NULL) {
-		c->axe_mbuf->m_pkthdr.rcvif = ifp;
-		usb_tx_done(c->axe_mbuf);
+		m_freem(c->axe_mbuf);
 		c->axe_mbuf = NULL;
 	}
 
Index: dev/netif/cue/if_cue.c
===================================================================
RCS file: /home/joerg/wd/repository/dragonflybsd/src/sys/dev/netif/cue/if_cue.c,v
retrieving revision 1.16
diff -u -r1.16 if_cue.c
--- dev/netif/cue/if_cue.c	15 Feb 2005 20:23:10 -0000	1.16
+++ dev/netif/cue/if_cue.c	16 Feb 2005 17:12:21 -0000
@@ -93,8 +93,6 @@
 	{ 0, 0 }
 };
 
-Static struct usb_qdat cue_qdat;
-
 Static int cue_match(device_ptr_t);
 Static int cue_attach(device_ptr_t);
 Static int cue_detach(device_ptr_t);
@@ -522,9 +520,6 @@
 	ifq_set_maxlen(&ifp->if_snd, IFQ_MAXLEN);
 	ifq_set_ready(&ifp->if_snd);
 
-	cue_qdat.ifp = ifp;
-	cue_qdat.if_rxstart = cue_rxstart;
-
 	/*
 	 * Call MI attach routine.
 	 */
@@ -727,11 +722,13 @@
 
 	ifp->if_ipackets++;
 	m_adj(m, sizeof(u_int16_t));
-	m->m_pkthdr.rcvif = (struct ifnet *)&cue_qdat;
+	m->m_pkthdr.rcvif = ifp;
 	m->m_pkthdr.len = m->m_len = total_len;
 
 	/* Put the packet on the special USB input queue. */
 	usb_ether_input(m);
+	cue_rxstart(ifp);
+
 	CUE_UNLOCK(sc);
 
 	return;
@@ -782,8 +779,7 @@
 	usbd_get_xfer_status(c->cue_xfer, NULL, NULL, NULL, &err);
 
 	if (c->cue_mbuf != NULL) {
-		c->cue_mbuf->m_pkthdr.rcvif = ifp;
-		usb_tx_done(c->cue_mbuf);
+		m_freem(c->cue_mbuf);
 		c->cue_mbuf = NULL;
 	}
 
Index: dev/netif/kue/if_kue.c
===================================================================
RCS file: /home/joerg/wd/repository/dragonflybsd/src/sys/dev/netif/kue/if_kue.c,v
retrieving revision 1.13
diff -u -r1.13 if_kue.c
--- dev/netif/kue/if_kue.c	14 Oct 2004 18:31:02 -0000	1.13
+++ dev/netif/kue/if_kue.c	16 Feb 2005 17:12:15 -0000
@@ -74,6 +74,7 @@
 #include <sys/socket.h>
 
 #include <net/if.h>
+#include <net/ifq_var.h>
 #include <net/if_arp.h>
 #include <net/ethernet.h>
 #include <net/if_dl.h>
@@ -124,8 +125,6 @@
 	{ 0, 0 }
 };
 
-Static struct usb_qdat kue_qdat;
-
 Static int kue_match(device_ptr_t);
 Static int kue_attach(device_ptr_t);
 Static int kue_detach(device_ptr_t);
@@ -485,10 +484,8 @@
 	ifp->if_watchdog = kue_watchdog;
 	ifp->if_init = kue_init;
 	ifp->if_baudrate = 10000000;
-	ifp->if_snd.ifq_maxlen = IFQ_MAXLEN;
-
-	kue_qdat.ifp = ifp;
-	kue_qdat.if_rxstart = kue_rxstart;
+	ifq_set_maxlen(&ifp->if_snd, IFQ_MAXLEN);
+	ifq_set_ready(&ifp->if_snd);
 
 	/*
 	 * Call MI attach routine.
@@ -700,11 +697,13 @@
 	}
 
 	ifp->if_ipackets++;
-	m->m_pkthdr.rcvif = (struct ifnet *)&kue_qdat;
+	m->m_pkthdr.rcvif = ifp;
 	m->m_pkthdr.len = m->m_len = total_len;
 
 	/* Put the packet on the special USB input queue. */
 	usb_ether_input(m);
+	kue_rxstart(ifp);
+
 	KUE_UNLOCK(sc);
 
 	return;
@@ -757,8 +756,7 @@
 	usbd_get_xfer_status(c->kue_xfer, NULL, NULL, NULL, &err);
 
 	if (c->kue_mbuf != NULL) {
-		c->kue_mbuf->m_pkthdr.rcvif = ifp;
-		usb_tx_done(c->kue_mbuf);
+		m_freem(c->kue_mbuf);
 		c->kue_mbuf = NULL;
 	}
 
@@ -824,18 +822,18 @@
 		return;
 	}
 
-	IF_DEQUEUE(&ifp->if_snd, m_head);
+	m_head = ifq_poll(&ifp->if_snd);
 	if (m_head == NULL) {
 		KUE_UNLOCK(sc);
 		return;
 	}
 
 	if (kue_encap(sc, m_head, 0)) {
-		IF_PREPEND(&ifp->if_snd, m_head);
 		ifp->if_flags |= IFF_OACTIVE;
 		KUE_UNLOCK(sc);
 		return;
 	}
+	m_head = ifq_dequeue(&ifp->if_snd);
 
 	/*
 	 * If there's a BPF listener, bounce a copy of this frame
@@ -1008,7 +1006,7 @@
 	usbd_get_xfer_status(c->kue_xfer, NULL, NULL, NULL, &stat);
 	kue_txeof(c->kue_xfer, c, stat);
 
-	if (ifp->if_snd.ifq_head != NULL)
+	if (ifq_is_empty(&ifp->if_snd))
 		kue_start(ifp);
 	KUE_UNLOCK(sc);
 




More information about the Submit mailing list