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

login
register
mail settings
Submitter yxlraid@gmail.com
Date Sept. 25, 2013, 2:46 p.m.
Message ID <1380120388-13375-1-git-send-email-yxlraid@gmail.com>
Download mbox | patch
Permalink /patch/277894/
State Not Applicable
Delegated to: David Miller
Headers show

Comments

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(-)
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

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;