diff --git a/sys/src/9/pc/sdiahci.c b/sys/src/9/pc/sdiahci.c index 053fafa70..d474f6209 100644 --- a/sys/src/9/pc/sdiahci.c +++ b/sys/src/9/pc/sdiahci.c @@ -1546,21 +1546,25 @@ iaenable(SDev *s) c = s->ctlr; ilock(c); - if(!c->enabled){ - if(once == 0) - kproc("iasata", satakproc, 0); - if(c->ndrive == 0) - panic("iaenable: zero s->ctlr->ndrive"); - pcisetbme(c->pci); - snprint(name, sizeof name, "%s (%s)", s->name, s->ifc->name); - intrenable(c->pci->intl, iainterrupt, c, c->pci->tbdf, name); - /* supposed to squelch leftover interrupts here. */ - ahcienable(c->hba); - c->enabled = 1; - if(++once == niactlr) - kproc("ialed", ledkproc, 0); + if(c->enabled){ + iunlock(c); + return 1; } + if(c->ndrive == 0) + panic("iaenable: zero s->ctlr->ndrive"); + pcisetbme(c->pci); + snprint(name, sizeof name, "%s (%s)", s->name, s->ifc->name); + intrenable(c->pci->intl, iainterrupt, c, c->pci->tbdf, name); + /* supposed to squelch leftover interrupts here. */ + ahcienable(c->hba); + c->enabled = 1; iunlock(c); + + if(once == 0) + kproc("iasata", satakproc, 0); + if(++once == niactlr) + kproc("ialed", ledkproc, 0); + return 1; } diff --git a/sys/src/9/pc/sdodin.c b/sys/src/9/pc/sdodin.c index fda657b1b..52d3c5b91 100644 --- a/sys/src/9/pc/sdodin.c +++ b/sys/src/9/pc/sdodin.c @@ -2414,16 +2414,20 @@ msenable(SDev *s) c = s->ctlr; ilock(c); - if(!c->enabled){ - if(once++ == 0) - kproc("odin", mskproc, 0); - pcisetbme(c->pci); - snprint(buf, sizeof buf, "%s (%s)", s->name, s->ifc->name); - intrenable(c->pci->intl, msinterrupt, c, c->pci->tbdf, buf); -// c->reg[Cis] |= Swirq1; /* force initial interrupt. */ - c->enabled = 1; + if(c->enabled){ + iunlock(c); + return 1; } + pcisetbme(c->pci); + snprint(buf, sizeof buf, "%s (%s)", s->name, s->ifc->name); + intrenable(c->pci->intl, msinterrupt, c, c->pci->tbdf, buf); +// c->reg[Cis] |= Swirq1; /* force initial interrupt. */ + c->enabled = 1; iunlock(c); + + if(once++ == 0) + kproc("odin", mskproc, 0); + return 1; } @@ -2517,9 +2521,6 @@ msverify(SDunit *u) if(d->unit == nil){ d->unit = u; sdaddfile(u, "led", 0644, eve, odinledr, odinledw); - once++; - if(once == nmsctlr) - kproc("mvled", ledkproc, 0); chk = 1; } iunlock(d); @@ -2530,6 +2531,8 @@ msverify(SDunit *u) * we need to give detected drives a chance. */ if(chk){ + if(++once == nmsctlr) + kproc("mvled", ledkproc, 0); reset(d); verifychk(d); }