aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/ata/pata_hpt37x.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/ata/pata_hpt37x.c')
-rw-r--r--drivers/ata/pata_hpt37x.c61
1 files changed, 20 insertions, 41 deletions
diff --git a/drivers/ata/pata_hpt37x.c b/drivers/ata/pata_hpt37x.c
index fb37e3a161fc..c10fcd31418d 100644
--- a/drivers/ata/pata_hpt37x.c
+++ b/drivers/ata/pata_hpt37x.c
@@ -341,19 +341,7 @@ static int hpt37x_pre_reset(struct ata_link *link, unsigned long deadline)
341 return ata_std_prereset(link, deadline); 341 return ata_std_prereset(link, deadline);
342} 342}
343 343
344/** 344static int hpt374_fn1_pre_reset(struct ata_link *link, unsigned long deadline)
345 * hpt37x_error_handler - reset the hpt374
346 * @ap: ATA port to reset
347 *
348 * Perform probe for HPT37x, except for HPT374 channel 2
349 */
350
351static void hpt37x_error_handler(struct ata_port *ap)
352{
353 ata_bmdma_drive_eh(ap, hpt37x_pre_reset, ata_std_softreset, NULL, ata_std_postreset);
354}
355
356static int hpt374_pre_reset(struct ata_link *link, unsigned long deadline)
357{ 345{
358 static const struct pci_bits hpt37x_enable_bits[] = { 346 static const struct pci_bits hpt37x_enable_bits[] = {
359 { 0x50, 1, 0x04, 0x04 }, 347 { 0x50, 1, 0x04, 0x04 },
@@ -390,25 +378,6 @@ static int hpt374_pre_reset(struct ata_link *link, unsigned long deadline)
390} 378}
391 379
392/** 380/**
393 * hpt374_error_handler - reset the hpt374
394 * @classes:
395 *
396 * The 374 cable detect is a little different due to the extra
397 * channels. The function 0 channels work like usual but function 1
398 * is special
399 */
400
401static void hpt374_error_handler(struct ata_port *ap)
402{
403 struct pci_dev *pdev = to_pci_dev(ap->host->dev);
404
405 if (!(PCI_FUNC(pdev->devfn) & 1))
406 hpt37x_error_handler(ap);
407 else
408 ata_bmdma_drive_eh(ap, hpt374_pre_reset, ata_std_softreset, NULL, ata_std_postreset);
409}
410
411/**
412 * hpt370_set_piomode - PIO setup 381 * hpt370_set_piomode - PIO setup
413 * @ap: ATA interface 382 * @ap: ATA interface
414 * @adev: device on the interface 383 * @adev: device on the interface
@@ -635,7 +604,7 @@ static struct ata_port_operations hpt370_port_ops = {
635 .mode_filter = hpt370_filter, 604 .mode_filter = hpt370_filter,
636 .set_piomode = hpt370_set_piomode, 605 .set_piomode = hpt370_set_piomode,
637 .set_dmamode = hpt370_set_dmamode, 606 .set_dmamode = hpt370_set_dmamode,
638 .error_handler = hpt37x_error_handler, 607 .prereset = hpt37x_pre_reset,
639}; 608};
640 609
641/* 610/*
@@ -659,17 +628,17 @@ static struct ata_port_operations hpt372_port_ops = {
659 628
660 .set_piomode = hpt372_set_piomode, 629 .set_piomode = hpt372_set_piomode,
661 .set_dmamode = hpt372_set_dmamode, 630 .set_dmamode = hpt372_set_dmamode,
662 .error_handler = hpt37x_error_handler, 631 .prereset = hpt37x_pre_reset,
663}; 632};
664 633
665/* 634/*
666 * Configuration for HPT374. Mode setting works like 372 and friends 635 * Configuration for HPT374. Mode setting works like 372 and friends
667 * but we have a different cable detection procedure. 636 * but we have a different cable detection procedure for function 1.
668 */ 637 */
669 638
670static struct ata_port_operations hpt374_port_ops = { 639static struct ata_port_operations hpt374_fn1_port_ops = {
671 .inherits = &hpt372_port_ops, 640 .inherits = &hpt372_port_ops,
672 .error_handler = hpt374_error_handler, 641 .prereset = hpt374_fn1_pre_reset,
673}; 642};
674 643
675/** 644/**
@@ -821,13 +790,20 @@ static int hpt37x_init_one(struct pci_dev *dev, const struct pci_device_id *id)
821 .udma_mask = ATA_UDMA6, 790 .udma_mask = ATA_UDMA6,
822 .port_ops = &hpt372_port_ops 791 .port_ops = &hpt372_port_ops
823 }; 792 };
824 /* HPT374 - UDMA100 */ 793 /* HPT374 - UDMA100, function 1 uses different prereset method */
825 static const struct ata_port_info info_hpt374 = { 794 static const struct ata_port_info info_hpt374_fn0 = {
795 .flags = ATA_FLAG_SLAVE_POSS,
796 .pio_mask = 0x1f,
797 .mwdma_mask = 0x07,
798 .udma_mask = ATA_UDMA5,
799 .port_ops = &hpt372_port_ops
800 };
801 static const struct ata_port_info info_hpt374_fn1 = {
826 .flags = ATA_FLAG_SLAVE_POSS, 802 .flags = ATA_FLAG_SLAVE_POSS,
827 .pio_mask = 0x1f, 803 .pio_mask = 0x1f,
828 .mwdma_mask = 0x07, 804 .mwdma_mask = 0x07,
829 .udma_mask = ATA_UDMA5, 805 .udma_mask = ATA_UDMA5,
830 .port_ops = &hpt374_port_ops 806 .port_ops = &hpt374_fn1_port_ops
831 }; 807 };
832 808
833 static const int MHz[4] = { 33, 40, 50, 66 }; 809 static const int MHz[4] = { 33, 40, 50, 66 };
@@ -912,7 +888,10 @@ static int hpt37x_init_one(struct pci_dev *dev, const struct pci_device_id *id)
912 break; 888 break;
913 case PCI_DEVICE_ID_TTI_HPT374: 889 case PCI_DEVICE_ID_TTI_HPT374:
914 chip_table = &hpt374; 890 chip_table = &hpt374;
915 ppi[0] = &info_hpt374; 891 if (!(PCI_FUNC(dev->devfn) & 1))
892 *ppi = &info_hpt374_fn0;
893 else
894 *ppi = &info_hpt374_fn1;
916 break; 895 break;
917 default: 896 default:
918 printk(KERN_ERR "pata_hpt37x: PCI table is bogus please report (%d).\n", dev->device); 897 printk(KERN_ERR "pata_hpt37x: PCI table is bogus please report (%d).\n", dev->device);