aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBrian Norris <computersforpeace@gmail.com>2012-02-21 13:38:42 -0500
committerJeff Garzik <jgarzik@redhat.com>2012-03-13 16:35:37 -0400
commit66583c9fa63d05d5580e409f9a58d3cad6d76d17 (patch)
treec84f755b8e15e164d631ec155d5ec7d532485311
parent6b4b8fc87dc5cbfcfb5c749dc200906471fb854c (diff)
ahci: add AHCI_HFLAG_DELAY_ENGINE host flag
The following commit was intended to fix problems with specific AHCI controller(s) that would become bricks if the AHCI specification was not followed strictly (that is, if ahci_start_engine() was called while the controller was in the wrong state): commit 7faa33da9b7add01db9f1ad92c6a5d9145e940a7 ahci: start engine only during soft/hard resets However, some devices currently have issues with that fix, so we must implement a flag that delays the ahci_start_engine() call only for specific controllers. This commit simply introduces the flag, without enabling it in any driver. Note that even when AHCI_HFLAG_DELAY_ENGINE is not enabled, this patch does not constitue a full revert to commit 7faa33da; there is still a change in behavior to the ahci_port_suspend() failure path. Signed-off-by: Brian Norris <computersforpeace@gmail.com> Signed-off-by: Jeff Garzik <jgarzik@redhat.com> Cc: stable@kernel.org
-rw-r--r--drivers/ata/ahci.h3
-rw-r--r--drivers/ata/libahci.c5
2 files changed, 8 insertions, 0 deletions
diff --git a/drivers/ata/ahci.h b/drivers/ata/ahci.h
index b1750007c8dc..feb127ef4e4e 100644
--- a/drivers/ata/ahci.h
+++ b/drivers/ata/ahci.h
@@ -210,6 +210,9 @@ enum {
210 AHCI_HFLAG_NO_SNTF = (1 << 12), /* no sntf */ 210 AHCI_HFLAG_NO_SNTF = (1 << 12), /* no sntf */
211 AHCI_HFLAG_NO_FPDMA_AA = (1 << 13), /* no FPDMA AA */ 211 AHCI_HFLAG_NO_FPDMA_AA = (1 << 13), /* no FPDMA AA */
212 AHCI_HFLAG_YES_FBS = (1 << 14), /* force FBS cap on */ 212 AHCI_HFLAG_YES_FBS = (1 << 14), /* force FBS cap on */
213 AHCI_HFLAG_DELAY_ENGINE = (1 << 15), /* do not start engine on
214 port start (wait until
215 error-handling stage) */
213 216
214 /* ap->flags bits */ 217 /* ap->flags bits */
215 218
diff --git a/drivers/ata/libahci.c b/drivers/ata/libahci.c
index a72bfd0ecfee..f9eaa82311a9 100644
--- a/drivers/ata/libahci.c
+++ b/drivers/ata/libahci.c
@@ -737,6 +737,7 @@ static void ahci_power_down(struct ata_port *ap)
737 737
738static void ahci_start_port(struct ata_port *ap) 738static void ahci_start_port(struct ata_port *ap)
739{ 739{
740 struct ahci_host_priv *hpriv = ap->host->private_data;
740 struct ahci_port_priv *pp = ap->private_data; 741 struct ahci_port_priv *pp = ap->private_data;
741 struct ata_link *link; 742 struct ata_link *link;
742 struct ahci_em_priv *emp; 743 struct ahci_em_priv *emp;
@@ -746,6 +747,10 @@ static void ahci_start_port(struct ata_port *ap)
746 /* enable FIS reception */ 747 /* enable FIS reception */
747 ahci_start_fis_rx(ap); 748 ahci_start_fis_rx(ap);
748 749
750 /* enable DMA */
751 if (!(hpriv->flags & AHCI_HFLAG_DELAY_ENGINE))
752 ahci_start_engine(ap);
753
749 /* turn on LEDs */ 754 /* turn on LEDs */
750 if (ap->flags & ATA_FLAG_EM) { 755 if (ap->flags & ATA_FLAG_EM) {
751 ata_for_each_link(link, ap, EDGE) { 756 ata_for_each_link(link, ap, EDGE) {