diff options
author | cinap_lenrek <cinap_lenrek@felloff.net> | 2020-05-02 15:34:00 +0200 |
---|---|---|
committer | cinap_lenrek <cinap_lenrek@felloff.net> | 2020-05-02 15:34:00 +0200 |
commit | badbf50b0cc21c0faaae6daddf086f76bc871086 (patch) | |
tree | fc0391e41c2bccb20839db1bafb307dc1bc165e3 | |
parent | d935bb25d2b7ae1f5fa67496eac9da40c2e7dbd4 (diff) | |
parent | 8e2cfc0464d40972afa1f142f999e53771c34399 (diff) |
merge
-rw-r--r-- | sys/src/9/pc/ether82543gc.c | 14 | ||||
-rw-r--r-- | sys/src/9/pc/ether82557.c | 34 | ||||
-rw-r--r-- | sys/src/9/pc/ethervirtio.c | 24 |
3 files changed, 40 insertions, 32 deletions
diff --git a/sys/src/9/pc/ether82543gc.c b/sys/src/9/pc/ether82543gc.c index 572a6ddb1..0409ffb02 100644 --- a/sys/src/9/pc/ether82543gc.c +++ b/sys/src/9/pc/ether82543gc.c @@ -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] = { diff --git a/sys/src/9/pc/ether82557.c b/sys/src/9/pc/ether82557.c index 5577c7a79..b764f1c0b 100644 --- a/sys/src/9/pc/ether82557.c +++ b/sys/src/9/pc/ether82557.c @@ -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 diff --git a/sys/src/9/pc/ethervirtio.c b/sys/src/9/pc/ethervirtio.c index eb1fa98c1..92ec308b9 100644 --- a/sys/src/9/pc/ethervirtio.c +++ b/sys/src/9/pc/ethervirtio.c @@ -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 |