Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

PCI: Workaround missing pci_set_master in pci drivers

Ben Herrenschmidt found that commit 928bea964827 ("PCI: Delay enabling
bridges until they're needed") breaks PCI in some powerpc environments.

The reason is that the PCIe port driver will call pci_enable_device() on
the bridge, so the device is enabled, but skips pci_set_master because
pcie_port_auto and no acpi on powerpc.

Because of that, pci_enable_bridge() later on (called as a result of the
child device driver doing pci_enable_device) will see the bridge as
already enabled and will not call pci_set_master() on it.

Fixed by add checking in pci_enable_bridge, and call pci_set_master
if driver skip that.

That will make the code more robot and wade off problem for missing
pci_set_master in drivers.

Reported-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Signed-off-by: Yinghai Lu <yinghai@kernel.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>

authored by

Yinghai Lu and committed by
Linus Torvalds
f41f064c aeebc264

+7 -1
+7 -1
drivers/pci/pci.c
··· 1155 1155 1156 1156 pci_enable_bridge(dev->bus->self); 1157 1157 1158 - if (pci_is_enabled(dev)) 1158 + if (pci_is_enabled(dev)) { 1159 + if (!dev->is_busmaster) { 1160 + dev_warn(&dev->dev, "driver skip pci_set_master, fix it!\n"); 1161 + pci_set_master(dev); 1162 + } 1159 1163 return; 1164 + } 1165 + 1160 1166 retval = pci_enable_device(dev); 1161 1167 if (retval) 1162 1168 dev_err(&dev->dev, "Error enabling bridge (%d), continuing\n",