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

mail settings
Submitter Lin Mac
Date Jan. 10, 2011, 3:47 p.m.
Message ID <>
Download mbox | patch
Permalink /patch/78163/
State Not Applicable
Delegated to: David Miller
Headers show


Lin Mac - Jan. 10, 2011, 3:47 p.m.
2011/1/10 Basheer, Mansoor Ahamed <>:
>> From: Mac Lin <>
>> 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,
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 <>
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;