Module Name:    src
Committed By:   nisimura
Date:           Sat Feb 29 02:51:14 UTC 2020

Modified Files:
        src/sys/dev/usb: if_axe.c

Log Message:
iron out receive filter multicast/promisc logic


To generate a diff of this commit:
cvs rdiff -u -r1.123 -r1.124 src/sys/dev/usb/if_axe.c

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_axe.c
diff -u src/sys/dev/usb/if_axe.c:1.123 src/sys/dev/usb/if_axe.c:1.124
--- src/sys/dev/usb/if_axe.c:1.123	Mon Feb 24 12:38:57 2020
+++ src/sys/dev/usb/if_axe.c	Sat Feb 29 02:51:14 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_axe.c,v 1.123 2020/02/24 12:38:57 rin Exp $	*/
+/*	$NetBSD: if_axe.c,v 1.124 2020/02/29 02:51:14 nisimura Exp $	*/
 /*	$OpenBSD: if_axe.c,v 1.137 2016/04/13 11:03:37 mpi Exp $ */
 
 /*
@@ -87,7 +87,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_axe.c,v 1.123 2020/02/24 12:38:57 rin Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_axe.c,v 1.124 2020/02/29 02:51:14 nisimura Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_usb.h"
@@ -450,17 +450,13 @@ axe_setiff_locked(struct usbnet *un)
 	rxmode = le16toh(rxmode);
 
 	rxmode &=
-	    ~(AXE_RXCMD_ALLMULTI | AXE_RXCMD_PROMISC |
-	    AXE_RXCMD_BROADCAST | AXE_RXCMD_MULTICAST);
+	    ~(AXE_RXCMD_ALLMULTI | AXE_RXCMD_PROMISC | AXE_RXCMD_MULTICAST);
 
-	rxmode |=
-	    (ifp->if_flags & IFF_BROADCAST) ? AXE_RXCMD_BROADCAST : 0;
-
-	if (ifp->if_flags & (IFF_ALLMULTI | IFF_PROMISC)) {
-		if (ifp->if_flags & IFF_PROMISC)
-			rxmode |= AXE_RXCMD_PROMISC;
+	if (ifp->if_flags & IFF_PROMISC) {
+		ifp->if_flags |= IFF_ALLMULTI;
 		goto allmulti;
 	}
+	ifp->if_flags &= ~IFF_ALLMULTI;
 
 	/* Now program new ones */
 	ETHER_LOCK(ec);
@@ -469,6 +465,7 @@ axe_setiff_locked(struct usbnet *un)
 		if (memcmp(enm->enm_addrlo, enm->enm_addrhi,
 		    ETHER_ADDR_LEN) != 0) {
 			ETHER_UNLOCK(ec);
+			ifp->if_flags |= IFF_ALLMULTI;
 			goto allmulti;
 		}
 
@@ -477,15 +474,15 @@ axe_setiff_locked(struct usbnet *un)
 		ETHER_NEXT_MULTI(step, enm);
 	}
 	ETHER_UNLOCK(ec);
-	ifp->if_flags &= ~IFF_ALLMULTI;
-	rxmode |= AXE_RXCMD_MULTICAST;
 
+	rxmode |= AXE_RXCMD_MULTICAST;
 	axe_cmd(sc, AXE_CMD_WRITE_MCAST, 0, 0, hashtbl);
 	axe_cmd(sc, AXE_CMD_RXCTL_WRITE, 0, rxmode, NULL);
 	return;
 
  allmulti:
-	ifp->if_flags |= IFF_ALLMULTI;
+	if (ifp->if_flags & IFF_PROMISC)
+		rxmode |= AXE_RXCMD_PROMISC;
 	rxmode |= AXE_RXCMD_ALLMULTI;
 	axe_cmd(sc, AXE_CMD_RXCTL_WRITE, 0, rxmode, NULL);
 }
@@ -1323,19 +1320,11 @@ axe_init_locked(struct ifnet *ifp)
 		rxmode |= AXE_172_RXCMD_UNICAST;
 	}
 
-
-	/* If we want promiscuous mode, set the allframes bit. */
-	if (ifp->if_flags & IFF_PROMISC)
-		rxmode |= AXE_RXCMD_PROMISC;
-
-	if (ifp->if_flags & IFF_BROADCAST)
-		rxmode |= AXE_RXCMD_BROADCAST;
-
 	DPRINTF("rxmode %#jx", rxmode, 0, 0, 0);
 
 	axe_cmd(sc, AXE_CMD_RXCTL_WRITE, 0, rxmode, NULL);
 
-	/* Load the multicast filter. */
+	/* Accept multicast frame or run promisc. */
 	axe_setiff_locked(un);
 
 	usbnet_unlock_mii_un_locked(un);

Reply via email to