mwifiex: fix incorrect ht capability problem
authorGanapathi Bhat <gbhat@marvell.com>
Fri, 9 Mar 2018 18:15:25 +0000 (23:45 +0530)
committerKalle Valo <kvalo@codeaurora.org>
Tue, 13 Mar 2018 16:53:46 +0000 (18:53 +0200)
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>
drivers/net/wireless/marvell/mwifiex/11n.c

index 8772e39493273e8ed7a9ad34dc9d5ede49c31929..feebfdcf025ad40dbda217548a7f893a4561a8a4 100644 (file)
@@ -341,6 +341,36 @@ mwifiex_cmd_append_11n_tlv(struct mwifiex_private *priv,
                       le16_to_cpu(ht_cap->header.len));
 
                mwifiex_fill_cap_info(priv, radio_type, &ht_cap->ht_cap);
+               /* Update HT40 capability from current channel information */
+               if (bss_desc->bcn_ht_oper) {
+                       u8 ht_param = bss_desc->bcn_ht_oper->ht_param;
+                       u8 radio =
+                       mwifiex_band_to_radio_type(bss_desc->bss_band);
+                       int freq =
+                       ieee80211_channel_to_frequency(bss_desc->channel,
+                                                      radio);
+                       struct ieee80211_channel *chan =
+                       ieee80211_get_channel(priv->adapter->wiphy, freq);
+
+                       switch (ht_param & IEEE80211_HT_PARAM_CHA_SEC_OFFSET) {
+                       case IEEE80211_HT_PARAM_CHA_SEC_ABOVE:
+                               if (chan->flags & IEEE80211_CHAN_NO_HT40PLUS) {
+                                       ht_cap->ht_cap.cap_info &=
+                                       ~IEEE80211_HT_CAP_SUP_WIDTH_20_40;
+                                       ht_cap->ht_cap.cap_info &=
+                                       ~IEEE80211_HT_CAP_SGI_40;
+                               }
+                               break;
+                       case IEEE80211_HT_PARAM_CHA_SEC_BELOW:
+                               if (chan->flags & IEEE80211_CHAN_NO_HT40MINUS) {
+                                       ht_cap->ht_cap.cap_info &=
+                                       ~IEEE80211_HT_CAP_SUP_WIDTH_20_40;
+                                       ht_cap->ht_cap.cap_info &=
+                                       ~IEEE80211_HT_CAP_SGI_40;
+                               }
+                               break;
+                       }
+               }
 
                *buffer += sizeof(struct mwifiex_ie_types_htcap);
                ret_len += sizeof(struct mwifiex_ie_types_htcap);