int octeon_eth_init(struct ifnet *ifp) { struct octeon_eth_softc *sc = ifp->if_softc; /* XXX don't disable commonly used parts!!! XXX */ if (sc->sc_init_flag == 0) { /* Cancel any pending I/O. */ octeon_eth_stop(ifp, 0); /* Initialize the device */ octeon_eth_configure(sc); cn30xxpko_enable(sc->sc_pko); cn30xxipd_enable(sc->sc_ipd); sc->sc_init_flag = 1; } else { cn30xxgmx_port_enable(sc->sc_gmx_port, 1); } octeon_eth_mediachange(ifp); cn30xxgmx_set_filter(sc->sc_gmx_port); timeout_add_sec(&sc->sc_tick_misc_ch, 1); timeout_add_sec(&sc->sc_tick_free_ch, 1); SET(ifp->if_flags, IFF_RUNNING); ifq_clr_oactive(&ifp->if_snd); return 0; }
void octeon_eth_mii_statchg(struct device *self) { struct octeon_eth_softc *sc = (struct octeon_eth_softc *)self; struct ifnet *ifp = &sc->sc_arpcom.ac_if; cn30xxpko_port_enable(sc->sc_pko, 0); cn30xxgmx_port_enable(sc->sc_gmx_port, 0); octeon_eth_reset(sc); if (ISSET(ifp->if_flags, IFF_RUNNING)) cn30xxgmx_set_filter(sc->sc_gmx_port); cn30xxpko_port_enable(sc->sc_pko, 1); cn30xxgmx_port_enable(sc->sc_gmx_port, 1); }
int octeon_eth_configure(struct octeon_eth_softc *sc) { cn30xxgmx_port_enable(sc->sc_gmx_port, 0); octeon_eth_reset(sc); octeon_eth_configure_common(sc); cn30xxpko_port_config(sc->sc_pko); cn30xxpko_port_enable(sc->sc_pko, 1); cn30xxpip_port_config(sc->sc_pip); cn30xxgmx_tx_stats_rd_clr(sc->sc_gmx_port, 1); cn30xxgmx_rx_stats_rd_clr(sc->sc_gmx_port, 1); cn30xxgmx_port_enable(sc->sc_gmx_port, 1); return 0; }
int octeon_eth_stop(struct ifnet *ifp, int disable) { struct octeon_eth_softc *sc = ifp->if_softc; timeout_del(&sc->sc_tick_misc_ch); timeout_del(&sc->sc_tick_free_ch); timeout_del(&sc->sc_resume_ch); mii_down(&sc->sc_mii); cn30xxgmx_port_enable(sc->sc_gmx_port, 0); /* Mark the interface as down and cancel the watchdog timer. */ CLR(ifp->if_flags, IFF_RUNNING | IFF_OACTIVE); ifp->if_timer = 0; return 0; }
int octeon_eth_stop(struct ifnet *ifp, int disable) { struct octeon_eth_softc *sc = ifp->if_softc; timeout_del(&sc->sc_tick_misc_ch); timeout_del(&sc->sc_tick_free_ch); mii_down(&sc->sc_mii); cn30xxgmx_port_enable(sc->sc_gmx_port, 0); /* Mark the interface as down and cancel the watchdog timer. */ CLR(ifp->if_flags, IFF_RUNNING); ifq_clr_oactive(&ifp->if_snd); ifp->if_timer = 0; intr_barrier(octeon_eth_pow_recv_ih); return 0; }