From: Yinghai Lu <yinghai@xxxxxxxxxx> Found one PCIe Module with several bridges built-in "cold" hotadd doesn't work. the root cause: 1. BIOS assign small range the parent bridges. 2. First try for hotadd only can make some bridges get resource assigned. 3. Second will update parent bridge res, get right sizes for all child bridges and devices, but resource for child bridges are not set to HW register. Because first try already enable those bridges, so __pci_bridge_assign_resource skip the setting step. So try to move enabling of child bridges to last and only do that one time Signed-off-by: Yinghai Lu <yinghai@xxxxxxxxxx> --- drivers/pci/setup-bus.c | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) Index: linux-2.6/drivers/pci/setup-bus.c =================================================================== --- linux-2.6.orig/drivers/pci/setup-bus.c +++ linux-2.6/drivers/pci/setup-bus.c @@ -866,19 +866,16 @@ void pci_assign_unassigned_bridge_resour again: pci_bus_size_bridges(parent); __pci_bridge_assign_resources(bridge, &head); - retval = pci_reenable_device(bridge); - pci_set_master(bridge); - pci_enable_bridges(parent); tried_times++; if (!head.next) - return; + goto enable_all; if (tried_times >= 2) { /* still fail, don't need to try more */ free_failed_list(&head); - return; + goto enable_all; } printk(KERN_DEBUG "PCI: No. %d try to assign unassigned res\n", @@ -911,5 +908,10 @@ again: free_failed_list(&head); goto again; + +enable_all: + retval = pci_reenable_device(bridge); + pci_set_master(bridge); + pci_enable_bridges(parent); } EXPORT_SYMBOL_GPL(pci_assign_unassigned_bridge_resources); -- To unsubscribe from this list: send the line "unsubscribe linux-pci" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html