ixgbe: Add a new netdev op to allow/prevent a VF from querying an RSS info
authorVlad Zolotarov <vladz@cloudius-systems.com>
Mon, 30 Mar 2015 18:35:24 +0000 (21:35 +0300)
committerJeff Kirsher <jeffrey.t.kirsher@intel.com>
Sat, 11 Apr 2015 05:26:30 +0000 (22:26 -0700)
Implements the new netdev op to allow user to enable/disable the ability
of a specific VF to query its RSS Indirection Table and an RSS Hash Key.

This patch limits the new feature support to 82599 and x540 devices only.
Support for other devices will be added later.

Signed-off-by: Vlad Zolotarov <vladz@cloudius-systems.com>
Tested-by: Phil Schmitt <phillip.j.schmitt@intel.com>
Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
drivers/net/ethernet/intel/ixgbe/ixgbe.h
drivers/net/ethernet/intel/ixgbe/ixgbe_main.c
drivers/net/ethernet/intel/ixgbe/ixgbe_sriov.c
drivers/net/ethernet/intel/ixgbe/ixgbe_sriov.h

index d3d27ec86ad2e39661949662ae6079403f04e7aa..636f9e350162bc58a3ea9fb54c0509934fad8985 100644 (file)
@@ -151,6 +151,7 @@ struct vf_data_storage {
        u16 tx_rate;
        u16 vlan_count;
        u8 spoofchk_enabled;
+       bool rss_query_enabled;
        unsigned int vf_api;
 };
 
index fb096dd7b773033f958fb50bf3044c0ef3d3ba4b..d3f4b0ceb3f781216599408248b351cd4854bc92 100644 (file)
@@ -3658,6 +3658,10 @@ static void ixgbe_configure_virtualization(struct ixgbe_adapter *adapter)
                /* enable ethertype anti spoofing if hw supports it */
                if (hw->mac.ops.set_ethertype_anti_spoofing)
                        hw->mac.ops.set_ethertype_anti_spoofing(hw, true, i);
+
+               /* Enable/Disable RSS query feature  */
+               ixgbe_ndo_set_vf_rss_query_en(adapter->netdev, i,
+                                         adapter->vfinfo[i].rss_query_enabled);
        }
 }
 
@@ -8160,6 +8164,7 @@ static const struct net_device_ops ixgbe_netdev_ops = {
        .ndo_set_vf_vlan        = ixgbe_ndo_set_vf_vlan,
        .ndo_set_vf_rate        = ixgbe_ndo_set_vf_bw,
        .ndo_set_vf_spoofchk    = ixgbe_ndo_set_vf_spoofchk,
+       .ndo_set_vf_rss_query_en = ixgbe_ndo_set_vf_rss_query_en,
        .ndo_get_vf_config      = ixgbe_ndo_get_vf_config,
        .ndo_get_stats64        = ixgbe_get_stats64,
 #ifdef CONFIG_IXGBE_DCB
index 2d98ecdbd3d67cede0261ccf1309841a2b0cc293..94fc43a5f9f7cde20d30821fc7cc418c90641927 100644 (file)
@@ -106,9 +106,18 @@ static int __ixgbe_enable_sriov(struct ixgbe_adapter *adapter)
                adapter->flags2 &= ~(IXGBE_FLAG2_RSC_CAPABLE |
                                     IXGBE_FLAG2_RSC_ENABLED);
 
-               /* enable spoof checking for all VFs */
-               for (i = 0; i < adapter->num_vfs; i++)
+               for (i = 0; i < adapter->num_vfs; i++) {
+                       /* enable spoof checking for all VFs */
                        adapter->vfinfo[i].spoofchk_enabled = true;
+
+                       /* We support VF RSS querying only for 82599 and x540
+                        * devices at the moment. These devices share RSS
+                        * indirection table and RSS hash key with PF therefore
+                        * we want to disable the querying by default.
+                        */
+                       adapter->vfinfo[i].rss_query_enabled = 0;
+               }
+
                return 0;
        }
 
@@ -1331,6 +1340,26 @@ int ixgbe_ndo_set_vf_spoofchk(struct net_device *netdev, int vf, bool setting)
        return 0;
 }
 
+int ixgbe_ndo_set_vf_rss_query_en(struct net_device *netdev, int vf,
+                                 bool setting)
+{
+       struct ixgbe_adapter *adapter = netdev_priv(netdev);
+
+       /* This operation is currently supported only for 82599 and x540
+        * devices.
+        */
+       if (adapter->hw.mac.type < ixgbe_mac_82599EB ||
+           adapter->hw.mac.type >= ixgbe_mac_X550)
+               return -EOPNOTSUPP;
+
+       if (vf >= adapter->num_vfs)
+               return -EINVAL;
+
+       adapter->vfinfo[vf].rss_query_enabled = setting;
+
+       return 0;
+}
+
 int ixgbe_ndo_get_vf_config(struct net_device *netdev,
                            int vf, struct ifla_vf_info *ivi)
 {
@@ -1344,5 +1373,6 @@ int ixgbe_ndo_get_vf_config(struct net_device *netdev,
        ivi->vlan = adapter->vfinfo[vf].pf_vlan;
        ivi->qos = adapter->vfinfo[vf].pf_qos;
        ivi->spoofchk = adapter->vfinfo[vf].spoofchk_enabled;
+       ivi->rss_query_en = adapter->vfinfo[vf].rss_query_enabled;
        return 0;
 }
index 32c26d586c01e1c5d561922774df4b250d3fdd73..2c197e6d1fe7c3cb66c1be785bba2a8084e806fa 100644 (file)
@@ -47,6 +47,8 @@ int ixgbe_ndo_set_vf_vlan(struct net_device *netdev, int queue, u16 vlan,
 int ixgbe_ndo_set_vf_bw(struct net_device *netdev, int vf, int min_tx_rate,
                        int max_tx_rate);
 int ixgbe_ndo_set_vf_spoofchk(struct net_device *netdev, int vf, bool setting);
+int ixgbe_ndo_set_vf_rss_query_en(struct net_device *netdev, int vf,
+                                 bool setting);
 int ixgbe_ndo_get_vf_config(struct net_device *netdev,
                            int vf, struct ifla_vf_info *ivi);
 void ixgbe_check_vf_rate_limit(struct ixgbe_adapter *adapter);