net/ice/base: add functions for ethertype filter
[dpdk.git] / drivers / net / ice / base / ice_switch.c
index 4b53636..4af6a32 100644 (file)
@@ -2415,6 +2415,63 @@ ice_add_mac_vlan(struct ice_hw *hw, struct LIST_HEAD_TYPE *mv_list)
 }
 #endif
 
+/**
+ * ice_add_eth_mac - Add ethertype and MAC based filter rule
+ * @hw: pointer to the hardware structure
+ * @em_list: list of ether type MAC filter, MAC is optional
+ */
+enum ice_status
+ice_add_eth_mac(struct ice_hw *hw, struct LIST_HEAD_TYPE *em_list)
+{
+       struct ice_fltr_list_entry *em_list_itr;
+
+       LIST_FOR_EACH_ENTRY(em_list_itr, em_list, ice_fltr_list_entry,
+                           list_entry) {
+               enum ice_sw_lkup_type l_type =
+                       em_list_itr->fltr_info.lkup_type;
+
+               if (l_type != ICE_SW_LKUP_ETHERTYPE_MAC &&
+                   l_type != ICE_SW_LKUP_ETHERTYPE)
+                       return ICE_ERR_PARAM;
+
+               em_list_itr->fltr_info.flag = ICE_FLTR_TX;
+               em_list_itr->status = ice_add_rule_internal(hw, l_type,
+                                                           em_list_itr);
+               if (em_list_itr->status)
+                       return em_list_itr->status;
+       }
+       return ICE_SUCCESS;
+}
+
+/**
+ * ice_remove_eth_mac - Remove an ethertype (or MAC) based filter rule
+ * @hw: pointer to the hardware structure
+ * @em_list: list of ethertype or ethertype MAC entries
+ */
+enum ice_status
+ice_remove_eth_mac(struct ice_hw *hw, struct LIST_HEAD_TYPE *em_list)
+{
+       struct ice_fltr_list_entry *em_list_itr, *tmp;
+
+       if (!em_list || !hw)
+               return ICE_ERR_PARAM;
+
+       LIST_FOR_EACH_ENTRY_SAFE(em_list_itr, tmp, em_list, ice_fltr_list_entry,
+                                list_entry) {
+               enum ice_sw_lkup_type l_type =
+                       em_list_itr->fltr_info.lkup_type;
+
+               if (l_type != ICE_SW_LKUP_ETHERTYPE_MAC &&
+                   l_type != ICE_SW_LKUP_ETHERTYPE)
+                       return ICE_ERR_PARAM;
+
+               em_list_itr->status = ice_remove_rule_internal(hw, l_type,
+                                                              em_list_itr);
+               if (em_list_itr->status)
+                       return em_list_itr->status;
+       }
+       return ICE_SUCCESS;
+}
 
 
 /**