From owner-svn-src-projects@FreeBSD.ORG Sun Apr 26 16:48:17 2015 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [8.8.178.115]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTPS id 21468182; Sun, 26 Apr 2015 16:48:17 +0000 (UTC) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:1900:2254:2068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id 06EB91981; Sun, 26 Apr 2015 16:48:17 +0000 (UTC) Received: from svn.freebsd.org ([127.0.1.70]) by svn.freebsd.org (8.14.9/8.14.9) with ESMTP id t3QGmGCU031890; Sun, 26 Apr 2015 16:48:16 GMT (envelope-from glebius@FreeBSD.org) Received: (from glebius@localhost) by svn.freebsd.org (8.14.9/8.14.9/Submit) id t3QGmGT3031889; Sun, 26 Apr 2015 16:48:16 GMT (envelope-from glebius@FreeBSD.org) Message-Id: <201504261648.t3QGmGT3031889@svn.freebsd.org> X-Authentication-Warning: svn.freebsd.org: glebius set sender to glebius@FreeBSD.org using -f From: Gleb Smirnoff Date: Sun, 26 Apr 2015 16:48:16 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: svn commit: r282027 - projects/ifnet/sys/dev/rl X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 26 Apr 2015 16:48:17 -0000 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