aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/ide/pci
diff options
context:
space:
mode:
authorBartlomiej Zolnierkiewicz <bzolnier@gmail.com>2007-10-11 17:53:59 -0400
committerBartlomiej Zolnierkiewicz <bzolnier@gmail.com>2007-10-11 17:53:59 -0400
commitf212ff28f08e4ddcef9f25b13463c45cc4204a0c (patch)
treee8fe63044c2ebec404689cbd55d75497aa77da0a /drivers/ide/pci
parent3160d5416f39da9d9221fec7cb9d64399b706bbc (diff)
ide: move ide_rate_filter() calls to the upper layer (take 2)
* Move ide_rate_filter() calls from host drivers to IDE core. * Make ide_rate_filter() static. * Make 'speed' argument of ->speedproc const. v2: * Fix it8213_tune_chipset() comment. There should be no functionality changes caused by this patch. Acked-by: Sergei Shtylyov <sshtylyov@ru.mvista.com> Signed-off-by: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
Diffstat (limited to 'drivers/ide/pci')
-rw-r--r--drivers/ide/pci/aec62xx.c6
-rw-r--r--drivers/ide/pci/alim15x3.c7
-rw-r--r--drivers/ide/pci/amd74xx.c4
-rw-r--r--drivers/ide/pci/atiixp.c8
-rw-r--r--drivers/ide/pci/cmd64x.c4
-rw-r--r--drivers/ide/pci/cs5520.c5
-rw-r--r--drivers/ide/pci/cs5530.c4
-rw-r--r--drivers/ide/pci/cs5535.c3
-rw-r--r--drivers/ide/pci/hpt34x.c3
-rw-r--r--drivers/ide/pci/hpt366.c6
-rw-r--r--drivers/ide/pci/it8213.c10
-rw-r--r--drivers/ide/pci/it821x.c10
-rw-r--r--drivers/ide/pci/jmicron.c9
-rw-r--r--drivers/ide/pci/pdc202xx_new.c4
-rw-r--r--drivers/ide/pci/pdc202xx_old.c3
-rw-r--r--drivers/ide/pci/piix.c7
-rw-r--r--drivers/ide/pci/sc1200.c4
-rw-r--r--drivers/ide/pci/scc_pata.c5
-rw-r--r--drivers/ide/pci/serverworks.c3
-rw-r--r--drivers/ide/pci/siimage.c11
-rw-r--r--drivers/ide/pci/sis5513.c7
-rw-r--r--drivers/ide/pci/sl82c105.c4
-rw-r--r--drivers/ide/pci/slc90e66.c3
-rw-r--r--drivers/ide/pci/tc86c001.c4
-rw-r--r--drivers/ide/pci/triflex.c3
-rw-r--r--drivers/ide/pci/via82cxxx.c4
26 files changed, 46 insertions, 95 deletions
diff --git a/drivers/ide/pci/aec62xx.c b/drivers/ide/pci/aec62xx.c
index 74432830abf7..a827ea2ab989 100644
--- a/drivers/ide/pci/aec62xx.c
+++ b/drivers/ide/pci/aec62xx.c
@@ -87,12 +87,11 @@ static u8 pci_bus_clock_list_ultra (u8 speed, struct chipset_bus_clock_list_entr
87 return chipset_table->ultra_settings; 87 return chipset_table->ultra_settings;
88} 88}
89 89
90static int aec6210_tune_chipset (ide_drive_t *drive, u8 xferspeed) 90static int aec6210_tune_chipset(ide_drive_t *drive, const u8 speed)
91{ 91{
92 ide_hwif_t *hwif = HWIF(drive); 92 ide_hwif_t *hwif = HWIF(drive);
93 struct pci_dev *dev = hwif->pci_dev; 93 struct pci_dev *dev = hwif->pci_dev;
94 u16 d_conf = 0; 94 u16 d_conf = 0;
95 u8 speed = ide_rate_filter(drive, xferspeed);
96 u8 ultra = 0, ultra_conf = 0; 95 u8 ultra = 0, ultra_conf = 0;
97 u8 tmp0 = 0, tmp1 = 0, tmp2 = 0; 96 u8 tmp0 = 0, tmp1 = 0, tmp2 = 0;
98 unsigned long flags; 97 unsigned long flags;
@@ -115,11 +114,10 @@ static int aec6210_tune_chipset (ide_drive_t *drive, u8 xferspeed)
115 return(ide_config_drive_speed(drive, speed)); 114 return(ide_config_drive_speed(drive, speed));
116} 115}
117 116
118static int aec6260_tune_chipset (ide_drive_t *drive, u8 xferspeed) 117static int aec6260_tune_chipset(ide_drive_t *drive, const u8 speed)
119{ 118{
120 ide_hwif_t *hwif = HWIF(drive); 119 ide_hwif_t *hwif = HWIF(drive);
121 struct pci_dev *dev = hwif->pci_dev; 120 struct pci_dev *dev = hwif->pci_dev;
122 u8 speed = ide_rate_filter(drive, xferspeed);
123 u8 unit = (drive->select.b.unit & 0x01); 121 u8 unit = (drive->select.b.unit & 0x01);
124 u8 tmp1 = 0, tmp2 = 0; 122 u8 tmp1 = 0, tmp2 = 0;
125 u8 ultra = 0, drive_conf = 0, ultra_conf = 0; 123 u8 ultra = 0, drive_conf = 0, ultra_conf = 0;
diff --git a/drivers/ide/pci/alim15x3.c b/drivers/ide/pci/alim15x3.c
index 11ecb618007c..37ecd726aa40 100644
--- a/drivers/ide/pci/alim15x3.c
+++ b/drivers/ide/pci/alim15x3.c
@@ -409,17 +409,16 @@ static u8 ali_udma_filter(ide_drive_t *drive)
409/** 409/**
410 * ali15x3_tune_chipset - set up chipset/drive for new speed 410 * ali15x3_tune_chipset - set up chipset/drive for new speed
411 * @drive: drive to configure for 411 * @drive: drive to configure for
412 * @xferspeed: desired speed 412 * @speed: desired speed
413 * 413 *
414 * Configure the hardware for the desired IDE transfer mode. 414 * Configure the hardware for the desired IDE transfer mode.
415 * We also do the needed drive configuration through helpers 415 * We also do the needed drive configuration through helpers
416 */ 416 */
417 417
418static int ali15x3_tune_chipset (ide_drive_t *drive, u8 xferspeed) 418static int ali15x3_tune_chipset(ide_drive_t *drive, const u8 speed)
419{ 419{
420 ide_hwif_t *hwif = HWIF(drive); 420 ide_hwif_t *hwif = HWIF(drive);
421 struct pci_dev *dev = hwif->pci_dev; 421 struct pci_dev *dev = hwif->pci_dev;
422 u8 speed = ide_rate_filter(drive, xferspeed);
423 u8 speed1 = speed; 422 u8 speed1 = speed;
424 u8 unit = (drive->select.b.unit & 0x01); 423 u8 unit = (drive->select.b.unit & 0x01);
425 u8 tmpbyte = 0x00; 424 u8 tmpbyte = 0x00;
diff --git a/drivers/ide/pci/amd74xx.c b/drivers/ide/pci/amd74xx.c
index 3c0bb1e79514..9abbde3c7984 100644
--- a/drivers/ide/pci/amd74xx.c
+++ b/drivers/ide/pci/amd74xx.c
@@ -234,14 +234,12 @@ static void amd_set_speed(struct pci_dev *dev, unsigned char dn, struct ide_timi
234 * by upper layers. 234 * by upper layers.
235 */ 235 */
236 236
237static int amd_set_drive(ide_drive_t *drive, u8 speed) 237static int amd_set_drive(ide_drive_t *drive, const u8 speed)
238{ 238{
239 ide_drive_t *peer = HWIF(drive)->drives + (~drive->dn & 1); 239 ide_drive_t *peer = HWIF(drive)->drives + (~drive->dn & 1);
240 struct ide_timing t, p; 240 struct ide_timing t, p;
241 int T, UT; 241 int T, UT;
242 242
243 speed = ide_rate_filter(drive, speed);
244
245 if (speed != XFER_PIO_SLOW) 243 if (speed != XFER_PIO_SLOW)
246 ide_config_drive_speed(drive, speed); 244 ide_config_drive_speed(drive, speed);
247 245
diff --git a/drivers/ide/pci/atiixp.c b/drivers/ide/pci/atiixp.c
index 679eb92b8920..e05e88298500 100644
--- a/drivers/ide/pci/atiixp.c
+++ b/drivers/ide/pci/atiixp.c
@@ -163,23 +163,21 @@ static void atiixp_tuneproc(ide_drive_t *drive, u8 pio)
163/** 163/**
164 * atiixp_tune_chipset - tune a ATIIXP interface 164 * atiixp_tune_chipset - tune a ATIIXP interface
165 * @drive: IDE drive to tune 165 * @drive: IDE drive to tune
166 * @xferspeed: speed to configure 166 * @speed: speed to configure
167 * 167 *
168 * Set a ATIIXP interface channel to the desired speeds. This involves 168 * Set a ATIIXP interface channel to the desired speeds. This involves
169 * requires the right timing data into the ATIIXP configuration space 169 * requires the right timing data into the ATIIXP configuration space
170 * then setting the drive parameters appropriately 170 * then setting the drive parameters appropriately
171 */ 171 */
172 172
173static int atiixp_speedproc(ide_drive_t *drive, u8 xferspeed) 173static int atiixp_speedproc(ide_drive_t *drive, const u8 speed)
174{ 174{
175 struct pci_dev *dev = drive->hwif->pci_dev; 175 struct pci_dev *dev = drive->hwif->pci_dev;
176 unsigned long flags; 176 unsigned long flags;
177 int timing_shift = (drive->dn & 2) ? 16 : 0 + (drive->dn & 1) ? 0 : 8; 177 int timing_shift = (drive->dn & 2) ? 16 : 0 + (drive->dn & 1) ? 0 : 8;
178 u32 tmp32; 178 u32 tmp32;
179 u16 tmp16; 179 u16 tmp16;
180 u8 speed, pio; 180 u8 pio;
181
182 speed = ide_rate_filter(drive, xferspeed);
183 181
184 if (speed >= XFER_PIO_0 && speed <= XFER_PIO_4) { 182 if (speed >= XFER_PIO_0 && speed <= XFER_PIO_4) {
185 atiixp_tune_pio(drive, speed - XFER_PIO_0); 183 atiixp_tune_pio(drive, speed - XFER_PIO_0);
diff --git a/drivers/ide/pci/cmd64x.c b/drivers/ide/pci/cmd64x.c
index 0e3b5de26e69..5fe50a234ce1 100644
--- a/drivers/ide/pci/cmd64x.c
+++ b/drivers/ide/pci/cmd64x.c
@@ -288,15 +288,13 @@ static void cmd64x_tune_drive (ide_drive_t *drive, u8 pio)
288 (void) ide_config_drive_speed(drive, XFER_PIO_0 + pio); 288 (void) ide_config_drive_speed(drive, XFER_PIO_0 + pio);
289} 289}
290 290
291static int cmd64x_tune_chipset (ide_drive_t *drive, u8 speed) 291static int cmd64x_tune_chipset(ide_drive_t *drive, const u8 speed)
292{ 292{
293 ide_hwif_t *hwif = HWIF(drive); 293 ide_hwif_t *hwif = HWIF(drive);
294 struct pci_dev *dev = hwif->pci_dev; 294 struct pci_dev *dev = hwif->pci_dev;
295 u8 unit = drive->dn & 0x01; 295 u8 unit = drive->dn & 0x01;
296 u8 regU = 0, pciU = hwif->channel ? UDIDETCR1 : UDIDETCR0; 296 u8 regU = 0, pciU = hwif->channel ? UDIDETCR1 : UDIDETCR0;
297 297
298 speed = ide_rate_filter(drive, speed);
299
300 if (speed >= XFER_SW_DMA_0) { 298 if (speed >= XFER_SW_DMA_0) {
301 (void) pci_read_config_byte(dev, pciU, &regU); 299 (void) pci_read_config_byte(dev, pciU, &regU);
302 regU &= ~(unit ? 0xCA : 0x35); 300 regU &= ~(unit ? 0xCA : 0x35);
diff --git a/drivers/ide/pci/cs5520.c b/drivers/ide/pci/cs5520.c
index 507981042c82..af67438328a8 100644
--- a/drivers/ide/pci/cs5520.c
+++ b/drivers/ide/pci/cs5520.c
@@ -66,16 +66,15 @@ static struct pio_clocks cs5520_pio_clocks[]={
66 {1, 2, 1} 66 {1, 2, 1}
67}; 67};
68 68
69static int cs5520_tune_chipset(ide_drive_t *drive, u8 xferspeed) 69static int cs5520_tune_chipset(ide_drive_t *drive, const u8 speed)
70{ 70{
71 ide_hwif_t *hwif = HWIF(drive); 71 ide_hwif_t *hwif = HWIF(drive);
72 struct pci_dev *pdev = hwif->pci_dev; 72 struct pci_dev *pdev = hwif->pci_dev;
73 u8 speed = ide_rate_filter(drive, xferspeed);
74 int pio = speed; 73 int pio = speed;
75 u8 reg; 74 u8 reg;
76 int controller = drive->dn > 1 ? 1 : 0; 75 int controller = drive->dn > 1 ? 1 : 0;
77 int error; 76 int error;
78 77
79 switch(speed) 78 switch(speed)
80 { 79 {
81 case XFER_PIO_4: 80 case XFER_PIO_4:
diff --git a/drivers/ide/pci/cs5530.c b/drivers/ide/pci/cs5530.c
index e5949b1d3fb0..518f430c1529 100644
--- a/drivers/ide/pci/cs5530.c
+++ b/drivers/ide/pci/cs5530.c
@@ -143,13 +143,11 @@ static int cs5530_config_dma(ide_drive_t *drive)
143 return 1; 143 return 1;
144} 144}
145 145
146static int cs5530_tune_chipset(ide_drive_t *drive, u8 mode) 146static int cs5530_tune_chipset(ide_drive_t *drive, const u8 mode)
147{ 147{
148 unsigned long basereg; 148 unsigned long basereg;
149 unsigned int reg, timings = 0; 149 unsigned int reg, timings = 0;
150 150
151 mode = ide_rate_filter(drive, mode);
152
153 /* 151 /*
154 * Tell the drive to switch to the new mode; abort on failure. 152 * Tell the drive to switch to the new mode; abort on failure.
155 */ 153 */
diff --git a/drivers/ide/pci/cs5535.c b/drivers/ide/pci/cs5535.c
index 082ca7da2cbc..bc00e7b62151 100644
--- a/drivers/ide/pci/cs5535.c
+++ b/drivers/ide/pci/cs5535.c
@@ -75,7 +75,7 @@ static unsigned int cs5535_udma_timings[5] =
75 * 75 *
76 * cs5535_set_speed() configures the chipset to a new speed. 76 * cs5535_set_speed() configures the chipset to a new speed.
77 */ 77 */
78static void cs5535_set_speed(ide_drive_t *drive, u8 speed) 78static void cs5535_set_speed(ide_drive_t *drive, const u8 speed)
79{ 79{
80 80
81 u32 reg = 0, dummy; 81 u32 reg = 0, dummy;
@@ -141,7 +141,6 @@ static void cs5535_set_speed(ide_drive_t *drive, u8 speed)
141 */ 141 */
142static int cs5535_set_drive(ide_drive_t *drive, u8 speed) 142static int cs5535_set_drive(ide_drive_t *drive, u8 speed)
143{ 143{
144 speed = ide_rate_filter(drive, speed);
145 ide_config_drive_speed(drive, speed); 144 ide_config_drive_speed(drive, speed);
146 cs5535_set_speed(drive, speed); 145 cs5535_set_speed(drive, speed);
147 146
diff --git a/drivers/ide/pci/hpt34x.c b/drivers/ide/pci/hpt34x.c
index cb8fe5643d3b..ba982d66ff73 100644
--- a/drivers/ide/pci/hpt34x.c
+++ b/drivers/ide/pci/hpt34x.c
@@ -43,10 +43,9 @@
43 43
44#define HPT343_DEBUG_DRIVE_INFO 0 44#define HPT343_DEBUG_DRIVE_INFO 0
45 45
46static int hpt34x_tune_chipset (ide_drive_t *drive, u8 xferspeed) 46static int hpt34x_tune_chipset(ide_drive_t *drive, const u8 speed)
47{ 47{
48 struct pci_dev *dev = HWIF(drive)->pci_dev; 48 struct pci_dev *dev = HWIF(drive)->pci_dev;
49 u8 speed = ide_rate_filter(drive, xferspeed);
50 u32 reg1= 0, tmp1 = 0, reg2 = 0, tmp2 = 0; 49 u32 reg1= 0, tmp1 = 0, reg2 = 0, tmp2 = 0;
51 u8 hi_speed, lo_speed; 50 u8 hi_speed, lo_speed;
52 51
diff --git a/drivers/ide/pci/hpt366.c b/drivers/ide/pci/hpt366.c
index 18c8ad091eb3..67127ac3a14a 100644
--- a/drivers/ide/pci/hpt366.c
+++ b/drivers/ide/pci/hpt366.c
@@ -600,12 +600,11 @@ static u32 get_speed_setting(u8 speed, struct hpt_info *info)
600 return (*info->settings)[i]; 600 return (*info->settings)[i];
601} 601}
602 602
603static int hpt36x_tune_chipset(ide_drive_t *drive, u8 xferspeed) 603static int hpt36x_tune_chipset(ide_drive_t *drive, const u8 speed)
604{ 604{
605 ide_hwif_t *hwif = HWIF(drive); 605 ide_hwif_t *hwif = HWIF(drive);
606 struct pci_dev *dev = hwif->pci_dev; 606 struct pci_dev *dev = hwif->pci_dev;
607 struct hpt_info *info = pci_get_drvdata(dev); 607 struct hpt_info *info = pci_get_drvdata(dev);
608 u8 speed = ide_rate_filter(drive, xferspeed);
609 u8 itr_addr = drive->dn ? 0x44 : 0x40; 608 u8 itr_addr = drive->dn ? 0x44 : 0x40;
610 u32 old_itr = 0; 609 u32 old_itr = 0;
611 u32 itr_mask, new_itr; 610 u32 itr_mask, new_itr;
@@ -628,12 +627,11 @@ static int hpt36x_tune_chipset(ide_drive_t *drive, u8 xferspeed)
628 return ide_config_drive_speed(drive, speed); 627 return ide_config_drive_speed(drive, speed);
629} 628}
630 629
631static int hpt37x_tune_chipset(ide_drive_t *drive, u8 xferspeed) 630static int hpt37x_tune_chipset(ide_drive_t *drive, const u8 speed)
632{ 631{
633 ide_hwif_t *hwif = HWIF(drive); 632 ide_hwif_t *hwif = HWIF(drive);
634 struct pci_dev *dev = hwif->pci_dev; 633 struct pci_dev *dev = hwif->pci_dev;
635 struct hpt_info *info = pci_get_drvdata(dev); 634 struct hpt_info *info = pci_get_drvdata(dev);
636 u8 speed = ide_rate_filter(drive, xferspeed);
637 u8 itr_addr = 0x40 + (drive->dn * 4); 635 u8 itr_addr = 0x40 + (drive->dn * 4);
638 u32 old_itr = 0; 636 u32 old_itr = 0;
639 u32 itr_mask, new_itr; 637 u32 itr_mask, new_itr;
diff --git a/drivers/ide/pci/it8213.c b/drivers/ide/pci/it8213.c
index 70b3245dbf62..6fa955749aec 100644
--- a/drivers/ide/pci/it8213.c
+++ b/drivers/ide/pci/it8213.c
@@ -115,20 +115,16 @@ static void it8213_tuneproc(ide_drive_t *drive, u8 pio)
115/** 115/**
116 * it8213_tune_chipset - set controller timings 116 * it8213_tune_chipset - set controller timings
117 * @drive: Drive to set up 117 * @drive: Drive to set up
118 * @xferspeed: speed we want to achieve 118 * @speed: speed we want to achieve
119 * 119 *
120 * Tune the ITE chipset for the desired mode. If we can't achieve 120 * Tune the ITE chipset for the desired mode.
121 * the desired mode then tune for a lower one, but ultimately
122 * make the thing work.
123 */ 121 */
124 122
125static int it8213_tune_chipset (ide_drive_t *drive, u8 xferspeed) 123static int it8213_tune_chipset(ide_drive_t *drive, const u8 speed)
126{ 124{
127
128 ide_hwif_t *hwif = HWIF(drive); 125 ide_hwif_t *hwif = HWIF(drive);
129 struct pci_dev *dev = hwif->pci_dev; 126 struct pci_dev *dev = hwif->pci_dev;
130 u8 maslave = 0x40; 127 u8 maslave = 0x40;
131 u8 speed = ide_rate_filter(drive, xferspeed);
132 int a_speed = 3 << (drive->dn * 4); 128 int a_speed = 3 << (drive->dn * 4);
133 int u_flag = 1 << drive->dn; 129 int u_flag = 1 << drive->dn;
134 int v_flag = 0x01 << drive->dn; 130 int v_flag = 0x01 << drive->dn;
diff --git a/drivers/ide/pci/it821x.c b/drivers/ide/pci/it821x.c
index 9286c99e2ff0..a756e61bcb32 100644
--- a/drivers/ide/pci/it821x.c
+++ b/drivers/ide/pci/it821x.c
@@ -405,23 +405,19 @@ static int it821x_dma_end(ide_drive_t *drive)
405 return ret; 405 return ret;
406} 406}
407 407
408
409/** 408/**
410 * it821x_tune_chipset - set controller timings 409 * it821x_tune_chipset - set controller timings
411 * @drive: Drive to set up 410 * @drive: Drive to set up
412 * @xferspeed: speed we want to achieve 411 * @speed: speed we want to achieve
413 * 412 *
414 * Tune the ITE chipset for the desired mode. If we can't achieve 413 * Tune the ITE chipset for the desired mode.
415 * the desired mode then tune for a lower one, but ultimately
416 * make the thing work.
417 */ 414 */
418 415
419static int it821x_tune_chipset (ide_drive_t *drive, byte xferspeed) 416static int it821x_tune_chipset(ide_drive_t *drive, const u8 speed)
420{ 417{
421 418
422 ide_hwif_t *hwif = drive->hwif; 419 ide_hwif_t *hwif = drive->hwif;
423 struct it821x_dev *itdev = ide_get_hwifdata(hwif); 420 struct it821x_dev *itdev = ide_get_hwifdata(hwif);
424 u8 speed = ide_rate_filter(drive, xferspeed);
425 421
426 switch (speed) { 422 switch (speed) {
427 case XFER_PIO_4: 423 case XFER_PIO_4:
diff --git a/drivers/ide/pci/jmicron.c b/drivers/ide/pci/jmicron.c
index 17490d255758..7bac87fb481a 100644
--- a/drivers/ide/pci/jmicron.c
+++ b/drivers/ide/pci/jmicron.c
@@ -92,17 +92,14 @@ static void jmicron_tuneproc(ide_drive_t *drive, u8 pio)
92/** 92/**
93 * jmicron_tune_chipset - set controller timings 93 * jmicron_tune_chipset - set controller timings
94 * @drive: Drive to set up 94 * @drive: Drive to set up
95 * @xferspeed: speed we want to achieve 95 * @speed: speed we want to achieve
96 * 96 *
97 * As the JMicron snoops for timings all we actually need to do is 97 * As the JMicron snoops for timings all we actually need to do is
98 * make sure we don't set an invalid mode. We do need to honour 98 * set the transfer mode on the device.
99 * the cable detect here.
100 */ 99 */
101 100
102static int jmicron_tune_chipset (ide_drive_t *drive, byte xferspeed) 101static int jmicron_tune_chipset(ide_drive_t *drive, const u8 speed)
103{ 102{
104 u8 speed = ide_rate_filter(drive, xferspeed);
105
106 return ide_config_drive_speed(drive, speed); 103 return ide_config_drive_speed(drive, speed);
107} 104}
108 105
diff --git a/drivers/ide/pci/pdc202xx_new.c b/drivers/ide/pci/pdc202xx_new.c
index 7c5544d10b9a..3787194a2249 100644
--- a/drivers/ide/pci/pdc202xx_new.c
+++ b/drivers/ide/pci/pdc202xx_new.c
@@ -146,14 +146,12 @@ static struct udma_timing {
146 { 0x1a, 0x01, 0xcb }, /* UDMA mode 6 */ 146 { 0x1a, 0x01, 0xcb }, /* UDMA mode 6 */
147}; 147};
148 148
149static int pdcnew_tune_chipset(ide_drive_t *drive, u8 speed) 149static int pdcnew_tune_chipset(ide_drive_t *drive, const u8 speed)
150{ 150{
151 ide_hwif_t *hwif = HWIF(drive); 151 ide_hwif_t *hwif = HWIF(drive);
152 u8 adj = (drive->dn & 1) ? 0x08 : 0x00; 152 u8 adj = (drive->dn & 1) ? 0x08 : 0x00;
153 int err; 153 int err;
154 154
155 speed = ide_rate_filter(drive, speed);
156
157 /* 155 /*
158 * Issue SETFEATURES_XFER to the drive first. PDC202xx hardware will 156 * Issue SETFEATURES_XFER to the drive first. PDC202xx hardware will
159 * automatically set the timing registers based on 100 MHz PLL output. 157 * automatically set the timing registers based on 100 MHz PLL output.
diff --git a/drivers/ide/pci/pdc202xx_old.c b/drivers/ide/pci/pdc202xx_old.c
index e19a891171cb..e7a5e3014c09 100644
--- a/drivers/ide/pci/pdc202xx_old.c
+++ b/drivers/ide/pci/pdc202xx_old.c
@@ -63,12 +63,11 @@ static const char *pdc_quirk_drives[] = {
63 63
64static void pdc_old_disable_66MHz_clock(ide_hwif_t *); 64static void pdc_old_disable_66MHz_clock(ide_hwif_t *);
65 65
66static int pdc202xx_tune_chipset (ide_drive_t *drive, u8 xferspeed) 66static int pdc202xx_tune_chipset(ide_drive_t *drive, const u8 speed)
67{ 67{
68 ide_hwif_t *hwif = HWIF(drive); 68 ide_hwif_t *hwif = HWIF(drive);
69 struct pci_dev *dev = hwif->pci_dev; 69 struct pci_dev *dev = hwif->pci_dev;
70 u8 drive_pci = 0x60 + (drive->dn << 2); 70 u8 drive_pci = 0x60 + (drive->dn << 2);
71 u8 speed = ide_rate_filter(drive, xferspeed);
72 71
73 u8 AP = 0, BP = 0, CP = 0; 72 u8 AP = 0, BP = 0, CP = 0;
74 u8 TA = 0, TB = 0, TC = 0; 73 u8 TA = 0, TB = 0, TC = 0;
diff --git a/drivers/ide/pci/piix.c b/drivers/ide/pci/piix.c
index 5cfa9378bbb8..b66f9d1411b3 100644
--- a/drivers/ide/pci/piix.c
+++ b/drivers/ide/pci/piix.c
@@ -221,19 +221,18 @@ static void piix_tune_drive (ide_drive_t *drive, u8 pio)
221/** 221/**
222 * piix_tune_chipset - tune a PIIX interface 222 * piix_tune_chipset - tune a PIIX interface
223 * @drive: IDE drive to tune 223 * @drive: IDE drive to tune
224 * @xferspeed: speed to configure 224 * @speed: speed to configure
225 * 225 *
226 * Set a PIIX interface channel to the desired speeds. This involves 226 * Set a PIIX interface channel to the desired speeds. This involves
227 * requires the right timing data into the PIIX configuration space 227 * requires the right timing data into the PIIX configuration space
228 * then setting the drive parameters appropriately 228 * then setting the drive parameters appropriately
229 */ 229 */
230 230
231static int piix_tune_chipset (ide_drive_t *drive, u8 xferspeed) 231static int piix_tune_chipset(ide_drive_t *drive, const u8 speed)
232{ 232{
233 ide_hwif_t *hwif = HWIF(drive); 233 ide_hwif_t *hwif = HWIF(drive);
234 struct pci_dev *dev = hwif->pci_dev; 234 struct pci_dev *dev = hwif->pci_dev;
235 u8 maslave = hwif->channel ? 0x42 : 0x40; 235 u8 maslave = hwif->channel ? 0x42 : 0x40;
236 u8 speed = ide_rate_filter(drive, xferspeed);
237 int a_speed = 3 << (drive->dn * 4); 236 int a_speed = 3 << (drive->dn * 4);
238 int u_flag = 1 << drive->dn; 237 int u_flag = 1 << drive->dn;
239 int v_flag = 0x01 << drive->dn; 238 int v_flag = 0x01 << drive->dn;
diff --git a/drivers/ide/pci/sc1200.c b/drivers/ide/pci/sc1200.c
index 9bdc9694d50d..059071cd2d49 100644
--- a/drivers/ide/pci/sc1200.c
+++ b/drivers/ide/pci/sc1200.c
@@ -138,7 +138,7 @@ out:
138 return mask; 138 return mask;
139} 139}
140 140
141static int sc1200_tune_chipset(ide_drive_t *drive, u8 mode) 141static int sc1200_tune_chipset(ide_drive_t *drive, const u8 mode)
142{ 142{
143 ide_hwif_t *hwif = HWIF(drive); 143 ide_hwif_t *hwif = HWIF(drive);
144 int unit = drive->select.b.unit; 144 int unit = drive->select.b.unit;
@@ -146,8 +146,6 @@ static int sc1200_tune_chipset(ide_drive_t *drive, u8 mode)
146 unsigned short pci_clock; 146 unsigned short pci_clock;
147 unsigned int basereg = hwif->channel ? 0x50 : 0x40; 147 unsigned int basereg = hwif->channel ? 0x50 : 0x40;
148 148
149 mode = ide_rate_filter(drive, mode);
150
151 /* 149 /*
152 * Tell the drive to switch to the new mode; abort on failure. 150 * Tell the drive to switch to the new mode; abort on failure.
153 */ 151 */
diff --git a/drivers/ide/pci/scc_pata.c b/drivers/ide/pci/scc_pata.c
index eeb0a6d434aa..a19687caf65a 100644
--- a/drivers/ide/pci/scc_pata.c
+++ b/drivers/ide/pci/scc_pata.c
@@ -231,16 +231,15 @@ static void scc_tuneproc(ide_drive_t *drive, u8 pio)
231/** 231/**
232 * scc_tune_chipset - tune a drive DMA mode 232 * scc_tune_chipset - tune a drive DMA mode
233 * @drive: Drive to set up 233 * @drive: Drive to set up
234 * @xferspeed: speed we want to achieve 234 * @speed: speed we want to achieve
235 * 235 *
236 * Load the timing settings for this device mode into the 236 * Load the timing settings for this device mode into the
237 * controller. 237 * controller.
238 */ 238 */
239 239
240static int scc_tune_chipset(ide_drive_t *drive, byte xferspeed) 240static int scc_tune_chipset(ide_drive_t *drive, const u8 speed)
241{ 241{
242 ide_hwif_t *hwif = HWIF(drive); 242 ide_hwif_t *hwif = HWIF(drive);
243 u8 speed = ide_rate_filter(drive, xferspeed);
244 struct scc_ports *ports = ide_get_hwifdata(hwif); 243 struct scc_ports *ports = ide_get_hwifdata(hwif);
245 unsigned long ctl_base = ports->ctl; 244 unsigned long ctl_base = ports->ctl;
246 unsigned long cckctrl_port = ctl_base + 0xff0; 245 unsigned long cckctrl_port = ctl_base + 0xff0;
diff --git a/drivers/ide/pci/serverworks.c b/drivers/ide/pci/serverworks.c
index 9fead2e7d4c8..b51133bb58af 100644
--- a/drivers/ide/pci/serverworks.c
+++ b/drivers/ide/pci/serverworks.c
@@ -145,7 +145,7 @@ static void svwks_tune_pio(ide_drive_t *drive, const u8 pio)
145 } 145 }
146} 146}
147 147
148static int svwks_tune_chipset (ide_drive_t *drive, u8 xferspeed) 148static int svwks_tune_chipset(ide_drive_t *drive, const u8 speed)
149{ 149{
150 static const u8 udma_modes[] = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05 }; 150 static const u8 udma_modes[] = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05 };
151 static const u8 dma_modes[] = { 0x77, 0x21, 0x20 }; 151 static const u8 dma_modes[] = { 0x77, 0x21, 0x20 };
@@ -153,7 +153,6 @@ static int svwks_tune_chipset (ide_drive_t *drive, u8 xferspeed)
153 153
154 ide_hwif_t *hwif = HWIF(drive); 154 ide_hwif_t *hwif = HWIF(drive);
155 struct pci_dev *dev = hwif->pci_dev; 155 struct pci_dev *dev = hwif->pci_dev;
156 u8 speed = ide_rate_filter(drive, xferspeed);
157 u8 unit = (drive->select.b.unit & 0x01); 156 u8 unit = (drive->select.b.unit & 0x01);
158 157
159 u8 ultra_enable = 0, ultra_timing = 0, dma_timing = 0; 158 u8 ultra_enable = 0, ultra_timing = 0, dma_timing = 0;
diff --git a/drivers/ide/pci/siimage.c b/drivers/ide/pci/siimage.c
index 50f6d172ef77..4c1f3bc7e179 100644
--- a/drivers/ide/pci/siimage.c
+++ b/drivers/ide/pci/siimage.c
@@ -229,14 +229,12 @@ static void sil_tuneproc(ide_drive_t *drive, u8 pio)
229/** 229/**
230 * siimage_tune_chipset - set controller timings 230 * siimage_tune_chipset - set controller timings
231 * @drive: Drive to set up 231 * @drive: Drive to set up
232 * @xferspeed: speed we want to achieve 232 * @speed: speed we want to achieve
233 * 233 *
234 * Tune the SII chipset for the desired mode. If we can't achieve 234 * Tune the SII chipset for the desired mode.
235 * the desired mode then tune for a lower one, but ultimately
236 * make the thing work.
237 */ 235 */
238 236
239static int siimage_tune_chipset (ide_drive_t *drive, byte xferspeed) 237static int siimage_tune_chipset(ide_drive_t *drive, const u8 speed)
240{ 238{
241 u8 ultra6[] = { 0x0F, 0x0B, 0x07, 0x05, 0x03, 0x02, 0x01 }; 239 u8 ultra6[] = { 0x0F, 0x0B, 0x07, 0x05, 0x03, 0x02, 0x01 };
242 u8 ultra5[] = { 0x0C, 0x07, 0x05, 0x04, 0x02, 0x01 }; 240 u8 ultra5[] = { 0x0C, 0x07, 0x05, 0x04, 0x02, 0x01 };
@@ -245,7 +243,6 @@ static int siimage_tune_chipset (ide_drive_t *drive, byte xferspeed)
245 ide_hwif_t *hwif = HWIF(drive); 243 ide_hwif_t *hwif = HWIF(drive);
246 u16 ultra = 0, multi = 0; 244 u16 ultra = 0, multi = 0;
247 u8 mode = 0, unit = drive->select.b.unit; 245 u8 mode = 0, unit = drive->select.b.unit;
248 u8 speed = ide_rate_filter(drive, xferspeed);
249 unsigned long base = (unsigned long)hwif->hwif_data; 246 unsigned long base = (unsigned long)hwif->hwif_data;
250 u8 scsc = 0, addr_mask = ((hwif->channel) ? 247 u8 scsc = 0, addr_mask = ((hwif->channel) ?
251 ((hwif->mmio) ? 0xF4 : 0x84) : 248 ((hwif->mmio) ? 0xF4 : 0x84) :
diff --git a/drivers/ide/pci/sis5513.c b/drivers/ide/pci/sis5513.c
index 1da037f1394e..fed582b4b32f 100644
--- a/drivers/ide/pci/sis5513.c
+++ b/drivers/ide/pci/sis5513.c
@@ -531,15 +531,12 @@ static void sis5513_tuneproc(ide_drive_t *drive, u8 pio)
531 (void)sis5513_tune_drive(drive, pio); 531 (void)sis5513_tune_drive(drive, pio);
532} 532}
533 533
534static int sis5513_tune_chipset (ide_drive_t *drive, u8 xferspeed) 534static int sis5513_tune_chipset(ide_drive_t *drive, const u8 speed)
535{ 535{
536 ide_hwif_t *hwif = HWIF(drive); 536 ide_hwif_t *hwif = HWIF(drive);
537 struct pci_dev *dev = hwif->pci_dev; 537 struct pci_dev *dev = hwif->pci_dev;
538
539 u8 drive_pci, reg, speed;
540 u32 regdw; 538 u32 regdw;
541 539 u8 drive_pci, reg;
542 speed = ide_rate_filter(drive, xferspeed);
543 540
544 /* See config_art_rwp_pio for drive pci config registers */ 541 /* See config_art_rwp_pio for drive pci config registers */
545 drive_pci = 0x40; 542 drive_pci = 0x40;
diff --git a/drivers/ide/pci/sl82c105.c b/drivers/ide/pci/sl82c105.c
index 0947cab00595..9f425b0b5721 100644
--- a/drivers/ide/pci/sl82c105.c
+++ b/drivers/ide/pci/sl82c105.c
@@ -113,7 +113,7 @@ static u8 sl82c105_tune_pio(ide_drive_t *drive, u8 pio)
113/* 113/*
114 * Configure the drive and chipset for a new transfer speed. 114 * Configure the drive and chipset for a new transfer speed.
115 */ 115 */
116static int sl82c105_tune_chipset(ide_drive_t *drive, u8 speed) 116static int sl82c105_tune_chipset(ide_drive_t *drive, const u8 speed)
117{ 117{
118 static u16 mwdma_timings[] = {0x0707, 0x0201, 0x0200}; 118 static u16 mwdma_timings[] = {0x0707, 0x0201, 0x0200};
119 u16 drv_ctrl; 119 u16 drv_ctrl;
@@ -121,8 +121,6 @@ static int sl82c105_tune_chipset(ide_drive_t *drive, u8 speed)
121 DBG(("sl82c105_tune_chipset(drive:%s, speed:%s)\n", 121 DBG(("sl82c105_tune_chipset(drive:%s, speed:%s)\n",
122 drive->name, ide_xfer_verbose(speed))); 122 drive->name, ide_xfer_verbose(speed)));
123 123
124 speed = ide_rate_filter(drive, speed);
125
126 switch (speed) { 124 switch (speed) {
127 case XFER_MW_DMA_2: 125 case XFER_MW_DMA_2:
128 case XFER_MW_DMA_1: 126 case XFER_MW_DMA_1:
diff --git a/drivers/ide/pci/slc90e66.c b/drivers/ide/pci/slc90e66.c
index 628b0664f576..cc9353565070 100644
--- a/drivers/ide/pci/slc90e66.c
+++ b/drivers/ide/pci/slc90e66.c
@@ -102,12 +102,11 @@ static void slc90e66_tune_drive (ide_drive_t *drive, u8 pio)
102 (void) ide_config_drive_speed(drive, XFER_PIO_0 + pio); 102 (void) ide_config_drive_speed(drive, XFER_PIO_0 + pio);
103} 103}
104 104
105static int slc90e66_tune_chipset (ide_drive_t *drive, u8 xferspeed) 105static int slc90e66_tune_chipset(ide_drive_t *drive, const u8 speed)
106{ 106{
107 ide_hwif_t *hwif = HWIF(drive); 107 ide_hwif_t *hwif = HWIF(drive);
108 struct pci_dev *dev = hwif->pci_dev; 108 struct pci_dev *dev = hwif->pci_dev;
109 u8 maslave = hwif->channel ? 0x42 : 0x40; 109 u8 maslave = hwif->channel ? 0x42 : 0x40;
110 u8 speed = ide_rate_filter(drive, xferspeed);
111 int sitre = 0, a_speed = 7 << (drive->dn * 4); 110 int sitre = 0, a_speed = 7 << (drive->dn * 4);
112 int u_speed = 0, u_flag = 1 << drive->dn; 111 int u_speed = 0, u_flag = 1 << drive->dn;
113 u16 reg4042, reg44, reg48, reg4a; 112 u16 reg4042, reg44, reg48, reg4a;
diff --git a/drivers/ide/pci/tc86c001.c b/drivers/ide/pci/tc86c001.c
index ec79bacc30c2..e5425772622f 100644
--- a/drivers/ide/pci/tc86c001.c
+++ b/drivers/ide/pci/tc86c001.c
@@ -13,14 +13,12 @@
13#include <linux/pci.h> 13#include <linux/pci.h>
14#include <linux/ide.h> 14#include <linux/ide.h>
15 15
16static int tc86c001_tune_chipset(ide_drive_t *drive, u8 speed) 16static int tc86c001_tune_chipset(ide_drive_t *drive, const u8 speed)
17{ 17{
18 ide_hwif_t *hwif = HWIF(drive); 18 ide_hwif_t *hwif = HWIF(drive);
19 unsigned long scr_port = hwif->config_data + (drive->dn ? 0x02 : 0x00); 19 unsigned long scr_port = hwif->config_data + (drive->dn ? 0x02 : 0x00);
20 u16 mode, scr = hwif->INW(scr_port); 20 u16 mode, scr = hwif->INW(scr_port);
21 21
22 speed = ide_rate_filter(drive, speed);
23
24 switch (speed) { 22 switch (speed) {
25 case XFER_UDMA_4: mode = 0x00c0; break; 23 case XFER_UDMA_4: mode = 0x00c0; break;
26 case XFER_UDMA_3: mode = 0x00b0; break; 24 case XFER_UDMA_3: mode = 0x00b0; break;
diff --git a/drivers/ide/pci/triflex.c b/drivers/ide/pci/triflex.c
index 098692a6d615..47cf89be4dfc 100644
--- a/drivers/ide/pci/triflex.c
+++ b/drivers/ide/pci/triflex.c
@@ -40,7 +40,7 @@
40#include <linux/ide.h> 40#include <linux/ide.h>
41#include <linux/init.h> 41#include <linux/init.h>
42 42
43static int triflex_tune_chipset(ide_drive_t *drive, u8 xferspeed) 43static int triflex_tune_chipset(ide_drive_t *drive, const u8 speed)
44{ 44{
45 ide_hwif_t *hwif = HWIF(drive); 45 ide_hwif_t *hwif = HWIF(drive);
46 struct pci_dev *dev = hwif->pci_dev; 46 struct pci_dev *dev = hwif->pci_dev;
@@ -48,7 +48,6 @@ static int triflex_tune_chipset(ide_drive_t *drive, u8 xferspeed)
48 u16 timing = 0; 48 u16 timing = 0;
49 u32 triflex_timings = 0; 49 u32 triflex_timings = 0;
50 u8 unit = (drive->select.b.unit & 0x01); 50 u8 unit = (drive->select.b.unit & 0x01);
51 u8 speed = ide_rate_filter(drive, xferspeed);
52 51
53 pci_read_config_dword(dev, channel_offset, &triflex_timings); 52 pci_read_config_dword(dev, channel_offset, &triflex_timings);
54 53
diff --git a/drivers/ide/pci/via82cxxx.c b/drivers/ide/pci/via82cxxx.c
index ec9ad6e0e1f6..e3bf90736332 100644
--- a/drivers/ide/pci/via82cxxx.c
+++ b/drivers/ide/pci/via82cxxx.c
@@ -158,15 +158,13 @@ static void via_set_speed(ide_hwif_t *hwif, u8 dn, struct ide_timing *timing)
158 * by upper layers. 158 * by upper layers.
159 */ 159 */
160 160
161static int via_set_drive(ide_drive_t *drive, u8 speed) 161static int via_set_drive(ide_drive_t *drive, const u8 speed)
162{ 162{
163 ide_drive_t *peer = HWIF(drive)->drives + (~drive->dn & 1); 163 ide_drive_t *peer = HWIF(drive)->drives + (~drive->dn & 1);
164 struct via82cxxx_dev *vdev = pci_get_drvdata(drive->hwif->pci_dev); 164 struct via82cxxx_dev *vdev = pci_get_drvdata(drive->hwif->pci_dev);
165 struct ide_timing t, p; 165 struct ide_timing t, p;
166 unsigned int T, UT; 166 unsigned int T, UT;
167 167
168 speed = ide_rate_filter(drive, speed);
169
170 if (speed != XFER_PIO_SLOW) 168 if (speed != XFER_PIO_SLOW)
171 ide_config_drive_speed(drive, speed); 169 ide_config_drive_speed(drive, speed);
172 170