+++ /dev/null
-From: Shaohua Li <shaohua.li@intel.com>
-Subject: libata hotplug to align with dock driver
-Patch-mainline: submitted 2008-08-28
-References: fate#304731,bnc#401740
-
-dock driver can handle ata(bay) hotplug now. dock driver already handles
-_EJ0 and _STA, so remove them. Also libata doesn't need register
-notification handler anymore.
-
-Signed-off-by: Shaohua Li <shaohua.li@intel.com>
-Signed-off-by: Holger Macht <hmacht@suse.de>
----
-
-diff --git a/drivers/acpi/dock.c b/drivers/acpi/dock.c
-index 4b395b1..f19f643 100644
---- a/drivers/acpi/dock.c
-+++ b/drivers/acpi/dock.c
-@@ -738,7 +738,8 @@ static void dock_notify(acpi_handle handle, u32 event, void *data)
- /* Fall back */
- case ACPI_NOTIFY_EJECT_REQUEST:
- begin_undock(ds);
-- if (immediate_undock || surprise_removal)
-+ if ((immediate_undock && !(ds->flags & DOCK_IS_ATA))
-+ || surprise_removal)
- handle_eject_request(ds, event);
- else
- dock_event(ds, event, UNDOCK_EVENT);
-diff --git a/drivers/ata/libata-acpi.c b/drivers/ata/libata-acpi.c
-index 9330b79..97727be 100644
---- a/drivers/ata/libata-acpi.c
-+++ b/drivers/ata/libata-acpi.c
-@@ -120,21 +120,6 @@ static void ata_acpi_associate_ide_port(struct ata_port *ap)
- ap->pflags |= ATA_PFLAG_INIT_GTM_VALID;
- }
-
--static void ata_acpi_eject_device(acpi_handle handle)
--{
-- struct acpi_object_list arg_list;
-- union acpi_object arg;
--
-- arg_list.count = 1;
-- arg_list.pointer = &arg;
-- arg.type = ACPI_TYPE_INTEGER;
-- arg.integer.value = 1;
--
-- if (ACPI_FAILURE(acpi_evaluate_object(handle, "_EJ0",
-- &arg_list, NULL)))
-- printk(KERN_ERR "Failed to evaluate _EJ0!\n");
--}
--
- /* @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)
- {
-@@ -157,7 +142,6 @@ static void ata_acpi_detach_device(struct ata_port *ap, struct ata_device *dev)
- * @ap: ATA port ACPI event occurred
- * @dev: ATA device ACPI event occurred (can be NULL)
- * @event: ACPI event which occurred
-- * @is_dock_event: boolean indicating whether the event was a dock one
- *
- * All ACPI bay / device realted events end up in this function. If
- * the event is port-wide @dev is NULL. If the event is specific to a
-@@ -171,115 +155,58 @@ static void ata_acpi_detach_device(struct ata_port *ap, struct ata_device *dev)
- * ACPI notify handler context. May sleep.
- */
- static void ata_acpi_handle_hotplug(struct ata_port *ap, struct ata_device *dev,
-- u32 event, int is_dock_event)
-+ u32 event)
- {
-- char event_string[12];
-- char *envp[] = { event_string, NULL };
- struct ata_eh_info *ehi = &ap->link.eh_info;
-- struct kobject *kobj = NULL;
- int wait = 0;
- unsigned long flags;
-- acpi_handle handle, tmphandle;
-- unsigned long long sta;
-- acpi_status status;
-+ acpi_handle handle;
-
-- if (dev) {
-- if (dev->sdev)
-- kobj = &dev->sdev->sdev_gendev.kobj;
-+ if (dev)
- handle = dev->acpi_handle;
-- } else {
-- kobj = &ap->dev->kobj;
-+ else
- handle = ap->acpi_handle;
-- }
--
-- status = acpi_get_handle(handle, "_EJ0", &tmphandle);
-- if (ACPI_FAILURE(status))
-- /* This device does not support hotplug */
-- return;
--
-- if (event == ACPI_NOTIFY_BUS_CHECK ||
-- event == ACPI_NOTIFY_DEVICE_CHECK)
-- status = acpi_evaluate_integer(handle, "_STA", NULL, &sta);
-
- spin_lock_irqsave(ap->lock, flags);
--
-+ /*
-+ * When dock driver calls into the routine, it will always use
-+ * ACPI_NOTIFY_BUS_CHECK/ACPI_NOTIFY_DEVICE_CHECK for add and
-+ * ACPI_NOTIFY_EJECT_REQUEST for remove
-+ */
- switch (event) {
- case ACPI_NOTIFY_BUS_CHECK:
- case ACPI_NOTIFY_DEVICE_CHECK:
- ata_ehi_push_desc(ehi, "ACPI event");
-
-- if (ACPI_FAILURE(status)) {
-- ata_port_printk(ap, KERN_ERR,
-- "acpi: failed to determine bay status (0x%x)\n",
-- status);
-- break;
-- }
--
-- if (sta) {
-- ata_ehi_hotplugged(ehi);
-- ata_port_freeze(ap);
-- } else {
-- /* The device has gone - unplug it */
-- ata_acpi_detach_device(ap, dev);
-- wait = 1;
-- }
-+ ata_ehi_hotplugged(ehi);
-+ ata_port_freeze(ap);
- break;
- case ACPI_NOTIFY_EJECT_REQUEST:
- ata_ehi_push_desc(ehi, "ACPI event");
-
-- if (!is_dock_event)
-- break;
--
-- /* undock event - immediate unplug */
- ata_acpi_detach_device(ap, dev);
- wait = 1;
- break;
- }
-
-- /* make sure kobj doesn't go away while ap->lock is released */
-- kobject_get(kobj);
--
- spin_unlock_irqrestore(ap->lock, flags);
-
-- if (wait) {
-+ if (wait)
- ata_port_wait_eh(ap);
-- ata_acpi_eject_device(handle);
-- }
--
-- if (kobj && !is_dock_event) {
-- sprintf(event_string, "BAY_EVENT=%d", event);
-- kobject_uevent_env(kobj, KOBJ_CHANGE, envp);
-- }
--
-- kobject_put(kobj);
- }
-
- static void ata_acpi_dev_notify_dock(acpi_handle handle, u32 event, void *data)
- {
- struct ata_device *dev = data;
-
-- ata_acpi_handle_hotplug(dev->link->ap, dev, event, 1);
-+ ata_acpi_handle_hotplug(dev->link->ap, dev, event);
- }
-
- static void ata_acpi_ap_notify_dock(acpi_handle handle, u32 event, void *data)
- {
- struct ata_port *ap = data;
-
-- ata_acpi_handle_hotplug(ap, NULL, event, 1);
--}
--
--static void ata_acpi_dev_notify(acpi_handle handle, u32 event, void *data)
--{
-- struct ata_device *dev = data;
--
-- ata_acpi_handle_hotplug(dev->link->ap, dev, event, 0);
--}
--
--static void ata_acpi_ap_notify(acpi_handle handle, u32 event, void *data)
--{
-- struct ata_port *ap = data;
--
-- ata_acpi_handle_hotplug(ap, NULL, event, 0);
-+ ata_acpi_handle_hotplug(ap, NULL, event);
- }
-
- /**
-@@ -315,9 +242,6 @@ void ata_acpi_associate(struct ata_host *host)
- ata_acpi_associate_ide_port(ap);
-
- if (ap->acpi_handle) {
-- acpi_install_notify_handler(ap->acpi_handle,
-- ACPI_SYSTEM_NOTIFY,
-- ata_acpi_ap_notify, ap);
- /* we might be on a docking station */
- register_hotplug_dock_device(ap->acpi_handle,
- ata_acpi_ap_notify_dock, ap);
-@@ -327,9 +251,6 @@ void ata_acpi_associate(struct ata_host *host)
- struct ata_device *dev = &ap->link.device[j];
-
- if (dev->acpi_handle) {
-- acpi_install_notify_handler(dev->acpi_handle,
-- ACPI_SYSTEM_NOTIFY,
-- ata_acpi_dev_notify, dev);
- /* we might be on a docking station */
- register_hotplug_dock_device(dev->acpi_handle,
- ata_acpi_dev_notify_dock, dev);