Commit a5692e49 authored by Ben Hutchings's avatar Ben Hutchings Committed by David S. Miller
Browse files

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

parent caa8d8bb
Loading
Loading
Loading
Loading
+7 −12
Original line number Diff line number Diff line
@@ -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;