diff options
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/ide/ide-io.c | 42 |
1 files changed, 20 insertions, 22 deletions
diff --git a/drivers/ide/ide-io.c b/drivers/ide/ide-io.c index c5d81df02007..98aafc5cc5ba 100644 --- a/drivers/ide/ide-io.c +++ b/drivers/ide/ide-io.c | |||
@@ -867,13 +867,15 @@ static ide_startstop_t execute_drive_cmd (ide_drive_t *drive, | |||
867 | struct request *rq) | 867 | struct request *rq) |
868 | { | 868 | { |
869 | ide_hwif_t *hwif = HWIF(drive); | 869 | ide_hwif_t *hwif = HWIF(drive); |
870 | u8 *args = rq->buffer; | ||
871 | |||
870 | if (rq->cmd_type == REQ_TYPE_ATA_TASKFILE) { | 872 | if (rq->cmd_type == REQ_TYPE_ATA_TASKFILE) { |
871 | ide_task_t *args = rq->special; | 873 | ide_task_t *task = rq->special; |
872 | 874 | ||
873 | if (!args) | 875 | if (task == NULL) |
874 | goto done; | 876 | goto done; |
875 | 877 | ||
876 | hwif->data_phase = args->data_phase; | 878 | hwif->data_phase = task->data_phase; |
877 | 879 | ||
878 | switch (hwif->data_phase) { | 880 | switch (hwif->data_phase) { |
879 | case TASKFILE_MULTI_OUT: | 881 | case TASKFILE_MULTI_OUT: |
@@ -886,19 +888,20 @@ static ide_startstop_t execute_drive_cmd (ide_drive_t *drive, | |||
886 | break; | 888 | break; |
887 | } | 889 | } |
888 | 890 | ||
889 | if (args->tf_flags & IDE_TFLAG_FLAGGED) | 891 | if (task->tf_flags & IDE_TFLAG_FLAGGED) |
890 | return flagged_taskfile(drive, args); | 892 | return flagged_taskfile(drive, task); |
891 | 893 | ||
892 | args->tf_flags |= IDE_TFLAG_OUT_TF; | 894 | task->tf_flags |= IDE_TFLAG_OUT_TF; |
893 | if (drive->addressing == 1) | 895 | if (drive->addressing == 1) |
894 | args->tf_flags |= (IDE_TFLAG_LBA48 | IDE_TFLAG_OUT_HOB); | 896 | task->tf_flags |= (IDE_TFLAG_LBA48 | IDE_TFLAG_OUT_HOB); |
895 | 897 | ||
896 | return do_rw_taskfile(drive, args); | 898 | return do_rw_taskfile(drive, task); |
897 | } else if (rq->cmd_type == REQ_TYPE_ATA_TASK) { | 899 | } |
898 | u8 *args = rq->buffer; | 900 | |
899 | 901 | if (args == NULL) | |
900 | if (!args) | 902 | goto done; |
901 | goto done; | 903 | |
904 | if (rq->cmd_type == REQ_TYPE_ATA_TASK) { | ||
902 | #ifdef DEBUG | 905 | #ifdef DEBUG |
903 | printk("%s: DRIVE_TASK_CMD ", drive->name); | 906 | printk("%s: DRIVE_TASK_CMD ", drive->name); |
904 | printk("cmd=0x%02x ", args[0]); | 907 | printk("cmd=0x%02x ", args[0]); |
@@ -915,13 +918,7 @@ static ide_startstop_t execute_drive_cmd (ide_drive_t *drive, | |||
915 | hwif->OUTB(args[4], IDE_LCYL_REG); | 918 | hwif->OUTB(args[4], IDE_LCYL_REG); |
916 | hwif->OUTB(args[5], IDE_HCYL_REG); | 919 | hwif->OUTB(args[5], IDE_HCYL_REG); |
917 | hwif->OUTB((args[6] & 0xEF)|drive->select.all, IDE_SELECT_REG); | 920 | hwif->OUTB((args[6] & 0xEF)|drive->select.all, IDE_SELECT_REG); |
918 | ide_cmd(drive, args[0], &drive_cmd_intr); | 921 | } else { /* rq->cmd_type == REQ_TYPE_ATA_CMD */ |
919 | return ide_started; | ||
920 | } else if (rq->cmd_type == REQ_TYPE_ATA_CMD) { | ||
921 | u8 *args = rq->buffer; | ||
922 | |||
923 | if (!args) | ||
924 | goto done; | ||
925 | #ifdef DEBUG | 922 | #ifdef DEBUG |
926 | printk("%s: DRIVE_CMD ", drive->name); | 923 | printk("%s: DRIVE_CMD ", drive->name); |
927 | printk("cmd=0x%02x ", args[0]); | 924 | printk("cmd=0x%02x ", args[0]); |
@@ -937,10 +934,11 @@ static ide_startstop_t execute_drive_cmd (ide_drive_t *drive, | |||
937 | hwif->OUTB(0xc2, IDE_HCYL_REG); | 934 | hwif->OUTB(0xc2, IDE_HCYL_REG); |
938 | } else | 935 | } else |
939 | hwif->OUTB(args[1], IDE_NSECTOR_REG); | 936 | hwif->OUTB(args[1], IDE_NSECTOR_REG); |
940 | ide_cmd(drive, args[0], &drive_cmd_intr); | ||
941 | return ide_started; | ||
942 | } | 937 | } |
943 | 938 | ||
939 | ide_cmd(drive, args[0], &drive_cmd_intr); | ||
940 | return ide_started; | ||
941 | |||
944 | done: | 942 | done: |
945 | /* | 943 | /* |
946 | * NULL is actually a valid way of waiting for | 944 | * NULL is actually a valid way of waiting for |