Commit cfcb9428 authored by Alejandro Lucero's avatar Alejandro Lucero Committed by David S. Miller

sfc: fix devlink info error handling

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 14743ddd ("sfc: add devlink info support for ef100")
Signed-off-by: default avatarAlejandro Lucero <alejandro.lucero-palau@amd.com>
Acked-by: default avatarMartin Habets <habetsm.xilinx@gmail.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 35112271
...@@ -171,9 +171,14 @@ static int efx_devlink_info_nvram_partition(struct efx_nic *efx, ...@@ -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, rc = efx_mcdi_nvram_metadata(efx, partition_type, NULL, version, NULL,
0); 0);
/* If the partition does not exist, that is not an error. */
if (rc == -ENOENT)
return 0;
if (rc) { if (rc) {
netif_err(efx, drv, efx->net_dev, "mcdi nvram %s: failed\n", netif_err(efx, drv, efx->net_dev, "mcdi nvram %s: failed (rc=%d)\n",
version_name); version_name, rc);
return rc; return rc;
} }
...@@ -187,36 +192,33 @@ static int efx_devlink_info_nvram_partition(struct efx_nic *efx, ...@@ -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, static int efx_devlink_info_stored_versions(struct efx_nic *efx,
struct devlink_info_req *req) struct devlink_info_req *req)
{ {
int rc; int err;
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;
rc = efx_devlink_info_nvram_partition(efx, req, /* We do not care here about the specific error but just if an error
NVRAM_PARTITION_TYPE_EXPANSION_UEFI, * happened. The specific error will be reported inside the call
EFX_DEVLINK_INFO_VERSION_FW_UEFI); * through system messages, and if any error happened in any call
return rc; * 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) \ #define EFX_VER_FLAG(_f) \
...@@ -587,27 +589,20 @@ static int efx_devlink_info_get(struct devlink *devlink, ...@@ -587,27 +589,20 @@ static int efx_devlink_info_get(struct devlink *devlink,
{ {
struct efx_devlink *devlink_private = devlink_priv(devlink); struct efx_devlink *devlink_private = devlink_priv(devlink);
struct efx_nic *efx = devlink_private->efx; struct efx_nic *efx = devlink_private->efx;
int rc; int err;
/* Several different MCDI commands are used. We report first error /* Several different MCDI commands are used. We report if errors
* through extack returning at that point. Specific error * happened through extack. Specific error information via system
* information via system messages. * messages inside the calls.
*/ */
rc = efx_devlink_info_board_cfg(efx, req); err = efx_devlink_info_board_cfg(efx, req);
if (rc) {
NL_SET_ERR_MSG_MOD(extack, "Getting board info failed"); err |= efx_devlink_info_stored_versions(efx, req);
return rc;
} err |= efx_devlink_info_running_versions(efx, req);
rc = efx_devlink_info_stored_versions(efx, req);
if (rc) { if (err)
NL_SET_ERR_MSG_MOD(extack, "Getting stored versions failed"); NL_SET_ERR_MSG_MOD(extack, "Errors when getting device info. Check system messages");
return rc;
}
rc = efx_devlink_info_running_versions(efx, req);
if (rc) {
NL_SET_ERR_MSG_MOD(extack, "Getting running versions failed");
return rc;
}
return 0; return 0;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment