Skip to content

Commit

Permalink
PCI: Use add_list in pcie hotplug path.
Browse files Browse the repository at this point in the history
We need add size for hot plug path when pluging in hotplug chassis
without cards.

-v2: change descriptions. make it applicable after "pci: Check bridge
     resources after resource allocation."

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 Feb 14, 2012
1 parent 3e6e0d8 commit 8424d75
Showing 1 changed file with 12 additions and 6 deletions.
18 changes: 12 additions & 6 deletions drivers/pci/setup-bus.c
Original file line number Diff line number Diff line change
Expand Up @@ -330,13 +330,14 @@ static void __assign_resources_sorted(struct resource_list *head,
}

static void pdev_assign_resources_sorted(struct pci_dev *dev,
struct resource_list_x *add_head,
struct resource_list_x *fail_head)
{
struct resource_list head;

head.next = NULL;
__dev_sort_resources(dev, &head);
__assign_resources_sorted(&head, NULL, fail_head);
__assign_resources_sorted(&head, add_head, fail_head);

}

Expand Down Expand Up @@ -1006,17 +1007,19 @@ void __ref pci_bus_assign_resources(const struct pci_bus *bus)
EXPORT_SYMBOL(pci_bus_assign_resources);

static void __ref __pci_bridge_assign_resources(const struct pci_dev *bridge,
struct resource_list_x *add_head,
struct resource_list_x *fail_head)
{
struct pci_bus *b;

pdev_assign_resources_sorted((struct pci_dev *)bridge, fail_head);
pdev_assign_resources_sorted((struct pci_dev *)bridge,
add_head, fail_head);

b = bridge->subordinate;
if (!b)
return;

__pci_bus_assign_resources(b, NULL, fail_head);
__pci_bus_assign_resources(b, add_head, fail_head);

switch (bridge->class >> 8) {
case PCI_CLASS_BRIDGE_PCI:
Expand Down Expand Up @@ -1291,18 +1294,21 @@ pci_assign_unassigned_resources(void)
void pci_assign_unassigned_bridge_resources(struct pci_dev *bridge)
{
struct pci_bus *parent = bridge->subordinate;
struct resource_list_x add_list; /* list of resources that
want additional resources */
int tried_times = 0;
struct resource_list_x head, *list;
int retval;
unsigned long type_mask = IORESOURCE_IO | IORESOURCE_MEM |
IORESOURCE_PREFETCH;

head.next = NULL;
add_list.next = NULL;

again:
pci_bus_size_bridges(parent);
__pci_bridge_assign_resources(bridge, &head);

__pci_bus_size_bridges(parent, &add_list);
__pci_bridge_assign_resources(bridge, &add_list, &head);
BUG_ON(add_list.next);
tried_times++;

if (!head.next)
Expand Down

0 comments on commit 8424d75

Please sign in to comment.