提交 f730ae18 编写于 作者: S Shaohua Li 提交者: Len Brown

libata: remove functions now handed by ACPI dock driver

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: NShaohua Li <shaohua.li@intel.com>
Acked-by: NTejun Heo <htejun@gmail.com>
Signed-off-by: NLen Brown <len.brown@intel.com>
上级 19cd847a
...@@ -738,7 +738,8 @@ static void dock_notify(acpi_handle handle, u32 event, void *data) ...@@ -738,7 +738,8 @@ static void dock_notify(acpi_handle handle, u32 event, void *data)
/* Fall back */ /* Fall back */
case ACPI_NOTIFY_EJECT_REQUEST: case ACPI_NOTIFY_EJECT_REQUEST:
begin_undock(ds); begin_undock(ds);
if (immediate_undock || surprise_removal) if ((immediate_undock && !(ds->flags & DOCK_IS_ATA))
|| surprise_removal)
handle_eject_request(ds, event); handle_eject_request(ds, event);
else else
dock_event(ds, event, UNDOCK_EVENT); dock_event(ds, event, UNDOCK_EVENT);
......
...@@ -120,21 +120,6 @@ static void ata_acpi_associate_ide_port(struct ata_port *ap) ...@@ -120,21 +120,6 @@ static void ata_acpi_associate_ide_port(struct ata_port *ap)
ap->pflags |= ATA_PFLAG_INIT_GTM_VALID; 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() */ /* @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) 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) ...@@ -157,7 +142,6 @@ static void ata_acpi_detach_device(struct ata_port *ap, struct ata_device *dev)
* @ap: ATA port ACPI event occurred * @ap: ATA port ACPI event occurred
* @dev: ATA device ACPI event occurred (can be NULL) * @dev: ATA device ACPI event occurred (can be NULL)
* @event: ACPI event which occurred * @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 * 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 * 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) ...@@ -171,115 +155,58 @@ static void ata_acpi_detach_device(struct ata_port *ap, struct ata_device *dev)
* ACPI notify handler context. May sleep. * ACPI notify handler context. May sleep.
*/ */
static void ata_acpi_handle_hotplug(struct ata_port *ap, struct ata_device *dev, 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 ata_eh_info *ehi = &ap->link.eh_info;
struct kobject *kobj = NULL;
int wait = 0; int wait = 0;
unsigned long flags; unsigned long flags;
acpi_handle handle, tmphandle; acpi_handle handle;
unsigned long sta;
acpi_status status;
if (dev) { if (dev)
if (dev->sdev)
kobj = &dev->sdev->sdev_gendev.kobj;
handle = dev->acpi_handle; handle = dev->acpi_handle;
} else { else
kobj = &ap->dev->kobj;
handle = ap->acpi_handle; 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); 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) { switch (event) {
case ACPI_NOTIFY_BUS_CHECK: case ACPI_NOTIFY_BUS_CHECK:
case ACPI_NOTIFY_DEVICE_CHECK: case ACPI_NOTIFY_DEVICE_CHECK:
ata_ehi_push_desc(ehi, "ACPI event"); ata_ehi_push_desc(ehi, "ACPI event");
if (ACPI_FAILURE(status)) { ata_ehi_hotplugged(ehi);
ata_port_printk(ap, KERN_ERR, ata_port_freeze(ap);
"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;
}
break; break;
case ACPI_NOTIFY_EJECT_REQUEST: case ACPI_NOTIFY_EJECT_REQUEST:
ata_ehi_push_desc(ehi, "ACPI event"); ata_ehi_push_desc(ehi, "ACPI event");
if (!is_dock_event)
break;
/* undock event - immediate unplug */
ata_acpi_detach_device(ap, dev); ata_acpi_detach_device(ap, dev);
wait = 1; wait = 1;
break; break;
} }
/* make sure kobj doesn't go away while ap->lock is released */
kobject_get(kobj);
spin_unlock_irqrestore(ap->lock, flags); spin_unlock_irqrestore(ap->lock, flags);
if (wait) { if (wait)
ata_port_wait_eh(ap); 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) static void ata_acpi_dev_notify_dock(acpi_handle handle, u32 event, void *data)
{ {
struct ata_device *dev = 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) static void ata_acpi_ap_notify_dock(acpi_handle handle, u32 event, void *data)
{ {
struct ata_port *ap = data; struct ata_port *ap = data;
ata_acpi_handle_hotplug(ap, NULL, event, 1); ata_acpi_handle_hotplug(ap, NULL, event);
}
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);
} }
/** /**
...@@ -315,9 +242,6 @@ void ata_acpi_associate(struct ata_host *host) ...@@ -315,9 +242,6 @@ void ata_acpi_associate(struct ata_host *host)
ata_acpi_associate_ide_port(ap); ata_acpi_associate_ide_port(ap);
if (ap->acpi_handle) { 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 */ /* we might be on a docking station */
register_hotplug_dock_device(ap->acpi_handle, register_hotplug_dock_device(ap->acpi_handle,
ata_acpi_ap_notify_dock, ap); ata_acpi_ap_notify_dock, ap);
...@@ -327,9 +251,6 @@ void ata_acpi_associate(struct ata_host *host) ...@@ -327,9 +251,6 @@ void ata_acpi_associate(struct ata_host *host)
struct ata_device *dev = &ap->link.device[j]; struct ata_device *dev = &ap->link.device[j];
if (dev->acpi_handle) { 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 */ /* we might be on a docking station */
register_hotplug_dock_device(dev->acpi_handle, register_hotplug_dock_device(dev->acpi_handle,
ata_acpi_dev_notify_dock, dev); ata_acpi_dev_notify_dock, dev);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册