summaryrefslogtreecommitdiff
path: root/sys/dev
diff options
context:
space:
mode:
authorthorpej <thorpej@NetBSD.org>2004-05-17 00:17:28 +0000
committerthorpej <thorpej@NetBSD.org>2004-05-17 00:17:28 +0000
commitbfd469cd6f5d18c518ec73e8f78d5b107abe78dc (patch)
tree143e46519ddd6a2b529a7f807ec2fb47e59c17db /sys/dev
parent74543d4812723fe9b4ebb53c029a5993e35bcb4b (diff)
If the PHY has 1000BASE-T capability, check to see if a 1000BASE-T speed
was negotiated, and check if we ended up mastering the clock if so.
Diffstat (limited to 'sys/dev')
-rw-r--r--sys/dev/mii/ukphy_subr.c25
1 files changed, 21 insertions, 4 deletions
diff --git a/sys/dev/mii/ukphy_subr.c b/sys/dev/mii/ukphy_subr.c
index 17014b1dc1c..f5be0e6459f 100644
--- a/sys/dev/mii/ukphy_subr.c
+++ b/sys/dev/mii/ukphy_subr.c
@@ -1,4 +1,4 @@
-/* $NetBSD: ukphy_subr.c,v 1.7 2004/05/16 23:55:58 thorpej Exp $ */
+/* $NetBSD: ukphy_subr.c,v 1.8 2004/05/17 00:17:28 thorpej Exp $ */
/*-
* Copyright (c) 1998 The NetBSD Foundation, Inc.
@@ -42,7 +42,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ukphy_subr.c,v 1.7 2004/05/16 23:55:58 thorpej Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ukphy_subr.c,v 1.8 2004/05/17 00:17:28 thorpej Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -65,7 +65,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;
@@ -97,7 +97,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;
@@ -110,6 +123,10 @@ ukphy_status(struct mii_softc *phy)
else
mii->mii_media_active |= IFM_NONE;
+ if ((mii->mii_media_active & IFM_1000_T) &&
+ (gtsr & GTSR_MS_RES))
+ mii->mii_media_active |= IFM_ETH_MASTER;
+
if (mii->mii_media_active & IFM_FDX)
mii->mii_media_active |= mii_phy_flowstatus(phy);
} else