Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit c1beb0bd authored by Rafael J. Wysocki's avatar Rafael J. Wysocki
Browse files

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 a3b1b1ef
(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: a3b1b1ef (ACPI / hotplug: Merge device hot-removal routines)
Signed-off-by: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
Acked-by: default avatarToshi Kani <toshi.kani@hp.com>
parent 5beaee4f
Loading
Loading
Loading
Loading
+1 −8
Original line number Original line Diff line number Diff line
@@ -289,24 +289,17 @@ void acpi_bus_device_eject(void *data, u32 ost_src)
{
{
	struct acpi_device *device = data;
	struct acpi_device *device = data;
	acpi_handle handle = device->handle;
	acpi_handle handle = device->handle;
	struct acpi_scan_handler *handler;
	u32 ost_code = ACPI_OST_SC_NON_SPECIFIC_FAILURE;
	u32 ost_code = ACPI_OST_SC_NON_SPECIFIC_FAILURE;
	int error;
	int error;


	lock_device_hotplug();
	lock_device_hotplug();
	mutex_lock(&acpi_scan_lock);
	mutex_lock(&acpi_scan_lock);


	handler = device->handler;
	if (!handler || !handler->hotplug.enabled) {
		put_device(&device->dev);
		goto err_support;
	}

	if (ost_src == ACPI_NOTIFY_EJECT_REQUEST)
	if (ost_src == ACPI_NOTIFY_EJECT_REQUEST)
		acpi_evaluate_hotplug_ost(handle, ACPI_NOTIFY_EJECT_REQUEST,
		acpi_evaluate_hotplug_ost(handle, ACPI_NOTIFY_EJECT_REQUEST,
					  ACPI_OST_SC_EJECT_IN_PROGRESS, NULL);
					  ACPI_OST_SC_EJECT_IN_PROGRESS, NULL);


	if (handler->hotplug.mode == AHM_CONTAINER)
	if (device->handler && device->handler->hotplug.mode == AHM_CONTAINER)
		kobject_uevent(&device->dev.kobj, KOBJ_OFFLINE);
		kobject_uevent(&device->dev.kobj, KOBJ_OFFLINE);


	error = acpi_scan_hot_remove(device);
	error = acpi_scan_hot_remove(device);