Commit 688a87d1 authored by Sergei Shtylyov's avatar Sergei Shtylyov Committed by Bartlomiej Zolnierkiewicz

sl82c105: DMA support code cleanup (take 4)

Fold the now equivalent code in the ide_dma_check() method into a mere call to
ide_use_dma().  Make config_for_dma() return non-zero if DMA mode has been set
and call it from the ide_dma_check() method instead of ide_dma_on().
Defer writing the DMA timings to the chip registers until DMA is really turned
on (and do not enable IORDY for DMA).
Remove unneeded code from the init_hwif() method, improve its overall looks.
Rename the dma_start(), ide_dma_check(), and ide_dma_lostirq() methods, and
also use more proper hwif->dma_command, fix printk() and comment in the latter
one as well.  While at it, cleanup style in several places.
Signed-off-by: default avatarSergei Shtylyov <sshtylyov@ru.mvista.com>
Signed-off-by: default avatarBartlomiej Zolnierkiewicz <bzolnier@gmail.com>
parent e93df705
...@@ -100,59 +100,28 @@ static u8 sl82c105_tune_pio(ide_drive_t *drive, u8 pio) ...@@ -100,59 +100,28 @@ static u8 sl82c105_tune_pio(ide_drive_t *drive, u8 pio)
} }
/* /*
* Configure the drive and the chipset for DMA * Configure the drive for DMA.
* We'll program the chipset only when DMA is actually turned on.
*/ */
static int config_for_dma (ide_drive_t *drive) static int config_for_dma(ide_drive_t *drive)
{ {
ide_hwif_t *hwif = HWIF(drive);
struct pci_dev *dev = hwif->pci_dev;
unsigned int reg;
DBG(("config_for_dma(drive:%s)\n", drive->name)); DBG(("config_for_dma(drive:%s)\n", drive->name));
reg = (hwif->channel ? 0x4c : 0x44) + (drive->select.b.unit ? 4 : 0);
if (ide_config_drive_speed(drive, XFER_MW_DMA_2) != 0) if (ide_config_drive_speed(drive, XFER_MW_DMA_2) != 0)
return 1;
pci_write_config_word(dev, reg, 0x0240);
return 0; return 0;
return ide_dma_enable(drive);
} }
/* /*
* Check to see if the drive and * Check to see if the drive and chipset are capable of DMA mode.
* chipset is capable of DMA mode
*/ */
static int sl82c105_ide_dma_check(ide_drive_t *drive)
static int sl82c105_check_drive (ide_drive_t *drive)
{ {
ide_hwif_t *hwif = HWIF(drive); DBG(("sl82c105_ide_dma_check(drive:%s)\n", drive->name));
DBG(("sl82c105_check_drive(drive:%s)\n", drive->name));
do {
struct hd_driveid *id = drive->id;
if (!drive->autodma)
break;
if (!id || !(id->capability & 1))
break;
/* Consult the list of known "bad" drives */ if (ide_use_dma(drive) && config_for_dma(drive))
if (__ide_dma_bad_drive(drive))
break;
if (id->field_valid & 2) {
if ((id->dma_mword & hwif->mwdma_mask) ||
(id->dma_1word & hwif->swdma_mask))
return 0;
}
if (__ide_dma_good_drive(drive) && id->eide_dma_time < 150)
return 0; return 0;
} while (0);
return -1; return -1;
} }
...@@ -181,14 +150,14 @@ static inline void sl82c105_reset_host(struct pci_dev *dev) ...@@ -181,14 +150,14 @@ static inline void sl82c105_reset_host(struct pci_dev *dev)
* This function is called when the IDE timer expires, the drive * This function is called when the IDE timer expires, the drive
* indicates that it is READY, and we were waiting for DMA to complete. * indicates that it is READY, and we were waiting for DMA to complete.
*/ */
static int sl82c105_ide_dma_lost_irq(ide_drive_t *drive) static int sl82c105_ide_dma_lostirq(ide_drive_t *drive)
{ {
ide_hwif_t *hwif = HWIF(drive); ide_hwif_t *hwif = HWIF(drive);
struct pci_dev *dev = hwif->pci_dev; struct pci_dev *dev = hwif->pci_dev;
u32 val, mask = hwif->channel ? CTRL_IDE_IRQB : CTRL_IDE_IRQA; u32 val, mask = hwif->channel ? CTRL_IDE_IRQB : CTRL_IDE_IRQA;
unsigned long dma_base = hwif->dma_base; u8 dma_cmd;
printk("sl82c105: lost IRQ: resetting host\n"); printk("sl82c105: lost IRQ, resetting host\n");
/* /*
* Check the raw interrupt from the drive. * Check the raw interrupt from the drive.
...@@ -201,15 +170,15 @@ static int sl82c105_ide_dma_lost_irq(ide_drive_t *drive) ...@@ -201,15 +170,15 @@ static int sl82c105_ide_dma_lost_irq(ide_drive_t *drive)
* Was DMA enabled? If so, disable it - we're resetting the * Was DMA enabled? If so, disable it - we're resetting the
* host. The IDE layer will be handling the drive for us. * host. The IDE layer will be handling the drive for us.
*/ */
val = inb(dma_base); dma_cmd = inb(hwif->dma_command);
if (val & 1) { if (dma_cmd & 1) {
outb(val & ~1, dma_base); outb(dma_cmd & ~1, hwif->dma_command);
printk("sl82c105: DMA was enabled\n"); printk("sl82c105: DMA was enabled\n");
} }
sl82c105_reset_host(dev); sl82c105_reset_host(dev);
/* ide_dmaproc would return 1, so we do as well */ /* __ide_dma_lostirq would return 1, so we do as well */
return 1; return 1;
} }
...@@ -221,7 +190,7 @@ static int sl82c105_ide_dma_lost_irq(ide_drive_t *drive) ...@@ -221,7 +190,7 @@ static int sl82c105_ide_dma_lost_irq(ide_drive_t *drive)
* The generic IDE core will have disabled the BMEN bit before this * The generic IDE core will have disabled the BMEN bit before this
* function is called. * function is called.
*/ */
static void sl82c105_ide_dma_start(ide_drive_t *drive) static void sl82c105_dma_start(ide_drive_t *drive)
{ {
ide_hwif_t *hwif = HWIF(drive); ide_hwif_t *hwif = HWIF(drive);
struct pci_dev *dev = hwif->pci_dev; struct pci_dev *dev = hwif->pci_dev;
...@@ -241,14 +210,20 @@ static int sl82c105_ide_dma_timeout(ide_drive_t *drive) ...@@ -241,14 +210,20 @@ static int sl82c105_ide_dma_timeout(ide_drive_t *drive)
return __ide_dma_timeout(drive); return __ide_dma_timeout(drive);
} }
static int sl82c105_ide_dma_on (ide_drive_t *drive) static int sl82c105_ide_dma_on(ide_drive_t *drive)
{ {
struct pci_dev *dev = HWIF(drive)->pci_dev;
int rc, reg = 0x44 + drive->dn * 4;
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)) rc = __ide_dma_on(drive);
return 1; if (rc == 0) {
pci_write_config_word(dev, reg, 0x0200);
printk(KERN_INFO "%s: DMA enabled\n", drive->name); printk(KERN_INFO "%s: DMA enabled\n", drive->name);
return __ide_dma_on(drive); }
return rc;
} }
static void sl82c105_dma_off_quietly(ide_drive_t *drive) static void sl82c105_dma_off_quietly(ide_drive_t *drive)
...@@ -373,7 +348,7 @@ static unsigned int __devinit init_chipset_sl82c105(struct pci_dev *dev, const c ...@@ -373,7 +348,7 @@ static unsigned int __devinit init_chipset_sl82c105(struct pci_dev *dev, const c
} }
/* /*
* Initialise the chip * Initialise IDE channel
*/ */
static void __devinit init_hwif_sl82c105(ide_hwif_t *hwif) static void __devinit init_hwif_sl82c105(ide_hwif_t *hwif)
{ {
...@@ -398,11 +373,6 @@ static void __devinit init_hwif_sl82c105(ide_hwif_t *hwif) ...@@ -398,11 +373,6 @@ static void __devinit init_hwif_sl82c105(ide_hwif_t *hwif)
*/ */
hwif->drives[0].autotune = hwif->drives[1].autotune = 1; hwif->drives[0].autotune = hwif->drives[1].autotune = 1;
hwif->atapi_dma = 0;
hwif->mwdma_mask = 0;
hwif->swdma_mask = 0;
hwif->autodma = 0;
if (!hwif->dma_base) if (!hwif->dma_base)
return; return;
...@@ -412,27 +382,27 @@ static void __devinit init_hwif_sl82c105(ide_hwif_t *hwif) ...@@ -412,27 +382,27 @@ static void __devinit init_hwif_sl82c105(ide_hwif_t *hwif)
* Never ever EVER under any circumstances enable * Never ever EVER under any circumstances enable
* DMA when the bridge is this old. * DMA when the bridge is this old.
*/ */
printk(" %s: Winbond 553 bridge revision %d, BM-DMA disabled\n", printk(" %s: Winbond W83C553 bridge revision %d, "
hwif->name, rev); "BM-DMA disabled\n", hwif->name, rev);
} else { return;
}
hwif->atapi_dma = 1; hwif->atapi_dma = 1;
hwif->mwdma_mask = 0x04; hwif->mwdma_mask = 0x04;
hwif->ide_dma_check = &sl82c105_check_drive; hwif->ide_dma_check = &sl82c105_ide_dma_check;
hwif->ide_dma_on = &sl82c105_ide_dma_on; hwif->ide_dma_on = &sl82c105_ide_dma_on;
hwif->dma_off_quietly = &sl82c105_dma_off_quietly; hwif->dma_off_quietly = &sl82c105_dma_off_quietly;
hwif->ide_dma_lostirq = &sl82c105_ide_dma_lost_irq; hwif->ide_dma_lostirq = &sl82c105_ide_dma_lostirq;
hwif->dma_start = &sl82c105_ide_dma_start; hwif->dma_start = &sl82c105_dma_start;
hwif->ide_dma_timeout = &sl82c105_ide_dma_timeout; hwif->ide_dma_timeout = &sl82c105_ide_dma_timeout;
if (!noautodma) if (!noautodma)
hwif->autodma = 1; hwif->autodma = 1;
hwif->drives[0].autodma = hwif->autodma; hwif->drives[0].autodma = hwif->drives[1].autodma = hwif->autodma;
hwif->drives[1].autodma = hwif->autodma;
if (hwif->mate) if (hwif->mate)
hwif->serialized = hwif->mate->serialized = 1; hwif->serialized = hwif->mate->serialized = 1;
}
} }
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