summaryrefslogtreecommitdiffstats
path: root/sys/dev/mii/e1000phy.c
diff options
context:
space:
mode:
authoryongari <yongari@FreeBSD.org>2009-05-25 02:05:00 +0000
committeryongari <yongari@FreeBSD.org>2009-05-25 02:05:00 +0000
commitfd45d782d18ffb1d516ed5570957017ba2c2d392 (patch)
treec2d4915fceadb514c29c06be48bd47634bab0c8e /sys/dev/mii/e1000phy.c
parent544e2eb41a0ea28559b5a298b4f30b42f3d018a0 (diff)
downloadFreeBSD-src-fd45d782d18ffb1d516ed5570957017ba2c2d392.zip
FreeBSD-src-fd45d782d18ffb1d516ed5570957017ba2c2d392.tar.gz
Do not ignore NEXT Page capability of auto-negotiation
advertisement register. Some PHYs such as 88E3016 requires NEXT Page capability to establish valid link. Also set protocol selector field which is read only but it makes the intention clearer.
Diffstat (limited to 'sys/dev/mii/e1000phy.c')
-rw-r--r--sys/dev/mii/e1000phy.c11
1 files changed, 7 insertions, 4 deletions
diff --git a/sys/dev/mii/e1000phy.c b/sys/dev/mii/e1000phy.c
index a6c3763..0025e76 100644
--- a/sys/dev/mii/e1000phy.c
+++ b/sys/dev/mii/e1000phy.c
@@ -490,13 +490,16 @@ static int
e1000phy_mii_phy_auto(struct e1000phy_softc *esc)
{
struct mii_softc *sc;
+ uint16_t reg;
sc = &esc->mii_sc;
- if ((sc->mii_flags & MIIF_HAVEFIBER) == 0)
- PHY_WRITE(sc, E1000_AR, E1000_AR_10T | E1000_AR_10T_FD |
+ if ((sc->mii_flags & MIIF_HAVEFIBER) == 0) {
+ reg = PHY_READ(sc, E1000_AR);
+ reg |= E1000_AR_10T | E1000_AR_10T_FD |
E1000_AR_100TX | E1000_AR_100TX_FD |
- E1000_AR_PAUSE | E1000_AR_ASM_DIR);
- else
+ E1000_AR_PAUSE | E1000_AR_ASM_DIR;
+ PHY_WRITE(sc, E1000_AR, reg | E1000_AR_SELECTOR_FIELD);
+ } else
PHY_WRITE(sc, E1000_AR, E1000_FA_1000X_FD | E1000_FA_1000X |
E1000_FA_SYM_PAUSE | E1000_FA_ASYM_PAUSE);
if ((sc->mii_extcapabilities & (EXTSR_1000TFDX | EXTSR_1000THDX)) != 0)
OpenPOWER on IntegriCloud