ct_flow->post_ct_attr->prio = 0;
        ct_flow->post_ct_attr->ft = ct_priv->post_ct;
 
+       /* Splits were handled before CT */
+       if (ct_priv->ns_type == MLX5_FLOW_NAMESPACE_FDB)
+               ct_flow->post_ct_attr->esw_attr->split_count = 0;
+
        ct_flow->post_ct_attr->inner_match_level = MLX5_MATCH_NONE;
        ct_flow->post_ct_attr->outer_match_level = MLX5_MATCH_NONE;
        ct_flow->post_ct_attr->action &= ~(MLX5_FLOW_CONTEXT_ACTION_DECAP);
 
        if (flow_flag_test(flow, CT)) {
                mod_hdr_acts = &attr->parse_attr->mod_hdr_acts;
 
-               return mlx5_tc_ct_flow_offload(get_ct_priv(flow->priv),
+               rule = mlx5_tc_ct_flow_offload(get_ct_priv(flow->priv),
                                               flow, spec, attr,
                                               mod_hdr_acts);
+       } else {
+               rule = mlx5_eswitch_add_offloaded_rule(esw, spec, attr);
        }
 
-       rule = mlx5_eswitch_add_offloaded_rule(esw, spec, attr);
        if (IS_ERR(rule))
                return rule;
 
        if (attr->esw_attr->split_count) {
                flow->rule[1] = mlx5_eswitch_add_fwd_rule(esw, spec, attr);
                if (IS_ERR(flow->rule[1])) {
-                       mlx5_eswitch_del_offloaded_rule(esw, rule, attr);
+                       if (flow_flag_test(flow, CT))
+                               mlx5_tc_ct_delete_flow(get_ct_priv(flow->priv), flow, attr);
+                       else
+                               mlx5_eswitch_del_offloaded_rule(esw, rule, attr);
                        return flow->rule[1];
                }
        }
        actions = flow->attr->action;
 
        if (mlx5e_is_eswitch_flow(flow)) {
-               if (flow->attr->esw_attr->split_count && ct_flow) {
+               if (flow->attr->esw_attr->split_count && ct_flow &&
+                   !MLX5_CAP_GEN(flow->attr->esw_attr->in_mdev, reg_c_preserve)) {
                        /* All registers used by ct are cleared when using
                         * split rules.
                         */
                                return err;
 
                        flow_flag_set(flow, CT);
+                       esw_attr->split_count = esw_attr->out_count;
                        break;
                default:
                        NL_SET_ERR_MSG_MOD(extack, "The offload action is not supported");
                        return -EOPNOTSUPP;
                }
 
-               if (attr->action & MLX5_FLOW_CONTEXT_ACTION_FWD_DEST) {
-                       NL_SET_ERR_MSG_MOD(extack,
-                                          "Mirroring goto chain rules isn't supported");
-                       return -EOPNOTSUPP;
-               }
                attr->action |= MLX5_FLOW_CONTEXT_ACTION_FWD_DEST;
        }