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
{
Ctlr *ctlr = edev->ctlr;
outb(ctlr->port+Qstatus, 0);
+ pciclrbme(ctlr->pcidev);
}
static void
c->typ = typ;
c->pcidev = p;
+ pcienable(p);
c->id = (p->did<<16)|p->vid;
/* ยง3.1.2 Legacy Device Initialization */
}
if(i < 2){
print("ethervirtio: no queues\n");
+ pcidisable(p);
free(c);
continue;
}
Ctlr *ctlr;
int i;
- if(ctlrhead == nil) {
+ if(ctlrhead == nil)
ctlrhead = pciprobe(1);
- }
for(ctlr = ctlrhead; ctlr != nil; ctlr = ctlr->next){
if(ctlr->active)
edev->promiscuous = promiscuous;
}
+ pcisetbme(ctlr->pcidev);
intrenable(edev->irq, interrupt, edev, edev->tbdf, edev->name);
return 0;