From: Arend van Spriel <arend@broadcom.com>
To: "Fu, Zhonghui" <zhonghui.fu@linux.intel.com>,
brudley@broadcom.com, Franky Lin <frankyl@broadcom.com>,
meuleman@broadcom.com, linville@tuxdriver.com,
pieterpg@broadcom.com, dekim@broadcom.com,
mcgrof@do-not-panic.com, antonio@open-mesh.com,
johannes.berg@intel.com
Cc: linux-wireless@vger.kernel.org, brcm80211-dev-list@broadcom.com,
netdev@vger.kernel.org, linux-kernel@vger.kernel.org,
linux-mmc@vger.kernel.org, Russell King <linux@arm.linux.org.uk>
Subject: Re: [PATCH] brcmfmac: prevent watchdog from interfering with scanning and connecting
Date: Mon, 16 Jun 2014 10:15:24 +0200 [thread overview]
Message-ID: <539EA79C.7010206@broadcom.com> (raw)
In-Reply-To: <539E8559.3010601@linux.intel.com>
On 16-06-14 07:49, Fu, Zhonghui wrote:
> From 14485894add32aedacb3e486ebb2cc2b73861abf Mon Sep 17 00:00:00 2001
> From: Fu zhonghui <zhonghui.fu@linux.intel.com>
> Date: Wed, 11 Jun 2014 11:06:55 +0800
> Subject: [PATCH] brcmfmac: prevent watchdog from interfering with scanning and connecting
>
> Watchdog in brcmfmac driver may make WiFi chip enter sleep mode
> before completion of scanning or connecting.
>
> This will lead to scanning or connecting failure.
>
> Increasing temporarily idle-time threshold during scanning or
> connecting can ensure scanning or connecting success without
> watchdog interference.
Are you sure you are not having runtime PM enabled. That could be your
problem as the host controller code disables sdio irqs. Please see this
thread [1]. For our device runtime pm should not be enabled, but I am
not sure if that is taken into account in mmc_attach_sdio() (see code
below).
Gr. AvS
[1] http://www.spinics.net/lists/linux-mmc/msg25978.html
--8<----------------------------------------------------------------
/*
* Enable runtime PM only if supported by host+card+board
*/
if (host->caps & MMC_CAP_POWER_OFF_CARD) {
/*
* Let runtime PM core know our card is active
*/
err = pm_runtime_set_active(&card->dev);
if (err)
goto remove;
/*
* Enable runtime PM for this card
*/
pm_runtime_enable(&card->dev);
}
> Signed-off-by: Fu zhonghui <zhonghui.fu@linux.intel.com>
> ---
> drivers/net/wireless/brcm80211/brcmfmac/dhd_sdio.c | 18 ++++++++++++++++--
> .../net/wireless/brcm80211/brcmfmac/wl_cfg80211.c | 3 ++-
> 2 files changed, 18 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/net/wireless/brcm80211/brcmfmac/dhd_sdio.c b/drivers/net/wireless/brcm80211/brcmfmac/dhd_sdio.c
> index 13c89a0..729deab 100644
> --- a/drivers/net/wireless/brcm80211/brcmfmac/dhd_sdio.c
> +++ b/drivers/net/wireless/brcm80211/brcmfmac/dhd_sdio.c
> @@ -34,6 +34,7 @@
> #include <linux/vmalloc.h>
> #include <linux/platform_data/brcmfmac-sdio.h>
> #include <linux/moduleparam.h>
> +#include <net/cfg80211.h>
> #include <asm/unaligned.h>
> #include <defs.h>
> #include <brcmu_wifi.h>
> @@ -43,6 +44,10 @@
> #include "sdio_host.h"
> #include "chip.h"
> #include "nvram.h"
> +#include "dhd.h"
> +#include "fwil_types.h"
> +#include "p2p.h"
> +#include "wl_cfg80211.h"
>
> #define DCMD_RESP_TIMEOUT 2000 /* In milli second */
>
> @@ -307,6 +312,7 @@ struct rte_console {
> * when idle
> */
> #define BRCMF_IDLE_INTERVAL 1
> +#define BRCMF_IDLE_INTERVAL_SCANNING_CONNECTING 100
>
> #define KSO_WAIT_US 50
> #define MAX_KSO_ATTEMPTS (PMU_MAX_TRANSITION_DLY/KSO_WAIT_US)
> @@ -3613,9 +3619,9 @@ void brcmf_sdio_isr(struct brcmf_sdio *bus)
>
> static bool brcmf_sdio_bus_watchdog(struct brcmf_sdio *bus)
> {
> -#ifdef DEBUG
> struct brcmf_bus *bus_if = dev_get_drvdata(bus->sdiodev->dev);
> -#endif /* DEBUG */
> + struct brcmf_cfg80211_info *cfg = bus_if->drvr->config;
> + struct brcmf_if *ifp = cfg->pub->iflist[0];
>
> brcmf_dbg(TIMER, "Enter\n");
>
> @@ -3678,6 +3684,14 @@ static bool brcmf_sdio_bus_watchdog(struct brcmf_sdio *bus)
>
> /* On idle timeout clear activity flag and/or turn off clock */
> if ((bus->idletime > 0) && (bus->clkstate == CLK_AVAIL)) {
> +
> + if (test_bit(BRCMF_SCAN_STATUS_BUSY, &cfg->scan_status) ||
> + test_bit(BRCMF_VIF_STATUS_CONNECTING, &ifp->vif->sme_state)) {
> + bus->idletime = BRCMF_IDLE_INTERVAL_SCANNING_CONNECTING;
> + } else {
> + bus->idletime = BRCMF_IDLE_INTERVAL;
> + }
> +
> if (++bus->idlecount >= bus->idletime) {
> bus->idlecount = 0;
> if (bus->activity) {
> diff --git a/drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.c b/drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.c
> index be19852..e76517e 100644
> --- a/drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.c
> +++ b/drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.c
> @@ -913,6 +913,8 @@ brcmf_cfg80211_escan(struct wiphy *wiphy, struct brcmf_cfg80211_vif *vif,
> return -EAGAIN;
> }
>
> + set_bit(BRCMF_SCAN_STATUS_BUSY, &cfg->scan_status);
> +
> /* If scan req comes for p2p0, send it over primary I/F */
> if (vif == cfg->p2p.bss_idx[P2PAPI_BSSCFG_DEVICE].vif)
> vif = cfg->p2p.bss_idx[P2PAPI_BSSCFG_PRIMARY].vif;
> @@ -933,7 +935,6 @@ brcmf_cfg80211_escan(struct wiphy *wiphy, struct brcmf_cfg80211_vif *vif,
> }
>
> cfg->scan_request = request;
> - set_bit(BRCMF_SCAN_STATUS_BUSY, &cfg->scan_status);
> if (escan_req) {
> cfg->escan_info.run = brcmf_run_escan;
> err = brcmf_p2p_scan_prep(wiphy, request, vif);
> -- 1.7.1
>
WARNING: multiple messages have this Message-ID (diff)
From: Arend van Spriel <arend@broadcom.com>
To: "Fu, Zhonghui" <zhonghui.fu@linux.intel.com>,
<brudley@broadcom.com>, Franky Lin <frankyl@broadcom.com>,
<meuleman@broadcom.com>, <linville@tuxdriver.com>,
<pieterpg@broadcom.com>, <dekim@broadcom.com>,
<mcgrof@do-not-panic.com>, <antonio@open-mesh.com>,
<johannes.berg@intel.com>
Cc: <linux-wireless@vger.kernel.org>,
<brcm80211-dev-list@broadcom.com>, <netdev@vger.kernel.org>,
<linux-kernel@vger.kernel.org>, <linux-mmc@vger.kernel.org>,
Russell King <linux@arm.linux.org.uk>
Subject: Re: [PATCH] brcmfmac: prevent watchdog from interfering with scanning and connecting
Date: Mon, 16 Jun 2014 10:15:24 +0200 [thread overview]
Message-ID: <539EA79C.7010206@broadcom.com> (raw)
In-Reply-To: <539E8559.3010601@linux.intel.com>
On 16-06-14 07:49, Fu, Zhonghui wrote:
> From 14485894add32aedacb3e486ebb2cc2b73861abf Mon Sep 17 00:00:00 2001
> From: Fu zhonghui <zhonghui.fu@linux.intel.com>
> Date: Wed, 11 Jun 2014 11:06:55 +0800
> Subject: [PATCH] brcmfmac: prevent watchdog from interfering with scanning and connecting
>
> Watchdog in brcmfmac driver may make WiFi chip enter sleep mode
> before completion of scanning or connecting.
>
> This will lead to scanning or connecting failure.
>
> Increasing temporarily idle-time threshold during scanning or
> connecting can ensure scanning or connecting success without
> watchdog interference.
Are you sure you are not having runtime PM enabled. That could be your
problem as the host controller code disables sdio irqs. Please see this
thread [1]. For our device runtime pm should not be enabled, but I am
not sure if that is taken into account in mmc_attach_sdio() (see code
below).
Gr. AvS
[1] http://www.spinics.net/lists/linux-mmc/msg25978.html
--8<----------------------------------------------------------------
/*
* Enable runtime PM only if supported by host+card+board
*/
if (host->caps & MMC_CAP_POWER_OFF_CARD) {
/*
* Let runtime PM core know our card is active
*/
err = pm_runtime_set_active(&card->dev);
if (err)
goto remove;
/*
* Enable runtime PM for this card
*/
pm_runtime_enable(&card->dev);
}
> Signed-off-by: Fu zhonghui <zhonghui.fu@linux.intel.com>
> ---
> drivers/net/wireless/brcm80211/brcmfmac/dhd_sdio.c | 18 ++++++++++++++++--
> .../net/wireless/brcm80211/brcmfmac/wl_cfg80211.c | 3 ++-
> 2 files changed, 18 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/net/wireless/brcm80211/brcmfmac/dhd_sdio.c b/drivers/net/wireless/brcm80211/brcmfmac/dhd_sdio.c
> index 13c89a0..729deab 100644
> --- a/drivers/net/wireless/brcm80211/brcmfmac/dhd_sdio.c
> +++ b/drivers/net/wireless/brcm80211/brcmfmac/dhd_sdio.c
> @@ -34,6 +34,7 @@
> #include <linux/vmalloc.h>
> #include <linux/platform_data/brcmfmac-sdio.h>
> #include <linux/moduleparam.h>
> +#include <net/cfg80211.h>
> #include <asm/unaligned.h>
> #include <defs.h>
> #include <brcmu_wifi.h>
> @@ -43,6 +44,10 @@
> #include "sdio_host.h"
> #include "chip.h"
> #include "nvram.h"
> +#include "dhd.h"
> +#include "fwil_types.h"
> +#include "p2p.h"
> +#include "wl_cfg80211.h"
>
> #define DCMD_RESP_TIMEOUT 2000 /* In milli second */
>
> @@ -307,6 +312,7 @@ struct rte_console {
> * when idle
> */
> #define BRCMF_IDLE_INTERVAL 1
> +#define BRCMF_IDLE_INTERVAL_SCANNING_CONNECTING 100
>
> #define KSO_WAIT_US 50
> #define MAX_KSO_ATTEMPTS (PMU_MAX_TRANSITION_DLY/KSO_WAIT_US)
> @@ -3613,9 +3619,9 @@ void brcmf_sdio_isr(struct brcmf_sdio *bus)
>
> static bool brcmf_sdio_bus_watchdog(struct brcmf_sdio *bus)
> {
> -#ifdef DEBUG
> struct brcmf_bus *bus_if = dev_get_drvdata(bus->sdiodev->dev);
> -#endif /* DEBUG */
> + struct brcmf_cfg80211_info *cfg = bus_if->drvr->config;
> + struct brcmf_if *ifp = cfg->pub->iflist[0];
>
> brcmf_dbg(TIMER, "Enter\n");
>
> @@ -3678,6 +3684,14 @@ static bool brcmf_sdio_bus_watchdog(struct brcmf_sdio *bus)
>
> /* On idle timeout clear activity flag and/or turn off clock */
> if ((bus->idletime > 0) && (bus->clkstate == CLK_AVAIL)) {
> +
> + if (test_bit(BRCMF_SCAN_STATUS_BUSY, &cfg->scan_status) ||
> + test_bit(BRCMF_VIF_STATUS_CONNECTING, &ifp->vif->sme_state)) {
> + bus->idletime = BRCMF_IDLE_INTERVAL_SCANNING_CONNECTING;
> + } else {
> + bus->idletime = BRCMF_IDLE_INTERVAL;
> + }
> +
> if (++bus->idlecount >= bus->idletime) {
> bus->idlecount = 0;
> if (bus->activity) {
> diff --git a/drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.c b/drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.c
> index be19852..e76517e 100644
> --- a/drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.c
> +++ b/drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.c
> @@ -913,6 +913,8 @@ brcmf_cfg80211_escan(struct wiphy *wiphy, struct brcmf_cfg80211_vif *vif,
> return -EAGAIN;
> }
>
> + set_bit(BRCMF_SCAN_STATUS_BUSY, &cfg->scan_status);
> +
> /* If scan req comes for p2p0, send it over primary I/F */
> if (vif == cfg->p2p.bss_idx[P2PAPI_BSSCFG_DEVICE].vif)
> vif = cfg->p2p.bss_idx[P2PAPI_BSSCFG_PRIMARY].vif;
> @@ -933,7 +935,6 @@ brcmf_cfg80211_escan(struct wiphy *wiphy, struct brcmf_cfg80211_vif *vif,
> }
>
> cfg->scan_request = request;
> - set_bit(BRCMF_SCAN_STATUS_BUSY, &cfg->scan_status);
> if (escan_req) {
> cfg->escan_info.run = brcmf_run_escan;
> err = brcmf_p2p_scan_prep(wiphy, request, vif);
> -- 1.7.1
>
next prev parent reply other threads:[~2014-06-16 8:15 UTC|newest]
Thread overview: 20+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-06-16 5:49 [PATCH] brcmfmac: prevent watchdog from interfering with scanning and connecting Fu, Zhonghui
2014-06-16 5:49 ` Fu, Zhonghui
2014-06-16 8:15 ` Arend van Spriel [this message]
2014-06-16 8:15 ` Arend van Spriel
2014-06-19 16:28 ` Fu, Zhonghui
2014-06-19 16:37 ` Arend van Spriel
2014-06-19 16:37 ` Arend van Spriel
2014-07-21 7:42 ` Fu, Zhonghui
2014-07-24 15:22 ` Fu, Zhonghui
2014-08-04 16:36 ` Fu, Zhonghui
2014-08-04 16:52 ` Russell King - ARM Linux
2014-08-04 20:12 ` Arend van Spriel
2014-08-04 20:12 ` Arend van Spriel
[not found] ` <53DFE933.2080805-dY08KVG/lbpWk0Htik3J/w@public.gmane.org>
2014-08-05 5:42 ` Fu, Zhonghui
2014-08-05 5:42 ` Fu, Zhonghui
2014-08-05 5:38 ` Fu, Zhonghui
2014-08-04 17:29 ` Arend van Spriel
2014-08-04 17:29 ` Arend van Spriel
2014-08-04 16:47 ` Russell King - ARM Linux
-- strict thread matches above, loose matches on Subject: below --
2014-06-11 3:52 Fu, Zhonghui
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=539EA79C.7010206@broadcom.com \
--to=arend@broadcom.com \
--cc=antonio@open-mesh.com \
--cc=brcm80211-dev-list@broadcom.com \
--cc=brudley@broadcom.com \
--cc=dekim@broadcom.com \
--cc=frankyl@broadcom.com \
--cc=johannes.berg@intel.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mmc@vger.kernel.org \
--cc=linux-wireless@vger.kernel.org \
--cc=linux@arm.linux.org.uk \
--cc=linville@tuxdriver.com \
--cc=mcgrof@do-not-panic.com \
--cc=meuleman@broadcom.com \
--cc=netdev@vger.kernel.org \
--cc=pieterpg@broadcom.com \
--cc=zhonghui.fu@linux.intel.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.