diff options
Diffstat (limited to 'drivers/ide/pci/hpt366.c')
-rw-r--r-- | drivers/ide/pci/hpt366.c | 85 |
1 files changed, 35 insertions, 50 deletions
diff --git a/drivers/ide/pci/hpt366.c b/drivers/ide/pci/hpt366.c index cf9d344d19f8..fcbc5605b38e 100644 --- a/drivers/ide/pci/hpt366.c +++ b/drivers/ide/pci/hpt366.c | |||
@@ -514,43 +514,31 @@ static int check_in_drive_list(ide_drive_t *drive, const char **list) | |||
514 | return 0; | 514 | return 0; |
515 | } | 515 | } |
516 | 516 | ||
517 | static u8 hpt3xx_ratemask(ide_drive_t *drive) | ||
518 | { | ||
519 | struct hpt_info *info = pci_get_drvdata(HWIF(drive)->pci_dev); | ||
520 | u8 mode = info->max_mode; | ||
521 | |||
522 | if (!eighty_ninty_three(drive) && mode) | ||
523 | mode = min(mode, (u8)1); | ||
524 | return mode; | ||
525 | } | ||
526 | |||
527 | /* | 517 | /* |
528 | * Note for the future; the SATA hpt37x we must set | 518 | * Note for the future; the SATA hpt37x we must set |
529 | * either PIO or UDMA modes 0,4,5 | 519 | * either PIO or UDMA modes 0,4,5 |
530 | */ | 520 | */ |
531 | 521 | ||
532 | static u8 hpt3xx_ratefilter(ide_drive_t *drive, u8 speed) | 522 | static u8 hpt3xx_udma_filter(ide_drive_t *drive) |
533 | { | 523 | { |
534 | struct hpt_info *info = pci_get_drvdata(HWIF(drive)->pci_dev); | 524 | struct hpt_info *info = pci_get_drvdata(HWIF(drive)->pci_dev); |
535 | u8 chip_type = info->chip_type; | 525 | u8 chip_type = info->chip_type; |
536 | u8 mode = hpt3xx_ratemask(drive); | 526 | u8 mode = info->max_mode; |
537 | 527 | u8 mask; | |
538 | if (drive->media != ide_disk) | ||
539 | return min(speed, (u8)XFER_PIO_4); | ||
540 | 528 | ||
541 | switch (mode) { | 529 | switch (mode) { |
542 | case 0x04: | 530 | case 0x04: |
543 | speed = min_t(u8, speed, XFER_UDMA_6); | 531 | mask = 0x7f; |
544 | break; | 532 | break; |
545 | case 0x03: | 533 | case 0x03: |
546 | speed = min_t(u8, speed, XFER_UDMA_5); | 534 | mask = 0x3f; |
547 | if (chip_type >= HPT374) | 535 | if (chip_type >= HPT374) |
548 | break; | 536 | break; |
549 | if (!check_in_drive_list(drive, bad_ata100_5)) | 537 | if (!check_in_drive_list(drive, bad_ata100_5)) |
550 | goto check_bad_ata33; | 538 | goto check_bad_ata33; |
551 | /* fall thru */ | 539 | /* fall thru */ |
552 | case 0x02: | 540 | case 0x02: |
553 | speed = min_t(u8, speed, XFER_UDMA_4); | 541 | mask = 0x1f; |
554 | 542 | ||
555 | /* | 543 | /* |
556 | * CHECK ME, Does this need to be changed to HPT374 ?? | 544 | * CHECK ME, Does this need to be changed to HPT374 ?? |
@@ -561,13 +549,13 @@ static u8 hpt3xx_ratefilter(ide_drive_t *drive, u8 speed) | |||
561 | !check_in_drive_list(drive, bad_ata66_4)) | 549 | !check_in_drive_list(drive, bad_ata66_4)) |
562 | goto check_bad_ata33; | 550 | goto check_bad_ata33; |
563 | 551 | ||
564 | speed = min_t(u8, speed, XFER_UDMA_3); | 552 | mask = 0x0f; |
565 | if (HPT366_ALLOW_ATA66_3 && | 553 | if (HPT366_ALLOW_ATA66_3 && |
566 | !check_in_drive_list(drive, bad_ata66_3)) | 554 | !check_in_drive_list(drive, bad_ata66_3)) |
567 | goto check_bad_ata33; | 555 | goto check_bad_ata33; |
568 | /* fall thru */ | 556 | /* fall thru */ |
569 | case 0x01: | 557 | case 0x01: |
570 | speed = min_t(u8, speed, XFER_UDMA_2); | 558 | mask = 0x07; |
571 | 559 | ||
572 | check_bad_ata33: | 560 | check_bad_ata33: |
573 | if (chip_type >= HPT370A) | 561 | if (chip_type >= HPT370A) |
@@ -577,10 +565,10 @@ static u8 hpt3xx_ratefilter(ide_drive_t *drive, u8 speed) | |||
577 | /* fall thru */ | 565 | /* fall thru */ |
578 | case 0x00: | 566 | case 0x00: |
579 | default: | 567 | default: |
580 | speed = min_t(u8, speed, XFER_MW_DMA_2); | 568 | mask = 0x00; |
581 | break; | 569 | break; |
582 | } | 570 | } |
583 | return speed; | 571 | return mask; |
584 | } | 572 | } |
585 | 573 | ||
586 | static u32 get_speed_setting(u8 speed, struct hpt_info *info) | 574 | static u32 get_speed_setting(u8 speed, struct hpt_info *info) |
@@ -608,12 +596,19 @@ static int hpt36x_tune_chipset(ide_drive_t *drive, u8 xferspeed) | |||
608 | ide_hwif_t *hwif = HWIF(drive); | 596 | ide_hwif_t *hwif = HWIF(drive); |
609 | struct pci_dev *dev = hwif->pci_dev; | 597 | struct pci_dev *dev = hwif->pci_dev; |
610 | struct hpt_info *info = pci_get_drvdata(dev); | 598 | struct hpt_info *info = pci_get_drvdata(dev); |
611 | u8 speed = hpt3xx_ratefilter(drive, xferspeed); | 599 | u8 speed = ide_rate_filter(drive, xferspeed); |
612 | u8 itr_addr = drive->dn ? 0x44 : 0x40; | 600 | u8 itr_addr = drive->dn ? 0x44 : 0x40; |
613 | u32 itr_mask = speed < XFER_MW_DMA_0 ? 0x30070000 : | ||
614 | (speed < XFER_UDMA_0 ? 0xc0070000 : 0xc03800ff); | ||
615 | u32 new_itr = get_speed_setting(speed, info); | ||
616 | u32 old_itr = 0; | 601 | u32 old_itr = 0; |
602 | u32 itr_mask, new_itr; | ||
603 | |||
604 | /* TODO: move this to ide_rate_filter() [ check ->atapi_dma ] */ | ||
605 | if (drive->media != ide_disk) | ||
606 | speed = min_t(u8, speed, XFER_PIO_4); | ||
607 | |||
608 | itr_mask = speed < XFER_MW_DMA_0 ? 0x30070000 : | ||
609 | (speed < XFER_UDMA_0 ? 0xc0070000 : 0xc03800ff); | ||
610 | |||
611 | new_itr = get_speed_setting(speed, info); | ||
617 | 612 | ||
618 | /* | 613 | /* |
619 | * Disable on-chip PIO FIFO/buffer (and PIO MST mode as well) | 614 | * Disable on-chip PIO FIFO/buffer (and PIO MST mode as well) |
@@ -633,12 +628,19 @@ static int hpt37x_tune_chipset(ide_drive_t *drive, u8 xferspeed) | |||
633 | ide_hwif_t *hwif = HWIF(drive); | 628 | ide_hwif_t *hwif = HWIF(drive); |
634 | struct pci_dev *dev = hwif->pci_dev; | 629 | struct pci_dev *dev = hwif->pci_dev; |
635 | struct hpt_info *info = pci_get_drvdata(dev); | 630 | struct hpt_info *info = pci_get_drvdata(dev); |
636 | u8 speed = hpt3xx_ratefilter(drive, xferspeed); | 631 | u8 speed = ide_rate_filter(drive, xferspeed); |
637 | u8 itr_addr = 0x40 + (drive->dn * 4); | 632 | u8 itr_addr = 0x40 + (drive->dn * 4); |
638 | u32 itr_mask = speed < XFER_MW_DMA_0 ? 0x303c0000 : | ||
639 | (speed < XFER_UDMA_0 ? 0xc03c0000 : 0xc1c001ff); | ||
640 | u32 new_itr = get_speed_setting(speed, info); | ||
641 | u32 old_itr = 0; | 633 | u32 old_itr = 0; |
634 | u32 itr_mask, new_itr; | ||
635 | |||
636 | /* TODO: move this to ide_rate_filter() [ check ->atapi_dma ] */ | ||
637 | if (drive->media != ide_disk) | ||
638 | speed = min_t(u8, speed, XFER_PIO_4); | ||
639 | |||
640 | itr_mask = speed < XFER_MW_DMA_0 ? 0x303c0000 : | ||
641 | (speed < XFER_UDMA_0 ? 0xc03c0000 : 0xc1c001ff); | ||
642 | |||
643 | new_itr = get_speed_setting(speed, info); | ||
642 | 644 | ||
643 | pci_read_config_dword(dev, itr_addr, &old_itr); | 645 | pci_read_config_dword(dev, itr_addr, &old_itr); |
644 | new_itr = (new_itr & ~itr_mask) | (old_itr & itr_mask); | 646 | new_itr = (new_itr & ~itr_mask) | (old_itr & itr_mask); |
@@ -667,24 +669,6 @@ static void hpt3xx_tune_drive(ide_drive_t *drive, u8 pio) | |||
667 | (void) hpt3xx_tune_chipset (drive, XFER_PIO_0 + pio); | 669 | (void) hpt3xx_tune_chipset (drive, XFER_PIO_0 + pio); |
668 | } | 670 | } |
669 | 671 | ||
670 | /* | ||
671 | * This allows the configuration of ide_pci chipset registers | ||
672 | * for cards that learn about the drive's UDMA, DMA, PIO capabilities | ||
673 | * after the drive is reported by the OS. Initially designed for | ||
674 | * HPT366 UDMA chipset by HighPoint|Triones Technologies, Inc. | ||
675 | * | ||
676 | */ | ||
677 | static int config_chipset_for_dma(ide_drive_t *drive) | ||
678 | { | ||
679 | u8 speed = ide_dma_speed(drive, hpt3xx_ratemask(drive)); | ||
680 | |||
681 | if (!speed) | ||
682 | return 0; | ||
683 | |||
684 | (void) hpt3xx_tune_chipset(drive, speed); | ||
685 | return ide_dma_enable(drive); | ||
686 | } | ||
687 | |||
688 | static int hpt3xx_quirkproc(ide_drive_t *drive) | 672 | static int hpt3xx_quirkproc(ide_drive_t *drive) |
689 | { | 673 | { |
690 | struct hd_driveid *id = drive->id; | 674 | struct hd_driveid *id = drive->id; |
@@ -739,7 +723,7 @@ static int hpt366_config_drive_xfer_rate(ide_drive_t *drive) | |||
739 | { | 723 | { |
740 | drive->init_speed = 0; | 724 | drive->init_speed = 0; |
741 | 725 | ||
742 | if (ide_use_dma(drive) && config_chipset_for_dma(drive)) | 726 | if (ide_tune_dma(drive)) |
743 | return 0; | 727 | return 0; |
744 | 728 | ||
745 | if (ide_use_fast_pio(drive)) | 729 | if (ide_use_fast_pio(drive)) |
@@ -1271,6 +1255,7 @@ static void __devinit init_hwif_hpt366(ide_hwif_t *hwif) | |||
1271 | hwif->intrproc = &hpt3xx_intrproc; | 1255 | hwif->intrproc = &hpt3xx_intrproc; |
1272 | hwif->maskproc = &hpt3xx_maskproc; | 1256 | hwif->maskproc = &hpt3xx_maskproc; |
1273 | hwif->busproc = &hpt3xx_busproc; | 1257 | hwif->busproc = &hpt3xx_busproc; |
1258 | hwif->udma_filter = &hpt3xx_udma_filter; | ||
1274 | 1259 | ||
1275 | /* | 1260 | /* |
1276 | * HPT3xxN chips have some complications: | 1261 | * HPT3xxN chips have some complications: |