[prev in list] [next in list] [prev in thread] [next in thread] 

List:       openbsd-tech
Subject:    [axen 3/7] rebuild the filter flags from scratch
From:       Nils Frohberg <nilsf () tako ! de>
Date:       2019-02-26 14:03:09
Message-ID: 20190226140309.GE20855 () tako ! de
[Download RAW message or body]

rebuild the filter flags from scratch instead of pulling the state
from the card and setting/unsetting the necessary bits.

---
 dev/usb/if_axen.c    | 23 ++++++++++++-----------
 dev/usb/if_axenreg.h |  4 ++--
 2 files changed, 14 insertions(+), 13 deletions(-)

diff --git a/dev/usb/if_axen.c b/dev/usb/if_axen.c
index dfdcecf..088f40f 100644
--- a/dev/usb/if_axen.c
+++ b/dev/usb/if_axen.c
@@ -392,27 +392,27 @@ axen_iff(struct axen_softc *sc)
 
 	/* Enable receiver, set RX mode */
 	axen_lock_mii(sc);
-	axen_cmd(sc, AXEN_CMD_MAC_READ2, 2, AXEN_MAC_RXCTL, &wval);
-	rxmode = UGETW(wval);
-	rxmode &= ~(AXEN_RXCTL_ACPT_ALL_MCAST | AXEN_RXCTL_ACPT_PHY_MCAST |
-		  AXEN_RXCTL_PROMISC);
+	rxmode = AXEN_RXCTL_DROPCRCERR | AXEN_RXCTL_START;
 	ifp->if_flags &= ~IFF_ALLMULTI;
 
 	/*
-	 * Always accept broadcast frames.
 	 * Always accept frames destined to our station address.
 	 */
-	rxmode |= AXEN_RXCTL_ACPT_BCAST;
+	rxmode |= AXEN_RXCTL_ACPT_PHY_MCAST;
+	/*
+	 * Accept broadcast frames iff interface has IFF_BROADCAST set.
+	 */
+	if (ifp->if_flags & IFF_BROADCAST)
+		rxmode |= AXEN_RXCTL_ACPT_BCAST;
 
 	if (ifp->if_flags & IFF_PROMISC || ac->ac_multirangecnt > 0) {
 		ifp->if_flags |= IFF_ALLMULTI;
-		rxmode |= AXEN_RXCTL_ACPT_ALL_MCAST | AXEN_RXCTL_ACPT_PHY_MCAST;
+		rxmode |= AXEN_RXCTL_ACPT_ALL_MCAST;
 		if (ifp->if_flags & IFF_PROMISC)
 			rxmode |= AXEN_RXCTL_PROMISC;
 	} else {
-		rxmode |= AXEN_RXCTL_ACPT_ALL_MCAST | AXEN_RXCTL_ACPT_PHY_MCAST;
-
-		/* now program new ones */
+		rxmode |= AXEN_RXCTL_ACPT_MCAST;
+		/* compute multicast filter array */
 		ETHER_FIRST_MULTI(step, ac, enm);
 		while (enm != NULL) {
 			h = ether_crc32_be(enm->enm_addrlo,
@@ -424,6 +424,7 @@ axen_iff(struct axen_softc *sc)
 
 	axen_cmd(sc, AXEN_CMD_MAC_WRITE_FILTER, 8, AXEN_FILTER_MULTI, 
 	    (void *)&hashtbl);
+
 	USETW(wval, rxmode);
 	axen_cmd(sc, AXEN_CMD_MAC_WRITE2, 2, AXEN_MAC_RXCTL, &wval);
 	axen_unlock_mii(sc);
@@ -543,7 +544,7 @@ axen_ax88179_init(struct axen_softc *sc)
 	axen_cmd(sc, AXEN_CMD_MAC_WRITE, 1, AXEN_TX_COE, &val);
 
 	/* Set RX control register */
-	ctl = AXEN_RXCTL_DROPCRCERR | AXEN_RXCTL_AUTOB;
+	ctl = AXEN_RXCTL_DROPCRCERR;
 	ctl |= AXEN_RXCTL_ACPT_PHY_MCAST | AXEN_RXCTL_ACPT_ALL_MCAST;
 	ctl |= AXEN_RXCTL_START;
 	USETW(wval, ctl);
diff --git a/dev/usb/if_axenreg.h b/dev/usb/if_axenreg.h
index 336727f..766c89e 100644
--- a/dev/usb/if_axenreg.h
+++ b/dev/usb/if_axenreg.h
@@ -157,8 +157,8 @@
 #define     AXEN_RXCTL_PROMISC			  0x0001
 #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_BCAST		  0x0008
+#define     AXEN_RXCTL_ACPT_MCAST		  0x0010
 #define     AXEN_RXCTL_ACPT_PHY_MCAST		  0x0020
 #define     AXEN_RXCTL_START			  0x0080
 #define     AXEN_RXCTL_DROPCRCERR		  0x0100
-- 
2.20.1

[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic