diff options
Diffstat (limited to 'drivers/ide/ide-iops.c')
-rw-r--r-- | drivers/ide/ide-iops.c | 39 |
1 files changed, 36 insertions, 3 deletions
diff --git a/drivers/ide/ide-iops.c b/drivers/ide/ide-iops.c index 92578b6832e9..fe2a69fed72b 100644 --- a/drivers/ide/ide-iops.c +++ b/drivers/ide/ide-iops.c | |||
@@ -565,6 +565,34 @@ int ide_wait_stat (ide_startstop_t *startstop, ide_drive_t *drive, u8 good, u8 b | |||
565 | 565 | ||
566 | EXPORT_SYMBOL(ide_wait_stat); | 566 | EXPORT_SYMBOL(ide_wait_stat); |
567 | 567 | ||
568 | /** | ||
569 | * ide_in_drive_list - look for drive in black/white list | ||
570 | * @id: drive identifier | ||
571 | * @drive_table: list to inspect | ||
572 | * | ||
573 | * Look for a drive in the blacklist and the whitelist tables | ||
574 | * Returns 1 if the drive is found in the table. | ||
575 | */ | ||
576 | |||
577 | int ide_in_drive_list(struct hd_driveid *id, const struct drive_list_entry *drive_table) | ||
578 | { | ||
579 | for ( ; drive_table->id_model; drive_table++) | ||
580 | if ((!strcmp(drive_table->id_model, id->model)) && | ||
581 | (!drive_table->id_firmware || | ||
582 | strstr(id->fw_rev, drive_table->id_firmware))) | ||
583 | return 1; | ||
584 | return 0; | ||
585 | } | ||
586 | |||
587 | /* | ||
588 | * Early UDMA66 devices don't set bit14 to 1, only bit13 is valid. | ||
589 | * We list them here and depend on the device side cable detection for them. | ||
590 | */ | ||
591 | static const struct drive_list_entry ivb_list[] = { | ||
592 | { "QUANTUM FIREBALLlct10 05" , "A03.0900" }, | ||
593 | { NULL , NULL } | ||
594 | }; | ||
595 | |||
568 | /* | 596 | /* |
569 | * All hosts that use the 80c ribbon must use! | 597 | * All hosts that use the 80c ribbon must use! |
570 | * The name is derived from upper byte of word 93 and the 80c ribbon. | 598 | * The name is derived from upper byte of word 93 and the 80c ribbon. |
@@ -573,11 +601,16 @@ u8 eighty_ninty_three (ide_drive_t *drive) | |||
573 | { | 601 | { |
574 | ide_hwif_t *hwif = drive->hwif; | 602 | ide_hwif_t *hwif = drive->hwif; |
575 | struct hd_driveid *id = drive->id; | 603 | struct hd_driveid *id = drive->id; |
604 | int ivb = ide_in_drive_list(id, ivb_list); | ||
576 | 605 | ||
577 | if (hwif->cbl == ATA_CBL_PATA40_SHORT) | 606 | if (hwif->cbl == ATA_CBL_PATA40_SHORT) |
578 | return 1; | 607 | return 1; |
579 | 608 | ||
580 | if (hwif->cbl != ATA_CBL_PATA80) | 609 | if (ivb) |
610 | printk(KERN_DEBUG "%s: skipping word 93 validity check\n", | ||
611 | drive->name); | ||
612 | |||
613 | if (hwif->cbl != ATA_CBL_PATA80 && !ivb) | ||
581 | goto no_80w; | 614 | goto no_80w; |
582 | 615 | ||
583 | /* Check for SATA but only if we are ATA5 or higher */ | 616 | /* Check for SATA but only if we are ATA5 or higher */ |
@@ -587,11 +620,11 @@ u8 eighty_ninty_three (ide_drive_t *drive) | |||
587 | /* | 620 | /* |
588 | * FIXME: | 621 | * FIXME: |
589 | * - change master/slave IDENTIFY order | 622 | * - change master/slave IDENTIFY order |
590 | * - force bit13 (80c cable present) check | 623 | * - force bit13 (80c cable present) check also for !ivb devices |
591 | * (unless the slave device is pre-ATA3) | 624 | * (unless the slave device is pre-ATA3) |
592 | */ | 625 | */ |
593 | #ifndef CONFIG_IDEDMA_IVB | 626 | #ifndef CONFIG_IDEDMA_IVB |
594 | if (id->hw_config & 0x4000) | 627 | if ((id->hw_config & 0x4000) || (ivb && (id->hw_config & 0x2000))) |
595 | #else | 628 | #else |
596 | if (id->hw_config & 0x6000) | 629 | if (id->hw_config & 0x6000) |
597 | #endif | 630 | #endif |