Ethernet devices register there their own IRQs
authorBarret Rhoden <brho@cs.berkeley.edu>
Tue, 8 Apr 2014 21:00:50 +0000 (14:00 -0700)
committerBarret Rhoden <brho@cs.berkeley.edu>
Tue, 8 Apr 2014 22:01:07 +0000 (15:01 -0700)
The Plan 9 way was to have one IRQ per ethernet device, which devether
registers for each NIC.  Many NICs will want separate IRQ handlers, possibly
for different queues.

Now, all NICs register and manage their own IRQs.  The old plan 9 way was to do
it in the reset/pnp method.  These resets happen during the booting process,
and for now that is the only place you can do vmap_pmem calls (which you'll
need when you register_irq for MSI-X).

kern/drivers/dev/ether.c
kern/drivers/net/ether8139.c
kern/drivers/net/ether8169.c
kern/drivers/net/etherigbe.c
kern/include/ip.h

index fdc7c56..2637485 100644 (file)
@@ -681,9 +681,6 @@ static void etherreset(void)
                        ether->type = cards[n].type;
                        snprintf(name, sizeof(name), "ether%d", ctlrno);
 
-                       if (ether->interrupt != NULL)
-                               register_irq(ether->irq, ether->interrupt, ether, ether->tbdf);
-
                        i = snprintf(buf, sizeof(buf),
                                                 "#l%d: %s: %dMbps port 0x%x irq %u", ctlrno,
                                                 ether->type, ether->netif.mbps, ether->port,
index 39cd569..7b8beb8 100644 (file)
@@ -754,7 +754,6 @@ static int rtl8139pnp(struct ether *edev)
                           ctlr->pcidev->func);
        edev->attach = rtl8139attach;
        edev->transmit = rtl8139transmit;
-       edev->interrupt = rtl8139interrupt;
        edev->ifstat = rtl8139ifstat;
 
        edev->netif.arg = edev;
@@ -766,6 +765,7 @@ static int rtl8139pnp(struct ether *edev)
        if ((csr8r(ctlr, Msr) & (Speed10 | Linkb)) == 0)
                edev->netif.mbps = 100;
 
+       register_irq(edev->irq, rtl8139interrupt, edev, edev->tbdf);
        return 0;
 }
 
index a995a84..dfed1e6 100644 (file)
@@ -1220,7 +1220,6 @@ rtl8169pnp(struct ether* edev)
                           ctlr->pci->func);
        edev->attach = rtl8169attach;
        edev->transmit = rtl8169transmit;
-       edev->interrupt = rtl8169interrupt;
        edev->ifstat = rtl8169ifstat;
 
        edev->netif.arg = edev;
@@ -1229,6 +1228,7 @@ rtl8169pnp(struct ether* edev)
 //     edev->netif.shutdown = rtl8169shutdown;
 
        rtl8169link(edev);
+       register_irq(edev->irq, rtl8169interrupt, edev, edev->tbdf);
 
        return 0;
 }
index 14ca78e..071a773 100644 (file)
@@ -2102,17 +2102,15 @@ igbepnp(struct ether* edev)
        edev->ctlr = ctlr;
        edev->port = ctlr->port;
        edev->irq = ctlr->pci->irqline;
+       edev->tbdf = MKBUS(BusPCI, ctlr->pci->bus, ctlr->pci->dev, ctlr->pci->func);
        edev->netif.mbps = 1000;
        memmove(edev->ea, ctlr->ra, Eaddrlen);
 
        /*
         * Linkage to the generic ethernet driver.
         */
-       edev->tbdf = MKBUS(BusPCI, ctlr->pci->bus, ctlr->pci->dev,
-                          ctlr->pci->func);
        edev->attach = igbeattach;
        edev->transmit = igbetransmit;
-       edev->interrupt = igbeinterrupt;
        edev->ifstat = igbeifstat;
        edev->ctl = igbectl;
        edev->shutdown = igbeshutdown;
@@ -2121,6 +2119,7 @@ igbepnp(struct ether* edev)
        edev->netif.promiscuous = igbepromiscuous;
        edev->netif.multicast = igbemulticast;
 
+       register_irq(edev->irq, igbeinterrupt, edev, edev->tbdf);
        return 0;
 }
 
index 99c81ed..85f09a6 100644 (file)
@@ -971,6 +971,7 @@ struct ether {
        int ctlrno;
        char *type;
        int irq;
+       unsigned int tbdf;
        int port;
        int minmtu;
        int maxmtu;
@@ -981,7 +982,6 @@ struct ether {
        void (*closed) (struct ether *);
        void (*detach) (struct ether *);
        void (*transmit) (struct ether *);
-       void (*interrupt) (struct hw_trapframe *, void *);
        long (*ifstat) (struct ether *, void *, long, uint32_t);
        long (*ctl) (struct ether *, void *, long);     /* custom ctl messages */
        void (*power) (struct ether *, int);    /* power on/off */
@@ -999,9 +999,6 @@ struct ether {
 
        /* another case where we wish we had anon struct members. */
        struct netif netif;
-
-       /* xxxx -- this is a defect in this implementation. */
-       unsigned int tbdf;
 };
 
 extern struct block *etheriq(struct ether *, struct block *, int);