diff options
Diffstat (limited to 'drivers/ide/pci/alim15x3.c')
| -rw-r--r-- | drivers/ide/pci/alim15x3.c | 97 |
1 files changed, 32 insertions, 65 deletions
diff --git a/drivers/ide/pci/alim15x3.c b/drivers/ide/pci/alim15x3.c index 946a12746cb5..428efdae0c7b 100644 --- a/drivers/ide/pci/alim15x3.c +++ b/drivers/ide/pci/alim15x3.c | |||
| @@ -50,7 +50,7 @@ static u8 m5229_revision; | |||
| 50 | static u8 chip_is_1543c_e; | 50 | static u8 chip_is_1543c_e; |
| 51 | static struct pci_dev *isa_dev; | 51 | static struct pci_dev *isa_dev; |
| 52 | 52 | ||
| 53 | #if defined(DISPLAY_ALI_TIMINGS) && defined(CONFIG_PROC_FS) | 53 | #if defined(DISPLAY_ALI_TIMINGS) && defined(CONFIG_IDE_PROC_FS) |
| 54 | #include <linux/stat.h> | 54 | #include <linux/stat.h> |
| 55 | #include <linux/proc_fs.h> | 55 | #include <linux/proc_fs.h> |
| 56 | 56 | ||
| @@ -278,7 +278,7 @@ static int ali_get_info (char *buffer, char **addr, off_t offset, int count) | |||
| 278 | 278 | ||
| 279 | return p-buffer; /* => must be less than 4k! */ | 279 | return p-buffer; /* => must be less than 4k! */ |
| 280 | } | 280 | } |
| 281 | #endif /* defined(DISPLAY_ALI_TIMINGS) && defined(CONFIG_PROC_FS) */ | 281 | #endif /* defined(DISPLAY_ALI_TIMINGS) && defined(CONFIG_IDE_PROC_FS) */ |
| 282 | 282 | ||
| 283 | /** | 283 | /** |
| 284 | * ali15x3_tune_pio - set up chipset for PIO mode | 284 | * ali15x3_tune_pio - set up chipset for PIO mode |
| @@ -378,74 +378,31 @@ static void ali15x3_tune_drive (ide_drive_t *drive, u8 pio) | |||
| 378 | } | 378 | } |
| 379 | 379 | ||
| 380 | /** | 380 | /** |
| 381 | * ali15x3_can_ultra - check for ultra DMA support | 381 | * ali_udma_filter - compute UDMA mask |
| 382 | * @drive: drive to do the check | 382 | * @drive: IDE device |
| 383 | * | 383 | * |
| 384 | * Check the drive and controller revisions. Return 0 if UDMA is | 384 | * Return available UDMA modes. |
| 385 | * not available, or 1 if UDMA can be used. The actual rules for | 385 | * |
| 386 | * the ALi are | 386 | * The actual rules for the ALi are: |
| 387 | * No UDMA on revisions <= 0x20 | 387 | * No UDMA on revisions <= 0x20 |
| 388 | * Disk only for revisions < 0xC2 | 388 | * Disk only for revisions < 0xC2 |
| 389 | * Not WDC drives for revisions < 0xC2 | 389 | * Not WDC drives for revisions < 0xC2 |
| 390 | * | 390 | * |
| 391 | * FIXME: WDC ifdef needs to die | 391 | * FIXME: WDC ifdef needs to die |
| 392 | */ | 392 | */ |
| 393 | |||
| 394 | static u8 ali15x3_can_ultra (ide_drive_t *drive) | ||
| 395 | { | ||
| 396 | #ifndef CONFIG_WDC_ALI15X3 | ||
| 397 | struct hd_driveid *id = drive->id; | ||
| 398 | #endif /* CONFIG_WDC_ALI15X3 */ | ||
| 399 | 393 | ||
| 400 | if (m5229_revision <= 0x20) { | 394 | static u8 ali_udma_filter(ide_drive_t *drive) |
| 401 | return 0; | ||
| 402 | } else if ((m5229_revision < 0xC2) && | ||
| 403 | #ifndef CONFIG_WDC_ALI15X3 | ||
| 404 | ((chip_is_1543c_e && strstr(id->model, "WDC ")) || | ||
| 405 | (drive->media!=ide_disk))) { | ||
| 406 | #else /* CONFIG_WDC_ALI15X3 */ | ||
| 407 | (drive->media!=ide_disk)) { | ||
| 408 | #endif /* CONFIG_WDC_ALI15X3 */ | ||
| 409 | return 0; | ||
| 410 | } else { | ||
| 411 | return 1; | ||
| 412 | } | ||
| 413 | } | ||
| 414 | |||
| 415 | /** | ||
| 416 | * ali15x3_ratemask - generate DMA mode list | ||
| 417 | * @drive: drive to compute against | ||
| 418 | * | ||
| 419 | * Generate a list of the available DMA modes for the drive. | ||
| 420 | * FIXME: this function contains lots of bogus masking we can dump | ||
| 421 | * | ||
| 422 | * Return the highest available mode (UDMA33, UDMA66, UDMA100,..) | ||
| 423 | */ | ||
| 424 | |||
| 425 | static u8 ali15x3_ratemask (ide_drive_t *drive) | ||
| 426 | { | 395 | { |
| 427 | u8 mode = 0, can_ultra = ali15x3_can_ultra(drive); | 396 | if (m5229_revision > 0x20 && m5229_revision < 0xC2) { |
| 428 | 397 | if (drive->media != ide_disk) | |
| 429 | if (m5229_revision > 0xC4 && can_ultra) { | 398 | return 0; |
| 430 | mode = 4; | 399 | #ifndef CONFIG_WDC_ALI15X3 |
| 431 | } else if (m5229_revision == 0xC4 && can_ultra) { | 400 | if (chip_is_1543c_e && strstr(drive->id->model, "WDC ")) |
| 432 | mode = 3; | 401 | return 0; |
| 433 | } else if (m5229_revision >= 0xC2 && can_ultra) { | 402 | #endif |
| 434 | mode = 2; | ||
| 435 | } else if (can_ultra) { | ||
| 436 | return 1; | ||
| 437 | } else { | ||
| 438 | return 0; | ||
| 439 | } | 403 | } |
| 440 | 404 | ||
| 441 | /* | 405 | return drive->hwif->ultra_mask; |
| 442 | * If the drive sees no suitable cable then UDMA 33 | ||
| 443 | * is the highest permitted mode | ||
| 444 | */ | ||
| 445 | |||
| 446 | if (!eighty_ninty_three(drive)) | ||
| 447 | mode = min(mode, (u8)1); | ||
| 448 | return mode; | ||
| 449 | } | 406 | } |
| 450 | 407 | ||
| 451 | /** | 408 | /** |
| @@ -461,7 +418,7 @@ static int ali15x3_tune_chipset (ide_drive_t *drive, u8 xferspeed) | |||
| 461 | { | 418 | { |
| 462 | ide_hwif_t *hwif = HWIF(drive); | 419 | ide_hwif_t *hwif = HWIF(drive); |
| 463 | struct pci_dev *dev = hwif->pci_dev; | 420 | struct pci_dev *dev = hwif->pci_dev; |
| 464 | u8 speed = ide_rate_filter(ali15x3_ratemask(drive), xferspeed); | 421 | u8 speed = ide_rate_filter(drive, xferspeed); |
| 465 | u8 speed1 = speed; | 422 | u8 speed1 = speed; |
| 466 | u8 unit = (drive->select.b.unit & 0x01); | 423 | u8 unit = (drive->select.b.unit & 0x01); |
| 467 | u8 tmpbyte = 0x00; | 424 | u8 tmpbyte = 0x00; |
| @@ -511,7 +468,7 @@ static int ali15x3_tune_chipset (ide_drive_t *drive, u8 xferspeed) | |||
| 511 | 468 | ||
| 512 | static int config_chipset_for_dma (ide_drive_t *drive) | 469 | static int config_chipset_for_dma (ide_drive_t *drive) |
| 513 | { | 470 | { |
| 514 | u8 speed = ide_dma_speed(drive, ali15x3_ratemask(drive)); | 471 | u8 speed = ide_max_dma_mode(drive); |
| 515 | 472 | ||
| 516 | if (!(speed)) | 473 | if (!(speed)) |
| 517 | return 0; | 474 | return 0; |
| @@ -609,13 +566,13 @@ static unsigned int __devinit init_chipset_ali15x3 (struct pci_dev *dev, const c | |||
| 609 | 566 | ||
| 610 | isa_dev = pci_get_device(PCI_VENDOR_ID_AL, PCI_DEVICE_ID_AL_M1533, NULL); | 567 | isa_dev = pci_get_device(PCI_VENDOR_ID_AL, PCI_DEVICE_ID_AL_M1533, NULL); |
| 611 | 568 | ||
| 612 | #if defined(DISPLAY_ALI_TIMINGS) && defined(CONFIG_PROC_FS) | 569 | #if defined(DISPLAY_ALI_TIMINGS) && defined(CONFIG_IDE_PROC_FS) |
| 613 | if (!ali_proc) { | 570 | if (!ali_proc) { |
| 614 | ali_proc = 1; | 571 | ali_proc = 1; |
| 615 | bmide_dev = dev; | 572 | bmide_dev = dev; |
| 616 | ide_pci_create_host_proc("ali", ali_get_info); | 573 | ide_pci_create_host_proc("ali", ali_get_info); |
| 617 | } | 574 | } |
| 618 | #endif /* defined(DISPLAY_ALI_TIMINGS) && defined(CONFIG_PROC_FS) */ | 575 | #endif /* defined(DISPLAY_ALI_TIMINGS) && defined(CONFIG_IDE_PROC_FS) */ |
| 619 | 576 | ||
| 620 | local_irq_save(flags); | 577 | local_irq_save(flags); |
| 621 | 578 | ||
| @@ -771,6 +728,7 @@ static void __devinit init_hwif_common_ali15x3 (ide_hwif_t *hwif) | |||
| 771 | hwif->autodma = 0; | 728 | hwif->autodma = 0; |
| 772 | hwif->tuneproc = &ali15x3_tune_drive; | 729 | hwif->tuneproc = &ali15x3_tune_drive; |
| 773 | hwif->speedproc = &ali15x3_tune_chipset; | 730 | hwif->speedproc = &ali15x3_tune_chipset; |
| 731 | hwif->udma_filter = &ali_udma_filter; | ||
| 774 | 732 | ||
| 775 | /* don't use LBA48 DMA on ALi devices before rev 0xC5 */ | 733 | /* don't use LBA48 DMA on ALi devices before rev 0xC5 */ |
| 776 | hwif->no_lba48_dma = (m5229_revision <= 0xC4) ? 1 : 0; | 734 | hwif->no_lba48_dma = (m5229_revision <= 0xC4) ? 1 : 0; |
| @@ -783,8 +741,17 @@ static void __devinit init_hwif_common_ali15x3 (ide_hwif_t *hwif) | |||
| 783 | 741 | ||
| 784 | hwif->atapi_dma = 1; | 742 | hwif->atapi_dma = 1; |
| 785 | 743 | ||
| 786 | if (m5229_revision > 0x20) | 744 | if (m5229_revision <= 0x20) |
| 787 | hwif->ultra_mask = 0x7f; | 745 | hwif->ultra_mask = 0x00; /* no udma */ |
| 746 | else if (m5229_revision < 0xC2) | ||
| 747 | hwif->ultra_mask = 0x07; /* udma0-2 */ | ||
| 748 | else if (m5229_revision == 0xC2 || m5229_revision == 0xC3) | ||
| 749 | hwif->ultra_mask = 0x1f; /* udma0-4 */ | ||
| 750 | else if (m5229_revision == 0xC4) | ||
| 751 | hwif->ultra_mask = 0x3f; /* udma0-5 */ | ||
| 752 | else | ||
| 753 | hwif->ultra_mask = 0x7f; /* udma0-6 */ | ||
| 754 | |||
| 788 | hwif->mwdma_mask = 0x07; | 755 | hwif->mwdma_mask = 0x07; |
| 789 | hwif->swdma_mask = 0x07; | 756 | hwif->swdma_mask = 0x07; |
| 790 | 757 | ||
