mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2024-12-28 11:18:45 +07:00
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: Brett Creeley <brett.creeley@intel.com> Tested-by: Andrew Bowers <andrewx.bowers@intel.com> Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
This commit is contained in:
parent
1337175dec
commit
60d628ea27
@ -382,12 +382,15 @@ static void ice_trigger_vf_reset(struct ice_vf *vf, bool is_vflr)
|
||||
|
||||
wr32(hw, PF_PCI_CIAA,
|
||||
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);
|
||||
if ((reg & VF_TRANS_PENDING_M) != 0)
|
||||
dev_err(&pf->pdev->dev,
|
||||
"VF %d PCI transactions stuck\n", vf->vf_id);
|
||||
udelay(1);
|
||||
/* no transactions pending so stop polling */
|
||||
if ((reg & VF_TRANS_PENDING_M) == 0)
|
||||
break;
|
||||
|
||||
dev_err(&pf->pdev->dev,
|
||||
"VF %d PCI transactions stuck\n", vf->vf_id);
|
||||
udelay(ICE_PCI_CIAD_WAIT_DELAY_US);
|
||||
}
|
||||
}
|
||||
|
||||
@ -1068,7 +1071,6 @@ bool ice_reset_all_vfs(struct ice_pf *pf, bool is_vflr)
|
||||
* finished resetting.
|
||||
*/
|
||||
for (i = 0, v = 0; i < 10 && v < pf->num_alloc_vfs; i++) {
|
||||
usleep_range(10000, 20000);
|
||||
|
||||
/* Check each VF in sequence */
|
||||
while (v < pf->num_alloc_vfs) {
|
||||
@ -1076,8 +1078,11 @@ bool ice_reset_all_vfs(struct ice_pf *pf, bool is_vflr)
|
||||
|
||||
vf = &pf->vf[v];
|
||||
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;
|
||||
}
|
||||
|
||||
/* If the current VF has finished resetting, move on
|
||||
* to the next VF in sequence.
|
||||
@ -1091,7 +1096,6 @@ bool ice_reset_all_vfs(struct ice_pf *pf, bool is_vflr)
|
||||
*/
|
||||
if (v < pf->num_alloc_vfs)
|
||||
dev_warn(&pf->pdev->dev, "VF reset check timeout\n");
|
||||
usleep_range(10000, 20000);
|
||||
|
||||
/* free VF resources to begin resetting the VSI state */
|
||||
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)
|
||||
* poll the status register to make sure that the reset
|
||||
* completed successfully.
|
||||
*/
|
||||
usleep_range(10000, 20000);
|
||||
reg = rd32(hw, VPGEN_VFRSTAT(vf->vf_id));
|
||||
if (reg & VPGEN_VFRSTAT_VFRD_M) {
|
||||
rsd = true;
|
||||
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
|
||||
@ -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",
|
||||
vf->vf_id);
|
||||
|
||||
usleep_range(10000, 20000);
|
||||
|
||||
/* disable promiscuous modes in case they were enabled
|
||||
* ignore any error if disabling process failed
|
||||
*/
|
||||
|
@ -22,6 +22,10 @@
|
||||
#define VF_DEVICE_STATUS 0xAA
|
||||
#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 */
|
||||
enum ice_vf_states {
|
||||
ICE_VF_STATE_INIT = 0,
|
||||
|
Loading…
Reference in New Issue
Block a user