diff options
-rw-r--r-- | drivers/ide/ide-io.c | 41 | ||||
-rw-r--r-- | drivers/ide/ide-taskfile.c | 28 | ||||
-rw-r--r-- | include/linux/ide.h | 5 |
3 files changed, 38 insertions, 36 deletions
diff --git a/drivers/ide/ide-io.c b/drivers/ide/ide-io.c index 18ac1bd0811f..48c38b68bd36 100644 --- a/drivers/ide/ide-io.c +++ b/drivers/ide/ide-io.c | |||
@@ -637,32 +637,26 @@ static ide_startstop_t drive_cmd_intr (ide_drive_t *drive) | |||
637 | return ide_stopped; | 637 | return ide_stopped; |
638 | } | 638 | } |
639 | 639 | ||
640 | static void ide_init_specify_cmd(ide_drive_t *drive, ide_task_t *task) | 640 | static void ide_tf_set_specify_cmd(ide_drive_t *drive, struct ide_taskfile *tf) |
641 | { | 641 | { |
642 | task->tf.nsect = drive->sect; | 642 | tf->nsect = drive->sect; |
643 | task->tf.lbal = drive->sect; | 643 | tf->lbal = drive->sect; |
644 | task->tf.lbam = drive->cyl; | 644 | tf->lbam = drive->cyl; |
645 | task->tf.lbah = drive->cyl >> 8; | 645 | tf->lbah = drive->cyl >> 8; |
646 | task->tf.device = ((drive->head - 1) | drive->select.all) & ~ATA_LBA; | 646 | tf->device = ((drive->head - 1) | drive->select.all) & ~ATA_LBA; |
647 | task->tf.command = WIN_SPECIFY; | 647 | tf->command = WIN_SPECIFY; |
648 | |||
649 | task->handler = &set_geometry_intr; | ||
650 | } | 648 | } |
651 | 649 | ||
652 | static void ide_init_restore_cmd(ide_drive_t *drive, ide_task_t *task) | 650 | static void ide_tf_set_restore_cmd(ide_drive_t *drive, struct ide_taskfile *tf) |
653 | { | 651 | { |
654 | task->tf.nsect = drive->sect; | 652 | tf->nsect = drive->sect; |
655 | task->tf.command = WIN_RESTORE; | 653 | tf->command = WIN_RESTORE; |
656 | |||
657 | task->handler = &recal_intr; | ||
658 | } | 654 | } |
659 | 655 | ||
660 | static void ide_init_setmult_cmd(ide_drive_t *drive, ide_task_t *task) | 656 | static void ide_tf_set_setmult_cmd(ide_drive_t *drive, struct ide_taskfile *tf) |
661 | { | 657 | { |
662 | task->tf.nsect = drive->mult_req; | 658 | tf->nsect = drive->mult_req; |
663 | task->tf.command = WIN_SETMULT; | 659 | tf->command = WIN_SETMULT; |
664 | |||
665 | task->handler = &set_multmode_intr; | ||
666 | } | 660 | } |
667 | 661 | ||
668 | static ide_startstop_t ide_disk_special(ide_drive_t *drive) | 662 | static ide_startstop_t ide_disk_special(ide_drive_t *drive) |
@@ -675,15 +669,15 @@ static ide_startstop_t ide_disk_special(ide_drive_t *drive) | |||
675 | 669 | ||
676 | if (s->b.set_geometry) { | 670 | if (s->b.set_geometry) { |
677 | s->b.set_geometry = 0; | 671 | s->b.set_geometry = 0; |
678 | ide_init_specify_cmd(drive, &args); | 672 | ide_tf_set_specify_cmd(drive, &args.tf); |
679 | } else if (s->b.recalibrate) { | 673 | } else if (s->b.recalibrate) { |
680 | s->b.recalibrate = 0; | 674 | s->b.recalibrate = 0; |
681 | ide_init_restore_cmd(drive, &args); | 675 | ide_tf_set_restore_cmd(drive, &args.tf); |
682 | } else if (s->b.set_multmode) { | 676 | } else if (s->b.set_multmode) { |
683 | s->b.set_multmode = 0; | 677 | s->b.set_multmode = 0; |
684 | if (drive->mult_req > drive->id->max_multsect) | 678 | if (drive->mult_req > drive->id->max_multsect) |
685 | drive->mult_req = drive->id->max_multsect; | 679 | drive->mult_req = drive->id->max_multsect; |
686 | ide_init_setmult_cmd(drive, &args); | 680 | ide_tf_set_setmult_cmd(drive, &args.tf); |
687 | } else if (s->all) { | 681 | } else if (s->all) { |
688 | int special = s->all; | 682 | int special = s->all; |
689 | s->all = 0; | 683 | s->all = 0; |
@@ -691,7 +685,8 @@ static ide_startstop_t ide_disk_special(ide_drive_t *drive) | |||
691 | return ide_stopped; | 685 | return ide_stopped; |
692 | } | 686 | } |
693 | 687 | ||
694 | args.tf_flags = IDE_TFLAG_OUT_TF | IDE_TFLAG_OUT_DEVICE; | 688 | args.tf_flags = IDE_TFLAG_OUT_TF | IDE_TFLAG_OUT_DEVICE | |
689 | IDE_TFLAG_CUSTOM_HANDLER; | ||
695 | 690 | ||
696 | do_rw_taskfile(drive, &args); | 691 | do_rw_taskfile(drive, &args); |
697 | 692 | ||
diff --git a/drivers/ide/ide-taskfile.c b/drivers/ide/ide-taskfile.c index 835465d61f70..236f91f11a73 100644 --- a/drivers/ide/ide-taskfile.c +++ b/drivers/ide/ide-taskfile.c | |||
@@ -151,12 +151,15 @@ static int inline task_dma_ok(ide_task_t *task) | |||
151 | } | 151 | } |
152 | 152 | ||
153 | static ide_startstop_t task_no_data_intr(ide_drive_t *); | 153 | static ide_startstop_t task_no_data_intr(ide_drive_t *); |
154 | static ide_startstop_t task_out_intr(ide_drive_t *); | 154 | static ide_startstop_t set_geometry_intr(ide_drive_t *); |
155 | static ide_startstop_t recal_intr(ide_drive_t *); | ||
156 | static ide_startstop_t set_multmode_intr(ide_drive_t *); | ||
155 | 157 | ||
156 | ide_startstop_t do_rw_taskfile (ide_drive_t *drive, ide_task_t *task) | 158 | ide_startstop_t do_rw_taskfile (ide_drive_t *drive, ide_task_t *task) |
157 | { | 159 | { |
158 | ide_hwif_t *hwif = HWIF(drive); | 160 | ide_hwif_t *hwif = HWIF(drive); |
159 | struct ide_taskfile *tf = &task->tf; | 161 | struct ide_taskfile *tf = &task->tf; |
162 | ide_handler_t *handler = NULL; | ||
160 | 163 | ||
161 | if (task->data_phase == TASKFILE_MULTI_IN || | 164 | if (task->data_phase == TASKFILE_MULTI_IN || |
162 | task->data_phase == TASKFILE_MULTI_OUT) { | 165 | task->data_phase == TASKFILE_MULTI_OUT) { |
@@ -175,19 +178,26 @@ ide_startstop_t do_rw_taskfile (ide_drive_t *drive, ide_task_t *task) | |||
175 | switch (task->data_phase) { | 178 | switch (task->data_phase) { |
176 | case TASKFILE_MULTI_OUT: | 179 | case TASKFILE_MULTI_OUT: |
177 | case TASKFILE_OUT: | 180 | case TASKFILE_OUT: |
178 | task->handler = task_out_intr; | ||
179 | hwif->OUTBSYNC(drive, tf->command, IDE_COMMAND_REG); | 181 | hwif->OUTBSYNC(drive, tf->command, IDE_COMMAND_REG); |
180 | ndelay(400); /* FIXME */ | 182 | ndelay(400); /* FIXME */ |
181 | return pre_task_out_intr(drive, task->rq); | 183 | return pre_task_out_intr(drive, task->rq); |
182 | case TASKFILE_MULTI_IN: | 184 | case TASKFILE_MULTI_IN: |
183 | case TASKFILE_IN: | 185 | case TASKFILE_IN: |
184 | task->handler = task_in_intr; | 186 | handler = task_in_intr; |
185 | /* fall-through */ | 187 | /* fall-through */ |
186 | case TASKFILE_NO_DATA: | 188 | case TASKFILE_NO_DATA: |
189 | if (handler == NULL) | ||
190 | handler = task_no_data_intr; | ||
187 | /* WIN_{SPECIFY,RESTORE,SETMULT} use custom handlers */ | 191 | /* WIN_{SPECIFY,RESTORE,SETMULT} use custom handlers */ |
188 | if (task->handler == NULL) | 192 | if (task->tf_flags & IDE_TFLAG_CUSTOM_HANDLER) { |
189 | task->handler = task_no_data_intr; | 193 | switch (tf->command) { |
190 | ide_execute_command(drive, tf->command, task->handler, WAIT_WORSTCASE, NULL); | 194 | case WIN_SPECIFY: handler = set_geometry_intr; break; |
195 | case WIN_RESTORE: handler = recal_intr; break; | ||
196 | case WIN_SETMULT: handler = set_multmode_intr; break; | ||
197 | } | ||
198 | } | ||
199 | ide_execute_command(drive, tf->command, handler, | ||
200 | WAIT_WORSTCASE, NULL); | ||
191 | return ide_started; | 201 | return ide_started; |
192 | default: | 202 | default: |
193 | if (task_dma_ok(task) == 0 || drive->using_dma == 0 || | 203 | if (task_dma_ok(task) == 0 || drive->using_dma == 0 || |
@@ -202,7 +212,7 @@ ide_startstop_t do_rw_taskfile (ide_drive_t *drive, ide_task_t *task) | |||
202 | /* | 212 | /* |
203 | * set_multmode_intr() is invoked on completion of a WIN_SETMULT cmd. | 213 | * set_multmode_intr() is invoked on completion of a WIN_SETMULT cmd. |
204 | */ | 214 | */ |
205 | ide_startstop_t set_multmode_intr (ide_drive_t *drive) | 215 | static ide_startstop_t set_multmode_intr(ide_drive_t *drive) |
206 | { | 216 | { |
207 | ide_hwif_t *hwif = HWIF(drive); | 217 | ide_hwif_t *hwif = HWIF(drive); |
208 | u8 stat; | 218 | u8 stat; |
@@ -220,7 +230,7 @@ ide_startstop_t set_multmode_intr (ide_drive_t *drive) | |||
220 | /* | 230 | /* |
221 | * set_geometry_intr() is invoked on completion of a WIN_SPECIFY cmd. | 231 | * set_geometry_intr() is invoked on completion of a WIN_SPECIFY cmd. |
222 | */ | 232 | */ |
223 | ide_startstop_t set_geometry_intr (ide_drive_t *drive) | 233 | static ide_startstop_t set_geometry_intr(ide_drive_t *drive) |
224 | { | 234 | { |
225 | ide_hwif_t *hwif = HWIF(drive); | 235 | ide_hwif_t *hwif = HWIF(drive); |
226 | int retries = 5; | 236 | int retries = 5; |
@@ -243,7 +253,7 @@ ide_startstop_t set_geometry_intr (ide_drive_t *drive) | |||
243 | /* | 253 | /* |
244 | * recal_intr() is invoked on completion of a WIN_RESTORE (recalibrate) cmd. | 254 | * recal_intr() is invoked on completion of a WIN_RESTORE (recalibrate) cmd. |
245 | */ | 255 | */ |
246 | ide_startstop_t recal_intr (ide_drive_t *drive) | 256 | static ide_startstop_t recal_intr(ide_drive_t *drive) |
247 | { | 257 | { |
248 | ide_hwif_t *hwif = HWIF(drive); | 258 | ide_hwif_t *hwif = HWIF(drive); |
249 | u8 stat; | 259 | u8 stat; |
diff --git a/include/linux/ide.h b/include/linux/ide.h index 5d675f172037..721c9d8f41a2 100644 --- a/include/linux/ide.h +++ b/include/linux/ide.h | |||
@@ -911,6 +911,7 @@ enum { | |||
911 | IDE_TFLAG_WRITE = (1 << 15), | 911 | IDE_TFLAG_WRITE = (1 << 15), |
912 | IDE_TFLAG_FLAGGED_SET_IN_FLAGS = (1 << 16), | 912 | IDE_TFLAG_FLAGGED_SET_IN_FLAGS = (1 << 16), |
913 | IDE_TFLAG_IN_DATA = (1 << 17), | 913 | IDE_TFLAG_IN_DATA = (1 << 17), |
914 | IDE_TFLAG_CUSTOM_HANDLER = (1 << 18), | ||
914 | }; | 915 | }; |
915 | 916 | ||
916 | struct ide_taskfile { | 917 | struct ide_taskfile { |
@@ -949,7 +950,6 @@ typedef struct ide_task_s { | |||
949 | }; | 950 | }; |
950 | u32 tf_flags; | 951 | u32 tf_flags; |
951 | int data_phase; | 952 | int data_phase; |
952 | ide_handler_t *handler; | ||
953 | struct request *rq; /* copy of request */ | 953 | struct request *rq; /* copy of request */ |
954 | void *special; /* valid_t generally */ | 954 | void *special; /* valid_t generally */ |
955 | } ide_task_t; | 955 | } ide_task_t; |
@@ -970,9 +970,6 @@ void ide_pktcmd_tf_load(ide_drive_t *, u32, u16, u8); | |||
970 | */ | 970 | */ |
971 | extern ide_startstop_t do_rw_taskfile(ide_drive_t *, ide_task_t *); | 971 | extern ide_startstop_t do_rw_taskfile(ide_drive_t *, ide_task_t *); |
972 | 972 | ||
973 | extern ide_startstop_t set_multmode_intr(ide_drive_t *); | ||
974 | extern ide_startstop_t set_geometry_intr(ide_drive_t *); | ||
975 | extern ide_startstop_t recal_intr(ide_drive_t *); | ||
976 | extern ide_startstop_t task_in_intr(ide_drive_t *); | 973 | extern ide_startstop_t task_in_intr(ide_drive_t *); |
977 | extern ide_startstop_t pre_task_out_intr(ide_drive_t *, struct request *); | 974 | extern ide_startstop_t pre_task_out_intr(ide_drive_t *, struct request *); |
978 | 975 | ||