static void container_notify_cb(acpi_handle handle, u32 type, void *context) { struct acpi_device *device = NULL; int result; int present; acpi_status status; u32 ost_code = ACPI_OST_SC_NON_SPECIFIC_FAILURE; /* default */ switch (type) { case ACPI_NOTIFY_BUS_CHECK: /* Fall through */ case ACPI_NOTIFY_DEVICE_CHECK: printk(KERN_WARNING "Container driver received %s event\n", (type == ACPI_NOTIFY_BUS_CHECK) ? "ACPI_NOTIFY_BUS_CHECK" : "ACPI_NOTIFY_DEVICE_CHECK"); present = is_device_present(handle); status = acpi_bus_get_device(handle, &device); if (!present) { if (ACPI_SUCCESS(status)) { /* device exist and this is a remove request */ device->flags.eject_pending = 1; 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; case ACPI_NOTIFY_EJECT_REQUEST: if (!acpi_bus_get_device(handle, &device) && device) { device->flags.eject_pending = 1; kobject_uevent(&device->dev.kobj, KOBJ_OFFLINE); return; } break; default: /* 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; }
static void container_notify_cb(acpi_handle handle, u32 type, void *context) { struct acpi_device *device = NULL; int result; int present; acpi_status status; present = is_device_present(handle); switch (type) { case ACPI_NOTIFY_BUS_CHECK: /* Fall through */ case ACPI_NOTIFY_DEVICE_CHECK: printk(KERN_WARNING "Container driver received %s event\n", (type == ACPI_NOTIFY_BUS_CHECK) ? "ACPI_NOTIFY_BUS_CHECK" : "ACPI_NOTIFY_DEVICE_CHECK"); status = acpi_bus_get_device(handle, &device); 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)) { /* device exist and this is a remove request */ kobject_uevent(&device->dev.kobj, KOBJ_OFFLINE); } } break; case ACPI_NOTIFY_EJECT_REQUEST: if (!acpi_bus_get_device(handle, &device) && device) { kobject_uevent(&device->dev.kobj, KOBJ_OFFLINE); } break; default: break; } return; }
static void container_notify_cb(acpi_handle handle, u32 type, void *context) { struct acpi_device *device = NULL; int result; int present; acpi_status status; ACPI_FUNCTION_TRACE("container_notify_cb"); present = is_device_present(handle); switch (type) { case ACPI_NOTIFY_BUS_CHECK: /* Fall through */ case ACPI_NOTIFY_DEVICE_CHECK: printk("Container driver received %s event\n", (type == ACPI_NOTIFY_BUS_CHECK)? "ACPI_NOTIFY_BUS_CHECK":"ACPI_NOTIFY_DEVICE_CHECK"); if (present) { status = acpi_bus_get_device(handle, &device); if (ACPI_FAILURE(status) || !device) { result = container_device_add(&device, handle); if (!result) kobject_hotplug(&device->kobj, KOBJ_ONLINE); } else { /* device exist and this is a remove request */ kobject_hotplug(&device->kobj, KOBJ_OFFLINE); } } break; case ACPI_NOTIFY_EJECT_REQUEST: if (!acpi_bus_get_device(handle, &device) && device) { kobject_hotplug(&device->kobj, KOBJ_OFFLINE); } break; default: break; } return_VOID; }