net/mlx5: Update vport caps query/set for EC VFs
authorDaniel Jurgens <danielj@nvidia.com>
Tue, 7 Mar 2023 17:51:22 +0000 (19:51 +0200)
committerSaeed Mahameed <saeedm@nvidia.com>
Sat, 10 Jun 2023 01:40:51 +0000 (18:40 -0700)
These functions are for query/set by vport, there was an underlying
assumption that vport was equal to function ID. That's not the case for
EC VF functions. Set the ec_vf_function bit accordingly.

Signed-off-by: Daniel Jurgens <danielj@nvidia.com>
Reviewed-by: William Tu <witu@nvidia.com>
Signed-off-by: Saeed Mahameed <saeedm@nvidia.com>
drivers/net/ethernet/mellanox/mlx5/core/mlx5_core.h
drivers/net/ethernet/mellanox/mlx5/core/vport.c
include/linux/mlx5/vport.h

index 0e7b5c6..7ca0c7a 100644 (file)
@@ -325,10 +325,10 @@ void mlx5_unload_one_devl_locked(struct mlx5_core_dev *dev, bool suspend);
 int mlx5_load_one(struct mlx5_core_dev *dev, bool recovery);
 int mlx5_load_one_devl_locked(struct mlx5_core_dev *dev, bool recovery);
 
-int mlx5_vport_set_other_func_cap(struct mlx5_core_dev *dev, const void *hca_cap, u16 function_id,
+int mlx5_vport_set_other_func_cap(struct mlx5_core_dev *dev, const void *hca_cap, u16 vport,
                                  u16 opmod);
-#define mlx5_vport_get_other_func_general_cap(dev, fid, out)           \
-       mlx5_vport_get_other_func_cap(dev, fid, out, MLX5_CAP_GENERAL)
+#define mlx5_vport_get_other_func_general_cap(dev, vport, out)         \
+       mlx5_vport_get_other_func_cap(dev, vport, out, MLX5_CAP_GENERAL)
 
 void mlx5_events_work_enqueue(struct mlx5_core_dev *dev, struct work_struct *work);
 static inline u32 mlx5_sriov_get_vf_total_msix(struct pci_dev *pdev)
index bc66b07..6d3984d 100644 (file)
@@ -1161,23 +1161,32 @@ u64 mlx5_query_nic_system_image_guid(struct mlx5_core_dev *mdev)
 }
 EXPORT_SYMBOL_GPL(mlx5_query_nic_system_image_guid);
 
-int mlx5_vport_get_other_func_cap(struct mlx5_core_dev *dev, u16 function_id, void *out,
+static int mlx5_vport_to_func_id(const struct mlx5_core_dev *dev, u16 vport, bool ec_vf_func)
+{
+       return ec_vf_func ? vport - mlx5_core_ec_vf_vport_base(dev)
+                         : vport;
+}
+
+int mlx5_vport_get_other_func_cap(struct mlx5_core_dev *dev, u16 vport, void *out,
                                  u16 opmod)
 {
+       bool ec_vf_func = mlx5_core_is_ec_vf_vport(dev, vport);
        u8 in[MLX5_ST_SZ_BYTES(query_hca_cap_in)] = {};
 
        opmod = (opmod << 1) | (HCA_CAP_OPMOD_GET_MAX & 0x01);
        MLX5_SET(query_hca_cap_in, in, opcode, MLX5_CMD_OP_QUERY_HCA_CAP);
        MLX5_SET(query_hca_cap_in, in, op_mod, opmod);
-       MLX5_SET(query_hca_cap_in, in, function_id, function_id);
+       MLX5_SET(query_hca_cap_in, in, function_id, mlx5_vport_to_func_id(dev, vport, ec_vf_func));
        MLX5_SET(query_hca_cap_in, in, other_function, true);
+       MLX5_SET(query_hca_cap_in, in, ec_vf_function, ec_vf_func);
        return mlx5_cmd_exec_inout(dev, query_hca_cap, in, out);
 }
 EXPORT_SYMBOL_GPL(mlx5_vport_get_other_func_cap);
 
 int mlx5_vport_set_other_func_cap(struct mlx5_core_dev *dev, const void *hca_cap,
-                                 u16 function_id, u16 opmod)
+                                 u16 vport, u16 opmod)
 {
+       bool ec_vf_func = mlx5_core_is_ec_vf_vport(dev, vport);
        int set_sz = MLX5_ST_SZ_BYTES(set_hca_cap_in);
        void *set_hca_cap;
        void *set_ctx;
@@ -1191,8 +1200,10 @@ int mlx5_vport_set_other_func_cap(struct mlx5_core_dev *dev, const void *hca_cap
        MLX5_SET(set_hca_cap_in, set_ctx, op_mod, opmod << 1);
        set_hca_cap = MLX5_ADDR_OF(set_hca_cap_in, set_ctx, capability);
        memcpy(set_hca_cap, hca_cap, MLX5_ST_SZ_BYTES(cmd_hca_cap));
-       MLX5_SET(set_hca_cap_in, set_ctx, function_id, function_id);
+       MLX5_SET(set_hca_cap_in, set_ctx, function_id,
+                mlx5_vport_to_func_id(dev, vport, ec_vf_func));
        MLX5_SET(set_hca_cap_in, set_ctx, other_function, true);
+       MLX5_SET(set_hca_cap_in, set_ctx, ec_vf_function, ec_vf_func);
        ret = mlx5_cmd_exec_in(dev, set_hca_cap, set_ctx);
 
        kfree(set_ctx);
index 7f31432..fbb9bf4 100644 (file)
@@ -132,6 +132,6 @@ int mlx5_nic_vport_affiliate_multiport(struct mlx5_core_dev *master_mdev,
 int mlx5_nic_vport_unaffiliate_multiport(struct mlx5_core_dev *port_mdev);
 
 u64 mlx5_query_nic_system_image_guid(struct mlx5_core_dev *mdev);
-int mlx5_vport_get_other_func_cap(struct mlx5_core_dev *dev, u16 function_id, void *out,
+int mlx5_vport_get_other_func_cap(struct mlx5_core_dev *dev, u16 vport, void *out,
                                  u16 opmod);
 #endif /* __MLX5_VPORT_H__ */