ACPI: Verify device status after eject
authorToshi Kani <toshi.kani@hp.com>
Wed, 13 Mar 2013 19:29:26 +0000 (19:29 +0000)
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>
Sun, 24 Mar 2013 23:18:43 +0000 (00:18 +0100)
ACPI spec states that the OS evaluates _STA after calling _EJ0
in order to verify if eject was successful.  Added a check to
verify if the enabled bit of the status value is cleared after
_EJ0.

Note, the present bit is not checked since some FW implementations
do not clear the present bit until the hardware is physically
removed.

Signed-off-by: Toshi Kani <toshi.kani@hp.com>
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
drivers/acpi/scan.c

index dfdbcfdd9defeee44e805e2cc7c30a0553ff696d..8cacc16af6e7e48539389637447fbaf0ac4b566b 100644 (file)
@@ -127,6 +127,7 @@ static int acpi_scan_hot_remove(struct acpi_device *device)
        struct acpi_object_list arg_list;
        union acpi_object arg;
        acpi_status status;
+       unsigned long long sta;
 
        /* If there is no handle, the device node has been unregistered. */
        if (!handle) {
@@ -164,10 +165,25 @@ static int acpi_scan_hot_remove(struct acpi_device *device)
                if (status == AE_NOT_FOUND) {
                        return -ENODEV;
                } else {
-                       acpi_handle_warn(handle, "Eject failed\n");
+                       acpi_handle_warn(handle, "Eject failed (0x%x)\n",
+                                                               status);
                        return -EIO;
                }
        }
+
+       /*
+        * Verify if eject was indeed successful.  If not, log an error
+        * message.  No need to call _OST since _EJ0 call was made OK.
+        */
+       status = acpi_evaluate_integer(handle, "_STA", NULL, &sta);
+       if (ACPI_FAILURE(status)) {
+               acpi_handle_warn(handle,
+                       "Status check after eject failed (0x%x)\n", status);
+       } else if (sta & ACPI_STA_DEVICE_ENABLED) {
+               acpi_handle_warn(handle,
+                       "Eject incomplete - status 0x%llx\n", sta);
+       }
+
        return 0;
 }