diff options
author | Alan Cox <alan@lxorguk.ukuu.org.uk> | 2007-04-23 06:55:36 -0400 |
---|---|---|
committer | Jeff Garzik <jeff@garzik.org> | 2007-04-28 14:51:33 -0400 |
commit | 4f701d1e9a796a3d6657e1129bee0566d7cda916 (patch) | |
tree | ac2b13b4fc37bcc29ada2f46fde1e2cd2d734052 /drivers/ata | |
parent | c1c4e8d55757f8aec5f95eb80860e340d717c217 (diff) |
ata_timing: ensure t->cycle is always correct
Russell King hit a case where quantisation errors accumulated such that
the cycle time was shorter than rather than equal to the active/recovery
time. The code already knows how to stretch times to fit the cycle time
but does not know about the reverse.
Signed-off-by: Alan Cox <alan@redhat.com>
Signed-off-by: Jeff Garzik <jeff@garzik.org>
Diffstat (limited to 'drivers/ata')
-rw-r--r-- | drivers/ata/libata-core.c | 6 |
1 files changed, 6 insertions, 0 deletions
diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c index 227399e48470..4e1df5382b9a 100644 --- a/drivers/ata/libata-core.c +++ b/drivers/ata/libata-core.c | |||
@@ -2639,6 +2639,12 @@ int ata_timing_compute(struct ata_device *adev, unsigned short speed, | |||
2639 | t->active += (t->cycle - (t->active + t->recover)) / 2; | 2639 | t->active += (t->cycle - (t->active + t->recover)) / 2; |
2640 | t->recover = t->cycle - t->active; | 2640 | t->recover = t->cycle - t->active; |
2641 | } | 2641 | } |
2642 | |||
2643 | /* In a few cases quantisation may produce enough errors to | ||
2644 | leave t->cycle too low for the sum of active and recovery | ||
2645 | if so we must correct this */ | ||
2646 | if (t->active + t->recover > t->cycle) | ||
2647 | t->cycle = t->active + t->recover; | ||
2642 | 2648 | ||
2643 | return 0; | 2649 | return 0; |
2644 | } | 2650 | } |