diff options
| -rw-r--r-- | drivers/acpi/container.c | 43 |
1 files changed, 28 insertions, 15 deletions
diff --git a/drivers/acpi/container.c b/drivers/acpi/container.c index 45cd03b4630e..1f9f7d7d7bc5 100644 --- a/drivers/acpi/container.c +++ b/drivers/acpi/container.c | |||
| @@ -158,9 +158,7 @@ static void container_notify_cb(acpi_handle handle, u32 type, void *context) | |||
| 158 | int result; | 158 | int result; |
| 159 | int present; | 159 | int present; |
| 160 | acpi_status status; | 160 | acpi_status status; |
| 161 | 161 | u32 ost_code = ACPI_OST_SC_NON_SPECIFIC_FAILURE; /* default */ | |
| 162 | |||
| 163 | present = is_device_present(handle); | ||
| 164 | 162 | ||
| 165 | switch (type) { | 163 | switch (type) { |
| 166 | case ACPI_NOTIFY_BUS_CHECK: | 164 | case ACPI_NOTIFY_BUS_CHECK: |
| @@ -169,32 +167,47 @@ static void container_notify_cb(acpi_handle handle, u32 type, void *context) | |||
| 169 | printk(KERN_WARNING "Container driver received %s event\n", | 167 | printk(KERN_WARNING "Container driver received %s event\n", |
| 170 | (type == ACPI_NOTIFY_BUS_CHECK) ? | 168 | (type == ACPI_NOTIFY_BUS_CHECK) ? |
| 171 | "ACPI_NOTIFY_BUS_CHECK" : "ACPI_NOTIFY_DEVICE_CHECK"); | 169 | "ACPI_NOTIFY_BUS_CHECK" : "ACPI_NOTIFY_DEVICE_CHECK"); |
| 170 | |||
| 171 | present = is_device_present(handle); | ||
| 172 | status = acpi_bus_get_device(handle, &device); | 172 | status = acpi_bus_get_device(handle, &device); |
| 173 | if (present) { | 173 | if (!present) { |
| 174 | if (ACPI_FAILURE(status) || !device) { | ||
| 175 | result = container_device_add(&device, handle); | ||
| 176 | if (!result) | ||
| 177 | kobject_uevent(&device->dev.kobj, | ||
| 178 | KOBJ_ONLINE); | ||
| 179 | else | ||
| 180 | printk(KERN_WARNING | ||
| 181 | "Failed to add container\n"); | ||
| 182 | } | ||
| 183 | } else { | ||
| 184 | if (ACPI_SUCCESS(status)) { | 174 | if (ACPI_SUCCESS(status)) { |
| 185 | /* device exist and this is a remove request */ | 175 | /* device exist and this is a remove request */ |
| 176 | device->flags.eject_pending = 1; | ||
| 186 | kobject_uevent(&device->dev.kobj, KOBJ_OFFLINE); | 177 | kobject_uevent(&device->dev.kobj, KOBJ_OFFLINE); |
| 178 | return; | ||
| 187 | } | 179 | } |
| 180 | break; | ||
| 181 | } | ||
| 182 | |||
| 183 | if (!ACPI_FAILURE(status) || device) | ||
| 184 | break; | ||
| 185 | |||
| 186 | result = container_device_add(&device, handle); | ||
| 187 | if (result) { | ||
| 188 | printk(KERN_WARNING "Failed to add container\n"); | ||
| 189 | break; | ||
| 188 | } | 190 | } |
| 191 | |||
| 192 | kobject_uevent(&device->dev.kobj, KOBJ_ONLINE); | ||
| 193 | ost_code = ACPI_OST_SC_SUCCESS; | ||
| 189 | break; | 194 | break; |
| 195 | |||
| 190 | case ACPI_NOTIFY_EJECT_REQUEST: | 196 | case ACPI_NOTIFY_EJECT_REQUEST: |
| 191 | if (!acpi_bus_get_device(handle, &device) && device) { | 197 | if (!acpi_bus_get_device(handle, &device) && device) { |
| 198 | device->flags.eject_pending = 1; | ||
| 192 | kobject_uevent(&device->dev.kobj, KOBJ_OFFLINE); | 199 | kobject_uevent(&device->dev.kobj, KOBJ_OFFLINE); |
| 200 | return; | ||
| 193 | } | 201 | } |
| 194 | break; | 202 | break; |
| 203 | |||
| 195 | default: | 204 | default: |
| 196 | break; | 205 | /* non-hotplug event; possibly handled by other handler */ |
| 206 | return; | ||
| 197 | } | 207 | } |
| 208 | |||
| 209 | /* Inform firmware that the hotplug operation has completed */ | ||
| 210 | (void) acpi_evaluate_hotplug_ost(handle, type, ost_code, NULL); | ||
| 198 | return; | 211 | return; |
| 199 | } | 212 | } |
| 200 | 213 | ||
