summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorXiangliang Yu <Xiangliang.Yu@amd.com>2015-11-26 20:27:02 +0800
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2016-02-17 12:34:39 -0800
commit3516033e25dbef38453b6474f1d9624dade280a1 (patch)
treea8f7ae7b3d829bcbcca6079f069fc4bc8038c24f
parentd927a13739dd38be73d768eba9593e0b81082a00 (diff)
downloadlwn-3516033e25dbef38453b6474f1d9624dade280a1.tar.gz
lwn-3516033e25dbef38453b6474f1d9624dade280a1.zip
AHCI: Fix softreset failed issue of Port Multiplier
commit 023113d24ef9e1d2b44cb2446872b17e2b01d8b1 upstream. Current code doesn't update port value of Port Multiplier(PM) when sending FIS of softreset to device, command will fail if FBS is enabled. There are two ways to fix the issue: the first is to disable FBS before sending softreset command to PM device and the second is to update port value of PM when sending command. For the first way, i can't find any related rule in AHCI Spec. The second way can avoid disabling FBS and has better performance. Signed-off-by: Xiangliang Yu <Xiangliang.Yu@amd.com> Signed-off-by: Tejun Heo <tj@kernel.org> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-rw-r--r--drivers/ata/libahci.c9
1 files changed, 9 insertions, 0 deletions
diff --git a/drivers/ata/libahci.c b/drivers/ata/libahci.c
index b65d79cd43d5..c91e5f76aebe 100644
--- a/drivers/ata/libahci.c
+++ b/drivers/ata/libahci.c
@@ -1253,6 +1253,15 @@ static int ahci_exec_polled_cmd(struct ata_port *ap, int pmp,
ata_tf_to_fis(tf, pmp, is_cmd, fis);
ahci_fill_cmd_slot(pp, 0, cmd_fis_len | flags | (pmp << 12));
+ /* set port value for softreset of Port Multiplier */
+ if (pp->fbs_enabled && pp->fbs_last_dev != pmp) {
+ tmp = readl(port_mmio + PORT_FBS);
+ tmp &= ~(PORT_FBS_DEV_MASK | PORT_FBS_DEC);
+ tmp |= pmp << PORT_FBS_DEV_OFFSET;
+ writel(tmp, port_mmio + PORT_FBS);
+ pp->fbs_last_dev = pmp;
+ }
+
/* issue & wait */
writel(1, port_mmio + PORT_CMD_ISSUE);