diff options
-rw-r--r-- | drivers/ide/ide-lib.c | 13 | ||||
-rw-r--r-- | drivers/ide/ide-timing.h | 18 | ||||
-rw-r--r-- | drivers/ide/ide.c | 2 | ||||
-rw-r--r-- | drivers/ide/pci/amd74xx.c | 20 | ||||
-rw-r--r-- | drivers/ide/pci/via82cxxx.c | 22 | ||||
-rw-r--r-- | drivers/ide/setup-pci.c | 2 | ||||
-rw-r--r-- | include/linux/ide.h | 7 |
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 | ||
109 | static 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 | |||
124 | static void ide_timing_quantize(struct ide_timing *t, struct ide_timing *q, int T, int UT) | 109 | static 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 | ||
273 | static void amd74xx_tune_drive(ide_drive_t *drive, u8 pio) | 273 | static 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 | ||
466 | static ide_pci_device_t amd74xx_chipsets[] __devinitdata = { | 470 | static 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 | ||
204 | static void via82cxxx_tune_drive(ide_drive_t *drive, u8 pio) | 204 | static 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); |
615 | bypass_legacy_dma: | 615 | bypass_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 { | |||
1245 | enum { | 1247 | enum { |
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 | ||
1251 | typedef struct ide_pci_device_s { | 1258 | typedef struct ide_pci_device_s { |