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 | ||