aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/iwlwifi/mvm/rs.c
diff options
context:
space:
mode:
authorJohannes Berg <johannes.berg@intel.com>2013-02-07 05:47:44 -0500
committerJohannes Berg <johannes.berg@intel.com>2013-02-15 03:41:30 -0500
commite1a0c6b3a4b27ed5f21291d0bbee2167ec201ef5 (patch)
tree18e5c9bd022ea469e7350a52ca67ce505a7608e6 /drivers/net/wireless/iwlwifi/mvm/rs.c
parent4a34215ef7487b1cbd783e7cc485eb03de893bd0 (diff)
mac80211: stop toggling IEEE80211_HT_CAP_SUP_WIDTH_20_40
For VHT, many more bandwidth changes are possible. As a first step, stop toggling the IEEE80211_HT_CAP_SUP_WIDTH_20_40 flag in the HT capabilities and instead introduce a bandwidth field indicating the currently usable bandwidth to transmit to the station. Of course, make all drivers use it. To achieve this, make ieee80211_ht_cap_ie_to_sta_ht_cap() get the station as an argument, rather than the new capabilities, so it can set up the new bandwidth field. If the station is a VHT station and VHT bandwidth is in use, also set the bandwidth accordingly. Doing this allows us to get rid of the supports_40mhz flag as the HT capabilities now reflect the true capability instead of the current setting. While at it, also fix ieee80211_ht_cap_ie_to_sta_ht_cap() to not ignore HT cap overrides when MCS TX isn't supported (not that it really happens...) Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Diffstat (limited to 'drivers/net/wireless/iwlwifi/mvm/rs.c')
-rw-r--r--drivers/net/wireless/iwlwifi/mvm/rs.c24
1 files changed, 5 insertions, 19 deletions
diff --git a/drivers/net/wireless/iwlwifi/mvm/rs.c b/drivers/net/wireless/iwlwifi/mvm/rs.c
index 60a4291ca221..8ba36e5e4b67 100644
--- a/drivers/net/wireless/iwlwifi/mvm/rs.c
+++ b/drivers/net/wireless/iwlwifi/mvm/rs.c
@@ -1209,23 +1209,9 @@ static s32 rs_get_best_rate(struct iwl_mvm *mvm,
1209 return new_rate; 1209 return new_rate;
1210} 1210}
1211 1211
1212static bool iwl_is_ht40_tx_allowed(struct iwl_mvm *mvm, 1212static bool iwl_is_ht40_tx_allowed(struct ieee80211_sta *sta)
1213 struct ieee80211_sta_ht_cap *ht_cap)
1214{ 1213{
1215 /* 1214 return sta->bandwidth >= IEEE80211_STA_RX_BW_40;
1216 * Remainder of this function checks ht_cap, but if it's
1217 * NULL then we can do HT40 (special case for RXON)
1218 */
1219 if (!ht_cap)
1220 return true;
1221
1222 if (!ht_cap->ht_supported)
1223 return false;
1224
1225 if (!(ht_cap->cap & IEEE80211_HT_CAP_SUP_WIDTH_20_40))
1226 return false;
1227
1228 return true;
1229} 1215}
1230 1216
1231/* 1217/*
@@ -1258,7 +1244,7 @@ static int rs_switch_to_mimo2(struct iwl_mvm *mvm,
1258 tbl->max_search = IWL_MAX_SEARCH; 1244 tbl->max_search = IWL_MAX_SEARCH;
1259 rate_mask = lq_sta->active_mimo2_rate; 1245 rate_mask = lq_sta->active_mimo2_rate;
1260 1246
1261 if (iwl_is_ht40_tx_allowed(mvm, &sta->ht_cap)) 1247 if (iwl_is_ht40_tx_allowed(sta))
1262 tbl->is_ht40 = 1; 1248 tbl->is_ht40 = 1;
1263 else 1249 else
1264 tbl->is_ht40 = 0; 1250 tbl->is_ht40 = 0;
@@ -1311,7 +1297,7 @@ static int rs_switch_to_mimo3(struct iwl_mvm *mvm,
1311 tbl->max_search = IWL_MAX_11N_MIMO3_SEARCH; 1297 tbl->max_search = IWL_MAX_11N_MIMO3_SEARCH;
1312 rate_mask = lq_sta->active_mimo3_rate; 1298 rate_mask = lq_sta->active_mimo3_rate;
1313 1299
1314 if (iwl_is_ht40_tx_allowed(mvm, &sta->ht_cap)) 1300 if (iwl_is_ht40_tx_allowed(sta))
1315 tbl->is_ht40 = 1; 1301 tbl->is_ht40 = 1;
1316 else 1302 else
1317 tbl->is_ht40 = 0; 1303 tbl->is_ht40 = 0;
@@ -1356,7 +1342,7 @@ static int rs_switch_to_siso(struct iwl_mvm *mvm,
1356 tbl->max_search = IWL_MAX_SEARCH; 1342 tbl->max_search = IWL_MAX_SEARCH;
1357 rate_mask = lq_sta->active_siso_rate; 1343 rate_mask = lq_sta->active_siso_rate;
1358 1344
1359 if (iwl_is_ht40_tx_allowed(mvm, &sta->ht_cap)) 1345 if (iwl_is_ht40_tx_allowed(sta))
1360 tbl->is_ht40 = 1; 1346 tbl->is_ht40 = 1;
1361 else 1347 else
1362 tbl->is_ht40 = 0; 1348 tbl->is_ht40 = 0;