@@ -1742,12 +1742,17 @@ has_encap_dests(struct mlx5_flow_attr *attr)
static int
extra_split_attr_dests_needed(struct mlx5e_tc_flow *flow, struct mlx5_flow_attr *attr)
{
+ bool int_dest = false, ext_dest = false;
struct mlx5_esw_flow_attr *esw_attr;
+ int i;
if (flow->attr != attr ||
!list_is_first(&attr->list, &flow->attrs))
return 0;
+ if (flow_flag_test(flow, SLOW))
+ return 0;
+
esw_attr = attr->esw_attr;
if (!esw_attr->split_count ||
esw_attr->split_count == esw_attr->out_count - 1)
@@ -1758,6 +1763,18 @@ extra_split_attr_dests_needed(struct mlx5e_tc_flow *flow, struct mlx5_flow_attr
MLX5_ESW_DEST_CHAIN_WITH_SRC_PORT_CHANGE))
return esw_attr->split_count + 1;
+ for (i = esw_attr->split_count; i < esw_attr->out_count; i++) {
+ /* external dest with encap is considered as internal by firmware */
+ if (esw_attr->dests[i].vport == MLX5_VPORT_UPLINK &&
+ !(esw_attr->dests[i].flags & MLX5_ESW_DEST_ENCAP_VALID))
+ ext_dest = true;
+ else
+ int_dest = true;
+
+ if (ext_dest && int_dest)
+ return esw_attr->split_count;
+ }
+
return 0;
}