Skip to content

Commit 10dc35f

Browse files
Saeed Mahameedkuba-moo
authored andcommitted
net/mlx5: Avoid "No data available" when FW version queries fail
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: 9c86b07 ("net/mlx5: Added fw version query command") Signed-off-by: Saeed Mahameed <[email protected]> Reviewed-by: Moshe Shemesh <[email protected]> Signed-off-by: Tariq Toukan <[email protected]> Link: https://patch.msgid.link/[email protected] Signed-off-by: Jakub Kicinski <[email protected]>
1 parent bf16bca commit 10dc35f

3 files changed

Lines changed: 37 additions & 24 deletions

File tree

drivers/net/ethernet/mellanox/mlx5/core/devlink.c

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -107,9 +107,7 @@ mlx5_devlink_info_get(struct devlink *devlink, struct devlink_info_req *req,
107107
if (err)
108108
return err;
109109

110-
err = mlx5_fw_version_query(dev, &running_fw, &stored_fw);
111-
if (err)
112-
return err;
110+
mlx5_fw_version_query(dev, &running_fw, &stored_fw);
113111

114112
snprintf(version_str, sizeof(version_str), "%d.%d.%04d",
115113
mlx5_fw_ver_major(running_fw), mlx5_fw_ver_minor(running_fw),

drivers/net/ethernet/mellanox/mlx5/core/fw.c

Lines changed: 34 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -822,48 +822,63 @@ mlx5_fw_image_pending(struct mlx5_core_dev *dev,
822822
return 0;
823823
}
824824

825-
int mlx5_fw_version_query(struct mlx5_core_dev *dev,
826-
u32 *running_ver, u32 *pending_ver)
825+
void mlx5_fw_version_query(struct mlx5_core_dev *dev,
826+
u32 *running_ver, u32 *pending_ver)
827827
{
828828
u32 reg_mcqi_version[MLX5_ST_SZ_DW(mcqi_version)] = {};
829829
bool pending_version_exists;
830830
int component_index;
831831
int err;
832832

833+
*running_ver = 0;
834+
*pending_ver = 0;
835+
833836
if (!MLX5_CAP_GEN(dev, mcam_reg) || !MLX5_CAP_MCAM_REG(dev, mcqi) ||
834837
!MLX5_CAP_MCAM_REG(dev, mcqs)) {
835838
mlx5_core_warn(dev, "fw query isn't supported by the FW\n");
836-
return -EOPNOTSUPP;
839+
return;
837840
}
838841

839842
component_index = mlx5_get_boot_img_component_index(dev);
840-
if (component_index < 0)
841-
return component_index;
843+
if (component_index < 0) {
844+
mlx5_core_warn(dev, "fw query failed to find boot img component index, err %d\n",
845+
component_index);
846+
return;
847+
}
842848

849+
*running_ver = U32_MAX; /* indicate failure */
843850
err = mlx5_reg_mcqi_version_query(dev, component_index,
844851
MCQI_FW_RUNNING_VERSION,
845852
reg_mcqi_version);
846-
if (err)
847-
return err;
848-
849-
*running_ver = MLX5_GET(mcqi_version, reg_mcqi_version, version);
850-
853+
if (!err)
854+
*running_ver = MLX5_GET(mcqi_version, reg_mcqi_version,
855+
version);
856+
else
857+
mlx5_core_warn(dev, "failed to query running version, err %d\n",
858+
err);
859+
860+
*pending_ver = U32_MAX; /* indicate failure */
851861
err = mlx5_fw_image_pending(dev, component_index, &pending_version_exists);
852-
if (err)
853-
return err;
862+
if (err) {
863+
mlx5_core_warn(dev, "failed to query pending image, err %d\n",
864+
err);
865+
return;
866+
}
854867

855868
if (!pending_version_exists) {
856869
*pending_ver = 0;
857-
return 0;
870+
return;
858871
}
859872

860873
err = mlx5_reg_mcqi_version_query(dev, component_index,
861874
MCQI_FW_STORED_VERSION,
862875
reg_mcqi_version);
863-
if (err)
864-
return err;
865-
866-
*pending_ver = MLX5_GET(mcqi_version, reg_mcqi_version, version);
867-
868-
return 0;
876+
if (!err)
877+
*pending_ver = MLX5_GET(mcqi_version, reg_mcqi_version,
878+
version);
879+
else
880+
mlx5_core_warn(dev, "failed to query pending version, err %d\n",
881+
err);
882+
883+
return;
869884
}

drivers/net/ethernet/mellanox/mlx5/core/mlx5_core.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -393,8 +393,8 @@ int mlx5_port_max_linkspeed(struct mlx5_core_dev *mdev, u32 *speed);
393393

394394
int mlx5_firmware_flash(struct mlx5_core_dev *dev, const struct firmware *fw,
395395
struct netlink_ext_ack *extack);
396-
int mlx5_fw_version_query(struct mlx5_core_dev *dev,
397-
u32 *running_ver, u32 *stored_ver);
396+
void mlx5_fw_version_query(struct mlx5_core_dev *dev, u32 *running_ver,
397+
u32 *stored_ver);
398398

399399
#ifdef CONFIG_MLX5_CORE_EN
400400
int mlx5e_init(void);

0 commit comments

Comments
 (0)