Index: sys/dev/mii/rlphy.c =================================================================== --- sys/dev/mii/rlphy.c (revision 186170) +++ sys/dev/mii/rlphy.c (working copy) @@ -60,6 +60,9 @@ struct rlphy_softc { struct mii_softc sc_mii; /* generic PHY */ int sc_is_RTL8201L; /* is an external RTL8201L PHY */ + int flags; +#define RLPHY_FLAGS_RL 0x01 +#define RLPHY_FLAGS_RE 0x02 }; static int rlphy_probe(device_t); @@ -125,6 +128,7 @@ struct mii_attach_args *ma; struct mii_data *mii; struct rlphy_softc *rsc; + const char *nic; sc = device_get_softc(dev); ma = device_get_ivars(dev); @@ -138,6 +142,11 @@ rsc = (struct rlphy_softc *)sc; if (mii_phy_dev_probe(dev, rlphys, 0) == 0) rsc->sc_is_RTL8201L++; + nic = device_get_name(device_get_parent(sc->mii_dev)); + if (strcmp(nic, "re") == 0) + rsc->flags |= RLPHY_FLAGS_RE; + else if (strcmp(nic, "rl") == 0) + rsc->flags |= RLPHY_FLAGS_RL; /* * The RealTek PHY can never be isolated, so never allow non-zero @@ -302,18 +311,25 @@ * can test the 'SPEED10' bit of the MAC's media status * register. */ - if (rsc->sc_is_RTL8201L) { - if (PHY_READ(phy, 0x0019) & 0x01) + if (rsc->flags & RLPHY_FLAGS_RE) { + if (PHY_READ(phy, RL_GMEDIASTAT) & + RL_GMEDIASTAT_100MBPS) mii->mii_media_active |= IFM_100_TX; else mii->mii_media_active |= IFM_10_T; - } else { + } else if (rsc->flags & RLPHY_FLAGS_RL) { if (PHY_READ(phy, RL_MEDIASTAT) & RL_MEDIASTAT_SPEED10) mii->mii_media_active |= IFM_10_T; else mii->mii_media_active |= IFM_100_TX; - } + } if (rsc->sc_is_RTL8201L) { + if (PHY_READ(phy, 0x0019) & 0x01) + mii->mii_media_active |= IFM_100_TX; + else + mii->mii_media_active |= IFM_10_T; + } else + mii->mii_media_active |= IFM_NONE; } else mii->mii_media_active = ife->ifm_media; }