summaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorLee, Chun-Yi <joeyli.kernel@gmail.com>2017-07-03 21:26:10 +0800
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>2017-07-04 21:45:41 +0200
commitd429e5c12269a930b81d8b57b788bbe3cf12e815 (patch)
tree607835ff007b4eb5154b610aaaf8e981e064beed /drivers
parent6f7da290413ba713f0cdd9ff1a2a9bb129ef4f6c (diff)
downloadlinux-stable-d429e5c12269a930b81d8b57b788bbe3cf12e815.tar.gz
linux-stable-d429e5c12269a930b81d8b57b788bbe3cf12e815.tar.bz2
linux-stable-d429e5c12269a930b81d8b57b788bbe3cf12e815.zip
ACPI / scan: Indicate to platform when hot remove returns busy
In hotplug logic, it always indicates non-specific failure to platform through _OST when handing ACPI hot-remove event failed. Then platform terminates the hot-remove process but it can not identify the reason. Base on current hot-remove code, there have two situations that it returns busy: - OSPM try to offline an individual device, but the device offline function returns "busy". - When the ejection event is applied to an "not offlined yet" container. OSPM sends a kobject change event to userspace and returns "busy". Both of them will returns -EBUSY to ACPI device hotplug function. Then, the hotplug function indicates non-specific failure to platform just like for any other error, e.g. -ENODEV or -EIO. The benefit to the platform for identifying the OS "busy" state is that it can use a different approach to handle the "busy" instead of simply terminating the hot-remove operation for an unknown reason. For example, the platform can wait for a while and then re-trigger hot-remove. Signed-off-by: "Lee, Chun-Yi" <jlee@suse.com> Reviewed-by: Andy Shevchenko <andy.shevchenko@gmail.com> [ rjw: Changelog massage ] Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/acpi/scan.c18
1 files changed, 13 insertions, 5 deletions
diff --git a/drivers/acpi/scan.c b/drivers/acpi/scan.c
index d53162997f32..ce8817503262 100644
--- a/drivers/acpi/scan.c
+++ b/drivers/acpi/scan.c
@@ -404,10 +404,6 @@ void acpi_device_hotplug(struct acpi_device *adev, u32 src)
error = dock_notify(adev, src);
} else if (adev->flags.hotplug_notify) {
error = acpi_generic_hotplug_event(adev, src);
- if (error == -EPERM) {
- ost_code = ACPI_OST_SC_EJECT_NOT_SUPPORTED;
- goto err_out;
- }
} else {
int (*notify)(struct acpi_device *, u32);
@@ -423,8 +419,20 @@ void acpi_device_hotplug(struct acpi_device *adev, u32 src)
else
goto out;
}
- if (!error)
+ switch (error) {
+ case 0:
ost_code = ACPI_OST_SC_SUCCESS;
+ break;
+ case -EPERM:
+ ost_code = ACPI_OST_SC_EJECT_NOT_SUPPORTED;
+ break;
+ case -EBUSY:
+ ost_code = ACPI_OST_SC_DEVICE_BUSY;
+ break;
+ default:
+ ost_code = ACPI_OST_SC_NON_SPECIFIC_FAILURE;
+ break;
+ }
err_out:
acpi_evaluate_ost(adev->handle, src, ost_code, NULL);