mwifiex: uap: enable 11d based on userspace configruation
authorXinming Hu <huxm@marvell.com>
Wed, 9 Aug 2017 02:31:43 +0000 (02:31 +0000)
committerKalle Valo <kvalo@codeaurora.org>
Thu, 10 Aug 2017 08:58:38 +0000 (11:58 +0300)
This patch check whether userspace beacon data include country
ie, if so then download command to enable 11d setup in firmeare
accordingly.

Signed-off-by: Xinming Hu <huxm@marvell.com>
Signed-off-by: Cathy Luo <cluo@marvell.com>
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
drivers/net/wireless/marvell/mwifiex/cfg80211.c
drivers/net/wireless/marvell/mwifiex/main.h
drivers/net/wireless/marvell/mwifiex/uap_cmd.c

index b16b19a..32c5074 100644 (file)
@@ -2006,6 +2006,8 @@ static int mwifiex_cfg80211_start_ap(struct wiphy *wiphy,
                priv->state_11h.is_11h_active = false;
        }
 
+       mwifiex_config_uap_11d(priv, &params->beacon);
+
        if (mwifiex_config_start_uap(priv, bss_cfg)) {
                mwifiex_dbg(priv->adapter, ERROR,
                            "Failed to start AP\n");
index 0aaae08..a76bd79 100644 (file)
@@ -1564,6 +1564,9 @@ int mwifiex_config_start_uap(struct mwifiex_private *priv,
 void mwifiex_uap_del_sta_data(struct mwifiex_private *priv,
                              struct mwifiex_sta_node *node);
 
+void mwifiex_config_uap_11d(struct mwifiex_private *priv,
+                           struct cfg80211_beacon_data *beacon_data);
+
 void mwifiex_init_11h_params(struct mwifiex_private *priv);
 int mwifiex_is_11h_active(struct mwifiex_private *priv);
 int mwifiex_11h_activate(struct mwifiex_private *priv, bool flag);
index 477c29c..18f7d9b 100644 (file)
@@ -444,6 +444,28 @@ mwifiex_uap_bss_wep(u8 **tlv_buf, void *cmd_buf, u16 *param_size)
        return;
 }
 
+/* This function enable 11D if userspace set the country IE.
+ */
+void mwifiex_config_uap_11d(struct mwifiex_private *priv,
+                           struct cfg80211_beacon_data *beacon_data)
+{
+       enum state_11d_t state_11d;
+       const u8 *country_ie;
+
+       country_ie = cfg80211_find_ie(WLAN_EID_COUNTRY, beacon_data->tail,
+                                     beacon_data->tail_len);
+       if (country_ie) {
+               /* Send cmd to FW to enable 11D function */
+               state_11d = ENABLE_11D;
+               if (mwifiex_send_cmd(priv, HostCmd_CMD_802_11_SNMP_MIB,
+                                    HostCmd_ACT_GEN_SET, DOT11D_I,
+                                    &state_11d, true)) {
+                       mwifiex_dbg(priv->adapter, ERROR,
+                                   "11D: failed to enable 11D\n");
+               }
+       }
+}
+
 /* This function parses BSS related parameters from structure
  * and prepares TLVs. These TLVs are appended to command buffer.
 */
@@ -848,8 +870,6 @@ void mwifiex_uap_set_channel(struct mwifiex_private *priv,
 int mwifiex_config_start_uap(struct mwifiex_private *priv,
                             struct mwifiex_uap_bss_param *bss_cfg)
 {
-       enum state_11d_t state_11d;
-
        if (mwifiex_send_cmd(priv, HostCmd_CMD_UAP_SYS_CONFIG,
                             HostCmd_ACT_GEN_SET,
                             UAP_BSS_PARAMS_I, bss_cfg, true)) {
@@ -858,16 +878,6 @@ int mwifiex_config_start_uap(struct mwifiex_private *priv,
                return -1;
        }
 
-       /* Send cmd to FW to enable 11D function */
-       state_11d = ENABLE_11D;
-       if (mwifiex_send_cmd(priv, HostCmd_CMD_802_11_SNMP_MIB,
-                            HostCmd_ACT_GEN_SET, DOT11D_I,
-                            &state_11d, true)) {
-               mwifiex_dbg(priv->adapter, ERROR,
-                           "11D: failed to enable 11D\n");
-               return -1;
-       }
-
        if (mwifiex_send_cmd(priv, HostCmd_CMD_UAP_BSS_START,
                             HostCmd_ACT_GEN_SET, 0, NULL, true)) {
                mwifiex_dbg(priv->adapter, ERROR,