| 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: libata: restore acpi disable functionality |
| |
| From: Aaron Lu <aaron.lu@intel.com> |
| |
| commit 0d0cdb028f9d9771e2b346038707734121f906e3 upstream. |
| |
| 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> |
| Signed-off-by: Jeff Garzik <jgarzik@redhat.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| drivers/ata/libata-acpi.c | 4 ++++ |
| include/linux/libata.h | 1 + |
| 2 files changed, 5 insertions(+) |
| |
| --- a/drivers/ata/libata-acpi.c |
| +++ b/drivers/ata/libata-acpi.c |
| @@ -76,6 +76,9 @@ acpi_handle ata_dev_acpi_handle(struct a |
| 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 |
| 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 |
| --- 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 */ |