diff options
author | Bartlomiej Zolnierkiewicz <bzolnier@gmail.com> | 2008-04-26 16:25:24 -0400 |
---|---|---|
committer | Bartlomiej Zolnierkiewicz <bzolnier@gmail.com> | 2008-04-26 16:25:24 -0400 |
commit | 5e37bdc081a980dd0d669e6387bcf15ca9666f81 (patch) | |
tree | d842166c3bd23fbf3dfba0ccaa0f9ed5cc3096db | |
parent | 1fd1890594bd355a4217f5658a34763e77decee3 (diff) |
ide: add struct ide_dma_ops (take 3)
Add struct ide_dma_ops and convert core code + drivers to use it.
While at it:
* Drop "ide_" prefix from ->ide_dma_end and ->ide_dma_test_irq methods.
* Drop "ide_" "infixes" from DMA methods.
* au1xxx-ide.c:
- use auide_dma_{test_irq,end}() directly in auide_dma_timeout()
* pdc202xx_old.c:
- drop "old_" "infixes" from DMA methods
* siimage.c:
- add siimage_dma_test_irq() helper
- print SATA warning in siimage_init_one()
* Remove no longer needed ->init_hwif implementations.
v2:
* Changes based on review from Sergei:
- s/siimage_ide_dma_test_irq/siimage_dma_test_irq/
- s/drive->hwif/hwif/ in idefloppy_pc_intr().
- fix patch description w.r.t. au1xxx-ide changes
- fix au1xxx-ide build
- fix naming for cmd64*_dma_ops
- drop "ide_" and "old_" infixes
- s/hpt3xxx_dma_ops/hpt37x_dma_ops/
- s/hpt370x_dma_ops/hpt370_dma_ops/
- use correct DMA ops for HPT302/N, HPT371/N and HPT374
- s/it821x_smart_dma_ops/it821x_pass_through_dma_ops/
v3:
* Two bugs slipped in v2 (noticed by Sergei):
- use correct DMA ops for HPT374 (for real this time)
- handle HPT370/HPT370A properly
Acked-by: Sergei Shtylyov <sshtylyov@ru.mvista.com>
Signed-off-by: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
31 files changed, 366 insertions, 349 deletions
diff --git a/drivers/ide/arm/icside.c b/drivers/ide/arm/icside.c index 9118587a0db8..adfeed45f4c0 100644 --- a/drivers/ide/arm/icside.c +++ b/drivers/ide/arm/icside.c | |||
@@ -389,17 +389,21 @@ static int icside_dma_init(ide_hwif_t *hwif, const struct ide_port_info *d) | |||
389 | hwif->dmatable_cpu = NULL; | 389 | hwif->dmatable_cpu = NULL; |
390 | hwif->dmatable_dma = 0; | 390 | hwif->dmatable_dma = 0; |
391 | 391 | ||
392 | hwif->dma_host_set = icside_dma_host_set; | ||
393 | hwif->dma_setup = icside_dma_setup; | ||
394 | hwif->dma_exec_cmd = icside_dma_exec_cmd; | ||
395 | hwif->dma_start = icside_dma_start; | ||
396 | hwif->ide_dma_end = icside_dma_end; | ||
397 | hwif->ide_dma_test_irq = icside_dma_test_irq; | ||
398 | hwif->dma_timeout = icside_dma_timeout; | ||
399 | hwif->dma_lost_irq = icside_dma_lost_irq; | ||
400 | |||
401 | return 0; | 392 | return 0; |
402 | } | 393 | } |
394 | |||
395 | static struct ide_dma_ops icside_v6_dma_ops = { | ||
396 | .dma_host_set = icside_dma_host_set, | ||
397 | .dma_setup = icside_dma_setup, | ||
398 | .dma_exec_cmd = icside_dma_exec_cmd, | ||
399 | .dma_start = icside_dma_start, | ||
400 | .dma_end = icside_dma_end, | ||
401 | .dma_test_irq = icside_dma_test_irq, | ||
402 | .dma_timeout = icside_dma_timeout, | ||
403 | .dma_lost_irq = icside_dma_lost_irq, | ||
404 | }; | ||
405 | #else | ||
406 | #define icside_v6_dma_ops NULL | ||
403 | #endif | 407 | #endif |
404 | 408 | ||
405 | static int icside_dma_off_init(ide_hwif_t *hwif, const struct ide_port_info *d) | 409 | static int icside_dma_off_init(ide_hwif_t *hwif, const struct ide_port_info *d) |
@@ -475,6 +479,7 @@ icside_register_v5(struct icside_state *state, struct expansion_card *ec) | |||
475 | static const struct ide_port_info icside_v6_port_info __initdata = { | 479 | static const struct ide_port_info icside_v6_port_info __initdata = { |
476 | .init_dma = icside_dma_off_init, | 480 | .init_dma = icside_dma_off_init, |
477 | .port_ops = &icside_v6_no_dma_port_ops, | 481 | .port_ops = &icside_v6_no_dma_port_ops, |
482 | .dma_ops = &icside_v6_dma_ops, | ||
478 | .host_flags = IDE_HFLAG_SERIALIZE | | 483 | .host_flags = IDE_HFLAG_SERIALIZE | |
479 | IDE_HFLAG_NO_AUTOTUNE, | 484 | IDE_HFLAG_NO_AUTOTUNE, |
480 | .mwdma_mask = ATA_MWDMA2, | 485 | .mwdma_mask = ATA_MWDMA2, |
@@ -550,6 +555,7 @@ icside_register_v6(struct icside_state *state, struct expansion_card *ec) | |||
550 | if (ec->dma != NO_DMA && !request_dma(ec->dma, hwif->name)) { | 555 | if (ec->dma != NO_DMA && !request_dma(ec->dma, hwif->name)) { |
551 | d.init_dma = icside_dma_init; | 556 | d.init_dma = icside_dma_init; |
552 | d.port_ops = &icside_v6_dma_port_ops; | 557 | d.port_ops = &icside_v6_dma_port_ops; |
558 | d.dma_ops = NULL; | ||
553 | } | 559 | } |
554 | 560 | ||
555 | idx[0] = hwif->index; | 561 | idx[0] = hwif->index; |
diff --git a/drivers/ide/arm/palm_bk3710.c b/drivers/ide/arm/palm_bk3710.c index 8fa34e26443a..5853f1109807 100644 --- a/drivers/ide/arm/palm_bk3710.c +++ b/drivers/ide/arm/palm_bk3710.c | |||
@@ -328,7 +328,7 @@ static int __devinit palm_bk3710_init_dma(ide_hwif_t *hwif, | |||
328 | if (ide_allocate_dma_engine(hwif)) | 328 | if (ide_allocate_dma_engine(hwif)) |
329 | return -1; | 329 | return -1; |
330 | 330 | ||
331 | ide_setup_dma(hwif, base); | 331 | ide_setup_dma(hwif, base, d); |
332 | 332 | ||
333 | return 0; | 333 | return 0; |
334 | } | 334 | } |
diff --git a/drivers/ide/cris/ide-cris.c b/drivers/ide/cris/ide-cris.c index 4b2c6b2caca5..12d9842dc7cc 100644 --- a/drivers/ide/cris/ide-cris.c +++ b/drivers/ide/cris/ide-cris.c | |||
@@ -673,11 +673,6 @@ cris_ide_inb(unsigned long reg) | |||
673 | return (unsigned char)cris_ide_inw(reg); | 673 | return (unsigned char)cris_ide_inw(reg); |
674 | } | 674 | } |
675 | 675 | ||
676 | static int cris_dma_end (ide_drive_t *drive); | ||
677 | static int cris_dma_setup (ide_drive_t *drive); | ||
678 | static void cris_dma_exec_cmd (ide_drive_t *drive, u8 command); | ||
679 | static int cris_dma_test_irq(ide_drive_t *drive); | ||
680 | static void cris_dma_start(ide_drive_t *drive); | ||
681 | static void cris_ide_input_data (ide_drive_t *drive, void *, unsigned int); | 676 | static void cris_ide_input_data (ide_drive_t *drive, void *, unsigned int); |
682 | static void cris_ide_output_data (ide_drive_t *drive, void *, unsigned int); | 677 | static void cris_ide_output_data (ide_drive_t *drive, void *, unsigned int); |
683 | static void cris_atapi_input_bytes(ide_drive_t *drive, void *, unsigned int); | 678 | static void cris_atapi_input_bytes(ide_drive_t *drive, void *, unsigned int); |
@@ -787,9 +782,12 @@ static const struct ide_port_ops cris_port_ops = { | |||
787 | .set_dma_mode = cris_set_dma_mode, | 782 | .set_dma_mode = cris_set_dma_mode, |
788 | }; | 783 | }; |
789 | 784 | ||
785 | static struct ide_dma_ops cris_dma_ops; | ||
786 | |||
790 | static const struct ide_port_info cris_port_info __initdata = { | 787 | static const struct ide_port_info cris_port_info __initdata = { |
791 | .chipset = ide_etrax100, | 788 | .chipset = ide_etrax100, |
792 | .port_ops = &cris_port_ops, | 789 | .port_ops = &cris_port_ops, |
790 | .dma_ops = &cris_dma_ops, | ||
793 | .host_flags = IDE_HFLAG_NO_ATAPI_DMA | | 791 | .host_flags = IDE_HFLAG_NO_ATAPI_DMA | |
794 | IDE_HFLAG_NO_DMA, /* no SFF-style DMA */ | 792 | IDE_HFLAG_NO_DMA, /* no SFF-style DMA */ |
795 | .pio_mask = ATA_PIO4, | 793 | .pio_mask = ATA_PIO4, |
@@ -820,12 +818,6 @@ static int __init init_e100_ide(void) | |||
820 | hwif->ata_output_data = &cris_ide_output_data; | 818 | hwif->ata_output_data = &cris_ide_output_data; |
821 | hwif->atapi_input_bytes = &cris_atapi_input_bytes; | 819 | hwif->atapi_input_bytes = &cris_atapi_input_bytes; |
822 | hwif->atapi_output_bytes = &cris_atapi_output_bytes; | 820 | hwif->atapi_output_bytes = &cris_atapi_output_bytes; |
823 | hwif->dma_host_set = &cris_dma_host_set; | ||
824 | hwif->ide_dma_end = &cris_dma_end; | ||
825 | hwif->dma_setup = &cris_dma_setup; | ||
826 | hwif->dma_exec_cmd = &cris_dma_exec_cmd; | ||
827 | hwif->ide_dma_test_irq = &cris_dma_test_irq; | ||
828 | hwif->dma_start = &cris_dma_start; | ||
829 | hwif->OUTB = &cris_ide_outb; | 821 | hwif->OUTB = &cris_ide_outb; |
830 | hwif->OUTW = &cris_ide_outw; | 822 | hwif->OUTW = &cris_ide_outw; |
831 | hwif->OUTBSYNC = &cris_ide_outbsync; | 823 | hwif->OUTBSYNC = &cris_ide_outbsync; |
@@ -1080,6 +1072,15 @@ static void cris_dma_start(ide_drive_t *drive) | |||
1080 | } | 1072 | } |
1081 | } | 1073 | } |
1082 | 1074 | ||
1075 | static struct ide_dma_ops cris_dma_ops = { | ||
1076 | .dma_host_set = cris_dma_host_set, | ||
1077 | .dma_setup = cris_dma_setup, | ||
1078 | .dma_exec_cmd = cris_dma_exec_cmd, | ||
1079 | .dma_start = cris_dma_start, | ||
1080 | .dma_end = cris_dma_end, | ||
1081 | .dma_test_irq = cris_dma_test_irq, | ||
1082 | }; | ||
1083 | |||
1083 | module_init(init_e100_ide); | 1084 | module_init(init_e100_ide); |
1084 | 1085 | ||
1085 | MODULE_LICENSE("GPL"); | 1086 | MODULE_LICENSE("GPL"); |
diff --git a/drivers/ide/ide-cd.c b/drivers/ide/ide-cd.c index fcd33f17d8fe..ad984322da94 100644 --- a/drivers/ide/ide-cd.c +++ b/drivers/ide/ide-cd.c | |||
@@ -539,7 +539,7 @@ static ide_startstop_t cdrom_start_packet_command(ide_drive_t *drive, | |||
539 | 539 | ||
540 | /* FIXME: for Virtual DMA we must check harder */ | 540 | /* FIXME: for Virtual DMA we must check harder */ |
541 | if (info->dma) | 541 | if (info->dma) |
542 | info->dma = !hwif->dma_setup(drive); | 542 | info->dma = !hwif->dma_ops->dma_setup(drive); |
543 | 543 | ||
544 | /* set up the controller registers */ | 544 | /* set up the controller registers */ |
545 | ide_pktcmd_tf_load(drive, IDE_TFLAG_OUT_NSECT | IDE_TFLAG_OUT_LBAL | | 545 | ide_pktcmd_tf_load(drive, IDE_TFLAG_OUT_NSECT | IDE_TFLAG_OUT_LBAL | |
@@ -617,7 +617,7 @@ static ide_startstop_t cdrom_transfer_packet_command(ide_drive_t *drive, | |||
617 | 617 | ||
618 | /* start the DMA if need be */ | 618 | /* start the DMA if need be */ |
619 | if (info->dma) | 619 | if (info->dma) |
620 | hwif->dma_start(drive); | 620 | hwif->dma_ops->dma_start(drive); |
621 | 621 | ||
622 | return ide_started; | 622 | return ide_started; |
623 | } | 623 | } |
@@ -929,7 +929,7 @@ static ide_startstop_t cdrom_newpc_intr(ide_drive_t *drive) | |||
929 | dma = info->dma; | 929 | dma = info->dma; |
930 | if (dma) { | 930 | if (dma) { |
931 | info->dma = 0; | 931 | info->dma = 0; |
932 | dma_error = HWIF(drive)->ide_dma_end(drive); | 932 | dma_error = hwif->dma_ops->dma_end(drive); |
933 | if (dma_error) { | 933 | if (dma_error) { |
934 | printk(KERN_ERR "%s: DMA %s error\n", drive->name, | 934 | printk(KERN_ERR "%s: DMA %s error\n", drive->name, |
935 | write ? "write" : "read"); | 935 | write ? "write" : "read"); |
diff --git a/drivers/ide/ide-dma.c b/drivers/ide/ide-dma.c index 366bbc841fc9..a00d2598ec7f 100644 --- a/drivers/ide/ide-dma.c +++ b/drivers/ide/ide-dma.c | |||
@@ -102,7 +102,7 @@ ide_startstop_t ide_dma_intr (ide_drive_t *drive) | |||
102 | { | 102 | { |
103 | u8 stat = 0, dma_stat = 0; | 103 | u8 stat = 0, dma_stat = 0; |
104 | 104 | ||
105 | dma_stat = HWIF(drive)->ide_dma_end(drive); | 105 | dma_stat = drive->hwif->dma_ops->dma_end(drive); |
106 | stat = ide_read_status(drive); | 106 | stat = ide_read_status(drive); |
107 | 107 | ||
108 | if (OK_STAT(stat,DRIVE_READY,drive->bad_wstat|DRQ_STAT)) { | 108 | if (OK_STAT(stat,DRIVE_READY,drive->bad_wstat|DRQ_STAT)) { |
@@ -394,7 +394,7 @@ void ide_dma_off_quietly(ide_drive_t *drive) | |||
394 | drive->using_dma = 0; | 394 | drive->using_dma = 0; |
395 | ide_toggle_bounce(drive, 0); | 395 | ide_toggle_bounce(drive, 0); |
396 | 396 | ||
397 | drive->hwif->dma_host_set(drive, 0); | 397 | drive->hwif->dma_ops->dma_host_set(drive, 0); |
398 | } | 398 | } |
399 | 399 | ||
400 | EXPORT_SYMBOL(ide_dma_off_quietly); | 400 | EXPORT_SYMBOL(ide_dma_off_quietly); |
@@ -427,7 +427,7 @@ void ide_dma_on(ide_drive_t *drive) | |||
427 | drive->using_dma = 1; | 427 | drive->using_dma = 1; |
428 | ide_toggle_bounce(drive, 1); | 428 | ide_toggle_bounce(drive, 1); |
429 | 429 | ||
430 | drive->hwif->dma_host_set(drive, 1); | 430 | drive->hwif->dma_ops->dma_host_set(drive, 1); |
431 | } | 431 | } |
432 | 432 | ||
433 | #ifdef CONFIG_BLK_DEV_IDEDMA_SFF | 433 | #ifdef CONFIG_BLK_DEV_IDEDMA_SFF |
@@ -802,10 +802,10 @@ void ide_dma_timeout (ide_drive_t *drive) | |||
802 | 802 | ||
803 | printk(KERN_ERR "%s: timeout waiting for DMA\n", drive->name); | 803 | printk(KERN_ERR "%s: timeout waiting for DMA\n", drive->name); |
804 | 804 | ||
805 | if (hwif->ide_dma_test_irq(drive)) | 805 | if (hwif->dma_ops->dma_test_irq(drive)) |
806 | return; | 806 | return; |
807 | 807 | ||
808 | hwif->ide_dma_end(drive); | 808 | hwif->dma_ops->dma_end(drive); |
809 | } | 809 | } |
810 | 810 | ||
811 | EXPORT_SYMBOL(ide_dma_timeout); | 811 | EXPORT_SYMBOL(ide_dma_timeout); |
@@ -839,8 +839,21 @@ int ide_allocate_dma_engine(ide_hwif_t *hwif) | |||
839 | } | 839 | } |
840 | EXPORT_SYMBOL_GPL(ide_allocate_dma_engine); | 840 | EXPORT_SYMBOL_GPL(ide_allocate_dma_engine); |
841 | 841 | ||
842 | void ide_setup_dma(ide_hwif_t *hwif, unsigned long base) | 842 | static struct ide_dma_ops sff_dma_ops = { |
843 | .dma_host_set = ide_dma_host_set, | ||
844 | .dma_setup = ide_dma_setup, | ||
845 | .dma_exec_cmd = ide_dma_exec_cmd, | ||
846 | .dma_start = ide_dma_start, | ||
847 | .dma_end = __ide_dma_end, | ||
848 | .dma_test_irq = __ide_dma_test_irq, | ||
849 | .dma_timeout = ide_dma_timeout, | ||
850 | .dma_lost_irq = ide_dma_lost_irq, | ||
851 | }; | ||
852 | |||
853 | void ide_setup_dma(ide_hwif_t *hwif, unsigned long base, | ||
854 | const struct ide_port_info *d) | ||
843 | { | 855 | { |
856 | struct ide_dma_ops *dma_ops = d->dma_ops ? d->dma_ops : &sff_dma_ops; | ||
844 | hwif->dma_base = base; | 857 | hwif->dma_base = base; |
845 | 858 | ||
846 | if (!hwif->dma_command) | 859 | if (!hwif->dma_command) |
@@ -854,22 +867,24 @@ void ide_setup_dma(ide_hwif_t *hwif, unsigned long base) | |||
854 | if (!hwif->dma_prdtable) | 867 | if (!hwif->dma_prdtable) |
855 | hwif->dma_prdtable = hwif->dma_base + 4; | 868 | hwif->dma_prdtable = hwif->dma_base + 4; |
856 | 869 | ||
857 | if (!hwif->dma_host_set) | 870 | hwif->dma_ops = dma_ops; |
858 | hwif->dma_host_set = &ide_dma_host_set; | 871 | |
859 | if (!hwif->dma_setup) | 872 | if (dma_ops->dma_host_set == NULL) |
860 | hwif->dma_setup = &ide_dma_setup; | 873 | dma_ops->dma_host_set = ide_dma_host_set; |
861 | if (!hwif->dma_exec_cmd) | 874 | if (dma_ops->dma_setup == NULL) |
862 | hwif->dma_exec_cmd = &ide_dma_exec_cmd; | 875 | dma_ops->dma_setup = ide_dma_setup; |
863 | if (!hwif->dma_start) | 876 | if (dma_ops->dma_exec_cmd == NULL) |
864 | hwif->dma_start = &ide_dma_start; | 877 | dma_ops->dma_exec_cmd = ide_dma_exec_cmd; |
865 | if (!hwif->ide_dma_end) | 878 | if (dma_ops->dma_start == NULL) |
866 | hwif->ide_dma_end = &__ide_dma_end; | 879 | dma_ops->dma_start = ide_dma_start; |
867 | if (!hwif->ide_dma_test_irq) | 880 | if (dma_ops->dma_end == NULL) |
868 | hwif->ide_dma_test_irq = &__ide_dma_test_irq; | 881 | dma_ops->dma_end = __ide_dma_end; |
869 | if (!hwif->dma_timeout) | 882 | if (dma_ops->dma_test_irq == NULL) |
870 | hwif->dma_timeout = &ide_dma_timeout; | 883 | dma_ops->dma_test_irq = __ide_dma_test_irq; |
871 | if (!hwif->dma_lost_irq) | 884 | if (dma_ops->dma_timeout == NULL) |
872 | hwif->dma_lost_irq = &ide_dma_lost_irq; | 885 | dma_ops->dma_timeout = ide_dma_timeout; |
886 | if (dma_ops->dma_lost_irq == NULL) | ||
887 | dma_ops->dma_lost_irq = ide_dma_lost_irq; | ||
873 | } | 888 | } |
874 | 889 | ||
875 | EXPORT_SYMBOL_GPL(ide_setup_dma); | 890 | EXPORT_SYMBOL_GPL(ide_setup_dma); |
diff --git a/drivers/ide/ide-floppy.c b/drivers/ide/ide-floppy.c index ed19a8bbd2d2..6e891bccd052 100644 --- a/drivers/ide/ide-floppy.c +++ b/drivers/ide/ide-floppy.c | |||
@@ -411,7 +411,7 @@ static ide_startstop_t idefloppy_pc_intr(ide_drive_t *drive) | |||
411 | debug_log("Reached %s interrupt handler\n", __func__); | 411 | debug_log("Reached %s interrupt handler\n", __func__); |
412 | 412 | ||
413 | if (pc->flags & PC_FLAG_DMA_IN_PROGRESS) { | 413 | if (pc->flags & PC_FLAG_DMA_IN_PROGRESS) { |
414 | dma_error = hwif->ide_dma_end(drive); | 414 | dma_error = hwif->dma_ops->dma_end(drive); |
415 | if (dma_error) { | 415 | if (dma_error) { |
416 | printk(KERN_ERR "%s: DMA %s error\n", drive->name, | 416 | printk(KERN_ERR "%s: DMA %s error\n", drive->name, |
417 | rq_data_dir(rq) ? "write" : "read"); | 417 | rq_data_dir(rq) ? "write" : "read"); |
@@ -663,7 +663,7 @@ static ide_startstop_t idefloppy_issue_pc(ide_drive_t *drive, | |||
663 | dma = 0; | 663 | dma = 0; |
664 | 664 | ||
665 | if ((pc->flags & PC_FLAG_DMA_RECOMMENDED) && drive->using_dma) | 665 | if ((pc->flags & PC_FLAG_DMA_RECOMMENDED) && drive->using_dma) |
666 | dma = !hwif->dma_setup(drive); | 666 | dma = !hwif->dma_ops->dma_setup(drive); |
667 | 667 | ||
668 | ide_pktcmd_tf_load(drive, IDE_TFLAG_NO_SELECT_MASK | | 668 | ide_pktcmd_tf_load(drive, IDE_TFLAG_NO_SELECT_MASK | |
669 | IDE_TFLAG_OUT_DEVICE, bcount, dma); | 669 | IDE_TFLAG_OUT_DEVICE, bcount, dma); |
@@ -671,7 +671,7 @@ static ide_startstop_t idefloppy_issue_pc(ide_drive_t *drive, | |||
671 | if (dma) { | 671 | if (dma) { |
672 | /* Begin DMA, if necessary */ | 672 | /* Begin DMA, if necessary */ |
673 | pc->flags |= PC_FLAG_DMA_IN_PROGRESS; | 673 | pc->flags |= PC_FLAG_DMA_IN_PROGRESS; |
674 | hwif->dma_start(drive); | 674 | hwif->dma_ops->dma_start(drive); |
675 | } | 675 | } |
676 | 676 | ||
677 | /* Can we transfer the packet when we get the interrupt or wait? */ | 677 | /* Can we transfer the packet when we get the interrupt or wait? */ |
diff --git a/drivers/ide/ide-io.c b/drivers/ide/ide-io.c index 0d3f9c7aa336..0fe89a599275 100644 --- a/drivers/ide/ide-io.c +++ b/drivers/ide/ide-io.c | |||
@@ -218,7 +218,7 @@ static ide_startstop_t ide_start_power_step(ide_drive_t *drive, struct request * | |||
218 | * we could be smarter and check for current xfer_speed | 218 | * we could be smarter and check for current xfer_speed |
219 | * in struct drive etc... | 219 | * in struct drive etc... |
220 | */ | 220 | */ |
221 | if (drive->hwif->dma_host_set == NULL) | 221 | if (drive->hwif->dma_ops == NULL) |
222 | break; | 222 | break; |
223 | /* | 223 | /* |
224 | * TODO: respect ->using_dma setting | 224 | * TODO: respect ->using_dma setting |
@@ -1238,12 +1238,12 @@ static ide_startstop_t ide_dma_timeout_retry(ide_drive_t *drive, int error) | |||
1238 | 1238 | ||
1239 | if (error < 0) { | 1239 | if (error < 0) { |
1240 | printk(KERN_WARNING "%s: DMA timeout error\n", drive->name); | 1240 | printk(KERN_WARNING "%s: DMA timeout error\n", drive->name); |
1241 | (void)HWIF(drive)->ide_dma_end(drive); | 1241 | (void)hwif->dma_ops->dma_end(drive); |
1242 | ret = ide_error(drive, "dma timeout error", | 1242 | ret = ide_error(drive, "dma timeout error", |
1243 | ide_read_status(drive)); | 1243 | ide_read_status(drive)); |
1244 | } else { | 1244 | } else { |
1245 | printk(KERN_WARNING "%s: DMA timeout retry\n", drive->name); | 1245 | printk(KERN_WARNING "%s: DMA timeout retry\n", drive->name); |
1246 | hwif->dma_timeout(drive); | 1246 | hwif->dma_ops->dma_timeout(drive); |
1247 | } | 1247 | } |
1248 | 1248 | ||
1249 | /* | 1249 | /* |
@@ -1355,7 +1355,7 @@ void ide_timer_expiry (unsigned long data) | |||
1355 | startstop = handler(drive); | 1355 | startstop = handler(drive); |
1356 | } else if (drive_is_ready(drive)) { | 1356 | } else if (drive_is_ready(drive)) { |
1357 | if (drive->waiting_for_dma) | 1357 | if (drive->waiting_for_dma) |
1358 | hwgroup->hwif->dma_lost_irq(drive); | 1358 | hwif->dma_ops->dma_lost_irq(drive); |
1359 | (void)ide_ack_intr(hwif); | 1359 | (void)ide_ack_intr(hwif); |
1360 | printk(KERN_WARNING "%s: lost interrupt\n", drive->name); | 1360 | printk(KERN_WARNING "%s: lost interrupt\n", drive->name); |
1361 | startstop = handler(drive); | 1361 | startstop = handler(drive); |
diff --git a/drivers/ide/ide-iops.c b/drivers/ide/ide-iops.c index bfec5d066b25..9c646bd63549 100644 --- a/drivers/ide/ide-iops.c +++ b/drivers/ide/ide-iops.c | |||
@@ -432,7 +432,7 @@ int drive_is_ready (ide_drive_t *drive) | |||
432 | u8 stat = 0; | 432 | u8 stat = 0; |
433 | 433 | ||
434 | if (drive->waiting_for_dma) | 434 | if (drive->waiting_for_dma) |
435 | return hwif->ide_dma_test_irq(drive); | 435 | return hwif->dma_ops->dma_test_irq(drive); |
436 | 436 | ||
437 | #if 0 | 437 | #if 0 |
438 | /* need to guarantee 400ns since last command was issued */ | 438 | /* need to guarantee 400ns since last command was issued */ |
@@ -703,8 +703,8 @@ int ide_config_drive_speed(ide_drive_t *drive, u8 speed) | |||
703 | // msleep(50); | 703 | // msleep(50); |
704 | 704 | ||
705 | #ifdef CONFIG_BLK_DEV_IDEDMA | 705 | #ifdef CONFIG_BLK_DEV_IDEDMA |
706 | if (hwif->dma_host_set) /* check if host supports DMA */ | 706 | if (hwif->dma_ops) /* check if host supports DMA */ |
707 | hwif->dma_host_set(drive, 0); | 707 | hwif->dma_ops->dma_host_set(drive, 0); |
708 | #endif | 708 | #endif |
709 | 709 | ||
710 | /* Skip setting PIO flow-control modes on pre-EIDE drives */ | 710 | /* Skip setting PIO flow-control modes on pre-EIDE drives */ |
@@ -762,8 +762,8 @@ int ide_config_drive_speed(ide_drive_t *drive, u8 speed) | |||
762 | #ifdef CONFIG_BLK_DEV_IDEDMA | 762 | #ifdef CONFIG_BLK_DEV_IDEDMA |
763 | if ((speed >= XFER_SW_DMA_0 || (hwif->host_flags & IDE_HFLAG_VDMA)) && | 763 | if ((speed >= XFER_SW_DMA_0 || (hwif->host_flags & IDE_HFLAG_VDMA)) && |
764 | drive->using_dma) | 764 | drive->using_dma) |
765 | hwif->dma_host_set(drive, 1); | 765 | hwif->dma_ops->dma_host_set(drive, 1); |
766 | else if (hwif->dma_host_set) /* check if host supports DMA */ | 766 | else if (hwif->dma_ops) /* check if host supports DMA */ |
767 | ide_dma_off_quietly(drive); | 767 | ide_dma_off_quietly(drive); |
768 | #endif | 768 | #endif |
769 | 769 | ||
diff --git a/drivers/ide/ide-probe.c b/drivers/ide/ide-probe.c index b58eb792172e..a4b65b321f51 100644 --- a/drivers/ide/ide-probe.c +++ b/drivers/ide/ide-probe.c | |||
@@ -843,7 +843,7 @@ static void ide_port_tune_devices(ide_hwif_t *hwif) | |||
843 | 843 | ||
844 | drive->nice1 = 1; | 844 | drive->nice1 = 1; |
845 | 845 | ||
846 | if (hwif->dma_host_set) | 846 | if (hwif->dma_ops) |
847 | ide_set_dma(drive); | 847 | ide_set_dma(drive); |
848 | } | 848 | } |
849 | } | 849 | } |
@@ -1390,7 +1390,8 @@ static void ide_init_port(ide_hwif_t *hwif, unsigned int port, | |||
1390 | hwif->swdma_mask = 0; | 1390 | hwif->swdma_mask = 0; |
1391 | hwif->mwdma_mask = 0; | 1391 | hwif->mwdma_mask = 0; |
1392 | hwif->ultra_mask = 0; | 1392 | hwif->ultra_mask = 0; |
1393 | } | 1393 | } else if (d->dma_ops) |
1394 | hwif->dma_ops = d->dma_ops; | ||
1394 | } | 1395 | } |
1395 | 1396 | ||
1396 | if (d->host_flags & IDE_HFLAG_RQSIZE_256) | 1397 | if (d->host_flags & IDE_HFLAG_RQSIZE_256) |
diff --git a/drivers/ide/ide-tape.c b/drivers/ide/ide-tape.c index cac14b22506f..d3d8b8d5157c 100644 --- a/drivers/ide/ide-tape.c +++ b/drivers/ide/ide-tape.c | |||
@@ -993,7 +993,7 @@ static ide_startstop_t idetape_pc_intr(ide_drive_t *drive) | |||
993 | stat = ide_read_status(drive); | 993 | stat = ide_read_status(drive); |
994 | 994 | ||
995 | if (pc->flags & PC_FLAG_DMA_IN_PROGRESS) { | 995 | if (pc->flags & PC_FLAG_DMA_IN_PROGRESS) { |
996 | if (hwif->ide_dma_end(drive) || (stat & ERR_STAT)) { | 996 | if (hwif->dma_ops->dma_end(drive) || (stat & ERR_STAT)) { |
997 | /* | 997 | /* |
998 | * A DMA error is sometimes expected. For example, | 998 | * A DMA error is sometimes expected. For example, |
999 | * if the tape is crossing a filemark during a | 999 | * if the tape is crossing a filemark during a |
@@ -1213,7 +1213,7 @@ static ide_startstop_t idetape_transfer_pc(ide_drive_t *drive) | |||
1213 | #ifdef CONFIG_BLK_DEV_IDEDMA | 1213 | #ifdef CONFIG_BLK_DEV_IDEDMA |
1214 | /* Begin DMA, if necessary */ | 1214 | /* Begin DMA, if necessary */ |
1215 | if (pc->flags & PC_FLAG_DMA_IN_PROGRESS) | 1215 | if (pc->flags & PC_FLAG_DMA_IN_PROGRESS) |
1216 | hwif->dma_start(drive); | 1216 | hwif->dma_ops->dma_start(drive); |
1217 | #endif | 1217 | #endif |
1218 | /* Send the actual packet */ | 1218 | /* Send the actual packet */ |
1219 | HWIF(drive)->atapi_output_bytes(drive, pc->c, 12); | 1219 | HWIF(drive)->atapi_output_bytes(drive, pc->c, 12); |
@@ -1279,7 +1279,7 @@ static ide_startstop_t idetape_issue_pc(ide_drive_t *drive, | |||
1279 | ide_dma_off(drive); | 1279 | ide_dma_off(drive); |
1280 | } | 1280 | } |
1281 | if ((pc->flags & PC_FLAG_DMA_RECOMMENDED) && drive->using_dma) | 1281 | if ((pc->flags & PC_FLAG_DMA_RECOMMENDED) && drive->using_dma) |
1282 | dma_ok = !hwif->dma_setup(drive); | 1282 | dma_ok = !hwif->dma_ops->dma_setup(drive); |
1283 | 1283 | ||
1284 | ide_pktcmd_tf_load(drive, IDE_TFLAG_NO_SELECT_MASK | | 1284 | ide_pktcmd_tf_load(drive, IDE_TFLAG_NO_SELECT_MASK | |
1285 | IDE_TFLAG_OUT_DEVICE, bcount, dma_ok); | 1285 | IDE_TFLAG_OUT_DEVICE, bcount, dma_ok); |
diff --git a/drivers/ide/ide-taskfile.c b/drivers/ide/ide-taskfile.c index fac6835273a8..9504aa54c33b 100644 --- a/drivers/ide/ide-taskfile.c +++ b/drivers/ide/ide-taskfile.c | |||
@@ -135,6 +135,7 @@ ide_startstop_t do_rw_taskfile (ide_drive_t *drive, ide_task_t *task) | |||
135 | ide_hwif_t *hwif = HWIF(drive); | 135 | ide_hwif_t *hwif = HWIF(drive); |
136 | struct ide_taskfile *tf = &task->tf; | 136 | struct ide_taskfile *tf = &task->tf; |
137 | ide_handler_t *handler = NULL; | 137 | ide_handler_t *handler = NULL; |
138 | struct ide_dma_ops *dma_ops = hwif->dma_ops; | ||
138 | 139 | ||
139 | if (task->data_phase == TASKFILE_MULTI_IN || | 140 | if (task->data_phase == TASKFILE_MULTI_IN || |
140 | task->data_phase == TASKFILE_MULTI_OUT) { | 141 | task->data_phase == TASKFILE_MULTI_OUT) { |
@@ -178,10 +179,10 @@ ide_startstop_t do_rw_taskfile (ide_drive_t *drive, ide_task_t *task) | |||
178 | return ide_started; | 179 | return ide_started; |
179 | default: | 180 | default: |
180 | if (task_dma_ok(task) == 0 || drive->using_dma == 0 || | 181 | if (task_dma_ok(task) == 0 || drive->using_dma == 0 || |
181 | hwif->dma_setup(drive)) | 182 | dma_ops->dma_setup(drive)) |
182 | return ide_stopped; | 183 | return ide_stopped; |
183 | hwif->dma_exec_cmd(drive, tf->command); | 184 | dma_ops->dma_exec_cmd(drive, tf->command); |
184 | hwif->dma_start(drive); | 185 | dma_ops->dma_start(drive); |
185 | return ide_started; | 186 | return ide_started; |
186 | } | 187 | } |
187 | } | 188 | } |
diff --git a/drivers/ide/ide.c b/drivers/ide/ide.c index 3d989c298ff4..bced02f9f2c3 100644 --- a/drivers/ide/ide.c +++ b/drivers/ide/ide.c | |||
@@ -469,7 +469,7 @@ int set_using_dma(ide_drive_t *drive, int arg) | |||
469 | if (!drive->id || !(drive->id->capability & 1)) | 469 | if (!drive->id || !(drive->id->capability & 1)) |
470 | goto out; | 470 | goto out; |
471 | 471 | ||
472 | if (hwif->dma_host_set == NULL) | 472 | if (hwif->dma_ops == NULL) |
473 | goto out; | 473 | goto out; |
474 | 474 | ||
475 | err = -EBUSY; | 475 | err = -EBUSY; |
diff --git a/drivers/ide/mips/au1xxx-ide.c b/drivers/ide/mips/au1xxx-ide.c index 54323ab64def..579caa3b06f4 100644 --- a/drivers/ide/mips/au1xxx-ide.c +++ b/drivers/ide/mips/au1xxx-ide.c | |||
@@ -366,21 +366,31 @@ static void auide_init_dbdma_dev(dbdev_tab_t *dev, u32 dev_id, u32 tsize, u32 de | |||
366 | dev->dev_devwidth = devwidth; | 366 | dev->dev_devwidth = devwidth; |
367 | dev->dev_flags = flags; | 367 | dev->dev_flags = flags; |
368 | } | 368 | } |
369 | |||
370 | #if defined(CONFIG_BLK_DEV_IDE_AU1XXX_MDMA2_DBDMA) | ||
371 | 369 | ||
370 | #ifdef CONFIG_BLK_DEV_IDE_AU1XXX_MDMA2_DBDMA | ||
372 | static void auide_dma_timeout(ide_drive_t *drive) | 371 | static void auide_dma_timeout(ide_drive_t *drive) |
373 | { | 372 | { |
374 | ide_hwif_t *hwif = HWIF(drive); | 373 | ide_hwif_t *hwif = HWIF(drive); |
375 | 374 | ||
376 | printk(KERN_ERR "%s: DMA timeout occurred: ", drive->name); | 375 | printk(KERN_ERR "%s: DMA timeout occurred: ", drive->name); |
377 | 376 | ||
378 | if (hwif->ide_dma_test_irq(drive)) | 377 | if (auide_dma_test_irq(drive)) |
379 | return; | 378 | return; |
380 | 379 | ||
381 | hwif->ide_dma_end(drive); | 380 | auide_dma_end(drive); |
382 | } | 381 | } |
383 | 382 | ||
383 | static struct ide_dma_ops au1xxx_dma_ops = { | ||
384 | .dma_host_set = auide_dma_host_set, | ||
385 | .dma_setup = auide_dma_setup, | ||
386 | .dma_exec_cmd = auide_dma_exec_cmd, | ||
387 | .dma_start = auide_dma_start, | ||
388 | .dma_end = auide_dma_end, | ||
389 | .dma_test_irq = auide_dma_test_irq, | ||
390 | .dma_lost_irq = auide_dma_lost_irq, | ||
391 | .dma_timeout = auide_dma_timeout, | ||
392 | }; | ||
393 | |||
384 | static int auide_ddma_init(ide_hwif_t *hwif, const struct ide_port_info *d) | 394 | static int auide_ddma_init(ide_hwif_t *hwif, const struct ide_port_info *d) |
385 | { | 395 | { |
386 | _auide_hwif *auide = (_auide_hwif *)hwif->hwif_data; | 396 | _auide_hwif *auide = (_auide_hwif *)hwif->hwif_data; |
@@ -511,6 +521,9 @@ static const struct ide_port_ops au1xxx_port_ops = { | |||
511 | static const struct ide_port_info au1xxx_port_info = { | 521 | static const struct ide_port_info au1xxx_port_info = { |
512 | .init_dma = auide_ddma_init, | 522 | .init_dma = auide_ddma_init, |
513 | .port_ops = &au1xxx_port_ops, | 523 | .port_ops = &au1xxx_port_ops, |
524 | #ifdef CONFIG_BLK_DEV_IDE_AU1XXX_MDMA2_DBDMA | ||
525 | .dma_ops = &au1xxx_dma_ops, | ||
526 | #endif | ||
514 | .host_flags = IDE_HFLAG_POST_SET_MODE | | 527 | .host_flags = IDE_HFLAG_POST_SET_MODE | |
515 | IDE_HFLAG_NO_IO_32BIT | | 528 | IDE_HFLAG_NO_IO_32BIT | |
516 | IDE_HFLAG_UNMASK_IRQS, | 529 | IDE_HFLAG_UNMASK_IRQS, |
@@ -589,16 +602,6 @@ static int au_ide_probe(struct device *dev) | |||
589 | hwif->INSW = auide_insw; | 602 | hwif->INSW = auide_insw; |
590 | hwif->OUTSW = auide_outsw; | 603 | hwif->OUTSW = auide_outsw; |
591 | #endif | 604 | #endif |
592 | #ifdef CONFIG_BLK_DEV_IDE_AU1XXX_MDMA2_DBDMA | ||
593 | hwif->dma_timeout = &auide_dma_timeout; | ||
594 | hwif->dma_host_set = &auide_dma_host_set; | ||
595 | hwif->dma_exec_cmd = &auide_dma_exec_cmd; | ||
596 | hwif->dma_start = &auide_dma_start; | ||
597 | hwif->ide_dma_end = &auide_dma_end; | ||
598 | hwif->dma_setup = &auide_dma_setup; | ||
599 | hwif->ide_dma_test_irq = &auide_dma_test_irq; | ||
600 | hwif->dma_lost_irq = &auide_dma_lost_irq; | ||
601 | #endif | ||
602 | hwif->select_data = 0; /* no chipset-specific code */ | 605 | hwif->select_data = 0; /* no chipset-specific code */ |
603 | hwif->config_data = 0; /* no chipset-specific code */ | 606 | hwif->config_data = 0; /* no chipset-specific code */ |
604 | 607 | ||
diff --git a/drivers/ide/pci/alim15x3.c b/drivers/ide/pci/alim15x3.c index 5261f308d946..987db35199e6 100644 --- a/drivers/ide/pci/alim15x3.c +++ b/drivers/ide/pci/alim15x3.c | |||
@@ -652,21 +652,7 @@ static u8 __devinit ali_cable_detect(ide_hwif_t *hwif) | |||
652 | return cbl; | 652 | return cbl; |
653 | } | 653 | } |
654 | 654 | ||
655 | /** | 655 | #ifndef CONFIG_SPARC64 |
656 | * init_hwif_common_ali15x3 - Set up ALI IDE hardware | ||
657 | * @hwif: IDE interface | ||
658 | * | ||
659 | * Initialize the IDE structure side of the ALi 15x3 driver. | ||
660 | */ | ||
661 | |||
662 | static void __devinit init_hwif_common_ali15x3 (ide_hwif_t *hwif) | ||
663 | { | ||
664 | if (hwif->dma_base == 0) | ||
665 | return; | ||
666 | |||
667 | hwif->dma_setup = &ali15x3_dma_setup; | ||
668 | } | ||
669 | |||
670 | /** | 656 | /** |
671 | * init_hwif_ali15x3 - Initialize the ALI IDE x86 stuff | 657 | * init_hwif_ali15x3 - Initialize the ALI IDE x86 stuff |
672 | * @hwif: interface to configure | 658 | * @hwif: interface to configure |
@@ -716,9 +702,8 @@ static void __devinit init_hwif_ali15x3 (ide_hwif_t *hwif) | |||
716 | if(irq >= 0) | 702 | if(irq >= 0) |
717 | hwif->irq = irq; | 703 | hwif->irq = irq; |
718 | } | 704 | } |
719 | |||
720 | init_hwif_common_ali15x3(hwif); | ||
721 | } | 705 | } |
706 | #endif | ||
722 | 707 | ||
723 | /** | 708 | /** |
724 | * init_dma_ali15x3 - set up DMA on ALi15x3 | 709 | * init_dma_ali15x3 - set up DMA on ALi15x3 |
@@ -746,7 +731,7 @@ static int __devinit init_dma_ali15x3(ide_hwif_t *hwif, | |||
746 | if (ide_allocate_dma_engine(hwif)) | 731 | if (ide_allocate_dma_engine(hwif)) |
747 | return -1; | 732 | return -1; |
748 | 733 | ||
749 | ide_setup_dma(hwif, base); | 734 | ide_setup_dma(hwif, base, d); |
750 | 735 | ||
751 | return 0; | 736 | return 0; |
752 | } | 737 | } |
@@ -758,10 +743,16 @@ static const struct ide_port_ops ali_port_ops = { | |||
758 | .cable_detect = ali_cable_detect, | 743 | .cable_detect = ali_cable_detect, |
759 | }; | 744 | }; |
760 | 745 | ||
746 | static struct ide_dma_ops ali_dma_ops = { | ||
747 | .dma_setup = ali15x3_dma_setup, | ||
748 | }; | ||
749 | |||
761 | static const struct ide_port_info ali15x3_chipset __devinitdata = { | 750 | static const struct ide_port_info ali15x3_chipset __devinitdata = { |
762 | .name = "ALI15X3", | 751 | .name = "ALI15X3", |
763 | .init_chipset = init_chipset_ali15x3, | 752 | .init_chipset = init_chipset_ali15x3, |
753 | #ifndef CONFIG_SPARC64 | ||
764 | .init_hwif = init_hwif_ali15x3, | 754 | .init_hwif = init_hwif_ali15x3, |
755 | #endif | ||
765 | .init_dma = init_dma_ali15x3, | 756 | .init_dma = init_dma_ali15x3, |
766 | .port_ops = &ali_port_ops, | 757 | .port_ops = &ali_port_ops, |
767 | .pio_mask = ATA_PIO5, | 758 | .pio_mask = ATA_PIO5, |
@@ -806,6 +797,8 @@ static int __devinit alim15x3_init_one(struct pci_dev *dev, const struct pci_dev | |||
806 | d.udma_mask = ATA_UDMA5; | 797 | d.udma_mask = ATA_UDMA5; |
807 | else | 798 | else |
808 | d.udma_mask = ATA_UDMA6; | 799 | d.udma_mask = ATA_UDMA6; |
800 | |||
801 | d.dma_ops = &ali_dma_ops; | ||
809 | } else { | 802 | } else { |
810 | d.host_flags |= IDE_HFLAG_NO_DMA; | 803 | d.host_flags |= IDE_HFLAG_NO_DMA; |
811 | 804 | ||
@@ -815,9 +808,6 @@ static int __devinit alim15x3_init_one(struct pci_dev *dev, const struct pci_dev | |||
815 | if (idx == 0) | 808 | if (idx == 0) |
816 | d.host_flags |= IDE_HFLAG_CLEAR_SIMPLEX; | 809 | d.host_flags |= IDE_HFLAG_CLEAR_SIMPLEX; |
817 | 810 | ||
818 | #if defined(CONFIG_SPARC64) | ||
819 | d.init_hwif = init_hwif_common_ali15x3; | ||
820 | #endif /* CONFIG_SPARC64 */ | ||
821 | return ide_setup_pci_device(dev, &d); | 811 | return ide_setup_pci_device(dev, &d); |
822 | } | 812 | } |
823 | 813 | ||
diff --git a/drivers/ide/pci/cmd64x.c b/drivers/ide/pci/cmd64x.c index 5411ded791bb..5fd252e6ed08 100644 --- a/drivers/ide/pci/cmd64x.c +++ b/drivers/ide/pci/cmd64x.c | |||
@@ -223,7 +223,7 @@ static void cmd64x_set_dma_mode(ide_drive_t *drive, const u8 speed) | |||
223 | (void) pci_write_config_byte(dev, pciU, regU); | 223 | (void) pci_write_config_byte(dev, pciU, regU); |
224 | } | 224 | } |
225 | 225 | ||
226 | static int cmd648_ide_dma_end (ide_drive_t *drive) | 226 | static int cmd648_dma_end(ide_drive_t *drive) |
227 | { | 227 | { |
228 | ide_hwif_t *hwif = HWIF(drive); | 228 | ide_hwif_t *hwif = HWIF(drive); |
229 | unsigned long base = hwif->dma_base - (hwif->channel * 8); | 229 | unsigned long base = hwif->dma_base - (hwif->channel * 8); |
@@ -239,7 +239,7 @@ static int cmd648_ide_dma_end (ide_drive_t *drive) | |||
239 | return err; | 239 | return err; |
240 | } | 240 | } |
241 | 241 | ||
242 | static int cmd64x_ide_dma_end (ide_drive_t *drive) | 242 | static int cmd64x_dma_end(ide_drive_t *drive) |
243 | { | 243 | { |
244 | ide_hwif_t *hwif = HWIF(drive); | 244 | ide_hwif_t *hwif = HWIF(drive); |
245 | struct pci_dev *dev = to_pci_dev(hwif->dev); | 245 | struct pci_dev *dev = to_pci_dev(hwif->dev); |
@@ -256,7 +256,7 @@ static int cmd64x_ide_dma_end (ide_drive_t *drive) | |||
256 | return err; | 256 | return err; |
257 | } | 257 | } |
258 | 258 | ||
259 | static int cmd648_ide_dma_test_irq (ide_drive_t *drive) | 259 | static int cmd648_dma_test_irq(ide_drive_t *drive) |
260 | { | 260 | { |
261 | ide_hwif_t *hwif = HWIF(drive); | 261 | ide_hwif_t *hwif = HWIF(drive); |
262 | unsigned long base = hwif->dma_base - (hwif->channel * 8); | 262 | unsigned long base = hwif->dma_base - (hwif->channel * 8); |
@@ -279,7 +279,7 @@ static int cmd648_ide_dma_test_irq (ide_drive_t *drive) | |||
279 | return 0; | 279 | return 0; |
280 | } | 280 | } |
281 | 281 | ||
282 | static int cmd64x_ide_dma_test_irq (ide_drive_t *drive) | 282 | static int cmd64x_dma_test_irq(ide_drive_t *drive) |
283 | { | 283 | { |
284 | ide_hwif_t *hwif = HWIF(drive); | 284 | ide_hwif_t *hwif = HWIF(drive); |
285 | struct pci_dev *dev = to_pci_dev(hwif->dev); | 285 | struct pci_dev *dev = to_pci_dev(hwif->dev); |
@@ -310,7 +310,7 @@ static int cmd64x_ide_dma_test_irq (ide_drive_t *drive) | |||
310 | * event order for DMA transfers. | 310 | * event order for DMA transfers. |
311 | */ | 311 | */ |
312 | 312 | ||
313 | static int cmd646_1_ide_dma_end (ide_drive_t *drive) | 313 | static int cmd646_1_dma_end(ide_drive_t *drive) |
314 | { | 314 | { |
315 | ide_hwif_t *hwif = HWIF(drive); | 315 | ide_hwif_t *hwif = HWIF(drive); |
316 | u8 dma_stat = 0, dma_cmd = 0; | 316 | u8 dma_stat = 0, dma_cmd = 0; |
@@ -385,62 +385,33 @@ static u8 __devinit cmd64x_cable_detect(ide_hwif_t *hwif) | |||
385 | } | 385 | } |
386 | } | 386 | } |
387 | 387 | ||
388 | static void __devinit init_hwif_cmd64x(ide_hwif_t *hwif) | ||
389 | { | ||
390 | struct pci_dev *dev = to_pci_dev(hwif->dev); | ||
391 | |||
392 | if (!hwif->dma_base) | ||
393 | return; | ||
394 | |||
395 | /* | ||
396 | * UltraDMA only supported on PCI646U and PCI646U2, which | ||
397 | * correspond to revisions 0x03, 0x05 and 0x07 respectively. | ||
398 | * Actually, although the CMD tech support people won't | ||
399 | * tell me the details, the 0x03 revision cannot support | ||
400 | * UDMA correctly without hardware modifications, and even | ||
401 | * then it only works with Quantum disks due to some | ||
402 | * hold time assumptions in the 646U part which are fixed | ||
403 | * in the 646U2. | ||
404 | * | ||
405 | * So we only do UltraDMA on revision 0x05 and 0x07 chipsets. | ||
406 | */ | ||
407 | if (dev->device == PCI_DEVICE_ID_CMD_646 && dev->revision < 5) | ||
408 | hwif->ultra_mask = 0x00; | ||
409 | |||
410 | switch (dev->device) { | ||
411 | case PCI_DEVICE_ID_CMD_648: | ||
412 | case PCI_DEVICE_ID_CMD_649: | ||
413 | alt_irq_bits: | ||
414 | hwif->ide_dma_end = &cmd648_ide_dma_end; | ||
415 | hwif->ide_dma_test_irq = &cmd648_ide_dma_test_irq; | ||
416 | break; | ||
417 | case PCI_DEVICE_ID_CMD_646: | ||
418 | if (dev->revision == 0x01) { | ||
419 | hwif->ide_dma_end = &cmd646_1_ide_dma_end; | ||
420 | break; | ||
421 | } else if (dev->revision >= 0x03) | ||
422 | goto alt_irq_bits; | ||
423 | /* fall thru */ | ||
424 | default: | ||
425 | hwif->ide_dma_end = &cmd64x_ide_dma_end; | ||
426 | hwif->ide_dma_test_irq = &cmd64x_ide_dma_test_irq; | ||
427 | break; | ||
428 | } | ||
429 | } | ||
430 | |||
431 | static const struct ide_port_ops cmd64x_port_ops = { | 388 | static const struct ide_port_ops cmd64x_port_ops = { |
432 | .set_pio_mode = cmd64x_set_pio_mode, | 389 | .set_pio_mode = cmd64x_set_pio_mode, |
433 | .set_dma_mode = cmd64x_set_dma_mode, | 390 | .set_dma_mode = cmd64x_set_dma_mode, |
434 | .cable_detect = cmd64x_cable_detect, | 391 | .cable_detect = cmd64x_cable_detect, |
435 | }; | 392 | }; |
436 | 393 | ||
394 | static struct ide_dma_ops cmd64x_dma_ops = { | ||
395 | .dma_end = cmd64x_dma_end, | ||
396 | .dma_test_irq = cmd64x_dma_test_irq, | ||
397 | }; | ||
398 | |||
399 | static struct ide_dma_ops cmd646_rev1_dma_ops = { | ||
400 | .dma_end = cmd646_1_dma_end, | ||
401 | }; | ||
402 | |||
403 | static struct ide_dma_ops cmd648_dma_ops = { | ||
404 | .dma_end = cmd648_dma_end, | ||
405 | .dma_test_irq = cmd648_dma_test_irq, | ||
406 | }; | ||
407 | |||
437 | static const struct ide_port_info cmd64x_chipsets[] __devinitdata = { | 408 | static const struct ide_port_info cmd64x_chipsets[] __devinitdata = { |
438 | { /* 0 */ | 409 | { /* 0 */ |
439 | .name = "CMD643", | 410 | .name = "CMD643", |
440 | .init_chipset = init_chipset_cmd64x, | 411 | .init_chipset = init_chipset_cmd64x, |
441 | .init_hwif = init_hwif_cmd64x, | ||
442 | .enablebits = {{0x00,0x00,0x00}, {0x51,0x08,0x08}}, | 412 | .enablebits = {{0x00,0x00,0x00}, {0x51,0x08,0x08}}, |
443 | .port_ops = &cmd64x_port_ops, | 413 | .port_ops = &cmd64x_port_ops, |
414 | .dma_ops = &cmd64x_dma_ops, | ||
444 | .host_flags = IDE_HFLAG_CLEAR_SIMPLEX | | 415 | .host_flags = IDE_HFLAG_CLEAR_SIMPLEX | |
445 | IDE_HFLAG_ABUSE_PREFETCH, | 416 | IDE_HFLAG_ABUSE_PREFETCH, |
446 | .pio_mask = ATA_PIO5, | 417 | .pio_mask = ATA_PIO5, |
@@ -449,10 +420,10 @@ static const struct ide_port_info cmd64x_chipsets[] __devinitdata = { | |||
449 | },{ /* 1 */ | 420 | },{ /* 1 */ |
450 | .name = "CMD646", | 421 | .name = "CMD646", |
451 | .init_chipset = init_chipset_cmd64x, | 422 | .init_chipset = init_chipset_cmd64x, |
452 | .init_hwif = init_hwif_cmd64x, | ||
453 | .enablebits = {{0x51,0x04,0x04}, {0x51,0x08,0x08}}, | 423 | .enablebits = {{0x51,0x04,0x04}, {0x51,0x08,0x08}}, |
454 | .chipset = ide_cmd646, | 424 | .chipset = ide_cmd646, |
455 | .port_ops = &cmd64x_port_ops, | 425 | .port_ops = &cmd64x_port_ops, |
426 | .dma_ops = &cmd648_dma_ops, | ||
456 | .host_flags = IDE_HFLAG_ABUSE_PREFETCH, | 427 | .host_flags = IDE_HFLAG_ABUSE_PREFETCH, |
457 | .pio_mask = ATA_PIO5, | 428 | .pio_mask = ATA_PIO5, |
458 | .mwdma_mask = ATA_MWDMA2, | 429 | .mwdma_mask = ATA_MWDMA2, |
@@ -460,9 +431,9 @@ static const struct ide_port_info cmd64x_chipsets[] __devinitdata = { | |||
460 | },{ /* 2 */ | 431 | },{ /* 2 */ |
461 | .name = "CMD648", | 432 | .name = "CMD648", |
462 | .init_chipset = init_chipset_cmd64x, | 433 | .init_chipset = init_chipset_cmd64x, |
463 | .init_hwif = init_hwif_cmd64x, | ||
464 | .enablebits = {{0x51,0x04,0x04}, {0x51,0x08,0x08}}, | 434 | .enablebits = {{0x51,0x04,0x04}, {0x51,0x08,0x08}}, |
465 | .port_ops = &cmd64x_port_ops, | 435 | .port_ops = &cmd64x_port_ops, |
436 | .dma_ops = &cmd648_dma_ops, | ||
466 | .host_flags = IDE_HFLAG_ABUSE_PREFETCH, | 437 | .host_flags = IDE_HFLAG_ABUSE_PREFETCH, |
467 | .pio_mask = ATA_PIO5, | 438 | .pio_mask = ATA_PIO5, |
468 | .mwdma_mask = ATA_MWDMA2, | 439 | .mwdma_mask = ATA_MWDMA2, |
@@ -470,9 +441,9 @@ static const struct ide_port_info cmd64x_chipsets[] __devinitdata = { | |||
470 | },{ /* 3 */ | 441 | },{ /* 3 */ |
471 | .name = "CMD649", | 442 | .name = "CMD649", |
472 | .init_chipset = init_chipset_cmd64x, | 443 | .init_chipset = init_chipset_cmd64x, |
473 | .init_hwif = init_hwif_cmd64x, | ||
474 | .enablebits = {{0x51,0x04,0x04}, {0x51,0x08,0x08}}, | 444 | .enablebits = {{0x51,0x04,0x04}, {0x51,0x08,0x08}}, |
475 | .port_ops = &cmd64x_port_ops, | 445 | .port_ops = &cmd64x_port_ops, |
446 | .dma_ops = &cmd648_dma_ops, | ||
476 | .host_flags = IDE_HFLAG_ABUSE_PREFETCH, | 447 | .host_flags = IDE_HFLAG_ABUSE_PREFETCH, |
477 | .pio_mask = ATA_PIO5, | 448 | .pio_mask = ATA_PIO5, |
478 | .mwdma_mask = ATA_MWDMA2, | 449 | .mwdma_mask = ATA_MWDMA2, |
@@ -487,12 +458,35 @@ static int __devinit cmd64x_init_one(struct pci_dev *dev, const struct pci_devic | |||
487 | 458 | ||
488 | d = cmd64x_chipsets[idx]; | 459 | d = cmd64x_chipsets[idx]; |
489 | 460 | ||
490 | /* | 461 | if (idx == 1) { |
491 | * The original PCI0646 didn't have the primary channel enable bit, | 462 | /* |
492 | * it appeared starting with PCI0646U (i.e. revision ID 3). | 463 | * UltraDMA only supported on PCI646U and PCI646U2, which |
493 | */ | 464 | * correspond to revisions 0x03, 0x05 and 0x07 respectively. |
494 | if (idx == 1 && dev->revision < 3) | 465 | * Actually, although the CMD tech support people won't |
495 | d.enablebits[0].reg = 0; | 466 | * tell me the details, the 0x03 revision cannot support |
467 | * UDMA correctly without hardware modifications, and even | ||
468 | * then it only works with Quantum disks due to some | ||
469 | * hold time assumptions in the 646U part which are fixed | ||
470 | * in the 646U2. | ||
471 | * | ||
472 | * So we only do UltraDMA on revision 0x05 and 0x07 chipsets. | ||
473 | */ | ||
474 | if (dev->revision < 5) { | ||
475 | d.udma_mask = 0x00; | ||
476 | /* | ||
477 | * The original PCI0646 didn't have the primary | ||
478 | * channel enable bit, it appeared starting with | ||
479 | * PCI0646U (i.e. revision ID 3). | ||
480 | */ | ||
481 | if (dev->revision < 3) { | ||
482 | d.enablebits[0].reg = 0; | ||
483 | if (dev->revision == 1) | ||
484 | d.dma_ops = &cmd646_rev1_dma_ops; | ||
485 | else | ||
486 | d.dma_ops = &cmd64x_dma_ops; | ||
487 | } | ||
488 | } | ||
489 | } | ||
496 | 490 | ||
497 | return ide_setup_pci_device(dev, &d); | 491 | return ide_setup_pci_device(dev, &d); |
498 | } | 492 | } |
diff --git a/drivers/ide/pci/cs5520.c b/drivers/ide/pci/cs5520.c index 41559c6de0ca..467d331c8109 100644 --- a/drivers/ide/pci/cs5520.c +++ b/drivers/ide/pci/cs5520.c | |||
@@ -103,24 +103,20 @@ static void cs5520_dma_host_set(ide_drive_t *drive, int on) | |||
103 | ide_dma_host_set(drive, on); | 103 | ide_dma_host_set(drive, on); |
104 | } | 104 | } |
105 | 105 | ||
106 | static void __devinit init_hwif_cs5520(ide_hwif_t *hwif) | ||
107 | { | ||
108 | if (hwif->dma_base == 0) | ||
109 | return; | ||
110 | |||
111 | hwif->dma_host_set = &cs5520_dma_host_set; | ||
112 | } | ||
113 | |||
114 | static const struct ide_port_ops cs5520_port_ops = { | 106 | static const struct ide_port_ops cs5520_port_ops = { |
115 | .set_pio_mode = cs5520_set_pio_mode, | 107 | .set_pio_mode = cs5520_set_pio_mode, |
116 | .set_dma_mode = cs5520_set_dma_mode, | 108 | .set_dma_mode = cs5520_set_dma_mode, |
117 | }; | 109 | }; |
118 | 110 | ||
111 | static struct ide_dma_ops cs5520_dma_ops = { | ||
112 | .dma_host_set = cs5520_dma_host_set, | ||
113 | }; | ||
114 | |||
119 | #define DECLARE_CS_DEV(name_str) \ | 115 | #define DECLARE_CS_DEV(name_str) \ |
120 | { \ | 116 | { \ |
121 | .name = name_str, \ | 117 | .name = name_str, \ |
122 | .init_hwif = init_hwif_cs5520, \ | ||
123 | .port_ops = &cs5520_port_ops, \ | 118 | .port_ops = &cs5520_port_ops, \ |
119 | .dma_ops = &cs5520_dma_ops, \ | ||
124 | .host_flags = IDE_HFLAG_ISA_PORTS | \ | 120 | .host_flags = IDE_HFLAG_ISA_PORTS | \ |
125 | IDE_HFLAG_CS5520 | \ | 121 | IDE_HFLAG_CS5520 | \ |
126 | IDE_HFLAG_VDMA | \ | 122 | IDE_HFLAG_VDMA | \ |
diff --git a/drivers/ide/pci/hpt366.c b/drivers/ide/pci/hpt366.c index e5e64436ffd9..5030bda1adeb 100644 --- a/drivers/ide/pci/hpt366.c +++ b/drivers/ide/pci/hpt366.c | |||
@@ -808,7 +808,7 @@ static void hpt370_irq_timeout(ide_drive_t *drive) | |||
808 | hpt370_clear_engine(drive); | 808 | hpt370_clear_engine(drive); |
809 | } | 809 | } |
810 | 810 | ||
811 | static void hpt370_ide_dma_start(ide_drive_t *drive) | 811 | static void hpt370_dma_start(ide_drive_t *drive) |
812 | { | 812 | { |
813 | #ifdef HPT_RESET_STATE_ENGINE | 813 | #ifdef HPT_RESET_STATE_ENGINE |
814 | hpt370_clear_engine(drive); | 814 | hpt370_clear_engine(drive); |
@@ -816,7 +816,7 @@ static void hpt370_ide_dma_start(ide_drive_t *drive) | |||
816 | ide_dma_start(drive); | 816 | ide_dma_start(drive); |
817 | } | 817 | } |
818 | 818 | ||
819 | static int hpt370_ide_dma_end(ide_drive_t *drive) | 819 | static int hpt370_dma_end(ide_drive_t *drive) |
820 | { | 820 | { |
821 | ide_hwif_t *hwif = HWIF(drive); | 821 | ide_hwif_t *hwif = HWIF(drive); |
822 | u8 dma_stat = inb(hwif->dma_status); | 822 | u8 dma_stat = inb(hwif->dma_status); |
@@ -838,7 +838,7 @@ static void hpt370_dma_timeout(ide_drive_t *drive) | |||
838 | } | 838 | } |
839 | 839 | ||
840 | /* returns 1 if DMA IRQ issued, 0 otherwise */ | 840 | /* returns 1 if DMA IRQ issued, 0 otherwise */ |
841 | static int hpt374_ide_dma_test_irq(ide_drive_t *drive) | 841 | static int hpt374_dma_test_irq(ide_drive_t *drive) |
842 | { | 842 | { |
843 | ide_hwif_t *hwif = HWIF(drive); | 843 | ide_hwif_t *hwif = HWIF(drive); |
844 | struct pci_dev *dev = to_pci_dev(hwif->dev); | 844 | struct pci_dev *dev = to_pci_dev(hwif->dev); |
@@ -862,7 +862,7 @@ static int hpt374_ide_dma_test_irq(ide_drive_t *drive) | |||
862 | return 0; | 862 | return 0; |
863 | } | 863 | } |
864 | 864 | ||
865 | static int hpt374_ide_dma_end(ide_drive_t *drive) | 865 | static int hpt374_dma_end(ide_drive_t *drive) |
866 | { | 866 | { |
867 | ide_hwif_t *hwif = HWIF(drive); | 867 | ide_hwif_t *hwif = HWIF(drive); |
868 | struct pci_dev *dev = to_pci_dev(hwif->dev); | 868 | struct pci_dev *dev = to_pci_dev(hwif->dev); |
@@ -1312,19 +1312,6 @@ static void __devinit init_hwif_hpt366(ide_hwif_t *hwif) | |||
1312 | 1312 | ||
1313 | if (new_mcr != old_mcr) | 1313 | if (new_mcr != old_mcr) |
1314 | pci_write_config_byte(dev, hwif->select_data + 1, new_mcr); | 1314 | pci_write_config_byte(dev, hwif->select_data + 1, new_mcr); |
1315 | |||
1316 | if (hwif->dma_base == 0) | ||
1317 | return; | ||
1318 | |||
1319 | if (chip_type >= HPT374) { | ||
1320 | hwif->ide_dma_test_irq = &hpt374_ide_dma_test_irq; | ||
1321 | hwif->ide_dma_end = &hpt374_ide_dma_end; | ||
1322 | } else if (chip_type >= HPT370) { | ||
1323 | hwif->dma_start = &hpt370_ide_dma_start; | ||
1324 | hwif->ide_dma_end = &hpt370_ide_dma_end; | ||
1325 | hwif->dma_timeout = &hpt370_dma_timeout; | ||
1326 | } else | ||
1327 | hwif->dma_lost_irq = &hpt366_dma_lost_irq; | ||
1328 | } | 1315 | } |
1329 | 1316 | ||
1330 | static int __devinit init_dma_hpt366(ide_hwif_t *hwif, | 1317 | static int __devinit init_dma_hpt366(ide_hwif_t *hwif, |
@@ -1360,7 +1347,7 @@ static int __devinit init_dma_hpt366(ide_hwif_t *hwif, | |||
1360 | if (ide_allocate_dma_engine(hwif)) | 1347 | if (ide_allocate_dma_engine(hwif)) |
1361 | return -1; | 1348 | return -1; |
1362 | 1349 | ||
1363 | ide_setup_dma(hwif, base); | 1350 | ide_setup_dma(hwif, base, d); |
1364 | 1351 | ||
1365 | return 0; | 1352 | return 0; |
1366 | } | 1353 | } |
@@ -1428,6 +1415,21 @@ static const struct ide_port_ops hpt3xx_port_ops = { | |||
1428 | .cable_detect = hpt3xx_cable_detect, | 1415 | .cable_detect = hpt3xx_cable_detect, |
1429 | }; | 1416 | }; |
1430 | 1417 | ||
1418 | static struct ide_dma_ops hpt37x_dma_ops = { | ||
1419 | .dma_end = hpt374_dma_end, | ||
1420 | .dma_test_irq = hpt374_dma_test_irq, | ||
1421 | }; | ||
1422 | |||
1423 | static struct ide_dma_ops hpt370_dma_ops = { | ||
1424 | .dma_start = hpt370_dma_start, | ||
1425 | .dma_end = hpt370_dma_end, | ||
1426 | .dma_timeout = hpt370_dma_timeout, | ||
1427 | }; | ||
1428 | |||
1429 | static struct ide_dma_ops hpt36x_dma_ops = { | ||
1430 | .dma_lost_irq = hpt366_dma_lost_irq, | ||
1431 | }; | ||
1432 | |||
1431 | static const struct ide_port_info hpt366_chipsets[] __devinitdata = { | 1433 | static const struct ide_port_info hpt366_chipsets[] __devinitdata = { |
1432 | { /* 0 */ | 1434 | { /* 0 */ |
1433 | .name = "HPT36x", | 1435 | .name = "HPT36x", |
@@ -1442,6 +1444,7 @@ static const struct ide_port_info hpt366_chipsets[] __devinitdata = { | |||
1442 | */ | 1444 | */ |
1443 | .enablebits = {{0x50,0x10,0x10}, {0x54,0x04,0x04}}, | 1445 | .enablebits = {{0x50,0x10,0x10}, {0x54,0x04,0x04}}, |
1444 | .port_ops = &hpt3xx_port_ops, | 1446 | .port_ops = &hpt3xx_port_ops, |
1447 | .dma_ops = &hpt36x_dma_ops, | ||
1445 | .host_flags = IDE_HFLAGS_HPT3XX | IDE_HFLAG_SINGLE, | 1448 | .host_flags = IDE_HFLAGS_HPT3XX | IDE_HFLAG_SINGLE, |
1446 | .pio_mask = ATA_PIO4, | 1449 | .pio_mask = ATA_PIO4, |
1447 | .mwdma_mask = ATA_MWDMA2, | 1450 | .mwdma_mask = ATA_MWDMA2, |
@@ -1452,6 +1455,7 @@ static const struct ide_port_info hpt366_chipsets[] __devinitdata = { | |||
1452 | .init_dma = init_dma_hpt366, | 1455 | .init_dma = init_dma_hpt366, |
1453 | .enablebits = {{0x50,0x04,0x04}, {0x54,0x04,0x04}}, | 1456 | .enablebits = {{0x50,0x04,0x04}, {0x54,0x04,0x04}}, |
1454 | .port_ops = &hpt3xx_port_ops, | 1457 | .port_ops = &hpt3xx_port_ops, |
1458 | .dma_ops = &hpt37x_dma_ops, | ||
1455 | .host_flags = IDE_HFLAGS_HPT3XX, | 1459 | .host_flags = IDE_HFLAGS_HPT3XX, |
1456 | .pio_mask = ATA_PIO4, | 1460 | .pio_mask = ATA_PIO4, |
1457 | .mwdma_mask = ATA_MWDMA2, | 1461 | .mwdma_mask = ATA_MWDMA2, |
@@ -1462,6 +1466,7 @@ static const struct ide_port_info hpt366_chipsets[] __devinitdata = { | |||
1462 | .init_dma = init_dma_hpt366, | 1466 | .init_dma = init_dma_hpt366, |
1463 | .enablebits = {{0x50,0x04,0x04}, {0x54,0x04,0x04}}, | 1467 | .enablebits = {{0x50,0x04,0x04}, {0x54,0x04,0x04}}, |
1464 | .port_ops = &hpt3xx_port_ops, | 1468 | .port_ops = &hpt3xx_port_ops, |
1469 | .dma_ops = &hpt37x_dma_ops, | ||
1465 | .host_flags = IDE_HFLAGS_HPT3XX, | 1470 | .host_flags = IDE_HFLAGS_HPT3XX, |
1466 | .pio_mask = ATA_PIO4, | 1471 | .pio_mask = ATA_PIO4, |
1467 | .mwdma_mask = ATA_MWDMA2, | 1472 | .mwdma_mask = ATA_MWDMA2, |
@@ -1472,6 +1477,7 @@ static const struct ide_port_info hpt366_chipsets[] __devinitdata = { | |||
1472 | .init_dma = init_dma_hpt366, | 1477 | .init_dma = init_dma_hpt366, |
1473 | .enablebits = {{0x50,0x04,0x04}, {0x54,0x04,0x04}}, | 1478 | .enablebits = {{0x50,0x04,0x04}, {0x54,0x04,0x04}}, |
1474 | .port_ops = &hpt3xx_port_ops, | 1479 | .port_ops = &hpt3xx_port_ops, |
1480 | .dma_ops = &hpt37x_dma_ops, | ||
1475 | .host_flags = IDE_HFLAGS_HPT3XX, | 1481 | .host_flags = IDE_HFLAGS_HPT3XX, |
1476 | .pio_mask = ATA_PIO4, | 1482 | .pio_mask = ATA_PIO4, |
1477 | .mwdma_mask = ATA_MWDMA2, | 1483 | .mwdma_mask = ATA_MWDMA2, |
@@ -1483,6 +1489,7 @@ static const struct ide_port_info hpt366_chipsets[] __devinitdata = { | |||
1483 | .enablebits = {{0x50,0x04,0x04}, {0x54,0x04,0x04}}, | 1489 | .enablebits = {{0x50,0x04,0x04}, {0x54,0x04,0x04}}, |
1484 | .udma_mask = ATA_UDMA5, | 1490 | .udma_mask = ATA_UDMA5, |
1485 | .port_ops = &hpt3xx_port_ops, | 1491 | .port_ops = &hpt3xx_port_ops, |
1492 | .dma_ops = &hpt37x_dma_ops, | ||
1486 | .host_flags = IDE_HFLAGS_HPT3XX, | 1493 | .host_flags = IDE_HFLAGS_HPT3XX, |
1487 | .pio_mask = ATA_PIO4, | 1494 | .pio_mask = ATA_PIO4, |
1488 | .mwdma_mask = ATA_MWDMA2, | 1495 | .mwdma_mask = ATA_MWDMA2, |
@@ -1493,6 +1500,7 @@ static const struct ide_port_info hpt366_chipsets[] __devinitdata = { | |||
1493 | .init_dma = init_dma_hpt366, | 1500 | .init_dma = init_dma_hpt366, |
1494 | .enablebits = {{0x50,0x04,0x04}, {0x54,0x04,0x04}}, | 1501 | .enablebits = {{0x50,0x04,0x04}, {0x54,0x04,0x04}}, |
1495 | .port_ops = &hpt3xx_port_ops, | 1502 | .port_ops = &hpt3xx_port_ops, |
1503 | .dma_ops = &hpt37x_dma_ops, | ||
1496 | .host_flags = IDE_HFLAGS_HPT3XX, | 1504 | .host_flags = IDE_HFLAGS_HPT3XX, |
1497 | .pio_mask = ATA_PIO4, | 1505 | .pio_mask = ATA_PIO4, |
1498 | .mwdma_mask = ATA_MWDMA2, | 1506 | .mwdma_mask = ATA_MWDMA2, |
@@ -1555,6 +1563,10 @@ static int __devinit hpt366_init_one(struct pci_dev *dev, const struct pci_devic | |||
1555 | d.name = info->chip_name; | 1563 | d.name = info->chip_name; |
1556 | d.udma_mask = info->udma_mask; | 1564 | d.udma_mask = info->udma_mask; |
1557 | 1565 | ||
1566 | /* fixup ->dma_ops for HPT370/HPT370A */ | ||
1567 | if (info == &hpt370 || info == &hpt370a) | ||
1568 | d.dma_ops = &hpt370_dma_ops; | ||
1569 | |||
1558 | pci_set_drvdata(dev, (void *)info); | 1570 | pci_set_drvdata(dev, (void *)info); |
1559 | 1571 | ||
1560 | if (info == &hpt36x || info == &hpt374) | 1572 | if (info == &hpt36x || info == &hpt374) |
diff --git a/drivers/ide/pci/it821x.c b/drivers/ide/pci/it821x.c index 7f4db1c0a4fc..6ab04115286b 100644 --- a/drivers/ide/pci/it821x.c +++ b/drivers/ide/pci/it821x.c | |||
@@ -511,6 +511,11 @@ static void __devinit it821x_quirkproc(ide_drive_t *drive) | |||
511 | 511 | ||
512 | } | 512 | } |
513 | 513 | ||
514 | static struct ide_dma_ops it821x_pass_through_dma_ops = { | ||
515 | .dma_start = it821x_dma_start, | ||
516 | .dma_end = it821x_dma_end, | ||
517 | }; | ||
518 | |||
514 | /** | 519 | /** |
515 | * init_hwif_it821x - set up hwif structs | 520 | * init_hwif_it821x - set up hwif structs |
516 | * @hwif: interface to set up | 521 | * @hwif: interface to set up |
@@ -562,8 +567,7 @@ static void __devinit init_hwif_it821x(ide_hwif_t *hwif) | |||
562 | 567 | ||
563 | if (idev->smart == 0) { | 568 | if (idev->smart == 0) { |
564 | /* MWDMA/PIO clock switching for pass through mode */ | 569 | /* MWDMA/PIO clock switching for pass through mode */ |
565 | hwif->dma_start = &it821x_dma_start; | 570 | hwif->dma_ops = &it821x_pass_through_dma_ops; |
566 | hwif->ide_dma_end = &it821x_dma_end; | ||
567 | } else | 571 | } else |
568 | hwif->host_flags |= IDE_HFLAG_NO_SET_MODE; | 572 | hwif->host_flags |= IDE_HFLAG_NO_SET_MODE; |
569 | 573 | ||
diff --git a/drivers/ide/pci/ns87415.c b/drivers/ide/pci/ns87415.c index 332de832f171..5a6dec0e1f4d 100644 --- a/drivers/ide/pci/ns87415.c +++ b/drivers/ide/pci/ns87415.c | |||
@@ -150,7 +150,7 @@ static void ns87415_selectproc (ide_drive_t *drive) | |||
150 | ns87415_prepare_drive (drive, drive->using_dma); | 150 | ns87415_prepare_drive (drive, drive->using_dma); |
151 | } | 151 | } |
152 | 152 | ||
153 | static int ns87415_ide_dma_end (ide_drive_t *drive) | 153 | static int ns87415_dma_end(ide_drive_t *drive) |
154 | { | 154 | { |
155 | ide_hwif_t *hwif = HWIF(drive); | 155 | ide_hwif_t *hwif = HWIF(drive); |
156 | u8 dma_stat = 0, dma_cmd = 0; | 156 | u8 dma_stat = 0, dma_cmd = 0; |
@@ -170,7 +170,7 @@ static int ns87415_ide_dma_end (ide_drive_t *drive) | |||
170 | return (dma_stat & 7) != 4; | 170 | return (dma_stat & 7) != 4; |
171 | } | 171 | } |
172 | 172 | ||
173 | static int ns87415_ide_dma_setup(ide_drive_t *drive) | 173 | static int ns87415_dma_setup(ide_drive_t *drive) |
174 | { | 174 | { |
175 | /* select DMA xfer */ | 175 | /* select DMA xfer */ |
176 | ns87415_prepare_drive(drive, 1); | 176 | ns87415_prepare_drive(drive, 1); |
@@ -252,14 +252,17 @@ static void __devinit init_hwif_ns87415 (ide_hwif_t *hwif) | |||
252 | return; | 252 | return; |
253 | 253 | ||
254 | outb(0x60, hwif->dma_status); | 254 | outb(0x60, hwif->dma_status); |
255 | hwif->dma_setup = &ns87415_ide_dma_setup; | ||
256 | hwif->ide_dma_end = &ns87415_ide_dma_end; | ||
257 | } | 255 | } |
258 | 256 | ||
259 | static const struct ide_port_ops ns87415_port_ops = { | 257 | static const struct ide_port_ops ns87415_port_ops = { |
260 | .selectproc = ns87415_selectproc, | 258 | .selectproc = ns87415_selectproc, |
261 | }; | 259 | }; |
262 | 260 | ||
261 | static struct ide_dma_ops ns87415_dma_ops = { | ||
262 | .dma_setup = ns87415_dma_setup, | ||
263 | .dma_end = ns87415_dma_end, | ||
264 | }; | ||
265 | |||
263 | static const struct ide_port_info ns87415_chipset __devinitdata = { | 266 | static const struct ide_port_info ns87415_chipset __devinitdata = { |
264 | .name = "NS87415", | 267 | .name = "NS87415", |
265 | #ifdef CONFIG_SUPERIO | 268 | #ifdef CONFIG_SUPERIO |
@@ -267,6 +270,7 @@ static const struct ide_port_info ns87415_chipset __devinitdata = { | |||
267 | #endif | 270 | #endif |
268 | .init_hwif = init_hwif_ns87415, | 271 | .init_hwif = init_hwif_ns87415, |
269 | .port_ops = &ns87415_port_ops, | 272 | .port_ops = &ns87415_port_ops, |
273 | .dma_ops = &ns87415_dma_ops, | ||
270 | .host_flags = IDE_HFLAG_TRUST_BIOS_FOR_DMA | | 274 | .host_flags = IDE_HFLAG_TRUST_BIOS_FOR_DMA | |
271 | IDE_HFLAG_NO_ATAPI_DMA, | 275 | IDE_HFLAG_NO_ATAPI_DMA, |
272 | }; | 276 | }; |
diff --git a/drivers/ide/pci/pdc202xx_old.c b/drivers/ide/pci/pdc202xx_old.c index 24e440de4c80..9c490fd63fde 100644 --- a/drivers/ide/pci/pdc202xx_old.c +++ b/drivers/ide/pci/pdc202xx_old.c | |||
@@ -163,7 +163,7 @@ static void pdc202xx_quirkproc(ide_drive_t *drive) | |||
163 | drive->quirk_list = 0; | 163 | drive->quirk_list = 0; |
164 | } | 164 | } |
165 | 165 | ||
166 | static void pdc202xx_old_ide_dma_start(ide_drive_t *drive) | 166 | static void pdc202xx_dma_start(ide_drive_t *drive) |
167 | { | 167 | { |
168 | if (drive->current_speed > XFER_UDMA_2) | 168 | if (drive->current_speed > XFER_UDMA_2) |
169 | pdc_old_enable_66MHz_clock(drive->hwif); | 169 | pdc_old_enable_66MHz_clock(drive->hwif); |
@@ -185,7 +185,7 @@ static void pdc202xx_old_ide_dma_start(ide_drive_t *drive) | |||
185 | ide_dma_start(drive); | 185 | ide_dma_start(drive); |
186 | } | 186 | } |
187 | 187 | ||
188 | static int pdc202xx_old_ide_dma_end(ide_drive_t *drive) | 188 | static int pdc202xx_dma_end(ide_drive_t *drive) |
189 | { | 189 | { |
190 | if (drive->media != ide_disk || drive->addressing == 1) { | 190 | if (drive->media != ide_disk || drive->addressing == 1) { |
191 | ide_hwif_t *hwif = HWIF(drive); | 191 | ide_hwif_t *hwif = HWIF(drive); |
@@ -202,7 +202,7 @@ static int pdc202xx_old_ide_dma_end(ide_drive_t *drive) | |||
202 | return __ide_dma_end(drive); | 202 | return __ide_dma_end(drive); |
203 | } | 203 | } |
204 | 204 | ||
205 | static int pdc202xx_old_ide_dma_test_irq(ide_drive_t *drive) | 205 | static int pdc202xx_dma_test_irq(ide_drive_t *drive) |
206 | { | 206 | { |
207 | ide_hwif_t *hwif = HWIF(drive); | 207 | ide_hwif_t *hwif = HWIF(drive); |
208 | unsigned long high_16 = hwif->extra_base - 16; | 208 | unsigned long high_16 = hwif->extra_base - 16; |
@@ -263,23 +263,6 @@ static void pdc202xx_dma_timeout(ide_drive_t *drive) | |||
263 | ide_dma_timeout(drive); | 263 | ide_dma_timeout(drive); |
264 | } | 264 | } |
265 | 265 | ||
266 | static void __devinit init_hwif_pdc202xx(ide_hwif_t *hwif) | ||
267 | { | ||
268 | struct pci_dev *dev = to_pci_dev(hwif->dev); | ||
269 | |||
270 | if (hwif->dma_base == 0) | ||
271 | return; | ||
272 | |||
273 | hwif->dma_lost_irq = &pdc202xx_dma_lost_irq; | ||
274 | hwif->dma_timeout = &pdc202xx_dma_timeout; | ||
275 | |||
276 | if (dev->device != PCI_DEVICE_ID_PROMISE_20246) { | ||
277 | hwif->dma_start = &pdc202xx_old_ide_dma_start; | ||
278 | hwif->ide_dma_end = &pdc202xx_old_ide_dma_end; | ||
279 | } | ||
280 | hwif->ide_dma_test_irq = &pdc202xx_old_ide_dma_test_irq; | ||
281 | } | ||
282 | |||
283 | static unsigned int __devinit init_chipset_pdc202xx(struct pci_dev *dev, | 266 | static unsigned int __devinit init_chipset_pdc202xx(struct pci_dev *dev, |
284 | const char *name) | 267 | const char *name) |
285 | { | 268 | { |
@@ -346,12 +329,26 @@ static const struct ide_port_ops pdc2026x_port_ops = { | |||
346 | .cable_detect = pdc2026x_cable_detect, | 329 | .cable_detect = pdc2026x_cable_detect, |
347 | }; | 330 | }; |
348 | 331 | ||
332 | static struct ide_dma_ops pdc20246_dma_ops = { | ||
333 | .dma_test_irq = pdc202xx_dma_test_irq, | ||
334 | .dma_lost_irq = pdc202xx_dma_lost_irq, | ||
335 | .dma_timeout = pdc202xx_dma_timeout, | ||
336 | }; | ||
337 | |||
338 | static struct ide_dma_ops pdc2026x_dma_ops = { | ||
339 | .dma_start = pdc202xx_dma_start, | ||
340 | .dma_end = pdc202xx_dma_end, | ||
341 | .dma_test_irq = pdc202xx_dma_test_irq, | ||
342 | .dma_lost_irq = pdc202xx_dma_lost_irq, | ||
343 | .dma_timeout = pdc202xx_dma_timeout, | ||
344 | }; | ||
345 | |||
349 | #define DECLARE_PDC2026X_DEV(name_str, udma, extra_flags) \ | 346 | #define DECLARE_PDC2026X_DEV(name_str, udma, extra_flags) \ |
350 | { \ | 347 | { \ |
351 | .name = name_str, \ | 348 | .name = name_str, \ |
352 | .init_chipset = init_chipset_pdc202xx, \ | 349 | .init_chipset = init_chipset_pdc202xx, \ |
353 | .init_hwif = init_hwif_pdc202xx, \ | ||
354 | .port_ops = &pdc2026x_port_ops, \ | 350 | .port_ops = &pdc2026x_port_ops, \ |
351 | .dma_ops = &pdc2026x_dma_ops, \ | ||
355 | .host_flags = IDE_HFLAGS_PDC202XX | extra_flags, \ | 352 | .host_flags = IDE_HFLAGS_PDC202XX | extra_flags, \ |
356 | .pio_mask = ATA_PIO4, \ | 353 | .pio_mask = ATA_PIO4, \ |
357 | .mwdma_mask = ATA_MWDMA2, \ | 354 | .mwdma_mask = ATA_MWDMA2, \ |
@@ -362,8 +359,8 @@ static const struct ide_port_info pdc202xx_chipsets[] __devinitdata = { | |||
362 | { /* 0 */ | 359 | { /* 0 */ |
363 | .name = "PDC20246", | 360 | .name = "PDC20246", |
364 | .init_chipset = init_chipset_pdc202xx, | 361 | .init_chipset = init_chipset_pdc202xx, |
365 | .init_hwif = init_hwif_pdc202xx, | ||
366 | .port_ops = &pdc20246_port_ops, | 362 | .port_ops = &pdc20246_port_ops, |
363 | .dma_ops = &pdc20246_dma_ops, | ||
367 | .host_flags = IDE_HFLAGS_PDC202XX, | 364 | .host_flags = IDE_HFLAGS_PDC202XX, |
368 | .pio_mask = ATA_PIO4, | 365 | .pio_mask = ATA_PIO4, |
369 | .mwdma_mask = ATA_MWDMA2, | 366 | .mwdma_mask = ATA_MWDMA2, |
diff --git a/drivers/ide/pci/sc1200.c b/drivers/ide/pci/sc1200.c index 0c144770a8da..303bcfb2a441 100644 --- a/drivers/ide/pci/sc1200.c +++ b/drivers/ide/pci/sc1200.c | |||
@@ -165,7 +165,7 @@ static void sc1200_set_dma_mode(ide_drive_t *drive, const u8 mode) | |||
165 | * | 165 | * |
166 | * returns 1 on error, 0 otherwise | 166 | * returns 1 on error, 0 otherwise |
167 | */ | 167 | */ |
168 | static int sc1200_ide_dma_end (ide_drive_t *drive) | 168 | static int sc1200_dma_end(ide_drive_t *drive) |
169 | { | 169 | { |
170 | ide_hwif_t *hwif = HWIF(drive); | 170 | ide_hwif_t *hwif = HWIF(drive); |
171 | unsigned long dma_base = hwif->dma_base; | 171 | unsigned long dma_base = hwif->dma_base; |
@@ -214,7 +214,7 @@ static void sc1200_set_pio_mode(ide_drive_t *drive, const u8 pio) | |||
214 | printk("SC1200: %s: changing (U)DMA mode\n", drive->name); | 214 | printk("SC1200: %s: changing (U)DMA mode\n", drive->name); |
215 | ide_dma_off_quietly(drive); | 215 | ide_dma_off_quietly(drive); |
216 | if (ide_set_dma_mode(drive, mode) == 0 && drive->using_dma) | 216 | if (ide_set_dma_mode(drive, mode) == 0 && drive->using_dma) |
217 | hwif->dma_host_set(drive, 1); | 217 | hwif->dma_ops->dma_host_set(drive, 1); |
218 | return; | 218 | return; |
219 | } | 219 | } |
220 | 220 | ||
@@ -286,28 +286,20 @@ static int sc1200_resume (struct pci_dev *dev) | |||
286 | } | 286 | } |
287 | #endif | 287 | #endif |
288 | 288 | ||
289 | /* | ||
290 | * This gets invoked by the IDE driver once for each channel, | ||
291 | * and performs channel-specific pre-initialization before drive probing. | ||
292 | */ | ||
293 | static void __devinit init_hwif_sc1200 (ide_hwif_t *hwif) | ||
294 | { | ||
295 | if (hwif->dma_base == 0) | ||
296 | return; | ||
297 | |||
298 | hwif->ide_dma_end = &sc1200_ide_dma_end; | ||
299 | } | ||
300 | |||
301 | static const struct ide_port_ops sc1200_port_ops = { | 289 | static const struct ide_port_ops sc1200_port_ops = { |
302 | .set_pio_mode = sc1200_set_pio_mode, | 290 | .set_pio_mode = sc1200_set_pio_mode, |
303 | .set_dma_mode = sc1200_set_dma_mode, | 291 | .set_dma_mode = sc1200_set_dma_mode, |
304 | .udma_filter = sc1200_udma_filter, | 292 | .udma_filter = sc1200_udma_filter, |
305 | }; | 293 | }; |
306 | 294 | ||
295 | static struct ide_dma_ops sc1200_dma_ops = { | ||
296 | .dma_end = sc1200_dma_end, | ||
297 | }; | ||
298 | |||
307 | static const struct ide_port_info sc1200_chipset __devinitdata = { | 299 | static const struct ide_port_info sc1200_chipset __devinitdata = { |
308 | .name = "SC1200", | 300 | .name = "SC1200", |
309 | .init_hwif = init_hwif_sc1200, | ||
310 | .port_ops = &sc1200_port_ops, | 301 | .port_ops = &sc1200_port_ops, |
302 | .dma_ops = &sc1200_dma_ops, | ||
311 | .host_flags = IDE_HFLAG_SERIALIZE | | 303 | .host_flags = IDE_HFLAG_SERIALIZE | |
312 | IDE_HFLAG_POST_SET_MODE | | 304 | IDE_HFLAG_POST_SET_MODE | |
313 | IDE_HFLAG_ABUSE_DMA_MODES, | 305 | IDE_HFLAG_ABUSE_DMA_MODES, |
diff --git a/drivers/ide/pci/scc_pata.c b/drivers/ide/pci/scc_pata.c index c30b0c44c705..5117c11134cd 100644 --- a/drivers/ide/pci/scc_pata.c +++ b/drivers/ide/pci/scc_pata.c | |||
@@ -317,14 +317,14 @@ static int scc_dma_setup(ide_drive_t *drive) | |||
317 | 317 | ||
318 | 318 | ||
319 | /** | 319 | /** |
320 | * scc_ide_dma_end - Stop DMA | 320 | * scc_dma_end - Stop DMA |
321 | * @drive: IDE drive | 321 | * @drive: IDE drive |
322 | * | 322 | * |
323 | * Check and clear INT Status register. | 323 | * Check and clear INT Status register. |
324 | * Then call __ide_dma_end(). | 324 | * Then call __ide_dma_end(). |
325 | */ | 325 | */ |
326 | 326 | ||
327 | static int scc_ide_dma_end(ide_drive_t * drive) | 327 | static int scc_dma_end(ide_drive_t *drive) |
328 | { | 328 | { |
329 | ide_hwif_t *hwif = HWIF(drive); | 329 | ide_hwif_t *hwif = HWIF(drive); |
330 | unsigned long intsts_port = hwif->dma_base + 0x014; | 330 | unsigned long intsts_port = hwif->dma_base + 0x014; |
@@ -692,10 +692,6 @@ static void __devinit init_hwif_scc(ide_hwif_t *hwif) | |||
692 | /* PTERADD */ | 692 | /* PTERADD */ |
693 | out_be32((void __iomem *)(hwif->dma_base + 0x018), hwif->dmatable_dma); | 693 | out_be32((void __iomem *)(hwif->dma_base + 0x018), hwif->dmatable_dma); |
694 | 694 | ||
695 | hwif->dma_setup = scc_dma_setup; | ||
696 | hwif->ide_dma_end = scc_ide_dma_end; | ||
697 | hwif->ide_dma_test_irq = scc_dma_test_irq; | ||
698 | |||
699 | if (in_be32((void __iomem *)(hwif->config_data + 0xff0)) & CCKCTRL_ATACLKOEN) | 695 | if (in_be32((void __iomem *)(hwif->config_data + 0xff0)) & CCKCTRL_ATACLKOEN) |
700 | hwif->ultra_mask = ATA_UDMA6; /* 133MHz */ | 696 | hwif->ultra_mask = ATA_UDMA6; /* 133MHz */ |
701 | else | 697 | else |
@@ -709,12 +705,19 @@ static const struct ide_port_ops scc_port_ops = { | |||
709 | .cable_detect = scc_cable_detect, | 705 | .cable_detect = scc_cable_detect, |
710 | }; | 706 | }; |
711 | 707 | ||
708 | static struct ide_dma_ops scc_dma_ops = { | ||
709 | .dma_setup = scc_dma_setup, | ||
710 | .dma_end = scc_dma_end, | ||
711 | .dma_test_irq = scc_dma_test_irq, | ||
712 | }; | ||
713 | |||
712 | #define DECLARE_SCC_DEV(name_str) \ | 714 | #define DECLARE_SCC_DEV(name_str) \ |
713 | { \ | 715 | { \ |
714 | .name = name_str, \ | 716 | .name = name_str, \ |
715 | .init_iops = init_iops_scc, \ | 717 | .init_iops = init_iops_scc, \ |
716 | .init_hwif = init_hwif_scc, \ | 718 | .init_hwif = init_hwif_scc, \ |
717 | .port_ops = &scc_port_ops, \ | 719 | .port_ops = &scc_port_ops, \ |
720 | .dma_ops = &scc_dma_ops, \ | ||
718 | .host_flags = IDE_HFLAG_SINGLE, \ | 721 | .host_flags = IDE_HFLAG_SINGLE, \ |
719 | .pio_mask = ATA_PIO4, \ | 722 | .pio_mask = ATA_PIO4, \ |
720 | } | 723 | } |
diff --git a/drivers/ide/pci/sgiioc4.c b/drivers/ide/pci/sgiioc4.c index 47d6e0492dda..2cbb7fd1ddec 100644 --- a/drivers/ide/pci/sgiioc4.c +++ b/drivers/ide/pci/sgiioc4.c | |||
@@ -188,7 +188,7 @@ sgiioc4_clearirq(ide_drive_t * drive) | |||
188 | return intr_reg & 3; | 188 | return intr_reg & 3; |
189 | } | 189 | } |
190 | 190 | ||
191 | static void sgiioc4_ide_dma_start(ide_drive_t * drive) | 191 | static void sgiioc4_dma_start(ide_drive_t *drive) |
192 | { | 192 | { |
193 | ide_hwif_t *hwif = HWIF(drive); | 193 | ide_hwif_t *hwif = HWIF(drive); |
194 | unsigned long ioc4_dma_addr = hwif->dma_base + IOC4_DMA_CTRL * 4; | 194 | unsigned long ioc4_dma_addr = hwif->dma_base + IOC4_DMA_CTRL * 4; |
@@ -215,8 +215,7 @@ sgiioc4_ide_dma_stop(ide_hwif_t *hwif, u64 dma_base) | |||
215 | } | 215 | } |
216 | 216 | ||
217 | /* Stops the IOC4 DMA Engine */ | 217 | /* Stops the IOC4 DMA Engine */ |
218 | static int | 218 | static int sgiioc4_dma_end(ide_drive_t *drive) |
219 | sgiioc4_ide_dma_end(ide_drive_t * drive) | ||
220 | { | 219 | { |
221 | u32 ioc4_dma, bc_dev, bc_mem, num, valid = 0, cnt = 0; | 220 | u32 ioc4_dma, bc_dev, bc_mem, num, valid = 0, cnt = 0; |
222 | ide_hwif_t *hwif = HWIF(drive); | 221 | ide_hwif_t *hwif = HWIF(drive); |
@@ -279,8 +278,7 @@ static void sgiioc4_set_dma_mode(ide_drive_t *drive, const u8 speed) | |||
279 | } | 278 | } |
280 | 279 | ||
281 | /* returns 1 if dma irq issued, 0 otherwise */ | 280 | /* returns 1 if dma irq issued, 0 otherwise */ |
282 | static int | 281 | static int sgiioc4_dma_test_irq(ide_drive_t *drive) |
283 | sgiioc4_ide_dma_test_irq(ide_drive_t * drive) | ||
284 | { | 282 | { |
285 | return sgiioc4_checkirq(HWIF(drive)); | 283 | return sgiioc4_checkirq(HWIF(drive)); |
286 | } | 284 | } |
@@ -294,7 +292,7 @@ static void sgiioc4_dma_host_set(ide_drive_t *drive, int on) | |||
294 | static void | 292 | static void |
295 | sgiioc4_resetproc(ide_drive_t * drive) | 293 | sgiioc4_resetproc(ide_drive_t * drive) |
296 | { | 294 | { |
297 | sgiioc4_ide_dma_end(drive); | 295 | sgiioc4_dma_end(drive); |
298 | sgiioc4_clearirq(drive); | 296 | sgiioc4_clearirq(drive); |
299 | } | 297 | } |
300 | 298 | ||
@@ -327,8 +325,6 @@ sgiioc4_INB(unsigned long port) | |||
327 | return reg; | 325 | return reg; |
328 | } | 326 | } |
329 | 327 | ||
330 | static void __devinit ide_init_sgiioc4(ide_hwif_t *); | ||
331 | |||
332 | /* Creates a dma map for the scatter-gather list entries */ | 328 | /* Creates a dma map for the scatter-gather list entries */ |
333 | static int __devinit | 329 | static int __devinit |
334 | ide_dma_sgiioc4(ide_hwif_t *hwif, const struct ide_port_info *d) | 330 | ide_dma_sgiioc4(ide_hwif_t *hwif, const struct ide_port_info *d) |
@@ -377,7 +373,6 @@ ide_dma_sgiioc4(ide_hwif_t *hwif, const struct ide_port_info *d) | |||
377 | 373 | ||
378 | if (pad) { | 374 | if (pad) { |
379 | ide_set_hwifdata(hwif, pad); | 375 | ide_set_hwifdata(hwif, pad); |
380 | ide_init_sgiioc4(hwif); | ||
381 | return 0; | 376 | return 0; |
382 | } | 377 | } |
383 | 378 | ||
@@ -526,7 +521,7 @@ use_pio_instead: | |||
526 | return 0; /* revert to PIO for this request */ | 521 | return 0; /* revert to PIO for this request */ |
527 | } | 522 | } |
528 | 523 | ||
529 | static int sgiioc4_ide_dma_setup(ide_drive_t *drive) | 524 | static int sgiioc4_dma_setup(ide_drive_t *drive) |
530 | { | 525 | { |
531 | struct request *rq = HWGROUP(drive)->rq; | 526 | struct request *rq = HWGROUP(drive)->rq; |
532 | unsigned int count = 0; | 527 | unsigned int count = 0; |
@@ -555,18 +550,6 @@ static int sgiioc4_ide_dma_setup(ide_drive_t *drive) | |||
555 | return 0; | 550 | return 0; |
556 | } | 551 | } |
557 | 552 | ||
558 | static void __devinit | ||
559 | ide_init_sgiioc4(ide_hwif_t * hwif) | ||
560 | { | ||
561 | hwif->dma_host_set = &sgiioc4_dma_host_set; | ||
562 | hwif->dma_setup = &sgiioc4_ide_dma_setup; | ||
563 | hwif->dma_start = &sgiioc4_ide_dma_start; | ||
564 | hwif->ide_dma_end = &sgiioc4_ide_dma_end; | ||
565 | hwif->ide_dma_test_irq = &sgiioc4_ide_dma_test_irq; | ||
566 | hwif->dma_lost_irq = &sgiioc4_dma_lost_irq; | ||
567 | hwif->dma_timeout = &ide_dma_timeout; | ||
568 | } | ||
569 | |||
570 | static const struct ide_port_ops sgiioc4_port_ops = { | 553 | static const struct ide_port_ops sgiioc4_port_ops = { |
571 | .set_dma_mode = sgiioc4_set_dma_mode, | 554 | .set_dma_mode = sgiioc4_set_dma_mode, |
572 | /* reset DMA engine, clear IRQs */ | 555 | /* reset DMA engine, clear IRQs */ |
@@ -575,10 +558,21 @@ static const struct ide_port_ops sgiioc4_port_ops = { | |||
575 | .maskproc = sgiioc4_maskproc, | 558 | .maskproc = sgiioc4_maskproc, |
576 | }; | 559 | }; |
577 | 560 | ||
561 | static struct ide_dma_ops sgiioc4_dma_ops = { | ||
562 | .dma_host_set = sgiioc4_dma_host_set, | ||
563 | .dma_setup = sgiioc4_dma_setup, | ||
564 | .dma_start = sgiioc4_dma_start, | ||
565 | .dma_end = sgiioc4_dma_end, | ||
566 | .dma_test_irq = sgiioc4_dma_test_irq, | ||
567 | .dma_lost_irq = sgiioc4_dma_lost_irq, | ||
568 | .dma_timeout = ide_dma_timeout, | ||
569 | }; | ||
570 | |||
578 | static const struct ide_port_info sgiioc4_port_info __devinitdata = { | 571 | static const struct ide_port_info sgiioc4_port_info __devinitdata = { |
579 | .chipset = ide_pci, | 572 | .chipset = ide_pci, |
580 | .init_dma = ide_dma_sgiioc4, | 573 | .init_dma = ide_dma_sgiioc4, |
581 | .port_ops = &sgiioc4_port_ops, | 574 | .port_ops = &sgiioc4_port_ops, |
575 | .dma_ops = &sgiioc4_dma_ops, | ||
582 | .host_flags = IDE_HFLAG_NO_AUTOTUNE, | 576 | .host_flags = IDE_HFLAG_NO_AUTOTUNE, |
583 | .mwdma_mask = ATA_MWDMA2_ONLY, | 577 | .mwdma_mask = ATA_MWDMA2_ONLY, |
584 | }; | 578 | }; |
diff --git a/drivers/ide/pci/siimage.c b/drivers/ide/pci/siimage.c index faf5c3d6ab72..1fffea3211bd 100644 --- a/drivers/ide/pci/siimage.c +++ b/drivers/ide/pci/siimage.c | |||
@@ -301,7 +301,7 @@ static void sil_set_dma_mode(ide_drive_t *drive, const u8 speed) | |||
301 | } | 301 | } |
302 | 302 | ||
303 | /* returns 1 if dma irq issued, 0 otherwise */ | 303 | /* returns 1 if dma irq issued, 0 otherwise */ |
304 | static int siimage_io_ide_dma_test_irq (ide_drive_t *drive) | 304 | static int siimage_io_dma_test_irq(ide_drive_t *drive) |
305 | { | 305 | { |
306 | ide_hwif_t *hwif = HWIF(drive); | 306 | ide_hwif_t *hwif = HWIF(drive); |
307 | struct pci_dev *dev = to_pci_dev(hwif->dev); | 307 | struct pci_dev *dev = to_pci_dev(hwif->dev); |
@@ -320,14 +320,14 @@ static int siimage_io_ide_dma_test_irq (ide_drive_t *drive) | |||
320 | } | 320 | } |
321 | 321 | ||
322 | /** | 322 | /** |
323 | * siimage_mmio_ide_dma_test_irq - check we caused an IRQ | 323 | * siimage_mmio_dma_test_irq - check we caused an IRQ |
324 | * @drive: drive we are testing | 324 | * @drive: drive we are testing |
325 | * | 325 | * |
326 | * Check if we caused an IDE DMA interrupt. We may also have caused | 326 | * Check if we caused an IDE DMA interrupt. We may also have caused |
327 | * SATA status interrupts, if so we clean them up and continue. | 327 | * SATA status interrupts, if so we clean them up and continue. |
328 | */ | 328 | */ |
329 | 329 | ||
330 | static int siimage_mmio_ide_dma_test_irq (ide_drive_t *drive) | 330 | static int siimage_mmio_dma_test_irq(ide_drive_t *drive) |
331 | { | 331 | { |
332 | ide_hwif_t *hwif = HWIF(drive); | 332 | ide_hwif_t *hwif = HWIF(drive); |
333 | unsigned long addr = siimage_selreg(hwif, 0x1); | 333 | unsigned long addr = siimage_selreg(hwif, 0x1); |
@@ -369,6 +369,14 @@ static int siimage_mmio_ide_dma_test_irq (ide_drive_t *drive) | |||
369 | return 0; | 369 | return 0; |
370 | } | 370 | } |
371 | 371 | ||
372 | static int siimage_dma_test_irq(ide_drive_t *drive) | ||
373 | { | ||
374 | if (drive->hwif->mmio) | ||
375 | return siimage_mmio_dma_test_irq(drive); | ||
376 | else | ||
377 | return siimage_io_dma_test_irq(drive); | ||
378 | } | ||
379 | |||
372 | /** | 380 | /** |
373 | * sil_sata_reset_poll - wait for SATA reset | 381 | * sil_sata_reset_poll - wait for SATA reset |
374 | * @drive: drive we are resetting | 382 | * @drive: drive we are resetting |
@@ -756,41 +764,6 @@ static u8 __devinit sil_cable_detect(ide_hwif_t *hwif) | |||
756 | return (ata66 & 0x01) ? ATA_CBL_PATA80 : ATA_CBL_PATA40; | 764 | return (ata66 & 0x01) ? ATA_CBL_PATA80 : ATA_CBL_PATA40; |
757 | } | 765 | } |
758 | 766 | ||
759 | /** | ||
760 | * init_hwif_siimage - set up hwif structs | ||
761 | * @hwif: interface to set up | ||
762 | * | ||
763 | * We do the basic set up of the interface structure. The SIIMAGE | ||
764 | * requires several custom handlers so we override the default | ||
765 | * ide DMA handlers appropriately | ||
766 | */ | ||
767 | |||
768 | static void __devinit init_hwif_siimage(ide_hwif_t *hwif) | ||
769 | { | ||
770 | u8 sata = is_sata(hwif); | ||
771 | |||
772 | if (sata) { | ||
773 | static int first = 1; | ||
774 | |||
775 | if (first) { | ||
776 | printk(KERN_INFO "siimage: For full SATA support you should use the libata sata_sil module.\n"); | ||
777 | first = 0; | ||
778 | } | ||
779 | } | ||
780 | |||
781 | if (hwif->dma_base == 0) | ||
782 | return; | ||
783 | |||
784 | if (sata) | ||
785 | hwif->host_flags |= IDE_HFLAG_NO_ATAPI_DMA; | ||
786 | |||
787 | if (hwif->mmio) { | ||
788 | hwif->ide_dma_test_irq = &siimage_mmio_ide_dma_test_irq; | ||
789 | } else { | ||
790 | hwif->ide_dma_test_irq = & siimage_io_ide_dma_test_irq; | ||
791 | } | ||
792 | } | ||
793 | |||
794 | static const struct ide_port_ops sil_pata_port_ops = { | 767 | static const struct ide_port_ops sil_pata_port_ops = { |
795 | .set_pio_mode = sil_set_pio_mode, | 768 | .set_pio_mode = sil_set_pio_mode, |
796 | .set_dma_mode = sil_set_dma_mode, | 769 | .set_dma_mode = sil_set_dma_mode, |
@@ -809,13 +782,17 @@ static const struct ide_port_ops sil_sata_port_ops = { | |||
809 | .cable_detect = sil_cable_detect, | 782 | .cable_detect = sil_cable_detect, |
810 | }; | 783 | }; |
811 | 784 | ||
785 | static struct ide_dma_ops sil_dma_ops = { | ||
786 | .dma_test_irq = siimage_dma_test_irq, | ||
787 | }; | ||
788 | |||
812 | #define DECLARE_SII_DEV(name_str, p_ops) \ | 789 | #define DECLARE_SII_DEV(name_str, p_ops) \ |
813 | { \ | 790 | { \ |
814 | .name = name_str, \ | 791 | .name = name_str, \ |
815 | .init_chipset = init_chipset_siimage, \ | 792 | .init_chipset = init_chipset_siimage, \ |
816 | .init_iops = init_iops_siimage, \ | 793 | .init_iops = init_iops_siimage, \ |
817 | .init_hwif = init_hwif_siimage, \ | ||
818 | .port_ops = p_ops, \ | 794 | .port_ops = p_ops, \ |
795 | .dma_ops = &sil_dma_ops, \ | ||
819 | .pio_mask = ATA_PIO4, \ | 796 | .pio_mask = ATA_PIO4, \ |
820 | .mwdma_mask = ATA_MWDMA2, \ | 797 | .mwdma_mask = ATA_MWDMA2, \ |
821 | .udma_mask = ATA_UDMA6, \ | 798 | .udma_mask = ATA_UDMA6, \ |
@@ -838,7 +815,24 @@ static const struct ide_port_info siimage_chipsets[] __devinitdata = { | |||
838 | 815 | ||
839 | static int __devinit siimage_init_one(struct pci_dev *dev, const struct pci_device_id *id) | 816 | static int __devinit siimage_init_one(struct pci_dev *dev, const struct pci_device_id *id) |
840 | { | 817 | { |
841 | return ide_setup_pci_device(dev, &siimage_chipsets[id->driver_data]); | 818 | struct ide_port_info d; |
819 | u8 idx = id->driver_data; | ||
820 | |||
821 | d = siimage_chipsets[idx]; | ||
822 | |||
823 | if (idx) { | ||
824 | static int first = 1; | ||
825 | |||
826 | if (first) { | ||
827 | printk(KERN_INFO "siimage: For full SATA support you " | ||
828 | "should use the libata sata_sil module.\n"); | ||
829 | first = 0; | ||
830 | } | ||
831 | |||
832 | d.host_flags |= IDE_HFLAG_NO_ATAPI_DMA; | ||
833 | } | ||
834 | |||
835 | return ide_setup_pci_device(dev, &d); | ||
842 | } | 836 | } |
843 | 837 | ||
844 | static const struct pci_device_id siimage_pci_tbl[] = { | 838 | static const struct pci_device_id siimage_pci_tbl[] = { |
diff --git a/drivers/ide/pci/sl82c105.c b/drivers/ide/pci/sl82c105.c index c2127cbdecd3..635d607bc0cf 100644 --- a/drivers/ide/pci/sl82c105.c +++ b/drivers/ide/pci/sl82c105.c | |||
@@ -282,34 +282,25 @@ static unsigned int __devinit init_chipset_sl82c105(struct pci_dev *dev, const c | |||
282 | return dev->irq; | 282 | return dev->irq; |
283 | } | 283 | } |
284 | 284 | ||
285 | /* | ||
286 | * Initialise IDE channel | ||
287 | */ | ||
288 | static void __devinit init_hwif_sl82c105(ide_hwif_t *hwif) | ||
289 | { | ||
290 | DBG(("init_hwif_sl82c105(hwif: ide%d)\n", hwif->index)); | ||
291 | |||
292 | if (!hwif->dma_base) | ||
293 | return; | ||
294 | |||
295 | hwif->dma_lost_irq = &sl82c105_dma_lost_irq; | ||
296 | hwif->dma_start = &sl82c105_dma_start; | ||
297 | hwif->ide_dma_end = &sl82c105_dma_end; | ||
298 | hwif->dma_timeout = &sl82c105_dma_timeout; | ||
299 | } | ||
300 | |||
301 | static const struct ide_port_ops sl82c105_port_ops = { | 285 | static const struct ide_port_ops sl82c105_port_ops = { |
302 | .set_pio_mode = sl82c105_set_pio_mode, | 286 | .set_pio_mode = sl82c105_set_pio_mode, |
303 | .set_dma_mode = sl82c105_set_dma_mode, | 287 | .set_dma_mode = sl82c105_set_dma_mode, |
304 | .resetproc = sl82c105_resetproc, | 288 | .resetproc = sl82c105_resetproc, |
305 | }; | 289 | }; |
306 | 290 | ||
291 | static struct ide_dma_ops sl82c105_dma_ops = { | ||
292 | .dma_start = sl82c105_dma_start, | ||
293 | .dma_end = sl82c105_dma_end, | ||
294 | .dma_lost_irq = sl82c105_dma_lost_irq, | ||
295 | .dma_timeout = sl82c105_dma_timeout, | ||
296 | }; | ||
297 | |||
307 | static const struct ide_port_info sl82c105_chipset __devinitdata = { | 298 | static const struct ide_port_info sl82c105_chipset __devinitdata = { |
308 | .name = "W82C105", | 299 | .name = "W82C105", |
309 | .init_chipset = init_chipset_sl82c105, | 300 | .init_chipset = init_chipset_sl82c105, |
310 | .init_hwif = init_hwif_sl82c105, | ||
311 | .enablebits = {{0x40,0x01,0x01}, {0x40,0x10,0x10}}, | 301 | .enablebits = {{0x40,0x01,0x01}, {0x40,0x10,0x10}}, |
312 | .port_ops = &sl82c105_port_ops, | 302 | .port_ops = &sl82c105_port_ops, |
303 | .dma_ops = &sl82c105_dma_ops, | ||
313 | .host_flags = IDE_HFLAG_IO_32BIT | | 304 | .host_flags = IDE_HFLAG_IO_32BIT | |
314 | IDE_HFLAG_UNMASK_IRQS | | 305 | IDE_HFLAG_UNMASK_IRQS | |
315 | /* FIXME: check for Compatibility mode in generic IDE PCI code */ | 306 | /* FIXME: check for Compatibility mode in generic IDE PCI code */ |
@@ -334,7 +325,7 @@ static int __devinit sl82c105_init_one(struct pci_dev *dev, const struct pci_dev | |||
334 | */ | 325 | */ |
335 | printk(KERN_INFO "W82C105_IDE: Winbond W83C553 bridge " | 326 | printk(KERN_INFO "W82C105_IDE: Winbond W83C553 bridge " |
336 | "revision %d, BM-DMA disabled\n", rev); | 327 | "revision %d, BM-DMA disabled\n", rev); |
337 | d.init_hwif = NULL; | 328 | d.dma_ops = NULL; |
338 | d.mwdma_mask = 0; | 329 | d.mwdma_mask = 0; |
339 | d.host_flags &= ~IDE_HFLAG_SERIALIZE_DMA; | 330 | d.host_flags &= ~IDE_HFLAG_SERIALIZE_DMA; |
340 | } | 331 | } |
diff --git a/drivers/ide/pci/tc86c001.c b/drivers/ide/pci/tc86c001.c index 14ce400a0eaf..4ce240db3263 100644 --- a/drivers/ide/pci/tc86c001.c +++ b/drivers/ide/pci/tc86c001.c | |||
@@ -168,8 +168,6 @@ static void __devinit init_hwif_tc86c001(ide_hwif_t *hwif) | |||
168 | 168 | ||
169 | /* Sector Count Register limit */ | 169 | /* Sector Count Register limit */ |
170 | hwif->rqsize = 0xffff; | 170 | hwif->rqsize = 0xffff; |
171 | |||
172 | hwif->dma_start = &tc86c001_dma_start; | ||
173 | } | 171 | } |
174 | 172 | ||
175 | static unsigned int __devinit init_chipset_tc86c001(struct pci_dev *dev, | 173 | static unsigned int __devinit init_chipset_tc86c001(struct pci_dev *dev, |
@@ -188,11 +186,16 @@ static const struct ide_port_ops tc86c001_port_ops = { | |||
188 | .cable_detect = tc86c001_cable_detect, | 186 | .cable_detect = tc86c001_cable_detect, |
189 | }; | 187 | }; |
190 | 188 | ||
189 | static struct ide_dma_ops tc86c001_dma_ops = { | ||
190 | .dma_start = tc86c001_dma_start, | ||
191 | }; | ||
192 | |||
191 | static const struct ide_port_info tc86c001_chipset __devinitdata = { | 193 | static const struct ide_port_info tc86c001_chipset __devinitdata = { |
192 | .name = "TC86C001", | 194 | .name = "TC86C001", |
193 | .init_chipset = init_chipset_tc86c001, | 195 | .init_chipset = init_chipset_tc86c001, |
194 | .init_hwif = init_hwif_tc86c001, | 196 | .init_hwif = init_hwif_tc86c001, |
195 | .port_ops = &tc86c001_port_ops, | 197 | .port_ops = &tc86c001_port_ops, |
198 | .dma_ops = &tc86c001_dma_ops, | ||
196 | .host_flags = IDE_HFLAG_SINGLE | IDE_HFLAG_OFF_BOARD | | 199 | .host_flags = IDE_HFLAG_SINGLE | IDE_HFLAG_OFF_BOARD | |
197 | IDE_HFLAG_ABUSE_SET_DMA_MODE, | 200 | IDE_HFLAG_ABUSE_SET_DMA_MODE, |
198 | .pio_mask = ATA_PIO4, | 201 | .pio_mask = ATA_PIO4, |
diff --git a/drivers/ide/pci/trm290.c b/drivers/ide/pci/trm290.c index 7e354d33323b..c506e97cd716 100644 --- a/drivers/ide/pci/trm290.c +++ b/drivers/ide/pci/trm290.c | |||
@@ -214,7 +214,7 @@ static void trm290_dma_start(ide_drive_t *drive) | |||
214 | { | 214 | { |
215 | } | 215 | } |
216 | 216 | ||
217 | static int trm290_ide_dma_end (ide_drive_t *drive) | 217 | static int trm290_dma_end(ide_drive_t *drive) |
218 | { | 218 | { |
219 | u16 status; | 219 | u16 status; |
220 | 220 | ||
@@ -225,7 +225,7 @@ static int trm290_ide_dma_end (ide_drive_t *drive) | |||
225 | return status != 0x00ff; | 225 | return status != 0x00ff; |
226 | } | 226 | } |
227 | 227 | ||
228 | static int trm290_ide_dma_test_irq (ide_drive_t *drive) | 228 | static int trm290_dma_test_irq(ide_drive_t *drive) |
229 | { | 229 | { |
230 | u16 status; | 230 | u16 status; |
231 | 231 | ||
@@ -280,12 +280,6 @@ static void __devinit init_hwif_trm290(ide_hwif_t *hwif) | |||
280 | /* sharing IRQ with mate */ | 280 | /* sharing IRQ with mate */ |
281 | hwif->irq = hwif->mate->irq; | 281 | hwif->irq = hwif->mate->irq; |
282 | 282 | ||
283 | hwif->dma_host_set = &trm290_dma_host_set; | ||
284 | hwif->dma_setup = &trm290_dma_setup; | ||
285 | hwif->dma_exec_cmd = &trm290_dma_exec_cmd; | ||
286 | hwif->dma_start = &trm290_dma_start; | ||
287 | hwif->ide_dma_end = &trm290_ide_dma_end; | ||
288 | hwif->ide_dma_test_irq = &trm290_ide_dma_test_irq; | ||
289 | #if 1 | 283 | #if 1 |
290 | { | 284 | { |
291 | /* | 285 | /* |
@@ -319,11 +313,21 @@ static const struct ide_port_ops trm290_port_ops = { | |||
319 | .selectproc = trm290_selectproc, | 313 | .selectproc = trm290_selectproc, |
320 | }; | 314 | }; |
321 | 315 | ||
316 | static struct ide_dma_ops trm290_dma_ops = { | ||
317 | .dma_host_set = trm290_dma_host_set, | ||
318 | .dma_setup = trm290_dma_setup, | ||
319 | .dma_exec_cmd = trm290_dma_exec_cmd, | ||
320 | .dma_start = trm290_dma_start, | ||
321 | .dma_end = trm290_dma_end, | ||
322 | .dma_test_irq = trm290_dma_test_irq, | ||
323 | }; | ||
324 | |||
322 | static const struct ide_port_info trm290_chipset __devinitdata = { | 325 | static const struct ide_port_info trm290_chipset __devinitdata = { |
323 | .name = "TRM290", | 326 | .name = "TRM290", |
324 | .init_hwif = init_hwif_trm290, | 327 | .init_hwif = init_hwif_trm290, |
325 | .chipset = ide_trm290, | 328 | .chipset = ide_trm290, |
326 | .port_ops = &trm290_port_ops, | 329 | .port_ops = &trm290_port_ops, |
330 | .dma_ops = &trm290_dma_ops, | ||
327 | .host_flags = IDE_HFLAG_NO_ATAPI_DMA | | 331 | .host_flags = IDE_HFLAG_NO_ATAPI_DMA | |
328 | #if 0 /* play it safe for now */ | 332 | #if 0 /* play it safe for now */ |
329 | IDE_HFLAG_TRUST_BIOS_FOR_DMA | | 333 | IDE_HFLAG_TRUST_BIOS_FOR_DMA | |
diff --git a/drivers/ide/ppc/pmac.c b/drivers/ide/ppc/pmac.c index ac36c6c4013f..0ee16acfdf29 100644 --- a/drivers/ide/ppc/pmac.c +++ b/drivers/ide/ppc/pmac.c | |||
@@ -930,9 +930,14 @@ static const struct ide_port_ops pmac_ide_port_ops = { | |||
930 | .selectproc = pmac_ide_selectproc, | 930 | .selectproc = pmac_ide_selectproc, |
931 | }; | 931 | }; |
932 | 932 | ||
933 | static struct ide_dma_ops pmac_dma_ops; | ||
934 | |||
933 | static const struct ide_port_info pmac_port_info = { | 935 | static const struct ide_port_info pmac_port_info = { |
934 | .init_dma = pmac_ide_init_dma, | 936 | .init_dma = pmac_ide_init_dma, |
935 | .chipset = ide_pmac, | 937 | .chipset = ide_pmac, |
938 | #ifdef CONFIG_BLK_DEV_IDEDMA_PMAC | ||
939 | .dma_ops = &pmac_dma_ops, | ||
940 | #endif | ||
936 | .port_ops = &pmac_ide_port_ops, | 941 | .port_ops = &pmac_ide_port_ops, |
937 | .host_flags = IDE_HFLAG_SET_PIO_MODE_KEEP_DMA | | 942 | .host_flags = IDE_HFLAG_SET_PIO_MODE_KEEP_DMA | |
938 | IDE_HFLAG_POST_SET_MODE | | 943 | IDE_HFLAG_POST_SET_MODE | |
@@ -1670,6 +1675,17 @@ pmac_ide_dma_lost_irq (ide_drive_t *drive) | |||
1670 | printk(KERN_ERR "ide-pmac lost interrupt, dma status: %lx\n", status); | 1675 | printk(KERN_ERR "ide-pmac lost interrupt, dma status: %lx\n", status); |
1671 | } | 1676 | } |
1672 | 1677 | ||
1678 | static struct ide_dma_ops pmac_dma_ops = { | ||
1679 | .dma_host_set = pmac_ide_dma_host_set, | ||
1680 | .dma_setup = pmac_ide_dma_setup, | ||
1681 | .dma_exec_cmd = pmac_ide_dma_exec_cmd, | ||
1682 | .dma_start = pmac_ide_dma_start, | ||
1683 | .dma_end = pmac_ide_dma_end, | ||
1684 | .dma_test_irq = pmac_ide_dma_test_irq, | ||
1685 | .dma_timeout = ide_dma_timeout, | ||
1686 | .dma_lost_irq = pmac_ide_dma_lost_irq, | ||
1687 | }; | ||
1688 | |||
1673 | /* | 1689 | /* |
1674 | * Allocate the data structures needed for using DMA with an interface | 1690 | * Allocate the data structures needed for using DMA with an interface |
1675 | * and fill the proper list of functions pointers | 1691 | * and fill the proper list of functions pointers |
@@ -1702,15 +1718,6 @@ static int __devinit pmac_ide_init_dma(ide_hwif_t *hwif, | |||
1702 | 1718 | ||
1703 | hwif->sg_max_nents = MAX_DCMDS; | 1719 | hwif->sg_max_nents = MAX_DCMDS; |
1704 | 1720 | ||
1705 | hwif->dma_host_set = &pmac_ide_dma_host_set; | ||
1706 | hwif->dma_setup = &pmac_ide_dma_setup; | ||
1707 | hwif->dma_exec_cmd = &pmac_ide_dma_exec_cmd; | ||
1708 | hwif->dma_start = &pmac_ide_dma_start; | ||
1709 | hwif->ide_dma_end = &pmac_ide_dma_end; | ||
1710 | hwif->ide_dma_test_irq = &pmac_ide_dma_test_irq; | ||
1711 | hwif->dma_timeout = &ide_dma_timeout; | ||
1712 | hwif->dma_lost_irq = &pmac_ide_dma_lost_irq; | ||
1713 | |||
1714 | return 0; | 1721 | return 0; |
1715 | } | 1722 | } |
1716 | #else | 1723 | #else |
diff --git a/drivers/ide/setup-pci.c b/drivers/ide/setup-pci.c index 5171601fb255..9a1e01e176f0 100644 --- a/drivers/ide/setup-pci.c +++ b/drivers/ide/setup-pci.c | |||
@@ -385,7 +385,7 @@ int ide_hwif_setup_dma(ide_hwif_t *hwif, const struct ide_port_info *d) | |||
385 | if (ide_allocate_dma_engine(hwif)) | 385 | if (ide_allocate_dma_engine(hwif)) |
386 | return -1; | 386 | return -1; |
387 | 387 | ||
388 | ide_setup_dma(hwif, base); | 388 | ide_setup_dma(hwif, base, d); |
389 | } | 389 | } |
390 | 390 | ||
391 | return 0; | 391 | return 0; |
diff --git a/drivers/scsi/ide-scsi.c b/drivers/scsi/ide-scsi.c index 93c3fc20aa59..3638fa808ded 100644 --- a/drivers/scsi/ide-scsi.c +++ b/drivers/scsi/ide-scsi.c | |||
@@ -393,7 +393,7 @@ static ide_startstop_t idescsi_pc_intr (ide_drive_t *drive) | |||
393 | printk ("ide-scsi: %s: DMA complete\n", drive->name); | 393 | printk ("ide-scsi: %s: DMA complete\n", drive->name); |
394 | #endif /* IDESCSI_DEBUG_LOG */ | 394 | #endif /* IDESCSI_DEBUG_LOG */ |
395 | pc->xferred = pc->req_xfer; | 395 | pc->xferred = pc->req_xfer; |
396 | (void) HWIF(drive)->ide_dma_end(drive); | 396 | (void)hwif->dma_ops->dma_end(drive); |
397 | } | 397 | } |
398 | 398 | ||
399 | /* Clear the interrupt */ | 399 | /* Clear the interrupt */ |
@@ -498,7 +498,7 @@ static ide_startstop_t idescsi_transfer_pc(ide_drive_t *drive) | |||
498 | drive->hwif->atapi_output_bytes(drive, scsi->pc->c, 12); | 498 | drive->hwif->atapi_output_bytes(drive, scsi->pc->c, 12); |
499 | if (pc->flags & PC_FLAG_DMA_OK) { | 499 | if (pc->flags & PC_FLAG_DMA_OK) { |
500 | pc->flags |= PC_FLAG_DMA_IN_PROGRESS; | 500 | pc->flags |= PC_FLAG_DMA_IN_PROGRESS; |
501 | hwif->dma_start(drive); | 501 | hwif->dma_ops->dma_start(drive); |
502 | } | 502 | } |
503 | return ide_started; | 503 | return ide_started; |
504 | } | 504 | } |
@@ -560,7 +560,7 @@ static ide_startstop_t idescsi_issue_pc(ide_drive_t *drive, | |||
560 | 560 | ||
561 | if (drive->using_dma && !idescsi_map_sg(drive, pc)) { | 561 | if (drive->using_dma && !idescsi_map_sg(drive, pc)) { |
562 | hwif->sg_mapped = 1; | 562 | hwif->sg_mapped = 1; |
563 | dma = !hwif->dma_setup(drive); | 563 | dma = !hwif->dma_ops->dma_setup(drive); |
564 | hwif->sg_mapped = 0; | 564 | hwif->sg_mapped = 0; |
565 | } | 565 | } |
566 | 566 | ||
diff --git a/include/linux/ide.h b/include/linux/ide.h index e5f41741ba91..079b6f9405ed 100644 --- a/include/linux/ide.h +++ b/include/linux/ide.h | |||
@@ -413,6 +413,17 @@ struct ide_port_ops { | |||
413 | u8 (*cable_detect)(struct hwif_s *); | 413 | u8 (*cable_detect)(struct hwif_s *); |
414 | }; | 414 | }; |
415 | 415 | ||
416 | struct ide_dma_ops { | ||
417 | void (*dma_host_set)(struct ide_drive_s *, int); | ||
418 | int (*dma_setup)(struct ide_drive_s *); | ||
419 | void (*dma_exec_cmd)(struct ide_drive_s *, u8); | ||
420 | void (*dma_start)(struct ide_drive_s *); | ||
421 | int (*dma_end)(struct ide_drive_s *); | ||
422 | int (*dma_test_irq)(struct ide_drive_s *); | ||
423 | void (*dma_lost_irq)(struct ide_drive_s *); | ||
424 | void (*dma_timeout)(struct ide_drive_s *); | ||
425 | }; | ||
426 | |||
416 | typedef struct hwif_s { | 427 | typedef struct hwif_s { |
417 | struct hwif_s *next; /* for linked-list in ide_hwgroup_t */ | 428 | struct hwif_s *next; /* for linked-list in ide_hwgroup_t */ |
418 | struct hwif_s *mate; /* other hwif from same PCI chip */ | 429 | struct hwif_s *mate; /* other hwif from same PCI chip */ |
@@ -451,6 +462,7 @@ typedef struct hwif_s { | |||
451 | void (*rw_disk)(ide_drive_t *, struct request *); | 462 | void (*rw_disk)(ide_drive_t *, struct request *); |
452 | 463 | ||
453 | const struct ide_port_ops *port_ops; | 464 | const struct ide_port_ops *port_ops; |
465 | struct ide_dma_ops *dma_ops; | ||
454 | 466 | ||
455 | void (*ata_input_data)(ide_drive_t *, void *, u32); | 467 | void (*ata_input_data)(ide_drive_t *, void *, u32); |
456 | void (*ata_output_data)(ide_drive_t *, void *, u32); | 468 | void (*ata_output_data)(ide_drive_t *, void *, u32); |
@@ -458,15 +470,7 @@ typedef struct hwif_s { | |||
458 | void (*atapi_input_bytes)(ide_drive_t *, void *, u32); | 470 | void (*atapi_input_bytes)(ide_drive_t *, void *, u32); |
459 | void (*atapi_output_bytes)(ide_drive_t *, void *, u32); | 471 | void (*atapi_output_bytes)(ide_drive_t *, void *, u32); |
460 | 472 | ||
461 | void (*dma_host_set)(ide_drive_t *, int); | ||
462 | int (*dma_setup)(ide_drive_t *); | ||
463 | void (*dma_exec_cmd)(ide_drive_t *, u8); | ||
464 | void (*dma_start)(ide_drive_t *); | ||
465 | int (*ide_dma_end)(ide_drive_t *drive); | ||
466 | int (*ide_dma_test_irq)(ide_drive_t *drive); | ||
467 | void (*ide_dma_clear_irq)(ide_drive_t *drive); | 473 | void (*ide_dma_clear_irq)(ide_drive_t *drive); |
468 | void (*dma_lost_irq)(ide_drive_t *drive); | ||
469 | void (*dma_timeout)(ide_drive_t *drive); | ||
470 | 474 | ||
471 | void (*OUTB)(u8 addr, unsigned long port); | 475 | void (*OUTB)(u8 addr, unsigned long port); |
472 | void (*OUTBSYNC)(ide_drive_t *drive, u8 addr, unsigned long port); | 476 | void (*OUTBSYNC)(ide_drive_t *drive, u8 addr, unsigned long port); |
@@ -1114,6 +1118,7 @@ struct ide_port_info { | |||
1114 | const struct ide_port_info *); | 1118 | const struct ide_port_info *); |
1115 | 1119 | ||
1116 | const struct ide_port_ops *port_ops; | 1120 | const struct ide_port_ops *port_ops; |
1121 | struct ide_dma_ops *dma_ops; | ||
1117 | 1122 | ||
1118 | ide_pci_enablebit_t enablebits[2]; | 1123 | ide_pci_enablebit_t enablebits[2]; |
1119 | hwif_chipset_t chipset; | 1124 | hwif_chipset_t chipset; |
@@ -1165,7 +1170,7 @@ void ide_destroy_dmatable(ide_drive_t *); | |||
1165 | extern int ide_build_dmatable(ide_drive_t *, struct request *); | 1170 | extern int ide_build_dmatable(ide_drive_t *, struct request *); |
1166 | int ide_allocate_dma_engine(ide_hwif_t *); | 1171 | int ide_allocate_dma_engine(ide_hwif_t *); |
1167 | void ide_release_dma_engine(ide_hwif_t *); | 1172 | void ide_release_dma_engine(ide_hwif_t *); |
1168 | extern void ide_setup_dma(ide_hwif_t *, unsigned long); | 1173 | void ide_setup_dma(ide_hwif_t *, unsigned long, const struct ide_port_info *); |
1169 | 1174 | ||
1170 | void ide_dma_host_set(ide_drive_t *, int); | 1175 | void ide_dma_host_set(ide_drive_t *, int); |
1171 | extern int ide_dma_setup(ide_drive_t *); | 1176 | extern int ide_dma_setup(ide_drive_t *); |