pata_cypress: fix PIO timings underclocking
authorBartlomiej Zolnierkiewicz <bzolnier@gmail.com>
Mon, 18 Jan 2010 17:15:47 +0000 (18:15 +0100)
committerJeff Garzik <jgarzik@redhat.com>
Mon, 1 Mar 2010 19:58:45 +0000 (14:58 -0500)
Timing registers should be programmed with the desired number of clocks
minus one clock.

Signed-off-by: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
Signed-off-by: Jeff Garzik <jgarzik@redhat.com>
drivers/ata/pata_cypress.c

index 8fb040b..ff6c37d 100644 (file)
@@ -62,14 +62,16 @@ static void cy82c693_set_piomode(struct ata_port *ap, struct ata_device *adev)
                return;
        }
 
-       time_16 = clamp_val(t.recover, 0, 15) | (clamp_val(t.active, 0, 15) << 4);
-       time_8 = clamp_val(t.act8b, 0, 15) | (clamp_val(t.rec8b, 0, 15) << 4);
+       time_16 = clamp_val(t.recover - 1, 0, 15) |
+                 (clamp_val(t.active - 1, 0, 15) << 4);
+       time_8 = clamp_val(t.act8b - 1, 0, 15) |
+                (clamp_val(t.rec8b - 1, 0, 15) << 4);
 
        if (adev->devno == 0) {
                pci_read_config_dword(pdev, CY82_IDE_ADDRSETUP, &addr);
 
                addr &= ~0x0F;  /* Mask bits */
-               addr |= clamp_val(t.setup, 0, 15);
+               addr |= clamp_val(t.setup - 1, 0, 15);
 
                pci_write_config_dword(pdev, CY82_IDE_ADDRSETUP, addr);
                pci_write_config_byte(pdev, CY82_IDE_MASTER_IOR, time_16);
@@ -79,7 +81,7 @@ static void cy82c693_set_piomode(struct ata_port *ap, struct ata_device *adev)
                pci_read_config_dword(pdev, CY82_IDE_ADDRSETUP, &addr);
 
                addr &= ~0xF0;  /* Mask bits */
-               addr |= (clamp_val(t.setup, 0, 15) << 4);
+               addr |= (clamp_val(t.setup - 1, 0, 15) << 4);
 
                pci_write_config_dword(pdev, CY82_IDE_ADDRSETUP, addr);
                pci_write_config_byte(pdev, CY82_IDE_SLAVE_IOR, time_16);