|
@@ -177,6 +177,25 @@ mwifiex_set_ht_params(struct mwifiex_private *priv,
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
+/* This function finds supported rates IE from beacon parameter and sets
|
|
|
+ * these rates into bss_config structure.
|
|
|
+ */
|
|
|
+void
|
|
|
+mwifiex_set_uap_rates(struct mwifiex_uap_bss_param *bss_cfg,
|
|
|
+ struct cfg80211_ap_settings *params)
|
|
|
+{
|
|
|
+ struct ieee_types_header *rate_ie;
|
|
|
+ int var_offset = offsetof(struct ieee80211_mgmt, u.beacon.variable);
|
|
|
+ const u8 *var_pos = params->beacon.head + var_offset;
|
|
|
+ int len = params->beacon.head_len - var_offset;
|
|
|
+
|
|
|
+ rate_ie = (void *)cfg80211_find_ie(WLAN_EID_SUPP_RATES, var_pos, len);
|
|
|
+ if (rate_ie)
|
|
|
+ memcpy(bss_cfg->rates, rate_ie + 1, rate_ie->len);
|
|
|
+
|
|
|
+ return;
|
|
|
+}
|
|
|
+
|
|
|
/* This function initializes some of mwifiex_uap_bss_param variables.
|
|
|
* This helps FW in ignoring invalid values. These values may or may not
|
|
|
* be get updated to valid ones at later stage.
|
|
@@ -323,8 +342,10 @@ mwifiex_uap_bss_param_prepare(u8 *tlv, void *cmd_buf, u16 *param_size)
|
|
|
struct host_cmd_tlv_retry_limit *retry_limit;
|
|
|
struct host_cmd_tlv_encrypt_protocol *encrypt_protocol;
|
|
|
struct host_cmd_tlv_auth_type *auth_type;
|
|
|
+ struct host_cmd_tlv_rates *tlv_rates;
|
|
|
struct mwifiex_ie_types_htcap *htcap;
|
|
|
struct mwifiex_uap_bss_param *bss_cfg = cmd_buf;
|
|
|
+ int i;
|
|
|
u16 cmd_size = *param_size;
|
|
|
|
|
|
if (bss_cfg->ssid.ssid_len) {
|
|
@@ -344,7 +365,23 @@ mwifiex_uap_bss_param_prepare(u8 *tlv, void *cmd_buf, u16 *param_size)
|
|
|
cmd_size += sizeof(struct host_cmd_tlv_bcast_ssid);
|
|
|
tlv += sizeof(struct host_cmd_tlv_bcast_ssid);
|
|
|
}
|
|
|
- if (bss_cfg->channel && bss_cfg->channel <= MAX_CHANNEL_BAND_BG) {
|
|
|
+ if (bss_cfg->rates[0]) {
|
|
|
+ tlv_rates = (struct host_cmd_tlv_rates *)tlv;
|
|
|
+ tlv_rates->tlv.type = cpu_to_le16(TLV_TYPE_UAP_RATES);
|
|
|
+
|
|
|
+ for (i = 0; i < MWIFIEX_SUPPORTED_RATES && bss_cfg->rates[i];
|
|
|
+ i++)
|
|
|
+ tlv_rates->rates[i] = bss_cfg->rates[i];
|
|
|
+
|
|
|
+ tlv_rates->tlv.len = cpu_to_le16(i);
|
|
|
+ cmd_size += sizeof(struct host_cmd_tlv_rates) + i;
|
|
|
+ tlv += sizeof(struct host_cmd_tlv_rates) + i;
|
|
|
+ }
|
|
|
+ if (bss_cfg->channel &&
|
|
|
+ ((bss_cfg->band_cfg == BAND_CONFIG_BG &&
|
|
|
+ bss_cfg->channel <= MAX_CHANNEL_BAND_BG) ||
|
|
|
+ (bss_cfg->band_cfg == BAND_CONFIG_A &&
|
|
|
+ bss_cfg->channel <= MAX_CHANNEL_BAND_A))) {
|
|
|
chan_band = (struct host_cmd_tlv_channel_band *)tlv;
|
|
|
chan_band->tlv.type = cpu_to_le16(TLV_TYPE_CHANNELBANDLIST);
|
|
|
chan_band->tlv.len =
|