svn commit: r353822 - head/sys/dev/nge

Gleb Smirnoff glebius at FreeBSD.org
Mon Oct 21 18:07:29 UTC 2019


Author: glebius
Date: Mon Oct 21 18:07:28 2019
New Revision: 353822
URL: https://svnweb.freebsd.org/changeset/base/353822

Log:
  Convert to if_foreach_llmaddr() KPI.

Modified:
  head/sys/dev/nge/if_nge.c

Modified: head/sys/dev/nge/if_nge.c
==============================================================================
--- head/sys/dev/nge/if_nge.c	Mon Oct 21 18:07:24 2019	(r353821)
+++ head/sys/dev/nge/if_nge.c	Mon Oct 21 18:07:28 2019	(r353822)
@@ -661,13 +661,33 @@ nge_miibus_statchg(device_t dev)
 		    CSR_READ_4(sc, NGE_GPIO) & ~NGE_GPIO_GP3_OUT);
 }
 
+static u_int
+nge_write_maddr(void *arg, struct sockaddr_dl *sdl, u_int cnt)
+{
+	struct nge_softc *sc = arg;
+	uint32_t h;
+	int bit, index;
+
+	/*
+	 * From the 11 bits returned by the crc routine, the top 7
+	 * bits represent the 16-bit word in the mcast hash table
+	 * that needs to be updated, and the lower 4 bits represent
+	 * which bit within that byte needs to be set.
+	 */
+	h = ether_crc32_be(LLADDR(sdl), ETHER_ADDR_LEN) >> 21;
+	index = (h >> 4) & 0x7F;
+	bit = h & 0xF;
+	CSR_WRITE_4(sc, NGE_RXFILT_CTL, NGE_FILTADDR_MCAST_LO + (index * 2));
+	NGE_SETBIT(sc, NGE_RXFILT_DATA, (1 << bit));
+
+	return (1);
+}
+
 static void
 nge_rxfilter(struct nge_softc *sc)
 {
 	struct ifnet *ifp;
-	struct ifmultiaddr *ifma;
-	uint32_t h, i, rxfilt;
-	int bit, index;
+	uint32_t i, rxfilt;
 
 	NGE_LOCK_ASSERT(sc);
 	ifp = sc->nge_ifp;
@@ -720,26 +740,7 @@ nge_rxfilter(struct nge_softc *sc)
 		CSR_WRITE_4(sc, NGE_RXFILT_DATA, 0);
 	}
 
-	/*
-	 * From the 11 bits returned by the crc routine, the top 7
-	 * bits represent the 16-bit word in the mcast hash table
-	 * that needs to be updated, and the lower 4 bits represent
-	 * which bit within that byte needs to be set.
-	 */
-	if_maddr_rlock(ifp);
-	CK_STAILQ_FOREACH(ifma, &ifp->if_multiaddrs, ifma_link) {
-		if (ifma->ifma_addr->sa_family != AF_LINK)
-			continue;
-		h = ether_crc32_be(LLADDR((struct sockaddr_dl *)
-		    ifma->ifma_addr), ETHER_ADDR_LEN) >> 21;
-		index = (h >> 4) & 0x7F;
-		bit = h & 0xF;
-		CSR_WRITE_4(sc, NGE_RXFILT_CTL,
-		    NGE_FILTADDR_MCAST_LO + (index * 2));
-		NGE_SETBIT(sc, NGE_RXFILT_DATA, (1 << bit));
-	}
-	if_maddr_runlock(ifp);
-
+	if_foreach_llmaddr(ifp, nge_write_maddr, sc);
 done:
 	CSR_WRITE_4(sc, NGE_RXFILT_CTL, rxfilt);
 	/* Turn the receive filter on. */


More information about the svn-src-head mailing list