summaryrefslogtreecommitdiffstats
path: root/sys/dev/mii/e1000phy.c
diff options
context:
space:
mode:
authoryongari <yongari@FreeBSD.org>2009-05-25 01:56:19 +0000
committeryongari <yongari@FreeBSD.org>2009-05-25 01:56:19 +0000
commit544e2eb41a0ea28559b5a298b4f30b42f3d018a0 (patch)
tree64ccf42b42a3307c3c46817961f23f5b7c9beecc /sys/dev/mii/e1000phy.c
parent9d2ba51089377451e53fd00a34f09584fd257946 (diff)
downloadFreeBSD-src-544e2eb41a0ea28559b5a298b4f30b42f3d018a0.zip
FreeBSD-src-544e2eb41a0ea28559b5a298b4f30b42f3d018a0.tar.gz
Don't read unnecessary PHY registers. Speed/duplex resolution bit
is valid only for auto-negotiation case so check the bit if we know auto-negotiation is active. While I'm here explicitly checks current speed with speed mask and set IFM_NONE if resolved speed is unknown.
Diffstat (limited to 'sys/dev/mii/e1000phy.c')
-rw-r--r--sys/dev/mii/e1000phy.c28
1 files changed, 16 insertions, 12 deletions
diff --git a/sys/dev/mii/e1000phy.c b/sys/dev/mii/e1000phy.c
index e9ac4bb..a6c3763 100644
--- a/sys/dev/mii/e1000phy.c
+++ b/sys/dev/mii/e1000phy.c
@@ -414,18 +414,14 @@ static void
e1000phy_status(struct mii_softc *sc)
{
struct mii_data *mii = sc->mii_pdata;
- int bmsr, bmcr, esr, gsr, ssr, isr, ar, lpar;
+ int bmcr, bmsr, gsr, ssr, ar, lpar;
mii->mii_media_status = IFM_AVALID;
mii->mii_media_active = IFM_ETHER;
bmsr = PHY_READ(sc, E1000_SR) | PHY_READ(sc, E1000_SR);
- esr = PHY_READ(sc, E1000_ESR);
bmcr = PHY_READ(sc, E1000_CR);
ssr = PHY_READ(sc, E1000_SSR);
- isr = PHY_READ(sc, E1000_ISR);
- ar = PHY_READ(sc, E1000_AR);
- lpar = PHY_READ(sc, E1000_LPAR);
if (bmsr & E1000_SR_LINK_STATUS)
mii->mii_media_status |= IFM_ACTIVE;
@@ -433,22 +429,28 @@ e1000phy_status(struct mii_softc *sc)
if (bmcr & E1000_CR_LOOPBACK)
mii->mii_media_active |= IFM_LOOP;
- if ((((bmcr & E1000_CR_AUTO_NEG_ENABLE) != 0) &&
- ((bmsr & E1000_SR_AUTO_NEG_COMPLETE) == 0)) ||
- ((ssr & E1000_SSR_LINK) == 0) ||
- ((ssr & E1000_SSR_SPD_DPLX_RESOLVED) == 0)) {
+ if ((bmcr & E1000_CR_AUTO_NEG_ENABLE) != 0 &&
+ (ssr & E1000_SSR_SPD_DPLX_RESOLVED) == 0) {
/* Erg, still trying, I guess... */
mii->mii_media_active |= IFM_NONE;
return;
}
if ((sc->mii_flags & MIIF_HAVEFIBER) == 0) {
- if (ssr & E1000_SSR_1000MBS)
+ switch (ssr & E1000_SSR_SPEED) {
+ case E1000_SSR_1000MBS:
mii->mii_media_active |= IFM_1000_T;
- else if (ssr & E1000_SSR_100MBS)
+ break;
+ case E1000_SSR_100MBS:
mii->mii_media_active |= IFM_100_TX;
- else
+ break;
+ case E1000_SSR_10MBS:
mii->mii_media_active |= IFM_10_T;
+ break;
+ default:
+ mii->mii_media_active |= IFM_NONE;
+ return;
+ }
} else {
if (ssr & E1000_SSR_1000MBS)
mii->mii_media_active |= IFM_1000_SX;
@@ -460,6 +462,8 @@ e1000phy_status(struct mii_softc *sc)
mii->mii_media_active |= IFM_HDX;
if ((sc->mii_flags & MIIF_HAVEFIBER) == 0) {
+ ar = PHY_READ(sc, E1000_AR);
+ lpar = PHY_READ(sc, E1000_LPAR);
/* FLAG0==rx-flow-control FLAG1==tx-flow-control */
if ((ar & E1000_AR_PAUSE) && (lpar & E1000_LPAR_PAUSE)) {
mii->mii_media_active |= IFM_FLAG0 | IFM_FLAG1;
OpenPOWER on IntegriCloud