|
@@ -174,6 +174,21 @@ static int nfp_pcie_sriov_configure(struct pci_dev *pdev, int num_vfs)
|
|
|
return nfp_pcie_sriov_enable(pdev, num_vfs);
|
|
|
}
|
|
|
|
|
|
+static const struct firmware *
|
|
|
+nfp_net_fw_request(struct pci_dev *pdev, struct nfp_pf *pf, const char *name)
|
|
|
+{
|
|
|
+ const struct firmware *fw = NULL;
|
|
|
+ int err;
|
|
|
+
|
|
|
+ err = request_firmware_direct(&fw, name, &pdev->dev);
|
|
|
+ nfp_info(pf->cpp, " %s: %s\n",
|
|
|
+ name, err ? "not found" : "found, loading...");
|
|
|
+ if (err)
|
|
|
+ return NULL;
|
|
|
+
|
|
|
+ return fw;
|
|
|
+}
|
|
|
+
|
|
|
/**
|
|
|
* nfp_net_fw_find() - Find the correct firmware image for netdev mode
|
|
|
* @pdev: PCI Device structure
|
|
@@ -184,13 +199,32 @@ static int nfp_pcie_sriov_configure(struct pci_dev *pdev, int num_vfs)
|
|
|
static const struct firmware *
|
|
|
nfp_net_fw_find(struct pci_dev *pdev, struct nfp_pf *pf)
|
|
|
{
|
|
|
- const struct firmware *fw = NULL;
|
|
|
struct nfp_eth_table_port *port;
|
|
|
+ const struct firmware *fw;
|
|
|
const char *fw_model;
|
|
|
char fw_name[256];
|
|
|
- int spc, err = 0;
|
|
|
- int i, j;
|
|
|
+ const u8 *serial;
|
|
|
+ u16 interface;
|
|
|
+ int spc, i, j;
|
|
|
|
|
|
+ nfp_info(pf->cpp, "Looking for firmware file in order of priority:\n");
|
|
|
+
|
|
|
+ /* First try to find a firmware image specific for this device */
|
|
|
+ interface = nfp_cpp_interface(pf->cpp);
|
|
|
+ nfp_cpp_serial(pf->cpp, &serial);
|
|
|
+ sprintf(fw_name, "netronome/serial-%pMF-%02hhx-%02hhx.nffw",
|
|
|
+ serial, interface >> 8, interface & 0xff);
|
|
|
+ fw = nfp_net_fw_request(pdev, pf, fw_name);
|
|
|
+ if (fw)
|
|
|
+ return fw;
|
|
|
+
|
|
|
+ /* Then try the PCI name */
|
|
|
+ sprintf(fw_name, "netronome/pci-%s.nffw", pci_name(pdev));
|
|
|
+ fw = nfp_net_fw_request(pdev, pf, fw_name);
|
|
|
+ if (fw)
|
|
|
+ return fw;
|
|
|
+
|
|
|
+ /* Finally try the card type and media */
|
|
|
if (!pf->eth_tbl) {
|
|
|
dev_err(&pdev->dev, "Error: can't identify media config\n");
|
|
|
return NULL;
|
|
@@ -223,13 +257,7 @@ nfp_net_fw_find(struct pci_dev *pdev, struct nfp_pf *pf)
|
|
|
if (spc <= 0)
|
|
|
return NULL;
|
|
|
|
|
|
- err = request_firmware(&fw, fw_name, &pdev->dev);
|
|
|
- if (err)
|
|
|
- return NULL;
|
|
|
-
|
|
|
- dev_info(&pdev->dev, "Loading FW image: %s\n", fw_name);
|
|
|
-
|
|
|
- return fw;
|
|
|
+ return nfp_net_fw_request(pdev, pf, fw_name);
|
|
|
}
|
|
|
|
|
|
/**
|