|
@@ -47,7 +47,14 @@ static void ata_acpi_clear_gtf(struct ata_device *dev)
|
|
|
dev->gtf_cache = NULL;
|
|
|
}
|
|
|
|
|
|
-static acpi_handle ap_acpi_handle(struct ata_port *ap)
|
|
|
+/**
|
|
|
+ * ata_ap_acpi_handle - provide the acpi_handle for an ata_port
|
|
|
+ * @ap: the acpi_handle returned will correspond to this port
|
|
|
+ *
|
|
|
+ * Returns the acpi_handle for the ACPI namespace object corresponding to
|
|
|
+ * the ata_port passed into the function, or NULL if no such object exists
|
|
|
+ */
|
|
|
+acpi_handle ata_ap_acpi_handle(struct ata_port *ap)
|
|
|
{
|
|
|
if (ap->flags & ATA_FLAG_ACPI_SATA)
|
|
|
return NULL;
|
|
@@ -64,8 +71,16 @@ static acpi_handle ap_acpi_handle(struct ata_port *ap)
|
|
|
return acpi_get_child(DEVICE_ACPI_HANDLE(ap->host->dev),
|
|
|
ap->port_no);
|
|
|
}
|
|
|
+EXPORT_SYMBOL(ata_ap_acpi_handle);
|
|
|
|
|
|
-static acpi_handle dev_acpi_handle(struct ata_device *dev)
|
|
|
+/**
|
|
|
+ * ata_dev_acpi_handle - provide the acpi_handle for an ata_device
|
|
|
+ * @dev: the acpi_device returned will correspond to this port
|
|
|
+ *
|
|
|
+ * Returns the acpi_handle for the ACPI namespace object corresponding to
|
|
|
+ * the ata_device passed into the function, or NULL if no such object exists
|
|
|
+ */
|
|
|
+acpi_handle ata_dev_acpi_handle(struct ata_device *dev)
|
|
|
{
|
|
|
acpi_integer adr;
|
|
|
struct ata_port *ap = dev->link->ap;
|
|
@@ -77,66 +92,9 @@ static acpi_handle dev_acpi_handle(struct ata_device *dev)
|
|
|
adr = SATA_ADR(ap->port_no, dev->link->pmp);
|
|
|
return acpi_get_child(DEVICE_ACPI_HANDLE(ap->host->dev), adr);
|
|
|
} else
|
|
|
- return acpi_get_child(ap_acpi_handle(ap), dev->devno);
|
|
|
-}
|
|
|
-
|
|
|
-/**
|
|
|
- * ata_acpi_associate_sata_port - associate SATA port with ACPI objects
|
|
|
- * @ap: target SATA port
|
|
|
- *
|
|
|
- * Look up ACPI objects associated with @ap and initialize acpi_handle
|
|
|
- * fields of @ap, the port and devices accordingly.
|
|
|
- *
|
|
|
- * LOCKING:
|
|
|
- * EH context.
|
|
|
- *
|
|
|
- * RETURNS:
|
|
|
- * 0 on success, -errno on failure.
|
|
|
- */
|
|
|
-void ata_acpi_associate_sata_port(struct ata_port *ap)
|
|
|
-{
|
|
|
- WARN_ON(!(ap->flags & ATA_FLAG_ACPI_SATA));
|
|
|
-
|
|
|
- if (!sata_pmp_attached(ap)) {
|
|
|
- u64 adr = SATA_ADR(ap->port_no, NO_PORT_MULT);
|
|
|
-
|
|
|
- ap->link.device->acpi_handle =
|
|
|
- acpi_get_child(ap->host->acpi_handle, adr);
|
|
|
- } else {
|
|
|
- struct ata_link *link;
|
|
|
-
|
|
|
- ap->link.device->acpi_handle = NULL;
|
|
|
-
|
|
|
- ata_for_each_link(link, ap, EDGE) {
|
|
|
- u64 adr = SATA_ADR(ap->port_no, link->pmp);
|
|
|
-
|
|
|
- link->device->acpi_handle =
|
|
|
- acpi_get_child(ap->host->acpi_handle, adr);
|
|
|
- }
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
-static void ata_acpi_associate_ide_port(struct ata_port *ap)
|
|
|
-{
|
|
|
- int max_devices, i;
|
|
|
-
|
|
|
- ap->acpi_handle = acpi_get_child(ap->host->acpi_handle, ap->port_no);
|
|
|
- if (!ap->acpi_handle)
|
|
|
- return;
|
|
|
-
|
|
|
- max_devices = 1;
|
|
|
- if (ap->flags & ATA_FLAG_SLAVE_POSS)
|
|
|
- max_devices++;
|
|
|
-
|
|
|
- for (i = 0; i < max_devices; i++) {
|
|
|
- struct ata_device *dev = &ap->link.device[i];
|
|
|
-
|
|
|
- dev->acpi_handle = acpi_get_child(ap->acpi_handle, i);
|
|
|
- }
|
|
|
-
|
|
|
- if (ata_acpi_gtm(ap, &ap->__acpi_init_gtm) == 0)
|
|
|
- ap->pflags |= ATA_PFLAG_INIT_GTM_VALID;
|
|
|
+ return acpi_get_child(ata_ap_acpi_handle(ap), dev->devno);
|
|
|
}
|
|
|
+EXPORT_SYMBOL(ata_dev_acpi_handle);
|
|
|
|
|
|
/* @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)
|
|
@@ -261,56 +219,6 @@ static const struct acpi_dock_ops ata_acpi_ap_dock_ops = {
|
|
|
.uevent = ata_acpi_ap_uevent,
|
|
|
};
|
|
|
|
|
|
-/**
|
|
|
- * ata_acpi_associate - associate ATA host with ACPI objects
|
|
|
- * @host: target ATA host
|
|
|
- *
|
|
|
- * Look up ACPI objects associated with @host and initialize
|
|
|
- * acpi_handle fields of @host, its ports and devices accordingly.
|
|
|
- *
|
|
|
- * LOCKING:
|
|
|
- * EH context.
|
|
|
- *
|
|
|
- * RETURNS:
|
|
|
- * 0 on success, -errno on failure.
|
|
|
- */
|
|
|
-void ata_acpi_associate(struct ata_host *host)
|
|
|
-{
|
|
|
- int i, j;
|
|
|
-
|
|
|
- if (!is_pci_dev(host->dev) || libata_noacpi)
|
|
|
- return;
|
|
|
-
|
|
|
- host->acpi_handle = DEVICE_ACPI_HANDLE(host->dev);
|
|
|
- if (!host->acpi_handle)
|
|
|
- return;
|
|
|
-
|
|
|
- for (i = 0; i < host->n_ports; i++) {
|
|
|
- struct ata_port *ap = host->ports[i];
|
|
|
-
|
|
|
- if (host->ports[0]->flags & ATA_FLAG_ACPI_SATA)
|
|
|
- ata_acpi_associate_sata_port(ap);
|
|
|
- else
|
|
|
- ata_acpi_associate_ide_port(ap);
|
|
|
-
|
|
|
- if (ap->acpi_handle) {
|
|
|
- /* we might be on a docking station */
|
|
|
- register_hotplug_dock_device(ap->acpi_handle,
|
|
|
- &ata_acpi_ap_dock_ops, ap);
|
|
|
- }
|
|
|
-
|
|
|
- for (j = 0; j < ata_link_max_devices(&ap->link); j++) {
|
|
|
- struct ata_device *dev = &ap->link.device[j];
|
|
|
-
|
|
|
- if (dev->acpi_handle) {
|
|
|
- /* we might be on a docking station */
|
|
|
- register_hotplug_dock_device(dev->acpi_handle,
|
|
|
- &ata_acpi_dev_dock_ops, dev);
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
/**
|
|
|
* ata_acpi_dissociate - dissociate ATA host from ACPI objects
|
|
|
* @host: target ATA host
|
|
@@ -332,7 +240,7 @@ void ata_acpi_dissociate(struct ata_host *host)
|
|
|
struct ata_port *ap = host->ports[i];
|
|
|
const struct ata_acpi_gtm *gtm = ata_acpi_init_gtm(ap);
|
|
|
|
|
|
- if (ap->acpi_handle && gtm)
|
|
|
+ if (ata_ap_acpi_handle(ap) && gtm)
|
|
|
ata_acpi_stm(ap, gtm);
|
|
|
}
|
|
|
}
|
|
@@ -357,7 +265,8 @@ int ata_acpi_gtm(struct ata_port *ap, struct ata_acpi_gtm *gtm)
|
|
|
acpi_status status;
|
|
|
int rc = 0;
|
|
|
|
|
|
- status = acpi_evaluate_object(ap->acpi_handle, "_GTM", NULL, &output);
|
|
|
+ status = acpi_evaluate_object(ata_ap_acpi_handle(ap), "_GTM", NULL,
|
|
|
+ &output);
|
|
|
|
|
|
rc = -ENOENT;
|
|
|
if (status == AE_NOT_FOUND)
|
|
@@ -427,7 +336,8 @@ int ata_acpi_stm(struct ata_port *ap, const struct ata_acpi_gtm *stm)
|
|
|
input.count = 3;
|
|
|
input.pointer = in_params;
|
|
|
|
|
|
- status = acpi_evaluate_object(ap->acpi_handle, "_STM", &input, NULL);
|
|
|
+ status = acpi_evaluate_object(ata_ap_acpi_handle(ap), "_STM", &input,
|
|
|
+ NULL);
|
|
|
|
|
|
if (status == AE_NOT_FOUND)
|
|
|
return -ENOENT;
|
|
@@ -484,7 +394,8 @@ static int ata_dev_get_GTF(struct ata_device *dev, struct ata_acpi_gtf **gtf)
|
|
|
__func__, ap->port_no);
|
|
|
|
|
|
/* _GTF has no input parameters */
|
|
|
- status = acpi_evaluate_object(dev->acpi_handle, "_GTF", NULL, &output);
|
|
|
+ status = acpi_evaluate_object(ata_dev_acpi_handle(dev), "_GTF", NULL,
|
|
|
+ &output);
|
|
|
out_obj = dev->gtf_cache = output.pointer;
|
|
|
|
|
|
if (ACPI_FAILURE(status)) {
|
|
@@ -850,7 +761,8 @@ static int ata_acpi_push_id(struct ata_device *dev)
|
|
|
|
|
|
/* It's OK for _SDD to be missing too. */
|
|
|
swap_buf_le16(dev->id, ATA_ID_WORDS);
|
|
|
- status = acpi_evaluate_object(dev->acpi_handle, "_SDD", &input, NULL);
|
|
|
+ status = acpi_evaluate_object(ata_dev_acpi_handle(dev), "_SDD", &input,
|
|
|
+ NULL);
|
|
|
swap_buf_le16(dev->id, ATA_ID_WORDS);
|
|
|
|
|
|
if (status == AE_NOT_FOUND)
|
|
@@ -900,7 +812,7 @@ void ata_acpi_on_resume(struct ata_port *ap)
|
|
|
const struct ata_acpi_gtm *gtm = ata_acpi_init_gtm(ap);
|
|
|
struct ata_device *dev;
|
|
|
|
|
|
- if (ap->acpi_handle && gtm) {
|
|
|
+ if (ata_ap_acpi_handle(ap) && gtm) {
|
|
|
/* _GTM valid */
|
|
|
|
|
|
/* restore timing parameters */
|
|
@@ -941,22 +853,22 @@ void ata_acpi_set_state(struct ata_port *ap, pm_message_t state)
|
|
|
{
|
|
|
struct ata_device *dev;
|
|
|
|
|
|
- if (!ap->acpi_handle || (ap->flags & ATA_FLAG_ACPI_SATA))
|
|
|
+ if (!ata_ap_acpi_handle(ap) || (ap->flags & ATA_FLAG_ACPI_SATA))
|
|
|
return;
|
|
|
|
|
|
/* channel first and then drives for power on and vica versa
|
|
|
for power off */
|
|
|
if (state.event == PM_EVENT_ON)
|
|
|
- acpi_bus_set_power(ap->acpi_handle, ACPI_STATE_D0);
|
|
|
+ acpi_bus_set_power(ata_ap_acpi_handle(ap), ACPI_STATE_D0);
|
|
|
|
|
|
ata_for_each_dev(dev, &ap->link, ENABLED) {
|
|
|
- if (dev->acpi_handle)
|
|
|
- acpi_bus_set_power(dev->acpi_handle,
|
|
|
+ if (ata_dev_acpi_handle(dev))
|
|
|
+ acpi_bus_set_power(ata_dev_acpi_handle(dev),
|
|
|
state.event == PM_EVENT_ON ?
|
|
|
ACPI_STATE_D0 : ACPI_STATE_D3);
|
|
|
}
|
|
|
if (state.event != PM_EVENT_ON)
|
|
|
- acpi_bus_set_power(ap->acpi_handle, ACPI_STATE_D3);
|
|
|
+ acpi_bus_set_power(ata_ap_acpi_handle(ap), ACPI_STATE_D3);
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -981,7 +893,7 @@ int ata_acpi_on_devcfg(struct ata_device *dev)
|
|
|
int nr_executed = 0;
|
|
|
int rc;
|
|
|
|
|
|
- if (!dev->acpi_handle)
|
|
|
+ if (!ata_dev_acpi_handle(dev))
|
|
|
return 0;
|
|
|
|
|
|
/* do we need to do _GTF? */
|
|
@@ -1027,7 +939,6 @@ int ata_acpi_on_devcfg(struct ata_device *dev)
|
|
|
}
|
|
|
|
|
|
ata_dev_warn(dev, "ACPI: failed the second time, disabled\n");
|
|
|
- dev->acpi_handle = NULL;
|
|
|
|
|
|
/* We can safely continue if no _GTF command has been executed
|
|
|
* and port is not frozen.
|
|
@@ -1093,7 +1004,7 @@ static int ata_acpi_bind_device(struct ata_port *ap, struct scsi_device *sdev,
|
|
|
else
|
|
|
ata_dev = &ap->link.device[sdev->id];
|
|
|
|
|
|
- *handle = dev_acpi_handle(ata_dev);
|
|
|
+ *handle = ata_dev_acpi_handle(ata_dev);
|
|
|
|
|
|
if (!*handle)
|
|
|
return -ENODEV;
|