--- l2.6.12.2-o/drivers/acpi/bus.c 2005-06-30 01:00:53.000000000 +0200 +++ linux-2.6.12/drivers/acpi/bus.c 2005-03-29 12:21:10.000000000 +0200 @@ -53,11 +53,56 @@ EXPORT_SYMBOL(acpi_root_dir); #define STRUCT_TO_INT(s) (*((int*)&s)) +static int +acpi_bus_check_device ( + struct acpi_device *device, + int *status_changed); + /* -------------------------------------------------------------------------- Device Management -------------------------------------------------------------------------- */ int +acpi_bus_eject_device ( + struct acpi_device *device) +{ + acpi_status status = 0; + union acpi_object arg = {ACPI_TYPE_INTEGER}; + struct acpi_object_list arg_list = {1, &arg}; + + ACPI_FUNCTION_TRACE("acpi_bus_eject_device"); + + if (!device) + return_VALUE(-EINVAL); + + /* + * Make sure this device's parent is present before we go about + * messing with the device. + */ + if (device->parent && !device->parent->status.present) { + return_VALUE(0); + } + + status = acpi_bus_get_status(device); + if (ACPI_FAILURE(status)) + return_VALUE(-ENODEV); + + arg.integer.value = 1; + + + status = acpi_evaluate_object(device->handle, "_EJ0", &arg_list, NULL); + if (ACPI_FAILURE(status) && (status != AE_NOT_FOUND)) { + ACPI_DEBUG_PRINT((ACPI_DB_ERROR, "Error evaluating _EJ0\n")); + return_VALUE(-ENODEV); + } + + acpi_bus_check_device(device, NULL); + + return_VALUE(0); +} +EXPORT_SYMBOL(acpi_bus_eject_device); + +int acpi_bus_get_device ( acpi_handle handle, struct acpi_device **device) @@ -376,6 +421,7 @@ EXPORT_SYMBOL(acpi_bus_receive_event); Notification Handling -------------------------------------------------------------------------- */ + static int acpi_bus_check_device ( struct acpi_device *device, --- l2.6.12.2-o/drivers/acpi/scan.c 2005-06-30 01:00:53.000000000 +0200 +++ linux-2.6.12/drivers/acpi/scan.c 2005-07-05 00:34:48.000000000 +0200 @@ -580,7 +580,7 @@ static int acpi_driver_attach(struct acp list_for_each_safe(node, next, &acpi_device_list) { struct acpi_device * dev = container_of(node, struct acpi_device, g_list); - if (dev->driver || !dev->status.present) + if (dev->driver /*|| !dev->status.present*/) continue; spin_unlock(&acpi_device_lock); @@ -1060,7 +1060,7 @@ acpi_bus_add ( switch (type) { case ACPI_BUS_TYPE_DEVICE: result = acpi_bus_get_status(device); - if (ACPI_FAILURE(result) || !device->status.present) { + if (ACPI_FAILURE(result) /*|| !device->status.present*/) { result = -ENOENT; goto end; } --- l2.6.12.2-o/include/acpi/acpi_bus.h 2005-06-30 01:00:53.000000000 +0200 +++ linux-2.6.12/include/acpi/acpi_bus.h 2005-07-04 09:41:38.000000000 +0200 @@ -330,6 +330,7 @@ int acpi_bus_unregister_driver (struct a int acpi_bus_scan (struct acpi_device *start); int acpi_bus_add (struct acpi_device **child, struct acpi_device *parent, acpi_handle handle, int type); +int acpi_bus_eject_device (struct acpi_device *device); int acpi_match_ids (struct acpi_device *device, char *ids);