diff options
Diffstat (limited to 'drivers/ide/ide-dma.c')
-rw-r--r-- | drivers/ide/ide-dma.c | 57 |
1 files changed, 15 insertions, 42 deletions
diff --git a/drivers/ide/ide-dma.c b/drivers/ide/ide-dma.c index 5fe85191d49c..ead141e2db9e 100644 --- a/drivers/ide/ide-dma.c +++ b/drivers/ide/ide-dma.c | |||
@@ -119,15 +119,17 @@ static const struct drive_list_entry drive_blacklist [] = { | |||
119 | { "HITACHI CDR-8335" , "ALL" }, | 119 | { "HITACHI CDR-8335" , "ALL" }, |
120 | { "HITACHI CDR-8435" , "ALL" }, | 120 | { "HITACHI CDR-8435" , "ALL" }, |
121 | { "Toshiba CD-ROM XM-6202B" , "ALL" }, | 121 | { "Toshiba CD-ROM XM-6202B" , "ALL" }, |
122 | { "TOSHIBA CD-ROM XM-1702BC", "ALL" }, | ||
122 | { "CD-532E-A" , "ALL" }, | 123 | { "CD-532E-A" , "ALL" }, |
123 | { "E-IDE CD-ROM CR-840", "ALL" }, | 124 | { "E-IDE CD-ROM CR-840", "ALL" }, |
124 | { "CD-ROM Drive/F5A", "ALL" }, | 125 | { "CD-ROM Drive/F5A", "ALL" }, |
125 | { "WPI CDD-820", "ALL" }, | 126 | { "WPI CDD-820", "ALL" }, |
126 | { "SAMSUNG CD-ROM SC-148C", "ALL" }, | 127 | { "SAMSUNG CD-ROM SC-148C", "ALL" }, |
127 | { "SAMSUNG CD-ROM SC", "ALL" }, | 128 | { "SAMSUNG CD-ROM SC", "ALL" }, |
128 | { "SanDisk SDP3B-64" , "ALL" }, | ||
129 | { "ATAPI CD-ROM DRIVE 40X MAXIMUM", "ALL" }, | 129 | { "ATAPI CD-ROM DRIVE 40X MAXIMUM", "ALL" }, |
130 | { "_NEC DV5800A", "ALL" }, | 130 | { "_NEC DV5800A", "ALL" }, |
131 | { "SAMSUNG CD-ROM SN-124", "N001" }, | ||
132 | { "Seagate STT20000A", "ALL" }, | ||
131 | { NULL , NULL } | 133 | { NULL , NULL } |
132 | 134 | ||
133 | }; | 135 | }; |
@@ -670,41 +672,6 @@ int __ide_dma_good_drive (ide_drive_t *drive) | |||
670 | 672 | ||
671 | EXPORT_SYMBOL(__ide_dma_good_drive); | 673 | EXPORT_SYMBOL(__ide_dma_good_drive); |
672 | 674 | ||
673 | int ide_use_dma(ide_drive_t *drive) | ||
674 | { | ||
675 | struct hd_driveid *id = drive->id; | ||
676 | ide_hwif_t *hwif = drive->hwif; | ||
677 | |||
678 | if ((id->capability & 1) == 0 || drive->autodma == 0) | ||
679 | return 0; | ||
680 | |||
681 | /* consult the list of known "bad" drives */ | ||
682 | if (__ide_dma_bad_drive(drive)) | ||
683 | return 0; | ||
684 | |||
685 | /* capable of UltraDMA modes */ | ||
686 | if (id->field_valid & 4) { | ||
687 | if (hwif->ultra_mask & id->dma_ultra) | ||
688 | return 1; | ||
689 | } | ||
690 | |||
691 | /* capable of regular DMA modes */ | ||
692 | if (id->field_valid & 2) { | ||
693 | if (hwif->mwdma_mask & id->dma_mword) | ||
694 | return 1; | ||
695 | if (hwif->swdma_mask & id->dma_1word) | ||
696 | return 1; | ||
697 | } | ||
698 | |||
699 | /* consult the list of known "good" drives */ | ||
700 | if (__ide_dma_good_drive(drive) && id->eide_dma_time < 150) | ||
701 | return 1; | ||
702 | |||
703 | return 0; | ||
704 | } | ||
705 | |||
706 | EXPORT_SYMBOL_GPL(ide_use_dma); | ||
707 | |||
708 | static const u8 xfer_mode_bases[] = { | 675 | static const u8 xfer_mode_bases[] = { |
709 | XFER_UDMA_0, | 676 | XFER_UDMA_0, |
710 | XFER_MW_DMA_0, | 677 | XFER_MW_DMA_0, |
@@ -731,10 +698,12 @@ static unsigned int ide_get_mode_mask(ide_drive_t *drive, u8 base) | |||
731 | mask &= 0x07; | 698 | mask &= 0x07; |
732 | break; | 699 | break; |
733 | case XFER_MW_DMA_0: | 700 | case XFER_MW_DMA_0: |
734 | mask = id->dma_mword & hwif->mwdma_mask; | 701 | if (id->field_valid & 2) |
702 | mask = id->dma_mword & hwif->mwdma_mask; | ||
735 | break; | 703 | break; |
736 | case XFER_SW_DMA_0: | 704 | case XFER_SW_DMA_0: |
737 | mask = id->dma_1word & hwif->swdma_mask; | 705 | if (id->field_valid & 2) |
706 | mask = id->dma_1word & hwif->swdma_mask; | ||
738 | break; | 707 | break; |
739 | default: | 708 | default: |
740 | BUG(); | 709 | BUG(); |
@@ -783,8 +752,11 @@ int ide_tune_dma(ide_drive_t *drive) | |||
783 | { | 752 | { |
784 | u8 speed; | 753 | u8 speed; |
785 | 754 | ||
786 | /* TODO: use only ide_max_dma_mode() */ | 755 | if ((drive->id->capability & 1) == 0 || drive->autodma == 0) |
787 | if (!ide_use_dma(drive)) | 756 | return 0; |
757 | |||
758 | /* consult the list of known "bad" drives */ | ||
759 | if (__ide_dma_bad_drive(drive)) | ||
788 | return 0; | 760 | return 0; |
789 | 761 | ||
790 | speed = ide_max_dma_mode(drive); | 762 | speed = ide_max_dma_mode(drive); |
@@ -792,9 +764,10 @@ int ide_tune_dma(ide_drive_t *drive) | |||
792 | if (!speed) | 764 | if (!speed) |
793 | return 0; | 765 | return 0; |
794 | 766 | ||
795 | drive->hwif->speedproc(drive, speed); | 767 | if (drive->hwif->speedproc(drive, speed)) |
768 | return 0; | ||
796 | 769 | ||
797 | return ide_dma_enable(drive); | 770 | return 1; |
798 | } | 771 | } |
799 | 772 | ||
800 | EXPORT_SYMBOL_GPL(ide_tune_dma); | 773 | EXPORT_SYMBOL_GPL(ide_tune_dma); |