diff --git a/sys/src/9/pc/ethervirtio.c b/sys/src/9/pc/ethervirtio.c index 99241f28e..eb1fa98c1 100644 --- a/sys/src/9/pc/ethervirtio.c +++ b/sys/src/9/pc/ethervirtio.c @@ -470,6 +470,7 @@ shutdown(Ether* edev) { Ctlr *ctlr = edev->ctlr; outb(ctlr->port+Qstatus, 0); + pciclrbme(ctlr->pcidev); } static void @@ -577,6 +578,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 +605,7 @@ pciprobe(int typ) } if(i < 2){ print("ethervirtio: no queues\n"); + pcidisable(p); free(c); continue; } @@ -626,9 +629,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 +670,7 @@ reset(Ether* edev) edev->promiscuous = promiscuous; } + pcisetbme(ctlr->pcidev); intrenable(edev->irq, interrupt, edev, edev->tbdf, edev->name); return 0; diff --git a/sys/src/9/pc/etheryuk.c b/sys/src/9/pc/etheryuk.c index 93df9f1c8..a14bf6b5f 100644 --- a/sys/src/9/pc/etheryuk.c +++ b/sys/src/9/pc/etheryuk.c @@ -2129,14 +2129,13 @@ setup(Ctlr *c) Pcidev *p; p = c->p; - pcienable(p); - c->io = p->mem[0].bar&~0xf; mem = vmap(c->io, p->mem[0].size); if(mem == nil){ print("yuk: cant map %#p\n", c->io); return -1; } + pcienable(p); c->p = p; c->reg = (uint*)mem; c->reg8 = (uchar*)mem; @@ -2159,15 +2158,15 @@ setup(Ctlr *c) c->rx.r = slice(&v, 16*4096, sizeof c->rx.r[0] * c->rx.cnt); c->nports = 1; /* BOTCH */ - pcisetbme(p); if(reset(c)){ print("yuk: cant reset\n"); - pciclrbme(p); free(c->alloc); vunmap(mem, p->mem[0].size); + pcidisable(p); return -1; } macinit(c); + pcisetbme(p); return 0; } diff --git a/sys/src/9/pc/sdodin.c b/sys/src/9/pc/sdodin.c index 5f8f69cea..fda657b1b 100644 --- a/sys/src/9/pc/sdodin.c +++ b/sys/src/9/pc/sdodin.c @@ -2438,6 +2438,7 @@ msdisable(SDev *s) // disable(c->hba); snprint(buf, sizeof buf, "%s (%s)", s->name, s->ifc->name); intrdisable(c->pci->intl, msinterrupt, c, c->pci->tbdf, buf); + pciclrbme(c->pci); c->enabled = 0; iunlock(c); return 1; @@ -2655,6 +2656,7 @@ mspnp(void) print("sdodin: bar %#p in use\n", c->reg); continue; } + pcienable(p); nunit = p->did>>4 & 0xf; s->ifc = &sdodinifc; s->idno = 'a' + nmsctlr; diff --git a/sys/src/9/pc/sdvirtio.c b/sys/src/9/pc/sdvirtio.c index ecda11778..57ed15811 100644 --- a/sys/src/9/pc/sdvirtio.c +++ b/sys/src/9/pc/sdvirtio.c @@ -217,6 +217,7 @@ viopnpdevs(int typ) } vd->typ = typ; vd->pci = p; + pcienable(p); /* reset */ outb(vd->port+Status, 0); @@ -576,6 +577,7 @@ vioenable(SDev *sd) Vdev *vd; vd = sd->ctlr; + pcisetbme(vd->pci); snprint(name, sizeof(name), "%s (%s)", sd->name, sd->ifc->name); intrenable(vd->pci->intl, viointerrupt, vd, vd->pci->tbdf, name); outb(vd->port+Status, inb(vd->port+Status) | DriverOk); @@ -591,6 +593,7 @@ viodisable(SDev *sd) vd = sd->ctlr; snprint(name, sizeof(name), "%s (%s)", sd->name, sd->ifc->name); intrdisable(vd->pci->intl, viointerrupt, vd, vd->pci->tbdf, name); + pciclrbme(vd->pci); return 1; }