Convert to if_foreach_llmaddr() KPI.
This commit is contained in:
parent
649327d64a
commit
cb9389f457
@ -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. */
|
||||
|
Loading…
Reference in New Issue
Block a user