From db403bc9de1f260a17ae826062b98a953a8da114 Mon Sep 17 00:00:00 2001 From: Srinivas Dasari Date: Fri, 5 May 2023 19:49:43 +0530 Subject: [PATCH] qcacld-3.0: Allow CSA to DFS channel only if PCL list has it Currently, PCL returns all 5 GHz channel and SCC channel for SAP when an ML-STA is present. But this may lead to a case where the CSA request might be for a DFS channel which needs CAC. This needs a dedicated mac and ML-STA can't move to MLMR in such cases. When firmware attempts to move STA to MLMR from MLSR, firmware asserts as the other mac is occupied by DFS SAP for CAC operation. So, allow CSA to a DFS channel only if the channel is present in PCL list as it covers the supported channel list anyway. Fix policy mgr table entries also by allowing SCC channels only. Change-Id: I079fa6beea97fcd7c926ad4bd2bf928a0442d146 CRs-Fixed: 3484572 --- .../interface_mgr/src/wlan_if_mgr_roam.c | 3 +- .../src/wlan_policy_mgr_get_set_utils.c | 33 +++++++++++++++---- .../policy_mgr/src/wlan_policy_mgr_i.h | 4 ++- .../policy_mgr/src/wlan_policy_mgr_pcl.c | 2 +- .../src/wlan_policy_mgr_tables_2x2_dbs_i.h | 6 ++-- .../wlan_policy_mgr_tables_2x2_dbs_sbs_i.h | 6 ++-- 6 files changed, 39 insertions(+), 15 deletions(-) diff --git a/components/cmn_services/interface_mgr/src/wlan_if_mgr_roam.c b/components/cmn_services/interface_mgr/src/wlan_if_mgr_roam.c index 185c773532..8ecce7d89e 100644 --- a/components/cmn_services/interface_mgr/src/wlan_if_mgr_roam.c +++ b/components/cmn_services/interface_mgr/src/wlan_if_mgr_roam.c @@ -890,7 +890,8 @@ QDF_STATUS if_mgr_validate_candidate(struct wlan_objmgr_vdev *vdev, */ if (!wlan_vdev_mlme_is_mlo_link_vdev(vdev) && !policy_mgr_is_concurrency_allowed(psoc, mode, chan_freq, - HW_MODE_20_MHZ, conc_ext_flags)) { + HW_MODE_20_MHZ, conc_ext_flags, + NULL)) { ifmgr_info("Concurrency not allowed for this channel freq %d bssid "QDF_MAC_ADDR_FMT", selecting next", chan_freq, QDF_MAC_ADDR_REF(bssid_arg.peer_addr.bytes)); 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 bc530d4de8..59833b80f7 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 @@ -4083,7 +4083,7 @@ policy_mgr_ml_link_vdev_need_to_be_disabled(struct wlan_objmgr_psoc *psoc, return !policy_mgr_is_concurrency_allowed(psoc, PM_STA_MODE, wlan_get_operation_chan_freq(vdev), HW_MODE_20_MHZ, - conc_ext_flags.value); + conc_ext_flags.value, NULL); } static void @@ -6764,7 +6764,7 @@ policy_mgr_sta_ml_link_enable_allowed(struct wlan_objmgr_psoc *psoc, return policy_mgr_is_concurrency_allowed(psoc, PM_STA_MODE, disabled_link_freq, HW_MODE_20_MHZ, - conc_ext_flags.value); + conc_ext_flags.value, NULL); } /* @@ -7166,7 +7166,8 @@ policy_mgr_pick_link_vdev_from_inactive_list( if (policy_mgr_is_concurrency_allowed(psoc, PM_STA_MODE, inactive_freq_lst[i], HW_MODE_20_MHZ, - conc_ext_flags.value)) { + conc_ext_flags.value, + NULL)) { *picked_vdev_id = inactive_vdev_lst[i]; wlan_objmgr_vdev_release_ref(partner_vdev, WLAN_POLICY_MGR_ID); @@ -8061,9 +8062,10 @@ bool policy_mgr_is_concurrency_allowed(struct wlan_objmgr_psoc *psoc, enum policy_mgr_con_mode mode, uint32_t ch_freq, enum hw_mode_bandwidth bw, - uint32_t ext_flags) + uint32_t ext_flags, + struct policy_mgr_pcl_list *pcl) { - uint32_t num_connections = 0, count = 0, index = 0; + uint32_t num_connections = 0, count = 0, index = 0, i; bool status = false, match = false; uint32_t list[MAX_NUMBER_OF_CONC_CONNECTIONS]; struct policy_mgr_psoc_priv_obj *pm_ctx; @@ -8212,6 +8214,25 @@ bool policy_mgr_is_concurrency_allowed(struct wlan_objmgr_psoc *psoc, policy_mgr_err("LL SAP concurrency is not valid"); return status; } + + /* + * Don't allow DFS SAP on non-SCC channels if an ML-STA is already + * present. PCL list returns the SCC channels and all channels from + * other MAC in case of non-ML/single link STA. + */ + if (mode == PM_SAP_MODE && pcl && + wlan_reg_is_dfs_for_freq(pm_ctx->pdev, ch_freq)) { + for (i = 0; i < pcl->pcl_len; i++) + if (pcl->pcl_list[i] == ch_freq) { + status = true; + break; + } + if (!status) { + policy_mgr_err("SAP channel %d Not present in PCL", + ch_freq); + return status; + } + } status = true; return status; @@ -8237,7 +8258,7 @@ bool policy_mgr_allow_concurrency(struct wlan_objmgr_psoc *psoc, } allowed = policy_mgr_is_concurrency_allowed(psoc, mode, ch_freq, - bw, ext_flags); + bw, ext_flags, &pcl); /* Fourth connection concurrency check */ if (allowed && policy_mgr_get_connection_count(psoc) == 3) diff --git a/components/cmn_services/policy_mgr/src/wlan_policy_mgr_i.h b/components/cmn_services/policy_mgr/src/wlan_policy_mgr_i.h index 5cf3849334..b773b4b402 100644 --- a/components/cmn_services/policy_mgr/src/wlan_policy_mgr_i.h +++ b/components/cmn_services/policy_mgr/src/wlan_policy_mgr_i.h @@ -1086,6 +1086,7 @@ QDF_STATUS policy_mgr_nss_update(struct wlan_objmgr_psoc *psoc, * @ch_freq: channel frequency on which new connection is coming up * @bw: Bandwidth requested by the connection (optional) * @ext_flags: extended flags for concurrency check (union conc_ext_flag) + * @pcl: Optional PCL for new connection * * When a new connection is about to come up check if current * concurrency combination including the new connection is @@ -1098,7 +1099,8 @@ bool policy_mgr_is_concurrency_allowed(struct wlan_objmgr_psoc *psoc, enum policy_mgr_con_mode mode, uint32_t ch_freq, enum hw_mode_bandwidth bw, - uint32_t ext_flags); + uint32_t ext_flags, + struct policy_mgr_pcl_list *pcl); /** * policy_mgr_can_2ghz_share_low_high_5ghz_sbs() - if SBS mode is dynamic where diff --git a/components/cmn_services/policy_mgr/src/wlan_policy_mgr_pcl.c b/components/cmn_services/policy_mgr/src/wlan_policy_mgr_pcl.c index ed51fe03f9..b17142a83e 100644 --- a/components/cmn_services/policy_mgr/src/wlan_policy_mgr_pcl.c +++ b/components/cmn_services/policy_mgr/src/wlan_policy_mgr_pcl.c @@ -3859,7 +3859,7 @@ QDF_STATUS policy_mgr_get_valid_chan_weights(struct wlan_objmgr_psoc *psoc, if (!policy_mgr_is_concurrency_allowed (psoc, mode, weight->saved_chan_list[i], HW_MODE_20_MHZ, - policy_mgr_get_conc_ext_flags(vdev, false))) + policy_mgr_get_conc_ext_flags(vdev, false), NULL)) continue; /* * Keep weight 0 (WEIGHT_OF_DISALLOWED_CHANNELS) not diff --git a/components/cmn_services/policy_mgr/src/wlan_policy_mgr_tables_2x2_dbs_i.h b/components/cmn_services/policy_mgr/src/wlan_policy_mgr_tables_2x2_dbs_i.h index 6005566ebe..324437e5a7 100644 --- a/components/cmn_services/policy_mgr/src/wlan_policy_mgr_tables_2x2_dbs_i.h +++ b/components/cmn_services/policy_mgr/src/wlan_policy_mgr_tables_2x2_dbs_i.h @@ -2073,7 +2073,7 @@ pm_third_connection_pcl_dbs_2x2_table = { [PM_STA_STA_DBS_1x1] = { [PM_STA_MODE] = {PM_SCC_ON_5_SCC_ON_24_5G, PM_SCC_ON_5_SCC_ON_24, PM_SCC_ON_5_SCC_ON_24}, - [PM_SAP_MODE] = {PM_SCC_ON_5_SCC_ON_24_5G, PM_SCC_ON_5_SCC_ON_24, + [PM_SAP_MODE] = {PM_SCC_ON_5_SCC_ON_24, PM_SCC_ON_5_SCC_ON_24, PM_SCC_ON_5_SCC_ON_24}, [PM_P2P_CLIENT_MODE] = {PM_SCC_ON_5_SCC_ON_24_5G, PM_SCC_ON_5_SCC_ON_24, PM_SCC_ON_5_SCC_ON_24}, @@ -2088,7 +2088,7 @@ pm_third_connection_pcl_dbs_2x2_table = { [PM_STA_STA_DBS_2x2] = { [PM_STA_MODE] = {PM_SCC_ON_5_SCC_ON_24_5G, PM_SCC_ON_5_SCC_ON_24, PM_SCC_ON_5_SCC_ON_24}, - [PM_SAP_MODE] = {PM_SCC_ON_5_SCC_ON_24_5G, PM_SCC_ON_5_SCC_ON_24, + [PM_SAP_MODE] = {PM_SCC_ON_5_SCC_ON_24, PM_SCC_ON_5_SCC_ON_24, PM_SCC_ON_5_SCC_ON_24}, [PM_P2P_CLIENT_MODE] = {PM_SCC_ON_5_SCC_ON_24_5G, PM_SCC_ON_5_SCC_ON_24, PM_SCC_ON_5_SCC_ON_24}, @@ -2105,7 +2105,7 @@ pm_third_connection_pcl_dbs_2x2_table = { [PM_STA_MODE] = { PM_SBS_CH_5G, PM_SBS_CH, PM_SBS_CH}, [PM_SAP_MODE] = { - PM_SBS_CH_5G, PM_SBS_CH, PM_SBS_CH}, + PM_SCC_CH, PM_SCC_CH, PM_SCC_CH}, [PM_P2P_CLIENT_MODE] = { PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE, PM_MAX_PCL_TYPE}, [PM_P2P_GO_MODE] = { diff --git a/components/cmn_services/policy_mgr/src/wlan_policy_mgr_tables_2x2_dbs_sbs_i.h b/components/cmn_services/policy_mgr/src/wlan_policy_mgr_tables_2x2_dbs_sbs_i.h index d57555c0b3..7d1f1812fa 100644 --- a/components/cmn_services/policy_mgr/src/wlan_policy_mgr_tables_2x2_dbs_sbs_i.h +++ b/components/cmn_services/policy_mgr/src/wlan_policy_mgr_tables_2x2_dbs_sbs_i.h @@ -1974,7 +1974,7 @@ pm_third_connection_pcl_dbs_sbs_2x2_table = { [PM_STA_STA_DBS_1x1] = { [PM_STA_MODE] = {PM_SCC_ON_5_SCC_ON_24_5G, PM_SCC_ON_5_SCC_ON_24_5G, PM_SCC_ON_5_SCC_ON_24}, - [PM_SAP_MODE] = {PM_SCC_ON_5_SCC_ON_24_5G, PM_SCC_ON_5_SCC_ON_24, + [PM_SAP_MODE] = {PM_SCC_ON_5_SCC_ON_24, PM_SCC_ON_5_SCC_ON_24, PM_SCC_ON_5_SCC_ON_24}, [PM_P2P_CLIENT_MODE] = {PM_SCC_ON_5_SCC_ON_24_5G, PM_SCC_ON_5_SCC_ON_24_5G, @@ -1991,7 +1991,7 @@ pm_third_connection_pcl_dbs_sbs_2x2_table = { [PM_STA_STA_DBS_2x2] = { [PM_STA_MODE] = {PM_SCC_ON_5_SCC_ON_24_5G, PM_SCC_ON_5_SCC_ON_24_5G, PM_SCC_ON_5_SCC_ON_24}, - [PM_SAP_MODE] = {PM_SCC_ON_5_SCC_ON_24_5G, PM_SCC_ON_5_SCC_ON_24, + [PM_SAP_MODE] = {PM_SCC_ON_5_SCC_ON_24, PM_SCC_ON_5_SCC_ON_24, PM_SCC_ON_5_SCC_ON_24}, [PM_P2P_CLIENT_MODE] = {PM_SCC_ON_5_SCC_ON_24_5G, PM_SCC_ON_5_SCC_ON_24_5G, @@ -2009,7 +2009,7 @@ pm_third_connection_pcl_dbs_sbs_2x2_table = { [PM_STA_MODE] = { PM_SBS_CH_5G, PM_SBS_CH_5G, PM_SBS_CH}, [PM_SAP_MODE] = { - PM_SBS_CH_5G, PM_SBS_CH_5G, PM_SBS_CH}, + PM_SCC_CH, PM_SCC_CH, PM_SCC_CH}, [PM_P2P_CLIENT_MODE] = { PM_SBS_CH_5G, PM_SBS_CH_5G, PM_SBS_CH}, [PM_P2P_GO_MODE] = {