Module Name:    src
Committed By:   rin
Date:           Thu Jan 31 15:26:24 UTC 2019

Modified Files:
        src/sys/dev/usb: if_axen.c if_axenreg.h

Log Message:
Enable hash-table-based multicast filter:
- Drop AXEN_RXCTL_ACPT_PHY_MCAST bit (neither Linux nor FreeBSD sets it).
- 0x0010 bit is not AXEN_RXCTL_ACPT_BCAST ("accept broadcast") but
  AXEN_RXCTL_ACPT_MCAST ("accept multicast (hash-table-based)").


To generate a diff of this commit:
cvs rdiff -u -r1.22 -r1.23 src/sys/dev/usb/if_axen.c
cvs rdiff -u -r1.4 -r1.5 src/sys/dev/usb/if_axenreg.h

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/dev/usb/if_axen.c
diff -u src/sys/dev/usb/if_axen.c:1.22 src/sys/dev/usb/if_axen.c:1.23
--- src/sys/dev/usb/if_axen.c:1.22	Thu Jan 31 15:24:13 2019
+++ src/sys/dev/usb/if_axen.c	Thu Jan 31 15:26:24 2019
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_axen.c,v 1.22 2019/01/31 15:24:13 rin Exp $	*/
+/*	$NetBSD: if_axen.c,v 1.23 2019/01/31 15:26:24 rin Exp $	*/
 /*	$OpenBSD: if_axen.c,v 1.3 2013/10/21 10:10:22 yuo Exp $	*/
 
 /*
@@ -23,7 +23,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_axen.c,v 1.22 2019/01/31 15:24:13 rin Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_axen.c,v 1.23 2019/01/31 15:26:24 rin Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_inet.h"
@@ -354,32 +354,38 @@ axen_iff(struct axen_softc *sc)
 	axen_lock_mii(sc);
 	axen_cmd(sc, AXEN_CMD_MAC_READ2, 2, AXEN_MAC_RXCTL, &wval);
 	rxmode = le16toh(wval);
-	rxmode &= ~(AXEN_RXCTL_ACPT_ALL_MCAST | AXEN_RXCTL_ACPT_PHY_MCAST |
-		  AXEN_RXCTL_PROMISC);
+	rxmode &= ~(AXEN_RXCTL_ACPT_ALL_MCAST | AXEN_RXCTL_PROMISC |
+	    AXEN_RXCTL_ACPT_MCAST);
 	ifp->if_flags &= ~IFF_ALLMULTI;
 
-	/*
-	 * Always accept broadcast frames.
-	 * Always accept frames destined to our station address.
-	 */
-	rxmode |= AXEN_RXCTL_ACPT_BCAST;
-
-	if (ifp->if_flags & IFF_PROMISC || ec->ec_multicnt > 0 /* XXX */) {
-		ifp->if_flags |= IFF_ALLMULTI;
-		rxmode |= AXEN_RXCTL_ACPT_ALL_MCAST | AXEN_RXCTL_ACPT_PHY_MCAST;
-		if (ifp->if_flags & IFF_PROMISC)
-			rxmode |= AXEN_RXCTL_PROMISC;
+	if (ifp->if_flags & IFF_PROMISC) {
+		DPRINTF(("%s: promisc\n", device_xname(sc->axen_dev)));
+		rxmode |= AXEN_RXCTL_PROMISC;
+allmulti:	ifp->if_flags |= IFF_ALLMULTI;
+		rxmode |= AXEN_RXCTL_ACPT_ALL_MCAST
+		/* | AXEN_RXCTL_ACPT_PHY_MCAST */;
 	} else {
-		rxmode |= AXEN_RXCTL_ACPT_ALL_MCAST | AXEN_RXCTL_ACPT_PHY_MCAST;
-
 		/* now program new ones */
+		DPRINTF(("%s: initializing hash table\n",
+		    device_xname(sc->axen_dev)));
 		ETHER_FIRST_MULTI(step, ec, enm);
 		while (enm != NULL) {
+			if (memcmp(enm->enm_addrlo, enm->enm_addrhi,
+			    ETHER_ADDR_LEN)) {
+				DPRINTF(("%s: allmulti\n",
+				    device_xname(sc->axen_dev)));
+				memset(hashtbl, 0, sizeof(hashtbl));
+				goto allmulti;
+			}
 			h = ether_crc32_be(enm->enm_addrlo,
 			    ETHER_ADDR_LEN) >> 26;
 			hashtbl[h / 8] |= 1 << (h % 8);
+			DPRINTF(("%s: %s added\n",
+			    device_xname(sc->axen_dev),
+			    ether_sprintf(enm->enm_addrlo)));
 			ETHER_NEXT_MULTI(step, enm);
 		}
+		rxmode |= AXEN_RXCTL_ACPT_MCAST;
 	}
 
 	axen_cmd(sc, AXEN_CMD_MAC_WRITE_FILTER, 8, AXEN_FILTER_MULTI, hashtbl);
@@ -570,7 +576,6 @@ axen_ax88179_init(struct axen_softc *sc)
 	/* Set RX/TX configuration. */
 	/* Set RX control register */
 	ctl = AXEN_RXCTL_IPE | AXEN_RXCTL_DROPCRCERR | AXEN_RXCTL_AUTOB;
-	ctl |= AXEN_RXCTL_ACPT_PHY_MCAST | AXEN_RXCTL_ACPT_ALL_MCAST;
 	wval = htole16(ctl);
 	axen_cmd(sc, AXEN_CMD_MAC_WRITE2, 2, AXEN_MAC_RXCTL, &wval);
 

Index: src/sys/dev/usb/if_axenreg.h
diff -u src/sys/dev/usb/if_axenreg.h:1.4 src/sys/dev/usb/if_axenreg.h:1.5
--- src/sys/dev/usb/if_axenreg.h:1.4	Wed Jan 30 11:13:25 2019
+++ src/sys/dev/usb/if_axenreg.h	Thu Jan 31 15:26:24 2019
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_axenreg.h,v 1.4 2019/01/30 11:13:25 rin Exp $	*/
+/*	$NetBSD: if_axenreg.h,v 1.5 2019/01/31 15:26:24 rin Exp $	*/
 /*	$OpenBSD: if_axenreg.h,v 1.1 2013/10/07 05:37:41 yuo Exp $	*/
 
 /*
@@ -153,7 +153,7 @@
 #define     AXEN_RXCTL_ACPT_ALL_MCAST		  0x0002
 #define     AXEN_RXCTL_HA8B			  0x0004
 #define     AXEN_RXCTL_AUTOB			  0x0008
-#define     AXEN_RXCTL_ACPT_BCAST		  0x0010
+#define     AXEN_RXCTL_ACPT_MCAST		  0x0010
 #define     AXEN_RXCTL_ACPT_PHY_MCAST		  0x0020
 #define     AXEN_RXCTL_START			  0x0080
 #define     AXEN_RXCTL_DROPCRCERR		  0x0100

Reply via email to