|
@@ -331,7 +331,8 @@ struct pci_bus *pci_acpi_scan_root(struct acpi_pci_root *root)
|
|
|
int domain = root->segment;
|
|
|
int bus = root->secondary.start;
|
|
|
struct pci_controller *controller;
|
|
|
- struct pci_root_info info;
|
|
|
+ struct pci_root_info *info = NULL;
|
|
|
+ int busnum = root->secondary.start;
|
|
|
struct pci_bus *pbus;
|
|
|
char *name;
|
|
|
int pxm;
|
|
@@ -348,35 +349,43 @@ struct pci_bus *pci_acpi_scan_root(struct acpi_pci_root *root)
|
|
|
controller->node = pxm_to_node(pxm);
|
|
|
#endif
|
|
|
|
|
|
- INIT_LIST_HEAD(&info.resources);
|
|
|
+ info = kzalloc(sizeof(*info), GFP_KERNEL);
|
|
|
+ if (!info) {
|
|
|
+ printk(KERN_WARNING
|
|
|
+ "pci_bus %04x:%02x: ignored (out of memory)\n",
|
|
|
+ root->segment, busnum);
|
|
|
+ goto out2;
|
|
|
+ }
|
|
|
+
|
|
|
+ INIT_LIST_HEAD(&info->resources);
|
|
|
/* insert busn resource at first */
|
|
|
- pci_add_resource(&info.resources, &root->secondary);
|
|
|
+ pci_add_resource(&info->resources, &root->secondary);
|
|
|
acpi_walk_resources(device->handle, METHOD_NAME__CRS, count_window,
|
|
|
- &info.res_num);
|
|
|
- if (info.res_num) {
|
|
|
- info.res =
|
|
|
- kzalloc_node(sizeof(*info.res) * info.res_num,
|
|
|
+ &info->res_num);
|
|
|
+ if (info->res_num) {
|
|
|
+ info->res =
|
|
|
+ kzalloc_node(sizeof(*info->res) * info->res_num,
|
|
|
GFP_KERNEL, controller->node);
|
|
|
- if (!info.res)
|
|
|
- goto out2;
|
|
|
+ if (!info->res)
|
|
|
+ goto out3;
|
|
|
|
|
|
- info.res_offset =
|
|
|
- kzalloc_node(sizeof(*info.res_offset) * info.res_num,
|
|
|
+ info->res_offset =
|
|
|
+ kzalloc_node(sizeof(*info->res_offset) * info->res_num,
|
|
|
GFP_KERNEL, controller->node);
|
|
|
- if (!info.res_offset)
|
|
|
- goto out3;
|
|
|
+ if (!info->res_offset)
|
|
|
+ goto out4;
|
|
|
|
|
|
name = kmalloc(16, GFP_KERNEL);
|
|
|
if (!name)
|
|
|
- goto out4;
|
|
|
+ goto out5;
|
|
|
|
|
|
sprintf(name, "PCI Bus %04x:%02x", domain, bus);
|
|
|
- info.bridge = device;
|
|
|
- info.controller = controller;
|
|
|
- info.name = name;
|
|
|
- info.res_num = 0;
|
|
|
+ info->bridge = device;
|
|
|
+ info->controller = controller;
|
|
|
+ info->name = name;
|
|
|
+ info->res_num = 0;
|
|
|
acpi_walk_resources(device->handle, METHOD_NAME__CRS,
|
|
|
- add_window, &info);
|
|
|
+ add_window, info);
|
|
|
}
|
|
|
/*
|
|
|
* See arch/x86/pci/acpi.c.
|
|
@@ -385,18 +394,21 @@ struct pci_bus *pci_acpi_scan_root(struct acpi_pci_root *root)
|
|
|
* such quirk. So we just ignore the case now.
|
|
|
*/
|
|
|
pbus = pci_create_root_bus(NULL, bus, &pci_root_ops, controller,
|
|
|
- &info.resources);
|
|
|
+ &info->resources);
|
|
|
if (!pbus) {
|
|
|
- pci_free_resource_list(&info.resources);
|
|
|
+ pci_free_resource_list(&info->resources);
|
|
|
return NULL;
|
|
|
}
|
|
|
|
|
|
pci_scan_child_bus(pbus);
|
|
|
return pbus;
|
|
|
+
|
|
|
+out5:
|
|
|
+ kfree(info->res_offset);
|
|
|
out4:
|
|
|
- kfree(info.res_offset);
|
|
|
+ kfree(info->res);
|
|
|
out3:
|
|
|
- kfree(info.res);
|
|
|
+ kfree(info);
|
|
|
out2:
|
|
|
kfree(controller);
|
|
|
out1:
|