aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/ide/ide-iops.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/ide/ide-iops.c')
-rw-r--r--drivers/ide/ide-iops.c31
1 files changed, 15 insertions, 16 deletions
diff --git a/drivers/ide/ide-iops.c b/drivers/ide/ide-iops.c
index c97c0719ddf1..e2a7e95e1636 100644
--- a/drivers/ide/ide-iops.c
+++ b/drivers/ide/ide-iops.c
@@ -619,7 +619,7 @@ no_80w:
619int ide_ata66_check (ide_drive_t *drive, ide_task_t *args) 619int ide_ata66_check (ide_drive_t *drive, ide_task_t *args)
620{ 620{
621 if (args->tf.command == WIN_SETFEATURES && 621 if (args->tf.command == WIN_SETFEATURES &&
622 args->tf.lbal > XFER_UDMA_2 && 622 args->tf.nsect > XFER_UDMA_2 &&
623 args->tf.feature == SETFEATURES_XFER) { 623 args->tf.feature == SETFEATURES_XFER) {
624 if (eighty_ninty_three(drive) == 0) { 624 if (eighty_ninty_three(drive) == 0) {
625 printk(KERN_WARNING "%s: UDMA speeds >UDMA33 cannot " 625 printk(KERN_WARNING "%s: UDMA speeds >UDMA33 cannot "
@@ -639,7 +639,7 @@ int ide_ata66_check (ide_drive_t *drive, ide_task_t *args)
639int set_transfer (ide_drive_t *drive, ide_task_t *args) 639int set_transfer (ide_drive_t *drive, ide_task_t *args)
640{ 640{
641 if (args->tf.command == WIN_SETFEATURES && 641 if (args->tf.command == WIN_SETFEATURES &&
642 args->tf.lbal >= XFER_SW_DMA_0 && 642 args->tf.nsect >= XFER_SW_DMA_0 &&
643 args->tf.feature == SETFEATURES_XFER && 643 args->tf.feature == SETFEATURES_XFER &&
644 (drive->id->dma_ultra || 644 (drive->id->dma_ultra ||
645 drive->id->dma_mword || 645 drive->id->dma_mword ||
@@ -688,8 +688,7 @@ int ide_driveid_update(ide_drive_t *drive)
688 */ 688 */
689 689
690 SELECT_MASK(drive, 1); 690 SELECT_MASK(drive, 1);
691 if (IDE_CONTROL_REG) 691 ide_set_irq(drive, 1);
692 hwif->OUTB(drive->ctl,IDE_CONTROL_REG);
693 msleep(50); 692 msleep(50);
694 hwif->OUTB(WIN_IDENTIFY, IDE_COMMAND_REG); 693 hwif->OUTB(WIN_IDENTIFY, IDE_COMMAND_REG);
695 timeout = jiffies + WAIT_WORSTCASE; 694 timeout = jiffies + WAIT_WORSTCASE;
@@ -742,8 +741,8 @@ int ide_config_drive_speed(ide_drive_t *drive, u8 speed)
742// msleep(50); 741// msleep(50);
743 742
744#ifdef CONFIG_BLK_DEV_IDEDMA 743#ifdef CONFIG_BLK_DEV_IDEDMA
745 if (hwif->ide_dma_on) /* check if host supports DMA */ 744 if (hwif->dma_host_set) /* check if host supports DMA */
746 hwif->dma_host_off(drive); 745 hwif->dma_host_set(drive, 0);
747#endif 746#endif
748 747
749 /* Skip setting PIO flow-control modes on pre-EIDE drives */ 748 /* Skip setting PIO flow-control modes on pre-EIDE drives */
@@ -772,13 +771,12 @@ int ide_config_drive_speed(ide_drive_t *drive, u8 speed)
772 SELECT_DRIVE(drive); 771 SELECT_DRIVE(drive);
773 SELECT_MASK(drive, 0); 772 SELECT_MASK(drive, 0);
774 udelay(1); 773 udelay(1);
775 if (IDE_CONTROL_REG) 774 ide_set_irq(drive, 0);
776 hwif->OUTB(drive->ctl | 2, IDE_CONTROL_REG);
777 hwif->OUTB(speed, IDE_NSECTOR_REG); 775 hwif->OUTB(speed, IDE_NSECTOR_REG);
778 hwif->OUTB(SETFEATURES_XFER, IDE_FEATURE_REG); 776 hwif->OUTB(SETFEATURES_XFER, IDE_FEATURE_REG);
779 hwif->OUTBSYNC(drive, WIN_SETFEATURES, IDE_COMMAND_REG); 777 hwif->OUTBSYNC(drive, WIN_SETFEATURES, IDE_COMMAND_REG);
780 if ((IDE_CONTROL_REG) && (drive->quirk_list == 2)) 778 if (drive->quirk_list == 2)
781 hwif->OUTB(drive->ctl, IDE_CONTROL_REG); 779 ide_set_irq(drive, 1);
782 780
783 error = __ide_wait_stat(drive, drive->ready_stat, 781 error = __ide_wait_stat(drive, drive->ready_stat,
784 BUSY_STAT|DRQ_STAT|ERR_STAT, 782 BUSY_STAT|DRQ_STAT|ERR_STAT,
@@ -799,10 +797,11 @@ int ide_config_drive_speed(ide_drive_t *drive, u8 speed)
799 797
800 skip: 798 skip:
801#ifdef CONFIG_BLK_DEV_IDEDMA 799#ifdef CONFIG_BLK_DEV_IDEDMA
802 if (speed >= XFER_SW_DMA_0) 800 if ((speed >= XFER_SW_DMA_0 || (hwif->host_flags & IDE_HFLAG_VDMA)) &&
803 hwif->dma_host_on(drive); 801 drive->using_dma)
804 else if (hwif->ide_dma_on) /* check if host supports DMA */ 802 hwif->dma_host_set(drive, 1);
805 hwif->dma_off_quietly(drive); 803 else if (hwif->dma_host_set) /* check if host supports DMA */
804 ide_dma_off_quietly(drive);
806#endif 805#endif
807 806
808 switch(speed) { 807 switch(speed) {
@@ -1012,10 +1011,10 @@ static void check_dma_crc(ide_drive_t *drive)
1012{ 1011{
1013#ifdef CONFIG_BLK_DEV_IDEDMA 1012#ifdef CONFIG_BLK_DEV_IDEDMA
1014 if (drive->crc_count) { 1013 if (drive->crc_count) {
1015 drive->hwif->dma_off_quietly(drive); 1014 ide_dma_off_quietly(drive);
1016 ide_set_xfer_rate(drive, ide_auto_reduce_xfer(drive)); 1015 ide_set_xfer_rate(drive, ide_auto_reduce_xfer(drive));
1017 if (drive->current_speed >= XFER_SW_DMA_0) 1016 if (drive->current_speed >= XFER_SW_DMA_0)
1018 (void) HWIF(drive)->ide_dma_on(drive); 1017 ide_dma_on(drive);
1019 } else 1018 } else
1020 ide_dma_off(drive); 1019 ide_dma_off(drive);
1021#endif 1020#endif