Thomas Bogendoerfer 57545a
From: Michal Jaron <michalx.jaron@intel.com>
Thomas Bogendoerfer 57545a
Date: Mon, 24 Oct 2022 10:19:42 +0200
Thomas Bogendoerfer 57545a
Subject: i40e: Fix not setting default xps_cpus after reset
Thomas Bogendoerfer 57545a
Patch-mainline: v6.1
Thomas Bogendoerfer 57545a
Git-commit: 82e0572b23029b380464fa9fdc125db9c1506d0a
Thomas Bogendoerfer 57545a
References: git-fixes
Thomas Bogendoerfer 57545a
Thomas Bogendoerfer 57545a
During tx rings configuration default XPS queue config is set and
Thomas Bogendoerfer 57545a
__I40E_TX_XPS_INIT_DONE is locked. __I40E_TX_XPS_INIT_DONE state is
Thomas Bogendoerfer 57545a
cleared and set again with default mapping only during queues build,
Thomas Bogendoerfer 57545a
it means after first setup or reset with queues rebuild. (i.e.
Thomas Bogendoerfer 57545a
ethtool -L <interface> combined <number>) After other resets (i.e.
Thomas Bogendoerfer 57545a
ethtool -t <interface>) XPS_INIT_DONE is not cleared and those default
Thomas Bogendoerfer 57545a
maps cannot be set again. It results in cleared xps_cpus mapping
Thomas Bogendoerfer 57545a
until queues are not rebuild or mapping is not set by user.
Thomas Bogendoerfer 57545a
Thomas Bogendoerfer 57545a
Add clearing __I40E_TX_XPS_INIT_DONE state during reset to let
Thomas Bogendoerfer 57545a
the driver set xps_cpus to defaults again after it was cleared.
Thomas Bogendoerfer 57545a
Thomas Bogendoerfer 57545a
Fixes: 6f853d4f8e93 ("i40e: allow XPS with QoS enabled")
Thomas Bogendoerfer 57545a
Signed-off-by: Michal Jaron <michalx.jaron@intel.com>
Thomas Bogendoerfer 57545a
Signed-off-by: Kamil Maziarz <kamil.maziarz@intel.com>
Thomas Bogendoerfer 57545a
Tested-by: Gurucharan <gurucharanx.g@intel.com> (A Contingent worker at Intel)
Thomas Bogendoerfer 57545a
Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
Thomas Bogendoerfer 57545a
Acked-by: Thomas Bogendoerfer <tbogendoerfer@suse.de>
Thomas Bogendoerfer 57545a
---
Thomas Bogendoerfer 57545a
 drivers/net/ethernet/intel/i40e/i40e_main.c |   19 ++++++++++++++++++-
Thomas Bogendoerfer 57545a
 1 file changed, 18 insertions(+), 1 deletion(-)
Thomas Bogendoerfer 57545a
Thomas Bogendoerfer 57545a
--- a/drivers/net/ethernet/intel/i40e/i40e_main.c
Thomas Bogendoerfer 57545a
+++ b/drivers/net/ethernet/intel/i40e/i40e_main.c
Thomas Bogendoerfer 57545a
@@ -10495,6 +10495,21 @@ static int i40e_rebuild_channels(struct
Thomas Bogendoerfer 57545a
 }
Thomas Bogendoerfer 57545a
 
Thomas Bogendoerfer 57545a
 /**
Thomas Bogendoerfer 57545a
+ * i40e_clean_xps_state - clean xps state for every tx_ring
Thomas Bogendoerfer 57545a
+ * @vsi: ptr to the VSI
Thomas Bogendoerfer 57545a
+ **/
Thomas Bogendoerfer 57545a
+static void i40e_clean_xps_state(struct i40e_vsi *vsi)
Thomas Bogendoerfer 57545a
+{
Thomas Bogendoerfer 57545a
+	int i;
Thomas Bogendoerfer 57545a
+
Thomas Bogendoerfer 57545a
+	if (vsi->tx_rings)
Thomas Bogendoerfer 57545a
+		for (i = 0; i < vsi->num_queue_pairs; i++)
Thomas Bogendoerfer 57545a
+			if (vsi->tx_rings[i])
Thomas Bogendoerfer 57545a
+				clear_bit(__I40E_TX_XPS_INIT_DONE,
Thomas Bogendoerfer 57545a
+					  vsi->tx_rings[i]->state);
Thomas Bogendoerfer 57545a
+}
Thomas Bogendoerfer 57545a
+
Thomas Bogendoerfer 57545a
+/**
Thomas Bogendoerfer 57545a
  * i40e_prep_for_reset - prep for the core to reset
Thomas Bogendoerfer 57545a
  * @pf: board private structure
Thomas Bogendoerfer 57545a
  *
Thomas Bogendoerfer 57545a
@@ -10518,8 +10533,10 @@ static void i40e_prep_for_reset(struct i
Thomas Bogendoerfer 57545a
 	i40e_pf_quiesce_all_vsi(pf);
Thomas Bogendoerfer 57545a
 
Thomas Bogendoerfer 57545a
 	for (v = 0; v < pf->num_alloc_vsi; v++) {
Thomas Bogendoerfer 57545a
-		if (pf->vsi[v])
Thomas Bogendoerfer 57545a
+		if (pf->vsi[v]) {
Thomas Bogendoerfer 57545a
+			i40e_clean_xps_state(pf->vsi[v]);
Thomas Bogendoerfer 57545a
 			pf->vsi[v]->seid = 0;
Thomas Bogendoerfer 57545a
+		}
Thomas Bogendoerfer 57545a
 	}
Thomas Bogendoerfer 57545a
 
Thomas Bogendoerfer 57545a
 	i40e_shutdown_adminq(&pf->hw);