From 843813453f52e3378fc988c8364063fd4cb9d0e3 Mon Sep 17 00:00:00 2001 From: Ben Hutchings Date: Fri, 26 Dec 2008 13:49:25 -0800 Subject: sfc: If AN is enabled, always read speed/duplex from the AN advertising bits When AN is enabled and the link is down the speed/duplex control bits will not be meaningful. Use the advertising bits instead, and mask them with the LPA bits if and only if AN is complete (as before). Signed-off-by: Ben Hutchings Signed-off-by: David S. Miller --- drivers/net/sfc/mdio_10g.c | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/drivers/net/sfc/mdio_10g.c b/drivers/net/sfc/mdio_10g.c index f131ad2b6832..f6a16428113d 100644 --- a/drivers/net/sfc/mdio_10g.c +++ b/drivers/net/sfc/mdio_10g.c @@ -368,13 +368,16 @@ void mdio_clause45_get_settings_ext(struct efx_nic *efx, } else ecmd->autoneg = AUTONEG_DISABLE; - /* If AN is enabled and complete, report best common mode */ - if (ecmd->autoneg && - (mdio_clause45_read(efx, phy_id, MDIO_MMD_AN, MDIO_MMDREG_STAT1) & - (1 << MDIO_AN_STATUS_AN_DONE_LBN))) { - u32 common, lpa; - lpa = mdio_clause45_get_an(efx, MDIO_AN_LPA, xnp_lpa); - common = ecmd->advertising & lpa; + if (ecmd->autoneg) { + /* If AN is complete, report best common mode, + * otherwise report best advertised mode. */ + u32 common = ecmd->advertising; + if (mdio_clause45_read(efx, phy_id, MDIO_MMD_AN, + MDIO_MMDREG_STAT1) & + (1 << MDIO_AN_STATUS_AN_DONE_LBN)) { + common &= mdio_clause45_get_an(efx, MDIO_AN_LPA, + xnp_lpa); + } if (common & ADVERTISED_10000baseT_Full) { ecmd->speed = SPEED_10000; ecmd->duplex = DUPLEX_FULL; -- cgit v1.2.1