forked from Minki/linux
i40e: Fix an issue when PF reset fails
We shouldn't restart Admin queue subtask if PF reset fails since we do not have the AQ setup at that point. This patch makes sure we disable AQ clean subtask when PF reset fails. This will resolve an occasional kernel panic when PF reset fails for some reason. Change-ID: I11a747773362a8c5c0ad7a10cd34be0bda8eb9e8 Signed-off-by: Anjali Singhai Jain <anjali.singhai@intel.com> Tested-by: Jim Young <jamesx.m.young@intel.com> Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
This commit is contained in:
parent
faf3297861
commit
a316f651c7
@ -145,6 +145,7 @@ enum i40e_state_t {
|
|||||||
__I40E_BAD_EEPROM,
|
__I40E_BAD_EEPROM,
|
||||||
__I40E_DOWN_REQUESTED,
|
__I40E_DOWN_REQUESTED,
|
||||||
__I40E_FD_FLUSH_REQUESTED,
|
__I40E_FD_FLUSH_REQUESTED,
|
||||||
|
__I40E_RESET_FAILED,
|
||||||
};
|
};
|
||||||
|
|
||||||
enum i40e_interrupt_policy {
|
enum i40e_interrupt_policy {
|
||||||
|
@ -5568,6 +5568,10 @@ static void i40e_clean_adminq_subtask(struct i40e_pf *pf)
|
|||||||
u32 oldval;
|
u32 oldval;
|
||||||
u32 val;
|
u32 val;
|
||||||
|
|
||||||
|
/* Do not run clean AQ when PF reset fails */
|
||||||
|
if (test_bit(__I40E_RESET_FAILED, &pf->state))
|
||||||
|
return;
|
||||||
|
|
||||||
/* check for error indications */
|
/* check for error indications */
|
||||||
val = rd32(&pf->hw, pf->hw.aq.arq.len);
|
val = rd32(&pf->hw, pf->hw.aq.arq.len);
|
||||||
oldval = val;
|
oldval = val;
|
||||||
@ -5973,19 +5977,20 @@ static void i40e_reset_and_rebuild(struct i40e_pf *pf, bool reinit)
|
|||||||
ret = i40e_pf_reset(hw);
|
ret = i40e_pf_reset(hw);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
dev_info(&pf->pdev->dev, "PF reset failed, %d\n", ret);
|
dev_info(&pf->pdev->dev, "PF reset failed, %d\n", ret);
|
||||||
goto end_core_reset;
|
set_bit(__I40E_RESET_FAILED, &pf->state);
|
||||||
|
goto clear_recovery;
|
||||||
}
|
}
|
||||||
pf->pfr_count++;
|
pf->pfr_count++;
|
||||||
|
|
||||||
if (test_bit(__I40E_DOWN, &pf->state))
|
if (test_bit(__I40E_DOWN, &pf->state))
|
||||||
goto end_core_reset;
|
goto clear_recovery;
|
||||||
dev_dbg(&pf->pdev->dev, "Rebuilding internal switch\n");
|
dev_dbg(&pf->pdev->dev, "Rebuilding internal switch\n");
|
||||||
|
|
||||||
/* rebuild the basics for the AdminQ, HMC, and initial HW switch */
|
/* rebuild the basics for the AdminQ, HMC, and initial HW switch */
|
||||||
ret = i40e_init_adminq(&pf->hw);
|
ret = i40e_init_adminq(&pf->hw);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
dev_info(&pf->pdev->dev, "Rebuild AdminQ failed, %d\n", ret);
|
dev_info(&pf->pdev->dev, "Rebuild AdminQ failed, %d\n", ret);
|
||||||
goto end_core_reset;
|
goto clear_recovery;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* re-verify the eeprom if we just had an EMP reset */
|
/* re-verify the eeprom if we just had an EMP reset */
|
||||||
@ -6103,6 +6108,8 @@ static void i40e_reset_and_rebuild(struct i40e_pf *pf, bool reinit)
|
|||||||
i40e_send_version(pf);
|
i40e_send_version(pf);
|
||||||
|
|
||||||
end_core_reset:
|
end_core_reset:
|
||||||
|
clear_bit(__I40E_RESET_FAILED, &pf->state);
|
||||||
|
clear_recovery:
|
||||||
clear_bit(__I40E_RESET_RECOVERY_PENDING, &pf->state);
|
clear_bit(__I40E_RESET_RECOVERY_PENDING, &pf->state);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user