Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 26 Apr 2015 16:48:16 +0000 (UTC)
From:      Gleb Smirnoff <glebius@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-projects@freebsd.org
Subject:   svn commit: r282027 - projects/ifnet/sys/dev/rl
Message-ID:  <201504261648.t3QGmGT3031889@svn.freebsd.org>

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

Log:
  Convert rl(4) to new media and miibus KPI.
  
  Functional changes:
  o rl_miibus_statchg() now update baudrate and link state,
    so drver can declare IFCAP_LINKSTATE.
  
  Tested:		Realtek 8139
  Sponsored by:	Netflix
  Sponsored by:	Nginx, Inc.

Modified:
  projects/ifnet/sys/dev/rl/if_rl.c

Modified: projects/ifnet/sys/dev/rl/if_rl.c
==============================================================================
--- projects/ifnet/sys/dev/rl/if_rl.c	Sun Apr 26 16:44:59 2015	(r282026)
+++ projects/ifnet/sys/dev/rl/if_rl.c	Sun Apr 26 16:48:16 2015	(r282027)
@@ -181,7 +181,7 @@ static void rl_eeprom_getword(struct rl_
 static int rl_encap(struct rl_softc *, struct mbuf **);
 static int rl_list_tx_init(struct rl_softc *);
 static int rl_list_rx_init(struct rl_softc *);
-static int rl_ifmedia_upd(if_t);
+static int rl_ifmedia_upd(if_t, if_media_t);
 static void rl_ifmedia_sts(if_t, struct ifmediareq *);
 static int rl_ioctl(if_t, u_long, void *, struct thread *);
 static void rl_intr(void *);
@@ -260,6 +260,8 @@ static struct ifdriver rl_ifdrv = {
 	.ifdrv_ops = {
 		.ifop_ioctl = rl_ioctl,
 		.ifop_transmit = rl_transmit,
+		.ifop_media_change = rl_ifmedia_upd,
+		.ifop_media_status = rl_ifmedia_sts,
 #ifdef DEVICE_POLLING
 		.ifop_poll = rl_poll,
 #endif
@@ -512,6 +514,7 @@ rl_miibus_statchg(device_t dev)
 	 * Tx/Rx MACs for resolved speed, duplex and flow-control
 	 * parameters.
 	 */
+	if_media_status(ifp, mii->mii_media_active | mii->mii_media_status);
 }
 
 /*
@@ -649,10 +652,12 @@ rl_attach(device_t dev)
 		.ifat_drv = &rl_ifdrv,
 		.ifat_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST,
 		.ifat_capabilities = IFCAP_VLAN_MTU | IFCAP_LINKSTATE,
+		.ifat_mediamask = MII_MEDIA_MASK,
 	};
 	uint8_t			eaddr[ETHER_ADDR_LEN];
 	uint16_t		as[3];
 	struct rl_softc		*sc;
+	struct mii_data		*mii;
 	const struct rl_type	*t;
 	struct sysctl_ctx_list	*ctx;
 	struct sysctl_oid_list	*children;
@@ -801,12 +806,13 @@ rl_attach(device_t dev)
 	phy = MII_PHY_ANY;
 	if (sc->rl_type == RL_8139)
 		phy = RL_PHYAD_INTERNAL;
-	error = mii_attach(dev, &sc->rl_miibus, rl_ifmedia_upd,
-	    rl_ifmedia_sts, BMSR_DEFCAPMASK, phy, MII_OFFSET_ANY, 0);
+	error = mii_attach(dev, &sc->rl_miibus, BMSR_DEFCAPMASK, phy,
+	    MII_OFFSET_ANY, 0);
 	if (error != 0) {
 		device_printf(dev, "attaching PHYs failed\n");
 		goto fail;
 	}
+	mii = device_get_softc(sc->rl_miibus);
 	error = bus_setup_intr(dev, sc->rl_irq[0], INTR_TYPE_NET | INTR_MPSAFE,
 	    NULL, rl_intr, sc, &sc->rl_intrhand[0]);
 	if (error) {
@@ -817,6 +823,8 @@ rl_attach(device_t dev)
 	ifat.ifat_softc = sc;
 	ifat.ifat_dunit = device_get_unit(dev);
 	ifat.ifat_lla = eaddr;
+	ifat.ifat_mediae = mii->mii_mediae;
+	ifat.ifat_media = mii->mii_media;
 	/* Check WOL for RTL8139B or newer controllers. */
 	if (sc->rl_type == RL_8139 &&
 	    pci_find_cap(sc->rl_dev, PCIY_PMG, &pmc) == 0) {
@@ -1642,8 +1650,6 @@ rl_init(struct rl_softc *sc)
 
 	RL_LOCK_ASSERT(sc);
 
-	mii = device_get_softc(sc->rl_miibus);
-
 	if ((sc->rl_flags & RL_FLAG_RUNNING) != 0)
 		return;
 
@@ -1716,7 +1722,9 @@ rl_init(struct rl_softc *sc)
 	CSR_WRITE_1(sc, RL_COMMAND, RL_CMD_TX_ENB|RL_CMD_RX_ENB);
 
 	sc->rl_flags &= ~RL_FLAG_LINK;
-	mii_mediachg(mii);
+
+	mii = device_get_softc(sc->rl_miibus);
+	mii_mediachg(mii, mii->mii_media);
 
 	CSR_WRITE_1(sc, sc->rl_cfg1, RL_CFG1_DRVLOAD|RL_CFG1_FULLDUPLEX);
 
@@ -1729,7 +1737,7 @@ rl_init(struct rl_softc *sc)
  * Set media options.
  */
 static int
-rl_ifmedia_upd(if_t ifp)
+rl_ifmedia_upd(if_t ifp, if_media_t media)
 {
 	struct rl_softc		*sc = if_getsoftc(ifp, IF_DRIVER_SOFTC);
 	struct mii_data		*mii;
@@ -1737,7 +1745,7 @@ rl_ifmedia_upd(if_t ifp)
 	mii = device_get_softc(sc->rl_miibus);
 
 	RL_LOCK(sc);
-	mii_mediachg(mii);
+	mii_mediachg(mii, media);
 	RL_UNLOCK(sc);
 
 	return (0);
@@ -1765,7 +1773,6 @@ static int
 rl_ioctl(if_t ifp, u_long command, void *data, struct thread *td)
 {
 	struct ifreq		*ifr = data;
-	struct mii_data		*mii;
 	struct rl_softc		*sc;
 	uint32_t		oflags;
 	int			error = 0;
@@ -1793,11 +1800,6 @@ rl_ioctl(if_t ifp, u_long command, void 
 		rl_rxfilter(sc);
 		RL_UNLOCK(sc);
 		break;
-	case SIOCGIFMEDIA:
-	case SIOCSIFMEDIA:
-		mii = device_get_softc(sc->rl_miibus);
-		error = ifmedia_ioctl(ifp, ifr, &mii->mii_media, command);
-		break;
 	case SIOCSIFCAP:
 		RL_LOCK(sc);
 #ifdef DEVICE_POLLING



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