diff options
Diffstat (limited to 'drivers/ata')
-rw-r--r-- | drivers/ata/libata-core.c | 15 | ||||
-rw-r--r-- | drivers/ata/libata-pmp.c | 12 | ||||
-rw-r--r-- | drivers/ata/sata_fsl.c | 8 |
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) { |