]> git.droids-corp.org - dpdk.git/commitdiff
net/fm10k/base: do not stop reset
authorQi Zhang <qi.z.zhang@intel.com>
Wed, 8 Mar 2017 06:19:01 +0000 (01:19 -0500)
committerFerruh Yigit <ferruh.yigit@intel.com>
Tue, 4 Apr 2017 13:52:52 +0000 (15:52 +0200)
Don't report FM10K_ERR_REQUESTS_PENDING when we fail to disable queues
within the timeout. This can occur due to a hardware Tx hang, or when
the switch ethernet fabric is resetting while we are transmitting
traffic. It can sometimes take up to 500ms before the Tx DMA engine
gives up. Instead, just skip the DMA engine check and perform
a data-path reset anyways. Add a statistic counter to keep track of the
number of resets occurring while we have pending DMA on the rings.

In order to prevent having to assign err = FM10K_SUCCESS, re-order the
last few items of the reset_hw_pf function so that we don't perform
"return err" at the end.

Signed-off-by: Qi Zhang <qi.z.zhang@intel.com>
drivers/net/fm10k/base/fm10k_pf.c
drivers/net/fm10k/base/fm10k_type.h
drivers/net/fm10k/base/fm10k_vf.c

index bbc483df643d5945a2aa1fa05ca06482e35297a3..bce29134a961032a0a58efdcc354e08d90d043a1 100644 (file)
@@ -66,21 +66,21 @@ STATIC s32 fm10k_reset_hw_pf(struct fm10k_hw *hw)
 
        /* shut down all rings */
        err = fm10k_disable_queues_generic(hw, FM10K_MAX_QUEUES);
-       if (err)
+       if (err == FM10K_ERR_REQUESTS_PENDING) {
+               hw->mac.reset_while_pending++;
+               goto force_reset;
+       } else if (err) {
                return err;
+       }
 
        /* Verify that DMA is no longer active */
        reg = FM10K_READ_REG(hw, FM10K_DMA_CTRL);
        if (reg & (FM10K_DMA_CTRL_TX_ACTIVE | FM10K_DMA_CTRL_RX_ACTIVE))
                return FM10K_ERR_DMA_PENDING;
 
-       /* verify the switch is ready for reset */
-       reg = FM10K_READ_REG(hw, FM10K_DMA_CTRL2);
-       if (!(reg & FM10K_DMA_CTRL2_SWITCH_READY))
-               goto out;
-
+force_reset:
        /* Inititate data path reset */
-       reg |= FM10K_DMA_CTRL_DATAPATH_RESET;
+       reg = FM10K_DMA_CTRL_DATAPATH_RESET;
        FM10K_WRITE_REG(hw, FM10K_DMA_CTRL, reg);
 
        /* Flush write and allow 100us for reset to complete */
@@ -90,10 +90,9 @@ STATIC s32 fm10k_reset_hw_pf(struct fm10k_hw *hw)
        /* Verify we made it out of reset */
        reg = FM10K_READ_REG(hw, FM10K_IP);
        if (!(reg & FM10K_IP_NOTINRESET))
-               err = FM10K_ERR_RESET_FAILED;
+               return FM10K_ERR_RESET_FAILED;
 
-out:
-       return err;
+       return FM10K_SUCCESS;
 }
 
 /**
index 36b1b62db1baa4033ab3bb0f26d1ff3bb080d0af..0620847a294a91035ddf2f343f8e1b7910e71156 100644 (file)
@@ -640,6 +640,7 @@ struct fm10k_mac_info {
        bool tx_ready;
        u32 dglort_map;
        u8 itr_scale;
+       u64 reset_while_pending;
 };
 
 struct fm10k_swapi_table_info {
index dd3d3187507bb099fadcaf83135e8637166e34f5..71bacd0128e48a27f3efec0cae91368c26f3c522 100644 (file)
@@ -49,7 +49,7 @@ STATIC s32 fm10k_stop_hw_vf(struct fm10k_hw *hw)
 
        /* we need to disable the queues before taking further steps */
        err = fm10k_stop_hw_generic(hw);
-       if (err)
+       if (err && err != FM10K_ERR_REQUESTS_PENDING)
                return err;
 
        /* If permanent address is set then we need to restore it */
@@ -82,7 +82,7 @@ STATIC s32 fm10k_stop_hw_vf(struct fm10k_hw *hw)
                FM10K_WRITE_REG(hw, FM10K_TDLEN(i), tdlen);
        }
 
-       return FM10K_SUCCESS;
+       return err;
 }
 
 /**
@@ -100,7 +100,9 @@ STATIC s32 fm10k_reset_hw_vf(struct fm10k_hw *hw)
 
        /* shut down queues we own and reset DMA configuration */
        err = fm10k_stop_hw_vf(hw);
-       if (err)
+       if (err == FM10K_ERR_REQUESTS_PENDING)
+               hw->mac.reset_while_pending++;
+       else if (err)
                return err;
 
        /* Inititate VF reset */
@@ -113,9 +115,9 @@ STATIC s32 fm10k_reset_hw_vf(struct fm10k_hw *hw)
        /* Clear reset bit and verify it was cleared */
        FM10K_WRITE_REG(hw, FM10K_VFCTRL, 0);
        if (FM10K_READ_REG(hw, FM10K_VFCTRL) & FM10K_VFCTRL_RST)
-               err = FM10K_ERR_RESET_FAILED;
+               return FM10K_ERR_RESET_FAILED;
 
-       return err;
+       return FM10K_SUCCESS;
 }
 
 /**