mirror of https://gitee.com/openkylin/linux.git
ACPI: Add _OST support for ACPI container hotplug
Changed container_notify_cb() to call ACPI _OST method when ACPI container hotplug operation has completed. Slightly restructured the code with the same logic. The function sets eject_pending bit for an eject request since it does not initiate hot-remove operation. This bit is checked by the sysfs eject handler to determine if the request is originated from an ACPI eject notification. Signed-off-by: Toshi Kani <toshi.kani@hp.com> Signed-off-by: Len Brown <len.brown@intel.com>
This commit is contained in:
parent
b1f00de66f
commit
0c67dc242c
|
@ -158,9 +158,7 @@ static void container_notify_cb(acpi_handle handle, u32 type, void *context)
|
||||||
int result;
|
int result;
|
||||||
int present;
|
int present;
|
||||||
acpi_status status;
|
acpi_status status;
|
||||||
|
u32 ost_code = ACPI_OST_SC_NON_SPECIFIC_FAILURE; /* default */
|
||||||
|
|
||||||
present = is_device_present(handle);
|
|
||||||
|
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case ACPI_NOTIFY_BUS_CHECK:
|
case ACPI_NOTIFY_BUS_CHECK:
|
||||||
|
@ -169,32 +167,47 @@ static void container_notify_cb(acpi_handle handle, u32 type, void *context)
|
||||||
printk(KERN_WARNING "Container driver received %s event\n",
|
printk(KERN_WARNING "Container driver received %s event\n",
|
||||||
(type == ACPI_NOTIFY_BUS_CHECK) ?
|
(type == ACPI_NOTIFY_BUS_CHECK) ?
|
||||||
"ACPI_NOTIFY_BUS_CHECK" : "ACPI_NOTIFY_DEVICE_CHECK");
|
"ACPI_NOTIFY_BUS_CHECK" : "ACPI_NOTIFY_DEVICE_CHECK");
|
||||||
|
|
||||||
|
present = is_device_present(handle);
|
||||||
status = acpi_bus_get_device(handle, &device);
|
status = acpi_bus_get_device(handle, &device);
|
||||||
if (present) {
|
if (!present) {
|
||||||
if (ACPI_FAILURE(status) || !device) {
|
|
||||||
result = container_device_add(&device, handle);
|
|
||||||
if (!result)
|
|
||||||
kobject_uevent(&device->dev.kobj,
|
|
||||||
KOBJ_ONLINE);
|
|
||||||
else
|
|
||||||
printk(KERN_WARNING
|
|
||||||
"Failed to add container\n");
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (ACPI_SUCCESS(status)) {
|
if (ACPI_SUCCESS(status)) {
|
||||||
/* device exist and this is a remove request */
|
/* device exist and this is a remove request */
|
||||||
|
device->flags.eject_pending = 1;
|
||||||
kobject_uevent(&device->dev.kobj, KOBJ_OFFLINE);
|
kobject_uevent(&device->dev.kobj, KOBJ_OFFLINE);
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!ACPI_FAILURE(status) || device)
|
||||||
|
break;
|
||||||
|
|
||||||
|
result = container_device_add(&device, handle);
|
||||||
|
if (result) {
|
||||||
|
printk(KERN_WARNING "Failed to add container\n");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
kobject_uevent(&device->dev.kobj, KOBJ_ONLINE);
|
||||||
|
ost_code = ACPI_OST_SC_SUCCESS;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case ACPI_NOTIFY_EJECT_REQUEST:
|
case ACPI_NOTIFY_EJECT_REQUEST:
|
||||||
if (!acpi_bus_get_device(handle, &device) && device) {
|
if (!acpi_bus_get_device(handle, &device) && device) {
|
||||||
|
device->flags.eject_pending = 1;
|
||||||
kobject_uevent(&device->dev.kobj, KOBJ_OFFLINE);
|
kobject_uevent(&device->dev.kobj, KOBJ_OFFLINE);
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
break;
|
/* non-hotplug event; possibly handled by other handler */
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Inform firmware that the hotplug operation has completed */
|
||||||
|
(void) acpi_evaluate_hotplug_ost(handle, type, ost_code, NULL);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue