aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/ide/ide-taskfile.c
diff options
context:
space:
mode:
authorBartlomiej Zolnierkiewicz <bzolnier@gmail.com>2008-01-25 16:17:10 -0500
committerBartlomiej Zolnierkiewicz <bzolnier@gmail.com>2008-01-25 16:17:10 -0500
commita3bbb9d882dc94fe3a1361596ab9ce55d84059ea (patch)
treeb2b7af290b6300be00a2cbd6c5d0dba19905dc65 /drivers/ide/ide-taskfile.c
parent868e672ac8db650dde695a5707a6caf5a757e7d9 (diff)
ide: remove unnecessary writes to HOB taskfile registers
* Set taskfile flags for REQ_TYPE_ATA_TASKFILE requests before adding the request to the queue. * Cleanup execute_drive_cmd(). * Remove unnecessary writes to HOB taskfile registers when using LBA48 disk for the following cases: - Power Management requests (WIN_FLUSH_CACHE[_EXT], WIN_STANDBYNOW1, WIN_IDLEIMMEDIATE commands) - special commands (WIN_SPECIFY, WIN_RESTORE, WIN_SETMULT) - Host Protected Area support (WIN_READ_NATIVE_MAX, WIN_SET_MAX) - /proc/ide/ SMART support (WIN_SMART with SMART_ENABLE, SMART_READ_VALUES and SMART_READ_THRESHOLDS subcommands) - write cache enabling/disabling in ide-disk (WIN_SETFEATURES with SETFEATURES_{EN,DIS}_WCACHE) - write cache flushing in ide-disk (WIN_FLUSH_CACHE[_EXT]) - acoustic management in ide-disk (WIN_SETFEATURES with SETFEATURES_{EN,DIS}_AAM) - door (un)locking in ide-disk (WIN_DOORLOCK, WIN_DOORUNLOCK) - /proc/ide/hd?/identify support (WIN_IDENTIFY) - ACPI _GTF taskfiles Signed-off-by: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
Diffstat (limited to 'drivers/ide/ide-taskfile.c')
-rw-r--r--drivers/ide/ide-taskfile.c9
1 files changed, 9 insertions, 0 deletions
diff --git a/drivers/ide/ide-taskfile.c b/drivers/ide/ide-taskfile.c
index 8a5a10fdcfc..7ae4a42cfa5 100644
--- a/drivers/ide/ide-taskfile.c
+++ b/drivers/ide/ide-taskfile.c
@@ -126,6 +126,7 @@ int taskfile_lib_get_identify (ide_drive_t *drive, u8 *buf)
126 args.tf.command = WIN_IDENTIFY; 126 args.tf.command = WIN_IDENTIFY;
127 else 127 else
128 args.tf.command = WIN_PIDENTIFY; 128 args.tf.command = WIN_PIDENTIFY;
129 args.tf_flags = IDE_TFLAG_OUT_TF | IDE_TFLAG_OUT_DEVICE;
129 args.command_type = IDE_DRIVE_TASK_IN; 130 args.command_type = IDE_DRIVE_TASK_IN;
130 args.data_phase = TASKFILE_IN; 131 args.data_phase = TASKFILE_IN;
131 args.handler = &task_in_intr; 132 args.handler = &task_in_intr;
@@ -619,6 +620,10 @@ int ide_taskfile_ioctl (ide_drive_t *drive, unsigned int cmd, unsigned long arg)
619 args.data_phase = req_task->data_phase; 620 args.data_phase = req_task->data_phase;
620 args.command_type = req_task->req_cmd; 621 args.command_type = req_task->req_cmd;
621 622
623 args.tf_flags = IDE_TFLAG_OUT_DEVICE;
624 if (drive->addressing == 1)
625 args.tf_flags |= IDE_TFLAG_LBA48;
626
622 if (req_task->out_flags.all) { 627 if (req_task->out_flags.all) {
623 args.tf_flags |= IDE_TFLAG_FLAGGED; 628 args.tf_flags |= IDE_TFLAG_FLAGGED;
624 629
@@ -644,6 +649,10 @@ int ide_taskfile_ioctl (ide_drive_t *drive, unsigned int cmd, unsigned long arg)
644 args.tf_flags |= IDE_TFLAG_OUT_LBAM; 649 args.tf_flags |= IDE_TFLAG_OUT_LBAM;
645 if (req_task->out_flags.b.hcyl) 650 if (req_task->out_flags.b.hcyl)
646 args.tf_flags |= IDE_TFLAG_OUT_LBAH; 651 args.tf_flags |= IDE_TFLAG_OUT_LBAH;
652 } else {
653 args.tf_flags |= IDE_TFLAG_OUT_TF;
654 if (args.tf_flags & IDE_TFLAG_LBA48)
655 args.tf_flags |= IDE_TFLAG_OUT_HOB;
647 } 656 }
648 657
649 drive->io_32bit = 0; 658 drive->io_32bit = 0;