mirror of https://gitee.com/openkylin/linux.git
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:
parent
bac08cee93
commit
35218d1ca8
|
@ -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);
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
|
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue