@@ -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,
@@ -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;
+ }
- 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,
@@ -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;