Patchwork [libata] Issue SRST to Disks behind Sil3726

login
register
mail settings
Submitter Gwendal Grignou
Date Oct. 20, 2011, 12:35 a.m.
Message ID <1319070953-24391-2-git-send-email-gwendal@google.com>
Download mbox | patch
Permalink /patch/120716/
State Not Applicable
Delegated to: David Miller
Headers show

Comments

Gwendal Grignou - Oct. 20, 2011, 12:35 a.m.
Reenable sending SRST to devices connected behind a Sil3726 PMP.
This allow staggered spinups and handles drives that spins up slowly.

While the drives spin up, the PMP will not accept SRST.
Most controllers reissue the reset until the drive is ready, while
some [Sil3124] returns an error.
In ata_eh_error, wait for the next reset deadline before resetting the ATA
port and trying again.


Signed-off-by: Gwendal Grignou <gwendal@google.com>
---
 drivers/ata/libata-eh.c  |   12 +++++++++++-
 drivers/ata/libata-pmp.c |    7 ++-----
 2 files changed, 13 insertions(+), 6 deletions(-)
Tejun Heo - Oct. 20, 2011, 12:37 a.m.
On Wed, Oct 19, 2011 at 05:35:53PM -0700, Gwendal Grignou wrote:
> Reenable sending SRST to devices connected behind a Sil3726 PMP.
> This allow staggered spinups and handles drives that spins up slowly.
> 
> While the drives spin up, the PMP will not accept SRST.
> Most controllers reissue the reset until the drive is ready, while
> some [Sil3124] returns an error.
> In ata_eh_error, wait for the next reset deadline before resetting the ATA
> port and trying again.
> 
> 
> Signed-off-by: Gwendal Grignou <gwendal@google.com>

 Acked-by: Tejun Heo <tj@kernel.org>

I hope this can be applied to other controllers too as the failure
mode should be similar for all SIMG PMPs.

Thanks.

Patch

diff --git a/drivers/ata/libata-eh.c b/drivers/ata/libata-eh.c
index c021186..927d750 100644
--- a/drivers/ata/libata-eh.c
+++ b/drivers/ata/libata-eh.c
@@ -2882,7 +2882,7 @@  int ata_eh_reset(struct ata_link *link, int classify,
 	    sata_scr_read(link, SCR_STATUS, &sstatus))
 		rc = -ERESTART;
 
-	if (rc == -ERESTART || try >= max_tries) {
+	if (try >= max_tries) {
 		/*
 		 * Thaw host port even if reset failed, so that the port
 		 * can be retried on the next phy event.  This risks
@@ -2908,6 +2908,16 @@  int ata_eh_reset(struct ata_link *link, int classify,
 		ata_eh_acquire(ap);
 	}
 
+	/*
+	 * While disks spinup behind PMP, some controllers fail sending SRST.
+	 * They need to be reset - as well as the PMP - before retrying.
+	 */
+	if (rc == -ERESTART) {
+		if (ata_is_host_link(link))
+			ata_eh_thaw_port(ap);
+		goto out;
+	}
+
 	if (try == max_tries - 1) {
 		sata_down_spd_limit(link, 0);
 		if (slave)
diff --git a/drivers/ata/libata-pmp.c b/drivers/ata/libata-pmp.c
index 3eb2b81..183643f 100644
--- a/drivers/ata/libata-pmp.c
+++ b/drivers/ata/libata-pmp.c
@@ -388,12 +388,9 @@  static void sata_pmp_quirks(struct ata_port *ap)
 			/* link reports offline after LPM */
 			link->flags |= ATA_LFLAG_NO_LPM;
 
-			/* Class code report is unreliable and SRST
-			 * times out under certain configurations.
-			 */
+			/* Class code report is unreliable. */
 			if (link->pmp < 5)
-				link->flags |= ATA_LFLAG_NO_SRST |
-					       ATA_LFLAG_ASSUME_ATA;
+				link->flags |= ATA_LFLAG_ASSUME_ATA;
 
 			/* port 5 is for SEMB device and it doesn't like SRST */
 			if (link->pmp == 5)