]> git.lizzy.rs Git - plan9front.git/blobdiff - sys/src/9/pc/ethervt6105m.c
[9front] [PATCH] audiohda: add PCI ID for Intel C610/X99
[plan9front.git] / sys / src / 9 / pc / ethervt6105m.c
index 06d02c0f2f7dd2ea47874f3df55dead11f4b96d2..c0f513b52ca3ec9650b3d5f1aa1b16c1d04bede5 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 */
@@ -439,9 +439,8 @@ vt6105Mifstat(Ether* edev, void* a, long n, ulong offset)
        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]);
@@ -548,6 +547,8 @@ vt6105Mlproc(void* arg)
 
        edev = arg;
        ctlr = edev->ctlr;
+       while(waserror())
+               ;
        for(;;){
                if(ctlr->mii == nil || ctlr->mii->curphy == nil)
                        break;
@@ -596,7 +597,6 @@ vt6105Mrballoc(void)
        if((bp = vt6105Mrbpool) != nil){
                vt6105Mrbpool = bp->next;
                bp->next = nil;
-               _xinc(&bp->ref);        /* prevent bp from being freed */
        }
        iunlock(&vt6105Mrblock);
 
@@ -611,7 +611,6 @@ static void
 vt6105Mattach(Ether* edev)
 {
        Ctlr *ctlr;
-//     MiiPhy *phy;
        uchar *alloc;
        Ds *ds, *prev;
        int dsz, i, timeo;
@@ -635,7 +634,7 @@ vt6105Mattach(Ether* edev)
        alloc = mallocalign((ctlr->nrd+ctlr->ntd)*dsz, dsz, 0, 0);
        if(alloc == nil){
                qunlock(&ctlr->alock);
-               return;
+               error(Enomem);
        }
        ctlr->alloc = alloc;
 
@@ -866,7 +865,7 @@ vt6105Mreceive(Ether* edev)
                        }
                        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;
@@ -950,7 +949,7 @@ vt6105Minterrupt(Ureg*, void* arg)
                        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);
@@ -1027,12 +1026,13 @@ vt6105Mdetach(Ctlr* ctlr)
         */
        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;
@@ -1053,12 +1053,13 @@ vt6105Mreset(Ctlr* ctlr)
         */
        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++)
@@ -1112,7 +1113,7 @@ vt6105Mpci(void)
 {
        Pcidev *p;
        Ctlr *ctlr;
-       int cls, port;
+       int port;
 
        p = nil;
        while(p = pcimatch(p, 0, 0)){
@@ -1126,24 +1127,22 @@ vt6105Mpci(void)
                        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)){
@@ -1200,7 +1199,6 @@ vt6105Mpnp(Ether* edev)
         */
        edev->attach = vt6105Mattach;
        edev->transmit = vt6105Mtransmit;
-       edev->interrupt = vt6105Minterrupt;
        edev->ifstat = vt6105Mifstat;
        edev->ctl = nil;
 
@@ -1210,6 +1208,8 @@ vt6105Mpnp(Ether* edev)
 
        edev->maxmtu = ETHERMAXTU+Bslop;
 
+       intrenable(edev->irq, vt6105Minterrupt, edev, edev->tbdf, edev->name);
+
        return 0;
 }