From 76806d20c0c719703f50903bb2d69c15a37cf5d7 Mon Sep 17 00:00:00 2001 From: Dmitry Shmidt Date: Sun, 9 Oct 2011 02:33:11 +0100 Subject: net: wireless: bcmdhd: Set bigger wakelock timeout for events Signed-off-by: Dmitry Shmidt --- drivers/net/wireless/bcmdhd/dhd.h | 7 ++++--- drivers/net/wireless/bcmdhd/dhd_linux.c | 16 ++++++++++------ drivers/net/wireless/bcmdhd/wl_cfg80211.c | 6 +++++- drivers/net/wireless/bcmdhd/wl_iw.c | 4 +--- drivers/net/wireless/bcmdhd/wl_iw.h | 2 +- drivers/net/wireless/bcmdhd/wldev_common.h | 2 +- 6 files changed, 22 insertions(+), 15 deletions(-) diff --git a/drivers/net/wireless/bcmdhd/dhd.h b/drivers/net/wireless/bcmdhd/dhd.h index 454213b25e4..735d39b5526 100644 --- a/drivers/net/wireless/bcmdhd/dhd.h +++ b/drivers/net/wireless/bcmdhd/dhd.h @@ -269,7 +269,7 @@ void dhd_os_spin_unlock(dhd_pub_t *pub, unsigned long flags); extern int dhd_os_wake_lock(dhd_pub_t *pub); extern int dhd_os_wake_unlock(dhd_pub_t *pub); extern int dhd_os_wake_lock_timeout(dhd_pub_t *pub); -extern int dhd_os_wake_lock_timeout_enable(dhd_pub_t *pub); +extern int dhd_os_wake_lock_timeout_enable(dhd_pub_t *pub, int val); inline static void MUTEX_LOCK_SOFTAP_SET_INIT(dhd_pub_t * dhdp) { @@ -295,8 +295,9 @@ inline static void MUTEX_UNLOCK_SOFTAP_SET(dhd_pub_t * dhdp) #define DHD_OS_WAKE_LOCK(pub) dhd_os_wake_lock(pub) #define DHD_OS_WAKE_UNLOCK(pub) dhd_os_wake_unlock(pub) #define DHD_OS_WAKE_LOCK_TIMEOUT(pub) dhd_os_wake_lock_timeout(pub) -#define DHD_OS_WAKE_LOCK_TIMEOUT_ENABLE(pub) dhd_os_wake_lock_timeout_enable(pub) - +#define DHD_OS_WAKE_LOCK_TIMEOUT_ENABLE(pub, val) dhd_os_wake_lock_timeout_enable(pub, val) +#define DHD_PACKET_TIMEOUT 1 +#define DHD_EVENT_TIMEOUT 2 /* interface operations (register, remove) should be atomic, use this lock to prevent race * condition among wifi on/off and interface operation functions diff --git a/drivers/net/wireless/bcmdhd/dhd_linux.c b/drivers/net/wireless/bcmdhd/dhd_linux.c index d869be4ef07..569bd7fda7a 100644 --- a/drivers/net/wireless/bcmdhd/dhd_linux.c +++ b/drivers/net/wireless/bcmdhd/dhd_linux.c @@ -1393,6 +1393,7 @@ dhd_rx_frame(dhd_pub_t *dhdp, int ifidx, void *pktbuf, int numpkt, uint8 chan) int i; dhd_if_t *ifp; wl_event_msg_t event; + int tout = DHD_PACKET_TIMEOUT; DHD_TRACE(("%s: Enter\n", __FUNCTION__)); @@ -1489,6 +1490,7 @@ dhd_rx_frame(dhd_pub_t *dhdp, int ifidx, void *pktbuf, int numpkt, uint8 chan) if (event.event_type == WLC_E_BTA_HCI_EVENT) { dhd_bta_doevt(dhdp, data, event.datalen); } + tout = DHD_EVENT_TIMEOUT; } ASSERT(ifidx < DHD_MAX_IFS && dhd->iflist[ifidx]); @@ -1521,7 +1523,7 @@ dhd_rx_frame(dhd_pub_t *dhdp, int ifidx, void *pktbuf, int numpkt, uint8 chan) #endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 0) */ } } - DHD_OS_WAKE_LOCK_TIMEOUT_ENABLE(dhdp); + DHD_OS_WAKE_LOCK_TIMEOUT_ENABLE(dhdp, tout); } void @@ -4296,7 +4298,8 @@ int dhd_os_wake_lock_timeout(dhd_pub_t *pub) ret = dhd->wakelock_timeout_enable; #ifdef CONFIG_HAS_WAKELOCK if (dhd->wakelock_timeout_enable) - wake_lock_timeout(&dhd->wl_rxwake, HZ); + wake_lock_timeout(&dhd->wl_rxwake, + dhd->wakelock_timeout_enable * HZ); #endif dhd->wakelock_timeout_enable = 0; spin_unlock_irqrestore(&dhd->wakelock_spinlock, flags); @@ -4314,26 +4317,27 @@ int net_os_wake_lock_timeout(struct net_device *dev) return ret; } -int dhd_os_wake_lock_timeout_enable(dhd_pub_t *pub) +int dhd_os_wake_lock_timeout_enable(dhd_pub_t *pub, int val) { dhd_info_t *dhd = (dhd_info_t *)(pub->info); unsigned long flags; if (dhd) { spin_lock_irqsave(&dhd->wakelock_spinlock, flags); - dhd->wakelock_timeout_enable = 1; + if (val > dhd->wakelock_timeout_enable) + dhd->wakelock_timeout_enable = val; spin_unlock_irqrestore(&dhd->wakelock_spinlock, flags); } return 0; } -int net_os_wake_lock_timeout_enable(struct net_device *dev) +int net_os_wake_lock_timeout_enable(struct net_device *dev, int val) { dhd_info_t *dhd = *(dhd_info_t **)netdev_priv(dev); int ret = 0; if (dhd) - ret = dhd_os_wake_lock_timeout_enable(&dhd->pub); + ret = dhd_os_wake_lock_timeout_enable(&dhd->pub, val); return ret; } diff --git a/drivers/net/wireless/bcmdhd/wl_cfg80211.c b/drivers/net/wireless/bcmdhd/wl_cfg80211.c index 0ab5235228b..08a9a0416b8 100644 --- a/drivers/net/wireless/bcmdhd/wl_cfg80211.c +++ b/drivers/net/wireless/bcmdhd/wl_cfg80211.c @@ -5459,8 +5459,10 @@ void wl_cfg80211_detach(void) static void wl_wakeup_event(struct wl_priv *wl) { - if (wl->event_tsk.thr_pid >= 0) + if (wl->event_tsk.thr_pid >= 0) { + DHD_OS_WAKE_LOCK(wl->pub); up(&wl->event_tsk.sema); + } } static s32 wl_event_handler(void *data) @@ -5480,6 +5482,7 @@ static s32 wl_event_handler(void *data) e = wl_deq_event(wl); if (unlikely(!e)) { WL_ERR(("equeue empty..\n")); + DHD_OS_WAKE_UNLOCK(wl->pub); return 0; } WL_DBG(("event type (%d), if idx: %d\n", e->etype, e->emsg.ifidx)); @@ -5492,6 +5495,7 @@ static s32 wl_event_handler(void *data) WL_DBG(("Unknown Event (%d): ignoring\n", e->etype)); } wl_put_event(e); + DHD_OS_WAKE_UNLOCK(wl->pub); } WL_DBG(("%s was terminated\n", __func__)); complete_and_exit(&tsk->completed, 0); diff --git a/drivers/net/wireless/bcmdhd/wl_iw.c b/drivers/net/wireless/bcmdhd/wl_iw.c index f74115cc85a..9b8184a2ea5 100644 --- a/drivers/net/wireless/bcmdhd/wl_iw.c +++ b/drivers/net/wireless/bcmdhd/wl_iw.c @@ -1625,7 +1625,7 @@ wl_iw_send_priv_event( strcpy(extra, flag); wrqu.data.length = strlen(extra); wireless_send_event(dev, cmd, &wrqu, extra); - net_os_wake_lock_timeout_enable(dev); + net_os_wake_lock_timeout_enable(dev, DHD_EVENT_TIMEOUT); WL_TRACE(("Send IWEVCUSTOM Event as %s\n", extra)); return 0; @@ -8220,7 +8220,6 @@ wl_iw_event(struct net_device *dev, wl_event_msg_t *e, void* data) WL_TRACE(("Link UP\n")); } - net_os_wake_lock_timeout_enable(dev); wrqu.addr.sa_family = ARPHRD_ETHER; break; case WLC_E_ACTION_FRAME: @@ -8316,7 +8315,6 @@ wl_iw_event(struct net_device *dev, wl_event_msg_t *e, void* data) WL_ERROR(("%s Event WLC_E_PFN_NET_FOUND, send %s up : find %s len=%d\n", __FUNCTION__, PNO_EVENT_UP, netinfo->pfnsubnet.SSID, netinfo->pfnsubnet.SSID_len)); - net_os_wake_lock_timeout_enable(dev); cmd = IWEVCUSTOM; memset(&wrqu, 0, sizeof(wrqu)); strcpy(extra, PNO_EVENT_UP); diff --git a/drivers/net/wireless/bcmdhd/wl_iw.h b/drivers/net/wireless/bcmdhd/wl_iw.h index e013b92178c..c0cc14bdde4 100644 --- a/drivers/net/wireless/bcmdhd/wl_iw.h +++ b/drivers/net/wireless/bcmdhd/wl_iw.h @@ -203,7 +203,7 @@ void wl_iw_detach(void); extern int net_os_wake_lock(struct net_device *dev); extern int net_os_wake_unlock(struct net_device *dev); extern int net_os_wake_lock_timeout(struct net_device *dev); -extern int net_os_wake_lock_timeout_enable(struct net_device *dev); +extern int net_os_wake_lock_timeout_enable(struct net_device *dev, int val); extern int net_os_set_suspend_disable(struct net_device *dev, int val); extern int net_os_set_suspend(struct net_device *dev, int val); extern int net_os_set_dtim_skip(struct net_device *dev, int val); diff --git a/drivers/net/wireless/bcmdhd/wldev_common.h b/drivers/net/wireless/bcmdhd/wldev_common.h index 2c1d968f9d5..46326803e21 100644 --- a/drivers/net/wireless/bcmdhd/wldev_common.h +++ b/drivers/net/wireless/bcmdhd/wldev_common.h @@ -89,7 +89,7 @@ extern int wldev_set_country(struct net_device *dev, char *country_code); extern int net_os_wake_lock(struct net_device *dev); extern int net_os_wake_unlock(struct net_device *dev); extern int net_os_wake_lock_timeout(struct net_device *dev); -extern int net_os_wake_lock_timeout_enable(struct net_device *dev); +extern int net_os_wake_lock_timeout_enable(struct net_device *dev, int val); extern int net_os_set_dtim_skip(struct net_device *dev, int val); extern int net_os_set_suspend_disable(struct net_device *dev, int val); extern int net_os_set_suspend(struct net_device *dev, int val); -- cgit v1.2.3