login
Header Space

 
 

[PATCH #upstream-fixes] libata: force hardreset if the link is in powersave mode

Score:
Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]
To: Paul Collins <paul@...>
Cc: Jeff Garzik <jeff@...>, <linux-kernel@...>
Date: Tuesday, April 15, 2008 - 9:27 pm

Currently, libata doesn't support link powersave modes and always
disables link PS modes.  However, if the link is already in powersave
mode when libata begis probing, inhibiting powersave modes by setting
IPM isn't enough.  Link should be manually transited into active mode
using SPM or hardreset.

As SPM isn't avalable on all controllers and we're gonna prefer
hardreset in future anyway, force hardreset if link is in powersave
mode.

Reported-by: Paul Collins <paul@burly.ondioline.org>
Signed-off-by: Tejun Heo <htejun@gmail.com>
---
Jeff, this isn't necessary for #upstream.

 drivers/ata/libata-core.c |   15 +++++++++++++++
 1 file changed, 15 insertions(+)

index be95fdb..e3ddefd 100644
--- a/drivers/ata/libata-core.c
+++ b/drivers/ata/libata-core.c
@@ -3966,11 +3966,26 @@ int ata_std_prereset(struct ata_link *link, unsigned long deadline)
 
 	/* if SATA, resume link */
 	if (ap->flags & ATA_FLAG_SATA) {
+		u32 sstatus;
+
 		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 for reset (errno=%d)\n", rc);
+
+		/* force hardreset if the link is sleeping */
+		if (sata_scr_read(link, SCR_STATUS, &sstatus) == 0) {
+			u8 ipm = sstatus >> 8;
+
+			if (ipm == 2 || ipm == 6) {
+				ata_link_printk(link, KERN_INFO,
+					"link in %s mode, forcing hardreset\n",
+					ipm == 2 ? "partial" : "slumber");
+				ehc->i.action |= ATA_EH_HARDRESET;
+				return 0;
+			}
+		}
 	}
 
 	/* Wait for !BSY if the controller can wait for the first D2H
--
Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]

Messages in current thread:
ata2: SATA link down (SStatus 611 SControl 300), Paul Collins, (Mon Apr 14, 5:48 pm)
Re: ata2: SATA link down (SStatus 611 SControl 300), Tejun Heo, (Mon Apr 14, 9:53 pm)
Re: ata2: SATA link down (SStatus 611 SControl 300), Paul Collins, (Mon Apr 14, 10:30 pm)
Re: ata2: SATA link down (SStatus 611 SControl 300), Tejun Heo, (Mon Apr 14, 10:57 pm)
Re: ata2: SATA link down (SStatus 611 SControl 300), Paul Collins, (Mon Apr 14, 11:24 pm)
Re: ata2: SATA link down (SStatus 611 SControl 300), Tejun Heo, (Tue Apr 15, 12:01 am)
Re: ata2: SATA link down (SStatus 611 SControl 300), Paul Collins, (Tue Apr 15, 5:12 pm)
Re: ata2: SATA link down (SStatus 611 SControl 300), Tejun Heo, (Tue Apr 15, 6:26 pm)
Re: ata2: SATA link down (SStatus 611 SControl 300), Paul Collins, (Tue Apr 15, 6:43 pm)
Re: ata2: SATA link down (SStatus 611 SControl 300), Tejun Heo, (Tue Apr 15, 8:15 pm)
Re: ata2: SATA link down (SStatus 611 SControl 300), Tejun Heo, (Tue Apr 15, 8:33 pm)
Re: ata2: SATA link down (SStatus 611 SControl 300), Paul Collins, (Tue Apr 15, 9:06 pm)
[PATCH #upstream-fixes] libata: force hardreset if the link ..., Tejun Heo, (Tue Apr 15, 9:27 pm)
speck-geostationary