summaryrefslogtreecommitdiffstats
path: root/sys/dev/mii/ukphy_subr.c
diff options
context:
space:
mode:
authoryongari <yongari@FreeBSD.org>2006-05-19 03:51:42 +0000
committeryongari <yongari@FreeBSD.org>2006-05-19 03:51:42 +0000
commit9500bab9710164dfcdb5efb9a63e24304c92c6fc (patch)
treebf05ca1b78d3a831869b64a2958c0ed74c1795be /sys/dev/mii/ukphy_subr.c
parent99b97186f23a997e103a0f0741a03d1f126301c4 (diff)
downloadFreeBSD-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
Diffstat (limited to 'sys/dev/mii/ukphy_subr.c')
-rw-r--r--sys/dev/mii/ukphy_subr.c17
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;
OpenPOWER on IntegriCloud