2011/1/10 Basheer, Mansoor Ahamed <mansoor.ahamed@xxxxxx>: >> From: Mac Lin <mkl0301@xxxxxxxxx> >> >> 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 sdhci_cns3xxx.c. 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@xxxxxxxxx> 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; DPRINTK("ENTER\n"); - 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; } EXPORT_SYMBOL_GPL(ahci_do_softreset); -- 1.7.3