1 /*
2 * Copyright (c) 2018-2021 The Linux Foundation. All rights reserved.
3 * Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved.
4 *
5 * Permission to use, copy, modify, and/or distribute this software for
6 * any purpose with or without fee is hereby granted, provided that the
7 * above copyright notice and this permission notice appear in all
8 * copies.
9 *
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
11 * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
12 * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
13 * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
14 * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
15 * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
16 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
17 * PERFORMANCE OF THIS SOFTWARE.
18 */
19 #include "wlan_policy_mgr_ucfg.h"
20 #include "wlan_policy_mgr_i.h"
21 #include "cfg_ucfg_api.h"
22 #include "wlan_policy_mgr_api.h"
23 #include "wlan_nan_api.h"
24
25 #ifdef WLAN_FEATURE_SR
26 /**
27 * policy_mgr_init_same_mac_conc_sr_status() - Function initializes default
28 * value to sr_in_same_mac_conc based on INI g_enable_sr_in_same_mac_conc
29 *
30 * @psoc: Pointer to PSOC
31 *
32 * Return: void
33 */
34 static void
policy_mgr_init_same_mac_conc_sr_status(struct wlan_objmgr_psoc * psoc)35 policy_mgr_init_same_mac_conc_sr_status(struct wlan_objmgr_psoc *psoc)
36 {
37 struct policy_mgr_psoc_priv_obj *pm_ctx;
38
39 pm_ctx = policy_mgr_get_context(psoc);
40 if (!pm_ctx) {
41 policy_mgr_err("Invalid Context");
42 return;
43 }
44
45 pm_ctx->cfg.sr_in_same_mac_conc =
46 cfg_get(psoc, CFG_ENABLE_SR_IN_SAME_MAC_CONC);
47 }
48 #else
49 static void
policy_mgr_init_same_mac_conc_sr_status(struct wlan_objmgr_psoc * psoc)50 policy_mgr_init_same_mac_conc_sr_status(struct wlan_objmgr_psoc *psoc)
51 {}
52 #endif
53
policy_mgr_init_cfg(struct wlan_objmgr_psoc * psoc)54 static QDF_STATUS policy_mgr_init_cfg(struct wlan_objmgr_psoc *psoc)
55 {
56 struct policy_mgr_psoc_priv_obj *pm_ctx;
57 struct policy_mgr_cfg *cfg;
58
59 pm_ctx = policy_mgr_get_context(psoc);
60 if (!pm_ctx) {
61 policy_mgr_err("pm_ctx is NULL");
62 return QDF_STATUS_E_FAILURE;
63 }
64 cfg = &pm_ctx->cfg;
65
66 cfg->mcc_to_scc_switch = cfg_get(psoc, CFG_MCC_TO_SCC_SWITCH);
67 if (cfg->mcc_to_scc_switch != QDF_MCC_TO_SCC_SWITCH_DISABLE &&
68 cfg->mcc_to_scc_switch <
69 QDF_MCC_TO_SCC_SWITCH_FORCE_WITHOUT_DISCONNECTION) {
70 policy_mgr_info("User configured mcc_to_scc_switch: %d, overwrite it to: %d",
71 cfg->mcc_to_scc_switch,
72 QDF_MCC_TO_SCC_SWITCH_FORCE_WITHOUT_DISCONNECTION);
73 cfg->mcc_to_scc_switch =
74 QDF_MCC_TO_SCC_SWITCH_FORCE_WITHOUT_DISCONNECTION;
75 }
76
77 cfg->sys_pref = cfg_get(psoc, CFG_CONC_SYS_PREF);
78
79 if (wlan_is_mlo_sta_nan_ndi_allowed(psoc)) {
80 cfg->max_conc_cxns = cfg_get(psoc, CFG_MAX_CONC_CXNS) + 1;
81 policy_mgr_err("max_conc_cxns %d nan", cfg->max_conc_cxns);
82 } else {
83 cfg->max_conc_cxns = cfg_get(psoc, CFG_MAX_CONC_CXNS);
84 policy_mgr_err("max_conc_cxns %d non-nan", cfg->max_conc_cxns);
85 }
86 cfg->max_conc_cxns = QDF_MIN(cfg->max_conc_cxns,
87 MAX_NUMBER_OF_CONC_CONNECTIONS);
88 cfg->conc_rule1 = cfg_get(psoc, CFG_ENABLE_CONC_RULE1);
89 cfg->conc_rule2 = cfg_get(psoc, CFG_ENABLE_CONC_RULE2);
90 cfg->pcl_band_priority = cfg_get(psoc, CFG_PCL_BAND_PRIORITY);
91 cfg->dbs_selection_plcy = cfg_get(psoc, CFG_DBS_SELECTION_PLCY);
92 cfg->vdev_priority_list = cfg_get(psoc, CFG_VDEV_CUSTOM_PRIORITY_LIST);
93 cfg->chnl_select_plcy = cfg_get(psoc, CFG_CHNL_SELECT_LOGIC_CONC);
94 cfg->enable_mcc_adaptive_sch =
95 cfg_get(psoc, CFG_ENABLE_MCC_ADAPTIVE_SCH_ENABLED_NAME);
96 cfg->enable_sta_cxn_5g_band =
97 cfg_get(psoc, CFG_ENABLE_STA_CONNECTION_IN_5GHZ);
98 cfg->allow_mcc_go_diff_bi =
99 cfg_get(psoc, CFG_ALLOW_MCC_GO_DIFF_BI);
100 cfg->dual_mac_feature =
101 cfg_get(psoc, CFG_DUAL_MAC_FEATURE_DISABLE);
102 cfg->sbs_enable =
103 cfg_get(psoc, CFG_ENABLE_SBS);
104 cfg->is_force_1x1_enable =
105 cfg_get(psoc, CFG_FORCE_1X1_FEATURE);
106 cfg->sta_sap_scc_on_dfs_chnl =
107 cfg_get(psoc, CFG_STA_SAP_SCC_ON_DFS_CHAN);
108
109 /*
110 * Override concurrency sta+sap indoor flag to true if global indoor
111 * flag is true
112 */
113 cfg->sta_sap_scc_on_indoor_channel =
114 cfg_get(psoc, CFG_STA_SAP_SCC_ON_INDOOR_CHAN);
115 if (cfg_get(psoc, CFG_INDOOR_CHANNEL_SUPPORT))
116 cfg->sta_sap_scc_on_indoor_channel = true;
117
118 /*
119 * Force set sta_sap_scc_on_dfs_chnl on Non-DBS HW so that standalone
120 * SAP is not allowed on DFS channel on non-DBS HW, Also, force SCC in
121 * case of STA+SAP
122 */
123 if (cfg->sta_sap_scc_on_dfs_chnl == 2 &&
124 !cfg_get(psoc, CFG_ENABLE_DFS_MASTER_CAPABILITY))
125 cfg->sta_sap_scc_on_dfs_chnl = 0;
126 cfg->nan_sap_scc_on_lte_coex_chnl =
127 cfg_get(psoc, CFG_NAN_SAP_SCC_ON_LTE_COEX_CHAN);
128 cfg->sta_sap_scc_on_lte_coex_chnl =
129 cfg_get(psoc, CFG_STA_SAP_SCC_ON_LTE_COEX_CHAN);
130 cfg->sap_mandatory_chnl_enable =
131 cfg_get(psoc, CFG_ENABLE_SAP_MANDATORY_CHAN_LIST);
132 cfg->mark_indoor_chnl_disable =
133 cfg_get(psoc, CFG_MARK_INDOOR_AS_DISABLE_FEATURE);
134 cfg->go_force_scc = cfg_get(psoc, CFG_P2P_GO_ENABLE_FORCE_SCC);
135 cfg->multi_sap_allowed_on_same_band =
136 cfg_get(psoc, CFG_MULTI_SAP_ALLOWED_ON_SAME_BAND);
137 policy_mgr_init_same_mac_conc_sr_status(psoc);
138 cfg->use_sap_original_bw =
139 cfg_get(psoc, CFG_SAP_DEFAULT_BW_FOR_RESTART);
140 cfg->move_sap_go_1st_on_dfs_sta_csa =
141 cfg_get(psoc, CFG_MOVE_SAP_GO_1ST_ON_DFS_STA_CSA);
142
143 return QDF_STATUS_SUCCESS;
144 }
145
policy_mgr_deinit_cfg(struct wlan_objmgr_psoc * psoc)146 static void policy_mgr_deinit_cfg(struct wlan_objmgr_psoc *psoc)
147 {
148 struct policy_mgr_psoc_priv_obj *pm_ctx;
149
150 pm_ctx = policy_mgr_get_context(psoc);
151 if (!pm_ctx) {
152 policy_mgr_err("pm_ctx is NULL");
153 return;
154 }
155
156 qdf_mem_zero(&pm_ctx->cfg, sizeof(pm_ctx->cfg));
157 }
158
ucfg_policy_mgr_psoc_open(struct wlan_objmgr_psoc * psoc)159 QDF_STATUS ucfg_policy_mgr_psoc_open(struct wlan_objmgr_psoc *psoc)
160 {
161 QDF_STATUS status;
162
163 status = policy_mgr_init_cfg(psoc);
164 if (QDF_IS_STATUS_ERROR(status)) {
165 policy_mgr_err("pm_ctx is NULL");
166 return status;
167 }
168
169 status = policy_mgr_psoc_open(psoc);
170 if (QDF_IS_STATUS_ERROR(status)) {
171 policy_mgr_err("psoc open fail");
172 policy_mgr_psoc_close(psoc);
173 return status;
174 }
175
176 return QDF_STATUS_SUCCESS;
177 }
178
ucfg_policy_mgr_psoc_close(struct wlan_objmgr_psoc * psoc)179 void ucfg_policy_mgr_psoc_close(struct wlan_objmgr_psoc *psoc)
180 {
181 policy_mgr_psoc_close(psoc);
182 policy_mgr_deinit_cfg(psoc);
183 }
184
ucfg_policy_mgr_get_mcc_scc_switch(struct wlan_objmgr_psoc * psoc,uint8_t * mcc_scc_switch)185 QDF_STATUS ucfg_policy_mgr_get_mcc_scc_switch(struct wlan_objmgr_psoc *psoc,
186 uint8_t *mcc_scc_switch)
187 {
188 return policy_mgr_get_mcc_scc_switch(psoc, mcc_scc_switch);
189 }
190
ucfg_policy_mgr_get_sys_pref(struct wlan_objmgr_psoc * psoc,uint8_t * sys_pref)191 QDF_STATUS ucfg_policy_mgr_get_sys_pref(struct wlan_objmgr_psoc *psoc,
192 uint8_t *sys_pref)
193 {
194 return policy_mgr_get_sys_pref(psoc, sys_pref);
195 }
196
ucfg_policy_mgr_set_sys_pref(struct wlan_objmgr_psoc * psoc,uint8_t sys_pref)197 QDF_STATUS ucfg_policy_mgr_set_sys_pref(struct wlan_objmgr_psoc *psoc,
198 uint8_t sys_pref)
199 {
200 return policy_mgr_set_sys_pref(psoc, sys_pref);
201 }
202
ucfg_policy_mgr_get_conc_rule1(struct wlan_objmgr_psoc * psoc,uint8_t * conc_rule1)203 QDF_STATUS ucfg_policy_mgr_get_conc_rule1(struct wlan_objmgr_psoc *psoc,
204 uint8_t *conc_rule1)
205 {
206 return policy_mgr_get_conc_rule1(psoc, conc_rule1);
207 }
208
ucfg_policy_mgr_get_conc_rule2(struct wlan_objmgr_psoc * psoc,uint8_t * conc_rule2)209 QDF_STATUS ucfg_policy_mgr_get_conc_rule2(struct wlan_objmgr_psoc *psoc,
210 uint8_t *conc_rule2)
211 {
212 return policy_mgr_get_conc_rule2(psoc, conc_rule2);
213 }
214
ucfg_policy_mgr_get_chnl_select_plcy(struct wlan_objmgr_psoc * psoc,uint32_t * chnl_select_plcy)215 QDF_STATUS ucfg_policy_mgr_get_chnl_select_plcy(struct wlan_objmgr_psoc *psoc,
216 uint32_t *chnl_select_plcy)
217 {
218 return policy_mgr_get_chnl_select_plcy(psoc, chnl_select_plcy);
219 }
220
221
ucfg_policy_mgr_set_dynamic_mcc_adaptive_sch(struct wlan_objmgr_psoc * psoc,bool dynamic_mcc_adaptive_sch)222 QDF_STATUS ucfg_policy_mgr_set_dynamic_mcc_adaptive_sch(
223 struct wlan_objmgr_psoc *psoc,
224 bool dynamic_mcc_adaptive_sch)
225 {
226 return policy_mgr_set_dynamic_mcc_adaptive_sch(
227 psoc, dynamic_mcc_adaptive_sch);
228 }
229
ucfg_policy_mgr_get_dynamic_mcc_adaptive_sch(struct wlan_objmgr_psoc * psoc,bool * dynamic_mcc_adaptive_sch)230 QDF_STATUS ucfg_policy_mgr_get_dynamic_mcc_adaptive_sch(
231 struct wlan_objmgr_psoc *psoc,
232 bool *dynamic_mcc_adaptive_sch)
233 {
234 return policy_mgr_get_dynamic_mcc_adaptive_sch(
235 psoc, dynamic_mcc_adaptive_sch);
236 }
237
ucfg_policy_mgr_get_mcc_adaptive_sch(struct wlan_objmgr_psoc * psoc,bool * mcc_adaptive_sch)238 QDF_STATUS ucfg_policy_mgr_get_mcc_adaptive_sch(struct wlan_objmgr_psoc *psoc,
239 bool *mcc_adaptive_sch)
240 {
241 return policy_mgr_get_mcc_adaptive_sch(psoc, mcc_adaptive_sch);
242 }
243
ucfg_policy_mgr_get_sta_cxn_5g_band(struct wlan_objmgr_psoc * psoc,uint8_t * enable_sta_cxn_5g_band)244 QDF_STATUS ucfg_policy_mgr_get_sta_cxn_5g_band(struct wlan_objmgr_psoc *psoc,
245 uint8_t *enable_sta_cxn_5g_band)
246 {
247 return policy_mgr_get_sta_cxn_5g_band(psoc, enable_sta_cxn_5g_band);
248 }
249
250 QDF_STATUS
ucfg_policy_mgr_get_allow_mcc_go_diff_bi(struct wlan_objmgr_psoc * psoc,uint8_t * allow_mcc_go_diff_bi)251 ucfg_policy_mgr_get_allow_mcc_go_diff_bi(struct wlan_objmgr_psoc *psoc,
252 uint8_t *allow_mcc_go_diff_bi)
253 {
254 return policy_mgr_get_allow_mcc_go_diff_bi(psoc, allow_mcc_go_diff_bi);
255 }
256
ucfg_policy_mgr_get_dual_mac_feature(struct wlan_objmgr_psoc * psoc,uint8_t * dual_mac_feature)257 QDF_STATUS ucfg_policy_mgr_get_dual_mac_feature(struct wlan_objmgr_psoc *psoc,
258 uint8_t *dual_mac_feature)
259 {
260 return policy_mgr_get_dual_mac_feature(psoc, dual_mac_feature);
261 }
262
ucfg_policy_mgr_get_dual_sta_feature(struct wlan_objmgr_psoc * psoc)263 bool ucfg_policy_mgr_get_dual_sta_feature(struct wlan_objmgr_psoc *psoc)
264 {
265 return policy_mgr_allow_multiple_sta_connections(psoc);
266 }
267
ucfg_policy_mgr_get_force_1x1(struct wlan_objmgr_psoc * psoc,uint8_t * force_1x1)268 QDF_STATUS ucfg_policy_mgr_get_force_1x1(struct wlan_objmgr_psoc *psoc,
269 uint8_t *force_1x1)
270 {
271 return policy_mgr_get_force_1x1(psoc, force_1x1);
272 }
273
ucfg_policy_mgr_get_max_conc_cxns(struct wlan_objmgr_psoc * psoc)274 uint32_t ucfg_policy_mgr_get_max_conc_cxns(struct wlan_objmgr_psoc *psoc)
275 {
276 return policy_mgr_get_max_conc_cxns(psoc);
277 }
278
ucfg_policy_mgr_set_max_conc_cxns(struct wlan_objmgr_psoc * psoc,uint32_t max_conc_cxns)279 QDF_STATUS ucfg_policy_mgr_set_max_conc_cxns(struct wlan_objmgr_psoc *psoc,
280 uint32_t max_conc_cxns)
281 {
282 return policy_mgr_set_max_conc_cxns(psoc, max_conc_cxns);
283 }
284
285 QDF_STATUS
ucfg_policy_mgr_get_radio_combinations(struct wlan_objmgr_psoc * psoc,struct radio_combination * comb,uint32_t comb_max,uint32_t * comb_num)286 ucfg_policy_mgr_get_radio_combinations(struct wlan_objmgr_psoc *psoc,
287 struct radio_combination *comb,
288 uint32_t comb_max,
289 uint32_t *comb_num)
290 {
291 return policy_mgr_get_radio_combinations(psoc, comb,
292 comb_max, comb_num);
293 }
294
295 QDF_STATUS
ucfg_policy_mgr_get_sta_sap_scc_on_dfs_chnl(struct wlan_objmgr_psoc * psoc,uint8_t * sta_sap_scc_on_dfs_chnl)296 ucfg_policy_mgr_get_sta_sap_scc_on_dfs_chnl(struct wlan_objmgr_psoc *psoc,
297 uint8_t *sta_sap_scc_on_dfs_chnl)
298 {
299 return policy_mgr_get_sta_sap_scc_on_dfs_chnl(psoc,
300 sta_sap_scc_on_dfs_chnl);
301 }
302
303 bool
ucfg_policy_mgr_get_dfs_master_dynamic_enabled(struct wlan_objmgr_psoc * psoc,uint8_t vdev_id)304 ucfg_policy_mgr_get_dfs_master_dynamic_enabled(struct wlan_objmgr_psoc *psoc,
305 uint8_t vdev_id)
306 {
307 return policy_mgr_get_dfs_master_dynamic_enabled(psoc, vdev_id);
308 }
309
310 QDF_STATUS
ucfg_policy_mgr_get_sta_sap_scc_lte_coex_chnl(struct wlan_objmgr_psoc * psoc,uint8_t * sta_sap_scc_lte_coex)311 ucfg_policy_mgr_get_sta_sap_scc_lte_coex_chnl(struct wlan_objmgr_psoc *psoc,
312 uint8_t *sta_sap_scc_lte_coex)
313 {
314 return policy_mgr_get_sta_sap_scc_lte_coex_chnl(psoc,
315 sta_sap_scc_lte_coex);
316 }
317
318 QDF_STATUS
ucfg_policy_mgr_init_chan_avoidance(struct wlan_objmgr_psoc * psoc,qdf_freq_t * chan_freq_list,uint16_t chan_cnt)319 ucfg_policy_mgr_init_chan_avoidance(struct wlan_objmgr_psoc *psoc,
320 qdf_freq_t *chan_freq_list,
321 uint16_t chan_cnt)
322 {
323 return policy_mgr_init_chan_avoidance(psoc, chan_freq_list, chan_cnt);
324 }
325
ucfg_policy_mgr_get_sap_mandt_chnl(struct wlan_objmgr_psoc * psoc,uint8_t * sap_mandt_chnl)326 QDF_STATUS ucfg_policy_mgr_get_sap_mandt_chnl(struct wlan_objmgr_psoc *psoc,
327 uint8_t *sap_mandt_chnl)
328 {
329 return policy_mgr_get_sap_mandt_chnl(psoc, sap_mandt_chnl);
330 }
331
332 QDF_STATUS
ucfg_policy_mgr_get_indoor_chnl_marking(struct wlan_objmgr_psoc * psoc,uint8_t * indoor_chnl_marking)333 ucfg_policy_mgr_get_indoor_chnl_marking(struct wlan_objmgr_psoc *psoc,
334 uint8_t *indoor_chnl_marking)
335 {
336 return policy_mgr_get_indoor_chnl_marking(psoc, indoor_chnl_marking);
337 }
338
339 bool
ucfg_policy_mgr_get_sta_sap_scc_on_indoor_chnl(struct wlan_objmgr_psoc * psoc)340 ucfg_policy_mgr_get_sta_sap_scc_on_indoor_chnl(struct wlan_objmgr_psoc *psoc)
341 {
342 return policy_mgr_get_sta_sap_scc_allowed_on_indoor_chnl(psoc) ?
343 true : false;
344 }
345
ucfg_policy_mgr_is_fw_supports_dbs(struct wlan_objmgr_psoc * psoc)346 bool ucfg_policy_mgr_is_fw_supports_dbs(struct wlan_objmgr_psoc *psoc)
347 {
348 return policy_mgr_find_if_fw_supports_dbs(psoc);
349 }
350
ucfg_policy_mgr_get_connection_count(struct wlan_objmgr_psoc * psoc)351 uint32_t ucfg_policy_mgr_get_connection_count(struct wlan_objmgr_psoc *psoc)
352 {
353 return policy_mgr_get_connection_count(psoc);
354 }
355
ucfg_policy_mgr_is_hw_sbs_capable(struct wlan_objmgr_psoc * psoc)356 bool ucfg_policy_mgr_is_hw_sbs_capable(struct wlan_objmgr_psoc *psoc)
357 {
358 return policy_mgr_is_hw_dbs_capable(psoc);
359 }
360
ucfg_policy_mgr_get_vdev_same_freq_new_conn(struct wlan_objmgr_psoc * psoc,uint32_t new_freq,uint8_t * vdev_id)361 bool ucfg_policy_mgr_get_vdev_same_freq_new_conn(struct wlan_objmgr_psoc *psoc,
362 uint32_t new_freq,
363 uint8_t *vdev_id)
364 {
365 return policy_mgr_get_vdev_same_freq_new_conn(psoc, new_freq, vdev_id);
366 }
367
ucfg_policy_mgr_get_vdev_diff_freq_new_conn(struct wlan_objmgr_psoc * psoc,uint32_t new_freq,uint8_t * vdev_id)368 bool ucfg_policy_mgr_get_vdev_diff_freq_new_conn(struct wlan_objmgr_psoc *psoc,
369 uint32_t new_freq,
370 uint8_t *vdev_id)
371 {
372 return policy_mgr_get_vdev_diff_freq_new_conn(psoc, new_freq, vdev_id);
373 }
374
ucfg_policy_mgr_get_dbs_hw_modes(struct wlan_objmgr_psoc * psoc,bool * one_by_one_dbs,bool * two_by_two_dbs)375 QDF_STATUS ucfg_policy_mgr_get_dbs_hw_modes(struct wlan_objmgr_psoc *psoc,
376 bool *one_by_one_dbs,
377 bool *two_by_two_dbs)
378 {
379 return policy_mgr_get_dbs_hw_modes(psoc, one_by_one_dbs,
380 two_by_two_dbs);
381 }
382