Changeset View
Changeset View
Standalone View
Standalone View
sys/dev/alc/if_alc.c
Show First 20 Lines • Show All 4,575 Lines • ▼ Show 20 Lines | alc_rxvlan(struct alc_softc *sc) | ||||
reg = CSR_READ_4(sc, ALC_MAC_CFG); | reg = CSR_READ_4(sc, ALC_MAC_CFG); | ||||
if ((ifp->if_capenable & IFCAP_VLAN_HWTAGGING) != 0) | if ((ifp->if_capenable & IFCAP_VLAN_HWTAGGING) != 0) | ||||
reg |= MAC_CFG_VLAN_TAG_STRIP; | reg |= MAC_CFG_VLAN_TAG_STRIP; | ||||
else | else | ||||
reg &= ~MAC_CFG_VLAN_TAG_STRIP; | reg &= ~MAC_CFG_VLAN_TAG_STRIP; | ||||
CSR_WRITE_4(sc, ALC_MAC_CFG, reg); | CSR_WRITE_4(sc, ALC_MAC_CFG, reg); | ||||
} | } | ||||
static u_int | |||||
alc_hash_maddr(void *arg, struct sockaddr_dl *sdl, u_int cnt) | |||||
{ | |||||
uint32_t *mchash = arg; | |||||
uint32_t crc; | |||||
crc = ether_crc32_be(LLADDR(sdl), ETHER_ADDR_LEN); | |||||
mchash[crc >> 31] |= 1 << ((crc >> 26) & 0x1f); | |||||
return (1); | |||||
} | |||||
static void | static void | ||||
alc_rxfilter(struct alc_softc *sc) | alc_rxfilter(struct alc_softc *sc) | ||||
{ | { | ||||
struct ifnet *ifp; | struct ifnet *ifp; | ||||
struct ifmultiaddr *ifma; | |||||
uint32_t crc; | |||||
uint32_t mchash[2]; | uint32_t mchash[2]; | ||||
uint32_t rxcfg; | uint32_t rxcfg; | ||||
ALC_LOCK_ASSERT(sc); | ALC_LOCK_ASSERT(sc); | ||||
ifp = sc->alc_ifp; | ifp = sc->alc_ifp; | ||||
bzero(mchash, sizeof(mchash)); | bzero(mchash, sizeof(mchash)); | ||||
rxcfg = CSR_READ_4(sc, ALC_MAC_CFG); | rxcfg = CSR_READ_4(sc, ALC_MAC_CFG); | ||||
rxcfg &= ~(MAC_CFG_ALLMULTI | MAC_CFG_BCAST | MAC_CFG_PROMISC); | rxcfg &= ~(MAC_CFG_ALLMULTI | MAC_CFG_BCAST | MAC_CFG_PROMISC); | ||||
if ((ifp->if_flags & IFF_BROADCAST) != 0) | if ((ifp->if_flags & IFF_BROADCAST) != 0) | ||||
rxcfg |= MAC_CFG_BCAST; | rxcfg |= MAC_CFG_BCAST; | ||||
if ((ifp->if_flags & (IFF_PROMISC | IFF_ALLMULTI)) != 0) { | if ((ifp->if_flags & (IFF_PROMISC | IFF_ALLMULTI)) != 0) { | ||||
if ((ifp->if_flags & IFF_PROMISC) != 0) | if ((ifp->if_flags & IFF_PROMISC) != 0) | ||||
rxcfg |= MAC_CFG_PROMISC; | rxcfg |= MAC_CFG_PROMISC; | ||||
if ((ifp->if_flags & IFF_ALLMULTI) != 0) | if ((ifp->if_flags & IFF_ALLMULTI) != 0) | ||||
rxcfg |= MAC_CFG_ALLMULTI; | rxcfg |= MAC_CFG_ALLMULTI; | ||||
mchash[0] = 0xFFFFFFFF; | mchash[0] = 0xFFFFFFFF; | ||||
mchash[1] = 0xFFFFFFFF; | mchash[1] = 0xFFFFFFFF; | ||||
goto chipit; | goto chipit; | ||||
} | } | ||||
if_maddr_rlock(ifp); | if_foreach_llmaddr(ifp, alc_hash_maddr, mchash); | ||||
CK_STAILQ_FOREACH(ifma, &sc->alc_ifp->if_multiaddrs, ifma_link) { | |||||
if (ifma->ifma_addr->sa_family != AF_LINK) | |||||
continue; | |||||
crc = ether_crc32_be(LLADDR((struct sockaddr_dl *) | |||||
ifma->ifma_addr), ETHER_ADDR_LEN); | |||||
mchash[crc >> 31] |= 1 << ((crc >> 26) & 0x1f); | |||||
} | |||||
if_maddr_runlock(ifp); | |||||
chipit: | chipit: | ||||
CSR_WRITE_4(sc, ALC_MAR0, mchash[0]); | CSR_WRITE_4(sc, ALC_MAR0, mchash[0]); | ||||
CSR_WRITE_4(sc, ALC_MAR1, mchash[1]); | CSR_WRITE_4(sc, ALC_MAR1, mchash[1]); | ||||
CSR_WRITE_4(sc, ALC_MAC_CFG, rxcfg); | CSR_WRITE_4(sc, ALC_MAC_CFG, rxcfg); | ||||
} | } | ||||
static int | static int | ||||
▲ Show 20 Lines • Show All 82 Lines • Show Last 20 Lines |