summaryrefslogtreecommitdiff
path: root/drivers/net/ethernet/intel/ixgbe/ixgbe_fw_update.c
diff options
context:
space:
mode:
authorJedrzej Jagielski <jedrzej.jagielski@intel.com>2025-04-10 16:00:05 +0300
committerTony Nguyen <anthony.l.nguyen@intel.com>2025-04-15 17:36:33 +0300
commitc9e563cae19e529abcc2cb90b4b793952f209260 (patch)
tree3dcade18ded845dc1e09f647d38c70c695aa4329 /drivers/net/ethernet/intel/ixgbe/ixgbe_fw_update.c
parenta0f45672d5e14af053d2dc5f552381351f6eeac0 (diff)
downloadlinux-c9e563cae19e529abcc2cb90b4b793952f209260.tar.xz
ixgbe: add support for devlink reload
The E610 adapters contain an embedded chip with firmware which can be updated using devlink flash. The firmware which runs on this chip is referred to as the Embedded Management Processor firmware (EMP firmware). Activating the new firmware image currently requires that the system be rebooted. This is not ideal as rebooting the system can cause unwanted downtime. The EMP firmware itself can be reloaded by issuing a special update to the device called an Embedded Management Processor reset (EMP reset). This reset causes the device to reset and reload the EMP firmware. Implement support for devlink reload with the "fw_activate" flag. This allows user space to request the firmware be activated immediately. Reviewed-by: Mateusz Polchlopek <mateusz.polchlopek@intel.com> Tested-by: Bharath R <bharath.r@intel.com> Co-developed-by: Slawomir Mrozowicz <slawomirx.mrozowicz@intel.com> Signed-off-by: Slawomir Mrozowicz <slawomirx.mrozowicz@intel.com> Co-developed-by: Piotr Kwapulinski <piotr.kwapulinski@intel.com> Signed-off-by: Piotr Kwapulinski <piotr.kwapulinski@intel.com> Co-developed-by: Stefan Wegrzyn <stefan.wegrzyn@intel.com> Signed-off-by: Stefan Wegrzyn <stefan.wegrzyn@intel.com> Signed-off-by: Jedrzej Jagielski <jedrzej.jagielski@intel.com> Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
Diffstat (limited to 'drivers/net/ethernet/intel/ixgbe/ixgbe_fw_update.c')
-rw-r--r--drivers/net/ethernet/intel/ixgbe/ixgbe_fw_update.c37
1 files changed, 32 insertions, 5 deletions
diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_fw_update.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_fw_update.c
index 1ff55dc8a6b7..69e3ec308716 100644
--- a/drivers/net/ethernet/intel/ixgbe/ixgbe_fw_update.c
+++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_fw_update.c
@@ -16,6 +16,7 @@ struct ixgbe_fwu_priv {
/* Track which NVM banks to activate at the end of the update */
u8 activate_flags;
+ bool emp_reset_available;
};
/**
@@ -352,6 +353,7 @@ static int ixgbe_erase_nvm_module(struct ixgbe_adapter *adapter, u16 module,
* ixgbe_switch_flash_banks - Tell firmware to switch NVM banks
* @adapter: Pointer to the PF data structure
* @activate_flags: flags used for the activation command
+ * @emp_reset_available: on return, indicates if EMP reset is available
* @extack: netlink extended ACK structure
*
* Notify firmware to activate the newly written flash banks, and wait for the
@@ -361,6 +363,7 @@ static int ixgbe_erase_nvm_module(struct ixgbe_adapter *adapter, u16 module,
*/
static int ixgbe_switch_flash_banks(struct ixgbe_adapter *adapter,
u8 activate_flags,
+ bool *emp_reset_available,
struct netlink_ext_ack *extack)
{
struct ixgbe_hw *hw = &adapter->hw;
@@ -368,11 +371,21 @@ static int ixgbe_switch_flash_banks(struct ixgbe_adapter *adapter,
int err;
err = ixgbe_nvm_write_activate(hw, activate_flags, &response_flags);
- if (err)
+ if (err) {
NL_SET_ERR_MSG_MOD(extack,
"Failed to switch active flash banks");
+ return err;
+ }
- return err;
+ if (emp_reset_available) {
+ if (hw->dev_caps.common_cap.reset_restrict_support)
+ *emp_reset_available =
+ response_flags & IXGBE_ACI_NVM_EMPR_ENA;
+ else
+ *emp_reset_available = true;
+ }
+
+ return 0;
}
/**
@@ -451,9 +464,23 @@ static int ixgbe_finalize_update(struct pldmfw *context)
context);
struct ixgbe_adapter *adapter = priv->adapter;
struct netlink_ext_ack *extack = priv->extack;
+ struct devlink *devlink = adapter->devlink;
+ int err;
+
+ /* Finally, notify firmware to activate the written NVM banks */
+ err = ixgbe_switch_flash_banks(adapter, priv->activate_flags,
+ &priv->emp_reset_available, extack);
+ if (err)
+ return err;
+
+ adapter->fw_emp_reset_disabled = !priv->emp_reset_available;
- return ixgbe_switch_flash_banks(adapter, priv->activate_flags,
- extack);
+ if (!adapter->fw_emp_reset_disabled)
+ devlink_flash_update_status_notify(devlink,
+ "Suggested is to activate new firmware by devlink reload, if it doesn't work then a power cycle is required",
+ NULL, 0, 0);
+
+ return 0;
}
static const struct pldmfw_ops ixgbe_fwu_ops_e610 = {
@@ -567,7 +594,7 @@ static int ixgbe_cancel_pending_update(struct ixgbe_adapter *adapter,
}
pending |= IXGBE_ACI_NVM_REVERT_LAST_ACTIV;
- err = ixgbe_switch_flash_banks(adapter, pending, extack);
+ err = ixgbe_switch_flash_banks(adapter, pending, NULL, extack);
ixgbe_release_nvm(hw);