| From 39dcf7e6974dffb417ecd9807151e20a8c9c3bd0 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Thu, 18 May 2023 06:48:22 +0100 |
| Subject: sfc: fix devlink info error handling |
| |
| From: Alejandro Lucero <alejandro.lucero-palau@amd.com> |
| |
| [ Upstream commit cfcb942863f6fce9266e1957a021e6c7295dee42 ] |
| |
| Avoid early devlink info return if errors arise with MCDI commands |
| executed for getting the required info from the device. The rationale |
| is some commands can fail but later ones could still give useful data. |
| Moreover, some nvram partitions could not be present which needs to be |
| handled as a non error. |
| |
| The specific errors are reported through system messages and if any |
| error appears, it will be reported generically through extack. |
| |
| Fixes 14743ddd2495 ("sfc: add devlink info support for ef100") |
| Signed-off-by: Alejandro Lucero <alejandro.lucero-palau@amd.com> |
| Acked-by: Martin Habets <habetsm.xilinx@gmail.com> |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/net/ethernet/sfc/efx_devlink.c | 95 ++++++++++++-------------- |
| 1 file changed, 45 insertions(+), 50 deletions(-) |
| |
| diff --git a/drivers/net/ethernet/sfc/efx_devlink.c b/drivers/net/ethernet/sfc/efx_devlink.c |
| index 381b805659d39..ef9971cbb695d 100644 |
| --- a/drivers/net/ethernet/sfc/efx_devlink.c |
| +++ b/drivers/net/ethernet/sfc/efx_devlink.c |
| @@ -171,9 +171,14 @@ static int efx_devlink_info_nvram_partition(struct efx_nic *efx, |
| |
| rc = efx_mcdi_nvram_metadata(efx, partition_type, NULL, version, NULL, |
| 0); |
| + |
| + /* If the partition does not exist, that is not an error. */ |
| + if (rc == -ENOENT) |
| + return 0; |
| + |
| if (rc) { |
| - netif_err(efx, drv, efx->net_dev, "mcdi nvram %s: failed\n", |
| - version_name); |
| + netif_err(efx, drv, efx->net_dev, "mcdi nvram %s: failed (rc=%d)\n", |
| + version_name, rc); |
| return rc; |
| } |
| |
| @@ -187,36 +192,33 @@ static int efx_devlink_info_nvram_partition(struct efx_nic *efx, |
| static int efx_devlink_info_stored_versions(struct efx_nic *efx, |
| struct devlink_info_req *req) |
| { |
| - int rc; |
| - |
| - rc = efx_devlink_info_nvram_partition(efx, req, |
| - NVRAM_PARTITION_TYPE_BUNDLE, |
| - DEVLINK_INFO_VERSION_GENERIC_FW_BUNDLE_ID); |
| - if (rc) |
| - return rc; |
| - |
| - rc = efx_devlink_info_nvram_partition(efx, req, |
| - NVRAM_PARTITION_TYPE_MC_FIRMWARE, |
| - DEVLINK_INFO_VERSION_GENERIC_FW_MGMT); |
| - if (rc) |
| - return rc; |
| - |
| - rc = efx_devlink_info_nvram_partition(efx, req, |
| - NVRAM_PARTITION_TYPE_SUC_FIRMWARE, |
| - EFX_DEVLINK_INFO_VERSION_FW_MGMT_SUC); |
| - if (rc) |
| - return rc; |
| - |
| - rc = efx_devlink_info_nvram_partition(efx, req, |
| - NVRAM_PARTITION_TYPE_EXPANSION_ROM, |
| - EFX_DEVLINK_INFO_VERSION_FW_EXPROM); |
| - if (rc) |
| - return rc; |
| + int err; |
| |
| - rc = efx_devlink_info_nvram_partition(efx, req, |
| - NVRAM_PARTITION_TYPE_EXPANSION_UEFI, |
| - EFX_DEVLINK_INFO_VERSION_FW_UEFI); |
| - return rc; |
| + /* We do not care here about the specific error but just if an error |
| + * happened. The specific error will be reported inside the call |
| + * through system messages, and if any error happened in any call |
| + * below, we report it through extack. |
| + */ |
| + err = efx_devlink_info_nvram_partition(efx, req, |
| + NVRAM_PARTITION_TYPE_BUNDLE, |
| + DEVLINK_INFO_VERSION_GENERIC_FW_BUNDLE_ID); |
| + |
| + err |= efx_devlink_info_nvram_partition(efx, req, |
| + NVRAM_PARTITION_TYPE_MC_FIRMWARE, |
| + DEVLINK_INFO_VERSION_GENERIC_FW_MGMT); |
| + |
| + err |= efx_devlink_info_nvram_partition(efx, req, |
| + NVRAM_PARTITION_TYPE_SUC_FIRMWARE, |
| + EFX_DEVLINK_INFO_VERSION_FW_MGMT_SUC); |
| + |
| + err |= efx_devlink_info_nvram_partition(efx, req, |
| + NVRAM_PARTITION_TYPE_EXPANSION_ROM, |
| + EFX_DEVLINK_INFO_VERSION_FW_EXPROM); |
| + |
| + err |= efx_devlink_info_nvram_partition(efx, req, |
| + NVRAM_PARTITION_TYPE_EXPANSION_UEFI, |
| + EFX_DEVLINK_INFO_VERSION_FW_UEFI); |
| + return err; |
| } |
| |
| #define EFX_VER_FLAG(_f) \ |
| @@ -587,27 +589,20 @@ static int efx_devlink_info_get(struct devlink *devlink, |
| { |
| struct efx_devlink *devlink_private = devlink_priv(devlink); |
| struct efx_nic *efx = devlink_private->efx; |
| - int rc; |
| + int err; |
| |
| - /* Several different MCDI commands are used. We report first error |
| - * through extack returning at that point. Specific error |
| - * information via system messages. |
| + /* Several different MCDI commands are used. We report if errors |
| + * happened through extack. Specific error information via system |
| + * messages inside the calls. |
| */ |
| - rc = efx_devlink_info_board_cfg(efx, req); |
| - if (rc) { |
| - NL_SET_ERR_MSG_MOD(extack, "Getting board info failed"); |
| - return rc; |
| - } |
| - rc = efx_devlink_info_stored_versions(efx, req); |
| - if (rc) { |
| - NL_SET_ERR_MSG_MOD(extack, "Getting stored versions failed"); |
| - return rc; |
| - } |
| - rc = efx_devlink_info_running_versions(efx, req); |
| - if (rc) { |
| - NL_SET_ERR_MSG_MOD(extack, "Getting running versions failed"); |
| - return rc; |
| - } |
| + err = efx_devlink_info_board_cfg(efx, req); |
| + |
| + err |= efx_devlink_info_stored_versions(efx, req); |
| + |
| + err |= efx_devlink_info_running_versions(efx, req); |
| + |
| + if (err) |
| + NL_SET_ERR_MSG_MOD(extack, "Errors when getting device info. Check system messages"); |
| |
| return 0; |
| } |
| -- |
| 2.39.2 |
| |