]> git.lizzy.rs Git - plan9front.git/commitdiff
ether82563: fix multicast filter (based on openbsd em(4) driver)
authorcinap_lenrek <cinap_lenrek@felloff.net>
Sun, 12 Jul 2015 17:21:53 +0000 (19:21 +0200)
committercinap_lenrek <cinap_lenrek@felloff.net>
Sun, 12 Jul 2015 17:21:53 +0000 (19:21 +0200)
sys/src/9/pc/ether82563.c

index 9e9db66ba8d147e9bfe9c4eb99f17f48048324e0..4769a3a37d10f3b7737fd2a6fd7f61c85626538e 100644 (file)
@@ -749,12 +749,24 @@ i82563multicast(void *arg, uchar *addr, int on)
        edev = arg;
        ctlr = edev->ctlr;
 
-       x = addr[5]>>1;
-       if(ctlr->type == i82566)
-               x &= 31;
-       if(ctlr->type == i218)
-               x &= 15;
-       bit = ((addr[5] & 1)<<4)|(addr[4]>>4);
+       switch(ctlr->type){
+       case i82566:
+       case i82567:
+       case i82567m:
+       case i82577:
+       case i82577m:
+       case i82579:
+       case i218:
+               bit = (addr[5]<<2)|(addr[4]>>6);
+               x = (bit>>5) & 31;
+               break;
+       default:
+               bit = (addr[5]<<4)|(addr[4]>>4);
+               x = (bit>>5) & 127;
+               break;
+       }
+       bit &= 31;
+
        /*
         * multiple ether addresses can hash to the same filter bit,
         * so it's never safe to clear a filter bit.
@@ -764,8 +776,6 @@ i82563multicast(void *arg, uchar *addr, int on)
         */
        if(on)
                ctlr->mta[x] |= 1<<bit;
-//     else
-//             ctlr->mta[x] &= ~(1<<bit);
 
        csr32w(ctlr, Mta+x*4, ctlr->mta[x]);
 }