|
@@ -647,6 +647,9 @@ void i40e_reset_vf(struct i40e_vf *vf, bool flr)
|
|
|
int i;
|
|
|
u32 reg;
|
|
|
|
|
|
+ if (test_and_set_bit(__I40E_VF_DISABLE, &pf->state))
|
|
|
+ return;
|
|
|
+
|
|
|
/* warn the VF */
|
|
|
clear_bit(I40E_VF_STAT_ACTIVE, &vf->vf_states);
|
|
|
|
|
@@ -706,6 +709,7 @@ complete_reset:
|
|
|
/* tell the VF the reset is done */
|
|
|
wr32(hw, I40E_VFGEN_RSTAT1(vf->vf_id), I40E_VFR_VFACTIVE);
|
|
|
i40e_flush(hw);
|
|
|
+ clear_bit(__I40E_VF_DISABLE, &pf->state);
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -790,6 +794,8 @@ void i40e_free_vfs(struct i40e_pf *pf)
|
|
|
|
|
|
if (!pf->vf)
|
|
|
return;
|
|
|
+ while (test_and_set_bit(__I40E_VF_DISABLE, &pf->state))
|
|
|
+ usleep_range(1000, 2000);
|
|
|
|
|
|
/* Disable IOV before freeing resources. This lets any VF drivers
|
|
|
* running in the host get themselves cleaned up before we yank
|
|
@@ -800,9 +806,6 @@ void i40e_free_vfs(struct i40e_pf *pf)
|
|
|
|
|
|
msleep(20); /* let any messages in transit get finished up */
|
|
|
|
|
|
- /* Disable interrupt 0 so we don't try to handle the VFLR. */
|
|
|
- i40e_irq_dynamic_disable_icr0(pf);
|
|
|
-
|
|
|
/* free up vf resources */
|
|
|
tmp = pf->num_alloc_vfs;
|
|
|
pf->num_alloc_vfs = 0;
|
|
@@ -834,9 +837,7 @@ void i40e_free_vfs(struct i40e_pf *pf)
|
|
|
dev_warn(&pf->pdev->dev,
|
|
|
"unable to disable SR-IOV because VFs are assigned.\n");
|
|
|
}
|
|
|
-
|
|
|
- /* Re-enable interrupt 0. */
|
|
|
- i40e_irq_dynamic_enable_icr0(pf);
|
|
|
+ clear_bit(__I40E_VF_DISABLE, &pf->state);
|
|
|
}
|
|
|
|
|
|
#ifdef CONFIG_PCI_IOV
|