diff options
author | cinap_lenrek <cinap_lenrek@visitor-011.row-08.revision-party.de> | 2011-04-25 21:33:04 +0000 |
---|---|---|
committer | cinap_lenrek <cinap_lenrek@visitor-011.row-08.revision-party.de> | 2011-04-25 21:33:04 +0000 |
commit | e50b5178c1f228eab254d21f7af2eecce8929ac6 (patch) | |
tree | 309f04ebf6b4999e51b3ee7c5fdb99467453a373 /sys/src | |
parent | 028bd871a9934e74b0641aaccc145e8b6ee13b1b (diff) | |
parent | a71e017fcc5af7910b2407dceb011e01317abd09 (diff) |
merge
Diffstat (limited to 'sys/src')
-rw-r--r-- | sys/src/9/pc/etherbcm.c | 6 | ||||
-rw-r--r-- | sys/src/9/pc/mp.c | 48 |
2 files changed, 51 insertions, 3 deletions
diff --git a/sys/src/9/pc/etherbcm.c b/sys/src/9/pc/etherbcm.c index 67d7c2a4a..48963c247 100644 --- 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 @@ bcminterrupt(Ureg*, void *arg) edev = arg; ctlr = edev->ctlr; + ilock(&ctlr->imlock); dummyread(csr32(ctlr, InterruptMailbox)); csr32(ctlr, InterruptMailbox) = 1; status = ctlr->status[0]; @@ -416,6 +417,7 @@ bcminterrupt(Ureg*, void *arg) bcmtransclean(edev); bcmtransmit(edev); csr32(ctlr, InterruptMailbox) = tag << 24; + iunlock(&ctlr->imlock); } static void @@ -664,5 +666,5 @@ bcmpnp(Ether* edev) void etherbcmlink(void) { - addethercard("BCM57xx", bcmpnp); + addethercard("BCM5755", bcmpnp); } diff --git a/sys/src/9/pc/mp.c b/sys/src/9/pc/mp.c index 0fb65b2db..ee094341b 100644 --- a/sys/src/9/pc/mp.c +++ b/sys/src/9/pc/mp.c @@ -154,6 +154,8 @@ mkioapic(PCMPioapic* p) return 0; apic = &mpapic[apicno]; + if(apic->flags != 0) + print("mkioapic: APIC ID conflict at %d\n", p->apicno); apic->type = PcmpIOAPIC; apic->apicno = apicno; apic->addr = va; @@ -484,6 +486,46 @@ mpstartap(Apic* apic) nvramwrite(0x0F, 0x00); } +static void +dumpmp(uchar *p, uchar *e) +{ + int i; + + for(i = 0; p < e; p++) { + if((i % 16) == 0) print("*mp%d=", i/16); + print("%.2x ", *p); + if((++i % 16) == 0) print("\n"); + } + if((i % 16) != 0) print("\n"); +} + +static void +mpoverride(uchar** newp, uchar** e) +{ + int size, i, j; + char buf[20]; + uchar* p; + char* s; + + size = atoi(getconf("*mp")); + if(size == 0) panic("mpoverride: invalid size in *mp"); + *newp = p = malloc(size); + if(p == nil) panic("mpoverride: can't allocate memory"); + *e = p + size; + for(i = 0; ; i++){ + snprint(buf, sizeof buf, "*mp%d", i); + s = getconf(buf); + if(s == nil) break; + while(*s){ + j = strtol(s, &s, 16); + if(*s && *s != ' ' || j < 0 || j > 0xff) panic("mpoverride: invalid entry in %s", buf); + if(p >= *e) panic("mpoverride: overflow in %s", buf); + *p++ = j; + } + } + if(p != *e) panic("mpoverride: size doesn't match"); +} + void mpinit(void) { @@ -518,6 +560,10 @@ mpinit(void) */ p = ((uchar*)pcmp)+sizeof(PCMP); e = ((uchar*)pcmp)+pcmp->length; + if(getconf("*dumpmp") != nil) + dumpmp(p, e); + if(getconf("*mp") != nil) + mpoverride(&p, &e); while(p < e) switch(*p){ default: @@ -683,7 +729,7 @@ mpintrenablex(Vctl* v, int tbdf) break; } if(bus == nil){ - print("ioapicirq: can't find bus type %d\n", type); + print("ioapicirq: can't find bus type %d, number %d\n", type, bno); return -1; } |