ref: 7cee913cc4ebe66592fb753abe1bea22f850ba8d
parent: 251f342350c153390a964ab3995d2af68781cd9e
author: aiju <devnull@localhost>
date: Sun Apr 24 13:23:17 EDT 2011
fixed interrupt problem with BCM driver on multicore machines
--- a/sys/src/9/pc/etherbcm.c
+++ b/sys/src/9/pc/etherbcm.c
@@ -22,7 +22,7 @@
typedef struct Ctlr Ctlr;
struct Ctlr {- Lock txlock;
+ Lock txlock, imlock;
Ctlr *link;
Pcidev *pdev;
ulong *nic, *status;
@@ -404,6 +404,7 @@
edev = arg;
ctlr = edev->ctlr;
+ ilock(&ctlr->imlock);
dummyread(csr32(ctlr, InterruptMailbox));
csr32(ctlr, InterruptMailbox) = 1;
status = ctlr->status[0];
@@ -416,6 +417,7 @@
bcmtransclean(edev);
bcmtransmit(edev);
csr32(ctlr, InterruptMailbox) = tag << 24;
+ iunlock(&ctlr->imlock);
}
static void
@@ -664,5 +666,5 @@
void
etherbcmlink(void)
{- addethercard("BCM57xx", bcmpnp);+ addethercard("BCM5755", bcmpnp);}
--
⑨