|
@@ -1208,6 +1208,29 @@ static enum i40e_media_type i40e_get_media_type(struct i40e_hw *hw)
|
|
|
return media;
|
|
|
}
|
|
|
|
|
|
+/**
|
|
|
+ * i40e_poll_globr - Poll for Global Reset completion
|
|
|
+ * @hw: pointer to the hardware structure
|
|
|
+ * @retry_limit: how many times to retry before failure
|
|
|
+ **/
|
|
|
+static i40e_status i40e_poll_globr(struct i40e_hw *hw,
|
|
|
+ u32 retry_limit)
|
|
|
+{
|
|
|
+ u32 cnt, reg = 0;
|
|
|
+
|
|
|
+ for (cnt = 0; cnt < retry_limit; cnt++) {
|
|
|
+ reg = rd32(hw, I40E_GLGEN_RSTAT);
|
|
|
+ if (!(reg & I40E_GLGEN_RSTAT_DEVSTATE_MASK))
|
|
|
+ return 0;
|
|
|
+ msleep(100);
|
|
|
+ }
|
|
|
+
|
|
|
+ hw_dbg(hw, "Global reset failed.\n");
|
|
|
+ hw_dbg(hw, "I40E_GLGEN_RSTAT = 0x%x\n", reg);
|
|
|
+
|
|
|
+ return I40E_ERR_RESET_FAILED;
|
|
|
+}
|
|
|
+
|
|
|
#define I40E_PF_RESET_WAIT_COUNT_A0 200
|
|
|
#define I40E_PF_RESET_WAIT_COUNT 200
|
|
|
/**
|
|
@@ -1284,14 +1307,14 @@ i40e_status i40e_pf_reset(struct i40e_hw *hw)
|
|
|
if (!(reg & I40E_PFGEN_CTRL_PFSWR_MASK))
|
|
|
break;
|
|
|
reg2 = rd32(hw, I40E_GLGEN_RSTAT);
|
|
|
- if (reg2 & I40E_GLGEN_RSTAT_DEVSTATE_MASK) {
|
|
|
- hw_dbg(hw, "Core reset upcoming. Skipping PF reset request.\n");
|
|
|
- hw_dbg(hw, "I40E_GLGEN_RSTAT = 0x%x\n", reg2);
|
|
|
- return I40E_ERR_NOT_READY;
|
|
|
- }
|
|
|
+ if (reg2 & I40E_GLGEN_RSTAT_DEVSTATE_MASK)
|
|
|
+ break;
|
|
|
usleep_range(1000, 2000);
|
|
|
}
|
|
|
- if (reg & I40E_PFGEN_CTRL_PFSWR_MASK) {
|
|
|
+ if (reg2 & I40E_GLGEN_RSTAT_DEVSTATE_MASK) {
|
|
|
+ if (i40e_poll_globr(hw, grst_del))
|
|
|
+ return I40E_ERR_RESET_FAILED;
|
|
|
+ } else if (reg & I40E_PFGEN_CTRL_PFSWR_MASK) {
|
|
|
hw_dbg(hw, "PF reset polling failed to complete.\n");
|
|
|
return I40E_ERR_RESET_FAILED;
|
|
|
}
|