Commit 79272138bd5c35edb9be5ae7b473a2741751a706
1 parent
c6bde215ac
Exists in
smarc-imx_3.14.28_1.0.0_ga
and in
1 other branch
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
drivers/pci/pci.c
... | ... | @@ -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++) |