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