diff options
Diffstat (limited to 'package/kernel/mac80211/patches/917-wlcore-enable-beacon-filtering-only-after-receiving-a-beacon.patch')
-rw-r--r-- | package/kernel/mac80211/patches/917-wlcore-enable-beacon-filtering-only-after-receiving-a-beacon.patch | 71 |
1 files changed, 71 insertions, 0 deletions
diff --git a/package/kernel/mac80211/patches/917-wlcore-enable-beacon-filtering-only-after-receiving-a-beacon.patch b/package/kernel/mac80211/patches/917-wlcore-enable-beacon-filtering-only-after-receiving-a-beacon.patch new file mode 100644 index 0000000000..5dbad9494e --- /dev/null +++ b/package/kernel/mac80211/patches/917-wlcore-enable-beacon-filtering-only-after-receiving-a-beacon.patch @@ -0,0 +1,71 @@ +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> + +--- +drivers/net/wireless/ti/wlcore/acx.c | 3 ++- + drivers/net/wireless/ti/wlcore/init.c | 4 ++-- + drivers/net/wireless/ti/wlcore/main.c | 12 ++++++++++++ + 3 files changed, 16 insertions(+), 3 deletions(-) + +--- a/drivers/net/wireless/ti/wlcore/acx.c ++++ b/drivers/net/wireless/ti/wlcore/acx.c +@@ -358,7 +358,8 @@ int wl1271_acx_beacon_filter_opt(struct + 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) +--- a/drivers/net/wireless/ti/wlcore/init.c ++++ b/drivers/net/wireless/ti/wlcore/init.c +@@ -287,8 +287,8 @@ static int wl1271_init_sta_beacon_filter + 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; + +--- a/drivers/net/wireless/ti/wlcore/main.c ++++ b/drivers/net/wireless/ti/wlcore/main.c +@@ -2941,6 +2941,11 @@ static int wlcore_unset_assoc(struct wl1 + 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)) { +@@ -4345,6 +4350,13 @@ static void wl1271_bss_info_changed_sta( + } + } + ++ 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; |