diff options
author | Brad Smith <brad@cvs.openbsd.org> | 2008-08-30 08:16:14 +0000 |
---|---|---|
committer | Brad Smith <brad@cvs.openbsd.org> | 2008-08-30 08:16:14 +0000 |
commit | 7314db6f44b437f813fc445c521d10dcce8a6ddc (patch) | |
tree | efb6c16b80980d2ac2a9b728d8a7bf31398fd2ce /sys | |
parent | eca587260ed4273a49b53c97c4da5ee453769a59 (diff) |
Move the link state check back up to the top of the various status
functions right after reading the BMSR as it was before the addition
of the fiber support and simplify brgphy_fiber_status() a bit.
ok dlg@
Diffstat (limited to 'sys')
-rw-r--r-- | sys/dev/mii/brgphy.c | 62 |
1 files changed, 24 insertions, 38 deletions
diff --git a/sys/dev/mii/brgphy.c b/sys/dev/mii/brgphy.c index b6279316099..b2909a5291a 100644 --- a/sys/dev/mii/brgphy.c +++ b/sys/dev/mii/brgphy.c @@ -1,4 +1,4 @@ -/* $OpenBSD: brgphy.c,v 1.81 2008/06/13 22:23:08 brad Exp $ */ +/* $OpenBSD: brgphy.c,v 1.82 2008/08/30 08:16:13 brad Exp $ */ /* * Copyright (c) 2000 @@ -390,23 +390,21 @@ brgphy_copper_status(struct mii_softc *sc) mii->mii_media_active = IFM_ETHER; bmsr = PHY_READ(sc, BRGPHY_MII_BMSR) | PHY_READ(sc, BRGPHY_MII_BMSR); - bmcr = PHY_READ(sc, BRGPHY_MII_BMCR); + if (bmsr & BRGPHY_BMSR_LINK) + mii->mii_media_status |= IFM_ACTIVE; + bmcr = PHY_READ(sc, BRGPHY_MII_BMCR); if (bmcr & BRGPHY_BMCR_LOOP) mii->mii_media_active |= IFM_LOOP; if (bmcr & BRGPHY_BMCR_AUTOEN) { + int gsr; + if ((bmsr & BRGPHY_BMSR_ACOMP) == 0) { /* Erg, still trying, I guess... */ mii->mii_media_active |= IFM_NONE; return; } - } - - if (bmsr & BRGPHY_BMSR_LINK) { - int gsr; - - mii->mii_media_status |= IFM_ACTIVE; switch (PHY_READ(sc, BRGPHY_MII_AUXSTS) & BRGPHY_AUXSTS_AN_RES) { @@ -458,43 +456,34 @@ brgphy_fiber_status(struct mii_softc *sc) mii->mii_media_active = IFM_ETHER; bmsr = PHY_READ(sc, BRGPHY_MII_BMSR) | PHY_READ(sc, BRGPHY_MII_BMSR); - bmcr = PHY_READ(sc, BRGPHY_MII_BMCR); + if (bmsr & BRGPHY_BMSR_LINK) + mii->mii_media_status |= IFM_ACTIVE; + bmcr = PHY_READ(sc, BRGPHY_MII_BMCR); if (bmcr & BRGPHY_BMCR_LOOP) mii->mii_media_active |= IFM_LOOP; if (bmcr & BRGPHY_BMCR_AUTOEN) { + int val; + if ((bmsr & BRGPHY_BMSR_ACOMP) == 0) { /* Erg, still trying, I guess... */ mii->mii_media_active |= IFM_NONE; return; } - } - if (bmsr & BRGPHY_BMSR_LINK) { - mii->mii_media_status |= IFM_ACTIVE; mii->mii_media_active |= IFM_1000_SX; - /* - * If autoneg enabled, read negotiated - * duplex settings - */ - if (bmcr & BRGPHY_BMCR_AUTOEN) { - int val; - - val = PHY_READ(sc, BRGPHY_SERDES_ANAR) & - PHY_READ(sc, BRGPHY_SERDES_ANLPAR); - - if (val & BRGPHY_SERDES_ANAR_FDX) - mii->mii_media_active |= IFM_FDX; - else - mii->mii_media_active |= IFM_HDX; + val = PHY_READ(sc, BRGPHY_SERDES_ANAR) & + PHY_READ(sc, BRGPHY_SERDES_ANLPAR); - if (mii->mii_media_active & IFM_FDX) - mii->mii_media_active |= - mii_phy_flowstatus(sc); - } + if (val & BRGPHY_SERDES_ANAR_FDX) mii->mii_media_active |= IFM_FDX; + else + mii->mii_media_active |= IFM_HDX; + + if (mii->mii_media_active & IFM_FDX) + mii->mii_media_active |= mii_phy_flowstatus(sc); } else mii->mii_media_active = ife->ifm_media; } @@ -510,30 +499,27 @@ brgphy_5708s_status(struct mii_softc *sc) mii->mii_media_active = IFM_ETHER; bmsr = PHY_READ(sc, BRGPHY_MII_BMSR) | PHY_READ(sc, BRGPHY_MII_BMSR); - bmcr = PHY_READ(sc, BRGPHY_MII_BMCR); + if (bmsr & BRGPHY_BMSR_LINK) + mii->mii_media_status |= IFM_ACTIVE; + bmcr = PHY_READ(sc, BRGPHY_MII_BMCR); if (bmcr & BRGPHY_BMCR_LOOP) mii->mii_media_active |= IFM_LOOP; if (bmcr & BRGPHY_BMCR_AUTOEN) { + int xstat; + if ((bmsr & BRGPHY_BMSR_ACOMP) == 0) { /* Erg, still trying, I guess... */ mii->mii_media_active |= IFM_NONE; return; } - } - - if (bmsr & BRGPHY_BMSR_LINK) { - int xstat; - - mii->mii_media_status |= IFM_ACTIVE; PHY_WRITE(sc, BRGPHY_5708S_BLOCK_ADDR, BRGPHY_5708S_DIG_PG0); xstat = PHY_READ(sc, BRGPHY_5708S_PG0_1000X_STAT1); - /* Todo: Create #defines for hard coded values */ switch (xstat & BRGPHY_5708S_PG0_1000X_STAT1_SPEED_MASK) { case BRGPHY_5708S_PG0_1000X_STAT1_SPEED_10: mii->mii_media_active |= IFM_10_FL; |