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)