case FS_FT_OP_MOD_NORMAL:
                if (next_ft) {
                        MLX5_SET(create_flow_table_in, in,
-                                flow_table_context.table_miss_action, 1);
+                                flow_table_context.table_miss_action,
+                                MLX5_FLOW_TABLE_MISS_ACTION_FWD);
                        MLX5_SET(create_flow_table_in, in,
                                 flow_table_context.table_miss_id, next_ft->id);
+               } else {
+                       MLX5_SET(create_flow_table_in, in,
+                                flow_table_context.table_miss_action,
+                                ns->def_miss_action);
                }
                break;
 
                         MLX5_MODIFY_FLOW_TABLE_MISS_TABLE_ID);
                if (next_ft) {
                        MLX5_SET(modify_flow_table_in, in,
-                                flow_table_context.table_miss_action, 1);
+                                flow_table_context.table_miss_action,
+                                MLX5_FLOW_TABLE_MISS_ACTION_FWD);
                        MLX5_SET(modify_flow_table_in, in,
                                 flow_table_context.table_miss_id,
                                 next_ft->id);
                } else {
                        MLX5_SET(modify_flow_table_in, in,
-                                flow_table_context.table_miss_action, 0);
+                                flow_table_context.table_miss_action,
+                                ns->def_miss_action);
                }
        }
 
 
        if (!steering->rdma_rx_root_ns)
                return -ENOMEM;
 
+       steering->rdma_rx_root_ns->def_miss_action =
+               MLX5_FLOW_TABLE_MISS_ACTION_SWITCH_DOMAIN;
+
        /* Create single prio */
        prio = fs_create_prio(&steering->rdma_rx_root_ns->ns, 0, 1);
        if (IS_ERR(prio)) {
                        goto err;
        }
 
-       if (MLX5_CAP_FLOWTABLE_RDMA_RX(dev, ft_support)) {
+       if (MLX5_CAP_FLOWTABLE_RDMA_RX(dev, ft_support) &&
+           MLX5_CAP_FLOWTABLE_RDMA_RX(dev, table_miss_action_domain)) {
                err = init_rdma_rx_root_ns(steering);
                if (err)
                        goto err;
 
        struct mutex                    chain_lock;
        struct list_head                underlay_qpns;
        const struct mlx5_flow_cmds     *cmds;
+       enum mlx5_flow_table_miss_action def_miss_action;
 };
 
 int mlx5_init_fc_stats(struct mlx5_core_dev *dev);
 
        u8         reformat_l3_tunnel_to_l2[0x1];
        u8         reformat_l2_to_l3_tunnel[0x1];
        u8         reformat_and_modify_action[0x1];
-       u8         reserved_at_15[0xb];
+       u8         reserved_at_15[0x2];
+       u8         table_miss_action_domain[0x1];
+       u8         reserved_at_18[0x8];
        u8         reserved_at_20[0x2];
        u8         log_max_ft_size[0x6];
        u8         log_max_modify_header_context[0x8];
        MLX5_FLOW_DESTINATION_TYPE_FLOW_TABLE_NUM = 0x101,
 };
 
+enum mlx5_flow_table_miss_action {
+       MLX5_FLOW_TABLE_MISS_ACTION_DEF,
+       MLX5_FLOW_TABLE_MISS_ACTION_FWD,
+       MLX5_FLOW_TABLE_MISS_ACTION_SWITCH_DOMAIN,
+};
+
 struct mlx5_ifc_dest_format_struct_bits {
        u8         destination_type[0x8];
        u8         destination_id[0x18];