ata_timing: ensure t->cycle is always correct
authorAlan Cox <alan@lxorguk.ukuu.org.uk>
Mon, 23 Apr 2007 10:55:36 +0000 (11:55 +0100)
committerJeff Garzik <jeff@garzik.org>
Sat, 28 Apr 2007 18:51:33 +0000 (14:51 -0400)
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>
drivers/ata/libata-core.c

index 227399e4847052472e63a29cecd0ad5883a04f4b..4e1df5382b9a197977d806b2606a5a5b420b26dc 100644 (file)
@@ -2639,6 +2639,12 @@ int ata_timing_compute(struct ata_device *adev, unsigned short speed,
                t->active += (t->cycle - (t->active + t->recover)) / 2;
                t->recover = t->cycle - t->active;
        }
+       
+       /* In a few cases quantisation may produce enough errors to
+          leave t->cycle too low for the sum of active and recovery
+          if so we must correct this */
+       if (t->active + t->recover > t->cycle)
+               t->cycle = t->active + t->recover;
 
        return 0;
 }