summaryrefslogtreecommitdiff
path: root/drivers/net/ethernet/intel/ice/ice_fltr.c
diff options
context:
space:
mode:
authorWojciech Drewek <wojciech.drewek@intel.com>2021-09-23 14:43:48 +0200
committerTony Nguyen <anthony.l.nguyen@intel.com>2021-10-19 10:53:26 -0700
commit73b483b7902918cd7de3481313ed4943eb9c3f3b (patch)
treec556ac96e2dec58fed5c12829e599c214ddde2dd /drivers/net/ethernet/intel/ice/ice_fltr.c
parent1281b7459657abcd6db74fbfbf9b20717de8966c (diff)
ice: Manage act flags for switchdev offloads
Currently it is not possible to set/unset lb_en and lan_en flags for advanced rules during their creation. Both flags are enabled by default. In case of switchdev offloads for egress traffic we need lb_en to be disabled. Because of that, we work around it by updating the rule immediately after its creation. This change allows us to set/unset those flags right away and it gets rid of old workaround as well. Using ice_adv_rule_flags_info structure we can pass info about flags we want to be set for a given advanced rule. Flags are stored in flags_info.act. Values from act would be used only if act_valid was set to true, otherwise default values would be used. Signed-off-by: Wojciech Drewek <wojciech.drewek@intel.com> Acked-by: Paul Menzel <pmenzel@molgen.mpg.de> Tested-by: Sandeep Penigalapati <sandeep.penigalapati@intel.com> Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
Diffstat (limited to 'drivers/net/ethernet/intel/ice/ice_fltr.c')
-rw-r--r--drivers/net/ethernet/intel/ice/ice_fltr.c127
1 files changed, 0 insertions, 127 deletions
diff --git a/drivers/net/ethernet/intel/ice/ice_fltr.c b/drivers/net/ethernet/intel/ice/ice_fltr.c
index f8c59df4ff9c..c2e78eaf4ccb 100644
--- a/drivers/net/ethernet/intel/ice/ice_fltr.c
+++ b/drivers/net/ethernet/intel/ice/ice_fltr.c
@@ -454,133 +454,6 @@ static u32 ice_fltr_build_action(u16 vsi_id)
}
/**
- * ice_fltr_find_adv_entry - find advanced rule
- * @rules: list of rules
- * @rule_id: id of wanted rule
- */
-static struct ice_adv_fltr_mgmt_list_entry *
-ice_fltr_find_adv_entry(struct list_head *rules, u16 rule_id)
-{
- struct ice_adv_fltr_mgmt_list_entry *entry;
-
- list_for_each_entry(entry, rules, list_entry) {
- if (entry->rule_info.fltr_rule_id == rule_id)
- return entry;
- }
-
- return NULL;
-}
-
-/**
- * ice_fltr_update_adv_rule_flags - update flags on advanced rule
- * @vsi: pointer to VSI
- * @recipe_id: id of recipe
- * @entry: advanced rule entry
- * @new_flags: flags to update
- */
-static enum ice_status
-ice_fltr_update_adv_rule_flags(struct ice_vsi *vsi, u16 recipe_id,
- struct ice_adv_fltr_mgmt_list_entry *entry,
- u32 new_flags)
-{
- struct ice_adv_rule_info *info = &entry->rule_info;
- struct ice_sw_act_ctrl *act = &info->sw_act;
- u32 action;
-
- if (act->fltr_act != ICE_FWD_TO_VSI)
- return ICE_ERR_NOT_SUPPORTED;
-
- action = ice_fltr_build_action(act->fwd_id.hw_vsi_id);
-
- return ice_fltr_update_rule_flags(&vsi->back->hw, info->fltr_rule_id,
- recipe_id, action, info->sw_act.flag,
- act->src, new_flags);
-}
-
-/**
- * ice_fltr_find_regular_entry - find regular rule
- * @rules: list of rules
- * @rule_id: id of wanted rule
- */
-static struct ice_fltr_mgmt_list_entry *
-ice_fltr_find_regular_entry(struct list_head *rules, u16 rule_id)
-{
- struct ice_fltr_mgmt_list_entry *entry;
-
- list_for_each_entry(entry, rules, list_entry) {
- if (entry->fltr_info.fltr_rule_id == rule_id)
- return entry;
- }
-
- return NULL;
-}
-
-/**
- * ice_fltr_update_regular_rule - update flags on regular rule
- * @vsi: pointer to VSI
- * @recipe_id: id of recipe
- * @entry: regular rule entry
- * @new_flags: flags to update
- */
-static enum ice_status
-ice_fltr_update_regular_rule(struct ice_vsi *vsi, u16 recipe_id,
- struct ice_fltr_mgmt_list_entry *entry,
- u32 new_flags)
-{
- struct ice_fltr_info *info = &entry->fltr_info;
- u32 action;
-
- if (info->fltr_act != ICE_FWD_TO_VSI)
- return ICE_ERR_NOT_SUPPORTED;
-
- action = ice_fltr_build_action(info->fwd_id.hw_vsi_id);
-
- return ice_fltr_update_rule_flags(&vsi->back->hw, info->fltr_rule_id,
- recipe_id, action, info->flag,
- info->src, new_flags);
-}
-
-/**
- * ice_fltr_update_flags - update flags on rule
- * @vsi: pointer to VSI
- * @rule_id: id of rule
- * @recipe_id: id of recipe
- * @new_flags: flags to update
- *
- * Function updates flags on regular and advance rule.
- *
- * Flags should be a combination of ICE_SINGLE_ACT_LB_ENABLE and
- * ICE_SINGLE_ACT_LAN_ENABLE.
- */
-enum ice_status
-ice_fltr_update_flags(struct ice_vsi *vsi, u16 rule_id, u16 recipe_id,
- u32 new_flags)
-{
- struct ice_adv_fltr_mgmt_list_entry *adv_entry;
- struct ice_fltr_mgmt_list_entry *regular_entry;
- struct ice_hw *hw = &vsi->back->hw;
- struct ice_sw_recipe *recp_list;
- struct list_head *fltr_rules;
-
- recp_list = &hw->switch_info->recp_list[recipe_id];
- if (!recp_list)
- return ICE_ERR_DOES_NOT_EXIST;
-
- fltr_rules = &recp_list->filt_rules;
- regular_entry = ice_fltr_find_regular_entry(fltr_rules, rule_id);
- if (regular_entry)
- return ice_fltr_update_regular_rule(vsi, recipe_id,
- regular_entry, new_flags);
-
- adv_entry = ice_fltr_find_adv_entry(fltr_rules, rule_id);
- if (adv_entry)
- return ice_fltr_update_adv_rule_flags(vsi, recipe_id,
- adv_entry, new_flags);
-
- return ICE_ERR_DOES_NOT_EXIST;
-}
-
-/**
* ice_fltr_update_flags_dflt_rule - update flags on default rule
* @vsi: pointer to VSI
* @rule_id: id of rule