]> git.lizzy.rs Git - plan9front.git/blobdiff - sys/src/9/pc/ethervirtio.c
pc/ether*: use 64-bit physical addresses and check pci membar types and sizes
[plan9front.git] / sys / src / 9 / pc / ethervirtio.c
index 99241f28e84ff2ef77ce12cc6b4c678d37bf0d16..92ec308b903db790431aae2bd91bb8b1cc32c0a4 100644 (file)
@@ -419,19 +419,21 @@ attach(Ether* edev)
 
        ctlr = edev->ctlr;
        lock(ctlr);
-       if(!ctlr->attached){
-               ctlr->attached = 1;
-
-               /* ready to go */
-               outb(ctlr->port+Qstatus, inb(ctlr->port+Qstatus) | Sdriverok);
-
-               /* start kprocs */
-               snprint(name, sizeof name, "#l%drx", edev->ctlrno);
-               kproc(name, rxproc, edev);
-               snprint(name, sizeof name, "#l%dtx", edev->ctlrno);
-               kproc(name, txproc, edev);
+       if(ctlr->attached){
+               unlock(ctlr);
+               return;
        }
+       ctlr->attached = 1;
        unlock(ctlr);
+
+       /* ready to go */
+       outb(ctlr->port+Qstatus, inb(ctlr->port+Qstatus) | Sdriverok);
+
+       /* start kprocs */
+       snprint(name, sizeof name, "#l%drx", edev->ctlrno);
+       kproc(name, rxproc, edev);
+       snprint(name, sizeof name, "#l%dtx", edev->ctlrno);
+       kproc(name, txproc, edev);
 }
 
 static long
@@ -470,6 +472,7 @@ shutdown(Ether* edev)
 {
        Ctlr *ctlr = edev->ctlr;
        outb(ctlr->port+Qstatus, 0);
+       pciclrbme(ctlr->pcidev);
 }
 
 static void
@@ -577,6 +580,7 @@ pciprobe(int typ)
 
                c->typ = typ;
                c->pcidev = p;
+               pcienable(p);
                c->id = (p->did<<16)|p->vid;
 
                /* ยง3.1.2 Legacy Device Initialization */
@@ -603,6 +607,7 @@ pciprobe(int typ)
                }
                if(i < 2){
                        print("ethervirtio: no queues\n");
+                       pcidisable(p);
                        free(c);
                        continue;
                }
@@ -626,9 +631,8 @@ reset(Ether* edev)
        Ctlr *ctlr;
        int i;
 
-       if(ctlrhead == nil) {
+       if(ctlrhead == nil)
                ctlrhead = pciprobe(1);
-       }
 
        for(ctlr = ctlrhead; ctlr != nil; ctlr = ctlr->next){
                if(ctlr->active)
@@ -668,6 +672,7 @@ reset(Ether* edev)
                edev->promiscuous = promiscuous;
        }
 
+       pcisetbme(ctlr->pcidev);
        intrenable(edev->irq, interrupt, edev, edev->tbdf, edev->name);
 
        return 0;