summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorcinap_lenrek <cinap_lenrek@felloff.net>2018-10-07 23:38:41 +0200
committercinap_lenrek <cinap_lenrek@felloff.net>2018-10-07 23:38:41 +0200
commitc458216121d622858916387071cd9c13df31820a (patch)
tree13eb82ccfd7a9ad61b527a585a117ed5f86989b3
parent9fec0e736081cd155afb6a413b7641b93faed519 (diff)
pc drivers: more pci cleanup
-rw-r--r--sys/src/9/pc/ethervirtio.c7
-rw-r--r--sys/src/9/pc/etheryuk.c7
-rw-r--r--sys/src/9/pc/sdodin.c2
-rw-r--r--sys/src/9/pc/sdvirtio.c3
4 files changed, 13 insertions, 6 deletions
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;
}