Commit c356eaa8 authored by Jacob Keller's avatar Jacob Keller Committed by Tony Nguyen
Browse files

ice: move and rename ice_check_for_pending_update



The ice_devlink_flash_update function performs a few checks and then
calls ice_flash_pldm_image. One of these checks is to call
ice_check_for_pending_update. This function checks if the device has
a pending update, and cancels it if so. This is necessary to allow
a new flash update to proceed.

We want to refactor the ice code to eliminate ice_devlink_flash_update,
moving its checks into ice_flash_pldm_image.

To do this, ice_check_for_pending_update will become static, and only
called by ice_flash_pldm_image. To make this change easier to review,
first just move the function up within the ice_fw_update.c file.

While at it, note that the function has a misleading name. Its primary
action is to cancel a pending update. Using the verb "check" does not
imply this. Rename it to ice_cancel_pending_update.

Signed-off-by: default avatarJacob Keller <jacob.e.keller@intel.com>
Tested-by: default avatarGurucharan G <gurucharanx.g@intel.com>
Signed-off-by: default avatarTony Nguyen <anthony.l.nguyen@intel.com>
parent 78ad87da
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -411,7 +411,7 @@ ice_devlink_flash_update(struct devlink *devlink,
		return -EOPNOTSUPP;
	}

	err = ice_check_for_pending_update(pf, NULL, extack);
	err = ice_cancel_pending_update(pf, NULL, extack);
	if (err)
		return err;

+74 −74
Original line number Diff line number Diff line
@@ -642,86 +642,17 @@ static const struct pldmfw_ops ice_fwu_ops = {
};

/**
 * 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
 * @extack: netlink extended ACK structure
 *
 * Parse the data for a given firmware file, verifying that it is a valid PLDM
 * formatted image that matches this device.
 *
 * Extract the device record Package Data and Component Tables and send them
 * to the firmware. Extract and write the flash data for each of the three
 * main flash components, "fw.mgmt", "fw.undi", and "fw.netlist". Notify
 * firmware once the data is written to the inactive banks.
 *
 * 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)
{
	struct device *dev = ice_pf_to_dev(pf);
	struct ice_hw *hw = &pf->hw;
	struct ice_fwu_priv priv;
	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:
		break;
	default:
		WARN(1, "Unexpected preservation level request %u", preservation);
		return -EINVAL;
	}

	memset(&priv, 0, sizeof(priv));

	priv.context.ops = &ice_fwu_ops;
	priv.context.dev = dev;
	priv.extack = extack;
	priv.pf = pf;
	priv.activate_flags = preservation;

	err = ice_acquire_nvm(hw, ICE_RES_WRITE);
	if (err) {
		dev_err(dev, "Failed to acquire device flash lock, err %d aq_err %s\n",
			err, ice_aq_str(hw->adminq.sq_last_status));
		NL_SET_ERR_MSG_MOD(extack, "Failed to acquire device flash lock");
		return err;
	}

	err = pldmfw_flash_image(&priv.context, 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");
	} else if (err) {
		/* Do not set a generic extended ACK message here. A more
		 * specific message may already have been set by one of our
		 * ops.
		 */
		dev_err(dev, "Failed to flash PLDM image, err %d", err);
	}

	ice_release_nvm(hw);

	return err;
}

/**
 * ice_check_for_pending_update - Check for a pending flash update
 * ice_cancel_pending_update - Cancel any pending update for a component
 * @pf: the PF driver structure
 * @component: if not NULL, the name of the component being updated
 * @extack: Netlink extended ACK structure
 *
 * Check whether the device already has a pending flash update. If such an
 * update is found, cancel it so that the requested update may proceed.
 * Cancel any pending update for the specified component. If component is
 * NULL, all device updates will be canceled.
 *
 * Returns: zero on success, or a negative error code on failure.
 */
int ice_check_for_pending_update(struct ice_pf *pf, const char *component,
int ice_cancel_pending_update(struct ice_pf *pf, const char *component,
			      struct netlink_ext_ack *extack)
{
	struct devlink *devlink = priv_to_devlink(pf);
@@ -804,3 +735,72 @@ int ice_check_for_pending_update(struct ice_pf *pf, const char *component,

	return err;
}

/**
 * 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
 * @extack: netlink extended ACK structure
 *
 * Parse the data for a given firmware file, verifying that it is a valid PLDM
 * formatted image that matches this device.
 *
 * Extract the device record Package Data and Component Tables and send them
 * to the firmware. Extract and write the flash data for each of the three
 * main flash components, "fw.mgmt", "fw.undi", and "fw.netlist". Notify
 * firmware once the data is written to the inactive banks.
 *
 * 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)
{
	struct device *dev = ice_pf_to_dev(pf);
	struct ice_hw *hw = &pf->hw;
	struct ice_fwu_priv priv;
	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:
		break;
	default:
		WARN(1, "Unexpected preservation level request %u", preservation);
		return -EINVAL;
	}

	memset(&priv, 0, sizeof(priv));

	priv.context.ops = &ice_fwu_ops;
	priv.context.dev = dev;
	priv.extack = extack;
	priv.pf = pf;
	priv.activate_flags = preservation;

	err = ice_acquire_nvm(hw, ICE_RES_WRITE);
	if (err) {
		dev_err(dev, "Failed to acquire device flash lock, err %d aq_err %s\n",
			err, ice_aq_str(hw->adminq.sq_last_status));
		NL_SET_ERR_MSG_MOD(extack, "Failed to acquire device flash lock");
		return err;
	}

	err = pldmfw_flash_image(&priv.context, 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");
	} else if (err) {
		/* Do not set a generic extended ACK message here. A more
		 * specific message may already have been set by one of our
		 * ops.
		 */
		dev_err(dev, "Failed to flash PLDM image, err %d", err);
	}

	ice_release_nvm(hw);

	return err;
}
+2 −2
Original line number Diff line number Diff line
@@ -6,7 +6,7 @@

int ice_flash_pldm_image(struct ice_pf *pf, const struct firmware *fw,
			 u8 preservation, struct netlink_ext_ack *extack);
int ice_check_for_pending_update(struct ice_pf *pf, const char *component,
int ice_cancel_pending_update(struct ice_pf *pf, const char *component,
			      struct netlink_ext_ack *extack);

#endif