diff options
-rw-r--r-- | drivers/net/ethernet/intel/igb/igb.h | 4 | ||||
-rw-r--r-- | drivers/net/ethernet/intel/igb/igb_ethtool.c | 28 |
2 files changed, 32 insertions, 0 deletions
diff --git a/drivers/net/ethernet/intel/igb/igb.h b/drivers/net/ethernet/intel/igb/igb.h index c71845a450f7..0eac1df499f8 100644 --- a/drivers/net/ethernet/intel/igb/igb.h +++ b/drivers/net/ethernet/intel/igb/igb.h | |||
@@ -442,6 +442,8 @@ struct hwmon_buff { | |||
442 | enum igb_filter_match_flags { | 442 | enum igb_filter_match_flags { |
443 | IGB_FILTER_FLAG_ETHER_TYPE = 0x1, | 443 | IGB_FILTER_FLAG_ETHER_TYPE = 0x1, |
444 | IGB_FILTER_FLAG_VLAN_TCI = 0x2, | 444 | IGB_FILTER_FLAG_VLAN_TCI = 0x2, |
445 | IGB_FILTER_FLAG_SRC_MAC_ADDR = 0x4, | ||
446 | IGB_FILTER_FLAG_DST_MAC_ADDR = 0x8, | ||
445 | }; | 447 | }; |
446 | 448 | ||
447 | #define IGB_MAX_RXNFC_FILTERS 16 | 449 | #define IGB_MAX_RXNFC_FILTERS 16 |
@@ -456,6 +458,8 @@ struct igb_nfc_input { | |||
456 | u8 match_flags; | 458 | u8 match_flags; |
457 | __be16 etype; | 459 | __be16 etype; |
458 | __be16 vlan_tci; | 460 | __be16 vlan_tci; |
461 | u8 src_addr[ETH_ALEN]; | ||
462 | u8 dst_addr[ETH_ALEN]; | ||
459 | }; | 463 | }; |
460 | 464 | ||
461 | struct igb_nfc_filter { | 465 | struct igb_nfc_filter { |
diff --git a/drivers/net/ethernet/intel/igb/igb_ethtool.c b/drivers/net/ethernet/intel/igb/igb_ethtool.c index 5975d432836f..31b2960a7869 100644 --- a/drivers/net/ethernet/intel/igb/igb_ethtool.c +++ b/drivers/net/ethernet/intel/igb/igb_ethtool.c | |||
@@ -2776,6 +2776,25 @@ int igb_add_filter(struct igb_adapter *adapter, struct igb_nfc_filter *input) | |||
2776 | return err; | 2776 | return err; |
2777 | } | 2777 | } |
2778 | 2778 | ||
2779 | if (input->filter.match_flags & IGB_FILTER_FLAG_DST_MAC_ADDR) { | ||
2780 | err = igb_add_mac_steering_filter(adapter, | ||
2781 | input->filter.dst_addr, | ||
2782 | input->action, 0); | ||
2783 | err = min_t(int, err, 0); | ||
2784 | if (err) | ||
2785 | return err; | ||
2786 | } | ||
2787 | |||
2788 | if (input->filter.match_flags & IGB_FILTER_FLAG_SRC_MAC_ADDR) { | ||
2789 | err = igb_add_mac_steering_filter(adapter, | ||
2790 | input->filter.src_addr, | ||
2791 | input->action, | ||
2792 | IGB_MAC_STATE_SRC_ADDR); | ||
2793 | err = min_t(int, err, 0); | ||
2794 | if (err) | ||
2795 | return err; | ||
2796 | } | ||
2797 | |||
2779 | if (input->filter.match_flags & IGB_FILTER_FLAG_VLAN_TCI) | 2798 | if (input->filter.match_flags & IGB_FILTER_FLAG_VLAN_TCI) |
2780 | err = igb_rxnfc_write_vlan_prio_filter(adapter, input); | 2799 | err = igb_rxnfc_write_vlan_prio_filter(adapter, input); |
2781 | 2800 | ||
@@ -2824,6 +2843,15 @@ int igb_erase_filter(struct igb_adapter *adapter, struct igb_nfc_filter *input) | |||
2824 | igb_clear_vlan_prio_filter(adapter, | 2843 | igb_clear_vlan_prio_filter(adapter, |
2825 | ntohs(input->filter.vlan_tci)); | 2844 | ntohs(input->filter.vlan_tci)); |
2826 | 2845 | ||
2846 | if (input->filter.match_flags & IGB_FILTER_FLAG_SRC_MAC_ADDR) | ||
2847 | igb_del_mac_steering_filter(adapter, input->filter.src_addr, | ||
2848 | input->action, | ||
2849 | IGB_MAC_STATE_SRC_ADDR); | ||
2850 | |||
2851 | if (input->filter.match_flags & IGB_FILTER_FLAG_DST_MAC_ADDR) | ||
2852 | igb_del_mac_steering_filter(adapter, input->filter.dst_addr, | ||
2853 | input->action, 0); | ||
2854 | |||
2827 | return 0; | 2855 | return 0; |
2828 | } | 2856 | } |
2829 | 2857 | ||