/** * Per network device initialization * * @param dev Device to initialize * @return Zero on success */ int cvm_oct_common_init(struct ifnet *ifp) { uint8_t mac[6]; cvm_oct_private_t *priv = (cvm_oct_private_t *)ifp->if_softc; if (cvm_assign_mac_address(NULL, mac) != 0) return ENXIO; ifp->if_mtu = ETHERMTU; cvm_oct_mdio_setup_device(ifp); cvm_oct_common_set_mac_address(ifp, mac); cvm_oct_common_change_mtu(ifp, ifp->if_mtu); /* * Do any last-minute board-specific initialization. */ switch (cvmx_sysinfo_get()->board_type) { #if defined(OCTEON_VENDOR_LANNER) case CVMX_BOARD_TYPE_CUST_LANNER_MR320: case CVMX_BOARD_TYPE_CUST_LANNER_MR321X: if (priv->phy_id == 16) cvm_oct_mv88e61xx_setup_device(ifp); break; #endif default: break; } device_attach(priv->dev); return 0; }
/** * Per network device initialization * * @param dev Device to initialize * @return Zero on success */ int cvm_oct_common_init(struct ifnet *ifp) { static int count; char mac[6] = { octeon_bootinfo->mac_addr_base[0], octeon_bootinfo->mac_addr_base[1], octeon_bootinfo->mac_addr_base[2], octeon_bootinfo->mac_addr_base[3], octeon_bootinfo->mac_addr_base[4], octeon_bootinfo->mac_addr_base[5] + count}; cvm_oct_private_t *priv = (cvm_oct_private_t *)ifp->if_softc; /* Force the interface to use the POW send if always_use_pow was specified or it is in the pow send list */ if ((pow_send_group != -1) && (always_use_pow || strstr(pow_send_list, if_name(ifp)))) priv->queue = -1; ifp->if_mtu = ETHERMTU; count++; #if 0 ifp->get_stats = cvm_oct_common_get_stats; #ifdef CONFIG_NET_POLL_CONTROLLER ifp->poll_controller = cvm_oct_poll_controller; #endif #endif cvm_oct_mdio_setup_device(ifp); cvm_oct_common_set_mac_address(ifp, mac); cvm_oct_common_change_mtu(ifp, ifp->if_mtu); #if 0 /* Zero out stats for port so we won't mistakenly show counters from the bootloader */ memset(ifp->get_stats(ifp), 0, sizeof(struct ifnet_stats)); #endif device_attach(priv->dev); return 0; }
/** * Per network device initialization * * @param dev Device to initialize * @return Zero on success */ int cvm_oct_common_init(struct ifnet *ifp) { char mac[6] = { octeon_bootinfo->mac_addr_base[0], octeon_bootinfo->mac_addr_base[1], octeon_bootinfo->mac_addr_base[2], octeon_bootinfo->mac_addr_base[3], octeon_bootinfo->mac_addr_base[4], octeon_bootinfo->mac_addr_base[5] }; cvm_oct_private_t *priv = (cvm_oct_private_t *)ifp->if_softc; mac[5] += cvm_oct_mac_addr_offset++; ifp->if_mtu = ETHERMTU; cvm_oct_mdio_setup_device(ifp); cvm_oct_common_set_mac_address(ifp, mac); cvm_oct_common_change_mtu(ifp, ifp->if_mtu); /* * Do any last-minute board-specific initialization. */ switch (cvmx_sysinfo_get()->board_type) { #if defined(OCTEON_VENDOR_LANNER) case CVMX_BOARD_TYPE_CUST_LANNER_MR320: case CVMX_BOARD_TYPE_CUST_LANNER_MR321X: if (priv->phy_id == 16) cvm_oct_mv88e61xx_setup_device(ifp); break; #endif default: break; } device_attach(priv->dev); return 0; }
static int octe_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data) { cvm_oct_private_t *priv; struct mii_data *mii; struct ifreq *ifr; #ifdef INET struct ifaddr *ifa; #endif int error; priv = ifp->if_softc; ifr = (struct ifreq *)data; #ifdef INET ifa = (struct ifaddr *)data; #endif switch (cmd) { case SIOCSIFADDR: #ifdef INET /* * Avoid reinitialization unless it's necessary. */ if (ifa->ifa_addr->sa_family == AF_INET) { ifp->if_flags |= IFF_UP; if ((ifp->if_drv_flags & IFF_DRV_RUNNING) == 0) octe_init(priv); arp_ifinit(ifp, ifa); return (0); } #endif error = ether_ioctl(ifp, cmd, data); if (error != 0) return (error); return (0); case SIOCSIFFLAGS: if (ifp->if_flags == priv->if_flags) return (0); if ((ifp->if_flags & IFF_UP) != 0) { if ((ifp->if_drv_flags & IFF_DRV_RUNNING) == 0) octe_init(priv); } else { if ((ifp->if_drv_flags & IFF_DRV_RUNNING) != 0) octe_stop(priv); } priv->if_flags = ifp->if_flags; return (0); case SIOCSIFCAP: /* * Just change the capabilities in software, currently none * require reprogramming hardware, they just toggle whether we * make use of already-present facilities in software. */ ifp->if_capenable = ifr->ifr_reqcap; return (0); case SIOCSIFMTU: error = cvm_oct_common_change_mtu(ifp, ifr->ifr_mtu); if (error != 0) return (EINVAL); return (0); case SIOCSIFMEDIA: case SIOCGIFMEDIA: if (priv->miibus != NULL) { mii = device_get_softc(priv->miibus); error = ifmedia_ioctl(ifp, ifr, &mii->mii_media, cmd); if (error != 0) return (error); return (0); } error = ifmedia_ioctl(ifp, ifr, &priv->media, cmd); if (error != 0) return (error); return (0); default: error = ether_ioctl(ifp, cmd, data); if (error != 0) return (error); return (0); } }