ether82543gc, ether82557, ethervirtio: do kproc() call ouside of spinlock
This commit is contained in:
parent
39c3fd117a
commit
8e2cfc0464
3 changed files with 40 additions and 32 deletions
|
@ -413,12 +413,10 @@ gc82543attach(Ether* edev)
|
|||
*/
|
||||
ctlr = edev->ctlr;
|
||||
lock(&ctlr->slock);
|
||||
if(ctlr->started == 0){
|
||||
ctlr->started = 1;
|
||||
snprint(name, KNAMELEN, "#l%d82543", edev->ctlrno);
|
||||
kproc(name, gc82543watchdog, edev);
|
||||
if(ctlr->started){
|
||||
unlock(&ctlr->slock);
|
||||
return;
|
||||
}
|
||||
unlock(&ctlr->slock);
|
||||
|
||||
ctl = csr32r(ctlr, Rctl)|Ren;
|
||||
csr32w(ctlr, Rctl, ctl);
|
||||
|
@ -426,6 +424,12 @@ gc82543attach(Ether* edev)
|
|||
csr32w(ctlr, Tctl, ctl);
|
||||
|
||||
csr32w(ctlr, Ims, ctlr->im);
|
||||
|
||||
ctlr->started = 1;
|
||||
unlock(&ctlr->slock);
|
||||
|
||||
snprint(name, KNAMELEN, "#l%d82543", edev->ctlrno);
|
||||
kproc(name, gc82543watchdog, edev);
|
||||
}
|
||||
|
||||
static char* statistics[Nstatistics] = {
|
||||
|
|
|
@ -380,24 +380,26 @@ attach(Ether* ether)
|
|||
|
||||
ctlr = ether->ctlr;
|
||||
lock(&ctlr->slock);
|
||||
if(ctlr->state == 0){
|
||||
ilock(&ctlr->rlock);
|
||||
csr8w(ctlr, Interrupt, 0);
|
||||
iunlock(&ctlr->rlock);
|
||||
command(ctlr, RUstart, PADDR(ctlr->rfdhead->rp));
|
||||
ctlr->state = 1;
|
||||
|
||||
/*
|
||||
* Start the watchdog timer for the receive lockup errata
|
||||
* unless the EEPROM compatibility word indicates it may be
|
||||
* omitted.
|
||||
*/
|
||||
if((ctlr->eeprom[0x03] & 0x0003) != 0x0003){
|
||||
snprint(name, KNAMELEN, "#l%dwatchdog", ether->ctlrno);
|
||||
kproc(name, watchdog, ether);
|
||||
}
|
||||
if(ctlr->state){
|
||||
unlock(&ctlr->slock);
|
||||
return;
|
||||
}
|
||||
ilock(&ctlr->rlock);
|
||||
csr8w(ctlr, Interrupt, 0);
|
||||
iunlock(&ctlr->rlock);
|
||||
command(ctlr, RUstart, PADDR(ctlr->rfdhead->rp));
|
||||
ctlr->state = 1;
|
||||
unlock(&ctlr->slock);
|
||||
|
||||
/*
|
||||
* Start the watchdog timer for the receive lockup errata
|
||||
* unless the EEPROM compatibility word indicates it may be
|
||||
* omitted.
|
||||
*/
|
||||
if((ctlr->eeprom[0x03] & 0x0003) != 0x0003){
|
||||
snprint(name, KNAMELEN, "#l%dwatchdog", ether->ctlrno);
|
||||
kproc(name, watchdog, ether);
|
||||
}
|
||||
}
|
||||
|
||||
static long
|
||||
|
|
|
@ -419,19 +419,21 @@ attach(Ether* edev)
|
|||
|
||||
ctlr = edev->ctlr;
|
||||
lock(ctlr);
|
||||
if(!ctlr->attached){
|
||||
ctlr->attached = 1;
|
||||
|
||||
/* ready to go */
|
||||
outb(ctlr->port+Qstatus, inb(ctlr->port+Qstatus) | Sdriverok);
|
||||
|
||||
/* start kprocs */
|
||||
snprint(name, sizeof name, "#l%drx", edev->ctlrno);
|
||||
kproc(name, rxproc, edev);
|
||||
snprint(name, sizeof name, "#l%dtx", edev->ctlrno);
|
||||
kproc(name, txproc, edev);
|
||||
if(ctlr->attached){
|
||||
unlock(ctlr);
|
||||
return;
|
||||
}
|
||||
ctlr->attached = 1;
|
||||
unlock(ctlr);
|
||||
|
||||
/* ready to go */
|
||||
outb(ctlr->port+Qstatus, inb(ctlr->port+Qstatus) | Sdriverok);
|
||||
|
||||
/* start kprocs */
|
||||
snprint(name, sizeof name, "#l%drx", edev->ctlrno);
|
||||
kproc(name, rxproc, edev);
|
||||
snprint(name, sizeof name, "#l%dtx", edev->ctlrno);
|
||||
kproc(name, txproc, edev);
|
||||
}
|
||||
|
||||
static long
|
||||
|
|
Loading…
Reference in a new issue