Date: Sun, 26 Apr 2015 21:16:39 +0000 (UTC) From: Gleb Smirnoff <glebius@FreeBSD.org> To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: svn commit: r282037 - projects/ifnet/sys/dev/fxp Message-ID: <201504262116.t3QLGdPE068652@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: glebius Date: Sun Apr 26 21:16:38 2015 New Revision: 282037 URL: https://svnweb.freebsd.org/changeset/base/282037 Log: iConvert fxp(4) to new media and miibus KPI. Functional changes: o Move "Clear wakeup events" block down below if_attach(). This is actually bugfix after initial conversion to projects/ifnet. o In fxp_init() first set FXP_FLAG_RUNNING, then call mii_mediachg(), otherwise fxp_miibus_statchg() would return at beginning. o In fxp_miibus_statchg() don't return on !IFM_AVALID media, and we won't call if_media_status(). Tested: Intel 82557 (phy DP83840, nsphy) Tested: Intel 82558 (phy i82555, inphy) Tested: Intel 82558B (phy i82555, inphy) Tested: Intel 82559 (phy i82555, inphy) Sponsored by: Netflix Sponsored by: Nginx, Inc. Modified: projects/ifnet/sys/dev/fxp/if_fxp.c projects/ifnet/sys/dev/fxp/if_fxpvar.h projects/ifnet/sys/dev/fxp/inphy.c Modified: projects/ifnet/sys/dev/fxp/if_fxp.c ============================================================================== --- projects/ifnet/sys/dev/fxp/if_fxp.c Sun Apr 26 21:09:05 2015 (r282036) +++ projects/ifnet/sys/dev/fxp/if_fxp.c Sun Apr 26 21:16:38 2015 (r282037) @@ -250,12 +250,8 @@ static void fxp_read_eeprom(struct fxp_ int offset, int words); static void fxp_write_eeprom(struct fxp_softc *sc, u_short *data, int offset, int words); -static int fxp_ifmedia_upd(if_t ifp); -static void fxp_ifmedia_sts(if_t ifp, - struct ifmediareq *ifmr); -static int fxp_serial_ifmedia_upd(if_t ifp); -static void fxp_serial_ifmedia_sts(if_t ifp, - struct ifmediareq *ifmr); +static int fxp_ifmedia_upd(if_t, if_media_t); +static void fxp_ifmedia_sts(if_t, struct ifmediareq *); static int fxp_miibus_readreg(device_t dev, int phy, int reg); static int fxp_miibus_writereg(device_t dev, int phy, int reg, int value); @@ -314,10 +310,14 @@ static struct resource_spec fxp_res_spec { -1, 0 } }; +static if_media_t fxp_serial_mediae[] = { IFM_ETHER | IFM_MANUAL, 0 }; + static struct ifdriver fxp_ifdrv = { .ifdrv_ops = { .ifop_ioctl = fxp_ioctl, .ifop_transmit = fxp_transmit, + .ifop_media_change = fxp_ifmedia_upd, + .ifop_media_status = fxp_ifmedia_sts, #ifdef DEVICE_POLLING .ifop_poll = fxp_poll, #endif @@ -454,8 +454,6 @@ fxp_attach(device_t dev) mtx_init(&sc->sc_mtx, device_get_nameunit(dev), MTX_NETWORK_LOCK, MTX_DEF); callout_init_mtx(&sc->stat_ch, &sc->sc_mtx, 0); - ifmedia_init(&sc->sc_media, 0, fxp_serial_ifmedia_upd, - fxp_serial_ifmedia_sts); /* * Enable bus mastering. @@ -826,22 +824,28 @@ fxp_attach(device_t dev) * is configured. This is, in essence, manual configuration. */ if (sc->flags & FXP_FLAG_SERIAL_MEDIA) { - ifmedia_add(&sc->sc_media, IFM_ETHER|IFM_MANUAL, 0, NULL); - ifmedia_set(&sc->sc_media, IFM_ETHER|IFM_MANUAL); + ifat.ifat_mediae = fxp_serial_mediae; + ifat.ifat_media = IFM_ETHER | IFM_MANUAL; } else { + struct mii_data *mii; + /* * i82557 wedge when isolating all of their PHYs. */ flags = MIIF_NOISOLATE; if (sc->revision >= FXP_REV_82558_A4) flags |= MIIF_DOPAUSE; - error = mii_attach(dev, &sc->miibus, fxp_ifmedia_upd, - fxp_ifmedia_sts, BMSR_DEFCAPMASK, MII_PHY_ANY, - MII_OFFSET_ANY, flags); + error = mii_attach(dev, &sc->miibus, BMSR_DEFCAPMASK, + MII_PHY_ANY, MII_OFFSET_ANY, flags); if (error != 0) { device_printf(dev, "attaching PHYs failed\n"); goto fail; } + + mii = device_get_softc(sc->miibus); + ifat.ifat_mediae = mii->mii_mediae; + ifat.ifat_media = mii->mii_media; + ifat.ifat_mediamask = MII_MEDIA_MASK; ifat.ifat_capabilities |= IFCAP_LINKSTATE; } @@ -856,19 +860,6 @@ fxp_attach(device_t dev) } /* - * Configure hardware to reject magic frames otherwise - * system will hang on recipt of magic frames. - */ - if ((sc->flags & FXP_FLAG_WOLCAP) != 0) { - FXP_LOCK(sc); - /* Clear wakeup events. */ - CSR_WRITE_1(sc, FXP_CSR_PMDR, CSR_READ_1(sc, FXP_CSR_PMDR)); - fxp_init(sc, 0); - fxp_stop(sc); - FXP_UNLOCK(sc); - } - - /* * Attach the interface. */ ifat.ifat_softc = sc; @@ -893,6 +884,19 @@ fxp_attach(device_t dev) sc->if_flags = ifat.ifat_flags; sc->ifp = if_attach(&ifat); + /* + * Configure hardware to reject magic frames otherwise + * system will hang on recipt of magic frames. + */ + if ((sc->flags & FXP_FLAG_WOLCAP) != 0) { + FXP_LOCK(sc); + /* Clear wakeup events. */ + CSR_WRITE_1(sc, FXP_CSR_PMDR, CSR_READ_1(sc, FXP_CSR_PMDR)); + fxp_init(sc, 0); + fxp_stop(sc); + FXP_UNLOCK(sc); + } + return (0); fail: @@ -917,7 +921,6 @@ fxp_release(struct fxp_softc *sc) if (sc->miibus) device_delete_child(sc->dev, sc->miibus); bus_generic_detach(sc->dev); - ifmedia_removeall(&sc->sc_media); if (sc->fxp_desc.cbl_list) { bus_dmamap_unload(sc->cbl_tag, sc->cbl_map); bus_dmamem_free(sc->cbl_tag, sc->fxp_desc.cbl_list, @@ -2488,11 +2491,15 @@ fxp_init(struct fxp_softc *sc, int setme CSR_WRITE_4(sc, FXP_CSR_SCB_GENERAL, sc->fxp_desc.rx_head->rx_addr); fxp_scb_cmd(sc, FXP_SCB_COMMAND_RU_START); - if (sc->miibus != NULL && setmedia != 0) - mii_mediachg(device_get_softc(sc->miibus)); - sc->flags |= FXP_FLAG_RUNNING; + if (sc->miibus != NULL && setmedia != 0) { + struct mii_data *mii; + + mii = device_get_softc(sc->miibus); + mii_mediachg(mii, mii->mii_media); + } + /* * Enable interrupts. */ @@ -2513,35 +2520,24 @@ fxp_init(struct fxp_softc *sc, int setme callout_reset(&sc->stat_ch, hz, fxp_tick, sc); } -static int -fxp_serial_ifmedia_upd(if_t ifp) -{ - - return (0); -} - -static void -fxp_serial_ifmedia_sts(if_t ifp, struct ifmediareq *ifmr) -{ - - ifmr->ifm_active = IFM_ETHER|IFM_MANUAL; -} - /* * Change media according to request. */ static int -fxp_ifmedia_upd(if_t ifp) +fxp_ifmedia_upd(if_t ifp, if_media_t media) { struct fxp_softc *sc = if_getsoftc(ifp, IF_DRIVER_SOFTC); struct mii_data *mii; - struct mii_softc *miisc; + struct mii_softc *miisc; + + if (sc->flags & FXP_FLAG_SERIAL_MEDIA) + return (0); mii = device_get_softc(sc->miibus); FXP_LOCK(sc); LIST_FOREACH(miisc, &mii->mii_phys, mii_list) - PHY_RESET(miisc); - mii_mediachg(mii); + PHY_RESET(miisc, media); + mii_mediachg(mii, media); FXP_UNLOCK(sc); return (0); } @@ -2555,6 +2551,11 @@ fxp_ifmedia_sts(if_t ifp, struct ifmedia struct fxp_softc *sc = if_getsoftc(ifp, IF_DRIVER_SOFTC); struct mii_data *mii; + if (sc->flags & FXP_FLAG_SERIAL_MEDIA) { + ifmr->ifm_active = IFM_ETHER|IFM_MANUAL; + return; + } + mii = device_get_softc(sc->miibus); FXP_LOCK(sc); mii_pollstat(mii); @@ -2746,9 +2747,7 @@ fxp_miibus_statchg(device_t dev) sc = device_get_softc(dev); mii = device_get_softc(sc->miibus); ifp = sc->ifp; - if (ifp == NULL || (sc->flags & FXP_FLAG_RUNNING) == 0 || - (mii->mii_media_status & (IFM_AVALID | IFM_ACTIVE)) != - (IFM_AVALID | IFM_ACTIVE)) + if (ifp == NULL || (sc->flags & FXP_FLAG_RUNNING) == 0) return; if (IFM_SUBTYPE(mii->mii_media_active) == IFM_10_T && @@ -2760,10 +2759,11 @@ fxp_miibus_statchg(device_t dev) * Call fxp_init() in order to adjust the flow control settings. * Note that the 82557 doesn't support hardware flow control. */ - if (sc->revision == FXP_REV_82557) - return; - sc->flags &= ~FXP_FLAG_RUNNING; - fxp_init(sc, 0); + if (sc->revision != FXP_REV_82557) { + sc->flags &= ~FXP_FLAG_RUNNING; + fxp_init(sc, 0); + } + if_media_status(ifp, mii->mii_media_active, mii->mii_media_status); } static int @@ -2771,7 +2771,6 @@ fxp_ioctl(if_t ifp, u_long command, void { struct fxp_softc *sc = if_getsoftc(ifp, IF_DRIVER_SOFTC); struct ifreq *ifr = data; - struct mii_data *mii; int oflags, flag, mask, error = 0, reinit; switch (command) { @@ -2808,17 +2807,6 @@ fxp_ioctl(if_t ifp, u_long command, void FXP_UNLOCK(sc); break; - case SIOCSIFMEDIA: - case SIOCGIFMEDIA: - if (sc->miibus != NULL) { - mii = device_get_softc(sc->miibus); - error = ifmedia_ioctl(ifp, ifr, - &mii->mii_media, command); - } else { - error = ifmedia_ioctl(ifp, ifr, &sc->sc_media, command); - } - break; - case SIOCSIFCAP: reinit = 0; mask = ifr->ifr_reqcap ^ ifr->ifr_curcap; Modified: projects/ifnet/sys/dev/fxp/if_fxpvar.h ============================================================================== --- projects/ifnet/sys/dev/fxp/if_fxpvar.h Sun Apr 26 21:09:05 2015 (r282036) +++ projects/ifnet/sys/dev/fxp/if_fxpvar.h Sun Apr 26 21:16:38 2015 (r282037) @@ -206,7 +206,6 @@ struct fxp_softc { int watchdog_timer; /* seconds until chip reset */ struct fxp_cb_mcs *mcsp; /* Pointer to mcast setup descriptor */ uint32_t mcs_addr; /* DMA address of the multicast cmd */ - struct ifmedia sc_media; /* media information */ device_t miibus; device_t dev; int tunable_int_delay; /* interrupt delay value for ucode */ Modified: projects/ifnet/sys/dev/fxp/inphy.c ============================================================================== --- projects/ifnet/sys/dev/fxp/inphy.c Sun Apr 26 21:09:05 2015 (r282036) +++ projects/ifnet/sys/dev/fxp/inphy.c Sun Apr 26 21:16:38 2015 (r282037) @@ -42,7 +42,6 @@ __FBSDID("$FreeBSD$"); #include <sys/socket.h> #include <sys/bus.h> -#include <net/if.h> #include <net/if_media.h> #include <dev/mii/mii.h> @@ -75,9 +74,10 @@ static driver_t inphy_driver = { DRIVER_MODULE(inphy, miibus, inphy_driver, inphy_devclass, 0, 0); -static int inphy_service(struct mii_softc *, struct mii_data *, int); -static void inphy_status(struct mii_softc *); -static void inphy_reset(struct mii_softc *); +static int inphy_service(struct mii_softc *, struct mii_data *, + mii_cmd_t, if_media_t); +static void inphy_status(struct mii_softc *, if_media_t); +static void inphy_reset(struct mii_softc *, if_media_t); static const struct mii_phydesc inphys[] = { MII_PHY_DESC(xxINTEL, I82553), @@ -110,7 +110,8 @@ inphy_attach(device_t dev) } static int -inphy_service(struct mii_softc *sc, struct mii_data *mii, int cmd) +inphy_service(struct mii_softc *sc, struct mii_data *mii, mii_cmd_t cmd, + if_media_t media) { switch (cmd) { @@ -118,7 +119,7 @@ inphy_service(struct mii_softc *sc, stru break; case MII_MEDIACHG: - mii_phy_setmedia(sc); + mii_phy_setmedia(sc, media); break; case MII_TICK: @@ -128,7 +129,7 @@ inphy_service(struct mii_softc *sc, stru } /* Update the media status. */ - PHY_STATUS(sc); + PHY_STATUS(sc, media); /* Callback if something changed. */ mii_phy_update(sc, cmd); @@ -136,10 +137,9 @@ inphy_service(struct mii_softc *sc, stru } static void -inphy_status(struct mii_softc *sc) +inphy_status(struct mii_softc *sc, if_media_t media) { struct mii_data *mii = sc->mii_pdata; - struct ifmedia_entry *ife = mii->mii_media.ifm_cur; int bmsr, bmcr, scr; mii->mii_media_status = IFM_AVALID; @@ -176,14 +176,14 @@ inphy_status(struct mii_softc *sc) else mii->mii_media_active |= IFM_HDX; } else - mii->mii_media_active = ife->ifm_media; + mii->mii_media_active = media; } static void -inphy_reset(struct mii_softc *sc) +inphy_reset(struct mii_softc *sc, if_media_t media) { - mii_phy_reset(sc); + mii_phy_reset(sc, media); /* Ensure Bay flow control is disabled. */ PHY_WRITE(sc, MII_INPHY_SCR,
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201504262116.t3QLGdPE068652>