aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/ethernet/intel/igb/igb_main.c
diff options
context:
space:
mode:
authorGangfeng Huang <gangfeng.huang@ni.com>2016-07-06 01:22:54 -0400
committerJeff Kirsher <jeffrey.t.kirsher@intel.com>2016-08-19 01:27:47 -0400
commit0e71def252815d732f86d11d87d63f7186d9d3be (patch)
treeaf277a0d1fed5bd032d6dc2532f47aa52b6dc1e8 /drivers/net/ethernet/intel/igb/igb_main.c
parente951f145d1724769546efe2e04f6cb2b7037d7ea (diff)
igb: add support of RX network flow classification
This patch is meant to allow for RX network flow classification to insert and remove Rx filter by ethtool. Ethtool interface has it's own rules manager Show all filters: $ ethtool -n eth0 4 RX rings available Total 2 rules Signed-off-by: Ruhao Gao <ruhao.gao@ni.com> Signed-off-by: Gangfeng Huang <gangfeng.huang@ni.com> Tested-by: Aaron Brown <aaron.f.brown@intel.com> Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
Diffstat (limited to 'drivers/net/ethernet/intel/igb/igb_main.c')
-rw-r--r--drivers/net/ethernet/intel/igb/igb_main.c45
1 files changed, 45 insertions, 0 deletions
diff --git a/drivers/net/ethernet/intel/igb/igb_main.c b/drivers/net/ethernet/intel/igb/igb_main.c
index 942a89fb0090..af75eac5fa16 100644
--- a/drivers/net/ethernet/intel/igb/igb_main.c
+++ b/drivers/net/ethernet/intel/igb/igb_main.c
@@ -176,6 +176,8 @@ static int igb_ndo_set_vf_spoofchk(struct net_device *netdev, int vf,
176static int igb_ndo_get_vf_config(struct net_device *netdev, int vf, 176static int igb_ndo_get_vf_config(struct net_device *netdev, int vf,
177 struct ifla_vf_info *ivi); 177 struct ifla_vf_info *ivi);
178static void igb_check_vf_rate_limit(struct igb_adapter *); 178static void igb_check_vf_rate_limit(struct igb_adapter *);
179static void igb_nfc_filter_exit(struct igb_adapter *adapter);
180static void igb_nfc_filter_restore(struct igb_adapter *adapter);
179 181
180#ifdef CONFIG_PCI_IOV 182#ifdef CONFIG_PCI_IOV
181static int igb_vf_configure(struct igb_adapter *adapter, int vf); 183static int igb_vf_configure(struct igb_adapter *adapter, int vf);
@@ -1611,6 +1613,7 @@ static void igb_configure(struct igb_adapter *adapter)
1611 igb_setup_mrqc(adapter); 1613 igb_setup_mrqc(adapter);
1612 igb_setup_rctl(adapter); 1614 igb_setup_rctl(adapter);
1613 1615
1616 igb_nfc_filter_restore(adapter);
1614 igb_configure_tx(adapter); 1617 igb_configure_tx(adapter);
1615 igb_configure_rx(adapter); 1618 igb_configure_rx(adapter);
1616 1619
@@ -2059,6 +2062,21 @@ static int igb_set_features(struct net_device *netdev,
2059 if (!(changed & (NETIF_F_RXALL | NETIF_F_NTUPLE))) 2062 if (!(changed & (NETIF_F_RXALL | NETIF_F_NTUPLE)))
2060 return 0; 2063 return 0;
2061 2064
2065 if (!(features & NETIF_F_NTUPLE)) {
2066 struct hlist_node *node2;
2067 struct igb_nfc_filter *rule;
2068
2069 spin_lock(&adapter->nfc_lock);
2070 hlist_for_each_entry_safe(rule, node2,
2071 &adapter->nfc_filter_list, nfc_node) {
2072 igb_erase_filter(adapter, rule);
2073 hlist_del(&rule->nfc_node);
2074 kfree(rule);
2075 }
2076 spin_unlock(&adapter->nfc_lock);
2077 adapter->nfc_filter_count = 0;
2078 }
2079
2062 netdev->features = features; 2080 netdev->features = features;
2063 2081
2064 if (netif_running(netdev)) 2082 if (netif_running(netdev))
@@ -3053,6 +3071,7 @@ static int igb_sw_init(struct igb_adapter *adapter)
3053 VLAN_HLEN; 3071 VLAN_HLEN;
3054 adapter->min_frame_size = ETH_ZLEN + ETH_FCS_LEN; 3072 adapter->min_frame_size = ETH_ZLEN + ETH_FCS_LEN;
3055 3073
3074 spin_lock_init(&adapter->nfc_lock);
3056 spin_lock_init(&adapter->stats64_lock); 3075 spin_lock_init(&adapter->stats64_lock);
3057#ifdef CONFIG_PCI_IOV 3076#ifdef CONFIG_PCI_IOV
3058 switch (hw->mac.type) { 3077 switch (hw->mac.type) {
@@ -3240,6 +3259,8 @@ static int __igb_close(struct net_device *netdev, bool suspending)
3240 igb_down(adapter); 3259 igb_down(adapter);
3241 igb_free_irq(adapter); 3260 igb_free_irq(adapter);
3242 3261
3262 igb_nfc_filter_exit(adapter);
3263
3243 igb_free_all_tx_resources(adapter); 3264 igb_free_all_tx_resources(adapter);
3244 igb_free_all_rx_resources(adapter); 3265 igb_free_all_rx_resources(adapter);
3245 3266
@@ -8306,4 +8327,28 @@ int igb_reinit_queues(struct igb_adapter *adapter)
8306 8327
8307 return err; 8328 return err;
8308} 8329}
8330
8331static void igb_nfc_filter_exit(struct igb_adapter *adapter)
8332{
8333 struct igb_nfc_filter *rule;
8334
8335 spin_lock(&adapter->nfc_lock);
8336
8337 hlist_for_each_entry(rule, &adapter->nfc_filter_list, nfc_node)
8338 igb_erase_filter(adapter, rule);
8339
8340 spin_unlock(&adapter->nfc_lock);
8341}
8342
8343static void igb_nfc_filter_restore(struct igb_adapter *adapter)
8344{
8345 struct igb_nfc_filter *rule;
8346
8347 spin_lock(&adapter->nfc_lock);
8348
8349 hlist_for_each_entry(rule, &adapter->nfc_filter_list, nfc_node)
8350 igb_add_filter(adapter, rule);
8351
8352 spin_unlock(&adapter->nfc_lock);
8353}
8309/* igb_main.c */ 8354/* igb_main.c */