|
@@ -349,9 +349,17 @@ EXPORT_SYMBOL_GPL(ide_destroy_dmatable);
|
|
|
|
|
|
static int config_drive_for_dma (ide_drive_t *drive)
|
|
|
{
|
|
|
+ ide_hwif_t *hwif = drive->hwif;
|
|
|
struct hd_driveid *id = drive->id;
|
|
|
|
|
|
- if ((id->capability & 1) && drive->hwif->autodma) {
|
|
|
+ /* consult the list of known "bad" drives */
|
|
|
+ if (__ide_dma_bad_drive(drive))
|
|
|
+ return -1;
|
|
|
+
|
|
|
+ if (drive->media != ide_disk && hwif->atapi_dma == 0)
|
|
|
+ return -1;
|
|
|
+
|
|
|
+ if ((id->capability & 1) && drive->autodma) {
|
|
|
/*
|
|
|
* Enable DMA on any drive that has
|
|
|
* UltraDMA (mode 0/1/2/3/4/5/6) enabled
|
|
@@ -513,20 +521,6 @@ int __ide_dma_on (ide_drive_t *drive)
|
|
|
|
|
|
EXPORT_SYMBOL(__ide_dma_on);
|
|
|
|
|
|
-/**
|
|
|
- * __ide_dma_check - check DMA setup
|
|
|
- * @drive: drive to check
|
|
|
- *
|
|
|
- * Don't use - due for extermination
|
|
|
- */
|
|
|
-
|
|
|
-int __ide_dma_check (ide_drive_t *drive)
|
|
|
-{
|
|
|
- return config_drive_for_dma(drive);
|
|
|
-}
|
|
|
-
|
|
|
-EXPORT_SYMBOL(__ide_dma_check);
|
|
|
-
|
|
|
/**
|
|
|
* ide_dma_setup - begin a DMA phase
|
|
|
* @drive: target device
|
|
@@ -1021,7 +1015,7 @@ void ide_setup_dma (ide_hwif_t *hwif, unsigned long dma_base, unsigned int num_p
|
|
|
if (!hwif->dma_host_on)
|
|
|
hwif->dma_host_on = &ide_dma_host_on;
|
|
|
if (!hwif->ide_dma_check)
|
|
|
- hwif->ide_dma_check = &__ide_dma_check;
|
|
|
+ hwif->ide_dma_check = &config_drive_for_dma;
|
|
|
if (!hwif->dma_setup)
|
|
|
hwif->dma_setup = &ide_dma_setup;
|
|
|
if (!hwif->dma_exec_cmd)
|