summaryrefslogtreecommitdiffstats
path: root/sys
diff options
context:
space:
mode:
authoryongari <yongari@FreeBSD.org>2007-10-29 02:06:15 +0000
committeryongari <yongari@FreeBSD.org>2007-10-29 02:06:15 +0000
commit991131f8d8b31c0b5782ebbd0c7a00b7b03dac05 (patch)
tree84becda538cb6080c757d3fd0697469bb0fdadb3 /sys
parent9fa2da8164e34036b37df6f8f891329d260e1c05 (diff)
downloadFreeBSD-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.c21
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. */
OpenPOWER on IntegriCloud