Commit 79272138bd5c35edb9be5ae7b473a2741751a706

Authored by Bjorn Helgaas
1 parent c6bde215ac

PCI: Enable upstream bridges even for VFs on virtual buses

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>

Showing 1 changed file with 8 additions and 5 deletions Side-by-side Diff

... ... @@ -1148,13 +1148,13 @@
1148 1148  
1149 1149 static void pci_enable_bridge(struct pci_dev *dev)
1150 1150 {
  1151 + struct pci_dev *bridge;
1151 1152 int retval;
1152 1153  
1153   - if (!dev)
1154   - return;
  1154 + bridge = pci_upstream_bridge(dev);
  1155 + if (bridge)
  1156 + pci_enable_bridge(bridge);
1155 1157  
1156   - pci_enable_bridge(dev->bus->self);
1157   -
1158 1158 if (pci_is_enabled(dev)) {
1159 1159 if (!dev->is_busmaster)
1160 1160 pci_set_master(dev);
... ... @@ -1170,6 +1170,7 @@
1170 1170  
1171 1171 static int pci_enable_device_flags(struct pci_dev *dev, unsigned long flags)
1172 1172 {
  1173 + struct pci_dev *bridge;
1173 1174 int err;
1174 1175 int i, bars = 0;
1175 1176  
... ... @@ -1188,7 +1189,9 @@
1188 1189 if (atomic_inc_return(&dev->enable_cnt) > 1)
1189 1190 return 0; /* already enabled */
1190 1191  
1191   - pci_enable_bridge(dev->bus->self);
  1192 + bridge = pci_upstream_bridge(dev);
  1193 + if (bridge)
  1194 + pci_enable_bridge(bridge);
1192 1195  
1193 1196 /* only skip sriov related */
1194 1197 for (i = 0; i <= PCI_ROM_RESOURCE; i++)