OSDN Git Service

brcmfmac: fix watchdog timer regression
authorArend van Spriel <arend@broadcom.com>
Wed, 11 Mar 2015 15:11:33 +0000 (16:11 +0100)
committerChih-Wei Huang <cwhuang@linux.org.tw>
Tue, 28 Apr 2015 16:49:42 +0000 (00:49 +0800)
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>
drivers/net/wireless/brcm80211/brcmfmac/sdio.c

index 25c5469..de7aaae 100644 (file)
@@ -972,7 +972,6 @@ static int brcmf_sdio_clkctl(struct brcmf_sdio *bus, uint target, bool pendok)
                        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 brcmf_sdio *bus, uint target, bool pendok)
                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 brcmf_sdio *bus, uint target, bool pendok)
                        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 *bus)
                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