enum igb_filter_match_flags {
        IGB_FILTER_FLAG_ETHER_TYPE = 0x1,
        IGB_FILTER_FLAG_VLAN_TCI   = 0x2,
+       IGB_FILTER_FLAG_SRC_MAC_ADDR   = 0x4,
+       IGB_FILTER_FLAG_DST_MAC_ADDR   = 0x8,
 };
 
 #define IGB_MAX_RXNFC_FILTERS 16
        u8 match_flags;
        __be16 etype;
        __be16 vlan_tci;
+       u8 src_addr[ETH_ALEN];
+       u8 dst_addr[ETH_ALEN];
 };
 
 struct igb_nfc_filter {
 
                        return err;
        }
 
+       if (input->filter.match_flags & IGB_FILTER_FLAG_DST_MAC_ADDR) {
+               err = igb_add_mac_steering_filter(adapter,
+                                                 input->filter.dst_addr,
+                                                 input->action, 0);
+               err = min_t(int, err, 0);
+               if (err)
+                       return err;
+       }
+
+       if (input->filter.match_flags & IGB_FILTER_FLAG_SRC_MAC_ADDR) {
+               err = igb_add_mac_steering_filter(adapter,
+                                                 input->filter.src_addr,
+                                                 input->action,
+                                                 IGB_MAC_STATE_SRC_ADDR);
+               err = min_t(int, err, 0);
+               if (err)
+                       return err;
+       }
+
        if (input->filter.match_flags & IGB_FILTER_FLAG_VLAN_TCI)
                err = igb_rxnfc_write_vlan_prio_filter(adapter, input);
 
                igb_clear_vlan_prio_filter(adapter,
                                           ntohs(input->filter.vlan_tci));
 
+       if (input->filter.match_flags & IGB_FILTER_FLAG_SRC_MAC_ADDR)
+               igb_del_mac_steering_filter(adapter, input->filter.src_addr,
+                                           input->action,
+                                           IGB_MAC_STATE_SRC_ADDR);
+
+       if (input->filter.match_flags & IGB_FILTER_FLAG_DST_MAC_ADDR)
+               igb_del_mac_steering_filter(adapter, input->filter.dst_addr,
+                                           input->action, 0);
+
        return 0;
 }