diff options
author | Sergei Shtylyov <sshtylyov@ru.mvista.com> | 2009-04-08 08:13:03 -0400 |
---|---|---|
committer | Bartlomiej Zolnierkiewicz <bzolnier@gmail.com> | 2009-04-08 08:13:03 -0400 |
commit | 3153c26b54230d025c6d536e8d3015def4524906 (patch) | |
tree | 0dc92136480ddfdd2f52a48045446e9ed95ed077 /drivers/ide | |
parent | c9ff9e7b64138d87023b733e618f29a1d58543f7 (diff) |
ide: refactor tf_read() method
Simplify tf_read() method, making it deal only with 'struct ide_taskfile' and
the validity flags that the upper layer passes, and factoring out the code that
deals with the high order bytes into ide_tf_readback() to be called from the
only two functions interested, ide_complete_cmd() and ide_dump_sector().
This should stop the needless code duplication in this method and so make
it about twice smaller than it was; along with simplifying the setup for
the method call, this should save both time and space...
Signed-off-by: Sergei Shtylyov <sshtylyov@ru.mvista.com>
Signed-off-by: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
Diffstat (limited to 'drivers/ide')
-rw-r--r-- | drivers/ide/ide-atapi.c | 21 | ||||
-rw-r--r-- | drivers/ide/ide-io-std.c | 25 | ||||
-rw-r--r-- | drivers/ide/ide-io.c | 2 | ||||
-rw-r--r-- | drivers/ide/ide-iops.c | 9 | ||||
-rw-r--r-- | drivers/ide/ide-lib.c | 2 | ||||
-rw-r--r-- | drivers/ide/ide-probe.c | 9 | ||||
-rw-r--r-- | drivers/ide/ide-taskfile.c | 17 | ||||
-rw-r--r-- | drivers/ide/ns87415.c | 26 | ||||
-rw-r--r-- | drivers/ide/scc_pata.c | 25 |
9 files changed, 37 insertions, 99 deletions
diff --git a/drivers/ide/ide-atapi.c b/drivers/ide/ide-atapi.c index a359323d8ff..7201b176d75 100644 --- a/drivers/ide/ide-atapi.c +++ b/drivers/ide/ide-atapi.c | |||
@@ -254,15 +254,13 @@ EXPORT_SYMBOL_GPL(ide_cd_get_xferlen); | |||
254 | 254 | ||
255 | void ide_read_bcount_and_ireason(ide_drive_t *drive, u16 *bcount, u8 *ireason) | 255 | void ide_read_bcount_and_ireason(ide_drive_t *drive, u16 *bcount, u8 *ireason) |
256 | { | 256 | { |
257 | struct ide_cmd cmd; | 257 | struct ide_taskfile tf; |
258 | 258 | ||
259 | memset(&cmd, 0, sizeof(cmd)); | 259 | drive->hwif->tp_ops->tf_read(drive, &tf, IDE_VALID_NSECT | |
260 | cmd.valid.in.tf = IDE_VALID_LBAH | IDE_VALID_LBAM | IDE_VALID_NSECT; | 260 | IDE_VALID_LBAM | IDE_VALID_LBAH); |
261 | 261 | ||
262 | drive->hwif->tp_ops->tf_read(drive, &cmd); | 262 | *bcount = (tf.lbah << 8) | tf.lbam; |
263 | 263 | *ireason = tf.nsect & 3; | |
264 | *bcount = (cmd.tf.lbah << 8) | cmd.tf.lbam; | ||
265 | *ireason = cmd.tf.nsect & 3; | ||
266 | } | 264 | } |
267 | EXPORT_SYMBOL_GPL(ide_read_bcount_and_ireason); | 265 | EXPORT_SYMBOL_GPL(ide_read_bcount_and_ireason); |
268 | 266 | ||
@@ -452,14 +450,11 @@ static void ide_init_packet_cmd(struct ide_cmd *cmd, u8 valid_tf, | |||
452 | 450 | ||
453 | static u8 ide_read_ireason(ide_drive_t *drive) | 451 | static u8 ide_read_ireason(ide_drive_t *drive) |
454 | { | 452 | { |
455 | struct ide_cmd cmd; | 453 | struct ide_taskfile tf; |
456 | |||
457 | memset(&cmd, 0, sizeof(cmd)); | ||
458 | cmd.valid.in.tf = IDE_VALID_NSECT; | ||
459 | 454 | ||
460 | drive->hwif->tp_ops->tf_read(drive, &cmd); | 455 | drive->hwif->tp_ops->tf_read(drive, &tf, IDE_VALID_NSECT); |
461 | 456 | ||
462 | return cmd.tf.nsect & 3; | 457 | return tf.nsect & 3; |
463 | } | 458 | } |
464 | 459 | ||
465 | static u8 ide_wait_ireason(ide_drive_t *drive, u8 ireason) | 460 | static u8 ide_wait_ireason(ide_drive_t *drive, u8 ireason) |
diff --git a/drivers/ide/ide-io-std.c b/drivers/ide/ide-io-std.c index 481e221b233..46721c45451 100644 --- a/drivers/ide/ide-io-std.c +++ b/drivers/ide/ide-io-std.c | |||
@@ -112,13 +112,11 @@ void ide_tf_load(ide_drive_t *drive, struct ide_taskfile *tf, u8 valid) | |||
112 | } | 112 | } |
113 | EXPORT_SYMBOL_GPL(ide_tf_load); | 113 | EXPORT_SYMBOL_GPL(ide_tf_load); |
114 | 114 | ||
115 | void ide_tf_read(ide_drive_t *drive, struct ide_cmd *cmd) | 115 | void ide_tf_read(ide_drive_t *drive, struct ide_taskfile *tf, u8 valid) |
116 | { | 116 | { |
117 | ide_hwif_t *hwif = drive->hwif; | 117 | ide_hwif_t *hwif = drive->hwif; |
118 | struct ide_io_ports *io_ports = &hwif->io_ports; | 118 | struct ide_io_ports *io_ports = &hwif->io_ports; |
119 | struct ide_taskfile *tf = &cmd->tf; | ||
120 | u8 (*tf_inb)(unsigned long port); | 119 | u8 (*tf_inb)(unsigned long port); |
121 | u8 valid = cmd->valid.in.tf; | ||
122 | u8 mmio = (hwif->host_flags & IDE_HFLAG_MMIO) ? 1 : 0; | 120 | u8 mmio = (hwif->host_flags & IDE_HFLAG_MMIO) ? 1 : 0; |
123 | 121 | ||
124 | if (mmio) | 122 | if (mmio) |
@@ -126,9 +124,6 @@ void ide_tf_read(ide_drive_t *drive, struct ide_cmd *cmd) | |||
126 | else | 124 | else |
127 | tf_inb = ide_inb; | 125 | tf_inb = ide_inb; |
128 | 126 | ||
129 | /* be sure we're looking at the low order bits */ | ||
130 | hwif->tp_ops->write_devctl(hwif, ATA_DEVCTL_OBS); | ||
131 | |||
132 | if (valid & IDE_VALID_ERROR) | 127 | if (valid & IDE_VALID_ERROR) |
133 | tf->error = tf_inb(io_ports->feature_addr); | 128 | tf->error = tf_inb(io_ports->feature_addr); |
134 | if (valid & IDE_VALID_NSECT) | 129 | if (valid & IDE_VALID_NSECT) |
@@ -141,24 +136,6 @@ void ide_tf_read(ide_drive_t *drive, struct ide_cmd *cmd) | |||
141 | tf->lbah = tf_inb(io_ports->lbah_addr); | 136 | tf->lbah = tf_inb(io_ports->lbah_addr); |
142 | if (valid & IDE_VALID_DEVICE) | 137 | if (valid & IDE_VALID_DEVICE) |
143 | tf->device = tf_inb(io_ports->device_addr); | 138 | tf->device = tf_inb(io_ports->device_addr); |
144 | |||
145 | if (cmd->tf_flags & IDE_TFLAG_LBA48) { | ||
146 | hwif->tp_ops->write_devctl(hwif, ATA_HOB | ATA_DEVCTL_OBS); | ||
147 | |||
148 | tf = &cmd->hob; | ||
149 | valid = cmd->valid.in.hob; | ||
150 | |||
151 | if (valid & IDE_VALID_ERROR) | ||
152 | tf->error = tf_inb(io_ports->feature_addr); | ||
153 | if (valid & IDE_VALID_NSECT) | ||
154 | tf->nsect = tf_inb(io_ports->nsect_addr); | ||
155 | if (valid & IDE_VALID_LBAL) | ||
156 | tf->lbal = tf_inb(io_ports->lbal_addr); | ||
157 | if (valid & IDE_VALID_LBAM) | ||
158 | tf->lbam = tf_inb(io_ports->lbam_addr); | ||
159 | if (valid & IDE_VALID_LBAH) | ||
160 | tf->lbah = tf_inb(io_ports->lbah_addr); | ||
161 | } | ||
162 | } | 139 | } |
163 | EXPORT_SYMBOL_GPL(ide_tf_read); | 140 | EXPORT_SYMBOL_GPL(ide_tf_read); |
164 | 141 | ||
diff --git a/drivers/ide/ide-io.c b/drivers/ide/ide-io.c index e71c72be762..2ae02b8d7f8 100644 --- a/drivers/ide/ide-io.c +++ b/drivers/ide/ide-io.c | |||
@@ -90,7 +90,7 @@ void ide_complete_cmd(ide_drive_t *drive, struct ide_cmd *cmd, u8 stat, u8 err) | |||
90 | cmd->hob.data = data[1]; | 90 | cmd->hob.data = data[1]; |
91 | } | 91 | } |
92 | 92 | ||
93 | tp_ops->tf_read(drive, cmd); | 93 | ide_tf_readback(drive, cmd); |
94 | 94 | ||
95 | if ((cmd->tf_flags & IDE_TFLAG_CUSTOM_HANDLER) && | 95 | if ((cmd->tf_flags & IDE_TFLAG_CUSTOM_HANDLER) && |
96 | tf_cmd == ATA_CMD_IDLEIMMEDIATE) { | 96 | tf_cmd == ATA_CMD_IDLEIMMEDIATE) { |
diff --git a/drivers/ide/ide-iops.c b/drivers/ide/ide-iops.c index 6f1ed427a48..c19a221b1e1 100644 --- a/drivers/ide/ide-iops.c +++ b/drivers/ide/ide-iops.c | |||
@@ -37,14 +37,11 @@ void SELECT_MASK(ide_drive_t *drive, int mask) | |||
37 | 37 | ||
38 | u8 ide_read_error(ide_drive_t *drive) | 38 | u8 ide_read_error(ide_drive_t *drive) |
39 | { | 39 | { |
40 | struct ide_cmd cmd; | 40 | struct ide_taskfile tf; |
41 | |||
42 | memset(&cmd, 0, sizeof(cmd)); | ||
43 | cmd.valid.in.tf = IDE_VALID_ERROR; | ||
44 | 41 | ||
45 | drive->hwif->tp_ops->tf_read(drive, &cmd); | 42 | drive->hwif->tp_ops->tf_read(drive, &tf, IDE_VALID_ERROR); |
46 | 43 | ||
47 | return cmd.tf.error; | 44 | return tf.error; |
48 | } | 45 | } |
49 | EXPORT_SYMBOL_GPL(ide_read_error); | 46 | EXPORT_SYMBOL_GPL(ide_read_error); |
50 | 47 | ||
diff --git a/drivers/ide/ide-lib.c b/drivers/ide/ide-lib.c index 6857e6aaf20..56ff8c46c7d 100644 --- a/drivers/ide/ide-lib.c +++ b/drivers/ide/ide-lib.c | |||
@@ -79,7 +79,7 @@ static void ide_dump_sector(ide_drive_t *drive) | |||
79 | } else | 79 | } else |
80 | cmd.valid.in.tf = IDE_VALID_LBA | IDE_VALID_DEVICE; | 80 | cmd.valid.in.tf = IDE_VALID_LBA | IDE_VALID_DEVICE; |
81 | 81 | ||
82 | drive->hwif->tp_ops->tf_read(drive, &cmd); | 82 | ide_tf_readback(drive, &cmd); |
83 | 83 | ||
84 | if (lba48 || (tf->device & ATA_LBA)) | 84 | if (lba48 || (tf->device & ATA_LBA)) |
85 | printk(KERN_CONT ", LBAsect=%llu", | 85 | printk(KERN_CONT ", LBAsect=%llu", |
diff --git a/drivers/ide/ide-probe.c b/drivers/ide/ide-probe.c index 44d7816c1fe..7f264ed1141 100644 --- a/drivers/ide/ide-probe.c +++ b/drivers/ide/ide-probe.c | |||
@@ -335,14 +335,11 @@ int ide_busy_sleep(ide_hwif_t *hwif, unsigned long timeout, int altstatus) | |||
335 | 335 | ||
336 | static u8 ide_read_device(ide_drive_t *drive) | 336 | static u8 ide_read_device(ide_drive_t *drive) |
337 | { | 337 | { |
338 | struct ide_cmd cmd; | 338 | struct ide_taskfile tf; |
339 | 339 | ||
340 | memset(&cmd, 0, sizeof(cmd)); | 340 | drive->hwif->tp_ops->tf_read(drive, &tf, IDE_VALID_DEVICE); |
341 | cmd.valid.in.tf = IDE_VALID_DEVICE; | ||
342 | 341 | ||
343 | drive->hwif->tp_ops->tf_read(drive, &cmd); | 342 | return tf.device; |
344 | |||
345 | return cmd.tf.device; | ||
346 | } | 343 | } |
347 | 344 | ||
348 | /** | 345 | /** |
diff --git a/drivers/ide/ide-taskfile.c b/drivers/ide/ide-taskfile.c index b1806ed4617..4aa6223c11b 100644 --- a/drivers/ide/ide-taskfile.c +++ b/drivers/ide/ide-taskfile.c | |||
@@ -23,6 +23,23 @@ | |||
23 | #include <asm/uaccess.h> | 23 | #include <asm/uaccess.h> |
24 | #include <asm/io.h> | 24 | #include <asm/io.h> |
25 | 25 | ||
26 | void ide_tf_readback(ide_drive_t *drive, struct ide_cmd *cmd) | ||
27 | { | ||
28 | ide_hwif_t *hwif = drive->hwif; | ||
29 | const struct ide_tp_ops *tp_ops = hwif->tp_ops; | ||
30 | |||
31 | /* Be sure we're looking at the low order bytes */ | ||
32 | tp_ops->write_devctl(hwif, ATA_DEVCTL_OBS); | ||
33 | |||
34 | tp_ops->tf_read(drive, &cmd->tf, cmd->valid.in.tf); | ||
35 | |||
36 | if (cmd->tf_flags & IDE_TFLAG_LBA48) { | ||
37 | tp_ops->write_devctl(hwif, ATA_HOB | ATA_DEVCTL_OBS); | ||
38 | |||
39 | tp_ops->tf_read(drive, &cmd->hob, cmd->valid.in.hob); | ||
40 | } | ||
41 | } | ||
42 | |||
26 | void ide_tf_dump(const char *s, struct ide_cmd *cmd) | 43 | void ide_tf_dump(const char *s, struct ide_cmd *cmd) |
27 | { | 44 | { |
28 | #ifdef DEBUG | 45 | #ifdef DEBUG |
diff --git a/drivers/ide/ns87415.c b/drivers/ide/ns87415.c index f1305f4d2be..95327a2c242 100644 --- a/drivers/ide/ns87415.c +++ b/drivers/ide/ns87415.c | |||
@@ -61,14 +61,10 @@ static u8 superio_dma_sff_read_status(ide_hwif_t *hwif) | |||
61 | return superio_ide_inb(hwif->dma_base + ATA_DMA_STATUS); | 61 | return superio_ide_inb(hwif->dma_base + ATA_DMA_STATUS); |
62 | } | 62 | } |
63 | 63 | ||
64 | static void superio_tf_read(ide_drive_t *drive, struct ide_cmd *cmd) | 64 | static void superio_tf_read(ide_drive_t *drive, struct ide_taskfile *tf, |
65 | u8 valid) | ||
65 | { | 66 | { |
66 | struct ide_io_ports *io_ports = &drive->hwif->io_ports; | 67 | struct ide_io_ports *io_ports = &drive->hwif->io_ports; |
67 | struct ide_taskfile *tf = &cmd->tf; | ||
68 | u8 valid = cmd->valid.in.tf; | ||
69 | |||
70 | /* be sure we're looking at the low order bits */ | ||
71 | ide_write_devctl(hwif, ATA_DEVCTL_OBS); | ||
72 | 68 | ||
73 | if (valid & IDE_VALID_ERROR) | 69 | if (valid & IDE_VALID_ERROR) |
74 | tf->error = inb(io_ports->feature_addr); | 70 | tf->error = inb(io_ports->feature_addr); |
@@ -82,24 +78,6 @@ static void superio_tf_read(ide_drive_t *drive, struct ide_cmd *cmd) | |||
82 | tf->lbah = inb(io_ports->lbah_addr); | 78 | tf->lbah = inb(io_ports->lbah_addr); |
83 | if (valid & IDE_VALID_DEVICE) | 79 | if (valid & IDE_VALID_DEVICE) |
84 | tf->device = superio_ide_inb(io_ports->device_addr); | 80 | tf->device = superio_ide_inb(io_ports->device_addr); |
85 | |||
86 | if (cmd->tf_flags & IDE_TFLAG_LBA48) { | ||
87 | ide_write_devctl(hwif, ATA_HOB | ATA_DEVCTL_OBS); | ||
88 | |||
89 | tf = &cmd->hob; | ||
90 | valid = cmd->valid.in.hob; | ||
91 | |||
92 | if (valid & IDE_VALID_ERROR) | ||
93 | tf->error = inb(io_ports->feature_addr); | ||
94 | if (valid & IDE_VALID_NSECT) | ||
95 | tf->nsect = inb(io_ports->nsect_addr); | ||
96 | if (valid & IDE_VALID_LBAL) | ||
97 | tf->lbal = inb(io_ports->lbal_addr); | ||
98 | if (valid & IDE_VALID_LBAM) | ||
99 | tf->lbam = inb(io_ports->lbam_addr); | ||
100 | if (valid & IDE_VALID_LBAH) | ||
101 | tf->lbah = inb(io_ports->lbah_addr); | ||
102 | } | ||
103 | } | 81 | } |
104 | 82 | ||
105 | static void ns87415_dev_select(ide_drive_t *drive); | 83 | static void ns87415_dev_select(ide_drive_t *drive); |
diff --git a/drivers/ide/scc_pata.c b/drivers/ide/scc_pata.c index 5ecb70cf29d..5be41f25204 100644 --- a/drivers/ide/scc_pata.c +++ b/drivers/ide/scc_pata.c | |||
@@ -663,14 +663,9 @@ static void scc_tf_load(ide_drive_t *drive, struct ide_taskfile *tf, u8 valid) | |||
663 | scc_ide_outb(tf->device, io_ports->device_addr); | 663 | scc_ide_outb(tf->device, io_ports->device_addr); |
664 | } | 664 | } |
665 | 665 | ||
666 | static void scc_tf_read(ide_drive_t *drive, struct ide_cmd *cmd) | 666 | static void scc_tf_read(ide_drive_t *drive, struct ide_taskfile *tf, u8 valid) |
667 | { | 667 | { |
668 | struct ide_io_ports *io_ports = &drive->hwif->io_ports; | 668 | struct ide_io_ports *io_ports = &drive->hwif->io_ports; |
669 | struct ide_taskfile *tf = &cmd->tf; | ||
670 | u8 valid = cmd->valid.in.tf; | ||
671 | |||
672 | /* be sure we're looking at the low order bits */ | ||
673 | scc_write_devctl(hwif, ATA_DEVCTL_OBS); | ||
674 | 669 | ||
675 | if (valid & IDE_VALID_ERROR) | 670 | if (valid & IDE_VALID_ERROR) |
676 | tf->error = scc_ide_inb(io_ports->feature_addr); | 671 | tf->error = scc_ide_inb(io_ports->feature_addr); |
@@ -684,24 +679,6 @@ static void scc_tf_read(ide_drive_t *drive, struct ide_cmd *cmd) | |||
684 | tf->lbah = scc_ide_inb(io_ports->lbah_addr); | 679 | tf->lbah = scc_ide_inb(io_ports->lbah_addr); |
685 | if (valid & IDE_VALID_DEVICE) | 680 | if (valid & IDE_VALID_DEVICE) |
686 | tf->device = scc_ide_inb(io_ports->device_addr); | 681 | tf->device = scc_ide_inb(io_ports->device_addr); |
687 | |||
688 | if (cmd->tf_flags & IDE_TFLAG_LBA48) { | ||
689 | scc_write_devctl(hwif, ATA_HOB | ATA_DEVCTL_OBS); | ||
690 | |||
691 | tf = &cmd->hob; | ||
692 | valid = cmd->valid.in.hob; | ||
693 | |||
694 | if (valid & IDE_VALID_ERROR) | ||
695 | tf->error = scc_ide_inb(io_ports->feature_addr); | ||
696 | if (valid & IDE_VALID_NSECT) | ||
697 | tf->nsect = scc_ide_inb(io_ports->nsect_addr); | ||
698 | if (valid & IDE_VALID_LBAL) | ||
699 | tf->lbal = scc_ide_inb(io_ports->lbal_addr); | ||
700 | if (valid & IDE_VALID_LBAM) | ||
701 | tf->lbam = scc_ide_inb(io_ports->lbam_addr); | ||
702 | if (valid & IDE_VALID_LBAH) | ||
703 | tf->lbah = scc_ide_inb(io_ports->lbah_addr); | ||
704 | } | ||
705 | } | 682 | } |
706 | 683 | ||
707 | static void scc_input_data(ide_drive_t *drive, struct ide_cmd *cmd, | 684 | static void scc_input_data(ide_drive_t *drive, struct ide_cmd *cmd, |