nfp: attempt FW load from flash
Flash may contain a default NFP application FW. This application can either be put there by the user (with ethtool -f) or shipped with the card. If file system FW is not found, attempt to load this flash stored app FW. Signed-off-by: Jakub Kicinski <jakub.kicinski@netronome.com> Reviewed-by: Dirk van der Merwe <dirk.vandermerwe@netronome.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
Родитель
1c0372b67c
Коммит
2db100002e
|
@ -441,8 +441,11 @@ nfp_fw_load(struct pci_dev *pdev, struct nfp_pf *pf, struct nfp_nsp *nsp)
|
|||
}
|
||||
|
||||
fw = nfp_net_fw_find(pdev, pf);
|
||||
if (!fw)
|
||||
if (!fw) {
|
||||
if (nfp_nsp_has_stored_fw_load(nsp))
|
||||
nfp_nsp_load_stored_fw(nsp);
|
||||
return 0;
|
||||
}
|
||||
|
||||
dev_info(&pdev->dev, "Soft-reset, loading FW image\n");
|
||||
err = nfp_nsp_device_soft_reset(nsp);
|
||||
|
@ -453,7 +456,6 @@ nfp_fw_load(struct pci_dev *pdev, struct nfp_pf *pf, struct nfp_nsp *nsp)
|
|||
}
|
||||
|
||||
err = nfp_nsp_load_fw(nsp, fw);
|
||||
|
||||
if (err < 0) {
|
||||
dev_err(&pdev->dev, "FW loading failed: %d\n", err);
|
||||
goto exit_release_fw;
|
||||
|
|
|
@ -100,6 +100,7 @@ enum nfp_nsp_cmd {
|
|||
SPCODE_NSP_WRITE_FLASH = 11, /* Load and flash image from buffer */
|
||||
SPCODE_NSP_SENSORS = 12, /* Read NSP sensor(s) */
|
||||
SPCODE_NSP_IDENTIFY = 13, /* Read NSP version */
|
||||
SPCODE_FW_STORED = 16, /* If no FW loaded, load flash app FW */
|
||||
};
|
||||
|
||||
static const struct {
|
||||
|
@ -618,3 +619,8 @@ int nfp_nsp_read_sensors(struct nfp_nsp *state, unsigned int sensor_mask,
|
|||
|
||||
return nfp_nsp_command_buf(state, &sensors);
|
||||
}
|
||||
|
||||
int nfp_nsp_load_stored_fw(struct nfp_nsp *state)
|
||||
{
|
||||
return nfp_nsp_command(state, SPCODE_FW_STORED);
|
||||
}
|
||||
|
|
|
@ -50,12 +50,18 @@ int nfp_nsp_device_soft_reset(struct nfp_nsp *state);
|
|||
int nfp_nsp_load_fw(struct nfp_nsp *state, const struct firmware *fw);
|
||||
int nfp_nsp_write_flash(struct nfp_nsp *state, const struct firmware *fw);
|
||||
int nfp_nsp_mac_reinit(struct nfp_nsp *state);
|
||||
int nfp_nsp_load_stored_fw(struct nfp_nsp *state);
|
||||
|
||||
static inline bool nfp_nsp_has_mac_reinit(struct nfp_nsp *state)
|
||||
{
|
||||
return nfp_nsp_get_abi_ver_minor(state) > 20;
|
||||
}
|
||||
|
||||
static inline bool nfp_nsp_has_stored_fw_load(struct nfp_nsp *state)
|
||||
{
|
||||
return nfp_nsp_get_abi_ver_minor(state) > 23;
|
||||
}
|
||||
|
||||
enum nfp_eth_interface {
|
||||
NFP_INTERFACE_NONE = 0,
|
||||
NFP_INTERFACE_SFP = 1,
|
||||
|
|
Загрузка…
Ссылка в новой задаче