ide: remove 'tf_in_flags' field from ide_task_t
* Add IDE_TFLAG_IN_DATA taskfile flag to indicate the need of reading IDE_DATA_REG in ide_end_drive_cmd(). Set the new flag in ide_taskfile_ioctl() if ->in_flags.b.data is set. * Add IDE_TFLAG_FLAGGED_SET_IN_FLAGS taskfile flag to indicate the need of modifying ->in_flags in ide_taskfile_ioctl(). Set the new flag in flagged_taskfile() and move the code modifying ->tf_in_flags to ide_taskfile_ioctl(). While at it remove the bogus comment: ->tf_in_flags (except .b.data) have no effect on selection of registers to read. * Remove no longer needed 'tf_in_flags' field from ide_task_t. As the result we finally have the internals of HDIO_DRIVE_TASKFILE ioctl separated from the core IDE code. There should be no functionality changes caused by this patch. Acked-by: Sergei Shtylyov <sshtylyov@ru.mvista.com> Signed-off-by: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
This commit is contained in:
parent
ac026ff254
commit
866e2ec9ce
3 changed files with 17 additions and 19 deletions
|
@ -340,7 +340,7 @@ void ide_end_drive_cmd (ide_drive_t *drive, u8 stat, u8 err)
|
|||
if (args) {
|
||||
struct ide_taskfile *tf = &args->tf;
|
||||
|
||||
if (args->tf_in_flags.b.data) {
|
||||
if (args->tf_flags & IDE_TFLAG_IN_DATA) {
|
||||
u16 data = hwif->INW(IDE_DATA_REG);
|
||||
|
||||
tf->data = data & 0xff;
|
||||
|
|
|
@ -599,7 +599,7 @@ int ide_taskfile_ioctl (ide_drive_t *drive, unsigned int cmd, unsigned long arg)
|
|||
|
||||
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.tf_flags = IDE_TFLAG_OUT_DEVICE;
|
||||
|
@ -637,6 +637,9 @@ int ide_taskfile_ioctl (ide_drive_t *drive, unsigned int cmd, unsigned long arg)
|
|||
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:
|
||||
|
@ -704,7 +707,13 @@ int ide_taskfile_ioctl (ide_drive_t *drive, unsigned int cmd, unsigned long arg)
|
|||
|
||||
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;
|
||||
|
@ -846,19 +855,7 @@ ide_startstop_t flagged_taskfile (ide_drive_t *drive, ide_task_t *task)
|
|||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* (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);
|
||||
}
|
||||
|
|
|
@ -910,6 +910,8 @@ enum {
|
|||
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 {
|
||||
|
@ -946,8 +948,7 @@ typedef struct ide_task_s {
|
|||
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;
|
||||
|
|
Loading…
Reference in a new issue