[1/1] AHCI: disabled FBS before softreset handling. According to chapter 9.3.9 in AHCI spec, controller should disable FBS before softreset.

Submitted by yxlraid@gmail.com on Sept. 25, 2013, 2:46 p.m.

Details

Message ID 1380120388-13375-1-git-send-email-yxlraid@gmail.com
State Not Applicable
Delegated to: David Miller
Headers show

Commit Message

yxlraid@gmail.com Sept. 25, 2013, 2:46 p.m.
Signed-off-by: Xiangliang Yu <yxlraid@gmail.com>
---
 drivers/ata/libahci.c |   10 ++++++++++
 1 files changed, 10 insertions(+), 0 deletions(-)

Comments

Tejun Heo Sept. 26, 2013, 2:12 p.m.
Please shorten the subject and explain in detail what this patch
changes how and why along with how you tested it and what, if any,
behavior changes occur from it.

Thanks.
yxlraid@gmail.com Sept. 27, 2013, 1:55 a.m.
ok, i'll update and re-commit the patch

2013/9/26 Tejun Heo <tj@kernel.org>:
> Please shorten the subject and explain in detail what this patch
> changes how and why along with how you tested it and what, if any,
> behavior changes occur from it.
>
> Thanks.
>
> --
> tejun
--
To unsubscribe from this list: send the line "unsubscribe linux-ide" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Patch hide | download patch | download mbox

diff --git a/drivers/ata/libahci.c b/drivers/ata/libahci.c
index acfd0f7..8d024a4 100644
--- a/drivers/ata/libahci.c
+++ b/drivers/ata/libahci.c
@@ -1267,9 +1267,11 @@  int ahci_do_softreset(struct ata_link *link, unsigned int *class,
 {
 	struct ata_port *ap = link->ap;
 	struct ahci_host_priv *hpriv = ap->host->private_data;
+	struct ahci_port_priv *pp = ap->private_data;
 	const char *reason = NULL;
 	unsigned long now, msecs;
 	struct ata_taskfile tf;
+	bool flag = FALSE;
 	int rc;
 
 	DPRINTK("ENTER\n");
@@ -1279,6 +1281,11 @@  int ahci_do_softreset(struct ata_link *link, unsigned int *class,
 	if (rc && rc != -EOPNOTSUPP)
 		ata_link_warn(link, "failed to reset engine (errno=%d)\n", rc);
 
+	if (!ata_is_host_link(link) && pp->fbs_enabled) {
+		ahci_disable_fbs(ap);
+		flag = TRUE;
+	}
+
 	ata_tf_init(link->device, &tf);
 
 	/* issue the first D2H Register FIS */
@@ -1319,6 +1326,9 @@  int ahci_do_softreset(struct ata_link *link, unsigned int *class,
 	} else
 		*class = ahci_dev_classify(ap);
 
+	if (flag)
+		ahci_enable_fbs(ap);
+
 	DPRINTK("EXIT, class=%u\n", *class);
 	return 0;