From owner-svn-src-projects@FreeBSD.ORG Sun Apr 26 16:49:55 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 C970027D; Sun, 26 Apr 2015 16:49:55 +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 AA644198C; Sun, 26 Apr 2015 16:49:55 +0000 (UTC) Received: from svn.freebsd.org ([127.0.1.70]) by svn.freebsd.org (8.14.9/8.14.9) with ESMTP id t3QGntaN032142; Sun, 26 Apr 2015 16:49:55 GMT (envelope-from glebius@FreeBSD.org) Received: (from glebius@localhost) by svn.freebsd.org (8.14.9/8.14.9/Submit) id t3QGntV2032141; Sun, 26 Apr 2015 16:49:55 GMT (envelope-from glebius@FreeBSD.org) Message-Id: <201504261649.t3QGntV2032141@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:49:55 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: svn commit: r282028 - projects/ifnet/sys/dev/alc 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:49:55 -0000 Author: glebius Date: Sun Apr 26 16:49:54 2015 New Revision: 282028 URL: https://svnweb.freebsd.org/changeset/base/282028 Log: Convert alc(4) to new media and miibus KPI. Functional changes: o alc_miibus_statchg() now update baudrate and link state. Since change isn't tested on hardware, take conservative approach and don't declare IFCAP_LINKSTATE. Not tested. Sponsored by: Netflix Sponsored by: Nginx, Inc. Modified: projects/ifnet/sys/dev/alc/if_alc.c Modified: projects/ifnet/sys/dev/alc/if_alc.c ============================================================================== --- projects/ifnet/sys/dev/alc/if_alc.c Sun Apr 26 16:48:16 2015 (r282027) +++ projects/ifnet/sys/dev/alc/if_alc.c Sun Apr 26 16:49:54 2015 (r282028) @@ -162,8 +162,8 @@ static uint32_t alc_miidbg_readreg(struc static uint32_t alc_miidbg_writereg(struct alc_softc *, int, int); static uint32_t alc_miiext_readreg(struct alc_softc *, int, int); static uint32_t alc_miiext_writereg(struct alc_softc *, int, int, int); -static int alc_mediachange(if_t); -static int alc_mediachange_locked(struct alc_softc *); +static int alc_mediachange(if_t, if_media_t); +static int alc_mediachange_locked(struct alc_softc *, if_media_t); static void alc_mediastatus(if_t, struct ifmediareq *); static int alc_newbuf(struct alc_softc *, struct alc_rxdesc *); static void alc_osc_reset(struct alc_softc *); @@ -232,6 +232,8 @@ static struct ifdriver alc_ifdrv = { .ifdrv_ops = { .ifop_ioctl = alc_ioctl, .ifop_transmit = alc_transmit, + .ifop_media_change = alc_mediachange, + .ifop_media_status = alc_mediastatus, }, .ifdrv_name = "alc", .ifdrv_type = IFT_ETHER, @@ -439,6 +441,9 @@ alc_miibus_statchg(device_t dev) } alc_aspm(sc, 0, IFM_SUBTYPE(mii->mii_media_active)); alc_dsp_fixup(sc, IFM_SUBTYPE(mii->mii_media_active)); + if (sc->alc_ifp != NULL) + if_media_status(sc->alc_ifp, + mii->mii_media_active | mii->mii_media_status); } static uint32_t @@ -613,21 +618,21 @@ alc_mediastatus(if_t ifp, struct ifmedia } static int -alc_mediachange(if_t ifp) +alc_mediachange(if_t ifp, if_media_t media) { struct alc_softc *sc; int error; sc = if_getsoftc(ifp, IF_DRIVER_SOFTC); ALC_LOCK(sc); - error = alc_mediachange_locked(sc); + error = alc_mediachange_locked(sc, media); ALC_UNLOCK(sc); return (error); } static int -alc_mediachange_locked(struct alc_softc *sc) +alc_mediachange_locked(struct alc_softc *sc, if_media_t media) { struct mii_data *mii; struct mii_softc *miisc; @@ -637,8 +642,8 @@ alc_mediachange_locked(struct alc_softc mii = device_get_softc(sc->alc_miibus); LIST_FOREACH(miisc, &mii->mii_phys, mii_list) - PHY_RESET(miisc); - error = mii_mediachg(mii); + PHY_RESET(miisc, media); + error = mii_mediachg(mii, media); return (error); } @@ -1366,11 +1371,12 @@ alc_attach(device_t dev) .ifat_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST, .ifat_capabilities = IFCAP_TXCSUM | IFCAP_TSO4 | IFCAP_VLAN_MTU | IFCAP_VLAN_HWTAGGING | - IFCAP_VLAN_HWCSUM | IFCAP_VLAN_HWTSO | - IFCAP_LINKSTATE, + IFCAP_VLAN_HWCSUM | IFCAP_VLAN_HWTSO, .ifat_hwassist = ALC_CSUM_FEATURES | CSUM_TSO, + .ifat_mediamask = MII_MEDIA_MASK, }; struct alc_softc *sc; + struct mii_data *mii; int base, error, i, msic, msixc; uint16_t burst; @@ -1548,13 +1554,13 @@ alc_attach(device_t dev) alc_get_macaddr(sc); /* Set up MII bus. */ - error = mii_attach(dev, &sc->alc_miibus, alc_mediachange, - alc_mediastatus, BMSR_DEFCAPMASK, sc->alc_phyaddr, MII_OFFSET_ANY, - MIIF_DOPAUSE); + error = mii_attach(dev, &sc->alc_miibus, BMSR_DEFCAPMASK, + sc->alc_phyaddr, MII_OFFSET_ANY, MIIF_DOPAUSE); if (error != 0) { device_printf(dev, "attaching PHYs failed\n"); goto fail; } + mii = device_get_softc(sc->alc_miibus); /* Create local taskq. */ sc->alc_tq = taskqueue_create_fast("alc_taskq", M_WAITOK, @@ -1591,6 +1597,8 @@ alc_attach(device_t dev) ifat.ifat_softc = sc; ifat.ifat_dunit = device_get_unit(dev); ifat.ifat_lla = sc->alc_eaddr; + ifat.ifat_mediae = mii->mii_mediae; + ifat.ifat_media = mii->mii_media; if (pci_find_cap(dev, PCIY_PMG, &base) == 0) { ifat.ifat_capabilities |= IFCAP_WOL_MAGIC | IFCAP_WOL_MCAST; sc->alc_flags |= ALC_FLAG_PM; @@ -2972,7 +2980,6 @@ alc_ioctl(if_t ifp, u_long cmd, void *da { struct alc_softc *sc; struct ifreq *ifr; - struct mii_data *mii; uint32_t oflags; int error, mask; @@ -3020,11 +3027,6 @@ alc_ioctl(if_t ifp, u_long cmd, void *da alc_rxfilter(sc); ALC_UNLOCK(sc); break; - case SIOCSIFMEDIA: - case SIOCGIFMEDIA: - mii = device_get_softc(sc->alc_miibus); - error = ifmedia_ioctl(ifp, ifr, &mii->mii_media, cmd); - break; case SIOCSIFCAP: ALC_LOCK(sc); mask = ifr->ifr_reqcap ^ ifr->ifr_curcap; @@ -3815,8 +3817,6 @@ alc_init(struct alc_softc *sc) ALC_LOCK_ASSERT(sc); - mii = device_get_softc(sc->alc_miibus); - if ((sc->alc_flags & ALC_FLAG_RUNNING) != 0) return; /* @@ -4184,8 +4184,10 @@ alc_init(struct alc_softc *sc) sc->alc_flags |= ALC_FLAG_RUNNING; sc->alc_flags &= ~ALC_FLAG_LINK; + /* Switch to the current media. */ - alc_mediachange_locked(sc); + mii = device_get_softc(sc->alc_miibus); + alc_mediachange_locked(sc, mii->mii_media); callout_reset(&sc->alc_tick_ch, hz, alc_tick, sc); }