[PATCH] pciehp: request control of each hotplug controller individually
authorrajesh.shah@intel.com <rajesh.shah@intel.com>
Tue, 1 Nov 2005 00:20:11 +0000 (16:20 -0800)
committerGreg Kroah-Hartman <gregkh@suse.de>
Fri, 11 Nov 2005 00:09:15 +0000 (16:09 -0800)
This patch tweaks the way pciehp requests control of the hotplug
hardware from BIOS. It now tries to invoke the ACPI _OSC method
for a specific hotplug controller only, rather than walking the
entire acpi namespace invoking all possible _OSC methods under
all host bridges. This allows us to gain control of each hotplug
controller individually, even if BIOS fails to give us control of
some other hotplug controller in the system.

Signed-off-by: Rajesh Shah <rajesh.shah@intel.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
drivers/pci/hotplug/pciehprm_acpi.c
drivers/pci/pci-acpi.c
include/linux/pci-acpi.h

index 5d184582331e2596caa9b91689e4abd188884c92..5acdae3d52b18bb98789908ad191209bdd319b1a 100644 (file)
@@ -143,12 +143,13 @@ static acpi_status acpi_run_oshp(acpi_handle handle)
 int get_hp_hw_control_from_firmware(struct pci_dev *dev)
 {
        acpi_status status;
+       acpi_handle handle = DEVICE_ACPI_HANDLE(&(dev->dev));
        /*
         * Per PCI firmware specification, we should run the ACPI _OSC
         * method to get control of hotplug hardware before using it
         */
-       /* Fixme: run _OSC for a specific host bridge, not all of them */
-       status = pci_osc_control_set(OSC_PCI_EXPRESS_NATIVE_HP_CONTROL);
+       status = pci_osc_control_set(handle,
+                       OSC_PCI_EXPRESS_NATIVE_HP_CONTROL);
 
        /* Fixme: fail native hotplug if _OSC does not exist for root ports */
        if (status == AE_NOT_FOUND) {
@@ -156,9 +157,7 @@ int get_hp_hw_control_from_firmware(struct pci_dev *dev)
                 * Some older BIOS's don't support _OSC but support
                 * OSHP to do the same thing
                 */
-               acpi_handle handle = DEVICE_ACPI_HANDLE(&(dev->dev));
-               if (handle)
-                       status = acpi_run_oshp(handle);
+               status = acpi_run_oshp(handle);
        }
        if (ACPI_FAILURE(status)) {
                err("Cannot get control of hotplug hardware\n");
index e9e37abe1f76447510d9ad9857e8f481a677696e..a9b00cc2d8850da7d958b8fbc1e13119894fe06d 100644 (file)
@@ -91,9 +91,7 @@ acpi_query_osc (
 static acpi_status  
 acpi_run_osc (
        acpi_handle     handle,
-       u32             level,
-       void            *context,
-       void            **retval )
+       void            *context)
 {
        acpi_status             status;
        struct acpi_object_list input;
@@ -184,7 +182,7 @@ EXPORT_SYMBOL(pci_osc_support_set);
  *
  * Attempt to take control from Firmware on requested control bits.
  **/
-acpi_status pci_osc_control_set(u32 flags)
+acpi_status pci_osc_control_set(acpi_handle handle, u32 flags)
 {
        acpi_status     status;
        u32             ctrlset;
@@ -198,10 +196,7 @@ acpi_status pci_osc_control_set(u32 flags)
                return AE_SUPPORT;
        }
        ctrlset_buf[OSC_CONTROL_TYPE] |= ctrlset;
-       status = acpi_get_devices ( PCI_ROOT_HID_STRING,
-                               acpi_run_osc,
-                               ctrlset_buf,
-                               NULL );
+       status = acpi_run_osc(handle, ctrlset_buf);
        if (ACPI_FAILURE (status)) {
                ctrlset_buf[OSC_CONTROL_TYPE] &= ~ctrlset;
        }
index 857126a36ecc42813e085dd70e236db349d7671f..4877e35ae2028b97fe58b7756b52196c2d44ce8e 100644 (file)
                                OSC_PCI_EXPRESS_CAP_STRUCTURE_CONTROL)
 
 #ifdef CONFIG_ACPI
-extern acpi_status pci_osc_control_set(u32 flags);
+extern acpi_status pci_osc_control_set(acpi_handle handle, u32 flags);
 extern acpi_status pci_osc_support_set(u32 flags);
 #else
 #if !defined(acpi_status)
 typedef u32            acpi_status;
 #define AE_ERROR       (acpi_status) (0x0001)
 #endif    
-static inline acpi_status pci_osc_control_set(u32 flags) {return AE_ERROR;}
+static inline acpi_status pci_osc_control_set(acpi_handle handle, u32 flags)
+{return AE_ERROR;}
 static inline acpi_status pci_osc_support_set(u32 flags) {return AE_ERROR;} 
 #endif