Small change to ukphy
Pyun YongHyeon
pyunyh at gmail.com
Wed Apr 1 03:36:33 PDT 2009
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?
>
> Warner
More information about the freebsd-net
mailing list