diff options
author | Ganapathi Bhat <gbhat@marvell.com> | 2018-03-09 13:15:25 -0500 |
---|---|---|
committer | Kalle Valo <kvalo@codeaurora.org> | 2018-03-13 12:53:46 -0400 |
commit | 77423fa739274a4c7b0e7ad90ca52ef22bdbe84e (patch) | |
tree | 0a3a1fbcd6d4325a8bddfaa88cf35f0bbb2ce816 | |
parent | 53a7094204b7f2b9016648b5c4b5ece8e810a461 (diff) |
mwifiex: fix incorrect ht capability problem
IEEE80211_CHAN_NO_HT40PLUS and IEEE80211_CHAN_NO_HT40PLUS channel
flags tell if HT40 operation is allowed on a channel or not.
This patch ensures ht_capability information is modified
accordingly so that we don't end up creating a HT40 connection
when it's not allowed for current regulatory domain.
Signed-off-by: Cathy Luo <cluo@marvell.com>
Signed-off-by: Ganapathi Bhat <gbhat@marvell.com>
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
-rw-r--r-- | drivers/net/wireless/marvell/mwifiex/11n.c | 30 |
1 files changed, 30 insertions, 0 deletions
diff --git a/drivers/net/wireless/marvell/mwifiex/11n.c b/drivers/net/wireless/marvell/mwifiex/11n.c index 8772e3949327..feebfdcf025a 100644 --- a/drivers/net/wireless/marvell/mwifiex/11n.c +++ b/drivers/net/wireless/marvell/mwifiex/11n.c | |||
@@ -341,6 +341,36 @@ mwifiex_cmd_append_11n_tlv(struct mwifiex_private *priv, | |||
341 | le16_to_cpu(ht_cap->header.len)); | 341 | le16_to_cpu(ht_cap->header.len)); |
342 | 342 | ||
343 | mwifiex_fill_cap_info(priv, radio_type, &ht_cap->ht_cap); | 343 | mwifiex_fill_cap_info(priv, radio_type, &ht_cap->ht_cap); |
344 | /* Update HT40 capability from current channel information */ | ||
345 | if (bss_desc->bcn_ht_oper) { | ||
346 | u8 ht_param = bss_desc->bcn_ht_oper->ht_param; | ||
347 | u8 radio = | ||
348 | mwifiex_band_to_radio_type(bss_desc->bss_band); | ||
349 | int freq = | ||
350 | ieee80211_channel_to_frequency(bss_desc->channel, | ||
351 | radio); | ||
352 | struct ieee80211_channel *chan = | ||
353 | ieee80211_get_channel(priv->adapter->wiphy, freq); | ||
354 | |||
355 | switch (ht_param & IEEE80211_HT_PARAM_CHA_SEC_OFFSET) { | ||
356 | case IEEE80211_HT_PARAM_CHA_SEC_ABOVE: | ||
357 | if (chan->flags & IEEE80211_CHAN_NO_HT40PLUS) { | ||
358 | ht_cap->ht_cap.cap_info &= | ||
359 | ~IEEE80211_HT_CAP_SUP_WIDTH_20_40; | ||
360 | ht_cap->ht_cap.cap_info &= | ||
361 | ~IEEE80211_HT_CAP_SGI_40; | ||
362 | } | ||
363 | break; | ||
364 | case IEEE80211_HT_PARAM_CHA_SEC_BELOW: | ||
365 | if (chan->flags & IEEE80211_CHAN_NO_HT40MINUS) { | ||
366 | ht_cap->ht_cap.cap_info &= | ||
367 | ~IEEE80211_HT_CAP_SUP_WIDTH_20_40; | ||
368 | ht_cap->ht_cap.cap_info &= | ||
369 | ~IEEE80211_HT_CAP_SGI_40; | ||
370 | } | ||
371 | break; | ||
372 | } | ||
373 | } | ||
344 | 374 | ||
345 | *buffer += sizeof(struct mwifiex_ie_types_htcap); | 375 | *buffer += sizeof(struct mwifiex_ie_types_htcap); |
346 | ret_len += sizeof(struct mwifiex_ie_types_htcap); | 376 | ret_len += sizeof(struct mwifiex_ie_types_htcap); |