PCI: hotplug: acpiphp: fix slot poweroff problem on systems without _PS3
authorGary Hade <garyhade@us.ibm.com>
Thu, 5 Jul 2007 18:10:46 +0000 (11:10 -0700)
committerGreg Kroah-Hartman <gregkh@suse.de>
Wed, 11 Jul 2007 23:02:12 +0000 (16:02 -0700)
On systems where the optional _PS3 ACPI object is not implemented
acpiphp fails to power off the slot.  This is happening because the
current code does not attempt to remove power using the _EJ0 ACPI
object.  This patch restores the _EJ0 evaluation attempt which was
apparently inadvertently removed from the power-off sequence when the
_EJ0 evaluation code was relocated from power_off_slot() to
acpiphp_eject_slot().

Signed-off-by: Gary Hade <garyhade@us.ibm.com>
Cc: <lcm@us.ibm.com>
Signed-off-by: Kristen Carlson Accardi <kristen.c.accardi@intel.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
drivers/pci/hotplug/acpiphp.h
drivers/pci/hotplug/acpiphp_core.c
drivers/pci/hotplug/acpiphp_glue.c

index ddbadd95387ece7340617aae7ffcfbfb9843cca1..f6cc0c5b56572715425a7a535f2c2444c25a0ca6 100644 (file)
@@ -211,6 +211,7 @@ typedef int (*acpiphp_callback)(struct acpiphp_slot *slot, void *data);
 
 extern int acpiphp_enable_slot (struct acpiphp_slot *slot);
 extern int acpiphp_disable_slot (struct acpiphp_slot *slot);
+extern int acpiphp_eject_slot (struct acpiphp_slot *slot);
 extern u8 acpiphp_get_power_status (struct acpiphp_slot *slot);
 extern u8 acpiphp_get_attention_status (struct acpiphp_slot *slot);
 extern u8 acpiphp_get_latch_status (struct acpiphp_slot *slot);
index fa5c0197d571c81325ace3d08d2e6c7246fa74a9..a0ca63adad5ac41c3df29fc7171b814d5db4709a 100644 (file)
@@ -156,11 +156,15 @@ static int enable_slot(struct hotplug_slot *hotplug_slot)
 static int disable_slot(struct hotplug_slot *hotplug_slot)
 {
        struct slot *slot = hotplug_slot->private;
+       int retval;
 
        dbg("%s - physical_slot = %s\n", __FUNCTION__, hotplug_slot->name);
 
        /* disable the specified slot */
-       return acpiphp_disable_slot(slot->acpi_slot);
+       retval = acpiphp_disable_slot(slot->acpi_slot);
+       if (!retval)
+               retval = acpiphp_eject_slot(slot->acpi_slot);
+       return retval;
 }
 
 
index 9ef4e989afc43b0fc70153258ebb91821aaff82a..3cc5a821f9c53608c8a807b0349dae62724a1b3c 100644 (file)
@@ -1282,7 +1282,7 @@ static unsigned int get_slot_status(struct acpiphp_slot *slot)
 /**
  * acpiphp_eject_slot - physically eject the slot
  */
-static int acpiphp_eject_slot(struct acpiphp_slot *slot)
+int acpiphp_eject_slot(struct acpiphp_slot *slot)
 {
        acpi_status status;
        struct acpiphp_func *func;