net/sfc: allow ports without MAE privilege
[dpdk.git] / drivers / net / sfc / sfc_flow.c
index 51bf099..d57235f 100644 (file)
@@ -1275,7 +1275,7 @@ sfc_flow_parse_attr(struct sfc_adapter *sa,
                spec_filter->template.efs_rss_context = EFX_RSS_CONTEXT_DEFAULT;
                spec_filter->template.efs_priority = EFX_FILTER_PRI_MANUAL;
        } else {
-               if (mae->status != SFC_MAE_STATUS_SUPPORTED) {
+               if (mae->status != SFC_MAE_STATUS_ADMIN) {
                        rte_flow_error_set(error, ENOTSUP,
                                           RTE_FLOW_ERROR_TYPE_ATTR_TRANSFER,
                                           attr, "Transfer is not supported");
@@ -2563,17 +2563,20 @@ sfc_flow_parse_rte_to_mae(struct rte_eth_dev *dev,
 
        if (spec_mae->ft_rule_type == SFC_FT_RULE_JUMP) {
                /*
-                * This flow is represented solely by the outer rule.
-                * It is supposed to mark and count matching packets.
+                * By design, this flow should be represented solely by the
+                * outer rule. But the HW/FW hasn't got support for setting
+                * Rx mark from RECIRC_ID on outer rule lookup yet. Neither
+                * does it support outer rule counters. As a workaround, an
+                * action rule of lower priority is used to do the job.
+                *
+                * So don't skip sfc_mae_rule_parse_actions() below.
                 */
-               goto skip_action_rule;
        }
 
        rc = sfc_mae_rule_parse_actions(sa, actions, spec_mae, error);
        if (rc != 0)
                goto fail;
 
-skip_action_rule:
        if (spec_mae->ft != NULL) {
                if (spec_mae->ft_rule_type == SFC_FT_RULE_JUMP)
                        spec_mae->ft->jump_rule_is_set = B_TRUE;
@@ -2990,6 +2993,8 @@ sfc_flow_start(struct sfc_adapter *sa)
 
        SFC_ASSERT(sfc_adapter_is_locked(sa));
 
+       sfc_flow_tunnel_reset_hit_counters(sa);
+
        TAILQ_FOREACH(flow, &sa->flow_list, entries) {
                rc = sfc_flow_insert(sa, flow, NULL);
                if (rc != 0)