Date: Tue, 13 Jan 2015 08:32:42 +0000 (UTC) From: Gleb Smirnoff <glebius@FreeBSD.org> To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: svn commit: r277121 - projects/ifnet/sys/dev/mii Message-ID: <201501130832.t0D8WgoN062982@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: glebius Date: Tue Jan 13 08:32:41 2015 New Revision: 277121 URL: https://svnweb.freebsd.org/changeset/base/277121 Log: Make miibus(4) fully ifnet(9) agnostic, removing layering violation. This allows to mii_attach() in drivers prior to if_attach(), but on the other hand puts some extra work on drivers. Drivers now should: - Do mii_attach() before if_attach(). - Do baudrate management theirselves in miibus_statchg devmethod. - Do link state management theirselves in miibus_linkchg devmethod. Some PHYs require to obtain MTU of the interface. Instead of doing it via ifnet(9) layer, provide new miibus method miibus_readvar. Drivers that expect such PHYs must implement this method and return IF_MTU. Sponsored by: Nginx, Inc. Modified: projects/ifnet/sys/dev/mii/brgphy.c projects/ifnet/sys/dev/mii/mii.c projects/ifnet/sys/dev/mii/miibus_if.m projects/ifnet/sys/dev/mii/miivar.h projects/ifnet/sys/dev/mii/truephy.c Modified: projects/ifnet/sys/dev/mii/brgphy.c ============================================================================== --- projects/ifnet/sys/dev/mii/brgphy.c Tue Jan 13 08:27:43 2015 (r277120) +++ projects/ifnet/sys/dev/mii/brgphy.c Tue Jan 13 08:32:41 2015 (r277121) @@ -40,13 +40,14 @@ __FBSDID("$FreeBSD$"); #include <sys/param.h> #include <sys/systm.h> #include <sys/kernel.h> +#include <sys/lock.h> /* XXXGL: if_b[cg]ereg.h contamination */ +#include <sys/mutex.h> /* XXXGL: if_b[cg]ereg.h contamination */ #include <sys/module.h> #include <sys/socket.h> #include <sys/bus.h> #include <sys/taskqueue.h> #include <net/if.h> -#include <net/if_var.h> #include <net/ethernet.h> #include <net/if_media.h> @@ -55,7 +56,6 @@ __FBSDID("$FreeBSD$"); #include "miidevs.h" #include <dev/mii/brgphyreg.h> -#include <net/if_arp.h> #include <machine/bus.h> #include <dev/bge/if_bgereg.h> #include <dev/bce/if_bcereg.h> @@ -878,7 +878,7 @@ brgphy_reset(struct mii_softc *sc) { struct bge_softc *bge_sc = NULL; struct bce_softc *bce_sc = NULL; - if_t ifp; + u_int mtu; int i, val; /* @@ -928,7 +928,7 @@ brgphy_reset(struct mii_softc *sc) return; } - ifp = sc->mii_pdata->mii_ifp; + mtu = MIIBUS_READVAR(sc->mii_dev, IF_MTU); /* Find the driver associated with this PHY. */ if (mii_phy_mac_match(sc, "bge")) @@ -952,7 +952,7 @@ brgphy_reset(struct mii_softc *sc) brgphy_fixup_jitter_bug(sc); if (bge_sc->bge_flags & BGE_FLAG_JUMBO) - brgphy_jumbo_settings(sc, if_getmtu(ifp)); + brgphy_jumbo_settings(sc, mtu); if ((bge_sc->bge_phy_flags & BGE_PHY_NO_WIRESPEED) == 0) brgphy_ethernet_wirespeed(sc); @@ -1063,11 +1063,11 @@ brgphy_reset(struct mii_softc *sc) (BCE_CHIP_REV(bce_sc) == BCE_CHIP_REV_Bx)) brgphy_fixup_disable_early_dac(sc); - brgphy_jumbo_settings(sc, if_getmtu(ifp)); + brgphy_jumbo_settings(sc, mtu); brgphy_ethernet_wirespeed(sc); } else { brgphy_fixup_ber_bug(sc); - brgphy_jumbo_settings(sc, if_getmtu(ifp)); + brgphy_jumbo_settings(sc, mtu); brgphy_ethernet_wirespeed(sc); } } Modified: projects/ifnet/sys/dev/mii/mii.c ============================================================================== --- projects/ifnet/sys/dev/mii/mii.c Tue Jan 13 08:27:43 2015 (r277120) +++ projects/ifnet/sys/dev/mii/mii.c Tue Jan 13 08:32:41 2015 (r277121) @@ -47,7 +47,6 @@ __FBSDID("$FreeBSD$"); #include <sys/bus.h> #include <net/if.h> -#include <net/if_var.h> #include <net/if_media.h> #include <dev/mii/mii.h> @@ -69,6 +68,7 @@ static miibus_readreg_t miibus_readreg; static miibus_statchg_t miibus_statchg; static miibus_writereg_t miibus_writereg; static miibus_linkchg_t miibus_linkchg; +static miibus_readvar_t miibus_readvar; static miibus_mediainit_t miibus_mediainit; static unsigned char mii_bitreverse(unsigned char x); @@ -92,6 +92,7 @@ static device_method_t miibus_methods[] DEVMETHOD(miibus_writereg, miibus_writereg), DEVMETHOD(miibus_statchg, miibus_statchg), DEVMETHOD(miibus_linkchg, miibus_linkchg), + DEVMETHOD(miibus_readvar, miibus_readvar), DEVMETHOD(miibus_mediainit, miibus_mediainit), DEVMETHOD_END @@ -106,7 +107,6 @@ driver_t miibus_driver = { }; struct miibus_ivars { - if_t ifp; ifm_change_cb_t ifmedia_upd; ifm_stat_cb_t ifmedia_sts; u_int mii_flags; @@ -146,9 +146,6 @@ miibus_attach(device_t dev) ivars = device_get_ivars(dev); ifmedia_init(&mii->mii_media, IFM_IMASK, ivars->ifmedia_upd, ivars->ifmedia_sts); - mii->mii_ifp = ivars->ifp; - if_setcapabilitiesbit(mii->mii_ifp, IFCAP_LINKSTATE, 0); - if_setcapenablebit(mii->mii_ifp, IFCAP_LINKSTATE, 0); LIST_INIT(&mii->mii_phys); return (bus_generic_attach(dev)); @@ -162,7 +159,6 @@ miibus_detach(device_t dev) bus_generic_detach(dev); mii = device_get_softc(dev); ifmedia_removeall(&mii->mii_media); - mii->mii_ifp = NULL; return (0); } @@ -280,57 +276,42 @@ miibus_hinted_child(device_t dev, const ma->mii_capmask = val; } +/* + * The miibus just relays most devmethods to the parent. + */ static int miibus_readreg(device_t dev, int phy, int reg) { - device_t parent; - parent = device_get_parent(dev); - return (MIIBUS_READREG(parent, phy, reg)); + return (MIIBUS_READREG(device_get_parent(dev), phy, reg)); } static int miibus_writereg(device_t dev, int phy, int reg, int data) { - device_t parent; - parent = device_get_parent(dev); - return (MIIBUS_WRITEREG(parent, phy, reg, data)); + return (MIIBUS_WRITEREG(device_get_parent(dev), phy, reg, data)); } static void miibus_statchg(device_t dev) { - device_t parent; - struct mii_data *mii; - parent = device_get_parent(dev); - MIIBUS_STATCHG(parent); - - mii = device_get_softc(dev); - if_setbaudrate(mii->mii_ifp, ifmedia_baudrate(mii->mii_media_active)); + MIIBUS_STATCHG(device_get_parent(dev)); } static void miibus_linkchg(device_t dev) { - struct mii_data *mii; - device_t parent; - int link_state; - parent = device_get_parent(dev); - MIIBUS_LINKCHG(parent); + MIIBUS_LINKCHG(device_get_parent(dev)); +} - mii = device_get_softc(dev); +static uint64_t +miibus_readvar(device_t dev, int var) +{ - if (mii->mii_media_status & IFM_AVALID) { - if (mii->mii_media_status & IFM_ACTIVE) - link_state = LINK_STATE_UP; - else - link_state = LINK_STATE_DOWN; - } else - link_state = LINK_STATE_UNKNOWN; - if_link_state_change(mii->mii_ifp, link_state); + return (MIIBUS_READVAR(device_get_parent(dev), var)); } static void @@ -358,9 +339,8 @@ miibus_mediainit(device_t dev) * the PHYs to the network interface driver parent. */ int -mii_attach(device_t dev, device_t *miibus, if_t ifp, - ifm_change_cb_t ifmedia_upd, ifm_stat_cb_t ifmedia_sts, int capmask, - int phyloc, int offloc, int flags) +mii_attach(device_t dev, device_t *miibus, ifm_change_cb_t ifmedia_upd, + ifm_stat_cb_t ifmedia_sts, int capmask, int phyloc, int offloc, int flags) { struct miibus_ivars *ivars; struct mii_attach_args *args, ma; @@ -395,7 +375,6 @@ mii_attach(device_t dev, device_t *miibu ivars = malloc(sizeof(*ivars), M_DEVBUF, M_NOWAIT); if (ivars == NULL) return (ENOMEM); - ivars->ifp = ifp; ivars->ifmedia_upd = ifmedia_upd; ivars->ifmedia_sts = ifmedia_sts; ivars->mii_flags = flags; @@ -407,7 +386,7 @@ mii_attach(device_t dev, device_t *miibu device_set_ivars(*miibus, ivars); } else { ivars = device_get_ivars(*miibus); - if (ivars->ifp != ifp || ivars->ifmedia_upd != ifmedia_upd || + if (ivars->ifmedia_upd != ifmedia_upd || ivars->ifmedia_sts != ifmedia_sts || ivars->mii_flags != flags) { printf("%s: non-matching invariant\n", __func__); Modified: projects/ifnet/sys/dev/mii/miibus_if.m ============================================================================== --- projects/ifnet/sys/dev/mii/miibus_if.m Tue Jan 13 08:27:43 2015 (r277120) +++ projects/ifnet/sys/dev/mii/miibus_if.m Tue Jan 13 08:32:41 2015 (r277121) @@ -38,6 +38,14 @@ METHOD void linkchg { }; # +# Read software configuration data from device on MII bus. +# +METHOD uint64_t readvar { + device_t dev; + int var; +}; + +# # Notify bus that media has been set. # METHOD void mediainit { Modified: projects/ifnet/sys/dev/mii/miivar.h ============================================================================== --- projects/ifnet/sys/dev/mii/miivar.h Tue Jan 13 08:27:43 2015 (r277120) +++ projects/ifnet/sys/dev/mii/miivar.h Tue Jan 13 08:32:41 2015 (r277121) @@ -36,7 +36,6 @@ #define _DEV_MII_MIIVAR_H_ #include <sys/queue.h> -#include <net/if_var.h> /* XXX driver API temporary */ /* * Media Independent Interface data structure defintions @@ -51,7 +50,6 @@ struct mii_softc; */ struct mii_data { struct ifmedia mii_media; /* media information */ - if_t mii_ifp; /* pointer back to network interface */ /* * For network interfaces with multiple PHYs, a list of all @@ -233,8 +231,8 @@ MIIBUS_ACCESSOR(flags, FLAGS, u_int) extern devclass_t miibus_devclass; extern driver_t miibus_driver; -int mii_attach(device_t, device_t *, if_t, ifm_change_cb_t, - ifm_stat_cb_t, int, int, int, int); +int mii_attach(device_t, device_t *, ifm_change_cb_t, ifm_stat_cb_t, + int, int, int, int); void mii_down(struct mii_data *); int mii_mediachg(struct mii_data *); void mii_tick(struct mii_data *); Modified: projects/ifnet/sys/dev/mii/truephy.c ============================================================================== --- projects/ifnet/sys/dev/mii/truephy.c Tue Jan 13 08:27:43 2015 (r277120) +++ projects/ifnet/sys/dev/mii/truephy.c Tue Jan 13 08:32:41 2015 (r277121) @@ -44,11 +44,8 @@ #include <sys/bus.h> #include <net/if.h> -#include <net/if_var.h> #include <net/if_media.h> -#include <net/if_arp.h> #include <net/ethernet.h> -#include <net/if_vlan_var.h> #include <dev/mii/mii.h> #include <dev/mii/miivar.h> @@ -261,7 +258,7 @@ truephy_reset(struct mii_softc *sc) mii_phy_reset(sc); - if (TRUEPHY_FRAMELEN((if_getmtu(sc->mii_pdata->mii_ifp)) > 2048)) { + if (TRUEPHY_FRAMELEN((MIIBUS_READVAR(sc->mii_dev, IF_MTU)) > 2048)) { int conf; conf = PHY_READ(sc, TRUEPHY_CONF);
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201501130832.t0D8WgoN062982>