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>
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
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);