diff options
author | Tejun Heo <htejun@gmail.com> | 2007-05-14 14:28:16 -0400 |
---|---|---|
committer | Jeff Garzik <jeff@garzik.org> | 2007-07-09 12:17:32 -0400 |
commit | 64578a3de723d502621860f9d4d28f34d001b066 (patch) | |
tree | 821e7ad8e8d6c3a0f3224b479ff000e00001a165 /drivers/ata/libata-eh.c | |
parent | e5fa24dfdb522b642dbe9b8b1b692f68dce89835 (diff) |
libata-acpi: implement _GTM/_STM support
Implement _GTM/_STM support. acpi_gtm is added to ata_port which
stores _GTM parameters over suspend/resume cycle. A new hook
ata_acpi_on_suspend() is responsible for storing _GTM parameters
during suspend. _STM is executed in ata_acpi_on_resume(). With this
change, invoking _GTF is safe on IDE hierarchy and acpi_sata check
before _GTF is removed.
ata_acpi_gtm() and ata_acpi_stm() implementation is taken from Alan
Cox's pata_acpi implementation. ata_acpi_gtm() is fixed such that the
result parameter is not shifted by sizeof(union acpi_object).
Signed-off-by: Tejun Heo <htejun@gmail.com>
Cc: Alan Cox <alan@lxorguk.ukuu.org.uk>
Signed-off-by: Jeff Garzik <jeff@garzik.org>
Diffstat (limited to 'drivers/ata/libata-eh.c')
-rw-r--r-- | drivers/ata/libata-eh.c | 8 |
1 files changed, 7 insertions, 1 deletions
diff --git a/drivers/ata/libata-eh.c b/drivers/ata/libata-eh.c index fed217db82d2..9ee0a8c08d96 100644 --- a/drivers/ata/libata-eh.c +++ b/drivers/ata/libata-eh.c | |||
@@ -2154,19 +2154,25 @@ static void ata_eh_handle_port_suspend(struct ata_port *ap) | |||
2154 | 2154 | ||
2155 | WARN_ON(ap->pflags & ATA_PFLAG_SUSPENDED); | 2155 | WARN_ON(ap->pflags & ATA_PFLAG_SUSPENDED); |
2156 | 2156 | ||
2157 | /* tell ACPI we're suspending */ | ||
2158 | rc = ata_acpi_on_suspend(ap); | ||
2159 | if (rc) | ||
2160 | goto out; | ||
2161 | |||
2157 | /* suspend */ | 2162 | /* suspend */ |
2158 | ata_eh_freeze_port(ap); | 2163 | ata_eh_freeze_port(ap); |
2159 | 2164 | ||
2160 | if (ap->ops->port_suspend) | 2165 | if (ap->ops->port_suspend) |
2161 | rc = ap->ops->port_suspend(ap, ap->pm_mesg); | 2166 | rc = ap->ops->port_suspend(ap, ap->pm_mesg); |
2162 | 2167 | ||
2168 | out: | ||
2163 | /* report result */ | 2169 | /* report result */ |
2164 | spin_lock_irqsave(ap->lock, flags); | 2170 | spin_lock_irqsave(ap->lock, flags); |
2165 | 2171 | ||
2166 | ap->pflags &= ~ATA_PFLAG_PM_PENDING; | 2172 | ap->pflags &= ~ATA_PFLAG_PM_PENDING; |
2167 | if (rc == 0) | 2173 | if (rc == 0) |
2168 | ap->pflags |= ATA_PFLAG_SUSPENDED; | 2174 | ap->pflags |= ATA_PFLAG_SUSPENDED; |
2169 | else | 2175 | else if (ap->pflags & ATA_PFLAG_FROZEN) |
2170 | ata_port_schedule_eh(ap); | 2176 | ata_port_schedule_eh(ap); |
2171 | 2177 | ||
2172 | if (ap->pm_result) { | 2178 | if (ap->pm_result) { |