devicetree.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Bartosz Golaszewski <bgolaszewski@baylibre.com>
To: Kevin Hilman <khilman@kernel.org>, Sekhar Nori <nsekhar@ti.com>,
	Patrick Titiano <ptitiano@baylibre.com>,
	Michael Turquette <mturquette@baylibre.com>,
	Tejun Heo <tj@kernel.org>, Rob Herring <robh+dt@kernel.org>,
	Mark Rutland <mark.rutland@arm.com>,
	Russell King <linux@armlinux.org.uk>,
	David Lechner <david@lechnology.com>
Cc: linux-ide@vger.kernel.org,
	Bartosz Golaszewski <bgolaszewski@baylibre.com>,
	linux-kernel@vger.kernel.org,
	linux-arm-kernel@lists.infradead.org, devicetree@vger.kernel.org
Subject: [PATCH 04/10] sata: hardreset: retry if phys link is down
Date: Fri, 13 Jan 2017 13:37:58 +0100	[thread overview]
Message-ID: <1484311084-31547-5-git-send-email-bgolaszewski@baylibre.com> (raw)
In-Reply-To: <1484311084-31547-1-git-send-email-bgolaszewski@baylibre.com>

The sata core driver already retries to resume the link because some
controllers ignore writes to the SControl register.

We have a use case with the da850 SATA controller where at PLL0
frequency of 456MHz (needed to properly service the LCD controller)
the chip becomes unstable and the hardreset operation is ignored the
first time 50% of times.

Retrying just the resume operation doesn't work - we need to issue
the phy/wake reset again to make it work.

If ata_phys_link_offline() returns true in sata_link_hardreset(),
retry a couple times before really giving up.

Signed-off-by: Bartosz Golaszewski <bgolaszewski@baylibre.com>
---
 drivers/ata/libata-core.c | 16 ++++++++++++----
 include/linux/libata.h    |  4 +++-
 2 files changed, 15 insertions(+), 5 deletions(-)

diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c
index 9cd0a2d..3b848a3 100644
--- a/drivers/ata/libata-core.c
+++ b/drivers/ata/libata-core.c
@@ -3985,8 +3985,8 @@ int sata_link_hardreset(struct ata_link *link, const unsigned long *timing,
 			unsigned long deadline,
 			bool *online, int (*check_ready)(struct ata_link *))
 {
+	int rc, retry = ATA_LINK_RESET_TRIES;
 	u32 scontrol;
-	int rc;
 
 	DPRINTK("ENTER\n");
 
@@ -4009,7 +4009,7 @@ int sata_link_hardreset(struct ata_link *link, const unsigned long *timing,
 
 		sata_set_spd(link);
 	}
-
+retry:
 	/* issue phy wake/reset */
 	if ((rc = sata_scr_read(link, SCR_CONTROL, &scontrol)))
 		goto out;
@@ -4028,9 +4028,17 @@ int sata_link_hardreset(struct ata_link *link, const unsigned long *timing,
 	rc = sata_link_resume(link, timing, deadline);
 	if (rc)
 		goto out;
-	/* if link is offline nothing more to do */
-	if (ata_phys_link_offline(link))
+
+	if (ata_phys_link_offline(link)) {
+		if (retry--) {
+			ata_link_warn(link,
+				      "link still offline after hardreset - retrying\n");
+			goto retry;
+		}
+
+		/* if link is still offline nothing more to do */
 		goto out;
+	}
 
 	/* Link is online.  From this point, -ENODEV too is an error. */
 	if (online)
diff --git a/include/linux/libata.h b/include/linux/libata.h
index c170be5..2c840c0 100644
--- a/include/linux/libata.h
+++ b/include/linux/libata.h
@@ -392,8 +392,10 @@ enum {
 	/* max tries if error condition is still set after ->error_handler */
 	ATA_EH_MAX_TRIES	= 5,
 
-	/* sometimes resuming a link requires several retries */
+	/* sometimes resuming a link requires several retries... */
 	ATA_LINK_RESUME_TRIES	= 5,
+	/* ... and sometimes we need to retry the whole reset procedure */
+	ATA_LINK_RESET_TRIES	= 5,
 
 	/* how hard are we gonna try to probe/recover devices */
 	ATA_PROBE_MAX_TRIES	= 3,
-- 
2.9.3

  parent reply	other threads:[~2017-01-13 12:37 UTC|newest]

Thread overview: 27+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-01-13 12:37 [PATCH 00/10] ARM: da850-lcdk: add SATA support Bartosz Golaszewski
2017-01-13 12:37 ` [PATCH 01/10] ARM: davinci: add a clock lookup entry for the SATA clock Bartosz Golaszewski
2017-01-13 12:37 ` [PATCH 02/10] ARM: davinci_all_defconfig: enable SATA modules Bartosz Golaszewski
2017-01-13 12:37 ` [PATCH 03/10] devicetree: bindings: add bindings for ahci-da850 Bartosz Golaszewski
     [not found]   ` <1484311084-31547-4-git-send-email-bgolaszewski-rdvid1DuHRBWk0Htik3J/w@public.gmane.org>
2017-01-13 19:25     ` David Lechner
2017-01-16 10:13       ` Bartosz Golaszewski
2017-01-16 12:45         ` Sekhar Nori
     [not found]           ` <d8406f53-b97d-ca9a-f7d1-94ce5b7064f7-l0cyMroinI0@public.gmane.org>
2017-01-16 14:30             ` Bartosz Golaszewski
2017-01-16 18:47               ` David Lechner
     [not found]                 ` <fb93275e-73ad-513b-6ac8-a39bbe43fd5c-nq/r/kbU++upp/zk7JDF2g@public.gmane.org>
2017-01-17 12:00                   ` Sekhar Nori
2017-01-17 18:31                     ` davinci common clock framework (was Re: [PATCH 03/10] devicetree: bindings: add bindings for ahci-da850) David Lechner
2017-01-13 12:37 ` Bartosz Golaszewski [this message]
2017-01-15 23:10   ` [PATCH 04/10] sata: hardreset: retry if phys link is down Tejun Heo
2017-01-16 12:28     ` Bartosz Golaszewski
2017-01-13 12:37 ` [PATCH 05/10] sata: ahci_da850: add device tree match table Bartosz Golaszewski
2017-01-13 12:38 ` [PATCH 06/10] sata: ahci_da850: implement a softreset quirk Bartosz Golaszewski
     [not found]   ` <1484311084-31547-7-git-send-email-bgolaszewski-rdvid1DuHRBWk0Htik3J/w@public.gmane.org>
2017-01-15 23:12     ` Tejun Heo
2017-01-16 10:17       ` Bartosz Golaszewski
2017-01-13 12:38 ` [PATCH 07/10] sata: ahci_da850: add support for the da850, clk_multiplier DT property Bartosz Golaszewski
2017-01-13 19:29   ` [PATCH 07/10] sata: ahci_da850: add support for the da850,clk_multiplier " David Lechner
2017-01-13 12:38 ` [PATCH 08/10] ARM: dts: da850: add pinmux settings for the SATA controller Bartosz Golaszewski
2017-01-13 12:38 ` [PATCH 09/10] ARM: dts: da850: add the SATA node Bartosz Golaszewski
2017-01-13 19:36   ` David Lechner
     [not found]     ` <4eb4ada8-1d2d-2fa1-7961-21da56ea0082-nq/r/kbU++upp/zk7JDF2g@public.gmane.org>
2017-01-16 10:03       ` Bartosz Golaszewski
     [not found] ` <1484311084-31547-1-git-send-email-bgolaszewski-rdvid1DuHRBWk0Htik3J/w@public.gmane.org>
2017-01-13 12:38   ` [PATCH 10/10] ARM: dts: da850-lcdk: enable " Bartosz Golaszewski
2017-01-17 12:34   ` [PATCH 00/10] ARM: da850-lcdk: add SATA support Bartosz Golaszewski
2017-01-13 14:32 ` Sekhar Nori

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1484311084-31547-5-git-send-email-bgolaszewski@baylibre.com \
    --to=bgolaszewski@baylibre.com \
    --cc=david@lechnology.com \
    --cc=devicetree@vger.kernel.org \
    --cc=khilman@kernel.org \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-ide@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux@armlinux.org.uk \
    --cc=mark.rutland@arm.com \
    --cc=mturquette@baylibre.com \
    --cc=nsekhar@ti.com \
    --cc=ptitiano@baylibre.com \
    --cc=robh+dt@kernel.org \
    --cc=tj@kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).