RE: [PATCH v3 3/5] brcmfmac: sdio: Disable auto-tuning around commands expected to fail

From: Hunter, Adrian
Date: Mon Jun 10 2019 - 05:01:17 EST


> -----Original Message-----
> From: Douglas Anderson [mailto:dianders@xxxxxxxxxxxx]
> Sent: Saturday, June 8, 2019 1:37 AM
> To: Ulf Hansson <ulf.hansson@xxxxxxxxxx>; Kalle Valo
> <kvalo@xxxxxxxxxxxxxx>; Hunter, Adrian <adrian.hunter@xxxxxxxxx>; Arend
> van Spriel <arend.vanspriel@xxxxxxxxxxxx>
> Cc: brcm80211-dev-list.pdl@xxxxxxxxxxxx; linux-
> rockchip@xxxxxxxxxxxxxxxxxxx; Double Lo <double.lo@xxxxxxxxxxx>;
> briannorris@xxxxxxxxxxxx; linux-wireless@xxxxxxxxxxxxxxx; Naveen Gupta
> <naveen.gupta@xxxxxxxxxxx>; Madhan Mohan R
> <madhanmohan.r@xxxxxxxxxxx>; mka@xxxxxxxxxxxx; Wright Feng
> <wright.feng@xxxxxxxxxxx>; Chi-Hsien Lin <chi-hsien.lin@xxxxxxxxxxx>;
> netdev@xxxxxxxxxxxxxxx; brcm80211-dev-list@xxxxxxxxxxx; Douglas
> Anderson <dianders@xxxxxxxxxxxx>; Franky Lin
> <franky.lin@xxxxxxxxxxxx>; linux-kernel@xxxxxxxxxxxxxxx; Madhan Mohan
> R <MadhanMohan.R@xxxxxxxxxxx>; Hante Meuleman
> <hante.meuleman@xxxxxxxxxxxx>; YueHaibing
> <yuehaibing@xxxxxxxxxx>; David S. Miller <davem@xxxxxxxxxxxxx>
> Subject: [PATCH v3 3/5] brcmfmac: sdio: Disable auto-tuning around
> commands expected to fail
>
> There are certain cases, notably when transitioning between sleep and active
> state, when Broadcom SDIO WiFi cards will produce errors on the SDIO bus.
> This is evident from the source code where you can see that we try
> commands in a loop until we either get success or we've tried too many
> times. The comment in the code reinforces this by saying "just one write
> attempt may fail"
>
> Unfortunately these failures sometimes end up causing an "-EILSEQ"
> back to the core which triggers a retuning of the SDIO card and that blocks all
> traffic to the card until it's done.
>
> Let's disable retuning around the commands we expect might fail.
>
> Fixes: bd11e8bd03ca ("mmc: core: Flag re-tuning is needed on CRC errors")
> Signed-off-by: Douglas Anderson <dianders@xxxxxxxxxxxx>
> ---
>
> Changes in v3:
> - Expect errors for all of brcmf_sdio_kso_control() (Adrian).
>
> Changes in v2: None
>
> drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c | 5 +++++
> 1 file changed, 5 insertions(+)
>
> diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
> b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
> index 4a750838d8cd..4040aae1f9ed 100644
> --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
> +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
> @@ -16,6 +16,7 @@
> #include <linux/mmc/sdio_ids.h>
> #include <linux/mmc/sdio_func.h>
> #include <linux/mmc/card.h>
> +#include <linux/mmc/core.h>

SDIO function drivers should not really include linux/mmc/core.h
(Also don't know why linux/mmc/card.h is included)

> #include <linux/semaphore.h>
> #include <linux/firmware.h>
> #include <linux/module.h>
> @@ -667,6 +668,8 @@ brcmf_sdio_kso_control(struct brcmf_sdio *bus, bool
> on)
>
> brcmf_dbg(TRACE, "Enter: on=%d\n", on);
>
> + mmc_expect_errors_begin(bus->sdiodev->func1->card->host);
> +
> wr_val = (on << SBSDIO_FUNC1_SLEEPCSR_KSO_SHIFT);
> /* 1st KSO write goes to AOS wake up core if device is asleep */
> brcmf_sdiod_writeb(bus->sdiodev, SBSDIO_FUNC1_SLEEPCSR,
> wr_val, &err); @@ -727,6 +730,8 @@ brcmf_sdio_kso_control(struct
> brcmf_sdio *bus, bool on)
> if (try_cnt > MAX_KSO_ATTEMPTS)
> brcmf_err("max tries: rd_val=0x%x err=%d\n", rd_val, err);
>
> + mmc_expect_errors_end(bus->sdiodev->func1->card->host);
> +
> return err;
> }
>
> --
> 2.22.0.rc2.383.gf4fbbf30c2-goog