i40e: Patch to enable Ethtool/netdev feature flag for NTUPLE control
authorAnjali Singhai Jain <anjali.singhai@intel.com>
Fri, 14 Feb 2014 02:14:38 +0000 (02:14 +0000)
committerJeff Kirsher <jeffrey.t.kirsher@intel.com>
Thu, 20 Mar 2014 00:17:20 +0000 (17:17 -0700)
This enables option '-k/-K' in ethtool for NTUPLE control.
NTUPLE control requires a reset, to take effect. When the feature is
turned off, the SW list of stored FD SB filters gets cleaned up.

Change-ID: I9d564b67a10d4afa11de3b320d601c3d2e6edc1f
Signed-off-by: Anjali Singhai Jain <anjali.singhai@intel.com>
Signed-off-by: Catherine Sullivan <catherine.sullivan@intel.com>
Tested-by: Kavindya Deegala <kavindya.s.deegala@intel.com>
Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
drivers/net/ethernet/intel/i40e/i40e.h
drivers/net/ethernet/intel/i40e/i40e_main.c

index bd1b4690a6089436e79031126d2f362a52850883..ac04112615cf0fdab01842cc4b8bbbead2d1107b 100644 (file)
@@ -558,6 +558,7 @@ int i40e_add_del_fdir(struct i40e_vsi *vsi,
                      struct i40e_fdir_filter *input, bool add);
 void i40e_fdir_check_and_reenable(struct i40e_pf *pf);
 int i40e_get_current_fd_count(struct i40e_pf *pf);
+bool i40e_set_ntuple(struct i40e_pf *pf, netdev_features_t features);
 void i40e_set_ethtool_ops(struct net_device *netdev);
 struct i40e_mac_filter *i40e_add_filter(struct i40e_vsi *vsi,
                                        u8 *macaddr, s16 vlan,
index 9c4f53ef957da72a390097356a3e630e90e998b6..5015dad9bdadf933bb62f01aab524a19cbf2291c 100644 (file)
@@ -6408,6 +6408,39 @@ sw_init_done:
        return err;
 }
 
+/**
+ * i40e_set_ntuple - set the ntuple feature flag and take action
+ * @pf: board private structure to initialize
+ * @features: the feature set that the stack is suggesting
+ *
+ * returns a bool to indicate if reset needs to happen
+ **/
+bool i40e_set_ntuple(struct i40e_pf *pf, netdev_features_t features)
+{
+       bool need_reset = false;
+
+       /* Check if Flow Director n-tuple support was enabled or disabled.  If
+        * the state changed, we need to reset.
+        */
+       if (features & NETIF_F_NTUPLE) {
+               /* Enable filters and mark for reset */
+               if (!(pf->flags & I40E_FLAG_FD_SB_ENABLED))
+                       need_reset = true;
+               pf->flags |= I40E_FLAG_FD_SB_ENABLED;
+       } else {
+               /* turn off filters, mark for reset and clear SW filter list */
+               if (pf->flags & I40E_FLAG_FD_SB_ENABLED) {
+                       need_reset = true;
+                       i40e_fdir_filter_exit(pf);
+               }
+               pf->flags &= ~I40E_FLAG_FD_SB_ENABLED;
+               /* if ATR was disabled it can be re-enabled. */
+               if (!(pf->flags & I40E_FLAG_FD_ATR_ENABLED))
+                       pf->flags |= I40E_FLAG_FD_ATR_ENABLED;
+       }
+       return need_reset;
+}
+
 /**
  * i40e_set_features - set the netdev feature flags
  * @netdev: ptr to the netdev being adjusted
@@ -6418,12 +6451,19 @@ static int i40e_set_features(struct net_device *netdev,
 {
        struct i40e_netdev_priv *np = netdev_priv(netdev);
        struct i40e_vsi *vsi = np->vsi;
+       struct i40e_pf *pf = vsi->back;
+       bool need_reset;
 
        if (features & NETIF_F_HW_VLAN_CTAG_RX)
                i40e_vlan_stripping_enable(vsi);
        else
                i40e_vlan_stripping_disable(vsi);
 
+       need_reset = i40e_set_ntuple(pf, features);
+
+       if (need_reset)
+               i40e_do_reset(pf, (1 << __I40E_PF_RESET_REQUESTED));
+
        return 0;
 }
 
@@ -6595,6 +6635,7 @@ static int i40e_config_netdev(struct i40e_vsi *vsi)
                           NETIF_F_TSO                 |
                           NETIF_F_TSO6                |
                           NETIF_F_RXCSUM              |
+                          NETIF_F_NTUPLE              |
                           NETIF_F_RXHASH              |
                           0;