#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 */
l += snprint(p+l, READSTR-l, "tft: %ud\n", ctlr->tft);
if(ctlr->mii != nil && ctlr->mii->curphy != nil){
- l += snprint(p+l, READSTR, "phy: ");
+ l += snprint(p+l, READSTR-l, "phy: ");
for(i = 0; i < NMiiPhyr; i++){
if(i && ((i & 0x07) == 0))
l += snprint(p+l, READSTR-l, "\n ");
edev = arg;
ctlr = edev->ctlr;
+ while(waserror())
+ ;
for(;;){
if(ctlr->mii == nil || ctlr->mii->curphy == nil)
break;
static void
vt6102attach(Ether* edev)
{
- int i;
+ int dsz, i;
Ctlr *ctlr;
Ds *ds, *prev;
uchar *alloc, *bounce;
*/
ctlr->nrd = Nrd;
ctlr->ntd = Ntd;
- alloc = malloc((ctlr->nrd+ctlr->ntd)*ctlr->cls + ctlr->ntd*Txcopy + ctlr->cls-1);
+ dsz = ROUNDUP(sizeof(Ds), ctlr->cls);
+ alloc = mallocalign((ctlr->nrd+ctlr->ntd)*dsz + ctlr->ntd*Txcopy, dsz, 0, 0);
if(alloc == nil){
qunlock(&ctlr->alock);
- return;
+ error(Enomem);
}
ctlr->alloc = alloc;
- alloc = (uchar*)ROUNDUP((ulong)alloc, ctlr->cls);
ctlr->rd = (Ds*)alloc;
prev = ctlr->rd + ctlr->nrd-1;
for(i = 0; i < ctlr->nrd; i++){
ds = (Ds*)alloc;
- alloc += ctlr->cls;
+ alloc += dsz;
ds->control = Rdbsz;
ds->branch = PCIWADDR(alloc);
ctlr->td = (Ds*)alloc;
prev = ctlr->td + ctlr->ntd-1;
- bounce = alloc + ctlr->ntd*ctlr->cls;
+ bounce = alloc + ctlr->ntd*dsz;
for(i = 0; i < ctlr->ntd; i++){
ds = (Ds*)alloc;
- alloc += ctlr->cls;
+ alloc += dsz;
ds->bounce = bounce;
bounce += Txcopy;
else if(bp = iallocb(Rdbsz+3)){
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("vt6102: isr %4.4uX\n", isr);
+ panic("vt6102: isr %4.4uX", isr);
}
ctlr->imr = imr;
csr16w(ctlr, Imr, ctlr->imr);
{
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, "vt6102") < 0){
print("vt6102: 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("vt6102: cls %d < sizeof(Ds)\n", ctlr->cls);
+ if(ctlr == nil){
+ print("vt6102: 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 = Ctft64;
if(vt6102reset(ctlr)){
*/
edev->attach = vt6102attach;
edev->transmit = vt6102transmit;
- edev->interrupt = vt6102interrupt;
edev->ifstat = vt6102ifstat;
edev->ctl = nil;
edev->promiscuous = vt6102promiscuous;
edev->multicast = vt6102multicast;
+ intrenable(edev->irq, vt6102interrupt, edev, edev->tbdf, edev->name);
+
return 0;
}