]> git.proxmox.com Git - mirror_ubuntu-jammy-kernel.git/commitdiff
nfp: attempt FW load from flash
authorJakub Kicinski <jakub.kicinski@netronome.com>
Tue, 28 Aug 2018 20:20:34 +0000 (13:20 -0700)
committerDavid S. Miller <davem@davemloft.net>
Tue, 28 Aug 2018 23:01:46 +0000 (16:01 -0700)
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>
drivers/net/ethernet/netronome/nfp/nfp_main.c
drivers/net/ethernet/netronome/nfp/nfpcore/nfp_nsp.c
drivers/net/ethernet/netronome/nfp/nfpcore/nfp_nsp.h

index 4a540c5e27febdc5827955fb863a6c0f5834325d..61c22c2935d46d786a4879da2db189e7bb020dd8 100644 (file)
@@ -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;
index e1a14f4e5e719681d23bc672517905a82feca05d..0cdaa1fd6bcf9de4897267a8ff690c1f6a974401 100644 (file)
@@ -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);
+}
index f23d9e06f09742e75f4d333f9dd06e4a425a7671..65f2d4a6de02274ffc6b8fa4c6a5c94aa984d796 100644 (file)
@@ -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,