nfp: set driver VF limit
authorJakub Kicinski <jakub.kicinski@netronome.com>
Mon, 29 May 2017 00:52:54 +0000 (17:52 -0700)
committerDavid S. Miller <davem@davemloft.net>
Tue, 30 May 2017 15:27:04 +0000 (11:27 -0400)
PCI subsystem has support for drivers limiting the number of VFs
available below what the IOV capability claims.  Make use of it.

While at it remove the #ifdef/#endif on CONFIG_PCI_IOV, it was
there to avoid unnecessary warnings in case device read failed
but kernel doesn't have SR-IOV support anyway.  Device reads
should not fail.

Note that we still need the driver-internal check for the case
where max VFs is 0 since PCI subsystem treats 0 as limit not set.

Signed-off-by: Jakub Kicinski <jakub.kicinski@netronome.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/netronome/nfp/nfp_main.c

index f22f56c..ba174e1 100644 (file)
@@ -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);