qcacld-3.0: [11AX] Add dot11mode changes to support 11ax
Add new dot11mode and update the utility functions to derive
the dot11mode based on the userspace config, INI config and
FW capability.
Change-Id: I5780120ef7bc2b78fd596e937fe14a2c8ad88348
CRs-Fixed: 1073481
diff --git a/core/cds/src/cds_ieee80211_common_i.h b/core/cds/src/cds_ieee80211_common_i.h
index 81ea8b2..35d8039 100644
--- a/core/cds/src/cds_ieee80211_common_i.h
+++ b/core/cds/src/cds_ieee80211_common_i.h
@@ -53,6 +53,13 @@
* @IEEE80211_MODE_2G_AUTO - 2G 11 b/g/n autoselect
* @IEEE80211_MODE_5G_AUTO - 5G 11 a/n/ac autoselect
* @IEEE80211_MODE_11AGN - Support 11N in both 2G and 5G
+ * @IEEE80211_MODE_11AX_HE20 - HE20
+ * @IEEE80211_MODE_11AX_HE40 - HE40
+ * @IEEE80211_MODE_11AX_HE40PLUS - HE40 (ext ch +1)
+ * @IEEE80211_MODE_11AX_HE40MINUS - HE40 (ext ch -1)
+ * @IEEE80211_MODE_11AX_HE80 - HE80
+ * @IEEE80211_MODE_11AX_HE80P80 - HE 80P80
+ * @IEEE80211_MODE_11AX_HE160 - HE160
* @IEEE80211_MODE_MAX - Maximum possible value
*/
enum ieee80211_phymode {
@@ -79,9 +86,16 @@
IEEE80211_MODE_2G_AUTO = 20,
IEEE80211_MODE_5G_AUTO = 21,
IEEE80211_MODE_11AGN = 22,
+ IEEE80211_MODE_11AX_HE20 = 23,
+ IEEE80211_MODE_11AX_HE40 = 24,
+ IEEE80211_MODE_11AX_HE40PLUS = 25,
+ IEEE80211_MODE_11AX_HE40MINUS = 26,
+ IEEE80211_MODE_11AX_HE80 = 27,
+ IEEE80211_MODE_11AX_HE80P80 = 28,
+ IEEE80211_MODE_11AX_HE160 = 29,
/* Do not add after this line */
- IEEE80211_MODE_MAX = IEEE80211_MODE_11AGN,
+ IEEE80211_MODE_MAX = IEEE80211_MODE_11AX_HE160,
};
/**
diff --git a/core/hdd/inc/wlan_hdd_cfg.h b/core/hdd/inc/wlan_hdd_cfg.h
index 5611fa2..1b44b37 100644
--- a/core/hdd/inc/wlan_hdd_cfg.h
+++ b/core/hdd/inc/wlan_hdd_cfg.h
@@ -244,6 +244,8 @@
eHDD_DOT11_MODE_11ac_ONLY,
eHDD_DOT11_MODE_11ac,
eHDD_DOT11_MODE_11a,
+ eHDD_DOT11_MODE_11ax_ONLY,
+ eHDD_DOT11_MODE_11ax,
} eHddDot11Mode;
/*
@@ -1702,11 +1704,11 @@
* <ini>
* gDot11Mode - SAP phy mode
* @Min: 0
- * @Max: 10 (11a)
- * @Default: 9 (11ac)
+ * @Max: 12 (11ax)
+ * @Default: 12 (11ax)
*
* This ini is used to set Phy Mode (auto, b, g, n, etc/) Valid values are
- * 0-10, with 0 = Auto, 10 = 11a.
+ * 0-12, with 0 = Auto, 12 = 11ax.
*
* Related: None.
*
@@ -1718,8 +1720,8 @@
*/
#define CFG_DOT11_MODE_NAME "gDot11Mode"
#define CFG_DOT11_MODE_MIN eHDD_DOT11_MODE_AUTO
-#define CFG_DOT11_MODE_DEFAULT eHDD_DOT11_MODE_11ac
-#define CFG_DOT11_MODE_MAX eHDD_DOT11_MODE_11a
+#define CFG_DOT11_MODE_DEFAULT eHDD_DOT11_MODE_11ax
+#define CFG_DOT11_MODE_MAX eHDD_DOT11_MODE_11ax
/*
* <ini>
diff --git a/core/hdd/inc/wlan_hdd_he.h b/core/hdd/inc/wlan_hdd_he.h
index 66a875a..b046981 100644
--- a/core/hdd/inc/wlan_hdd_he.h
+++ b/core/hdd/inc/wlan_hdd_he.h
@@ -28,14 +28,26 @@
struct hdd_context_s;
struct wma_tgt_cfg;
+struct beacon_data_s;
+struct sap_Config;
+
+#define HE_CAP_OUI_TYPE "\x00\x13\x74\x01"
+#define HE_CAP_OUI_SIZE 4
#ifdef WLAN_FEATURE_11AX
void hdd_update_tgt_he_cap(struct hdd_context_s *hdd_ctx,
struct wma_tgt_cfg *cfg);
+void wlan_hdd_check_11ax_support(struct beacon_data_s *beacon,
+ struct sap_Config *config);
#else
static inline void hdd_update_tgt_he_cap(struct hdd_context_s *hdd_ctx,
struct wma_tgt_cfg *cfg)
{
}
+
+static inline void wlan_hdd_check_11ax_support(struct beacon_data_s *beacon,
+ struct sap_Config *config)
+{
+}
#endif
#endif /* if !defined(WLAN_HDD_HE_H)*/
diff --git a/core/hdd/inc/wlan_hdd_main.h b/core/hdd/inc/wlan_hdd_main.h
index 0ab9446..39d7935 100644
--- a/core/hdd/inc/wlan_hdd_main.h
+++ b/core/hdd/inc/wlan_hdd_main.h
@@ -75,6 +75,8 @@
#else
#include "wlan_hdd_oemdata.h"
#endif
+#include "wlan_hdd_he.h"
+
/*
* Preprocessor definitions and constants
*/
diff --git a/core/hdd/src/wlan_hdd_cfg.c b/core/hdd/src/wlan_hdd_cfg.c
index ba1b3ce..2a70769 100644
--- a/core/hdd/src/wlan_hdd_cfg.c
+++ b/core/hdd/src/wlan_hdd_cfg.c
@@ -45,6 +45,7 @@
#include <wlan_hdd_misc.h>
#include <wlan_hdd_napi.h>
#include <cds_concurrency.h>
+#include "wlan_hdd_he.h"
static void
cb_notify_set_roam_prefer5_g_hz(hdd_context_t *pHddCtx, unsigned long notifyId)
@@ -6070,6 +6071,10 @@
return eCSR_DOT11_MODE_AUTO;
case (eHDD_DOT11_MODE_11a):
return eCSR_DOT11_MODE_11a;
+ case (eHDD_DOT11_MODE_11ax_ONLY):
+ return eCSR_DOT11_MODE_11ax_ONLY;
+ case (eHDD_DOT11_MODE_11ax):
+ return eCSR_DOT11_MODE_11ax;
}
}
diff --git a/core/hdd/src/wlan_hdd_cfg80211.c b/core/hdd/src/wlan_hdd_cfg80211.c
index 4462b83..a5a65c6 100644
--- a/core/hdd/src/wlan_hdd_cfg80211.c
+++ b/core/hdd/src/wlan_hdd_cfg80211.c
@@ -12733,6 +12733,15 @@
hdd_notice("Dot11Mode is %u", iniDot11Mode);
switch (iniDot11Mode) {
case eHDD_DOT11_MODE_AUTO:
+ case eHDD_DOT11_MODE_11ax:
+ case eHDD_DOT11_MODE_11ax_ONLY:
+ if (sme_is_feature_supported_by_fw(DOT11AX))
+ hdd_dot11_mode = eHDD_DOT11_MODE_11ax;
+ else if (sme_is_feature_supported_by_fw(DOT11AC))
+ hdd_dot11_mode = eHDD_DOT11_MODE_11ac;
+ else
+ hdd_dot11_mode = eHDD_DOT11_MODE_11n;
+ break;
case eHDD_DOT11_MODE_11ac:
case eHDD_DOT11_MODE_11ac_ONLY:
if (sme_is_feature_supported_by_fw(DOT11AC))
diff --git a/core/hdd/src/wlan_hdd_he.c b/core/hdd/src/wlan_hdd_he.c
index bab5091..0a039f8 100644
--- a/core/hdd/src/wlan_hdd_he.c
+++ b/core/hdd/src/wlan_hdd_he.c
@@ -249,3 +249,23 @@
if (status == QDF_STATUS_E_FAILURE)
hdd_alert("could not set HE PPET");
}
+
+/**
+ * wlan_hdd_check_11ax_support() - check if beacon IE and update hw mode
+ * @beacon: beacon IE buffer
+ * @config: pointer to sap config
+ *
+ * Check if HE cap IE is present in beacon IE, if present update hw mode
+ * to 11ax.
+ *
+ * Return: None
+ */
+void wlan_hdd_check_11ax_support(beacon_data_t *beacon, tsap_Config_t *config)
+{
+ uint8_t *ie;
+
+ ie = wlan_hdd_get_vendor_oui_ie_ptr(HE_CAP_OUI_TYPE, HE_CAP_OUI_SIZE,
+ beacon->tail, beacon->tail_len);
+ if (ie)
+ config->SapHw_mode = eCSR_DOT11_MODE_11ax;
+}
diff --git a/core/hdd/src/wlan_hdd_hostapd.c b/core/hdd/src/wlan_hdd_hostapd.c
index 8a0eb62..40d0698 100644
--- a/core/hdd/src/wlan_hdd_hostapd.c
+++ b/core/hdd/src/wlan_hdd_hostapd.c
@@ -80,6 +80,8 @@
#include "wlan_hdd_object_manager.h"
#include <qca_vendor.h>
+#include "wlan_hdd_he.h"
+
#define IS_UP(_dev) \
(((_dev)->flags & (IFF_RUNNING|IFF_UP)) == (IFF_RUNNING|IFF_UP))
#define IS_UP_AUTO(_ic) \
@@ -6921,6 +6923,11 @@
if (require_vht)
pConfig->SapHw_mode = eCSR_DOT11_MODE_11ac_ONLY;
}
+
+ wlan_hdd_check_11ax_support(pBeacon, pConfig);
+
+ hdd_info("SAP hw_mode: %d", pConfig->SapHw_mode);
+
}
/**
@@ -7090,9 +7097,11 @@
hdd_ctx->config->sap_p2p_11ac_override &&
(sap_cfg->SapHw_mode == eCSR_DOT11_MODE_11n ||
sap_cfg->SapHw_mode == eCSR_DOT11_MODE_11ac ||
- sap_cfg->SapHw_mode == eCSR_DOT11_MODE_11ac_ONLY) &&
+ sap_cfg->SapHw_mode == eCSR_DOT11_MODE_11ac_ONLY ||
+ sap_cfg->SapHw_mode == eCSR_DOT11_MODE_11ax ||
+ sap_cfg->SapHw_mode == eCSR_DOT11_MODE_11ax_ONLY) &&
!hdd_ctx->config->sap_force_11n_for_11ac) {
- hdd_notice("** Driver force 11AC override for SAP/Go **");
+ hdd_notice("** Driver force override for SAP/Go **");
/* 11n only shall not be overridden since it may be on purpose*/
if (sap_cfg->SapHw_mode == eCSR_DOT11_MODE_11n)
@@ -7130,8 +7139,12 @@
/* Derive ACS HW mode */
sap_cfg->SapHw_mode = hdd_cfg_xlate_to_csr_phy_mode(
hdd_ctx->config->dot11Mode);
- if (sap_cfg->SapHw_mode == eCSR_DOT11_MODE_AUTO)
- sap_cfg->SapHw_mode = eCSR_DOT11_MODE_11ac;
+ if (sap_cfg->SapHw_mode == eCSR_DOT11_MODE_AUTO) {
+ if (sme_is_feature_supported_by_fw(DOT11AX))
+ sap_cfg->SapHw_mode = eCSR_DOT11_MODE_11ax;
+ else
+ sap_cfg->SapHw_mode = eCSR_DOT11_MODE_11ac;
+ }
if (hdd_ctx->config->sap_force_11n_for_11ac) {
if (sap_cfg->SapHw_mode == eCSR_DOT11_MODE_11ac ||
@@ -7153,8 +7166,9 @@
/* Derive ACS BW */
sap_cfg->ch_width_orig = eHT_CHANNEL_WIDTH_20MHZ;
if (sap_cfg->SapHw_mode == eCSR_DOT11_MODE_11ac ||
- sap_cfg->SapHw_mode == eCSR_DOT11_MODE_11ac_ONLY) {
-
+ sap_cfg->SapHw_mode == eCSR_DOT11_MODE_11ac_ONLY ||
+ sap_cfg->SapHw_mode == eCSR_DOT11_MODE_11ax ||
+ sap_cfg->SapHw_mode == eCSR_DOT11_MODE_11ax_ONLY) {
sap_cfg->ch_width_orig = hdd_ctx->config->vhtChannelWidth;
/* VHT in 2.4G depends on gChannelBondingMode24GHz INI param */
if (sap_cfg->acs_cfg.end_ch <= 14)
diff --git a/core/hdd/src/wlan_hdd_main.c b/core/hdd/src/wlan_hdd_main.c
index 9960bdd..292af96 100644
--- a/core/hdd/src/wlan_hdd_main.c
+++ b/core/hdd/src/wlan_hdd_main.c
@@ -93,7 +93,6 @@
#include "wlan_hdd_driver_ops.h"
#include "epping_main.h"
#include "wlan_hdd_memdump.h"
-#include "wlan_hdd_he.h"
#include <wlan_hdd_ipa.h>
#include "hif.h"
@@ -117,6 +116,7 @@
#include "os_if_wifi_pos.h"
#include "wifi_pos_api.h"
#include "wlan_hdd_oemdata.h"
+#include "wlan_hdd_he.h"
#ifdef CNSS_GENL
#include <net/cnss_nl.h>
@@ -783,6 +783,11 @@
/* Set up UAPSD */
config->apUapsdEnabled &= cfg->uapsd;
+ /* 11AX mode support */
+ if ((config->dot11Mode == eHDD_DOT11_MODE_11ax ||
+ config->dot11Mode == eHDD_DOT11_MODE_11ax_ONLY) && !cfg->en_11ax)
+ config->dot11Mode = eHDD_DOT11_MODE_11ac;
+
/* 11AC mode support */
if ((config->dot11Mode == eHDD_DOT11_MODE_11ac ||
config->dot11Mode == eHDD_DOT11_MODE_11ac_ONLY) && !cfg->en_11ac)
diff --git a/core/hdd/src/wlan_hdd_wext.c b/core/hdd/src/wlan_hdd_wext.c
index 5dd4629..0be224b 100644
--- a/core/hdd/src/wlan_hdd_wext.c
+++ b/core/hdd/src/wlan_hdd_wext.c
@@ -9850,6 +9850,26 @@
snprintf(extra, WE_MAX_STR_LEN,
"11ACVHT160");
break;
+ case eCSR_DOT11_MODE_11ax:
+ case eCSR_DOT11_MODE_11ax_ONLY:
+ /* currently using vhtChannelWidth */
+ if (hddctx->config->vhtChannelWidth ==
+ eHT_CHANNEL_WIDTH_20MHZ)
+ snprintf(extra, WE_MAX_STR_LEN,
+ "11AX_HE_20");
+ else if (hddctx->config->vhtChannelWidth ==
+ eHT_CHANNEL_WIDTH_40MHZ)
+ snprintf(extra, WE_MAX_STR_LEN,
+ "11AX_HE_40");
+ else if (hddctx->config->vhtChannelWidth ==
+ eHT_CHANNEL_WIDTH_80MHZ)
+ snprintf(extra, WE_MAX_STR_LEN,
+ "11AX_HE_80");
+ else if (hddctx->config->vhtChannelWidth ==
+ eHT_CHANNEL_WIDTH_160MHZ)
+ snprintf(extra, WE_MAX_STR_LEN,
+ "11AX_HE_160");
+ break;
}
wrqu->data.length = strlen(extra) + 1;
diff --git a/core/mac/inc/sir_api.h b/core/mac/inc/sir_api.h
index 88dca21..e0c3bce 100644
--- a/core/mac/inc/sir_api.h
+++ b/core/mac/inc/sir_api.h
@@ -547,6 +547,7 @@
eSIR_11G_NW_TYPE,
eSIR_11N_NW_TYPE,
eSIR_11AC_NW_TYPE,
+ eSIR_11AX_NW_TYPE,
eSIR_DONOT_USE_NW_TYPE = SIR_MAX_ENUM_SIZE
} tSirNwType;
diff --git a/core/mac/inc/sir_mac_prop_exts.h b/core/mac/inc/sir_mac_prop_exts.h
index 260e081..3e2a41b 100644
--- a/core/mac/inc/sir_mac_prop_exts.h
+++ b/core/mac/inc/sir_mac_prop_exts.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2011-2015 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2011-2015, 2017 The Linux Foundation. All rights reserved.
*
* Previously licensed under the ISC license by Qualcomm Atheros, Inc.
*
@@ -49,11 +49,20 @@
(dot11Mode == WNI_CFG_DOT11_MODE_11N_ONLY) || \
(dot11Mode == WNI_CFG_DOT11_MODE_11AC) || \
(dot11Mode == WNI_CFG_DOT11_MODE_11AC_ONLY) || \
+ (dot11Mode == WNI_CFG_DOT11_MODE_11AX) || \
+ (dot11Mode == WNI_CFG_DOT11_MODE_11AX_ONLY) || \
(dot11Mode == WNI_CFG_DOT11_MODE_ALL)) ? true:false)
#define IS_DOT11_MODE_VHT(dot11Mode) \
(((dot11Mode == WNI_CFG_DOT11_MODE_11AC) || \
(dot11Mode == WNI_CFG_DOT11_MODE_11AC_ONLY) || \
+ (dot11Mode == WNI_CFG_DOT11_MODE_11AX) || \
+ (dot11Mode == WNI_CFG_DOT11_MODE_11AX_ONLY) || \
+ (dot11Mode == WNI_CFG_DOT11_MODE_ALL)) ? true:false)
+
+#define IS_DOT11_MODE_HE(dot11Mode) \
+ (((dot11Mode == WNI_CFG_DOT11_MODE_11AX) || \
+ (dot11Mode == WNI_CFG_DOT11_MODE_11AX_ONLY) || \
(dot11Mode == WNI_CFG_DOT11_MODE_ALL)) ? true:false)
#define IS_DOT11_MODE_11B(dot11Mode) \
diff --git a/core/mac/inc/wni_cfg.h b/core/mac/inc/wni_cfg.h
index 00fed9d..ed599a3 100644
--- a/core/mac/inc/wni_cfg.h
+++ b/core/mac/inc/wni_cfg.h
@@ -491,7 +491,7 @@
#define WNI_CFG_PHY_MODE_NONE 3
#define WNI_CFG_DOT11_MODE_STAMIN 0
-#define WNI_CFG_DOT11_MODE_STAMAX 11
+#define WNI_CFG_DOT11_MODE_STAMAX 10
#define WNI_CFG_DOT11_MODE_STADEF 0
#define WNI_CFG_DOT11_MODE_ALL 0
@@ -503,6 +503,8 @@
#define WNI_CFG_DOT11_MODE_11N_ONLY 6
#define WNI_CFG_DOT11_MODE_11AC 7
#define WNI_CFG_DOT11_MODE_11AC_ONLY 8
+#define WNI_CFG_DOT11_MODE_11AX 9
+#define WNI_CFG_DOT11_MODE_11AX_ONLY 10
#define WNI_CFG_LISTEN_INTERVAL_STAMIN 0
#define WNI_CFG_LISTEN_INTERVAL_STAMAX 65535
diff --git a/core/mac/src/pe/include/lim_session.h b/core/mac/src/pe/include/lim_session.h
index e3a74aa..ef8bd18 100644
--- a/core/mac/src/pe/include/lim_session.h
+++ b/core/mac/src/pe/include/lim_session.h
@@ -493,6 +493,7 @@
bool ignore_assoc_disallowed;
bool send_p2p_conf_frame;
bool process_ho_fail;
+ bool he_capable;
} tPESession, *tpPESession;
/*-------------------------------------------------------------------------
diff --git a/core/mac/src/pe/lim/lim_process_mlm_req_messages.c b/core/mac/src/pe/lim/lim_process_mlm_req_messages.c
index 4eb46fd..09bbf4a 100644
--- a/core/mac/src/pe/lim/lim_process_mlm_req_messages.c
+++ b/core/mac/src/pe/lim/lim_process_mlm_req_messages.c
@@ -527,6 +527,7 @@
addbss_param->nwType = mlm_start_req->nwType;
addbss_param->htCapable = mlm_start_req->htCapable;
addbss_param->vhtCapable = session->vhtCapability;
+ addbss_param->he_capable = session->he_capable;
addbss_param->ch_width = session->ch_width;
addbss_param->ch_center_freq_seg0 =
session->ch_center_freq_seg0;
diff --git a/core/mac/src/pe/lim/lim_process_sme_req_messages.c b/core/mac/src/pe/lim/lim_process_sme_req_messages.c
index 2a7434b..f4f9827 100644
--- a/core/mac/src/pe/lim/lim_process_sme_req_messages.c
+++ b/core/mac/src/pe/lim/lim_process_sme_req_messages.c
@@ -794,9 +794,12 @@
IS_DOT11_MODE_HT(session->dot11mode);
session->vhtCapability =
IS_DOT11_MODE_VHT(session->dot11mode);
- QDF_TRACE(QDF_MODULE_ID_PE, QDF_TRACE_LEVEL_INFO,
- FL("*****session->vhtCapability = %d"),
- session->vhtCapability);
+ session->he_capable =
+ IS_DOT11_MODE_HE(session->dot11mode);
+
+ lim_log(mac_ctx, LOG1, FL("HT[%d], VHT[%d], HE[%d]"),
+ session->htCapability, session->vhtCapability,
+ session->he_capable);
session->txLdpcIniFeatureEnabled =
sme_start_bss_req->txLdpcIniFeatureEnabled;
#ifdef WLAN_FEATURE_11W
@@ -899,7 +902,8 @@
(session->htSecondaryChannelOffset) ? 1 : 0;
QDF_TRACE(QDF_MODULE_ID_PE, QDF_TRACE_LEVEL_INFO,
FL("cbMode %u"), sme_start_bss_req->cbMode);
- if (session->vhtCapability || session->htCapability) {
+ if (session->he_capable || session->vhtCapability ||
+ session->htCapability) {
chanwidth = sme_start_bss_req->vht_channel_width;
lim_log(mac_ctx, LOG1,
FL("vht_channel_width %u htSupportedChannelWidthSet %d"),
@@ -918,7 +922,7 @@
}
if (session->vhtCapability &&
- (session->ch_width > CH_WIDTH_80MHZ)) {
+ (session->ch_width > CH_WIDTH_80MHZ)) {
session->nss = 1;
lim_log(mac_ctx, LOG1, FL("nss set to [%d]"),
session->nss);
@@ -1700,8 +1704,10 @@
/*Store Persona */
session->pePersona = sme_join_req->staPersona;
QDF_TRACE(QDF_MODULE_ID_PE, QDF_TRACE_LEVEL_INFO,
- FL("PE PERSONA=%d cbMode %u"),
- session->pePersona, sme_join_req->cbMode);
+ FL("PE PERSONA=%d cbMode %u nwType: %d dot11mode: %d"),
+ session->pePersona, sme_join_req->cbMode,
+ session->nwType, session->dot11mode);
+
/* Copy The channel Id to the session Table */
session->currentOperChannel = bss_desc->channelId;
if (IS_5G_CH(session->currentOperChannel))
@@ -1730,12 +1736,16 @@
session->vht_config.su_beam_former);
}
+ session->he_capable =
+ IS_DOT11_MODE_HE(session->dot11mode);
+
lim_log(mac_ctx, LOG1,
- FL("vhtCapability: %d su_beam_formee: %d txbf_csn_value: %d su_tx_bformer %d"),
+ FL("vhtCapability: %d su_beam_formee: %d txbf_csn_value: %d su_tx_bformer %d he_capable: %d"),
session->vhtCapability,
session->vht_config.su_beam_formee,
session->vht_config.csnof_beamformer_antSup,
- session->vht_config.su_beam_former);
+ session->vht_config.su_beam_former,
+ session->he_capable);
/*Phy mode */
session->gLimPhyMode = bss_desc->nwType;
handle_ht_capabilityand_ht_info(mac_ctx, session);
diff --git a/core/mac/src/pe/lim/lim_send_messages.c b/core/mac/src/pe/lim/lim_send_messages.c
index 97eeacf..b0401b4 100644
--- a/core/mac/src/pe/lim/lim_send_messages.c
+++ b/core/mac/src/pe/lim/lim_send_messages.c
@@ -237,9 +237,12 @@
sizeof(tSirMacAddr));
pChnlParams->peSessionId = peSessionId;
pChnlParams->vhtCapable = pSessionEntry->vhtCapability;
+ pChnlParams->he_capable = pSessionEntry->he_capable;
pChnlParams->dot11_mode = pSessionEntry->dot11mode;
pChnlParams->nss = pSessionEntry->nss;
- lim_log(pMac, LOG2, FL("nss value: %d"), pChnlParams->nss);
+ lim_log(pMac, LOG1, FL("dot11mode: %d, he_capable: %d, vht_capable: %d nss value: %d"),
+ pChnlParams->dot11_mode, pChnlParams->he_capable,
+ pChnlParams->vhtCapable, pChnlParams->nss);
/*Set DFS flag for DFS channel */
if (ch_width == CH_WIDTH_160MHZ) {
diff --git a/core/sap/src/sap_module.c b/core/sap/src/sap_module.c
index 9b172f6..3a186e2 100644
--- a/core/sap/src/sap_module.c
+++ b/core/sap/src/sap_module.c
@@ -3184,13 +3184,17 @@
bufferLength = additionIELength;
pBuffer = qdf_mem_malloc(bufferLength);
if (NULL == pBuffer) {
- QDF_TRACE(QDF_MODULE_ID_SME,
+ QDF_TRACE(QDF_MODULE_ID_SAP,
QDF_TRACE_LEVEL_ERROR,
FL("Could not allocate the buffer "));
return QDF_STATUS_E_NOMEM;
}
qdf_mem_copy(pBuffer, pAdditionIEBuffer, bufferLength);
bufferValid = true;
+ QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO,
+ FL("update_type: %d"), updateType);
+ qdf_trace_hex_dump(QDF_MODULE_ID_SAP,
+ QDF_TRACE_LEVEL_INFO, pBuffer, bufferLength);
}
}
@@ -3203,9 +3207,8 @@
qdf_mem_free(pConfig->pProbeRespBcnIEsBuffer);
pConfig->probeRespBcnIEsLen = 0;
pConfig->pProbeRespBcnIEsBuffer = NULL;
- QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
- FL
- ("No Probe Resp beacone IE received in set beacon"));
+ QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO,
+ FL("No Probe Resp beacone IE received in set beacon"));
}
break;
case eUPDATE_IE_PROBE_RESP:
@@ -3216,9 +3219,8 @@
qdf_mem_free(pConfig->pProbeRespIEsBuffer);
pConfig->probeRespIEsBufferLen = 0;
pConfig->pProbeRespIEsBuffer = NULL;
- QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
- FL
- ("No Probe Response IE received in set beacon"));
+ QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO,
+ FL("No Probe Response IE received in set beacon"));
}
break;
case eUPDATE_IE_ASSOC_RESP:
@@ -3229,13 +3231,12 @@
qdf_mem_free(pConfig->pAssocRespIEsBuffer);
pConfig->assocRespIEsLen = 0;
pConfig->pAssocRespIEsBuffer = NULL;
- QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
- FL
- ("No Assoc Response IE received in set beacon"));
+ QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO,
+ FL("No Assoc Response IE received in set beacon"));
}
break;
default:
- QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
+ QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_INFO,
FL("No matching buffer type %d"), updateType);
if (pBuffer != NULL)
qdf_mem_free(pBuffer);
diff --git a/core/sme/inc/csr_api.h b/core/sme/inc/csr_api.h
index d792237..61a2b64 100644
--- a/core/sme/inc/csr_api.h
+++ b/core/sme/inc/csr_api.h
@@ -132,6 +132,8 @@
* It is for CSR internal use
*/
eCSR_DOT11_MODE_AUTO = 0x0400,
+ eCSR_DOT11_MODE_11ax = 0x0800,
+ eCSR_DOT11_MODE_11ax_ONLY = 0x1000,
/* specify the number of maximum bits for phyMode */
eCSR_NUM_PHY_MODE = 16,
diff --git a/core/sme/inc/csr_internal.h b/core/sme/inc/csr_internal.h
index 4604c83..f79e222 100644
--- a/core/sme/inc/csr_internal.h
+++ b/core/sme/inc/csr_internal.h
@@ -110,6 +110,8 @@
eCSR_CFG_DOT11_MODE_11AC_ONLY,
/* This value can never set to CFG. Its for CSR's internal use */
eCSR_CFG_DOT11_MODE_AUTO,
+ eCSR_CFG_DOT11_MODE_11AX,
+ eCSR_CFG_DOT11_MODE_11AX_ONLY,
} eCsrCfgDot11Mode;
typedef enum {
@@ -1115,17 +1117,9 @@
((eCSR_DOT11_MODE_abg & (phyMode)) || \
(eCSR_DOT11_MODE_11n & (phyMode)) || \
(eCSR_DOT11_MODE_11ac & (phyMode)) || \
+ (eCSR_DOT11_MODE_11ax & (phyMode)) || \
(eCSR_DOT11_MODE_AUTO & (phyMode)))
-#define CSR_IS_PHY_MODE_11n(phy_mode) \
- ((eCSR_DOT11_MODE_11n == phy_mode) || \
- (eCSR_DOT11_MODE_11n_ONLY == phy_mode) || \
- (eCSR_DOT11_MODE_11ac == phy_mode) || \
- (eCSR_DOT11_MODE_11ac_ONLY == phy_mode))
-
-#define CSR_IS_PHY_MODE_11ac(phy_mode) \
- ((eCSR_DOT11_MODE_11ac == phy_mode) || \
- (eCSR_DOT11_MODE_11ac_ONLY == phy_mode))
/*
* this function returns true if the NIC is operating exclusively in
* the 2.4 GHz band, meaning. it is NOT operating in the 5.0 GHz band.
diff --git a/core/sme/src/csr/csr_api_roam.c b/core/sme/src/csr/csr_api_roam.c
index 35983b0..c2f388d 100644
--- a/core/sme/src/csr/csr_api_roam.c
+++ b/core/sme/src/csr/csr_api_roam.c
@@ -6173,6 +6173,12 @@
case WNI_CFG_DOT11_MODE_11AC_ONLY:
phymode = eCSR_DOT11_MODE_11ac_ONLY;
break;
+ case WNI_CFG_DOT11_MODE_11AX:
+ phymode = eCSR_DOT11_MODE_11ax;
+ break;
+ case WNI_CFG_DOT11_MODE_11AX_ONLY:
+ phymode = eCSR_DOT11_MODE_11ax_ONLY;
+ break;
default:
break;
}
@@ -7579,7 +7585,9 @@
pCommand->u.roamCmd.fReleaseBssList = true;
pCommand->u.roamCmd.fUpdateCurRoamProfile = true;
QDF_TRACE(QDF_MODULE_ID_SME, QDF_TRACE_LEVEL_INFO,
- FL("CSR PERSONA=%d"),
+ FL("phymode: %d, cbmode: %d, CSR PERSONA=%d"),
+ pCommand->u.roamCmd.roamProfile.phyMode,
+ pCommand->u.roamCmd.roamProfile.CBMode,
pCommand->u.roamCmd.roamProfile.csrPersona);
status = csr_queue_sme_command(pMac, pCommand, fImediate);
if (!QDF_IS_STATUS_SUCCESS(status)) {
@@ -12021,6 +12029,7 @@
uint8_t opr_ch)
{
bool vht_24_ghz = mac_ctx->roam.configParam.enableVhtFor24GHz;
+
switch (mac_ctx->roam.configParam.uCfgDot11Mode) {
case eCSR_CFG_DOT11_MODE_11A:
*dot11_mode = eCSR_CFG_DOT11_MODE_11A;
@@ -12070,8 +12079,29 @@
}
*band = CSR_GET_BAND(opr_ch);
break;
+ case eCSR_CFG_DOT11_MODE_11AX:
+ case eCSR_CFG_DOT11_MODE_11AX_ONLY:
+ if (IS_FEATURE_SUPPORTED_BY_FW(DOT11AX)) {
+ *dot11_mode = mac_ctx->roam.configParam.uCfgDot11Mode;
+ } else if (IS_FEATURE_SUPPORTED_BY_FW(DOT11AC)) {
+ /*
+ * If the operating channel is in 2.4 GHz band, check
+ * for INI item to disable VHT operation in 2.4 GHz band
+ */
+ if (CDS_IS_CHANNEL_24GHZ(opr_ch) && !vht_24_ghz)
+ /* Disable 11AC operation */
+ *dot11_mode = eCSR_CFG_DOT11_MODE_11N;
+ else
+ *dot11_mode = eCSR_CFG_DOT11_MODE_11AC;
+ } else {
+ *dot11_mode = eCSR_CFG_DOT11_MODE_11N;
+ }
+ *band = CSR_GET_BAND(opr_ch);
+ break;
case eCSR_CFG_DOT11_MODE_AUTO:
- if (IS_FEATURE_SUPPORTED_BY_FW(DOT11AC)) {
+ if (IS_FEATURE_SUPPORTED_BY_FW(DOT11AX)) {
+ *dot11_mode = eCSR_CFG_DOT11_MODE_11AX;
+ } else if (IS_FEATURE_SUPPORTED_BY_FW(DOT11AC)) {
/*
* If the operating channel is in 2.4 GHz band,
* check for INI item to disable VHT operation
@@ -12217,6 +12247,7 @@
else
cfg_dot11_mode = eCSR_CFG_DOT11_MODE_11A;
}
+ sms_log(mac_ctx, LOG1, FL("dot11mode: %d"), cfg_dot11_mode);
return cfg_dot11_mode;
}
@@ -14028,9 +14059,11 @@
csr_join_req->staPersona = (uint8_t) pProfile->csrPersona;
csr_join_req->wps_registration = pProfile->bWPSAssociation;
csr_join_req->cbMode = (uint8_t) pSession->bssParams.cbMode;
- sms_log(pMac, LOG2,
- FL("CSR PERSONA=%d CSR CbMode %d"),
- pProfile->csrPersona, pSession->bssParams.cbMode);
+ sms_log(pMac, LOG1,
+ FL("CSR PERSONA=%d CSR CbMode %d dot11mode: %d"),
+ pProfile->csrPersona, pSession->bssParams.cbMode,
+ csr_join_req->dot11mode);
+
csr_join_req->uapsdPerAcBitmask = pProfile->uapsd_mask;
pSession->uapsd_mask = pProfile->uapsd_mask;
status =
diff --git a/core/sme/src/csr/csr_util.c b/core/sme/src/csr/csr_util.c
index a571871..e4d5e3a 100644
--- a/core/sme/src/csr/csr_util.c
+++ b/core/sme/src/csr/csr_util.c
@@ -1051,7 +1051,9 @@
*sap_cch = CSR_GET_HT40_MINUS_CCH(*sap_ch);
} else if (*sap_phymode == eCSR_DOT11_MODE_11ac ||
- *sap_phymode == eCSR_DOT11_MODE_11ac_ONLY) {
+ *sap_phymode == eCSR_DOT11_MODE_11ac_ONLY ||
+ *sap_phymode == eCSR_DOT11_MODE_11ax ||
+ *sap_phymode == eCSR_DOT11_MODE_11ax_ONLY) {
/*11AC only 80/40/20 Mhz supported in Rome */
if (mac_ctx->roam.configParam.nVhtChannelWidth ==
(WNI_CFG_VHT_CHANNEL_WIDTH_80MHZ + 1)) {
@@ -1847,6 +1849,9 @@
case eSIR_11N_NW_TYPE:
phyMode = eCSR_DOT11_MODE_11n;
break;
+ case eSIR_11AX_NW_TYPE:
+ phyMode = eCSR_DOT11_MODE_11ax;
+ break;
case eSIR_11AC_NW_TYPE:
default:
phyMode = eCSR_DOT11_MODE_11ac;
@@ -1864,7 +1869,9 @@
case eCSR_CFG_DOT11_MODE_AUTO:
sms_log(pMac, LOGW,
FL(" Warning: sees eCSR_CFG_DOT11_MODE_AUTO "));
- if (IS_FEATURE_SUPPORTED_BY_FW(DOT11AC))
+ if (IS_FEATURE_SUPPORTED_BY_FW(DOT11AX))
+ ret = WNI_CFG_DOT11_MODE_11AX;
+ else if (IS_FEATURE_SUPPORTED_BY_FW(DOT11AC))
ret = WNI_CFG_DOT11_MODE_11AC;
else
ret = WNI_CFG_DOT11_MODE_11N;
@@ -1899,6 +1906,22 @@
else
ret = WNI_CFG_DOT11_MODE_11N;
break;
+ case eCSR_CFG_DOT11_MODE_11AX_ONLY:
+ if (IS_FEATURE_SUPPORTED_BY_FW(DOT11AX))
+ ret = WNI_CFG_DOT11_MODE_11AX_ONLY;
+ else if (IS_FEATURE_SUPPORTED_BY_FW(DOT11AC))
+ ret = WNI_CFG_DOT11_MODE_11AC;
+ else
+ ret = WNI_CFG_DOT11_MODE_11N;
+ break;
+ case eCSR_CFG_DOT11_MODE_11AX:
+ if (IS_FEATURE_SUPPORTED_BY_FW(DOT11AX))
+ ret = WNI_CFG_DOT11_MODE_11AX;
+ else if (IS_FEATURE_SUPPORTED_BY_FW(DOT11AC))
+ ret = WNI_CFG_DOT11_MODE_11AC;
+ else
+ ret = WNI_CFG_DOT11_MODE_11N;
+ break;
default:
sms_log(pMac, LOGW, FL("doesn't expect %d as csrDo11Mode"),
csrDot11Mode);
@@ -1939,6 +1962,8 @@
if (IS_BSS_VHT_CAPABLE(pIes->VHTCaps) ||
IS_BSS_VHT_CAPABLE(pIes->vendor_vht_ie.VHTCaps))
phyMode = eCSR_DOT11_MODE_11ac;
+ if (pIes->vendor_he_cap.present)
+ phyMode = eCSR_DOT11_MODE_11ax;
}
*pPhyMode = phyMode;
}
@@ -2032,6 +2057,7 @@
break;
case eCSR_DOT11_MODE_11n:
case eCSR_DOT11_MODE_11ac:
+ case eCSR_DOT11_MODE_11ax:
cfgDot11Mode = eCSR_CFG_DOT11_MODE_11N;
break;
@@ -2065,6 +2091,7 @@
cfgDot11Mode = eCSR_CFG_DOT11_MODE_11N;
break;
case eCSR_DOT11_MODE_11ac:
+ case eCSR_DOT11_MODE_11ax:
default:
cfgDot11Mode = eCSR_CFG_DOT11_MODE_11AC;
break;
@@ -2077,6 +2104,37 @@
cfgDot11Mode = eCSR_CFG_DOT11_MODE_11AC;
}
break;
+ case eCSR_DOT11_MODE_11ax:
+ fMatch = true;
+ switch (bssPhyMode) {
+ case eCSR_DOT11_MODE_11g:
+ cfgDot11Mode = eCSR_CFG_DOT11_MODE_11G;
+ break;
+ case eCSR_DOT11_MODE_11b:
+ cfgDot11Mode = eCSR_CFG_DOT11_MODE_11B;
+ break;
+ case eCSR_DOT11_MODE_11a:
+ cfgDot11Mode = eCSR_CFG_DOT11_MODE_11A;
+ break;
+ case eCSR_DOT11_MODE_11n:
+ cfgDot11Mode = eCSR_CFG_DOT11_MODE_11N;
+ break;
+ case eCSR_DOT11_MODE_11ac:
+ cfgDot11Mode = eCSR_CFG_DOT11_MODE_11AC;
+ break;
+ case eCSR_DOT11_MODE_11ax:
+ default:
+ cfgDot11Mode = eCSR_CFG_DOT11_MODE_11AX;
+ break;
+ }
+ break;
+
+ case eCSR_DOT11_MODE_11ax_ONLY:
+ if (eCSR_DOT11_MODE_11ax == bssPhyMode) {
+ fMatch = true;
+ cfgDot11Mode = eCSR_CFG_DOT11_MODE_11AX;
+ }
+ break;
default:
fMatch = true;
@@ -2096,6 +2154,9 @@
case eCSR_DOT11_MODE_11ac:
cfgDot11Mode = eCSR_CFG_DOT11_MODE_11AC;
break;
+ case eCSR_DOT11_MODE_11ax:
+ cfgDot11Mode = eCSR_CFG_DOT11_MODE_11AX;
+ break;
default:
cfgDot11Mode = eCSR_CFG_DOT11_MODE_AUTO;
break;
@@ -2104,11 +2165,20 @@
}
if (fMatch && pCfgDot11ModeToUse) {
- if (cfgDot11Mode == eCSR_CFG_DOT11_MODE_11AC
- && (!IS_FEATURE_SUPPORTED_BY_FW(DOT11AC)))
- *pCfgDot11ModeToUse = eCSR_CFG_DOT11_MODE_11N;
- else
- *pCfgDot11ModeToUse = cfgDot11Mode;
+ if (cfgDot11Mode == eCSR_CFG_DOT11_MODE_11AX) {
+ if (IS_FEATURE_SUPPORTED_BY_FW(DOT11AX))
+ *pCfgDot11ModeToUse = eCSR_CFG_DOT11_MODE_11AX;
+ else if (IS_FEATURE_SUPPORTED_BY_FW(DOT11AC))
+ *pCfgDot11ModeToUse = eCSR_CFG_DOT11_MODE_11AC;
+ else
+ *pCfgDot11ModeToUse = eCSR_CFG_DOT11_MODE_11N;
+ } else {
+ if (cfgDot11Mode == eCSR_CFG_DOT11_MODE_11AC
+ && (!IS_FEATURE_SUPPORTED_BY_FW(DOT11AC)))
+ *pCfgDot11ModeToUse = eCSR_CFG_DOT11_MODE_11N;
+ else
+ *pCfgDot11ModeToUse = cfgDot11Mode;
+ }
}
return fMatch;
}
@@ -2144,14 +2214,20 @@
if ((0 == phyMode) || (eCSR_DOT11_MODE_AUTO & phyMode)) {
if (eCSR_CFG_DOT11_MODE_ABG ==
- pMac->roam.configParam.uCfgDot11Mode)
+ pMac->roam.configParam.uCfgDot11Mode) {
phyMode = eCSR_DOT11_MODE_abg;
- else if (eCSR_CFG_DOT11_MODE_AUTO ==
- pMac->roam.configParam.uCfgDot11Mode)
- phyMode = eCSR_DOT11_MODE_11ac;
- else
+ } else if (eCSR_CFG_DOT11_MODE_AUTO ==
+ pMac->roam.configParam.uCfgDot11Mode) {
+ if (IS_FEATURE_SUPPORTED_BY_FW(DOT11AX))
+ phyMode = eCSR_DOT11_MODE_11ax;
+ else if (IS_FEATURE_SUPPORTED_BY_FW(DOT11AC))
+ phyMode = eCSR_DOT11_MODE_11ac;
+ else
+ phyMode = eCSR_DOT11_MODE_11n;
+ } else {
/* user's pick */
phyMode = pMac->roam.configParam.phyMode;
+ }
}
if ((0 == phyMode) || (eCSR_DOT11_MODE_AUTO & phyMode)) {
@@ -2195,6 +2271,8 @@
&& ((eCSR_CFG_DOT11_MODE_11N ==
cfgDot11ModeToUse) ||
(eCSR_CFG_DOT11_MODE_11AC ==
+ cfgDot11ModeToUse) ||
+ (eCSR_CFG_DOT11_MODE_11AX ==
cfgDot11ModeToUse))) {
/* We cannot do 11n here */
if (!CDS_IS_CHANNEL_5GHZ
@@ -2219,8 +2297,19 @@
eCsrBand eBand = pMac->roam.configParam.eBand;
if ((0 == phyMode) ||
- (eCSR_DOT11_MODE_11ac & phyMode) ||
- (eCSR_DOT11_MODE_AUTO & phyMode)) {
+ (eCSR_DOT11_MODE_AUTO & phyMode) ||
+ (eCSR_DOT11_MODE_11ax & phyMode)) {
+ if (IS_FEATURE_SUPPORTED_BY_FW(DOT11AX)) {
+ cfgDot11ModeToUse = eCSR_CFG_DOT11_MODE_11AX;
+ } else if (IS_FEATURE_SUPPORTED_BY_FW(DOT11AC)) {
+ cfgDot11ModeToUse = eCSR_CFG_DOT11_MODE_11AC;
+ } else {
+ /* Default to 11N mode if user has configured 11ac mode
+ * and FW doesn't supports 11ac mode .
+ */
+ cfgDot11ModeToUse = eCSR_CFG_DOT11_MODE_11N;
+ }
+ } else if (eCSR_DOT11_MODE_11ac & phyMode) {
if (IS_FEATURE_SUPPORTED_BY_FW(DOT11AC)) {
cfgDot11ModeToUse = eCSR_CFG_DOT11_MODE_11AC;
} else {
@@ -5784,6 +5873,23 @@
cfgDot11Mode = eCSR_CFG_DOT11_MODE_11N;
}
break;
+ case eCSR_DOT11_MODE_11ax:
+ if (IS_FEATURE_SUPPORTED_BY_FW(DOT11AX))
+ cfgDot11Mode = eCSR_CFG_DOT11_MODE_11AX;
+ else if (IS_FEATURE_SUPPORTED_BY_FW(DOT11AC))
+ cfgDot11Mode = eCSR_CFG_DOT11_MODE_11AC;
+ else
+ cfgDot11Mode = eCSR_CFG_DOT11_MODE_11N;
+ break;
+ case eCSR_DOT11_MODE_11ax_ONLY:
+ if (IS_FEATURE_SUPPORTED_BY_FW(DOT11AX))
+ cfgDot11Mode = eCSR_CFG_DOT11_MODE_11AX_ONLY;
+ else if (IS_FEATURE_SUPPORTED_BY_FW(DOT11AC))
+ cfgDot11Mode = eCSR_CFG_DOT11_MODE_11AC;
+ else
+ cfgDot11Mode = eCSR_CFG_DOT11_MODE_11N;
+ break;
+
default:
/* No need to assign anything here */
break;
diff --git a/core/wma/inc/wma.h b/core/wma/inc/wma.h
index 8113661..32f51de 100644
--- a/core/wma/inc/wma.h
+++ b/core/wma/inc/wma.h
@@ -1695,6 +1695,7 @@
* number of transmit streams
* @preferred_rx_streams: policy manager indicates the preferred
* number of receive streams
+ * @he_capable: HE capability
*/
struct wma_vdev_start_req {
uint32_t beacon_intval;
@@ -1719,6 +1720,7 @@
uint32_t preferred_tx_streams;
uint32_t preferred_rx_streams;
uint8_t beacon_tx_rate;
+ bool he_capable;
};
/**
diff --git a/core/wma/inc/wma_if.h b/core/wma/inc/wma_if.h
index 02f5a97..c22bf90 100644
--- a/core/wma/inc/wma_if.h
+++ b/core/wma/inc/wma_if.h
@@ -450,6 +450,7 @@
* @chainMask: chain mask
* @smpsMode: SMPS mode
* @dot11_mode: 802.11 mode
+ * @he_capable: HE Capability
*/
typedef struct {
tSirMacAddr bssId;
@@ -516,6 +517,7 @@
uint8_t beacon_tx_rate;
uint32_t tx_aggregation_size;
uint32_t rx_aggregation_size;
+ bool he_capable;
} tAddBssParams, *tpAddBssParams;
/**
@@ -910,6 +912,7 @@
uint8_t restart_on_chan_switch;
uint8_t nss;
+ bool he_capable;
} tSwitchChannelParams, *tpSwitchChannelParams;
typedef void (*tpSetLinkStateCallback)(tpAniSirGlobal pMac, void *msgParam,
diff --git a/core/wma/src/wma_dev_if.c b/core/wma/src/wma_dev_if.c
index c5e7a6a..8207366 100644
--- a/core/wma/src/wma_dev_if.c
+++ b/core/wma/src/wma_dev_if.c
@@ -2935,6 +2935,7 @@
req.ch_center_freq_seg0 = add_bss->ch_center_freq_seg0;
req.ch_center_freq_seg1 = add_bss->ch_center_freq_seg1;
req.vht_capable = add_bss->vhtCapable;
+ req.he_capable = add_bss->he_capable;
req.max_txpow = add_bss->maxTxPower;
maxTxPower = add_bss->maxTxPower;
diff --git a/core/wma/src/wma_features.c b/core/wma/src/wma_features.c
index 23c3263..af753c6 100644
--- a/core/wma/src/wma_features.c
+++ b/core/wma/src/wma_features.c
@@ -906,7 +906,8 @@
(WNI_CFG_DOT11_MODE_11G == dot11_mode) ||
(WNI_CFG_DOT11_MODE_11N == dot11_mode) ||
(WNI_CFG_DOT11_MODE_ALL == dot11_mode) ||
- (WNI_CFG_DOT11_MODE_11AC == dot11_mode)))
+ (WNI_CFG_DOT11_MODE_11AC == dot11_mode) ||
+ (WNI_CFG_DOT11_MODE_11AX == dot11_mode)))
phymode = MODE_11G;
else {
switch (dot11_mode) {
@@ -940,6 +941,13 @@
else if (40 == bw_val)
phymode = MODE_11AC_VHT40_2G;
break;
+ case WNI_CFG_DOT11_MODE_11AX:
+ case WNI_CFG_DOT11_MODE_11AX_ONLY:
+ if (20 == bw_val)
+ phymode = MODE_11AX_HE20_2G;
+ else if (40 == bw_val)
+ phymode = MODE_11AX_HE40_2G;
+ break;
default:
break;
}
@@ -952,7 +960,8 @@
((WNI_CFG_DOT11_MODE_11A == dot11_mode) ||
(WNI_CFG_DOT11_MODE_11N == dot11_mode) ||
(WNI_CFG_DOT11_MODE_ALL == dot11_mode) ||
- (WNI_CFG_DOT11_MODE_11AC == dot11_mode)))
+ (WNI_CFG_DOT11_MODE_11AC == dot11_mode) ||
+ (WNI_CFG_DOT11_MODE_11AX == dot11_mode)))
phymode = MODE_11A;
else {
switch (dot11_mode) {
@@ -981,6 +990,19 @@
else if (CH_WIDTH_80P80MHZ == chan_width)
phymode = MODE_11AC_VHT80_80;
break;
+ case WNI_CFG_DOT11_MODE_11AX:
+ case WNI_CFG_DOT11_MODE_11AX_ONLY:
+ if (20 == bw_val)
+ phymode = MODE_11AX_HE20;
+ else if (40 == bw_val)
+ phymode = MODE_11AX_HE40;
+ else if (80 == bw_val)
+ phymode = MODE_11AX_HE80;
+ else if (CH_WIDTH_160MHZ == chan_width)
+ phymode = MODE_11AX_HE160;
+ else if (CH_WIDTH_80P80MHZ == chan_width)
+ phymode = MODE_11AX_HE80_80;
+ break;
default:
break;
}
diff --git a/core/wma/src/wma_scan_roam.c b/core/wma/src/wma_scan_roam.c
index 48f63df..324711f 100644
--- a/core/wma/src/wma_scan_roam.c
+++ b/core/wma/src/wma_scan_roam.c
@@ -2938,9 +2938,14 @@
req.is_quarter_rate = 1;
req.vht_capable = params->vhtCapable;
+ req.he_capable = params->he_capable;
req.ch_center_freq_seg0 = params->ch_center_freq_seg0;
req.ch_center_freq_seg1 = params->ch_center_freq_seg1;
req.dot11_mode = params->dot11_mode;
+
+ WMA_LOGI(FL("vht_capable: %d, he_capable: %d, dot11_mode: %d"),
+ req.vht_capable, req.he_capable, req.dot11_mode);
+
status = wma_get_current_hw_mode(&hw_mode);
if (!QDF_IS_STATUS_SUCCESS(status))
WMA_LOGE("wma_get_current_hw_mode failed");