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>