aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/iwlwifi/iwl-nvm-parse.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/wireless/iwlwifi/iwl-nvm-parse.c')
-rw-r--r--drivers/net/wireless/iwlwifi/iwl-nvm-parse.c15
1 files changed, 14 insertions, 1 deletions
diff --git a/drivers/net/wireless/iwlwifi/iwl-nvm-parse.c b/drivers/net/wireless/iwlwifi/iwl-nvm-parse.c
index 94aef22df73a..a48decc6c68f 100644
--- a/drivers/net/wireless/iwlwifi/iwl-nvm-parse.c
+++ b/drivers/net/wireless/iwlwifi/iwl-nvm-parse.c
@@ -263,13 +263,20 @@ static void iwl_init_vht_hw_capab(const struct iwl_cfg *cfg,
263 struct iwl_nvm_data *data, 263 struct iwl_nvm_data *data,
264 struct ieee80211_sta_vht_cap *vht_cap) 264 struct ieee80211_sta_vht_cap *vht_cap)
265{ 265{
266 int num_ants = num_of_ant(data->valid_rx_ant);
267 int bf_sts_cap = num_ants - 1;
268
266 vht_cap->vht_supported = true; 269 vht_cap->vht_supported = true;
267 270
268 vht_cap->cap = IEEE80211_VHT_CAP_SHORT_GI_80 | 271 vht_cap->cap = IEEE80211_VHT_CAP_SHORT_GI_80 |
269 IEEE80211_VHT_CAP_RXSTBC_1 | 272 IEEE80211_VHT_CAP_RXSTBC_1 |
270 IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE | 273 IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE |
274 bf_sts_cap << IEEE80211_VHT_CAP_BEAMFORMEE_STS_SHIFT |
271 7 << IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_SHIFT; 275 7 << IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_SHIFT;
272 276
277 if (num_ants > 1)
278 vht_cap->cap |= IEEE80211_VHT_CAP_TXSTBC;
279
273 if (iwlwifi_mod_params.amsdu_size_8K) 280 if (iwlwifi_mod_params.amsdu_size_8K)
274 vht_cap->cap |= IEEE80211_VHT_CAP_MAX_MPDU_LENGTH_7991; 281 vht_cap->cap |= IEEE80211_VHT_CAP_MAX_MPDU_LENGTH_7991;
275 282
@@ -283,16 +290,22 @@ static void iwl_init_vht_hw_capab(const struct iwl_cfg *cfg,
283 IEEE80211_VHT_MCS_NOT_SUPPORTED << 12 | 290 IEEE80211_VHT_MCS_NOT_SUPPORTED << 12 |
284 IEEE80211_VHT_MCS_NOT_SUPPORTED << 14); 291 IEEE80211_VHT_MCS_NOT_SUPPORTED << 14);
285 292
286 if (num_of_ant(data->valid_rx_ant) == 1 || 293 /* Max rate for Long GI NSS=2 80Mhz is 780Mbps */
294 vht_cap->vht_mcs.rx_highest = cpu_to_le16(780);
295
296 if (num_ants == 1 ||
287 cfg->rx_with_siso_diversity) { 297 cfg->rx_with_siso_diversity) {
288 vht_cap->cap |= IEEE80211_VHT_CAP_RX_ANTENNA_PATTERN | 298 vht_cap->cap |= IEEE80211_VHT_CAP_RX_ANTENNA_PATTERN |
289 IEEE80211_VHT_CAP_TX_ANTENNA_PATTERN; 299 IEEE80211_VHT_CAP_TX_ANTENNA_PATTERN;
290 /* this works because NOT_SUPPORTED == 3 */ 300 /* this works because NOT_SUPPORTED == 3 */
291 vht_cap->vht_mcs.rx_mcs_map |= 301 vht_cap->vht_mcs.rx_mcs_map |=
292 cpu_to_le16(IEEE80211_VHT_MCS_NOT_SUPPORTED << 2); 302 cpu_to_le16(IEEE80211_VHT_MCS_NOT_SUPPORTED << 2);
303 /* Max rate for Long GI NSS=1 80Mhz is 390Mbps */
304 vht_cap->vht_mcs.rx_highest = cpu_to_le16(390);
293 } 305 }
294 306
295 vht_cap->vht_mcs.tx_mcs_map = vht_cap->vht_mcs.rx_mcs_map; 307 vht_cap->vht_mcs.tx_mcs_map = vht_cap->vht_mcs.rx_mcs_map;
308 vht_cap->vht_mcs.tx_highest = vht_cap->vht_mcs.rx_highest;
296} 309}
297 310
298static void iwl_init_sbands(struct device *dev, const struct iwl_cfg *cfg, 311static void iwl_init_sbands(struct device *dev, const struct iwl_cfg *cfg,