diff mbox series

[next,S82,6/9] i40e: Fix FLR reset timeout issue

Message ID 20171103110511.76793-6-alice.michael@intel.com
State Changes Requested
Headers show
Series [next,S82,1/9] i40evf: Do not clear MSI-X PBA manually | expand

Commit Message

Michael, Alice Nov. 3, 2017, 11:05 a.m. UTC
From: Filip Sadowski <filip.sadowski@intel.com>

This patch allows detection of upcoming core reset in case NIC gets
stuck while performing FLR reset. The i40e_pf_reset() function returns
I40E_ERR_NOT_READY when global reset was detected.

Signed-off-by: Filip Sadowski <filip.sadowski@intel.com>
---
 drivers/net/ethernet/intel/i40e/i40e_common.c | 7 +++++++
 1 file changed, 7 insertions(+)

Comments

Shannon Nelson Nov. 3, 2017, 8:10 p.m. UTC | #1
On 11/3/2017 4:05 AM, Alice Michael wrote:
> From: Filip Sadowski <filip.sadowski@intel.com>
> 
> This patch allows detection of upcoming core reset in case NIC gets
> stuck while performing FLR reset. The i40e_pf_reset() function returns
> I40E_ERR_NOT_READY when global reset was detected.
> 
> Signed-off-by: Filip Sadowski <filip.sadowski@intel.com>
> ---
>   drivers/net/ethernet/intel/i40e/i40e_common.c | 7 +++++++
>   1 file changed, 7 insertions(+)
> 
> diff --git a/drivers/net/ethernet/intel/i40e/i40e_common.c b/drivers/net/ethernet/intel/i40e/i40e_common.c
> index 5abc83c..c5ae565 100644
> --- a/drivers/net/ethernet/intel/i40e/i40e_common.c
> +++ b/drivers/net/ethernet/intel/i40e/i40e_common.c
> @@ -1269,6 +1269,7 @@ i40e_status i40e_pf_reset(struct i40e_hw *hw)
>   	 * we don't need to do the PF Reset
>   	 */
>   	if (!cnt) {
> +		u32 reg2 = 0;
>   		if (hw->revision_id == 0)
>   			cnt = I40E_PF_RESET_WAIT_COUNT_A0;
>   		else
> @@ -1280,6 +1281,12 @@ i40e_status i40e_pf_reset(struct i40e_hw *hw)
>   			reg = rd32(hw, I40E_PFGEN_CTRL);
>   			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.\n");
> +				hw_dbg(hw, "I40E_GLGEN_RSTAT = 0x%x\n", reg2);

And my first thought at seeing this message would be "so what?"  There 
needs to be something that says this request is getting skipped.

sln

> +				return I40E_ERR_NOT_READY;
> +			}
>   			usleep_range(1000, 2000);
>   		}
>   		if (reg & I40E_PFGEN_CTRL_PFSWR_MASK) {
>
diff mbox series

Patch

diff --git a/drivers/net/ethernet/intel/i40e/i40e_common.c b/drivers/net/ethernet/intel/i40e/i40e_common.c
index 5abc83c..c5ae565 100644
--- a/drivers/net/ethernet/intel/i40e/i40e_common.c
+++ b/drivers/net/ethernet/intel/i40e/i40e_common.c
@@ -1269,6 +1269,7 @@  i40e_status i40e_pf_reset(struct i40e_hw *hw)
 	 * we don't need to do the PF Reset
 	 */
 	if (!cnt) {
+		u32 reg2 = 0;
 		if (hw->revision_id == 0)
 			cnt = I40E_PF_RESET_WAIT_COUNT_A0;
 		else
@@ -1280,6 +1281,12 @@  i40e_status i40e_pf_reset(struct i40e_hw *hw)
 			reg = rd32(hw, I40E_PFGEN_CTRL);
 			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.\n");
+				hw_dbg(hw, "I40E_GLGEN_RSTAT = 0x%x\n", reg2);
+				return I40E_ERR_NOT_READY;
+			}
 			usleep_range(1000, 2000);
 		}
 		if (reg & I40E_PFGEN_CTRL_PFSWR_MASK) {