aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/ata/ahci.c
diff options
context:
space:
mode:
authorTejun Heo <htejun@gmail.com>2008-04-07 09:47:19 -0400
committerJeff Garzik <jgarzik@redhat.com>2008-04-17 15:44:22 -0400
commit705e76beb90b97421e1f61e857c4246799781bb5 (patch)
treee571ad9229d469cd73d1388c76823922400823d5 /drivers/ata/ahci.c
parent203c75b8245c5386044721d9c5eda5c6b71b3d14 (diff)
libata: restructure SFF post-reset readiness waits
Previously, post-softreset readiness is waited as follows. 1. ata_sff_wait_after_reset() waits for 150ms and then for ATA_TMOUT_FF_WAIT if status is 0xff and other conditions meet. 2. ata_bus_softreset() finishes with -ENODEV if status is still 0xff. If not, continue to #3. 3. ata_bus_post_reset() waits readiness of dev0 and/or dev1 depending on devmask using ata_sff_wait_ready(). And for post-hardreset readiness, 1. ata_sff_wait_after_reset() waits for 150ms and then for ATA_TMOUT_FF_WAIT if status is 0xff and other conditions meet. 2. sata_sff_hardreset waits for device readiness using ata_sff_wait_ready(). This patch merges and unifies post-reset readiness waits into ata_sff_wait_ready() and ata_sff_wait_after_reset(). ATA_TMOUT_FF_WAIT handling is merged into ata_sff_wait_ready(). If TF status is 0xff, link status is unknown and the port is SATA, it will continue polling till ATA_TMOUT_FF_WAIT. ata_sff_wait_after_reset() is updated to perform the following steps. 1. waits for 150ms. 2. waits for dev0 readiness using ata_sff_wait_ready(). Note that this is done regardless of devmask, as ata_sff_wait_ready() handles 0xff status correctly, this preserves the original behavior except that it may wait longer after softreset if link is online but status is 0xff. This behavior change is very unlikely to cause any actual difference and is intended. It brings softreset behavior to that of hardreset. 3. waits for dev1 readiness just the same way ata_bus_post_reset() did. Now both soft and hard resets call ata_sff_wait_after_reset() after reset to wait for readiness after resets. As ata_sff_wait_after_reset() contains calls to ->sff_dev_select(), explicit call near the end of sata_sff_hardreset() is removed. This change makes reset implementation simpler and more consistent. While at it, make the magical 150ms wait post-reset wait duration a constant and ata_sff_wait_ready() and ata_sff_wait_after_reset() take @link instead of @ap. This is to make them consistent with other reset helpers and ease core changes. pata_scc is updated accordingly. Signed-off-by: Tejun Heo <htejun@gmail.com>
Diffstat (limited to 'drivers/ata/ahci.c')
-rw-r--r--drivers/ata/ahci.c11
1 files changed, 3 insertions, 8 deletions
diff --git a/drivers/ata/ahci.c b/drivers/ata/ahci.c
index 939dc1d4e50d..45a67a9ad8ab 100644
--- a/drivers/ata/ahci.c
+++ b/drivers/ata/ahci.c
@@ -1302,10 +1302,8 @@ static int ahci_do_softreset(struct ata_link *link, unsigned int *class,
1302 tf.ctl &= ~ATA_SRST; 1302 tf.ctl &= ~ATA_SRST;
1303 ahci_exec_polled_cmd(ap, pmp, &tf, 0, 0, 0); 1303 ahci_exec_polled_cmd(ap, pmp, &tf, 0, 0, 0);
1304 1304
1305 /* wait a while before checking status */ 1305 /* wait for link to become ready */
1306 ata_sff_wait_after_reset(ap, deadline); 1306 rc = ata_sff_wait_after_reset(link, 1, deadline);
1307
1308 rc = ata_sff_wait_ready(ap, deadline);
1309 /* link occupied, -ENODEV too is an error */ 1307 /* link occupied, -ENODEV too is an error */
1310 if (rc) { 1308 if (rc) {
1311 reason = "device not ready"; 1309 reason = "device not ready";
@@ -1415,9 +1413,6 @@ static int ahci_p5wdh_hardreset(struct ata_link *link, unsigned int *class,
1415 if (rc || ata_link_offline(link)) 1413 if (rc || ata_link_offline(link))
1416 return rc; 1414 return rc;
1417 1415
1418 /* spec mandates ">= 2ms" before checking status */
1419 msleep(150);
1420
1421 /* The pseudo configuration device on SIMG4726 attached to 1416 /* The pseudo configuration device on SIMG4726 attached to
1422 * ASUS P5W-DH Deluxe doesn't send signature FIS after 1417 * ASUS P5W-DH Deluxe doesn't send signature FIS after
1423 * hardreset if no device is attached to the first downstream 1418 * hardreset if no device is attached to the first downstream
@@ -1431,7 +1426,7 @@ static int ahci_p5wdh_hardreset(struct ata_link *link, unsigned int *class,
1431 * have to be reset again. For most cases, this should 1426 * have to be reset again. For most cases, this should
1432 * suffice while making probing snappish enough. 1427 * suffice while making probing snappish enough.
1433 */ 1428 */
1434 rc = ata_sff_wait_ready(ap, jiffies + 2 * HZ); 1429 rc = ata_sff_wait_after_reset(link, 1, jiffies + 2 * HZ);
1435 if (rc) 1430 if (rc)
1436 ahci_kick_engine(ap, 0); 1431 ahci_kick_engine(ap, 0);
1437 1432