diff options
| author | Bartlomiej Zolnierkiewicz <bzolnier@gmail.com> | 2007-05-09 18:01:09 -0400 |
|---|---|---|
| committer | Bartlomiej Zolnierkiewicz <bzolnier@gmail.com> | 2007-05-09 18:01:09 -0400 |
| commit | 29e744d088e3555f4efbdf390f01088dd66993b6 (patch) | |
| tree | 2747692efcef505872d29e0b62cb2345b0d64978 | |
| parent | 2d5eaa6dd744a641e75503232a01f52d0768884c (diff) | |
ide: add ide_tune_dma() helper
After reworking the code responsible for selecting the best DMA
transfer mode it is now possible to add generic ide_tune_dma() helper.
Convert some IDE PCI host drivers to use it (the ones left need more work).
Signed-off-by: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
| -rw-r--r-- | drivers/ide/ide-dma.c | 20 | ||||
| -rw-r--r-- | drivers/ide/pci/aec62xx.c | 13 | ||||
| -rw-r--r-- | drivers/ide/pci/atiixp.c | 22 | ||||
| -rw-r--r-- | drivers/ide/pci/cs5535.c | 15 | ||||
| -rw-r--r-- | drivers/ide/pci/hpt34x.c | 20 | ||||
| -rw-r--r-- | drivers/ide/pci/hpt366.c | 20 | ||||
| -rw-r--r-- | drivers/ide/pci/it8213.c | 21 | ||||
| -rw-r--r-- | drivers/ide/pci/jmicron.c | 21 | ||||
| -rw-r--r-- | drivers/ide/pci/piix.c | 26 | ||||
| -rw-r--r-- | drivers/ide/pci/sis5513.c | 21 | ||||
| -rw-r--r-- | drivers/ide/pci/slc90e66.c | 13 | ||||
| -rw-r--r-- | drivers/ide/pci/tc86c001.c | 13 | ||||
| -rw-r--r-- | drivers/ide/pci/triflex.c | 13 | ||||
| -rw-r--r-- | include/linux/ide.h | 2 |
14 files changed, 34 insertions, 206 deletions
diff --git a/drivers/ide/ide-dma.c b/drivers/ide/ide-dma.c index f28fabb791fe..5fe85191d49c 100644 --- a/drivers/ide/ide-dma.c +++ b/drivers/ide/ide-dma.c | |||
| @@ -779,6 +779,26 @@ u8 ide_max_dma_mode(ide_drive_t *drive) | |||
| 779 | 779 | ||
| 780 | EXPORT_SYMBOL_GPL(ide_max_dma_mode); | 780 | EXPORT_SYMBOL_GPL(ide_max_dma_mode); |
| 781 | 781 | ||
| 782 | int ide_tune_dma(ide_drive_t *drive) | ||
| 783 | { | ||
| 784 | u8 speed; | ||
| 785 | |||
| 786 | /* TODO: use only ide_max_dma_mode() */ | ||
| 787 | if (!ide_use_dma(drive)) | ||
| 788 | return 0; | ||
| 789 | |||
| 790 | speed = ide_max_dma_mode(drive); | ||
| 791 | |||
| 792 | if (!speed) | ||
| 793 | return 0; | ||
| 794 | |||
| 795 | drive->hwif->speedproc(drive, speed); | ||
| 796 | |||
| 797 | return ide_dma_enable(drive); | ||
| 798 | } | ||
| 799 | |||
| 800 | EXPORT_SYMBOL_GPL(ide_tune_dma); | ||
| 801 | |||
| 782 | void ide_dma_verbose(ide_drive_t *drive) | 802 | void ide_dma_verbose(ide_drive_t *drive) |
| 783 | { | 803 | { |
| 784 | struct hd_driveid *id = drive->id; | 804 | struct hd_driveid *id = drive->id; |
diff --git a/drivers/ide/pci/aec62xx.c b/drivers/ide/pci/aec62xx.c index 099539e8c7a3..b173bc66ce1e 100644 --- a/drivers/ide/pci/aec62xx.c +++ b/drivers/ide/pci/aec62xx.c | |||
| @@ -155,17 +155,6 @@ static int aec62xx_tune_chipset (ide_drive_t *drive, u8 speed) | |||
| 155 | } | 155 | } |
| 156 | } | 156 | } |
| 157 | 157 | ||
| 158 | static int config_chipset_for_dma (ide_drive_t *drive) | ||
| 159 | { | ||
| 160 | u8 speed = ide_max_dma_mode(drive); | ||
| 161 | |||
| 162 | if (!(speed)) | ||
| 163 | return 0; | ||
| 164 | |||
| 165 | (void) aec62xx_tune_chipset(drive, speed); | ||
| 166 | return ide_dma_enable(drive); | ||
| 167 | } | ||
| 168 | |||
| 169 | static void aec62xx_tune_drive (ide_drive_t *drive, u8 pio) | 158 | static void aec62xx_tune_drive (ide_drive_t *drive, u8 pio) |
| 170 | { | 159 | { |
| 171 | pio = ide_get_best_pio_mode(drive, pio, 4, NULL); | 160 | pio = ide_get_best_pio_mode(drive, pio, 4, NULL); |
| @@ -174,7 +163,7 @@ static void aec62xx_tune_drive (ide_drive_t *drive, u8 pio) | |||
| 174 | 163 | ||
| 175 | static int aec62xx_config_drive_xfer_rate (ide_drive_t *drive) | 164 | static int aec62xx_config_drive_xfer_rate (ide_drive_t *drive) |
| 176 | { | 165 | { |
| 177 | if (ide_use_dma(drive) && config_chipset_for_dma(drive)) | 166 | if (ide_tune_dma(drive)) |
| 178 | return 0; | 167 | return 0; |
| 179 | 168 | ||
| 180 | if (ide_use_fast_pio(drive)) | 169 | if (ide_use_fast_pio(drive)) |
diff --git a/drivers/ide/pci/atiixp.c b/drivers/ide/pci/atiixp.c index f7e80d6076d7..0e52ad722a72 100644 --- a/drivers/ide/pci/atiixp.c +++ b/drivers/ide/pci/atiixp.c | |||
| @@ -207,26 +207,6 @@ static int atiixp_speedproc(ide_drive_t *drive, u8 xferspeed) | |||
| 207 | } | 207 | } |
| 208 | 208 | ||
| 209 | /** | 209 | /** |
| 210 | * atiixp_config_drive_for_dma - configure drive for DMA | ||
| 211 | * @drive: IDE drive to configure | ||
| 212 | * | ||
| 213 | * Set up a ATIIXP interface channel for the best available speed. | ||
| 214 | * We prefer UDMA if it is available and then MWDMA. If DMA is | ||
| 215 | * not available we switch to PIO and return 0. | ||
| 216 | */ | ||
| 217 | |||
| 218 | static int atiixp_config_drive_for_dma(ide_drive_t *drive) | ||
| 219 | { | ||
| 220 | u8 speed = ide_max_dma_mode(drive); | ||
| 221 | |||
| 222 | if (!speed) | ||
| 223 | return 0; | ||
| 224 | |||
| 225 | (void) atiixp_speedproc(drive, speed); | ||
| 226 | return ide_dma_enable(drive); | ||
| 227 | } | ||
| 228 | |||
| 229 | /** | ||
| 230 | * atiixp_dma_check - set up an IDE device | 210 | * atiixp_dma_check - set up an IDE device |
| 231 | * @drive: IDE drive to configure | 211 | * @drive: IDE drive to configure |
| 232 | * | 212 | * |
| @@ -240,7 +220,7 @@ static int atiixp_dma_check(ide_drive_t *drive) | |||
| 240 | 220 | ||
| 241 | drive->init_speed = 0; | 221 | drive->init_speed = 0; |
| 242 | 222 | ||
| 243 | if (ide_use_dma(drive) && atiixp_config_drive_for_dma(drive)) | 223 | if (ide_tune_dma(drive)) |
| 244 | return 0; | 224 | return 0; |
| 245 | 225 | ||
| 246 | if (ide_use_fast_pio(drive)) { | 226 | if (ide_use_fast_pio(drive)) { |
diff --git a/drivers/ide/pci/cs5535.c b/drivers/ide/pci/cs5535.c index 66a101e470d0..41925c47ef05 100644 --- a/drivers/ide/pci/cs5535.c +++ b/drivers/ide/pci/cs5535.c | |||
| @@ -164,26 +164,13 @@ static void cs5535_tuneproc(ide_drive_t *drive, u8 xferspeed) | |||
| 164 | cs5535_set_speed(drive, xferspeed); | 164 | cs5535_set_speed(drive, xferspeed); |
| 165 | } | 165 | } |
| 166 | 166 | ||
| 167 | static int cs5535_config_drive_for_dma(ide_drive_t *drive) | ||
| 168 | { | ||
| 169 | u8 speed = ide_max_dma_mode(drive); | ||
| 170 | |||
| 171 | /* If no DMA speed was available then let dma_check hit pio */ | ||
| 172 | if (!speed) { | ||
| 173 | return 0; | ||
| 174 | } | ||
| 175 | |||
| 176 | cs5535_set_drive(drive, speed); | ||
| 177 | return ide_dma_enable(drive); | ||
| 178 | } | ||
| 179 | |||
| 180 | static int cs5535_dma_check(ide_drive_t *drive) | 167 | static int cs5535_dma_check(ide_drive_t *drive) |
| 181 | { | 168 | { |
| 182 | u8 speed; | 169 | u8 speed; |
| 183 | 170 | ||
| 184 | drive->init_speed = 0; | 171 | drive->init_speed = 0; |
| 185 | 172 | ||
| 186 | if (ide_use_dma(drive) && cs5535_config_drive_for_dma(drive)) | 173 | if (ide_tune_dma(drive)) |
| 187 | return 0; | 174 | return 0; |
| 188 | 175 | ||
| 189 | if (ide_use_fast_pio(drive)) { | 176 | if (ide_use_fast_pio(drive)) { |
diff --git a/drivers/ide/pci/hpt34x.c b/drivers/ide/pci/hpt34x.c index 473e1b33dbf7..2c24c3de8846 100644 --- a/drivers/ide/pci/hpt34x.c +++ b/drivers/ide/pci/hpt34x.c | |||
| @@ -84,29 +84,11 @@ static void hpt34x_tune_drive (ide_drive_t *drive, u8 pio) | |||
| 84 | (void) hpt34x_tune_chipset(drive, (XFER_PIO_0 + pio)); | 84 | (void) hpt34x_tune_chipset(drive, (XFER_PIO_0 + pio)); |
| 85 | } | 85 | } |
| 86 | 86 | ||
| 87 | /* | ||
| 88 | * This allows the configuration of ide_pci chipset registers | ||
| 89 | * for cards that learn about the drive's UDMA, DMA, PIO capabilities | ||
| 90 | * after the drive is reported by the OS. Initially for designed for | ||
| 91 | * HPT343 UDMA chipset by HighPoint|Triones Technologies, Inc. | ||
| 92 | */ | ||
| 93 | |||
| 94 | static int config_chipset_for_dma (ide_drive_t *drive) | ||
| 95 | { | ||
| 96 | u8 speed = ide_max_dma_mode(drive); | ||
| 97 | |||
| 98 | if (!(speed)) | ||
| 99 | return 0; | ||
| 100 | |||
| 101 | (void) hpt34x_tune_chipset(drive, speed); | ||
| 102 | return ide_dma_enable(drive); | ||
| 103 | } | ||
| 104 | |||
| 105 | static int hpt34x_config_drive_xfer_rate (ide_drive_t *drive) | 87 | static int hpt34x_config_drive_xfer_rate (ide_drive_t *drive) |
| 106 | { | 88 | { |
| 107 | drive->init_speed = 0; | 89 | drive->init_speed = 0; |
| 108 | 90 | ||
| 109 | if (ide_use_dma(drive) && config_chipset_for_dma(drive)) | 91 | if (ide_tune_dma(drive)) |
| 110 | #ifndef CONFIG_HPT34X_AUTODMA | 92 | #ifndef CONFIG_HPT34X_AUTODMA |
| 111 | return -1; | 93 | return -1; |
| 112 | #else | 94 | #else |
diff --git a/drivers/ide/pci/hpt366.c b/drivers/ide/pci/hpt366.c index de5ad9c35dc6..fcbc5605b38e 100644 --- a/drivers/ide/pci/hpt366.c +++ b/drivers/ide/pci/hpt366.c | |||
| @@ -669,24 +669,6 @@ static void hpt3xx_tune_drive(ide_drive_t *drive, u8 pio) | |||
| 669 | (void) hpt3xx_tune_chipset (drive, XFER_PIO_0 + pio); | 669 | (void) hpt3xx_tune_chipset (drive, XFER_PIO_0 + pio); |
| 670 | } | 670 | } |
| 671 | 671 | ||
| 672 | /* | ||
| 673 | * This allows the configuration of ide_pci chipset registers | ||
| 674 | * for cards that learn about the drive's UDMA, DMA, PIO capabilities | ||
| 675 | * after the drive is reported by the OS. Initially designed for | ||
| 676 | * HPT366 UDMA chipset by HighPoint|Triones Technologies, Inc. | ||
| 677 | * | ||
| 678 | */ | ||
| 679 | static int config_chipset_for_dma(ide_drive_t *drive) | ||
| 680 | { | ||
| 681 | u8 speed = ide_max_dma_mode(drive); | ||
| 682 | |||
| 683 | if (!speed) | ||
| 684 | return 0; | ||
| 685 | |||
| 686 | (void) hpt3xx_tune_chipset(drive, speed); | ||
| 687 | return ide_dma_enable(drive); | ||
| 688 | } | ||
| 689 | |||
| 690 | static int hpt3xx_quirkproc(ide_drive_t *drive) | 672 | static int hpt3xx_quirkproc(ide_drive_t *drive) |
| 691 | { | 673 | { |
| 692 | struct hd_driveid *id = drive->id; | 674 | struct hd_driveid *id = drive->id; |
| @@ -741,7 +723,7 @@ static int hpt366_config_drive_xfer_rate(ide_drive_t *drive) | |||
| 741 | { | 723 | { |
| 742 | drive->init_speed = 0; | 724 | drive->init_speed = 0; |
| 743 | 725 | ||
| 744 | if (ide_use_dma(drive) && config_chipset_for_dma(drive)) | 726 | if (ide_tune_dma(drive)) |
| 745 | return 0; | 727 | return 0; |
| 746 | 728 | ||
| 747 | if (ide_use_fast_pio(drive)) | 729 | if (ide_use_fast_pio(drive)) |
diff --git a/drivers/ide/pci/it8213.c b/drivers/ide/pci/it8213.c index 02b56cb7bb1b..c04a02687b95 100644 --- a/drivers/ide/pci/it8213.c +++ b/drivers/ide/pci/it8213.c | |||
| @@ -197,25 +197,6 @@ static int it8213_tune_chipset (ide_drive_t *drive, u8 xferspeed) | |||
| 197 | return ide_config_drive_speed(drive, speed); | 197 | return ide_config_drive_speed(drive, speed); |
| 198 | } | 198 | } |
| 199 | 199 | ||
| 200 | /* | ||
| 201 | * config_chipset_for_dma - configure for DMA | ||
| 202 | * @drive: drive to configure | ||
| 203 | * | ||
| 204 | * Called by the IDE layer when it wants the timings set up. | ||
| 205 | */ | ||
| 206 | |||
| 207 | static int config_chipset_for_dma (ide_drive_t *drive) | ||
| 208 | { | ||
| 209 | u8 speed = ide_max_dma_mode(drive); | ||
| 210 | |||
| 211 | if (!speed) | ||
| 212 | return 0; | ||
| 213 | |||
| 214 | it8213_tune_chipset(drive, speed); | ||
| 215 | |||
| 216 | return ide_dma_enable(drive); | ||
| 217 | } | ||
| 218 | |||
| 219 | /** | 200 | /** |
| 220 | * it8213_configure_drive_for_dma - set up for DMA transfers | 201 | * it8213_configure_drive_for_dma - set up for DMA transfers |
| 221 | * @drive: drive we are going to set up | 202 | * @drive: drive we are going to set up |
| @@ -230,7 +211,7 @@ static int it8213_config_drive_for_dma (ide_drive_t *drive) | |||
| 230 | { | 211 | { |
| 231 | u8 pio; | 212 | u8 pio; |
| 232 | 213 | ||
| 233 | if (ide_use_dma(drive) && config_chipset_for_dma(drive)) | 214 | if (ide_tune_dma(drive)) |
| 234 | return 0; | 215 | return 0; |
| 235 | 216 | ||
| 236 | pio = ide_get_best_pio_mode(drive, 255, 4, NULL); | 217 | pio = ide_get_best_pio_mode(drive, 255, 4, NULL); |
diff --git a/drivers/ide/pci/jmicron.c b/drivers/ide/pci/jmicron.c index dbb3c199cba9..76ed25147229 100644 --- a/drivers/ide/pci/jmicron.c +++ b/drivers/ide/pci/jmicron.c | |||
| @@ -119,25 +119,6 @@ static int jmicron_tune_chipset (ide_drive_t *drive, byte xferspeed) | |||
| 119 | } | 119 | } |
| 120 | 120 | ||
| 121 | /** | 121 | /** |
| 122 | * config_chipset_for_dma - configure for DMA | ||
| 123 | * @drive: drive to configure | ||
| 124 | * | ||
| 125 | * As the JMicron snoops for timings all we actually need to do is | ||
| 126 | * make sure we don't set an invalid mode. | ||
| 127 | */ | ||
| 128 | |||
| 129 | static int config_chipset_for_dma (ide_drive_t *drive) | ||
| 130 | { | ||
| 131 | u8 speed = ide_max_dma_mode(drive); | ||
| 132 | |||
| 133 | if (!speed) | ||
| 134 | return 0; | ||
| 135 | |||
| 136 | jmicron_tune_chipset(drive, speed); | ||
| 137 | return ide_dma_enable(drive); | ||
| 138 | } | ||
| 139 | |||
| 140 | /** | ||
| 141 | * jmicron_configure_drive_for_dma - set up for DMA transfers | 122 | * jmicron_configure_drive_for_dma - set up for DMA transfers |
| 142 | * @drive: drive we are going to set up | 123 | * @drive: drive we are going to set up |
| 143 | * | 124 | * |
| @@ -147,7 +128,7 @@ static int config_chipset_for_dma (ide_drive_t *drive) | |||
| 147 | 128 | ||
| 148 | static int jmicron_config_drive_for_dma (ide_drive_t *drive) | 129 | static int jmicron_config_drive_for_dma (ide_drive_t *drive) |
| 149 | { | 130 | { |
| 150 | if (ide_use_dma(drive) && config_chipset_for_dma(drive)) | 131 | if (ide_tune_dma(drive)) |
| 151 | return 0; | 132 | return 0; |
| 152 | 133 | ||
| 153 | config_jmicron_chipset_for_pio(drive, 1); | 134 | config_jmicron_chipset_for_pio(drive, 1); |
diff --git a/drivers/ide/pci/piix.c b/drivers/ide/pci/piix.c index 84d3938a430a..8b219dd63024 100644 --- a/drivers/ide/pci/piix.c +++ b/drivers/ide/pci/piix.c | |||
| @@ -304,30 +304,6 @@ static int piix_tune_chipset (ide_drive_t *drive, u8 xferspeed) | |||
| 304 | } | 304 | } |
| 305 | 305 | ||
| 306 | /** | 306 | /** |
| 307 | * piix_config_drive_for_dma - configure drive for DMA | ||
| 308 | * @drive: IDE drive to configure | ||
| 309 | * | ||
| 310 | * Set up a PIIX interface channel for the best available speed. | ||
| 311 | * We prefer UDMA if it is available and then MWDMA. If DMA is | ||
| 312 | * not available we switch to PIO and return 0. | ||
| 313 | */ | ||
| 314 | |||
| 315 | static int piix_config_drive_for_dma (ide_drive_t *drive) | ||
| 316 | { | ||
| 317 | u8 speed = ide_max_dma_mode(drive); | ||
| 318 | |||
| 319 | /* | ||
| 320 | * If no DMA speed was available or the chipset has DMA bugs | ||
| 321 | * then disable DMA and use PIO | ||
| 322 | */ | ||
| 323 | if (!speed) | ||
| 324 | return 0; | ||
| 325 | |||
| 326 | (void) piix_tune_chipset(drive, speed); | ||
| 327 | return ide_dma_enable(drive); | ||
| 328 | } | ||
| 329 | |||
| 330 | /** | ||
| 331 | * piix_config_drive_xfer_rate - set up an IDE device | 307 | * piix_config_drive_xfer_rate - set up an IDE device |
| 332 | * @drive: IDE drive to configure | 308 | * @drive: IDE drive to configure |
| 333 | * | 309 | * |
| @@ -339,7 +315,7 @@ static int piix_config_drive_xfer_rate (ide_drive_t *drive) | |||
| 339 | { | 315 | { |
| 340 | drive->init_speed = 0; | 316 | drive->init_speed = 0; |
| 341 | 317 | ||
| 342 | if (ide_use_dma(drive) && piix_config_drive_for_dma(drive)) | 318 | if (ide_tune_dma(drive)) |
| 343 | return 0; | 319 | return 0; |
| 344 | 320 | ||
| 345 | if (ide_use_fast_pio(drive)) | 321 | if (ide_use_fast_pio(drive)) |
diff --git a/drivers/ide/pci/sis5513.c b/drivers/ide/pci/sis5513.c index 83c80ed73e99..41953fe4fa6b 100644 --- a/drivers/ide/pci/sis5513.c +++ b/drivers/ide/pci/sis5513.c | |||
| @@ -638,32 +638,13 @@ static void sis5513_tune_drive (ide_drive_t *drive, u8 pio) | |||
| 638 | (void) config_chipset_for_pio(drive, pio); | 638 | (void) config_chipset_for_pio(drive, pio); |
| 639 | } | 639 | } |
| 640 | 640 | ||
| 641 | /* | ||
| 642 | * ((id->hw_config & 0x4000|0x2000) && (HWIF(drive)->udma_four)) | ||
| 643 | */ | ||
| 644 | static int config_chipset_for_dma (ide_drive_t *drive) | ||
| 645 | { | ||
| 646 | u8 speed = ide_max_dma_mode(drive); | ||
| 647 | |||
| 648 | #ifdef DEBUG | ||
| 649 | printk("SIS5513: config_chipset_for_dma, drive %d, ultra %x\n", | ||
| 650 | drive->dn, drive->id->dma_ultra); | ||
| 651 | #endif | ||
| 652 | |||
| 653 | if (!(speed)) | ||
| 654 | return 0; | ||
| 655 | |||
| 656 | sis5513_tune_chipset(drive, speed); | ||
| 657 | return ide_dma_enable(drive); | ||
| 658 | } | ||
| 659 | |||
| 660 | static int sis5513_config_xfer_rate(ide_drive_t *drive) | 641 | static int sis5513_config_xfer_rate(ide_drive_t *drive) |
| 661 | { | 642 | { |
| 662 | config_art_rwp_pio(drive, 5); | 643 | config_art_rwp_pio(drive, 5); |
| 663 | 644 | ||
| 664 | drive->init_speed = 0; | 645 | drive->init_speed = 0; |
| 665 | 646 | ||
| 666 | if (ide_use_dma(drive) && config_chipset_for_dma(drive)) | 647 | if (ide_tune_dma(drive)) |
| 667 | return 0; | 648 | return 0; |
| 668 | 649 | ||
| 669 | if (ide_use_fast_pio(drive)) | 650 | if (ide_use_fast_pio(drive)) |
diff --git a/drivers/ide/pci/slc90e66.c b/drivers/ide/pci/slc90e66.c index 9e95a5cbf984..c40f291f91e0 100644 --- a/drivers/ide/pci/slc90e66.c +++ b/drivers/ide/pci/slc90e66.c | |||
| @@ -160,22 +160,11 @@ static int slc90e66_tune_chipset (ide_drive_t *drive, u8 xferspeed) | |||
| 160 | return ide_config_drive_speed(drive, speed); | 160 | return ide_config_drive_speed(drive, speed); |
| 161 | } | 161 | } |
| 162 | 162 | ||
| 163 | static int slc90e66_config_drive_for_dma (ide_drive_t *drive) | ||
| 164 | { | ||
| 165 | u8 speed = ide_max_dma_mode(drive); | ||
| 166 | |||
| 167 | if (!speed) | ||
| 168 | return 0; | ||
| 169 | |||
| 170 | (void) slc90e66_tune_chipset(drive, speed); | ||
| 171 | return ide_dma_enable(drive); | ||
| 172 | } | ||
| 173 | |||
| 174 | static int slc90e66_config_drive_xfer_rate (ide_drive_t *drive) | 163 | static int slc90e66_config_drive_xfer_rate (ide_drive_t *drive) |
| 175 | { | 164 | { |
| 176 | drive->init_speed = 0; | 165 | drive->init_speed = 0; |
| 177 | 166 | ||
| 178 | if (ide_use_dma(drive) && slc90e66_config_drive_for_dma(drive)) | 167 | if (ide_tune_dma(drive)) |
| 179 | return 0; | 168 | return 0; |
| 180 | 169 | ||
| 181 | if (ide_use_fast_pio(drive)) | 170 | if (ide_use_fast_pio(drive)) |
diff --git a/drivers/ide/pci/tc86c001.c b/drivers/ide/pci/tc86c001.c index 168f035caa3f..cee619bb2eaf 100644 --- a/drivers/ide/pci/tc86c001.c +++ b/drivers/ide/pci/tc86c001.c | |||
| @@ -167,20 +167,9 @@ static int tc86c001_busproc(ide_drive_t *drive, int state) | |||
| 167 | return 0; | 167 | return 0; |
| 168 | } | 168 | } |
| 169 | 169 | ||
| 170 | static int config_chipset_for_dma(ide_drive_t *drive) | ||
| 171 | { | ||
| 172 | u8 speed = ide_max_dma_mode(drive); | ||
| 173 | |||
| 174 | if (!speed) | ||
| 175 | return 0; | ||
| 176 | |||
| 177 | (void) tc86c001_tune_chipset(drive, speed); | ||
| 178 | return ide_dma_enable(drive); | ||
| 179 | } | ||
| 180 | |||
| 181 | static int tc86c001_config_drive_xfer_rate(ide_drive_t *drive) | 170 | static int tc86c001_config_drive_xfer_rate(ide_drive_t *drive) |
| 182 | { | 171 | { |
| 183 | if (ide_use_dma(drive) && config_chipset_for_dma(drive)) | 172 | if (ide_tune_dma(drive)) |
| 184 | return 0; | 173 | return 0; |
| 185 | 174 | ||
| 186 | if (ide_use_fast_pio(drive)) | 175 | if (ide_use_fast_pio(drive)) |
diff --git a/drivers/ide/pci/triflex.c b/drivers/ide/pci/triflex.c index 8a877235b949..35e8c612638f 100644 --- a/drivers/ide/pci/triflex.c +++ b/drivers/ide/pci/triflex.c | |||
| @@ -100,20 +100,9 @@ static void triflex_tune_drive(ide_drive_t *drive, u8 pio) | |||
| 100 | (void) triflex_tune_chipset(drive, (XFER_PIO_0 + use_pio)); | 100 | (void) triflex_tune_chipset(drive, (XFER_PIO_0 + use_pio)); |
| 101 | } | 101 | } |
| 102 | 102 | ||
| 103 | static int triflex_config_drive_for_dma(ide_drive_t *drive) | ||
| 104 | { | ||
| 105 | u8 speed = ide_max_dma_mode(drive); | ||
| 106 | |||
| 107 | if (!speed) | ||
| 108 | return 0; | ||
| 109 | |||
| 110 | (void) triflex_tune_chipset(drive, speed); | ||
| 111 | return ide_dma_enable(drive); | ||
| 112 | } | ||
| 113 | |||
| 114 | static int triflex_config_drive_xfer_rate(ide_drive_t *drive) | 103 | static int triflex_config_drive_xfer_rate(ide_drive_t *drive) |
| 115 | { | 104 | { |
| 116 | if (ide_use_dma(drive) && triflex_config_drive_for_dma(drive)) | 105 | if (ide_tune_dma(drive)) |
| 117 | return 0; | 106 | return 0; |
| 118 | 107 | ||
| 119 | triflex_tune_drive(drive, 255); | 108 | triflex_tune_drive(drive, 255); |
diff --git a/include/linux/ide.h b/include/linux/ide.h index 23ab4dc05009..d03fa2d5d75a 100644 --- a/include/linux/ide.h +++ b/include/linux/ide.h | |||
| @@ -1277,6 +1277,7 @@ int __ide_dma_bad_drive(ide_drive_t *); | |||
| 1277 | int __ide_dma_good_drive(ide_drive_t *); | 1277 | int __ide_dma_good_drive(ide_drive_t *); |
| 1278 | int ide_use_dma(ide_drive_t *); | 1278 | int ide_use_dma(ide_drive_t *); |
| 1279 | u8 ide_max_dma_mode(ide_drive_t *); | 1279 | u8 ide_max_dma_mode(ide_drive_t *); |
| 1280 | int ide_tune_dma(ide_drive_t *); | ||
| 1280 | void ide_dma_off(ide_drive_t *); | 1281 | void ide_dma_off(ide_drive_t *); |
| 1281 | void ide_dma_verbose(ide_drive_t *); | 1282 | void ide_dma_verbose(ide_drive_t *); |
| 1282 | int ide_set_dma(ide_drive_t *); | 1283 | int ide_set_dma(ide_drive_t *); |
| @@ -1304,6 +1305,7 @@ extern int __ide_dma_timeout(ide_drive_t *); | |||
| 1304 | #else | 1305 | #else |
| 1305 | static inline int ide_use_dma(ide_drive_t *drive) { return 0; } | 1306 | static inline int ide_use_dma(ide_drive_t *drive) { return 0; } |
| 1306 | static inline u8 ide_max_dma_mode(ide_drive_t *drive) { return 0; } | 1307 | static inline u8 ide_max_dma_mode(ide_drive_t *drive) { return 0; } |
| 1308 | static inline int ide_tune_dma(ide_drive_t *drive) { return 0; } | ||
| 1307 | static inline void ide_dma_off(ide_drive_t *drive) { ; } | 1309 | static inline void ide_dma_off(ide_drive_t *drive) { ; } |
| 1308 | static inline void ide_dma_verbose(ide_drive_t *drive) { ; } | 1310 | static inline void ide_dma_verbose(ide_drive_t *drive) { ; } |
| 1309 | static inline int ide_set_dma(ide_drive_t *drive) { return 1; } | 1311 | static inline int ide_set_dma(ide_drive_t *drive) { return 1; } |
