[v5,3/3] ahci_platforms: add support for CNS3xxx SoC devices

Message ID AANLkTikrFpD+MDqyjS3CMGceMHXWhELPGNv1FaqEqP0s@mail.gmail.com
State Not Applicable
Delegated to: David Miller
Headers show

Commit Message

Lin Mac Jan. 10, 2011, 3:47 p.m.
2011/1/10 Basheer, Mansoor Ahamed <mansoor.ahamed@ti.com>:
>> From: Mac Lin <mkl0301@gmail.com>
>> CNS3xxx override the softreset function of ahci_platform
>> ahci_softreset by cns3xxx_ahci_softreset, which would retry
>> ahci_do_softreset again with pmp=0 if
>> pmp=15 failed, for the controller has problem receiving D2H
>> Reg FIS of the different PMP setting of the previous sent H2D Reg FIS.
> Is this issue only with your ahci platform controller? I came across another
> thread here,
> http://www.spinics.net/lists/linux-ide/msg39865.html
Thanks for mentioning this.
They do look alike. I'll confirm with them.

> Also, the ahci platform controller on Texas Instruments OMAP L138 platform
> behaves in a similar fashion.
> Currently I see only Cavium Networks, Faraday and TI using ahci platform
> controller and all 3 facing same issue.
> Hence, should we fix this in ahci_platform.c conditionally using platform data,
> otherwise we will end-up adding file for every platform (just for one
> function).
We can add quirk in ahci platform data, just like sdhci_pltfm.c and
Thus, in cns3xxx's case, all we need is to include
<linux/ahci_platform.h>, and all the SoC specific code could exist in
arch folder, similar to my v1 patchset.

Best Regards,
Mac Lin


From 030eefbcba9499b2aa24171895881afe6c385fd9 Mon Sep 17 00:00:00 2001
From: Mac Lin <mkl0301@gmail.com>
Date: Mon, 10 Jan 2011 22:37:57 +0800
Subject: [PATCH] libahci: Fixup for softwreset failures with direct connected disks with CONFIG_SATA_PMP enabled

 drivers/ata/libahci.c |    7 ++++++-
 1 files changed, 6 insertions(+), 1 deletions(-)

diff --git a/drivers/ata/libahci.c b/drivers/ata/libahci.c
index ebc08d6..081548f 100644
--- a/drivers/ata/libahci.c
+++ b/drivers/ata/libahci.c
@@ -1302,10 +1302,15 @@  static int ahci_softreset(struct ata_link *link, unsigned int *class,
 			  unsigned long deadline)
 	int pmp = sata_srst_pmp(link);
+	int ret;
-	return ahci_do_softreset(link, class, pmp, deadline, ahci_check_ready);
+	ret = ahci_do_softreset(link, class, pmp, deadline, ahci_check_ready);
+	if (ret && pmp)
+		return ahci_do_softreset(link, class, 0, deadline,
+			ahci_check_ready);
+	return ret;