diff options
author | Kenji Kaneshige <kaneshige.kenji@jp.fujitsu.com> | 2009-02-17 00:12:36 -0500 |
---|---|---|
committer | Jesse Barnes <jbarnes@virtuousgeek.org> | 2009-03-20 13:47:57 -0400 |
commit | d18690af626b83fef1d1953b9f70e09497060586 (patch) | |
tree | f3d3d851318faded0097a271694e72f39a9d9ea6 | |
parent | 0747aaf42d78d26684c6f6b34a4103ff81f571f8 (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>
-rw-r--r-- | include/linux/pci-acpi.h | 12 |
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 |
14 | static inline acpi_handle acpi_find_root_bridge_handle(struct pci_dev *pdev) | 14 | static 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 | ||
24 | static inline acpi_handle acpi_pci_get_bridge_handle(struct pci_bus *pbus) | 24 | static inline acpi_handle acpi_pci_get_bridge_handle(struct pci_bus *pbus) |