60 lines
2.1 KiB
Diff
60 lines
2.1 KiB
Diff
|
From: Arend van Spriel <arend@broadcom.com>
|
||
|
Date: Wed, 11 Mar 2015 16:11:33 +0100
|
||
|
Subject: [PATCH] brcmfmac: fix watchdog timer regression
|
||
|
|
||
|
The watchdog timer is used to put the device in a low-power mode when
|
||
|
it is idle for some time. This timer is stopped during that mode and
|
||
|
should be restarted upon activity. This has been broken by commit
|
||
|
d4150fced0365 ("brcmfmac: Simplify watchdog sleep."). This patch
|
||
|
restores the behaviour as it was before that commit.
|
||
|
|
||
|
Reported-by: Pontus Fuchs <pontusf@broadcom.com>
|
||
|
Reviewed-by: Hante Meuleman <meuleman@broadcom.com>
|
||
|
Reviewed-by: Pieter-Paul Giesberts <pieterpg@broadcom.com>
|
||
|
Signed-off-by: Arend van Spriel <arend@broadcom.com>
|
||
|
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
|
||
|
---
|
||
|
|
||
|
--- a/drivers/net/wireless/brcm80211/brcmfmac/sdio.c
|
||
|
+++ b/drivers/net/wireless/brcm80211/brcmfmac/sdio.c
|
||
|
@@ -972,7 +972,6 @@ static int brcmf_sdio_clkctl(struct brcm
|
||
|
brcmf_sdio_sdclk(bus, true);
|
||
|
/* Now request HT Avail on the backplane */
|
||
|
brcmf_sdio_htclk(bus, true, pendok);
|
||
|
- brcmf_sdio_wd_timer(bus, BRCMF_WD_POLL_MS);
|
||
|
break;
|
||
|
|
||
|
case CLK_SDONLY:
|
||
|
@@ -984,7 +983,6 @@ static int brcmf_sdio_clkctl(struct brcm
|
||
|
else
|
||
|
brcmf_err("request for %d -> %d\n",
|
||
|
bus->clkstate, target);
|
||
|
- brcmf_sdio_wd_timer(bus, BRCMF_WD_POLL_MS);
|
||
|
break;
|
||
|
|
||
|
case CLK_NONE:
|
||
|
@@ -993,7 +991,6 @@ static int brcmf_sdio_clkctl(struct brcm
|
||
|
brcmf_sdio_htclk(bus, false, false);
|
||
|
/* Now remove the SD clock */
|
||
|
brcmf_sdio_sdclk(bus, false);
|
||
|
- brcmf_sdio_wd_timer(bus, 0);
|
||
|
break;
|
||
|
}
|
||
|
#ifdef DEBUG
|
||
|
@@ -1048,6 +1045,7 @@ end:
|
||
|
brcmf_sdio_clkctl(bus, CLK_NONE, pendok);
|
||
|
} else {
|
||
|
brcmf_sdio_clkctl(bus, CLK_AVAIL, pendok);
|
||
|
+ brcmf_sdio_wd_timer(bus, BRCMF_WD_POLL_MS);
|
||
|
}
|
||
|
bus->sleeping = sleep;
|
||
|
brcmf_dbg(SDIO, "new state %s\n",
|
||
|
@@ -4242,6 +4240,7 @@ void brcmf_sdio_remove(struct brcmf_sdio
|
||
|
if (bus->ci) {
|
||
|
if (bus->sdiodev->state != BRCMF_SDIOD_NOMEDIUM) {
|
||
|
sdio_claim_host(bus->sdiodev->func[1]);
|
||
|
+ brcmf_sdio_wd_timer(bus, 0);
|
||
|
brcmf_sdio_clkctl(bus, CLK_AVAIL, false);
|
||
|
/* Leave the device in state where it is
|
||
|
* 'passive'. This is done by resetting all
|