Module Name: src
Committed By: riastradh
Date: Thu Nov 2 13:50:14 UTC 2023
Modified Files:
src/sys/dev/ic: dwc_eqos.c
Log Message:
eqos(4): Fix multicast filter updates.
1. Don't touch the obsolete IFF_ALLMULTI.
2. Set ETHER_F_ALLMULTI if we're accepting all multicast addresses.
3. If any multicast entry range is not a single address, accept all
multicast addresses.
To generate a diff of this commit:
cvs rdiff -u -r1.32 -r1.33 src/sys/dev/ic/dwc_eqos.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/ic/dwc_eqos.c
diff -u src/sys/dev/ic/dwc_eqos.c:1.32 src/sys/dev/ic/dwc_eqos.c:1.33
--- src/sys/dev/ic/dwc_eqos.c:1.32 Thu Nov 2 13:50:02 2023
+++ src/sys/dev/ic/dwc_eqos.c Thu Nov 2 13:50:14 2023
@@ -1,4 +1,4 @@
-/* $NetBSD: dwc_eqos.c,v 1.32 2023/11/02 13:50:02 riastradh Exp $ */
+/* $NetBSD: dwc_eqos.c,v 1.33 2023/11/02 13:50:14 riastradh Exp $ */
/*-
* Copyright (c) 2022 Jared McNeill <[email protected]>
@@ -38,7 +38,7 @@
#include "opt_net_mpsafe.h"
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: dwc_eqos.c,v 1.32 2023/11/02 13:50:02 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: dwc_eqos.c,v 1.33 2023/11/02 13:50:14 riastradh Exp $");
#include <sys/param.h>
#include <sys/bus.h>
@@ -509,17 +509,29 @@ eqos_setup_rxfilter(struct eqos_softc *s
GMAC_MAC_PACKET_FILTER_PCF_MASK);
hash[0] = hash[1] = ~0U;
+ ETHER_LOCK(ec);
if (sc->sc_promisc) {
+ ec->ec_flags |= ETHER_F_ALLMULTI;
pfil |= GMAC_MAC_PACKET_FILTER_PR |
GMAC_MAC_PACKET_FILTER_PCF_ALL;
- } else if (sc->sc_allmulti) {
- pfil |= GMAC_MAC_PACKET_FILTER_PM;
} else {
- hash[0] = hash[1] = 0;
pfil |= GMAC_MAC_PACKET_FILTER_HMC;
- ETHER_LOCK(ec);
+ hash[0] = hash[1] = 0;
+ ec->ec_flags &= ~ETHER_F_ALLMULTI;
ETHER_FIRST_MULTI(step, ec, enm);
while (enm != NULL) {
+ if (memcmp(enm->enm_addrlo, enm->enm_addrhi,
+ ETHER_ADDR_LEN) != 0) {
+ ec->ec_flags |= ETHER_F_ALLMULTI;
+ pfil &= ~GMAC_MAC_PACKET_FILTER_HMC;
+ pfil |= GMAC_MAC_PACKET_FILTER_PM;
+ /*
+ * Shouldn't matter if we clear HMC but
+ * let's avoid using different values.
+ */
+ hash[0] = hash[1] = 0xffffffff;
+ break;
+ }
crc = ether_crc32_le(enm->enm_addrlo, ETHER_ADDR_LEN);
crc &= 0x7f;
crc = eqos_bitrev32(~crc) >> 26;
@@ -528,8 +540,8 @@ eqos_setup_rxfilter(struct eqos_softc *s
hash[hashreg] |= (1 << hashbit);
ETHER_NEXT_MULTI(step, enm);
}
- ETHER_UNLOCK(ec);
}
+ ETHER_UNLOCK(ec);
/* Write our unicast address */
eaddr = CLLADDR(ifp->if_sadl);
@@ -618,7 +630,6 @@ eqos_init_locked(struct eqos_softc *sc)
/* Setup RX filter */
sc->sc_promisc = ifp->if_flags & IFF_PROMISC;
- sc->sc_allmulti = ifp->if_flags & IFF_ALLMULTI; /* XXX */
eqos_setup_rxfilter(sc);
WR4(sc, GMAC_MAC_1US_TIC_COUNTER, (sc->sc_csr_clock / 1000000) - 1);