Changeset View
Changeset View
Standalone View
Standalone View
sys/dev/lge/if_lge.c
Show First 20 Lines • Show All 361 Lines • ▼ Show 20 Lines | if ((mii->mii_media_active & IFM_GMASK) == IFM_FDX) { | ||||
LGE_SETBIT(sc, LGE_GMIIMODE, LGE_GMIIMODE_FDX); | LGE_SETBIT(sc, LGE_GMIIMODE, LGE_GMIIMODE_FDX); | ||||
} else { | } else { | ||||
LGE_CLRBIT(sc, LGE_GMIIMODE, LGE_GMIIMODE_FDX); | LGE_CLRBIT(sc, LGE_GMIIMODE, LGE_GMIIMODE_FDX); | ||||
} | } | ||||
return; | return; | ||||
} | } | ||||
static u_int | |||||
lge_hash_maddr(void *arg, struct sockaddr_dl *sdl, u_int count) | |||||
{ | |||||
uint32_t h, *hashes = arg; | |||||
h = ether_crc32_be(LLADDR(sdl), ETHER_ADDR_LEN) >> 26; | |||||
if (h < 32) | |||||
hashes[0] |= (1 << h); | |||||
else | |||||
hashes[1] |= (1 << (h - 32)); | |||||
return (1); | |||||
} | |||||
static void | static void | ||||
lge_setmulti(sc) | lge_setmulti(sc) | ||||
struct lge_softc *sc; | struct lge_softc *sc; | ||||
{ | { | ||||
struct ifnet *ifp; | struct ifnet *ifp; | ||||
struct ifmultiaddr *ifma; | uint32_t hashes[2] = { 0, 0 }; | ||||
u_int32_t h = 0, hashes[2] = { 0, 0 }; | |||||
ifp = sc->lge_ifp; | ifp = sc->lge_ifp; | ||||
LGE_LOCK_ASSERT(sc); | LGE_LOCK_ASSERT(sc); | ||||
/* Make sure multicast hash table is enabled. */ | /* Make sure multicast hash table is enabled. */ | ||||
CSR_WRITE_4(sc, LGE_MODE1, LGE_MODE1_SETRST_CTL1|LGE_MODE1_RX_MCAST); | CSR_WRITE_4(sc, LGE_MODE1, LGE_MODE1_SETRST_CTL1|LGE_MODE1_RX_MCAST); | ||||
if (ifp->if_flags & IFF_ALLMULTI || ifp->if_flags & IFF_PROMISC) { | if (ifp->if_flags & IFF_ALLMULTI || ifp->if_flags & IFF_PROMISC) { | ||||
CSR_WRITE_4(sc, LGE_MAR0, 0xFFFFFFFF); | CSR_WRITE_4(sc, LGE_MAR0, 0xFFFFFFFF); | ||||
CSR_WRITE_4(sc, LGE_MAR1, 0xFFFFFFFF); | CSR_WRITE_4(sc, LGE_MAR1, 0xFFFFFFFF); | ||||
return; | return; | ||||
} | } | ||||
/* first, zot all the existing hash bits */ | /* first, zot all the existing hash bits */ | ||||
CSR_WRITE_4(sc, LGE_MAR0, 0); | CSR_WRITE_4(sc, LGE_MAR0, 0); | ||||
CSR_WRITE_4(sc, LGE_MAR1, 0); | CSR_WRITE_4(sc, LGE_MAR1, 0); | ||||
/* now program new ones */ | /* now program new ones */ | ||||
if_maddr_rlock(ifp); | if_foreach_llmaddr(ifp, lge_hash_maddr, hashes); | ||||
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) >> 26; | |||||
if (h < 32) | |||||
hashes[0] |= (1 << h); | |||||
else | |||||
hashes[1] |= (1 << (h - 32)); | |||||
} | |||||
if_maddr_runlock(ifp); | |||||
CSR_WRITE_4(sc, LGE_MAR0, hashes[0]); | CSR_WRITE_4(sc, LGE_MAR0, hashes[0]); | ||||
CSR_WRITE_4(sc, LGE_MAR1, hashes[1]); | CSR_WRITE_4(sc, LGE_MAR1, hashes[1]); | ||||
return; | return; | ||||
} | } | ||||
static void | static void | ||||
▲ Show 20 Lines • Show All 1,175 Lines • Show Last 20 Lines |