aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/ide/ide-lib.c13
-rw-r--r--drivers/ide/ide-timing.h18
-rw-r--r--drivers/ide/ide.c2
-rw-r--r--drivers/ide/pci/amd74xx.c20
-rw-r--r--drivers/ide/pci/via82cxxx.c22
-rw-r--r--drivers/ide/setup-pci.c2
-rw-r--r--include/linux/ide.h7
7 files changed, 45 insertions, 39 deletions
diff --git a/drivers/ide/ide-lib.c b/drivers/ide/ide-lib.c
index df29868209f3..92a6c7bcf527 100644
--- a/drivers/ide/ide-lib.c
+++ b/drivers/ide/ide-lib.c
@@ -291,11 +291,11 @@ u8 ide_get_best_pio_mode (ide_drive_t *drive, u8 mode_wanted, u8 max_mode)
291 struct hd_driveid* id = drive->id; 291 struct hd_driveid* id = drive->id;
292 int overridden = 0; 292 int overridden = 0;
293 293
294 if (mode_wanted != 255) { 294 if (mode_wanted != 255)
295 pio_mode = mode_wanted; 295 return min_t(u8, mode_wanted, max_mode);
296 } else if (!drive->id) { 296
297 pio_mode = 0; 297 if ((drive->hwif->host_flags & IDE_HFLAG_PIO_NO_BLACKLIST) == 0 &&
298 } else if ((pio_mode = ide_scan_pio_blacklist(id->model)) != -1) { 298 (pio_mode = ide_scan_pio_blacklist(id->model)) != -1) {
299 printk(KERN_INFO "%s: is on PIO blacklist\n", drive->name); 299 printk(KERN_INFO "%s: is on PIO blacklist\n", drive->name);
300 } else { 300 } else {
301 pio_mode = id->tPIO; 301 pio_mode = id->tPIO;
@@ -324,7 +324,8 @@ u8 ide_get_best_pio_mode (ide_drive_t *drive, u8 mode_wanted, u8 max_mode)
324 /* 324 /*
325 * Conservative "downgrade" for all pre-ATA2 drives 325 * Conservative "downgrade" for all pre-ATA2 drives
326 */ 326 */
327 if (pio_mode && pio_mode < 4) { 327 if ((drive->hwif->host_flags & IDE_HFLAG_PIO_NO_DOWNGRADE) == 0 &&
328 pio_mode && pio_mode < 4) {
328 pio_mode--; 329 pio_mode--;
329 printk(KERN_INFO "%s: applying conservative " 330 printk(KERN_INFO "%s: applying conservative "
330 "PIO \"downgrade\"\n", drive->name); 331 "PIO \"downgrade\"\n", drive->name);
diff --git a/drivers/ide/ide-timing.h b/drivers/ide/ide-timing.h
index 9b5afebafbf4..daffbb9797e1 100644
--- a/drivers/ide/ide-timing.h
+++ b/drivers/ide/ide-timing.h
@@ -106,21 +106,6 @@ static struct ide_timing ide_timing[] = {
106#define XFER_EPIO 0x01 106#define XFER_EPIO 0x01
107#define XFER_PIO 0x00 107#define XFER_PIO 0x00
108 108
109static short ide_find_best_pio_mode(ide_drive_t *drive)
110{
111 struct hd_driveid *id = drive->id;
112 short best = 0;
113
114 /* EIDE PIO modes */
115 if ((id->field_valid & 2) && (id->capability & 8)) {
116 if ((best = (drive->id->eide_pio_modes & 4) ? XFER_PIO_5 :
117 (drive->id->eide_pio_modes & 2) ? XFER_PIO_4 :
118 (drive->id->eide_pio_modes & 1) ? XFER_PIO_3 : 0)) return best;
119 }
120
121 return XFER_PIO_0 + min_t(u8, id->tPIO, 2);
122}
123
124static void ide_timing_quantize(struct ide_timing *t, struct ide_timing *q, int T, int UT) 109static void ide_timing_quantize(struct ide_timing *t, struct ide_timing *q, int T, int UT)
125{ 110{
126 q->setup = EZ(t->setup * 1000, T); 111 q->setup = EZ(t->setup * 1000, T);
@@ -210,7 +195,8 @@ static int ide_timing_compute(ide_drive_t *drive, short speed, struct ide_timing
210 */ 195 */
211 196
212 if ((speed & XFER_MODE) != XFER_PIO) { 197 if ((speed & XFER_MODE) != XFER_PIO) {
213 ide_timing_compute(drive, ide_find_best_pio_mode(drive), &p, T, UT); 198 u8 pio = ide_get_best_pio_mode(drive, 255, 5);
199 ide_timing_compute(drive, XFER_PIO_0 + pio, &p, T, UT);
214 ide_timing_merge(&p, t, t, IDE_TIMING_ALL); 200 ide_timing_merge(&p, t, t, IDE_TIMING_ALL);
215 } 201 }
216 202
diff --git a/drivers/ide/ide.c b/drivers/ide/ide.c
index 077fb674a96d..b442b341d52e 100644
--- a/drivers/ide/ide.c
+++ b/drivers/ide/ide.c
@@ -455,6 +455,8 @@ static void ide_hwif_restore(ide_hwif_t *hwif, ide_hwif_t *tmp_hwif)
455 hwif->straight8 = tmp_hwif->straight8; 455 hwif->straight8 = tmp_hwif->straight8;
456 hwif->bus_state = tmp_hwif->bus_state; 456 hwif->bus_state = tmp_hwif->bus_state;
457 457
458 hwif->host_flags = tmp_hwif->host_flags;
459
458 hwif->atapi_dma = tmp_hwif->atapi_dma; 460 hwif->atapi_dma = tmp_hwif->atapi_dma;
459 hwif->ultra_mask = tmp_hwif->ultra_mask; 461 hwif->ultra_mask = tmp_hwif->ultra_mask;
460 hwif->mwdma_mask = tmp_hwif->mwdma_mask; 462 hwif->mwdma_mask = tmp_hwif->mwdma_mask;
diff --git a/drivers/ide/pci/amd74xx.c b/drivers/ide/pci/amd74xx.c
index 9c3ea90aeb8b..5ed1d485fc7e 100644
--- a/drivers/ide/pci/amd74xx.c
+++ b/drivers/ide/pci/amd74xx.c
@@ -1,5 +1,5 @@
1/* 1/*
2 * Version 2.20 2 * Version 2.21
3 * 3 *
4 * AMD 755/756/766/8111 and nVidia nForce/2/2s/3/3s/CK804/MCP04 4 * AMD 755/756/766/8111 and nVidia nForce/2/2s/3/3s/CK804/MCP04
5 * IDE driver for Linux. 5 * IDE driver for Linux.
@@ -272,10 +272,8 @@ static int amd_set_drive(ide_drive_t *drive, u8 speed)
272 272
273static void amd74xx_tune_drive(ide_drive_t *drive, u8 pio) 273static void amd74xx_tune_drive(ide_drive_t *drive, u8 pio)
274{ 274{
275 if (pio == 255) { 275 if (pio == 255)
276 amd_set_drive(drive, ide_find_best_pio_mode(drive)); 276 pio = ide_get_best_pio_mode(drive, 255, 5);
277 return;
278 }
279 277
280 amd_set_drive(drive, XFER_PIO_0 + min_t(byte, pio, 5)); 278 amd_set_drive(drive, XFER_PIO_0 + min_t(byte, pio, 5));
281} 279}
@@ -284,12 +282,14 @@ static int amd74xx_ide_dma_check(ide_drive_t *drive)
284{ 282{
285 u8 speed = ide_max_dma_mode(drive); 283 u8 speed = ide_max_dma_mode(drive);
286 284
287 if (speed == 0) 285 if (speed == 0) {
288 speed = ide_find_best_pio_mode(drive); 286 amd74xx_tune_drive(drive, 255);
287 return -1;
288 }
289 289
290 amd_set_drive(drive, speed); 290 amd_set_drive(drive, speed);
291 291
292 if (drive->autodma && (speed & XFER_MODE) != XFER_PIO) 292 if (drive->autodma)
293 return 0; 293 return 0;
294 294
295 return -1; 295 return -1;
@@ -451,6 +451,8 @@ static void __devinit init_hwif_amd74xx(ide_hwif_t *hwif)
451 .autodma = AUTODMA, \ 451 .autodma = AUTODMA, \
452 .enablebits = {{0x40,0x02,0x02}, {0x40,0x01,0x01}}, \ 452 .enablebits = {{0x40,0x02,0x02}, {0x40,0x01,0x01}}, \
453 .bootable = ON_BOARD, \ 453 .bootable = ON_BOARD, \
454 .host_flags = IDE_HFLAG_PIO_NO_BLACKLIST \
455 | IDE_HFLAG_PIO_NO_DOWNGRADE, \
454 } 456 }
455 457
456#define DECLARE_NV_DEV(name_str) \ 458#define DECLARE_NV_DEV(name_str) \
@@ -461,6 +463,8 @@ static void __devinit init_hwif_amd74xx(ide_hwif_t *hwif)
461 .autodma = AUTODMA, \ 463 .autodma = AUTODMA, \
462 .enablebits = {{0x50,0x02,0x02}, {0x50,0x01,0x01}}, \ 464 .enablebits = {{0x50,0x02,0x02}, {0x50,0x01,0x01}}, \
463 .bootable = ON_BOARD, \ 465 .bootable = ON_BOARD, \
466 .host_flags = IDE_HFLAG_PIO_NO_BLACKLIST \
467 | IDE_HFLAG_PIO_NO_DOWNGRADE, \
464 } 468 }
465 469
466static ide_pci_device_t amd74xx_chipsets[] __devinitdata = { 470static ide_pci_device_t amd74xx_chipsets[] __devinitdata = {
diff --git a/drivers/ide/pci/via82cxxx.c b/drivers/ide/pci/via82cxxx.c
index bfc9b67f8c92..b107ee3588f7 100644
--- a/drivers/ide/pci/via82cxxx.c
+++ b/drivers/ide/pci/via82cxxx.c
@@ -1,6 +1,6 @@
1/* 1/*
2 * 2 *
3 * Version 3.45 3 * Version 3.46
4 * 4 *
5 * VIA IDE driver for Linux. Supported southbridges: 5 * VIA IDE driver for Linux. Supported southbridges:
6 * 6 *
@@ -203,10 +203,8 @@ static int via_set_drive(ide_drive_t *drive, u8 speed)
203 203
204static void via82cxxx_tune_drive(ide_drive_t *drive, u8 pio) 204static void via82cxxx_tune_drive(ide_drive_t *drive, u8 pio)
205{ 205{
206 if (pio == 255) { 206 if (pio == 255)
207 via_set_drive(drive, ide_find_best_pio_mode(drive)); 207 pio = ide_get_best_pio_mode(drive, 255, 5);
208 return;
209 }
210 208
211 via_set_drive(drive, XFER_PIO_0 + min_t(u8, pio, 5)); 209 via_set_drive(drive, XFER_PIO_0 + min_t(u8, pio, 5));
212} 210}
@@ -223,12 +221,14 @@ static int via82cxxx_ide_dma_check (ide_drive_t *drive)
223{ 221{
224 u8 speed = ide_max_dma_mode(drive); 222 u8 speed = ide_max_dma_mode(drive);
225 223
226 if (speed == 0) 224 if (speed == 0) {
227 speed = ide_find_best_pio_mode(drive); 225 via82cxxx_tune_drive(drive, 255);
226 return -1;
227 }
228 228
229 via_set_drive(drive, speed); 229 via_set_drive(drive, speed);
230 230
231 if (drive->autodma && (speed & XFER_MODE) != XFER_PIO) 231 if (drive->autodma)
232 return 0; 232 return 0;
233 233
234 return -1; 234 return -1;
@@ -500,7 +500,9 @@ static ide_pci_device_t via82cxxx_chipsets[] __devinitdata = {
500 .init_hwif = init_hwif_via82cxxx, 500 .init_hwif = init_hwif_via82cxxx,
501 .autodma = NOAUTODMA, 501 .autodma = NOAUTODMA,
502 .enablebits = {{0x40,0x02,0x02}, {0x40,0x01,0x01}}, 502 .enablebits = {{0x40,0x02,0x02}, {0x40,0x01,0x01}},
503 .bootable = ON_BOARD 503 .bootable = ON_BOARD,
504 .host_flags = IDE_HFLAG_PIO_NO_BLACKLIST
505 | IDE_HFLAG_PIO_NO_DOWNGRADE,
504 },{ /* 1 */ 506 },{ /* 1 */
505 .name = "VP_IDE", 507 .name = "VP_IDE",
506 .init_chipset = init_chipset_via82cxxx, 508 .init_chipset = init_chipset_via82cxxx,
@@ -508,6 +510,8 @@ static ide_pci_device_t via82cxxx_chipsets[] __devinitdata = {
508 .autodma = AUTODMA, 510 .autodma = AUTODMA,
509 .enablebits = {{0x00,0x00,0x00}, {0x00,0x00,0x00}}, 511 .enablebits = {{0x00,0x00,0x00}, {0x00,0x00,0x00}},
510 .bootable = ON_BOARD, 512 .bootable = ON_BOARD,
513 .host_flags = IDE_HFLAG_PIO_NO_BLACKLIST
514 | IDE_HFLAG_PIO_NO_DOWNGRADE,
511 } 515 }
512}; 516};
513 517
diff --git a/drivers/ide/setup-pci.c b/drivers/ide/setup-pci.c
index bfe1f4e59597..e9f3267456e2 100644
--- a/drivers/ide/setup-pci.c
+++ b/drivers/ide/setup-pci.c
@@ -613,6 +613,8 @@ void ide_pci_setup_ports(struct pci_dev *dev, ide_pci_device_t *d, int pciirq, a
613 else 613 else
614 ide_hwif_setup_dma(dev, d, hwif); 614 ide_hwif_setup_dma(dev, d, hwif);
615bypass_legacy_dma: 615bypass_legacy_dma:
616 hwif->host_flags = d->host_flags;
617
616 if (d->init_hwif) 618 if (d->init_hwif)
617 /* Call chipset-specific routine 619 /* Call chipset-specific routine
618 * for each enabled hwif 620 * for each enabled hwif
diff --git a/include/linux/ide.h b/include/linux/ide.h
index 14a87f619d17..9f72f6e0c954 100644
--- a/include/linux/ide.h
+++ b/include/linux/ide.h
@@ -681,6 +681,8 @@ typedef struct hwif_s {
681 u8 straight8; /* Alan's straight 8 check */ 681 u8 straight8; /* Alan's straight 8 check */
682 u8 bus_state; /* power state of the IDE bus */ 682 u8 bus_state; /* power state of the IDE bus */
683 683
684 u8 host_flags;
685
684 u8 atapi_dma; /* host supports atapi_dma */ 686 u8 atapi_dma; /* host supports atapi_dma */
685 u8 ultra_mask; 687 u8 ultra_mask;
686 u8 mwdma_mask; 688 u8 mwdma_mask;
@@ -1245,7 +1247,12 @@ typedef struct ide_pci_enablebit_s {
1245enum { 1247enum {
1246 /* Uses ISA control ports not PCI ones. */ 1248 /* Uses ISA control ports not PCI ones. */
1247 IDE_HFLAG_ISA_PORTS = (1 << 0), 1249 IDE_HFLAG_ISA_PORTS = (1 << 0),
1250 /* single port device */
1248 IDE_HFLAG_SINGLE = (1 << 1), 1251 IDE_HFLAG_SINGLE = (1 << 1),
1252 /* don't use legacy PIO blacklist */
1253 IDE_HFLAG_PIO_NO_BLACKLIST = (1 << 2),
1254 /* don't use conservative PIO "downgrade" */
1255 IDE_HFLAG_PIO_NO_DOWNGRADE = (1 << 3),
1249}; 1256};
1250 1257
1251typedef struct ide_pci_device_s { 1258typedef struct ide_pci_device_s {