X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=drivers%2Fide%2Fpci%2Ftriflex.c;h=eca0772f22e68d4a9b5ef9e3eff92c5e3f3fb3ae;hb=9e1bf581d67d87a1d7fc0ea500729e3a03643a26;hp=28c19bcce775b788a0948199f0bec08dcd06985d;hpb=8d40237c730b8be87c1b80a5d96b9c603fefa829;p=linux-2.6.git diff --git a/drivers/ide/pci/triflex.c b/drivers/ide/pci/triflex.c index 28c19bcce..eca0772f2 100644 --- a/drivers/ide/pci/triflex.c +++ b/drivers/ide/pci/triflex.c @@ -118,16 +118,25 @@ static int triflex_config_drive_xfer_rate(ide_drive_t *drive) { ide_hwif_t *hwif = HWIF(drive); struct hd_driveid *id = drive->id; - - if ((id->capability & 1) && drive->autodma) { - if (ide_use_dma(drive)) { - if (triflex_config_drive_for_dma(drive)) - return hwif->ide_dma_on(drive); - } + + if (id && (id->capability & 1) && drive->autodma) { + if (__ide_dma_bad_drive(drive)) + goto tune_pio; + if (id->field_valid & 2) { + if ((id->dma_mword & hwif->mwdma_mask) || + (id->dma_1word & hwif->swdma_mask)) { + if (!triflex_config_drive_for_dma(drive)) + goto tune_pio; + } + } else + goto tune_pio; + } else { +tune_pio: + hwif->tuneproc(drive, 255); + return hwif->ide_dma_off_quietly(drive); } - hwif->tuneproc(drive, 255); - return hwif->ide_dma_off_quietly(drive); + return hwif->ide_dma_on(drive); } static void __init init_hwif_triflex(ide_hwif_t *hwif)