[ide] ide-dma blacklist behaviour broken

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: default avatarBartlomiej Zolnierkiewicz <bzolnier@gmail.com>
parent 33b01313
...@@ -407,10 +407,6 @@ static int config_drive_for_dma (ide_drive_t *drive) ...@@ -407,10 +407,6 @@ static int config_drive_for_dma (ide_drive_t *drive)
ide_hwif_t *hwif = HWIF(drive); ide_hwif_t *hwif = HWIF(drive);
if ((id->capability & 1) && hwif->autodma) { 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 * Enable DMA on any drive that has
* UltraDMA (mode 0/1/2/3/4/5/6) enabled * UltraDMA (mode 0/1/2/3/4/5/6) enabled
...@@ -564,6 +560,10 @@ EXPORT_SYMBOL(__ide_dma_host_on); ...@@ -564,6 +560,10 @@ EXPORT_SYMBOL(__ide_dma_host_on);
int __ide_dma_on (ide_drive_t *drive) 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; drive->using_dma = 1;
ide_toggle_bounce(drive, 1); ide_toggle_bounce(drive, 1);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment