aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/ide/ide-dma.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/ide/ide-dma.c')
-rw-r--r--drivers/ide/ide-dma.c57
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
671EXPORT_SYMBOL(__ide_dma_good_drive); 673EXPORT_SYMBOL(__ide_dma_good_drive);
672 674
673int 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
706EXPORT_SYMBOL_GPL(ide_use_dma);
707
708static const u8 xfer_mode_bases[] = { 675static 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
800EXPORT_SYMBOL_GPL(ide_tune_dma); 773EXPORT_SYMBOL_GPL(ide_tune_dma);