diff options
-rw-r--r-- | sys/dev/mii/rgephy.c | 21 |
1 files changed, 14 insertions, 7 deletions
diff --git a/sys/dev/mii/rgephy.c b/sys/dev/mii/rgephy.c index 6d6008c..417fa63 100644 --- a/sys/dev/mii/rgephy.c +++ b/sys/dev/mii/rgephy.c @@ -118,6 +118,7 @@ rgephy_attach(device_t dev) sc->mii_phy = ma->mii_phyno; sc->mii_service = rgephy_service; sc->mii_pdata = mii; + sc->mii_anegticks = MII_ANEGTICKS_GIGE; mii->mii_instance++; @@ -271,8 +272,10 @@ setit: /* * Only used for autonegotiation. */ - if (IFM_SUBTYPE(ife->ifm_media) != IFM_AUTO) + if (IFM_SUBTYPE(ife->ifm_media) != IFM_AUTO) { + sc->mii_ticks = 0; break; + } /* * Check to see if we have link. If we do, we don't @@ -280,18 +283,22 @@ setit: * the BMSR twice in case it's latched. */ reg = PHY_READ(sc, RL_GMEDIASTAT); - if (reg & RL_GMEDIASTAT_LINK) + if (reg & RL_GMEDIASTAT_LINK) { + sc->mii_ticks = 0; break; + } - /* - * Only retry autonegotiation every 5 seconds. - */ - if (++sc->mii_ticks <= MII_ANEGTICKS) + /* Announce link loss right after it happens. */ + if (sc->mii_ticks++ == 0) break; + /* Only retry autonegotiation every mii_anegticks seconds. */ + if (sc->mii_ticks <= sc->mii_anegticks) + return (0); + sc->mii_ticks = 0; rgephy_mii_phy_auto(sc); - return (0); + break; } /* Update the media status. */ |