From owner-svn-src-all@FreeBSD.ORG Fri Feb 13 03:38:09 2009 Return-Path: Delivered-To: svn-src-all@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id F223E1065670; Fri, 13 Feb 2009 03:38:08 +0000 (UTC) (envelope-from thompsa@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id D4F408FC23; Fri, 13 Feb 2009 03:38:08 +0000 (UTC) (envelope-from thompsa@FreeBSD.org) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id n1D3c8Wx075162; Fri, 13 Feb 2009 03:38:08 GMT (envelope-from thompsa@svn.freebsd.org) Received: (from thompsa@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id n1D3c8Wn075161; Fri, 13 Feb 2009 03:38:08 GMT (envelope-from thompsa@svn.freebsd.org) Message-Id: <200902130338.n1D3c8Wn075161@svn.freebsd.org> From: Andrew Thompson Date: Fri, 13 Feb 2009 03:38:08 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org X-SVN-Group: head MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r188553 - head/sys/dev/usb2/ethernet X-BeenThere: svn-src-all@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the entire src tree \(except for " user" and " projects" \)" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 13 Feb 2009 03:38:09 -0000 Author: thompsa Date: Fri Feb 13 03:38:08 2009 New Revision: 188553 URL: http://svn.freebsd.org/changeset/base/188553 Log: Restore some of the link handling code that was inadvertently removed in r188412, this broke the GU-1000T adapters. Submitted by: yongari Pointy hat: me Modified: head/sys/dev/usb2/ethernet/if_axe2.c Modified: head/sys/dev/usb2/ethernet/if_axe2.c ============================================================================== --- head/sys/dev/usb2/ethernet/if_axe2.c Fri Feb 13 02:48:32 2009 (r188552) +++ head/sys/dev/usb2/ethernet/if_axe2.c Fri Feb 13 03:38:08 2009 (r188553) @@ -341,6 +341,7 @@ axe_miibus_statchg(device_t dev) { struct axe_softc *sc = device_get_softc(dev); struct mii_data *mii = GET_MII(sc); + struct ifnet *ifp; uint16_t val; int err, locked; @@ -348,11 +349,40 @@ axe_miibus_statchg(device_t dev) if (!locked) AXE_LOCK(sc); - val = (mii->mii_media_active & IFM_GMASK) == IFM_FDX ? - AXE_MEDIA_FULL_DUPLEX : 0; + ifp = usb2_ether_getifp(&sc->sc_ue); + if (mii == NULL || ifp == NULL || + (ifp->if_drv_flags & IFF_DRV_RUNNING) == 0) + goto done; + + sc->sc_flags &= ~AXE_FLAG_LINK; + if ((mii->mii_media_status & (IFM_ACTIVE | IFM_AVALID)) == + (IFM_ACTIVE | IFM_AVALID)) { + switch (IFM_SUBTYPE(mii->mii_media_active)) { + case IFM_10_T: + case IFM_100_TX: + sc->sc_flags |= AXE_FLAG_LINK; + break; + case IFM_1000_T: + if ((sc->sc_flags & AXE_FLAG_178) == 0) + break; + sc->sc_flags |= AXE_FLAG_LINK; + break; + default: + break; + } + } + + /* Lost link, do nothing. */ + if ((sc->sc_flags & AXE_FLAG_LINK) == 0) + goto done; + + val = 0; + if ((IFM_OPTIONS(mii->mii_media_active) & IFM_FDX) != 0) + val |= AXE_MEDIA_FULL_DUPLEX; if (sc->sc_flags & (AXE_FLAG_178 | AXE_FLAG_772)) { val |= AXE_178_MEDIA_RX_EN | AXE_178_MEDIA_MAGIC; - + if ((sc->sc_flags & AXE_FLAG_178) != 0) + val |= AXE_178_MEDIA_ENCK; switch (IFM_SUBTYPE(mii->mii_media_active)) { case IFM_1000_T: val |= AXE_178_MEDIA_GMII | AXE_178_MEDIA_ENCK; @@ -368,7 +398,7 @@ axe_miibus_statchg(device_t dev) err = axe_cmd(sc, AXE_CMD_WRITE_MEDIA, 0, val, NULL); if (err) device_printf(dev, "media change failed, error %d\n", err); - +done: if (!locked) AXE_UNLOCK(sc); } @@ -381,18 +411,18 @@ axe_ifmedia_upd(struct ifnet *ifp) { struct axe_softc *sc = ifp->if_softc; struct mii_data *mii = GET_MII(sc); + int error; AXE_LOCK_ASSERT(sc, MA_OWNED); - sc->sc_flags &= ~AXE_FLAG_LINK; if (mii->mii_instance) { struct mii_softc *miisc; LIST_FOREACH(miisc, &mii->mii_phys, mii_list) mii_phy_reset(miisc); } - mii_mediachg(mii); - return (0); + error = mii_mediachg(mii); + return (error); } /* @@ -915,11 +945,10 @@ axe_tick(struct usb2_ether *ue) AXE_LOCK_ASSERT(sc, MA_OWNED); mii_tick(mii); - if ((sc->sc_flags & AXE_FLAG_LINK) == 0 - && mii->mii_media_status & IFM_ACTIVE && - IFM_SUBTYPE(mii->mii_media_active) != IFM_NONE) { - sc->sc_flags |= AXE_FLAG_LINK; - axe_start(ue); + if ((sc->sc_flags & AXE_FLAG_LINK) == 0) { + axe_miibus_statchg(ue->ue_dev); + if ((sc->sc_flags & AXE_FLAG_LINK) != 0) + axe_start(ue); } }