aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/broadcom
diff options
context:
space:
mode:
authorArend Van Spriel <arend.vanspriel@broadcom.com>2016-09-05 06:42:13 -0400
committerKalle Valo <kvalo@codeaurora.org>2016-09-09 05:12:15 -0400
commit5251b6be8bb5c5675bdf12347c7b83937a5c91e5 (patch)
treee1886c189a6c6b87c41ac3e5f5d905e4059d4a1d /drivers/net/wireless/broadcom
parent634faf3686900ccdee87b77e2c56df8b2159912b (diff)
brcmfmac: sdio: shorten retry loop in brcmf_sdio_kso_control()
In brcmf_sdio_kso_control() there is a retry loop as hardware may take time to settle. However, when the call to brcmf_sdiod_regrb() returns an error it is due to SDIO access failure and it makes no sense to wait for hardware to settle. This patch aborts the loop after a number of subsequent access errors. Reviewed-by: Hante Meuleman <hante.meuleman@broadcom.com> Reviewed-by: Pieter-Paul Giesberts <pieter-paul.giesberts@broadcom.com> Reviewed-by: Franky Lin <franky.lin@broadcom.com> Signed-off-by: Arend van Spriel <arend.vanspriel@broadcom.com> Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
Diffstat (limited to 'drivers/net/wireless/broadcom')
-rw-r--r--drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c11
1 files changed, 9 insertions, 2 deletions
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
index 589a49cd9cd5..b892dac70f4b 100644
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c
@@ -313,6 +313,7 @@ struct rte_console {
313 313
314#define KSO_WAIT_US 50 314#define KSO_WAIT_US 50
315#define MAX_KSO_ATTEMPTS (PMU_MAX_TRANSITION_DLY/KSO_WAIT_US) 315#define MAX_KSO_ATTEMPTS (PMU_MAX_TRANSITION_DLY/KSO_WAIT_US)
316#define BRCMF_SDIO_MAX_ACCESS_ERRORS 5
316 317
317/* 318/*
318 * Conversion of 802.1D priority to precedence level 319 * Conversion of 802.1D priority to precedence level
@@ -677,6 +678,7 @@ brcmf_sdio_kso_control(struct brcmf_sdio *bus, bool on)
677{ 678{
678 u8 wr_val = 0, rd_val, cmp_val, bmask; 679 u8 wr_val = 0, rd_val, cmp_val, bmask;
679 int err = 0; 680 int err = 0;
681 int err_cnt = 0;
680 int try_cnt = 0; 682 int try_cnt = 0;
681 683
682 brcmf_dbg(TRACE, "Enter: on=%d\n", on); 684 brcmf_dbg(TRACE, "Enter: on=%d\n", on);
@@ -712,9 +714,14 @@ brcmf_sdio_kso_control(struct brcmf_sdio *bus, bool on)
712 */ 714 */
713 rd_val = brcmf_sdiod_regrb(bus->sdiodev, SBSDIO_FUNC1_SLEEPCSR, 715 rd_val = brcmf_sdiod_regrb(bus->sdiodev, SBSDIO_FUNC1_SLEEPCSR,
714 &err); 716 &err);
715 if (((rd_val & bmask) == cmp_val) && !err) 717 if (!err) {
718 if ((rd_val & bmask) == cmp_val)
719 break;
720 err_cnt = 0;
721 }
722 /* bail out upon subsequent access errors */
723 if (err && (err_cnt++ > BRCMF_SDIO_MAX_ACCESS_ERRORS))
716 break; 724 break;
717
718 udelay(KSO_WAIT_US); 725 udelay(KSO_WAIT_US);
719 brcmf_sdiod_regwb(bus->sdiodev, SBSDIO_FUNC1_SLEEPCSR, 726 brcmf_sdiod_regwb(bus->sdiodev, SBSDIO_FUNC1_SLEEPCSR,
720 wr_val, &err); 727 wr_val, &err);