net/ice/base: add dedicate MAC type for E810
[dpdk.git] / drivers / net / ice / base / ice_switch.c
index 3ed84ca..796390e 100644 (file)
@@ -743,7 +743,7 @@ ice_get_recp_frm_fw(struct ice_hw *hw, struct ice_sw_recipe *recps, u8 rid,
        /* Complete initialization of the root recipe entry */
        lkup_exts->n_val_words = fv_word_idx;
        recps[rid].big_recp = (num_recps > 1);
-       recps[rid].n_grp_count = num_recps;
+       recps[rid].n_grp_count = (u8)num_recps;
        recps[rid].root_buf = (struct ice_aqc_recipe_data_elem *)
                ice_memdup(hw, tmp, recps[rid].n_grp_count *
                           sizeof(*recps[rid].root_buf), ICE_NONDMA_TO_NONDMA);
@@ -791,11 +791,13 @@ ice_get_recp_to_prof_map(struct ice_hw *hw)
 /**
  * ice_init_def_sw_recp - initialize the recipe book keeping tables
  * @hw: pointer to the HW struct
+ * @recp_list: pointer to sw recipe list
  *
  * Allocate memory for the entire recipe table and initialize the structures/
  * entries corresponding to basic recipes.
  */
-enum ice_status ice_init_def_sw_recp(struct ice_hw *hw)
+enum ice_status
+ice_init_def_sw_recp(struct ice_hw *hw, struct ice_sw_recipe **recp_list)
 {
        struct ice_sw_recipe *recps;
        u8 i;
@@ -813,7 +815,7 @@ enum ice_status ice_init_def_sw_recp(struct ice_hw *hw)
                ice_init_lock(&recps[i].filt_rule_lock);
        }
 
-       hw->switch_info->recp_list = recps;
+       *recp_list = recps;
 
        return ICE_SUCCESS;
 }
@@ -1870,7 +1872,7 @@ enum ice_status ice_get_initial_sw_cfg(struct ice_hw *hw)
                        struct ice_aqc_get_sw_cfg_resp_elem *ele;
                        u16 pf_vf_num, swid, vsi_port_num;
                        bool is_vf = false;
-                       u8 type;
+                       u8 res_type;
 
                        ele = rbuf[i].elements;
                        vsi_port_num = LE16_TO_CPU(ele->vsi_port_num) &
@@ -1885,10 +1887,10 @@ enum ice_status ice_get_initial_sw_cfg(struct ice_hw *hw)
                            ICE_AQC_GET_SW_CONF_RESP_IS_VF)
                                is_vf = true;
 
-                       type = LE16_TO_CPU(ele->vsi_port_num) >>
-                               ICE_AQC_GET_SW_CONF_RESP_TYPE_S;
+                       res_type = (u8)(LE16_TO_CPU(ele->vsi_port_num) >>
+                                       ICE_AQC_GET_SW_CONF_RESP_TYPE_S);
 
-                       switch (type) {
+                       switch (res_type) {
                        case ICE_AQC_GET_SW_CONF_RESP_PHYS_PORT:
                        case ICE_AQC_GET_SW_CONF_RESP_VIRT_PORT:
                                if (j == num_total_ports) {
@@ -1898,7 +1900,7 @@ enum ice_status ice_get_initial_sw_cfg(struct ice_hw *hw)
                                        goto out;
                                }
                                ice_init_port_info(hw->port_info,
-                                                  vsi_port_num, type, swid,
+                                                  vsi_port_num, res_type, swid,
                                                   pf_vf_num, is_vf);
                                j++;
                                break;
@@ -2353,7 +2355,7 @@ ice_update_vsi_list_rule(struct ice_hw *hw, u16 *vsi_handle_arr, u16 num_vsi,
        struct ice_aqc_sw_rules_elem *s_rule;
        enum ice_status status;
        u16 s_rule_size;
-       u16 type;
+       u16 rule_type;
        int i;
 
        if (!num_vsi)
@@ -2366,11 +2368,11 @@ ice_update_vsi_list_rule(struct ice_hw *hw, u16 *vsi_handle_arr, u16 num_vsi,
            lkup_type == ICE_SW_LKUP_PROMISC ||
            lkup_type == ICE_SW_LKUP_PROMISC_VLAN ||
            lkup_type == ICE_SW_LKUP_LAST)
-               type = remove ? ICE_AQC_SW_RULES_T_VSI_LIST_CLEAR :
-                               ICE_AQC_SW_RULES_T_VSI_LIST_SET;
+               rule_type = remove ? ICE_AQC_SW_RULES_T_VSI_LIST_CLEAR :
+                       ICE_AQC_SW_RULES_T_VSI_LIST_SET;
        else if (lkup_type == ICE_SW_LKUP_VLAN)
-               type = remove ? ICE_AQC_SW_RULES_T_PRUNE_LIST_CLEAR :
-                               ICE_AQC_SW_RULES_T_PRUNE_LIST_SET;
+               rule_type = remove ? ICE_AQC_SW_RULES_T_PRUNE_LIST_CLEAR :
+                       ICE_AQC_SW_RULES_T_PRUNE_LIST_SET;
        else
                return ICE_ERR_PARAM;
 
@@ -2388,7 +2390,7 @@ ice_update_vsi_list_rule(struct ice_hw *hw, u16 *vsi_handle_arr, u16 num_vsi,
                        CPU_TO_LE16(ice_get_hw_vsi_num(hw, vsi_handle_arr[i]));
        }
 
-       s_rule->type = CPU_TO_LE16(type);
+       s_rule->type = CPU_TO_LE16(rule_type);
        s_rule->pdata.vsi_list.number_vsi = CPU_TO_LE16(num_vsi);
        s_rule->pdata.vsi_list.index = CPU_TO_LE16(vsi_list_id);
 
@@ -2427,6 +2429,7 @@ ice_create_vsi_list_rule(struct ice_hw *hw, u16 *vsi_handle_arr, u16 num_vsi,
 /**
  * ice_create_pkt_fwd_rule
  * @hw: pointer to the hardware structure
+ * @recp_list: corresponding filter management list
  * @f_entry: entry containing packet forwarding information
  *
  * Create switch rule with given filter information and add an entry
@@ -2434,13 +2437,11 @@ ice_create_vsi_list_rule(struct ice_hw *hw, u16 *vsi_handle_arr, u16 num_vsi,
  * and VSI mapping
  */
 static enum ice_status
-ice_create_pkt_fwd_rule(struct ice_hw *hw,
+ice_create_pkt_fwd_rule(struct ice_hw *hw, struct ice_sw_recipe *recp_list,
                        struct ice_fltr_list_entry *f_entry)
 {
        struct ice_fltr_mgmt_list_entry *fm_entry;
        struct ice_aqc_sw_rules_elem *s_rule;
-       enum ice_sw_lkup_type l_type;
-       struct ice_sw_recipe *recp;
        enum ice_status status;
 
        s_rule = (struct ice_aqc_sw_rules_elem *)
@@ -2480,9 +2481,7 @@ ice_create_pkt_fwd_rule(struct ice_hw *hw,
        /* The book keeping entries will get removed when base driver
         * calls remove filter AQ command
         */
-       l_type = fm_entry->fltr_info.lkup_type;
-       recp = &hw->switch_info->recp_list[l_type];
-       LIST_ADD(&fm_entry->list_entry, &recp->filt_rules);
+       LIST_ADD(&fm_entry->list_entry, &recp_list->filt_rules);
 
 ice_create_pkt_fwd_rule_exit:
        ice_free(hw, s_rule);
@@ -2679,21 +2678,18 @@ ice_add_update_vsi_list(struct ice_hw *hw,
 
 /**
  * ice_find_rule_entry - Search a rule entry
- * @hw: pointer to the hardware structure
- * @recp_id: lookup type for which the specified rule needs to be searched
+ * @list_head: head of rule list
  * @f_info: rule information
  *
  * Helper function to search for a given rule entry
  * Returns pointer to entry storing the rule if found
  */
 static struct ice_fltr_mgmt_list_entry *
-ice_find_rule_entry(struct ice_hw *hw, u8 recp_id, struct ice_fltr_info *f_info)
+ice_find_rule_entry(struct LIST_HEAD_TYPE *list_head,
+                   struct ice_fltr_info *f_info)
 {
        struct ice_fltr_mgmt_list_entry *list_itr, *ret = NULL;
-       struct ice_switch_info *sw = hw->switch_info;
-       struct LIST_HEAD_TYPE *list_head;
 
-       list_head = &sw->recp_list[recp_id].filt_rules;
        LIST_FOR_EACH_ENTRY(list_itr, list_head, ice_fltr_mgmt_list_entry,
                            list_entry) {
                if (!memcmp(&f_info->l_data, &list_itr->fltr_info.l_data,
@@ -2708,8 +2704,7 @@ ice_find_rule_entry(struct ice_hw *hw, u8 recp_id, struct ice_fltr_info *f_info)
 
 /**
  * ice_find_vsi_list_entry - Search VSI list map with VSI count 1
- * @hw: pointer to the hardware structure
- * @recp_id: lookup type for which VSI lists needs to be searched
+ * @recp_list: VSI lists needs to be searched
  * @vsi_handle: VSI handle to be found in VSI list
  * @vsi_list_id: VSI list ID found containing vsi_handle
  *
@@ -2718,15 +2713,14 @@ ice_find_rule_entry(struct ice_hw *hw, u8 recp_id, struct ice_fltr_info *f_info)
  * than 1 vsi_count. Returns pointer to VSI list entry if found.
  */
 static struct ice_vsi_list_map_info *
-ice_find_vsi_list_entry(struct ice_hw *hw, u8 recp_id, u16 vsi_handle,
+ice_find_vsi_list_entry(struct ice_sw_recipe *recp_list, u16 vsi_handle,
                        u16 *vsi_list_id)
 {
        struct ice_vsi_list_map_info *map_info = NULL;
-       struct ice_switch_info *sw = hw->switch_info;
        struct LIST_HEAD_TYPE *list_head;
 
-       list_head = &sw->recp_list[recp_id].filt_rules;
-       if (sw->recp_list[recp_id].adv_rule) {
+       list_head = &recp_list->filt_rules;
+       if (recp_list->adv_rule) {
                struct ice_adv_fltr_mgmt_list_entry *list_itr;
 
                LIST_FOR_EACH_ENTRY(list_itr, list_head,
@@ -2764,16 +2758,16 @@ ice_find_vsi_list_entry(struct ice_hw *hw, u8 recp_id, u16 vsi_handle,
 /**
  * ice_add_rule_internal - add rule for a given lookup type
  * @hw: pointer to the hardware structure
- * @recp_id: lookup type (recipe ID) for which rule has to be added
+ * @recp_list: recipe list for which rule has to be added
+ * @lport: logic port number on which function add rule
  * @f_entry: structure containing MAC forwarding information
  *
  * Adds or updates the rule lists for a given recipe
  */
 static enum ice_status
-ice_add_rule_internal(struct ice_hw *hw, u8 recp_id,
-                     struct ice_fltr_list_entry *f_entry)
+ice_add_rule_internal(struct ice_hw *hw, struct ice_sw_recipe *recp_list,
+                     u8 lport, struct ice_fltr_list_entry *f_entry)
 {
-       struct ice_switch_info *sw = hw->switch_info;
        struct ice_fltr_info *new_fltr, *cur_fltr;
        struct ice_fltr_mgmt_list_entry *m_entry;
        struct ice_lock *rule_lock; /* Lock to protect filter rule list */
@@ -2787,19 +2781,19 @@ ice_add_rule_internal(struct ice_hw *hw, u8 recp_id,
                f_entry->fltr_info.fwd_id.hw_vsi_id =
                        ice_get_hw_vsi_num(hw, f_entry->fltr_info.vsi_handle);
 
-       rule_lock = &sw->recp_list[recp_id].filt_rule_lock;
+       rule_lock = &recp_list->filt_rule_lock;
 
        ice_acquire_lock(rule_lock);
        new_fltr = &f_entry->fltr_info;
        if (new_fltr->flag & ICE_FLTR_RX)
-               new_fltr->src = hw->port_info->lport;
+               new_fltr->src = lport;
        else if (new_fltr->flag & ICE_FLTR_TX)
                new_fltr->src =
                        ice_get_hw_vsi_num(hw, f_entry->fltr_info.vsi_handle);
 
-       m_entry = ice_find_rule_entry(hw, recp_id, new_fltr);
+       m_entry = ice_find_rule_entry(&recp_list->filt_rules, new_fltr);
        if (!m_entry) {
-               status = ice_create_pkt_fwd_rule(hw, f_entry);
+               status = ice_create_pkt_fwd_rule(hw, recp_list, f_entry);
                goto exit_add_rule_internal;
        }
 
@@ -2940,14 +2934,13 @@ ice_rem_update_vsi_list(struct ice_hw *hw, u16 vsi_handle,
  * ice_remove_rule_internal - Remove a filter rule of a given type
  *
  * @hw: pointer to the hardware structure
- * @recp_id: recipe ID for which the rule needs to removed
+ * @recp_list: recipe list for which the rule needs to removed
  * @f_entry: rule entry containing filter information
  */
 static enum ice_status
-ice_remove_rule_internal(struct ice_hw *hw, u8 recp_id,
+ice_remove_rule_internal(struct ice_hw *hw, struct ice_sw_recipe *recp_list,
                         struct ice_fltr_list_entry *f_entry)
 {
-       struct ice_switch_info *sw = hw->switch_info;
        struct ice_fltr_mgmt_list_entry *list_elem;
        struct ice_lock *rule_lock; /* Lock to protect filter rule list */
        enum ice_status status = ICE_SUCCESS;
@@ -2959,9 +2952,10 @@ ice_remove_rule_internal(struct ice_hw *hw, u8 recp_id,
        f_entry->fltr_info.fwd_id.hw_vsi_id =
                ice_get_hw_vsi_num(hw, f_entry->fltr_info.vsi_handle);
 
-       rule_lock = &sw->recp_list[recp_id].filt_rule_lock;
+       rule_lock = &recp_list->filt_rule_lock;
        ice_acquire_lock(rule_lock);
-       list_elem = ice_find_rule_entry(hw, recp_id, &f_entry->fltr_info);
+       list_elem = ice_find_rule_entry(&recp_list->filt_rules,
+                                       &f_entry->fltr_info);
        if (!list_elem) {
                status = ICE_ERR_DOES_NOT_EXIST;
                goto exit;
@@ -3110,9 +3104,11 @@ ice_aq_get_res_descs(struct ice_hw *hw, u16 num_entries,
 }
 
 /**
- * ice_add_mac - Add a MAC address based filter rule
+ * ice_add_mac_rule - Add a MAC address based filter rule
  * @hw: pointer to the hardware structure
  * @m_list: list of MAC addresses and forwarding information
+ * @sw: pointer to switch info struct for which function add rule
+ * @lport: logic port number on which function add rule
  *
  * IMPORTANT: When the ucast_shared flag is set to false and m_list has
  * multiple unicast addresses, the function assumes that all the
@@ -3120,24 +3116,24 @@ ice_aq_get_res_descs(struct ice_hw *hw, u16 num_entries,
  * check for duplicates in this case, removing duplicates from a given
  * list should be taken care of in the caller of this function.
  */
-enum ice_status
-ice_add_mac(struct ice_hw *hw, struct LIST_HEAD_TYPE *m_list)
+static enum ice_status
+ice_add_mac_rule(struct ice_hw *hw, struct LIST_HEAD_TYPE *m_list,
+                struct ice_switch_info *sw, u8 lport)
 {
+       struct ice_sw_recipe *recp_list = &sw->recp_list[ICE_SW_LKUP_MAC];
        struct ice_aqc_sw_rules_elem *s_rule, *r_iter;
        struct ice_fltr_list_entry *m_list_itr;
        struct LIST_HEAD_TYPE *rule_head;
        u16 elem_sent, total_elem_left;
-       struct ice_switch_info *sw;
        struct ice_lock *rule_lock; /* Lock to protect filter rule list */
        enum ice_status status = ICE_SUCCESS;
        u16 num_unicast = 0;
        u16 s_rule_size;
 
-       if (!m_list || !hw)
-               return ICE_ERR_PARAM;
        s_rule = NULL;
-       sw = hw->switch_info;
-       rule_lock = &sw->recp_list[ICE_SW_LKUP_MAC].filt_rule_lock;
+       rule_lock = &recp_list->filt_rule_lock;
+       rule_head = &recp_list->filt_rules;
+
        LIST_FOR_EACH_ENTRY(m_list_itr, m_list, ice_fltr_list_entry,
                            list_entry) {
                u8 *add = &m_list_itr->fltr_info.l_data.mac.mac_addr[0];
@@ -3160,7 +3156,7 @@ ice_add_mac(struct ice_hw *hw, struct LIST_HEAD_TYPE *m_list)
                if (IS_UNICAST_ETHER_ADDR(add) && !hw->ucast_shared) {
                        /* Don't overwrite the unicast address */
                        ice_acquire_lock(rule_lock);
-                       if (ice_find_rule_entry(hw, ICE_SW_LKUP_MAC,
+                       if (ice_find_rule_entry(rule_head,
                                                &m_list_itr->fltr_info)) {
                                ice_release_lock(rule_lock);
                                return ICE_ERR_ALREADY_EXISTS;
@@ -3170,7 +3166,7 @@ ice_add_mac(struct ice_hw *hw, struct LIST_HEAD_TYPE *m_list)
                } else if (IS_MULTICAST_ETHER_ADDR(add) ||
                           (IS_UNICAST_ETHER_ADDR(add) && hw->ucast_shared)) {
                        m_list_itr->status =
-                               ice_add_rule_internal(hw, ICE_SW_LKUP_MAC,
+                               ice_add_rule_internal(hw, recp_list, lport,
                                                      m_list_itr);
                        if (m_list_itr->status)
                                return m_list_itr->status;
@@ -3184,7 +3180,6 @@ ice_add_mac(struct ice_hw *hw, struct LIST_HEAD_TYPE *m_list)
                goto ice_add_mac_exit;
        }
 
-       rule_head = &sw->recp_list[ICE_SW_LKUP_MAC].filt_rules;
 
        /* Allocate switch rule buffer for the bulk update for unicast */
        s_rule_size = ICE_SW_RULE_RX_TX_ETH_HDR_SIZE;
@@ -3265,15 +3260,33 @@ ice_add_mac_exit:
        return status;
 }
 
+/**
+ * ice_add_mac - Add a MAC address based filter rule
+ * @hw: pointer to the hardware structure
+ * @m_list: list of MAC addresses and forwarding information
+ *
+ * Function add MAC rule for logical port from HW struct
+ */
+enum ice_status
+ice_add_mac(struct ice_hw *hw, struct LIST_HEAD_TYPE *m_list)
+{
+       if (!m_list || !hw)
+               return ICE_ERR_PARAM;
+
+       return ice_add_mac_rule(hw, m_list, hw->switch_info,
+                               hw->port_info->lport);
+}
+
 /**
  * ice_add_vlan_internal - Add one VLAN based filter rule
  * @hw: pointer to the hardware structure
+ * @recp_list: recipe list for which rule has to be added
  * @f_entry: filter entry containing one VLAN information
  */
 static enum ice_status
-ice_add_vlan_internal(struct ice_hw *hw, struct ice_fltr_list_entry *f_entry)
+ice_add_vlan_internal(struct ice_hw *hw, struct ice_sw_recipe *recp_list,
+                     struct ice_fltr_list_entry *f_entry)
 {
-       struct ice_switch_info *sw = hw->switch_info;
        struct ice_fltr_mgmt_list_entry *v_list_itr;
        struct ice_fltr_info *new_fltr, *cur_fltr;
        enum ice_sw_lkup_type lkup_type;
@@ -3298,9 +3311,9 @@ ice_add_vlan_internal(struct ice_hw *hw, struct ice_fltr_list_entry *f_entry)
        new_fltr->src = new_fltr->fwd_id.hw_vsi_id;
        lkup_type = new_fltr->lkup_type;
        vsi_handle = new_fltr->vsi_handle;
-       rule_lock = &sw->recp_list[ICE_SW_LKUP_VLAN].filt_rule_lock;
+       rule_lock = &recp_list->filt_rule_lock;
        ice_acquire_lock(rule_lock);
-       v_list_itr = ice_find_rule_entry(hw, ICE_SW_LKUP_VLAN, new_fltr);
+       v_list_itr = ice_find_rule_entry(&recp_list->filt_rules, new_fltr);
        if (!v_list_itr) {
                struct ice_vsi_list_map_info *map_info = NULL;
 
@@ -3310,7 +3323,7 @@ ice_add_vlan_internal(struct ice_hw *hw, struct ice_fltr_list_entry *f_entry)
                         * want to add. If found, use the same vsi_list_id for
                         * this new VLAN rule or else create a new list.
                         */
-                       map_info = ice_find_vsi_list_entry(hw, ICE_SW_LKUP_VLAN,
+                       map_info = ice_find_vsi_list_entry(recp_list,
                                                           vsi_handle,
                                                           &vsi_list_id);
                        if (!map_info) {
@@ -3327,9 +3340,9 @@ ice_add_vlan_internal(struct ice_hw *hw, struct ice_fltr_list_entry *f_entry)
                        new_fltr->fwd_id.vsi_list_id = vsi_list_id;
                }
 
-               status = ice_create_pkt_fwd_rule(hw, f_entry);
+               status = ice_create_pkt_fwd_rule(hw, recp_list, f_entry);
                if (!status) {
-                       v_list_itr = ice_find_rule_entry(hw, ICE_SW_LKUP_VLAN,
+                       v_list_itr = ice_find_rule_entry(&recp_list->filt_rules,
                                                         new_fltr);
                        if (!v_list_itr) {
                                status = ICE_ERR_DOES_NOT_EXIST;
@@ -3420,30 +3433,48 @@ exit:
 }
 
 /**
- * ice_add_vlan - Add VLAN based filter rule
+ * ice_add_vlan_rule - Add VLAN based filter rule
  * @hw: pointer to the hardware structure
  * @v_list: list of VLAN entries and forwarding information
+ * @sw: pointer to switch info struct for which function add rule
  */
-enum ice_status
-ice_add_vlan(struct ice_hw *hw, struct LIST_HEAD_TYPE *v_list)
+static enum ice_status
+ice_add_vlan_rule(struct ice_hw *hw, struct LIST_HEAD_TYPE *v_list,
+                 struct ice_switch_info *sw)
 {
        struct ice_fltr_list_entry *v_list_itr;
+       struct ice_sw_recipe *recp_list;
 
-       if (!v_list || !hw)
-               return ICE_ERR_PARAM;
-
+       recp_list = &sw->recp_list[ICE_SW_LKUP_VLAN];
        LIST_FOR_EACH_ENTRY(v_list_itr, v_list, ice_fltr_list_entry,
                            list_entry) {
                if (v_list_itr->fltr_info.lkup_type != ICE_SW_LKUP_VLAN)
                        return ICE_ERR_PARAM;
                v_list_itr->fltr_info.flag = ICE_FLTR_TX;
-               v_list_itr->status = ice_add_vlan_internal(hw, v_list_itr);
+               v_list_itr->status = ice_add_vlan_internal(hw, recp_list,
+                                                          v_list_itr);
                if (v_list_itr->status)
                        return v_list_itr->status;
        }
        return ICE_SUCCESS;
 }
 
+/**
+ * ice_add_vlan - Add a VLAN based filter rule
+ * @hw: pointer to the hardware structure
+ * @v_list: list of VLAN and forwarding information
+ *
+ * Function add VLAN rule for logical port from HW struct
+ */
+enum ice_status
+ice_add_vlan(struct ice_hw *hw, struct LIST_HEAD_TYPE *v_list)
+{
+       if (!v_list || !hw)
+               return ICE_ERR_PARAM;
+
+       return ice_add_vlan_rule(hw, v_list, hw->switch_info);
+}
+
 /**
  * ice_add_mac_vlan - Add MAC and VLAN pair based filter rule
  * @hw: pointer to the hardware structure
@@ -3458,10 +3489,12 @@ enum ice_status
 ice_add_mac_vlan(struct ice_hw *hw, struct LIST_HEAD_TYPE *mv_list)
 {
        struct ice_fltr_list_entry *mv_list_itr;
+       struct ice_sw_recipe *recp_list;
 
        if (!mv_list || !hw)
                return ICE_ERR_PARAM;
 
+       recp_list = &hw->switch_info->recp_list[ICE_SW_LKUP_MAC_VLAN];
        LIST_FOR_EACH_ENTRY(mv_list_itr, mv_list, ice_fltr_list_entry,
                            list_entry) {
                enum ice_sw_lkup_type l_type =
@@ -3471,7 +3504,8 @@ ice_add_mac_vlan(struct ice_hw *hw, struct LIST_HEAD_TYPE *mv_list)
                        return ICE_ERR_PARAM;
                mv_list_itr->fltr_info.flag = ICE_FLTR_TX;
                mv_list_itr->status =
-                       ice_add_rule_internal(hw, ICE_SW_LKUP_MAC_VLAN,
+                       ice_add_rule_internal(hw, recp_list,
+                                             hw->port_info->lport,
                                              mv_list_itr);
                if (mv_list_itr->status)
                        return mv_list_itr->status;
@@ -3480,32 +3514,36 @@ ice_add_mac_vlan(struct ice_hw *hw, struct LIST_HEAD_TYPE *mv_list)
 }
 
 /**
- * ice_add_eth_mac - Add ethertype and MAC based filter rule
+ * ice_add_eth_mac_rule - Add ethertype and MAC based filter rule
  * @hw: pointer to the hardware structure
  * @em_list: list of ether type MAC filter, MAC is optional
+ * @sw: pointer to switch info struct for which function add rule
+ * @lport: logic port number on which function add rule
  *
  * This function requires the caller to populate the entries in
  * the filter list with the necessary fields (including flags to
  * indicate Tx or Rx rules).
  */
-enum ice_status
-ice_add_eth_mac(struct ice_hw *hw, struct LIST_HEAD_TYPE *em_list)
+static enum ice_status
+ice_add_eth_mac_rule(struct ice_hw *hw, struct LIST_HEAD_TYPE *em_list,
+                    struct ice_switch_info *sw, u8 lport)
 {
        struct ice_fltr_list_entry *em_list_itr;
 
-       if (!em_list || !hw)
-               return ICE_ERR_PARAM;
-
        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;
+               struct ice_sw_recipe *recp_list;
+               enum ice_sw_lkup_type l_type;
+
+               l_type = em_list_itr->fltr_info.lkup_type;
+               recp_list = &sw->recp_list[l_type];
 
                if (l_type != ICE_SW_LKUP_ETHERTYPE_MAC &&
                    l_type != ICE_SW_LKUP_ETHERTYPE)
                        return ICE_ERR_PARAM;
 
-               em_list_itr->status = ice_add_rule_internal(hw, l_type,
+               em_list_itr->status = ice_add_rule_internal(hw, recp_list,
+                                                           lport,
                                                            em_list_itr);
                if (em_list_itr->status)
                        return em_list_itr->status;
@@ -3513,29 +3551,48 @@ ice_add_eth_mac(struct ice_hw *hw, struct LIST_HEAD_TYPE *em_list)
        return ICE_SUCCESS;
 }
 
+enum ice_status
 /**
- * ice_remove_eth_mac - Remove an ethertype (or MAC) based filter rule
+ * ice_add_eth_mac - Add a ethertype based filter rule
  * @hw: pointer to the hardware structure
- * @em_list: list of ethertype or ethertype MAC entries
+ * @em_list: list of ethertype and forwarding information
+ *
+ * Function add ethertype rule for logical port from HW struct
  */
-enum ice_status
-ice_remove_eth_mac(struct ice_hw *hw, struct LIST_HEAD_TYPE *em_list)
+ice_add_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;
 
+       return ice_add_eth_mac_rule(hw, em_list, hw->switch_info,
+                                   hw->port_info->lport);
+}
+
+/**
+ * ice_remove_eth_mac_rule - Remove an ethertype (or MAC) based filter rule
+ * @hw: pointer to the hardware structure
+ * @em_list: list of ethertype or ethertype MAC entries
+ * @sw: pointer to switch info struct for which function add rule
+ */
+static enum ice_status
+ice_remove_eth_mac_rule(struct ice_hw *hw, struct LIST_HEAD_TYPE *em_list,
+                       struct ice_switch_info *sw)
+{
+       struct ice_fltr_list_entry *em_list_itr, *tmp;
+
        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;
+               struct ice_sw_recipe *recp_list;
+               enum ice_sw_lkup_type l_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,
+               recp_list = &sw->recp_list[l_type];
+               em_list_itr->status = ice_remove_rule_internal(hw, recp_list,
                                                               em_list_itr);
                if (em_list_itr->status)
                        return em_list_itr->status;
@@ -3543,6 +3600,21 @@ ice_remove_eth_mac(struct ice_hw *hw, struct LIST_HEAD_TYPE *em_list)
        return ICE_SUCCESS;
 }
 
+/**
+ * ice_remove_eth_mac - remove a ethertype based filter rule
+ * @hw: pointer to the hardware structure
+ * @em_list: list of ethertype and forwarding information
+ *
+ */
+enum ice_status
+ice_remove_eth_mac(struct ice_hw *hw, struct LIST_HEAD_TYPE *em_list)
+{
+       if (!em_list || !hw)
+               return ICE_ERR_PARAM;
+
+       return ice_remove_eth_mac_rule(hw, em_list, hw->switch_info);
+}
+
 /**
  * ice_rem_sw_rule_info
  * @hw: pointer to the hardware structure
@@ -3695,8 +3767,7 @@ out:
 
 /**
  * ice_find_ucast_rule_entry - Search for a unicast MAC filter rule entry
- * @hw: pointer to the hardware structure
- * @recp_id: lookup type for which the specified rule needs to be searched
+ * @list_head: head of rule list
  * @f_info: rule information
  *
  * Helper function to search for a unicast rule entry - this is to be used
@@ -3706,14 +3777,11 @@ out:
  * Returns pointer to entry storing the rule if found
  */
 static struct ice_fltr_mgmt_list_entry *
-ice_find_ucast_rule_entry(struct ice_hw *hw, u8 recp_id,
+ice_find_ucast_rule_entry(struct LIST_HEAD_TYPE *list_head,
                          struct ice_fltr_info *f_info)
 {
-       struct ice_switch_info *sw = hw->switch_info;
        struct ice_fltr_mgmt_list_entry *list_itr;
-       struct LIST_HEAD_TYPE *list_head;
 
-       list_head = &sw->recp_list[recp_id].filt_rules;
        LIST_FOR_EACH_ENTRY(list_itr, list_head, ice_fltr_mgmt_list_entry,
                            list_entry) {
                if (!memcmp(&f_info->l_data, &list_itr->fltr_info.l_data,
@@ -3727,9 +3795,10 @@ ice_find_ucast_rule_entry(struct ice_hw *hw, u8 recp_id,
 }
 
 /**
- * ice_remove_mac - remove a MAC address based filter rule
+ * ice_remove_mac_rule - remove a MAC based filter rule
  * @hw: pointer to the hardware structure
  * @m_list: list of MAC addresses and forwarding information
+ * @recp_list: list from which function remove MAC address
  *
  * This function removes either a MAC filter rule or a specific VSI from a
  * VSI list for a multicast MAC address.
@@ -3739,8 +3808,9 @@ ice_find_ucast_rule_entry(struct ice_hw *hw, u8 recp_id,
  * the entries passed into m_list were added previously. It will not attempt to
  * do a partial remove of entries that were found.
  */
-enum ice_status
-ice_remove_mac(struct ice_hw *hw, struct LIST_HEAD_TYPE *m_list)
+static enum ice_status
+ice_remove_mac_rule(struct ice_hw *hw, struct LIST_HEAD_TYPE *m_list,
+                   struct ice_sw_recipe *recp_list)
 {
        struct ice_fltr_list_entry *list_itr, *tmp;
        struct ice_lock *rule_lock; /* Lock to protect filter rule list */
@@ -3748,7 +3818,7 @@ ice_remove_mac(struct ice_hw *hw, struct LIST_HEAD_TYPE *m_list)
        if (!m_list)
                return ICE_ERR_PARAM;
 
-       rule_lock = &hw->switch_info->recp_list[ICE_SW_LKUP_MAC].filt_rule_lock;
+       rule_lock = &recp_list->filt_rule_lock;
        LIST_FOR_EACH_ENTRY_SAFE(list_itr, tmp, m_list, ice_fltr_list_entry,
                                 list_entry) {
                enum ice_sw_lkup_type l_type = list_itr->fltr_info.lkup_type;
@@ -3770,15 +3840,14 @@ ice_remove_mac(struct ice_hw *hw, struct LIST_HEAD_TYPE *m_list)
                         * shared...
                         */
                        ice_acquire_lock(rule_lock);
-                       if (!ice_find_ucast_rule_entry(hw, ICE_SW_LKUP_MAC,
+                       if (!ice_find_ucast_rule_entry(&recp_list->filt_rules,
                                                       &list_itr->fltr_info)) {
                                ice_release_lock(rule_lock);
                                return ICE_ERR_DOES_NOT_EXIST;
                        }
                        ice_release_lock(rule_lock);
                }
-               list_itr->status = ice_remove_rule_internal(hw,
-                                                           ICE_SW_LKUP_MAC,
+               list_itr->status = ice_remove_rule_internal(hw, recp_list,
                                                            list_itr);
                if (list_itr->status)
                        return list_itr->status;
@@ -3787,17 +3856,31 @@ ice_remove_mac(struct ice_hw *hw, struct LIST_HEAD_TYPE *m_list)
 }
 
 /**
- * ice_remove_vlan - Remove VLAN based filter rule
+ * ice_remove_mac - remove a MAC address based filter rule
  * @hw: pointer to the hardware structure
- * @v_list: list of VLAN entries and forwarding information
+ * @m_list: list of MAC addresses and forwarding information
+ *
  */
 enum ice_status
-ice_remove_vlan(struct ice_hw *hw, struct LIST_HEAD_TYPE *v_list)
+ice_remove_mac(struct ice_hw *hw, struct LIST_HEAD_TYPE *m_list)
 {
-       struct ice_fltr_list_entry *v_list_itr, *tmp;
+       struct ice_sw_recipe *recp_list;
 
-       if (!v_list || !hw)
-               return ICE_ERR_PARAM;
+       recp_list = &hw->switch_info->recp_list[ICE_SW_LKUP_MAC];
+       return ice_remove_mac_rule(hw, m_list, recp_list);
+}
+
+/**
+ * ice_remove_vlan_rule - Remove VLAN based filter rule
+ * @hw: pointer to the hardware structure
+ * @v_list: list of VLAN entries and forwarding information
+ * @recp_list: list from which function remove VLAN
+ */
+static enum ice_status
+ice_remove_vlan_rule(struct ice_hw *hw, struct LIST_HEAD_TYPE *v_list,
+                    struct ice_sw_recipe *recp_list)
+{
+       struct ice_fltr_list_entry *v_list_itr, *tmp;
 
        LIST_FOR_EACH_ENTRY_SAFE(v_list_itr, tmp, v_list, ice_fltr_list_entry,
                                 list_entry) {
@@ -3805,8 +3888,7 @@ ice_remove_vlan(struct ice_hw *hw, struct LIST_HEAD_TYPE *v_list)
 
                if (l_type != ICE_SW_LKUP_VLAN)
                        return ICE_ERR_PARAM;
-               v_list_itr->status = ice_remove_rule_internal(hw,
-                                                             ICE_SW_LKUP_VLAN,
+               v_list_itr->status = ice_remove_rule_internal(hw, recp_list,
                                                              v_list_itr);
                if (v_list_itr->status)
                        return v_list_itr->status;
@@ -3814,6 +3896,24 @@ ice_remove_vlan(struct ice_hw *hw, struct LIST_HEAD_TYPE *v_list)
        return ICE_SUCCESS;
 }
 
+/**
+ * ice_remove_vlan - remove a VLAN address based filter rule
+ * @hw: pointer to the hardware structure
+ * @v_list: list of VLAN and forwarding information
+ *
+ */
+enum ice_status
+ice_remove_vlan(struct ice_hw *hw, struct LIST_HEAD_TYPE *v_list)
+{
+       struct ice_sw_recipe *recp_list;
+
+       if (!v_list || !hw)
+               return ICE_ERR_PARAM;
+
+       recp_list = &hw->switch_info->recp_list[ICE_SW_LKUP_VLAN];
+       return ice_remove_vlan_rule(hw, v_list, recp_list);
+}
+
 /**
  * ice_remove_mac_vlan - Remove MAC VLAN based filter rule
  * @hw: pointer to the hardware structure
@@ -3823,10 +3923,12 @@ enum ice_status
 ice_remove_mac_vlan(struct ice_hw *hw, struct LIST_HEAD_TYPE *v_list)
 {
        struct ice_fltr_list_entry *v_list_itr, *tmp;
+       struct ice_sw_recipe *recp_list;
 
        if (!v_list || !hw)
                return ICE_ERR_PARAM;
 
+       recp_list = &hw->switch_info->recp_list[ICE_SW_LKUP_MAC_VLAN];
        LIST_FOR_EACH_ENTRY_SAFE(v_list_itr, tmp, v_list, ice_fltr_list_entry,
                                 list_entry) {
                enum ice_sw_lkup_type l_type = v_list_itr->fltr_info.lkup_type;
@@ -3834,7 +3936,7 @@ ice_remove_mac_vlan(struct ice_hw *hw, struct LIST_HEAD_TYPE *v_list)
                if (l_type != ICE_SW_LKUP_MAC_VLAN)
                        return ICE_ERR_PARAM;
                v_list_itr->status =
-                       ice_remove_rule_internal(hw, ICE_SW_LKUP_MAC_VLAN,
+                       ice_remove_rule_internal(hw, recp_list,
                                                 v_list_itr);
                if (v_list_itr->status)
                        return v_list_itr->status;
@@ -4065,11 +4167,13 @@ ice_remove_promisc(struct ice_hw *hw, u8 recp_id,
                   struct LIST_HEAD_TYPE *v_list)
 {
        struct ice_fltr_list_entry *v_list_itr, *tmp;
+       struct ice_sw_recipe *recp_list;
 
+       recp_list = &hw->switch_info->recp_list[recp_id];
        LIST_FOR_EACH_ENTRY_SAFE(v_list_itr, tmp, v_list, ice_fltr_list_entry,
                                 list_entry) {
                v_list_itr->status =
-                       ice_remove_rule_internal(hw, recp_id, v_list_itr);
+                       ice_remove_rule_internal(hw, recp_list, v_list_itr);
                if (v_list_itr->status)
                        return v_list_itr->status;
        }
@@ -4193,6 +4297,7 @@ ice_set_vsi_promisc(struct ice_hw *hw, u16 vsi_handle, u8 promisc_mask, u16 vid)
         * is found.
         */
        while (promisc_mask) {
+               struct ice_sw_recipe *recp_list;
                u8 *mac_addr;
 
                pkt_type = 0;
@@ -4256,8 +4361,11 @@ ice_set_vsi_promisc(struct ice_hw *hw, u16 vsi_handle, u8 promisc_mask, u16 vid)
                new_fltr.vsi_handle = vsi_handle;
                new_fltr.fwd_id.hw_vsi_id = hw_vsi_id;
                f_list_entry.fltr_info = new_fltr;
+               recp_list = &hw->switch_info->recp_list[recipe_id];
 
-               status = ice_add_rule_internal(hw, recipe_id, &f_list_entry);
+               status = ice_add_rule_internal(hw, recp_list,
+                                              hw->port_info->lport,
+                                              &f_list_entry);
                if (status != ICE_SUCCESS)
                        goto set_promisc_exit;
        }
@@ -4323,13 +4431,14 @@ free_fltr_list:
  * ice_remove_vsi_lkup_fltr - Remove lookup type filters for a VSI
  * @hw: pointer to the hardware structure
  * @vsi_handle: VSI handle to remove filters from
+ * @recp_list: recipe list from which function remove fltr
  * @lkup: switch rule filter lookup type
  */
 static void
 ice_remove_vsi_lkup_fltr(struct ice_hw *hw, u16 vsi_handle,
+                        struct ice_sw_recipe *recp_list,
                         enum ice_sw_lkup_type lkup)
 {
-       struct ice_switch_info *sw = hw->switch_info;
        struct ice_fltr_list_entry *fm_entry;
        struct LIST_HEAD_TYPE remove_list_head;
        struct LIST_HEAD_TYPE *rule_head;
@@ -4338,8 +4447,8 @@ ice_remove_vsi_lkup_fltr(struct ice_hw *hw, u16 vsi_handle,
        enum ice_status status;
 
        INIT_LIST_HEAD(&remove_list_head);
-       rule_lock = &sw->recp_list[lkup].filt_rule_lock;
-       rule_head = &sw->recp_list[lkup].filt_rules;
+       rule_lock = &recp_list[lkup].filt_rule_lock;
+       rule_head = &recp_list[lkup].filt_rules;
        ice_acquire_lock(rule_lock);
        status = ice_add_to_vsi_fltr_list(hw, vsi_handle, rule_head,
                                          &remove_list_head);
@@ -4349,10 +4458,10 @@ ice_remove_vsi_lkup_fltr(struct ice_hw *hw, u16 vsi_handle,
 
        switch (lkup) {
        case ICE_SW_LKUP_MAC:
-               ice_remove_mac(hw, &remove_list_head);
+               ice_remove_mac_rule(hw, &remove_list_head, &recp_list[lkup]);
                break;
        case ICE_SW_LKUP_VLAN:
-               ice_remove_vlan(hw, &remove_list_head);
+               ice_remove_vlan_rule(hw, &remove_list_head, &recp_list[lkup]);
                break;
        case ICE_SW_LKUP_PROMISC:
        case ICE_SW_LKUP_PROMISC_VLAN:
@@ -4382,22 +4491,43 @@ ice_remove_vsi_lkup_fltr(struct ice_hw *hw, u16 vsi_handle,
 }
 
 /**
- * ice_remove_vsi_fltr - Remove all filters for a VSI
+ * ice_remove_vsi_fltr_rule - Remove all filters for a VSI
  * @hw: pointer to the hardware structure
  * @vsi_handle: VSI handle to remove filters from
+ * @sw: pointer to switch info struct
  */
-void ice_remove_vsi_fltr(struct ice_hw *hw, u16 vsi_handle)
+static void
+ice_remove_vsi_fltr_rule(struct ice_hw *hw, u16 vsi_handle,
+                        struct ice_switch_info *sw)
 {
        ice_debug(hw, ICE_DBG_TRACE, "%s\n", __func__);
 
-       ice_remove_vsi_lkup_fltr(hw, vsi_handle, ICE_SW_LKUP_MAC);
-       ice_remove_vsi_lkup_fltr(hw, vsi_handle, ICE_SW_LKUP_MAC_VLAN);
-       ice_remove_vsi_lkup_fltr(hw, vsi_handle, ICE_SW_LKUP_PROMISC);
-       ice_remove_vsi_lkup_fltr(hw, vsi_handle, ICE_SW_LKUP_VLAN);
-       ice_remove_vsi_lkup_fltr(hw, vsi_handle, ICE_SW_LKUP_DFLT);
-       ice_remove_vsi_lkup_fltr(hw, vsi_handle, ICE_SW_LKUP_ETHERTYPE);
-       ice_remove_vsi_lkup_fltr(hw, vsi_handle, ICE_SW_LKUP_ETHERTYPE_MAC);
-       ice_remove_vsi_lkup_fltr(hw, vsi_handle, ICE_SW_LKUP_PROMISC_VLAN);
+       ice_remove_vsi_lkup_fltr(hw, vsi_handle,
+                                sw->recp_list, ICE_SW_LKUP_MAC);
+       ice_remove_vsi_lkup_fltr(hw, vsi_handle,
+                                sw->recp_list, ICE_SW_LKUP_MAC_VLAN);
+       ice_remove_vsi_lkup_fltr(hw, vsi_handle,
+                                sw->recp_list, ICE_SW_LKUP_PROMISC);
+       ice_remove_vsi_lkup_fltr(hw, vsi_handle,
+                                sw->recp_list, ICE_SW_LKUP_VLAN);
+       ice_remove_vsi_lkup_fltr(hw, vsi_handle,
+                                sw->recp_list, ICE_SW_LKUP_DFLT);
+       ice_remove_vsi_lkup_fltr(hw, vsi_handle,
+                                sw->recp_list, ICE_SW_LKUP_ETHERTYPE);
+       ice_remove_vsi_lkup_fltr(hw, vsi_handle,
+                                sw->recp_list, ICE_SW_LKUP_ETHERTYPE_MAC);
+       ice_remove_vsi_lkup_fltr(hw, vsi_handle,
+                                sw->recp_list, ICE_SW_LKUP_PROMISC_VLAN);
+}
+
+/**
+ * ice_remove_vsi_fltr - Remove all filters for a VSI
+ * @hw: pointer to the hardware structure
+ * @vsi_handle: VSI handle to remove filters from
+ */
+void ice_remove_vsi_fltr(struct ice_hw *hw, u16 vsi_handle)
+{
+       ice_remove_vsi_fltr_rule(hw, vsi_handle, hw->switch_info);
 }
 
 /**
@@ -4559,9 +4689,9 @@ enum ice_status
 ice_add_mac_with_sw_marker(struct ice_hw *hw, struct ice_fltr_info *f_info,
                           u16 sw_marker)
 {
-       struct ice_switch_info *sw = hw->switch_info;
        struct ice_fltr_mgmt_list_entry *m_entry;
        struct ice_fltr_list_entry fl_info;
+       struct ice_sw_recipe *recp_list;
        struct LIST_HEAD_TYPE l_head;
        struct ice_lock *rule_lock;     /* Lock to protect filter rule list */
        enum ice_status ret;
@@ -4590,16 +4720,18 @@ ice_add_mac_with_sw_marker(struct ice_hw *hw, struct ice_fltr_info *f_info,
        LIST_ADD(&fl_info.list_entry, &l_head);
 
        entry_exists = false;
-       ret = ice_add_mac(hw, &l_head);
+       ret = ice_add_mac_rule(hw, &l_head, hw->switch_info,
+                              hw->port_info->lport);
        if (ret == ICE_ERR_ALREADY_EXISTS)
                entry_exists = true;
        else if (ret)
                return ret;
 
-       rule_lock = &sw->recp_list[ICE_SW_LKUP_MAC].filt_rule_lock;
+       recp_list = &hw->switch_info->recp_list[ICE_SW_LKUP_MAC];
+       rule_lock = &recp_list->filt_rule_lock;
        ice_acquire_lock(rule_lock);
        /* Get the book keeping entry for the filter */
-       m_entry = ice_find_rule_entry(hw, ICE_SW_LKUP_MAC, f_info);
+       m_entry = ice_find_rule_entry(&recp_list->filt_rules, f_info);
        if (!m_entry)
                goto exit_error;
 
@@ -4652,9 +4784,9 @@ exit_error:
 enum ice_status
 ice_add_mac_with_counter(struct ice_hw *hw, struct ice_fltr_info *f_info)
 {
-       struct ice_switch_info *sw = hw->switch_info;
        struct ice_fltr_mgmt_list_entry *m_entry;
        struct ice_fltr_list_entry fl_info;
+       struct ice_sw_recipe *recp_list;
        struct LIST_HEAD_TYPE l_head;
        struct ice_lock *rule_lock;     /* Lock to protect filter rule list */
        enum ice_status ret;
@@ -4671,10 +4803,11 @@ ice_add_mac_with_counter(struct ice_hw *hw, struct ice_fltr_info *f_info)
        if (!ice_is_vsi_valid(hw, f_info->vsi_handle))
                return ICE_ERR_PARAM;
        f_info->fwd_id.hw_vsi_id = ice_get_hw_vsi_num(hw, f_info->vsi_handle);
+       recp_list = &hw->switch_info->recp_list[ICE_SW_LKUP_MAC];
 
        entry_exist = false;
 
-       rule_lock = &sw->recp_list[ICE_SW_LKUP_MAC].filt_rule_lock;
+       rule_lock = &recp_list->filt_rule_lock;
 
        /* Add filter if it doesn't exist so then the adding of large
         * action always results in update
@@ -4684,14 +4817,15 @@ ice_add_mac_with_counter(struct ice_hw *hw, struct ice_fltr_info *f_info)
        fl_info.fltr_info = *f_info;
        LIST_ADD(&fl_info.list_entry, &l_head);
 
-       ret = ice_add_mac(hw, &l_head);
+       ret = ice_add_mac_rule(hw, &l_head, hw->switch_info,
+                              hw->port_info->lport);
        if (ret == ICE_ERR_ALREADY_EXISTS)
                entry_exist = true;
        else if (ret)
                return ret;
 
        ice_acquire_lock(rule_lock);
-       m_entry = ice_find_rule_entry(hw, ICE_SW_LKUP_MAC, f_info);
+       m_entry = ice_find_rule_entry(&recp_list->filt_rules, f_info);
        if (!m_entry) {
                ret = ICE_ERR_BAD_PTR;
                goto exit_error;
@@ -4880,7 +5014,7 @@ static bool ice_prot_type_to_id(enum ice_protocol_type type, u16 *id)
 {
        u16 i;
 
-       for (i = 0; ice_prot_id_tbl[i].type != ICE_PROTOCOL_LAST; i++)
+       for (i = 0; i < ARRAY_SIZE(ice_prot_id_tbl); i++)
                if (ice_prot_id_tbl[i].type == type) {
                        *id = ice_prot_id_tbl[i].protocol_id;
                        return true;
@@ -5537,35 +5671,35 @@ static void
 ice_get_compat_fv_bitmap(struct ice_hw *hw, struct ice_adv_rule_info *rinfo,
                         ice_bitmap_t *bm)
 {
-       enum ice_prof_type type;
+       enum ice_prof_type prof_type;
 
        switch (rinfo->tun_type) {
        case ICE_NON_TUN:
-               type = ICE_PROF_NON_TUN;
+               prof_type = ICE_PROF_NON_TUN;
                break;
        case ICE_ALL_TUNNELS:
-               type = ICE_PROF_TUN_ALL;
+               prof_type = ICE_PROF_TUN_ALL;
                break;
        case ICE_SW_TUN_VXLAN_GPE:
        case ICE_SW_TUN_GENEVE:
        case ICE_SW_TUN_VXLAN:
        case ICE_SW_TUN_UDP:
        case ICE_SW_TUN_GTP:
-               type = ICE_PROF_TUN_UDP;
+               prof_type = ICE_PROF_TUN_UDP;
                break;
        case ICE_SW_TUN_NVGRE:
-               type = ICE_PROF_TUN_GRE;
+               prof_type = ICE_PROF_TUN_GRE;
                break;
        case ICE_SW_TUN_PPPOE:
-               type = ICE_PROF_TUN_PPPOE;
+               prof_type = ICE_PROF_TUN_PPPOE;
                break;
        case ICE_SW_TUN_AND_NON_TUN:
        default:
-               type = ICE_PROF_ALL;
+               prof_type = ICE_PROF_ALL;
                break;
        }
 
-       ice_get_sw_fv_bitmap(hw, type, bm);
+       ice_get_sw_fv_bitmap(hw, prof_type, bm);
 }
 
 /**
@@ -6153,9 +6287,12 @@ ice_adv_add_update_vsi_list(struct ice_hw *hw,
                if (status)
                        return status;
 
+               ice_memset(&tmp_fltr, 0, sizeof(tmp_fltr), ICE_NONDMA_MEM);
                tmp_fltr.fltr_rule_id = cur_fltr->fltr_rule_id;
                tmp_fltr.fltr_act = ICE_FWD_TO_VSI_LIST;
                tmp_fltr.fwd_id.vsi_list_id = vsi_list_id;
+               tmp_fltr.lkup_type = ICE_SW_LKUP_LAST;
+
                /* Update the previous switch rule of "forward to VSI" to
                 * "fwd to VSI list"
                 */
@@ -6399,6 +6536,7 @@ ice_add_adv_rule(struct ice_hw *hw, struct ice_adv_lkup_elem *lkups,
        if (rinfo->sw_act.fltr_act == ICE_FWD_TO_VSI) {
                struct ice_fltr_info tmp_fltr;
 
+               ice_memset(&tmp_fltr, 0, sizeof(tmp_fltr), ICE_NONDMA_MEM);
                tmp_fltr.fltr_rule_id =
                        LE16_TO_CPU(s_rule->pdata.lkup_tx_rx.index);
                tmp_fltr.fltr_act = ICE_FWD_TO_VSI;
@@ -6483,6 +6621,8 @@ ice_adv_rem_update_vsi_list(struct ice_hw *hw, u16 vsi_handle,
                                                  lkup_type);
                if (status)
                        return status;
+
+               ice_memset(&tmp_fltr, 0, sizeof(tmp_fltr), ICE_NONDMA_MEM);
                tmp_fltr.fltr_rule_id = fm_list->rule_info.fltr_rule_id;
                fm_list->rule_info.sw_act.fltr_act = ICE_FWD_TO_VSI;
                tmp_fltr.fltr_act = ICE_FWD_TO_VSI;
@@ -6690,7 +6830,8 @@ ice_rem_adv_rule_for_vsi(struct ice_hw *hw, u16 vsi_handle)
                map_info = NULL;
                LIST_FOR_EACH_ENTRY(list_itr, list_head,
                                    ice_adv_fltr_mgmt_list_entry, list_entry) {
-                       map_info = ice_find_vsi_list_entry(hw, rid, vsi_handle,
+                       map_info = ice_find_vsi_list_entry(&sw->recp_list[rid],
+                                                          vsi_handle,
                                                           &vsi_list_id);
                        if (!map_info)
                                continue;
@@ -6716,12 +6857,15 @@ static enum ice_status
 ice_replay_fltr(struct ice_hw *hw, u8 recp_id, struct LIST_HEAD_TYPE *list_head)
 {
        struct ice_fltr_mgmt_list_entry *itr;
-       struct LIST_HEAD_TYPE l_head;
        enum ice_status status = ICE_SUCCESS;
+       struct ice_sw_recipe *recp_list;
+       u8 lport = hw->port_info->lport;
+       struct LIST_HEAD_TYPE l_head;
 
        if (LIST_EMPTY(list_head))
                return status;
 
+       recp_list = &hw->switch_info->recp_list[recp_id];
        /* Move entries from the given list_head to a temporary l_head so that
         * they can be replayed. Otherwise when trying to re-add the same
         * filter, the function will return already exists
@@ -6737,7 +6881,8 @@ ice_replay_fltr(struct ice_hw *hw, u8 recp_id, struct LIST_HEAD_TYPE *list_head)
 
                f_entry.fltr_info = itr->fltr_info;
                if (itr->vsi_count < 2 && recp_id != ICE_SW_LKUP_VLAN) {
-                       status = ice_add_rule_internal(hw, recp_id, &f_entry);
+                       status = ice_add_rule_internal(hw, recp_list, lport,
+                                                      &f_entry);
                        if (status != ICE_SUCCESS)
                                goto end;
                        continue;
@@ -6759,9 +6904,11 @@ ice_replay_fltr(struct ice_hw *hw, u8 recp_id, struct LIST_HEAD_TYPE *list_head)
                                ice_get_hw_vsi_num(hw, vsi_handle);
                        f_entry.fltr_info.fltr_act = ICE_FWD_TO_VSI;
                        if (recp_id == ICE_SW_LKUP_VLAN)
-                               status = ice_add_vlan_internal(hw, &f_entry);
+                               status = ice_add_vlan_internal(hw, recp_list,
+                                                              &f_entry);
                        else
-                               status = ice_add_rule_internal(hw, recp_id,
+                               status = ice_add_rule_internal(hw, recp_list,
+                                                              lport,
                                                               &f_entry);
                        if (status != ICE_SUCCESS)
                                goto end;
@@ -6812,10 +6959,12 @@ ice_replay_vsi_fltr(struct ice_hw *hw, u16 vsi_handle, u8 recp_id,
 {
        struct ice_fltr_mgmt_list_entry *itr;
        enum ice_status status = ICE_SUCCESS;
+       struct ice_sw_recipe *recp_list;
        u16 hw_vsi_id;
 
        if (LIST_EMPTY(list_head))
                return status;
+       recp_list = &hw->switch_info->recp_list[recp_id];
        hw_vsi_id = ice_get_hw_vsi_num(hw, vsi_handle);
 
        LIST_FOR_EACH_ENTRY(itr, list_head, ice_fltr_mgmt_list_entry,
@@ -6828,7 +6977,9 @@ ice_replay_vsi_fltr(struct ice_hw *hw, u16 vsi_handle, u8 recp_id,
                        /* update the src in case it is VSI num */
                        if (f_entry.fltr_info.src_id == ICE_SRC_ID_VSI)
                                f_entry.fltr_info.src = hw_vsi_id;
-                       status = ice_add_rule_internal(hw, recp_id, &f_entry);
+                       status = ice_add_rule_internal(hw, recp_list,
+                                                      hw->port_info->lport,
+                                                      &f_entry);
                        if (status != ICE_SUCCESS)
                                goto end;
                        continue;
@@ -6844,9 +6995,11 @@ ice_replay_vsi_fltr(struct ice_hw *hw, u16 vsi_handle, u8 recp_id,
                if (f_entry.fltr_info.src_id == ICE_SRC_ID_VSI)
                        f_entry.fltr_info.src = hw_vsi_id;
                if (recp_id == ICE_SW_LKUP_VLAN)
-                       status = ice_add_vlan_internal(hw, &f_entry);
+                       status = ice_add_vlan_internal(hw, recp_list, &f_entry);
                else
-                       status = ice_add_rule_internal(hw, recp_id, &f_entry);
+                       status = ice_add_rule_internal(hw, recp_list,
+                                                      hw->port_info->lport,
+                                                      &f_entry);
                if (status != ICE_SUCCESS)
                        goto end;
        }