From 72d32dedba628851c362eb510dff59b0943e1908 Mon Sep 17 00:00:00 2001 From: Zhu Jianmin Date: Fri, 11 May 2018 10:54:10 +0800 Subject: [PATCH] qcacld-3.0: ini parameter to allow STA+SAP SCC on LTE coex channel When Force SCC and STA+SAP SCC on LTE coex channel are enabled: 1. When STA on LTE coex channel, start SAP, select STA channel. 2. When SAP on, connect STA on LTE coex channel, then switch SAP channel to STA channel. Change-Id: I3f3972df43318473342d42012be3a57b8baad965 CRs-Fixed: 2235704 --- core/hdd/inc/wlan_hdd_cfg.h | 25 +++++++++++++++++++++++++ core/hdd/src/wlan_hdd_cfg.c | 11 +++++++++++ core/hdd/src/wlan_hdd_hostapd.c | 3 ++- core/sap/src/sap_fsm.c | 14 ++++++++++++-- 4 files changed, 50 insertions(+), 3 deletions(-) diff --git a/core/hdd/inc/wlan_hdd_cfg.h b/core/hdd/inc/wlan_hdd_cfg.h index 095589bdef58..ef76fce5e850 100644 --- a/core/hdd/inc/wlan_hdd_cfg.h +++ b/core/hdd/inc/wlan_hdd_cfg.h @@ -9162,6 +9162,30 @@ enum dot11p_mode { #define CFG_STA_SAP_SCC_ON_DFS_CHAN_MAX (1) #define CFG_STA_SAP_SCC_ON_DFS_CHAN_DEFAULT (0) +/* + * + * g_sta_sap_scc_on_lte_coex_chan - Allow STA+SAP SCC on LTE coex channel + * @Min: 0 + * @Max: 1 + * @Default: 0 + * + * This ini is used to allow STA+SAP SCC on LTE coex channel + * 0 - Disallow STA+SAP SCC on LTE coex channel + * 1 - Allow STA+SAP SCC on LTE coex channel + * + * Related: None. + * + * Supported Feature: Non-DBS, DBS + * + * Usage: Internal/External + * + * + */ +#define CFG_STA_SAP_SCC_ON_LTE_COEX_CHAN "g_sta_sap_scc_on_lte_coex_chan" +#define CFG_STA_SAP_SCC_ON_LTE_COEX_CHAN_MIN (0) +#define CFG_STA_SAP_SCC_ON_LTE_COEX_CHAN_MAX (1) +#define CFG_STA_SAP_SCC_ON_LTE_COEX_CHAN_DEFAULT (0) + /* * gPNOChannelPrediction will allow user to enable/disable the * PNO channel prediction feature. @@ -14794,6 +14818,7 @@ struct hdd_config { uint32_t dual_mac_feature_disable; uint8_t dbs_scan_selection[CFG_DBS_SCAN_PARAM_LENGTH]; uint32_t sta_sap_scc_on_dfs_chan; + uint32_t sta_sap_scc_on_lte_coex_chan; bool tx_chain_mask_cck; uint8_t tx_chain_mask_1ss; bool smart_chainmask_enabled; diff --git a/core/hdd/src/wlan_hdd_cfg.c b/core/hdd/src/wlan_hdd_cfg.c index 6a082d151505..9fdc19e7aa30 100644 --- a/core/hdd/src/wlan_hdd_cfg.c +++ b/core/hdd/src/wlan_hdd_cfg.c @@ -3599,6 +3599,12 @@ struct reg_table_entry g_registry_table[] = { CFG_STA_SAP_SCC_ON_DFS_CHAN_MIN, CFG_STA_SAP_SCC_ON_DFS_CHAN_MAX), + REG_VARIABLE(CFG_STA_SAP_SCC_ON_LTE_COEX_CHAN, WLAN_PARAM_HexInteger, + struct hdd_config, sta_sap_scc_on_lte_coex_chan, + VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT, + CFG_STA_SAP_SCC_ON_LTE_COEX_CHAN_DEFAULT, + CFG_STA_SAP_SCC_ON_LTE_COEX_CHAN_MIN, + CFG_STA_SAP_SCC_ON_LTE_COEX_CHAN_MAX), #ifdef FEATURE_WLAN_SCAN_PNO REG_VARIABLE(CFG_PNO_CHANNEL_PREDICTION_NAME, WLAN_PARAM_Integer, @@ -6871,6 +6877,9 @@ void hdd_cfg_print(struct hdd_context *hdd_ctx) hdd_debug("Name = [%s] value = [%u]", CFG_STA_SAP_SCC_ON_DFS_CHAN, hdd_ctx->config->sta_sap_scc_on_dfs_chan); + hdd_debug("Name = [%s] value = [%u]", + CFG_STA_SAP_SCC_ON_LTE_COEX_CHAN, + hdd_ctx->config->sta_sap_scc_on_lte_coex_chan); #ifdef FEATURE_WLAN_SCAN_PNO hdd_debug("Name = [%s] Value = [%u]", CFG_PNO_CHANNEL_PREDICTION_NAME, @@ -8427,6 +8436,8 @@ QDF_STATUS hdd_set_policy_mgr_user_cfg(struct hdd_context *hdd_ctx) hdd_ctx->config->sta_sap_scc_on_dfs_chan; user_cfg->channel_select_logic_conc = hdd_ctx->config->channel_select_logic_conc; + user_cfg->sta_sap_scc_on_lte_coex_chan = + hdd_ctx->config->sta_sap_scc_on_lte_coex_chan; status = policy_mgr_set_user_cfg(hdd_ctx->hdd_psoc, user_cfg); qdf_mem_free(user_cfg); diff --git a/core/hdd/src/wlan_hdd_hostapd.c b/core/hdd/src/wlan_hdd_hostapd.c index d54b960281df..413234711508 100644 --- a/core/hdd/src/wlan_hdd_hostapd.c +++ b/core/hdd/src/wlan_hdd_hostapd.c @@ -2724,7 +2724,8 @@ int hdd_softap_set_channel_change(struct net_device *dev, int target_channel, status = wlansap_set_channel_change_with_csa( WLAN_HDD_GET_SAP_CTX_PTR(adapter), (uint32_t)target_channel, - target_bw, forced); + target_bw, + forced && !(hdd_ctx->config->sta_sap_scc_on_lte_coex_chan)); if (QDF_STATUS_SUCCESS != status) { hdd_err("SAP set channel failed for channel: %d, bw: %d", diff --git a/core/sap/src/sap_fsm.c b/core/sap/src/sap_fsm.c index 4800bc13e354..8fe3157afeea 100644 --- a/core/sap/src/sap_fsm.c +++ b/core/sap/src/sap_fsm.c @@ -951,6 +951,9 @@ QDF_STATUS sap_goto_channel_sel(struct sap_context *sap_context, sap_context->channel, sap_context->csr_roamProfile.phyMode, sap_context->cc_switch_mode); + QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_DEBUG, + FL("After check overlap: con_ch:%d"), + con_ch); if (sap_context->cc_switch_mode != QDF_MCC_TO_SCC_SWITCH_FORCE_PREFERRED_WITHOUT_DISCONNECTION) { if (QDF_IS_STATUS_ERROR( @@ -963,8 +966,15 @@ QDF_STATUS sap_goto_channel_sel(struct sap_context *sap_context, return QDF_STATUS_E_ABORTED; } } - if (con_ch && !wlan_reg_is_dfs_ch(mac_ctx->pdev, - con_ch)) { + QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_DEBUG, + FL("After check concurrency: con_ch:%d"), + con_ch); + if (con_ch && + (policy_mgr_sta_sap_scc_on_lte_coex_chan( + mac_ctx->psoc) || + policy_mgr_is_safe_channel(mac_ctx->psoc, + con_ch)) && + !wlan_reg_is_dfs_ch(mac_ctx->pdev, con_ch)) { QDF_TRACE(QDF_MODULE_ID_SAP, QDF_TRACE_LEVEL_ERROR, "%s: Override ch %d to %d due to CC Intf",