aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/ide/ide-iops.c
diff options
context:
space:
mode:
authorBartlomiej Zolnierkiewicz <bzolnier@gmail.com>2008-07-23 13:55:56 -0400
committerBartlomiej Zolnierkiewicz <bzolnier@gmail.com>2008-07-23 13:55:56 -0400
commit374e042c3e767ac2e5a40b78529220e0b3de793c (patch)
tree433d258f6da9783f0cb34234af9c359353f531fe /drivers/ide/ide-iops.c
parentd6276b5f5cc7508124de291f3ed59c6945c17ae7 (diff)
ide: add struct ide_tp_ops (take 2)
* Add struct ide_tp_ops for transport methods. * Add 'const struct ide_tp_ops *tp_ops' to struct ide_port_info and ide_hwif_t. * Set the default hwif->tp_ops in ide_init_port_data(). * Set host driver specific hwif->tp_ops in ide_init_port(). * Export ide_exec_command(), ide_read_status(), ide_read_altstatus(), ide_read_sff_dma_status(), ide_set_irq(), ide_tf_{load,read}() and ata_{in,out}put_data(). * Convert host drivers and core code to use struct ide_tp_ops. * Remove no longer needed default_hwif_transport(). * Cleanup ide_hwif_t from methods that are now in struct ide_tp_ops. While at it: * Use struct ide_port_info in falconide.c and q40ide.c. * Rename ata_{in,out}put_data() to ide_{in,out}put_data(). v2: * Fix missing convertion in ns87415.c. There should be no functional changes caused by this patch. Signed-off-by: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
Diffstat (limited to 'drivers/ide/ide-iops.c')
-rw-r--r--drivers/ide/ide-iops.c122
1 files changed, 68 insertions, 54 deletions
diff --git a/drivers/ide/ide-iops.c b/drivers/ide/ide-iops.c
index c9d15be4c48d..07da5fb9eaff 100644
--- a/drivers/ide/ide-iops.c
+++ b/drivers/ide/ide-iops.c
@@ -68,7 +68,7 @@ void SELECT_DRIVE (ide_drive_t *drive)
68 memset(&task, 0, sizeof(task)); 68 memset(&task, 0, sizeof(task));
69 task.tf_flags = IDE_TFLAG_OUT_DEVICE; 69 task.tf_flags = IDE_TFLAG_OUT_DEVICE;
70 70
71 drive->hwif->tf_load(drive, &task); 71 drive->hwif->tp_ops->tf_load(drive, &task);
72} 72}
73 73
74void SELECT_MASK(ide_drive_t *drive, int mask) 74void SELECT_MASK(ide_drive_t *drive, int mask)
@@ -79,39 +79,43 @@ void SELECT_MASK(ide_drive_t *drive, int mask)
79 port_ops->maskproc(drive, mask); 79 port_ops->maskproc(drive, mask);
80} 80}
81 81
82static void ide_exec_command(ide_hwif_t *hwif, u8 cmd) 82void ide_exec_command(ide_hwif_t *hwif, u8 cmd)
83{ 83{
84 if (hwif->host_flags & IDE_HFLAG_MMIO) 84 if (hwif->host_flags & IDE_HFLAG_MMIO)
85 writeb(cmd, (void __iomem *)hwif->io_ports.command_addr); 85 writeb(cmd, (void __iomem *)hwif->io_ports.command_addr);
86 else 86 else
87 outb(cmd, hwif->io_ports.command_addr); 87 outb(cmd, hwif->io_ports.command_addr);
88} 88}
89EXPORT_SYMBOL_GPL(ide_exec_command);
89 90
90static u8 ide_read_status(ide_hwif_t *hwif) 91u8 ide_read_status(ide_hwif_t *hwif)
91{ 92{
92 if (hwif->host_flags & IDE_HFLAG_MMIO) 93 if (hwif->host_flags & IDE_HFLAG_MMIO)
93 return readb((void __iomem *)hwif->io_ports.status_addr); 94 return readb((void __iomem *)hwif->io_ports.status_addr);
94 else 95 else
95 return inb(hwif->io_ports.status_addr); 96 return inb(hwif->io_ports.status_addr);
96} 97}
98EXPORT_SYMBOL_GPL(ide_read_status);
97 99
98static u8 ide_read_altstatus(ide_hwif_t *hwif) 100u8 ide_read_altstatus(ide_hwif_t *hwif)
99{ 101{
100 if (hwif->host_flags & IDE_HFLAG_MMIO) 102 if (hwif->host_flags & IDE_HFLAG_MMIO)
101 return readb((void __iomem *)hwif->io_ports.ctl_addr); 103 return readb((void __iomem *)hwif->io_ports.ctl_addr);
102 else 104 else
103 return inb(hwif->io_ports.ctl_addr); 105 return inb(hwif->io_ports.ctl_addr);
104} 106}
107EXPORT_SYMBOL_GPL(ide_read_altstatus);
105 108
106static u8 ide_read_sff_dma_status(ide_hwif_t *hwif) 109u8 ide_read_sff_dma_status(ide_hwif_t *hwif)
107{ 110{
108 if (hwif->host_flags & IDE_HFLAG_MMIO) 111 if (hwif->host_flags & IDE_HFLAG_MMIO)
109 return readb((void __iomem *)(hwif->dma_base + ATA_DMA_STATUS)); 112 return readb((void __iomem *)(hwif->dma_base + ATA_DMA_STATUS));
110 else 113 else
111 return inb(hwif->dma_base + ATA_DMA_STATUS); 114 return inb(hwif->dma_base + ATA_DMA_STATUS);
112} 115}
116EXPORT_SYMBOL_GPL(ide_read_sff_dma_status);
113 117
114static void ide_set_irq(ide_hwif_t *hwif, int on) 118void ide_set_irq(ide_hwif_t *hwif, int on)
115{ 119{
116 u8 ctl = ATA_DEVCTL_OBS; 120 u8 ctl = ATA_DEVCTL_OBS;
117 121
@@ -127,8 +131,9 @@ static void ide_set_irq(ide_hwif_t *hwif, int on)
127 else 131 else
128 outb(ctl, hwif->io_ports.ctl_addr); 132 outb(ctl, hwif->io_ports.ctl_addr);
129} 133}
134EXPORT_SYMBOL_GPL(ide_set_irq);
130 135
131static void ide_tf_load(ide_drive_t *drive, ide_task_t *task) 136void ide_tf_load(ide_drive_t *drive, ide_task_t *task)
132{ 137{
133 ide_hwif_t *hwif = drive->hwif; 138 ide_hwif_t *hwif = drive->hwif;
134 struct ide_io_ports *io_ports = &hwif->io_ports; 139 struct ide_io_ports *io_ports = &hwif->io_ports;
@@ -180,8 +185,9 @@ static void ide_tf_load(ide_drive_t *drive, ide_task_t *task)
180 tf_outb((tf->device & HIHI) | drive->select.all, 185 tf_outb((tf->device & HIHI) | drive->select.all,
181 io_ports->device_addr); 186 io_ports->device_addr);
182} 187}
188EXPORT_SYMBOL_GPL(ide_tf_load);
183 189
184static void ide_tf_read(ide_drive_t *drive, ide_task_t *task) 190void ide_tf_read(ide_drive_t *drive, ide_task_t *task)
185{ 191{
186 ide_hwif_t *hwif = drive->hwif; 192 ide_hwif_t *hwif = drive->hwif;
187 struct ide_io_ports *io_ports = &hwif->io_ports; 193 struct ide_io_ports *io_ports = &hwif->io_ports;
@@ -241,6 +247,7 @@ static void ide_tf_read(ide_drive_t *drive, ide_task_t *task)
241 tf->hob_lbah = tf_inb(io_ports->lbah_addr); 247 tf->hob_lbah = tf_inb(io_ports->lbah_addr);
242 } 248 }
243} 249}
250EXPORT_SYMBOL_GPL(ide_tf_read);
244 251
245/* 252/*
246 * Some localbus EIDE interfaces require a special access sequence 253 * Some localbus EIDE interfaces require a special access sequence
@@ -263,8 +270,8 @@ static void ata_vlb_sync(unsigned long port)
263 * so if an odd len is specified, be sure that there's at least one 270 * so if an odd len is specified, be sure that there's at least one
264 * extra byte allocated for the buffer. 271 * extra byte allocated for the buffer.
265 */ 272 */
266static void ata_input_data(ide_drive_t *drive, struct request *rq, 273void ide_input_data(ide_drive_t *drive, struct request *rq, void *buf,
267 void *buf, unsigned int len) 274 unsigned int len)
268{ 275{
269 ide_hwif_t *hwif = drive->hwif; 276 ide_hwif_t *hwif = drive->hwif;
270 struct ide_io_ports *io_ports = &hwif->io_ports; 277 struct ide_io_ports *io_ports = &hwif->io_ports;
@@ -304,12 +311,13 @@ static void ata_input_data(ide_drive_t *drive, struct request *rq,
304 insw(data_addr, buf, len / 2); 311 insw(data_addr, buf, len / 2);
305 } 312 }
306} 313}
314EXPORT_SYMBOL_GPL(ide_input_data);
307 315
308/* 316/*
309 * This is used for most PIO data transfers *to* the IDE interface 317 * This is used for most PIO data transfers *to* the IDE interface
310 */ 318 */
311static void ata_output_data(ide_drive_t *drive, struct request *rq, 319void ide_output_data(ide_drive_t *drive, struct request *rq, void *buf,
312 void *buf, unsigned int len) 320 unsigned int len)
313{ 321{
314 ide_hwif_t *hwif = drive->hwif; 322 ide_hwif_t *hwif = drive->hwif;
315 struct ide_io_ports *io_ports = &hwif->io_ports; 323 struct ide_io_ports *io_ports = &hwif->io_ports;
@@ -347,22 +355,7 @@ static void ata_output_data(ide_drive_t *drive, struct request *rq,
347 outsw(data_addr, buf, len / 2); 355 outsw(data_addr, buf, len / 2);
348 } 356 }
349} 357}
350 358EXPORT_SYMBOL_GPL(ide_output_data);
351void default_hwif_transport(ide_hwif_t *hwif)
352{
353 hwif->exec_command = ide_exec_command;
354 hwif->read_status = ide_read_status;
355 hwif->read_altstatus = ide_read_altstatus;
356 hwif->read_sff_dma_status = ide_read_sff_dma_status;
357
358 hwif->set_irq = ide_set_irq;
359
360 hwif->tf_load = ide_tf_load;
361 hwif->tf_read = ide_tf_read;
362
363 hwif->input_data = ata_input_data;
364 hwif->output_data = ata_output_data;
365}
366 359
367u8 ide_read_error(ide_drive_t *drive) 360u8 ide_read_error(ide_drive_t *drive)
368{ 361{
@@ -371,7 +364,7 @@ u8 ide_read_error(ide_drive_t *drive)
371 memset(&task, 0, sizeof(task)); 364 memset(&task, 0, sizeof(task));
372 task.tf_flags = IDE_TFLAG_IN_FEATURE; 365 task.tf_flags = IDE_TFLAG_IN_FEATURE;
373 366
374 drive->hwif->tf_read(drive, &task); 367 drive->hwif->tp_ops->tf_read(drive, &task);
375 368
376 return task.tf.error; 369 return task.tf.error;
377} 370}
@@ -385,13 +378,28 @@ void ide_read_bcount_and_ireason(ide_drive_t *drive, u16 *bcount, u8 *ireason)
385 task.tf_flags = IDE_TFLAG_IN_LBAH | IDE_TFLAG_IN_LBAM | 378 task.tf_flags = IDE_TFLAG_IN_LBAH | IDE_TFLAG_IN_LBAM |
386 IDE_TFLAG_IN_NSECT; 379 IDE_TFLAG_IN_NSECT;
387 380
388 drive->hwif->tf_read(drive, &task); 381 drive->hwif->tp_ops->tf_read(drive, &task);
389 382
390 *bcount = (task.tf.lbah << 8) | task.tf.lbam; 383 *bcount = (task.tf.lbah << 8) | task.tf.lbam;
391 *ireason = task.tf.nsect & 3; 384 *ireason = task.tf.nsect & 3;
392} 385}
393EXPORT_SYMBOL_GPL(ide_read_bcount_and_ireason); 386EXPORT_SYMBOL_GPL(ide_read_bcount_and_ireason);
394 387
388const struct ide_tp_ops default_tp_ops = {
389 .exec_command = ide_exec_command,
390 .read_status = ide_read_status,
391 .read_altstatus = ide_read_altstatus,
392 .read_sff_dma_status = ide_read_sff_dma_status,
393
394 .set_irq = ide_set_irq,
395
396 .tf_load = ide_tf_load,
397 .tf_read = ide_tf_read,
398
399 .input_data = ide_input_data,
400 .output_data = ide_output_data,
401};
402
395void ide_fix_driveid (struct hd_driveid *id) 403void ide_fix_driveid (struct hd_driveid *id)
396{ 404{
397#ifndef __LITTLE_ENDIAN 405#ifndef __LITTLE_ENDIAN
@@ -545,10 +553,10 @@ int drive_is_ready (ide_drive_t *drive)
545 * about possible isa-pnp and pci-pnp issues yet. 553 * about possible isa-pnp and pci-pnp issues yet.
546 */ 554 */
547 if (hwif->io_ports.ctl_addr) 555 if (hwif->io_ports.ctl_addr)
548 stat = hwif->read_altstatus(hwif); 556 stat = hwif->tp_ops->read_altstatus(hwif);
549 else 557 else
550 /* Note: this may clear a pending IRQ!! */ 558 /* Note: this may clear a pending IRQ!! */
551 stat = hwif->read_status(hwif); 559 stat = hwif->tp_ops->read_status(hwif);
552 560
553 if (stat & BUSY_STAT) 561 if (stat & BUSY_STAT)
554 /* drive busy: definitely not interrupting */ 562 /* drive busy: definitely not interrupting */
@@ -574,24 +582,25 @@ EXPORT_SYMBOL(drive_is_ready);
574static int __ide_wait_stat(ide_drive_t *drive, u8 good, u8 bad, unsigned long timeout, u8 *rstat) 582static int __ide_wait_stat(ide_drive_t *drive, u8 good, u8 bad, unsigned long timeout, u8 *rstat)
575{ 583{
576 ide_hwif_t *hwif = drive->hwif; 584 ide_hwif_t *hwif = drive->hwif;
585 const struct ide_tp_ops *tp_ops = hwif->tp_ops;
577 unsigned long flags; 586 unsigned long flags;
578 int i; 587 int i;
579 u8 stat; 588 u8 stat;
580 589
581 udelay(1); /* spec allows drive 400ns to assert "BUSY" */ 590 udelay(1); /* spec allows drive 400ns to assert "BUSY" */
582 stat = hwif->read_status(hwif); 591 stat = tp_ops->read_status(hwif);
583 592
584 if (stat & BUSY_STAT) { 593 if (stat & BUSY_STAT) {
585 local_irq_set(flags); 594 local_irq_set(flags);
586 timeout += jiffies; 595 timeout += jiffies;
587 while ((stat = hwif->read_status(hwif)) & BUSY_STAT) { 596 while ((stat = tp_ops->read_status(hwif)) & BUSY_STAT) {
588 if (time_after(jiffies, timeout)) { 597 if (time_after(jiffies, timeout)) {
589 /* 598 /*
590 * One last read after the timeout in case 599 * One last read after the timeout in case
591 * heavy interrupt load made us not make any 600 * heavy interrupt load made us not make any
592 * progress during the timeout.. 601 * progress during the timeout..
593 */ 602 */
594 stat = hwif->read_status(hwif); 603 stat = tp_ops->read_status(hwif);
595 if (!(stat & BUSY_STAT)) 604 if (!(stat & BUSY_STAT))
596 break; 605 break;
597 606
@@ -611,7 +620,7 @@ static int __ide_wait_stat(ide_drive_t *drive, u8 good, u8 bad, unsigned long ti
611 */ 620 */
612 for (i = 0; i < 10; i++) { 621 for (i = 0; i < 10; i++) {
613 udelay(1); 622 udelay(1);
614 stat = hwif->read_status(hwif); 623 stat = tp_ops->read_status(hwif);
615 624
616 if (OK_STAT(stat, good, bad)) { 625 if (OK_STAT(stat, good, bad)) {
617 *rstat = stat; 626 *rstat = stat;
@@ -737,6 +746,7 @@ no_80w:
737int ide_driveid_update(ide_drive_t *drive) 746int ide_driveid_update(ide_drive_t *drive)
738{ 747{
739 ide_hwif_t *hwif = drive->hwif; 748 ide_hwif_t *hwif = drive->hwif;
749 const struct ide_tp_ops *tp_ops = hwif->tp_ops;
740 struct hd_driveid *id; 750 struct hd_driveid *id;
741 unsigned long timeout, flags; 751 unsigned long timeout, flags;
742 u8 stat; 752 u8 stat;
@@ -747,9 +757,9 @@ int ide_driveid_update(ide_drive_t *drive)
747 */ 757 */
748 758
749 SELECT_MASK(drive, 1); 759 SELECT_MASK(drive, 1);
750 hwif->set_irq(hwif, 0); 760 tp_ops->set_irq(hwif, 0);
751 msleep(50); 761 msleep(50);
752 hwif->exec_command(hwif, WIN_IDENTIFY); 762 tp_ops->exec_command(hwif, WIN_IDENTIFY);
753 timeout = jiffies + WAIT_WORSTCASE; 763 timeout = jiffies + WAIT_WORSTCASE;
754 do { 764 do {
755 if (time_after(jiffies, timeout)) { 765 if (time_after(jiffies, timeout)) {
@@ -758,11 +768,11 @@ int ide_driveid_update(ide_drive_t *drive)
758 } 768 }
759 769
760 msleep(50); /* give drive a breather */ 770 msleep(50); /* give drive a breather */
761 stat = hwif->read_altstatus(hwif); 771 stat = tp_ops->read_altstatus(hwif);
762 } while (stat & BUSY_STAT); 772 } while (stat & BUSY_STAT);
763 773
764 msleep(50); /* wait for IRQ and DRQ_STAT */ 774 msleep(50); /* wait for IRQ and DRQ_STAT */
765 stat = hwif->read_status(hwif); 775 stat = tp_ops->read_status(hwif);
766 776
767 if (!OK_STAT(stat, DRQ_STAT, BAD_R_STAT)) { 777 if (!OK_STAT(stat, DRQ_STAT, BAD_R_STAT)) {
768 SELECT_MASK(drive, 0); 778 SELECT_MASK(drive, 0);
@@ -776,8 +786,8 @@ int ide_driveid_update(ide_drive_t *drive)
776 local_irq_restore(flags); 786 local_irq_restore(flags);
777 return 0; 787 return 0;
778 } 788 }
779 hwif->input_data(drive, NULL, id, SECTOR_SIZE); 789 tp_ops->input_data(drive, NULL, id, SECTOR_SIZE);
780 (void)hwif->read_status(hwif); /* clear drive IRQ */ 790 (void)tp_ops->read_status(hwif); /* clear drive IRQ */
781 local_irq_enable(); 791 local_irq_enable();
782 local_irq_restore(flags); 792 local_irq_restore(flags);
783 ide_fix_driveid(id); 793 ide_fix_driveid(id);
@@ -798,6 +808,7 @@ int ide_driveid_update(ide_drive_t *drive)
798int ide_config_drive_speed(ide_drive_t *drive, u8 speed) 808int ide_config_drive_speed(ide_drive_t *drive, u8 speed)
799{ 809{
800 ide_hwif_t *hwif = drive->hwif; 810 ide_hwif_t *hwif = drive->hwif;
811 const struct ide_tp_ops *tp_ops = hwif->tp_ops;
801 int error = 0; 812 int error = 0;
802 u8 stat; 813 u8 stat;
803 ide_task_t task; 814 ide_task_t task;
@@ -833,19 +844,19 @@ int ide_config_drive_speed(ide_drive_t *drive, u8 speed)
833 SELECT_DRIVE(drive); 844 SELECT_DRIVE(drive);
834 SELECT_MASK(drive, 0); 845 SELECT_MASK(drive, 0);
835 udelay(1); 846 udelay(1);
836 hwif->set_irq(hwif, 0); 847 tp_ops->set_irq(hwif, 0);
837 848
838 memset(&task, 0, sizeof(task)); 849 memset(&task, 0, sizeof(task));
839 task.tf_flags = IDE_TFLAG_OUT_FEATURE | IDE_TFLAG_OUT_NSECT; 850 task.tf_flags = IDE_TFLAG_OUT_FEATURE | IDE_TFLAG_OUT_NSECT;
840 task.tf.feature = SETFEATURES_XFER; 851 task.tf.feature = SETFEATURES_XFER;
841 task.tf.nsect = speed; 852 task.tf.nsect = speed;
842 853
843 hwif->tf_load(drive, &task); 854 tp_ops->tf_load(drive, &task);
844 855
845 hwif->exec_command(hwif, WIN_SETFEATURES); 856 tp_ops->exec_command(hwif, WIN_SETFEATURES);
846 857
847 if (drive->quirk_list == 2) 858 if (drive->quirk_list == 2)
848 hwif->set_irq(hwif, 1); 859 tp_ops->set_irq(hwif, 1);
849 860
850 error = __ide_wait_stat(drive, drive->ready_stat, 861 error = __ide_wait_stat(drive, drive->ready_stat,
851 BUSY_STAT|DRQ_STAT|ERR_STAT, 862 BUSY_STAT|DRQ_STAT|ERR_STAT,
@@ -950,7 +961,7 @@ void ide_execute_command(ide_drive_t *drive, u8 cmd, ide_handler_t *handler,
950 961
951 spin_lock_irqsave(&ide_lock, flags); 962 spin_lock_irqsave(&ide_lock, flags);
952 __ide_set_handler(drive, handler, timeout, expiry); 963 __ide_set_handler(drive, handler, timeout, expiry);
953 hwif->exec_command(hwif, cmd); 964 hwif->tp_ops->exec_command(hwif, cmd);
954 /* 965 /*
955 * Drive takes 400nS to respond, we must avoid the IRQ being 966 * Drive takes 400nS to respond, we must avoid the IRQ being
956 * serviced before that. 967 * serviced before that.
@@ -968,7 +979,7 @@ void ide_execute_pkt_cmd(ide_drive_t *drive)
968 unsigned long flags; 979 unsigned long flags;
969 980
970 spin_lock_irqsave(&ide_lock, flags); 981 spin_lock_irqsave(&ide_lock, flags);
971 hwif->exec_command(hwif, WIN_PACKETCMD); 982 hwif->tp_ops->exec_command(hwif, WIN_PACKETCMD);
972 ndelay(400); 983 ndelay(400);
973 spin_unlock_irqrestore(&ide_lock, flags); 984 spin_unlock_irqrestore(&ide_lock, flags);
974} 985}
@@ -999,7 +1010,7 @@ static ide_startstop_t atapi_reset_pollfunc (ide_drive_t *drive)
999 1010
1000 SELECT_DRIVE(drive); 1011 SELECT_DRIVE(drive);
1001 udelay (10); 1012 udelay (10);
1002 stat = hwif->read_status(hwif); 1013 stat = hwif->tp_ops->read_status(hwif);
1003 1014
1004 if (OK_STAT(stat, 0, BUSY_STAT)) 1015 if (OK_STAT(stat, 0, BUSY_STAT))
1005 printk("%s: ATAPI reset complete\n", drive->name); 1016 printk("%s: ATAPI reset complete\n", drive->name);
@@ -1045,7 +1056,7 @@ static ide_startstop_t reset_pollfunc (ide_drive_t *drive)
1045 } 1056 }
1046 } 1057 }
1047 1058
1048 tmp = hwif->read_status(hwif); 1059 tmp = hwif->tp_ops->read_status(hwif);
1049 1060
1050 if (!OK_STAT(tmp, 0, BUSY_STAT)) { 1061 if (!OK_STAT(tmp, 0, BUSY_STAT)) {
1051 if (time_before(jiffies, hwgroup->poll_timeout)) { 1062 if (time_before(jiffies, hwgroup->poll_timeout)) {
@@ -1159,6 +1170,7 @@ static ide_startstop_t do_reset1 (ide_drive_t *drive, int do_not_try_atapi)
1159 ide_hwif_t *hwif; 1170 ide_hwif_t *hwif;
1160 ide_hwgroup_t *hwgroup; 1171 ide_hwgroup_t *hwgroup;
1161 struct ide_io_ports *io_ports; 1172 struct ide_io_ports *io_ports;
1173 const struct ide_tp_ops *tp_ops;
1162 const struct ide_port_ops *port_ops; 1174 const struct ide_port_ops *port_ops;
1163 1175
1164 spin_lock_irqsave(&ide_lock, flags); 1176 spin_lock_irqsave(&ide_lock, flags);
@@ -1167,6 +1179,8 @@ static ide_startstop_t do_reset1 (ide_drive_t *drive, int do_not_try_atapi)
1167 1179
1168 io_ports = &hwif->io_ports; 1180 io_ports = &hwif->io_ports;
1169 1181
1182 tp_ops = hwif->tp_ops;
1183
1170 /* We must not reset with running handlers */ 1184 /* We must not reset with running handlers */
1171 BUG_ON(hwgroup->handler != NULL); 1185 BUG_ON(hwgroup->handler != NULL);
1172 1186
@@ -1175,7 +1189,7 @@ static ide_startstop_t do_reset1 (ide_drive_t *drive, int do_not_try_atapi)
1175 pre_reset(drive); 1189 pre_reset(drive);
1176 SELECT_DRIVE(drive); 1190 SELECT_DRIVE(drive);
1177 udelay (20); 1191 udelay (20);
1178 hwif->exec_command(hwif, WIN_SRST); 1192 tp_ops->exec_command(hwif, WIN_SRST);
1179 ndelay(400); 1193 ndelay(400);
1180 hwgroup->poll_timeout = jiffies + WAIT_WORSTCASE; 1194 hwgroup->poll_timeout = jiffies + WAIT_WORSTCASE;
1181 hwgroup->polling = 1; 1195 hwgroup->polling = 1;
@@ -1208,11 +1222,11 @@ static ide_startstop_t do_reset1 (ide_drive_t *drive, int do_not_try_atapi)
1208 * TODO: add ->softreset method and stop abusing ->set_irq 1222 * TODO: add ->softreset method and stop abusing ->set_irq
1209 */ 1223 */
1210 /* set SRST and nIEN */ 1224 /* set SRST and nIEN */
1211 hwif->set_irq(hwif, 4); 1225 tp_ops->set_irq(hwif, 4);
1212 /* more than enough time */ 1226 /* more than enough time */
1213 udelay(10); 1227 udelay(10);
1214 /* clear SRST, leave nIEN (unless device is on the quirk list) */ 1228 /* clear SRST, leave nIEN (unless device is on the quirk list) */
1215 hwif->set_irq(hwif, drive->quirk_list == 2); 1229 tp_ops->set_irq(hwif, drive->quirk_list == 2);
1216 /* more than enough time */ 1230 /* more than enough time */
1217 udelay(10); 1231 udelay(10);
1218 hwgroup->poll_timeout = jiffies + WAIT_WORSTCASE; 1232 hwgroup->poll_timeout = jiffies + WAIT_WORSTCASE;
@@ -1257,7 +1271,7 @@ int ide_wait_not_busy(ide_hwif_t *hwif, unsigned long timeout)
1257 * about locking issues (2.5 work ?). 1271 * about locking issues (2.5 work ?).
1258 */ 1272 */
1259 mdelay(1); 1273 mdelay(1);
1260 stat = hwif->read_status(hwif); 1274 stat = hwif->tp_ops->read_status(hwif);
1261 if ((stat & BUSY_STAT) == 0) 1275 if ((stat & BUSY_STAT) == 0)
1262 return 0; 1276 return 0;
1263 /* 1277 /*