aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/ata
diff options
context:
space:
mode:
authorAlan Cox <alan@lxorguk.ukuu.org.uk>2007-04-23 06:55:36 -0400
committerJeff Garzik <jeff@garzik.org>2007-04-28 14:51:33 -0400
commit4f701d1e9a796a3d6657e1129bee0566d7cda916 (patch)
treeac2b13b4fc37bcc29ada2f46fde1e2cd2d734052 /drivers/ata
parentc1c4e8d55757f8aec5f95eb80860e340d717c217 (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.c6
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}