Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 26 Apr 2015 17:57:28 +0000 (UTC)
From:      Gleb Smirnoff <glebius@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-projects@freebsd.org
Subject:   svn commit: r282035 - projects/ifnet/sys/dev/bge
Message-ID:  <201504261757.t3QHvSpJ069481@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: glebius
Date: Sun Apr 26 17:57:28 2015
New Revision: 282035
URL: https://svnweb.freebsd.org/changeset/base/282035

Log:
  Convert bge(4) to new media and miibus KPI.
  
  Tested: Broadcom NetXtreme Gigabit Ethernet Controller, ASIC rev. 0x001002
  Tested: Broadcom Gigabit Ethernet Controller, ASIC rev. 0x007102
  Tested: Broadcom NetXtreme Gigabit Ethernet Controller, ASIC rev. 0x000105
  Sponsored by:	Netflix
  Sponsored by:	Nginx, Inc.

Modified:
  projects/ifnet/sys/dev/bge/if_bge.c
  projects/ifnet/sys/dev/bge/if_bgereg.h

Modified: projects/ifnet/sys/dev/bge/if_bge.c
==============================================================================
--- projects/ifnet/sys/dev/bge/if_bge.c	Sun Apr 26 17:48:15 2015	(r282034)
+++ projects/ifnet/sys/dev/bge/if_bge.c	Sun Apr 26 17:57:28 2015	(r282035)
@@ -424,8 +424,8 @@ static void bge_stop_block(struct bge_so
 static void bge_stop(struct bge_softc *);
 static void bge_watchdog(struct bge_softc *);
 static int bge_shutdown(device_t);
-static int bge_ifmedia_upd_locked(if_t);
-static int bge_ifmedia_upd(if_t);
+static int bge_ifmedia_upd_locked(if_t, if_media_t);
+static int bge_ifmedia_upd(if_t, if_media_t);
 static void bge_ifmedia_sts(if_t, struct ifmediareq *);
 static uint64_t bge_get_counter(if_t, ift_counter);
 
@@ -531,11 +531,20 @@ static driver_t bge_driver = {
 	sizeof(struct bge_softc)
 };
 
+static if_media_t bge_tbi_mediae[] = {
+	IFM_ETHER | IFM_1000_SX,
+	IFM_ETHER | IFM_1000_SX | IFM_FDX,
+	IFM_ETHER | IFM_AUTO,
+	0
+};
+
 static struct ifdriver bge_ifdrv = {
 	.ifdrv_ops = {
 		.ifop_ioctl = bge_ioctl,
 		.ifop_transmit = bge_transmit,
 		.ifop_get_counter = bge_get_counter,
+		.ifop_media_change = bge_ifmedia_upd,
+		.ifop_media_status = bge_ifmedia_sts,
 #ifdef DEVICE_POLLING
 		.ifop_poll = bge_poll,
 #endif
@@ -1281,12 +1290,9 @@ bge_miibus_statchg(device_t dev)
 	} else
 		sc->bge_link = 0;
 
-        if (sc->bge_ifp != NULL) { 
-		if_setbaudrate(sc->bge_ifp,
-		    ifmedia_baudrate(mii->mii_media_active));
-		if_link_state_change(sc->bge_ifp,
-		    ifmedia_link_state(mii->mii_media_status));
-        }
+	if (sc->bge_ifp != NULL)
+        	if_media_status(sc->bge_ifp,
+		    mii->mii_media_active | mii->mii_media_status);
 
 	if (sc->bge_link == 0)
 		return;
@@ -3826,15 +3832,11 @@ bge_attach(device_t dev)
 		sc->bge_phy_flags |= BGE_PHY_NO_WIRESPEED;
 
 	if (sc->bge_flags & BGE_FLAG_TBI) {
-		ifmedia_init(&sc->bge_ifmedia, IFM_IMASK, bge_ifmedia_upd,
-		    bge_ifmedia_sts);
-		ifmedia_add(&sc->bge_ifmedia, IFM_ETHER | IFM_1000_SX, 0, NULL);
-		ifmedia_add(&sc->bge_ifmedia, IFM_ETHER | IFM_1000_SX | IFM_FDX,
-		    0, NULL);
-		ifmedia_add(&sc->bge_ifmedia, IFM_ETHER | IFM_AUTO, 0, NULL);
-		ifmedia_set(&sc->bge_ifmedia, IFM_ETHER | IFM_AUTO);
-		sc->bge_ifmedia.ifm_media = sc->bge_ifmedia.ifm_cur->ifm_media;
+		ifat.ifat_mediae = bge_tbi_mediae;
+		ifat.ifat_media = IFM_ETHER | IFM_AUTO;
 	} else {
+		 struct mii_data *mii;
+
 		/*
 		 * Do transceiver setup and tell the firmware the
 		 * driver is down so we can try to get access the
@@ -3847,9 +3849,8 @@ bge_attach(device_t dev)
 again:
 		bge_asf_driver_up(sc);
 
-		error = mii_attach(dev, &sc->bge_miibus, bge_ifmedia_upd,
-		    bge_ifmedia_sts, capmask, sc->bge_phy_addr, 
-		    MII_OFFSET_ANY, MIIF_DOPAUSE);
+		error = mii_attach(dev, &sc->bge_miibus, capmask,
+		    sc->bge_phy_addr, MII_OFFSET_ANY, MIIF_DOPAUSE);
 		if (error != 0) {
 			if (trys++ < 4) {
 				device_printf(sc->bge_dev, "Try again\n");
@@ -3866,6 +3867,11 @@ again:
 		 */
 		if (sc->bge_asf_mode & ASF_STACKUP)
 			BGE_SETBIT(sc, BGE_MODE_CTL, BGE_MODECTL_STACKUP);
+
+		mii = device_get_softc(sc->bge_miibus);
+		ifat.ifat_mediae = mii->mii_mediae;
+		ifat.ifat_media = mii->mii_media;
+		ifat.ifat_mediamask = MII_MEDIA_MASK;
 		ifat.ifat_capabilities |= IFCAP_LINKSTATE;
 	}
 
@@ -3964,9 +3970,7 @@ bge_detach(device_t dev)
 	if (sc->bge_tq)
 		taskqueue_drain(sc->bge_tq, &sc->bge_intr_task);
 
-	if (sc->bge_flags & BGE_FLAG_TBI)
-		ifmedia_removeall(&sc->bge_ifmedia);
-	else if (sc->bge_miibus != NULL) {
+	if (sc->bge_miibus != NULL) {
 		bus_generic_detach(dev);
 		device_delete_child(dev, sc->bge_miibus);
 	}
@@ -5570,7 +5574,7 @@ bge_init(struct bge_softc *sc)
 
 	sc->bge_flags |= BGE_FLAG_RUNNING;
 
-	bge_ifmedia_upd_locked(ifp);
+	bge_ifmedia_upd_locked(ifp, IFM_ETHER | IFM_AUTO);
 
 	callout_reset(&sc->bge_stat_ch, hz, bge_tick, sc);
 }
@@ -5579,35 +5583,32 @@ bge_init(struct bge_softc *sc)
  * Set media options.
  */
 static int
-bge_ifmedia_upd(if_t ifp)
+bge_ifmedia_upd(if_t ifp, if_media_t media)
 {
 	struct bge_softc *sc = if_getsoftc(ifp, IF_DRIVER_SOFTC);
 	int res;
 
 	BGE_LOCK(sc);
-	res = bge_ifmedia_upd_locked(ifp);
+	res = bge_ifmedia_upd_locked(ifp, media);
 	BGE_UNLOCK(sc);
 
 	return (res);
 }
 
 static int
-bge_ifmedia_upd_locked(if_t ifp)
+bge_ifmedia_upd_locked(if_t ifp, if_media_t media)
 {
 	struct bge_softc *sc = if_getsoftc(ifp, IF_DRIVER_SOFTC);
 	struct mii_data *mii;
 	struct mii_softc *miisc;
-	struct ifmedia *ifm;
 
 	BGE_LOCK_ASSERT(sc);
 
-	ifm = &sc->bge_ifmedia;
-
 	/* If this is a 1000baseX NIC, enable the TBI port. */
 	if (sc->bge_flags & BGE_FLAG_TBI) {
-		if (IFM_TYPE(ifm->ifm_media) != IFM_ETHER)
+		if (IFM_TYPE(media) != IFM_ETHER)
 			return (EINVAL);
-		switch(IFM_SUBTYPE(ifm->ifm_media)) {
+		switch(IFM_SUBTYPE(media)) {
 		case IFM_AUTO:
 			/*
 			 * The BCM5704 ASIC appears to have a special
@@ -5631,7 +5632,7 @@ bge_ifmedia_upd_locked(if_t ifp)
 			}
 			break;
 		case IFM_1000_SX:
-			if ((ifm->ifm_media & IFM_GMASK) == IFM_FDX) {
+			if ((media & IFM_GMASK) == IFM_FDX) {
 				BGE_CLRBIT(sc, BGE_MAC_MODE,
 				    BGE_MACMODE_HALF_DUPLEX);
 			} else {
@@ -5649,8 +5650,8 @@ bge_ifmedia_upd_locked(if_t ifp)
 	sc->bge_link_evt++;
 	mii = device_get_softc(sc->bge_miibus);
 	LIST_FOREACH(miisc, &mii->mii_phys, mii_list)
-		PHY_RESET(miisc);
-	mii_mediachg(mii);
+		PHY_RESET(miisc, media);
+	mii_mediachg(mii, media);
 
 	/*
 	 * Force an interrupt so that we will call bge_link_upd
@@ -5721,7 +5722,6 @@ bge_ioctl(if_t ifp, u_long command, void
 {
 	struct bge_softc *sc = if_getsoftc(ifp, IF_DRIVER_SOFTC);
 	struct ifreq *ifr = (struct ifreq *) data;
-	struct mii_data *mii;
 	int oflags, mask, error = 0;
 
 	switch (command) {
@@ -5778,17 +5778,6 @@ bge_ioctl(if_t ifp, u_long command, void
 			error = 0;
 		}
 		break;
-	case SIOCSIFMEDIA:
-	case SIOCGIFMEDIA:
-		if (sc->bge_flags & BGE_FLAG_TBI) {
-			error = ifmedia_ioctl(ifp, ifr,
-			    &sc->bge_ifmedia, command);
-		} else {
-			mii = device_get_softc(sc->bge_miibus);
-			error = ifmedia_ioctl(ifp, ifr,
-			    &mii->mii_media, command);
-		}
-		break;
 	case SIOCSIFCAP:
 		mask = ifr->ifr_reqcap ^ ifr->ifr_curcap;
 #ifdef DEVICE_POLLING

Modified: projects/ifnet/sys/dev/bge/if_bgereg.h
==============================================================================
--- projects/ifnet/sys/dev/bge/if_bgereg.h	Sun Apr 26 17:48:15 2015	(r282034)
+++ projects/ifnet/sys/dev/bge/if_bgereg.h	Sun Apr 26 17:57:28 2015	(r282035)
@@ -2961,7 +2961,6 @@ struct bge_softc {
 	struct resource		*bge_irq;
 	struct resource		*bge_res;	/* MAC mapped I/O */
 	struct resource		*bge_res2;	/* APE mapped I/O */
-	struct ifmedia		bge_ifmedia;	/* TBI media info */
 	int			bge_expcap;
 	int			bge_expmrq;
 	int			bge_msicap;



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201504261757.t3QHvSpJ069481>