From 24e3f9b30a7e4bbd5ff7255ea3fcf375f2d2f200 Mon Sep 17 00:00:00 2001 From: Liangwei Dong Date: Mon, 22 Apr 2019 04:35:36 -0400 Subject: [PATCH] qcacld-3.0: Add new STA-SAP on DFS chan INI config mode Add new g_sta_sap_scc_on_dfs_chan value 2 with below enhancement: a. Allow single SAP (GO) start on DFS channel. b. Allow CAC process on DFS channel in single SAP (GO) mode c. Allow DFS radar event process in single SAP (GO) mode d. Disallow CAC and radar event process in SAP (GO) + STA mode. Change-Id: I47fdccda3314681806fa999cb01ee62052434e50 CRs-Fixed: 2465644 --- .../policy_mgr/inc/wlan_policy_mgr_api.h | 48 ++++++++++++++++ .../policy_mgr/inc/wlan_policy_mgr_cfg.h | 12 ++-- .../policy_mgr/inc/wlan_policy_mgr_ucfg.h | 29 +++++++++- .../src/wlan_policy_mgr_get_set_utils.c | 55 +++++++++++++++++++ .../policy_mgr/src/wlan_policy_mgr_ucfg.c | 7 +++ 5 files changed, 146 insertions(+), 5 deletions(-) diff --git a/components/cmn_services/policy_mgr/inc/wlan_policy_mgr_api.h b/components/cmn_services/policy_mgr/inc/wlan_policy_mgr_api.h index cd88a6cbc978..bb2739e5557c 100644 --- a/components/cmn_services/policy_mgr/inc/wlan_policy_mgr_api.h +++ b/components/cmn_services/policy_mgr/inc/wlan_policy_mgr_api.h @@ -64,6 +64,27 @@ typedef const enum policy_mgr_conc_next_action ((channel_select_logic_conc & PM_FW_MODE_STA_P2P_BIT_MASK) >> \ PM_FW_MODE_STA_P2P_BIT_POS) +/** + * enum PM_AP_DFS_MASTER_MODE - AP dfs master mode + * @PM_STA_SAP_ON_DFS_DEFAULT - Disallow STA+SAP SCC on DFS channel + * @PM_STA_SAP_ON_DFS_MASTER_MODE_DISABLED - Allow STA+SAP SCC + * on DFS channel with master mode disabled + * @PM_STA_SAP_ON_DFS_MASTER_MODE_FLEX - enhance + * "PM_STA_SAP_ON_DFS_MASTER_MODE_DISABLED" with below requirement: + * a. Allow single SAP (GO) start on DFS channel. + * b. Allow CAC process on DFS channel in single SAP (GO) mode + * c. Allow DFS radar event process in single SAP (GO) mode + * d. Disallow CAC and radar event process in SAP (GO) + STA mode. + * + * This enum value will be used to set to INI g_sta_sap_scc_on_dfs_chan to + * config the sta+sap on dfs channel behaviour expected by user. + */ +enum PM_AP_DFS_MASTER_MODE { + PM_STA_SAP_ON_DFS_DEFAULT, + PM_STA_SAP_ON_DFS_MASTER_MODE_DISABLED, + PM_STA_SAP_ON_DFS_MASTER_MODE_FLEX, +}; + /** * policy_mgr_get_allow_mcc_go_diff_bi() - to get information on whether GO * can have diff BI than STA in MCC @@ -130,6 +151,33 @@ QDF_STATUS policy_mgr_get_force_1x1(struct wlan_objmgr_psoc *psoc, QDF_STATUS policy_mgr_get_sta_sap_scc_on_dfs_chnl(struct wlan_objmgr_psoc *psoc, uint8_t *sta_sap_scc_on_dfs_chnl); + +/** + * policy_mgr_get_dfs_master_dynamic_enabled() - support dfs master or not + * on AP interafce when STA+SAP(GO) concurrency + * @psoc: pointer to psoc + * @vdev_id: sap vdev id + * + * This API is used to check AP dfs master functionality enabled or not when + * STA+SAP(GO) concurrency. + * If g_sta_sap_scc_on_dfs_chan is non-zero, the STA+SAP(GO) concurrency + * is allowed on DFS channel SCC and the SAP's DFS master functionality + * should be enable/disable according to: + * 1. g_sta_sap_scc_on_dfs_chan is 0: function return true - dfs master + * capability enabled. + * 2. g_sta_sap_scc_on_dfs_chan is 1: function return false - dfs master + * capability disabled. + * 3. g_sta_sap_scc_on_dfs_chan is 2: dfs master capability based on STA on + * 5G or not: + * a. 5G STA active - return false + * b. no 5G STA active -return true + * + * Return: true if dfs master functionality should be enabled. + */ +bool +policy_mgr_get_dfs_master_dynamic_enabled(struct wlan_objmgr_psoc *psoc, + uint8_t vdev_id); + /** * policy_mgr_get_sta_sap_scc_lte_coex_chnl() - to find out if STA & SAP * SCC is allowed on LTE COEX diff --git a/components/cmn_services/policy_mgr/inc/wlan_policy_mgr_cfg.h b/components/cmn_services/policy_mgr/inc/wlan_policy_mgr_cfg.h index 56aa26762521..89727ac7d15b 100644 --- a/components/cmn_services/policy_mgr/inc/wlan_policy_mgr_cfg.h +++ b/components/cmn_services/policy_mgr/inc/wlan_policy_mgr_cfg.h @@ -386,14 +386,18 @@ CFG_INI_UINT("gDualMacFeatureDisable", 0, 6, 0, CFG_VALUE_OR_DEFAULT, \ * g_sta_sap_scc_on_dfs_chan - Allow STA+SAP SCC on DFS channel with master * mode support disabled. * @Min: 0 - * @Max: 1 + * @Max: 2 * @Default: 0 * * This ini is used to allow STA+SAP SCC on DFS channel with master mode - * support disabled. + * support disabled, the value is defined by enum PM_AP_DFS_MASTER_MODE. * 0 - Disallow STA+SAP SCC on DFS channel * 1 - Allow STA+SAP SCC on DFS channel with master mode disabled - * + * 2 - enhance "1" with below requirement + * a. Allow single SAP (GO) start on DFS channel. + * b. Allow CAC process on DFS channel in single SAP (GO) mode + * c. Allow DFS radar event process in single SAP (GO) mode + * d. Disallow CAC and radar event process in SAP (GO) + STA mode. * Related: None. * * Supported Feature: Non-DBS, DBS @@ -404,7 +408,7 @@ CFG_INI_UINT("gDualMacFeatureDisable", 0, 6, 0, CFG_VALUE_OR_DEFAULT, \ */ #define CFG_STA_SAP_SCC_ON_DFS_CHAN \ -CFG_INI_UINT("g_sta_sap_scc_on_dfs_chan", 0, 1, 0, CFG_VALUE_OR_DEFAULT, \ +CFG_INI_UINT("g_sta_sap_scc_on_dfs_chan", 0, 2, 0, CFG_VALUE_OR_DEFAULT, \ "Allow STA+SAP SCC on DFS channel with master mode disable") /* diff --git a/components/cmn_services/policy_mgr/inc/wlan_policy_mgr_ucfg.h b/components/cmn_services/policy_mgr/inc/wlan_policy_mgr_ucfg.h index 1ced75c6c897..a339f90073bd 100644 --- a/components/cmn_services/policy_mgr/inc/wlan_policy_mgr_ucfg.h +++ b/components/cmn_services/policy_mgr/inc/wlan_policy_mgr_ucfg.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018 The Linux Foundation. All rights reserved. + * Copyright (c) 2018-2019 The Linux Foundation. All rights reserved. * * Permission to use, copy, modify, and/or distribute this software for * any purpose with or without fee is hereby granted, provided that the @@ -227,6 +227,33 @@ ucfg_policy_mgr_get_sta_sap_scc_on_dfs_chnl(struct wlan_objmgr_psoc *psoc, QDF_STATUS ucfg_policy_mgr_get_sta_sap_scc_lte_coex_chnl(struct wlan_objmgr_psoc *psoc, uint8_t *sta_sap_scc_lte_coex); + +/** + * ucfg_policy_mgr_get_dfs_master_dynamic_enabled() - support dfs master or not + * AP interface when STA+SAP(GO) concurrency + * @psoc: pointer to psoc + * @vdev_id: sap vdev id + * + * This API is used to check SAP (GO) dfs master functionality enabled or not + * when STA+SAP(GO) concurrency. + * If g_sta_sap_scc_on_dfs_chan is non-zero, the STA+SAP(GO) is allowed on DFS + * channel SCC and the SAP's DFS master functionality should be enable/disable + * according to: + * 1. g_sta_sap_scc_on_dfs_chan is 0: function return true - dfs master + * capability enabled. + * 2. g_sta_sap_scc_on_dfs_chan is 1: function return false - dfs master + * capability disabled. + * 3. g_sta_sap_scc_on_dfs_chan is 2: dfs master capability based on STA on + * 5G or not: + * a. 5G STA active - return false + * b. no 5G STA active -return true + * + * Return: true if dfs master functionality should be enabled. + */ +bool +ucfg_policy_mgr_get_dfs_master_dynamic_enabled(struct wlan_objmgr_psoc *psoc, + uint8_t vdev_id); + /** * ucfg_policy_mgr_get_sap_mandt_chnl() - to find out if SAP mandatory channel * support is enabled diff --git a/components/cmn_services/policy_mgr/src/wlan_policy_mgr_get_set_utils.c b/components/cmn_services/policy_mgr/src/wlan_policy_mgr_get_set_utils.c index 9961a4596378..85b3489fdb6c 100644 --- a/components/cmn_services/policy_mgr/src/wlan_policy_mgr_get_set_utils.c +++ b/components/cmn_services/policy_mgr/src/wlan_policy_mgr_get_set_utils.c @@ -116,6 +116,61 @@ policy_mgr_get_sta_sap_scc_on_dfs_chnl(struct wlan_objmgr_psoc *psoc, return QDF_STATUS_SUCCESS; } +bool +policy_mgr_get_dfs_master_dynamic_enabled( + struct wlan_objmgr_psoc *psoc, uint8_t vdev_id) +{ + struct policy_mgr_psoc_priv_obj *pm_ctx; + bool sta_on_5g = false; + bool sta_on_2g = false; + uint32_t i; + bool enable; + + pm_ctx = policy_mgr_get_context(psoc); + if (!pm_ctx) { + policy_mgr_err("pm_ctx is NULL"); + return true; + } + + if (!pm_ctx->cfg.sta_sap_scc_on_dfs_chnl) + return true; + if (pm_ctx->cfg.sta_sap_scc_on_dfs_chnl == + PM_STA_SAP_ON_DFS_MASTER_MODE_DISABLED) + return false; + if (pm_ctx->cfg.sta_sap_scc_on_dfs_chnl != + PM_STA_SAP_ON_DFS_MASTER_MODE_FLEX) { + policy_mgr_debug("sta_sap_scc_on_dfs_chnl %d unknown", + pm_ctx->cfg.sta_sap_scc_on_dfs_chnl); + return true; + } + + qdf_mutex_acquire(&pm_ctx->qdf_conc_list_lock); + for (i = 0; i < MAX_NUMBER_OF_CONC_CONNECTIONS; i++) { + if (!((pm_conc_connection_list[i].vdev_id != vdev_id) && + pm_conc_connection_list[i].in_use && + (pm_conc_connection_list[i].mode == PM_STA_MODE || + pm_conc_connection_list[i].mode == PM_P2P_CLIENT_MODE))) + continue; + if (WLAN_REG_IS_5GHZ_CH(pm_conc_connection_list[i].chan)) + sta_on_5g = true; + else + sta_on_2g = true; + } + qdf_mutex_release(&pm_ctx->qdf_conc_list_lock); + + if (policy_mgr_is_hw_dbs_capable(psoc) && !sta_on_5g) + enable = true; + else if (!sta_on_5g && !sta_on_2g) + enable = true; + else + enable = false; + policy_mgr_debug("sta_sap_scc_on_dfs_chnl %d sta_on_2g %d sta_on_5g %d enable %d", + pm_ctx->cfg.sta_sap_scc_on_dfs_chnl, sta_on_2g, + sta_on_5g, enable); + + return enable; +} + QDF_STATUS policy_mgr_get_sta_sap_scc_lte_coex_chnl(struct wlan_objmgr_psoc *psoc, uint8_t *sta_sap_scc_lte_coex) diff --git a/components/cmn_services/policy_mgr/src/wlan_policy_mgr_ucfg.c b/components/cmn_services/policy_mgr/src/wlan_policy_mgr_ucfg.c index 10671ef7af93..a172c0d6a821 100644 --- a/components/cmn_services/policy_mgr/src/wlan_policy_mgr_ucfg.c +++ b/components/cmn_services/policy_mgr/src/wlan_policy_mgr_ucfg.c @@ -188,6 +188,13 @@ ucfg_policy_mgr_get_sta_sap_scc_on_dfs_chnl(struct wlan_objmgr_psoc *psoc, sta_sap_scc_on_dfs_chnl); } +bool +ucfg_policy_mgr_get_dfs_master_dynamic_enabled(struct wlan_objmgr_psoc *psoc, + uint8_t vdev_id) +{ + return policy_mgr_get_dfs_master_dynamic_enabled(psoc, vdev_id); +} + QDF_STATUS ucfg_policy_mgr_get_sta_sap_scc_lte_coex_chnl(struct wlan_objmgr_psoc *psoc, uint8_t *sta_sap_scc_lte_coex)