提交 a5692e49 编写于 作者: B Ben Hutchings 提交者: David S. Miller

sfc: Clean up PHY mode management in loopback self-test

Signed-off-by: NBen Hutchings <bhutchings@solarflare.com>
Signed-off-by: NDavid S. Miller <davem@davemloft.net>
上级 caa8d8bb
...@@ -564,8 +564,7 @@ efx_test_loopback(struct efx_tx_queue *tx_queue, ...@@ -564,8 +564,7 @@ efx_test_loopback(struct efx_tx_queue *tx_queue,
return 0; return 0;
} }
static int efx_test_loopbacks(struct efx_nic *efx, struct ethtool_cmd ecmd, static int efx_test_loopbacks(struct efx_nic *efx, struct efx_self_tests *tests,
struct efx_self_tests *tests,
unsigned int loopback_modes) unsigned int loopback_modes)
{ {
enum efx_loopback_mode mode; enum efx_loopback_mode mode;
...@@ -693,7 +692,7 @@ int efx_offline_test(struct efx_nic *efx, ...@@ -693,7 +692,7 @@ int efx_offline_test(struct efx_nic *efx,
{ {
enum efx_loopback_mode loopback_mode = efx->loopback_mode; enum efx_loopback_mode loopback_mode = efx->loopback_mode;
int phy_mode = efx->phy_mode; int phy_mode = efx->phy_mode;
struct ethtool_cmd ecmd, ecmd_test; struct ethtool_cmd ecmd;
int rc, rc2 = 0; int rc, rc2 = 0;
/* force the carrier state off so the kernel doesn't transmit during /* force the carrier state off so the kernel doesn't transmit during
...@@ -724,16 +723,12 @@ int efx_offline_test(struct efx_nic *efx, ...@@ -724,16 +723,12 @@ int efx_offline_test(struct efx_nic *efx,
/* reset the chip to recover from the register test */ /* reset the chip to recover from the register test */
rc = falcon_reset_hw(efx, RESET_TYPE_ALL); rc = falcon_reset_hw(efx, RESET_TYPE_ALL);
/* Modify the saved ecmd so that when efx_reset_up() restores the phy /* Ensure that the phy is powered and out of loopback
* state, AN is disabled, and the phy is powered, and out of loopback */ * for the bist and loopback tests */
memcpy(&ecmd_test, &ecmd, sizeof(ecmd_test)); efx->phy_mode &= ~PHY_MODE_LOW_POWER;
if (ecmd_test.autoneg == AUTONEG_ENABLE) {
ecmd_test.autoneg = AUTONEG_DISABLE;
ecmd_test.duplex = DUPLEX_FULL;
}
efx->loopback_mode = LOOPBACK_NONE; efx->loopback_mode = LOOPBACK_NONE;
rc = efx_reset_up(efx, &ecmd_test, rc == 0); rc = efx_reset_up(efx, &ecmd, rc == 0);
if (rc) { if (rc) {
EFX_ERR(efx, "Unable to recover from chip test\n"); EFX_ERR(efx, "Unable to recover from chip test\n");
efx_schedule_reset(efx, RESET_TYPE_DISABLE); efx_schedule_reset(efx, RESET_TYPE_DISABLE);
...@@ -744,7 +739,7 @@ int efx_offline_test(struct efx_nic *efx, ...@@ -744,7 +739,7 @@ int efx_offline_test(struct efx_nic *efx,
if (rc && !rc2) if (rc && !rc2)
rc2 = rc; rc2 = rc;
rc = efx_test_loopbacks(efx, ecmd_test, tests, loopback_modes); rc = efx_test_loopbacks(efx, tests, loopback_modes);
if (rc && !rc2) if (rc && !rc2)
rc2 = rc; rc2 = rc;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册