return ret;
 }
 
+static int
+bnad_flash_device(struct net_device *netdev, struct ethtool_flash *eflash)
+{
+       struct bnad *bnad = netdev_priv(netdev);
+       struct bnad_iocmd_comp fcomp;
+       const struct firmware *fw;
+       int ret = 0;
+
+       ret = request_firmware(&fw, eflash->data, &bnad->pcidev->dev);
+       if (ret) {
+               pr_err("BNA: Can't locate firmware %s\n", eflash->data);
+               goto out;
+       }
+
+       fcomp.bnad = bnad;
+       fcomp.comp_status = 0;
+
+       init_completion(&fcomp.comp);
+       spin_lock_irq(&bnad->bna_lock);
+       ret = bfa_nw_flash_update_part(&bnad->bna.flash, BFA_FLASH_PART_FWIMG,
+                               bnad->id, (u8 *)fw->data, fw->size, 0,
+                               bnad_cb_completion, &fcomp);
+       if (ret != BFA_STATUS_OK) {
+               pr_warn("BNA: Flash update failed with err: %d\n", ret);
+               ret = -EIO;
+               spin_unlock_irq(&bnad->bna_lock);
+               goto out;
+       }
+
+       spin_unlock_irq(&bnad->bna_lock);
+       wait_for_completion(&fcomp.comp);
+       if (fcomp.comp_status != BFA_STATUS_OK) {
+               ret = -EIO;
+               pr_warn("BNA: Firmware image update to flash failed with: %d\n",
+                       fcomp.comp_status);
+       }
+out:
+       release_firmware(fw);
+       return ret;
+}
+
 static const struct ethtool_ops bnad_ethtool_ops = {
        .get_settings = bnad_get_settings,
        .set_settings = bnad_set_settings,
        .get_eeprom_len = bnad_get_eeprom_len,
        .get_eeprom = bnad_get_eeprom,
        .set_eeprom = bnad_set_eeprom,
+       .flash_device = bnad_flash_device,
 };
 
 void