aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/ata/sata_inic162x.c
diff options
context:
space:
mode:
authorTejun Heo <htejun@gmail.com>2007-02-02 02:50:52 -0500
committerJeff Garzik <jeff@garzik.org>2007-05-01 07:49:54 -0400
commit9b89391cc861b8a1105551909eb66c024fe18ab2 (patch)
treef0783823927ea013c8d58c1041ad1e1d884eed9e /drivers/ata/sata_inic162x.c
parentd4b2bab4f26345ea1803feb23ea92fbe3f6b77bc (diff)
libata: improve 0xff status handling
For PATA, 0xff status indicates empty port. For SATA, it depends on how the controller emulates status register. On some controllers, 0xff is used to represent broken link or certain stage during reset. libata currently deals SATA the same. This hasn't caused any problem because problematic situations usually only occur after hotplug or other link disruption events and libata blindly waited for the device to spin up and settle after hotplug giving the link and device whatever time to go through those stages. libata is going to replace unconditional spinup wait with generic timed sequence of resets, so not only getting 0xff handling right for SATA is, well, the right thing to do, it's much more important now. This patch makes the following changes. * Make ata_bus_softreset() return -ENODEV if any of its wait fails due to 0xff status. * Fail soft/hardreset if status wait returns -ENODEV indicating 0xff status while SStatus says the link is online. e.g. Reset fails if status is 0xff after reset when SStatus reports the linke is online. If SCR registers are not available, everything is the same as before. Signed-off-by: Tejun Heo <htejun@gmail.com> Signed-off-by: Jeff Garzik <jeff@garzik.org>
Diffstat (limited to 'drivers/ata/sata_inic162x.c')
-rw-r--r--drivers/ata/sata_inic162x.c3
1 files changed, 2 insertions, 1 deletions
diff --git a/drivers/ata/sata_inic162x.c b/drivers/ata/sata_inic162x.c
index 25b747e26133..b3b62e985f19 100644
--- a/drivers/ata/sata_inic162x.c
+++ b/drivers/ata/sata_inic162x.c
@@ -453,7 +453,8 @@ static int inic_hardreset(struct ata_port *ap, unsigned int *class,
453 msleep(150); 453 msleep(150);
454 454
455 rc = ata_wait_ready(ap, deadline); 455 rc = ata_wait_ready(ap, deadline);
456 if (rc && rc != -ENODEV) { 456 /* link occupied, -ENODEV too is an error */
457 if (rc) {
457 ata_port_printk(ap, KERN_WARNING, "device not ready " 458 ata_port_printk(ap, KERN_WARNING, "device not ready "
458 "after hardreset (errno=%d)\n", rc); 459 "after hardreset (errno=%d)\n", rc);
459 return rc; 460 return rc;