Revert "net/mlx5e: Don't use termination table when redundant"
authorVlad Buslov <vladbu@nvidia.com>
Thu, 13 Apr 2023 13:06:59 +0000 (15:06 +0200)
committerSaeed Mahameed <saeedm@nvidia.com>
Fri, 21 Apr 2023 01:47:33 +0000 (18:47 -0700)
This reverts commit 14624d7247fcd0f3114a6f5f17b3c8d1020fbbb7.

The termination table usage is requires for DMFS steering mode as firmware
doesn't support mixed table destinations list which causes following
syndrome with hairpin rules:

[81922.283225] mlx5_core 0000:08:00.0: mlx5_cmd_out_err:803:(pid 25977): SET_FLOW_TABLE_ENTRY(0x936) op_mod(0x0) failed, status bad parameter(0x3), syndrome (0xaca205), err(-22)

Fixes: 14624d7247fc ("net/mlx5e: Don't use termination table when redundant")
Signed-off-by: Vlad Buslov <vladbu@nvidia.com>
Reviewed-by: Roi Dayan <roid@nvidia.com>
Reviewed-by: Maor Dickman <maord@nvidia.com>
Signed-off-by: Saeed Mahameed <saeedm@nvidia.com>
drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads_termtbl.c

index 3a9a6bb9158de2e8f4777d595f4aff700fa1db54..edd9102583144192c91e6d5103534be02dc02469 100644 (file)
@@ -210,18 +210,6 @@ static bool mlx5_eswitch_offload_is_uplink_port(const struct mlx5_eswitch *esw,
        return (port_mask & port_value) == MLX5_VPORT_UPLINK;
 }
 
-static bool
-mlx5_eswitch_is_push_vlan_no_cap(struct mlx5_eswitch *esw,
-                                struct mlx5_flow_act *flow_act)
-{
-       if (flow_act->action & MLX5_FLOW_CONTEXT_ACTION_VLAN_PUSH &&
-           !(mlx5_fs_get_capabilities(esw->dev, MLX5_FLOW_NAMESPACE_FDB) &
-             MLX5_FLOW_STEERING_CAP_VLAN_PUSH_ON_RX))
-               return true;
-
-       return false;
-}
-
 bool
 mlx5_eswitch_termtbl_required(struct mlx5_eswitch *esw,
                              struct mlx5_flow_attr *attr,
@@ -237,7 +225,10 @@ mlx5_eswitch_termtbl_required(struct mlx5_eswitch *esw,
            (!mlx5_eswitch_offload_is_uplink_port(esw, spec) && !esw_attr->int_port))
                return false;
 
-       if (mlx5_eswitch_is_push_vlan_no_cap(esw, flow_act))
+       /* push vlan on RX */
+       if (flow_act->action & MLX5_FLOW_CONTEXT_ACTION_VLAN_PUSH &&
+           !(mlx5_fs_get_capabilities(esw->dev, MLX5_FLOW_NAMESPACE_FDB) &
+             MLX5_FLOW_STEERING_CAP_VLAN_PUSH_ON_RX))
                return true;
 
        /* hairpin */
@@ -261,31 +252,19 @@ mlx5_eswitch_add_termtbl_rule(struct mlx5_eswitch *esw,
        struct mlx5_flow_act term_tbl_act = {};
        struct mlx5_flow_handle *rule = NULL;
        bool term_table_created = false;
-       bool is_push_vlan_on_rx;
        int num_vport_dests = 0;
        int i, curr_dest;
 
-       is_push_vlan_on_rx = mlx5_eswitch_is_push_vlan_no_cap(esw, flow_act);
        mlx5_eswitch_termtbl_actions_move(flow_act, &term_tbl_act);
        term_tbl_act.action |= MLX5_FLOW_CONTEXT_ACTION_FWD_DEST;
 
        for (i = 0; i < num_dest; i++) {
                struct mlx5_termtbl_handle *tt;
-               bool hairpin = false;
 
                /* only vport destinations can be terminated */
                if (dest[i].type != MLX5_FLOW_DESTINATION_TYPE_VPORT)
                        continue;
 
-               if (attr->dests[num_vport_dests].rep &&
-                   attr->dests[num_vport_dests].rep->vport == MLX5_VPORT_UPLINK)
-                       hairpin = true;
-
-               if (!is_push_vlan_on_rx && !hairpin) {
-                       num_vport_dests++;
-                       continue;
-               }
-
                if (attr->dests[num_vport_dests].flags & MLX5_ESW_DEST_ENCAP) {
                        term_tbl_act.action |= MLX5_FLOW_CONTEXT_ACTION_PACKET_REFORMAT;
                        term_tbl_act.pkt_reformat = attr->dests[num_vport_dests].pkt_reformat;
@@ -333,9 +312,6 @@ revert_changes:
        for (curr_dest = 0; curr_dest < num_vport_dests; curr_dest++) {
                struct mlx5_termtbl_handle *tt = attr->dests[curr_dest].termtbl;
 
-               if (!tt)
-                       continue;
-
                attr->dests[curr_dest].termtbl = NULL;
 
                /* search for the destination associated with the