Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 311464
b: refs/heads/master
c: 30dcf76
h: refs/heads/master
v: v3
  • Loading branch information
Matthew Garrett authored and Jeff Garzik committed Jun 29, 2012
1 parent c84651f commit 7a5e690
Show file tree
Hide file tree
Showing 7 changed files with 41 additions and 145 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 6b66d95895c149cbc04d4fac5a2f5477c543a8ae
refs/heads/master: 30dcf76acc695cbd2fa919e294670fe9552e16e7
161 changes: 36 additions & 125 deletions trunk/drivers/ata/libata-acpi.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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;
Expand All @@ -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)
Expand Down Expand Up @@ -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
Expand All @@ -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);
}
}
Expand All @@ -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)
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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)) {
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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 */
Expand Down Expand Up @@ -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);
}

/**
Expand All @@ -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? */
Expand Down Expand Up @@ -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.
Expand Down Expand Up @@ -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;
Expand Down
3 changes: 0 additions & 3 deletions trunk/drivers/ata/libata-core.c
Original file line number Diff line number Diff line change
Expand Up @@ -6049,9 +6049,6 @@ int ata_host_register(struct ata_host *host, struct scsi_host_template *sht)
if (rc)
goto err_tadd;

/* associate with ACPI nodes */
ata_acpi_associate(host);

/* set cable, sata_spd_limit and report */
for (i = 0; i < host->n_ports; i++) {
struct ata_port *ap = host->ports[i];
Expand Down
4 changes: 0 additions & 4 deletions trunk/drivers/ata/libata-pmp.c
Original file line number Diff line number Diff line change
Expand Up @@ -529,8 +529,6 @@ int sata_pmp_attach(struct ata_device *dev)
ata_for_each_link(tlink, ap, EDGE)
sata_link_init_spd(tlink);

ata_acpi_associate_sata_port(ap);

return 0;

fail:
Expand Down Expand Up @@ -570,8 +568,6 @@ static void sata_pmp_detach(struct ata_device *dev)
ap->nr_pmp_links = 0;
link->pmp = 0;
spin_unlock_irqrestore(ap->lock, flags);

ata_acpi_associate_sata_port(ap);
}

/**
Expand Down
5 changes: 0 additions & 5 deletions trunk/drivers/ata/libata.h
Original file line number Diff line number Diff line change
Expand Up @@ -112,9 +112,6 @@ extern void __ata_port_probe(struct ata_port *ap);
/* libata-acpi.c */
#ifdef CONFIG_ATA_ACPI
extern unsigned int ata_acpi_gtf_filter;

extern void ata_acpi_associate_sata_port(struct ata_port *ap);
extern void ata_acpi_associate(struct ata_host *host);
extern void ata_acpi_dissociate(struct ata_host *host);
extern int ata_acpi_on_suspend(struct ata_port *ap);
extern void ata_acpi_on_resume(struct ata_port *ap);
Expand All @@ -124,8 +121,6 @@ extern void ata_acpi_set_state(struct ata_port *ap, pm_message_t state);
extern int ata_acpi_register(void);
extern void ata_acpi_unregister(void);
#else
static inline void ata_acpi_associate_sata_port(struct ata_port *ap) { }
static inline void ata_acpi_associate(struct ata_host *host) { }
static inline void ata_acpi_dissociate(struct ata_host *host) { }
static inline int ata_acpi_on_suspend(struct ata_port *ap) { return 0; }
static inline void ata_acpi_on_resume(struct ata_port *ap) { }
Expand Down
4 changes: 2 additions & 2 deletions trunk/drivers/ata/pata_acpi.c
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ static int pacpi_pre_reset(struct ata_link *link, unsigned long deadline)
{
struct ata_port *ap = link->ap;
struct pata_acpi *acpi = ap->private_data;
if (ap->acpi_handle == NULL || ata_acpi_gtm(ap, &acpi->gtm) < 0)
if (ata_ap_acpi_handle(ap) == NULL || ata_acpi_gtm(ap, &acpi->gtm) < 0)
return -ENODEV;

return ata_sff_prereset(link, deadline);
Expand Down Expand Up @@ -195,7 +195,7 @@ static int pacpi_port_start(struct ata_port *ap)
struct pci_dev *pdev = to_pci_dev(ap->host->dev);
struct pata_acpi *acpi;

if (ap->acpi_handle == NULL)
if (ata_ap_acpi_handle(ap) == NULL)
return -ENODEV;

acpi = ap->private_data = devm_kzalloc(&pdev->dev, sizeof(struct pata_acpi), GFP_KERNEL);
Expand Down
7 changes: 2 additions & 5 deletions trunk/include/linux/libata.h
Original file line number Diff line number Diff line change
Expand Up @@ -545,9 +545,6 @@ struct ata_host {
struct mutex eh_mutex;
struct task_struct *eh_owner;

#ifdef CONFIG_ATA_ACPI
acpi_handle acpi_handle;
#endif
struct ata_port *simplex_claimed; /* channel owning the DMA */
struct ata_port *ports[0];
};
Expand Down Expand Up @@ -615,7 +612,6 @@ struct ata_device {
struct scsi_device *sdev; /* attached SCSI device */
void *private_data;
#ifdef CONFIG_ATA_ACPI
acpi_handle acpi_handle;
union acpi_object *gtf_cache;
unsigned int gtf_filter;
#endif
Expand Down Expand Up @@ -797,7 +793,6 @@ struct ata_port {
void *private_data;

#ifdef CONFIG_ATA_ACPI
acpi_handle acpi_handle;
struct ata_acpi_gtm __acpi_init_gtm; /* use ata_acpi_init_gtm() */
#endif
/* owned by EH */
Expand Down Expand Up @@ -1114,6 +1109,8 @@ int ata_acpi_stm(struct ata_port *ap, const struct ata_acpi_gtm *stm);
int ata_acpi_gtm(struct ata_port *ap, struct ata_acpi_gtm *stm);
unsigned long ata_acpi_gtm_xfermask(struct ata_device *dev,
const struct ata_acpi_gtm *gtm);
acpi_handle ata_ap_acpi_handle(struct ata_port *ap);
acpi_handle ata_dev_acpi_handle(struct ata_device *dev);
int ata_acpi_cbl_80wire(struct ata_port *ap, const struct ata_acpi_gtm *gtm);
#else
static inline const struct ata_acpi_gtm *ata_acpi_init_gtm(struct ata_port *ap)
Expand Down

0 comments on commit 7a5e690

Please sign in to comment.