DragonFly BSD
DragonFly submit List (threaded) for 2005-02
[Date Prev][Date Next]  [Thread Prev][Thread Next]  [Date Index][Thread Index]

Re: kue0 not receiving patch


From: Scott Michel <scottm@xxxxxxxx>
Date: Tue, 15 Feb 2005 11:23:33 -0800

Joerg Sonnenberger wrote:
On Tue, Feb 15, 2005 at 10:36:00AM -0800, Scott Michel wrote:

If nothing is queued on usbq_tx or usbq_rx, usbintr will not send or receive packets, no matter how hard you try to schedule the isr. :-)


Argh! I thought the problem was that the ISR is not scheduled (which it
is also true). OK, let's remove this whole USB ethernet queue crap.

Actually, the ISR runs like it should. Rather nicely, as a matter of fact. Remove the queuing like this?


--- ./net/netisr.h 2005-02-15 10:50:26.000000000 -0800
+++ /usr/src/sys/./net/netisr.h 2005-02-15 10:51:17.000000000 -0800
@@ -114,7 +114,8 @@
#define NETISR_ATALK1 17 /* Appletalk phase 1 */
#define NETISR_ARP 18 /* same as AF_LINK */
#define NETISR_IPX 23 /* same as AF_IPX */
-#define NETISR_USB 25 /* USB soft interrupt */
+#define NETISR_USB_TX 24 /* USB tx soft interrupt */
+#define NETISR_USB_RX 25 /* USB rx soft interrupt */
#define NETISR_PPP 27 /* PPP soft interrupt */
#define NETISR_IPV6 28 /* same as AF_INET6 */
#define NETISR_NATM 29 /* same as AF_NATM */
--- ./bus/usb/usb_ethersubr.c 2005-02-15 10:52:11.000000000 -0800
+++ /usr/src/sys/./bus/usb/usb_ethersubr.c 2005-02-15 10:59:42.000000000 -0800
@@ -73,11 +73,9 @@
#include "usb.h"
#include "usb_ethersubr.h"


-Static struct ifqueue usbq_rx;
-Static struct ifqueue usbq_tx;
 Static int mtx_inited = 0;

-Static int usbintr(struct netmsg *msg)
+Static int usbintr_rx(struct netmsg *msg)
 {
        struct mbuf *m = ((struct netmsg_packet *)msg)->nm_packet;
        struct usb_qdat         *q;
@@ -86,31 +84,33 @@

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);
-       }
+       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);
+
+       splx(s);
+
+       lwkt_replymsg(&msg->nm_lmsg, 0);
+       return EASYNC;
+}
+
+Static int usbintr_tx(struct netmsg *msg)
+{
+       struct mbuf *m = ((struct netmsg_packet *)msg)->nm_packet;
+       struct ifnet            *ifp;
+       int                     s;
+
+       s = splimp();
+
+       ifp = m->m_pkthdr.rcvif;
+       m_freem(m);
+       if (!ifq_is_empty(&ifp->if_snd))
+               (*ifp->if_start)(ifp);

splx(s);

@@ -124,7 +124,8 @@
        if (mtx_inited)
                return;
        mtx_inited = 1;
-       netisr_register(NETISR_USB, cpu0_portfn, usbintr);
+       netisr_register(NETISR_USB_TX, cpu0_portfn, usbintr_tx);
+       netisr_register(NETISR_USB_RX, cpu0_portfn, usbintr_rx);
        return;
 }

@@ -135,11 +136,11 @@
 void
 usb_ether_input(struct mbuf *m)
 {
-       netisr_queue(NETISR_USB, m);
+       netisr_queue(NETISR_USB_RX, m);
 }

 void
 usb_tx_done(struct mbuf *m)
 {
-       netisr_queue(NETISR_USB, m);
+       netisr_queue(NETISR_USB_TX, m);
 }



[Date Prev][Date Next]  [Thread Prev][Thread Next]  [Date Index][Thread Index]