Subject: [PATCH] PCI: Workaround missing pci_set_master in pci drivers BenH found: | 928bea964827d7824b548c1f8e06eccbbc4d0d7d | PCI: Delay enabling bridges until they're needed break PCI on powerpc. The reason is that the PCIe port driver will call pci_enable_device() on the bridge, so device enabled (but skip pci_set_master somehow). 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. Reported-by: Benjamin Herrenschmidt Signed-off-by: Yinghai Lu --- drivers/pci/pci.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) Index: linux-2.6/drivers/pci/pci.c =================================================================== --- linux-2.6.orig/drivers/pci/pci.c +++ linux-2.6/drivers/pci/pci.c @@ -1156,8 +1156,14 @@ static void pci_enable_bridge(struct pci pci_enable_bridge(dev->bus->self); - if (pci_is_enabled(dev)) + if (pci_is_enabled(dev)) { + if (!dev->is_busmaster) { + dev_warn(&dev->dev, "driver skip pci_set_master, fix it!\n"); + pci_set_master(dev); + } return; + } + retval = pci_enable_device(dev); if (retval) dev_err(&dev->dev, "Error enabling bridge (%d), continuing\n",