net/mlx5: detect and enable bypass port select flow table
authorLiu, Changcheng <jerrliu@nvidia.com>
Wed, 7 Sep 2022 23:36:29 +0000 (16:36 -0700)
committerSaeed Mahameed <saeedm@nvidia.com>
Tue, 27 Sep 2022 19:50:27 +0000 (12:50 -0700)
Use port selection capability port_select_flow_table_bypass
bit to detect and enable explicit port affinity even when
in lag hash mode.

Signed-off-by: Liu, Changcheng <jerrliu@nvidia.com>
Reviewed-by: Mark Bloch <mbloch@nvidia.com>
Reviewed-by: Saeed Mahameed <saeedm@nvidia.com>
Signed-off-by: Saeed Mahameed <saeedm@nvidia.com>
drivers/net/ethernet/mellanox/mlx5/core/main.c

index de9c315..319f5dd 100644 (file)
@@ -652,6 +652,33 @@ static int handle_hca_cap_roce(struct mlx5_core_dev *dev, void *set_ctx)
        return err;
 }
 
+static int handle_hca_cap_port_selection(struct mlx5_core_dev *dev,
+                                        void *set_ctx)
+{
+       void *set_hca_cap;
+       int err;
+
+       if (!MLX5_CAP_GEN(dev, port_selection_cap))
+               return 0;
+
+       err = mlx5_core_get_caps(dev, MLX5_CAP_PORT_SELECTION);
+       if (err)
+               return err;
+
+       if (MLX5_CAP_PORT_SELECTION(dev, port_select_flow_table_bypass) ||
+           !MLX5_CAP_PORT_SELECTION_MAX(dev, port_select_flow_table_bypass))
+               return 0;
+
+       set_hca_cap = MLX5_ADDR_OF(set_hca_cap_in, set_ctx, capability);
+       memcpy(set_hca_cap, dev->caps.hca[MLX5_CAP_PORT_SELECTION]->cur,
+              MLX5_ST_SZ_BYTES(port_selection_cap));
+       MLX5_SET(port_selection_cap, set_hca_cap, port_select_flow_table_bypass, 1);
+
+       err = set_caps(dev, set_ctx, MLX5_SET_HCA_CAP_OP_MODE_PORT_SELECTION);
+
+       return err;
+}
+
 static int set_hca_cap(struct mlx5_core_dev *dev)
 {
        int set_sz = MLX5_ST_SZ_BYTES(set_hca_cap_in);
@@ -696,6 +723,13 @@ static int set_hca_cap(struct mlx5_core_dev *dev)
                goto out;
        }
 
+       memset(set_ctx, 0, set_sz);
+       err = handle_hca_cap_port_selection(dev, set_ctx);
+       if (err) {
+               mlx5_core_err(dev, "handle_hca_cap_port_selection failed\n");
+               goto out;
+       }
+
 out:
        kfree(set_ctx);
        return err;