brcmfmac: prevent watchdog from interfering with scanning and connecting
PATCH 1/1 brcmfmac: prevent watchdog from interfering with scanning and connecting
Quoted 1 line
From
14485894add32aedacb3e486ebb2cc2b73861abfMon Sep 17 00:00:00 2001
From: Fu zhonghui <zhonghui.fu-VuQAYsv1563Yd54FQh9/[email protected]>
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.
--- drivers/net/wireless/brcm80211/brcmfmac/dhd_sdio.c | 18 ++++++++++++++++-- .../net/wireless/brcm80211/brcmfmac/wl_cfg80211.c | 3 ++- 2 files changed, 18 insertions(+), 3 deletions(-)
drivers/net/wireless/brcm80211/brcmfmac/dhd_sdio.c +16 -2
@@ -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) {
drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.c +2 -1
@@ -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
--
To unsubscribe from this list: send the line "unsubscribe linux-wireless" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
Quoted 5 lines · Zhonghui
From
14485894add32aedacb3e486ebb2cc2b73861abfMon Sep 17 00:00:00 2001
From: Fu zhonghui <[email protected]>
Date: Wed, 11 Jun 2014 11:06:55 +0800
Subject: [PATCH] brcmfmac: prevent watchdog from interfering with scanning and connecting
Quoted 8 lines
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);
}Quoted 87 lines
Signed-off-by Fu zhonghui <[email protected]>--- drivers/net/wireless/brcm80211/brcmfmac/dhd_sdio.c | 18 ++++++++++++++++-- .../net/wireless/brcm80211/brcmfmac/wl_cfg80211.c | 3 ++- 2 files changed, 18 insertions(+), 3 deletions(-)drivers/net/wireless/brcm80211/brcmfmac/dhd_sdio.c +16
-2@@ -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) {drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.c +2
-2@@ -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
Quoted 9 lines · Arend van Spriel
Quoted 8 lines · Zhonghui
From
14485894add32aedacb3e486ebb2cc2b73861abfMon Sep 17 00:00:00 2001
From: Fu zhonghui <[email protected]>
Date: Wed, 11 Jun 2014 11:06:55 +0800
Subject: [PATCH] brcmfmac: prevent watchdog from interfering with scanning and connectingWatchdog in brcmfmac driver may make WiFi chip enter sleep mode before completion of scanning or connecting.
Quoted 7 lines
Quoted 5 lines
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).
I have tried brcmfmac driver with "CONFIG_PM_RUNTIME is not set", and scanning and connecting always succeeded. This means that CONFIG_PM_RUNTIME should not be set if we use SDIO WiFi device driven by brcmfmac driver, right?
Thanks,
Zhonghui
Quoted 117 lines
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); }Quoted 87 lines
Signed-off-by Fu zhonghui <[email protected]>--- drivers/net/wireless/brcm80211/brcmfmac/dhd_sdio.c | 18 ++++++++++++++++-- .../net/wireless/brcm80211/brcmfmac/wl_cfg80211.c | 3 ++- 2 files changed, 18 insertions(+), 3 deletions(-)drivers/net/wireless/brcm80211/brcmfmac/dhd_sdio.c +16
-2@@ -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) {drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.c +2
-2@@ -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.1Signature · 4 lines
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
Quoted 11 lines · Zhonghui
Quoted 9 lines · Arend van Spriel
Quoted 8 lines · Zhonghui
From
14485894add32aedacb3e486ebb2cc2b73861abfMon Sep 17 00:00:00 2001
From: Fu zhonghui <[email protected]>
Date: Wed, 11 Jun 2014 11:06:55 +0800
Subject: [PATCH] brcmfmac: prevent watchdog from interfering with scanning and connectingWatchdog in brcmfmac driver may make WiFi chip enter sleep mode before completion of scanning or connecting.
Quoted 8 lines
Quoted 7 lines
Quoted 5 lines
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).I have tried brcmfmac driver with "
CONFIG_PM_RUNTIMEis not set", and scanning and connecting always succeeded. This means thatCONFIG_PM_RUNTIMEshould not be set if we use SDIO WiFi device driven by brcmfmac driver, right?
Depends which kernel you are using. In 3.16-rc1 the sdio interrupt issue has been fixed so you should be fine to use CONFIG_PM_RUNTIME. Here is the commit
commit be138554a7923658ded799b0e8794d9c1d08a6e5
Author: Russell King <[email protected]> Date: Fri Apr 25 12:55:56 2014 +0100
mmc: sdhci: allow sdio interrupts while sdhci runtime suspended
Regards,
Arend
Quoted 120 lines
Thanks,
ZhonghuiQuoted 117 lines
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); }Quoted 79 lines
Signed-off-by Fu zhonghui <[email protected]>--- drivers/net/wireless/brcm80211/brcmfmac/dhd_sdio.c | 18 ++++++++++++++++-- .../net/wireless/brcm80211/brcmfmac/wl_cfg80211.c | 3 ++- 2 files changed, 18 insertions(+), 3 deletions(-)drivers/net/wireless/brcm80211/brcmfmac/dhd_sdio.c +16
-2@@ -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) {drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.c +2
-0@@ -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;drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.c brcmf_cfg80211_escan(struct wiphy *wiphy, struct brcmf_cfg80211_vif *vif,
Quoted 8 lines
drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.c +0
-2@@ -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--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
Quoted 14 lines · Arend van Spriel
Quoted 13 lines · Zhonghui
Quoted 11 lines · Arend van Spriel
Quoted 10 lines · Zhonghui
From
14485894add32aedacb3e486ebb2cc2b73861abfMon Sep 17 00:00:00 2001
From: Fu zhonghui <[email protected]>
Date: Wed, 11 Jun 2014 11:06:55 +0800
Subject: [PATCH] brcmfmac: prevent watchdog from interfering with scanning and connectingWatchdog in brcmfmac driver may make WiFi chip enter sleep mode before completion of scanning or connecting.
This will lead to scanning or connecting failure.
Quoted 8 lines
Quoted 6 lines
Quoted 5 lines
Quoted 3 lines
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).I have tried brcmfmac driver with "
CONFIG_PM_RUNTIMEis not set", and scanning and connecting always succeeded. This means thatCONFIG_PM_RUNTIMEshould not be set if we use SDIO WiFi device driven by brcmfmac driver, right?Depends which kernel you are using. In 3.16-rc1 the sdio interrupt issue has been fixed so you should be fine to use
CONFIG_PM_RUNTIME. Here is the commit
I run 3.16-rc4 and 3.16-rc5 kernel with CONFIG_PM_RUNTIME set, the issue still exists as follows:
1 step: modprobe brcmfmac
2 step: iwlist wlan1 scan get scanning result successfully.
3 step: wait a while, no any operation
4 step: iwlist wlan1 scan scanning timeout, can't get scanning result.
Thanks,
Zhonghui
Quoted 136 lines
commit
be138554a7923658ded799b0e8794d9c1d08a6e5Author: Russell King <[email protected]> Date: Fri Apr 25 12:55:56 2014 +0100mmc: sdhci: allow sdio interrupts while sdhci runtime suspended
Regards,
ArendQuoted 120 lines
Thanks,
ZhonghuiQuoted 117 lines
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); }Quoted 87 lines
Signed-off-by Fu zhonghui <[email protected]>--- drivers/net/wireless/brcm80211/brcmfmac/dhd_sdio.c | 18 ++++++++++++++++-- .../net/wireless/brcm80211/brcmfmac/wl_cfg80211.c | 3 ++- 2 files changed, 18 insertions(+), 3 deletions(-)drivers/net/wireless/brcm80211/brcmfmac/dhd_sdio.c +16
-2@@ -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) {drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.c +2
-2@@ -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.1Signature · 4 lines
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/Signature · 4 lines
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
Quoted 12 lines · Zhonghui
Quoted 11 lines · Arend van Spriel
Quoted 10 lines · Zhonghui
Quoted 9 lines · Arend van Spriel
Quoted 8 lines · Zhonghui
From
14485894add32aedacb3e486ebb2cc2b73861abfMon Sep 17 00:00:00 2001
From: Fu zhonghui <[email protected]>
Date: Wed, 11 Jun 2014 11:06:55 +0800
Subject: [PATCH] brcmfmac: prevent watchdog from interfering with scanning and connectingWatchdog in brcmfmac driver may make WiFi chip enter sleep mode before completion of scanning or connecting.
Quoted 8 lines
Quoted 8 lines
Quoted 7 lines
Quoted 6 lines
Quoted 5 lines
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).I have tried brcmfmac driver with "
CONFIG_PM_RUNTIMEis not set", and scanning and connecting always succeeded. This means thatCONFIG_PM_RUNTIMEshould not be set if we use SDIO WiFi device driven by brcmfmac driver, right?Depends which kernel you are using. In 3.16-rc1 the sdio interrupt issue has been fixed so you should be fine to use
CONFIG_PM_RUNTIME. Here is the commit
Any clues or comments to the following issue?
Quoted 142 lines
I run 3.16-rc4 and 3.16-rc5 kernel with
CONFIG_PM_RUNTIMEset, the issue still exists as follows:1 step: modprobe brcmfmac
2 step: iwlist wlan1 scan get scanning result successfully.
3 step: wait a while, no any operation
4 step: iwlist wlan1 scan scanning timeout, can't get scanning result.Thanks,
ZhonghuiQuoted 131 lines
commit
be138554a7923658ded799b0e8794d9c1d08a6e5Author: Russell King <[email protected]> Date: Fri Apr 25 12:55:56 2014 +0100mmc: sdhci: allow sdio interrupts while sdhci runtime suspended
Regards,
ArendQuoted 117 lines
Thanks,
ZhonghuiQuoted 115 lines
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); }Quoted 87 lines
Signed-off-by Fu zhonghui <[email protected]>--- drivers/net/wireless/brcm80211/brcmfmac/dhd_sdio.c | 18 ++++++++++++++++-- .../net/wireless/brcm80211/brcmfmac/wl_cfg80211.c | 3 ++- 2 files changed, 18 insertions(+), 3 deletions(-)drivers/net/wireless/brcm80211/brcmfmac/dhd_sdio.c +16
-2@@ -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) {drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.c +2
-2@@ -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.1Signature · 4 lines
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/Signature · 4 lines
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
Quoted 13 lines · Zhonghui
Quoted 12 lines · Zhonghui
Quoted 11 lines · Arend van Spriel
Quoted 10 lines · Zhonghui
Quoted 9 lines · Arend van Spriel
Quoted 8 lines · Zhonghui
From
14485894add32aedacb3e486ebb2cc2b73861abfMon Sep 17 00:00:00 2001
From: Fu zhonghui <[email protected]>
Date: Wed, 11 Jun 2014 11:06:55 +0800
Subject: [PATCH] brcmfmac: prevent watchdog from interfering with scanning and connectingWatchdog in brcmfmac driver may make WiFi chip enter sleep mode before completion of scanning or connecting.
Quoted 8 lines
Quoted 8 lines
Quoted 8 lines
Quoted 7 lines
Quoted 6 lines
Quoted 5 lines
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).I have tried brcmfmac driver with "
CONFIG_PM_RUNTIMEis not set", and scanning and connecting always succeeded. This means thatCONFIG_PM_RUNTIMEshould not be set if we use SDIO WiFi device driven by brcmfmac driver, right?Depends which kernel you are using. In 3.16-rc1 the sdio interrupt issue has been fixed so you should be fine to use
CONFIG_PM_RUNTIME. Here is the commit
Hi, Arend
I investigated this issue, and its root cause is still that sdio controller can't receive interrupts from WiFi chip on sdio bus when sdio controller is in runtime suspend status. I am running 3.16-rc5 linux kernel on ASUS T100TA tablet, and using sdhci-acpi driver.
Thanks,
Zhonghui
Quoted 143 lines
Any clues or comments to the following issue?
Quoted 142 lines
I run 3.16-rc4 and 3.16-rc5 kernel with
CONFIG_PM_RUNTIMEset, the issue still exists as follows:1 step: modprobe brcmfmac
2 step: iwlist wlan1 scan get scanning result successfully.
3 step: wait a while, no any operation
4 step: iwlist wlan1 scan scanning timeout, can't get scanning result.Thanks,
ZhonghuiQuoted 131 lines
commit
be138554a7923658ded799b0e8794d9c1d08a6e5Author: Russell King <[email protected]> Date: Fri Apr 25 12:55:56 2014 +0100mmc: sdhci: allow sdio interrupts while sdhci runtime suspended
Regards,
ArendQuoted 117 lines
Thanks,
ZhonghuiQuoted 115 lines
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); }Quoted 87 lines
Signed-off-by Fu zhonghui <[email protected]>--- drivers/net/wireless/brcm80211/brcmfmac/dhd_sdio.c | 18 ++++++++++++++++-- .../net/wireless/brcm80211/brcmfmac/wl_cfg80211.c | 3 ++- 2 files changed, 18 insertions(+), 3 deletions(-)drivers/net/wireless/brcm80211/brcmfmac/dhd_sdio.c +16
-2@@ -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) {drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.c +2
-2@@ -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.1Signature · 4 lines
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/Signature · 4 lines
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
Quoted 6 lines · Zhonghui
Hi, Arend
I investigated this issue, and its root cause is still that sdio controller can't receive interrupts from WiFi chip on sdio bus when sdio controller is in runtime suspend status. I am running 3.16-rc5 linux kernel on ASUS T100TA tablet, and using sdhci-acpi driver.
That's the root cause. I fixed this with the Freescale i.MX SD driver which is now able to report pending SDIO interrupts while runtime PM suspended.
Other host drivers probably need fixing too, or having runtime PM disabled on them - if you can't receive SDIO interrupts while runtime PM suspended, then entering runtime PM while you have a SDIO device attached is a bug.
This is something for the MMC people to deal with rather than Arend.
Signature · 2 lines
FTTC broadband for 0.8mile line: currently at 9.5Mbps down 400kbps up according to speedtest.net.
Quoted 12 lines · Russell King - ARM Linux
Quoted 6 lines · Zhonghui
Hi, Arend
I investigated this issue, and its root cause is still that sdio controller can't receive interrupts from WiFi chip on sdio bus when sdio controller is in runtime suspend status. I am running 3.16-rc5 linux kernel on ASUS T100TA tablet, and using sdhci-acpi driver.
That's the root cause. I fixed this with the Freescale i.MX SD driver which is now able to report pending SDIO interrupts while runtime PM suspended.
Quoted 6 lines
Other host drivers probably need fixing too, or having runtime PM disabled on them - if you can't receive SDIO interrupts while runtime PM suspended, then entering runtime PM while you have a SDIO device attached is a bug.
This is something for the MMC people to deal with rather than Arend.
Occasionally, the itch is there to fix mmc code, but this looks a bit tricky. The fun starts in sdio.c:mmc_attach_sdio():
/*
* 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);
}The comment above the if statement seems to be stating the right idea, but the code only looks at the host controller capability flags.
Regards,
Arend
Quoted 39 lines · Arend van Spriel
Quoted 12 lines · Russell King - ARM Linux
Quoted 6 lines · Zhonghui
Hi, Arend
I investigated this issue, and its root cause is still that sdio controller can't receive interrupts from WiFi chip on sdio bus when sdio controller is in runtime suspend status. I am running 3.16-rc5 linux kernel on ASUS T100TA tablet, and using sdhci-acpi driver.
That's the root cause. I fixed this with the Freescale i.MX SD driver which is now able to report pending SDIO interrupts while runtime PM suspended.
Quoted 6 lines
Other host drivers probably need fixing too, or having runtime PM disabled on them - if you can't receive SDIO interrupts while runtime PM suspended, then entering runtime PM while you have a SDIO device attached is a bug.
This is something for the MMC people to deal with rather than Arend.
Occasionally, the itch is there to fix mmc code, but this looks a bit tricky. The fun starts in sdio.c:mmc_attach_sdio():
/* * 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); }
Quoted 1 line
The comment above the if statement seems to be stating the right idea, but the code only looks at the host controller capability flags.
Yes, this code section is not implemented as its comments.
Thanks,
Zhonghui
Quoted 9 lines
Regards,
ArendSignature · 4 lines
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
--
To unsubscribe from this list: send the line "unsubscribe linux-wireless" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
Quoted 11 lines · Russell King - ARM Linux
Quoted 6 lines · Zhonghui
Hi, Arend
I investigated this issue, and its root cause is still that sdio controller can't receive interrupts from WiFi chip on sdio bus when sdio controller is in runtime suspend status. I am running 3.16-rc5 linux kernel on ASUS T100TA tablet, and using sdhci-acpi driver.
That's the root cause. I fixed this with the Freescale i.MX SD driver which is now able to report pending SDIO interrupts while runtime PM suspended.
Quoted 7 lines
Other host drivers probably need fixing too, or having runtime PM disabled on them - if you can't receive SDIO interrupts while runtime PM suspended, then entering runtime PM while you have a SDIO device attached is a bug.
This is something for the MMC people to deal with rather than Arend.
Yes, this should be sdhci-acpi bug, I will contact MMC people for this issue.
Thanks,
Zhonghui
Quoted 20 lines · Zhonghui
Quoted 18 lines · Zhonghui
Quoted 17 lines · Zhonghui
Quoted 16 lines · Arend van Spriel
Quoted 15 lines · Zhonghui
Quoted 14 lines · Arend van Spriel
Quoted 13 lines · Zhonghui
From 14485894add32aedacb3e486ebb2cc2b73861abf Mon Sep 17 00:00:00 2001From: Fu zhonghui<[email protected]>
Date: Wed, 11 Jun 2014 11:06:55 +0800
Subject: [PATCH] brcmfmac: prevent watchdog from interfering with scanning and connectingWatchdog 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.
Quoted 7 lines
Quoted 3 lines
Quoted 3 lines
Quoted 3 lines
Quoted 2 lines
Quoted 1 line
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).I have tried brcmfmac driver with "
CONFIG_PM_RUNTIMEis not set", and scanning and connecting always succeeded. This means thatCONFIG_PM_RUNTIMEshould not be set if we use SDIO WiFi device driven by brcmfmac driver, right?Depends which kernel you are using. In 3.16-rc1 the sdio interrupt issue has been fixed so you should be fine to use
CONFIG_PM_RUNTIME. Here is the commitHi, Arend
I investigated this issue, and its root cause is still that sdio controller can't receive interrupts from WiFi chip on sdio bus when sdio controller is in runtime suspend status. I am running 3.16-rc5 linux kernel on ASUS T100TA tablet, and using sdhci-acpi driver.
Thanks, Zhonghui
Given that the patches Russell made were covering sdhci (as far as I recall) your issue may be specific to the sdhci-acpi driver. In sdhci_acpi_probe() it is enabled by use_runtime_pm field in private data:
c->use_runtime_pm = sdhci_acpi_flag(c, SDHCI_ACPI_RUNTIME_PM);
Regards,
Arend
Quoted 146 lines
Thanks,
ZhonghuiQuoted 143 lines
Any clues or comments to the following issue?
Quoted 142 lines
I run 3.16-rc4 and 3.16-rc5 kernel with
CONFIG_PM_RUNTIMEset, the issue still exists as follows:1 step: modprobe brcmfmac
2 step: iwlist wlan1 scan get scanning result successfully.
3 step: wait a while, no any operation
4 step: iwlist wlan1 scan scanning timeout, can't get scanning result.Thanks,
ZhonghuiQuoted 131 lines
commit
be138554a7923658ded799b0e8794d9c1d08a6e5Author: Russell King<[email protected]> Date: Fri Apr 25 12:55:56 2014 +0100mmc: sdhci: allow sdio interrupts while sdhci runtime suspended
Regards,
ArendQuoted 117 lines
Thanks,
ZhonghuiQuoted 115 lines
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); }Quoted 79 lines
Signed-off-by Fu zhonghui<[email protected]>--- drivers/net/wireless/brcm80211/brcmfmac/dhd_sdio.c | 18 ++++++++++++++++-- .../net/wireless/brcm80211/brcmfmac/wl_cfg80211.c | 3 ++- 2 files changed, 18 insertions(+), 3 deletions(-)drivers/net/wireless/brcm80211/brcmfmac/dhd_sdio.c +16
-2@@ -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) {drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.c +2
-0@@ -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;drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.c brcmf_cfg80211_escan(struct wiphy *wiphy, struct brcmf_cfg80211_vif *vif,
Quoted 8 lines
drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.c +0
-2@@ -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--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
Quoted 6 lines · Arend van Spriel
Quoted 1 line · Zhonghui
I have tried brcmfmac driver with "
CONFIG_PM_RUNTIMEis not set", and scanning and connecting always succeeded. This means thatCONFIG_PM_RUNTIMEshould not be set if we use SDIO WiFi device driven by brcmfmac driver, right?Depends which kernel you are using. In 3.16-rc1 the sdio interrupt issue has been fixed so you should be fine to use
CONFIG_PM_RUNTIME. Here is the commit
I have to say that scanning with the 4329 device seems utterly useless, whereas 4330 works fine. Apart from the broadcom chip, the rest of the hardware is identical.
Signature · 2 lines
FTTC broadband for 0.8mile line: currently at 9.5Mbps down 400kbps up according to speedtest.net.