diff options
| -rw-r--r-- | drivers/ata/ahci.c | 8 | ||||
| -rw-r--r-- | drivers/ata/ata_piix.c | 7 | ||||
| -rw-r--r-- | drivers/ata/libata-core.c | 2 | ||||
| -rw-r--r-- | drivers/ata/libata-pmp.c | 7 | ||||
| -rw-r--r-- | drivers/ata/libata-scsi.c | 3 | ||||
| -rw-r--r-- | drivers/ata/sata_fsl.c | 224 | ||||
| -rw-r--r-- | drivers/ata/sata_mv.c | 83 |
7 files changed, 217 insertions, 117 deletions
diff --git a/drivers/ata/ahci.c b/drivers/ata/ahci.c index 97f83fb2ee2e..544b7d6c617c 100644 --- a/drivers/ata/ahci.c +++ b/drivers/ata/ahci.c | |||
| @@ -502,10 +502,10 @@ static const struct pci_device_id ahci_pci_tbl[] = { | |||
| 502 | { PCI_VDEVICE(NVIDIA, 0x0bcd), board_ahci }, /* MCP7B */ | 502 | { PCI_VDEVICE(NVIDIA, 0x0bcd), board_ahci }, /* MCP7B */ |
| 503 | { PCI_VDEVICE(NVIDIA, 0x0bce), board_ahci }, /* MCP7B */ | 503 | { PCI_VDEVICE(NVIDIA, 0x0bce), board_ahci }, /* MCP7B */ |
| 504 | { PCI_VDEVICE(NVIDIA, 0x0bcf), board_ahci }, /* MCP7B */ | 504 | { PCI_VDEVICE(NVIDIA, 0x0bcf), board_ahci }, /* MCP7B */ |
| 505 | { PCI_VDEVICE(NVIDIA, 0x0bd0), board_ahci }, /* MCP7B */ | 505 | { PCI_VDEVICE(NVIDIA, 0x0bc4), board_ahci }, /* MCP7B */ |
| 506 | { PCI_VDEVICE(NVIDIA, 0x0bd1), board_ahci }, /* MCP7B */ | 506 | { PCI_VDEVICE(NVIDIA, 0x0bc5), board_ahci }, /* MCP7B */ |
| 507 | { PCI_VDEVICE(NVIDIA, 0x0bd2), board_ahci }, /* MCP7B */ | 507 | { PCI_VDEVICE(NVIDIA, 0x0bc6), board_ahci }, /* MCP7B */ |
| 508 | { PCI_VDEVICE(NVIDIA, 0x0bd3), board_ahci }, /* MCP7B */ | 508 | { PCI_VDEVICE(NVIDIA, 0x0bc7), board_ahci }, /* MCP7B */ |
| 509 | 509 | ||
| 510 | /* SiS */ | 510 | /* SiS */ |
| 511 | { PCI_VDEVICE(SI, 0x1184), board_ahci }, /* SiS 966 */ | 511 | { PCI_VDEVICE(SI, 0x1184), board_ahci }, /* SiS 966 */ |
diff --git a/drivers/ata/ata_piix.c b/drivers/ata/ata_piix.c index a9027b8fbdd5..3548ee7014ca 100644 --- a/drivers/ata/ata_piix.c +++ b/drivers/ata/ata_piix.c | |||
| @@ -247,10 +247,11 @@ static const struct pci_device_id piix_pci_tbl[] = { | |||
| 247 | { 0x8086, 0x2820, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_sata }, | 247 | { 0x8086, 0x2820, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_sata }, |
| 248 | /* SATA Controller 2 IDE (ICH8) */ | 248 | /* SATA Controller 2 IDE (ICH8) */ |
| 249 | { 0x8086, 0x2825, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_2port_sata }, | 249 | { 0x8086, 0x2825, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_2port_sata }, |
| 250 | /* Mobile SATA Controller IDE (ICH8M) */ | ||
| 251 | { 0x8086, 0x2828, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_sata }, | ||
| 252 | /* Mobile SATA Controller IDE (ICH8M), Apple */ | 250 | /* Mobile SATA Controller IDE (ICH8M), Apple */ |
| 253 | { 0x8086, 0x2828, 0x106b, 0x00a0, 0, 0, ich8m_apple_sata }, | 251 | { 0x8086, 0x2828, 0x106b, 0x00a0, 0, 0, ich8m_apple_sata }, |
| 252 | { 0x8086, 0x2828, 0x106b, 0x00a1, 0, 0, ich8m_apple_sata }, | ||
| 253 | /* Mobile SATA Controller IDE (ICH8M) */ | ||
| 254 | { 0x8086, 0x2828, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_sata }, | ||
| 254 | /* SATA Controller IDE (ICH9) */ | 255 | /* SATA Controller IDE (ICH9) */ |
| 255 | { 0x8086, 0x2920, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_sata }, | 256 | { 0x8086, 0x2920, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_sata }, |
| 256 | /* SATA Controller IDE (ICH9) */ | 257 | /* SATA Controller IDE (ICH9) */ |
| @@ -526,7 +527,7 @@ static struct ata_port_info piix_port_info[] = { | |||
| 526 | 527 | ||
| 527 | [ich8m_apple_sata] = | 528 | [ich8m_apple_sata] = |
| 528 | { | 529 | { |
| 529 | .flags = PIIX_SATA_FLAGS | PIIX_FLAG_SIDPR, | 530 | .flags = PIIX_SATA_FLAGS, |
| 530 | .pio_mask = 0x1f, /* pio0-4 */ | 531 | .pio_mask = 0x1f, /* pio0-4 */ |
| 531 | .mwdma_mask = 0x07, /* mwdma0-2 */ | 532 | .mwdma_mask = 0x07, /* mwdma0-2 */ |
| 532 | .udma_mask = ATA_UDMA6, | 533 | .udma_mask = ATA_UDMA6, |
diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c index 3c89f205c83f..cc816ca623d3 100644 --- a/drivers/ata/libata-core.c +++ b/drivers/ata/libata-core.c | |||
| @@ -5403,7 +5403,7 @@ static void ata_host_stop(struct device *gendev, void *res) | |||
| 5403 | */ | 5403 | */ |
| 5404 | static void ata_finalize_port_ops(struct ata_port_operations *ops) | 5404 | static void ata_finalize_port_ops(struct ata_port_operations *ops) |
| 5405 | { | 5405 | { |
| 5406 | static spinlock_t lock = SPIN_LOCK_UNLOCKED; | 5406 | static DEFINE_SPINLOCK(lock); |
| 5407 | const struct ata_port_operations *cur; | 5407 | const struct ata_port_operations *cur; |
| 5408 | void **begin = (void **)ops; | 5408 | void **begin = (void **)ops; |
| 5409 | void **end = (void **)&ops->inherits; | 5409 | void **end = (void **)&ops->inherits; |
diff --git a/drivers/ata/libata-pmp.c b/drivers/ata/libata-pmp.c index 0f9386d4a5a0..7daf4c0f6216 100644 --- a/drivers/ata/libata-pmp.c +++ b/drivers/ata/libata-pmp.c | |||
| @@ -322,9 +322,12 @@ static void sata_pmp_quirks(struct ata_port *ap) | |||
| 322 | if (vendor == 0x1095 && devid == 0x3726) { | 322 | if (vendor == 0x1095 && devid == 0x3726) { |
| 323 | /* sil3726 quirks */ | 323 | /* sil3726 quirks */ |
| 324 | ata_port_for_each_link(link, ap) { | 324 | ata_port_for_each_link(link, ap) { |
| 325 | /* class code report is unreliable */ | 325 | /* Class code report is unreliable and SRST |
| 326 | * times out under certain configurations. | ||
| 327 | */ | ||
| 326 | if (link->pmp < 5) | 328 | if (link->pmp < 5) |
| 327 | link->flags |= ATA_LFLAG_ASSUME_ATA; | 329 | link->flags |= ATA_LFLAG_NO_SRST | |
| 330 | ATA_LFLAG_ASSUME_ATA; | ||
| 328 | 331 | ||
| 329 | /* port 5 is for SEMB device and it doesn't like SRST */ | 332 | /* port 5 is for SEMB device and it doesn't like SRST */ |
| 330 | if (link->pmp == 5) | 333 | if (link->pmp == 5) |
diff --git a/drivers/ata/libata-scsi.c b/drivers/ata/libata-scsi.c index aeb6e01d82ce..2e6e1622dc6d 100644 --- a/drivers/ata/libata-scsi.c +++ b/drivers/ata/libata-scsi.c | |||
| @@ -1637,6 +1637,7 @@ defer: | |||
| 1637 | 1637 | ||
| 1638 | /** | 1638 | /** |
| 1639 | * ata_scsi_rbuf_get - Map response buffer. | 1639 | * ata_scsi_rbuf_get - Map response buffer. |
| 1640 | * @cmd: SCSI command containing buffer to be mapped. | ||
| 1640 | * @flags: unsigned long variable to store irq enable status | 1641 | * @flags: unsigned long variable to store irq enable status |
| 1641 | * @copy_in: copy in from user buffer | 1642 | * @copy_in: copy in from user buffer |
| 1642 | * | 1643 | * |
| @@ -1954,7 +1955,7 @@ static unsigned int ata_msense_ctl_mode(u8 *buf) | |||
| 1954 | 1955 | ||
| 1955 | /** | 1956 | /** |
| 1956 | * ata_msense_rw_recovery - Simulate MODE SENSE r/w error recovery page | 1957 | * ata_msense_rw_recovery - Simulate MODE SENSE r/w error recovery page |
| 1957 | * @bufp: output buffer | 1958 | * @buf: output buffer |
| 1958 | * | 1959 | * |
| 1959 | * Generate a generic MODE SENSE r/w error recovery page. | 1960 | * Generate a generic MODE SENSE r/w error recovery page. |
| 1960 | * | 1961 | * |
diff --git a/drivers/ata/sata_fsl.c b/drivers/ata/sata_fsl.c index 853559e32315..3924e7209a44 100644 --- a/drivers/ata/sata_fsl.c +++ b/drivers/ata/sata_fsl.c | |||
| @@ -34,7 +34,7 @@ enum { | |||
| 34 | 34 | ||
| 35 | SATA_FSL_HOST_FLAGS = (ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY | | 35 | SATA_FSL_HOST_FLAGS = (ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY | |
| 36 | ATA_FLAG_MMIO | ATA_FLAG_PIO_DMA | | 36 | ATA_FLAG_MMIO | ATA_FLAG_PIO_DMA | |
| 37 | ATA_FLAG_NCQ), | 37 | ATA_FLAG_PMP | ATA_FLAG_NCQ), |
| 38 | 38 | ||
| 39 | SATA_FSL_MAX_CMDS = SATA_FSL_QUEUE_DEPTH, | 39 | SATA_FSL_MAX_CMDS = SATA_FSL_QUEUE_DEPTH, |
| 40 | SATA_FSL_CMD_HDR_SIZE = 16, /* 4 DWORDS */ | 40 | SATA_FSL_CMD_HDR_SIZE = 16, /* 4 DWORDS */ |
| @@ -395,7 +395,7 @@ static void sata_fsl_qc_prep(struct ata_queued_cmd *qc) | |||
| 395 | cd = (struct command_desc *)pp->cmdentry + tag; | 395 | cd = (struct command_desc *)pp->cmdentry + tag; |
| 396 | cd_paddr = pp->cmdentry_paddr + tag * SATA_FSL_CMD_DESC_SIZE; | 396 | cd_paddr = pp->cmdentry_paddr + tag * SATA_FSL_CMD_DESC_SIZE; |
| 397 | 397 | ||
| 398 | ata_tf_to_fis(&qc->tf, 0, 1, (u8 *) &cd->cfis); | 398 | ata_tf_to_fis(&qc->tf, qc->dev->link->pmp, 1, (u8 *) &cd->cfis); |
| 399 | 399 | ||
| 400 | VPRINTK("Dumping cfis : 0x%x, 0x%x, 0x%x\n", | 400 | VPRINTK("Dumping cfis : 0x%x, 0x%x, 0x%x\n", |
| 401 | cd->cfis[0], cd->cfis[1], cd->cfis[2]); | 401 | cd->cfis[0], cd->cfis[1], cd->cfis[2]); |
| @@ -438,6 +438,8 @@ static unsigned int sata_fsl_qc_issue(struct ata_queued_cmd *qc) | |||
| 438 | ioread32(CA + hcr_base), | 438 | ioread32(CA + hcr_base), |
| 439 | ioread32(CE + hcr_base), ioread32(CC + hcr_base)); | 439 | ioread32(CE + hcr_base), ioread32(CC + hcr_base)); |
| 440 | 440 | ||
| 441 | iowrite32(qc->dev->link->pmp, CQPMP + hcr_base); | ||
| 442 | |||
| 441 | /* Simply queue command to the controller/device */ | 443 | /* Simply queue command to the controller/device */ |
| 442 | iowrite32(1 << tag, CQ + hcr_base); | 444 | iowrite32(1 << tag, CQ + hcr_base); |
| 443 | 445 | ||
| @@ -558,11 +560,36 @@ static void sata_fsl_thaw(struct ata_port *ap) | |||
| 558 | ioread32(hcr_base + HCONTROL), ioread32(hcr_base + HSTATUS)); | 560 | ioread32(hcr_base + HCONTROL), ioread32(hcr_base + HSTATUS)); |
| 559 | } | 561 | } |
| 560 | 562 | ||
| 563 | static void sata_fsl_pmp_attach(struct ata_port *ap) | ||
| 564 | { | ||
| 565 | struct sata_fsl_host_priv *host_priv = ap->host->private_data; | ||
| 566 | void __iomem *hcr_base = host_priv->hcr_base; | ||
| 567 | u32 temp; | ||
| 568 | |||
| 569 | temp = ioread32(hcr_base + HCONTROL); | ||
| 570 | iowrite32((temp | HCONTROL_PMP_ATTACHED), hcr_base + HCONTROL); | ||
| 571 | } | ||
| 572 | |||
| 573 | static void sata_fsl_pmp_detach(struct ata_port *ap) | ||
| 574 | { | ||
| 575 | struct sata_fsl_host_priv *host_priv = ap->host->private_data; | ||
| 576 | void __iomem *hcr_base = host_priv->hcr_base; | ||
| 577 | u32 temp; | ||
| 578 | |||
| 579 | temp = ioread32(hcr_base + HCONTROL); | ||
| 580 | temp &= ~HCONTROL_PMP_ATTACHED; | ||
| 581 | iowrite32(temp, hcr_base + HCONTROL); | ||
| 582 | |||
| 583 | /* enable interrupts on the controller/port */ | ||
| 584 | temp = ioread32(hcr_base + HCONTROL); | ||
| 585 | iowrite32((temp | DEFAULT_PORT_IRQ_ENABLE_MASK), hcr_base + HCONTROL); | ||
| 586 | |||
| 587 | } | ||
| 588 | |||
| 561 | static int sata_fsl_port_start(struct ata_port *ap) | 589 | static int sata_fsl_port_start(struct ata_port *ap) |
| 562 | { | 590 | { |
| 563 | struct device *dev = ap->host->dev; | 591 | struct device *dev = ap->host->dev; |
| 564 | struct sata_fsl_port_priv *pp; | 592 | struct sata_fsl_port_priv *pp; |
| 565 | int retval; | ||
| 566 | void *mem; | 593 | void *mem; |
| 567 | dma_addr_t mem_dma; | 594 | dma_addr_t mem_dma; |
| 568 | struct sata_fsl_host_priv *host_priv = ap->host->private_data; | 595 | struct sata_fsl_host_priv *host_priv = ap->host->private_data; |
| @@ -688,12 +715,13 @@ static int sata_fsl_prereset(struct ata_link *link, unsigned long deadline) | |||
| 688 | } | 715 | } |
| 689 | 716 | ||
| 690 | static int sata_fsl_softreset(struct ata_link *link, unsigned int *class, | 717 | static int sata_fsl_softreset(struct ata_link *link, unsigned int *class, |
| 691 | unsigned long deadline) | 718 | unsigned long deadline) |
| 692 | { | 719 | { |
| 693 | struct ata_port *ap = link->ap; | 720 | struct ata_port *ap = link->ap; |
| 694 | struct sata_fsl_port_priv *pp = ap->private_data; | 721 | struct sata_fsl_port_priv *pp = ap->private_data; |
| 695 | struct sata_fsl_host_priv *host_priv = ap->host->private_data; | 722 | struct sata_fsl_host_priv *host_priv = ap->host->private_data; |
| 696 | void __iomem *hcr_base = host_priv->hcr_base; | 723 | void __iomem *hcr_base = host_priv->hcr_base; |
| 724 | int pmp = sata_srst_pmp(link); | ||
| 697 | u32 temp; | 725 | u32 temp; |
| 698 | struct ata_taskfile tf; | 726 | struct ata_taskfile tf; |
| 699 | u8 *cfis; | 727 | u8 *cfis; |
| @@ -703,6 +731,9 @@ static int sata_fsl_softreset(struct ata_link *link, unsigned int *class, | |||
| 703 | 731 | ||
| 704 | DPRINTK("in xx_softreset\n"); | 732 | DPRINTK("in xx_softreset\n"); |
| 705 | 733 | ||
| 734 | if (pmp != SATA_PMP_CTRL_PORT) | ||
| 735 | goto issue_srst; | ||
| 736 | |||
| 706 | try_offline_again: | 737 | try_offline_again: |
| 707 | /* | 738 | /* |
| 708 | * Force host controller to go off-line, aborting current operations | 739 | * Force host controller to go off-line, aborting current operations |
| @@ -746,6 +777,7 @@ try_offline_again: | |||
| 746 | 777 | ||
| 747 | temp = ioread32(hcr_base + HCONTROL); | 778 | temp = ioread32(hcr_base + HCONTROL); |
| 748 | temp |= (HCONTROL_ONLINE_PHY_RST | HCONTROL_SNOOP_ENABLE); | 779 | temp |= (HCONTROL_ONLINE_PHY_RST | HCONTROL_SNOOP_ENABLE); |
| 780 | temp |= HCONTROL_PMP_ATTACHED; | ||
| 749 | iowrite32(temp, hcr_base + HCONTROL); | 781 | iowrite32(temp, hcr_base + HCONTROL); |
| 750 | 782 | ||
| 751 | temp = ata_wait_register(hcr_base + HSTATUS, ONLINE, 0, 1, 500); | 783 | temp = ata_wait_register(hcr_base + HSTATUS, ONLINE, 0, 1, 500); |
| @@ -771,7 +803,8 @@ try_offline_again: | |||
| 771 | ata_port_printk(ap, KERN_WARNING, | 803 | ata_port_printk(ap, KERN_WARNING, |
| 772 | "No Device OR PHYRDY change,Hstatus = 0x%x\n", | 804 | "No Device OR PHYRDY change,Hstatus = 0x%x\n", |
| 773 | ioread32(hcr_base + HSTATUS)); | 805 | ioread32(hcr_base + HSTATUS)); |
| 774 | goto err; | 806 | *class = ATA_DEV_NONE; |
| 807 | goto out; | ||
| 775 | } | 808 | } |
| 776 | 809 | ||
| 777 | /* | 810 | /* |
| @@ -783,7 +816,8 @@ try_offline_again: | |||
| 783 | 816 | ||
| 784 | if ((temp & 0xFF) != 0x18) { | 817 | if ((temp & 0xFF) != 0x18) { |
| 785 | ata_port_printk(ap, KERN_WARNING, "No Signature Update\n"); | 818 | ata_port_printk(ap, KERN_WARNING, "No Signature Update\n"); |
| 786 | goto err; | 819 | *class = ATA_DEV_NONE; |
| 820 | goto out; | ||
| 787 | } else { | 821 | } else { |
| 788 | ata_port_printk(ap, KERN_INFO, | 822 | ata_port_printk(ap, KERN_INFO, |
| 789 | "Signature Update detected @ %d msecs\n", | 823 | "Signature Update detected @ %d msecs\n", |
| @@ -798,6 +832,7 @@ try_offline_again: | |||
| 798 | * reached here, we can send a command to the target device | 832 | * reached here, we can send a command to the target device |
| 799 | */ | 833 | */ |
| 800 | 834 | ||
| 835 | issue_srst: | ||
| 801 | DPRINTK("Sending SRST/device reset\n"); | 836 | DPRINTK("Sending SRST/device reset\n"); |
| 802 | 837 | ||
| 803 | ata_tf_init(link->device, &tf); | 838 | ata_tf_init(link->device, &tf); |
| @@ -808,7 +843,7 @@ try_offline_again: | |||
| 808 | SRST_CMD | CMD_DESC_SNOOP_ENABLE, 0, 0, 5); | 843 | SRST_CMD | CMD_DESC_SNOOP_ENABLE, 0, 0, 5); |
| 809 | 844 | ||
| 810 | tf.ctl |= ATA_SRST; /* setup SRST bit in taskfile control reg */ | 845 | tf.ctl |= ATA_SRST; /* setup SRST bit in taskfile control reg */ |
| 811 | ata_tf_to_fis(&tf, 0, 0, cfis); | 846 | ata_tf_to_fis(&tf, pmp, 0, cfis); |
| 812 | 847 | ||
| 813 | DPRINTK("Dumping cfis : 0x%x, 0x%x, 0x%x, 0x%x\n", | 848 | DPRINTK("Dumping cfis : 0x%x, 0x%x, 0x%x, 0x%x\n", |
| 814 | cfis[0], cfis[1], cfis[2], cfis[3]); | 849 | cfis[0], cfis[1], cfis[2], cfis[3]); |
| @@ -854,8 +889,10 @@ try_offline_again: | |||
| 854 | sata_fsl_setup_cmd_hdr_entry(pp, 0, CMD_DESC_SNOOP_ENABLE, 0, 0, 5); | 889 | sata_fsl_setup_cmd_hdr_entry(pp, 0, CMD_DESC_SNOOP_ENABLE, 0, 0, 5); |
| 855 | 890 | ||
| 856 | tf.ctl &= ~ATA_SRST; /* 2nd H2D Ctl. register FIS */ | 891 | tf.ctl &= ~ATA_SRST; /* 2nd H2D Ctl. register FIS */ |
| 857 | ata_tf_to_fis(&tf, 0, 0, cfis); | 892 | ata_tf_to_fis(&tf, pmp, 0, cfis); |
| 858 | 893 | ||
| 894 | if (pmp != SATA_PMP_CTRL_PORT) | ||
| 895 | iowrite32(pmp, CQPMP + hcr_base); | ||
| 859 | iowrite32(1, CQ + hcr_base); | 896 | iowrite32(1, CQ + hcr_base); |
| 860 | msleep(150); /* ?? */ | 897 | msleep(150); /* ?? */ |
| 861 | 898 | ||
| @@ -886,12 +923,21 @@ try_offline_again: | |||
| 886 | VPRINTK("cereg = 0x%x\n", ioread32(hcr_base + CE)); | 923 | VPRINTK("cereg = 0x%x\n", ioread32(hcr_base + CE)); |
| 887 | } | 924 | } |
| 888 | 925 | ||
| 926 | out: | ||
| 889 | return 0; | 927 | return 0; |
| 890 | 928 | ||
| 891 | err: | 929 | err: |
| 892 | return -EIO; | 930 | return -EIO; |
| 893 | } | 931 | } |
| 894 | 932 | ||
| 933 | static void sata_fsl_error_handler(struct ata_port *ap) | ||
| 934 | { | ||
| 935 | |||
| 936 | DPRINTK("in xx_error_handler\n"); | ||
| 937 | sata_pmp_error_handler(ap); | ||
| 938 | |||
| 939 | } | ||
| 940 | |||
| 895 | static void sata_fsl_post_internal_cmd(struct ata_queued_cmd *qc) | 941 | static void sata_fsl_post_internal_cmd(struct ata_queued_cmd *qc) |
| 896 | { | 942 | { |
| 897 | if (qc->flags & ATA_QCFLAG_FAILED) | 943 | if (qc->flags & ATA_QCFLAG_FAILED) |
| @@ -905,18 +951,21 @@ static void sata_fsl_post_internal_cmd(struct ata_queued_cmd *qc) | |||
| 905 | 951 | ||
| 906 | static void sata_fsl_error_intr(struct ata_port *ap) | 952 | static void sata_fsl_error_intr(struct ata_port *ap) |
| 907 | { | 953 | { |
| 908 | struct ata_link *link = &ap->link; | ||
| 909 | struct ata_eh_info *ehi = &link->eh_info; | ||
| 910 | struct sata_fsl_host_priv *host_priv = ap->host->private_data; | 954 | struct sata_fsl_host_priv *host_priv = ap->host->private_data; |
| 911 | void __iomem *hcr_base = host_priv->hcr_base; | 955 | void __iomem *hcr_base = host_priv->hcr_base; |
| 912 | u32 hstatus, dereg, cereg = 0, SError = 0; | 956 | u32 hstatus, dereg=0, cereg = 0, SError = 0; |
| 913 | unsigned int err_mask = 0, action = 0; | 957 | unsigned int err_mask = 0, action = 0; |
| 914 | struct ata_queued_cmd *qc; | 958 | int freeze = 0, abort=0; |
| 915 | int freeze = 0; | 959 | struct ata_link *link = NULL; |
| 960 | struct ata_queued_cmd *qc = NULL; | ||
| 961 | struct ata_eh_info *ehi; | ||
| 916 | 962 | ||
| 917 | hstatus = ioread32(hcr_base + HSTATUS); | 963 | hstatus = ioread32(hcr_base + HSTATUS); |
| 918 | cereg = ioread32(hcr_base + CE); | 964 | cereg = ioread32(hcr_base + CE); |
| 919 | 965 | ||
| 966 | /* first, analyze and record host port events */ | ||
| 967 | link = &ap->link; | ||
| 968 | ehi = &link->eh_info; | ||
| 920 | ata_ehi_clear_desc(ehi); | 969 | ata_ehi_clear_desc(ehi); |
| 921 | 970 | ||
| 922 | /* | 971 | /* |
| @@ -926,42 +975,28 @@ static void sata_fsl_error_intr(struct ata_port *ap) | |||
| 926 | sata_fsl_scr_read(ap, SCR_ERROR, &SError); | 975 | sata_fsl_scr_read(ap, SCR_ERROR, &SError); |
| 927 | if (unlikely(SError & 0xFFFF0000)) { | 976 | if (unlikely(SError & 0xFFFF0000)) { |
| 928 | sata_fsl_scr_write(ap, SCR_ERROR, SError); | 977 | sata_fsl_scr_write(ap, SCR_ERROR, SError); |
| 929 | err_mask |= AC_ERR_ATA_BUS; | ||
| 930 | } | 978 | } |
| 931 | 979 | ||
| 932 | DPRINTK("error_intr,hStat=0x%x,CE=0x%x,DE =0x%x,SErr=0x%x\n", | 980 | DPRINTK("error_intr,hStat=0x%x,CE=0x%x,DE =0x%x,SErr=0x%x\n", |
| 933 | hstatus, cereg, ioread32(hcr_base + DE), SError); | 981 | hstatus, cereg, ioread32(hcr_base + DE), SError); |
| 934 | 982 | ||
| 935 | /* handle single device errors */ | 983 | /* handle fatal errors */ |
| 936 | if (cereg) { | 984 | if (hstatus & FATAL_ERROR_DECODE) { |
| 937 | /* | 985 | ehi->err_mask |= AC_ERR_ATA_BUS; |
| 938 | * clear the command error, also clears queue to the device | 986 | ehi->action |= ATA_EH_SOFTRESET; |
| 939 | * in error, and we can (re)issue commands to this device. | ||
| 940 | * When a device is in error all commands queued into the | ||
| 941 | * host controller and at the device are considered aborted | ||
| 942 | * and the queue for that device is stopped. Now, after | ||
| 943 | * clearing the device error, we can issue commands to the | ||
| 944 | * device to interrogate it to find the source of the error. | ||
| 945 | */ | ||
| 946 | dereg = ioread32(hcr_base + DE); | ||
| 947 | iowrite32(dereg, hcr_base + DE); | ||
| 948 | iowrite32(cereg, hcr_base + CE); | ||
| 949 | 987 | ||
| 950 | DPRINTK("single device error, CE=0x%x, DE=0x%x\n", | ||
| 951 | ioread32(hcr_base + CE), ioread32(hcr_base + DE)); | ||
| 952 | /* | 988 | /* |
| 953 | * We should consider this as non fatal error, and TF must | 989 | * Ignore serror in case of fatal errors as we always want |
| 954 | * be updated as done below. | 990 | * to do a soft-reset of the FSL SATA controller. Analyzing |
| 991 | * serror may cause libata to schedule a hard-reset action, | ||
| 992 | * and hard-reset currently does not do controller | ||
| 993 | * offline/online, causing command timeouts and leads to an | ||
| 994 | * un-recoverable state, hence make libATA ignore | ||
| 995 | * autopsy in case of fatal errors. | ||
| 955 | */ | 996 | */ |
| 956 | 997 | ||
| 957 | err_mask |= AC_ERR_DEV; | 998 | ehi->flags |= ATA_EHI_NO_AUTOPSY; |
| 958 | } | ||
| 959 | 999 | ||
| 960 | /* handle fatal errors */ | ||
| 961 | if (hstatus & FATAL_ERROR_DECODE) { | ||
| 962 | err_mask |= AC_ERR_ATA_BUS; | ||
| 963 | action |= ATA_EH_RESET; | ||
| 964 | /* how will fatal error interrupts be completed ?? */ | ||
| 965 | freeze = 1; | 1000 | freeze = 1; |
| 966 | } | 1001 | } |
| 967 | 1002 | ||
| @@ -971,30 +1006,83 @@ static void sata_fsl_error_intr(struct ata_port *ap) | |||
| 971 | 1006 | ||
| 972 | /* Setup a soft-reset EH action */ | 1007 | /* Setup a soft-reset EH action */ |
| 973 | ata_ehi_hotplugged(ehi); | 1008 | ata_ehi_hotplugged(ehi); |
| 1009 | ata_ehi_push_desc(ehi, "%s", "PHY RDY changed"); | ||
| 974 | freeze = 1; | 1010 | freeze = 1; |
| 975 | } | 1011 | } |
| 976 | 1012 | ||
| 977 | /* record error info */ | 1013 | /* handle single device errors */ |
| 978 | qc = ata_qc_from_tag(ap, link->active_tag); | 1014 | if (cereg) { |
| 1015 | /* | ||
| 1016 | * clear the command error, also clears queue to the device | ||
| 1017 | * in error, and we can (re)issue commands to this device. | ||
| 1018 | * When a device is in error all commands queued into the | ||
| 1019 | * host controller and at the device are considered aborted | ||
| 1020 | * and the queue for that device is stopped. Now, after | ||
| 1021 | * clearing the device error, we can issue commands to the | ||
| 1022 | * device to interrogate it to find the source of the error. | ||
| 1023 | */ | ||
| 1024 | abort = 1; | ||
| 1025 | |||
| 1026 | DPRINTK("single device error, CE=0x%x, DE=0x%x\n", | ||
| 1027 | ioread32(hcr_base + CE), ioread32(hcr_base + DE)); | ||
| 979 | 1028 | ||
| 980 | if (qc) | 1029 | /* find out the offending link and qc */ |
| 1030 | if (ap->nr_pmp_links) { | ||
| 1031 | dereg = ioread32(hcr_base + DE); | ||
| 1032 | iowrite32(dereg, hcr_base + DE); | ||
| 1033 | iowrite32(cereg, hcr_base + CE); | ||
| 1034 | |||
| 1035 | if (dereg < ap->nr_pmp_links) { | ||
| 1036 | link = &ap->pmp_link[dereg]; | ||
| 1037 | ehi = &link->eh_info; | ||
| 1038 | qc = ata_qc_from_tag(ap, link->active_tag); | ||
| 1039 | /* | ||
| 1040 | * We should consider this as non fatal error, | ||
| 1041 | * and TF must be updated as done below. | ||
| 1042 | */ | ||
| 1043 | |||
| 1044 | err_mask |= AC_ERR_DEV; | ||
| 1045 | |||
| 1046 | } else { | ||
| 1047 | err_mask |= AC_ERR_HSM; | ||
| 1048 | action |= ATA_EH_HARDRESET; | ||
| 1049 | freeze = 1; | ||
| 1050 | } | ||
| 1051 | } else { | ||
| 1052 | dereg = ioread32(hcr_base + DE); | ||
| 1053 | iowrite32(dereg, hcr_base + DE); | ||
| 1054 | iowrite32(cereg, hcr_base + CE); | ||
| 1055 | |||
| 1056 | qc = ata_qc_from_tag(ap, link->active_tag); | ||
| 1057 | /* | ||
| 1058 | * We should consider this as non fatal error, | ||
| 1059 | * and TF must be updated as done below. | ||
| 1060 | */ | ||
| 1061 | err_mask |= AC_ERR_DEV; | ||
| 1062 | } | ||
| 1063 | } | ||
| 1064 | |||
| 1065 | /* record error info */ | ||
| 1066 | if (qc) { | ||
| 981 | qc->err_mask |= err_mask; | 1067 | qc->err_mask |= err_mask; |
| 982 | else | 1068 | } else |
| 983 | ehi->err_mask |= err_mask; | 1069 | ehi->err_mask |= err_mask; |
| 984 | 1070 | ||
| 985 | ehi->action |= action; | 1071 | ehi->action |= action; |
| 986 | ehi->serror |= SError; | ||
| 987 | 1072 | ||
| 988 | /* freeze or abort */ | 1073 | /* freeze or abort */ |
| 989 | if (freeze) | 1074 | if (freeze) |
| 990 | ata_port_freeze(ap); | 1075 | ata_port_freeze(ap); |
| 991 | else | 1076 | else if (abort) { |
| 992 | ata_port_abort(ap); | 1077 | if (qc) |
| 1078 | ata_link_abort(qc->dev->link); | ||
| 1079 | else | ||
| 1080 | ata_port_abort(ap); | ||
| 1081 | } | ||
| 993 | } | 1082 | } |
| 994 | 1083 | ||
| 995 | static void sata_fsl_host_intr(struct ata_port *ap) | 1084 | static void sata_fsl_host_intr(struct ata_port *ap) |
| 996 | { | 1085 | { |
| 997 | struct ata_link *link = &ap->link; | ||
| 998 | struct sata_fsl_host_priv *host_priv = ap->host->private_data; | 1086 | struct sata_fsl_host_priv *host_priv = ap->host->private_data; |
| 999 | void __iomem *hcr_base = host_priv->hcr_base; | 1087 | void __iomem *hcr_base = host_priv->hcr_base; |
| 1000 | u32 hstatus, qc_active = 0; | 1088 | u32 hstatus, qc_active = 0; |
| @@ -1017,10 +1105,19 @@ static void sata_fsl_host_intr(struct ata_port *ap) | |||
| 1017 | return; | 1105 | return; |
| 1018 | } | 1106 | } |
| 1019 | 1107 | ||
| 1020 | if (link->sactive) { /* only true for NCQ commands */ | 1108 | /* Read command completed register */ |
| 1109 | qc_active = ioread32(hcr_base + CC); | ||
| 1110 | |||
| 1111 | VPRINTK("Status of all queues :\n"); | ||
| 1112 | VPRINTK("qc_active/CC = 0x%x, CA = 0x%x, CE=0x%x,CQ=0x%x,apqa=0x%x\n", | ||
| 1113 | qc_active, | ||
| 1114 | ioread32(hcr_base + CA), | ||
| 1115 | ioread32(hcr_base + CE), | ||
| 1116 | ioread32(hcr_base + CQ), | ||
| 1117 | ap->qc_active); | ||
| 1118 | |||
| 1119 | if (qc_active & ap->qc_active) { | ||
| 1021 | int i; | 1120 | int i; |
| 1022 | /* Read command completed register */ | ||
| 1023 | qc_active = ioread32(hcr_base + CC); | ||
| 1024 | /* clear CC bit, this will also complete the interrupt */ | 1121 | /* clear CC bit, this will also complete the interrupt */ |
| 1025 | iowrite32(qc_active, hcr_base + CC); | 1122 | iowrite32(qc_active, hcr_base + CC); |
| 1026 | 1123 | ||
| @@ -1032,8 +1129,9 @@ static void sata_fsl_host_intr(struct ata_port *ap) | |||
| 1032 | for (i = 0; i < SATA_FSL_QUEUE_DEPTH; i++) { | 1129 | for (i = 0; i < SATA_FSL_QUEUE_DEPTH; i++) { |
| 1033 | if (qc_active & (1 << i)) { | 1130 | if (qc_active & (1 << i)) { |
| 1034 | qc = ata_qc_from_tag(ap, i); | 1131 | qc = ata_qc_from_tag(ap, i); |
| 1035 | if (qc) | 1132 | if (qc) { |
| 1036 | ata_qc_complete(qc); | 1133 | ata_qc_complete(qc); |
| 1134 | } | ||
| 1037 | DPRINTK | 1135 | DPRINTK |
| 1038 | ("completing ncq cmd,tag=%d,CC=0x%x,CA=0x%x\n", | 1136 | ("completing ncq cmd,tag=%d,CC=0x%x,CA=0x%x\n", |
| 1039 | i, ioread32(hcr_base + CC), | 1137 | i, ioread32(hcr_base + CC), |
| @@ -1042,19 +1140,21 @@ static void sata_fsl_host_intr(struct ata_port *ap) | |||
| 1042 | } | 1140 | } |
| 1043 | return; | 1141 | return; |
| 1044 | 1142 | ||
| 1045 | } else if (ap->qc_active) { | 1143 | } else if ((ap->qc_active & (1 << ATA_TAG_INTERNAL))) { |
| 1046 | iowrite32(1, hcr_base + CC); | 1144 | iowrite32(1, hcr_base + CC); |
| 1047 | qc = ata_qc_from_tag(ap, link->active_tag); | 1145 | qc = ata_qc_from_tag(ap, ATA_TAG_INTERNAL); |
| 1048 | 1146 | ||
| 1049 | DPRINTK("completing non-ncq cmd, tag=%d,CC=0x%x\n", | 1147 | DPRINTK("completing non-ncq cmd, CC=0x%x\n", |
| 1050 | link->active_tag, ioread32(hcr_base + CC)); | 1148 | ioread32(hcr_base + CC)); |
| 1051 | 1149 | ||
| 1052 | if (qc) | 1150 | if (qc) { |
| 1053 | ata_qc_complete(qc); | 1151 | ata_qc_complete(qc); |
| 1152 | } | ||
| 1054 | } else { | 1153 | } else { |
| 1055 | /* Spurious Interrupt!! */ | 1154 | /* Spurious Interrupt!! */ |
| 1056 | DPRINTK("spurious interrupt!!, CC = 0x%x\n", | 1155 | DPRINTK("spurious interrupt!!, CC = 0x%x\n", |
| 1057 | ioread32(hcr_base + CC)); | 1156 | ioread32(hcr_base + CC)); |
| 1157 | iowrite32(qc_active, hcr_base + CC); | ||
| 1058 | return; | 1158 | return; |
| 1059 | } | 1159 | } |
| 1060 | } | 1160 | } |
| @@ -1130,9 +1230,6 @@ static int sata_fsl_init_controller(struct ata_host *host) | |||
| 1130 | iowrite32(0x00000FFFF, hcr_base + CE); | 1230 | iowrite32(0x00000FFFF, hcr_base + CE); |
| 1131 | iowrite32(0x00000FFFF, hcr_base + DE); | 1231 | iowrite32(0x00000FFFF, hcr_base + DE); |
| 1132 | 1232 | ||
| 1133 | /* initially assuming no Port multiplier, set CQPMP to 0 */ | ||
| 1134 | iowrite32(0x0, hcr_base + CQPMP); | ||
| 1135 | |||
| 1136 | /* | 1233 | /* |
| 1137 | * host controller will be brought on-line, during xx_port_start() | 1234 | * host controller will be brought on-line, during xx_port_start() |
| 1138 | * callback, that should also initiate the OOB, COMINIT sequence | 1235 | * callback, that should also initiate the OOB, COMINIT sequence |
| @@ -1154,8 +1251,8 @@ static struct scsi_host_template sata_fsl_sht = { | |||
| 1154 | .dma_boundary = ATA_DMA_BOUNDARY, | 1251 | .dma_boundary = ATA_DMA_BOUNDARY, |
| 1155 | }; | 1252 | }; |
| 1156 | 1253 | ||
| 1157 | static const struct ata_port_operations sata_fsl_ops = { | 1254 | static struct ata_port_operations sata_fsl_ops = { |
| 1158 | .inherits = &sata_port_ops, | 1255 | .inherits = &sata_pmp_port_ops, |
| 1159 | 1256 | ||
| 1160 | .qc_prep = sata_fsl_qc_prep, | 1257 | .qc_prep = sata_fsl_qc_prep, |
| 1161 | .qc_issue = sata_fsl_qc_issue, | 1258 | .qc_issue = sata_fsl_qc_issue, |
| @@ -1168,10 +1265,15 @@ static const struct ata_port_operations sata_fsl_ops = { | |||
| 1168 | .thaw = sata_fsl_thaw, | 1265 | .thaw = sata_fsl_thaw, |
| 1169 | .prereset = sata_fsl_prereset, | 1266 | .prereset = sata_fsl_prereset, |
| 1170 | .softreset = sata_fsl_softreset, | 1267 | .softreset = sata_fsl_softreset, |
| 1268 | .pmp_softreset = sata_fsl_softreset, | ||
| 1269 | .error_handler = sata_fsl_error_handler, | ||
| 1171 | .post_internal_cmd = sata_fsl_post_internal_cmd, | 1270 | .post_internal_cmd = sata_fsl_post_internal_cmd, |
| 1172 | 1271 | ||
| 1173 | .port_start = sata_fsl_port_start, | 1272 | .port_start = sata_fsl_port_start, |
| 1174 | .port_stop = sata_fsl_port_stop, | 1273 | .port_stop = sata_fsl_port_stop, |
| 1274 | |||
| 1275 | .pmp_attach = sata_fsl_pmp_attach, | ||
| 1276 | .pmp_detach = sata_fsl_pmp_detach, | ||
| 1175 | }; | 1277 | }; |
| 1176 | 1278 | ||
| 1177 | static const struct ata_port_info sata_fsl_port_info[] = { | 1279 | static const struct ata_port_info sata_fsl_port_info[] = { |
diff --git a/drivers/ata/sata_mv.c b/drivers/ata/sata_mv.c index fb81f0c7a8c2..acf347f71a2f 100644 --- a/drivers/ata/sata_mv.c +++ b/drivers/ata/sata_mv.c | |||
| @@ -72,7 +72,7 @@ | |||
| 72 | #include <linux/libata.h> | 72 | #include <linux/libata.h> |
| 73 | 73 | ||
| 74 | #define DRV_NAME "sata_mv" | 74 | #define DRV_NAME "sata_mv" |
| 75 | #define DRV_VERSION "1.21" | 75 | #define DRV_VERSION "1.24" |
| 76 | 76 | ||
| 77 | enum { | 77 | enum { |
| 78 | /* BAR's are enumerated in terms of pci_resource_start() terms */ | 78 | /* BAR's are enumerated in terms of pci_resource_start() terms */ |
| @@ -122,8 +122,6 @@ enum { | |||
| 122 | /* Host Flags */ | 122 | /* Host Flags */ |
| 123 | MV_FLAG_DUAL_HC = (1 << 30), /* two SATA Host Controllers */ | 123 | MV_FLAG_DUAL_HC = (1 << 30), /* two SATA Host Controllers */ |
| 124 | MV_FLAG_IRQ_COALESCE = (1 << 29), /* IRQ coalescing capability */ | 124 | MV_FLAG_IRQ_COALESCE = (1 << 29), /* IRQ coalescing capability */ |
| 125 | /* SoC integrated controllers, no PCI interface */ | ||
| 126 | MV_FLAG_SOC = (1 << 28), | ||
| 127 | 125 | ||
| 128 | MV_COMMON_FLAGS = ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY | | 126 | MV_COMMON_FLAGS = ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY | |
| 129 | ATA_FLAG_MMIO | ATA_FLAG_NO_ATAPI | | 127 | ATA_FLAG_MMIO | ATA_FLAG_NO_ATAPI | |
| @@ -356,12 +354,12 @@ enum { | |||
| 356 | MV_HP_ERRATA_50XXB2 = (1 << 2), | 354 | MV_HP_ERRATA_50XXB2 = (1 << 2), |
| 357 | MV_HP_ERRATA_60X1B2 = (1 << 3), | 355 | MV_HP_ERRATA_60X1B2 = (1 << 3), |
| 358 | MV_HP_ERRATA_60X1C0 = (1 << 4), | 356 | MV_HP_ERRATA_60X1C0 = (1 << 4), |
| 359 | MV_HP_ERRATA_XX42A0 = (1 << 5), | ||
| 360 | MV_HP_GEN_I = (1 << 6), /* Generation I: 50xx */ | 357 | MV_HP_GEN_I = (1 << 6), /* Generation I: 50xx */ |
| 361 | MV_HP_GEN_II = (1 << 7), /* Generation II: 60xx */ | 358 | MV_HP_GEN_II = (1 << 7), /* Generation II: 60xx */ |
| 362 | MV_HP_GEN_IIE = (1 << 8), /* Generation IIE: 6042/7042 */ | 359 | MV_HP_GEN_IIE = (1 << 8), /* Generation IIE: 6042/7042 */ |
| 363 | MV_HP_PCIE = (1 << 9), /* PCIe bus/regs: 7042 */ | 360 | MV_HP_PCIE = (1 << 9), /* PCIe bus/regs: 7042 */ |
| 364 | MV_HP_CUT_THROUGH = (1 << 10), /* can use EDMA cut-through */ | 361 | MV_HP_CUT_THROUGH = (1 << 10), /* can use EDMA cut-through */ |
| 362 | MV_HP_FLAG_SOC = (1 << 11), /* SystemOnChip, no PCI */ | ||
| 365 | 363 | ||
| 366 | /* Port private flags (pp_flags) */ | 364 | /* Port private flags (pp_flags) */ |
| 367 | MV_PP_FLAG_EDMA_EN = (1 << 0), /* is EDMA engine enabled? */ | 365 | MV_PP_FLAG_EDMA_EN = (1 << 0), /* is EDMA engine enabled? */ |
| @@ -374,7 +372,7 @@ enum { | |||
| 374 | #define IS_GEN_II(hpriv) ((hpriv)->hp_flags & MV_HP_GEN_II) | 372 | #define IS_GEN_II(hpriv) ((hpriv)->hp_flags & MV_HP_GEN_II) |
| 375 | #define IS_GEN_IIE(hpriv) ((hpriv)->hp_flags & MV_HP_GEN_IIE) | 373 | #define IS_GEN_IIE(hpriv) ((hpriv)->hp_flags & MV_HP_GEN_IIE) |
| 376 | #define IS_PCIE(hpriv) ((hpriv)->hp_flags & MV_HP_PCIE) | 374 | #define IS_PCIE(hpriv) ((hpriv)->hp_flags & MV_HP_PCIE) |
| 377 | #define HAS_PCI(host) (!((host)->ports[0]->flags & MV_FLAG_SOC)) | 375 | #define IS_SOC(hpriv) ((hpriv)->hp_flags & MV_HP_FLAG_SOC) |
| 378 | 376 | ||
| 379 | #define WINDOW_CTRL(i) (0x20030 + ((i) << 4)) | 377 | #define WINDOW_CTRL(i) (0x20030 + ((i) << 4)) |
| 380 | #define WINDOW_BASE(i) (0x20034 + ((i) << 4)) | 378 | #define WINDOW_BASE(i) (0x20034 + ((i) << 4)) |
| @@ -652,7 +650,7 @@ static const struct ata_port_info mv_port_info[] = { | |||
| 652 | .port_ops = &mv_iie_ops, | 650 | .port_ops = &mv_iie_ops, |
| 653 | }, | 651 | }, |
| 654 | { /* chip_soc */ | 652 | { /* chip_soc */ |
| 655 | .flags = MV_GENIIE_FLAGS | MV_FLAG_SOC, | 653 | .flags = MV_GENIIE_FLAGS, |
| 656 | .pio_mask = 0x1f, /* pio0-4 */ | 654 | .pio_mask = 0x1f, /* pio0-4 */ |
| 657 | .udma_mask = ATA_UDMA6, | 655 | .udma_mask = ATA_UDMA6, |
| 658 | .port_ops = &mv_iie_ops, | 656 | .port_ops = &mv_iie_ops, |
| @@ -812,12 +810,7 @@ static void mv_set_edma_ptrs(void __iomem *port_mmio, | |||
| 812 | writel((pp->crqb_dma >> 16) >> 16, port_mmio + EDMA_REQ_Q_BASE_HI_OFS); | 810 | writel((pp->crqb_dma >> 16) >> 16, port_mmio + EDMA_REQ_Q_BASE_HI_OFS); |
| 813 | writelfl((pp->crqb_dma & EDMA_REQ_Q_BASE_LO_MASK) | index, | 811 | writelfl((pp->crqb_dma & EDMA_REQ_Q_BASE_LO_MASK) | index, |
| 814 | port_mmio + EDMA_REQ_Q_IN_PTR_OFS); | 812 | port_mmio + EDMA_REQ_Q_IN_PTR_OFS); |
| 815 | 813 | writelfl(index, port_mmio + EDMA_REQ_Q_OUT_PTR_OFS); | |
| 816 | if (hpriv->hp_flags & MV_HP_ERRATA_XX42A0) | ||
| 817 | writelfl((pp->crqb_dma & 0xffffffff) | index, | ||
| 818 | port_mmio + EDMA_REQ_Q_OUT_PTR_OFS); | ||
| 819 | else | ||
| 820 | writelfl(index, port_mmio + EDMA_REQ_Q_OUT_PTR_OFS); | ||
| 821 | 814 | ||
| 822 | /* | 815 | /* |
| 823 | * initialize response queue | 816 | * initialize response queue |
| @@ -827,13 +820,7 @@ static void mv_set_edma_ptrs(void __iomem *port_mmio, | |||
| 827 | 820 | ||
| 828 | WARN_ON(pp->crpb_dma & 0xff); | 821 | WARN_ON(pp->crpb_dma & 0xff); |
| 829 | writel((pp->crpb_dma >> 16) >> 16, port_mmio + EDMA_RSP_Q_BASE_HI_OFS); | 822 | writel((pp->crpb_dma >> 16) >> 16, port_mmio + EDMA_RSP_Q_BASE_HI_OFS); |
| 830 | 823 | writelfl(index, port_mmio + EDMA_RSP_Q_IN_PTR_OFS); | |
| 831 | if (hpriv->hp_flags & MV_HP_ERRATA_XX42A0) | ||
| 832 | writelfl((pp->crpb_dma & 0xffffffff) | index, | ||
| 833 | port_mmio + EDMA_RSP_Q_IN_PTR_OFS); | ||
| 834 | else | ||
| 835 | writelfl(index, port_mmio + EDMA_RSP_Q_IN_PTR_OFS); | ||
| 836 | |||
| 837 | writelfl((pp->crpb_dma & EDMA_RSP_Q_BASE_LO_MASK) | index, | 824 | writelfl((pp->crpb_dma & EDMA_RSP_Q_BASE_LO_MASK) | index, |
| 838 | port_mmio + EDMA_RSP_Q_OUT_PTR_OFS); | 825 | port_mmio + EDMA_RSP_Q_OUT_PTR_OFS); |
| 839 | } | 826 | } |
| @@ -1254,7 +1241,7 @@ static void mv_edma_cfg(struct ata_port *ap, int want_ncq) | |||
| 1254 | 1241 | ||
| 1255 | cfg |= (1 << 23); /* do not mask PM field in rx'd FIS */ | 1242 | cfg |= (1 << 23); /* do not mask PM field in rx'd FIS */ |
| 1256 | cfg |= (1 << 22); /* enab 4-entry host queue cache */ | 1243 | cfg |= (1 << 22); /* enab 4-entry host queue cache */ |
| 1257 | if (HAS_PCI(ap->host)) | 1244 | if (!IS_SOC(hpriv)) |
| 1258 | cfg |= (1 << 18); /* enab early completion */ | 1245 | cfg |= (1 << 18); /* enab early completion */ |
| 1259 | if (hpriv->hp_flags & MV_HP_CUT_THROUGH) | 1246 | if (hpriv->hp_flags & MV_HP_CUT_THROUGH) |
| 1260 | cfg |= (1 << 17); /* enab cut-thru (dis stor&forwrd) */ | 1247 | cfg |= (1 << 17); /* enab cut-thru (dis stor&forwrd) */ |
| @@ -2225,7 +2212,7 @@ static irqreturn_t mv_interrupt(int irq, void *dev_instance) | |||
| 2225 | * a bogus register value which can indicate HW removal or PCI fault. | 2212 | * a bogus register value which can indicate HW removal or PCI fault. |
| 2226 | */ | 2213 | */ |
| 2227 | if (pending_irqs && main_irq_cause != 0xffffffffU) { | 2214 | if (pending_irqs && main_irq_cause != 0xffffffffU) { |
| 2228 | if (unlikely((pending_irqs & PCI_ERR) && HAS_PCI(host))) | 2215 | if (unlikely((pending_irqs & PCI_ERR) && !IS_SOC(hpriv))) |
| 2229 | handled = mv_pci_error(host, hpriv->base); | 2216 | handled = mv_pci_error(host, hpriv->base); |
| 2230 | else | 2217 | else |
| 2231 | handled = mv_host_intr(host, pending_irqs); | 2218 | handled = mv_host_intr(host, pending_irqs); |
| @@ -2547,7 +2534,7 @@ static void mv6_phy_errata(struct mv_host_priv *hpriv, void __iomem *mmio, | |||
| 2547 | hp_flags & (MV_HP_ERRATA_60X1B2 | MV_HP_ERRATA_60X1C0); | 2534 | hp_flags & (MV_HP_ERRATA_60X1B2 | MV_HP_ERRATA_60X1C0); |
| 2548 | int fix_phy_mode4 = | 2535 | int fix_phy_mode4 = |
| 2549 | hp_flags & (MV_HP_ERRATA_60X1B2 | MV_HP_ERRATA_60X1C0); | 2536 | hp_flags & (MV_HP_ERRATA_60X1B2 | MV_HP_ERRATA_60X1C0); |
| 2550 | u32 m2, tmp; | 2537 | u32 m2, m3; |
| 2551 | 2538 | ||
| 2552 | if (fix_phy_mode2) { | 2539 | if (fix_phy_mode2) { |
| 2553 | m2 = readl(port_mmio + PHY_MODE2); | 2540 | m2 = readl(port_mmio + PHY_MODE2); |
| @@ -2564,28 +2551,37 @@ static void mv6_phy_errata(struct mv_host_priv *hpriv, void __iomem *mmio, | |||
| 2564 | udelay(200); | 2551 | udelay(200); |
| 2565 | } | 2552 | } |
| 2566 | 2553 | ||
| 2567 | /* who knows what this magic does */ | 2554 | /* |
| 2568 | tmp = readl(port_mmio + PHY_MODE3); | 2555 | * Gen-II/IIe PHY_MODE3 errata RM#2: |
| 2569 | tmp &= ~0x7F800000; | 2556 | * Achieves better receiver noise performance than the h/w default: |
| 2570 | tmp |= 0x2A800000; | 2557 | */ |
| 2571 | writel(tmp, port_mmio + PHY_MODE3); | 2558 | m3 = readl(port_mmio + PHY_MODE3); |
| 2559 | m3 = (m3 & 0x1f) | (0x5555601 << 5); | ||
| 2560 | |||
| 2561 | /* Guideline 88F5182 (GL# SATA-S11) */ | ||
| 2562 | if (IS_SOC(hpriv)) | ||
| 2563 | m3 &= ~0x1c; | ||
| 2572 | 2564 | ||
| 2573 | if (fix_phy_mode4) { | 2565 | if (fix_phy_mode4) { |
| 2574 | u32 m4; | 2566 | u32 m4; |
| 2575 | 2567 | ||
| 2576 | m4 = readl(port_mmio + PHY_MODE4); | 2568 | m4 = readl(port_mmio + PHY_MODE4); |
| 2577 | 2569 | ||
| 2578 | if (hp_flags & MV_HP_ERRATA_60X1B2) | ||
| 2579 | tmp = readl(port_mmio + PHY_MODE3); | ||
| 2580 | |||
| 2581 | /* workaround for errata FEr SATA#10 (part 1) */ | 2570 | /* workaround for errata FEr SATA#10 (part 1) */ |
| 2582 | m4 = (m4 & ~(1 << 1)) | (1 << 0); | 2571 | m4 = (m4 & ~(1 << 1)) | (1 << 0); |
| 2583 | 2572 | ||
| 2584 | writel(m4, port_mmio + PHY_MODE4); | 2573 | /* enforce bit restrictions on GenIIe devices */ |
| 2574 | if (IS_GEN_IIE(hpriv)) | ||
| 2575 | m4 = (m4 & ~0x5DE3FFFC) | (1 << 2); | ||
| 2585 | 2576 | ||
| 2586 | if (hp_flags & MV_HP_ERRATA_60X1B2) | 2577 | writel(m4, port_mmio + PHY_MODE4); |
| 2587 | writel(tmp, port_mmio + PHY_MODE3); | ||
| 2588 | } | 2578 | } |
| 2579 | /* | ||
| 2580 | * Workaround for 60x1-B2 errata SATA#13: | ||
| 2581 | * Any write to PHY_MODE4 (above) may corrupt PHY_MODE3, | ||
| 2582 | * so we must always rewrite PHY_MODE3 after PHY_MODE4. | ||
| 2583 | */ | ||
| 2584 | writel(m3, port_mmio + PHY_MODE3); | ||
| 2589 | 2585 | ||
| 2590 | /* Revert values of pre-emphasis and signal amps to the saved ones */ | 2586 | /* Revert values of pre-emphasis and signal amps to the saved ones */ |
| 2591 | m2 = readl(port_mmio + PHY_MODE2); | 2587 | m2 = readl(port_mmio + PHY_MODE2); |
| @@ -2876,7 +2872,7 @@ static unsigned int mv_in_pcix_mode(struct ata_host *host) | |||
| 2876 | void __iomem *mmio = hpriv->base; | 2872 | void __iomem *mmio = hpriv->base; |
| 2877 | u32 reg; | 2873 | u32 reg; |
| 2878 | 2874 | ||
| 2879 | if (!HAS_PCI(host) || !IS_PCIE(hpriv)) | 2875 | if (IS_SOC(hpriv) || !IS_PCIE(hpriv)) |
| 2880 | return 0; /* not PCI-X capable */ | 2876 | return 0; /* not PCI-X capable */ |
| 2881 | reg = readl(mmio + MV_PCI_MODE_OFS); | 2877 | reg = readl(mmio + MV_PCI_MODE_OFS); |
| 2882 | if ((reg & MV_PCI_MODE_MASK) == 0) | 2878 | if ((reg & MV_PCI_MODE_MASK) == 0) |
| @@ -3003,10 +2999,7 @@ static int mv_chip_id(struct ata_host *host, unsigned int board_idx) | |||
| 3003 | hp_flags |= MV_HP_CUT_THROUGH; | 2999 | hp_flags |= MV_HP_CUT_THROUGH; |
| 3004 | 3000 | ||
| 3005 | switch (pdev->revision) { | 3001 | switch (pdev->revision) { |
| 3006 | case 0x0: | 3002 | case 0x2: /* Rev.B0: the first/only public release */ |
| 3007 | hp_flags |= MV_HP_ERRATA_XX42A0; | ||
| 3008 | break; | ||
| 3009 | case 0x1: | ||
| 3010 | hp_flags |= MV_HP_ERRATA_60X1C0; | 3003 | hp_flags |= MV_HP_ERRATA_60X1C0; |
| 3011 | break; | 3004 | break; |
| 3012 | default: | 3005 | default: |
| @@ -3018,7 +3011,7 @@ static int mv_chip_id(struct ata_host *host, unsigned int board_idx) | |||
| 3018 | break; | 3011 | break; |
| 3019 | case chip_soc: | 3012 | case chip_soc: |
| 3020 | hpriv->ops = &mv_soc_ops; | 3013 | hpriv->ops = &mv_soc_ops; |
| 3021 | hp_flags |= MV_HP_ERRATA_60X1C0; | 3014 | hp_flags |= MV_HP_FLAG_SOC | MV_HP_ERRATA_60X1C0; |
| 3022 | break; | 3015 | break; |
| 3023 | 3016 | ||
| 3024 | default: | 3017 | default: |
| @@ -3062,12 +3055,12 @@ static int mv_init_host(struct ata_host *host, unsigned int board_idx) | |||
| 3062 | if (rc) | 3055 | if (rc) |
| 3063 | goto done; | 3056 | goto done; |
| 3064 | 3057 | ||
| 3065 | if (HAS_PCI(host)) { | 3058 | if (IS_SOC(hpriv)) { |
| 3066 | hpriv->main_irq_cause_addr = mmio + PCI_HC_MAIN_IRQ_CAUSE_OFS; | ||
| 3067 | hpriv->main_irq_mask_addr = mmio + PCI_HC_MAIN_IRQ_MASK_OFS; | ||
| 3068 | } else { | ||
| 3069 | hpriv->main_irq_cause_addr = mmio + SOC_HC_MAIN_IRQ_CAUSE_OFS; | 3059 | hpriv->main_irq_cause_addr = mmio + SOC_HC_MAIN_IRQ_CAUSE_OFS; |
| 3070 | hpriv->main_irq_mask_addr = mmio + SOC_HC_MAIN_IRQ_MASK_OFS; | 3060 | hpriv->main_irq_mask_addr = mmio + SOC_HC_MAIN_IRQ_MASK_OFS; |
| 3061 | } else { | ||
| 3062 | hpriv->main_irq_cause_addr = mmio + PCI_HC_MAIN_IRQ_CAUSE_OFS; | ||
| 3063 | hpriv->main_irq_mask_addr = mmio + PCI_HC_MAIN_IRQ_MASK_OFS; | ||
| 3071 | } | 3064 | } |
| 3072 | 3065 | ||
| 3073 | /* global interrupt mask: 0 == mask everything */ | 3066 | /* global interrupt mask: 0 == mask everything */ |
| @@ -3093,7 +3086,7 @@ static int mv_init_host(struct ata_host *host, unsigned int board_idx) | |||
| 3093 | mv_port_init(&ap->ioaddr, port_mmio); | 3086 | mv_port_init(&ap->ioaddr, port_mmio); |
| 3094 | 3087 | ||
| 3095 | #ifdef CONFIG_PCI | 3088 | #ifdef CONFIG_PCI |
| 3096 | if (HAS_PCI(host)) { | 3089 | if (!IS_SOC(hpriv)) { |
| 3097 | unsigned int offset = port_mmio - mmio; | 3090 | unsigned int offset = port_mmio - mmio; |
| 3098 | ata_port_pbar_desc(ap, MV_PRIMARY_BAR, -1, "mmio"); | 3091 | ata_port_pbar_desc(ap, MV_PRIMARY_BAR, -1, "mmio"); |
| 3099 | ata_port_pbar_desc(ap, MV_PRIMARY_BAR, offset, "port"); | 3092 | ata_port_pbar_desc(ap, MV_PRIMARY_BAR, offset, "port"); |
| @@ -3113,7 +3106,7 @@ static int mv_init_host(struct ata_host *host, unsigned int board_idx) | |||
| 3113 | writelfl(0, hc_mmio + HC_IRQ_CAUSE_OFS); | 3106 | writelfl(0, hc_mmio + HC_IRQ_CAUSE_OFS); |
| 3114 | } | 3107 | } |
| 3115 | 3108 | ||
| 3116 | if (HAS_PCI(host)) { | 3109 | if (!IS_SOC(hpriv)) { |
| 3117 | /* Clear any currently outstanding host interrupt conditions */ | 3110 | /* Clear any currently outstanding host interrupt conditions */ |
| 3118 | writelfl(0, mmio + hpriv->irq_cause_ofs); | 3111 | writelfl(0, mmio + hpriv->irq_cause_ofs); |
| 3119 | 3112 | ||
