]> git.lizzy.rs Git - plan9front.git/blobdiff - sys/src/9/pc/ether82543gc.c
devkbd: bits bad! revert repeat/delay, better patches welcome
[plan9front.git] / sys / src / 9 / pc / ether82543gc.c
index c764d0bcf84c790859bb51b83230254d0ac87859..572a6ddb179b37310ff098c81f158ddefee37fa8 100644 (file)
@@ -18,8 +18,7 @@
 #include "io.h"
 #include "../port/error.h"
 #include "../port/netif.h"
-
-#include "etherif.h"
+#include "../port/etherif.h"
 
 enum {
        Ctrl            = 0x00000000,   /* Device Control */
@@ -758,7 +757,6 @@ gc82543allocb(Ctlr* ctlr)
        if((bp = *(ctlr->freehead)) != nil){
                *(ctlr->freehead) = bp->next;
                bp->next = nil;
-               _xinc(&bp->ref);        /* prevent bp from being freed */
        }
        iunlock(&freelistlock);
        return bp;
@@ -853,7 +851,7 @@ gc82543recv(Ether* edev, int icr)
                        ctlr->rb[rdh] = nil;
                        bp->wp += rdesc->length;
                        bp->next = nil;
-                       etheriq(edev, bp, 1);
+                       etheriq(edev, bp);
                }
 
                if(ctlr->rb[rdh] != nil){
@@ -1228,18 +1226,19 @@ gc82543watchdog(void* arg)
        Ctlr *ctlr;
 
        edev = arg;
+       while(waserror())
+               ;
        for(;;){
                tsleep(&up->sleep, return0, 0, 1000);
-
                ctlr = edev->ctlr;
-               if(ctlr == nil){
-                       print("%s: exiting\n", up->text);
-                       pexit("disabled", 0);
-               }
+               if(ctlr == nil)
+                       break;
 
                gc82543checklink(ctlr);
                gc82543replenish(ctlr);
        }
+       print("%s: exiting\n", up->text);
+       pexit("disabled", 1);
 }
 
 static void
@@ -1265,34 +1264,32 @@ gc82543pci(void)
                        break;
                }
 
+               ctlr = malloc(sizeof(Ctlr));
+               if(ctlr == nil){
+                       print("82543gc: can't allocate memory\n");
+                       continue;
+               }
                mem = vmap(p->mem[0].bar & ~0x0F, p->mem[0].size);
                if(mem == 0){
-                       print("gc82543: can't map %8.8luX\n", p->mem[0].bar);
+                       print("82543gc: can't map %8.8luX\n", p->mem[0].bar);
+                       free(ctlr);
                        continue;
                }
                cls = pcicfgr8(p, PciCLS);
                switch(cls){
-                       case 0x00:
-                       case 0xFF:
-                               print("82543gc: unusable cache line size\n");
-                               continue;
-                       case 0x08:
-                               break;
-                       default:
-                               print("82543gc: cache line size %d, expected 32\n",
-                                       cls*4);
+               case 0x08:
+               case 0x10:
+                       break;
+               default:
+                       print("82543gc: p->cls %#ux, setting to 0x10\n", p->cls);
+                       p->cls = 0x10;
+                       pcicfgw8(p, PciCLS, p->cls);
                }
-               ctlr = malloc(sizeof(Ctlr));
                ctlr->port = p->mem[0].bar & ~0x0F;
                ctlr->pcidev = p;
                ctlr->id = (p->did<<16)|p->vid;
                ctlr->nic = mem;
 
-               if(gc82543reset(ctlr)){
-                       free(ctlr);
-                       continue;
-               }
-
                if(gc82543ctlrhead != nil)
                        gc82543ctlrtail->next = ctlr;
                else
@@ -1325,6 +1322,9 @@ gc82543pnp(Ether* edev)
        }
        if(ctlr == nil)
                return -1;
+       
+       pcienable(ctlr->pcidev);
+       gc82543reset(ctlr);
 
        edev->ctlr = ctlr;
        edev->port = ctlr->port;
@@ -1345,6 +1345,7 @@ gc82543pnp(Ether* edev)
                }
        }
        gc82543init(edev);
+       pcisetbme(ctlr->pcidev);
 
        /*
         * Linkage to the generic ethernet driver.