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