diff options
author | cinap_lenrek <cinap_lenrek@felloff.net> | 2015-07-12 19:21:53 +0200 |
---|---|---|
committer | cinap_lenrek <cinap_lenrek@felloff.net> | 2015-07-12 19:21:53 +0200 |
commit | a5efa0e252692b888a5de679cfc901a0421ffe73 (patch) | |
tree | 2a375325c63b80e6a71a2d15aae65c453e3e933e | |
parent | cbd1ca6877ec10d7edf75edc2637da62e8f5bbac (diff) | |
download | plan9front-a5efa0e252692b888a5de679cfc901a0421ffe73.tar.xz |
ether82563: fix multicast filter (based on openbsd em(4) driver)
-rw-r--r-- | sys/src/9/pc/ether82563.c | 26 |
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]); } |