summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorcinap_lenrek <cinap_lenrek@felloff.net>2015-07-12 19:21:53 +0200
committercinap_lenrek <cinap_lenrek@felloff.net>2015-07-12 19:21:53 +0200
commita5efa0e252692b888a5de679cfc901a0421ffe73 (patch)
tree2a375325c63b80e6a71a2d15aae65c453e3e933e
parentcbd1ca6877ec10d7edf75edc2637da62e8f5bbac (diff)
downloadplan9front-a5efa0e252692b888a5de679cfc901a0421ffe73.tar.xz
ether82563: fix multicast filter (based on openbsd em(4) driver)
-rw-r--r--sys/src/9/pc/ether82563.c26
1 files changed, 18 insertions, 8 deletions
diff --git a/sys/src/9/pc/ether82563.c b/sys/src/9/pc/ether82563.c
index 9e9db66ba..4769a3a37 100644
--- a/sys/src/9/pc/ether82563.c
+++ b/sys/src/9/pc/ether82563.c
@@ -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]);
}