Commit ea266ba1 authored by Sergei Shtylyov's avatar Sergei Shtylyov Committed by Bartlomiej Zolnierkiewicz

sl82c105: DMA support fixes

Fix a number of issues with the DMA support code:

- driver claims support for all SW/MW DMA modes while supporting only MWDMA2;

- ide_dma_check() method tries to enable DMA on the "known good" drives which
  don't support MWDMA2;

- ide_dma_on() method upon failure to set drive to MWDMA2 re-tunes already
  tuned PIO mode and calls ide_dma_off() method instead of returning error;

- ide_dma_off() method sets drive->current_speed while it doesn't actually
  change (only the PIO timings are re-loaded into the chip's registers);

- init_hwif() method forcibly sets/resets both "drive DMA capable" bits while
  this is properly handled by ide_dma_{on,off}() methods being called later...
Signed-off-by: default avatarSergei Shtylyov <sshtylyov@ru.mvista.com>
Signed-off-by: default avatarBartlomiej Zolnierkiewicz <bzolnier@gmail.com>
parent fed21641
...@@ -164,7 +164,7 @@ static int sl82c105_check_drive (ide_drive_t *drive) ...@@ -164,7 +164,7 @@ static int sl82c105_check_drive (ide_drive_t *drive)
return hwif->ide_dma_on(drive); return hwif->ide_dma_on(drive);
} }
if (__ide_dma_good_drive(drive)) if (__ide_dma_good_drive(drive) && id->eide_dma_time < 150)
return hwif->ide_dma_on(drive); return hwif->ide_dma_on(drive);
} while (0); } while (0);
...@@ -259,10 +259,8 @@ static int sl82c105_ide_dma_on (ide_drive_t *drive) ...@@ -259,10 +259,8 @@ static int sl82c105_ide_dma_on (ide_drive_t *drive)
{ {
DBG(("sl82c105_ide_dma_on(drive:%s)\n", drive->name)); DBG(("sl82c105_ide_dma_on(drive:%s)\n", drive->name));
if (config_for_dma(drive)) { if (config_for_dma(drive))
config_for_pio(drive, 4, 0, 0); return 1;
return HWIF(drive)->ide_dma_off_quietly(drive);
}
printk(KERN_INFO "%s: DMA enabled\n", drive->name); printk(KERN_INFO "%s: DMA enabled\n", drive->name);
return __ide_dma_on(drive); return __ide_dma_on(drive);
} }
...@@ -278,7 +276,6 @@ static int sl82c105_ide_dma_off_quietly (ide_drive_t *drive) ...@@ -278,7 +276,6 @@ static int sl82c105_ide_dma_off_quietly (ide_drive_t *drive)
if (drive->pio_speed) if (drive->pio_speed)
speed = drive->pio_speed - XFER_PIO_0; speed = drive->pio_speed - XFER_PIO_0;
config_for_pio(drive, speed, 0, 1); config_for_pio(drive, speed, 0, 1);
drive->current_speed = drive->pio_speed;
return rc; return rc;
} }
...@@ -401,11 +398,9 @@ static unsigned int __devinit init_chipset_sl82c105(struct pci_dev *dev, const c ...@@ -401,11 +398,9 @@ static unsigned int __devinit init_chipset_sl82c105(struct pci_dev *dev, const c
/* /*
* Initialise the chip * Initialise the chip
*/ */
static void __devinit init_hwif_sl82c105(ide_hwif_t *hwif) static void __devinit init_hwif_sl82c105(ide_hwif_t *hwif)
{ {
unsigned int rev; unsigned int rev;
u8 dma_state;
DBG(("init_hwif_sl82c105(hwif: ide%d)\n", hwif->index)); DBG(("init_hwif_sl82c105(hwif: ide%d)\n", hwif->index));
...@@ -431,7 +426,6 @@ static void __devinit init_hwif_sl82c105(ide_hwif_t *hwif) ...@@ -431,7 +426,6 @@ static void __devinit init_hwif_sl82c105(ide_hwif_t *hwif)
if (!hwif->dma_base) if (!hwif->dma_base)
return; return;
dma_state = hwif->INB(hwif->dma_base + 2) & ~0x60;
rev = sl82c105_bridge_revision(hwif->pci_dev); rev = sl82c105_bridge_revision(hwif->pci_dev);
if (rev <= 5) { if (rev <= 5) {
/* /*
...@@ -441,11 +435,8 @@ static void __devinit init_hwif_sl82c105(ide_hwif_t *hwif) ...@@ -441,11 +435,8 @@ static void __devinit init_hwif_sl82c105(ide_hwif_t *hwif)
printk(" %s: Winbond 553 bridge revision %d, BM-DMA disabled\n", printk(" %s: Winbond 553 bridge revision %d, BM-DMA disabled\n",
hwif->name, rev); hwif->name, rev);
} else { } else {
dma_state |= 0x60;
hwif->atapi_dma = 1; hwif->atapi_dma = 1;
hwif->mwdma_mask = 0x07; hwif->mwdma_mask = 0x04;
hwif->swdma_mask = 0x07;
hwif->ide_dma_check = &sl82c105_check_drive; hwif->ide_dma_check = &sl82c105_check_drive;
hwif->ide_dma_on = &sl82c105_ide_dma_on; hwif->ide_dma_on = &sl82c105_ide_dma_on;
...@@ -462,7 +453,6 @@ static void __devinit init_hwif_sl82c105(ide_hwif_t *hwif) ...@@ -462,7 +453,6 @@ static void __devinit init_hwif_sl82c105(ide_hwif_t *hwif)
if (hwif->mate) if (hwif->mate)
hwif->serialized = hwif->mate->serialized = 1; hwif->serialized = hwif->mate->serialized = 1;
} }
hwif->OUTB(dma_state, hwif->dma_base + 2);
} }
static ide_pci_device_t sl82c105_chipset __devinitdata = { static ide_pci_device_t sl82c105_chipset __devinitdata = {
......
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