Small change to ukphy

Marius Strobl marius at alchemy.franken.de
Wed Apr 1 14:26:22 PDT 2009


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



More information about the freebsd-net mailing list