when trigger vf reset, but vf status is not ready, i40e_reset_vf should not do other cleanup action. The current logic is always return true. But it can't cover timeout scenary, and the looping in function i40e_vc_reset_vf is useless. Waiting for 120ms will cover most normal scenary. And the caller function should try again when timeout or accept that resetting vf failed. Signed-off-by: Zhengchao Shao <shaozhengchao@xxxxxxxxxx> --- drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c b/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c index d01fb592778c..42262009a00c 100644 --- a/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c +++ b/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c @@ -1564,11 +1564,17 @@ bool i40e_reset_vf(struct i40e_vf *vf, bool flr) if (flr) usleep_range(10000, 20000); - if (!rsd) - dev_err(&pf->pdev->dev, "VF reset check timeout on VF %d\n", - vf->vf_id); usleep_range(10000, 20000); + if (!rsd) { + reg = rd32(hw, I40E_VPGEN_VFRSTAT(vf->vf_id)); + if (!(reg & I40E_VPGEN_VFRSTAT_VFRD_MASK)) { + dev_err(&pf->pdev->dev, "VF reset check timeout on VF %d\n", + vf->vf_id); + return false; + } + } + /* On initial reset, we don't have any queues to disable */ if (vf->lan_vsi_idx != 0) i40e_vsi_stop_rings(pf->vsi[vf->lan_vsi_idx]); -- 2.17.1