atiixp/jmicron/triflex: fix PIO fallback

* atiixp: if DMA can't be used atiixp_config_drive_for_dma() should return 0,
  atiixp_dma_check() will tune the correct PIO mode anyway

* jmicron: if DMA can't be used config_chipset_for_dma() should return 0,
  micron_config_drive_for_dma() will tune the correct PIO mode anyway

  config_jmicron_chipset_for_pio(drive, !speed) doesn't program
  device transfer mode for speed != 0 (only wastes some CPU cycles
  on ide_get_best_pio_mode() call) so remove it

* triflex: if DMA can't be used triflex_config_drive_for_dma() should return 0,
  triflex_config_drive_xfer_rate() will tune correct PIO mode anyway

Above changes also fix (theoretical) issue when ->speedproc fails to set
device transfer mode (i.e. when ide_config_drive_speed() fails to program it)
but one of DMA transfer modes is already enabled on the device by the BIOS.
In such scenario ide_dma_enable() will incorrectly return true statement
and ->ide_dma_check will try to enable DMA on the device.
Signed-off-by: default avatarBartlomiej Zolnierkiewicz <bzolnier@gmail.com>
parent 296d9bcc
...@@ -235,11 +235,8 @@ static int atiixp_config_drive_for_dma(ide_drive_t *drive) ...@@ -235,11 +235,8 @@ static int atiixp_config_drive_for_dma(ide_drive_t *drive)
{ {
u8 speed = ide_dma_speed(drive, atiixp_ratemask(drive)); u8 speed = ide_dma_speed(drive, atiixp_ratemask(drive));
/* If no DMA speed was available then disable DMA and use PIO. */ if (!speed)
if (!speed) { return 0;
u8 tspeed = ide_get_best_pio_mode(drive, 255, 5, NULL);
speed = atiixp_dma_2_pio(XFER_PIO_0 + tspeed) + XFER_PIO_0;
}
(void) atiixp_speedproc(drive, speed); (void) atiixp_speedproc(drive, speed);
return ide_dma_enable(drive); return ide_dma_enable(drive);
......
...@@ -147,7 +147,9 @@ static int config_chipset_for_dma (ide_drive_t *drive) ...@@ -147,7 +147,9 @@ static int config_chipset_for_dma (ide_drive_t *drive)
{ {
u8 speed = ide_dma_speed(drive, jmicron_ratemask(drive)); u8 speed = ide_dma_speed(drive, jmicron_ratemask(drive));
config_jmicron_chipset_for_pio(drive, !speed); if (!speed)
return 0;
jmicron_tune_chipset(drive, speed); jmicron_tune_chipset(drive, speed);
return ide_dma_enable(drive); return ide_dma_enable(drive);
} }
......
...@@ -104,10 +104,8 @@ static int triflex_config_drive_for_dma(ide_drive_t *drive) ...@@ -104,10 +104,8 @@ static int triflex_config_drive_for_dma(ide_drive_t *drive)
{ {
int speed = ide_dma_speed(drive, 0); /* No ultra speeds */ int speed = ide_dma_speed(drive, 0); /* No ultra speeds */
if (!speed) { if (!speed)
u8 pspeed = ide_get_best_pio_mode(drive, 255, 4, NULL); return 0;
speed = XFER_PIO_0 + pspeed;
}
(void) triflex_tune_chipset(drive, speed); (void) triflex_tune_chipset(drive, speed);
return ide_dma_enable(drive); return ide_dma_enable(drive);
......
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