Thomas Bogendoerfer f1692f
From: Mateusz Palczewski <mateusz.palczewski@intel.com>
Thomas Bogendoerfer f1692f
Date: Tue, 9 Feb 2021 11:59:38 +0000
Thomas Bogendoerfer f1692f
Subject: iavf: Fix return of set the new channel count
Thomas Bogendoerfer f1692f
Patch-mainline: v5.16-rc2
Thomas Bogendoerfer f1692f
Git-commit: 4e5e6b5d9d1334d3490326b6922a2daaf56a867f
Thomas Bogendoerfer f1692f
References: jsc#SLE-18385
Thomas Bogendoerfer f1692f
Thomas Bogendoerfer f1692f
Fixed return correct code from set the new channel count.
Thomas Bogendoerfer f1692f
Implemented by check if reset is done in appropriate time.
Thomas Bogendoerfer f1692f
This solution give a extra time to pf for reset vf in case
Thomas Bogendoerfer f1692f
when user want set new channel count for all vfs.
Thomas Bogendoerfer f1692f
Without this patch it is possible to return misleading output
Thomas Bogendoerfer f1692f
code to user and vf reset not to be correctly performed by pf.
Thomas Bogendoerfer f1692f
Thomas Bogendoerfer f1692f
Fixes: 5520deb15326 ("iavf: Enable support for up to 16 queues")
Thomas Bogendoerfer f1692f
Signed-off-by: Grzegorz Szczurek <grzegorzx.szczurek@intel.com>
Thomas Bogendoerfer f1692f
Signed-off-by: Mateusz Palczewski <mateusz.palczewski@intel.com>
Thomas Bogendoerfer f1692f
Tested-by: Konrad Jankowski <konrad0.jankowski@intel.com>
Thomas Bogendoerfer f1692f
Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
Thomas Bogendoerfer f1692f
Acked-by: Thomas Bogendoerfer <tbogendoerfer@suse.de>
Thomas Bogendoerfer f1692f
---
Thomas Bogendoerfer f1692f
 drivers/net/ethernet/intel/iavf/iavf_ethtool.c |   15 +++++++++++++++
Thomas Bogendoerfer f1692f
 1 file changed, 15 insertions(+)
Thomas Bogendoerfer f1692f
Thomas Bogendoerfer f1692f
--- a/drivers/net/ethernet/intel/iavf/iavf_ethtool.c
Thomas Bogendoerfer f1692f
+++ b/drivers/net/ethernet/intel/iavf/iavf_ethtool.c
Thomas Bogendoerfer f1692f
@@ -1776,6 +1776,7 @@ static int iavf_set_channels(struct net_
Thomas Bogendoerfer f1692f
 {
Thomas Bogendoerfer f1692f
 	struct iavf_adapter *adapter = netdev_priv(netdev);
Thomas Bogendoerfer f1692f
 	u32 num_req = ch->combined_count;
Thomas Bogendoerfer f1692f
+	int i;
Thomas Bogendoerfer f1692f
 
Thomas Bogendoerfer f1692f
 	if ((adapter->vf_res->vf_cap_flags & VIRTCHNL_VF_OFFLOAD_ADQ) &&
Thomas Bogendoerfer f1692f
 	    adapter->num_tc) {
Thomas Bogendoerfer f1692f
@@ -1798,6 +1799,20 @@ static int iavf_set_channels(struct net_
Thomas Bogendoerfer f1692f
 	adapter->num_req_queues = num_req;
Thomas Bogendoerfer f1692f
 	adapter->flags |= IAVF_FLAG_REINIT_ITR_NEEDED;
Thomas Bogendoerfer f1692f
 	iavf_schedule_reset(adapter);
Thomas Bogendoerfer f1692f
+
Thomas Bogendoerfer f1692f
+	/* wait for the reset is done */
Thomas Bogendoerfer f1692f
+	for (i = 0; i < IAVF_RESET_WAIT_COMPLETE_COUNT; i++) {
Thomas Bogendoerfer f1692f
+		msleep(IAVF_RESET_WAIT_MS);
Thomas Bogendoerfer f1692f
+		if (adapter->flags & IAVF_FLAG_RESET_PENDING)
Thomas Bogendoerfer f1692f
+			continue;
Thomas Bogendoerfer f1692f
+		break;
Thomas Bogendoerfer f1692f
+	}
Thomas Bogendoerfer f1692f
+	if (i == IAVF_RESET_WAIT_COMPLETE_COUNT) {
Thomas Bogendoerfer f1692f
+		adapter->flags &= ~IAVF_FLAG_REINIT_ITR_NEEDED;
Thomas Bogendoerfer f1692f
+		adapter->num_active_queues = num_req;
Thomas Bogendoerfer f1692f
+		return -EOPNOTSUPP;
Thomas Bogendoerfer f1692f
+	}
Thomas Bogendoerfer f1692f
+
Thomas Bogendoerfer f1692f
 	return 0;
Thomas Bogendoerfer f1692f
 }
Thomas Bogendoerfer f1692f