]> Pileus Git - ~andy/linux/blobdiff - drivers/net/ethernet/brocade/bna/bnad_ethtool.c
bna: Implement ethtool flash_device entry point.
[~andy/linux] / drivers / net / ethernet / brocade / bna / bnad_ethtool.c
index 9b44ec8096baa270272f0e991df470221532c310..a27c601af3d1c5ccc2c092b1f191a128ebb700b8 100644 (file)
@@ -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