Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 57b9bef0 authored by Krishna Gudipati's avatar Krishna Gudipati Committed by David S. Miller
Browse files

bna: Implement ethtool flash_device entry point.



Incorporated review comments from Ben Hutchings.

Change details:
	- Implement ethtool flash_device() entry point to write the
	  firmware image to the flash firmware partition.

Signed-off-by: default avatarKrishna Gudipati <kgudipat@brocade.com>
Reviewed-by: default avatarBen Hutchings <bhutchings@solarflare.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 7161c76f
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -297,6 +297,7 @@ enum bfa_mode {
#define BFA_FLASH_PART_ENTRY_SIZE	32	/* partition entry size */
#define BFA_FLASH_PART_MAX		32	/* maximal # of partitions */
#define BFA_TOTAL_FLASH_SIZE		0x400000
#define BFA_FLASH_PART_FWIMG		2
#define BFA_FLASH_PART_MFG		7

/*
+42 −0
Original line number Diff line number Diff line
@@ -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