memcpy(&args.tf_array[0], req_task->hob_ports, HDIO_DRIVE_HOB_HDR_SIZE - 2);
        memcpy(&args.tf_array[6], req_task->io_ports, HDIO_DRIVE_TASK_HDR_SIZE);
-       args.tf_in_flags  = req_task->in_flags;
-       args.data_phase   = req_task->data_phase;
+
+       args.data_phase = req_task->data_phase;
 
        args.tf_flags = IDE_TFLAG_OUT_DEVICE;
        if (drive->addressing == 1)
                        args.tf_flags |= IDE_TFLAG_OUT_HOB;
        }
 
+       if (req_task->in_flags.b.data)
+               args.tf_flags |= IDE_TFLAG_IN_DATA;
+
        drive->io_32bit = 0;
        switch(req_task->data_phase) {
                case TASKFILE_MULTI_OUT:
 
        memcpy(req_task->hob_ports, &args.tf_array[0], HDIO_DRIVE_HOB_HDR_SIZE - 2);
        memcpy(req_task->io_ports, &args.tf_array[6], HDIO_DRIVE_TASK_HDR_SIZE);
-       req_task->in_flags  = args.tf_in_flags;
+
+       if ((args.tf_flags & IDE_TFLAG_FLAGGED_SET_IN_FLAGS) &&
+           req_task->in_flags.all == 0) {
+               req_task->in_flags.all = IDE_TASKFILE_STD_IN_FLAGS;
+               if (drive->addressing == 1)
+                       req_task->in_flags.all |= (IDE_HOB_STD_IN_FLAGS << 8);
+       }
 
        if (copy_to_user(buf, req_task, tasksize)) {
                err = -EFAULT;
                }
        }
 
-       /*
-        * (ks) Check taskfile in flags.
-        * If set, then execute as it is defined.
-        * If not set, then define default settings.
-        * The default values are:
-        *      read all taskfile registers (except data)
-        *      read the hob registers (sector, nsector, lcyl, hcyl)
-        */
-       if (task->tf_in_flags.all == 0) {
-               task->tf_in_flags.all = IDE_TASKFILE_STD_IN_FLAGS;
-               if (drive->addressing == 1)
-                       task->tf_in_flags.all |= (IDE_HOB_STD_IN_FLAGS  << 8);
-        }
+       task->tf_flags |= IDE_TFLAG_FLAGGED_SET_IN_FLAGS;
 
        return do_rw_taskfile(drive, task);
 }
 
                                          IDE_TFLAG_OUT_LBAH,
        IDE_TFLAG_OUT_DEVICE            = (1 << 14),
        IDE_TFLAG_WRITE                 = (1 << 15),
+       IDE_TFLAG_FLAGGED_SET_IN_FLAGS  = (1 << 16),
+       IDE_TFLAG_IN_DATA               = (1 << 17),
 };
 
 struct ide_taskfile {
                struct ide_taskfile     tf;
                u8                      tf_array[14];
        };
-       u16                     tf_flags;
-       ide_reg_valid_t         tf_in_flags;
+       u32                     tf_flags;
        int                     data_phase;
        ide_pre_handler_t       *prehandler;
        ide_handler_t           *handler;