ACPI: Add _OST support for ACPI memory hotplug
authorToshi Kani <toshi.kani@hp.com>
Thu, 24 May 2012 02:25:22 +0000 (20:25 -0600)
committerLen Brown <len.brown@intel.com>
Mon, 4 Jun 2012 05:09:21 +0000 (01:09 -0400)
Changed acpi_memory_device_notify() to call ACPI _OST method
when ACPI memory hotplug operation has completed.

Signed-off-by: Toshi Kani <toshi.kani@hp.com>
Signed-off-by: Len Brown <len.brown@intel.com>
drivers/acpi/acpi_memhotplug.c

index d98571385656154b8ef39664852e808397846a11..24c807f966365e78972cd824c292a9bb944d79e8 100644 (file)
@@ -341,7 +341,7 @@ static void acpi_memory_device_notify(acpi_handle handle, u32 event, void *data)
 {
        struct acpi_memory_device *mem_device;
        struct acpi_device *device;
-
+       u32 ost_code = ACPI_OST_SC_NON_SPECIFIC_FAILURE; /* default */
 
        switch (event) {
        case ACPI_NOTIFY_BUS_CHECK:
@@ -354,15 +354,20 @@ static void acpi_memory_device_notify(acpi_handle handle, u32 event, void *data)
                                          "\nReceived DEVICE CHECK notification for device\n"));
                if (acpi_memory_get_device(handle, &mem_device)) {
                        printk(KERN_ERR PREFIX "Cannot find driver data\n");
-                       return;
+                       break;
                }
 
-               if (!acpi_memory_check_device(mem_device)) {
-                       if (acpi_memory_enable_device(mem_device))
-                               printk(KERN_ERR PREFIX
-                                           "Cannot enable memory device\n");
+               if (acpi_memory_check_device(mem_device))
+                       break;
+
+               if (acpi_memory_enable_device(mem_device)) {
+                       printk(KERN_ERR PREFIX "Cannot enable memory device\n");
+                       break;
                }
+
+               ost_code = ACPI_OST_SC_SUCCESS;
                break;
+
        case ACPI_NOTIFY_EJECT_REQUEST:
                ACPI_DEBUG_PRINT((ACPI_DB_INFO,
                                  "\nReceived EJECT REQUEST notification for device\n"));
@@ -383,19 +388,35 @@ static void acpi_memory_device_notify(acpi_handle handle, u32 event, void *data)
                 * TBD: Can also be disabled by Callback registration
                 *      with generic sysfs driver
                 */
-               if (acpi_memory_disable_device(mem_device))
-                       printk(KERN_ERR PREFIX
-                                   "Disable memory device\n");
+               if (acpi_memory_disable_device(mem_device)) {
+                       printk(KERN_ERR PREFIX "Disable memory device\n");
+                       /*
+                        * If _EJ0 was called but failed, _OST is not
+                        * necessary.
+                        */
+                       if (mem_device->state == MEMORY_INVALID_STATE)
+                               return;
+
+                       break;
+               }
+
                /*
                 * TBD: Invoke acpi_bus_remove to cleanup data structures
                 */
-               break;
+
+               /* _EJ0 succeeded; _OST is not necessary */
+               return;
+
        default:
                ACPI_DEBUG_PRINT((ACPI_DB_INFO,
                                  "Unsupported event [0x%x]\n", event));
-               break;
+
+               /* non-hotplug event; possibly handled by other handler */
+               return;
        }
 
+       /* Inform firmware that the hotplug operation has completed */
+       (void) acpi_evaluate_hotplug_ost(handle, event, ost_code, NULL);
        return;
 }