code: plan9front

Download patch

ref: a5efa0e252692b888a5de679cfc901a0421ffe73
parent: cbd1ca6877ec10d7edf75edc2637da62e8f5bbac
author: cinap_lenrek <cinap_lenrek@felloff.net>
date: Sun Jul 12 15:21:53 EDT 2015

ether82563: fix multicast filter (based on openbsd em(4) driver)

--- a/sys/src/9/pc/ether82563.c
+++ b/sys/src/9/pc/ether82563.c
@@ -749,12 +749,24 @@
 	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 @@
 	 */
 	if(on)
 		ctlr->mta[x] |= 1<<bit;
-//	else
-//		ctlr->mta[x] &= ~(1<<bit);
 
 	csr32w(ctlr, Mta+x*4, ctlr->mta[x]);
 }