diff options
author | Tejun Heo <htejun@gmail.com> | 2008-04-07 09:47:19 -0400 |
---|---|---|
committer | Jeff Garzik <jgarzik@redhat.com> | 2008-04-17 15:44:22 -0400 |
commit | 705e76beb90b97421e1f61e857c4246799781bb5 (patch) | |
tree | e571ad9229d469cd73d1388c76823922400823d5 /drivers/ata/sata_inic162x.c | |
parent | 203c75b8245c5386044721d9c5eda5c6b71b3d14 (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/sata_inic162x.c')
-rw-r--r-- | drivers/ata/sata_inic162x.c | 6 |
1 files changed, 2 insertions, 4 deletions
diff --git a/drivers/ata/sata_inic162x.c b/drivers/ata/sata_inic162x.c index 0b5a736a45e3..9f47d0022453 100644 --- a/drivers/ata/sata_inic162x.c +++ b/drivers/ata/sata_inic162x.c | |||
@@ -417,10 +417,8 @@ static int inic_hardreset(struct ata_link *link, unsigned int *class, | |||
417 | if (ata_link_online(link)) { | 417 | if (ata_link_online(link)) { |
418 | struct ata_taskfile tf; | 418 | struct ata_taskfile tf; |
419 | 419 | ||
420 | /* wait a while before checking status */ | 420 | /* wait for link to become ready */ |
421 | ata_sff_wait_after_reset(ap, deadline); | 421 | rc = ata_sff_wait_after_reset(link, 1, deadline); |
422 | |||
423 | rc = ata_sff_wait_ready(ap, deadline); | ||
424 | /* link occupied, -ENODEV too is an error */ | 422 | /* link occupied, -ENODEV too is an error */ |
425 | if (rc) { | 423 | if (rc) { |
426 | ata_link_printk(link, KERN_WARNING, "device not ready " | 424 | ata_link_printk(link, KERN_WARNING, "device not ready " |