diff options
author | yongari <yongari@FreeBSD.org> | 2007-10-29 02:06:15 +0000 |
---|---|---|
committer | yongari <yongari@FreeBSD.org> | 2007-10-29 02:06:15 +0000 |
commit | 991131f8d8b31c0b5782ebbd0c7a00b7b03dac05 (patch) | |
tree | 84becda538cb6080c757d3fd0697469bb0fdadb3 /sys | |
parent | 9fa2da8164e34036b37df6f8f891329d260e1c05 (diff) | |
download | FreeBSD-src-991131f8d8b31c0b5782ebbd0c7a00b7b03dac05.zip FreeBSD-src-991131f8d8b31c0b5782ebbd0c7a00b7b03dac05.tar.gz |
o RTL8169S/8110S integrated PHY and RTL8211B are gigabit PHYs so set
mii_anegticks to MII_ANEGTICKS_GIGE and use it. Previously it used
to MII_ANEGTICKS which may not be enough to wait before retrying
autonegotiation process at 1000bps.
o Reset autonegotation timer if media option is not IFM_AUTO or we
got a valid link.
o Announce link loss right after it happends.
o Autonegiation is retried every mii_anegticks seconds.
o Report link state changes right after setting autonegotiation.
Diffstat (limited to 'sys')
-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. */ |