diff options
Diffstat (limited to 'drivers/ata/sata_fsl.c')
-rw-r--r-- | drivers/ata/sata_fsl.c | 31 |
1 files changed, 18 insertions, 13 deletions
diff --git a/drivers/ata/sata_fsl.c b/drivers/ata/sata_fsl.c index b4c37b9e413c..8a8ce9dbe034 100644 --- a/drivers/ata/sata_fsl.c +++ b/drivers/ata/sata_fsl.c | |||
@@ -34,7 +34,8 @@ 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 | ATA_FLAG_SKIP_D2H_BSY), | 37 | ATA_FLAG_NCQ), |
38 | SATA_FSL_HOST_LFLAGS = ATA_LFLAG_SKIP_D2H_BSY, | ||
38 | 39 | ||
39 | SATA_FSL_MAX_CMDS = SATA_FSL_QUEUE_DEPTH, | 40 | SATA_FSL_MAX_CMDS = SATA_FSL_QUEUE_DEPTH, |
40 | SATA_FSL_CMD_HDR_SIZE = 16, /* 4 DWORDS */ | 41 | SATA_FSL_CMD_HDR_SIZE = 16, /* 4 DWORDS */ |
@@ -728,9 +729,10 @@ static unsigned int sata_fsl_dev_classify(struct ata_port *ap) | |||
728 | return ata_dev_classify(&tf); | 729 | return ata_dev_classify(&tf); |
729 | } | 730 | } |
730 | 731 | ||
731 | static int sata_fsl_softreset(struct ata_port *ap, unsigned int *class, | 732 | static int sata_fsl_softreset(struct ata_link *link, unsigned int *class, |
732 | unsigned long deadline) | 733 | unsigned long deadline) |
733 | { | 734 | { |
735 | struct ata_port *ap = link->ap; | ||
734 | struct sata_fsl_port_priv *pp = ap->private_data; | 736 | struct sata_fsl_port_priv *pp = ap->private_data; |
735 | struct sata_fsl_host_priv *host_priv = ap->host->private_data; | 737 | struct sata_fsl_host_priv *host_priv = ap->host->private_data; |
736 | void __iomem *hcr_base = host_priv->hcr_base; | 738 | void __iomem *hcr_base = host_priv->hcr_base; |
@@ -811,7 +813,7 @@ try_offline_again: | |||
811 | */ | 813 | */ |
812 | 814 | ||
813 | temp = ata_wait_register(hcr_base + HSTATUS, 0xFF, 0, 1, 500); | 815 | temp = ata_wait_register(hcr_base + HSTATUS, 0xFF, 0, 1, 500); |
814 | if ((!(temp & 0x10)) || ata_port_offline(ap)) { | 816 | if ((!(temp & 0x10)) || ata_link_offline(link)) { |
815 | ata_port_printk(ap, KERN_WARNING, | 817 | ata_port_printk(ap, KERN_WARNING, |
816 | "No Device OR PHYRDY change,Hstatus = 0x%x\n", | 818 | "No Device OR PHYRDY change,Hstatus = 0x%x\n", |
817 | ioread32(hcr_base + HSTATUS)); | 819 | ioread32(hcr_base + HSTATUS)); |
@@ -842,12 +844,12 @@ try_offline_again: | |||
842 | * reached here, we can send a command to the target device | 844 | * reached here, we can send a command to the target device |
843 | */ | 845 | */ |
844 | 846 | ||
845 | if (ap->sactive) | 847 | if (link->sactive) |
846 | goto skip_srst_do_ncq_error_handling; | 848 | goto skip_srst_do_ncq_error_handling; |
847 | 849 | ||
848 | DPRINTK("Sending SRST/device reset\n"); | 850 | DPRINTK("Sending SRST/device reset\n"); |
849 | 851 | ||
850 | ata_tf_init(ap->device, &tf); | 852 | ata_tf_init(link->device, &tf); |
851 | cfis = (u8 *) & pp->cmdentry->cfis; | 853 | cfis = (u8 *) & pp->cmdentry->cfis; |
852 | 854 | ||
853 | /* device reset/SRST is a control register update FIS, uses tag0 */ | 855 | /* device reset/SRST is a control register update FIS, uses tag0 */ |
@@ -919,7 +921,7 @@ skip_srst_do_ncq_error_handling: | |||
919 | VPRINTK("Sending read log ext(10h) command\n"); | 921 | VPRINTK("Sending read log ext(10h) command\n"); |
920 | 922 | ||
921 | memset(&qc, 0, sizeof(struct ata_queued_cmd)); | 923 | memset(&qc, 0, sizeof(struct ata_queued_cmd)); |
922 | ata_tf_init(ap->device, &tf); | 924 | ata_tf_init(link->device, &tf); |
923 | 925 | ||
924 | tf.command = ATA_CMD_READ_LOG_EXT; | 926 | tf.command = ATA_CMD_READ_LOG_EXT; |
925 | tf.lbal = ATA_LOG_SATA_NCQ; | 927 | tf.lbal = ATA_LOG_SATA_NCQ; |
@@ -931,7 +933,7 @@ skip_srst_do_ncq_error_handling: | |||
931 | qc.tag = ATA_TAG_INTERNAL; | 933 | qc.tag = ATA_TAG_INTERNAL; |
932 | qc.scsicmd = NULL; | 934 | qc.scsicmd = NULL; |
933 | qc.ap = ap; | 935 | qc.ap = ap; |
934 | qc.dev = ap->device; | 936 | qc.dev = link->device; |
935 | 937 | ||
936 | qc.tf = tf; | 938 | qc.tf = tf; |
937 | qc.flags |= ATA_QCFLAG_RESULT_TF; | 939 | qc.flags |= ATA_QCFLAG_RESULT_TF; |
@@ -981,7 +983,7 @@ skip_srst_do_ncq_error_handling: | |||
981 | *class = ATA_DEV_NONE; | 983 | *class = ATA_DEV_NONE; |
982 | 984 | ||
983 | /* Verify if SStatus indicates device presence */ | 985 | /* Verify if SStatus indicates device presence */ |
984 | if (ata_port_online(ap)) { | 986 | if (ata_link_online(link)) { |
985 | /* | 987 | /* |
986 | * if we are here, device presence has been detected, | 988 | * if we are here, device presence has been detected, |
987 | * 1st D2H FIS would have been received, but sfis in | 989 | * 1st D2H FIS would have been received, but sfis in |
@@ -1042,7 +1044,8 @@ static void sata_fsl_irq_clear(struct ata_port *ap) | |||
1042 | 1044 | ||
1043 | static void sata_fsl_error_intr(struct ata_port *ap) | 1045 | static void sata_fsl_error_intr(struct ata_port *ap) |
1044 | { | 1046 | { |
1045 | struct ata_eh_info *ehi = &ap->eh_info; | 1047 | struct ata_link *link = &ap->link; |
1048 | struct ata_eh_info *ehi = &link->eh_info; | ||
1046 | struct sata_fsl_host_priv *host_priv = ap->host->private_data; | 1049 | struct sata_fsl_host_priv *host_priv = ap->host->private_data; |
1047 | void __iomem *hcr_base = host_priv->hcr_base; | 1050 | void __iomem *hcr_base = host_priv->hcr_base; |
1048 | u32 hstatus, dereg, cereg = 0, SError = 0; | 1051 | u32 hstatus, dereg, cereg = 0, SError = 0; |
@@ -1111,7 +1114,7 @@ static void sata_fsl_error_intr(struct ata_port *ap) | |||
1111 | } | 1114 | } |
1112 | 1115 | ||
1113 | /* record error info */ | 1116 | /* record error info */ |
1114 | qc = ata_qc_from_tag(ap, ap->active_tag); | 1117 | qc = ata_qc_from_tag(ap, link->active_tag); |
1115 | 1118 | ||
1116 | if (qc) { | 1119 | if (qc) { |
1117 | sata_fsl_cache_taskfile_from_d2h_fis(qc, qc->ap); | 1120 | sata_fsl_cache_taskfile_from_d2h_fis(qc, qc->ap); |
@@ -1139,6 +1142,7 @@ static void sata_fsl_qc_complete(struct ata_queued_cmd *qc) | |||
1139 | 1142 | ||
1140 | static void sata_fsl_host_intr(struct ata_port *ap) | 1143 | static void sata_fsl_host_intr(struct ata_port *ap) |
1141 | { | 1144 | { |
1145 | struct ata_link *link = &ap->link; | ||
1142 | struct sata_fsl_host_priv *host_priv = ap->host->private_data; | 1146 | struct sata_fsl_host_priv *host_priv = ap->host->private_data; |
1143 | void __iomem *hcr_base = host_priv->hcr_base; | 1147 | void __iomem *hcr_base = host_priv->hcr_base; |
1144 | u32 hstatus, qc_active = 0; | 1148 | u32 hstatus, qc_active = 0; |
@@ -1161,7 +1165,7 @@ static void sata_fsl_host_intr(struct ata_port *ap) | |||
1161 | return; | 1165 | return; |
1162 | } | 1166 | } |
1163 | 1167 | ||
1164 | if (ap->sactive) { /* only true for NCQ commands */ | 1168 | if (link->sactive) { /* only true for NCQ commands */ |
1165 | int i; | 1169 | int i; |
1166 | /* Read command completed register */ | 1170 | /* Read command completed register */ |
1167 | qc_active = ioread32(hcr_base + CC); | 1171 | qc_active = ioread32(hcr_base + CC); |
@@ -1190,10 +1194,10 @@ static void sata_fsl_host_intr(struct ata_port *ap) | |||
1190 | 1194 | ||
1191 | } else if (ap->qc_active) { | 1195 | } else if (ap->qc_active) { |
1192 | iowrite32(1, hcr_base + CC); | 1196 | iowrite32(1, hcr_base + CC); |
1193 | qc = ata_qc_from_tag(ap, ap->active_tag); | 1197 | qc = ata_qc_from_tag(ap, link->active_tag); |
1194 | 1198 | ||
1195 | DPRINTK("completing non-ncq cmd, tag=%d,CC=0x%x\n", | 1199 | DPRINTK("completing non-ncq cmd, tag=%d,CC=0x%x\n", |
1196 | ap->active_tag, ioread32(hcr_base + CC)); | 1200 | link->active_tag, ioread32(hcr_base + CC)); |
1197 | 1201 | ||
1198 | if (qc) { | 1202 | if (qc) { |
1199 | sata_fsl_qc_complete(qc); | 1203 | sata_fsl_qc_complete(qc); |
@@ -1348,6 +1352,7 @@ static const struct ata_port_operations sata_fsl_ops = { | |||
1348 | static const struct ata_port_info sata_fsl_port_info[] = { | 1352 | static const struct ata_port_info sata_fsl_port_info[] = { |
1349 | { | 1353 | { |
1350 | .flags = SATA_FSL_HOST_FLAGS, | 1354 | .flags = SATA_FSL_HOST_FLAGS, |
1355 | .link_flags = SATA_FSL_HOST_LFLAGS, | ||
1351 | .pio_mask = 0x1f, /* pio 0-4 */ | 1356 | .pio_mask = 0x1f, /* pio 0-4 */ |
1352 | .udma_mask = 0x7f, /* udma 0-6 */ | 1357 | .udma_mask = 0x7f, /* udma 0-6 */ |
1353 | .port_ops = &sata_fsl_ops, | 1358 | .port_ops = &sata_fsl_ops, |