#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 */
char *alloc, *e, *p;
ctlr = edev->ctlr;
-
- alloc = malloc(READSTR);
- p = alloc;
+
+ p = alloc = smalloc(READSTR);
e = p + READSTR;
for(i = 0; i < Nrxstats; i++){
p = seprint(p, e, "%s: %ud\n", rxstats[i], ctlr->rxstats[i]);
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;
alloc = mallocalign((ctlr->nrd+ctlr->ntd)*dsz, dsz, 0, 0);
if(alloc == nil){
qunlock(&ctlr->alock);
- return;
+ error(Enomem);
}
ctlr->alloc = alloc;
}
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++)
{
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 = malloc(sizeof(Ctlr));
- ctlr->port = port;
- ctlr->pcidev = p;
- ctlr->id = (p->did<<16)|p->vid;
- 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);
+ if(ctlr == nil){
+ print("vt6105M: can't allocate memory\n");
iofree(port);
- free(ctlr);
continue;
}
+ ctlr->port = port;
+ ctlr->pcidev = p;
+ pcienable(p);
+ ctlr->id = (p->did<<16)|p->vid;
+ 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;
}