diff options
author | Ben Hutchings <bhutchings@solarflare.com> | 2008-12-26 22:46:38 +0100 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2008-12-26 22:46:38 +0100 |
commit | a5692e49cd9e6512c48ebf61e52991cbe643c12d (patch) | |
tree | 194cc3f4a1a1822b41408781a3641c4b483a1a11 /drivers/net/sfc | |
parent | sfc: Fix unreliable link detection in some loopback modes (diff) | |
download | linux-a5692e49cd9e6512c48ebf61e52991cbe643c12d.tar.xz linux-a5692e49cd9e6512c48ebf61e52991cbe643c12d.zip |
sfc: Clean up PHY mode management in loopback self-test
Signed-off-by: Ben Hutchings <bhutchings@solarflare.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/sfc')
-rw-r--r-- | drivers/net/sfc/selftest.c | 19 |
1 files changed, 7 insertions, 12 deletions
diff --git a/drivers/net/sfc/selftest.c b/drivers/net/sfc/selftest.c index 6bb09f263b33..7813ab354411 100644 --- a/drivers/net/sfc/selftest.c +++ b/drivers/net/sfc/selftest.c @@ -564,8 +564,7 @@ efx_test_loopback(struct efx_tx_queue *tx_queue, return 0; } -static int efx_test_loopbacks(struct efx_nic *efx, struct ethtool_cmd ecmd, - struct efx_self_tests *tests, +static int efx_test_loopbacks(struct efx_nic *efx, struct efx_self_tests *tests, unsigned int loopback_modes) { enum efx_loopback_mode mode; @@ -693,7 +692,7 @@ int efx_offline_test(struct efx_nic *efx, { enum efx_loopback_mode loopback_mode = efx->loopback_mode; int phy_mode = efx->phy_mode; - struct ethtool_cmd ecmd, ecmd_test; + struct ethtool_cmd ecmd; int rc, rc2 = 0; /* force the carrier state off so the kernel doesn't transmit during @@ -724,16 +723,12 @@ int efx_offline_test(struct efx_nic *efx, /* reset the chip to recover from the register test */ rc = falcon_reset_hw(efx, RESET_TYPE_ALL); - /* Modify the saved ecmd so that when efx_reset_up() restores the phy - * state, AN is disabled, and the phy is powered, and out of loopback */ - memcpy(&ecmd_test, &ecmd, sizeof(ecmd_test)); - if (ecmd_test.autoneg == AUTONEG_ENABLE) { - ecmd_test.autoneg = AUTONEG_DISABLE; - ecmd_test.duplex = DUPLEX_FULL; - } + /* Ensure that the phy is powered and out of loopback + * for the bist and loopback tests */ + efx->phy_mode &= ~PHY_MODE_LOW_POWER; efx->loopback_mode = LOOPBACK_NONE; - rc = efx_reset_up(efx, &ecmd_test, rc == 0); + rc = efx_reset_up(efx, &ecmd, rc == 0); if (rc) { EFX_ERR(efx, "Unable to recover from chip test\n"); efx_schedule_reset(efx, RESET_TYPE_DISABLE); @@ -744,7 +739,7 @@ int efx_offline_test(struct efx_nic *efx, if (rc && !rc2) rc2 = rc; - rc = efx_test_loopbacks(efx, ecmd_test, tests, loopback_modes); + rc = efx_test_loopbacks(efx, tests, loopback_modes); if (rc && !rc2) rc2 = rc; |