diff options
Diffstat (limited to 'drivers/ide/pci/hpt366.c')
-rw-r--r-- | drivers/ide/pci/hpt366.c | 376 |
1 files changed, 158 insertions, 218 deletions
diff --git a/drivers/ide/pci/hpt366.c b/drivers/ide/pci/hpt366.c index fcb21ddab2cc..18f5b7ddaee6 100644 --- a/drivers/ide/pci/hpt366.c +++ b/drivers/ide/pci/hpt366.c | |||
@@ -1,9 +1,10 @@ | |||
1 | /* | 1 | /* |
2 | * linux/drivers/ide/pci/hpt366.c Version 1.14 Oct 1, 2007 | 2 | * linux/drivers/ide/pci/hpt366.c Version 1.20 Oct 1, 2007 |
3 | * | 3 | * |
4 | * Copyright (C) 1999-2003 Andre Hedrick <andre@linux-ide.org> | 4 | * Copyright (C) 1999-2003 Andre Hedrick <andre@linux-ide.org> |
5 | * Portions Copyright (C) 2001 Sun Microsystems, Inc. | 5 | * Portions Copyright (C) 2001 Sun Microsystems, Inc. |
6 | * Portions Copyright (C) 2003 Red Hat Inc | 6 | * Portions Copyright (C) 2003 Red Hat Inc |
7 | * Portions Copyright (C) 2007 Bartlomiej Zolnierkiewicz | ||
7 | * Portions Copyright (C) 2005-2007 MontaVista Software, Inc. | 8 | * Portions Copyright (C) 2005-2007 MontaVista Software, Inc. |
8 | * | 9 | * |
9 | * Thanks to HighPoint Technologies for their assistance, and hardware. | 10 | * Thanks to HighPoint Technologies for their assistance, and hardware. |
@@ -393,8 +394,9 @@ enum ata_clock { | |||
393 | */ | 394 | */ |
394 | 395 | ||
395 | struct hpt_info { | 396 | struct hpt_info { |
397 | char *chip_name; /* Chip name */ | ||
396 | u8 chip_type; /* Chip type */ | 398 | u8 chip_type; /* Chip type */ |
397 | u8 max_ultra; /* Max. UltraDMA mode allowed */ | 399 | u8 udma_mask; /* Allowed UltraDMA modes mask. */ |
398 | u8 dpll_clk; /* DPLL clock in MHz */ | 400 | u8 dpll_clk; /* DPLL clock in MHz */ |
399 | u8 pci_clk; /* PCI clock in MHz */ | 401 | u8 pci_clk; /* PCI clock in MHz */ |
400 | u32 **settings; /* Chipset settings table */ | 402 | u32 **settings; /* Chipset settings table */ |
@@ -432,78 +434,89 @@ static u32 *hpt37x_settings[NUM_ATA_CLOCKS] = { | |||
432 | }; | 434 | }; |
433 | 435 | ||
434 | static struct hpt_info hpt36x __devinitdata = { | 436 | static struct hpt_info hpt36x __devinitdata = { |
437 | .chip_name = "HPT36x", | ||
435 | .chip_type = HPT36x, | 438 | .chip_type = HPT36x, |
436 | .max_ultra = HPT366_ALLOW_ATA66_3 ? (HPT366_ALLOW_ATA66_4 ? 4 : 3) : 2, | 439 | .udma_mask = HPT366_ALLOW_ATA66_3 ? (HPT366_ALLOW_ATA66_4 ? ATA_UDMA4 : ATA_UDMA3) : ATA_UDMA2, |
437 | .dpll_clk = 0, /* no DPLL */ | 440 | .dpll_clk = 0, /* no DPLL */ |
438 | .settings = hpt36x_settings | 441 | .settings = hpt36x_settings |
439 | }; | 442 | }; |
440 | 443 | ||
441 | static struct hpt_info hpt370 __devinitdata = { | 444 | static struct hpt_info hpt370 __devinitdata = { |
445 | .chip_name = "HPT370", | ||
442 | .chip_type = HPT370, | 446 | .chip_type = HPT370, |
443 | .max_ultra = HPT370_ALLOW_ATA100_5 ? 5 : 4, | 447 | .udma_mask = HPT370_ALLOW_ATA100_5 ? ATA_UDMA5 : ATA_UDMA4, |
444 | .dpll_clk = 48, | 448 | .dpll_clk = 48, |
445 | .settings = hpt37x_settings | 449 | .settings = hpt37x_settings |
446 | }; | 450 | }; |
447 | 451 | ||
448 | static struct hpt_info hpt370a __devinitdata = { | 452 | static struct hpt_info hpt370a __devinitdata = { |
453 | .chip_name = "HPT370A", | ||
449 | .chip_type = HPT370A, | 454 | .chip_type = HPT370A, |
450 | .max_ultra = HPT370_ALLOW_ATA100_5 ? 5 : 4, | 455 | .udma_mask = HPT370_ALLOW_ATA100_5 ? ATA_UDMA5 : ATA_UDMA4, |
451 | .dpll_clk = 48, | 456 | .dpll_clk = 48, |
452 | .settings = hpt37x_settings | 457 | .settings = hpt37x_settings |
453 | }; | 458 | }; |
454 | 459 | ||
455 | static struct hpt_info hpt374 __devinitdata = { | 460 | static struct hpt_info hpt374 __devinitdata = { |
461 | .chip_name = "HPT374", | ||
456 | .chip_type = HPT374, | 462 | .chip_type = HPT374, |
457 | .max_ultra = 5, | 463 | .udma_mask = ATA_UDMA5, |
458 | .dpll_clk = 48, | 464 | .dpll_clk = 48, |
459 | .settings = hpt37x_settings | 465 | .settings = hpt37x_settings |
460 | }; | 466 | }; |
461 | 467 | ||
462 | static struct hpt_info hpt372 __devinitdata = { | 468 | static struct hpt_info hpt372 __devinitdata = { |
469 | .chip_name = "HPT372", | ||
463 | .chip_type = HPT372, | 470 | .chip_type = HPT372, |
464 | .max_ultra = HPT372_ALLOW_ATA133_6 ? 6 : 5, | 471 | .udma_mask = HPT372_ALLOW_ATA133_6 ? ATA_UDMA6 : ATA_UDMA5, |
465 | .dpll_clk = 55, | 472 | .dpll_clk = 55, |
466 | .settings = hpt37x_settings | 473 | .settings = hpt37x_settings |
467 | }; | 474 | }; |
468 | 475 | ||
469 | static struct hpt_info hpt372a __devinitdata = { | 476 | static struct hpt_info hpt372a __devinitdata = { |
477 | .chip_name = "HPT372A", | ||
470 | .chip_type = HPT372A, | 478 | .chip_type = HPT372A, |
471 | .max_ultra = HPT372_ALLOW_ATA133_6 ? 6 : 5, | 479 | .udma_mask = HPT372_ALLOW_ATA133_6 ? ATA_UDMA6 : ATA_UDMA5, |
472 | .dpll_clk = 66, | 480 | .dpll_clk = 66, |
473 | .settings = hpt37x_settings | 481 | .settings = hpt37x_settings |
474 | }; | 482 | }; |
475 | 483 | ||
476 | static struct hpt_info hpt302 __devinitdata = { | 484 | static struct hpt_info hpt302 __devinitdata = { |
485 | .chip_name = "HPT302", | ||
477 | .chip_type = HPT302, | 486 | .chip_type = HPT302, |
478 | .max_ultra = HPT372_ALLOW_ATA133_6 ? 6 : 5, | 487 | .udma_mask = HPT302_ALLOW_ATA133_6 ? ATA_UDMA6 : ATA_UDMA5, |
479 | .dpll_clk = 66, | 488 | .dpll_clk = 66, |
480 | .settings = hpt37x_settings | 489 | .settings = hpt37x_settings |
481 | }; | 490 | }; |
482 | 491 | ||
483 | static struct hpt_info hpt371 __devinitdata = { | 492 | static struct hpt_info hpt371 __devinitdata = { |
493 | .chip_name = "HPT371", | ||
484 | .chip_type = HPT371, | 494 | .chip_type = HPT371, |
485 | .max_ultra = HPT371_ALLOW_ATA133_6 ? 6 : 5, | 495 | .udma_mask = HPT371_ALLOW_ATA133_6 ? ATA_UDMA6 : ATA_UDMA5, |
486 | .dpll_clk = 66, | 496 | .dpll_clk = 66, |
487 | .settings = hpt37x_settings | 497 | .settings = hpt37x_settings |
488 | }; | 498 | }; |
489 | 499 | ||
490 | static struct hpt_info hpt372n __devinitdata = { | 500 | static struct hpt_info hpt372n __devinitdata = { |
501 | .chip_name = "HPT372N", | ||
491 | .chip_type = HPT372N, | 502 | .chip_type = HPT372N, |
492 | .max_ultra = HPT372_ALLOW_ATA133_6 ? 6 : 5, | 503 | .udma_mask = HPT372_ALLOW_ATA133_6 ? ATA_UDMA6 : ATA_UDMA5, |
493 | .dpll_clk = 77, | 504 | .dpll_clk = 77, |
494 | .settings = hpt37x_settings | 505 | .settings = hpt37x_settings |
495 | }; | 506 | }; |
496 | 507 | ||
497 | static struct hpt_info hpt302n __devinitdata = { | 508 | static struct hpt_info hpt302n __devinitdata = { |
509 | .chip_name = "HPT302N", | ||
498 | .chip_type = HPT302N, | 510 | .chip_type = HPT302N, |
499 | .max_ultra = HPT302_ALLOW_ATA133_6 ? 6 : 5, | 511 | .udma_mask = HPT302_ALLOW_ATA133_6 ? ATA_UDMA6 : ATA_UDMA5, |
500 | .dpll_clk = 77, | 512 | .dpll_clk = 77, |
501 | .settings = hpt37x_settings | 513 | .settings = hpt37x_settings |
502 | }; | 514 | }; |
503 | 515 | ||
504 | static struct hpt_info hpt371n __devinitdata = { | 516 | static struct hpt_info hpt371n __devinitdata = { |
517 | .chip_name = "HPT371N", | ||
505 | .chip_type = HPT371N, | 518 | .chip_type = HPT371N, |
506 | .max_ultra = HPT371_ALLOW_ATA133_6 ? 6 : 5, | 519 | .udma_mask = HPT371_ALLOW_ATA133_6 ? ATA_UDMA6 : ATA_UDMA5, |
507 | .dpll_clk = 77, | 520 | .dpll_clk = 77, |
508 | .settings = hpt37x_settings | 521 | .settings = hpt37x_settings |
509 | }; | 522 | }; |
@@ -676,12 +689,11 @@ static int hpt3xx_quirkproc(ide_drive_t *drive) | |||
676 | 689 | ||
677 | static void hpt3xx_intrproc(ide_drive_t *drive) | 690 | static void hpt3xx_intrproc(ide_drive_t *drive) |
678 | { | 691 | { |
679 | ide_hwif_t *hwif = HWIF(drive); | ||
680 | |||
681 | if (drive->quirk_list) | 692 | if (drive->quirk_list) |
682 | return; | 693 | return; |
694 | |||
683 | /* drives in the quirk_list may not like intr setups/cleanups */ | 695 | /* drives in the quirk_list may not like intr setups/cleanups */ |
684 | hwif->OUTB(drive->ctl | 2, IDE_CONTROL_REG); | 696 | outb(drive->ctl | 2, IDE_CONTROL_REG); |
685 | } | 697 | } |
686 | 698 | ||
687 | static void hpt3xx_maskproc(ide_drive_t *drive, int mask) | 699 | static void hpt3xx_maskproc(ide_drive_t *drive, int mask) |
@@ -709,8 +721,8 @@ static void hpt3xx_maskproc(ide_drive_t *drive, int mask) | |||
709 | enable_irq (hwif->irq); | 721 | enable_irq (hwif->irq); |
710 | } | 722 | } |
711 | } else | 723 | } else |
712 | hwif->OUTB(mask ? (drive->ctl | 2) : (drive->ctl & ~2), | 724 | outb(mask ? (drive->ctl | 2) : (drive->ctl & ~2), |
713 | IDE_CONTROL_REG); | 725 | IDE_CONTROL_REG); |
714 | } | 726 | } |
715 | 727 | ||
716 | /* | 728 | /* |
@@ -750,9 +762,9 @@ static void hpt370_irq_timeout(ide_drive_t *drive) | |||
750 | printk(KERN_DEBUG "%s: %d bytes in FIFO\n", drive->name, bfifo & 0x1ff); | 762 | printk(KERN_DEBUG "%s: %d bytes in FIFO\n", drive->name, bfifo & 0x1ff); |
751 | 763 | ||
752 | /* get DMA command mode */ | 764 | /* get DMA command mode */ |
753 | dma_cmd = hwif->INB(hwif->dma_command); | 765 | dma_cmd = inb(hwif->dma_command); |
754 | /* stop DMA */ | 766 | /* stop DMA */ |
755 | hwif->OUTB(dma_cmd & ~0x1, hwif->dma_command); | 767 | outb(dma_cmd & ~0x1, hwif->dma_command); |
756 | hpt370_clear_engine(drive); | 768 | hpt370_clear_engine(drive); |
757 | } | 769 | } |
758 | 770 | ||
@@ -767,12 +779,12 @@ static void hpt370_ide_dma_start(ide_drive_t *drive) | |||
767 | static int hpt370_ide_dma_end(ide_drive_t *drive) | 779 | static int hpt370_ide_dma_end(ide_drive_t *drive) |
768 | { | 780 | { |
769 | ide_hwif_t *hwif = HWIF(drive); | 781 | ide_hwif_t *hwif = HWIF(drive); |
770 | u8 dma_stat = hwif->INB(hwif->dma_status); | 782 | u8 dma_stat = inb(hwif->dma_status); |
771 | 783 | ||
772 | if (dma_stat & 0x01) { | 784 | if (dma_stat & 0x01) { |
773 | /* wait a little */ | 785 | /* wait a little */ |
774 | udelay(20); | 786 | udelay(20); |
775 | dma_stat = hwif->INB(hwif->dma_status); | 787 | dma_stat = inb(hwif->dma_status); |
776 | if (dma_stat & 0x01) | 788 | if (dma_stat & 0x01) |
777 | hpt370_irq_timeout(drive); | 789 | hpt370_irq_timeout(drive); |
778 | } | 790 | } |
@@ -833,34 +845,32 @@ static int hpt374_ide_dma_end(ide_drive_t *drive) | |||
833 | 845 | ||
834 | static void hpt3xxn_set_clock(ide_hwif_t *hwif, u8 mode) | 846 | static void hpt3xxn_set_clock(ide_hwif_t *hwif, u8 mode) |
835 | { | 847 | { |
836 | u8 scr2 = hwif->INB(hwif->dma_master + 0x7b); | 848 | u8 scr2 = inb(hwif->dma_master + 0x7b); |
837 | 849 | ||
838 | if ((scr2 & 0x7f) == mode) | 850 | if ((scr2 & 0x7f) == mode) |
839 | return; | 851 | return; |
840 | 852 | ||
841 | /* Tristate the bus */ | 853 | /* Tristate the bus */ |
842 | hwif->OUTB(0x80, hwif->dma_master + 0x73); | 854 | outb(0x80, hwif->dma_master + 0x73); |
843 | hwif->OUTB(0x80, hwif->dma_master + 0x77); | 855 | outb(0x80, hwif->dma_master + 0x77); |
844 | 856 | ||
845 | /* Switch clock and reset channels */ | 857 | /* Switch clock and reset channels */ |
846 | hwif->OUTB(mode, hwif->dma_master + 0x7b); | 858 | outb(mode, hwif->dma_master + 0x7b); |
847 | hwif->OUTB(0xc0, hwif->dma_master + 0x79); | 859 | outb(0xc0, hwif->dma_master + 0x79); |
848 | 860 | ||
849 | /* | 861 | /* |
850 | * Reset the state machines. | 862 | * Reset the state machines. |
851 | * NOTE: avoid accidentally enabling the disabled channels. | 863 | * NOTE: avoid accidentally enabling the disabled channels. |
852 | */ | 864 | */ |
853 | hwif->OUTB(hwif->INB(hwif->dma_master + 0x70) | 0x32, | 865 | outb(inb(hwif->dma_master + 0x70) | 0x32, hwif->dma_master + 0x70); |
854 | hwif->dma_master + 0x70); | 866 | outb(inb(hwif->dma_master + 0x74) | 0x32, hwif->dma_master + 0x74); |
855 | hwif->OUTB(hwif->INB(hwif->dma_master + 0x74) | 0x32, | ||
856 | hwif->dma_master + 0x74); | ||
857 | 867 | ||
858 | /* Complete reset */ | 868 | /* Complete reset */ |
859 | hwif->OUTB(0x00, hwif->dma_master + 0x79); | 869 | outb(0x00, hwif->dma_master + 0x79); |
860 | 870 | ||
861 | /* Reconnect channels to bus */ | 871 | /* Reconnect channels to bus */ |
862 | hwif->OUTB(0x00, hwif->dma_master + 0x73); | 872 | outb(0x00, hwif->dma_master + 0x73); |
863 | hwif->OUTB(0x00, hwif->dma_master + 0x77); | 873 | outb(0x00, hwif->dma_master + 0x77); |
864 | } | 874 | } |
865 | 875 | ||
866 | /** | 876 | /** |
@@ -1139,7 +1149,7 @@ static unsigned int __devinit init_chipset_hpt366(struct pci_dev *dev, const cha | |||
1139 | * Select 66 MHz DPLL clock only if UltraATA/133 mode is | 1149 | * Select 66 MHz DPLL clock only if UltraATA/133 mode is |
1140 | * supported/enabled, use 50 MHz DPLL clock otherwise... | 1150 | * supported/enabled, use 50 MHz DPLL clock otherwise... |
1141 | */ | 1151 | */ |
1142 | if (info->max_ultra == 6) { | 1152 | if (info->udma_mask == ATA_UDMA6) { |
1143 | dpll_clk = 66; | 1153 | dpll_clk = 66; |
1144 | clock = ATA_CLOCK_66MHZ; | 1154 | clock = ATA_CLOCK_66MHZ; |
1145 | } else if (dpll_clk) { /* HPT36x chips don't have DPLL */ | 1155 | } else if (dpll_clk) { /* HPT36x chips don't have DPLL */ |
@@ -1291,14 +1301,9 @@ static void __devinit init_hwif_hpt366(ide_hwif_t *hwif) | |||
1291 | if (new_mcr != old_mcr) | 1301 | if (new_mcr != old_mcr) |
1292 | pci_write_config_byte(dev, hwif->select_data + 1, new_mcr); | 1302 | pci_write_config_byte(dev, hwif->select_data + 1, new_mcr); |
1293 | 1303 | ||
1294 | hwif->drives[0].autotune = hwif->drives[1].autotune = 1; | ||
1295 | |||
1296 | if (hwif->dma_base == 0) | 1304 | if (hwif->dma_base == 0) |
1297 | return; | 1305 | return; |
1298 | 1306 | ||
1299 | hwif->ultra_mask = hwif->cds->udma_mask; | ||
1300 | hwif->mwdma_mask = 0x07; | ||
1301 | |||
1302 | /* | 1307 | /* |
1303 | * The HPT37x uses the CBLID pins as outputs for MA15/MA16 | 1308 | * The HPT37x uses the CBLID pins as outputs for MA15/MA16 |
1304 | * address lines to access an external EEPROM. To read valid | 1309 | * address lines to access an external EEPROM. To read valid |
@@ -1354,7 +1359,7 @@ static void __devinit init_dma_hpt366(ide_hwif_t *hwif, unsigned long dmabase) | |||
1354 | u8 dma_new = 0, dma_old = 0; | 1359 | u8 dma_new = 0, dma_old = 0; |
1355 | unsigned long flags; | 1360 | unsigned long flags; |
1356 | 1361 | ||
1357 | dma_old = hwif->INB(dmabase + 2); | 1362 | dma_old = inb(dmabase + 2); |
1358 | 1363 | ||
1359 | local_irq_save(flags); | 1364 | local_irq_save(flags); |
1360 | 1365 | ||
@@ -1365,60 +1370,26 @@ static void __devinit init_dma_hpt366(ide_hwif_t *hwif, unsigned long dmabase) | |||
1365 | if (masterdma & 0x30) dma_new |= 0x20; | 1370 | if (masterdma & 0x30) dma_new |= 0x20; |
1366 | if ( slavedma & 0x30) dma_new |= 0x40; | 1371 | if ( slavedma & 0x30) dma_new |= 0x40; |
1367 | if (dma_new != dma_old) | 1372 | if (dma_new != dma_old) |
1368 | hwif->OUTB(dma_new, dmabase + 2); | 1373 | outb(dma_new, dmabase + 2); |
1369 | 1374 | ||
1370 | local_irq_restore(flags); | 1375 | local_irq_restore(flags); |
1371 | 1376 | ||
1372 | ide_setup_dma(hwif, dmabase, 8); | 1377 | ide_setup_dma(hwif, dmabase, 8); |
1373 | } | 1378 | } |
1374 | 1379 | ||
1375 | static int __devinit init_setup_hpt374(struct pci_dev *dev, ide_pci_device_t *d) | 1380 | static void __devinit hpt374_init(struct pci_dev *dev, struct pci_dev *dev2) |
1376 | { | 1381 | { |
1377 | struct pci_dev *dev2; | 1382 | if (dev2->irq != dev->irq) { |
1378 | 1383 | /* FIXME: we need a core pci_set_interrupt() */ | |
1379 | if (PCI_FUNC(dev->devfn) & 1) | 1384 | dev2->irq = dev->irq; |
1380 | return -ENODEV; | 1385 | printk(KERN_INFO "HPT374: PCI config space interrupt fixed\n"); |
1381 | |||
1382 | pci_set_drvdata(dev, &hpt374); | ||
1383 | |||
1384 | if ((dev2 = pci_get_slot(dev->bus, dev->devfn + 1)) != NULL) { | ||
1385 | int ret; | ||
1386 | |||
1387 | pci_set_drvdata(dev2, &hpt374); | ||
1388 | |||
1389 | if (dev2->irq != dev->irq) { | ||
1390 | /* FIXME: we need a core pci_set_interrupt() */ | ||
1391 | dev2->irq = dev->irq; | ||
1392 | printk(KERN_WARNING "%s: PCI config space interrupt " | ||
1393 | "fixed.\n", d->name); | ||
1394 | } | ||
1395 | ret = ide_setup_pci_devices(dev, dev2, d); | ||
1396 | if (ret < 0) | ||
1397 | pci_dev_put(dev2); | ||
1398 | return ret; | ||
1399 | } | 1386 | } |
1400 | return ide_setup_pci_device(dev, d); | ||
1401 | } | ||
1402 | |||
1403 | static int __devinit init_setup_hpt372n(struct pci_dev *dev, ide_pci_device_t *d) | ||
1404 | { | ||
1405 | pci_set_drvdata(dev, &hpt372n); | ||
1406 | |||
1407 | return ide_setup_pci_device(dev, d); | ||
1408 | } | 1387 | } |
1409 | 1388 | ||
1410 | static int __devinit init_setup_hpt371(struct pci_dev *dev, ide_pci_device_t *d) | 1389 | static void __devinit hpt371_init(struct pci_dev *dev) |
1411 | { | 1390 | { |
1412 | struct hpt_info *info; | ||
1413 | u8 mcr1 = 0; | 1391 | u8 mcr1 = 0; |
1414 | 1392 | ||
1415 | if (dev->revision > 1) { | ||
1416 | d->name = "HPT371N"; | ||
1417 | |||
1418 | info = &hpt371n; | ||
1419 | } else | ||
1420 | info = &hpt371; | ||
1421 | |||
1422 | /* | 1393 | /* |
1423 | * HPT371 chips physically have only one channel, the secondary one, | 1394 | * HPT371 chips physically have only one channel, the secondary one, |
1424 | * but the primary channel registers do exist! Go figure... | 1395 | * but the primary channel registers do exist! Go figure... |
@@ -1428,194 +1399,102 @@ static int __devinit init_setup_hpt371(struct pci_dev *dev, ide_pci_device_t *d) | |||
1428 | pci_read_config_byte(dev, 0x50, &mcr1); | 1399 | pci_read_config_byte(dev, 0x50, &mcr1); |
1429 | if (mcr1 & 0x04) | 1400 | if (mcr1 & 0x04) |
1430 | pci_write_config_byte(dev, 0x50, mcr1 & ~0x04); | 1401 | pci_write_config_byte(dev, 0x50, mcr1 & ~0x04); |
1431 | |||
1432 | pci_set_drvdata(dev, info); | ||
1433 | |||
1434 | return ide_setup_pci_device(dev, d); | ||
1435 | } | ||
1436 | |||
1437 | static int __devinit init_setup_hpt372a(struct pci_dev *dev, ide_pci_device_t *d) | ||
1438 | { | ||
1439 | struct hpt_info *info; | ||
1440 | |||
1441 | if (dev->revision > 1) { | ||
1442 | d->name = "HPT372N"; | ||
1443 | |||
1444 | info = &hpt372n; | ||
1445 | } else | ||
1446 | info = &hpt372a; | ||
1447 | pci_set_drvdata(dev, info); | ||
1448 | |||
1449 | return ide_setup_pci_device(dev, d); | ||
1450 | } | 1402 | } |
1451 | 1403 | ||
1452 | static int __devinit init_setup_hpt302(struct pci_dev *dev, ide_pci_device_t *d) | 1404 | static int __devinit hpt36x_init(struct pci_dev *dev, struct pci_dev *dev2) |
1453 | { | 1405 | { |
1454 | struct hpt_info *info; | 1406 | u8 mcr1 = 0, pin1 = 0, pin2 = 0; |
1455 | |||
1456 | if (dev->revision > 1) { | ||
1457 | d->name = "HPT302N"; | ||
1458 | 1407 | ||
1459 | info = &hpt302n; | 1408 | /* |
1460 | } else | 1409 | * Now we'll have to force both channels enabled if |
1461 | info = &hpt302; | 1410 | * at least one of them has been enabled by BIOS... |
1462 | pci_set_drvdata(dev, info); | 1411 | */ |
1463 | 1412 | pci_read_config_byte(dev, 0x50, &mcr1); | |
1464 | return ide_setup_pci_device(dev, d); | 1413 | if (mcr1 & 0x30) |
1465 | } | 1414 | pci_write_config_byte(dev, 0x50, mcr1 | 0x30); |
1466 | |||
1467 | static int __devinit init_setup_hpt366(struct pci_dev *dev, ide_pci_device_t *d) | ||
1468 | { | ||
1469 | struct pci_dev *dev2; | ||
1470 | u8 rev = dev->revision; | ||
1471 | static char *chipset_names[] = { "HPT366", "HPT366", "HPT368", | ||
1472 | "HPT370", "HPT370A", "HPT372", | ||
1473 | "HPT372N" }; | ||
1474 | static struct hpt_info *info[] = { &hpt36x, &hpt36x, &hpt36x, | ||
1475 | &hpt370, &hpt370a, &hpt372, | ||
1476 | &hpt372n }; | ||
1477 | |||
1478 | if (PCI_FUNC(dev->devfn) & 1) | ||
1479 | return -ENODEV; | ||
1480 | 1415 | ||
1481 | switch (rev) { | 1416 | pci_read_config_byte(dev, PCI_INTERRUPT_PIN, &pin1); |
1482 | case 0: | 1417 | pci_read_config_byte(dev2, PCI_INTERRUPT_PIN, &pin2); |
1483 | case 1: | ||
1484 | case 2: | ||
1485 | /* | ||
1486 | * HPT36x chips have one channel per function and have | ||
1487 | * both channel enable bits located differently and visible | ||
1488 | * to both functions -- really stupid design decision... :-( | ||
1489 | * Bit 4 is for the primary channel, bit 5 for the secondary. | ||
1490 | */ | ||
1491 | d->host_flags |= IDE_HFLAG_SINGLE; | ||
1492 | d->enablebits[0].mask = d->enablebits[0].val = 0x10; | ||
1493 | 1418 | ||
1494 | d->udma_mask = HPT366_ALLOW_ATA66_3 ? (HPT366_ALLOW_ATA66_4 ? | 1419 | if (pin1 != pin2 && dev->irq == dev2->irq) { |
1495 | ATA_UDMA4 : ATA_UDMA3) : ATA_UDMA2; | 1420 | printk(KERN_INFO "HPT36x: onboard version of chipset, " |
1496 | break; | 1421 | "pin1=%d pin2=%d\n", pin1, pin2); |
1497 | case 3: | 1422 | return 1; |
1498 | case 4: | ||
1499 | d->udma_mask = HPT370_ALLOW_ATA100_5 ? ATA_UDMA5 : ATA_UDMA4; | ||
1500 | break; | ||
1501 | default: | ||
1502 | rev = 6; | ||
1503 | /* fall thru */ | ||
1504 | case 5: | ||
1505 | case 6: | ||
1506 | d->udma_mask = HPT372_ALLOW_ATA133_6 ? ATA_UDMA6 : ATA_UDMA5; | ||
1507 | break; | ||
1508 | } | 1423 | } |
1509 | 1424 | ||
1510 | d->name = chipset_names[rev]; | 1425 | return 0; |
1511 | |||
1512 | pci_set_drvdata(dev, info[rev]); | ||
1513 | |||
1514 | if (rev > 2) | ||
1515 | goto init_single; | ||
1516 | |||
1517 | if ((dev2 = pci_get_slot(dev->bus, dev->devfn + 1)) != NULL) { | ||
1518 | u8 mcr1 = 0, pin1 = 0, pin2 = 0; | ||
1519 | int ret; | ||
1520 | |||
1521 | pci_set_drvdata(dev2, info[rev]); | ||
1522 | |||
1523 | /* | ||
1524 | * Now we'll have to force both channels enabled if | ||
1525 | * at least one of them has been enabled by BIOS... | ||
1526 | */ | ||
1527 | pci_read_config_byte(dev, 0x50, &mcr1); | ||
1528 | if (mcr1 & 0x30) | ||
1529 | pci_write_config_byte(dev, 0x50, mcr1 | 0x30); | ||
1530 | |||
1531 | pci_read_config_byte(dev, PCI_INTERRUPT_PIN, &pin1); | ||
1532 | pci_read_config_byte(dev2, PCI_INTERRUPT_PIN, &pin2); | ||
1533 | if (pin1 != pin2 && dev->irq == dev2->irq) { | ||
1534 | d->bootable = ON_BOARD; | ||
1535 | printk("%s: onboard version of chipset, pin1=%d pin2=%d\n", | ||
1536 | d->name, pin1, pin2); | ||
1537 | } | ||
1538 | ret = ide_setup_pci_devices(dev, dev2, d); | ||
1539 | if (ret < 0) | ||
1540 | pci_dev_put(dev2); | ||
1541 | return ret; | ||
1542 | } | ||
1543 | init_single: | ||
1544 | return ide_setup_pci_device(dev, d); | ||
1545 | } | 1426 | } |
1546 | 1427 | ||
1547 | static ide_pci_device_t hpt366_chipsets[] __devinitdata = { | 1428 | static ide_pci_device_t hpt366_chipsets[] __devinitdata = { |
1548 | { /* 0 */ | 1429 | { /* 0 */ |
1549 | .name = "HPT366", | 1430 | .name = "HPT36x", |
1550 | .init_setup = init_setup_hpt366, | ||
1551 | .init_chipset = init_chipset_hpt366, | 1431 | .init_chipset = init_chipset_hpt366, |
1552 | .init_hwif = init_hwif_hpt366, | 1432 | .init_hwif = init_hwif_hpt366, |
1553 | .init_dma = init_dma_hpt366, | 1433 | .init_dma = init_dma_hpt366, |
1554 | .autodma = AUTODMA, | 1434 | /* |
1555 | .enablebits = {{0x50,0x04,0x04}, {0x54,0x04,0x04}}, | 1435 | * HPT36x chips have one channel per function and have |
1556 | .bootable = OFF_BOARD, | 1436 | * both channel enable bits located differently and visible |
1437 | * to both functions -- really stupid design decision... :-( | ||
1438 | * Bit 4 is for the primary channel, bit 5 for the secondary. | ||
1439 | */ | ||
1440 | .enablebits = {{0x50,0x10,0x10}, {0x54,0x04,0x04}}, | ||
1557 | .extra = 240, | 1441 | .extra = 240, |
1442 | .host_flags = IDE_HFLAG_SINGLE | | ||
1443 | IDE_HFLAG_NO_ATAPI_DMA | | ||
1444 | IDE_HFLAG_OFF_BOARD, | ||
1558 | .pio_mask = ATA_PIO4, | 1445 | .pio_mask = ATA_PIO4, |
1446 | .mwdma_mask = ATA_MWDMA2, | ||
1559 | },{ /* 1 */ | 1447 | },{ /* 1 */ |
1560 | .name = "HPT372A", | 1448 | .name = "HPT372A", |
1561 | .init_setup = init_setup_hpt372a, | ||
1562 | .init_chipset = init_chipset_hpt366, | 1449 | .init_chipset = init_chipset_hpt366, |
1563 | .init_hwif = init_hwif_hpt366, | 1450 | .init_hwif = init_hwif_hpt366, |
1564 | .init_dma = init_dma_hpt366, | 1451 | .init_dma = init_dma_hpt366, |
1565 | .autodma = AUTODMA, | ||
1566 | .enablebits = {{0x50,0x04,0x04}, {0x54,0x04,0x04}}, | 1452 | .enablebits = {{0x50,0x04,0x04}, {0x54,0x04,0x04}}, |
1567 | .udma_mask = HPT372_ALLOW_ATA133_6 ? ATA_UDMA6 : ATA_UDMA5, | ||
1568 | .bootable = OFF_BOARD, | ||
1569 | .extra = 240, | 1453 | .extra = 240, |
1454 | .host_flags = IDE_HFLAG_NO_ATAPI_DMA | IDE_HFLAG_OFF_BOARD, | ||
1570 | .pio_mask = ATA_PIO4, | 1455 | .pio_mask = ATA_PIO4, |
1456 | .mwdma_mask = ATA_MWDMA2, | ||
1571 | },{ /* 2 */ | 1457 | },{ /* 2 */ |
1572 | .name = "HPT302", | 1458 | .name = "HPT302", |
1573 | .init_setup = init_setup_hpt302, | ||
1574 | .init_chipset = init_chipset_hpt366, | 1459 | .init_chipset = init_chipset_hpt366, |
1575 | .init_hwif = init_hwif_hpt366, | 1460 | .init_hwif = init_hwif_hpt366, |
1576 | .init_dma = init_dma_hpt366, | 1461 | .init_dma = init_dma_hpt366, |
1577 | .autodma = AUTODMA, | ||
1578 | .enablebits = {{0x50,0x04,0x04}, {0x54,0x04,0x04}}, | 1462 | .enablebits = {{0x50,0x04,0x04}, {0x54,0x04,0x04}}, |
1579 | .udma_mask = HPT302_ALLOW_ATA133_6 ? ATA_UDMA6 : ATA_UDMA5, | ||
1580 | .bootable = OFF_BOARD, | ||
1581 | .extra = 240, | 1463 | .extra = 240, |
1464 | .host_flags = IDE_HFLAG_NO_ATAPI_DMA | IDE_HFLAG_OFF_BOARD, | ||
1582 | .pio_mask = ATA_PIO4, | 1465 | .pio_mask = ATA_PIO4, |
1466 | .mwdma_mask = ATA_MWDMA2, | ||
1583 | },{ /* 3 */ | 1467 | },{ /* 3 */ |
1584 | .name = "HPT371", | 1468 | .name = "HPT371", |
1585 | .init_setup = init_setup_hpt371, | ||
1586 | .init_chipset = init_chipset_hpt366, | 1469 | .init_chipset = init_chipset_hpt366, |
1587 | .init_hwif = init_hwif_hpt366, | 1470 | .init_hwif = init_hwif_hpt366, |
1588 | .init_dma = init_dma_hpt366, | 1471 | .init_dma = init_dma_hpt366, |
1589 | .autodma = AUTODMA, | ||
1590 | .enablebits = {{0x50,0x04,0x04}, {0x54,0x04,0x04}}, | 1472 | .enablebits = {{0x50,0x04,0x04}, {0x54,0x04,0x04}}, |
1591 | .udma_mask = HPT371_ALLOW_ATA133_6 ? ATA_UDMA6 : ATA_UDMA5, | ||
1592 | .bootable = OFF_BOARD, | ||
1593 | .extra = 240, | 1473 | .extra = 240, |
1474 | .host_flags = IDE_HFLAG_NO_ATAPI_DMA | IDE_HFLAG_OFF_BOARD, | ||
1594 | .pio_mask = ATA_PIO4, | 1475 | .pio_mask = ATA_PIO4, |
1476 | .mwdma_mask = ATA_MWDMA2, | ||
1595 | },{ /* 4 */ | 1477 | },{ /* 4 */ |
1596 | .name = "HPT374", | 1478 | .name = "HPT374", |
1597 | .init_setup = init_setup_hpt374, | ||
1598 | .init_chipset = init_chipset_hpt366, | 1479 | .init_chipset = init_chipset_hpt366, |
1599 | .init_hwif = init_hwif_hpt366, | 1480 | .init_hwif = init_hwif_hpt366, |
1600 | .init_dma = init_dma_hpt366, | 1481 | .init_dma = init_dma_hpt366, |
1601 | .autodma = AUTODMA, | ||
1602 | .enablebits = {{0x50,0x04,0x04}, {0x54,0x04,0x04}}, | 1482 | .enablebits = {{0x50,0x04,0x04}, {0x54,0x04,0x04}}, |
1603 | .udma_mask = ATA_UDMA5, | 1483 | .udma_mask = ATA_UDMA5, |
1604 | .bootable = OFF_BOARD, | ||
1605 | .extra = 240, | 1484 | .extra = 240, |
1485 | .host_flags = IDE_HFLAG_NO_ATAPI_DMA | IDE_HFLAG_OFF_BOARD, | ||
1606 | .pio_mask = ATA_PIO4, | 1486 | .pio_mask = ATA_PIO4, |
1487 | .mwdma_mask = ATA_MWDMA2, | ||
1607 | },{ /* 5 */ | 1488 | },{ /* 5 */ |
1608 | .name = "HPT372N", | 1489 | .name = "HPT372N", |
1609 | .init_setup = init_setup_hpt372n, | ||
1610 | .init_chipset = init_chipset_hpt366, | 1490 | .init_chipset = init_chipset_hpt366, |
1611 | .init_hwif = init_hwif_hpt366, | 1491 | .init_hwif = init_hwif_hpt366, |
1612 | .init_dma = init_dma_hpt366, | 1492 | .init_dma = init_dma_hpt366, |
1613 | .autodma = AUTODMA, | ||
1614 | .enablebits = {{0x50,0x04,0x04}, {0x54,0x04,0x04}}, | 1493 | .enablebits = {{0x50,0x04,0x04}, {0x54,0x04,0x04}}, |
1615 | .udma_mask = HPT372_ALLOW_ATA133_6 ? ATA_UDMA6 : ATA_UDMA5, | ||
1616 | .bootable = OFF_BOARD, | ||
1617 | .extra = 240, | 1494 | .extra = 240, |
1495 | .host_flags = IDE_HFLAG_NO_ATAPI_DMA | IDE_HFLAG_OFF_BOARD, | ||
1618 | .pio_mask = ATA_PIO4, | 1496 | .pio_mask = ATA_PIO4, |
1497 | .mwdma_mask = ATA_MWDMA2, | ||
1619 | } | 1498 | } |
1620 | }; | 1499 | }; |
1621 | 1500 | ||
@@ -1626,16 +1505,77 @@ static ide_pci_device_t hpt366_chipsets[] __devinitdata = { | |||
1626 | * | 1505 | * |
1627 | * Called when the PCI registration layer (or the IDE initialization) | 1506 | * Called when the PCI registration layer (or the IDE initialization) |
1628 | * finds a device matching our IDE device tables. | 1507 | * finds a device matching our IDE device tables. |
1629 | * | ||
1630 | * NOTE: since we'll have to modify some fields of the ide_pci_device_t | ||
1631 | * structure depending on the chip's revision, we'd better pass a local | ||
1632 | * copy down the call chain... | ||
1633 | */ | 1508 | */ |
1634 | static int __devinit hpt366_init_one(struct pci_dev *dev, const struct pci_device_id *id) | 1509 | static int __devinit hpt366_init_one(struct pci_dev *dev, const struct pci_device_id *id) |
1635 | { | 1510 | { |
1636 | ide_pci_device_t d = hpt366_chipsets[id->driver_data]; | 1511 | struct hpt_info *info = NULL; |
1512 | struct pci_dev *dev2 = NULL; | ||
1513 | ide_pci_device_t d; | ||
1514 | u8 idx = id->driver_data; | ||
1515 | u8 rev = dev->revision; | ||
1516 | |||
1517 | if ((idx == 0 || idx == 4) && (PCI_FUNC(dev->devfn) & 1)) | ||
1518 | return -ENODEV; | ||
1519 | |||
1520 | switch (idx) { | ||
1521 | case 0: | ||
1522 | if (rev < 3) | ||
1523 | info = &hpt36x; | ||
1524 | else { | ||
1525 | static struct hpt_info *hpt37x_info[] = | ||
1526 | { &hpt370, &hpt370a, &hpt372, &hpt372n }; | ||
1527 | |||
1528 | info = hpt37x_info[min_t(u8, rev, 6) - 3]; | ||
1529 | idx++; | ||
1530 | } | ||
1531 | break; | ||
1532 | case 1: | ||
1533 | info = (rev > 1) ? &hpt372n : &hpt372a; | ||
1534 | break; | ||
1535 | case 2: | ||
1536 | info = (rev > 1) ? &hpt302n : &hpt302; | ||
1537 | break; | ||
1538 | case 3: | ||
1539 | hpt371_init(dev); | ||
1540 | info = (rev > 1) ? &hpt371n : &hpt371; | ||
1541 | break; | ||
1542 | case 4: | ||
1543 | info = &hpt374; | ||
1544 | break; | ||
1545 | case 5: | ||
1546 | info = &hpt372n; | ||
1547 | break; | ||
1548 | } | ||
1549 | |||
1550 | d = hpt366_chipsets[idx]; | ||
1551 | |||
1552 | d.name = info->chip_name; | ||
1553 | d.udma_mask = info->udma_mask; | ||
1554 | |||
1555 | pci_set_drvdata(dev, info); | ||
1556 | |||
1557 | if (info == &hpt36x || info == &hpt374) | ||
1558 | dev2 = pci_get_slot(dev->bus, dev->devfn + 1); | ||
1559 | |||
1560 | if (dev2) { | ||
1561 | int ret; | ||
1562 | |||
1563 | pci_set_drvdata(dev2, info); | ||
1564 | |||
1565 | if (info == &hpt374) | ||
1566 | hpt374_init(dev, dev2); | ||
1567 | else { | ||
1568 | if (hpt36x_init(dev, dev2)) | ||
1569 | d.host_flags |= IDE_HFLAG_BOOTABLE; | ||
1570 | } | ||
1571 | |||
1572 | ret = ide_setup_pci_devices(dev, dev2, &d); | ||
1573 | if (ret < 0) | ||
1574 | pci_dev_put(dev2); | ||
1575 | return ret; | ||
1576 | } | ||
1637 | 1577 | ||
1638 | return d.init_setup(dev, &d); | 1578 | return ide_setup_pci_device(dev, &d); |
1639 | } | 1579 | } |
1640 | 1580 | ||
1641 | static const struct pci_device_id hpt366_pci_tbl[] = { | 1581 | static const struct pci_device_id hpt366_pci_tbl[] = { |