aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/pci
diff options
context:
space:
mode:
authorAndrew Patterson <andrew.patterson@hp.com>2008-01-22 19:18:27 -0500
committerGreg Kroah-Hartman <gregkh@suse.de>2008-02-01 18:04:30 -0500
commit3c75e23784e6ed5f4841de43d0750fd9b37bafcb (patch)
tree34c54566b3dfe8411464f49bdaec0cbcdd7170e9 /drivers/pci
parentd8634ddd371515740110d5658c3465a373894243 (diff)
PCI: Run ACPI _OSC method on root bridges only
According to the PCI Firmware Specification Revision 3.0 section 4.5, _OSC should only be called on a root brdige. Here is the relevant passage: "The _OSC interface defined in this section applies only to Host Bridge ACPI devices that originate PCI, PCI-X, or PCI Express hierarchies". Changed the code to find the parent root bridge of the device and call _OSC on that. Signed-off-by: Andrew Patterson <andrew.patterson@hp.com> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Diffstat (limited to 'drivers/pci')
-rw-r--r--drivers/pci/pcie/aer/aerdrv_acpi.c22
1 files changed, 6 insertions, 16 deletions
diff --git a/drivers/pci/pcie/aer/aerdrv_acpi.c b/drivers/pci/pcie/aer/aerdrv_acpi.c
index f685bf5cdab9..8c199ae84f6d 100644
--- a/drivers/pci/pcie/aer/aerdrv_acpi.c
+++ b/drivers/pci/pcie/aer/aerdrv_acpi.c
@@ -31,23 +31,13 @@ int aer_osc_setup(struct pcie_device *pciedev)
31{ 31{
32 acpi_status status = AE_NOT_FOUND; 32 acpi_status status = AE_NOT_FOUND;
33 struct pci_dev *pdev = pciedev->port; 33 struct pci_dev *pdev = pciedev->port;
34 acpi_handle handle = DEVICE_ACPI_HANDLE(&pdev->dev); 34 acpi_handle handle = 0;
35 struct pci_bus *parent;
36 35
37 while (!handle) { 36 /* Find root host bridge */
38 if (!pdev || !pdev->bus->parent) 37 while (pdev->bus && pdev->bus->self)
39 break; 38 pdev = pdev->bus->self;
40 parent = pdev->bus->parent; 39 handle = acpi_get_pci_rootbridge_handle(
41 if (!parent->self) 40 pci_domain_nr(pdev->bus), pdev->bus->number);
42 /* Parent must be a host bridge */
43 handle = acpi_get_pci_rootbridge_handle(
44 pci_domain_nr(parent),
45 parent->number);
46 else
47 handle = DEVICE_ACPI_HANDLE(
48 &(parent->self->dev));
49 pdev = parent->self;
50 }
51 41
52 if (handle) { 42 if (handle) {
53 pcie_osc_support_set(OSC_EXT_PCI_CONFIG_SUPPORT); 43 pcie_osc_support_set(OSC_EXT_PCI_CONFIG_SUPPORT);