summaryrefslogtreecommitdiff
path: root/drivers/net/ethernet/sfc/efx_reflash.c
diff options
context:
space:
mode:
authorEdward Cree <ecree.xilinx@gmail.com>2025-03-20 20:57:12 +0300
committerJakub Kicinski <kuba@kernel.org>2025-03-25 17:55:11 +0300
commit5726a15499daf619eb3e67d615a0252ca69b84b9 (patch)
treed9b4eb29d35bbd3a7c83dd73fa844defaf5208ce /drivers/net/ethernet/sfc/efx_reflash.c
parent25d0c8e6f0bbd4042b0b8612bc8d6cc554d80563 (diff)
downloadlinux-5726a15499daf619eb3e67d615a0252ca69b84b9.tar.xz
sfc: support X4 devlink flash
Unlike X2 and EF100, we do not attempt to parse the firmware file to find an image within it; we simply hand the entire file to the MC, which is responsible for understanding any container formats we might use and validating that the firmware file is applicable to this NIC. Signed-off-by: Edward Cree <ecree.xilinx@gmail.com> Link: https://patch.msgid.link/9a72a74002a7819c780b0a18ce9294c9d4e1db12.1742493017.git.ecree.xilinx@gmail.com Signed-off-by: Jakub Kicinski <kuba@kernel.org>
Diffstat (limited to 'drivers/net/ethernet/sfc/efx_reflash.c')
-rw-r--r--drivers/net/ethernet/sfc/efx_reflash.c52
1 files changed, 30 insertions, 22 deletions
diff --git a/drivers/net/ethernet/sfc/efx_reflash.c b/drivers/net/ethernet/sfc/efx_reflash.c
index ddc53740f098..b12e95f1c80a 100644
--- a/drivers/net/ethernet/sfc/efx_reflash.c
+++ b/drivers/net/ethernet/sfc/efx_reflash.c
@@ -407,31 +407,40 @@ int efx_reflash_flash_firmware(struct efx_nic *efx, const struct firmware *fw,
return -EOPNOTSUPP;
}
- devlink_flash_update_status_notify(devlink, "Checking update", NULL, 0, 0);
+ mutex_lock(&efx->reflash_mutex);
- rc = efx_reflash_parse_firmware_data(fw, &type, &data_subtype, &data,
- &data_size);
- if (rc) {
- NL_SET_ERR_MSG_MOD(extack,
- "Firmware image validation check failed");
- goto out;
- }
+ devlink_flash_update_status_notify(devlink, "Checking update", NULL, 0, 0);
- mutex_lock(&efx->reflash_mutex);
+ if (efx->type->flash_auto_partition) {
+ /* NIC wants entire FW file including headers;
+ * FW will validate 'subtype' if there is one
+ */
+ type = NVRAM_PARTITION_TYPE_AUTO;
+ data = fw->data;
+ data_size = fw->size;
+ } else {
+ rc = efx_reflash_parse_firmware_data(fw, &type, &data_subtype, &data,
+ &data_size);
+ if (rc) {
+ NL_SET_ERR_MSG_MOD(extack,
+ "Firmware image validation check failed");
+ goto out_unlock;
+ }
- rc = efx_mcdi_nvram_metadata(efx, type, &subtype, NULL, NULL, 0);
- if (rc) {
- NL_SET_ERR_MSG_FMT_MOD(extack,
- "Metadata query for NVRAM partition %#x failed",
- type);
- goto out_unlock;
- }
+ rc = efx_mcdi_nvram_metadata(efx, type, &subtype, NULL, NULL, 0);
+ if (rc) {
+ NL_SET_ERR_MSG_FMT_MOD(extack,
+ "Metadata query for NVRAM partition %#x failed",
+ type);
+ goto out_unlock;
+ }
- if (subtype != data_subtype) {
- NL_SET_ERR_MSG_MOD(extack,
- "Firmware image is not appropriate for this adapter");
- rc = -EINVAL;
- goto out_unlock;
+ if (subtype != data_subtype) {
+ NL_SET_ERR_MSG_MOD(extack,
+ "Firmware image is not appropriate for this adapter");
+ rc = -EINVAL;
+ goto out_unlock;
+ }
}
rc = efx_mcdi_nvram_info(efx, type, &size, &erase_align, &write_align,
@@ -506,7 +515,6 @@ out_update_finish:
rc = efx_mcdi_nvram_update_finish_polled(efx, type);
out_unlock:
mutex_unlock(&efx->reflash_mutex);
-out:
devlink_flash_update_status_notify(devlink, rc ? "Update failed" :
"Update complete",
NULL, 0, 0);