|
@@ -1072,6 +1072,47 @@ done:
|
|
|
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,
|
|
@@ -1090,6 +1131,7 @@ static const struct ethtool_ops bnad_ethtool_ops = {
|
|
|
.get_eeprom_len = bnad_get_eeprom_len,
|
|
|
.get_eeprom = bnad_get_eeprom,
|
|
|
.set_eeprom = bnad_set_eeprom,
|
|
|
+ .flash_device = bnad_flash_device,
|
|
|
};
|
|
|
|
|
|
void
|