Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ff6e03fe authored by Aleksandr Loktionov's avatar Aleksandr Loktionov Committed by Greg Kroah-Hartman
Browse files

i40e: Fix call trace in setup_tx_descriptors



[ Upstream commit fd5855e6b1358e816710afee68a1d2bc685176ca ]

After PF reset and ethtool -t there was call trace in dmesg
sometimes leading to panic. When there was some time, around 5
seconds, between reset and test there were no errors.

Problem was that pf reset calls i40e_vsi_close in prep_for_reset
and ethtool -t calls i40e_vsi_close in diag_test. If there was not
enough time between those commands the second i40e_vsi_close starts
before previous i40e_vsi_close was done which leads to crash.

Add check to diag_test if pf is in reset and don't start offline
tests if it is true.
Add netif_info("testing failed") into unhappy path of i40e_diag_test()

Fixes: e17bc411 ("i40e: Disable offline diagnostics if VFs are enabled")
Fixes: 510efb26 ("i40e: Fix ethtool offline diagnostic with netqueues")
Signed-off-by: default avatarMichal Jaron <michalx.jaron@intel.com>
Signed-off-by: default avatarAleksandr Loktionov <aleksandr.loktionov@intel.com>
Tested-by: Gurucharan <gurucharanx.g@intel.com> (A Contingent worker at Intel)
Signed-off-by: default avatarTony Nguyen <anthony.l.nguyen@intel.com>
Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
parent 4b94408e
Loading
Loading
Loading
Loading
+17 −8
Original line number Diff line number Diff line
@@ -2578,15 +2578,16 @@ static void i40e_diag_test(struct net_device *netdev,

		set_bit(__I40E_TESTING, pf->state);

		if (test_bit(__I40E_RESET_RECOVERY_PENDING, pf->state) ||
		    test_bit(__I40E_RESET_INTR_RECEIVED, pf->state)) {
			dev_warn(&pf->pdev->dev,
				 "Cannot start offline testing when PF is in reset state.\n");
			goto skip_ol_tests;
		}

		if (i40e_active_vfs(pf) || i40e_active_vmdqs(pf)) {
			dev_warn(&pf->pdev->dev,
				 "Please take active VFs and Netqueues offline and restart the adapter before running NIC diagnostics\n");
			data[I40E_ETH_TEST_REG]		= 1;
			data[I40E_ETH_TEST_EEPROM]	= 1;
			data[I40E_ETH_TEST_INTR]	= 1;
			data[I40E_ETH_TEST_LINK]	= 1;
			eth_test->flags |= ETH_TEST_FL_FAILED;
			clear_bit(__I40E_TESTING, pf->state);
			goto skip_ol_tests;
		}

@@ -2633,9 +2634,17 @@ static void i40e_diag_test(struct net_device *netdev,
		data[I40E_ETH_TEST_INTR] = 0;
	}

skip_ol_tests:

	netif_info(pf, drv, netdev, "testing finished\n");
	return;

skip_ol_tests:
	data[I40E_ETH_TEST_REG]		= 1;
	data[I40E_ETH_TEST_EEPROM]	= 1;
	data[I40E_ETH_TEST_INTR]	= 1;
	data[I40E_ETH_TEST_LINK]	= 1;
	eth_test->flags |= ETH_TEST_FL_FAILED;
	clear_bit(__I40E_TESTING, pf->state);
	netif_info(pf, drv, netdev, "testing failed\n");
}

static void i40e_get_wol(struct net_device *netdev,