summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorcinap_lenrek <cinap_lenrek@felloff.net>2020-05-02 15:34:00 +0200
committercinap_lenrek <cinap_lenrek@felloff.net>2020-05-02 15:34:00 +0200
commitbadbf50b0cc21c0faaae6daddf086f76bc871086 (patch)
treefc0391e41c2bccb20839db1bafb307dc1bc165e3
parentd935bb25d2b7ae1f5fa67496eac9da40c2e7dbd4 (diff)
parent8e2cfc0464d40972afa1f142f999e53771c34399 (diff)
merge
-rw-r--r--sys/src/9/pc/ether82543gc.c14
-rw-r--r--sys/src/9/pc/ether82557.c34
-rw-r--r--sys/src/9/pc/ethervirtio.c24
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