diff options
author | yongari <yongari@FreeBSD.org> | 2006-05-19 03:51:42 +0000 |
---|---|---|
committer | yongari <yongari@FreeBSD.org> | 2006-05-19 03:51:42 +0000 |
commit | 9500bab9710164dfcdb5efb9a63e24304c92c6fc (patch) | |
tree | bf05ca1b78d3a831869b64a2958c0ed74c1795be | |
parent | 99b97186f23a997e103a0f0741a03d1f126301c4 (diff) | |
download | FreeBSD-src-9500bab9710164dfcdb5efb9a63e24304c92c6fc.zip FreeBSD-src-9500bab9710164dfcdb5efb9a63e24304c92c6fc.tar.gz |
If the PHY has 1000BASE-T capability, check to see if a 1000BASE-T speed
was negotiated.
Obtained from: NetBSD
-rw-r--r-- | sys/dev/mii/ukphy_subr.c | 17 |
1 files changed, 15 insertions, 2 deletions
diff --git a/sys/dev/mii/ukphy_subr.c b/sys/dev/mii/ukphy_subr.c index 123d529..9d7df3d 100644 --- a/sys/dev/mii/ukphy_subr.c +++ b/sys/dev/mii/ukphy_subr.c @@ -67,7 +67,7 @@ ukphy_status(struct mii_softc *phy) { struct mii_data *mii = phy->mii_pdata; struct ifmedia_entry *ife = mii->mii_media.ifm_cur; - int bmsr, bmcr, anlpar; + int bmsr, bmcr, anlpar, gtcr, gtsr; mii->mii_media_status = IFM_AVALID; mii->mii_media_active = IFM_ETHER; @@ -99,7 +99,20 @@ ukphy_status(struct mii_softc *phy) } anlpar = PHY_READ(phy, MII_ANAR) & PHY_READ(phy, MII_ANLPAR); - if (anlpar & ANLPAR_T4) + if ((phy->mii_flags & MIIF_HAVE_GTCR) != 0 && + (phy->mii_extcapabilities & + (EXTSR_1000THDX | EXTSR_1000TFDX)) != 0) { + gtcr = PHY_READ(phy, MII_100T2CR); + gtsr = PHY_READ(phy, MII_100T2SR); + } else + gtcr = gtsr = 0; + + if ((gtcr & GTCR_ADV_1000TFDX) && (gtsr & GTSR_LP_1000TFDX)) + mii->mii_media_active |= IFM_1000_T|IFM_FDX; + else if ((gtcr & GTCR_ADV_1000THDX) && + (gtsr & GTSR_LP_1000THDX)) + mii->mii_media_active |= IFM_1000_T; + else if (anlpar & ANLPAR_T4) mii->mii_media_active |= IFM_100_T4; else if (anlpar & ANLPAR_TX_FD) mii->mii_media_active |= IFM_100_TX|IFM_FDX; |