summaryrefslogtreecommitdiff
path: root/drivers/ata
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/ata')
-rw-r--r--drivers/ata/libata-core.c15
-rw-r--r--drivers/ata/libata-pmp.c12
-rw-r--r--drivers/ata/sata_fsl.c8
3 files changed, 35 insertions, 0 deletions
diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c
index 83b1a9f..c6975d0 100644
--- a/drivers/ata/libata-core.c
+++ b/drivers/ata/libata-core.c
@@ -2117,6 +2117,21 @@ static int ata_dev_config_ncq(struct ata_device *dev,
dev->flags |= ATA_DFLAG_NCQ;
}
+ if ((ap->flags & ATA_FLAG_BROKENAA) &&
+ (ata_id_has_fpdma_aa(dev->id)) &&
+ (ata_id_enabled_fpdma_aa(dev->id))) {
+ err_mask = ata_dev_set_feature(dev, SETFEATURES_SATA_DISABLE,
+ SATA_FPDMA_AA);
+ if (err_mask) {
+ ata_dev_printk(dev, KERN_ERR, "failed to disable AA"
+ "(error_mask=0x%x)\n", err_mask);
+ /* turn off NCQ if failed disable SATA_FPDMA_AA */
+ hdepth = 1;
+ dev->flags &= ~ATA_DFLAG_NCQ;
+ dev->flags |= ATA_DFLAG_NCQ_OFF;
+ }
+ }
+
if (!(dev->horkage & ATA_HORKAGE_BROKEN_FPDMA_AA) &&
(ap->flags & ATA_FLAG_FPDMA_AA) &&
ata_id_has_fpdma_aa(dev->id)) {
diff --git a/drivers/ata/libata-pmp.c b/drivers/ata/libata-pmp.c
index 20fd337..b3b8ff2 100644
--- a/drivers/ata/libata-pmp.c
+++ b/drivers/ata/libata-pmp.c
@@ -146,6 +146,13 @@ int sata_pmp_scr_read(struct ata_link *link, int reg, u32 *r_val)
if (reg > SATA_PMP_PSCR_CONTROL)
return -EINVAL;
+ /* For some PMP card, we need delay some time */
+ if (link->flags & ATA_LFLAG_DELAY) {
+ set_current_state(TASK_INTERRUPTIBLE);
+ /* sleep 50 msecond */
+ schedule_timeout(msecs_to_jiffies(50));
+ }
+
err_mask = sata_pmp_read(link, reg, r_val);
if (err_mask) {
ata_link_warn(link, "failed to read SCR %d (Emask=0x%x)\n",
@@ -457,6 +464,11 @@ static void sata_pmp_quirks(struct ata_port *ap)
ATA_LFLAG_NO_SRST |
ATA_LFLAG_ASSUME_ATA;
}
+ } else if (vendor == 0x197b && devid == 0x0325) {
+ /* For jmicron JMB393 card, need some time to ready the PMP */
+ ata_for_each_link(link, ap, EDGE) {
+ link->flags |= ATA_LFLAG_DELAY;
+ }
}
}
diff --git a/drivers/ata/sata_fsl.c b/drivers/ata/sata_fsl.c
index 851bd3f..1d6d690 100644
--- a/drivers/ata/sata_fsl.c
+++ b/drivers/ata/sata_fsl.c
@@ -1512,6 +1512,14 @@ static int sata_fsl_probe(struct platform_device *ofdev)
else
host_priv->data_snoop = DATA_SNOOP_ENABLE_V1;
+ /*
+ * Since erratum A-005636 applies to all platforms, it only be fixed
+ * on T4 rev2.0, we add a flag to identify the erratum in main path.
+ * XXX: for T4 rev2.0 and other new SoCs use same controller as
+ * T4 Rev2.0. this flag should be removed.
+ */
+ pi.flags |= ATA_FLAG_BROKENAA;
+
/* allocate host structure */
host = ata_host_alloc_pinfo(&ofdev->dev, ppi, SATA_FSL_MAX_PORTS);
if (!host) {