diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2008-01-27 01:54:32 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2008-01-27 01:54:32 -0500 |
commit | 1c7c2cdec3a6b2873439096983794a550d7ff65b (patch) | |
tree | 10ea67846407e9882d50e95a9db675140dd423eb /drivers/ide/ide-iops.c | |
parent | 0444fa78751260b38f0db3418e001bf86593f05f (diff) | |
parent | 7267c3377443322588cddaf457cf106839a60463 (diff) |
Merge git://git.kernel.org/pub/scm/linux/kernel/git/bart/ide-2.6
* git://git.kernel.org/pub/scm/linux/kernel/git/bart/ide-2.6: (63 commits)
ide: remove REQ_TYPE_ATA_CMD
ide: switch ide_cmd_ioctl() to use REQ_TYPE_ATA_TASKFILE requests
ide: switch set_xfer_rate() to use REQ_TYPE_ATA_TASKFILE requests
ide: fix final status check in drive_cmd_intr()
ide: check BUSY and ERROR status bits before reading data in drive_cmd_intr()
ide: don't enable local IRQs for PIO-in in driver_cmd_intr() (take 2)
ide: convert "empty" REQ_TYPE_ATA_CMD requests to use REQ_TYPE_ATA_TASKFILE
ide: initialize rq->cmd_type in ide_init_drive_cmd() callers
ide: use wait_drive_not_busy() in drive_cmd_intr() (take 2)
ide: kill DATA_READY define
ide: task_end_request() fix
ide: use rq->nr_sectors in task_end_request()
ide: remove needless ->cursg clearing from task_end_request()
ide: set IDE_TFLAG_IN_* flags before queuing/executing command
ide-tape: fix handling of non-special requests in ->end_request method
ide: fix final status check in task_in_intr()
ide: clear HOB bit for REQ_TYPE_ATA_CMD requests in ide_end_drive_cmd()
ide: fix ->io_32bit race in ide_taskfile_ioctl()
cmd64x: remove /proc/ide/cmd64x
ide: remove broken disk byte-swapping support
...
Diffstat (limited to 'drivers/ide/ide-iops.c')
-rw-r--r-- | drivers/ide/ide-iops.c | 31 |
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: | |||
619 | int ide_ata66_check (ide_drive_t *drive, ide_task_t *args) | 619 | int 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) | |||
639 | int set_transfer (ide_drive_t *drive, ide_task_t *args) | 639 | int 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 |