diff mbox series

[net] sfc: fix devlink info error handling

Message ID 20230518054822.20242-1-alejandro.lucero-palau@amd.com (mailing list archive)
State Accepted
Commit cfcb942863f6fce9266e1957a021e6c7295dee42
Delegated to: Netdev Maintainers
Headers show
Series [net] sfc: fix devlink info error handling | expand

Checks

Context Check Description
netdev/series_format success Single patches do not need cover letters
netdev/tree_selection success Clearly marked for net
netdev/fixes_present fail Series targets non-next tree, but doesn't contain any Fixes tags
netdev/header_inline success No static functions without inline keyword in header files
netdev/build_32bit success Errors and warnings before: 8 this patch: 8
netdev/cc_maintainers warning 2 maintainers not CCed: ecree.xilinx@gmail.com habetsm.xilinx@gmail.com
netdev/build_clang success Errors and warnings before: 8 this patch: 8
netdev/verify_signedoff success Signed-off-by tag matches author and committer
netdev/deprecated_api success None detected
netdev/check_selftest success No net selftest shell script
netdev/verify_fixes success No Fixes tag
netdev/build_allmodconfig_warn success Errors and warnings before: 8 this patch: 8
netdev/checkpatch warning WARNING: Please use correct Fixes: style 'Fixes: <12 chars of sha1> ("<title line>")' - ie: 'Fixes: 14743ddd2495 ("sfc: add devlink info support for ef100")' WARNING: line length of 101 exceeds 80 columns WARNING: line length of 81 exceeds 80 columns WARNING: line length of 82 exceeds 80 columns WARNING: line length of 83 exceeds 80 columns WARNING: line length of 84 exceeds 80 columns WARNING: line length of 86 exceeds 80 columns WARNING: line length of 90 exceeds 80 columns
netdev/kdoc success Errors and warnings before: 0 this patch: 0
netdev/source_inline success Was 0 now: 0

Commit Message

Lucero Palau, Alejandro May 18, 2023, 5:48 a.m. UTC
From: Alejandro Lucero <alejandro.lucero-palau@amd.com>

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>
---
 drivers/net/ethernet/sfc/efx_devlink.c | 95 ++++++++++++--------------
 1 file changed, 45 insertions(+), 50 deletions(-)

Comments

Martin Habets May 18, 2023, 7:35 a.m. UTC | #1
On Thu, May 18, 2023 at 06:48:22AM +0100, alejandro.lucero-palau@amd.com wrote:
> From: Alejandro Lucero <alejandro.lucero-palau@amd.com>
> 
> 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>

> ---
>  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 381b805659d3..ef9971cbb695 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.17.1
>
patchwork-bot+netdevbpf@kernel.org May 19, 2023, 8 a.m. UTC | #2
Hello:

This patch was applied to netdev/net.git (main)
by David S. Miller <davem@davemloft.net>:

On Thu, 18 May 2023 06:48:22 +0100 you wrote:
> From: Alejandro Lucero <alejandro.lucero-palau@amd.com>
> 
> 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.
> 
> [...]

Here is the summary with links:
  - [net] sfc: fix devlink info error handling
    https://git.kernel.org/netdev/net/c/cfcb942863f6

You are awesome, thank you!
diff mbox series

Patch

diff --git a/drivers/net/ethernet/sfc/efx_devlink.c b/drivers/net/ethernet/sfc/efx_devlink.c
index 381b805659d3..ef9971cbb695 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;
 }