mac80211: update opmode when adding new station
Update the operating mode field is needed when an association request contains the operating mode notification element and it's not just changed later on the fly. Signed-off-by: Marek Kwaczynski <marek.kwaczynski@tieto.com> [clarify commit log, comments & fix whitespace] Signed-off-by: Johannes Berg <johannes.berg@intel.com>
This commit is contained in:
parent
9752482083
commit
b1bce14a79
|
@ -1344,6 +1344,18 @@ static int sta_apply_parameters(struct ieee80211_local *local,
|
||||||
ieee80211_vht_cap_ie_to_sta_vht_cap(sdata, sband,
|
ieee80211_vht_cap_ie_to_sta_vht_cap(sdata, sband,
|
||||||
params->vht_capa, sta);
|
params->vht_capa, sta);
|
||||||
|
|
||||||
|
if (params->opmode_notif_used) {
|
||||||
|
enum ieee80211_band band =
|
||||||
|
ieee80211_get_sdata_band(sdata);
|
||||||
|
|
||||||
|
/* returned value is only needed for rc update, but the
|
||||||
|
* rc isn't initialized here yet, so ignore it
|
||||||
|
*/
|
||||||
|
__ieee80211_vht_handle_opmode(sdata, sta,
|
||||||
|
params->opmode_notif,
|
||||||
|
band, false);
|
||||||
|
}
|
||||||
|
|
||||||
if (ieee80211_vif_is_mesh(&sdata->vif)) {
|
if (ieee80211_vif_is_mesh(&sdata->vif)) {
|
||||||
#ifdef CONFIG_MAC80211_MESH
|
#ifdef CONFIG_MAC80211_MESH
|
||||||
u32 changed = 0;
|
u32 changed = 0;
|
||||||
|
|
|
@ -1556,6 +1556,9 @@ ieee80211_vht_cap_ie_to_sta_vht_cap(struct ieee80211_sub_if_data *sdata,
|
||||||
struct sta_info *sta);
|
struct sta_info *sta);
|
||||||
enum ieee80211_sta_rx_bandwidth ieee80211_sta_cur_vht_bw(struct sta_info *sta);
|
enum ieee80211_sta_rx_bandwidth ieee80211_sta_cur_vht_bw(struct sta_info *sta);
|
||||||
void ieee80211_sta_set_rx_nss(struct sta_info *sta);
|
void ieee80211_sta_set_rx_nss(struct sta_info *sta);
|
||||||
|
u32 __ieee80211_vht_handle_opmode(struct ieee80211_sub_if_data *sdata,
|
||||||
|
struct sta_info *sta, u8 opmode,
|
||||||
|
enum ieee80211_band band, bool nss_only);
|
||||||
void ieee80211_vht_handle_opmode(struct ieee80211_sub_if_data *sdata,
|
void ieee80211_vht_handle_opmode(struct ieee80211_sub_if_data *sdata,
|
||||||
struct sta_info *sta, u8 opmode,
|
struct sta_info *sta, u8 opmode,
|
||||||
enum ieee80211_band band, bool nss_only);
|
enum ieee80211_band band, bool nss_only);
|
||||||
|
|
|
@ -349,9 +349,9 @@ void ieee80211_sta_set_rx_nss(struct sta_info *sta)
|
||||||
sta->sta.rx_nss = max_t(u8, 1, ht_rx_nss);
|
sta->sta.rx_nss = max_t(u8, 1, ht_rx_nss);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ieee80211_vht_handle_opmode(struct ieee80211_sub_if_data *sdata,
|
u32 __ieee80211_vht_handle_opmode(struct ieee80211_sub_if_data *sdata,
|
||||||
struct sta_info *sta, u8 opmode,
|
struct sta_info *sta, u8 opmode,
|
||||||
enum ieee80211_band band, bool nss_only)
|
enum ieee80211_band band, bool nss_only)
|
||||||
{
|
{
|
||||||
struct ieee80211_local *local = sdata->local;
|
struct ieee80211_local *local = sdata->local;
|
||||||
struct ieee80211_supported_band *sband;
|
struct ieee80211_supported_band *sband;
|
||||||
|
@ -363,7 +363,7 @@ void ieee80211_vht_handle_opmode(struct ieee80211_sub_if_data *sdata,
|
||||||
|
|
||||||
/* ignore - no support for BF yet */
|
/* ignore - no support for BF yet */
|
||||||
if (opmode & IEEE80211_OPMODE_NOTIF_RX_NSS_TYPE_BF)
|
if (opmode & IEEE80211_OPMODE_NOTIF_RX_NSS_TYPE_BF)
|
||||||
return;
|
return 0;
|
||||||
|
|
||||||
nss = opmode & IEEE80211_OPMODE_NOTIF_RX_NSS_MASK;
|
nss = opmode & IEEE80211_OPMODE_NOTIF_RX_NSS_MASK;
|
||||||
nss >>= IEEE80211_OPMODE_NOTIF_RX_NSS_SHIFT;
|
nss >>= IEEE80211_OPMODE_NOTIF_RX_NSS_SHIFT;
|
||||||
|
@ -375,7 +375,7 @@ void ieee80211_vht_handle_opmode(struct ieee80211_sub_if_data *sdata,
|
||||||
}
|
}
|
||||||
|
|
||||||
if (nss_only)
|
if (nss_only)
|
||||||
goto change;
|
return changed;
|
||||||
|
|
||||||
switch (opmode & IEEE80211_OPMODE_NOTIF_CHANWIDTH_MASK) {
|
switch (opmode & IEEE80211_OPMODE_NOTIF_CHANWIDTH_MASK) {
|
||||||
case IEEE80211_OPMODE_NOTIF_CHANWIDTH_20MHZ:
|
case IEEE80211_OPMODE_NOTIF_CHANWIDTH_20MHZ:
|
||||||
|
@ -398,7 +398,19 @@ void ieee80211_vht_handle_opmode(struct ieee80211_sub_if_data *sdata,
|
||||||
changed |= IEEE80211_RC_BW_CHANGED;
|
changed |= IEEE80211_RC_BW_CHANGED;
|
||||||
}
|
}
|
||||||
|
|
||||||
change:
|
return changed;
|
||||||
if (changed)
|
}
|
||||||
|
|
||||||
|
void ieee80211_vht_handle_opmode(struct ieee80211_sub_if_data *sdata,
|
||||||
|
struct sta_info *sta, u8 opmode,
|
||||||
|
enum ieee80211_band band, bool nss_only)
|
||||||
|
{
|
||||||
|
struct ieee80211_local *local = sdata->local;
|
||||||
|
struct ieee80211_supported_band *sband = local->hw.wiphy->bands[band];
|
||||||
|
|
||||||
|
u32 changed = __ieee80211_vht_handle_opmode(sdata, sta, opmode,
|
||||||
|
band, nss_only);
|
||||||
|
|
||||||
|
if (changed > 0)
|
||||||
rate_control_rate_update(local, sband, sta, changed);
|
rate_control_rate_update(local, sband, sta, changed);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue