Browse Source

libata: Add the AHCI_HFLAG_NO_WRITE_TO_RO flag

While most hardware will simply ignore a write to a read-only register,
some hardware will signal an abort if this occurs.

This commit introduces the flag AHCI_HFLAG_NO_WRITE_TO_RO to prevent the
AHCI library from attempting to write to the HOST_CAP, HOST_CAP2, and
HOST_PORTS_IMPL registers which may be read-only.

Signed-off-by: Doug Berger <opendmb@gmail.com>
Signed-off-by: Tejun Heo <tj@kernel.org>
Doug Berger 8 years ago
parent
commit
7fab72f85d
2 changed files with 4 additions and 1 deletions
  1. 2 0
      drivers/ata/ahci.h
  2. 2 1
      drivers/ata/libahci.c

+ 2 - 0
drivers/ata/ahci.h

@@ -249,6 +249,8 @@ enum {
 #endif
 #endif
 	AHCI_HFLAG_WAKE_BEFORE_STOP	= (1 << 22), /* wake before DMA stop */
 	AHCI_HFLAG_WAKE_BEFORE_STOP	= (1 << 22), /* wake before DMA stop */
 	AHCI_HFLAG_YES_ALPM		= (1 << 23), /* force ALPM cap on */
 	AHCI_HFLAG_YES_ALPM		= (1 << 23), /* force ALPM cap on */
+	AHCI_HFLAG_NO_WRITE_TO_RO	= (1 << 24), /* don't write to read
+							only registers */
 
 
 	/* ap->flags bits */
 	/* ap->flags bits */
 
 

+ 2 - 1
drivers/ata/libahci.c

@@ -945,7 +945,8 @@ int ahci_reset_controller(struct ata_host *host)
 		/* Some registers might be cleared on reset.  Restore
 		/* Some registers might be cleared on reset.  Restore
 		 * initial values.
 		 * initial values.
 		 */
 		 */
-		ahci_restore_initial_config(host);
+		if (!(hpriv->flags & AHCI_HFLAG_NO_WRITE_TO_RO))
+			ahci_restore_initial_config(host);
 	} else
 	} else
 		dev_info(host->dev, "skipping global host reset\n");
 		dev_info(host->dev, "skipping global host reset\n");