]> git.lizzy.rs Git - plan9front.git/blobdiff - sys/src/9/pc/ethervt6102.c
merge
[plan9front.git] / sys / src / 9 / pc / ethervt6102.c
index 32d17afaebc6a8280aab5aaca6f37609f84f1dd5..9ea47f1aee7d3140a288af1f5e98d42c26956a63 100644 (file)
 #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 */
@@ -371,7 +371,7 @@ vt6102ifstat(Ether* edev, void* a, long n, ulong offset)
        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       ");
@@ -440,6 +440,8 @@ vt6102lproc(void* arg)
 
        edev = arg;
        ctlr = edev->ctlr;
+       while(waserror())
+               ;
        for(;;){
                if(ctlr->mii == nil || ctlr->mii->curphy == nil)
                        break;
@@ -468,7 +470,7 @@ enable:
 static void
 vt6102attach(Ether* edev)
 {
-       int i;
+       int dsz, i;
        Ctlr *ctlr;
        Ds *ds, *prev;
        uchar *alloc, *bounce;
@@ -488,13 +490,13 @@ vt6102attach(Ether* edev)
         */
        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;
 
@@ -517,7 +519,7 @@ vt6102attach(Ether* edev)
        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);
@@ -541,10 +543,10 @@ vt6102attach(Ether* edev)
 
        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;
@@ -718,7 +720,7 @@ vt6102receive(Ether* edev)
                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;
@@ -789,7 +791,7 @@ vt6102interrupt(Ureg*, void* arg)
                        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);
@@ -946,7 +948,7 @@ vt6102pci(void)
 {
        Pcidev *p;
        Ctlr *ctlr;
-       int cls, port;
+       int port;
 
        p = nil;
        while(p = pcimatch(p, 0, 0)){
@@ -961,24 +963,22 @@ vt6102pci(void)
                        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)){
@@ -1031,7 +1031,6 @@ vt6102pnp(Ether* edev)
         */
        edev->attach = vt6102attach;
        edev->transmit = vt6102transmit;
-       edev->interrupt = vt6102interrupt;
        edev->ifstat = vt6102ifstat;
        edev->ctl = nil;
 
@@ -1039,6 +1038,8 @@ vt6102pnp(Ether* edev)
        edev->promiscuous = vt6102promiscuous;
        edev->multicast = vt6102multicast;
 
+       intrenable(edev->irq, vt6102interrupt, edev, edev->tbdf, edev->name);
+
        return 0;
 }