ide: move data register access out of tf_{read|load}() methods (take 2)

Move IDE_FTFLAG_{IN|OUT}_DATA flag handling out of tf_{read|load}() methods
into the only two functions where these flags actually need to be handled:
do_rw_taskfile() and ide_complete_cmd()...

Signed-off-by: Sergei Shtylyov <sshtylyov@ru.mvista.com>
Signed-off-by: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
This commit is contained in:
Sergei Shtylyov 2009-03-31 20:15:31 +02:00 committed by Bartlomiej Zolnierkiewicz
parent bac08cee93
commit 35218d1ca8
9 changed files with 17 additions and 100 deletions

View File

@ -195,12 +195,6 @@ static void at91_ide_tf_load(ide_drive_t *drive, struct ide_cmd *cmd)
if (cmd->ftf_flags & IDE_FTFLAG_FLAGGED) if (cmd->ftf_flags & IDE_FTFLAG_FLAGGED)
HIHI = 0xFF; HIHI = 0xFF;
if (cmd->ftf_flags & IDE_FTFLAG_OUT_DATA) {
u8 data[2] = { tf->data, tf->hob_data };
at91_ide_output_data(drive, cmd, data, 2);
}
if (cmd->tf_flags & IDE_TFLAG_OUT_HOB_FEATURE) if (cmd->tf_flags & IDE_TFLAG_OUT_HOB_FEATURE)
ide_mm_outb(tf->hob_feature, io_ports->feature_addr); ide_mm_outb(tf->hob_feature, io_ports->feature_addr);
if (cmd->tf_flags & IDE_TFLAG_OUT_HOB_NSECT) if (cmd->tf_flags & IDE_TFLAG_OUT_HOB_NSECT)
@ -233,15 +227,6 @@ static void at91_ide_tf_read(ide_drive_t *drive, struct ide_cmd *cmd)
struct ide_io_ports *io_ports = &hwif->io_ports; struct ide_io_ports *io_ports = &hwif->io_ports;
struct ide_taskfile *tf = &cmd->tf; struct ide_taskfile *tf = &cmd->tf;
if (cmd->ftf_flags & IDE_FTFLAG_IN_DATA) {
u8 data[2];
at91_ide_input_data(drive, cmd, data, 2);
tf->data = data[0];
tf->hob_data = data[1];
}
/* be sure we're looking at the low order bits */ /* be sure we're looking at the low order bits */
ide_mm_outb(ATA_DEVCTL_OBS, io_ports->ctl_addr); ide_mm_outb(ATA_DEVCTL_OBS, io_ports->ctl_addr);

View File

@ -54,12 +54,6 @@ static void h8300_tf_load(ide_drive_t *drive, struct ide_cmd *cmd)
if (cmd->ftf_flags & IDE_FTFLAG_FLAGGED) if (cmd->ftf_flags & IDE_FTFLAG_FLAGGED)
HIHI = 0xFF; HIHI = 0xFF;
if (cmd->ftf_flags & IDE_FTFLAG_OUT_DATA) {
u8 data[2] = { tf->data, tf->hob_data };
h8300_output_data(drive, cmd, data, 2);
}
if (cmd->tf_flags & IDE_TFLAG_OUT_HOB_FEATURE) if (cmd->tf_flags & IDE_TFLAG_OUT_HOB_FEATURE)
outb(tf->hob_feature, io_ports->feature_addr); outb(tf->hob_feature, io_ports->feature_addr);
if (cmd->tf_flags & IDE_TFLAG_OUT_HOB_NSECT) if (cmd->tf_flags & IDE_TFLAG_OUT_HOB_NSECT)
@ -93,15 +87,6 @@ static void h8300_tf_read(ide_drive_t *drive, struct ide_cmd *cmd)
struct ide_io_ports *io_ports = &hwif->io_ports; struct ide_io_ports *io_ports = &hwif->io_ports;
struct ide_taskfile *tf = &cmd->tf; struct ide_taskfile *tf = &cmd->tf;
if (cmd->ftf_flags & IDE_FTFLAG_IN_DATA) {
u8 data[2];
h8300_input_data(drive, cmd, data, 2);
tf->data = data[0];
tf->hob_data = data[1];
}
/* be sure we're looking at the low order bits */ /* be sure we're looking at the low order bits */
outb(ATA_DEVCTL_OBS, io_ports->ctl_addr); outb(ATA_DEVCTL_OBS, io_ports->ctl_addr);

View File

@ -90,12 +90,6 @@ void ide_tf_load(ide_drive_t *drive, struct ide_cmd *cmd)
if (cmd->ftf_flags & IDE_FTFLAG_FLAGGED) if (cmd->ftf_flags & IDE_FTFLAG_FLAGGED)
HIHI = 0xFF; HIHI = 0xFF;
if (cmd->ftf_flags & IDE_FTFLAG_OUT_DATA) {
u8 data[2] = { tf->data, tf->hob_data };
ide_output_data(drive, cmd, data, 2);
}
if (cmd->tf_flags & IDE_TFLAG_OUT_HOB_FEATURE) if (cmd->tf_flags & IDE_TFLAG_OUT_HOB_FEATURE)
tf_outb(tf->hob_feature, io_ports->feature_addr); tf_outb(tf->hob_feature, io_ports->feature_addr);
if (cmd->tf_flags & IDE_TFLAG_OUT_HOB_NSECT) if (cmd->tf_flags & IDE_TFLAG_OUT_HOB_NSECT)
@ -141,15 +135,6 @@ void ide_tf_read(ide_drive_t *drive, struct ide_cmd *cmd)
tf_inb = ide_inb; tf_inb = ide_inb;
} }
if (cmd->ftf_flags & IDE_FTFLAG_IN_DATA) {
u8 data[2];
ide_input_data(drive, cmd, data, 2);
tf->data = data[0];
tf->hob_data = data[1];
}
/* be sure we're looking at the low order bits */ /* be sure we're looking at the low order bits */
tf_outb(ATA_DEVCTL_OBS, io_ports->ctl_addr); tf_outb(ATA_DEVCTL_OBS, io_ports->ctl_addr);

View File

@ -73,6 +73,7 @@ EXPORT_SYMBOL_GPL(ide_end_rq);
void ide_complete_cmd(ide_drive_t *drive, struct ide_cmd *cmd, u8 stat, u8 err) void ide_complete_cmd(ide_drive_t *drive, struct ide_cmd *cmd, u8 stat, u8 err)
{ {
const struct ide_tp_ops *tp_ops = drive->hwif->tp_ops;
struct ide_taskfile *tf = &cmd->tf; struct ide_taskfile *tf = &cmd->tf;
struct request *rq = cmd->rq; struct request *rq = cmd->rq;
u8 tf_cmd = tf->command; u8 tf_cmd = tf->command;
@ -80,7 +81,16 @@ void ide_complete_cmd(ide_drive_t *drive, struct ide_cmd *cmd, u8 stat, u8 err)
tf->error = err; tf->error = err;
tf->status = stat; tf->status = stat;
drive->hwif->tp_ops->tf_read(drive, cmd); if (cmd->ftf_flags & IDE_FTFLAG_IN_DATA) {
u8 data[2];
tp_ops->input_data(drive, cmd, data, 2);
tf->data = data[0];
tf->hob_data = data[1];
}
tp_ops->tf_read(drive, cmd);
if ((cmd->tf_flags & IDE_TFLAG_CUSTOM_HANDLER) && if ((cmd->tf_flags & IDE_TFLAG_CUSTOM_HANDLER) &&
tf_cmd == ATA_CMD_IDLEIMMEDIATE) { tf_cmd == ATA_CMD_IDLEIMMEDIATE) {

View File

@ -82,6 +82,12 @@ ide_startstop_t do_rw_taskfile(ide_drive_t *drive, struct ide_cmd *orig_cmd)
ide_tf_dump(drive->name, tf); ide_tf_dump(drive->name, tf);
tp_ops->write_devctl(hwif, ATA_DEVCTL_OBS); tp_ops->write_devctl(hwif, ATA_DEVCTL_OBS);
SELECT_MASK(drive, 0); SELECT_MASK(drive, 0);
if (cmd->ftf_flags & IDE_FTFLAG_OUT_DATA) {
u8 data[2] = { tf->data, tf->hob_data };
tp_ops->output_data(drive, cmd, data, 2);
}
tp_ops->tf_load(drive, cmd); tp_ops->tf_load(drive, cmd);
} }

View File

@ -66,15 +66,6 @@ static void superio_tf_read(ide_drive_t *drive, struct ide_cmd *cmd)
struct ide_io_ports *io_ports = &drive->hwif->io_ports; struct ide_io_ports *io_ports = &drive->hwif->io_ports;
struct ide_taskfile *tf = &cmd->tf; struct ide_taskfile *tf = &cmd->tf;
if (cmd->ftf_flags & IDE_FTFLAG_IN_DATA) {
u8 data[2];
ide_input_data(drive, cmd, data, 2);
tf->data = data[0];
tf->hob_data = data[1];
}
/* be sure we're looking at the low order bits */ /* be sure we're looking at the low order bits */
outb(ATA_DEVCTL_OBS, io_ports->ctl_addr); outb(ATA_DEVCTL_OBS, io_ports->ctl_addr);

View File

@ -656,12 +656,6 @@ static void scc_tf_load(ide_drive_t *drive, struct ide_cmd *cmd)
if (cmd->ftf_flags & IDE_FTFLAG_FLAGGED) if (cmd->ftf_flags & IDE_FTFLAG_FLAGGED)
HIHI = 0xFF; HIHI = 0xFF;
if (cmd->ftf_flags & IDE_FTFLAG_OUT_DATA) {
u8 data[2] = { tf->data, tf->hob_data };
scc_output_data(drive, NULL, data, 2);
}
if (cmd->tf_flags & IDE_TFLAG_OUT_HOB_FEATURE) if (cmd->tf_flags & IDE_TFLAG_OUT_HOB_FEATURE)
scc_ide_outb(tf->hob_feature, io_ports->feature_addr); scc_ide_outb(tf->hob_feature, io_ports->feature_addr);
if (cmd->tf_flags & IDE_TFLAG_OUT_HOB_NSECT) if (cmd->tf_flags & IDE_TFLAG_OUT_HOB_NSECT)
@ -694,15 +688,6 @@ static void scc_tf_read(ide_drive_t *drive, struct ide_cmd *cmd)
struct ide_io_ports *io_ports = &drive->hwif->io_ports; struct ide_io_ports *io_ports = &drive->hwif->io_ports;
struct ide_taskfile *tf = &cmd->tf; struct ide_taskfile *tf = &cmd->tf;
if (cmd->ftf_flags & IDE_FTFLAG_IN_DATA) {
u8 data[2];
scc_input_data(drive, cmd, data, 2);
tf->data = data[0];
tf->hob_data = data[1];
}
/* be sure we're looking at the low order bits */ /* be sure we're looking at the low order bits */
scc_ide_outb(ATA_DEVCTL_OBS, io_ports->ctl_addr); scc_ide_outb(ATA_DEVCTL_OBS, io_ports->ctl_addr);

View File

@ -92,12 +92,6 @@ static void tx4938ide_tf_load(ide_drive_t *drive, struct ide_cmd *cmd)
if (cmd->ftf_flags & IDE_FTFLAG_FLAGGED) if (cmd->ftf_flags & IDE_FTFLAG_FLAGGED)
HIHI = 0xFF; HIHI = 0xFF;
if (cmd->ftf_flags & IDE_FTFLAG_OUT_DATA) {
u8 data[2] = { tf->data, tf->hob_data };
hwif->tp_ops->output_data(drive, cmd, data, 2);
}
if (cmd->tf_flags & IDE_TFLAG_OUT_HOB_FEATURE) if (cmd->tf_flags & IDE_TFLAG_OUT_HOB_FEATURE)
tx4938ide_outb(tf->hob_feature, io_ports->feature_addr); tx4938ide_outb(tf->hob_feature, io_ports->feature_addr);
if (cmd->tf_flags & IDE_TFLAG_OUT_HOB_NSECT) if (cmd->tf_flags & IDE_TFLAG_OUT_HOB_NSECT)
@ -131,15 +125,6 @@ static void tx4938ide_tf_read(ide_drive_t *drive, struct ide_cmd *cmd)
struct ide_io_ports *io_ports = &hwif->io_ports; struct ide_io_ports *io_ports = &hwif->io_ports;
struct ide_taskfile *tf = &cmd->tf; struct ide_taskfile *tf = &cmd->tf;
if (cmd->ftf_flags & IDE_FTFLAG_IN_DATA) {
u8 data[2];
hwif->tp_ops->input_data(drive, cmd, data, 2);
tf->data = data[0];
tf->hob_data = data[1];
}
/* be sure we're looking at the low order bits */ /* be sure we're looking at the low order bits */
tx4938ide_outb(ATA_DEVCTL_OBS, io_ports->ctl_addr); tx4938ide_outb(ATA_DEVCTL_OBS, io_ports->ctl_addr);

View File

@ -457,12 +457,6 @@ static void tx4939ide_tf_load(ide_drive_t *drive, struct ide_cmd *cmd)
if (cmd->ftf_flags & IDE_FTFLAG_FLAGGED) if (cmd->ftf_flags & IDE_FTFLAG_FLAGGED)
HIHI = 0xFF; HIHI = 0xFF;
if (cmd->ftf_flags & IDE_FTFLAG_OUT_DATA) {
u8 data[2] = { tf->data, tf->hob_data };
hwif->tp_ops->output_data(drive, cmd, data, 2);
}
if (cmd->tf_flags & IDE_TFLAG_OUT_HOB_FEATURE) if (cmd->tf_flags & IDE_TFLAG_OUT_HOB_FEATURE)
tx4939ide_outb(tf->hob_feature, io_ports->feature_addr); tx4939ide_outb(tf->hob_feature, io_ports->feature_addr);
if (cmd->tf_flags & IDE_TFLAG_OUT_HOB_NSECT) if (cmd->tf_flags & IDE_TFLAG_OUT_HOB_NSECT)
@ -498,15 +492,6 @@ static void tx4939ide_tf_read(ide_drive_t *drive, struct ide_cmd *cmd)
struct ide_io_ports *io_ports = &hwif->io_ports; struct ide_io_ports *io_ports = &hwif->io_ports;
struct ide_taskfile *tf = &cmd->tf; struct ide_taskfile *tf = &cmd->tf;
if (cmd->ftf_flags & IDE_FTFLAG_IN_DATA) {
u8 data[2];
hwif->tp_ops->input_data(drive, cmd, data, 2);
tf->data = data[0];
tf->hob_data = data[1];
}
/* be sure we're looking at the low order bits */ /* be sure we're looking at the low order bits */
tx4939ide_outb(ATA_DEVCTL_OBS, io_ports->ctl_addr); tx4939ide_outb(ATA_DEVCTL_OBS, io_ports->ctl_addr);