From: Avinash Dayanand <avinash.dayan...@intel.com>

This patch allocates number of queues requested by the user as a part
of TC command when ADq is enabled on a VF.

In order to be consistent in design with PF implementation of ADq,
don't allow to set channels via ethtool from VF when ADq is already
enabled. This means the users will not be able to change the number of
queues/channels via ethtool for a VF when ADq is ON. In order to be
able to use set channels, users will be required to disable ADq first
and then try setting the channels again.

When ADq is enabled on VF, it goes through a reset during which VSIs
and queues are re-configured. Meanwhile if we receive link status
message from PF even before the queues are re-configured, just ignore
this link up message.

Signed-off-by: Avinash Dayanand <avinash.dayan...@intel.com>
Tested-by: Andrew Bowers <andrewx.bow...@intel.com>
Signed-off-by: Jeff Kirsher <jeffrey.t.kirs...@intel.com>
---
 drivers/net/ethernet/intel/i40evf/i40evf_ethtool.c |  6 ++++++
 drivers/net/ethernet/intel/i40evf/i40evf_main.c    | 14 ++++++++++++++
 2 files changed, 20 insertions(+)

diff --git a/drivers/net/ethernet/intel/i40evf/i40evf_ethtool.c 
b/drivers/net/ethernet/intel/i40evf/i40evf_ethtool.c
index aded3ad7763e..e6793255de0b 100644
--- a/drivers/net/ethernet/intel/i40evf/i40evf_ethtool.c
+++ b/drivers/net/ethernet/intel/i40evf/i40evf_ethtool.c
@@ -695,6 +695,12 @@ static int i40evf_set_channels(struct net_device *netdev,
                return -EINVAL;
        }
 
+       if ((adapter->vf_res->vf_cap_flags & VIRTCHNL_VF_OFFLOAD_ADQ) &&
+           adapter->num_tc) {
+               dev_info(&adapter->pdev->dev, "Cannot set channels since ADq is 
enabled.\n");
+               return -EINVAL;
+       }
+
        /* All of these should have already been checked by ethtool before this
         * even gets to us, but just to be sure.
         */
diff --git a/drivers/net/ethernet/intel/i40evf/i40evf_main.c 
b/drivers/net/ethernet/intel/i40evf/i40evf_main.c
index 099d4f59e445..8a26393459ef 100644
--- a/drivers/net/ethernet/intel/i40evf/i40evf_main.c
+++ b/drivers/net/ethernet/intel/i40evf/i40evf_main.c
@@ -1164,6 +1164,9 @@ static int i40evf_alloc_queues(struct i40evf_adapter 
*adapter)
         */
        if (adapter->num_req_queues)
                num_active_queues = adapter->num_req_queues;
+       else if ((adapter->vf_res->vf_cap_flags & VIRTCHNL_VF_OFFLOAD_ADQ) &&
+                adapter->num_tc)
+               num_active_queues = adapter->ch_config.total_qps;
        else
                num_active_queues = min_t(int,
                                          adapter->vsi_res->num_queue_pairs,
@@ -1491,6 +1494,16 @@ int i40evf_init_interrupt_scheme(struct i40evf_adapter 
*adapter)
                goto err_alloc_q_vectors;
        }
 
+       /* If we've made it so far while ADq flag being ON, then we haven't
+        * bailed out anywhere in middle. And ADq isn't just enabled but actual
+        * resources have been allocated in the reset path.
+        * Now we can truly claim that ADq is enabled.
+        */
+       if ((adapter->vf_res->vf_cap_flags & VIRTCHNL_VF_OFFLOAD_ADQ) &&
+           adapter->num_tc)
+               dev_info(&adapter->pdev->dev, "ADq Enabled, %u TCs created",
+                        adapter->num_tc);
+
        dev_info(&adapter->pdev->dev, "Multiqueue %s: Queue pair count = %u",
                 (adapter->num_active_queues > 1) ? "Enabled" : "Disabled",
                 adapter->num_active_queues);
@@ -3263,6 +3276,7 @@ static void i40evf_remove(struct pci_dev *pdev)
        /* Shut down all the garbage mashers on the detention level */
        adapter->state = __I40EVF_REMOVE;
        adapter->aq_required = 0;
+       adapter->flags &= ~I40EVF_FLAG_REINIT_ITR_NEEDED;
        i40evf_request_reset(adapter);
        msleep(50);
        /* If the FW isn't responding, kick it once, but only once. */
-- 
2.14.3

Reply via email to