ice: Reduce wait times during VF bringup/reset
authorBrett Creeley <brett.creeley@intel.com>
Thu, 25 Jul 2019 08:55:37 +0000 (01:55 -0700)
committerJeff Kirsher <jeffrey.t.kirsher@intel.com>
Tue, 20 Aug 2019 21:36:00 +0000 (14:36 -0700)
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>
drivers/net/ethernet/intel/ice/ice_virtchnl_pf.c
drivers/net/ethernet/intel/ice/ice_virtchnl_pf.h

index 54b0e88af4ca8ffa221683b0d9ffee07c6623e75..8a5bf9730fdf5886f5920dcce60110db77e78a22 100644 (file)
@@ -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
         */
index 424bc05389562e30dd0af879e9b2ae8c874b9d3c..79bb47f73879bf3d648ef4a540fcaefe65e35d15 100644 (file)
 #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,