45b73af7f6
All these patches are in wireless-drirvers-next. There is support for hidden SSID, few new devices and many fixes. Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
56 lines
2 KiB
Diff
56 lines
2 KiB
Diff
From 5251b6be8bb5c5675bdf12347c7b83937a5c91e5 Mon Sep 17 00:00:00 2001
|
|
From: Arend Van Spriel <arend.vanspriel@broadcom.com>
|
|
Date: Mon, 5 Sep 2016 11:42:13 +0100
|
|
Subject: [PATCH] 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>
|
|
---
|
|
drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c | 11 +++++++++--
|
|
1 file changed, 9 insertions(+), 2 deletions(-)
|
|
|
|
--- 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 {
|
|
|
|
#define KSO_WAIT_US 50
|
|
#define MAX_KSO_ATTEMPTS (PMU_MAX_TRANSITION_DLY/KSO_WAIT_US)
|
|
+#define BRCMF_SDIO_MAX_ACCESS_ERRORS 5
|
|
|
|
/*
|
|
* Conversion of 802.1D priority to precedence level
|
|
@@ -677,6 +678,7 @@ brcmf_sdio_kso_control(struct brcmf_sdio
|
|
{
|
|
u8 wr_val = 0, rd_val, cmp_val, bmask;
|
|
int err = 0;
|
|
+ int err_cnt = 0;
|
|
int try_cnt = 0;
|
|
|
|
brcmf_dbg(TRACE, "Enter: on=%d\n", on);
|
|
@@ -712,9 +714,14 @@ brcmf_sdio_kso_control(struct brcmf_sdio
|
|
*/
|
|
rd_val = brcmf_sdiod_regrb(bus->sdiodev, SBSDIO_FUNC1_SLEEPCSR,
|
|
&err);
|
|
- if (((rd_val & bmask) == cmp_val) && !err)
|
|
+ if (!err) {
|
|
+ if ((rd_val & bmask) == cmp_val)
|
|
+ break;
|
|
+ err_cnt = 0;
|
|
+ }
|
|
+ /* bail out upon subsequent access errors */
|
|
+ if (err && (err_cnt++ > BRCMF_SDIO_MAX_ACCESS_ERRORS))
|
|
break;
|
|
-
|
|
udelay(KSO_WAIT_US);
|
|
brcmf_sdiod_regwb(bus->sdiodev, SBSDIO_FUNC1_SLEEPCSR,
|
|
wr_val, &err);
|