]> git.kernelconcepts.de Git - karo-tx-linux.git/commitdiff
PCI: Enable SR-IOV ARI Capable Hierarchy before reading TotalVFs
authorBen Shelton <benjamin.h.shelton@intel.com>
Thu, 29 Oct 2015 21:20:31 +0000 (16:20 -0500)
committerBjorn Helgaas <bhelgaas@google.com>
Thu, 29 Oct 2015 21:20:31 +0000 (16:20 -0500)
For some SR-IOV devices, the number of available virtual functions, i.e.,
TotalVFs, increases after setting the ARI Capable Hierarchy bit in the
SR-IOV Control register.  This violates the SR-IOV spec, r1.1, sec 3.3.6,
which says TotalVFs is HwInit, but we don't need TotalVFs before setting
the ARI Capable bit anyway.

Set the ARI Capable Hierarchy bit (if ARI is enabled in the upstream
bridge) before reading TotalVFs.

[bhelgaas: changelog]
Signed-off-by: Ben Shelton <benjamin.h.shelton@intel.com>
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
drivers/pci/iov.c

index ee0ebff103a412bc3db69c05f0a30ecc1872be48..0cdb2d1e1a203db528b506721e7560a4edb27ab1 100644 (file)
@@ -399,10 +399,6 @@ static int sriov_init(struct pci_dev *dev, int pos)
                ssleep(1);
        }
 
-       pci_read_config_word(dev, pos + PCI_SRIOV_TOTAL_VF, &total);
-       if (!total)
-               return 0;
-
        ctrl = 0;
        list_for_each_entry(pdev, &dev->bus->devices, bus_list)
                if (pdev->is_physfn)
@@ -420,6 +416,10 @@ found:
        if (!offset || (total > 1 && !stride))
                return -EIO;
 
+       pci_read_config_word(dev, pos + PCI_SRIOV_TOTAL_VF, &total);
+       if (!total)
+               return 0;
+
        pci_read_config_dword(dev, pos + PCI_SRIOV_SUP_PGSIZE, &pgsz);
        i = PAGE_SHIFT > 12 ? PAGE_SHIFT - 12 : 0;
        pgsz &= ~((1 << i) - 1);