wlcore: enable beacon filtering only after receiving a beacon
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>
This commit is contained in:
parent
5b07d97a38
commit
d881fa2c50
|
@ -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;
|
struct acx_beacon_filter_option *beacon_filter = NULL;
|
||||||
int ret = 0;
|
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 &&
|
if (enable_filter &&
|
||||||
wl->conf.conn.bcn_filt_mode == CONF_BCN_FILT_MODE_DISABLED)
|
wl->conf.conn.bcn_filt_mode == CONF_BCN_FILT_MODE_DISABLED)
|
||||||
|
|
|
@ -287,8 +287,8 @@ static int wl1271_init_sta_beacon_filter(struct wl1271 *wl,
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
/* enable beacon filtering */
|
/* disable beacon filtering until we get the first beacon */
|
||||||
ret = wl1271_acx_beacon_filter_opt(wl, wlvif, true);
|
ret = wl1271_acx_beacon_filter_opt(wl, wlvif, false);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
|
|
|
@ -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);
|
ret = wl1271_acx_keep_alive_mode(wl, wlvif, false);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
return ret;
|
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)) {
|
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);
|
ret = wl1271_bss_erp_info_changed(wl, vif, bss_conf, changed);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
goto out;
|
goto out;
|
||||||
|
|
Loading…
Reference in New Issue