PCI: Enable upstream bridges even for VFs on virtual buses
authorBjorn Helgaas <bhelgaas@google.com>
Wed, 6 Nov 2013 17:00:51 +0000 (10:00 -0700)
committerBjorn Helgaas <bhelgaas@google.com>
Thu, 7 Nov 2013 21:53:39 +0000 (14:53 -0700)
Previously we enabled the upstream PCI-to-PCI bridge only when
"dev->bus->self != NULL".  In the case of a VF on a virtual bus, where
"bus->self == NULL", we didn't enable the upstream bridge.

This fixes that by enabling the upstream bridge of the PF corresponding to
the VF.

Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
Acked-by: Yinghai Lu <yinghai@kernel.org>
drivers/pci/pci.c

index ac40f90cfd5f7f1965ca62b80700593f4f83ba84..d3ed931c07709cb1c4fed825bffcfd5d9086957a 100644 (file)
@@ -1148,12 +1148,12 @@ int pci_reenable_device(struct pci_dev *dev)
 
 static void pci_enable_bridge(struct pci_dev *dev)
 {
+       struct pci_dev *bridge;
        int retval;
 
-       if (!dev)
-               return;
-
-       pci_enable_bridge(dev->bus->self);
+       bridge = pci_upstream_bridge(dev);
+       if (bridge)
+               pci_enable_bridge(bridge);
 
        if (pci_is_enabled(dev)) {
                if (!dev->is_busmaster)
@@ -1170,6 +1170,7 @@ static void pci_enable_bridge(struct pci_dev *dev)
 
 static int pci_enable_device_flags(struct pci_dev *dev, unsigned long flags)
 {
+       struct pci_dev *bridge;
        int err;
        int i, bars = 0;
 
@@ -1188,7 +1189,9 @@ static int pci_enable_device_flags(struct pci_dev *dev, unsigned long flags)
        if (atomic_inc_return(&dev->enable_cnt) > 1)
                return 0;               /* already enabled */
 
-       pci_enable_bridge(dev->bus->self);
+       bridge = pci_upstream_bridge(dev);
+       if (bridge)
+               pci_enable_bridge(bridge);
 
        /* only skip sriov related */
        for (i = 0; i <= PCI_ROM_RESOURCE; i++)