|
@@ -820,10 +820,10 @@ void ieee80211_sta_process_chanswitch(struct ieee80211_sub_if_data *sdata,
|
|
|
cbss->beacon_interval));
|
|
|
}
|
|
|
|
|
|
-static void ieee80211_handle_pwr_constr(struct ieee80211_sub_if_data *sdata,
|
|
|
- struct ieee80211_channel *channel,
|
|
|
- const u8 *country_ie, u8 country_ie_len,
|
|
|
- const u8 *pwr_constr_elem)
|
|
|
+static u32 ieee80211_handle_pwr_constr(struct ieee80211_sub_if_data *sdata,
|
|
|
+ struct ieee80211_channel *channel,
|
|
|
+ const u8 *country_ie, u8 country_ie_len,
|
|
|
+ const u8 *pwr_constr_elem)
|
|
|
{
|
|
|
struct ieee80211_country_ie_triplet *triplet;
|
|
|
int chan = ieee80211_frequency_to_channel(channel->center_freq);
|
|
@@ -832,7 +832,7 @@ static void ieee80211_handle_pwr_constr(struct ieee80211_sub_if_data *sdata,
|
|
|
|
|
|
/* Invalid IE */
|
|
|
if (country_ie_len % 2 || country_ie_len < IEEE80211_COUNTRY_IE_MIN_LEN)
|
|
|
- return;
|
|
|
+ return 0;
|
|
|
|
|
|
triplet = (void *)(country_ie + 3);
|
|
|
country_ie_len -= 3;
|
|
@@ -873,19 +873,21 @@ static void ieee80211_handle_pwr_constr(struct ieee80211_sub_if_data *sdata,
|
|
|
}
|
|
|
|
|
|
if (!have_chan_pwr)
|
|
|
- return;
|
|
|
+ return 0;
|
|
|
|
|
|
new_ap_level = max_t(int, 0, chan_pwr - *pwr_constr_elem);
|
|
|
|
|
|
- if (sdata->local->ap_power_level == new_ap_level)
|
|
|
- return;
|
|
|
+ if (sdata->ap_power_level == new_ap_level)
|
|
|
+ return 0;
|
|
|
|
|
|
sdata_info(sdata,
|
|
|
"Limiting TX power to %d (%d - %d) dBm as advertised by %pM\n",
|
|
|
new_ap_level, chan_pwr, *pwr_constr_elem,
|
|
|
sdata->u.mgd.bssid);
|
|
|
- sdata->local->ap_power_level = new_ap_level;
|
|
|
- ieee80211_hw_config(sdata->local, 0);
|
|
|
+ sdata->ap_power_level = new_ap_level;
|
|
|
+ if (__ieee80211_recalc_txpower(sdata))
|
|
|
+ return BSS_CHANGED_TXPOWER;
|
|
|
+ return 0;
|
|
|
}
|
|
|
|
|
|
void ieee80211_enable_dyn_ps(struct ieee80211_vif *vif)
|
|
@@ -1489,7 +1491,7 @@ static void ieee80211_set_disassoc(struct ieee80211_sub_if_data *sdata,
|
|
|
memset(&ifmgd->ht_capa, 0, sizeof(ifmgd->ht_capa));
|
|
|
memset(&ifmgd->ht_capa_mask, 0, sizeof(ifmgd->ht_capa_mask));
|
|
|
|
|
|
- local->ap_power_level = 0;
|
|
|
+ sdata->ap_power_level = IEEE80211_UNSET_POWER_LEVEL;
|
|
|
|
|
|
del_timer_sync(&local->dynamic_ps_timer);
|
|
|
cancel_work_sync(&local->dynamic_ps_enable_work);
|
|
@@ -2623,10 +2625,10 @@ static void ieee80211_rx_mgmt_beacon(struct ieee80211_sub_if_data *sdata,
|
|
|
if (elems.country_elem && elems.pwr_constr_elem &&
|
|
|
mgmt->u.probe_resp.capab_info &
|
|
|
cpu_to_le16(WLAN_CAPABILITY_SPECTRUM_MGMT))
|
|
|
- ieee80211_handle_pwr_constr(sdata, chan,
|
|
|
- elems.country_elem,
|
|
|
- elems.country_elem_len,
|
|
|
- elems.pwr_constr_elem);
|
|
|
+ changed |= ieee80211_handle_pwr_constr(sdata, chan,
|
|
|
+ elems.country_elem,
|
|
|
+ elems.country_elem_len,
|
|
|
+ elems.pwr_constr_elem);
|
|
|
|
|
|
ieee80211_bss_info_change_notify(sdata, changed);
|
|
|
}
|