1 /*
2  * Copyright (c) 2012-2021 The Linux Foundation. All rights reserved.
3  * Copyright (c) 2021-2024 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 
20 #ifndef WLAN_POLICY_MGR_I_H
21 #define WLAN_POLICY_MGR_I_H
22 
23 #include "wlan_policy_mgr_api.h"
24 #include "qdf_event.h"
25 #include "qdf_mc_timer.h"
26 #include "qdf_lock.h"
27 #include "qdf_defer.h"
28 #include "wlan_reg_services_api.h"
29 #include "cds_ieee80211_common_i.h"
30 #include "qdf_delayed_work.h"
31 #define DBS_OPPORTUNISTIC_TIME   5
32 
33 #define POLICY_MGR_SER_CMD_TIMEOUT 4000
34 
35 #ifdef QCA_WIFI_3_0_EMU
36 #define CONNECTION_UPDATE_TIMEOUT (POLICY_MGR_SER_CMD_TIMEOUT + 3000)
37 #else
38 #define CONNECTION_UPDATE_TIMEOUT (POLICY_MGR_SER_CMD_TIMEOUT + 2000)
39 #endif
40 
41 #define PM_24_GHZ_CH_FREQ_6   (2437)
42 #define PM_5_GHZ_CH_FREQ_36   (5180)
43 #define CHANNEL_SWITCH_COMPLETE_TIMEOUT   (2000)
44 #define MAX_NOA_TIME (3000)
45 
46 /* Defer SAP force SCC check by 2000ms due to another SAP/GO start AP in
47  * progress
48  */
49 #define SAP_CONC_CHECK_DEFER_TIMEOUT_MS (2000)
50 
51 /*
52  * Policy Mgr hardware mode list bit-mask definitions.
53  * Bits 4:0, 31:29 are unused.
54  *
55  * The below definitions are added corresponding to WMI DBS HW mode
56  * list to make it independent of firmware changes for WMI definitions.
57  * Currently these definitions have dependency with BIT positions of
58  * the existing WMI macros. Thus, if the BIT positions are changed for
59  * WMI macros, then these macros' BIT definitions are also need to be
60  * changed.
61  */
62 #define POLICY_MGR_HW_MODE_EMLSR_MODE_BITPOS       (32)
63 #define POLICY_MGR_HW_MODE_MAC0_TX_STREAMS_BITPOS  (28)
64 #define POLICY_MGR_HW_MODE_MAC0_RX_STREAMS_BITPOS  (24)
65 #define POLICY_MGR_HW_MODE_MAC1_TX_STREAMS_BITPOS  (20)
66 #define POLICY_MGR_HW_MODE_MAC1_RX_STREAMS_BITPOS  (16)
67 #define POLICY_MGR_HW_MODE_MAC0_BANDWIDTH_BITPOS   (12)
68 #define POLICY_MGR_HW_MODE_MAC1_BANDWIDTH_BITPOS   (8)
69 #define POLICY_MGR_HW_MODE_DBS_MODE_BITPOS         (7)
70 #define POLICY_MGR_HW_MODE_AGILE_DFS_MODE_BITPOS   (6)
71 #define POLICY_MGR_HW_MODE_SBS_MODE_BITPOS         (5)
72 #define POLICY_MGR_HW_MODE_MAC0_BAND_BITPOS        (3)
73 #define POLICY_MGR_HW_MODE_ID_BITPOS               (0)
74 
75 #define POLICY_MGR_HW_MODE_EMLSR_MODE_MASK         \
76 	(0x1 << POLICY_MGR_HW_MODE_EMLSR_MODE_BITPOS)
77 #define POLICY_MGR_HW_MODE_MAC0_TX_STREAMS_MASK    \
78 	(0xf << POLICY_MGR_HW_MODE_MAC0_TX_STREAMS_BITPOS)
79 #define POLICY_MGR_HW_MODE_MAC0_RX_STREAMS_MASK    \
80 	(0xf << POLICY_MGR_HW_MODE_MAC0_RX_STREAMS_BITPOS)
81 #define POLICY_MGR_HW_MODE_MAC1_TX_STREAMS_MASK    \
82 	(0xf << POLICY_MGR_HW_MODE_MAC1_TX_STREAMS_BITPOS)
83 #define POLICY_MGR_HW_MODE_MAC1_RX_STREAMS_MASK    \
84 	(0xf << POLICY_MGR_HW_MODE_MAC1_RX_STREAMS_BITPOS)
85 #define POLICY_MGR_HW_MODE_MAC0_BANDWIDTH_MASK     \
86 	(0xf << POLICY_MGR_HW_MODE_MAC0_BANDWIDTH_BITPOS)
87 #define POLICY_MGR_HW_MODE_MAC1_BANDWIDTH_MASK     \
88 	(0xf << POLICY_MGR_HW_MODE_MAC1_BANDWIDTH_BITPOS)
89 #define POLICY_MGR_HW_MODE_DBS_MODE_MASK           \
90 	(0x1 << POLICY_MGR_HW_MODE_DBS_MODE_BITPOS)
91 #define POLICY_MGR_HW_MODE_AGILE_DFS_MODE_MASK     \
92 	(0x1 << POLICY_MGR_HW_MODE_AGILE_DFS_MODE_BITPOS)
93 #define POLICY_MGR_HW_MODE_SBS_MODE_MASK           \
94 	(0x1 << POLICY_MGR_HW_MODE_SBS_MODE_BITPOS)
95 #define POLICY_MGR_HW_MODE_MAC0_BAND_MASK           \
96 			(0x3 << POLICY_MGR_HW_MODE_MAC0_BAND_BITPOS)
97 #define POLICY_MGR_HW_MODE_ID_MASK           \
98 			(0x7 << POLICY_MGR_HW_MODE_ID_BITPOS)
99 
100 #define POLICY_MGR_HW_MODE_EMLSR_MODE_SET(hw_mode, tmp, value) \
101 	QDF_SET_BITS64(hw_mode, tmp, POLICY_MGR_HW_MODE_EMLSR_MODE_BITPOS,\
102 	1, value)
103 #define POLICY_MGR_HW_MODE_MAC0_TX_STREAMS_SET(hw_mode, value) \
104 	WMI_SET_BITS(hw_mode, POLICY_MGR_HW_MODE_MAC0_TX_STREAMS_BITPOS,\
105 	4, value)
106 #define POLICY_MGR_HW_MODE_MAC0_RX_STREAMS_SET(hw_mode, value) \
107 	WMI_SET_BITS(hw_mode, POLICY_MGR_HW_MODE_MAC0_RX_STREAMS_BITPOS,\
108 	4, value)
109 #define POLICY_MGR_HW_MODE_MAC1_TX_STREAMS_SET(hw_mode, value) \
110 	WMI_SET_BITS(hw_mode, POLICY_MGR_HW_MODE_MAC1_TX_STREAMS_BITPOS,\
111 	4, value)
112 #define POLICY_MGR_HW_MODE_MAC1_RX_STREAMS_SET(hw_mode, value) \
113 	WMI_SET_BITS(hw_mode, POLICY_MGR_HW_MODE_MAC1_RX_STREAMS_BITPOS,\
114 	4, value)
115 #define POLICY_MGR_HW_MODE_MAC0_BANDWIDTH_SET(hw_mode, value)  \
116 	WMI_SET_BITS(hw_mode, POLICY_MGR_HW_MODE_MAC0_BANDWIDTH_BITPOS,\
117 	4, value)
118 #define POLICY_MGR_HW_MODE_MAC1_BANDWIDTH_SET(hw_mode, value)  \
119 	WMI_SET_BITS(hw_mode, POLICY_MGR_HW_MODE_MAC1_BANDWIDTH_BITPOS,\
120 	4, value)
121 #define POLICY_MGR_HW_MODE_DBS_MODE_SET(hw_mode, value)        \
122 	WMI_SET_BITS(hw_mode, POLICY_MGR_HW_MODE_DBS_MODE_BITPOS,\
123 	1, value)
124 #define POLICY_MGR_HW_MODE_AGILE_DFS_SET(hw_mode, value)       \
125 	WMI_SET_BITS(hw_mode, POLICY_MGR_HW_MODE_AGILE_DFS_MODE_BITPOS,\
126 	1, value)
127 #define POLICY_MGR_HW_MODE_SBS_MODE_SET(hw_mode, value)        \
128 	WMI_SET_BITS(hw_mode, POLICY_MGR_HW_MODE_SBS_MODE_BITPOS,\
129 	1, value)
130 #define POLICY_MGR_HW_MODE_MAC0_BAND_SET(hw_mode, value)        \
131 	WMI_SET_BITS(hw_mode, POLICY_MGR_HW_MODE_MAC0_BAND_BITPOS,\
132 	2, value)
133 #define POLICY_MGR_HW_MODE_ID_SET(hw_mode, value)        \
134 	WMI_SET_BITS(hw_mode, POLICY_MGR_HW_MODE_ID_BITPOS,\
135 	3, value)
136 
137 #define POLICY_MGR_HW_MODE_EMLSR_MODE_GET(hw_mode)                     \
138 		QDF_GET_BITS64(hw_mode, POLICY_MGR_HW_MODE_EMLSR_MODE_BITPOS,\
139 		1)
140 #define POLICY_MGR_HW_MODE_MAC0_TX_STREAMS_GET(hw_mode)                \
141 		(((hw_mode) & POLICY_MGR_HW_MODE_MAC0_TX_STREAMS_MASK) >>    \
142 		POLICY_MGR_HW_MODE_MAC0_TX_STREAMS_BITPOS)
143 #define POLICY_MGR_HW_MODE_MAC0_RX_STREAMS_GET(hw_mode)                \
144 		(((hw_mode) & POLICY_MGR_HW_MODE_MAC0_RX_STREAMS_MASK) >>    \
145 		POLICY_MGR_HW_MODE_MAC0_RX_STREAMS_BITPOS)
146 #define POLICY_MGR_HW_MODE_MAC1_TX_STREAMS_GET(hw_mode)                \
147 		(((hw_mode) & POLICY_MGR_HW_MODE_MAC1_TX_STREAMS_MASK) >>    \
148 		POLICY_MGR_HW_MODE_MAC1_TX_STREAMS_BITPOS)
149 #define POLICY_MGR_HW_MODE_MAC1_RX_STREAMS_GET(hw_mode)                \
150 		(((hw_mode) & POLICY_MGR_HW_MODE_MAC1_RX_STREAMS_MASK) >>    \
151 		POLICY_MGR_HW_MODE_MAC1_RX_STREAMS_BITPOS)
152 #define POLICY_MGR_HW_MODE_MAC0_BANDWIDTH_GET(hw_mode)                 \
153 		(((hw_mode) & POLICY_MGR_HW_MODE_MAC0_BANDWIDTH_MASK) >>     \
154 		POLICY_MGR_HW_MODE_MAC0_BANDWIDTH_BITPOS)
155 #define POLICY_MGR_HW_MODE_MAC1_BANDWIDTH_GET(hw_mode)                 \
156 		(((hw_mode) & POLICY_MGR_HW_MODE_MAC1_BANDWIDTH_MASK) >>     \
157 		POLICY_MGR_HW_MODE_MAC1_BANDWIDTH_BITPOS)
158 #define POLICY_MGR_HW_MODE_DBS_MODE_GET(hw_mode)                       \
159 		(((hw_mode) & POLICY_MGR_HW_MODE_DBS_MODE_MASK) >>           \
160 		POLICY_MGR_HW_MODE_DBS_MODE_BITPOS)
161 #define POLICY_MGR_HW_MODE_AGILE_DFS_GET(hw_mode)                      \
162 		(((hw_mode) & POLICY_MGR_HW_MODE_AGILE_DFS_MODE_MASK) >>     \
163 		POLICY_MGR_HW_MODE_AGILE_DFS_MODE_BITPOS)
164 #define POLICY_MGR_HW_MODE_SBS_MODE_GET(hw_mode)                       \
165 		(((hw_mode) & POLICY_MGR_HW_MODE_SBS_MODE_MASK) >>           \
166 		POLICY_MGR_HW_MODE_SBS_MODE_BITPOS)
167 #define POLICY_MGR_HW_MODE_MAC0_BAND_GET(hw_mode)                       \
168 		(((hw_mode) & POLICY_MGR_HW_MODE_MAC0_BAND_MASK) >> \
169 		POLICY_MGR_HW_MODE_MAC0_BAND_BITPOS)
170 #define POLICY_MGR_HW_MODE_ID_GET(hw_mode)                       \
171 		(((hw_mode) & POLICY_MGR_HW_MODE_ID_MASK) >> \
172 		POLICY_MGR_HW_MODE_ID_BITPOS)
173 
174 #define POLICY_MGR_DEFAULT_HW_MODE_INDEX 0xFFFF
175 
176 #define policy_mgr_alert(params...) \
177 	QDF_TRACE_FATAL(QDF_MODULE_ID_POLICY_MGR, params)
178 #define policy_mgr_err(params...) \
179 	QDF_TRACE_ERROR(QDF_MODULE_ID_POLICY_MGR, params)
180 #define policy_mgr_warn(params...) \
181 	QDF_TRACE_WARN(QDF_MODULE_ID_POLICY_MGR, params)
182 #define policy_mgr_notice(params...) \
183 	QDF_TRACE_INFO(QDF_MODULE_ID_POLICY_MGR, params)
184 #define policy_mgr_info(params...) \
185 	QDF_TRACE_INFO(QDF_MODULE_ID_POLICY_MGR, params)
186 #define policy_mgr_debug(params...) \
187 	QDF_TRACE_DEBUG(QDF_MODULE_ID_POLICY_MGR, params)
188 
189 #define policymgr_nofl_alert(params...) \
190 	QDF_TRACE_FATAL_NO_FL(QDF_MODULE_ID_POLICY_MGR, params)
191 #define policymgr_nofl_err(params...) \
192 	QDF_TRACE_ERROR_NO_FL(QDF_MODULE_ID_POLICY_MGR, params)
193 #define policymgr_nofl_warn(params...) \
194 	QDF_TRACE_WARN_NO_FL(QDF_MODULE_ID_POLICY_MGR, params)
195 #define policymgr_nofl_info(params...) \
196 	QDF_TRACE_INFO_NO_FL(QDF_MODULE_ID_POLICY_MGR, params)
197 #define policymgr_nofl_debug(params...) \
198 	QDF_TRACE_DEBUG_NO_FL(QDF_MODULE_ID_POLICY_MGR, params)
199 
200 #define policy_mgr_rl_debug(params...) \
201 	QDF_TRACE_DEBUG_RL(QDF_MODULE_ID_POLICY_MGR, params)
202 
203 #define PM_CONC_CONNECTION_LIST_VALID_INDEX(index) \
204 		((MAX_NUMBER_OF_CONC_CONNECTIONS > index) && \
205 			(pm_conc_connection_list[index].in_use))
206 
207 extern struct policy_mgr_conc_connection_info
208 	pm_conc_connection_list[MAX_NUMBER_OF_CONC_CONNECTIONS];
209 
210 #ifdef WLAN_FEATURE_11BE_MLO
211 extern struct policy_mgr_disabled_ml_link_info
212 	pm_disabled_ml_links[MAX_NUMBER_OF_DISABLE_LINK];
213 #endif
214 
215 extern const enum policy_mgr_pcl_type
216 	first_connection_pcl_table[PM_MAX_NUM_OF_MODE]
217 			[PM_MAX_CONC_PRIORITY_MODE];
218 extern  pm_dbs_pcl_second_connection_table_type
219 	*second_connection_pcl_dbs_table;
220 
221 extern enum policy_mgr_pcl_type const
222 	(*second_connection_pcl_non_dbs_table)[PM_MAX_ONE_CONNECTION_MODE]
223 			[PM_MAX_NUM_OF_MODE][PM_MAX_CONC_PRIORITY_MODE];
224 extern pm_dbs_pcl_third_connection_table_type
225 		*third_connection_pcl_dbs_table;
226 extern enum policy_mgr_pcl_type const
227 	(*third_connection_pcl_non_dbs_table)[PM_MAX_TWO_CONNECTION_MODE]
228 			[PM_MAX_NUM_OF_MODE][PM_MAX_CONC_PRIORITY_MODE];
229 
230 extern policy_mgr_next_action_two_connection_table_type
231 		*next_action_two_connection_table;
232 extern policy_mgr_next_action_three_connection_table_type
233 		*next_action_three_connection_table;
234 
235 #ifdef FEATURE_FOURTH_CONNECTION
236 extern const enum policy_mgr_pcl_type
237 	fourth_connection_pcl_dbs_sbs_table
238 	[PM_MAX_THREE_CONNECTION_MODE][PM_MAX_NUM_OF_MODE]
239 	[PM_MAX_CONC_PRIORITY_MODE];
240 #endif
241 
242 extern policy_mgr_next_action_two_connection_table_type
243 		*next_action_two_connection_2x2_2g_1x1_5g_table;
244 extern policy_mgr_next_action_three_connection_table_type
245 		*next_action_three_connection_2x2_2g_1x1_5g_table;
246 
247 extern enum policy_mgr_conc_next_action
248 	(*policy_mgr_get_current_pref_hw_mode_ptr)
249 	(struct wlan_objmgr_psoc *psoc);
250 
251 /**
252  * struct policy_mgr_cfg - all the policy manager owned configs
253  * @mcc_to_scc_switch: switch to indicate MCC to SCC config
254  * @sys_pref: system's preference while selecting PCLs
255  * @max_conc_cxns: Max allowed concurrenct active connections
256  * @conc_rule1: concurrency rule1
257  * @conc_rule2: concurrency rule2
258  * @allow_mcc_go_diff_bi: Allow GO and STA diff beacon interval in MCC
259  * @dual_mac_feature: To enable/disable dual mac features
260  * @is_force_1x1_enable: Is 1x1 forced for connection
261  * @sta_sap_scc_on_dfs_chnl: STA-SAP SCC on DFS channel
262  * @sta_sap_scc_on_lte_coex_chnl: STA-SAP SCC on LTE Co-ex channel
263  * @sta_sap_scc_on_indoor_channel: Allow STA-SAP scc on indoor only
264  * channels
265  * @nan_sap_scc_on_lte_coex_chnl: NAN-SAP SCC on LTE Co-ex channel
266  * @sap_mandatory_chnl_enable: To enable/disable SAP mandatory channels
267  * @mark_indoor_chnl_disable: Mark indoor channel as disable or enable
268  * @dbs_selection_plcy: DBS selection policy for concurrency
269  * @vdev_priority_list: Priority list for various vdevs
270  * @chnl_select_plcy: Channel selection policy
271  * @enable_mcc_adaptive_sch: Enable/Disable MCC adaptive scheduler
272  * @enable_sta_cxn_5g_band: Enable/Disable STA connection in 5G band
273  * @go_force_scc: Enable/Disable P2P GO force SCC
274  * @pcl_band_priority: PCL channel order between 5G and 6G.
275  * @sbs_enable: To enable/disable SBS
276  * @multi_sap_allowed_on_same_band: Enable/Disable multi sap started
277  *                                  on same band
278  * @sr_in_same_mac_conc: Enable/Disable SR in same MAC concurrency
279  * @use_sap_original_bw: Enable/Disable sap original BW as default
280  *                       BW when do restart
281  * @move_sap_go_1st_on_dfs_sta_csa: Enable/Disable SAP / GO's movement
282  *				    to non-DFS channel before STA
283  */
284 struct policy_mgr_cfg {
285 	uint8_t mcc_to_scc_switch;
286 	uint8_t sys_pref;
287 	uint8_t max_conc_cxns;
288 	uint8_t conc_rule1;
289 	uint8_t conc_rule2;
290 	bool enable_mcc_adaptive_sch;
291 	uint8_t allow_mcc_go_diff_bi;
292 	uint8_t dual_mac_feature;
293 	enum force_1x1_type is_force_1x1_enable;
294 	uint8_t sta_sap_scc_on_dfs_chnl;
295 	uint8_t sta_sap_scc_on_lte_coex_chnl;
296 	bool sta_sap_scc_on_indoor_channel;
297 	uint8_t nan_sap_scc_on_lte_coex_chnl;
298 	uint8_t sap_mandatory_chnl_enable;
299 	uint8_t mark_indoor_chnl_disable;
300 	uint8_t enable_sta_cxn_5g_band;
301 	uint32_t dbs_selection_plcy;
302 	uint32_t vdev_priority_list;
303 	uint32_t chnl_select_plcy;
304 	uint8_t go_force_scc;
305 	enum policy_mgr_pcl_band_priority pcl_band_priority;
306 	bool sbs_enable;
307 	bool multi_sap_allowed_on_same_band;
308 #ifdef WLAN_FEATURE_SR
309 	bool sr_in_same_mac_conc;
310 #endif
311 	bool use_sap_original_bw;
312 	bool move_sap_go_1st_on_dfs_sta_csa;
313 };
314 
315 /**
316  * struct policy_mgr_psoc_priv_obj - Policy manager private data
317  * @psoc: pointer to PSOC object information
318  * @pdev: pointer to PDEV object information
319  * @connection_update_done_evt: qdf event to synchronize
320  *                            connection activities
321  * @qdf_conc_list_lock: To protect connection table
322  * @dbs_opportunistic_timer: Timer to drop down to Single Mac
323  *                         Mode opportunistically
324  * @sap_restart_chan_switch_cb: Callback for channel switch
325  *                            notification for SAP
326  * @hdd_cbacks: callbacks to be registered by HDD for
327  *            interaction with Policy Manager
328  * @sme_cbacks: callbacks to be registered by SME for
329  *            interaction with Policy Manager
330  * @wma_cbacks: callbacks to be registered by SME for
331  * interaction with Policy Manager
332  * @tdls_cbacks: callbacks to be registered by SME for
333  * interaction with Policy Manager
334  * @cdp_cbacks: callbacks to be registered by SME for
335  * interaction with Policy Manager
336  * @dp_cbacks: callbacks to be registered by Datapath for
337  * interaction with Policy Manager
338  * @conc_cbacks: callbacks to be registered by lim for
339  * interaction with Policy Manager
340  * @sap_mandatory_channels: The user preferred master list on
341  *                        which SAP can be brought up. This
342  *                        mandatory channel freq list would be as per
343  *                        OEMs preference & conforming to the
344  *                        regulatory/other considerations
345  * @sap_mandatory_channels_len: Length of the SAP mandatory
346  *                            channel list
347  * @do_sap_unsafe_ch_check: whether need check sap unsafe channel
348  * @last_disconn_sta_freq: last disconnected sta channel freq
349  * @concurrency_mode: active concurrency combination
350  * @no_of_open_sessions: Number of active vdevs
351  * @no_of_active_sessions: Number of active connections
352  * @sta_ap_intf_check_work: delayed sap restart work
353  * @work_fail_count: sta_ap work schedule fail count
354  * @nan_sap_conc_work: Info related to nan sap conc work
355  * @num_dbs_hw_modes: Number of different HW modes supported
356  * @hw_mode: List of HW modes supported
357  * @old_hw_mode_index: Old HW mode from hw_mode table
358  * @new_hw_mode_index: New HW mode from hw_mode table
359  * @dual_mac_cfg: DBS configuration currently used by FW for
360  *              scan & connections
361  * @radio_comb_num: radio combination number
362  * @radio_combinations: radio combination list
363  * @hw_mode_change_in_progress: This is to track if HW mode
364  *                            change is in progress
365  * @enable_mcc_adaptive_scheduler: Enable MCC adaptive scheduler
366  *      value from INI
367  * @user_cfg:
368  * @unsafe_channel_list: LTE coex channel freq avoidance list
369  * @unsafe_channel_count: LTE coex channel avoidance list count
370  * @sta_ap_intf_check_work_info: Info related to sta_ap_intf_check_work
371  * @cur_conc_system_pref:
372  * @opportunistic_update_done_evt: qdf event to synchronize host
373  *                               & FW HW mode
374  * @channel_switch_complete_evt: qdf event for channel switch completion check
375  * @mode_change_cb: Mode change callback
376  * @cfg: Policy manager config data
377  * @valid_ch_freq_list: valid frequencies
378  * @valid_ch_freq_list_count: number of valid frequencies
379  * @dynamic_mcc_adaptive_sched: disable/enable mcc adaptive scheduler feature
380  * @dynamic_dfs_master_disabled: current state of dynamic dfs master
381  * @link_in_progress: To track if set link is in progress
382  * @set_link_update_done_evt: qdf event to synchronize set link
383  * @active_vdev_bitmap: Active vdev id bitmap
384  * @inactive_vdev_bitmap: Inactive vdev id bitmap
385  * @restriction_mask:
386  */
387 struct policy_mgr_psoc_priv_obj {
388 	struct wlan_objmgr_psoc *psoc;
389 	struct wlan_objmgr_pdev *pdev;
390 	qdf_event_t connection_update_done_evt;
391 	qdf_mutex_t qdf_conc_list_lock;
392 	qdf_mc_timer_t dbs_opportunistic_timer;
393 	struct policy_mgr_hdd_cbacks hdd_cbacks;
394 	struct policy_mgr_sme_cbacks sme_cbacks;
395 	struct policy_mgr_wma_cbacks wma_cbacks;
396 	struct policy_mgr_tdls_cbacks tdls_cbacks;
397 	struct policy_mgr_cdp_cbacks cdp_cbacks;
398 	struct policy_mgr_dp_cbacks dp_cbacks;
399 	struct policy_mgr_conc_cbacks conc_cbacks;
400 	uint32_t sap_mandatory_channels[NUM_CHANNELS];
401 	uint32_t sap_mandatory_channels_len;
402 	qdf_freq_t last_disconn_sta_freq;
403 	uint32_t concurrency_mode;
404 	uint8_t no_of_open_sessions[QDF_MAX_NO_OF_MODE];
405 	uint8_t no_of_active_sessions[QDF_MAX_NO_OF_MODE];
406 	struct qdf_delayed_work sta_ap_intf_check_work;
407 	uint8_t work_fail_count;
408 	qdf_work_t nan_sap_conc_work;
409 	uint32_t num_dbs_hw_modes;
410 	struct dbs_hw_mode_info hw_mode;
411 	uint32_t old_hw_mode_index;
412 	uint32_t new_hw_mode_index;
413 	struct dual_mac_config dual_mac_cfg;
414 	uint32_t radio_comb_num;
415 	struct radio_combination radio_combinations[MAX_RADIO_COMBINATION];
416 	uint32_t hw_mode_change_in_progress;
417 	struct policy_mgr_user_cfg user_cfg;
418 	uint32_t unsafe_channel_list[NUM_CHANNELS];
419 	uint16_t unsafe_channel_count;
420 	struct sta_ap_intf_check_work_ctx *sta_ap_intf_check_work_info;
421 	uint8_t cur_conc_system_pref;
422 	qdf_event_t opportunistic_update_done_evt;
423 	qdf_event_t channel_switch_complete_evt;
424 	send_mode_change_event_cb mode_change_cb;
425 	struct policy_mgr_cfg cfg;
426 	uint32_t valid_ch_freq_list[NUM_CHANNELS];
427 	uint32_t valid_ch_freq_list_count;
428 	bool dynamic_mcc_adaptive_sched;
429 	bool dynamic_dfs_master_disabled;
430 #ifdef WLAN_FEATURE_11BE_MLO
431 	qdf_atomic_t link_in_progress;
432 	qdf_event_t set_link_update_done_evt;
433 #endif
434 	uint32_t active_vdev_bitmap;
435 	uint32_t inactive_vdev_bitmap;
436 #ifdef FEATURE_WLAN_CH_AVOID_EXT
437 	uint32_t restriction_mask;
438 #endif
439 };
440 
441 /**
442  * struct policy_mgr_mac_ss_bw_info - hw_mode_list PHY/MAC params for each MAC
443  * @mac_tx_stream: Max TX stream number supported on MAC
444  * @mac_rx_stream: Max RX stream number supported on MAC
445  * @mac_bw: Max bandwidth(wmi_channel_width enum type)
446  * @mac_band_cap: supported Band bit map(WLAN_2G_CAPABILITY = 0x1,
447  *                            WLAN_5G_CAPABILITY = 0x2)
448  * @support_6ghz_band: support 6 GHz band
449  */
450 struct policy_mgr_mac_ss_bw_info {
451 	uint32_t mac_tx_stream;
452 	uint32_t mac_rx_stream;
453 	uint32_t mac_bw;
454 	uint32_t mac_band_cap;
455 	bool support_6ghz_band;
456 };
457 
458 #ifdef WLAN_FEATURE_SR
459 /**
460  * policy_mgr_get_same_mac_conc_sr_status() - Function returns value of INI
461  * g_enable_sr_in_same_mac_conc
462  *
463  * @psoc: Pointer to PSOC
464  *
465  * Return: Returns True / False
466  */
467 bool policy_mgr_get_same_mac_conc_sr_status(struct wlan_objmgr_psoc *psoc);
468 
469 #else
470 static inline
policy_mgr_get_same_mac_conc_sr_status(struct wlan_objmgr_psoc * psoc)471 bool policy_mgr_get_same_mac_conc_sr_status(struct wlan_objmgr_psoc *psoc)
472 {
473 	return true;
474 }
475 #endif
476 
477 struct policy_mgr_psoc_priv_obj *policy_mgr_get_context(
478 		struct wlan_objmgr_psoc *psoc);
479 
480 /**
481  * policy_mgr_get_updated_scan_config() - Get the updated scan configuration
482  * @psoc: psoc handle
483  * @scan_config: Pointer containing the updated scan config
484  * @dbs_scan: 0 or 1 indicating if DBS scan needs to be enabled/disabled
485  * @dbs_plus_agile_scan: 0 or 1 indicating if DBS plus agile scan needs to be
486  * enabled/disabled
487  * @single_mac_scan_with_dfs: 0 or 1 indicating if single MAC scan with DFS
488  * needs to be enabled/disabled
489  *
490  * Takes the current scan configuration and set the necessary scan config
491  * bits to either 0/1 and provides the updated value to the caller who
492  * can use this to pass it on to the FW
493  *
494  * Return: 0 on success
495  */
496 QDF_STATUS policy_mgr_get_updated_scan_config(
497 		struct wlan_objmgr_psoc *psoc,
498 		uint32_t *scan_config,
499 		bool dbs_scan,
500 		bool dbs_plus_agile_scan,
501 		bool single_mac_scan_with_dfs);
502 
503 /**
504  * policy_mgr_get_updated_fw_mode_config() - Get the updated fw
505  * mode configuration
506  * @psoc: psoc handle
507  * @fw_mode_config: Pointer containing the updated fw mode config
508  * @dbs: 0 or 1 indicating if DBS needs to be enabled/disabled
509  * @agile_dfs: 0 or 1 indicating if agile DFS needs to be enabled/disabled
510  *
511  * Takes the current fw mode configuration and set the necessary fw mode config
512  * bits to either 0/1 and provides the updated value to the caller who
513  * can use this to pass it on to the FW
514  *
515  * Return: 0 on success
516  */
517 QDF_STATUS policy_mgr_get_updated_fw_mode_config(
518 		struct wlan_objmgr_psoc *psoc,
519 		uint32_t *fw_mode_config,
520 		bool dbs,
521 		bool agile_dfs);
522 
523 /**
524  * policy_mgr_is_dual_mac_disabled_in_ini() - Check if dual mac
525  * is disabled in INI
526  * @psoc: psoc handle
527  *
528  * Checks if the dual mac feature is disabled in INI
529  *
530  * Return: true if the dual mac connection is disabled from INI
531  */
532 bool policy_mgr_is_dual_mac_disabled_in_ini(
533 		struct wlan_objmgr_psoc *psoc);
534 
535 /**
536  * policy_mgr_find_if_hwlist_has_dbs() - Find if hw list has DBS modes or not
537  * @psoc: PSOC object information
538  *
539  * Find if hw list has DBS modes or not
540  *
541  * Return: true or false
542  */
543 bool policy_mgr_find_if_hwlist_has_dbs(struct wlan_objmgr_psoc *psoc);
544 
545 /**
546  * policy_mgr_get_mcc_to_scc_switch_mode() - MCC to SCC
547  * switch mode value in the user config
548  * @psoc: PSOC object information
549  *
550  * MCC to SCC switch mode value in user config
551  *
552  * Return: MCC to SCC switch mode value
553  */
554 uint32_t policy_mgr_get_mcc_to_scc_switch_mode(
555 	struct wlan_objmgr_psoc *psoc);
556 
557 /**
558  * policy_mgr_get_dbs_config() - Get DBS bit
559  * @psoc: psoc handle
560  *
561  * Gets the DBS bit of fw_mode_config_bits
562  *
563  * Return: 0 or 1 to indicate the DBS bit
564  */
565 bool policy_mgr_get_dbs_config(struct wlan_objmgr_psoc *psoc);
566 
567 /**
568  * policy_mgr_get_agile_dfs_config() - Get Agile DFS bit
569  * @psoc: psoc handle
570  *
571  * Gets the Agile DFS bit of fw_mode_config_bits
572  *
573  * Return: 0 or 1 to indicate the Agile DFS bit
574  */
575 bool policy_mgr_get_agile_dfs_config(struct wlan_objmgr_psoc *psoc);
576 
577 /**
578  * policy_mgr_get_dbs_scan_config() - Get DBS scan bit
579  * @psoc: psoc handle
580  *
581  * Gets the DBS scan bit of concurrent_scan_config_bits
582  *
583  * Return: 0 or 1 to indicate the DBS scan bit
584  */
585 bool policy_mgr_get_dbs_scan_config(struct wlan_objmgr_psoc *psoc);
586 
587 /**
588  * policy_mgr_get_tx_rx_ss_from_config() - Get Tx/Rx spatial
589  * stream from HW mode config
590  * @mac_ss: Config which indicates the HW mode as per 'hw_mode_ss_config'
591  * @tx_ss: Contains the Tx spatial stream
592  * @rx_ss: Contains the Rx spatial stream
593  *
594  * Returns the number of spatial streams of Tx and Rx
595  *
596  * Return: None
597  */
598 void policy_mgr_get_tx_rx_ss_from_config(enum hw_mode_ss_config mac_ss,
599 		uint32_t *tx_ss, uint32_t *rx_ss);
600 
601 /**
602  * policy_mgr_get_matching_hw_mode_index() - Get matching HW mode index
603  * @psoc: psoc handle
604  * @mac0_tx_ss: Number of tx spatial streams of MAC0
605  * @mac0_rx_ss: Number of rx spatial streams of MAC0
606  * @mac0_bw: Bandwidth of MAC0 of type 'hw_mode_bandwidth'
607  * @mac1_tx_ss: Number of tx spatial streams of MAC1
608  * @mac1_rx_ss: Number of rx spatial streams of MAC1
609  * @mac1_bw: Bandwidth of MAC1 of type 'hw_mode_bandwidth'
610  * @mac0_band_cap: mac0 band capability requirement
611  *     (0: Don't care, 1: 2.4G, 2: 5G)
612  * @dbs: DBS capability of type 'hw_mode_dbs_capab'
613  * @dfs: Agile DFS capability of type 'hw_mode_agile_dfs_capab'
614  * @sbs: SBS capability of type 'hw_mode_sbs_capab'
615  *
616  * Fetches the HW mode index corresponding to the HW mode provided.
617  * In Genoa two DBS HW modes (2x2 5G + 1x1 2G, 2x2 2G + 1x1 5G),
618  * the "ss" number and "bw" value are not enough to specify the expected
619  * HW mode. But in both HW mode, the mac0 can support either 5G or 2G.
620  * So, the Parameter "mac0_band_cap" will specify the expected band support
621  * requirement on mac 0 to find the expected HW mode.
622  *
623  * Return: Positive hw mode index in case a match is found or a negative
624  * value, otherwise
625  */
626 int8_t policy_mgr_get_matching_hw_mode_index(
627 		struct wlan_objmgr_psoc *psoc,
628 		uint32_t mac0_tx_ss, uint32_t mac0_rx_ss,
629 		enum hw_mode_bandwidth mac0_bw,
630 		uint32_t mac1_tx_ss, uint32_t mac1_rx_ss,
631 		enum hw_mode_bandwidth mac1_bw,
632 		enum hw_mode_mac_band_cap mac0_band_cap,
633 		enum hw_mode_dbs_capab dbs,
634 		enum hw_mode_agile_dfs_capab dfs,
635 		enum hw_mode_sbs_capab sbs);
636 
637 /**
638  * policy_mgr_get_hw_mode_idx_from_dbs_hw_list() - Get hw_mode index
639  * @psoc: psoc handle
640  * @mac0_ss: MAC0 spatial stream configuration
641  * @mac0_bw: MAC0 bandwidth configuration
642  * @mac1_ss: MAC1 spatial stream configuration
643  * @mac1_bw: MAC1 bandwidth configuration
644  * @mac0_band_cap: mac0 band capability requirement
645  *     (0: Don't care, 1: 2.4G, 2: 5G)
646  * @dbs: HW DBS capability
647  * @dfs: HW Agile DFS capability
648  * @sbs: HW SBS capability
649  *
650  * Get the HW mode index corresponding to the HW modes spatial stream,
651  * bandwidth, DBS, Agile DFS and SBS capability
652  *
653  * In Genoa two DBS HW modes (2x2 5G + 1x1 2G, 2x2 2G + 1x1 5G),
654  * the "ss" number and "bw" value are not enough to specify the expected
655  * HW mode. But in both HW mode, the mac0 can support either 5G or 2G.
656  * So, the Parameter "mac0_band_cap" will specify the expected band support
657  * requirement on mac 0 to find the expected HW mode.
658  *
659  * Return: Index number if a match is found or -negative value if not found
660  */
661 int8_t policy_mgr_get_hw_mode_idx_from_dbs_hw_list(
662 		struct wlan_objmgr_psoc *psoc,
663 		enum hw_mode_ss_config mac0_ss,
664 		enum hw_mode_bandwidth mac0_bw,
665 		enum hw_mode_ss_config mac1_ss,
666 		enum hw_mode_bandwidth mac1_bw,
667 		enum hw_mode_mac_band_cap mac0_band_cap,
668 		enum hw_mode_dbs_capab dbs,
669 		enum hw_mode_agile_dfs_capab dfs,
670 		enum hw_mode_sbs_capab sbs);
671 
672 /**
673  * policy_mgr_get_old_and_new_hw_index() - Get the old and new HW index
674  * @psoc: psoc handle
675  * @old_hw_mode_index: Value at this pointer contains the old HW mode index
676  * Default value when not configured is POLICY_MGR_DEFAULT_HW_MODE_INDEX
677  * @new_hw_mode_index: Value at this pointer contains the new HW mode index
678  * Default value when not configured is POLICY_MGR_DEFAULT_HW_MODE_INDEX
679  *
680  * Get the old and new HW index configured in the driver
681  *
682  * Return: Failure in case the HW mode indices cannot be fetched and Success
683  * otherwise. When no HW mode transition has happened the values of
684  * old_hw_mode_index and new_hw_mode_index will be the same.
685  */
686 QDF_STATUS policy_mgr_get_old_and_new_hw_index(
687 		struct wlan_objmgr_psoc *psoc,
688 		uint32_t *old_hw_mode_index,
689 		uint32_t *new_hw_mode_index);
690 
691 /**
692  * policy_mgr_update_conc_list() - Update the concurrent connection list
693  * @psoc: PSOC object information
694  * @conn_index: Connection index
695  * @mode: Mode
696  * @freq: channel frequency
697  * @bw: Bandwidth
698  * @mac: Mac id
699  * @chain_mask: Chain mask
700  * @original_nss: Original number of spatial streams
701  * @vdev_id: vdev id
702  * @in_use: Flag to indicate if the index is in use or not
703  * @update_conn: Flag to indicate if mode change event should
704  *  be sent or not
705  * @ch_flagext: channel state flags
706  *
707  * Updates the index value of the concurrent connection list
708  *
709  * Return: None
710  */
711 void policy_mgr_update_conc_list(struct wlan_objmgr_psoc *psoc,
712 		uint32_t conn_index,
713 		enum policy_mgr_con_mode mode,
714 		uint32_t freq,
715 		enum hw_mode_bandwidth bw,
716 		uint8_t mac,
717 		enum policy_mgr_chain_mode chain_mask,
718 		uint32_t original_nss,
719 		uint32_t vdev_id,
720 		bool in_use,
721 		bool update_conn,
722 		uint16_t ch_flagext);
723 
724 void policy_mgr_store_and_del_conn_info(struct wlan_objmgr_psoc *psoc,
725 				enum policy_mgr_con_mode mode,
726 				bool all_matching_cxn_to_del,
727 				struct policy_mgr_conc_connection_info *info,
728 				uint8_t *num_cxn_del);
729 
730 /**
731  * policy_mgr_store_and_del_conn_info_by_vdev_id() - Store and del a
732  * connection info by vdev id
733  * @psoc: PSOC object information
734  * @vdev_id: vdev id whose entry has to be deleted
735  * @info: structure array pointer where the connection info will be saved
736  * @num_cxn_del: number of connection which are going to be deleted
737  *
738  * Saves the connection info corresponding to the provided mode
739  * and deleted that corresponding entry based on vdev from the
740  * connection info structure
741  *
742  * Return: None
743  */
744 void policy_mgr_store_and_del_conn_info_by_vdev_id(
745 			struct wlan_objmgr_psoc *psoc,
746 			uint32_t vdev_id,
747 			struct policy_mgr_conc_connection_info *info,
748 			uint8_t *num_cxn_del);
749 
750 /**
751  * policy_mgr_store_and_del_conn_info_by_chan_and_mode() - Store and del a
752  * connection info by chan number and conn mode
753  * @psoc: PSOC object information
754  * @ch_freq: channel frequency value
755  * @mode: conn mode
756  * @info: structure array pointer where the connection info will be saved
757  * @num_cxn_del: number of connection which are going to be deleted
758  *
759  * Saves and deletes the entries if the active connection entry chan and mode
760  * matches the provided chan & mode from the function parameters.
761  *
762  * Return: None
763  */
764 void policy_mgr_store_and_del_conn_info_by_chan_and_mode(
765 			struct wlan_objmgr_psoc *psoc,
766 			uint32_t ch_freq,
767 			enum policy_mgr_con_mode mode,
768 			struct policy_mgr_conc_connection_info *info,
769 			uint8_t *num_cxn_del);
770 
771 void policy_mgr_restore_deleted_conn_info(struct wlan_objmgr_psoc *psoc,
772 				struct policy_mgr_conc_connection_info *info,
773 				uint8_t num_cxn_del);
774 void policy_mgr_update_hw_mode_conn_info(struct wlan_objmgr_psoc *psoc,
775 				uint32_t num_vdev_mac_entries,
776 				struct policy_mgr_vdev_mac_map *vdev_mac_map,
777 				struct policy_mgr_hw_mode_params hw_mode,
778 				uint32_t num_mac_freq,
779 				struct policy_mgr_pdev_mac_freq_map *freq_info);
780 void policy_mgr_pdev_set_hw_mode_cb(uint32_t status,
781 				uint32_t cfgd_hw_mode_index,
782 				uint32_t num_vdev_mac_entries,
783 				struct policy_mgr_vdev_mac_map *vdev_mac_map,
784 				uint8_t next_action,
785 				enum policy_mgr_conn_update_reason reason,
786 				uint32_t session_id, void *context,
787 				uint32_t request_id);
788 
789 #ifdef WLAN_FEATURE_11BE_MLO
790 void
791 policy_mgr_dump_disabled_ml_links(struct policy_mgr_psoc_priv_obj *pm_ctx);
792 
793 /**
794  * policy_mgr_link_switch_notifier_cb() - link switch notifier callback
795  * @vdev: vdev object
796  * @req: link switch request
797  * @notify_reason: Reason for notification
798  *
799  * This API will be registered to mlo link switch, to be invoked before
800  * do link switch process.
801  *
802  * Return: QDF_STATUS
803  */
804 QDF_STATUS
805 policy_mgr_link_switch_notifier_cb(struct wlan_objmgr_vdev *vdev,
806 				   struct wlan_mlo_link_switch_req *req,
807 				   enum wlan_mlo_link_switch_notify_reason notify_reason);
808 #else
809 static inline void
policy_mgr_dump_disabled_ml_links(struct policy_mgr_psoc_priv_obj * pm_ctx)810 policy_mgr_dump_disabled_ml_links(struct policy_mgr_psoc_priv_obj *pm_ctx) {}
811 #endif
812 
813 /**
814  * policy_mgr_dump_current_concurrency() - To dump the current
815  * concurrency combination
816  * @psoc: psoc handle
817  *
818  * This routine is called to dump the concurrency info
819  *
820  * Return: None
821  */
822 void policy_mgr_dump_current_concurrency(struct wlan_objmgr_psoc *psoc);
823 
824 void pm_dbs_opportunistic_timer_handler(void *data);
825 
826 /**
827  * policy_mgr_get_channel_list() - Get channel list based on PCL and mode
828  * @psoc: psoc object
829  * @pcl: pcl type
830  * @mode: interface mode
831  * @pcl_channels: pcl channel list buffer
832  * @pcl_weights: pcl weight buffer
833  * @pcl_sz: pcl channel list buffer size
834  * @len: pcl channel number returned from API
835  *
836  * Return: QDF_STATUS
837  */
838 QDF_STATUS policy_mgr_get_channel_list(struct wlan_objmgr_psoc *psoc,
839 				       enum policy_mgr_pcl_type pcl,
840 				       enum policy_mgr_con_mode mode,
841 				       uint32_t *pcl_channels,
842 				       uint8_t *pcl_weights,
843 				       uint32_t pcl_sz, uint32_t *len);
844 
845 /**
846  * policy_mgr_allow_new_home_channel() - Check for allowed number of
847  * home channels
848  * @psoc: PSOC Pointer
849  * @mode: Connection mode
850  * @ch_freq: channel frequency on which new connection is coming up
851  * @num_connections: number of current connections
852  * @is_dfs_ch: DFS channel or not
853  * @ext_flags: extended flags for concurrency check
854  *
855  * When a new connection is about to come up check if current
856  * concurrency combination including the new connection is
857  * allowed or not based on the HW capability
858  *
859  * Return: True/False
860  */
861 bool policy_mgr_allow_new_home_channel(
862 	struct wlan_objmgr_psoc *psoc, enum policy_mgr_con_mode mode,
863 	uint32_t ch_freq, uint32_t num_connections, bool is_dfs_ch,
864 	uint32_t ext_flags);
865 
866 /**
867  * policy_mgr_is_5g_channel_allowed() - check if 5g channel is allowed
868  * @psoc: PSOC object information
869  * @ch_freq: channel frequency which needs to be validated
870  * @list: list of existing connections.
871  * @mode: mode against which channel needs to be validated
872  *
873  * This API takes the channel frequency as input and compares with existing
874  * connection channels. If existing connection's channel is DFS channel
875  * and provided channel is 5G channel then don't allow concurrency to
876  * happen as MCC with DFS channel is not yet supported
877  *
878  * Return: true if 5G channel is allowed, false if not allowed
879  *
880  */
881 bool policy_mgr_is_5g_channel_allowed(struct wlan_objmgr_psoc *psoc,
882 				uint32_t ch_freq, uint32_t *list,
883 				enum policy_mgr_con_mode mode);
884 
885 /**
886  * policy_mgr_complete_action() - initiates actions needed on
887  * current connections once channel has been decided for the new
888  * connection
889  * @psoc: PSOC object information
890  * @new_nss: the new nss value
891  * @next_action: next action to happen at policy mgr after
892  *		beacon update
893  * @reason: Reason for connection update
894  * @session_id: Session id
895  * @request_id: connection manager req id
896  *
897  * This function initiates actions
898  * needed on current connections once channel has been decided
899  * for the new connection. Notifies UMAC & FW as well
900  *
901  * Return: QDF_STATUS enum
902  */
903 QDF_STATUS policy_mgr_complete_action(struct wlan_objmgr_psoc *psoc,
904 				uint8_t  new_nss, uint8_t next_action,
905 				enum policy_mgr_conn_update_reason reason,
906 				uint32_t session_id, uint32_t request_id);
907 
908 enum policy_mgr_con_mode policy_mgr_get_mode_by_vdev_id(
909 		struct wlan_objmgr_psoc *psoc,
910 		uint8_t vdev_id);
911 QDF_STATUS policy_mgr_init_connection_update(
912 		struct policy_mgr_psoc_priv_obj *pm_ctx);
913 
914 /**
915  * policy_mgr_get_current_pref_hw_mode_dbs_2x2() - Get the
916  * current preferred hw mode
917  * @psoc: psoc handle
918  *
919  * Get the preferred hw mode based on the current connection combinations
920  *
921  * Return: No change (PM_NOP), MCC (PM_SINGLE_MAC),
922  *         DBS (PM_DBS), SBS (PM_SBS)
923  */
924 enum policy_mgr_conc_next_action
925 		policy_mgr_get_current_pref_hw_mode_dbs_2x2(
926 		struct wlan_objmgr_psoc *psoc);
927 
928 /**
929  * policy_mgr_get_current_pref_hw_mode_dbs_1x1() - Get the
930  * current preferred hw mode
931  * @psoc: psoc handle
932  *
933  * Get the preferred hw mode based on the current connection combinations
934  *
935  * Return: No change (PM_NOP), MCC (PM_SINGLE_MAC_UPGRADE),
936  *         DBS (PM_DBS_DOWNGRADE)
937  */
938 enum policy_mgr_conc_next_action
939 		policy_mgr_get_current_pref_hw_mode_dbs_1x1(
940 		struct wlan_objmgr_psoc *psoc);
941 
942 /**
943  * policy_mgr_get_current_pref_hw_mode_dual_dbs() - Get the
944  * current preferred hw mode
945  * @psoc: PSOC object information
946  *
947  * Get the preferred hw mode based on the current connection combinations
948  *
949  * Return: No change (PM_NOP), (PM_SINGLE_MAC_UPGRADE),
950  *         DBS (PM_DBS1_DOWNGRADE or PM_DBS2_DOWNGRADE)
951  */
952 enum policy_mgr_conc_next_action
953 		policy_mgr_get_current_pref_hw_mode_dual_dbs(
954 		struct wlan_objmgr_psoc *psoc);
955 
956 void
957 policy_mgr_dump_freq_range_per_mac(struct policy_mgr_freq_range *freq_range,
958 				   enum policy_mgr_mode hw_mode);
959 
960 /**
961  * policy_mgr_fill_curr_mac_freq_by_hwmode() - Fill Current Mac frequency with
962  * the frequency range of the given Hw Mode
963  *
964  * @pm_ctx: Policy Mgr context
965  * @mode_hw: Policy Mgr Hw mode
966  *
967  * Fill Current Mac frequency with the frequency range of the given Hw Mode
968  *
969  * Return: None
970  */
971 void
972 policy_mgr_fill_curr_mac_freq_by_hwmode(struct policy_mgr_psoc_priv_obj *pm_ctx,
973 					enum policy_mgr_mode mode_hw);
974 
975 /**
976  * policy_mgr_dump_freq_range() - Function to print every frequency range
977  * for both MAC 0 and MAC1 for every Hw mode
978  *
979  * @pm_ctx: Policy Mgr context
980  *
981  * This function will print every frequency range
982  * for both MAC 0 and MAC1 for every Hw mode
983  *
984  * Return: void
985  *
986  */
987 void
988 policy_mgr_dump_freq_range(struct policy_mgr_psoc_priv_obj *pm_ctx);
989 
990 /**
991  * policy_mgr_dump_sbs_freq_range() - Function to print SBS frequency range
992  * for both MAC 0 and MAC1
993  *
994  * @pm_ctx: Policy Mgr context
995  *
996  * Return: void
997  */
998 void
999 policy_mgr_dump_sbs_freq_range(struct policy_mgr_psoc_priv_obj *pm_ctx);
1000 
1001 /**
1002  * policy_mgr_dump_curr_freq_range() - Function to print current frequency range
1003  * for both MAC 0 and MAC1
1004  *
1005  * @pm_ctx: Policy Mgr context
1006  *
1007  * This function will print current frequency range
1008  * for both MAC 0 and MAC1 for every Hw mode
1009  *
1010  * Return: void
1011  *
1012  */
1013 void
1014 policy_mgr_dump_curr_freq_range(struct policy_mgr_psoc_priv_obj *pm_ctx);
1015 
1016 /**
1017  * policy_mgr_reg_chan_change_callback() - Callback to be
1018  * invoked by regulatory module when valid channel list changes
1019  * @psoc: PSOC object information
1020  * @pdev: PDEV object information
1021  * @chan_list: New channel list
1022  * @avoid_freq_ind: LTE coex avoid channel list
1023  * @arg: Information passed at registration
1024  *
1025  * Get updated channel list from regulatory module
1026  *
1027  * Return: None
1028  */
1029 void policy_mgr_reg_chan_change_callback(struct wlan_objmgr_psoc *psoc,
1030 		struct wlan_objmgr_pdev *pdev,
1031 		struct regulatory_channel *chan_list,
1032 		struct avoid_freq_ind_data *avoid_freq_ind,
1033 		void *arg);
1034 
1035 /**
1036  * policy_mgr_update_nss_req() - wrapper API to update nss
1037  * @psoc: psoc object
1038  * @vdev_id: vdev id
1039  * @tx_nss: Tx nss to set
1040  * @rx_nss: Rx nss to set
1041  *
1042  * Return: QDF_STATUS_SUCCESS
1043  */
1044 QDF_STATUS policy_mgr_update_nss_req(struct wlan_objmgr_psoc *psoc,
1045 				     uint8_t vdev_id, uint8_t tx_nss,
1046 				     uint8_t rx_nss);
1047 
1048 /**
1049  * policy_mgr_nss_update() - update nss for AP vdev
1050  * @psoc: PSOC object information
1051  * @new_nss: new NSS value
1052  * @next_action: Next action after nss update
1053  * @band: update AP vdev on the Band.
1054  * @reason: action reason
1055  * @original_vdev_id: original request hwmode change vdev id
1056  * @request_id: request id
1057  *
1058  * The function will update AP vdevs on specific band.
1059  *  eg. band = POLICY_MGR_ANY will request to update all band (2g and 5g)
1060  *
1061  * Return: QDF_STATUS_SUCCESS, update requested successfully.
1062  */
1063 QDF_STATUS policy_mgr_nss_update(struct wlan_objmgr_psoc *psoc,
1064 		uint8_t  new_nss, uint8_t next_action,
1065 		enum policy_mgr_band band,
1066 		enum policy_mgr_conn_update_reason reason,
1067 		uint32_t original_vdev_id, uint32_t request_id);
1068 
1069 /**
1070  * policy_mgr_is_concurrency_allowed() - Check for allowed
1071  * concurrency combination
1072  * @psoc: PSOC object information
1073  * @mode: new connection mode
1074  * @ch_freq: channel frequency on which new connection is coming up
1075  * @bw: Bandwidth requested by the connection (optional)
1076  * @ext_flags: extended flags for concurrency check (union conc_ext_flag)
1077  * @pcl: Optional PCL for new connection
1078  *
1079  * When a new connection is about to come up check if current
1080  * concurrency combination including the new connection is
1081  * allowed or not based on the HW capability, but no need to
1082  * invoke get_pcl
1083  *
1084  * Return: True/False
1085  */
1086 bool policy_mgr_is_concurrency_allowed(struct wlan_objmgr_psoc *psoc,
1087 				       enum policy_mgr_con_mode mode,
1088 				       uint32_t ch_freq,
1089 				       enum hw_mode_bandwidth bw,
1090 				       uint32_t ext_flags,
1091 				       struct policy_mgr_pcl_list *pcl);
1092 
1093 /**
1094  * policy_mgr_can_2ghz_share_low_high_5ghz_sbs() - if SBS mode is dynamic where
1095  * 2.4 GHZ can be shared by any of high 5 GHZ or low 5GHZ at a time.
1096  * @pm_ctx: policy mgr psoc priv object
1097  *
1098  * Return: true is sbs is dynamic else false.
1099  */
1100 bool policy_mgr_can_2ghz_share_low_high_5ghz_sbs(
1101 				struct policy_mgr_psoc_priv_obj *pm_ctx);
1102 
1103 /**
1104  * policy_mgr_sbs_24_shared_with_high_5() - if 2.4 GHZ
1105  * can be shared by high 5 GHZ
1106  *
1107  * @pm_ctx: policy mgr psoc priv object
1108  *
1109  * Return: true if 2.4 GHz is shared by high 5 GHZ
1110  */
1111 bool
1112 policy_mgr_sbs_24_shared_with_high_5(struct policy_mgr_psoc_priv_obj *pm_ctx);
1113 
1114 /**
1115  * policy_mgr_sbs_24_shared_with_low_5() - if 2.4 GHZ
1116  * can be shared by low 5 GHZ
1117  *
1118  * @pm_ctx: policy mgr psoc priv object
1119  *
1120  * Return: true if 2.4 GHz is shared by low 5 GHZ
1121  */
1122 bool
1123 policy_mgr_sbs_24_shared_with_low_5(struct policy_mgr_psoc_priv_obj *pm_ctx);
1124 
1125 /**
1126  * policy_mgr_2_freq_same_mac_in_dbs() - to check provided frequencies are
1127  * in dbs freq range or not
1128  *
1129  * @pm_ctx: policy mgr psoc priv object
1130  * @freq_1: first frequency
1131  * @freq_2: second frequency
1132  *
1133  * This API is used to check provided frequencies are in dbs freq range or not
1134  *
1135  * Return: true/false.
1136  */
1137 bool
1138 policy_mgr_2_freq_same_mac_in_dbs(struct policy_mgr_psoc_priv_obj *pm_ctx,
1139 				  qdf_freq_t freq_1, qdf_freq_t freq_2);
1140 
1141 /**
1142  * policy_mgr_2_freq_same_mac_in_sbs() - to check provided frequencies are
1143  * in sbs freq range or not
1144  *
1145  * @pm_ctx: policy mgr psoc priv object
1146  * @freq_1: first frequency
1147  * @freq_2: second frequency
1148  *
1149  * This API is used to check provided frequencies are in sbs freq range or not
1150  *
1151  * Return: true/false.
1152  */
1153 bool policy_mgr_2_freq_same_mac_in_sbs(struct policy_mgr_psoc_priv_obj *pm_ctx,
1154 				       qdf_freq_t freq_1, qdf_freq_t freq_2);
1155 
1156 /**
1157  * policy_mgr_get_connection_for_vdev_id() - provides the
1158  * particular connection with the requested vdev id
1159  * @psoc: PSOC object information
1160  * @vdev_id: vdev id of the connection
1161  *
1162  * This function provides the specific connection with the
1163  * requested vdev id
1164  *
1165  * Return: index in the connection table
1166  */
1167 uint32_t policy_mgr_get_connection_for_vdev_id(struct wlan_objmgr_psoc *psoc,
1168 					       uint32_t vdev_id);
1169 
1170 #ifdef FEATURE_WLAN_CH_AVOID_EXT
1171 /**
1172  * policy_mgr_set_freq_restriction_mask() - fill the restriction_mask
1173  * in pm_ctx
1174  *
1175  * @pm_ctx: policy mgr psoc priv object
1176  * @freq_list: avoid freq indication carries freq/mask/freq count
1177  *
1178  * Return: None
1179  */
1180 void
1181 policy_mgr_set_freq_restriction_mask(struct policy_mgr_psoc_priv_obj *pm_ctx,
1182 				     struct ch_avoid_ind_type *freq_list);
1183 
1184 /**
1185  * policy_mgr_get_freq_restriction_mask() - get restriction_mask from
1186  * pm_ctx
1187  *
1188  * @pm_ctx: policy mgr psoc priv object
1189  *
1190  * Return: Restriction mask
1191  */
1192 uint32_t
1193 policy_mgr_get_freq_restriction_mask(struct policy_mgr_psoc_priv_obj *pm_ctx);
1194 #else
1195 static inline void
policy_mgr_set_freq_restriction_mask(struct policy_mgr_psoc_priv_obj * pm_ctx,struct ch_avoid_ind_type * freq_list)1196 policy_mgr_set_freq_restriction_mask(struct policy_mgr_psoc_priv_obj *pm_ctx,
1197 				     struct ch_avoid_ind_type *freq_list)
1198 {
1199 }
1200 #endif
1201 
1202 /**
1203  * policy_mgr_get_connection_max_channel_width() - Get max channel width
1204  * among vdevs in use
1205  * @psoc: PSOC object pointer
1206  *
1207  * This function returns max channel width among in-use vdevs
1208  *
1209  * Return: enum hw_mode_bandwidth
1210  */
1211 enum hw_mode_bandwidth
1212 policy_mgr_get_connection_max_channel_width(struct wlan_objmgr_psoc *psoc);
1213 
1214 #endif
1215