diff --git a/Kbuild b/Kbuild index 2089477828fd..00d3957946a5 100644 --- a/Kbuild +++ b/Kbuild @@ -1459,7 +1459,8 @@ CDEFINES := -DANI_LITTLE_BYTE_ENDIAN \ -DCONFIG_MCL \ -DWLAN_PMO_ENABLE \ -DCONVERGED_P2P_ENABLE \ - -DWLAN_POLICY_MGR_ENABLE + -DWLAN_POLICY_MGR_ENABLE \ + -DSUPPORT_11AX ############ WIFI POS ############## diff --git a/core/cds/src/cds_ieee80211_common_i.h b/core/cds/src/cds_ieee80211_common_i.h index 81ea8b2a52d6..35d803957053 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 @@ enum ieee80211_phymode { 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 5611fa217a23..1b44b37b4f44 100644 --- a/core/hdd/inc/wlan_hdd_cfg.h +++ b/core/hdd/inc/wlan_hdd_cfg.h @@ -244,6 +244,8 @@ typedef enum { 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 @@ typedef enum { * * 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 @@ typedef enum { */ #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 /* * diff --git a/core/hdd/inc/wlan_hdd_he.h b/core/hdd/inc/wlan_hdd_he.h index 66a875aafabd..b04698110a72 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 0ab944622d77..39d793527340 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 ba1b3cefd958..2a707696bdd6 100644 --- a/core/hdd/src/wlan_hdd_cfg.c +++ b/core/hdd/src/wlan_hdd_cfg.c @@ -45,6 +45,7 @@ #include #include #include +#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 @@ eCsrPhyMode hdd_cfg_xlate_to_csr_phy_mode(eHddDot11Mode dot11Mode) 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 4462b83b82c0..a5a65c633550 100644 --- a/core/hdd/src/wlan_hdd_cfg80211.c +++ b/core/hdd/src/wlan_hdd_cfg80211.c @@ -12733,6 +12733,15 @@ void hdd_select_cbmode(hdd_adapter_t *pAdapter, uint8_t operationChannel, 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 bab50919a3e4..0a039f8b24f5 100644 --- a/core/hdd/src/wlan_hdd_he.c +++ b/core/hdd/src/wlan_hdd_he.c @@ -249,3 +249,23 @@ void hdd_update_tgt_he_cap(struct hdd_context_s *hdd_ctx, 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 8a0eb628af4c..40d06981773d 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 +#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 @@ static void wlan_hdd_set_sap_hwmode(hdd_adapter_t *pHostapdAdapter) 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 @@ static int wlan_hdd_setup_driver_overrides(hdd_adapter_t *ap_adapter) 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 @@ setup_acs_overrides: /* 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 @@ setup_acs_overrides: /* 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 9960bdd647ba..292af962290e 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 #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 @@ -783,6 +783,11 @@ static void hdd_update_tgt_services(hdd_context_t *hdd_ctx, /* 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 5dd46297b1de..0be224b6a8d3 100644 --- a/core/hdd/src/wlan_hdd_wext.c +++ b/core/hdd/src/wlan_hdd_wext.c @@ -9850,6 +9850,26 @@ static int __iw_get_char_setnone(struct net_device *dev, 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 88dca219bf26..e0c3bce625d0 100644 --- a/core/mac/inc/sir_api.h +++ b/core/mac/inc/sir_api.h @@ -547,6 +547,7 @@ typedef enum eSirNwType { 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 260e081be46c..3e2a41b86072 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 00fed9d343c0..ed599a35e3c6 100644 --- a/core/mac/inc/wni_cfg.h +++ b/core/mac/inc/wni_cfg.h @@ -491,7 +491,7 @@ enum { #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 @@ enum { #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 e3a74aa7e5dc..ef8bd18dc4cf 100644 --- a/core/mac/src/pe/include/lim_session.h +++ b/core/mac/src/pe/include/lim_session.h @@ -493,6 +493,7 @@ typedef struct sPESession /* Added to Support BT-AMP */ 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 4eb46fdd622b..09bbf4a85832 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 @@ lim_mlm_add_bss(tpAniSirGlobal mac_ctx, 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 2a7434b2c7a6..f4f9827794e9 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 @@ __lim_handle_sme_start_bss_request(tpAniSirGlobal mac_ctx, uint32_t *msg_buf) 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 @@ __lim_handle_sme_start_bss_request(tpAniSirGlobal mac_ctx, uint32_t *msg_buf) (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 @@ __lim_handle_sme_start_bss_request(tpAniSirGlobal mac_ctx, uint32_t *msg_buf) } 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 @@ __lim_process_sme_join_req(tpAniSirGlobal mac_ctx, uint32_t *msg_buf) /*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 @@ __lim_process_sme_join_req(tpAniSirGlobal mac_ctx, uint32_t *msg_buf) 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 97eeacfa2b40..b0401b41221f 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 @@ tSirRetStatus lim_send_switch_chnl_params(tpAniSirGlobal pMac, 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 9b172f609a3c..3a186e250b8a 100644 --- a/core/sap/src/sap_module.c +++ b/core/sap/src/sap_module.c @@ -3184,13 +3184,17 @@ wlansap_update_sap_config_add_ie(tsap_Config_t *pConfig, 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 @@ wlansap_update_sap_config_add_ie(tsap_Config_t *pConfig, 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 @@ wlansap_update_sap_config_add_ie(tsap_Config_t *pConfig, 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 @@ wlansap_update_sap_config_add_ie(tsap_Config_t *pConfig, 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 d7922374be8f..61a2b6450181 100644 --- a/core/sme/inc/csr_api.h +++ b/core/sme/inc/csr_api.h @@ -132,6 +132,8 @@ typedef enum { * 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 4604c835333d..f79e222210d4 100644 --- a/core/sme/inc/csr_internal.h +++ b/core/sme/inc/csr_internal.h @@ -110,6 +110,8 @@ typedef enum { 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 @@ typedef struct tagCsrRoamStruct { ((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 35983b09665f..c2f388dd18e5 100644 --- a/core/sme/src/csr/csr_api_roam.c +++ b/core/sme/src/csr/csr_api_roam.c @@ -6173,6 +6173,12 @@ static eCsrPhyMode csr_roamdot11mode_to_phymode(uint8_t dot11mode) 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 @@ QDF_STATUS csr_roam_issue_connect(tpAniSirGlobal pMac, uint32_t sessionId, 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 @@ csr_compute_mode_and_band(tpAniSirGlobal mac_ctx, 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 @@ csr_compute_mode_and_band(tpAniSirGlobal mac_ctx, } *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 @@ csr_roam_get_phy_mode_band_for_bss(tpAniSirGlobal mac_ctx, 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 @@ QDF_STATUS csr_send_join_req_msg(tpAniSirGlobal pMac, uint32_t sessionId, 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 a571871e4925..e4d5e3a48779 100644 --- a/core/sme/src/csr/csr_util.c +++ b/core/sme/src/csr/csr_util.c @@ -1051,7 +1051,9 @@ static void csr_calc_chb_for_sap_phymode(tpAniSirGlobal mac_ctx, *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 @@ static eCsrPhyMode csr_translate_to_phy_mode_from_bss_desc( 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 @@ uint32_t csr_translate_to_wni_cfg_dot11_mode(tpAniSirGlobal pMac, 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 @@ uint32_t csr_translate_to_wni_cfg_dot11_mode(tpAniSirGlobal pMac, 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 @@ QDF_STATUS csr_get_phy_mode_from_bss(tpAniSirGlobal pMac, 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 @@ static bool csr_get_phy_mode_in_use(eCsrPhyMode phyModeIn, 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 @@ static bool csr_get_phy_mode_in_use(eCsrPhyMode phyModeIn, 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 @@ static bool csr_get_phy_mode_in_use(eCsrPhyMode phyModeIn, 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 @@ static bool csr_get_phy_mode_in_use(eCsrPhyMode phyModeIn, 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 @@ static bool csr_get_phy_mode_in_use(eCsrPhyMode phyModeIn, } 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 @@ bool csr_is_phy_mode_match(tpAniSirGlobal pMac, uint32_t phyMode, 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 @@ bool csr_is_phy_mode_match(tpAniSirGlobal pMac, uint32_t phyMode, && ((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 @@ eCsrCfgDot11Mode csr_find_best_phy_mode(tpAniSirGlobal pMac, uint32_t phyMode) 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 @@ eCsrCfgDot11Mode csr_get_cfg_dot11_mode_from_csr_phy_mode(tCsrRoamProfile *pProf 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 811366151931..32f51de5044f 100644 --- a/core/wma/inc/wma.h +++ b/core/wma/inc/wma.h @@ -1695,6 +1695,7 @@ struct wma_target_req { * 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 @@ struct wma_vdev_start_req { 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 02f5a97b13cd..c22bf9047a11 100644 --- a/core/wma/inc/wma_if.h +++ b/core/wma/inc/wma_if.h @@ -450,6 +450,7 @@ typedef struct sLimMlmSetKeysReq { * @chainMask: chain mask * @smpsMode: SMPS mode * @dot11_mode: 802.11 mode + * @he_capable: HE Capability */ typedef struct { tSirMacAddr bssId; @@ -516,6 +517,7 @@ typedef struct { uint8_t beacon_tx_rate; uint32_t tx_aggregation_size; uint32_t rx_aggregation_size; + bool he_capable; } tAddBssParams, *tpAddBssParams; /** @@ -910,6 +912,7 @@ typedef struct { 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 c5e7a6a8e4a2..8207366e5b18 100644 --- a/core/wma/src/wma_dev_if.c +++ b/core/wma/src/wma_dev_if.c @@ -2935,6 +2935,7 @@ static void wma_add_bss_ap_mode(tp_wma_handle wma, tpAddBssParams add_bss) 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 23c3263dbbe2..af753c6b5046 100644 --- a/core/wma/src/wma_features.c +++ b/core/wma/src/wma_features.c @@ -906,7 +906,8 @@ WLAN_PHY_MODE wma_chan_phy_mode(u8 chan, enum phy_ch_width chan_width, (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 @@ WLAN_PHY_MODE wma_chan_phy_mode(u8 chan, enum phy_ch_width chan_width, 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 @@ WLAN_PHY_MODE wma_chan_phy_mode(u8 chan, enum phy_ch_width chan_width, ((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 @@ WLAN_PHY_MODE wma_chan_phy_mode(u8 chan, enum phy_ch_width chan_width, 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 48f63df66804..324711f74988 100644 --- a/core/wma/src/wma_scan_roam.c +++ b/core/wma/src/wma_scan_roam.c @@ -2938,9 +2938,14 @@ void wma_set_channel(tp_wma_handle wma, tpSwitchChannelParams params) 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");