69 lines
2.5 KiB
Diff
69 lines
2.5 KiB
Diff
From 0d0cdb028f9d9771e2b346038707734121f906e3 Mon Sep 17 00:00:00 2001
|
|
From: Aaron Lu <aaron.lu@intel.com>
|
|
Date: Mon, 26 Nov 2012 13:55:25 +0800
|
|
Subject: [PATCH] libata: restore acpi disable functionality
|
|
|
|
Commit 66fa7f215 "libata-acpi: improve ACPI disabling" introdcued the
|
|
behaviour of disabling ATA ACPI if ata_acpi_on_devcfg failed the 2nd
|
|
time, but commit 30dcf76ac dropped this behaviour and this caused
|
|
problem for Dimitris Damigos, where his laptop can not resume correctly.
|
|
|
|
The bugzilla page for it is:
|
|
https://bugzilla.kernel.org/show_bug.cgi?id=49331
|
|
|
|
The problem is, ata_dev_push_id will fail the 2nd time it is invoked,
|
|
and due to disabling ACPI code is dropped, ata_acpi_on_devcfg which
|
|
calls ata_dev_push_id will keep failing and eventually made the device
|
|
disabled.
|
|
|
|
This patch restores the original behaviour, if acpi failed the 2nd time,
|
|
disable acpi functionality for the device(and we do not event need to
|
|
add a debug message for this as it is still there ;-).
|
|
|
|
Reported-by: Dimitris Damigos <damigos@freemail.gr>
|
|
Signed-off-by: Aaron Lu <aaron.lu@intel.com>
|
|
Cc: <stable@vger.kernel.org>
|
|
Signed-off-by: Jeff Garzik <jgarzik@redhat.com>
|
|
---
|
|
drivers/ata/libata-acpi.c | 4 ++++
|
|
include/linux/libata.h | 1 +
|
|
2 files changed, 5 insertions(+), 0 deletions(-)
|
|
|
|
diff --git a/drivers/ata/libata-acpi.c b/drivers/ata/libata-acpi.c
|
|
index 5b0ba3f..ef01ac0 100644
|
|
--- a/drivers/ata/libata-acpi.c
|
|
+++ b/drivers/ata/libata-acpi.c
|
|
@@ -76,6 +76,9 @@ acpi_handle ata_dev_acpi_handle(struct ata_device *dev)
|
|
acpi_integer adr;
|
|
struct ata_port *ap = dev->link->ap;
|
|
|
|
+ if (dev->flags & ATA_DFLAG_ACPI_DISABLED)
|
|
+ return NULL;
|
|
+
|
|
if (ap->flags & ATA_FLAG_ACPI_SATA) {
|
|
if (!sata_pmp_attached(ap))
|
|
adr = SATA_ADR(ap->port_no, NO_PORT_MULT);
|
|
@@ -945,6 +948,7 @@ int ata_acpi_on_devcfg(struct ata_device *dev)
|
|
return rc;
|
|
}
|
|
|
|
+ dev->flags |= ATA_DFLAG_ACPI_DISABLED;
|
|
ata_dev_warn(dev, "ACPI: failed the second time, disabled\n");
|
|
|
|
/* We can safely continue if no _GTF command has been executed
|
|
diff --git a/include/linux/libata.h b/include/linux/libata.h
|
|
index 77eeeda..e931c9a 100644
|
|
--- a/include/linux/libata.h
|
|
+++ b/include/linux/libata.h
|
|
@@ -163,6 +163,7 @@ enum {
|
|
|
|
ATA_DFLAG_DA = (1 << 26), /* device supports Device Attention */
|
|
ATA_DFLAG_DEVSLP = (1 << 27), /* device supports Device Sleep */
|
|
+ ATA_DFLAG_ACPI_DISABLED = (1 << 28), /* ACPI for the device is disabled */
|
|
|
|
ATA_DEV_UNKNOWN = 0, /* unknown device */
|
|
ATA_DEV_ATA = 1, /* ATA device */
|
|
--
|
|
1.7.6.5
|
|
|