diff options
author | Rafael J. Wysocki <rafael.j.wysocki@intel.com> | 2014-02-03 18:44:02 -0500 |
---|---|---|
committer | Rafael J. Wysocki <rafael.j.wysocki@intel.com> | 2014-02-06 11:31:51 -0500 |
commit | dd2151be28b9ed734fc5738ac675ed7e234847e3 (patch) | |
tree | 0c043735bcd94594003c454d033852e62b4b9719 /drivers/acpi/scan.c | |
parent | 3c2cc7ff9e2522e42468f8e81a7277be386c5ec4 (diff) |
ACPI / hotplug / PCI: Rework the handling of eject requests
To avoid the need to install a hotplug notify handler for each ACPI
namespace node representing a device and having a matching scan
handler, move the check whether or not the ejection of the given
device is enabled through its scan handler from acpi_hotplug_notify_cb()
to acpi_generic_hotplug_event(). Also, move the execution of
ACPI_OST_SC_EJECT_IN_PROGRESS _OST to acpi_generic_hotplug_event(),
because in acpi_hotplug_notify_cb() or in acpi_eject_store() we really
don't know whether or not the eject is going to be in progress (for
example, acpi_hotplug_execute() may still fail without queuing up the
work item).
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Tested-by: Mika Westerberg <mika.westerberg@linux.intel.com>
Diffstat (limited to 'drivers/acpi/scan.c')
-rw-r--r-- | drivers/acpi/scan.c | 20 |
1 files changed, 10 insertions, 10 deletions
diff --git a/drivers/acpi/scan.c b/drivers/acpi/scan.c index 984eaff235df..a3f5d6eabe46 100644 --- a/drivers/acpi/scan.c +++ b/drivers/acpi/scan.c | |||
@@ -459,6 +459,12 @@ static int acpi_generic_hotplug_event(struct acpi_device *adev, u32 type) | |||
459 | return acpi_scan_device_check(adev); | 459 | return acpi_scan_device_check(adev); |
460 | case ACPI_NOTIFY_EJECT_REQUEST: | 460 | case ACPI_NOTIFY_EJECT_REQUEST: |
461 | case ACPI_OST_EC_OSPM_EJECT: | 461 | case ACPI_OST_EC_OSPM_EJECT: |
462 | if (adev->handler && !adev->handler->hotplug.enabled) { | ||
463 | dev_info(&adev->dev, "Eject disabled\n"); | ||
464 | return -EPERM; | ||
465 | } | ||
466 | acpi_evaluate_hotplug_ost(adev->handle, ACPI_NOTIFY_EJECT_REQUEST, | ||
467 | ACPI_OST_SC_EJECT_IN_PROGRESS, NULL); | ||
462 | return acpi_scan_hot_remove(adev); | 468 | return acpi_scan_hot_remove(adev); |
463 | } | 469 | } |
464 | return -EINVAL; | 470 | return -EINVAL; |
@@ -483,6 +489,10 @@ static void acpi_device_hotplug(void *data, u32 src) | |||
483 | 489 | ||
484 | if (adev->flags.hotplug_notify) { | 490 | if (adev->flags.hotplug_notify) { |
485 | error = acpi_generic_hotplug_event(adev, src); | 491 | error = acpi_generic_hotplug_event(adev, src); |
492 | if (error == -EPERM) { | ||
493 | ost_code = ACPI_OST_SC_EJECT_NOT_SUPPORTED; | ||
494 | goto err_out; | ||
495 | } | ||
486 | } else { | 496 | } else { |
487 | int (*event)(struct acpi_device *, u32); | 497 | int (*event)(struct acpi_device *, u32); |
488 | 498 | ||
@@ -512,7 +522,6 @@ static void acpi_device_hotplug(void *data, u32 src) | |||
512 | 522 | ||
513 | static void acpi_hotplug_notify_cb(acpi_handle handle, u32 type, void *data) | 523 | static void acpi_hotplug_notify_cb(acpi_handle handle, u32 type, void *data) |
514 | { | 524 | { |
515 | struct acpi_scan_handler *handler = data; | ||
516 | u32 ost_code = ACPI_OST_SC_SUCCESS; | 525 | u32 ost_code = ACPI_OST_SC_SUCCESS; |
517 | struct acpi_device *adev; | 526 | struct acpi_device *adev; |
518 | acpi_status status; | 527 | acpi_status status; |
@@ -528,13 +537,6 @@ static void acpi_hotplug_notify_cb(acpi_handle handle, u32 type, void *data) | |||
528 | 537 | ||
529 | case ACPI_NOTIFY_EJECT_REQUEST: | 538 | case ACPI_NOTIFY_EJECT_REQUEST: |
530 | acpi_handle_debug(handle, "ACPI_NOTIFY_EJECT_REQUEST event\n"); | 539 | acpi_handle_debug(handle, "ACPI_NOTIFY_EJECT_REQUEST event\n"); |
531 | if (handler && !handler->hotplug.enabled) { | ||
532 | acpi_handle_err(handle, "Eject disabled\n"); | ||
533 | ost_code = ACPI_OST_SC_EJECT_NOT_SUPPORTED; | ||
534 | goto out; | ||
535 | } | ||
536 | acpi_evaluate_hotplug_ost(handle, ACPI_NOTIFY_EJECT_REQUEST, | ||
537 | ACPI_OST_SC_EJECT_IN_PROGRESS, NULL); | ||
538 | break; | 540 | break; |
539 | 541 | ||
540 | case ACPI_NOTIFY_DEVICE_WAKE: | 542 | case ACPI_NOTIFY_DEVICE_WAKE: |
@@ -632,8 +634,6 @@ acpi_eject_store(struct device *d, struct device_attribute *attr, | |||
632 | if (ACPI_FAILURE(status) || !acpi_device->flags.ejectable) | 634 | if (ACPI_FAILURE(status) || !acpi_device->flags.ejectable) |
633 | return -ENODEV; | 635 | return -ENODEV; |
634 | 636 | ||
635 | acpi_evaluate_hotplug_ost(acpi_device->handle, ACPI_OST_EC_OSPM_EJECT, | ||
636 | ACPI_OST_SC_EJECT_IN_PROGRESS, NULL); | ||
637 | get_device(&acpi_device->dev); | 637 | get_device(&acpi_device->dev); |
638 | status = acpi_hotplug_execute(acpi_device_hotplug, acpi_device, | 638 | status = acpi_hotplug_execute(acpi_device_hotplug, acpi_device, |
639 | ACPI_OST_EC_OSPM_EJECT); | 639 | ACPI_OST_EC_OSPM_EJECT); |