Skip site navigation (1)Skip section navigation (2)
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>