Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d881fa2c authored by Eliad Peller's avatar Eliad Peller Committed by John W. Linville
Browse files

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: default avatarEliad Peller <eliad@wizery.com>
Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
parent 5b07d97a
Loading
Loading
Loading
Loading
+2 −1
Original line number Original line Diff line number Diff line
@@ -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)
+2 −2
Original line number Original line Diff line number Diff line
@@ -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;


+12 −0
Original line number Original line Diff line number Diff line
@@ -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;