diff options
Diffstat (limited to 'drivers/ata/pata_hpt37x.c')
-rw-r--r-- | drivers/ata/pata_hpt37x.c | 61 |
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 | /** | 344 | static 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 | |||
351 | static 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 | |||
356 | static 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 | |||
401 | static 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 | ||
670 | static struct ata_port_operations hpt374_port_ops = { | 639 | static 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); |