From owner-freebsd-net@FreeBSD.ORG Wed Apr 1 21:26:22 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 49331106564A for ; Wed, 1 Apr 2009 21:26:22 +0000 (UTC) (envelope-from marius@alchemy.franken.de) Received: from alchemy.franken.de (alchemy.franken.de [194.94.249.214]) by mx1.freebsd.org (Postfix) with ESMTP id A66598FC18 for ; Wed, 1 Apr 2009 21:26:21 +0000 (UTC) (envelope-from marius@alchemy.franken.de) Received: from alchemy.franken.de (localhost [127.0.0.1]) by alchemy.franken.de (8.14.3/8.14.3/ALCHEMY.FRANKEN.DE) with ESMTP id n31LCsHE083842; Wed, 1 Apr 2009 23:12:55 +0200 (CEST) (envelope-from marius@alchemy.franken.de) Received: (from marius@localhost) by alchemy.franken.de (8.14.3/8.14.3/Submit) id n31LCsvh083841; Wed, 1 Apr 2009 23:12:54 +0200 (CEST) (envelope-from marius) Date: Wed, 1 Apr 2009 23:12:54 +0200 From: Marius Strobl To: Pyun YongHyeon Message-ID: <20090401211254.GA83780@alchemy.franken.de> References: <20090401.013246.-1253043078.imp@bsdimp.com> <20090401100939.GB12246@michelle.cdnetworks.co.kr> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20090401100939.GB12246@michelle.cdnetworks.co.kr> User-Agent: Mutt/1.4.2.3i Cc: "M. Warner Losh" , net@freebsd.org Subject: Re: 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 21:26:22 -0000 On Wed, Apr 01, 2009 at 07:09:39PM +0900, Pyun YongHyeon wrote: > On Wed, Apr 01, 2009 at 01:32:46AM -0600, M. Warner Losh wrote: > > 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 > > If the purpose is to take PHY out of isolated state couldn't this > be handled in ifm_change_cb_t handler of parent interface? I guess > the callback can reset the PHY and subsequent mii_mediachg() call > may start auto-negotiation. > > > well. The question I have is will we properly go back into ISO state > > for PHYs that should be isolated. > > > > If the PHY requires special handing for ISO state in reset it may > need separated PHY driver as ukphy(4) does not set MIIF_NOISOLATE. > As you said it would be really great if we have a generic way to > pass various MII flags or driver specific information to mii(4). > > > 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? > > FYI, the idea I had for passing MIIF_DOPAUSE from the NIC drivers to the PHY drivers as required by the flow-control support without breaking the ABI was to use device flags. A proof-of-concept patch with an example application of that approach is: http://people.freebsd.org/~marius/mii_flags.diff One could even or the flags together in miibus_attach(), allowing MIIF_FORCEANEG etc to be additionally set via hints. Marius