]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
net/mlx5: Avoid "No data available" when FW version queries fail
authorSaeed Mahameed <saeedm@nvidia.com>
Mon, 30 Mar 2026 19:40:14 +0000 (22:40 +0300)
committerJakub Kicinski <kuba@kernel.org>
Thu, 2 Apr 2026 03:10:41 +0000 (20:10 -0700)
Avoid printing the misleading "kernel answers: No data available" devlink
output when querying firmware or pending firmware version fails
(e.g. MLX5 fw state errors / flash failures).

FW can fail on loading the pending flash image and get its version due
to various reasons, examples:

mlxfw: Firmware flash failed: key not applicable, err (7)
mlx5_fw_image_pending: can't read pending fw version while fw state is 1

and the resulting:
$ devlink dev info
kernel answers: No data available

Instead, just report 0 or 0xfff.. versions in case of failure to indicate
a problem, and let other information be shown.

after the fix:
$ devlink dev info
pci/0000:00:06.0:
  driver mlx5_core
  serial_number xxx...
  board.serial_number MT2225300179
  versions:
      fixed:
        fw.psid MT_0000000436
      running:
        fw.version 22.41.0188
        fw 22.41.0188
      stored:
        fw.version 255.255.65535
        fw 255.255.65535

Fixes: 9c86b07e3069 ("net/mlx5: Added fw version query command")
Signed-off-by: Saeed Mahameed <saeedm@nvidia.com>
Reviewed-by: Moshe Shemesh <moshe@nvidia.com>
Signed-off-by: Tariq Toukan <tariqt@nvidia.com>
Link: https://patch.msgid.link/20260330194015.53585-3-tariqt@nvidia.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/ethernet/mellanox/mlx5/core/devlink.c
drivers/net/ethernet/mellanox/mlx5/core/fw.c
drivers/net/ethernet/mellanox/mlx5/core/mlx5_core.h

index 6698ac55a4bfa5d111556731880dd662ae11a932..73cf0321bb86ba1b8dd750f45d1a950aa85c5743 100644 (file)
@@ -107,9 +107,7 @@ mlx5_devlink_info_get(struct devlink *devlink, struct devlink_info_req *req,
        if (err)
                return err;
 
-       err = mlx5_fw_version_query(dev, &running_fw, &stored_fw);
-       if (err)
-               return err;
+       mlx5_fw_version_query(dev, &running_fw, &stored_fw);
 
        snprintf(version_str, sizeof(version_str), "%d.%d.%04d",
                 mlx5_fw_ver_major(running_fw), mlx5_fw_ver_minor(running_fw),
index eeb4437975f20af585be5553ec49f249e8e9107f..c1f220e5fe185706e21d13cf7b89d2bb814b088c 100644 (file)
@@ -822,48 +822,63 @@ mlx5_fw_image_pending(struct mlx5_core_dev *dev,
        return 0;
 }
 
-int mlx5_fw_version_query(struct mlx5_core_dev *dev,
-                         u32 *running_ver, u32 *pending_ver)
+void mlx5_fw_version_query(struct mlx5_core_dev *dev,
+                          u32 *running_ver, u32 *pending_ver)
 {
        u32 reg_mcqi_version[MLX5_ST_SZ_DW(mcqi_version)] = {};
        bool pending_version_exists;
        int component_index;
        int err;
 
+       *running_ver = 0;
+       *pending_ver = 0;
+
        if (!MLX5_CAP_GEN(dev, mcam_reg) || !MLX5_CAP_MCAM_REG(dev, mcqi) ||
            !MLX5_CAP_MCAM_REG(dev, mcqs)) {
                mlx5_core_warn(dev, "fw query isn't supported by the FW\n");
-               return -EOPNOTSUPP;
+               return;
        }
 
        component_index = mlx5_get_boot_img_component_index(dev);
-       if (component_index < 0)
-               return component_index;
+       if (component_index < 0) {
+               mlx5_core_warn(dev, "fw query failed to find boot img component index, err %d\n",
+                              component_index);
+               return;
+       }
 
+       *running_ver = U32_MAX; /* indicate failure */
        err = mlx5_reg_mcqi_version_query(dev, component_index,
                                          MCQI_FW_RUNNING_VERSION,
                                          reg_mcqi_version);
-       if (err)
-               return err;
-
-       *running_ver = MLX5_GET(mcqi_version, reg_mcqi_version, version);
-
+       if (!err)
+               *running_ver = MLX5_GET(mcqi_version, reg_mcqi_version,
+                                       version);
+       else
+               mlx5_core_warn(dev, "failed to query running version, err %d\n",
+                              err);
+
+       *pending_ver = U32_MAX; /* indicate failure */
        err = mlx5_fw_image_pending(dev, component_index, &pending_version_exists);
-       if (err)
-               return err;
+       if (err) {
+               mlx5_core_warn(dev, "failed to query pending image, err %d\n",
+                              err);
+               return;
+       }
 
        if (!pending_version_exists) {
                *pending_ver = 0;
-               return 0;
+               return;
        }
 
        err = mlx5_reg_mcqi_version_query(dev, component_index,
                                          MCQI_FW_STORED_VERSION,
                                          reg_mcqi_version);
-       if (err)
-               return err;
-
-       *pending_ver = MLX5_GET(mcqi_version, reg_mcqi_version, version);
-
-       return 0;
+       if (!err)
+               *pending_ver = MLX5_GET(mcqi_version, reg_mcqi_version,
+                                       version);
+       else
+               mlx5_core_warn(dev, "failed to query pending version, err %d\n",
+                              err);
+
+       return;
 }
index b635b423d9721eb8d51ebcf5eddf3287ef19a18f..1507e881d962ac2676b9f676ac6c488de117bb3d 100644 (file)
@@ -393,8 +393,8 @@ int mlx5_port_max_linkspeed(struct mlx5_core_dev *mdev, u32 *speed);
 
 int mlx5_firmware_flash(struct mlx5_core_dev *dev, const struct firmware *fw,
                        struct netlink_ext_ack *extack);
-int mlx5_fw_version_query(struct mlx5_core_dev *dev,
-                         u32 *running_ver, u32 *stored_ver);
+void mlx5_fw_version_query(struct mlx5_core_dev *dev, u32 *running_ver,
+                          u32 *stored_ver);
 
 #ifdef CONFIG_MLX5_CORE_EN
 int mlx5e_init(void);