These changes are the raw update to linux-4.4.6-rt14. Kernel sources
[kvmfornfv.git] / kernel / drivers / net / wireless / mwifiex / uap_cmd.c
index f5c2af0..759a6ad 100644 (file)
@@ -167,7 +167,7 @@ mwifiex_set_ht_params(struct mwifiex_private *priv,
        ht_ie = cfg80211_find_ie(WLAN_EID_HT_CAPABILITY, params->beacon.tail,
                                 params->beacon.tail_len);
        if (ht_ie) {
-               memcpy(&bss_cfg->ht_cap, ht_ie,
+               memcpy(&bss_cfg->ht_cap, ht_ie + 2,
                       sizeof(struct ieee80211_ht_cap));
                cap_info = le16_to_cpu(bss_cfg->ht_cap.cap_info);
                memset(&bss_cfg->ht_cap.mcs, 0,
@@ -184,8 +184,8 @@ mwifiex_set_ht_params(struct mwifiex_private *priv,
                        bss_cfg->ht_cap.mcs.rx_mask[1] = 0xff;
                        break;
                default:
-                       dev_warn(priv->adapter->dev,
-                                "Unsupported RX-STBC, default to 2x2\n");
+                       mwifiex_dbg(priv->adapter, WARN,
+                                   "Unsupported RX-STBC, default to 2x2\n");
                        bss_cfg->ht_cap.mcs.rx_mask[0] = 0xff;
                        bss_cfg->ht_cap.mcs.rx_mask[1] = 0xff;
                        break;
@@ -222,6 +222,23 @@ void mwifiex_set_vht_params(struct mwifiex_private *priv,
        return;
 }
 
+/* This function updates 11ac related parameters from IE
+ * and sets them into bss_config structure.
+ */
+void mwifiex_set_tpc_params(struct mwifiex_private *priv,
+                           struct mwifiex_uap_bss_param *bss_cfg,
+                           struct cfg80211_ap_settings *params)
+{
+       const u8 *tpc_ie;
+
+       tpc_ie = cfg80211_find_ie(WLAN_EID_TPC_REQUEST, params->beacon.tail,
+                                 params->beacon.tail_len);
+       if (tpc_ie)
+               bss_cfg->power_constraint = *(tpc_ie + 2);
+       else
+               bss_cfg->power_constraint = 0;
+}
+
 /* Enable VHT only when cfg80211_ap_settings has VHT IE.
  * Otherwise disable VHT.
  */
@@ -466,6 +483,7 @@ mwifiex_uap_bss_param_prepare(u8 *tlv, void *cmd_buf, u16 *param_size)
        struct host_cmd_tlv_auth_type *auth_type;
        struct host_cmd_tlv_rates *tlv_rates;
        struct host_cmd_tlv_ageout_timer *ao_timer, *ps_ao_timer;
+       struct host_cmd_tlv_power_constraint *pwr_ct;
        struct mwifiex_ie_types_htcap *htcap;
        struct mwifiex_ie_types_wmmcap *wmm_cap;
        struct mwifiex_uap_bss_param *bss_cfg = cmd_buf;
@@ -644,6 +662,15 @@ mwifiex_uap_bss_param_prepare(u8 *tlv, void *cmd_buf, u16 *param_size)
                tlv += sizeof(*ao_timer);
        }
 
+       if (bss_cfg->power_constraint) {
+               pwr_ct = (void *)tlv;
+               pwr_ct->header.type = cpu_to_le16(TLV_TYPE_PWR_CONSTRAINT);
+               pwr_ct->header.len = cpu_to_le16(sizeof(u8));
+               pwr_ct->constraint = bss_cfg->power_constraint;
+               cmd_size += sizeof(*pwr_ct);
+               tlv += sizeof(*pwr_ct);
+       }
+
        if (bss_cfg->ps_sta_ao_timer) {
                ps_ao_timer = (struct host_cmd_tlv_ageout_timer *)tlv;
                ps_ao_timer->header.type =
@@ -754,6 +781,8 @@ int mwifiex_uap_prepare_cmd(struct mwifiex_private *priv, u16 cmd_no,
                break;
        case HostCmd_CMD_UAP_BSS_START:
        case HostCmd_CMD_UAP_BSS_STOP:
+       case HOST_CMD_APCMD_SYS_RESET:
+       case HOST_CMD_APCMD_STA_LIST:
                cmd->command = cpu_to_le16(cmd_no);
                cmd->size = cpu_to_le16(S_DS_GEN);
                break;
@@ -767,18 +796,21 @@ int mwifiex_uap_prepare_cmd(struct mwifiex_private *priv, u16 cmd_no,
                        return -1;
                break;
        default:
-               dev_err(priv->adapter->dev,
-                       "PREP_CMD: unknown cmd %#x\n", cmd_no);
+               mwifiex_dbg(priv->adapter, ERROR,
+                           "PREP_CMD: unknown cmd %#x\n", cmd_no);
                return -1;
        }
 
        return 0;
 }
 
-void mwifiex_uap_set_channel(struct mwifiex_uap_bss_param *bss_cfg,
+void mwifiex_uap_set_channel(struct mwifiex_private *priv,
+                            struct mwifiex_uap_bss_param *bss_cfg,
                             struct cfg80211_chan_def chandef)
 {
-       u8 config_bands = 0;
+       u8 config_bands = 0, old_bands = priv->adapter->config_bands;
+
+       priv->bss_chandef = chandef;
 
        bss_cfg->channel = ieee80211_frequency_to_channel(
                                                     chandef.chan->center_freq);
@@ -800,30 +832,42 @@ void mwifiex_uap_set_channel(struct mwifiex_uap_bss_param *bss_cfg,
                if (chandef.width > NL80211_CHAN_WIDTH_40)
                        config_bands |= BAND_AAC;
        }
+
+       priv->adapter->config_bands = config_bands;
+
+       if (old_bands != config_bands) {
+               mwifiex_send_domain_info_cmd_fw(priv->adapter->wiphy);
+               mwifiex_dnld_txpwr_table(priv);
+       }
 }
 
 int mwifiex_config_start_uap(struct mwifiex_private *priv,
                             struct mwifiex_uap_bss_param *bss_cfg)
 {
-       if (mwifiex_del_mgmt_ies(priv))
-               dev_err(priv->adapter->dev, "Failed to delete mgmt IEs!\n");
-
-       if (mwifiex_send_cmd(priv, HostCmd_CMD_UAP_BSS_STOP,
-                            HostCmd_ACT_GEN_SET, 0, NULL, true)) {
-               dev_err(priv->adapter->dev, "Failed to stop the BSS\n");
-               return -1;
-       }
+       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, false)) {
-               dev_err(priv->adapter->dev, "Failed to set the SSID\n");
+               mwifiex_dbg(priv->adapter, ERROR,
+                           "Failed to set the SSID\n");
+               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, false)) {
-               dev_err(priv->adapter->dev, "Failed to start the BSS\n");
+               mwifiex_dbg(priv->adapter, ERROR,
+                           "Failed to start the BSS\n");
                return -1;
        }