#include "dat.h"
#include "fns.h"
#include "io.h"
+#include "../port/pci.h"
#include "../port/error.h"
#include "../port/netif.h"
-
-#include "etherif.h"
-#include "ethermii.h"
+#include "../port/etherif.h"
+#include "../port/ethermii.h"
enum {
Par0 = 0x00, /* Ethernet Address */
edev = arg;
ctlr = edev->ctlr;
+ while(waserror())
+ ;
for(;;){
if(ctlr->mii == nil || ctlr->mii->curphy == nil)
break;
if((bp = vt6105Mrbpool) != nil){
vt6105Mrbpool = bp->next;
bp->next = nil;
- _xinc(&bp->ref); /* prevent bp from being freed */
}
iunlock(&vt6105Mrblock);
}
len = ((ds->status & LengthMASK)>>LengthSHIFT)-4;
ds->bp->wp = ds->bp->rp+len;
- etheriq(edev, ds->bp, 1);
+ etheriq(edev, ds->bp);
bp->rp = (uchar*)ROUNDUP((ulong)bp->rp, 4);
ds->addr = PCIWADDR(bp->rp);
ds->bp = bp;
*/
csr16w(ctlr, Cr, Stop);
csr16w(ctlr, Cr, Stop|Sfrst);
- for(timeo = 0; timeo < 10000; timeo++){
+ /* limit used to be 10000, but that wasn't enough for our Soekris 5501s */
+ for(timeo = 0; timeo < 100000; timeo++){
if(!(csr16r(ctlr, Cr) & Sfrst))
break;
microdelay(1);
}
- if(timeo >= 1000)
+ if(timeo >= 100000)
return -1;
return 0;
*/
r = csr8r(ctlr, Eecsr);
csr8w(ctlr, Eecsr, Autold|r);
- for(timeo = 0; timeo < 100; timeo++){
+ /* limit used to be 100, but that wasn't enough for our Soekris 5501s */
+ for(timeo = 0; timeo < 100000; timeo++){
if(!(csr8r(ctlr, Cr) & Autold))
break;
microdelay(1);
}
- if(timeo >= 100)
+ if(timeo >= 100000)
return -1;
for(i = 0; i < Eaddrlen; i++)
{
Pcidev *p;
Ctlr *ctlr;
- int cls, port;
+ int port;
p = nil;
while(p = pcimatch(p, 0, 0)){
break;
}
- port = p->mem[0].bar & ~0x01;
+ port = p->mem[0].bar & ~3;
if(ioalloc(port, p->mem[0].size, 0, "vt6105M") < 0){
print("vt6105M: port 0x%uX in use\n", port);
continue;
}
ctlr->port = port;
ctlr->pcidev = p;
+ pcienable(p);
ctlr->id = (p->did<<16)|p->vid;
- if((cls = pcicfgr8(p, PciCLS)) == 0 || cls == 0xFF)
- cls = 0x10;
- ctlr->cls = cls*4;
+ ctlr->cls = p->cls*4;
ctlr->tft = CtftSAF;
if(vt6105Mreset(ctlr)){
*/
edev->attach = vt6105Mattach;
edev->transmit = vt6105Mtransmit;
- edev->interrupt = vt6105Minterrupt;
edev->ifstat = vt6105Mifstat;
edev->ctl = nil;
edev->maxmtu = ETHERMAXTU+Bslop;
+ intrenable(edev->irq, vt6105Minterrupt, edev, edev->tbdf, edev->name);
+
return 0;
}