diff --git a/drivers/ata/libata-acpi.c b/drivers/ata/libata-acpi.c index 6273d98..e76283a 100644 --- a/drivers/ata/libata-acpi.c +++ b/drivers/ata/libata-acpi.c @@ -114,23 +114,6 @@ static void ata_acpi_associate_ide_port(struct ata_port *ap) ap->pflags |= ATA_PFLAG_INIT_GTM_VALID; } -/* @ap and @dev are the same as ata_acpi_handle_hotplug() */ -static void ata_acpi_detach_device(struct ata_port *ap, struct ata_device *dev) -{ - if (dev) - dev->flags |= ATA_DFLAG_DETACH; - else { - struct ata_link *tlink; - struct ata_device *tdev; - - ata_for_each_link(tlink, ap, EDGE) - ata_for_each_dev(tdev, tlink, ALL) - tdev->flags |= ATA_DFLAG_DETACH; - } - - ata_port_schedule_eh(ap); -} - /** * ata_acpi_handle_hotplug - ACPI event handler backend * @ap: ATA port ACPI event occurred @@ -151,10 +134,11 @@ static void ata_acpi_detach_device(struct ata_port *ap, struct ata_device *dev) static void ata_acpi_handle_hotplug(struct ata_port *ap, struct ata_device *dev, u32 event) { - struct ata_eh_info *ehi = &ap->link.eh_info; int wait = 0; unsigned long flags; acpi_handle handle; + struct ata_link *tlink; + struct ata_device *tdev; if (dev) handle = dev->acpi_handle; @@ -170,15 +154,27 @@ static void ata_acpi_handle_hotplug(struct ata_port *ap, struct ata_device *dev, switch (event) { case ACPI_NOTIFY_BUS_CHECK: case ACPI_NOTIFY_DEVICE_CHECK: - ata_ehi_push_desc(ehi, "ACPI event"); - - ata_ehi_hotplugged(ehi); - ata_port_freeze(ap); + ata_for_each_link(tlink, ap, EDGE) { + ata_ehi_push_desc(&tlink->eh_info, "ACPI check"); + ata_ehi_hotplugged(&tlink->eh_info); + } + ata_port_schedule_eh(ap); break; - case ACPI_NOTIFY_EJECT_REQUEST: - ata_ehi_push_desc(ehi, "ACPI event"); - ata_acpi_detach_device(ap, dev); + case ACPI_NOTIFY_EJECT_REQUEST: + if (dev) { + dev->flags |= ATA_DFLAG_DETACH; + ata_ehi_push_desc(&ap->link.eh_info, "ACPI dev detach"); + } else { + ata_for_each_link(tlink, ap, EDGE) { + ata_for_each_dev(tdev, tlink, ALL) + tdev->flags |= ATA_DFLAG_DETACH; + tlink->flags |= ATA_FLAG_DISABLED; + ata_ehi_push_desc(&tlink->eh_info, + "ACPI bus detach"); + } + } + ata_port_schedule_eh(ap); wait = 1; break; }