wlcore: enable beacon filtering only after receiving a beacon
authorEliad Peller <eliad@wizery.com>
Mon, 10 Feb 2014 11:47:33 +0000 (13:47 +0200)
committerJohn W. Linville <linville@tuxdriver.com>
Thu, 13 Feb 2014 20:20:16 +0000 (15:20 -0500)
Enabling beacon filtering before receving a beacon
might result in not having a beacon at all for the
current connected AP, which prevents the station
from entering power-save.

Replace the current approach (of starting beacon
filtering on init) and configure beacon filering
only after bss_conf->dtimper is set (which means
mac80211 already parsed a beacon).

Signed-off-by: Eliad Peller <eliad@wizery.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
drivers/net/wireless/ti/wlcore/acx.c
drivers/net/wireless/ti/wlcore/init.c
drivers/net/wireless/ti/wlcore/main.c

index 71b244b7ab7f721b87570751eb83724148b11217..b924ceadc02c4a5fcfd96530c986e65d9fc89f2b 100644 (file)
@@ -358,7 +358,8 @@ int wl1271_acx_beacon_filter_opt(struct wl1271 *wl, struct wl12xx_vif *wlvif,
        struct acx_beacon_filter_option *beacon_filter = NULL;
        int ret = 0;
 
-       wl1271_debug(DEBUG_ACX, "acx beacon filter opt");
+       wl1271_debug(DEBUG_ACX, "acx beacon filter opt enable=%d",
+                    enable_filter);
 
        if (enable_filter &&
            wl->conf.conn.bcn_filt_mode == CONF_BCN_FILT_MODE_DISABLED)
index b376c996c0a7720d6aea7bbeb8d46b505d8979f7..199e941208644864e16479c4eb586afe8df69e86 100644 (file)
@@ -287,8 +287,8 @@ static int wl1271_init_sta_beacon_filter(struct wl1271 *wl,
        if (ret < 0)
                return ret;
 
-       /* enable beacon filtering */
-       ret = wl1271_acx_beacon_filter_opt(wl, wlvif, true);
+       /* disable beacon filtering until we get the first beacon */
+       ret = wl1271_acx_beacon_filter_opt(wl, wlvif, false);
        if (ret < 0)
                return ret;
 
index a2348b951738d4380ab3eef5b864cc0c846f3384..82d546155f451b3906b82f714f87ef1ff134f094 100644 (file)
@@ -2941,6 +2941,11 @@ static int wlcore_unset_assoc(struct wl1271 *wl, struct wl12xx_vif *wlvif)
                ret = wl1271_acx_keep_alive_mode(wl, wlvif, false);
                if (ret < 0)
                        return ret;
+
+               /* disable beacon filtering */
+               ret = wl1271_acx_beacon_filter_opt(wl, wlvif, false);
+               if (ret < 0)
+                       return ret;
        }
 
        if (test_and_clear_bit(WLVIF_FLAG_CS_PROGRESS, &wlvif->flags)) {
@@ -4312,6 +4317,13 @@ static void wl1271_bss_info_changed_sta(struct wl1271 *wl,
                }
        }
 
+       if ((changed & BSS_CHANGED_BEACON_INFO) && bss_conf->dtim_period) {
+               /* enable beacon filtering */
+               ret = wl1271_acx_beacon_filter_opt(wl, wlvif, true);
+               if (ret < 0)
+                       goto out;
+       }
+
        ret = wl1271_bss_erp_info_changed(wl, vif, bss_conf, changed);
        if (ret < 0)
                goto out;