Changeset View
Changeset View
Standalone View
Standalone View
sys/dev/sfxge/sfxge_port.c
Show First 20 Lines • Show All 96 Lines • ▼ Show 20 Lines | sfxge_mac_stat_update(struct sfxge_softc *sc) | ||||
} | } | ||||
rc = ETIMEDOUT; | rc = ETIMEDOUT; | ||||
out: | out: | ||||
return (rc); | return (rc); | ||||
} | } | ||||
uint64_t | uint64_t | ||||
sfxge_get_counter(struct ifnet *ifp, ift_counter c) | sfxge_get_counter(if_t ifp, ift_counter c) | ||||
{ | { | ||||
struct sfxge_softc *sc = ifp->if_softc; | struct sfxge_softc *sc = if_getsoftc(ifp); | ||||
uint64_t *mac_stats; | uint64_t *mac_stats; | ||||
uint64_t val; | uint64_t val; | ||||
SFXGE_PORT_LOCK(&sc->port); | SFXGE_PORT_LOCK(&sc->port); | ||||
/* Ignore error and use old values */ | /* Ignore error and use old values */ | ||||
(void)sfxge_mac_stat_update(sc); | (void)sfxge_mac_stat_update(sc); | ||||
▲ Show 20 Lines • Show All 206 Lines • ▼ Show 20 Lines | sfxge_mac_link_update(struct sfxge_softc *sc, efx_link_mode_t mode) | ||||
if (port->link_mode == mode) | if (port->link_mode == mode) | ||||
return; | return; | ||||
port->link_mode = mode; | port->link_mode = mode; | ||||
/* Push link state update to the OS */ | /* Push link state update to the OS */ | ||||
link_state = (SFXGE_LINK_UP(sc) ? LINK_STATE_UP : LINK_STATE_DOWN); | link_state = (SFXGE_LINK_UP(sc) ? LINK_STATE_UP : LINK_STATE_DOWN); | ||||
sc->ifnet->if_baudrate = sfxge_link_baudrate[port->link_mode]; | if_setbaudrate(sc->ifnet, sfxge_link_baudrate[port->link_mode]); | ||||
if_link_state_change(sc->ifnet, link_state); | if_link_state_change(sc->ifnet, link_state); | ||||
} | } | ||||
static void | static void | ||||
sfxge_mac_poll_work(void *arg, int npending) | sfxge_mac_poll_work(void *arg, int npending) | ||||
{ | { | ||||
struct sfxge_softc *sc; | struct sfxge_softc *sc; | ||||
efx_nic_t *enp; | efx_nic_t *enp; | ||||
Show All 29 Lines | memcpy(mcast_addr + (cnt * EFX_MAC_ADDR_LEN), LLADDR(sdl), | ||||
EFX_MAC_ADDR_LEN); | EFX_MAC_ADDR_LEN); | ||||
return (1); | 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; | if_t ifp = sc->ifnet; | ||||
struct sfxge_port *port = &sc->port; | struct sfxge_port *port = &sc->port; | ||||
int rc = 0; | int rc = 0; | ||||
mtx_assert(&port->lock, MA_OWNED); | mtx_assert(&port->lock, MA_OWNED); | ||||
port->mcast_count = if_foreach_llmaddr(ifp, sfxge_copy_maddr, | port->mcast_count = if_foreach_llmaddr(ifp, sfxge_copy_maddr, | ||||
port->mcast_addrs); | port->mcast_addrs); | ||||
if (port->mcast_count == EFX_MAC_MULTICAST_LIST_MAX) { | if (port->mcast_count == EFX_MAC_MULTICAST_LIST_MAX) { | ||||
Show All 10 Lines | sfxge_mac_multicast_list_set(struct sfxge_softc *sc) | ||||
} | } | ||||
return (rc); | return (rc); | ||||
} | } | ||||
static int | static int | ||||
sfxge_mac_filter_set_locked(struct sfxge_softc *sc) | sfxge_mac_filter_set_locked(struct sfxge_softc *sc) | ||||
{ | { | ||||
struct ifnet *ifp = sc->ifnet; | if_t ifp = sc->ifnet; | ||||
struct sfxge_port *port = &sc->port; | struct sfxge_port *port = &sc->port; | ||||
boolean_t all_mulcst; | boolean_t all_mulcst; | ||||
int rc; | int rc; | ||||
mtx_assert(&port->lock, MA_OWNED); | mtx_assert(&port->lock, MA_OWNED); | ||||
all_mulcst = !!(ifp->if_flags & (IFF_PROMISC | IFF_ALLMULTI)); | all_mulcst = !!(if_getflags(ifp) & (IFF_PROMISC | IFF_ALLMULTI)); | ||||
rc = sfxge_mac_multicast_list_set(sc); | rc = sfxge_mac_multicast_list_set(sc); | ||||
/* Fallback to all multicast if cannot set multicast list */ | /* Fallback to all multicast if cannot set multicast list */ | ||||
if (rc != 0) | if (rc != 0) | ||||
all_mulcst = B_TRUE; | all_mulcst = B_TRUE; | ||||
rc = efx_mac_filter_set(sc->enp, !!(ifp->if_flags & IFF_PROMISC), | rc = efx_mac_filter_set(sc->enp, !!(if_getflags(ifp) & IFF_PROMISC), | ||||
(port->mcast_count > 0), all_mulcst, B_TRUE); | (port->mcast_count > 0), all_mulcst, B_TRUE); | ||||
return (rc); | return (rc); | ||||
} | } | ||||
int | int | ||||
sfxge_mac_filter_set(struct sfxge_softc *sc) | sfxge_mac_filter_set(struct sfxge_softc *sc) | ||||
{ | { | ||||
▲ Show 20 Lines • Show All 52 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 epoch_tracker et; | ||||
struct ifnet *ifp = sc->ifnet; | if_t 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; | ||||
enp = sc->enp; | enp = sc->enp; | ||||
SFXGE_PORT_LOCK(port); | SFXGE_PORT_LOCK(port); | ||||
KASSERT(port->init_state == SFXGE_PORT_INITIALIZED, | KASSERT(port->init_state == SFXGE_PORT_INITIALIZED, | ||||
("port not initialized")); | ("port not initialized")); | ||||
/* Initialise the required filtering */ | /* Initialise the required filtering */ | ||||
if ((rc = efx_filter_init(enp)) != 0) | if ((rc = efx_filter_init(enp)) != 0) | ||||
goto fail_filter_init; | goto fail_filter_init; | ||||
/* Initialize the port object in the common code. */ | /* Initialize the port object in the common code. */ | ||||
if ((rc = efx_port_init(sc->enp)) != 0) | if ((rc = efx_port_init(sc->enp)) != 0) | ||||
goto fail; | goto fail; | ||||
/* Set the SDU */ | /* Set the SDU */ | ||||
pdu = EFX_MAC_PDU(ifp->if_mtu); | pdu = EFX_MAC_PDU(if_getmtu(ifp)); | ||||
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 */ | ||||
NET_EPOCH_ENTER(et); | NET_EPOCH_ENTER(et); | ||||
bcopy(LLADDR((struct sockaddr_dl *)ifp->if_addr->ifa_addr), | bcopy(if_getlladdr(ifp), mac_addr, sizeof(mac_addr)); | ||||
zlei: Use `if_getlladdr()` | |||||
mac_addr, sizeof(mac_addr)); | |||||
NET_EPOCH_EXIT(et); | 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, | ||||
▲ Show 20 Lines • Show All 325 Lines • ▼ Show 20 Lines | [EFX_PHY_MEDIA_BASE_T] = { | ||||
[EFX_LINK_100FDX] = IFM_ETHER | IFM_FDX | IFM_100_TX, | [EFX_LINK_100FDX] = IFM_ETHER | IFM_FDX | IFM_100_TX, | ||||
[EFX_LINK_1000HDX] = IFM_ETHER | IFM_HDX | IFM_1000_T, | [EFX_LINK_1000HDX] = IFM_ETHER | IFM_HDX | IFM_1000_T, | ||||
[EFX_LINK_1000FDX] = IFM_ETHER | IFM_FDX | IFM_1000_T, | [EFX_LINK_1000FDX] = IFM_ETHER | IFM_FDX | IFM_1000_T, | ||||
[EFX_LINK_10000FDX] = IFM_ETHER | IFM_FDX | IFM_10G_T, | [EFX_LINK_10000FDX] = IFM_ETHER | IFM_FDX | IFM_10G_T, | ||||
}, | }, | ||||
}; | }; | ||||
static void | static void | ||||
sfxge_media_status(struct ifnet *ifp, struct ifmediareq *ifmr) | sfxge_media_status(if_t ifp, struct ifmediareq *ifmr) | ||||
{ | { | ||||
struct sfxge_softc *sc; | struct sfxge_softc *sc; | ||||
efx_phy_media_type_t medium_type; | efx_phy_media_type_t medium_type; | ||||
efx_link_mode_t mode; | efx_link_mode_t mode; | ||||
sc = ifp->if_softc; | sc = if_getsoftc(ifp); | ||||
SFXGE_ADAPTER_LOCK(sc); | SFXGE_ADAPTER_LOCK(sc); | ||||
ifmr->ifm_status = IFM_AVALID; | ifmr->ifm_status = IFM_AVALID; | ||||
ifmr->ifm_active = IFM_ETHER; | ifmr->ifm_active = IFM_ETHER; | ||||
if (SFXGE_RUNNING(sc) && SFXGE_LINK_UP(sc)) { | if (SFXGE_RUNNING(sc) && SFXGE_LINK_UP(sc)) { | ||||
ifmr->ifm_status |= IFM_ACTIVE; | ifmr->ifm_status |= IFM_ACTIVE; | ||||
▲ Show 20 Lines • Show All 93 Lines • ▼ Show 20 Lines | #else | ||||
mode_cap_mask |= cap_mask & (1 << EFX_PHY_CAP_PAUSE); | mode_cap_mask |= cap_mask & (1 << EFX_PHY_CAP_PAUSE); | ||||
#endif | #endif | ||||
*phy_cap_mask = mode_cap_mask; | *phy_cap_mask = mode_cap_mask; | ||||
return (0); | return (0); | ||||
} | } | ||||
static int | static int | ||||
sfxge_media_change(struct ifnet *ifp) | sfxge_media_change(if_t ifp) | ||||
{ | { | ||||
struct sfxge_softc *sc; | struct sfxge_softc *sc; | ||||
struct ifmedia_entry *ifm; | struct ifmedia_entry *ifm; | ||||
int rc; | int rc; | ||||
uint32_t phy_cap_mask; | uint32_t phy_cap_mask; | ||||
sc = ifp->if_softc; | sc = if_getsoftc(ifp); | ||||
ifm = sc->media.ifm_cur; | ifm = sc->media.ifm_cur; | ||||
SFXGE_ADAPTER_LOCK(sc); | SFXGE_ADAPTER_LOCK(sc); | ||||
if (!SFXGE_RUNNING(sc)) { | if (!SFXGE_RUNNING(sc)) { | ||||
rc = 0; | rc = 0; | ||||
goto out; | goto out; | ||||
} | } | ||||
▲ Show 20 Lines • Show All 104 Lines • Show Last 20 Lines |
Use if_getlladdr()