mwifiex: fix AP unable to start in VHT40 problem
authorAmitkumar Karwar <akarwar@marvell.com>
Thu, 16 Jun 2016 13:22:25 +0000 (18:52 +0530)
committerKalle Valo <kvalo@codeaurora.org>
Wed, 29 Jun 2016 15:54:01 +0000 (18:54 +0300)
This patch populates secondary channel offset and downloads it to
firmware to fix the problem.

Signed-off-by: Amitkumar Karwar <akarwar@marvell.com>
Signed-off-by: Cathy Luo <cluo@marvell.com>
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
drivers/net/wireless/marvell/mwifiex/ioctl.h
drivers/net/wireless/marvell/mwifiex/uap_cmd.c

index a5a48c183d375e4e1214a3618d03401ab5c4069a..f5b8fd1fad1b3117b6142d05e179fed59779605a 100644 (file)
@@ -83,6 +83,8 @@ struct wep_key {
 #define MWIFIEX_AUTH_MODE_AUTO  0xFF
 #define BAND_CONFIG_BG          0x00
 #define BAND_CONFIG_A           0x01
+#define MWIFIEX_SEC_CHAN_BELOW 0x30
+#define MWIFIEX_SEC_CHAN_ABOVE 0x10
 #define MWIFIEX_SUPPORTED_RATES                 14
 #define MWIFIEX_SUPPORTED_RATES_EXT             32
 #define MWIFIEX_TDLS_SUPPORTED_RATES           8
index f79d00d1e294425ae4ed43dfa1617aa54fdab895..a7e9f544f219d717a13ed29de537383c312c2573 100644 (file)
@@ -19,6 +19,7 @@
 
 #include "main.h"
 #include "11ac.h"
+#include "11n.h"
 
 /* This function parses security related parameters from cfg80211_ap_settings
  * and sets into FW understandable bss_config structure.
@@ -521,9 +522,9 @@ mwifiex_uap_bss_param_prepare(u8 *tlv, void *cmd_buf, u16 *param_size)
                tlv += sizeof(struct host_cmd_tlv_rates) + i;
        }
        if (bss_cfg->channel &&
-           ((bss_cfg->band_cfg == BAND_CONFIG_BG &&
+           (((bss_cfg->band_cfg & BIT(0)) == BAND_CONFIG_BG &&
              bss_cfg->channel <= MAX_CHANNEL_BAND_BG) ||
-           (bss_cfg->band_cfg == BAND_CONFIG_A &&
+           ((bss_cfg->band_cfg & BIT(0)) == BAND_CONFIG_A &&
             bss_cfg->channel <= MAX_CHANNEL_BAND_A))) {
                chan_band = (struct host_cmd_tlv_channel_band *)tlv;
                chan_band->header.type = cpu_to_le16(TLV_TYPE_CHANNELBANDLIST);
@@ -833,6 +834,31 @@ void mwifiex_uap_set_channel(struct mwifiex_private *priv,
                        config_bands |= BAND_AAC;
        }
 
+       switch (chandef.width) {
+       case NL80211_CHAN_WIDTH_5:
+       case NL80211_CHAN_WIDTH_10:
+       case NL80211_CHAN_WIDTH_20_NOHT:
+       case NL80211_CHAN_WIDTH_20:
+               break;
+       case NL80211_CHAN_WIDTH_40:
+               if (chandef.center_freq1 < chandef.chan->center_freq)
+                       bss_cfg->band_cfg |= MWIFIEX_SEC_CHAN_BELOW;
+               else
+                       bss_cfg->band_cfg |= MWIFIEX_SEC_CHAN_ABOVE;
+               break;
+       case NL80211_CHAN_WIDTH_80:
+       case NL80211_CHAN_WIDTH_80P80:
+       case NL80211_CHAN_WIDTH_160:
+               bss_cfg->band_cfg |=
+                   mwifiex_get_sec_chan_offset(bss_cfg->channel) << 4;
+               break;
+       default:
+               mwifiex_dbg(priv->adapter,
+                           WARN, "Unknown channel width: %d\n",
+                           chandef.width);
+               break;
+       }
+
        priv->adapter->config_bands = config_bands;
 
        if (old_bands != config_bands) {