summaryrefslogtreecommitdiff
path: root/sys/src/9/pc/sdodin.c
diff options
context:
space:
mode:
authorcinap_lenrek <cinap_lenrek@felloff.net>2020-02-23 14:05:01 +0100
committercinap_lenrek <cinap_lenrek@felloff.net>2020-02-23 14:05:01 +0100
commitb7089d66ad5a26a2b39c1c1e17a4761cd1670728 (patch)
tree4de09ccb592cb93dc4681baad87fb7f76b677a6f /sys/src/9/pc/sdodin.c
parent68f15d65942da7e30cf9cbae7362f778fe5da1d2 (diff)
sdiahci, sdodin: avoid calling kproc() while holding ilock()
Diffstat (limited to 'sys/src/9/pc/sdodin.c')
-rw-r--r--sys/src/9/pc/sdodin.c25
1 files changed, 14 insertions, 11 deletions
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);
}