]> git.hungrycats.org Git - linux/commitdiff
[PATCH] fix ServerWorks PIO auto-tuning
authorBartlomiej Zolnierkiewicz <b.zolnierkiewicz@elka.pw.edu.pl>
Fri, 17 Oct 2003 03:49:11 +0000 (20:49 -0700)
committerLinus Torvalds <torvalds@home.osdl.org>
Fri, 17 Oct 2003 03:49:11 +0000 (20:49 -0700)
If PIO mode should be auto-tuned xferspeed argument for svwks_tune_chipset()
is equal to 255 (0xFF).  It is then passed to ide_rate_filter() which matches
desired mode with chipset capabilities.  Since 255 is greater than any of the
values used for transfer modes, ide_rate_filter() will always return the
highest mode supported by both device/chipset (which sometimes should not be
used ie. when host is a simplex one) and the wrong mode will be set.

Thanks to Torben Mathiasen and Tomas Szepe for testing it.

drivers/ide/pci/serverworks.c

index 66b8d9b4f5fbf418ca7cc7f7c5ee6fa7902e4d59..b5afd8c142e607dbda50817389e13e5418033f0d 100644 (file)
@@ -272,7 +272,7 @@ static int svwks_tune_chipset (ide_drive_t *drive, u8 xferspeed)
 
        ide_hwif_t *hwif        = HWIF(drive);
        struct pci_dev *dev     = hwif->pci_dev;
-       u8 speed                = ide_rate_filter(svwks_ratemask(drive), xferspeed);
+       u8 speed;
        u8 pio                  = ide_get_best_pio_mode(drive, 255, 5, NULL);
        u8 unit                 = (drive->select.b.unit & 0x01);
        u8 csb5                 = svwks_csb_check(dev);
@@ -280,6 +280,11 @@ static int svwks_tune_chipset (ide_drive_t *drive, u8 xferspeed)
        u8 dma_timing           = 0, pio_timing = 0;
        u16 csb5_pio            = 0;
 
+       if (xferspeed == 255)   /* PIO auto-tuning */
+               speed = XFER_PIO_0 + pio;
+       else
+               speed = ide_rate_filter(svwks_ratemask(drive), xferspeed);
+
        /* If we are about to put a disk into UDMA mode we screwed up.
           Our code assumes we never _ever_ do this on an OSB4 */