]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
sfc: support X4 devlink flash
authorEdward Cree <ecree.xilinx@gmail.com>
Thu, 20 Mar 2025 17:57:12 +0000 (17:57 +0000)
committerJakub Kicinski <kuba@kernel.org>
Tue, 25 Mar 2025 14:55:11 +0000 (07:55 -0700)
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>
drivers/net/ethernet/sfc/ef10.c
drivers/net/ethernet/sfc/efx_reflash.c
drivers/net/ethernet/sfc/net_driver.h

index 47d78abecf30d9448fe9c12986ab1b76cab9d576..47349c148c0c0cd58d2e6f577b27f07deec0a61c 100644 (file)
@@ -4419,6 +4419,7 @@ const struct efx_nic_type efx_x4_nic_type = {
        .can_rx_scatter = true,
        .always_rx_scatter = true,
        .option_descriptors = true,
+       .flash_auto_partition = true,
        .min_interrupt_mode = EFX_INT_MODE_MSIX,
        .timer_period_max = 1 << ERF_DD_EVQ_IND_TIMER_VAL_WIDTH,
        .offload_features = EF10_OFFLOAD_FEATURES,
index ddc53740f09863af1fcc5a8f11c2b41d7cb8467d..b12e95f1c80a5a5110f471eba8a8df36d8a327c1 100644 (file)
@@ -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);
index 6912661b5a3ddb6b63ca30afc1b545dd49b8bff9..5c0f306fb019acb94459660ce1c994e4796da32b 100644 (file)
@@ -1381,6 +1381,8 @@ struct efx_udp_tunnel {
  * @can_rx_scatter: NIC is able to scatter packets to multiple buffers
  * @always_rx_scatter: NIC will always scatter packets to multiple buffers
  * @option_descriptors: NIC supports TX option descriptors
+ * @flash_auto_partition: firmware flash uses AUTO partition, driver does
+ *     not need to perform image parsing
  * @min_interrupt_mode: Lowest capability interrupt mode supported
  *     from &enum efx_int_mode.
  * @timer_period_max: Maximum period of interrupt timer (in ticks)
@@ -1557,6 +1559,7 @@ struct efx_nic_type {
        bool can_rx_scatter;
        bool always_rx_scatter;
        bool option_descriptors;
+       bool flash_auto_partition;
        unsigned int min_interrupt_mode;
        unsigned int timer_period_max;
        netdev_features_t offload_features;