]> git.proxmox.com Git - mirror_ubuntu-hirsute-kernel.git/commitdiff
ice: Always clear the QRXFLXP_CNTXT register for VF Rx queues
authorBrett Creeley <brett.creeley@intel.com>
Thu, 13 Feb 2020 21:31:18 +0000 (13:31 -0800)
committerJeff Kirsher <jeffrey.t.kirsher@intel.com>
Wed, 19 Feb 2020 21:01:51 +0000 (13:01 -0800)
Currently when the PF reduces its number of channels via ethtool and
then VFs are created there may be stale data for some of the Rx queues
belonging to VFs. This happens when a VF reuses an Rx queue that was
previously used by the PF. Specifically, the QRXFLXP_CNTXT register
will have incorrect values. Fix this by always clearing the relevant
values in the QRXFLXP_CNTXT register for VF queues.

Signed-off-by: Brett Creeley <brett.creeley@intel.com>
Signed-off-by: Tony Nguyen <anthony.l.nguyen@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_base.c
drivers/net/ethernet/intel/ice/ice_hw_autogen.h

index 75cc5a366b269e5cf2a1f4555d1b7dd31835cdec..54aa533f36d4d59ca6f688d8cc6707ac56ec52af 100644 (file)
@@ -386,8 +386,8 @@ int ice_setup_rx_ctx(struct ice_ring *ring)
         /* Enable Flexible Descriptors in the queue context which
          * allows this driver to select a specific receive descriptor format
          */
+       regval = rd32(hw, QRXFLXP_CNTXT(pf_q));
        if (vsi->type != ICE_VSI_VF) {
-               regval = rd32(hw, QRXFLXP_CNTXT(pf_q));
                regval |= (rxdid << QRXFLXP_CNTXT_RXDID_IDX_S) &
                        QRXFLXP_CNTXT_RXDID_IDX_M;
 
@@ -398,8 +398,12 @@ int ice_setup_rx_ctx(struct ice_ring *ring)
                regval |= (0x03 << QRXFLXP_CNTXT_RXDID_PRIO_S) &
                        QRXFLXP_CNTXT_RXDID_PRIO_M;
 
-               wr32(hw, QRXFLXP_CNTXT(pf_q), regval);
+       } else {
+               regval &= ~(QRXFLXP_CNTXT_RXDID_IDX_M |
+                           QRXFLXP_CNTXT_RXDID_PRIO_M |
+                           QRXFLXP_CNTXT_TS_M);
        }
+       wr32(hw, QRXFLXP_CNTXT(pf_q), regval);
 
        /* Absolute queue number out of 2K needs to be passed */
        err = ice_write_rxq_ctx(hw, &rlan_ctx, pf_q);
index 43e4efbccd8e685bd0422db48d277573db933ce9..1d37a9f02c1ca429efcb33bf73e2d92315b3aedc 100644 (file)
@@ -85,6 +85,7 @@
 #define QRXFLXP_CNTXT_RXDID_IDX_M              ICE_M(0x3F, 0)
 #define QRXFLXP_CNTXT_RXDID_PRIO_S             8
 #define QRXFLXP_CNTXT_RXDID_PRIO_M             ICE_M(0x7, 8)
+#define QRXFLXP_CNTXT_TS_M                     BIT(11)
 #define GLGEN_RSTAT                            0x000B8188
 #define GLGEN_RSTAT_DEVSTATE_M                 ICE_M(0x3, 0)
 #define GLGEN_RSTCTL                           0x000B8180