aboutsummaryrefslogtreecommitdiffstats
path: root/include/linux
diff options
context:
space:
mode:
authorKenji Kaneshige <kaneshige.kenji@jp.fujitsu.com>2009-02-17 00:12:36 -0500
committerJesse Barnes <jbarnes@virtuousgeek.org>2009-03-20 13:47:57 -0400
commitd18690af626b83fef1d1953b9f70e09497060586 (patch)
treef3d3d851318faded0097a271694e72f39a9d9ea6 /include/linux
parent0747aaf42d78d26684c6f6b34a4103ff81f571f8 (diff)
PCI/ACPI: fix wrong assumption in acpi_find_root_bridge_handle
Current acpi_find_root_bridge_handle() has a assumption that pci_bus->self is NULL on the root pci bus. But it might not be true on some platforms. Because of this wrong assumption, current acpi_find_root_bridge_handle() might cause endless loop. We must check pci_bus->parent instead. Signed-off-by: Kenji Kaneshige <kaneshige.kenji@jp.fujitsu.com> Signed-off-by: Jesse Barnes <jbarnes@virtuousgeek.org>
Diffstat (limited to 'include/linux')
-rw-r--r--include/linux/pci-acpi.h12
1 files changed, 6 insertions, 6 deletions
diff --git a/include/linux/pci-acpi.h b/include/linux/pci-acpi.h
index 3cee2367459f..092e82e0048c 100644
--- a/include/linux/pci-acpi.h
+++ b/include/linux/pci-acpi.h
@@ -13,12 +13,12 @@
13#ifdef CONFIG_ACPI 13#ifdef CONFIG_ACPI
14static inline acpi_handle acpi_find_root_bridge_handle(struct pci_dev *pdev) 14static inline acpi_handle acpi_find_root_bridge_handle(struct pci_dev *pdev)
15{ 15{
16 /* Find root host bridge */ 16 struct pci_bus *pbus = pdev->bus;
17 while (pdev->bus->self) 17 /* Find a PCI root bus */
18 pdev = pdev->bus->self; 18 while (pbus->parent)
19 19 pbus = pbus->parent;
20 return acpi_get_pci_rootbridge_handle(pci_domain_nr(pdev->bus), 20 return acpi_get_pci_rootbridge_handle(pci_domain_nr(pbus),
21 pdev->bus->number); 21 pbus->number);
22} 22}
23 23
24static inline acpi_handle acpi_pci_get_bridge_handle(struct pci_bus *pbus) 24static inline acpi_handle acpi_pci_get_bridge_handle(struct pci_bus *pbus)