diff options
| author | thorpej <thorpej@NetBSD.org> | 2004-05-17 00:17:28 +0000 |
|---|---|---|
| committer | thorpej <thorpej@NetBSD.org> | 2004-05-17 00:17:28 +0000 |
| commit | bfd469cd6f5d18c518ec73e8f78d5b107abe78dc (patch) | |
| tree | 143e46519ddd6a2b529a7f807ec2fb47e59c17db /sys/dev | |
| parent | 74543d4812723fe9b4ebb53c029a5993e35bcb4b (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.c | 25 |
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 |
