Commit 3f579c34 authored by Yinghai Lu's avatar Yinghai Lu Committed by Jesse Barnes

PCI hotplug: make sure child bridges are enabled at hotplug time

Found one PCIe Module with several bridges built-in where a "cold"
hotadd doesn't work.

If we end up reassigning bridge windows at hotadd time, and have to loop
through assigning new ranges, we won't end up enabling the child bridges
because the first assignment pass already tried to enable them, which
prevents __pci_bridge_assign_resource from updating the windows.

So try to move enabling of child bridges to the end, and only do it
once.
Signed-off-by: default avatarYinghai Lu <yinghai@kernel.org>
Signed-off-by: default avatarJesse Barnes <jbarnes@virtuousgeek.org>
parent 0ba10bc7
...@@ -874,19 +874,16 @@ void pci_assign_unassigned_bridge_resources(struct pci_dev *bridge) ...@@ -874,19 +874,16 @@ void pci_assign_unassigned_bridge_resources(struct pci_dev *bridge)
again: again:
pci_bus_size_bridges(parent); pci_bus_size_bridges(parent);
__pci_bridge_assign_resources(bridge, &head); __pci_bridge_assign_resources(bridge, &head);
retval = pci_reenable_device(bridge);
pci_set_master(bridge);
pci_enable_bridges(parent);
tried_times++; tried_times++;
if (!head.next) if (!head.next)
return; goto enable_all;
if (tried_times >= 2) { if (tried_times >= 2) {
/* still fail, don't need to try more */ /* still fail, don't need to try more */
free_failed_list(&head); free_failed_list(&head);
return; goto enable_all;
} }
printk(KERN_DEBUG "PCI: No. %d try to assign unassigned res\n", printk(KERN_DEBUG "PCI: No. %d try to assign unassigned res\n",
...@@ -919,5 +916,10 @@ void pci_assign_unassigned_bridge_resources(struct pci_dev *bridge) ...@@ -919,5 +916,10 @@ void pci_assign_unassigned_bridge_resources(struct pci_dev *bridge)
free_failed_list(&head); free_failed_list(&head);
goto again; 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); EXPORT_SYMBOL_GPL(pci_assign_unassigned_bridge_resources);
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment