diff options
author | Ben Hutchings <bhutchings@solarflare.com> | 2008-12-26 16:49:25 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2008-12-26 16:49:25 -0500 |
commit | 843813453f52e3378fc988c8364063fd4cb9d0e3 (patch) | |
tree | d17c5d80afd77f58e95dccaff53d6e4c671b3fa6 /drivers/net/sfc/mdio_10g.c | |
parent | f4bd954e7c24063b15fa9abc8b4b1242772928ed (diff) |
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 <bhutchings@solarflare.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/sfc/mdio_10g.c')
-rw-r--r-- | drivers/net/sfc/mdio_10g.c | 17 |
1 files 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, | |||
368 | } else | 368 | } else |
369 | ecmd->autoneg = AUTONEG_DISABLE; | 369 | ecmd->autoneg = AUTONEG_DISABLE; |
370 | 370 | ||
371 | /* If AN is enabled and complete, report best common mode */ | 371 | if (ecmd->autoneg) { |
372 | if (ecmd->autoneg && | 372 | /* If AN is complete, report best common mode, |
373 | (mdio_clause45_read(efx, phy_id, MDIO_MMD_AN, MDIO_MMDREG_STAT1) & | 373 | * otherwise report best advertised mode. */ |
374 | (1 << MDIO_AN_STATUS_AN_DONE_LBN))) { | 374 | u32 common = ecmd->advertising; |
375 | u32 common, lpa; | 375 | if (mdio_clause45_read(efx, phy_id, MDIO_MMD_AN, |
376 | lpa = mdio_clause45_get_an(efx, MDIO_AN_LPA, xnp_lpa); | 376 | MDIO_MMDREG_STAT1) & |
377 | common = ecmd->advertising & lpa; | 377 | (1 << MDIO_AN_STATUS_AN_DONE_LBN)) { |
378 | common &= mdio_clause45_get_an(efx, MDIO_AN_LPA, | ||
379 | xnp_lpa); | ||
380 | } | ||
378 | if (common & ADVERTISED_10000baseT_Full) { | 381 | if (common & ADVERTISED_10000baseT_Full) { |
379 | ecmd->speed = SPEED_10000; | 382 | ecmd->speed = SPEED_10000; |
380 | ecmd->duplex = DUPLEX_FULL; | 383 | ecmd->duplex = DUPLEX_FULL; |