#include "io.h"
#include "../port/error.h"
#include "../port/netif.h"
-
-#include "etherif.h"
+#include "../port/etherif.h"
enum {
Ctrl = 0x00000000, /* Device Control */
if((bp = *(ctlr->freehead)) != nil){
*(ctlr->freehead) = bp->next;
bp->next = nil;
- _xinc(&bp->ref); /* prevent bp from being freed */
}
iunlock(&freelistlock);
return bp;
ctlr->rb[rdh] = nil;
bp->wp += rdesc->length;
bp->next = nil;
- etheriq(edev, bp, 1);
+ etheriq(edev, bp);
}
if(ctlr->rb[rdh] != nil){
Ctlr *ctlr;
edev = arg;
+ while(waserror())
+ ;
for(;;){
tsleep(&up->sleep, return0, 0, 1000);
-
ctlr = edev->ctlr;
- if(ctlr == nil){
- print("%s: exiting\n", up->text);
- pexit("disabled", 0);
- }
+ if(ctlr == nil)
+ break;
gc82543checklink(ctlr);
gc82543replenish(ctlr);
}
+ print("%s: exiting\n", up->text);
+ pexit("disabled", 1);
}
static void
break;
}
+ ctlr = malloc(sizeof(Ctlr));
+ if(ctlr == nil){
+ print("82543gc: can't allocate memory\n");
+ continue;
+ }
mem = vmap(p->mem[0].bar & ~0x0F, p->mem[0].size);
if(mem == 0){
- print("gc82543: can't map %8.8luX\n", p->mem[0].bar);
+ print("82543gc: can't map %8.8luX\n", p->mem[0].bar);
+ free(ctlr);
continue;
}
cls = pcicfgr8(p, PciCLS);
switch(cls){
- case 0x00:
- case 0xFF:
- print("82543gc: unusable cache line size\n");
- continue;
- case 0x08:
- break;
- default:
- print("82543gc: cache line size %d, expected 32\n",
- cls*4);
+ case 0x08:
+ case 0x10:
+ break;
+ default:
+ print("82543gc: p->cls %#ux, setting to 0x10\n", p->cls);
+ p->cls = 0x10;
+ pcicfgw8(p, PciCLS, p->cls);
}
- ctlr = malloc(sizeof(Ctlr));
ctlr->port = p->mem[0].bar & ~0x0F;
ctlr->pcidev = p;
ctlr->id = (p->did<<16)|p->vid;
ctlr->nic = mem;
- if(gc82543reset(ctlr)){
- free(ctlr);
- continue;
- }
-
if(gc82543ctlrhead != nil)
gc82543ctlrtail->next = ctlr;
else
}
if(ctlr == nil)
return -1;
+
+ pcienable(ctlr->pcidev);
+ gc82543reset(ctlr);
edev->ctlr = ctlr;
edev->port = ctlr->port;
}
}
gc82543init(edev);
+ pcisetbme(ctlr->pcidev);
/*
* Linkage to the generic ethernet driver.