From owner-freebsd-net@FreeBSD.ORG Wed Apr 1 07:34:36 2009 Return-Path: Delivered-To: net@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 815031065670 for ; Wed, 1 Apr 2009 07:34:36 +0000 (UTC) (envelope-from imp@bsdimp.com) Received: from harmony.bsdimp.com (bsdimp.com [199.45.160.85]) by mx1.freebsd.org (Postfix) with ESMTP id 44CE18FC1A for ; Wed, 1 Apr 2009 07:34:36 +0000 (UTC) (envelope-from imp@bsdimp.com) Received: from localhost (localhost [127.0.0.1]) by harmony.bsdimp.com (8.14.2/8.14.1) with ESMTP id n317W5lE085839 for ; Wed, 1 Apr 2009 01:32:05 -0600 (MDT) (envelope-from imp@bsdimp.com) Date: Wed, 01 Apr 2009 01:32:46 -0600 (MDT) Message-Id: <20090401.013246.-1253043078.imp@bsdimp.com> To: net@freebsd.org From: "M. Warner Losh" X-Mailer: Mew version 5.2 on Emacs 21.3 / Mule 5.0 (SAKAKI) Mime-Version: 1.0 Content-Type: Text/Plain; charset=us-ascii Content-Transfer-Encoding: 7bit Cc: Subject: Small change to ukphy X-BeenThere: freebsd-net@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: Networking and TCP/IP with FreeBSD List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 01 Apr 2009 07:34:36 -0000 I've encountered a number of PHY chips that need auto negotiation kicked off to come out of ISO state. This makes sense, because the ukphy driver never seems to take the PHY out of isolation state otherwise. Index: ukphy.c =================================================================== --- ukphy.c (revision 190463) +++ ukphy.c (working copy) @@ -146,6 +146,7 @@ sc->mii_phy = ma->mii_phyno; sc->mii_service = ukphy_service; sc->mii_pdata = mii; + sc->mii_flags |= MIIF_FORCEANEG; mii->mii_instance++; This forces auto negotiation. The reason for this is that it takes it out of ISO state (Isolate). Once out of that state, things work well. The question I have is will we properly go back into ISO state for PHYs that should be isolated. NetBSD has many of its NIC drivers setting this flag. Their APIs allow them to set this directly at mii attach time. Ours don't, so none of our drivers set this flag. The other fix for this might be: Index: mii_physubr.c =================================================================== --- mii_physubr.c (revision 190463) +++ mii_physubr.c (working copy) @@ -113,7 +113,9 @@ int bmcr, anar, gtcr; if (IFM_SUBTYPE(ife->ifm_media) == IFM_AUTO) { - if ((PHY_READ(sc, MII_BMCR) & BMCR_AUTOEN) == 0 || + bmcr = PHY_READ(sc, MII_BMCR); + if ((bmcr & BMCR_AUTOEN) == 0 || + (bmcr & BMCR_ISO) || (sc->mii_flags & MIIF_FORCEANEG)) (void) mii_phy_auto(sc); return; Which says that if auto negotiation is enabled, and ISO is set to go ahead and kick off an auto negotiation. I'm less sure of this path, but it is an alternative. Otherwise, we never write to the BMCR to take the device out of isolation. If there's a better place to do this, then I'm all ears. Either one of these hacks make several PC Cards that I have start to work... In fact, I'm starting to approach 100% (up from 50%) of my ed-based PC Cards working with this simple change (and others to the ed driver). I know that these cards are a little behind the leading edge, but I'd like to get them working since I've put a few hours into investigating things here. Comments? Warner