Commit 60d628ea authored by Brett Creeley's avatar Brett Creeley Committed by Jeff Kirsher

ice: Reduce wait times during VF bringup/reset

Currently there are a couple places where the VF is waiting too long when
checking the status of registers. This is causing the AVF driver to
spin for longer than necessary in the __IAVF_STARTUP state. Sometimes
it causes the AVF to go into the __IAVF_COMM_FAILED, which may retrigger
the __IAVF_STARTUP state. Try to reduce the chance of this happening by
removing unnecessary wait times in VF bringup/resets.
Signed-off-by: default avatarBrett Creeley <brett.creeley@intel.com>
Tested-by: default avatarAndrew Bowers <andrewx.bowers@intel.com>
Signed-off-by: default avatarJeff Kirsher <jeffrey.t.kirsher@intel.com>
parent 1337175d
...@@ -382,12 +382,15 @@ static void ice_trigger_vf_reset(struct ice_vf *vf, bool is_vflr) ...@@ -382,12 +382,15 @@ static void ice_trigger_vf_reset(struct ice_vf *vf, bool is_vflr)
wr32(hw, PF_PCI_CIAA, wr32(hw, PF_PCI_CIAA,
VF_DEVICE_STATUS | (vf_abs_id << PF_PCI_CIAA_VF_NUM_S)); VF_DEVICE_STATUS | (vf_abs_id << PF_PCI_CIAA_VF_NUM_S));
for (i = 0; i < 100; i++) { for (i = 0; i < ICE_PCI_CIAD_WAIT_COUNT; i++) {
reg = rd32(hw, PF_PCI_CIAD); reg = rd32(hw, PF_PCI_CIAD);
if ((reg & VF_TRANS_PENDING_M) != 0) /* no transactions pending so stop polling */
if ((reg & VF_TRANS_PENDING_M) == 0)
break;
dev_err(&pf->pdev->dev, dev_err(&pf->pdev->dev,
"VF %d PCI transactions stuck\n", vf->vf_id); "VF %d PCI transactions stuck\n", vf->vf_id);
udelay(1); udelay(ICE_PCI_CIAD_WAIT_DELAY_US);
} }
} }
...@@ -1068,7 +1071,6 @@ bool ice_reset_all_vfs(struct ice_pf *pf, bool is_vflr) ...@@ -1068,7 +1071,6 @@ bool ice_reset_all_vfs(struct ice_pf *pf, bool is_vflr)
* finished resetting. * finished resetting.
*/ */
for (i = 0, v = 0; i < 10 && v < pf->num_alloc_vfs; i++) { for (i = 0, v = 0; i < 10 && v < pf->num_alloc_vfs; i++) {
usleep_range(10000, 20000);
/* Check each VF in sequence */ /* Check each VF in sequence */
while (v < pf->num_alloc_vfs) { while (v < pf->num_alloc_vfs) {
...@@ -1076,8 +1078,11 @@ bool ice_reset_all_vfs(struct ice_pf *pf, bool is_vflr) ...@@ -1076,8 +1078,11 @@ bool ice_reset_all_vfs(struct ice_pf *pf, bool is_vflr)
vf = &pf->vf[v]; vf = &pf->vf[v];
reg = rd32(hw, VPGEN_VFRSTAT(vf->vf_id)); reg = rd32(hw, VPGEN_VFRSTAT(vf->vf_id));
if (!(reg & VPGEN_VFRSTAT_VFRD_M)) if (!(reg & VPGEN_VFRSTAT_VFRD_M)) {
/* only delay if the check failed */
usleep_range(10, 20);
break; break;
}
/* If the current VF has finished resetting, move on /* If the current VF has finished resetting, move on
* to the next VF in sequence. * to the next VF in sequence.
...@@ -1091,7 +1096,6 @@ bool ice_reset_all_vfs(struct ice_pf *pf, bool is_vflr) ...@@ -1091,7 +1096,6 @@ bool ice_reset_all_vfs(struct ice_pf *pf, bool is_vflr)
*/ */
if (v < pf->num_alloc_vfs) if (v < pf->num_alloc_vfs)
dev_warn(&pf->pdev->dev, "VF reset check timeout\n"); dev_warn(&pf->pdev->dev, "VF reset check timeout\n");
usleep_range(10000, 20000);
/* free VF resources to begin resetting the VSI state */ /* free VF resources to begin resetting the VSI state */
for (v = 0; v < pf->num_alloc_vfs; v++) { for (v = 0; v < pf->num_alloc_vfs; v++) {
...@@ -1165,12 +1169,14 @@ static bool ice_reset_vf(struct ice_vf *vf, bool is_vflr) ...@@ -1165,12 +1169,14 @@ static bool ice_reset_vf(struct ice_vf *vf, bool is_vflr)
* poll the status register to make sure that the reset * poll the status register to make sure that the reset
* completed successfully. * completed successfully.
*/ */
usleep_range(10000, 20000);
reg = rd32(hw, VPGEN_VFRSTAT(vf->vf_id)); reg = rd32(hw, VPGEN_VFRSTAT(vf->vf_id));
if (reg & VPGEN_VFRSTAT_VFRD_M) { if (reg & VPGEN_VFRSTAT_VFRD_M) {
rsd = true; rsd = true;
break; break;
} }
/* only sleep if the reset is not done */
usleep_range(10, 20);
} }
/* Display a warning if VF didn't manage to reset in time, but need to /* Display a warning if VF didn't manage to reset in time, but need to
...@@ -1180,8 +1186,6 @@ static bool ice_reset_vf(struct ice_vf *vf, bool is_vflr) ...@@ -1180,8 +1186,6 @@ static bool ice_reset_vf(struct ice_vf *vf, bool is_vflr)
dev_warn(&pf->pdev->dev, "VF reset check timeout on VF %d\n", dev_warn(&pf->pdev->dev, "VF reset check timeout on VF %d\n",
vf->vf_id); vf->vf_id);
usleep_range(10000, 20000);
/* disable promiscuous modes in case they were enabled /* disable promiscuous modes in case they were enabled
* ignore any error if disabling process failed * ignore any error if disabling process failed
*/ */
......
...@@ -22,6 +22,10 @@ ...@@ -22,6 +22,10 @@
#define VF_DEVICE_STATUS 0xAA #define VF_DEVICE_STATUS 0xAA
#define VF_TRANS_PENDING_M 0x20 #define VF_TRANS_PENDING_M 0x20
/* wait defines for polling PF_PCI_CIAD register status */
#define ICE_PCI_CIAD_WAIT_COUNT 100
#define ICE_PCI_CIAD_WAIT_DELAY_US 1
/* Specific VF states */ /* Specific VF states */
enum ice_vf_states { enum ice_vf_states {
ICE_VF_STATE_INIT = 0, ICE_VF_STATE_INIT = 0,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment