Patchwork [#upstream-fixes] sata_nv: make sure link is brough up online when skipping hardreset

login
register
mail settings
Submitter Tejun Heo
Date Oct. 14, 2009, 2:18 a.m.
Message ID <4AD534F4.7000306@kernel.org>
Download mbox | patch
Permalink /patch/35908/
State Not Applicable
Delegated to: David Miller
Headers show

Comments

Tejun Heo - Oct. 14, 2009, 2:18 a.m.
prereset doesn't bring link online if hardreset is about to happen and
nv_hardreset() may skip if conditions are not right so softreset may
be entered with non-working link status if the system firmware didn't
bring it up before entering OS code which can happen during resume.
This patch makes nv_hardreset() to bring up the link if it's skipping
reset.

This bug was reported by frodone@gmail.com in the following bug entry.

  http://bugzilla.kernel.org/show_bug.cgi?id=14329

Signed-off-by: Tejun Heo <tj@kernel.org>
Reported-by: frodone@gmail.com
Cc: stable@kernel.org
---
 drivers/ata/sata_nv.c |   18 +++++++++++++++---
 1 file changed, 15 insertions(+), 3 deletions(-)

--
To unsubscribe from this list: send the line "unsubscribe linux-ide" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Jeff Garzik - Oct. 16, 2009, 10:26 a.m.
On 10/13/2009 10:18 PM, Tejun Heo wrote:
> prereset doesn't bring link online if hardreset is about to happen and
> nv_hardreset() may skip if conditions are not right so softreset may
> be entered with non-working link status if the system firmware didn't
> bring it up before entering OS code which can happen during resume.
> This patch makes nv_hardreset() to bring up the link if it's skipping
> reset.
>
> This bug was reported by frodone@gmail.com in the following bug entry.
>
>    http://bugzilla.kernel.org/show_bug.cgi?id=14329
>
> Signed-off-by: Tejun Heo<tj@kernel.org>
> Reported-by: frodone@gmail.com
> Cc: stable@kernel.org
> ---
>   drivers/ata/sata_nv.c |   18 +++++++++++++++---
>   1 file changed, 15 insertions(+), 3 deletions(-)

applied -- man, what a pain this chip is


--
To unsubscribe from this list: send the line "unsubscribe linux-ide" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Patch

diff --git a/drivers/ata/sata_nv.c b/drivers/ata/sata_nv.c
index 86a4058..1eb4e02 100644
--- a/drivers/ata/sata_nv.c
+++ b/drivers/ata/sata_nv.c
@@ -1594,9 +1594,21 @@  static int nv_hardreset(struct ata_link *link, unsigned int *class,
 	    !ata_dev_enabled(link->device))
 		sata_link_hardreset(link, sata_deb_timing_hotplug, deadline,
 				    NULL, NULL);
-	else if (!(ehc->i.flags & ATA_EHI_QUIET))
-		ata_link_printk(link, KERN_INFO,
-				"nv: skipping hardreset on occupied port\n");
+	else {
+		const unsigned long *timing = sata_ehc_deb_timing(ehc);
+		int rc;
+
+		if (!(ehc->i.flags & ATA_EHI_QUIET))
+			ata_link_printk(link, KERN_INFO, "nv: skipping "
+					"hardreset on occupied port\n");
+
+		/* make sure the link is online */
+		rc = sata_link_resume(link, timing, deadline);
+		/* whine about phy resume failure but proceed */
+		if (rc && rc != -EOPNOTSUPP)
+			ata_link_printk(link, KERN_WARNING, "failed to resume "
+					"link (errno=%d)\n", rc);
+	}

 	/* device signature acquisition is unreliable */
 	return -EAGAIN;