Changeset View
Changeset View
Standalone View
Standalone View
sys/dev/sfxge/sfxge_port.c
Show First 20 Lines • Show All 352 Lines • ▼ Show 20 Lines | sfxge_mac_poll_work(void *arg, int npending) | ||||
/* This may sleep waiting for MCDI completion */ | /* This may sleep waiting for MCDI completion */ | ||||
(void)efx_port_poll(enp, &mode); | (void)efx_port_poll(enp, &mode); | ||||
sfxge_mac_link_update(sc, mode); | sfxge_mac_link_update(sc, mode); | ||||
done: | done: | ||||
SFXGE_PORT_UNLOCK(port); | SFXGE_PORT_UNLOCK(port); | ||||
} | } | ||||
static u_int | |||||
sfxge_copy_maddr(void *arg, struct sockaddr_dl *sdl, u_int cnt) | |||||
{ | |||||
uint8_t *mcast_addr = arg; | |||||
if (cnt == EFX_MAC_MULTICAST_LIST_MAX) | |||||
return (0); | |||||
memcpy(mcast_addr + (cnt * EFX_MAC_ADDR_LEN), LLADDR(sdl), | |||||
EFX_MAC_ADDR_LEN); | |||||
return (1); | |||||
} | |||||
static int | static int | ||||
sfxge_mac_multicast_list_set(struct sfxge_softc *sc) | sfxge_mac_multicast_list_set(struct sfxge_softc *sc) | ||||
{ | { | ||||
struct ifnet *ifp = sc->ifnet; | struct ifnet *ifp = sc->ifnet; | ||||
struct sfxge_port *port = &sc->port; | struct sfxge_port *port = &sc->port; | ||||
uint8_t *mcast_addr = port->mcast_addrs; | |||||
struct ifmultiaddr *ifma; | |||||
struct sockaddr_dl *sa; | |||||
int rc = 0; | int rc = 0; | ||||
mtx_assert(&port->lock, MA_OWNED); | mtx_assert(&port->lock, MA_OWNED); | ||||
port->mcast_count = 0; | port->mcast_count = if_foreach_llmaddr(ifp, sfxge_copy_maddr, | ||||
if_maddr_rlock(ifp); | port->mcast_addrs); | ||||
CK_STAILQ_FOREACH(ifma, &ifp->if_multiaddrs, ifma_link) { | |||||
if (ifma->ifma_addr->sa_family == AF_LINK) { | |||||
if (port->mcast_count == EFX_MAC_MULTICAST_LIST_MAX) { | if (port->mcast_count == EFX_MAC_MULTICAST_LIST_MAX) { | ||||
device_printf(sc->dev, | device_printf(sc->dev, "Too many multicast addresses\n"); | ||||
"Too many multicast addresses\n"); | |||||
rc = EINVAL; | rc = EINVAL; | ||||
break; | |||||
} | } | ||||
sa = (struct sockaddr_dl *)ifma->ifma_addr; | |||||
memcpy(mcast_addr, LLADDR(sa), EFX_MAC_ADDR_LEN); | |||||
mcast_addr += EFX_MAC_ADDR_LEN; | |||||
++port->mcast_count; | |||||
} | |||||
} | |||||
if_maddr_runlock(ifp); | |||||
if (rc == 0) { | if (rc == 0) { | ||||
rc = efx_mac_multicast_list_set(sc->enp, port->mcast_addrs, | rc = efx_mac_multicast_list_set(sc->enp, port->mcast_addrs, | ||||
port->mcast_count); | port->mcast_count); | ||||
if (rc != 0) | if (rc != 0) | ||||
device_printf(sc->dev, | device_printf(sc->dev, | ||||
"Cannot set multicast address list\n"); | "Cannot set multicast address list\n"); | ||||
} | } | ||||
▲ Show 20 Lines • Show All 80 Lines • ▼ Show 20 Lines | sfxge_port_stop(struct sfxge_softc *sc) | ||||
SFXGE_PORT_UNLOCK(port); | SFXGE_PORT_UNLOCK(port); | ||||
} | } | ||||
int | int | ||||
sfxge_port_start(struct sfxge_softc *sc) | sfxge_port_start(struct sfxge_softc *sc) | ||||
{ | { | ||||
uint8_t mac_addr[ETHER_ADDR_LEN]; | uint8_t mac_addr[ETHER_ADDR_LEN]; | ||||
struct epoch_tracker et; | |||||
struct ifnet *ifp = sc->ifnet; | struct ifnet *ifp = sc->ifnet; | ||||
struct sfxge_port *port; | struct sfxge_port *port; | ||||
efx_nic_t *enp; | efx_nic_t *enp; | ||||
size_t pdu; | size_t pdu; | ||||
int rc; | int rc; | ||||
uint32_t phy_cap_mask; | uint32_t phy_cap_mask; | ||||
port = &sc->port; | port = &sc->port; | ||||
Show All 17 Lines | sfxge_port_start(struct sfxge_softc *sc) | ||||
if ((rc = efx_mac_pdu_set(enp, pdu)) != 0) | if ((rc = efx_mac_pdu_set(enp, pdu)) != 0) | ||||
goto fail2; | goto fail2; | ||||
if ((rc = efx_mac_fcntl_set(enp, sfxge_port_wanted_fc(sc), B_TRUE)) | if ((rc = efx_mac_fcntl_set(enp, sfxge_port_wanted_fc(sc), B_TRUE)) | ||||
!= 0) | != 0) | ||||
goto fail3; | goto fail3; | ||||
/* Set the unicast address */ | /* Set the unicast address */ | ||||
if_addr_rlock(ifp); | NET_EPOCH_ENTER(et); | ||||
bcopy(LLADDR((struct sockaddr_dl *)ifp->if_addr->ifa_addr), | bcopy(LLADDR((struct sockaddr_dl *)ifp->if_addr->ifa_addr), | ||||
mac_addr, sizeof(mac_addr)); | mac_addr, sizeof(mac_addr)); | ||||
if_addr_runlock(ifp); | NET_EPOCH_EXIT(et); | ||||
if ((rc = efx_mac_addr_set(enp, mac_addr)) != 0) | if ((rc = efx_mac_addr_set(enp, mac_addr)) != 0) | ||||
goto fail4; | goto fail4; | ||||
sfxge_mac_filter_set_locked(sc); | sfxge_mac_filter_set_locked(sc); | ||||
/* Update MAC stats by DMA every period */ | /* Update MAC stats by DMA every period */ | ||||
if ((rc = efx_mac_stats_periodic(enp, &port->mac_stats.dma_buf, | if ((rc = efx_mac_stats_periodic(enp, &port->mac_stats.dma_buf, | ||||
port->stats_update_period_ms, | port->stats_update_period_ms, | ||||
▲ Show 20 Lines • Show All 569 Lines • Show Last 20 Lines |