Skip to content

Commit

Permalink
PCI hotplug: make sure child bridges are enabled at hotplug time
Browse files Browse the repository at this point in the history
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: Yinghai Lu <yinghai@kernel.org>
Signed-off-by: Jesse Barnes <jbarnes@virtuousgeek.org>
  • Loading branch information
Yinghai Lu authored and Jesse Barnes committed Jul 30, 2010
1 parent 0ba10bc commit 3f579c3
Showing 1 changed file with 7 additions and 5 deletions.
12 changes: 7 additions & 5 deletions drivers/pci/setup-bus.c
Original file line number Diff line number Diff line change
Expand Up @@ -874,19 +874,16 @@ void pci_assign_unassigned_bridge_resources(struct pci_dev *bridge)
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",
Expand Down Expand Up @@ -919,5 +916,10 @@ void pci_assign_unassigned_bridge_resources(struct pci_dev *bridge)
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);

0 comments on commit 3f579c3

Please sign in to comment.