|
@@ -156,8 +156,10 @@ static void ata_acpi_handle_hotplug(struct ata_port *ap, struct ata_device *dev,
|
|
|
|
|
|
spin_unlock_irqrestore(ap->lock, flags);
|
|
|
|
|
|
- if (wait)
|
|
|
+ if (wait) {
|
|
|
ata_port_wait_eh(ap);
|
|
|
+ flush_work(&ap->hotplug_task.work);
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
static void ata_acpi_dev_notify_dock(acpi_handle handle, u32 event, void *data)
|
|
@@ -214,6 +216,39 @@ static const struct acpi_dock_ops ata_acpi_ap_dock_ops = {
|
|
|
.uevent = ata_acpi_ap_uevent,
|
|
|
};
|
|
|
|
|
|
+void ata_acpi_hotplug_init(struct ata_host *host)
|
|
|
+{
|
|
|
+ int i;
|
|
|
+
|
|
|
+ for (i = 0; i < host->n_ports; i++) {
|
|
|
+ struct ata_port *ap = host->ports[i];
|
|
|
+ acpi_handle handle;
|
|
|
+ struct ata_device *dev;
|
|
|
+
|
|
|
+ if (!ap)
|
|
|
+ continue;
|
|
|
+
|
|
|
+ handle = ata_ap_acpi_handle(ap);
|
|
|
+ if (handle) {
|
|
|
+ /* we might be on a docking station */
|
|
|
+ register_hotplug_dock_device(handle,
|
|
|
+ &ata_acpi_ap_dock_ops, ap,
|
|
|
+ NULL, NULL);
|
|
|
+ }
|
|
|
+
|
|
|
+ ata_for_each_dev(dev, &ap->link, ALL) {
|
|
|
+ handle = ata_dev_acpi_handle(dev);
|
|
|
+ if (!handle)
|
|
|
+ continue;
|
|
|
+
|
|
|
+ /* we might be on a docking station */
|
|
|
+ register_hotplug_dock_device(handle,
|
|
|
+ &ata_acpi_dev_dock_ops,
|
|
|
+ dev, NULL, NULL);
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
/**
|
|
|
* ata_acpi_dissociate - dissociate ATA host from ACPI objects
|
|
|
* @host: target ATA host
|