From: Jacob Keller <jacob.e.keller@intel.com>
To: intel-wired-lan@osuosl.org
Subject: [Intel-wired-lan] [net-next 3/4] ice: refactor ice_flash_pldm_image and combine with ice_devlink_flash_update
Date: Wed, 8 Sep 2021 16:49:23 -0700 [thread overview]
Message-ID: <20210908234924.3416592-4-jacob.e.keller@intel.com> (raw)
In-Reply-To: <20210908234924.3416592-1-jacob.e.keller@intel.com>
The ice_devlink_flash_update function performs a few upfront checks and
then calls ice_flash_pldm_image.
Most of these checks actually make more sense within the context of
ice_flash_pldm_image. Refactor this function to fit the argument format
of the .flash_update devlink handler, and merge the checks from
ice_devlink_flash_update.
Note that the check for overwrite mask was converted to a switch because
it made the check easier to read by avoiding the massively long line or
weird line breaks that were hard for my eyes to follow.
When moving the ice_cancel_pending_update function, notice that it also
takes the NVM semaphore. The main flash update process also requires the
NVM hardware semaphore. We can eliminate the call to get the semaphore
from ice_cancel_pending_update by placing the check after we acquire the
semaphore during ice_flash_pldm_image.
With this change, the ice_flash_pldm_image becomes the main entry point
for the devlink flash update, eliminating some unnecessary boiler plate
code. This also eases supporting a dry run with the PLDM library in
a future change.
Signed-off-by: Jacob Keller <jacob.e.keller@intel.com>
---
drivers/net/ethernet/intel/ice/ice_devlink.c | 52 +-------------
.../net/ethernet/intel/ice/ice_fw_update.c | 70 +++++++++++--------
.../net/ethernet/intel/ice/ice_fw_update.h | 7 +-
3 files changed, 45 insertions(+), 84 deletions(-)
diff --git a/drivers/net/ethernet/intel/ice/ice_devlink.c b/drivers/net/ethernet/intel/ice/ice_devlink.c
index dbf54fb5c9ee..40d1d113c1ad 100644
--- a/drivers/net/ethernet/intel/ice/ice_devlink.c
+++ b/drivers/net/ethernet/intel/ice/ice_devlink.c
@@ -372,62 +372,12 @@ static int ice_devlink_info_get(struct devlink *devlink,
return err;
}
-/**
- * ice_devlink_flash_update - Update firmware stored in flash on the device
- * @devlink: pointer to devlink associated with device to update
- * @params: flash update parameters
- * @extack: netlink extended ACK structure
- *
- * Perform a device flash update. The bulk of the update logic is contained
- * within the ice_flash_pldm_image function.
- *
- * Returns: zero on success, or an error code on failure.
- */
-static int
-ice_devlink_flash_update(struct devlink *devlink,
- struct devlink_flash_update_params *params,
- struct netlink_ext_ack *extack)
-{
- struct ice_pf *pf = devlink_priv(devlink);
- struct ice_hw *hw = &pf->hw;
- u8 preservation;
- int err;
-
- if (!params->overwrite_mask) {
- /* preserve all settings and identifiers */
- preservation = ICE_AQC_NVM_PRESERVE_ALL;
- } else if (params->overwrite_mask == DEVLINK_FLASH_OVERWRITE_SETTINGS) {
- /* overwrite settings, but preserve the vital device identifiers */
- preservation = ICE_AQC_NVM_PRESERVE_SELECTED;
- } else if (params->overwrite_mask == (DEVLINK_FLASH_OVERWRITE_SETTINGS |
- DEVLINK_FLASH_OVERWRITE_IDENTIFIERS)) {
- /* overwrite both settings and identifiers, preserve nothing */
- preservation = ICE_AQC_NVM_NO_PRESERVATION;
- } else {
- NL_SET_ERR_MSG_MOD(extack, "Requested overwrite mask is not supported");
- return -EOPNOTSUPP;
- }
-
- if (!hw->dev_caps.common_cap.nvm_unified_update) {
- NL_SET_ERR_MSG_MOD(extack, "Current firmware does not support unified update");
- return -EOPNOTSUPP;
- }
-
- err = ice_cancel_pending_update(pf, NULL, extack);
- if (err)
- return err;
-
- devlink_flash_update_status_notify(devlink, "Preparing to flash", NULL, 0, 0);
-
- return ice_flash_pldm_image(pf, params->fw, preservation, extack);
-}
-
static const struct devlink_ops ice_devlink_ops = {
.supported_flash_update_params = DEVLINK_SUPPORT_FLASH_UPDATE_OVERWRITE_MASK,
.eswitch_mode_get = ice_eswitch_mode_get,
.eswitch_mode_set = ice_eswitch_mode_set,
.info_get = ice_devlink_info_get,
- .flash_update = ice_devlink_flash_update,
+ .flash_update = ice_flash_pldm_image,
};
static void ice_devlink_free(void *devlink_ptr)
diff --git a/drivers/net/ethernet/intel/ice/ice_fw_update.c b/drivers/net/ethernet/intel/ice/ice_fw_update.c
index ae1360d8554e..18fdf90d21d6 100644
--- a/drivers/net/ethernet/intel/ice/ice_fw_update.c
+++ b/drivers/net/ethernet/intel/ice/ice_fw_update.c
@@ -658,8 +658,9 @@ static const struct pldmfw_ops ice_fwu_ops = {
*
* Returns: zero on success, or a negative error code on failure.
*/
-int ice_cancel_pending_update(struct ice_pf *pf, const char *component,
- struct netlink_ext_ack *extack)
+static int
+ice_cancel_pending_update(struct ice_pf *pf, const char *component,
+ struct netlink_ext_ack *extack)
{
struct devlink *devlink = priv_to_devlink(pf);
struct device *dev = ice_pf_to_dev(pf);
@@ -727,28 +728,14 @@ int ice_cancel_pending_update(struct ice_pf *pf, const char *component,
"Canceling previous pending update",
component, 0, 0);
- status = ice_acquire_nvm(hw, ICE_RES_WRITE);
- if (status) {
- dev_err(dev, "Failed to acquire device flash lock, err %s aq_err %s\n",
- ice_stat_str(status),
- ice_aq_str(hw->adminq.sq_last_status));
- NL_SET_ERR_MSG_MOD(extack, "Failed to acquire device flash lock");
- return -EIO;
- }
-
pending |= ICE_AQC_NVM_REVERT_LAST_ACTIV;
- err = ice_switch_flash_banks(pf, pending, extack);
-
- ice_release_nvm(hw);
-
- return err;
+ return ice_switch_flash_banks(pf, pending, extack);
}
/**
* ice_flash_pldm_image - Write a PLDM-formatted firmware image to the device
- * @pf: private device driver structure
- * @fw: firmware object pointing to the relevant firmware file
- * @preservation: preservation level to request from firmware
+ * @devlink: pointer to devlink associated with the device to update
+ * @params: devlink flash update parameters
* @extack: netlink extended ACK structure
*
* Parse the data for a given firmware file, verifying that it is a valid PLDM
@@ -761,24 +748,42 @@ int ice_cancel_pending_update(struct ice_pf *pf, const char *component,
*
* Returns: zero on success or a negative error code on failure.
*/
-int ice_flash_pldm_image(struct ice_pf *pf, const struct firmware *fw,
- u8 preservation, struct netlink_ext_ack *extack)
+int ice_flash_pldm_image(struct devlink *devlink,
+ struct devlink_flash_update_params *params,
+ struct netlink_ext_ack *extack)
{
+ struct ice_pf *pf = devlink_priv(devlink);
struct device *dev = ice_pf_to_dev(pf);
struct ice_hw *hw = &pf->hw;
struct ice_fwu_priv priv;
enum ice_status status;
+ u8 preservation;
int err;
- switch (preservation) {
- case ICE_AQC_NVM_PRESERVE_ALL:
- case ICE_AQC_NVM_PRESERVE_SELECTED:
- case ICE_AQC_NVM_NO_PRESERVATION:
- case ICE_AQC_NVM_FACTORY_DEFAULT:
+ switch (params->overwrite_mask) {
+ case 0:
+ /* preserve all settings and identifiers */
+ preservation = ICE_AQC_NVM_PRESERVE_ALL;
+ break;
+ case DEVLINK_FLASH_OVERWRITE_SETTINGS:
+ /* overwrite settings, but preserve vital information such as
+ * device identifiers.
+ */
+ preservation = ICE_AQC_NVM_PRESERVE_SELECTED;
+ break;
+ case (DEVLINK_FLASH_OVERWRITE_SETTINGS |
+ DEVLINK_FLASH_OVERWRITE_IDENTIFIERS):
+ /* overwrite both settings and identifiers, preserve nothing */
+ preservation = ICE_AQC_NVM_NO_PRESERVATION;
break;
default:
- WARN(1, "Unexpected preservation level request %u", preservation);
- return -EINVAL;
+ NL_SET_ERR_MSG_MOD(extack, "Requested overwrite mask is not supported");
+ return -EOPNOTSUPP;
+ }
+
+ if (!hw->dev_caps.common_cap.nvm_unified_update) {
+ NL_SET_ERR_MSG_MOD(extack, "Current firmware does not support unified update");
+ return -EOPNOTSUPP;
}
memset(&priv, 0, sizeof(priv));
@@ -789,6 +794,8 @@ int ice_flash_pldm_image(struct ice_pf *pf, const struct firmware *fw,
priv.pf = pf;
priv.activate_flags = preservation;
+ devlink_flash_update_status_notify(devlink, "Preparing to flash", NULL, 0, 0);
+
status = ice_acquire_nvm(hw, ICE_RES_WRITE);
if (status) {
dev_err(dev, "Failed to acquire device flash lock, err %s aq_err %s\n",
@@ -798,7 +805,11 @@ int ice_flash_pldm_image(struct ice_pf *pf, const struct firmware *fw,
return -EIO;
}
- err = pldmfw_flash_image(&priv.context, fw);
+ err = ice_cancel_pending_update(pf, NULL, extack);
+ if (err)
+ goto out_release_nvm;
+
+ err = pldmfw_flash_image(&priv.context, params->fw);
if (err == -ENOENT) {
dev_err(dev, "Firmware image has no record matching this device\n");
NL_SET_ERR_MSG_MOD(extack, "Firmware image has no record matching this device");
@@ -810,6 +821,7 @@ int ice_flash_pldm_image(struct ice_pf *pf, const struct firmware *fw,
dev_err(dev, "Failed to flash PLDM image, err %d", err);
}
+out_release_nvm:
ice_release_nvm(hw);
return err;
diff --git a/drivers/net/ethernet/intel/ice/ice_fw_update.h b/drivers/net/ethernet/intel/ice/ice_fw_update.h
index 1f84ef18bfd1..d12e81a00f11 100644
--- a/drivers/net/ethernet/intel/ice/ice_fw_update.h
+++ b/drivers/net/ethernet/intel/ice/ice_fw_update.h
@@ -4,9 +4,8 @@
#ifndef _ICE_FW_UPDATE_H_
#define _ICE_FW_UPDATE_H_
-int ice_flash_pldm_image(struct ice_pf *pf, const struct firmware *fw,
- u8 preservation, struct netlink_ext_ack *extack);
-int ice_cancel_pending_update(struct ice_pf *pf, const char *component,
- struct netlink_ext_ack *extack);
+int ice_flash_pldm_image(struct devlink *devlink,
+ struct devlink_flash_update_params *params,
+ struct netlink_ext_ack *extack);
#endif
--
2.31.1.331.gb0c09ab8796f
next prev parent reply other threads:[~2021-09-08 23:49 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-09-08 23:49 [Intel-wired-lan] [net-next 0/4] ice: miscellaneous firmware features Jacob Keller
2021-09-08 23:49 ` [Intel-wired-lan] [net-next 1/4] ice: devlink: add shadow-ram region to snapshot Shadow RAM Jacob Keller
2021-09-30 17:45 ` G, GurucharanX
2021-09-08 23:49 ` [Intel-wired-lan] [net-next 2/4] ice: move and rename ice_check_for_pending_update Jacob Keller
2021-09-27 17:40 ` G, GurucharanX
2021-09-08 23:49 ` Jacob Keller [this message]
2021-09-27 17:39 ` [Intel-wired-lan] [net-next 3/4] ice: refactor ice_flash_pldm_image and combine with ice_devlink_flash_update G, GurucharanX
2021-09-08 23:49 ` [Intel-wired-lan] [net-next 4/4] ice: support immediate firmware activation via devlink reload Jacob Keller
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20210908234924.3416592-4-jacob.e.keller@intel.com \
--to=jacob.e.keller@intel.com \
--cc=intel-wired-lan@osuosl.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox