Commit 0d0cdb028f9d9771e2b346038707734121f906e3

Authored by Aaron Lu
Committed by Jeff Garzik
1 parent a52f514c91

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>

Showing 2 changed files with 5 additions and 0 deletions Side-by-side Diff

drivers/ata/libata-acpi.c
... ... @@ -76,6 +76,9 @@
76 76 acpi_integer adr;
77 77 struct ata_port *ap = dev->link->ap;
78 78  
  79 + if (dev->flags & ATA_DFLAG_ACPI_DISABLED)
  80 + return NULL;
  81 +
79 82 if (ap->flags & ATA_FLAG_ACPI_SATA) {
80 83 if (!sata_pmp_attached(ap))
81 84 adr = SATA_ADR(ap->port_no, NO_PORT_MULT);
... ... @@ -945,6 +948,7 @@
945 948 return rc;
946 949 }
947 950  
  951 + dev->flags |= ATA_DFLAG_ACPI_DISABLED;
948 952 ata_dev_warn(dev, "ACPI: failed the second time, disabled\n");
949 953  
950 954 /* We can safely continue if no _GTF command has been executed
include/linux/libata.h
... ... @@ -163,6 +163,7 @@
163 163  
164 164 ATA_DFLAG_DA = (1 << 26), /* device supports Device Attention */
165 165 ATA_DFLAG_DEVSLP = (1 << 27), /* device supports Device Sleep */
  166 + ATA_DFLAG_ACPI_DISABLED = (1 << 28), /* ACPI for the device is disabled */
166 167  
167 168 ATA_DEV_UNKNOWN = 0, /* unknown device */
168 169 ATA_DEV_ATA = 1, /* ATA device */