|
@@ -73,20 +73,22 @@ static const struct pci_device_id nfp_pci_device_ids[] = {
|
|
|
};
|
|
|
MODULE_DEVICE_TABLE(pci, nfp_pci_device_ids);
|
|
|
|
|
|
-static void nfp_pcie_sriov_read_nfd_limit(struct nfp_pf *pf)
|
|
|
+static int nfp_pcie_sriov_read_nfd_limit(struct nfp_pf *pf)
|
|
|
{
|
|
|
-#ifdef CONFIG_PCI_IOV
|
|
|
int err;
|
|
|
|
|
|
pf->limit_vfs = nfp_rtsym_read_le(pf->cpp, "nfd_vf_cfg_max_vfs", &err);
|
|
|
if (!err)
|
|
|
- return;
|
|
|
+ return pci_sriov_set_totalvfs(pf->pdev, pf->limit_vfs);
|
|
|
|
|
|
pf->limit_vfs = ~0;
|
|
|
+ pci_sriov_set_totalvfs(pf->pdev, 0); /* 0 is unset */
|
|
|
/* Allow any setting for backwards compatibility if symbol not found */
|
|
|
- if (err != -ENOENT)
|
|
|
- nfp_warn(pf->cpp, "Warning: VF limit read failed: %d\n", err);
|
|
|
-#endif
|
|
|
+ if (err == -ENOENT)
|
|
|
+ return 0;
|
|
|
+
|
|
|
+ nfp_warn(pf->cpp, "Warning: VF limit read failed: %d\n", err);
|
|
|
+ return err;
|
|
|
}
|
|
|
|
|
|
static int nfp_pcie_sriov_enable(struct pci_dev *pdev, int num_vfs)
|
|
@@ -373,14 +375,18 @@ static int nfp_pci_probe(struct pci_dev *pdev,
|
|
|
if (err)
|
|
|
goto err_devlink_unreg;
|
|
|
|
|
|
- nfp_pcie_sriov_read_nfd_limit(pf);
|
|
|
+ err = nfp_pcie_sriov_read_nfd_limit(pf);
|
|
|
+ if (err)
|
|
|
+ goto err_fw_unload;
|
|
|
|
|
|
err = nfp_net_pci_probe(pf);
|
|
|
if (err)
|
|
|
- goto err_fw_unload;
|
|
|
+ goto err_sriov_unlimit;
|
|
|
|
|
|
return 0;
|
|
|
|
|
|
+err_sriov_unlimit:
|
|
|
+ pci_sriov_set_totalvfs(pf->pdev, 0);
|
|
|
err_fw_unload:
|
|
|
if (pf->fw_loaded)
|
|
|
nfp_fw_unload(pf);
|
|
@@ -411,6 +417,7 @@ static void nfp_pci_remove(struct pci_dev *pdev)
|
|
|
nfp_net_pci_remove(pf);
|
|
|
|
|
|
nfp_pcie_sriov_disable(pdev);
|
|
|
+ pci_sriov_set_totalvfs(pf->pdev, 0);
|
|
|
|
|
|
devlink_unregister(devlink);
|
|
|
|