diff -aur linux-2.6.11.7/drivers/acpi/bus.c linux-2.6.11-x/drivers/acpi/bus.c --- linux-2.6.11.7/drivers/acpi/bus.c 2005-04-07 20:57:44.000000000 +0200 +++ linux-2.6.11-x/drivers/acpi/bus.c 2005-03-29 12:21:10.000000000 +0200 @@ -53,11 +53,56 @@ #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 @@ Notification Handling -------------------------------------------------------------------------- */ + static int acpi_bus_check_device ( struct acpi_device *device, diff -aur linux-2.6.11.7/drivers/acpi/scan.c linux-2.6.11-x/drivers/acpi/scan.c --- linux-2.6.11.7/drivers/acpi/scan.c 2005-04-07 20:57:34.000000000 +0200 +++ linux-2.6.11-x/drivers/acpi/scan.c 2005-03-26 17:28:56.000000000 +0100 @@ -543,7 +543,7 @@ 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); @@ -1023,7 +1023,7 @@ 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; } diff -aur linux-2.6.11.7/include/acpi/acpi_bus.h linux-2.6.11-x/include/acpi/acpi_bus.h --- linux-2.6.11.7/include/acpi/acpi_bus.h 2005-04-07 20:58:46.000000000 +0200 +++ linux-2.6.11-x/include/acpi/acpi_bus.h 2005-03-29 12:17:56.000000000 +0200 @@ -331,6 +331,7 @@ int acpi_bus_trim(struct acpi_device *start, int rmdevice); 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);