diff options
| author | Rafael J. Wysocki <rafael.j.wysocki@intel.com> | 2013-11-13 18:54:08 -0500 |
|---|---|---|
| committer | Rafael J. Wysocki <rafael.j.wysocki@intel.com> | 2013-11-18 19:02:52 -0500 |
| commit | c1beb0bdb5b3ef670af3ab946434f7fc55d4c7a3 (patch) | |
| tree | f1bda108b6295b382a3b12552307bad2690ca17e /drivers | |
| parent | 5beaee4f195d0297473da9a45459050b561e10cf (diff) | |
ACPI / hotplug: Fix PCI host bridge hot removal
Since the PCI host bridge scan handler does not set hotplug.enabled,
the check of it in acpi_bus_device_eject() effectively prevents the
root bridge hot removal from working after commit a3b1b1ef78cd
(ACPI / hotplug: Merge device hot-removal routines). However, that
check is not necessary, because the other acpi_bus_device_eject()
users, acpi_hotplug_notify_cb and acpi_eject_store(), do the same
check by themselves before executing that function.
For this reason, remove the scan handler check from
acpi_bus_device_eject() to make PCI hot bridge hot removal work
again.
Fixes: a3b1b1ef78cd (ACPI / hotplug: Merge device hot-removal routines)
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
Acked-by: Toshi Kani <toshi.kani@hp.com>
Diffstat (limited to 'drivers')
| -rw-r--r-- | drivers/acpi/scan.c | 9 |
1 files changed, 1 insertions, 8 deletions
diff --git a/drivers/acpi/scan.c b/drivers/acpi/scan.c index 4698060ba3f0..821d154221d5 100644 --- a/drivers/acpi/scan.c +++ b/drivers/acpi/scan.c | |||
| @@ -289,24 +289,17 @@ void acpi_bus_device_eject(void *data, u32 ost_src) | |||
| 289 | { | 289 | { |
| 290 | struct acpi_device *device = data; | 290 | struct acpi_device *device = data; |
| 291 | acpi_handle handle = device->handle; | 291 | acpi_handle handle = device->handle; |
| 292 | struct acpi_scan_handler *handler; | ||
| 293 | u32 ost_code = ACPI_OST_SC_NON_SPECIFIC_FAILURE; | 292 | u32 ost_code = ACPI_OST_SC_NON_SPECIFIC_FAILURE; |
| 294 | int error; | 293 | int error; |
| 295 | 294 | ||
| 296 | lock_device_hotplug(); | 295 | lock_device_hotplug(); |
| 297 | mutex_lock(&acpi_scan_lock); | 296 | mutex_lock(&acpi_scan_lock); |
| 298 | 297 | ||
| 299 | handler = device->handler; | ||
| 300 | if (!handler || !handler->hotplug.enabled) { | ||
| 301 | put_device(&device->dev); | ||
| 302 | goto err_support; | ||
| 303 | } | ||
| 304 | |||
| 305 | if (ost_src == ACPI_NOTIFY_EJECT_REQUEST) | 298 | if (ost_src == ACPI_NOTIFY_EJECT_REQUEST) |
| 306 | acpi_evaluate_hotplug_ost(handle, ACPI_NOTIFY_EJECT_REQUEST, | 299 | acpi_evaluate_hotplug_ost(handle, ACPI_NOTIFY_EJECT_REQUEST, |
| 307 | ACPI_OST_SC_EJECT_IN_PROGRESS, NULL); | 300 | ACPI_OST_SC_EJECT_IN_PROGRESS, NULL); |
| 308 | 301 | ||
| 309 | if (handler->hotplug.mode == AHM_CONTAINER) | 302 | if (device->handler && device->handler->hotplug.mode == AHM_CONTAINER) |
| 310 | kobject_uevent(&device->dev.kobj, KOBJ_OFFLINE); | 303 | kobject_uevent(&device->dev.kobj, KOBJ_OFFLINE); |
| 311 | 304 | ||
| 312 | error = acpi_scan_hot_remove(device); | 305 | error = acpi_scan_hot_remove(device); |
