Changeset View
Changeset View
Standalone View
Standalone View
sys/arm/allwinner/if_emac.c
Show First 20 Lines • Show All 212 Lines • ▼ Show 20 Lines | else { | ||||
hwaddr[4] = (rnd >> 8) & 0xff; | hwaddr[4] = (rnd >> 8) & 0xff; | ||||
hwaddr[5] = (rnd >> 0) & 0xff; | hwaddr[5] = (rnd >> 0) & 0xff; | ||||
} | } | ||||
} | } | ||||
if (bootverbose) | if (bootverbose) | ||||
printf("MAC address: %s\n", ether_sprintf(hwaddr)); | printf("MAC address: %s\n", ether_sprintf(hwaddr)); | ||||
} | } | ||||
static u_int | |||||
emac_hash_maddr(void *arg, struct sockaddr_dl *sdl, u_int cnt) | |||||
{ | |||||
uint32_t h, *hashes = arg; | |||||
h = ether_crc32_be(LLADDR(sdl), ETHER_ADDR_LEN) >> 26; | |||||
hashes[h >> 5] |= 1 << (h & 0x1f); | |||||
return (1); | |||||
} | |||||
static void | static void | ||||
emac_set_rx_mode(struct emac_softc *sc) | emac_set_rx_mode(struct emac_softc *sc) | ||||
{ | { | ||||
struct ifnet *ifp; | struct ifnet *ifp; | ||||
struct ifmultiaddr *ifma; | uint32_t hashes[2]; | ||||
uint32_t h, hashes[2]; | |||||
uint32_t rcr = 0; | uint32_t rcr = 0; | ||||
EMAC_ASSERT_LOCKED(sc); | EMAC_ASSERT_LOCKED(sc); | ||||
ifp = sc->emac_ifp; | ifp = sc->emac_ifp; | ||||
rcr = EMAC_READ_REG(sc, EMAC_RX_CTL); | rcr = EMAC_READ_REG(sc, EMAC_RX_CTL); | ||||
/* Unicast packet and DA filtering */ | /* Unicast packet and DA filtering */ | ||||
rcr |= EMAC_RX_UCAD; | rcr |= EMAC_RX_UCAD; | ||||
rcr |= EMAC_RX_DAF; | rcr |= EMAC_RX_DAF; | ||||
hashes[0] = 0; | hashes[0] = 0; | ||||
hashes[1] = 0; | hashes[1] = 0; | ||||
if (ifp->if_flags & IFF_ALLMULTI) { | if (ifp->if_flags & IFF_ALLMULTI) { | ||||
hashes[0] = 0xffffffff; | hashes[0] = 0xffffffff; | ||||
hashes[1] = 0xffffffff; | hashes[1] = 0xffffffff; | ||||
} else { | } else | ||||
if_maddr_rlock(ifp); | if_foreach_llmaddr(ifp, emac_hash_maddr, hashes); | ||||
CK_STAILQ_FOREACH(ifma, &sc->emac_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; | |||||
hashes[h >> 5] |= 1 << (h & 0x1f); | |||||
} | |||||
if_maddr_runlock(ifp); | |||||
} | |||||
rcr |= EMAC_RX_MCO; | rcr |= EMAC_RX_MCO; | ||||
rcr |= EMAC_RX_MHF; | rcr |= EMAC_RX_MHF; | ||||
EMAC_WRITE_REG(sc, EMAC_RX_HASH0, hashes[0]); | EMAC_WRITE_REG(sc, EMAC_RX_HASH0, hashes[0]); | ||||
EMAC_WRITE_REG(sc, EMAC_RX_HASH1, hashes[1]); | EMAC_WRITE_REG(sc, EMAC_RX_HASH1, hashes[1]); | ||||
if (ifp->if_flags & IFF_BROADCAST) { | if (ifp->if_flags & IFF_BROADCAST) { | ||||
rcr |= EMAC_RX_BCO; | rcr |= EMAC_RX_BCO; | ||||
rcr |= EMAC_RX_MCO; | rcr |= EMAC_RX_MCO; | ||||
▲ Show 20 Lines • Show All 940 Lines • Show Last 20 Lines |