]> git.hungrycats.org Git - linux/commitdiff
[ide] ide-dma blacklist behaviour broken
authorBartlomiej Zolnierkiewicz <bzolnier@trik.(none)>
Sun, 10 Oct 2004 19:37:56 +0000 (21:37 +0200)
committerBartlomiej Zolnierkiewicz <bzolnier@trik.(none)>
Sun, 10 Oct 2004 19:37:56 +0000 (21:37 +0200)
From: Jens Axboe <axboe@suse.de>

The blacklist stuff is broken. When set_using_dma() calls into
->ide_dma_check(), it returns __ide_dma_off() for a blacklisted drive.
This of course succeeds, returning success to the caller of ->ide_dma_check().
Not so good... It then uncondtionally calls ->ide_dma_on(), which turns on
DMA for the drive.

This moves the check to __ide_dma_on() so we also catch the buggy
->ide_dma_check() defined by various chipset drivers.

Signed-off-by: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
drivers/ide/ide-dma.c

index 192ef5a883e23436efffa993f6598b734fab67bc..cd32057b53a97cccfac2888022ceb63db61dc888 100644 (file)
@@ -407,10 +407,6 @@ static int config_drive_for_dma (ide_drive_t *drive)
        ide_hwif_t *hwif = HWIF(drive);
 
        if ((id->capability & 1) && hwif->autodma) {
-               /* Consult the list of known "bad" drives */
-               if (__ide_dma_bad_drive(drive))
-                       return __ide_dma_off(drive);
-
                /*
                 * Enable DMA on any drive that has
                 * UltraDMA (mode 0/1/2/3/4/5/6) enabled
@@ -564,6 +560,10 @@ EXPORT_SYMBOL(__ide_dma_host_on);
  
 int __ide_dma_on (ide_drive_t *drive)
 {
+       /* consult the list of known "bad" drives */
+       if (__ide_dma_bad_drive(drive))
+               return 1;
+
        drive->using_dma = 1;
        ide_toggle_bounce(drive, 1);