diff options
author | cinap_lenrek <cinap_lenrek@felloff.net> | 2020-02-23 14:05:01 +0100 |
---|---|---|
committer | cinap_lenrek <cinap_lenrek@felloff.net> | 2020-02-23 14:05:01 +0100 |
commit | b7089d66ad5a26a2b39c1c1e17a4761cd1670728 (patch) | |
tree | 4de09ccb592cb93dc4681baad87fb7f76b677a6f /sys/src/9/pc/sdodin.c | |
parent | 68f15d65942da7e30cf9cbae7362f778fe5da1d2 (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.c | 25 |
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); } |