Merge if_ath.c:1.99 awi.c:1.39 if_bfe.c:1.26 if_bge.c:1.92 if_ed.c:1.255
if_em.c:1.67 if_ex.c:1.57 if_fe.c:1.92 if_fxp.c:1.242 if_gem.c:1.32 if_hme.c:1.38 if_ie.c:1.103 if_ndis.c:1.100 if_ixgb.c:1.12 if_lge.c:1.40 if_lnc.c:1.112 if_my.c:1.30 if_nge.c:1.76 if_nve.c:1.9 if_owi.c:1.11 pdq_ifsubr.c:1.27 if_ray.c:1.80 if_re.c:1.47 if_sn.c:1.47 dp83932.c:1.20 if_tx.c:1.90 if_txp.c:1.32 if_aue.c:1.91 if_axe.c:1.31 if_cue.c:1.58 if_kue.c:1.65 if_rue.c:1.22 if_udav.c:1.15 if_vge.c:1.15 if_wi.c:1.182 if_wl.c:1.67 if_xe.c:1.58 if_dc.c:1.161 if_de.c:1.167 if_pcn.c:1.70 if_rl.c:1.153 if_sf.c:1.83 if_sis.c:1.134 if_sk.c:1.107 if_ste.c:1.85 if_ti.c:1.108 if_tl.c:1.100 if_vr.c:1.105 if_wb.c:1.80 if_xl.c:1.193 from HEAD to RELENG_6: Modify device drivers supporting multicast addresses to lock if_addr_mtx over iteration of their multicast address lists when synchronizing the hardware address filter with the network stack-maintained list. Problem reported by: Ed Maste (emaste at phaedrus dot sandvine dot ca> Approved by: re (scottl)
This commit is contained in:
parent
8081c1d979
commit
091aba35eb
@ -1662,6 +1662,7 @@ ath_mode_init(struct ath_softc *sc)
|
||||
/* calculate and install multicast filter */
|
||||
if ((ifp->if_flags & IFF_ALLMULTI) == 0) {
|
||||
mfilt[0] = mfilt[1] = 0;
|
||||
IF_ADDR_LOCK(ifp);
|
||||
TAILQ_FOREACH(ifma, &ifp->if_multiaddrs, ifma_link) {
|
||||
caddr_t dl;
|
||||
|
||||
@ -1674,6 +1675,7 @@ ath_mode_init(struct ath_softc *sc)
|
||||
pos &= 0x3f;
|
||||
mfilt[pos / 32] |= (1 << (pos % 32));
|
||||
}
|
||||
IF_ADDR_UNLOCK(ifp);
|
||||
} else {
|
||||
mfilt[0] = mfilt[1] = ~0;
|
||||
}
|
||||
|
@ -1146,15 +1146,19 @@ awi_mode_init(struct awi_softc *sc)
|
||||
#ifdef __FreeBSD__
|
||||
if (ifp->if_flags & IFF_ALLMULTI)
|
||||
goto set_mib;
|
||||
IF_ADDR_LOCK(ifp);
|
||||
TAILQ_FOREACH(ifma, &ifp->if_multiaddrs, ifma_link) {
|
||||
if (ifma->ifma_addr->sa_family != AF_LINK)
|
||||
continue;
|
||||
if (n == AWI_GROUP_ADDR_SIZE)
|
||||
if (n == AWI_GROUP_ADDR_SIZE) {
|
||||
IF_ADDR_UNLOCK(ifp);
|
||||
goto set_mib;
|
||||
}
|
||||
IEEE80211_ADDR_COPY(sc->sc_mib_addr.aGroup_Addresses[n],
|
||||
LLADDR((struct sockaddr_dl *)ifma->ifma_addr));
|
||||
n++;
|
||||
}
|
||||
IF_ADDR_UNLOCK(ifp);
|
||||
#else
|
||||
ETHER_FIRST_MULTI(step, &sc->sc_ic.ic_ec, enm);
|
||||
while (enm != NULL) {
|
||||
|
@ -883,12 +883,14 @@ bfe_set_rx_mode(struct bfe_softc *sc)
|
||||
val |= BFE_RXCONF_ALLMULTI;
|
||||
else {
|
||||
val &= ~BFE_RXCONF_ALLMULTI;
|
||||
IF_ADDR_LOCK(ifp);
|
||||
TAILQ_FOREACH(ifma, &ifp->if_multiaddrs, ifma_link) {
|
||||
if (ifma->ifma_addr->sa_family != AF_LINK)
|
||||
continue;
|
||||
bfe_cam_write(sc,
|
||||
LLADDR((struct sockaddr_dl *)ifma->ifma_addr), i++);
|
||||
}
|
||||
IF_ADDR_UNLOCK(ifp);
|
||||
}
|
||||
|
||||
CSR_WRITE_4(sc, BFE_RXCONF, val);
|
||||
|
@ -1171,6 +1171,7 @@ bge_setmulti(sc)
|
||||
CSR_WRITE_4(sc, BGE_MAR0 + (i * 4), 0);
|
||||
|
||||
/* Now program new ones. */
|
||||
IF_ADDR_LOCK(ifp);
|
||||
TAILQ_FOREACH(ifma, &ifp->if_multiaddrs, ifma_link) {
|
||||
if (ifma->ifma_addr->sa_family != AF_LINK)
|
||||
continue;
|
||||
@ -1178,6 +1179,7 @@ bge_setmulti(sc)
|
||||
ifma->ifma_addr), ETHER_ADDR_LEN) & 0x7F;
|
||||
hashes[(h & 0x60) >> 5] |= 1 << (h & 0x1F);
|
||||
}
|
||||
IF_ADDR_UNLOCK(ifp);
|
||||
|
||||
for (i = 0; i < 4; i++)
|
||||
CSR_WRITE_4(sc, BGE_MAR0 + (i * 4), hashes[i]);
|
||||
|
@ -1778,6 +1778,7 @@ ed_ds_getmcaf(struct ed_softc *sc, uint32_t *mcaf)
|
||||
mcaf[0] = 0;
|
||||
mcaf[1] = 0;
|
||||
|
||||
IF_ADDR_LOCK(sc->ifp);
|
||||
TAILQ_FOREACH(ifma, &sc->ifp->if_multiaddrs, ifma_link) {
|
||||
if (ifma->ifma_addr->sa_family != AF_LINK)
|
||||
continue;
|
||||
@ -1785,6 +1786,7 @@ ed_ds_getmcaf(struct ed_softc *sc, uint32_t *mcaf)
|
||||
ifma->ifma_addr), ETHER_ADDR_LEN) >> 26;
|
||||
af[index >> 3] |= 1 << (index & 7);
|
||||
}
|
||||
IF_ADDR_UNLOCK(sc->ifp);
|
||||
}
|
||||
|
||||
int
|
||||
|
@ -1596,7 +1596,8 @@ em_set_multi(struct adapter * adapter)
|
||||
E1000_WRITE_REG(&adapter->hw, RCTL, reg_rctl);
|
||||
msec_delay(5);
|
||||
}
|
||||
|
||||
|
||||
IF_ADDR_LOCK(ifp);
|
||||
#if __FreeBSD_version < 500000
|
||||
LIST_FOREACH(ifma, &ifp->if_multiaddrs, ifma_link) {
|
||||
#else
|
||||
@ -1611,6 +1612,7 @@ em_set_multi(struct adapter * adapter)
|
||||
&mta[mcnt*ETH_LENGTH_OF_ADDRESS], ETH_LENGTH_OF_ADDRESS);
|
||||
mcnt++;
|
||||
}
|
||||
IF_ADDR_UNLOCK(ifp);
|
||||
|
||||
if (mcnt >= MAX_NUM_MULTICAST_ADDRESSES) {
|
||||
reg_rctl = E1000_READ_REG(&adapter->hw, RCTL);
|
||||
|
@ -840,11 +840,13 @@ ex_setmulti(struct ex_softc *sc)
|
||||
ifp = sc->ifp;
|
||||
|
||||
count = 0;
|
||||
IF_ADDR_LOCK(ifp);
|
||||
TAILQ_FOREACH(maddr, &ifp->if_multiaddrs, ifma_link) {
|
||||
if (maddr->ifma_addr->sa_family != AF_LINK)
|
||||
continue;
|
||||
count++;
|
||||
}
|
||||
IF_ADDR_UNLOCK(ifp);
|
||||
|
||||
if ((ifp->if_flags & IFF_PROMISC) || (ifp->if_flags & IFF_ALLMULTI)
|
||||
|| count > 63) {
|
||||
@ -871,7 +873,8 @@ ex_setmulti(struct ex_softc *sc)
|
||||
CSR_WRITE_2(sc, IO_PORT_REG, 0);
|
||||
CSR_WRITE_2(sc, IO_PORT_REG, 0);
|
||||
CSR_WRITE_2(sc, IO_PORT_REG, (count + 1) * 6);
|
||||
|
||||
|
||||
IF_ADDR_LOCK(ifp);
|
||||
TAILQ_FOREACH(maddr, &ifp->if_multiaddrs, ifma_link) {
|
||||
if (maddr->ifma_addr->sa_family != AF_LINK)
|
||||
continue;
|
||||
@ -882,6 +885,7 @@ ex_setmulti(struct ex_softc *sc)
|
||||
CSR_WRITE_2(sc, IO_PORT_REG, *addr++);
|
||||
CSR_WRITE_2(sc, IO_PORT_REG, *addr++);
|
||||
}
|
||||
IF_ADDR_UNLOCK(ifp);
|
||||
|
||||
/* Program our MAC address as well */
|
||||
/* XXX: Is this necessary? The Linux driver does this
|
||||
|
@ -2060,6 +2060,7 @@ fe_mcaf ( struct fe_softc *sc )
|
||||
struct ifmultiaddr *ifma;
|
||||
|
||||
filter = fe_filter_nothing;
|
||||
IF_ADDR_LOCK(sc->ifp);
|
||||
TAILQ_FOREACH(ifma, &sc->ifp->if_multiaddrs, ifma_link) {
|
||||
if (ifma->ifma_addr->sa_family != AF_LINK)
|
||||
continue;
|
||||
@ -2072,6 +2073,7 @@ fe_mcaf ( struct fe_softc *sc )
|
||||
|
||||
filter.data[index >> 3] |= 1 << (index & 7);
|
||||
}
|
||||
IF_ADDR_UNLOCK(sc->ifp);
|
||||
return ( filter );
|
||||
}
|
||||
|
||||
|
@ -2485,6 +2485,7 @@ fxp_mc_addrs(struct fxp_softc *sc)
|
||||
|
||||
nmcasts = 0;
|
||||
if ((sc->flags & FXP_FLAG_ALL_MCAST) == 0) {
|
||||
IF_ADDR_LOCK(ifp);
|
||||
#if __FreeBSD_version < 500000
|
||||
LIST_FOREACH(ifma, &ifp->if_multiaddrs, ifma_link) {
|
||||
#else
|
||||
@ -2501,6 +2502,7 @@ fxp_mc_addrs(struct fxp_softc *sc)
|
||||
&sc->mcsp->mc_addr[nmcasts][0], ETHER_ADDR_LEN);
|
||||
nmcasts++;
|
||||
}
|
||||
IF_ADDR_UNLOCK(ifp);
|
||||
}
|
||||
mcsp->mc_cnt = htole16(nmcasts * ETHER_ADDR_LEN);
|
||||
return (nmcasts);
|
||||
|
@ -1894,6 +1894,7 @@ gem_setladrf(sc)
|
||||
/* Clear hash table */
|
||||
memset(hash, 0, sizeof(hash));
|
||||
|
||||
IF_ADDR_LOCK(ifp);
|
||||
TAILQ_FOREACH(inm, &ifp->if_multiaddrs, ifma_link) {
|
||||
if (inm->ifma_addr->sa_family != AF_LINK)
|
||||
continue;
|
||||
@ -1906,6 +1907,7 @@ gem_setladrf(sc)
|
||||
/* Set the corresponding bit in the filter. */
|
||||
hash[crc >> 4] |= 1 << (15 - (crc & 15));
|
||||
}
|
||||
IF_ADDR_UNLOCK(ifp);
|
||||
|
||||
v |= GEM_MAC_RX_HASH_FILTER;
|
||||
ifp->if_flags &= ~IFF_ALLMULTI;
|
||||
|
@ -1679,6 +1679,7 @@ hme_setladrf(struct hme_softc *sc, int reenable)
|
||||
* the word.
|
||||
*/
|
||||
|
||||
IF_ADDR_LOCK(sc->sc_ifp);
|
||||
TAILQ_FOREACH(inm, &sc->sc_ifp->if_multiaddrs, ifma_link) {
|
||||
if (inm->ifma_addr->sa_family != AF_LINK)
|
||||
continue;
|
||||
@ -1691,6 +1692,7 @@ hme_setladrf(struct hme_softc *sc, int reenable)
|
||||
/* Set the corresponding bit in the filter. */
|
||||
hash[crc >> 4] |= 1 << (crc & 0xf);
|
||||
}
|
||||
IF_ADDR_UNLOCK(sc->sc_ifp);
|
||||
|
||||
ifp->if_flags &= ~IFF_ALLMULTI;
|
||||
|
||||
|
@ -1676,6 +1676,7 @@ ie_mc_reset(struct ie_softc *sc)
|
||||
* Step through the list of addresses.
|
||||
*/
|
||||
sc->mcast_count = 0;
|
||||
IF_ADDR_LOCK(sc->ifp);
|
||||
TAILQ_FOREACH(ifma, &sc->ifp->if_multiaddrs, ifma_link) {
|
||||
if (ifma->ifma_addr->sa_family != AF_LINK)
|
||||
continue;
|
||||
@ -1690,6 +1691,7 @@ ie_mc_reset(struct ie_softc *sc)
|
||||
&(sc->mcast_addrs[sc->mcast_count]), 6);
|
||||
sc->mcast_count++;
|
||||
}
|
||||
IF_ADDR_UNLOCK(sc->ifp);
|
||||
|
||||
setflag:
|
||||
sc->want_mcsetup = 1;
|
||||
|
@ -265,6 +265,7 @@ ndis_setmulti(sc)
|
||||
sc->ndis_filter |= NDIS_PACKET_TYPE_MULTICAST;
|
||||
|
||||
len = 0;
|
||||
IF_ADDR_LOCK(ifp);
|
||||
TAILQ_FOREACH(ifma, &ifp->if_multiaddrs, ifma_link) {
|
||||
if (ifma->ifma_addr->sa_family != AF_LINK)
|
||||
continue;
|
||||
@ -272,11 +273,13 @@ ndis_setmulti(sc)
|
||||
mclist + (ETHER_ADDR_LEN * len), ETHER_ADDR_LEN);
|
||||
len++;
|
||||
if (len > mclistsz) {
|
||||
IF_ADDR_UNLOCK(ifp);
|
||||
sc->ndis_filter |= NDIS_PACKET_TYPE_ALL_MULTICAST;
|
||||
sc->ndis_filter &= ~NDIS_PACKET_TYPE_MULTICAST;
|
||||
goto out;
|
||||
}
|
||||
}
|
||||
IF_ADDR_UNLOCK(ifp);
|
||||
|
||||
len = len * ETHER_ADDR_LEN;
|
||||
error = ndis_set_info(sc, OID_802_3_MULTICAST_LIST, mclist, &len);
|
||||
|
@ -1071,6 +1071,7 @@ ixgb_set_multi(struct adapter * adapter)
|
||||
|
||||
IOCTL_DEBUGOUT("ixgb_set_multi: begin");
|
||||
|
||||
IF_ADDR_LOCK(ifp);
|
||||
#if __FreeBSD_version < 500000
|
||||
LIST_FOREACH(ifma, &ifp->if_multiaddrs, ifma_link) {
|
||||
#else
|
||||
@ -1083,6 +1084,7 @@ ixgb_set_multi(struct adapter * adapter)
|
||||
&mta[mcnt * IXGB_ETH_LENGTH_OF_ADDRESS], IXGB_ETH_LENGTH_OF_ADDRESS);
|
||||
mcnt++;
|
||||
}
|
||||
IF_ADDR_UNLOCK(ifp);
|
||||
|
||||
if (mcnt > MAX_NUM_MULTICAST_ADDRESSES) {
|
||||
reg_rctl = IXGB_READ_REG(&adapter->hw, RCTL);
|
||||
|
@ -390,6 +390,7 @@ lge_setmulti(sc)
|
||||
CSR_WRITE_4(sc, LGE_MAR1, 0);
|
||||
|
||||
/* now program new ones */
|
||||
IF_ADDR_LOCK(ifp);
|
||||
TAILQ_FOREACH(ifma, &ifp->if_multiaddrs, ifma_link) {
|
||||
if (ifma->ifma_addr->sa_family != AF_LINK)
|
||||
continue;
|
||||
@ -400,6 +401,7 @@ lge_setmulti(sc)
|
||||
else
|
||||
hashes[1] |= (1 << (h - 32));
|
||||
}
|
||||
IF_ADDR_UNLOCK(ifp);
|
||||
|
||||
CSR_WRITE_4(sc, LGE_MAR0, hashes[0]);
|
||||
CSR_WRITE_4(sc, LGE_MAR1, hashes[1]);
|
||||
|
@ -239,6 +239,7 @@ lnc_setladrf(struct lnc_softc *sc)
|
||||
*/
|
||||
|
||||
bzero(sc->init_block->ladrf, MULTICAST_FILTER_LEN);
|
||||
IF_ADDR_LOCK(ifp);
|
||||
TAILQ_FOREACH(ifma, &ifp->if_multiaddrs, ifma_link) {
|
||||
if (ifma->ifma_addr->sa_family != AF_LINK)
|
||||
continue;
|
||||
@ -247,6 +248,7 @@ lnc_setladrf(struct lnc_softc *sc)
|
||||
ifma->ifma_addr), ETHER_ADDR_LEN) >> 26;
|
||||
sc->init_block->ladrf[index >> 3] |= 1 << (index & 7);
|
||||
}
|
||||
IF_ADDR_UNLOCK(ifp);
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -346,6 +346,7 @@ my_setmulti(struct my_softc * sc)
|
||||
CSR_WRITE_4(sc, MY_MAR1, 0);
|
||||
|
||||
/* now program new ones */
|
||||
IF_ADDR_LOCK(ifp);
|
||||
TAILQ_FOREACH(ifma, &ifp->if_multiaddrs, ifma_link) {
|
||||
if (ifma->ifma_addr->sa_family != AF_LINK)
|
||||
continue;
|
||||
@ -357,6 +358,7 @@ my_setmulti(struct my_softc * sc)
|
||||
hashes[1] |= (1 << (h - 32));
|
||||
mcnt++;
|
||||
}
|
||||
IF_ADDR_UNLOCK(ifp);
|
||||
|
||||
if (mcnt)
|
||||
rxfilt |= MY_AM;
|
||||
|
@ -705,6 +705,7 @@ nge_setmulti(sc)
|
||||
* that needs to be updated, and the lower 4 bits represent
|
||||
* which bit within that byte needs to be set.
|
||||
*/
|
||||
IF_ADDR_LOCK(ifp);
|
||||
TAILQ_FOREACH(ifma, &ifp->if_multiaddrs, ifma_link) {
|
||||
if (ifma->ifma_addr->sa_family != AF_LINK)
|
||||
continue;
|
||||
@ -716,6 +717,7 @@ nge_setmulti(sc)
|
||||
NGE_FILTADDR_MCAST_LO + (index * 2));
|
||||
NGE_SETBIT(sc, NGE_RXFILT_DATA, (1 << bit));
|
||||
}
|
||||
IF_ADDR_UNLOCK(ifp);
|
||||
|
||||
CSR_WRITE_4(sc, NGE_RXFILT_CTL, filtsave);
|
||||
|
||||
|
@ -1074,6 +1074,7 @@ nve_setmulti(struct nve_softc *sc)
|
||||
return;
|
||||
}
|
||||
/* Setup multicast filter */
|
||||
IF_ADDR_LOCK(ifp);
|
||||
TAILQ_FOREACH(ifma, &ifp->if_multiaddrs, ifma_link) {
|
||||
u_char *addrp;
|
||||
|
||||
@ -1087,6 +1088,7 @@ nve_setmulti(struct nve_softc *sc)
|
||||
oraddr[i] |= mcaddr;
|
||||
}
|
||||
}
|
||||
IF_ADDR_UNLOCK(ifp);
|
||||
for (i = 0; i < 6; i++) {
|
||||
hwfilter.acMulticastAddress[i] = andaddr[i] & oraddr[i];
|
||||
hwfilter.acMulticastMask[i] = andaddr[i] | (~oraddr[i]);
|
||||
|
@ -1213,6 +1213,7 @@ wi_setmulti(sc)
|
||||
return;
|
||||
}
|
||||
|
||||
IF_ADDR_LOCK(ifp);
|
||||
TAILQ_FOREACH(ifma, &ifp->if_multiaddrs, ifma_link) {
|
||||
if (ifma->ifma_addr->sa_family != AF_LINK)
|
||||
continue;
|
||||
@ -1225,6 +1226,7 @@ wi_setmulti(sc)
|
||||
break;
|
||||
}
|
||||
}
|
||||
IF_ADDR_UNLOCK(ifp);
|
||||
|
||||
mcast.wi_len = (i * 3) + 1;
|
||||
wi_write_record(sc, (struct wi_ltv_gen *)&mcast);
|
||||
|
@ -273,6 +273,7 @@ pdq_os_addr_fill(
|
||||
PDQ_IFNET(sc)->if_flags &= ~IFF_ALLMULTI;
|
||||
#endif
|
||||
|
||||
IF_ADDR_LOCK(PDQ_IFNET(sc));
|
||||
for (ifma = TAILQ_FIRST(&PDQ_IFNET(sc)->if_multiaddrs); ifma && num_addrs > 0;
|
||||
ifma = TAILQ_NEXT(ifma, ifma_link)) {
|
||||
char *mcaddr;
|
||||
@ -285,6 +286,7 @@ pdq_os_addr_fill(
|
||||
addr++;
|
||||
num_addrs--;
|
||||
}
|
||||
IF_ADDR_UNLOCK(PDQ_IFNET(sc));
|
||||
/*
|
||||
* If not all the address fit into the CAM, turn on all-multicast mode.
|
||||
*/
|
||||
|
@ -2704,13 +2704,16 @@ ray_mcast(struct ray_softc *sc, struct ray_comq_entry *com)
|
||||
* The multicast list is only 16 items long so use promiscuous
|
||||
* mode and don't bother updating the multicast list.
|
||||
*/
|
||||
IF_ADDR_LOCK(ifp);
|
||||
TAILQ_FOREACH(ifma, &ifp->if_multiaddrs, ifma_link)
|
||||
count++;
|
||||
if (count == 0) {
|
||||
IF_ADDR_UNLOCK(ifp);
|
||||
ray_com_runq_done(sc);
|
||||
return;
|
||||
} else if (count > 16) {
|
||||
ifp->if_flags |= IFF_ALLMULTI;
|
||||
IF_ADDR_UNLOCK(ifp);
|
||||
ray_com_runq_done(sc);
|
||||
return;
|
||||
} else if (ifp->if_flags & IFF_ALLMULTI)
|
||||
@ -2732,6 +2735,7 @@ ray_mcast(struct ray_softc *sc, struct ray_comq_entry *com)
|
||||
);
|
||||
bufp += ETHER_ADDR_LEN;
|
||||
}
|
||||
IF_ADDR_UNLOCK(ifp);
|
||||
|
||||
ray_com_ecf(sc, com);
|
||||
}
|
||||
|
@ -603,6 +603,7 @@ re_setmulti(sc)
|
||||
CSR_WRITE_4(sc, RL_MAR4, 0);
|
||||
|
||||
/* now program new ones */
|
||||
IF_ADDR_LOCK(ifp);
|
||||
TAILQ_FOREACH(ifma, &ifp->if_multiaddrs, ifma_link) {
|
||||
if (ifma->ifma_addr->sa_family != AF_LINK)
|
||||
continue;
|
||||
@ -614,6 +615,7 @@ re_setmulti(sc)
|
||||
hashes[1] |= (1 << (h - 32));
|
||||
mcnt++;
|
||||
}
|
||||
IF_ADDR_UNLOCK(ifp);
|
||||
|
||||
if (mcnt)
|
||||
rxfilt |= RL_RXCFG_RX_MULTI;
|
||||
|
@ -1410,9 +1410,12 @@ sn_getmcf(struct ifnet *ifp, uint8_t *mcf)
|
||||
|
||||
bzero(mcf, MCFSZ);
|
||||
|
||||
IF_ADDR_LOCK(ifp);
|
||||
TAILQ_FOREACH(ifma, &ifp->if_multiaddrs, ifma_link) {
|
||||
if (ifma->ifma_addr->sa_family != AF_LINK)
|
||||
if (ifma->ifma_addr->sa_family != AF_LINK) {
|
||||
IF_ADDR_UNLOCK(ifp);
|
||||
return 0;
|
||||
}
|
||||
index = ether_crc32_le(LLADDR((struct sockaddr_dl *)
|
||||
ifma->ifma_addr), ETHER_ADDR_LEN) & 0x3f;
|
||||
index2 = 0;
|
||||
@ -1423,5 +1426,6 @@ sn_getmcf(struct ifnet *ifp, uint8_t *mcf)
|
||||
}
|
||||
af[index2 >> 3] |= 1 << (index2 & 7);
|
||||
}
|
||||
IF_ADDR_UNLOCK(ifp);
|
||||
return 1; /* use multicast filter */
|
||||
}
|
||||
|
@ -675,6 +675,7 @@ camprogram(sc)
|
||||
ifp->if_flags &= ~IFF_ALLMULTI;
|
||||
|
||||
/* Loop through multicast addresses */
|
||||
IF_ADDR_LOCK(ifp);
|
||||
TAILQ_FOREACH(ifma, &ifp->if_multiaddrs, ifma_link) {
|
||||
if (ifma->ifma_addr->sa_family != AF_LINK)
|
||||
continue;
|
||||
@ -688,6 +689,7 @@ camprogram(sc)
|
||||
LLADDR((struct sockaddr_dl *)ifma->ifma_addr));
|
||||
mcount++;
|
||||
}
|
||||
IF_ADDR_UNLOCK(ifp);
|
||||
|
||||
NIC_PUT(sc, SNCR_CDP, LOWER(sc->v_cda));
|
||||
NIC_PUT(sc, SNCR_CDC, MAXCAM);
|
||||
|
@ -1409,6 +1409,7 @@ epic_set_mc_table(sc)
|
||||
filter[2] = 0;
|
||||
filter[3] = 0;
|
||||
|
||||
IF_ADDR_LOCK(ifp);
|
||||
#if __FreeBSD_version < 500000
|
||||
LIST_FOREACH(ifma, &ifp->if_multiaddrs, ifma_link) {
|
||||
#else
|
||||
@ -1420,6 +1421,7 @@ epic_set_mc_table(sc)
|
||||
ifma->ifma_addr), ETHER_ADDR_LEN) >> 26;
|
||||
filter[h >> 4] |= 1 << (h & 0xF);
|
||||
}
|
||||
IF_ADDR_UNLOCK(ifp);
|
||||
|
||||
CSR_WRITE_4(sc, MC0, filter[0]);
|
||||
CSR_WRITE_4(sc, MC1, filter[1]);
|
||||
|
@ -1774,6 +1774,7 @@ txp_set_filter(sc)
|
||||
else {
|
||||
hash[0] = hash[1] = 0;
|
||||
|
||||
IF_ADDR_LOCK(ifp);
|
||||
TAILQ_FOREACH(ifma, &ifp->if_multiaddrs, ifma_link) {
|
||||
if (ifma->ifma_addr->sa_family != AF_LINK)
|
||||
continue;
|
||||
@ -1797,6 +1798,7 @@ txp_set_filter(sc)
|
||||
hashbit = (u_int16_t)(crc & (64 - 1));
|
||||
hash[hashbit / 32] |= (1 << hashbit % 32);
|
||||
}
|
||||
IF_ADDR_UNLOCK(ifp);
|
||||
|
||||
if (mcnt > 0) {
|
||||
filter |= TXP_RXFILT_HASHMULTI;
|
||||
|
@ -539,6 +539,7 @@ aue_setmulti(struct aue_softc *sc)
|
||||
aue_csr_write_1(sc, AUE_MAR0 + i, 0);
|
||||
|
||||
/* now program new ones */
|
||||
IF_ADDR_LOCK(ifp);
|
||||
#if __FreeBSD_version >= 500000
|
||||
TAILQ_FOREACH(ifma, &ifp->if_multiaddrs, ifma_link)
|
||||
#else
|
||||
@ -551,6 +552,7 @@ aue_setmulti(struct aue_softc *sc)
|
||||
ifma->ifma_addr), ETHER_ADDR_LEN) & ((1 << AUE_BITS) - 1);
|
||||
AUE_SETBIT(sc, AUE_MAR + (h >> 3), 1 << (h & 0x7));
|
||||
}
|
||||
IF_ADDR_UNLOCK(ifp);
|
||||
|
||||
return;
|
||||
}
|
||||
|
@ -338,6 +338,7 @@ axe_setmulti(struct axe_softc *sc)
|
||||
} else
|
||||
rxmode &= ~AXE_RXCMD_ALLMULTI;
|
||||
|
||||
IF_ADDR_LOCK(ifp);
|
||||
#if __FreeBSD_version >= 500000
|
||||
TAILQ_FOREACH(ifma, &ifp->if_multiaddrs, ifma_link)
|
||||
#else
|
||||
@ -350,6 +351,7 @@ axe_setmulti(struct axe_softc *sc)
|
||||
ifma->ifma_addr), ETHER_ADDR_LEN) >> 26;
|
||||
hashtbl[h / 8] |= 1 << (h % 8);
|
||||
}
|
||||
IF_ADDR_UNLOCK(ifp);
|
||||
|
||||
axe_cmd(sc, AXE_CMD_WRITE_MCAST, 0, 0, (void *)&hashtbl);
|
||||
axe_cmd(sc, AXE_CMD_RXCTL_WRITE, 0, rxmode, NULL);
|
||||
|
@ -356,6 +356,7 @@ cue_setmulti(struct cue_softc *sc)
|
||||
sc->cue_mctab[i] = 0;
|
||||
|
||||
/* now program new ones */
|
||||
IF_ADDR_LOCK(ifp);
|
||||
#if __FreeBSD_version >= 500000
|
||||
TAILQ_FOREACH(ifma, &ifp->if_multiaddrs, ifma_link)
|
||||
#else
|
||||
@ -367,6 +368,7 @@ cue_setmulti(struct cue_softc *sc)
|
||||
h = cue_mchash(LLADDR((struct sockaddr_dl *)ifma->ifma_addr));
|
||||
sc->cue_mctab[h >> 3] |= 1 << (h & 0x7);
|
||||
}
|
||||
IF_ADDR_UNLOCK(ifp);
|
||||
|
||||
/*
|
||||
* Also include the broadcast address in the filter
|
||||
|
@ -327,6 +327,7 @@ kue_setmulti(struct kue_softc *sc)
|
||||
|
||||
sc->kue_rxfilt &= ~KUE_RXFILT_ALLMULTI;
|
||||
|
||||
IF_ADDR_LOCK(ifp);
|
||||
#if __FreeBSD_version >= 500000
|
||||
TAILQ_FOREACH(ifma, &ifp->if_multiaddrs, ifma_link)
|
||||
#else
|
||||
@ -345,6 +346,7 @@ kue_setmulti(struct kue_softc *sc)
|
||||
KUE_MCFILT(sc, i), ETHER_ADDR_LEN);
|
||||
i++;
|
||||
}
|
||||
IF_ADDR_UNLOCK(ifp);
|
||||
|
||||
if (i == KUE_MCFILTCNT(sc))
|
||||
sc->kue_rxfilt |= KUE_RXFILT_ALLMULTI;
|
||||
|
@ -500,6 +500,7 @@ rue_setmulti(struct rue_softc *sc)
|
||||
rue_csr_write_4(sc, RUE_MAR4, 0);
|
||||
|
||||
/* now program new ones */
|
||||
IF_ADDR_LOCK(ifp);
|
||||
#if __FreeBSD_version >= 500000
|
||||
TAILQ_FOREACH (ifma, &ifp->if_multiaddrs, ifma_link)
|
||||
#else
|
||||
@ -516,6 +517,7 @@ rue_setmulti(struct rue_softc *sc)
|
||||
hashes[1] |= (1 << (h - 32));
|
||||
mcnt++;
|
||||
}
|
||||
IF_ADDR_UNLOCK(ifp);
|
||||
|
||||
if (mcnt)
|
||||
rxcfg |= RUE_RCR_AM;
|
||||
|
@ -1044,6 +1044,7 @@ udav_setmulti(struct udav_softc *sc)
|
||||
ETHER_NEXT_MULTI(step, enm);
|
||||
}
|
||||
#elif defined(__FreeBSD__)
|
||||
IF_ADDR_LOCK(ifp);
|
||||
#if __FreeBSD_version >= 500000
|
||||
TAILQ_FOREACH(ifma, &ifp->if_multiaddrs, ifma_link)
|
||||
#else
|
||||
@ -1056,6 +1057,7 @@ udav_setmulti(struct udav_softc *sc)
|
||||
ifma->ifma_addr));
|
||||
hashes[h>>3] |= 1 << (h & 0x7);
|
||||
}
|
||||
IF_ADDR_UNLOCK(ifp);
|
||||
#endif
|
||||
|
||||
/* disable all multicast */
|
||||
|
@ -594,6 +594,7 @@ vge_setmulti(sc)
|
||||
}
|
||||
|
||||
/* Now program new ones */
|
||||
IF_ADDR_LOCK(ifp);
|
||||
TAILQ_FOREACH(ifma, &ifp->if_multiaddrs, ifma_link) {
|
||||
if (ifma->ifma_addr->sa_family != AF_LINK)
|
||||
continue;
|
||||
@ -626,6 +627,7 @@ vge_setmulti(sc)
|
||||
CSR_WRITE_4(sc, VGE_MAR0, hashes[0]);
|
||||
CSR_WRITE_4(sc, VGE_MAR1, hashes[1]);
|
||||
}
|
||||
IF_ADDR_UNLOCK(ifp);
|
||||
|
||||
return;
|
||||
}
|
||||
|
@ -1739,6 +1739,7 @@ allmulti:
|
||||
}
|
||||
|
||||
n = 0;
|
||||
IF_ADDR_LOCK(ifp);
|
||||
#if __FreeBSD_version < 500000
|
||||
LIST_FOREACH(ifma, &ifp->if_multiaddrs, ifma_link) {
|
||||
#else
|
||||
@ -1752,6 +1753,7 @@ allmulti:
|
||||
(LLADDR((struct sockaddr_dl *)ifma->ifma_addr)));
|
||||
n++;
|
||||
}
|
||||
IF_ADDR_UNLOCK(ifp);
|
||||
return wi_write_rid(sc, WI_RID_MCAST_LIST, &mlist,
|
||||
IEEE80211_ADDR_LEN * n);
|
||||
}
|
||||
|
@ -2121,6 +2121,7 @@ wlconfig(struct wl_softc *sc)
|
||||
outw(PIOP1(base), 0); /* ac_status */
|
||||
outw(PIOP1(base), AC_MCSETUP|AC_CW_EL); /* ac_command */
|
||||
outw(PIOR1(base), OFFSET_CU + 8);
|
||||
IF_ADDR_LOCK(sc->ifp);
|
||||
TAILQ_FOREACH(ifma, &sc->ifp->if_multiaddrs, ifma_link) {
|
||||
if (ifma->ifma_addr->sa_family != AF_LINK)
|
||||
continue;
|
||||
@ -2131,6 +2132,7 @@ wlconfig(struct wl_softc *sc)
|
||||
outw(PIOP1(base), addrp[4] + (addrp[5] << 8));
|
||||
++cnt;
|
||||
}
|
||||
IF_ADDR_UNLOCK(sc->ifp);
|
||||
outw(PIOR1(base), OFFSET_CU + 6); /* mc-cnt */
|
||||
outw(PIOP1(base), cnt * WAVELAN_ADDR_SIZE);
|
||||
if (wlcmd(sc, "config()-mcaddress") == 0)
|
||||
|
@ -1278,6 +1278,7 @@ xe_set_multicast(struct xe_softc *scp) {
|
||||
|
||||
/* Iterate over multicast address list */
|
||||
count = 0;
|
||||
IF_ADDR_LOCK(ifp);
|
||||
#if __FreeBSD_version < 500000
|
||||
LIST_FOREACH(maddr, &ifp->if_multiaddrs, ifma_link) {
|
||||
#else
|
||||
@ -1299,6 +1300,7 @@ xe_set_multicast(struct xe_softc *scp) {
|
||||
/* Nowhere else to put them on CE2 */
|
||||
break;
|
||||
}
|
||||
IF_ADDR_UNLOCK(ifp);
|
||||
|
||||
DEVPRINTF(2, (scp->dev, "set_multicast: count = %u\n", count));
|
||||
|
||||
|
@ -1110,6 +1110,7 @@ dc_setfilt_21143(struct dc_softc *sc)
|
||||
else
|
||||
DC_CLRBIT(sc, DC_NETCFG, DC_NETCFG_RX_ALLMULTI);
|
||||
|
||||
IF_ADDR_LOCK(ifp);
|
||||
TAILQ_FOREACH(ifma, &ifp->if_multiaddrs, ifma_link) {
|
||||
if (ifma->ifma_addr->sa_family != AF_LINK)
|
||||
continue;
|
||||
@ -1117,6 +1118,7 @@ dc_setfilt_21143(struct dc_softc *sc)
|
||||
LLADDR((struct sockaddr_dl *)ifma->ifma_addr));
|
||||
sp[h >> 4] |= htole32(1 << (h & 0xF));
|
||||
}
|
||||
IF_ADDR_UNLOCK(ifp);
|
||||
|
||||
if (ifp->if_flags & IFF_BROADCAST) {
|
||||
h = dc_mchash_le(sc, ifp->if_broadcastaddr);
|
||||
@ -1179,6 +1181,7 @@ dc_setfilt_admtek(struct dc_softc *sc)
|
||||
return;
|
||||
|
||||
/* Now program new ones. */
|
||||
IF_ADDR_LOCK(ifp);
|
||||
TAILQ_FOREACH(ifma, &ifp->if_multiaddrs, ifma_link) {
|
||||
if (ifma->ifma_addr->sa_family != AF_LINK)
|
||||
continue;
|
||||
@ -1193,6 +1196,7 @@ dc_setfilt_admtek(struct dc_softc *sc)
|
||||
else
|
||||
hashes[1] |= (1 << (h - 32));
|
||||
}
|
||||
IF_ADDR_UNLOCK(ifp);
|
||||
|
||||
CSR_WRITE_4(sc, DC_AL_MAR0, hashes[0]);
|
||||
CSR_WRITE_4(sc, DC_AL_MAR1, hashes[1]);
|
||||
@ -1250,6 +1254,7 @@ dc_setfilt_asix(struct dc_softc *sc)
|
||||
return;
|
||||
|
||||
/* now program new ones */
|
||||
IF_ADDR_LOCK(ifp);
|
||||
TAILQ_FOREACH(ifma, &ifp->if_multiaddrs, ifma_link) {
|
||||
if (ifma->ifma_addr->sa_family != AF_LINK)
|
||||
continue;
|
||||
@ -1259,6 +1264,7 @@ dc_setfilt_asix(struct dc_softc *sc)
|
||||
else
|
||||
hashes[1] |= (1 << (h - 32));
|
||||
}
|
||||
IF_ADDR_UNLOCK(ifp);
|
||||
|
||||
CSR_WRITE_4(sc, DC_AX_FILTIDX, DC_AX_FILTIDX_MAR0);
|
||||
CSR_WRITE_4(sc, DC_AX_FILTDATA, hashes[0]);
|
||||
@ -1302,6 +1308,7 @@ dc_setfilt_xircom(struct dc_softc *sc)
|
||||
else
|
||||
DC_CLRBIT(sc, DC_NETCFG, DC_NETCFG_RX_ALLMULTI);
|
||||
|
||||
IF_ADDR_LOCK(ifp);
|
||||
TAILQ_FOREACH(ifma, &ifp->if_multiaddrs, ifma_link) {
|
||||
if (ifma->ifma_addr->sa_family != AF_LINK)
|
||||
continue;
|
||||
@ -1309,6 +1316,7 @@ dc_setfilt_xircom(struct dc_softc *sc)
|
||||
LLADDR((struct sockaddr_dl *)ifma->ifma_addr));
|
||||
sp[h >> 4] |= htole32(1 << (h & 0xF));
|
||||
}
|
||||
IF_ADDR_UNLOCK(ifp);
|
||||
|
||||
if (ifp->if_flags & IFF_BROADCAST) {
|
||||
h = dc_mchash_le(sc, ifp->if_broadcastaddr);
|
||||
|
@ -3026,6 +3026,7 @@ tulip_addr_filter(
|
||||
#endif
|
||||
|
||||
multicnt = 0;
|
||||
IF_ADDR_LOCK(sc->tulip_ifp);
|
||||
TAILQ_FOREACH(ifma, &sc->tulip_ifp->if_multiaddrs, ifma_link) {
|
||||
|
||||
if (ifma->ifma_addr->sa_family == AF_LINK)
|
||||
@ -3147,6 +3148,7 @@ tulip_addr_filter(
|
||||
#endif
|
||||
}
|
||||
}
|
||||
IF_ADDR_UNLOCK(sc->tulip_ifp);
|
||||
#if defined(IFF_ALLMULTI)
|
||||
if (sc->tulip_flags & TULIP_ALLMULTI)
|
||||
sc->tulip_ifp->if_flags |= IFF_ALLMULTI;
|
||||
|
@ -351,6 +351,7 @@ pcn_setmulti(sc)
|
||||
pcn_csr_write(sc, PCN_CSR_MAR0 + i, 0);
|
||||
|
||||
/* now program new ones */
|
||||
IF_ADDR_LOCK(ifp);
|
||||
TAILQ_FOREACH(ifma, &ifp->if_multiaddrs, ifma_link) {
|
||||
if (ifma->ifma_addr->sa_family != AF_LINK)
|
||||
continue;
|
||||
@ -358,6 +359,7 @@ pcn_setmulti(sc)
|
||||
ifma->ifma_addr), ETHER_ADDR_LEN) >> 26;
|
||||
hashes[h >> 4] |= 1 << (h & 0xF);
|
||||
}
|
||||
IF_ADDR_UNLOCK(ifp);
|
||||
|
||||
for (i = 0; i < 4; i++)
|
||||
pcn_csr_write(sc, PCN_CSR_MAR0 + i, hashes[i]);
|
||||
|
@ -685,6 +685,7 @@ rl_setmulti(struct rl_softc *sc)
|
||||
CSR_WRITE_4(sc, RL_MAR4, 0);
|
||||
|
||||
/* now program new ones */
|
||||
IF_ADDR_LOCK(ifp);
|
||||
TAILQ_FOREACH(ifma, &ifp->if_multiaddrs, ifma_link) {
|
||||
if (ifma->ifma_addr->sa_family != AF_LINK)
|
||||
continue;
|
||||
@ -696,6 +697,7 @@ rl_setmulti(struct rl_softc *sc)
|
||||
hashes[1] |= (1 << (h - 32));
|
||||
mcnt++;
|
||||
}
|
||||
IF_ADDR_UNLOCK(ifp);
|
||||
|
||||
if (mcnt)
|
||||
rxfilt |= RL_RXCFG_RX_MULTI;
|
||||
|
@ -431,6 +431,7 @@ sf_setmulti(sc)
|
||||
SF_SETBIT(sc, SF_RXFILT, SF_RXFILT_ALLMULTI);
|
||||
} else {
|
||||
i = 1;
|
||||
IF_ADDR_LOCK(ifp);
|
||||
TAILQ_FOREACH_REVERSE(ifma, &ifp->if_multiaddrs, ifmultihead, ifma_link) {
|
||||
if (ifma->ifma_addr->sa_family != AF_LINK)
|
||||
continue;
|
||||
@ -449,6 +450,7 @@ sf_setmulti(sc)
|
||||
sf_sethash(sc,
|
||||
LLADDR((struct sockaddr_dl *)ifma->ifma_addr), 0);
|
||||
}
|
||||
IF_ADDR_UNLOCK(ifp);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -763,6 +763,7 @@ sis_setmulti_ns(struct sis_softc *sc)
|
||||
CSR_WRITE_4(sc, SIS_RXFILT_DATA, 0);
|
||||
}
|
||||
|
||||
IF_ADDR_LOCK(ifp);
|
||||
TAILQ_FOREACH(ifma, &ifp->if_multiaddrs, ifma_link) {
|
||||
if (ifma->ifma_addr->sa_family != AF_LINK)
|
||||
continue;
|
||||
@ -775,6 +776,7 @@ sis_setmulti_ns(struct sis_softc *sc)
|
||||
bit -= 0x10;
|
||||
SIS_SETBIT(sc, SIS_RXFILT_DATA, (1 << bit));
|
||||
}
|
||||
IF_ADDR_UNLOCK(ifp);
|
||||
|
||||
CSR_WRITE_4(sc, SIS_RXFILT_CTL, filtsave);
|
||||
|
||||
@ -813,6 +815,7 @@ sis_setmulti_sis(struct sis_softc *sc)
|
||||
for (i = 0; i < n; i++)
|
||||
hashes[i] = 0;
|
||||
i = 0;
|
||||
IF_ADDR_LOCK(ifp);
|
||||
TAILQ_FOREACH(ifma, &ifp->if_multiaddrs, ifma_link) {
|
||||
if (ifma->ifma_addr->sa_family != AF_LINK)
|
||||
continue;
|
||||
@ -821,6 +824,7 @@ sis_setmulti_sis(struct sis_softc *sc)
|
||||
hashes[h >> 4] |= 1 << (h & 0xf);
|
||||
i++;
|
||||
}
|
||||
IF_ADDR_UNLOCK(ifp);
|
||||
if (i > n) {
|
||||
ctl |= SIS_RXFILTCTL_ALLMULTI;
|
||||
for (i = 0; i < n; i++)
|
||||
|
@ -823,6 +823,7 @@ sk_setmulti(sc_if)
|
||||
hashes[1] = 0xFFFFFFFF;
|
||||
} else {
|
||||
i = 1;
|
||||
IF_ADDR_LOCK(ifp);
|
||||
TAILQ_FOREACH_REVERSE(ifma, &ifp->if_multiaddrs, ifmultihead, ifma_link) {
|
||||
if (ifma->ifma_addr->sa_family != AF_LINK)
|
||||
continue;
|
||||
@ -855,6 +856,7 @@ sk_setmulti(sc_if)
|
||||
else
|
||||
hashes[1] |= (1 << (h - 32));
|
||||
}
|
||||
IF_ADDR_UNLOCK(ifp);
|
||||
}
|
||||
|
||||
switch(sc->sk_type) {
|
||||
|
@ -579,6 +579,7 @@ ste_setmulti(sc)
|
||||
CSR_WRITE_2(sc, STE_MAR3, 0);
|
||||
|
||||
/* now program new ones */
|
||||
IF_ADDR_LOCK(ifp);
|
||||
TAILQ_FOREACH(ifma, &ifp->if_multiaddrs, ifma_link) {
|
||||
if (ifma->ifma_addr->sa_family != AF_LINK)
|
||||
continue;
|
||||
@ -589,6 +590,7 @@ ste_setmulti(sc)
|
||||
else
|
||||
hashes[1] |= (1 << (h - 32));
|
||||
}
|
||||
IF_ADDR_UNLOCK(ifp);
|
||||
|
||||
CSR_WRITE_2(sc, STE_MAR0, hashes[0] & 0xFFFF);
|
||||
CSR_WRITE_2(sc, STE_MAR1, (hashes[0] >> 16) & 0xFFFF);
|
||||
|
@ -1621,6 +1621,7 @@ ti_setmulti(sc)
|
||||
}
|
||||
|
||||
/* Now program new ones. */
|
||||
IF_ADDR_LOCK(ifp);
|
||||
TAILQ_FOREACH(ifma, &ifp->if_multiaddrs, ifma_link) {
|
||||
if (ifma->ifma_addr->sa_family != AF_LINK)
|
||||
continue;
|
||||
@ -1634,6 +1635,7 @@ ti_setmulti(sc)
|
||||
SLIST_INSERT_HEAD(&sc->ti_mc_listhead, mc, mc_entries);
|
||||
ti_add_mcast(sc, &mc->mc_addr);
|
||||
}
|
||||
IF_ADDR_UNLOCK(ifp);
|
||||
|
||||
/* Re-enable interrupts. */
|
||||
CSR_WRITE_4(sc, TI_MB_HOSTINTR, intrs);
|
||||
|
@ -960,6 +960,7 @@ tl_setmulti(sc)
|
||||
hashes[1] = 0xFFFFFFFF;
|
||||
} else {
|
||||
i = 1;
|
||||
IF_ADDR_LOCK(ifp);
|
||||
TAILQ_FOREACH_REVERSE(ifma, &ifp->if_multiaddrs, ifmultihead, ifma_link) {
|
||||
if (ifma->ifma_addr->sa_family != AF_LINK)
|
||||
continue;
|
||||
@ -982,6 +983,7 @@ tl_setmulti(sc)
|
||||
else
|
||||
hashes[1] |= (1 << (h - 32));
|
||||
}
|
||||
IF_ADDR_UNLOCK(ifp);
|
||||
}
|
||||
|
||||
tl_dio_write32(sc, TL_HASH1, hashes[0]);
|
||||
|
@ -533,6 +533,7 @@ vr_setmulti(struct vr_softc *sc)
|
||||
CSR_WRITE_4(sc, VR_MAR1, 0);
|
||||
|
||||
/* Now program new ones. */
|
||||
IF_ADDR_LOCK(ifp);
|
||||
TAILQ_FOREACH(ifma, &ifp->if_multiaddrs, ifma_link) {
|
||||
if (ifma->ifma_addr->sa_family != AF_LINK)
|
||||
continue;
|
||||
@ -544,6 +545,7 @@ vr_setmulti(struct vr_softc *sc)
|
||||
hashes[1] |= (1 << (h - 32));
|
||||
mcnt++;
|
||||
}
|
||||
IF_ADDR_UNLOCK(ifp);
|
||||
|
||||
if (mcnt)
|
||||
rxfilt |= VR_RXCFG_RX_MULTI;
|
||||
|
@ -614,6 +614,7 @@ wb_setmulti(sc)
|
||||
CSR_WRITE_4(sc, WB_MAR1, 0);
|
||||
|
||||
/* now program new ones */
|
||||
IF_ADDR_LOCK(ifp);
|
||||
TAILQ_FOREACH(ifma, &ifp->if_multiaddrs, ifma_link) {
|
||||
if (ifma->ifma_addr->sa_family != AF_LINK)
|
||||
continue;
|
||||
@ -625,6 +626,7 @@ wb_setmulti(sc)
|
||||
hashes[1] |= (1 << (h - 32));
|
||||
mcnt++;
|
||||
}
|
||||
IF_ADDR_UNLOCK(ifp);
|
||||
|
||||
if (mcnt)
|
||||
rxfilt |= WB_NETCFG_RX_MULTI;
|
||||
|
@ -777,8 +777,10 @@ xl_setmulti(struct xl_softc *sc)
|
||||
return;
|
||||
}
|
||||
|
||||
IF_ADDR_LOCK(ifp);
|
||||
TAILQ_FOREACH(ifma, &ifp->if_multiaddrs, ifma_link)
|
||||
mcnt++;
|
||||
IF_ADDR_UNLOCK(ifp);
|
||||
|
||||
if (mcnt)
|
||||
rxfilt |= XL_RXFILTER_ALLMULTI;
|
||||
@ -817,6 +819,7 @@ xl_setmulti_hash(struct xl_softc *sc)
|
||||
CSR_WRITE_2(sc, XL_COMMAND, XL_CMD_RX_SET_HASH|i);
|
||||
|
||||
/* now program new ones */
|
||||
IF_ADDR_LOCK(ifp);
|
||||
TAILQ_FOREACH(ifma, &ifp->if_multiaddrs, ifma_link) {
|
||||
if (ifma->ifma_addr->sa_family != AF_LINK)
|
||||
continue;
|
||||
@ -838,6 +841,7 @@ xl_setmulti_hash(struct xl_softc *sc)
|
||||
h | XL_CMD_RX_SET_HASH | XL_HASH_SET);
|
||||
mcnt++;
|
||||
}
|
||||
IF_ADDR_UNLOCK(ifp);
|
||||
|
||||
if (mcnt)
|
||||
rxfilt |= XL_RXFILTER_MULTIHASH;
|
||||
|
Loading…
x
Reference in New Issue
Block a user