};
 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)
        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);
        nfp_net_pci_remove(pf);
 
        nfp_pcie_sriov_disable(pdev);
+       pci_sriov_set_totalvfs(pf->pdev, 0);
 
        devlink_unregister(devlink);