#include "io.h"
#include "../port/error.h"
#include "../port/netif.h"
+#include "../port/etherif.h"
-#include "etherif.h"
#include "ethermii.h"
enum {
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);
vt6105Mattach(Ether* edev)
{
Ctlr *ctlr;
-// MiiPhy *phy;
uchar *alloc;
Ds *ds, *prev;
int dsz, i, timeo;
}
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;
ctlr->tintr++;
}
if(isr)
- panic("vt6105M: isr %4.4uX\n", isr);
+ panic("vt6105M: isr %4.4uX", isr);
}
ctlr->imr = imr;
csr16w(ctlr, Imr, ctlr->imr);
*/
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++)
if((cls = pcicfgr8(p, PciCLS)) == 0 || cls == 0xFF)
cls = 0x10;
ctlr->cls = cls*4;
- if(ctlr->cls < sizeof(Ds)){
- print("vt6105M: cls %d < sizeof(Ds)\n", ctlr->cls);
- iofree(port);
- free(ctlr);
- continue;
- }
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;
}