diff options
Diffstat (limited to 'drivers/ide/ide-taskfile.c')
-rw-r--r-- | drivers/ide/ide-taskfile.c | 29 |
1 files changed, 13 insertions, 16 deletions
diff --git a/drivers/ide/ide-taskfile.c b/drivers/ide/ide-taskfile.c index ff28449bbcaf..03c4a0c55bf4 100644 --- a/drivers/ide/ide-taskfile.c +++ b/drivers/ide/ide-taskfile.c | |||
@@ -599,8 +599,8 @@ int ide_taskfile_ioctl (ide_drive_t *drive, unsigned int cmd, unsigned long arg) | |||
599 | 599 | ||
600 | memcpy(&args.tf_array[0], req_task->hob_ports, HDIO_DRIVE_HOB_HDR_SIZE - 2); | 600 | memcpy(&args.tf_array[0], req_task->hob_ports, HDIO_DRIVE_HOB_HDR_SIZE - 2); |
601 | memcpy(&args.tf_array[6], req_task->io_ports, HDIO_DRIVE_TASK_HDR_SIZE); | 601 | memcpy(&args.tf_array[6], req_task->io_ports, HDIO_DRIVE_TASK_HDR_SIZE); |
602 | args.tf_in_flags = req_task->in_flags; | 602 | |
603 | args.data_phase = req_task->data_phase; | 603 | args.data_phase = req_task->data_phase; |
604 | 604 | ||
605 | args.tf_flags = IDE_TFLAG_OUT_DEVICE; | 605 | args.tf_flags = IDE_TFLAG_OUT_DEVICE; |
606 | if (drive->addressing == 1) | 606 | if (drive->addressing == 1) |
@@ -637,6 +637,9 @@ int ide_taskfile_ioctl (ide_drive_t *drive, unsigned int cmd, unsigned long arg) | |||
637 | args.tf_flags |= IDE_TFLAG_OUT_HOB; | 637 | args.tf_flags |= IDE_TFLAG_OUT_HOB; |
638 | } | 638 | } |
639 | 639 | ||
640 | if (req_task->in_flags.b.data) | ||
641 | args.tf_flags |= IDE_TFLAG_IN_DATA; | ||
642 | |||
640 | drive->io_32bit = 0; | 643 | drive->io_32bit = 0; |
641 | switch(req_task->data_phase) { | 644 | switch(req_task->data_phase) { |
642 | case TASKFILE_MULTI_OUT: | 645 | case TASKFILE_MULTI_OUT: |
@@ -704,7 +707,13 @@ int ide_taskfile_ioctl (ide_drive_t *drive, unsigned int cmd, unsigned long arg) | |||
704 | 707 | ||
705 | memcpy(req_task->hob_ports, &args.tf_array[0], HDIO_DRIVE_HOB_HDR_SIZE - 2); | 708 | memcpy(req_task->hob_ports, &args.tf_array[0], HDIO_DRIVE_HOB_HDR_SIZE - 2); |
706 | memcpy(req_task->io_ports, &args.tf_array[6], HDIO_DRIVE_TASK_HDR_SIZE); | 709 | memcpy(req_task->io_ports, &args.tf_array[6], HDIO_DRIVE_TASK_HDR_SIZE); |
707 | req_task->in_flags = args.tf_in_flags; | 710 | |
711 | if ((args.tf_flags & IDE_TFLAG_FLAGGED_SET_IN_FLAGS) && | ||
712 | req_task->in_flags.all == 0) { | ||
713 | req_task->in_flags.all = IDE_TASKFILE_STD_IN_FLAGS; | ||
714 | if (drive->addressing == 1) | ||
715 | req_task->in_flags.all |= (IDE_HOB_STD_IN_FLAGS << 8); | ||
716 | } | ||
708 | 717 | ||
709 | if (copy_to_user(buf, req_task, tasksize)) { | 718 | if (copy_to_user(buf, req_task, tasksize)) { |
710 | err = -EFAULT; | 719 | err = -EFAULT; |
@@ -846,19 +855,7 @@ ide_startstop_t flagged_taskfile (ide_drive_t *drive, ide_task_t *task) | |||
846 | } | 855 | } |
847 | } | 856 | } |
848 | 857 | ||
849 | /* | 858 | task->tf_flags |= IDE_TFLAG_FLAGGED_SET_IN_FLAGS; |
850 | * (ks) Check taskfile in flags. | ||
851 | * If set, then execute as it is defined. | ||
852 | * If not set, then define default settings. | ||
853 | * The default values are: | ||
854 | * read all taskfile registers (except data) | ||
855 | * read the hob registers (sector, nsector, lcyl, hcyl) | ||
856 | */ | ||
857 | if (task->tf_in_flags.all == 0) { | ||
858 | task->tf_in_flags.all = IDE_TASKFILE_STD_IN_FLAGS; | ||
859 | if (drive->addressing == 1) | ||
860 | task->tf_in_flags.all |= (IDE_HOB_STD_IN_FLAGS << 8); | ||
861 | } | ||
862 | 859 | ||
863 | return do_rw_taskfile(drive, task); | 860 | return do_rw_taskfile(drive, task); |
864 | } | 861 | } |