[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