diff options
Diffstat (limited to 'drivers/net/wireless/iwlwifi/iwl-nvm-parse.c')
-rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-nvm-parse.c | 15 |
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 | ||
298 | static void iwl_init_sbands(struct device *dev, const struct iwl_cfg *cfg, | 311 | static void iwl_init_sbands(struct device *dev, const struct iwl_cfg *cfg, |