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

Commit 482a9c74 authored by Alexander Bondar's avatar Alexander Bondar Committed by Johannes Berg
Browse files

mac80211: fix powersave bug and clean up ieee80211_rx_bss_info



ieee80211_rx_bss_info() deals with dtim_period setting and PS update
when associated. Move all these to another locations cleaning this
function. Also, the current implementation is buggy because when it
calls ieee80211_recalc_ps() bss_conf->dtim_period is notset properly
yet and thus nothing will happen.

Signed-off-by: default avatarAlexander Bondar <alexander.bondar@intel.com>
Signed-off-by: default avatarJohannes Berg <johannes.berg@intel.com>
parent 9b881963
Loading
Loading
Loading
Loading
+9 −21
Original line number Diff line number Diff line
@@ -2737,24 +2737,9 @@ static void ieee80211_rx_bss_info(struct ieee80211_sub_if_data *sdata,
	int freq;
	struct ieee80211_bss *bss;
	struct ieee80211_channel *channel;
	bool need_ps = false;

	sdata_assert_lock(sdata);

	if ((sdata->u.mgd.associated &&
	     ether_addr_equal(mgmt->bssid, sdata->u.mgd.associated->bssid)) ||
	    (sdata->u.mgd.assoc_data &&
	     ether_addr_equal(mgmt->bssid,
			      sdata->u.mgd.assoc_data->bss->bssid))) {
		/* not previously set so we may need to recalc */
		need_ps = sdata->u.mgd.associated && !sdata->u.mgd.dtim_period;

		if (elems->tim && !elems->parse_error) {
			const struct ieee80211_tim_ie *tim_ie = elems->tim;
			sdata->u.mgd.dtim_period = tim_ie->dtim_period;
		}
	}

	if (elems->ds_params)
		freq = ieee80211_channel_to_frequency(elems->ds_params[0],
						      rx_status->band);
@@ -2775,12 +2760,6 @@ static void ieee80211_rx_bss_info(struct ieee80211_sub_if_data *sdata,
	    !ether_addr_equal(mgmt->bssid, sdata->u.mgd.associated->bssid))
		return;

	if (need_ps) {
		mutex_lock(&local->iflist_mtx);
		ieee80211_recalc_ps(local, -1);
		mutex_unlock(&local->iflist_mtx);
	}

	ieee80211_sta_process_chanswitch(sdata, rx_status->mactime,
					 elems, true);

@@ -2894,6 +2873,10 @@ static void ieee80211_rx_mgmt_beacon(struct ieee80211_sub_if_data *sdata,
				       len - baselen, false, &elems);

		ieee80211_rx_bss_info(sdata, mgmt, len, rx_status, &elems);
		if (elems.tim && !elems.parse_error) {
			const struct ieee80211_tim_ie *tim_ie = elems.tim;
			ifmgd->dtim_period = tim_ie->dtim_period;
		}
		ifmgd->assoc_data->have_beacon = true;
		ifmgd->assoc_data->need_beacon = false;
		if (local->hw.flags & IEEE80211_HW_TIMING_BEACON_ONLY) {
@@ -3096,6 +3079,11 @@ static void ieee80211_rx_mgmt_beacon(struct ieee80211_sub_if_data *sdata,
		}

		changed |= BSS_CHANGED_DTIM_PERIOD;

		mutex_lock(&local->iflist_mtx);
		ieee80211_recalc_ps(local, -1);
		mutex_unlock(&local->iflist_mtx);

		ieee80211_recalc_ps_vif(sdata);
	}