Update Operating mode is needed when User Space received Assoc Request contains Operating mode notification element. Signed-off-by: Marek Kwaczynski <marek.kwaczynski@xxxxxxxxx> --- net/mac80211/cfg.c | 7 +++++++ net/mac80211/ieee80211_i.h | 3 +++ net/mac80211/vht.c | 33 +++++++++++++++++++++------------ 3 files changed, 31 insertions(+), 12 deletions(-) diff --git a/net/mac80211/cfg.c b/net/mac80211/cfg.c index 95667b0..50f0841 100644 --- a/net/mac80211/cfg.c +++ b/net/mac80211/cfg.c @@ -1409,6 +1409,13 @@ static int ieee80211_add_station(struct wiphy *wiphy, struct net_device *dev, */ if (!(params->sta_flags_set & BIT(NL80211_STA_FLAG_TDLS_PEER))) { sta_info_pre_move_state(sta, IEEE80211_STA_AUTH); + if (params->vht_opmode_used) { + enum ieee80211_band band = + ieee80211_get_sdata_band(sdata); + ieee80211_vht_recalc_handle_opmode(sdata, sta, + params->vht_opmode, + band, 0); + } sta_info_pre_move_state(sta, IEEE80211_STA_ASSOC); } diff --git a/net/mac80211/ieee80211_i.h b/net/mac80211/ieee80211_i.h index 29dc505..13965e1 100644 --- a/net/mac80211/ieee80211_i.h +++ b/net/mac80211/ieee80211_i.h @@ -1510,6 +1510,9 @@ ieee80211_vht_cap_ie_to_sta_vht_cap(struct ieee80211_sub_if_data *sdata, 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); +u32 ieee80211_vht_recalc_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, struct sta_info *sta, u8 opmode, enum ieee80211_band band, bool nss_only); diff --git a/net/mac80211/vht.c b/net/mac80211/vht.c index de01127..463e52c 100644 --- a/net/mac80211/vht.c +++ b/net/mac80211/vht.c @@ -350,21 +350,17 @@ void ieee80211_sta_set_rx_nss(struct sta_info *sta) sta->sta.rx_nss = max_t(u8, 1, ht_rx_nss); } -void ieee80211_vht_handle_opmode(struct ieee80211_sub_if_data *sdata, - struct sta_info *sta, u8 opmode, - enum ieee80211_band band, bool nss_only) +u32 ieee80211_vht_recalc_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; enum ieee80211_sta_rx_bandwidth new_bw; - u32 changed = 0; u8 nss; - - sband = local->hw.wiphy->bands[band]; + u32 changed = -1; /* ignore - no support for BF yet */ if (opmode & IEEE80211_OPMODE_NOTIF_RX_NSS_TYPE_BF) - return; + return -EOPNOTSUPP; nss = opmode & IEEE80211_OPMODE_NOTIF_RX_NSS_MASK; nss >>= IEEE80211_OPMODE_NOTIF_RX_NSS_SHIFT; @@ -376,7 +372,7 @@ void ieee80211_vht_handle_opmode(struct ieee80211_sub_if_data *sdata, } if (nss_only) - goto change; + return changed; switch (opmode & IEEE80211_OPMODE_NOTIF_CHANWIDTH_MASK) { case IEEE80211_OPMODE_NOTIF_CHANWIDTH_20MHZ: @@ -398,8 +394,21 @@ void ieee80211_vht_handle_opmode(struct ieee80211_sub_if_data *sdata, sta->sta.bandwidth = new_bw; changed |= IEEE80211_RC_BW_CHANGED; } + return 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; + u32 changed = 0; + + changed = ieee80211_vht_recalc_handle_opmode(sdata, sta, opmode, band, + nss_only); + sband = local->hw.wiphy->bands[band]; - change: - if (changed) + if (changed >= 0) rate_control_rate_update(local, sband, sta, changed); } -- 1.7.9.5 -- To unsubscribe from this list: send the line "unsubscribe linux-wireless" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html