diff options
Diffstat (limited to 'arch/x86/pci')
-rw-r--r-- | arch/x86/pci/acpi.c | 17 |
1 files changed, 15 insertions, 2 deletions
diff --git a/arch/x86/pci/acpi.c b/arch/x86/pci/acpi.c index 0234f2831bf3..378136fb5044 100644 --- a/arch/x86/pci/acpi.c +++ b/arch/x86/pci/acpi.c | |||
@@ -219,8 +219,21 @@ struct pci_bus * __devinit pci_acpi_scan_root(struct acpi_device *device, int do | |||
219 | if (pxm >= 0) | 219 | if (pxm >= 0) |
220 | sd->node = pxm_to_node(pxm); | 220 | sd->node = pxm_to_node(pxm); |
221 | #endif | 221 | #endif |
222 | /* | ||
223 | * Maybe the desired pci bus has been already scanned. In such case | ||
224 | * it is unnecessary to scan the pci bus with the given domain,busnum. | ||
225 | */ | ||
226 | bus = pci_find_bus(domain, busnum); | ||
227 | if (bus) { | ||
228 | /* | ||
229 | * If the desired bus exits, the content of bus->sysdata will | ||
230 | * be replaced by sd. | ||
231 | */ | ||
232 | memcpy(bus->sysdata, sd, sizeof(*sd)); | ||
233 | kfree(sd); | ||
234 | } else | ||
235 | bus = pci_scan_bus_parented(NULL, busnum, &pci_root_ops, sd); | ||
222 | 236 | ||
223 | bus = pci_scan_bus_parented(NULL, busnum, &pci_root_ops, sd); | ||
224 | if (!bus) | 237 | if (!bus) |
225 | kfree(sd); | 238 | kfree(sd); |
226 | 239 | ||
@@ -228,7 +241,7 @@ struct pci_bus * __devinit pci_acpi_scan_root(struct acpi_device *device, int do | |||
228 | if (bus != NULL) { | 241 | if (bus != NULL) { |
229 | if (pxm >= 0) { | 242 | if (pxm >= 0) { |
230 | printk("bus %d -> pxm %d -> node %d\n", | 243 | printk("bus %d -> pxm %d -> node %d\n", |
231 | busnum, pxm, sd->node); | 244 | busnum, pxm, pxm_to_node(pxm)); |
232 | } | 245 | } |
233 | } | 246 | } |
234 | #endif | 247 | #endif |