Changeset View
Changeset View
Standalone View
Standalone View
sys/dev/axgbe/if_axgbe.c
Show First 20 Lines • Show All 124 Lines • ▼ Show 20 Lines | |||||
}; | }; | ||||
MALLOC_DEFINE(M_AXGBE, "axgbe", "axgbe data"); | MALLOC_DEFINE(M_AXGBE, "axgbe", "axgbe data"); | ||||
static void | static void | ||||
axgbe_init(void *p) | axgbe_init(void *p) | ||||
{ | { | ||||
struct axgbe_softc *sc; | struct axgbe_softc *sc; | ||||
struct ifnet *ifp; | if_t ifp; | ||||
sc = p; | sc = p; | ||||
ifp = sc->prv.netdev; | ifp = sc->prv.netdev; | ||||
if (ifp->if_drv_flags & IFF_DRV_RUNNING) | if (if_getdrvflags(ifp) & IFF_DRV_RUNNING) | ||||
return; | return; | ||||
ifp->if_drv_flags |= IFF_DRV_RUNNING; | if_setdrvflagbits(ifp, IFF_DRV_RUNNING, 0); | ||||
} | } | ||||
static int | static int | ||||
axgbe_ioctl(struct ifnet *ifp, unsigned long command, caddr_t data) | axgbe_ioctl(if_t ifp, unsigned long command, caddr_t data) | ||||
{ | { | ||||
struct axgbe_softc *sc = ifp->if_softc; | struct axgbe_softc *sc = if_getsoftc(ifp); | ||||
struct ifreq *ifr = (struct ifreq *)data; | struct ifreq *ifr = (struct ifreq *)data; | ||||
int error = 0; | int error = 0; | ||||
switch(command) { | switch(command) { | ||||
case SIOCSIFMTU: | case SIOCSIFMTU: | ||||
if (ifr->ifr_mtu < ETHERMIN || ifr->ifr_mtu > ETHERMTU_JUMBO) | if (ifr->ifr_mtu < ETHERMIN || ifr->ifr_mtu > ETHERMTU_JUMBO) | ||||
error = EINVAL; | error = EINVAL; | ||||
/* TODO - change it to iflib way */ | /* TODO - change it to iflib way */ | ||||
Show All 9 Lines | default: | ||||
error = ether_ioctl(ifp, command, data); | error = ether_ioctl(ifp, command, data); | ||||
break; | break; | ||||
} | } | ||||
return (error); | return (error); | ||||
} | } | ||||
static void | static void | ||||
axgbe_qflush(struct ifnet *ifp) | axgbe_qflush(if_t ifp) | ||||
{ | { | ||||
if_qflush(ifp); | if_qflush(ifp); | ||||
} | } | ||||
static int | static int | ||||
axgbe_media_change(struct ifnet *ifp) | axgbe_media_change(if_t ifp) | ||||
{ | { | ||||
struct axgbe_softc *sc; | struct axgbe_softc *sc; | ||||
int cur_media; | int cur_media; | ||||
sc = ifp->if_softc; | sc = if_getsoftc(ifp); | ||||
sx_xlock(&sc->prv.an_mutex); | sx_xlock(&sc->prv.an_mutex); | ||||
cur_media = sc->media.ifm_cur->ifm_media; | cur_media = sc->media.ifm_cur->ifm_media; | ||||
switch (IFM_SUBTYPE(cur_media)) { | switch (IFM_SUBTYPE(cur_media)) { | ||||
case IFM_10G_KR: | case IFM_10G_KR: | ||||
sc->prv.phy.speed = SPEED_10000; | sc->prv.phy.speed = SPEED_10000; | ||||
sc->prv.phy.autoneg = AUTONEG_DISABLE; | sc->prv.phy.autoneg = AUTONEG_DISABLE; | ||||
Show All 11 Lines | case IFM_AUTO: | ||||
break; | break; | ||||
} | } | ||||
sx_xunlock(&sc->prv.an_mutex); | sx_xunlock(&sc->prv.an_mutex); | ||||
return (-sc->prv.phy_if.phy_config_aneg(&sc->prv)); | return (-sc->prv.phy_if.phy_config_aneg(&sc->prv)); | ||||
} | } | ||||
static void | static void | ||||
axgbe_media_status(struct ifnet *ifp, struct ifmediareq *ifmr) | axgbe_media_status(if_t ifp, struct ifmediareq *ifmr) | ||||
{ | { | ||||
struct axgbe_softc *sc; | struct axgbe_softc *sc; | ||||
sc = ifp->if_softc; | sc = if_getsoftc(ifp); | ||||
ifmr->ifm_status = IFM_AVALID; | ifmr->ifm_status = IFM_AVALID; | ||||
if (!sc->prv.phy.link) | if (!sc->prv.phy.link) | ||||
return; | return; | ||||
ifmr->ifm_status |= IFM_ACTIVE; | ifmr->ifm_status |= IFM_ACTIVE; | ||||
ifmr->ifm_active = IFM_ETHER; | ifmr->ifm_active = IFM_ETHER; | ||||
Show All 11 Lines | case SPEED_2500: | ||||
break; | break; | ||||
case SPEED_1000: | case SPEED_1000: | ||||
ifmr->ifm_active |= IFM_1000_KX; | ifmr->ifm_active |= IFM_1000_KX; | ||||
break; | break; | ||||
} | } | ||||
} | } | ||||
static uint64_t | static uint64_t | ||||
axgbe_get_counter(struct ifnet *ifp, ift_counter c) | axgbe_get_counter(if_t ifp, ift_counter c) | ||||
{ | { | ||||
struct xgbe_prv_data *pdata = ifp->if_softc; | struct xgbe_prv_data *pdata = if_getsoftc(ifp); | ||||
struct xgbe_mmc_stats *pstats = &pdata->mmc_stats; | struct xgbe_mmc_stats *pstats = &pdata->mmc_stats; | ||||
DBGPR("-->%s\n", __func__); | DBGPR("-->%s\n", __func__); | ||||
pdata->hw_if.read_mmc_stats(pdata); | pdata->hw_if.read_mmc_stats(pdata); | ||||
switch(c) { | switch(c) { | ||||
case IFCOUNTER_IPACKETS: | case IFCOUNTER_IPACKETS: | ||||
▲ Show 20 Lines • Show All 45 Lines • ▼ Show 20 Lines | axgbe_get_optional_prop(device_t dev, phandle_t node, const char *name, | ||||
return (0); | return (0); | ||||
} | } | ||||
static int | static int | ||||
axgbe_attach(device_t dev) | axgbe_attach(device_t dev) | ||||
{ | { | ||||
struct axgbe_softc *sc; | struct axgbe_softc *sc; | ||||
struct ifnet *ifp; | if_t ifp; | ||||
pcell_t phy_handle; | pcell_t phy_handle; | ||||
device_t phydev; | device_t phydev; | ||||
phandle_t node, phy_node; | phandle_t node, phy_node; | ||||
struct resource *mac_res[11]; | struct resource *mac_res[11]; | ||||
struct resource *phy_res[4]; | struct resource *phy_res[4]; | ||||
ssize_t len; | ssize_t len; | ||||
int error, i, j; | int error, i, j; | ||||
▲ Show 20 Lines • Show All 210 Lines • ▼ Show 20 Lines | axgbe_attach(device_t dev) | ||||
/* Init the PHY */ | /* Init the PHY */ | ||||
sc->prv.phy_if.phy_init(&sc->prv); | sc->prv.phy_if.phy_init(&sc->prv); | ||||
/* Set the coalescing */ | /* Set the coalescing */ | ||||
xgbe_init_rx_coalesce(&sc->prv); | xgbe_init_rx_coalesce(&sc->prv); | ||||
xgbe_init_tx_coalesce(&sc->prv); | xgbe_init_tx_coalesce(&sc->prv); | ||||
if_initname(ifp, device_get_name(dev), device_get_unit(dev)); | if_initname(ifp, device_get_name(dev), device_get_unit(dev)); | ||||
ifp->if_init = axgbe_init; | if_setinitfn(ifp, axgbe_init); | ||||
ifp->if_softc = sc; | if_setsoftc(ifp, sc); | ||||
ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST; | if_setflags(ifp, IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST); | ||||
ifp->if_ioctl = axgbe_ioctl; | if_setioctlfn(ifp, axgbe_ioctl); | ||||
/* TODO - change it to iflib way */ | /* TODO - change it to iflib way */ | ||||
ifp->if_qflush = axgbe_qflush; | if_setqflushfn(ifp, axgbe_qflush); | ||||
ifp->if_get_counter = axgbe_get_counter; | if_setgetcounterfn(ifp, axgbe_get_counter); | ||||
/* TODO: Support HW offload */ | /* TODO: Support HW offload */ | ||||
ifp->if_capabilities = 0; | if_setcapabilities(ifp, 0); | ||||
ifp->if_capenable = 0; | if_setcapenable(ifp, 0); | ||||
ifp->if_hwassist = 0; | if_sethwassist(ifp, 0); | ||||
ether_ifattach(ifp, sc->mac_addr); | ether_ifattach(ifp, sc->mac_addr); | ||||
ifmedia_init(&sc->media, IFM_IMASK, axgbe_media_change, | ifmedia_init(&sc->media, IFM_IMASK, axgbe_media_change, | ||||
axgbe_media_status); | axgbe_media_status); | ||||
#ifdef notyet | #ifdef notyet | ||||
ifmedia_add(&sc->media, IFM_ETHER | IFM_10G_KR, 0, NULL); | ifmedia_add(&sc->media, IFM_ETHER | IFM_10G_KR, 0, NULL); | ||||
#endif | #endif | ||||
▲ Show 20 Lines • Show All 64 Lines • Show Last 20 Lines |