OSDN Git Service

net: wireless: bcmdhd: Set bigger wakelock timeout for events
authorDmitry Shmidt <dimitrysh@google.com>
Tue, 30 Aug 2011 23:29:10 +0000 (16:29 -0700)
committerDmitry Shmidt <dimitrysh@google.com>
Wed, 31 Aug 2011 17:24:36 +0000 (10:24 -0700)
Signed-off-by: Dmitry Shmidt <dimitrysh@google.com>
drivers/net/wireless/bcmdhd/dhd.h
drivers/net/wireless/bcmdhd/dhd_linux.c
drivers/net/wireless/bcmdhd/wl_cfg80211.c
drivers/net/wireless/bcmdhd/wl_iw.c
drivers/net/wireless/bcmdhd/wl_iw.h
drivers/net/wireless/bcmdhd/wldev_common.h

index 454213b..735d39b 100644 (file)
@@ -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
index d869be4..569bd7f 100644 (file)
@@ -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;
 }
 
index 0ab5235..08a9a04 100644 (file)
@@ -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);
index f74115c..9b8184a 100644 (file)
@@ -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);
index e013b92..c0cc14b 100644 (file)
@@ -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);
index 2c1d968..4632680 100644 (file)
@@ -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);