ide: add ide_set_dma() helper (v2)

* add ide_set_dma() helper and make ide_hwif_t.ide_dma_check return
  -1 when DMA needs to be disabled (== need to call ->ide_dma_off_quietly)
   0 when DMA needs to be enabled  (== need to call ->ide_dma_on)
   1 when DMA setting shouldn't be changed
* fix IDE code to use ide_set_dma() instead if using ->ide_dma_check directly

v2:
* updated for scc_pata
Signed-off-by: default avatarBartlomiej Zolnierkiewicz <bzolnier@gmail.com>
parent 9ef5791e
...@@ -365,10 +365,7 @@ static int icside_dma_check(ide_drive_t *drive) ...@@ -365,10 +365,7 @@ static int icside_dma_check(ide_drive_t *drive)
out: out:
on = icside_set_speed(drive, xfer_mode); on = icside_set_speed(drive, xfer_mode);
if (on) return on ? 0 : -1;
return icside_dma_on(drive);
else
return icside_dma_off_quietly(drive);
} }
static int icside_dma_end(ide_drive_t *drive) static int icside_dma_end(ide_drive_t *drive)
......
...@@ -1048,12 +1048,10 @@ static ide_startstop_t cris_dma_intr (ide_drive_t *drive) ...@@ -1048,12 +1048,10 @@ static ide_startstop_t cris_dma_intr (ide_drive_t *drive)
static int cris_dma_check(ide_drive_t *drive) static int cris_dma_check(ide_drive_t *drive)
{ {
ide_hwif_t *hwif = drive->hwif;
if (ide_use_dma(drive) && cris_config_drive_for_dma(drive)) if (ide_use_dma(drive) && cris_config_drive_for_dma(drive))
return hwif->ide_dma_on(drive); return 0;
return hwif->ide_dma_off_quietly(drive); return -1;
} }
static int cris_dma_end(ide_drive_t *drive) static int cris_dma_end(ide_drive_t *drive)
......
...@@ -348,15 +348,14 @@ EXPORT_SYMBOL_GPL(ide_destroy_dmatable); ...@@ -348,15 +348,14 @@ EXPORT_SYMBOL_GPL(ide_destroy_dmatable);
static int config_drive_for_dma (ide_drive_t *drive) static int config_drive_for_dma (ide_drive_t *drive)
{ {
struct hd_driveid *id = drive->id; struct hd_driveid *id = drive->id;
ide_hwif_t *hwif = HWIF(drive);
if ((id->capability & 1) && hwif->autodma) { if ((id->capability & 1) && drive->hwif->autodma) {
/* /*
* 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
*/ */
if ((id->field_valid & 4) && ((id->dma_ultra >> 8) & 0x7f)) if ((id->field_valid & 4) && ((id->dma_ultra >> 8) & 0x7f))
return hwif->ide_dma_on(drive); return 0;
/* /*
* Enable DMA on any drive that has mode2 DMA * Enable DMA on any drive that has mode2 DMA
* (multi or single) enabled * (multi or single) enabled
...@@ -364,14 +363,14 @@ static int config_drive_for_dma (ide_drive_t *drive) ...@@ -364,14 +363,14 @@ static int config_drive_for_dma (ide_drive_t *drive)
if (id->field_valid & 2) /* regular DMA */ if (id->field_valid & 2) /* regular DMA */
if ((id->dma_mword & 0x404) == 0x404 || if ((id->dma_mword & 0x404) == 0x404 ||
(id->dma_1word & 0x404) == 0x404) (id->dma_1word & 0x404) == 0x404)
return hwif->ide_dma_on(drive); return 0;
/* Consult the list of known "good" drives */ /* Consult the list of known "good" drives */
if (__ide_dma_good_drive(drive)) if (__ide_dma_good_drive(drive))
return hwif->ide_dma_on(drive); return 0;
} }
// if (hwif->tuneproc != NULL) hwif->tuneproc(drive, 255);
return hwif->ide_dma_off_quietly(drive); return -1;
} }
/** /**
...@@ -765,6 +764,30 @@ void ide_dma_verbose(ide_drive_t *drive) ...@@ -765,6 +764,30 @@ void ide_dma_verbose(ide_drive_t *drive)
EXPORT_SYMBOL(ide_dma_verbose); EXPORT_SYMBOL(ide_dma_verbose);
int ide_set_dma(ide_drive_t *drive)
{
ide_hwif_t *hwif = drive->hwif;
int rc;
rc = hwif->ide_dma_check(drive);
switch(rc) {
case -1: /* DMA needs to be disabled */
return hwif->ide_dma_off_quietly(drive);
case 0: /* DMA needs to be enabled */
return hwif->ide_dma_on(drive);
case 1: /* DMA setting cannot be changed */
break;
default:
BUG();
break;
}
return rc;
}
EXPORT_SYMBOL_GPL(ide_set_dma);
#ifdef CONFIG_BLK_DEV_IDEDMA_PCI #ifdef CONFIG_BLK_DEV_IDEDMA_PCI
int __ide_dma_lostirq (ide_drive_t *drive) int __ide_dma_lostirq (ide_drive_t *drive)
{ {
......
...@@ -226,7 +226,7 @@ static ide_startstop_t ide_start_power_step(ide_drive_t *drive, struct request * ...@@ -226,7 +226,7 @@ static ide_startstop_t ide_start_power_step(ide_drive_t *drive, struct request *
break; break;
if (drive->hwif->ide_dma_check == NULL) if (drive->hwif->ide_dma_check == NULL)
break; break;
drive->hwif->ide_dma_check(drive); ide_set_dma(drive);
break; break;
} }
pm->pm_step = ide_pm_state_completed; pm->pm_step = ide_pm_state_completed;
......
...@@ -857,7 +857,7 @@ static void probe_hwif(ide_hwif_t *hwif) ...@@ -857,7 +857,7 @@ static void probe_hwif(ide_hwif_t *hwif)
#ifdef CONFIG_IDEDMA_ONLYDISK #ifdef CONFIG_IDEDMA_ONLYDISK
if (drive->media == ide_disk) if (drive->media == ide_disk)
#endif #endif
hwif->ide_dma_check(drive); ide_set_dma(drive);
} }
} }
} }
......
...@@ -1135,7 +1135,8 @@ static int set_using_dma (ide_drive_t *drive, int arg) ...@@ -1135,7 +1135,8 @@ static int set_using_dma (ide_drive_t *drive, int arg)
if (HWIF(drive)->ide_dma_check == NULL) if (HWIF(drive)->ide_dma_check == NULL)
return -EPERM; return -EPERM;
if (arg) { if (arg) {
if (HWIF(drive)->ide_dma_check(drive)) return -EIO; if (ide_set_dma(drive))
return -EIO;
if (HWIF(drive)->ide_dma_on(drive)) return -EIO; if (HWIF(drive)->ide_dma_on(drive)) return -EIO;
} else { } else {
if (__ide_dma_off(drive)) if (__ide_dma_off(drive))
......
...@@ -414,9 +414,9 @@ static int auide_dma_check(ide_drive_t *drive) ...@@ -414,9 +414,9 @@ static int auide_dma_check(ide_drive_t *drive)
speed = ide_find_best_mode(drive, XFER_PIO | XFER_MWDMA); speed = ide_find_best_mode(drive, XFER_PIO | XFER_MWDMA);
if (drive->autodma && (speed & XFER_MODE) != XFER_PIO) if (drive->autodma && (speed & XFER_MODE) != XFER_PIO)
return HWIF(drive)->ide_dma_on(drive); return 0;
return HWIF(drive)->ide_dma_off_quietly(drive); return -1;
} }
static int auide_dma_test_irq(ide_drive_t *drive) static int auide_dma_test_irq(ide_drive_t *drive)
......
...@@ -209,15 +209,13 @@ static void aec62xx_tune_drive (ide_drive_t *drive, u8 pio) ...@@ -209,15 +209,13 @@ static void aec62xx_tune_drive (ide_drive_t *drive, u8 pio)
static int aec62xx_config_drive_xfer_rate (ide_drive_t *drive) static int aec62xx_config_drive_xfer_rate (ide_drive_t *drive)
{ {
ide_hwif_t *hwif = HWIF(drive);
if (ide_use_dma(drive) && config_chipset_for_dma(drive)) if (ide_use_dma(drive) && config_chipset_for_dma(drive))
return hwif->ide_dma_on(drive); return 0;
if (ide_use_fast_pio(drive)) if (ide_use_fast_pio(drive))
aec62xx_tune_drive(drive, 5); aec62xx_tune_drive(drive, 5);
return hwif->ide_dma_off_quietly(drive); return -1;
} }
static int aec62xx_irq_timeout (ide_drive_t *drive) static int aec62xx_irq_timeout (ide_drive_t *drive)
......
...@@ -507,8 +507,6 @@ static int config_chipset_for_dma (ide_drive_t *drive) ...@@ -507,8 +507,6 @@ static int config_chipset_for_dma (ide_drive_t *drive)
* *
* Configure a drive for DMA operation. If DMA is not possible we * Configure a drive for DMA operation. If DMA is not possible we
* drop the drive into PIO mode instead. * drop the drive into PIO mode instead.
*
* FIXME: exactly what are we trying to return here
*/ */
static int ali15x3_config_drive_for_dma(ide_drive_t *drive) static int ali15x3_config_drive_for_dma(ide_drive_t *drive)
...@@ -517,7 +515,7 @@ static int ali15x3_config_drive_for_dma(ide_drive_t *drive) ...@@ -517,7 +515,7 @@ static int ali15x3_config_drive_for_dma(ide_drive_t *drive)
struct hd_driveid *id = drive->id; struct hd_driveid *id = drive->id;
if ((m5229_revision<=0x20) && (drive->media!=ide_disk)) if ((m5229_revision<=0x20) && (drive->media!=ide_disk))
return hwif->ide_dma_off_quietly(drive); goto no_dma_set;
drive->init_speed = 0; drive->init_speed = 0;
...@@ -552,9 +550,10 @@ static int ali15x3_config_drive_for_dma(ide_drive_t *drive) ...@@ -552,9 +550,10 @@ static int ali15x3_config_drive_for_dma(ide_drive_t *drive)
ata_pio: ata_pio:
hwif->tuneproc(drive, 255); hwif->tuneproc(drive, 255);
no_dma_set: no_dma_set:
return hwif->ide_dma_off_quietly(drive); return -1;
} }
return hwif->ide_dma_on(drive);
return 0;
} }
/** /**
......
...@@ -304,8 +304,9 @@ static int amd74xx_ide_dma_check(ide_drive_t *drive) ...@@ -304,8 +304,9 @@ static int amd74xx_ide_dma_check(ide_drive_t *drive)
amd_set_drive(drive, speed); amd_set_drive(drive, speed);
if (drive->autodma && (speed & XFER_MODE) != XFER_PIO) if (drive->autodma && (speed & XFER_MODE) != XFER_PIO)
return HWIF(drive)->ide_dma_on(drive); return 0;
return HWIF(drive)->ide_dma_off_quietly(drive);
return -1;
} }
/* /*
......
...@@ -252,21 +252,20 @@ static int atiixp_config_drive_for_dma(ide_drive_t *drive) ...@@ -252,21 +252,20 @@ static int atiixp_config_drive_for_dma(ide_drive_t *drive)
static int atiixp_dma_check(ide_drive_t *drive) static int atiixp_dma_check(ide_drive_t *drive)
{ {
ide_hwif_t *hwif = HWIF(drive);
u8 tspeed, speed; u8 tspeed, speed;
drive->init_speed = 0; drive->init_speed = 0;
if (ide_use_dma(drive) && atiixp_config_drive_for_dma(drive)) if (ide_use_dma(drive) && atiixp_config_drive_for_dma(drive))
return hwif->ide_dma_on(drive); return 0;
if (ide_use_fast_pio(drive)) { if (ide_use_fast_pio(drive)) {
tspeed = ide_get_best_pio_mode(drive, 255, 5, NULL); tspeed = ide_get_best_pio_mode(drive, 255, 5, NULL);
speed = atiixp_dma_2_pio(XFER_PIO_0 + tspeed) + XFER_PIO_0; speed = atiixp_dma_2_pio(XFER_PIO_0 + tspeed) + XFER_PIO_0;
hwif->speedproc(drive, speed); atiixp_speedproc(drive, speed);
} }
return hwif->ide_dma_off_quietly(drive); return -1;
} }
/** /**
......
...@@ -474,15 +474,13 @@ static int config_chipset_for_dma (ide_drive_t *drive) ...@@ -474,15 +474,13 @@ static int config_chipset_for_dma (ide_drive_t *drive)
static int cmd64x_config_drive_for_dma (ide_drive_t *drive) static int cmd64x_config_drive_for_dma (ide_drive_t *drive)
{ {
ide_hwif_t *hwif = HWIF(drive);
if (ide_use_dma(drive) && config_chipset_for_dma(drive)) if (ide_use_dma(drive) && config_chipset_for_dma(drive))
return hwif->ide_dma_on(drive); return 0;
if (ide_use_fast_pio(drive)) if (ide_use_fast_pio(drive))
config_chipset_for_pio(drive, 1); config_chipset_for_pio(drive, 1);
return hwif->ide_dma_off_quietly(drive); return -1;
} }
static int cmd64x_alt_dma_status (struct pci_dev *dev) static int cmd64x_alt_dma_status (struct pci_dev *dev)
......
...@@ -132,12 +132,11 @@ static void cs5520_tune_drive(ide_drive_t *drive, u8 pio) ...@@ -132,12 +132,11 @@ static void cs5520_tune_drive(ide_drive_t *drive, u8 pio)
static int cs5520_config_drive_xfer_rate(ide_drive_t *drive) static int cs5520_config_drive_xfer_rate(ide_drive_t *drive)
{ {
ide_hwif_t *hwif = HWIF(drive);
/* Tune the drive for PIO modes up to PIO 4 */ /* Tune the drive for PIO modes up to PIO 4 */
cs5520_tune_drive(drive, 4); cs5520_tune_drive(drive, 4);
/* Then tell the core to use DMA operations */ /* Then tell the core to use DMA operations */
return hwif->ide_dma_on(drive); return 0;
} }
/* /*
......
...@@ -196,10 +196,7 @@ static int cs5530_config_dma (ide_drive_t *drive) ...@@ -196,10 +196,7 @@ static int cs5530_config_dma (ide_drive_t *drive)
outl(timings, basereg + 12); /* write drive1 config register */ outl(timings, basereg + 12); /* write drive1 config register */
} }
/* return 0; /* success */
* Finally, turn DMA on in software, and exit.
*/
return hwif->ide_dma_on(drive); /* success */
} }
/** /**
......
...@@ -195,20 +195,19 @@ static int cs5535_config_drive_for_dma(ide_drive_t *drive) ...@@ -195,20 +195,19 @@ static int cs5535_config_drive_for_dma(ide_drive_t *drive)
static int cs5535_dma_check(ide_drive_t *drive) static int cs5535_dma_check(ide_drive_t *drive)
{ {
ide_hwif_t *hwif = drive->hwif;
u8 speed; u8 speed;
drive->init_speed = 0; drive->init_speed = 0;
if (ide_use_dma(drive) && cs5535_config_drive_for_dma(drive)) if (ide_use_dma(drive) && cs5535_config_drive_for_dma(drive))
return hwif->ide_dma_on(drive); return 0;
if (ide_use_fast_pio(drive)) { if (ide_use_fast_pio(drive)) {
speed = ide_get_best_pio_mode(drive, 255, 4, NULL); speed = ide_get_best_pio_mode(drive, 255, 4, NULL);
cs5535_set_drive(drive, speed); cs5535_set_drive(drive, speed);
} }
return hwif->ide_dma_off_quietly(drive); return -1;
} }
static u8 __devinit cs5535_cable_detect(struct pci_dev *dev) static u8 __devinit cs5535_cable_detect(struct pci_dev *dev)
......
...@@ -109,21 +109,19 @@ static int config_chipset_for_dma (ide_drive_t *drive) ...@@ -109,21 +109,19 @@ static int config_chipset_for_dma (ide_drive_t *drive)
static int hpt34x_config_drive_xfer_rate (ide_drive_t *drive) static int hpt34x_config_drive_xfer_rate (ide_drive_t *drive)
{ {
ide_hwif_t *hwif = HWIF(drive);
drive->init_speed = 0; drive->init_speed = 0;
if (ide_use_dma(drive) && config_chipset_for_dma(drive)) if (ide_use_dma(drive) && config_chipset_for_dma(drive))
#ifndef CONFIG_HPT34X_AUTODMA #ifndef CONFIG_HPT34X_AUTODMA
return hwif->ide_dma_off_quietly(drive); return -1;
#else #else
return hwif->ide_dma_on(drive); return 0;
#endif #endif
if (ide_use_fast_pio(drive)) if (ide_use_fast_pio(drive))
hpt34x_tune_drive(drive, 255); hpt34x_tune_drive(drive, 255);
return hwif->ide_dma_off_quietly(drive); return -1;
} }
/* /*
......
...@@ -736,17 +736,15 @@ static void hpt3xx_maskproc(ide_drive_t *drive, int mask) ...@@ -736,17 +736,15 @@ static void hpt3xx_maskproc(ide_drive_t *drive, int mask)
static int hpt366_config_drive_xfer_rate(ide_drive_t *drive) static int hpt366_config_drive_xfer_rate(ide_drive_t *drive)
{ {
ide_hwif_t *hwif = HWIF(drive);
drive->init_speed = 0; drive->init_speed = 0;
if (ide_use_dma(drive) && config_chipset_for_dma(drive)) if (ide_use_dma(drive) && config_chipset_for_dma(drive))
return hwif->ide_dma_on(drive); return 0;
if (ide_use_fast_pio(drive)) if (ide_use_fast_pio(drive))
hpt3xx_tune_drive(drive, 255); hpt3xx_tune_drive(drive, 255);
return hwif->ide_dma_off_quietly(drive); return -1;
} }
/* /*
......
...@@ -244,17 +244,15 @@ static int config_chipset_for_dma (ide_drive_t *drive) ...@@ -244,17 +244,15 @@ static int config_chipset_for_dma (ide_drive_t *drive)
static int it8213_config_drive_for_dma (ide_drive_t *drive) static int it8213_config_drive_for_dma (ide_drive_t *drive)
{ {
ide_hwif_t *hwif = drive->hwif; u8 pio;
if (ide_use_dma(drive)) { if (ide_use_dma(drive) && config_chipset_for_dma(drive))
if (config_chipset_for_dma(drive)) return 0;
return hwif->ide_dma_on(drive);
}
hwif->speedproc(drive, XFER_PIO_0 pio = ide_get_best_pio_mode(drive, 255, 4, NULL);
+ ide_get_best_pio_mode(drive, 255, 4, NULL)); it8213_tune_chipset(drive, XFER_PIO_0 + pio);
return hwif->ide_dma_off_quietly(drive); return -1;
} }
/** /**
......
...@@ -520,14 +520,12 @@ static int config_chipset_for_dma (ide_drive_t *drive) ...@@ -520,14 +520,12 @@ static int config_chipset_for_dma (ide_drive_t *drive)
static int it821x_config_drive_for_dma (ide_drive_t *drive) static int it821x_config_drive_for_dma (ide_drive_t *drive)
{ {
ide_hwif_t *hwif = drive->hwif; if (ide_use_dma(drive) && config_chipset_for_dma(drive))
return 0;
if (ide_use_dma(drive)) {
if (config_chipset_for_dma(drive))
return hwif->ide_dma_on(drive);
}
config_it821x_chipset_for_pio(drive, 1); config_it821x_chipset_for_pio(drive, 1);
return hwif->ide_dma_off_quietly(drive);
return -1;
} }
/** /**
...@@ -612,7 +610,7 @@ static void __devinit it821x_fixups(ide_hwif_t *hwif) ...@@ -612,7 +610,7 @@ static void __devinit it821x_fixups(ide_hwif_t *hwif)
#ifdef CONFIG_IDEDMA_ONLYDISK #ifdef CONFIG_IDEDMA_ONLYDISK
if (drive->media == ide_disk) if (drive->media == ide_disk)
#endif #endif
hwif->ide_dma_check(drive); ide_set_dma(drive);
} else { } else {
/* Non RAID volume. Fixups to stop the core code /* Non RAID volume. Fixups to stop the core code
doing unsupported things */ doing unsupported things */
......
...@@ -164,14 +164,12 @@ static int config_chipset_for_dma (ide_drive_t *drive) ...@@ -164,14 +164,12 @@ static int config_chipset_for_dma (ide_drive_t *drive)
static int jmicron_config_drive_for_dma (ide_drive_t *drive) static int jmicron_config_drive_for_dma (ide_drive_t *drive)
{ {
ide_hwif_t *hwif = drive->hwif; if (ide_use_dma(drive) && config_chipset_for_dma(drive))
return 0;
if (ide_use_dma(drive)) {
if (config_chipset_for_dma(drive))
return hwif->ide_dma_on(drive);
}
config_jmicron_chipset_for_pio(drive, 1); config_jmicron_chipset_for_pio(drive, 1);
return hwif->ide_dma_off_quietly(drive);
return -1;
} }
/** /**
......
...@@ -190,7 +190,8 @@ static int ns87415_ide_dma_setup(ide_drive_t *drive) ...@@ -190,7 +190,8 @@ static int ns87415_ide_dma_setup(ide_drive_t *drive)
static int ns87415_ide_dma_check (ide_drive_t *drive) static int ns87415_ide_dma_check (ide_drive_t *drive)
{ {
if (drive->media != ide_disk) if (drive->media != ide_disk)
return HWIF(drive)->ide_dma_off_quietly(drive); return -1;
return __ide_dma_check(drive); return __ide_dma_check(drive);
} }
......
...@@ -281,17 +281,15 @@ static int config_chipset_for_dma(ide_drive_t *drive) ...@@ -281,17 +281,15 @@ static int config_chipset_for_dma(ide_drive_t *drive)
static int pdcnew_config_drive_xfer_rate(ide_drive_t *drive) static int pdcnew_config_drive_xfer_rate(ide_drive_t *drive)
{ {
ide_hwif_t *hwif = HWIF(drive);
drive->init_speed = 0; drive->init_speed = 0;
if (ide_use_dma(drive) && config_chipset_for_dma(drive)) if (ide_use_dma(drive) && config_chipset_for_dma(drive))
return hwif->ide_dma_on(drive); return 0;
if (ide_use_fast_pio(drive)) if (ide_use_fast_pio(drive))
hwif->tuneproc(drive, 255); pdcnew_tune_drive(drive, 255);
return hwif->ide_dma_off_quietly(drive); return -1;
} }
static int pdcnew_quirkproc(ide_drive_t *drive) static int pdcnew_quirkproc(ide_drive_t *drive)
......
...@@ -322,17 +322,15 @@ static int config_chipset_for_dma (ide_drive_t *drive) ...@@ -322,17 +322,15 @@ static int config_chipset_for_dma (ide_drive_t *drive)
static int pdc202xx_config_drive_xfer_rate (ide_drive_t *drive) static int pdc202xx_config_drive_xfer_rate (ide_drive_t *drive)
{ {
ide_hwif_t *hwif = HWIF(drive);
drive->init_speed = 0; drive->init_speed = 0;
if (ide_use_dma(drive) && config_chipset_for_dma(drive)) if (ide_use_dma(drive) && config_chipset_for_dma(drive))
return hwif->ide_dma_on(drive); return 0;
if (ide_use_fast_pio(drive)) if (ide_use_fast_pio(drive))
pdc202xx_tune_drive(drive, 255); pdc202xx_tune_drive(drive, 255);
return hwif->ide_dma_off_quietly(drive); return -1;
} }
static int pdc202xx_quirkproc (ide_drive_t *drive) static int pdc202xx_quirkproc (ide_drive_t *drive)
......
...@@ -386,19 +386,17 @@ static int piix_config_drive_for_dma (ide_drive_t *drive) ...@@ -386,19 +386,17 @@ static int piix_config_drive_for_dma (ide_drive_t *drive)
static int piix_config_drive_xfer_rate (ide_drive_t *drive) static int piix_config_drive_xfer_rate (ide_drive_t *drive)
{ {
ide_hwif_t *hwif = HWIF(drive);
drive->init_speed = 0; drive->init_speed = 0;
if (ide_use_dma(drive) && piix_config_drive_for_dma(drive)) if (ide_use_dma(drive) && piix_config_drive_for_dma(drive))
return hwif->ide_dma_on(drive); return 0;
if (ide_use_fast_pio(drive)) if (ide_use_fast_pio(drive))
/* Find best PIO mode. */ /* Find best PIO mode. */
(void) hwif->speedproc(drive, XFER_PIO_0 + piix_tune_chipset(drive, XFER_PIO_0 +
ide_get_best_pio_mode(drive, 255, 4, NULL)); ide_get_best_pio_mode(drive, 255, 4, NULL));
return hwif->ide_dma_off_quietly(drive); return -1;
} }
/** /**
......
...@@ -241,10 +241,7 @@ static int sc1200_config_dma2 (ide_drive_t *drive, int mode) ...@@ -241,10 +241,7 @@ static int sc1200_config_dma2 (ide_drive_t *drive, int mode)
outb(inb(hwif->dma_base+2)|(unit?0x40:0x20), hwif->dma_base+2); /* set DMA_capable bit */ outb(inb(hwif->dma_base+2)|(unit?0x40:0x20), hwif->dma_base+2); /* set DMA_capable bit */
/* return 0; /* success */
* Finally, turn DMA on in software, and exit.
*/
return hwif->ide_dma_on(drive); /* success */
} }
/* /*
......
...@@ -315,17 +315,15 @@ static int config_chipset_for_dma (ide_drive_t *drive) ...@@ -315,17 +315,15 @@ static int config_chipset_for_dma (ide_drive_t *drive)
static int svwks_config_drive_xfer_rate (ide_drive_t *drive) static int svwks_config_drive_xfer_rate (ide_drive_t *drive)
{ {
ide_hwif_t *hwif = HWIF(drive);
drive->init_speed = 0; drive->init_speed = 0;
if (ide_use_dma(drive) && config_chipset_for_dma(drive)) if (ide_use_dma(drive) && config_chipset_for_dma(drive))
return hwif->ide_dma_on(drive); return 0;
if (ide_use_fast_pio(drive)) if (ide_use_fast_pio(drive))
config_chipset_for_pio(drive); config_chipset_for_pio(drive);
return hwif->ide_dma_off_quietly(drive); return -1;
} }
static unsigned int __devinit init_chipset_svwks (struct pci_dev *dev, const char *name) static unsigned int __devinit init_chipset_svwks (struct pci_dev *dev, const char *name)
......
...@@ -296,9 +296,9 @@ static int sgiioc4_ide_dma_check(ide_drive_t *drive) ...@@ -296,9 +296,9 @@ static int sgiioc4_ide_dma_check(ide_drive_t *drive)
if (ide_config_drive_speed(drive, XFER_MW_DMA_2) != 0) { if (ide_config_drive_speed(drive, XFER_MW_DMA_2) != 0) {
printk(KERN_WARNING "%s: couldn't set MWDMA2 mode, " printk(KERN_WARNING "%s: couldn't set MWDMA2 mode, "
"using PIO instead\n", drive->name); "using PIO instead\n", drive->name);
return sgiioc4_ide_dma_off_quietly(drive); return -1;
} else } else
return sgiioc4_ide_dma_on(drive); return 0;
} }
/* returns 1 if dma irq issued, 0 otherwise */ /* returns 1 if dma irq issued, 0 otherwise */
......
...@@ -414,15 +414,13 @@ static int config_chipset_for_dma (ide_drive_t *drive) ...@@ -414,15 +414,13 @@ static int config_chipset_for_dma (ide_drive_t *drive)
static int siimage_config_drive_for_dma (ide_drive_t *drive) static int siimage_config_drive_for_dma (ide_drive_t *drive)
{ {
ide_hwif_t *hwif = HWIF(drive);
if (ide_use_dma(drive) && config_chipset_for_dma(drive)) if (ide_use_dma(drive) && config_chipset_for_dma(drive))
return hwif->ide_dma_on(drive); return 0;
if (ide_use_fast_pio(drive)) if (ide_use_fast_pio(drive))
config_chipset_for_pio(drive, 1); config_chipset_for_pio(drive, 1);
return hwif->ide_dma_off_quietly(drive); return -1;
} }
/* returns 1 if dma irq issued, 0 otherwise */ /* returns 1 if dma irq issued, 0 otherwise */
......
...@@ -669,19 +669,17 @@ static int config_chipset_for_dma (ide_drive_t *drive) ...@@ -669,19 +669,17 @@ static int config_chipset_for_dma (ide_drive_t *drive)
static int sis5513_config_xfer_rate(ide_drive_t *drive) static int sis5513_config_xfer_rate(ide_drive_t *drive)
{ {
ide_hwif_t *hwif = HWIF(drive);
config_art_rwp_pio(drive, 5); config_art_rwp_pio(drive, 5);
drive->init_speed = 0; drive->init_speed = 0;
if (ide_use_dma(drive) && config_chipset_for_dma(drive)) if (ide_use_dma(drive) && config_chipset_for_dma(drive))
return hwif->ide_dma_on(drive); return 0;
if (ide_use_fast_pio(drive)) if (ide_use_fast_pio(drive))
sis5513_tune_drive(drive, 5); sis5513_tune_drive(drive, 5);
return hwif->ide_dma_off_quietly(drive); return -1;
} }
/* Chip detection and general config */ /* Chip detection and general config */
......
...@@ -161,14 +161,14 @@ static int sl82c105_check_drive (ide_drive_t *drive) ...@@ -161,14 +161,14 @@ static int sl82c105_check_drive (ide_drive_t *drive)
if (id->field_valid & 2) { if (id->field_valid & 2) {
if ((id->dma_mword & hwif->mwdma_mask) || if ((id->dma_mword & hwif->mwdma_mask) ||
(id->dma_1word & hwif->swdma_mask)) (id->dma_1word & hwif->swdma_mask))
return hwif->ide_dma_on(drive); return 0;
} }
if (__ide_dma_good_drive(drive) && id->eide_dma_time < 150) if (__ide_dma_good_drive(drive) && id->eide_dma_time < 150)
return hwif->ide_dma_on(drive); return 0;
} while (0); } while (0);
return hwif->ide_dma_off_quietly(drive); return -1;
} }
/* /*
......
...@@ -179,18 +179,16 @@ static int slc90e66_config_drive_for_dma (ide_drive_t *drive) ...@@ -179,18 +179,16 @@ static int slc90e66_config_drive_for_dma (ide_drive_t *drive)
static int slc90e66_config_drive_xfer_rate (ide_drive_t *drive) static int slc90e66_config_drive_xfer_rate (ide_drive_t *drive)
{ {
ide_hwif_t *hwif = HWIF(drive);
drive->init_speed = 0; drive->init_speed = 0;
if (ide_use_dma(drive) && slc90e66_config_drive_for_dma(drive)) if (ide_use_dma(drive) && slc90e66_config_drive_for_dma(drive))
return hwif->ide_dma_on(drive); return 0;
if (ide_use_fast_pio(drive)) if (ide_use_fast_pio(drive))
(void) hwif->speedproc(drive, XFER_PIO_0 + (void)slc90e66_tune_chipset(drive, XFER_PIO_0 +
ide_get_best_pio_mode(drive, 255, 4, NULL)); ide_get_best_pio_mode(drive, 255, 4, NULL));
return hwif->ide_dma_off_quietly(drive); return -1;
} }
static void __devinit init_hwif_slc90e66 (ide_hwif_t *hwif) static void __devinit init_hwif_slc90e66 (ide_hwif_t *hwif)
......
...@@ -185,15 +185,13 @@ static int config_chipset_for_dma(ide_drive_t *drive) ...@@ -185,15 +185,13 @@ static int config_chipset_for_dma(ide_drive_t *drive)
static int tc86c001_config_drive_xfer_rate(ide_drive_t *drive) static int tc86c001_config_drive_xfer_rate(ide_drive_t *drive)
{ {
ide_hwif_t *hwif = HWIF(drive);
if (ide_use_dma(drive) && config_chipset_for_dma(drive)) if (ide_use_dma(drive) && config_chipset_for_dma(drive))
return hwif->ide_dma_on(drive); return 0;
if (ide_use_fast_pio(drive)) if (ide_use_fast_pio(drive))
tc86c001_tune_drive(drive, 255); tc86c001_tune_drive(drive, 255);
return hwif->ide_dma_off_quietly(drive); return -1;
} }
static void __devinit init_hwif_tc86c001(ide_hwif_t *hwif) static void __devinit init_hwif_tc86c001(ide_hwif_t *hwif)
......
...@@ -113,13 +113,12 @@ static int triflex_config_drive_for_dma(ide_drive_t *drive) ...@@ -113,13 +113,12 @@ static int triflex_config_drive_for_dma(ide_drive_t *drive)
static int triflex_config_drive_xfer_rate(ide_drive_t *drive) static int triflex_config_drive_xfer_rate(ide_drive_t *drive)
{ {
ide_hwif_t *hwif = HWIF(drive);
if (ide_use_dma(drive) && triflex_config_drive_for_dma(drive)) if (ide_use_dma(drive) && triflex_config_drive_for_dma(drive))
return hwif->ide_dma_on(drive); return 0;
hwif->tuneproc(drive, 255); triflex_tune_drive(drive, 255);
return hwif->ide_dma_off_quietly(drive);
return -1;
} }
static void __devinit init_hwif_triflex(ide_hwif_t *hwif) static void __devinit init_hwif_triflex(ide_hwif_t *hwif)
......
...@@ -240,8 +240,9 @@ static int via82cxxx_ide_dma_check (ide_drive_t *drive) ...@@ -240,8 +240,9 @@ static int via82cxxx_ide_dma_check (ide_drive_t *drive)
via_set_drive(drive, speed); via_set_drive(drive, speed);
if (drive->autodma && (speed & XFER_MODE) != XFER_PIO) if (drive->autodma && (speed & XFER_MODE) != XFER_PIO)
return hwif->ide_dma_on(drive); return 0;
return hwif->ide_dma_off_quietly(drive);
return -1;
} }
static struct via_isa_bridge *via_config_find(struct pci_dev **isa) static struct via_isa_bridge *via_config_find(struct pci_dev **isa)
......
...@@ -371,15 +371,13 @@ static int scc_config_chipset_for_dma(ide_drive_t *drive) ...@@ -371,15 +371,13 @@ static int scc_config_chipset_for_dma(ide_drive_t *drive)
static int scc_config_drive_for_dma(ide_drive_t *drive) static int scc_config_drive_for_dma(ide_drive_t *drive)
{ {
ide_hwif_t *hwif = HWIF(drive);
if (ide_use_dma(drive) && scc_config_chipset_for_dma(drive)) if (ide_use_dma(drive) && scc_config_chipset_for_dma(drive))
return hwif->ide_dma_on(drive); return 0;
if (ide_use_fast_pio(drive)) if (ide_use_fast_pio(drive))
hwif->tuneproc(drive, 4); scc_tuneproc(drive, 4);
return hwif->ide_dma_off_quietly(drive); return -1;
} }
/** /**
......
...@@ -1278,6 +1278,7 @@ int __ide_dma_good_drive(ide_drive_t *); ...@@ -1278,6 +1278,7 @@ int __ide_dma_good_drive(ide_drive_t *);
int ide_use_dma(ide_drive_t *); int ide_use_dma(ide_drive_t *);
int __ide_dma_off(ide_drive_t *); int __ide_dma_off(ide_drive_t *);
void ide_dma_verbose(ide_drive_t *); void ide_dma_verbose(ide_drive_t *);
int ide_set_dma(ide_drive_t *);
ide_startstop_t ide_dma_intr(ide_drive_t *); ide_startstop_t ide_dma_intr(ide_drive_t *);
#ifdef CONFIG_BLK_DEV_IDEDMA_PCI #ifdef CONFIG_BLK_DEV_IDEDMA_PCI
...@@ -1303,6 +1304,7 @@ extern int __ide_dma_timeout(ide_drive_t *); ...@@ -1303,6 +1304,7 @@ extern int __ide_dma_timeout(ide_drive_t *);
static inline int ide_use_dma(ide_drive_t *drive) { return 0; } static inline int ide_use_dma(ide_drive_t *drive) { return 0; }
static inline int __ide_dma_off(ide_drive_t *drive) { return 0; } static inline int __ide_dma_off(ide_drive_t *drive) { return 0; }
static inline void ide_dma_verbose(ide_drive_t *drive) { ; } static inline void ide_dma_verbose(ide_drive_t *drive) { ; }
static inline int ide_set_dma(ide_drive_t *drive) { return 1; }
#endif /* CONFIG_BLK_DEV_IDEDMA */ #endif /* CONFIG_BLK_DEV_IDEDMA */
#ifndef CONFIG_BLK_DEV_IDEDMA_PCI #ifndef CONFIG_BLK_DEV_IDEDMA_PCI
......
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