]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
net/mlx5: Check max_macs devlink param value against max capability
authorDragos Tatulea <dtatulea@nvidia.com>
Thu, 11 Jun 2026 13:52:30 +0000 (16:52 +0300)
committerJakub Kicinski <kuba@kernel.org>
Sat, 13 Jun 2026 01:38:07 +0000 (18:38 -0700)
The max_macs devlink param is checked against the FW max value only at
param register time (driver load) and inside the validate callback
(devlink param set). The stored DRIVERINIT value persists across FW
resets and devlink reloads without any further checks against the max.

If the FW link type changes from Ethernet to IB and a FW reset happens,
the MAX cap for log_max_current_uc_list will become zero, but the
previously stored max_macs value remains and is unconditionally
programmed into the HCA caps in handle_hca_cap(). FW will then return a
syndrome during SET_HCA_CAP:

 mlx5_cmd_out_err:839:(pid 3831): SET_HCA_CAP(0x109) op_mod(0x0) failed,
 status bad parameter(0x3), syndrome (0x537801), err(-22)
 set_hca_cap:907:(pid 3831): handle_hca_cap failed

This results in a failure to register the RDMA device.

This patch skips programming log_max_current_uc_list when the MAX
capability is 0 (in case of IB).

Fixes: 8680a60fc1fc ("net/mlx5: Let user configure max_macs generic param")
Signed-off-by: Dragos Tatulea <dtatulea@nvidia.com>
Reviewed-by: Yael Chemla <ychemla@nvidia.com>
Reviewed-by: Carolina Jubran <cjubran@nvidia.com>
Signed-off-by: Tariq Toukan <tariqt@nvidia.com>
Reviewed-by: Alexander Lobakin <aleksander.lobakin@intel.com>
Link: https://patch.msgid.link/20260611135230.534513-1-tariqt@nvidia.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/ethernet/mellanox/mlx5/core/main.c

index 74827e8ca12555869b191c5d728e2b7a9db549b9..37af619e5e0454fb527b876ed7721c829a515d45 100644 (file)
@@ -527,7 +527,6 @@ static int handle_hca_cap(struct mlx5_core_dev *dev, void *set_ctx)
 {
        struct mlx5_profile *prof = &dev->profile;
        void *set_hca_cap;
-       int max_uc_list;
        int err;
 
        err = mlx5_core_get_caps(dev, MLX5_CAP_GENERAL);
@@ -610,10 +609,13 @@ static int handle_hca_cap(struct mlx5_core_dev *dev, void *set_ctx)
                MLX5_SET(cmd_hca_cap, set_hca_cap, roce,
                         mlx5_is_roce_on(dev));
 
-       max_uc_list = max_uc_list_get_devlink_param(dev);
-       if (max_uc_list > 0)
-               MLX5_SET(cmd_hca_cap, set_hca_cap, log_max_current_uc_list,
-                        ilog2(max_uc_list));
+       if (MLX5_CAP_GEN_MAX(dev, log_max_current_uc_list)) {
+               int max_uc_list = max_uc_list_get_devlink_param(dev);
+
+               if (max_uc_list > 0)
+                       MLX5_SET(cmd_hca_cap, set_hca_cap,
+                                log_max_current_uc_list, ilog2(max_uc_list));
+       }
 
        /* enable absolute native port num */
        if (MLX5_CAP_GEN_MAX(dev, abs_native_port_num))