All of lore.kernel.org
 help / color / mirror / Atom feed
From: Adrian Hunter <adrian.hunter@intel.com>
To: Arend Van Spriel <arend.vanspriel@broadcom.com>,
	Douglas Anderson <dianders@chromium.org>,
	Ulf Hansson <ulf.hansson@linaro.org>,
	Kalle Valo <kvalo@codeaurora.org>
Cc: linux-rockchip@lists.infradead.org,
	Double Lo <double.lo@cypress.com>,
	briannorris@chromium.org,
	Madhan Mohan R <madhanmohan.r@cypress.com>,
	mka@chromium.org, Wright Feng <wright.feng@cypress.com>,
	Chi-Hsien Lin <chi-hsien.lin@cypress.com>,
	Jiong Wu <lohengrin1024@gmail.com>,
	Ritesh Harjani <riteshh@codeaurora.org>,
	linux-mmc@vger.kernel.org, linux-kernel@vger.kernel.org,
	Shawn Lin <shawn.lin@rock-chips.com>,
	Wolfram Sang <wsa+renesas@sang-engineering.com>,
	Avri Altman <avri.altman@wdc.com>, Martin Hicks <mort@bork.org>
Subject: Re: [PATCH 2/3] mmc: core: API for temporarily disabling auto-retuning due to errors
Date: Tue, 28 May 2019 13:04:56 +0300	[thread overview]
Message-ID: <4f39e152-04ba-a64e-985a-df93e6d15ff8@intel.com> (raw)
In-Reply-To: <05af228c-139b-2b7f-f626-36fb34634be5@broadcom.com>

On 26/05/19 9:42 PM, Arend Van Spriel wrote:
> On 5/18/2019 12:54 AM, Douglas Anderson wrote:
>> Normally when the MMC core sees an "-EILSEQ" error returned by a host
>> controller then it will trigger a retuning of the card.  This is
>> generally a good idea.
> 
> Probably a question for Adrian, but how is this retuning scheduled. I recall
> seeing something in mmc_request_done. How about deferring the retuning upon
> a release host or is that too sdio specific.

Below is what I have been carrying the last 4 years.  But according to Douglas'
patch, the release would need to be further down.  See 2nd diff below.
Would that work?


diff --git a/drivers/mmc/core/sdio_io.c b/drivers/mmc/core/sdio_io.c
index 3f67fbbe0d75..7a81a503541b 100644
--- a/drivers/mmc/core/sdio_io.c
+++ b/drivers/mmc/core/sdio_io.c
@@ -16,6 +16,7 @@
 #include <linux/mmc/sdio.h>
 #include <linux/mmc/sdio_func.h>
 
+#include "host.h"
 #include "sdio_ops.h"
 #include "core.h"
 #include "card.h"
@@ -738,3 +739,15 @@ int sdio_set_host_pm_flags(struct sdio_func *func, mmc_pm_flag_t flags)
 	return 0;
 }
 EXPORT_SYMBOL_GPL(sdio_set_host_pm_flags);
+
+void sdio_retune_hold_now(struct sdio_func *func)
+{
+	mmc_retune_hold_now(func->card->host);
+}
+EXPORT_SYMBOL_GPL(sdio_retune_hold_now);
+
+void sdio_retune_release(struct sdio_func *func)
+{
+	mmc_retune_release(func->card->host);
+}
+EXPORT_SYMBOL_GPL(sdio_retune_release);
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
index 22b73da42822..c915c39d519f 100644
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
@@ -679,6 +679,11 @@ brcmf_sdio_kso_control(struct brcmf_sdio *bus, bool on)
 	brcmf_dbg(TRACE, "Enter: on=%d\n", on);
 
 	wr_val = (on << SBSDIO_FUNC1_SLEEPCSR_KSO_SHIFT);
+
+	/* Cannot re-tune if device is asleep */
+	if (on)
+		sdio_retune_hold_now(bus->sdiodev->func1);
+
 	/* 1st KSO write goes to AOS wake up core if device is asleep  */
 	brcmf_sdiod_writeb(bus->sdiodev, SBSDIO_FUNC1_SLEEPCSR, wr_val, &err);
 
@@ -691,6 +696,7 @@ brcmf_sdio_kso_control(struct brcmf_sdio *bus, bool on)
 		return err;
 
 	if (on) {
+		sdio_retune_release(bus->sdiodev->func1);
 		/* device WAKEUP through KSO:
 		 * write bit 0 & read back until
 		 * both bits 0 (kso bit) & 1 (dev on status) are set
diff --git a/include/linux/mmc/sdio_func.h b/include/linux/mmc/sdio_func.h
index 5685805533b5..85c24b0694d7 100644
--- a/include/linux/mmc/sdio_func.h
+++ b/include/linux/mmc/sdio_func.h
@@ -171,4 +171,7 @@ extern void sdio_f0_writeb(struct sdio_func *func, unsigned char b,
 extern mmc_pm_flag_t sdio_get_host_pm_caps(struct sdio_func *func);
 extern int sdio_set_host_pm_flags(struct sdio_func *func, mmc_pm_flag_t flags);
 
+extern void sdio_retune_hold_now(struct sdio_func *func);
+extern void sdio_retune_release(struct sdio_func *func);
+
 #endif /* LINUX_MMC_SDIO_FUNC_H */





diff --git a/drivers/mmc/core/sdio_io.c b/drivers/mmc/core/sdio_io.c
index 3f67fbbe0d75..7a81a503541b 100644
--- a/drivers/mmc/core/sdio_io.c
+++ b/drivers/mmc/core/sdio_io.c
@@ -16,6 +16,7 @@
 #include <linux/mmc/sdio.h>
 #include <linux/mmc/sdio_func.h>
 
+#include "host.h"
 #include "sdio_ops.h"
 #include "core.h"
 #include "card.h"
@@ -738,3 +739,15 @@ int sdio_set_host_pm_flags(struct sdio_func *func, mmc_pm_flag_t flags)
 	return 0;
 }
 EXPORT_SYMBOL_GPL(sdio_set_host_pm_flags);
+
+void sdio_retune_hold_now(struct sdio_func *func)
+{
+	mmc_retune_hold_now(func->card->host);
+}
+EXPORT_SYMBOL_GPL(sdio_retune_hold_now);
+
+void sdio_retune_release(struct sdio_func *func)
+{
+	mmc_retune_release(func->card->host);
+}
+EXPORT_SYMBOL_GPL(sdio_retune_release);
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
index 22b73da42822..50c153932683 100644
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
@@ -679,6 +679,11 @@ brcmf_sdio_kso_control(struct brcmf_sdio *bus, bool on)
 	brcmf_dbg(TRACE, "Enter: on=%d\n", on);
 
 	wr_val = (on << SBSDIO_FUNC1_SLEEPCSR_KSO_SHIFT);
+
+	/* Cannot re-tune if device is asleep */
+	if (on)
+		sdio_retune_hold_now(bus->sdiodev->func1);
+
 	/* 1st KSO write goes to AOS wake up core if device is asleep  */
 	brcmf_sdiod_writeb(bus->sdiodev, SBSDIO_FUNC1_SLEEPCSR, wr_val, &err);
 
@@ -731,6 +736,9 @@ brcmf_sdio_kso_control(struct brcmf_sdio *bus, bool on)
 
 	} while (try_cnt++ < MAX_KSO_ATTEMPTS);
 
+	if (on)
+		sdio_retune_release(bus->sdiodev->func1);
+
 	if (try_cnt > 2)
 		brcmf_dbg(SDIO, "try_cnt=%d rd_val=0x%x err=%d\n", try_cnt,
 			  rd_val, err);
diff --git a/include/linux/mmc/sdio_func.h b/include/linux/mmc/sdio_func.h
index 5685805533b5..85c24b0694d7 100644
--- a/include/linux/mmc/sdio_func.h
+++ b/include/linux/mmc/sdio_func.h
@@ -171,4 +171,7 @@ extern void sdio_f0_writeb(struct sdio_func *func, unsigned char b,
 extern mmc_pm_flag_t sdio_get_host_pm_caps(struct sdio_func *func);
 extern int sdio_set_host_pm_flags(struct sdio_func *func, mmc_pm_flag_t flags);
 
+extern void sdio_retune_hold_now(struct sdio_func *func);
+extern void sdio_retune_release(struct sdio_func *func);
+
 #endif /* LINUX_MMC_SDIO_FUNC_H */

  reply	other threads:[~2019-05-28 10:05 UTC|newest]

Thread overview: 43+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-05-17 22:54 [PATCH 0/3] brcmfmac: sdio: Deal better w/ transmission errors waking from sleep Douglas Anderson
2019-05-17 22:54 ` Douglas Anderson
2019-05-17 22:54 ` [PATCH 1/3] brcmfmac: re-enable command decode in sdio_aos for BRCM 4354 Douglas Anderson
2019-05-20  8:09   ` Arend Van Spriel
2019-05-20 18:20     ` Doug Anderson
2019-05-20 18:20       ` Doug Anderson
     [not found]   ` <20190517225420.176893-2-dianders-F7+t8E8rja9g9hUCZPvPmw@public.gmane.org>
2019-05-28 12:18     ` Kalle Valo
2019-05-28 15:51       ` Doug Anderson
2019-05-28 15:51         ` Doug Anderson
2019-05-28 16:09         ` Arend Van Spriel
2019-05-28 16:09           ` Arend Van Spriel
2019-05-28 16:11           ` Arend Van Spriel
2019-05-28 16:11             ` Arend Van Spriel
2019-06-04  3:20             ` Wright Feng
2019-06-04  3:20               ` Wright Feng
2019-06-04 16:01               ` Doug Anderson
2019-06-04 16:01                 ` Doug Anderson
2019-06-04 16:48                 ` Arend Van Spriel
2019-06-04 16:48                   ` Arend Van Spriel
2019-05-29 14:51         ` Kalle Valo
2019-05-29 14:51           ` Kalle Valo
2019-05-28 12:18   ` Kalle Valo
2019-05-28 12:18     ` Kalle Valo
2019-05-17 22:54 ` [PATCH 2/3] mmc: core: API for temporarily disabling auto-retuning due to errors Douglas Anderson
2019-05-17 22:54   ` Douglas Anderson
2019-05-19  9:06   ` Wolfram Sang
2019-05-19  9:06     ` Wolfram Sang
2019-05-20  8:46     ` Arend Van Spriel
2019-05-20  8:52       ` Wolfram Sang
2019-05-20  8:52         ` Wolfram Sang
2019-05-26 18:42   ` Arend Van Spriel
2019-05-26 18:42     ` Arend Van Spriel
2019-05-28 10:04     ` Adrian Hunter [this message]
2019-05-28 11:21       ` Arend Van Spriel
2019-05-28 11:45         ` Adrian Hunter
2019-05-28 15:42           ` Doug Anderson
2019-05-17 22:54 ` [PATCH 3/3] brcmfmac: sdio: Disable auto-tuning around commands expected to fail Douglas Anderson
2019-05-18 15:09 ` [PATCH 0/3] brcmfmac: sdio: Deal better w/ transmission errors waking from sleep Avri Altman
2019-05-18 15:09   ` Avri Altman
2019-05-21  0:23   ` Brian Norris
2019-05-21  0:23     ` Brian Norris
2019-05-20  8:55 ` Arend Van Spriel
2019-05-20  8:55   ` Arend Van Spriel

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=4f39e152-04ba-a64e-985a-df93e6d15ff8@intel.com \
    --to=adrian.hunter@intel.com \
    --cc=arend.vanspriel@broadcom.com \
    --cc=avri.altman@wdc.com \
    --cc=briannorris@chromium.org \
    --cc=chi-hsien.lin@cypress.com \
    --cc=dianders@chromium.org \
    --cc=double.lo@cypress.com \
    --cc=kvalo@codeaurora.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mmc@vger.kernel.org \
    --cc=linux-rockchip@lists.infradead.org \
    --cc=lohengrin1024@gmail.com \
    --cc=madhanmohan.r@cypress.com \
    --cc=mka@chromium.org \
    --cc=mort@bork.org \
    --cc=riteshh@codeaurora.org \
    --cc=shawn.lin@rock-chips.com \
    --cc=ulf.hansson@linaro.org \
    --cc=wright.feng@cypress.com \
    --cc=wsa+renesas@sang-engineering.com \
    /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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.