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,
            (!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 */
        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;
        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