summaryrefslogtreecommitdiff
path: root/sys/dev/xilinx
diff options
context:
space:
mode:
authorGleb Smirnoff <glebius@FreeBSD.org>2019-10-21 18:12:58 +0000
committerGleb Smirnoff <glebius@FreeBSD.org>2019-10-21 18:12:58 +0000
commit4d50c26a10b258aabe0904bf47373a1b0fa30404 (patch)
treef203bbea3d26c3dabed4adf9becf6e673f1f8c82 /sys/dev/xilinx
parentc3cf8a054b969d0e5ebdd445b544a3c70e7da59b (diff)
Notes
Diffstat (limited to 'sys/dev/xilinx')
-rw-r--r--sys/dev/xilinx/if_xae.c60
1 files changed, 30 insertions, 30 deletions
diff --git a/sys/dev/xilinx/if_xae.c b/sys/dev/xilinx/if_xae.c
index a16da7e7ff97..bde6470c4376 100644
--- a/sys/dev/xilinx/if_xae.c
+++ b/sys/dev/xilinx/if_xae.c
@@ -514,14 +514,40 @@ xae_media_change(struct ifnet * ifp)
return (error);
}
+static u_int
+xae_write_maddr(void *arg, struct sockaddr_dl *sdl, u_int cnt)
+{
+ struct xae_softc *sc = arg;
+ uint32_t reg;
+ uint8_t *ma;
+
+ if (cnt >= XAE_MULTICAST_TABLE_SIZE)
+ return (1);
+
+ ma = LLADDR(sdl);
+
+ reg = READ4(sc, XAE_FFC) & 0xffffff00;
+ reg |= cnt;
+ WRITE4(sc, XAE_FFC, reg);
+
+ reg = (ma[0]);
+ reg |= (ma[1] << 8);
+ reg |= (ma[2] << 16);
+ reg |= (ma[3] << 24);
+ WRITE4(sc, XAE_FFV(0), reg);
+
+ reg = ma[4];
+ reg |= ma[5] << 8;
+ WRITE4(sc, XAE_FFV(1), reg);
+
+ return (1);
+}
+
static void
xae_setup_rxfilter(struct xae_softc *sc)
{
- struct ifmultiaddr *ifma;
struct ifnet *ifp;
uint32_t reg;
- uint8_t *ma;
- int i;
XAE_ASSERT_LOCKED(sc);
@@ -539,33 +565,7 @@ xae_setup_rxfilter(struct xae_softc *sc)
reg &= ~FFC_PM;
WRITE4(sc, XAE_FFC, reg);
- if_maddr_rlock(ifp);
-
- i = 0;
- CK_STAILQ_FOREACH(ifma, &sc->ifp->if_multiaddrs, ifma_link) {
- if (ifma->ifma_addr->sa_family != AF_LINK)
- continue;
-
- if (i >= XAE_MULTICAST_TABLE_SIZE)
- break;
-
- ma = LLADDR((struct sockaddr_dl *)ifma->ifma_addr);
-
- reg = READ4(sc, XAE_FFC) & 0xffffff00;
- reg |= i++;
- WRITE4(sc, XAE_FFC, reg);
-
- reg = (ma[0]);
- reg |= (ma[1] << 8);
- reg |= (ma[2] << 16);
- reg |= (ma[3] << 24);
- WRITE4(sc, XAE_FFV(0), reg);
-
- reg = ma[4];
- reg |= ma[5] << 8;
- WRITE4(sc, XAE_FFV(1), reg);
- }
- if_maddr_runlock(ifp);
+ if_foreach_llmaddr(ifp, xae_write_maddr, sc);
}
/*