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");