devlink_flash_update_begin_notify(dl);
        devlink_flash_update_status_notify(dl, "Preparing to flash", NULL, 0, 0);
-       rc = bnxt_flash_package_from_file(bp->dev, params->file_name, 0);
+       rc = bnxt_flash_package_from_fw_obj(bp->dev, params->fw, 0);
        if (!rc)
                devlink_flash_update_status_notify(dl, "Flashing done", NULL, 0, 0);
        else
 
        return rc;
 }
 
-int bnxt_flash_package_from_file(struct net_device *dev, const char *filename,
-                                u32 install_type)
+int bnxt_flash_package_from_fw_obj(struct net_device *dev, const struct firmware *fw,
+                                  u32 install_type)
 {
        struct bnxt *bp = netdev_priv(dev);
        struct hwrm_nvm_install_update_output *resp = bp->hwrm_cmd_resp_addr;
        struct hwrm_nvm_install_update_input install = {0};
-       const struct firmware *fw;
        u32 item_len;
        int rc = 0;
        u16 index;
                return rc;
        }
 
-       rc = request_firmware(&fw, filename, &dev->dev);
-       if (rc != 0) {
-               netdev_err(dev, "PKG error %d requesting file: %s\n",
-                          rc, filename);
-               return rc;
-       }
-
        if (fw->size > item_len) {
                netdev_err(dev, "PKG insufficient update area in nvram: %lu\n",
                           (unsigned long)fw->size);
                                          dma_handle);
                }
        }
-       release_firmware(fw);
        if (rc)
                goto err_exit;
 
        return rc;
 }
 
+static int bnxt_flash_package_from_file(struct net_device *dev, const char *filename,
+                                       u32 install_type)
+{
+       const struct firmware *fw;
+       int rc;
+
+       rc = request_firmware(&fw, filename, &dev->dev);
+       if (rc != 0) {
+               netdev_err(dev, "PKG error %d requesting file: %s\n",
+                          rc, filename);
+               return rc;
+       }
+
+       rc = bnxt_flash_package_from_fw_obj(dev, fw, install_type);
+
+       release_firmware(fw);
+
+       return rc;
+}
+
 static int bnxt_flash_device(struct net_device *dev,
                             struct ethtool_flash *flash)
 {
 
 u16 bnxt_get_fw_auto_link_speeds(u32);
 int bnxt_hwrm_nvm_get_dev_info(struct bnxt *bp,
                               struct hwrm_nvm_get_dev_info_output *nvm_dev_info);
-int bnxt_flash_package_from_file(struct net_device *dev, const char *filename,
-                                u32 install_type);
+int bnxt_flash_package_from_fw_obj(struct net_device *dev, const struct firmware *fw,
+                                  u32 install_type);
 void bnxt_ethtool_init(struct bnxt *bp);
 void bnxt_ethtool_free(struct bnxt *bp);
 
 
                                      struct netlink_ext_ack *extack)
 {
        struct hinic_devlink_priv *priv = devlink_priv(devlink);
-       const struct firmware *fw;
-       int err;
-
-       err = request_firmware_direct(&fw, params->file_name,
-                                     &priv->hwdev->hwif->pdev->dev);
-       if (err)
-               return err;
-
-       err = hinic_firmware_update(priv, fw, extack);
-       release_firmware(fw);
 
-       return err;
+       return hinic_firmware_update(priv, params->fw, extack);
 }
 
 static const struct devlink_ops hinic_devlink_ops = {
 
                         struct netlink_ext_ack *extack)
 {
        struct ice_pf *pf = devlink_priv(devlink);
-       struct device *dev = &pf->pdev->dev;
        struct ice_hw *hw = &pf->hw;
-       const struct firmware *fw;
        u8 preservation;
        int err;
 
        if (err)
                return err;
 
-       err = request_firmware(&fw, params->file_name, dev);
-       if (err) {
-               NL_SET_ERR_MSG_MOD(extack, "Unable to read file from disk");
-               return err;
-       }
-
-       dev_dbg(dev, "Beginning flash update with file '%s'\n", params->file_name);
-
        devlink_flash_update_begin_notify(devlink);
        devlink_flash_update_status_notify(devlink, "Preparing to flash", NULL, 0, 0);
-       err = ice_flash_pldm_image(pf, fw, preservation, extack);
+       err = ice_flash_pldm_image(pf, params->fw, preservation, extack);
        devlink_flash_update_end_notify(devlink);
 
-       release_firmware(fw);
-
        return err;
 }
 
 
                                     struct netlink_ext_ack *extack)
 {
        struct mlx5_core_dev *dev = devlink_priv(devlink);
-       const struct firmware *fw;
-       int err;
-
-       err = request_firmware_direct(&fw, params->file_name, &dev->pdev->dev);
-       if (err)
-               return err;
-
-       err = mlx5_firmware_flash(dev, fw, extack);
-       release_firmware(fw);
 
-       return err;
+       return mlx5_firmware_flash(dev, params->fw, extack);
 }
 
 static u8 mlx5_fw_ver_major(u32 version)
 
                                      struct devlink_flash_update_params *params,
                                      struct netlink_ext_ack *extack)
 {
-       const struct firmware *firmware;
-       int err;
-
-       err = request_firmware_direct(&firmware, params->file_name, mlxsw_core->bus_info->dev);
-       if (err)
-               return err;
-       err = mlxsw_core_fw_flash(mlxsw_core, firmware, extack);
-       release_firmware(firmware);
-
-       return err;
+       return mlxsw_core_fw_flash(mlxsw_core, params->fw, extack);
 }
 
 static int mlxsw_core_devlink_param_fw_load_policy_validate(struct devlink *devlink, u32 id,
 
                         struct devlink_flash_update_params *params,
                         struct netlink_ext_ack *extack)
 {
-       return nfp_flash_update_common(devlink_priv(devlink), params->file_name, extack);
+       return nfp_flash_update_common(devlink_priv(devlink), params->fw, extack);
 }
 
 const struct devlink_ops nfp_devlink_ops = {
 
                return nfp_pcie_sriov_enable(pdev, num_vfs);
 }
 
-int nfp_flash_update_common(struct nfp_pf *pf, const char *path,
+int nfp_flash_update_common(struct nfp_pf *pf, const struct firmware *fw,
                            struct netlink_ext_ack *extack)
 {
        struct device *dev = &pf->pdev->dev;
-       const struct firmware *fw;
        struct nfp_nsp *nsp;
        int err;
 
                return err;
        }
 
-       err = request_firmware_direct(&fw, path, dev);
-       if (err) {
-               NL_SET_ERR_MSG_MOD(extack,
-                                  "unable to read flash file from disk");
-               goto exit_close_nsp;
-       }
-
-       dev_info(dev, "Please be patient while writing flash image: %s\n",
-                path);
-
        err = nfp_nsp_write_flash(nsp, fw);
        if (err < 0)
-               goto exit_release_fw;
+               goto exit_close_nsp;
        dev_info(dev, "Finished writing flash image\n");
        err = 0;
 
-exit_release_fw:
-       release_firmware(fw);
 exit_close_nsp:
        nfp_nsp_close(nsp);
        return err;
 
                 unsigned int min_size, struct nfp_cpp_area **area);
 int nfp_mbox_cmd(struct nfp_pf *pf, u32 cmd, void *in_data, u64 in_length,
                 void *out_data, u64 out_length);
-int nfp_flash_update_common(struct nfp_pf *pf, const char *path,
+int nfp_flash_update_common(struct nfp_pf *pf, const struct firmware *fw,
                            struct netlink_ext_ack *extack);
 
 enum nfp_dump_diag {
 
 {
        struct ionic *ionic = devlink_priv(dl);
 
-       return ionic_firmware_update(ionic->lif, params->file_name, extack);
+       return ionic_firmware_update(ionic->lif, params->fw, extack);
 }
 
 static int ionic_dl_info_get(struct devlink *dl, struct devlink_info_req *req,
 
 
 #include <net/devlink.h>
 
-int ionic_firmware_update(struct ionic_lif *lif, const char *fw_name,
+int ionic_firmware_update(struct ionic_lif *lif, const struct firmware *fw,
                          struct netlink_ext_ack *extack);
 
 struct ionic *ionic_devlink_alloc(struct device *dev);
 
        return err;
 }
 
-int ionic_firmware_update(struct ionic_lif *lif, const char *fw_name,
+int ionic_firmware_update(struct ionic_lif *lif, const struct firmware *fw,
                          struct netlink_ext_ack *extack)
 {
        struct ionic_dev *idev = &lif->ionic->idev;
        struct ionic *ionic = lif->ionic;
        union ionic_dev_cmd_comp comp;
        u32 buf_sz, copy_sz, offset;
-       const struct firmware *fw;
        struct devlink *dl;
        int next_interval;
        int err = 0;
        u8 fw_slot;
 
-       netdev_info(netdev, "Installing firmware %s\n", fw_name);
+       netdev_info(netdev, "Installing firmware\n");
 
        dl = priv_to_devlink(ionic);
        devlink_flash_update_begin_notify(dl);
        devlink_flash_update_status_notify(dl, "Preparing to flash", NULL, 0, 0);
 
-       err = request_firmware(&fw, fw_name, ionic->dev);
-       if (err) {
-               NL_SET_ERR_MSG_MOD(extack, "Unable to find firmware file");
-               goto err_out;
-       }
-
        buf_sz = sizeof(idev->dev_cmd_regs->data);
 
        netdev_dbg(netdev,
                devlink_flash_update_status_notify(dl, "Flash failed", NULL, 0, 0);
        else
                devlink_flash_update_status_notify(dl, "Flash done", NULL, 0, 0);
-       release_firmware(fw);
        devlink_flash_update_end_notify(dl);
        return err;
 }
 
 #include <net/flow_offload.h>
 #include <uapi/linux/devlink.h>
 #include <linux/xarray.h>
+#include <linux/firmware.h>
 
 #define DEVLINK_RELOAD_STATS_ARRAY_SIZE \
        (__DEVLINK_RELOAD_LIMIT_MAX * __DEVLINK_RELOAD_ACTION_MAX)
 
 /**
  * struct devlink_flash_update_params - Flash Update parameters
- * @file_name: the name of the flash firmware file to update from
+ * @fw: pointer to the firmware data to update from
  * @component: the flash component to update
  *
- * With the exception of file_name, drivers must opt-in to parameters by
+ * With the exception of fw, drivers must opt-in to parameters by
  * setting the appropriate bit in the supported_flash_update_params field in
  * their devlink_ops structure.
  */
 struct devlink_flash_update_params {
-       const char *file_name;
+       const struct firmware *fw;
        const char *component;
        u32 overwrite_mask;
 };
 
 static int devlink_nl_cmd_flash_update(struct sk_buff *skb,
                                       struct genl_info *info)
 {
-       struct nlattr *nla_component, *nla_overwrite_mask;
+       struct nlattr *nla_component, *nla_overwrite_mask, *nla_file_name;
        struct devlink_flash_update_params params = {};
        struct devlink *devlink = info->user_ptr[0];
+       const char *file_name;
        u32 supported_params;
+       int ret;
 
        if (!devlink->ops->flash_update)
                return -EOPNOTSUPP;
 
        supported_params = devlink->ops->supported_flash_update_params;
 
-       params.file_name = nla_data(info->attrs[DEVLINK_ATTR_FLASH_UPDATE_FILE_NAME]);
-
        nla_component = info->attrs[DEVLINK_ATTR_FLASH_UPDATE_COMPONENT];
        if (nla_component) {
                if (!(supported_params & DEVLINK_SUPPORT_FLASH_UPDATE_COMPONENT)) {
                params.overwrite_mask = sections.value & sections.selector;
        }
 
-       return devlink->ops->flash_update(devlink, ¶ms, info->extack);
+       nla_file_name = info->attrs[DEVLINK_ATTR_FLASH_UPDATE_FILE_NAME];
+       file_name = nla_data(nla_file_name);
+       ret = request_firmware(¶ms.fw, file_name, devlink->dev);
+       if (ret) {
+               NL_SET_ERR_MSG_ATTR(info->extack, nla_file_name, "failed to locate the requested firmware file");
+               return ret;
+       }
+
+       ret = devlink->ops->flash_update(devlink, ¶ms, info->extack);
+
+       release_firmware(params.fw);
+
+       return ret;
 }
 
 static const struct devlink_param devlink_param_generic[] = {
                goto out;
        }
 
-       params.file_name = file_name;
+       ret = request_firmware(¶ms.fw, file_name, devlink->dev);
+       if (ret)
+               goto out;
 
        mutex_lock(&devlink->lock);
        ret = devlink->ops->flash_update(devlink, ¶ms, NULL);
        mutex_unlock(&devlink->lock);
 
+       release_firmware(params.fw);
+
 out:
        rtnl_lock();
        dev_put(dev);