diff options
Diffstat (limited to 'drivers/ata')
-rw-r--r-- | drivers/ata/sata_fsl.c | 25 |
1 files changed, 18 insertions, 7 deletions
diff --git a/drivers/ata/sata_fsl.c b/drivers/ata/sata_fsl.c index b0214d00d50b..01a5400bd7c5 100644 --- a/drivers/ata/sata_fsl.c +++ b/drivers/ata/sata_fsl.c | |||
@@ -6,7 +6,7 @@ | |||
6 | * Author: Ashish Kalra <ashish.kalra@freescale.com> | 6 | * Author: Ashish Kalra <ashish.kalra@freescale.com> |
7 | * Li Yang <leoli@freescale.com> | 7 | * Li Yang <leoli@freescale.com> |
8 | * | 8 | * |
9 | * Copyright (c) 2006-2007 Freescale Semiconductor, Inc. | 9 | * Copyright (c) 2006-2007, 2011 Freescale Semiconductor, Inc. |
10 | * | 10 | * |
11 | * This program is free software; you can redistribute it and/or modify it | 11 | * This program is free software; you can redistribute it and/or modify it |
12 | * under the terms of the GNU General Public License as published by the | 12 | * under the terms of the GNU General Public License as published by the |
@@ -158,7 +158,8 @@ enum { | |||
158 | IE_ON_SINGL_DEVICE_ERR | IE_ON_CMD_COMPLETE, | 158 | IE_ON_SINGL_DEVICE_ERR | IE_ON_CMD_COMPLETE, |
159 | 159 | ||
160 | EXT_INDIRECT_SEG_PRD_FLAG = (1 << 31), | 160 | EXT_INDIRECT_SEG_PRD_FLAG = (1 << 31), |
161 | DATA_SNOOP_ENABLE = (1 << 22), | 161 | DATA_SNOOP_ENABLE_V1 = (1 << 22), |
162 | DATA_SNOOP_ENABLE_V2 = (1 << 28), | ||
162 | }; | 163 | }; |
163 | 164 | ||
164 | /* | 165 | /* |
@@ -256,6 +257,7 @@ struct sata_fsl_host_priv { | |||
256 | void __iomem *ssr_base; | 257 | void __iomem *ssr_base; |
257 | void __iomem *csr_base; | 258 | void __iomem *csr_base; |
258 | int irq; | 259 | int irq; |
260 | int data_snoop; | ||
259 | }; | 261 | }; |
260 | 262 | ||
261 | static inline unsigned int sata_fsl_tag(unsigned int tag, | 263 | static inline unsigned int sata_fsl_tag(unsigned int tag, |
@@ -308,7 +310,8 @@ static void sata_fsl_setup_cmd_hdr_entry(struct sata_fsl_port_priv *pp, | |||
308 | } | 310 | } |
309 | 311 | ||
310 | static unsigned int sata_fsl_fill_sg(struct ata_queued_cmd *qc, void *cmd_desc, | 312 | static unsigned int sata_fsl_fill_sg(struct ata_queued_cmd *qc, void *cmd_desc, |
311 | u32 *ttl, dma_addr_t cmd_desc_paddr) | 313 | u32 *ttl, dma_addr_t cmd_desc_paddr, |
314 | int data_snoop) | ||
312 | { | 315 | { |
313 | struct scatterlist *sg; | 316 | struct scatterlist *sg; |
314 | unsigned int num_prde = 0; | 317 | unsigned int num_prde = 0; |
@@ -358,8 +361,7 @@ static unsigned int sata_fsl_fill_sg(struct ata_queued_cmd *qc, void *cmd_desc, | |||
358 | 361 | ||
359 | ttl_dwords += sg_len; | 362 | ttl_dwords += sg_len; |
360 | prd->dba = cpu_to_le32(sg_addr); | 363 | prd->dba = cpu_to_le32(sg_addr); |
361 | prd->ddc_and_ext = | 364 | prd->ddc_and_ext = cpu_to_le32(data_snoop | (sg_len & ~0x03)); |
362 | cpu_to_le32(DATA_SNOOP_ENABLE | (sg_len & ~0x03)); | ||
363 | 365 | ||
364 | VPRINTK("sg_fill, ttl=%d, dba=0x%x, ddc=0x%x\n", | 366 | VPRINTK("sg_fill, ttl=%d, dba=0x%x, ddc=0x%x\n", |
365 | ttl_dwords, prd->dba, prd->ddc_and_ext); | 367 | ttl_dwords, prd->dba, prd->ddc_and_ext); |
@@ -374,7 +376,7 @@ static unsigned int sata_fsl_fill_sg(struct ata_queued_cmd *qc, void *cmd_desc, | |||
374 | /* set indirect extension flag along with indirect ext. size */ | 376 | /* set indirect extension flag along with indirect ext. size */ |
375 | prd_ptr_to_indirect_ext->ddc_and_ext = | 377 | prd_ptr_to_indirect_ext->ddc_and_ext = |
376 | cpu_to_le32((EXT_INDIRECT_SEG_PRD_FLAG | | 378 | cpu_to_le32((EXT_INDIRECT_SEG_PRD_FLAG | |
377 | DATA_SNOOP_ENABLE | | 379 | data_snoop | |
378 | (indirect_ext_segment_sz & ~0x03))); | 380 | (indirect_ext_segment_sz & ~0x03))); |
379 | } | 381 | } |
380 | 382 | ||
@@ -417,7 +419,8 @@ static void sata_fsl_qc_prep(struct ata_queued_cmd *qc) | |||
417 | 419 | ||
418 | if (qc->flags & ATA_QCFLAG_DMAMAP) | 420 | if (qc->flags & ATA_QCFLAG_DMAMAP) |
419 | num_prde = sata_fsl_fill_sg(qc, (void *)cd, | 421 | num_prde = sata_fsl_fill_sg(qc, (void *)cd, |
420 | &ttl_dwords, cd_paddr); | 422 | &ttl_dwords, cd_paddr, |
423 | host_priv->data_snoop); | ||
421 | 424 | ||
422 | if (qc->tf.protocol == ATA_PROT_NCQ) | 425 | if (qc->tf.protocol == ATA_PROT_NCQ) |
423 | desc_info |= FPDMA_QUEUED_CMD; | 426 | desc_info |= FPDMA_QUEUED_CMD; |
@@ -1336,6 +1339,11 @@ static int sata_fsl_probe(struct platform_device *ofdev, | |||
1336 | } | 1339 | } |
1337 | host_priv->irq = irq; | 1340 | host_priv->irq = irq; |
1338 | 1341 | ||
1342 | if (of_device_is_compatible(ofdev->dev.of_node, "fsl,pq-sata-v2")) | ||
1343 | host_priv->data_snoop = DATA_SNOOP_ENABLE_V2; | ||
1344 | else | ||
1345 | host_priv->data_snoop = DATA_SNOOP_ENABLE_V1; | ||
1346 | |||
1339 | /* allocate host structure */ | 1347 | /* allocate host structure */ |
1340 | host = ata_host_alloc_pinfo(&ofdev->dev, ppi, SATA_FSL_MAX_PORTS); | 1348 | host = ata_host_alloc_pinfo(&ofdev->dev, ppi, SATA_FSL_MAX_PORTS); |
1341 | 1349 | ||
@@ -1418,6 +1426,9 @@ static struct of_device_id fsl_sata_match[] = { | |||
1418 | { | 1426 | { |
1419 | .compatible = "fsl,pq-sata", | 1427 | .compatible = "fsl,pq-sata", |
1420 | }, | 1428 | }, |
1429 | { | ||
1430 | .compatible = "fsl,pq-sata-v2", | ||
1431 | }, | ||
1421 | {}, | 1432 | {}, |
1422 | }; | 1433 | }; |
1423 | 1434 | ||