xref: /wlan-dirver/qca-wifi-host-cmn/umac/global_umac_dispatcher/lmac_if/src/wlan_lmac_if.c (revision 2888b71da71bce103343119fa1b31f4a0cee07c8)
1 /*
2  * Copyright (c) 2016-2021 The Linux Foundation. All rights reserved.
3  * Copyright (c) 2021-2022 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 #include "qdf_mem.h"
21 #include <qdf_module.h>
22 #include "wlan_lmac_if_def.h"
23 #include "wlan_lmac_if_api.h"
24 #include "wlan_mgmt_txrx_tgt_api.h"
25 #include "wlan_scan_tgt_api.h"
26 #include <wlan_reg_services_api.h>
27 #include <wlan_reg_ucfg_api.h>
28 #ifdef WLAN_ATF_ENABLE
29 #include "wlan_atf_tgt_api.h"
30 #endif
31 #ifdef WLAN_SA_API_ENABLE
32 #include "wlan_sa_api_tgt_api.h"
33 #endif
34 #ifdef WIFI_POS_CONVERGED
35 #include "target_if_wifi_pos.h"
36 #include "target_if_wifi_pos_rx_ops.h"
37 #endif /* WIFI_POS_CONVERGED */
38 #include "wlan_reg_tgt_api.h"
39 #ifdef CONVERGED_P2P_ENABLE
40 #include "wlan_p2p_tgt_api.h"
41 #endif
42 #ifdef FEATURE_WLAN_TDLS
43 #include "wlan_tdls_tgt_api.h"
44 #endif
45 
46 #include "wlan_crypto_global_api.h"
47 #ifdef DFS_COMPONENT_ENABLE
48 #include <wlan_dfs_tgt_api.h>
49 #include <wlan_objmgr_vdev_obj.h>
50 #include <wlan_dfs_utils_api.h>
51 #if defined(QCA_SUPPORT_DFS_CHAN_POSTNOL) || defined(QCA_DFS_BW_EXPAND)
52 #include <dfs_postnol_ucfg.h>
53 #endif
54 #endif
55 
56 #ifdef WLAN_SUPPORT_GREEN_AP
57 #include <wlan_green_ap_api.h>
58 #include <wlan_green_ap_ucfg_api.h>
59 #endif
60 #include <wlan_ftm_ucfg_api.h>
61 
62 #ifdef WLAN_SUPPORT_FILS
63 #include <wlan_fd_tgt_api.h>
64 #endif
65 
66 #ifdef QCA_SUPPORT_CP_STATS
67 #include <wlan_cp_stats_tgt_api.h>
68 #include <wlan_cp_stats_utils_api.h>
69 #endif /* QCA_SUPPORT_CP_STATS */
70 #include <wlan_vdev_mgr_tgt_if_rx_api.h>
71 
72 #ifdef WLAN_CFR_ENABLE
73 #include "wlan_cfr_tgt_api.h"
74 #endif
75 
76 #ifdef WIFI_POS_CONVERGED
77 #include "wifi_pos_api.h"
78 #endif
79 
80 #include "wlan_mgmt_txrx_rx_reo_tgt_api.h"
81 
82 #ifdef WLAN_FEATURE_11BE_MLO
83 #include "wlan_mlo_mgr_cmn.h"
84 #endif
85 
86 #include <wlan_twt_tgt_if_rx_api.h>
87 #ifdef WLAN_FEATURE_MCC_QUOTA
88 #include <wlan_p2p_mcc_quota_tgt_api.h>
89 #endif
90 
91 #ifdef WLAN_FEATURE_DBAM_CONFIG
92 #include "target_if_coex.h"
93 #endif
94 
95 #include "target_if.h"
96 
97 /* Function pointer for OL/WMA specific UMAC tx_ops
98  * registration.
99  */
100 QDF_STATUS (*wlan_lmac_if_umac_tx_ops_register)
101 				(struct wlan_lmac_if_tx_ops *tx_ops);
102 qdf_export_symbol(wlan_lmac_if_umac_tx_ops_register);
103 
104 /* Function pointer to call legacy crypto rxpn registration in OL */
105 QDF_STATUS (*wlan_lmac_if_umac_crypto_rxpn_ops_register)
106 				(struct wlan_lmac_if_rx_ops *rx_ops);
107 qdf_export_symbol(wlan_lmac_if_umac_crypto_rxpn_ops_register);
108 
109 static void
110 tgt_vdev_mgr_rx_ops_register(struct wlan_lmac_if_rx_ops *rx_ops)
111 {
112 	tgt_vdev_mgr_register_rx_ops(rx_ops);
113 }
114 
115 #ifdef QCA_SUPPORT_CP_STATS
116 #if defined(WLAN_SUPPORT_TWT) && defined(WLAN_TWT_CONV_SUPPORTED)
117 /**
118  * wlan_target_if_cp_stats_rx_ops_register() - register cp_stats rx ops
119  * @rx_ops: lmac rx_ops
120  *
121  * Return: none
122  */
123 static void
124 wlan_target_if_cp_stats_rx_ops_register(struct wlan_lmac_if_rx_ops *rx_ops)
125 {
126 	rx_ops->cp_stats_rx_ops.twt_get_session_param_resp =
127 			tgt_cp_stats_twt_get_session_evt_handler;
128 }
129 #else
130 static void
131 wlan_target_if_cp_stats_rx_ops_register(struct wlan_lmac_if_rx_ops *rx_ops)
132 {
133 }
134 #endif
135 
136 /**
137  * wlan_lmac_if_cp_stats_rx_ops_register() - API to register cp stats Rx Ops
138  * @rx_ops:	pointer to lmac rx ops
139  *
140  * This API will be used to register function pointers for FW events
141  *
142  * Return: void
143  */
144 static void
145 wlan_lmac_if_cp_stats_rx_ops_register(struct wlan_lmac_if_rx_ops *rx_ops)
146 {
147 	wlan_target_if_cp_stats_rx_ops_register(rx_ops);
148 	tgt_cp_stats_register_rx_ops(rx_ops);
149 }
150 #else
151 static void
152 wlan_lmac_if_cp_stats_rx_ops_register(struct wlan_lmac_if_rx_ops *rx_ops)
153 {
154 }
155 #endif /* QCA_SUPPORT_CP_STATS */
156 
157 #ifdef DCS_INTERFERENCE_DETECTION
158 /**
159  * wlan_target_if_dcs_rx_ops_register() - API to register dcs Rx Ops
160  * @rx_ops:	pointer to lmac rx ops
161  *
162  * This API will be used to register function pointers for FW events
163  *
164  * Return: void
165  */
166 static void
167 wlan_target_if_dcs_rx_ops_register(struct wlan_lmac_if_rx_ops *rx_ops)
168 {
169 	rx_ops->dcs_rx_ops.process_dcs_event = tgt_dcs_process_event;
170 }
171 #else
172 static void
173 wlan_target_if_dcs_rx_ops_register(struct wlan_lmac_if_rx_ops *rx_ops)
174 {
175 }
176 #endif /* DCS_INTERFERENCE_DETECTION */
177 
178 #ifdef WLAN_ATF_ENABLE
179 /**
180  * wlan_lmac_if_atf_rx_ops_register() - Function to register ATF RX ops.
181  */
182 static void
183 wlan_lmac_if_atf_rx_ops_register(struct wlan_lmac_if_rx_ops *rx_ops)
184 {
185 	struct wlan_lmac_if_atf_rx_ops *atf_rx_ops = &rx_ops->atf_rx_ops;
186 
187 	/* ATF rx ops */
188 	atf_rx_ops->atf_get_fmcap = tgt_atf_get_fmcap;
189 	atf_rx_ops->atf_get_mode = tgt_atf_get_mode;
190 	atf_rx_ops->atf_get_msdu_desc = tgt_atf_get_msdu_desc;
191 	atf_rx_ops->atf_get_max_vdevs = tgt_atf_get_max_vdevs;
192 	atf_rx_ops->atf_get_peers = tgt_atf_get_peers;
193 	atf_rx_ops->atf_get_tput_based = tgt_atf_get_tput_based;
194 	atf_rx_ops->atf_get_logging = tgt_atf_get_logging;
195 	atf_rx_ops->atf_get_ssidgroup = tgt_atf_get_ssidgroup;
196 	atf_rx_ops->atf_get_vdev_ac_blk_cnt = tgt_atf_get_vdev_ac_blk_cnt;
197 	atf_rx_ops->atf_get_peer_blk_txbitmap = tgt_atf_get_peer_blk_txbitmap;
198 	atf_rx_ops->atf_get_vdev_blk_txtraffic = tgt_atf_get_vdev_blk_txtraffic;
199 	atf_rx_ops->atf_get_sched = tgt_atf_get_sched;
200 	atf_rx_ops->atf_get_peer_stats = tgt_atf_get_peer_stats;
201 	atf_rx_ops->atf_get_token_allocated = tgt_atf_get_token_allocated;
202 	atf_rx_ops->atf_get_token_utilized = tgt_atf_get_token_utilized;
203 
204 	atf_rx_ops->atf_set_sched = tgt_atf_set_sched;
205 	atf_rx_ops->atf_set_fmcap = tgt_atf_set_fmcap;
206 	atf_rx_ops->atf_set_msdu_desc = tgt_atf_set_msdu_desc;
207 	atf_rx_ops->atf_set_max_vdevs = tgt_atf_set_max_vdevs;
208 	atf_rx_ops->atf_set_peers = tgt_atf_set_peers;
209 	atf_rx_ops->atf_set_peer_stats = tgt_atf_set_peer_stats;
210 	atf_rx_ops->atf_set_vdev_blk_txtraffic = tgt_atf_set_vdev_blk_txtraffic;
211 	atf_rx_ops->atf_peer_blk_txtraffic = tgt_atf_peer_blk_txtraffic;
212 	atf_rx_ops->atf_peer_unblk_txtraffic = tgt_atf_peer_unblk_txtraffic;
213 	atf_rx_ops->atf_set_token_allocated = tgt_atf_set_token_allocated;
214 	atf_rx_ops->atf_set_token_utilized = tgt_atf_set_token_utilized;
215 	atf_rx_ops->atf_process_tx_ppdu_stats = tgt_atf_process_tx_ppdu_stats;
216 	atf_rx_ops->atf_process_rx_ppdu_stats = tgt_atf_process_rx_ppdu_stats;
217 	atf_rx_ops->atf_is_stats_enabled = tgt_atf_is_stats_enabled;
218 }
219 #else
220 static void
221 wlan_lmac_if_atf_rx_ops_register(struct wlan_lmac_if_rx_ops *rx_ops)
222 {
223 }
224 #endif
225 
226 #ifdef WLAN_SUPPORT_FILS
227 static void
228 wlan_lmac_if_fd_rx_ops_register(struct wlan_lmac_if_rx_ops *rx_ops)
229 {
230 	struct wlan_lmac_if_fd_rx_ops *fd_rx_ops = &rx_ops->fd_rx_ops;
231 
232 	fd_rx_ops->fd_is_fils_enable = tgt_fd_is_fils_enable;
233 	fd_rx_ops->fd_alloc = tgt_fd_alloc;
234 	fd_rx_ops->fd_stop = tgt_fd_stop;
235 	fd_rx_ops->fd_free = tgt_fd_free;
236 	fd_rx_ops->fd_get_valid_fd_period = tgt_fd_get_valid_fd_period;
237 	fd_rx_ops->fd_swfda_handler = tgt_fd_swfda_handler;
238 	fd_rx_ops->fd_offload = tgt_fd_offload;
239 	fd_rx_ops->fd_tmpl_update = tgt_fd_tmpl_update;
240 }
241 #else
242 static void
243 wlan_lmac_if_fd_rx_ops_register(struct wlan_lmac_if_rx_ops *rx_ops)
244 {
245 }
246 #endif
247 
248 #ifdef WLAN_SA_API_ENABLE
249 /**
250  * wlan_lmac_if_sa_api_rx_ops_register() - Function to register SA_API RX ops.
251  */
252 static void
253 wlan_lmac_if_sa_api_rx_ops_register(struct wlan_lmac_if_rx_ops *rx_ops)
254 {
255 	struct wlan_lmac_if_sa_api_rx_ops *sa_api_rx_ops = &rx_ops->sa_api_rx_ops;
256 
257 	/* SA API rx ops */
258 	sa_api_rx_ops->sa_api_get_sa_supported = tgt_sa_api_get_sa_supported;
259 	sa_api_rx_ops->sa_api_get_validate_sw  = tgt_sa_api_get_validate_sw;
260 	sa_api_rx_ops->sa_api_enable_sa        = tgt_sa_api_enable_sa;
261 	sa_api_rx_ops->sa_api_get_sa_enable    = tgt_sa_api_get_sa_enable;
262 
263 	sa_api_rx_ops->sa_api_peer_assoc_hanldler = tgt_sa_api_peer_assoc_hanldler;
264 	sa_api_rx_ops->sa_api_update_tx_feedback = tgt_sa_api_update_tx_feedback;
265 	sa_api_rx_ops->sa_api_update_rx_feedback = tgt_sa_api_update_rx_feedback;
266 
267 	sa_api_rx_ops->sa_api_ucfg_set_param = tgt_sa_api_ucfg_set_param;
268 	sa_api_rx_ops->sa_api_ucfg_get_param = tgt_sa_api_ucfg_get_param;
269 
270 	sa_api_rx_ops->sa_api_is_tx_feedback_enabled = tgt_sa_api_is_tx_feedback_enabled;
271 	sa_api_rx_ops->sa_api_is_rx_feedback_enabled = tgt_sa_api_is_rx_feedback_enabled;
272 
273 	sa_api_rx_ops->sa_api_convert_rate_2g = tgt_sa_api_convert_rate_2g;
274 	sa_api_rx_ops->sa_api_convert_rate_5g = tgt_sa_api_convert_rate_5g;
275 	sa_api_rx_ops->sa_api_get_sa_mode = tgt_sa_api_get_sa_mode;
276 
277 	sa_api_rx_ops->sa_api_get_beacon_txantenna = tgt_sa_api_get_beacon_txantenna;
278 	sa_api_rx_ops->sa_api_cwm_action = tgt_sa_api_cwm_action;
279 }
280 #else
281 static void
282 wlan_lmac_if_sa_api_rx_ops_register(struct wlan_lmac_if_rx_ops *rx_ops)
283 {
284 }
285 #endif
286 
287 #ifdef WLAN_CFR_ENABLE
288 /**
289  * wlan_lmac_if_cfr_rx_ops_register() - Function to register CFR RX ops
290  */
291 static void
292 wlan_lmac_if_cfr_rx_ops_register(struct wlan_lmac_if_rx_ops *rx_ops)
293 {
294 	struct wlan_lmac_if_cfr_rx_ops *cfr_rx_ops = &rx_ops->cfr_rx_ops;
295 
296 	/* CFR rx ops */
297 	cfr_rx_ops->cfr_support_set = tgt_cfr_support_set;
298 	cfr_rx_ops->cfr_info_send  = tgt_cfr_info_send;
299 	cfr_rx_ops->cfr_capture_count_support_set =
300 		tgt_cfr_capture_count_support_set;
301 	cfr_rx_ops->cfr_mo_marking_support_set = tgt_cfr_mo_marking_support_set;
302 	cfr_rx_ops->cfr_aoa_for_rcc_support_set =
303 		tgt_cfr_aoa_for_rcc_support_set;
304 }
305 #else
306 static void
307 wlan_lmac_if_cfr_rx_ops_register(struct wlan_lmac_if_rx_ops *rx_ops)
308 {
309 }
310 #endif
311 
312 static void
313 wlan_lmac_if_crypto_rx_ops_register(struct wlan_lmac_if_rx_ops *rx_ops)
314 {
315 	wlan_crypto_register_crypto_rx_ops(&rx_ops->crypto_rx_ops);
316 	if (wlan_lmac_if_umac_crypto_rxpn_ops_register)
317 		wlan_lmac_if_umac_crypto_rxpn_ops_register(rx_ops);
318 }
319 
320 #if defined(WIFI_POS_CONVERGED) && defined(WLAN_FEATURE_RTT_11AZ_SUPPORT)
321 static void
322 wlan_lmac_if_wifi_pos_rx_ops(struct wlan_lmac_if_rx_ops *rx_ops)
323 {
324 	target_if_wifi_pos_register_rx_ops(rx_ops);
325 }
326 #else
327 static inline void
328 wlan_lmac_if_wifi_pos_rx_ops(struct wlan_lmac_if_rx_ops *rx_ops)
329 {}
330 #endif
331 
332 #ifdef WIFI_POS_CONVERGED
333 static void
334 wlan_lmac_if_umac_rx_ops_register_wifi_pos(struct wlan_lmac_if_rx_ops *rx_ops)
335 {
336 	wifi_pos_register_rx_ops(rx_ops);
337 	wlan_lmac_if_wifi_pos_rx_ops(rx_ops);
338 }
339 #else
340 static void wlan_lmac_if_umac_rx_ops_register_wifi_pos(
341 				struct wlan_lmac_if_rx_ops *rx_ops)
342 {
343 }
344 #endif /* WIFI_POS_CONVERGED */
345 
346 #ifdef CONFIG_BAND_6GHZ
347 static void wlan_lmac_if_register_master_list_ext_handler(
348 					struct wlan_lmac_if_rx_ops *rx_ops)
349 {
350 	rx_ops->reg_rx_ops.master_list_ext_handler =
351 		tgt_reg_process_master_chan_list_ext;
352 }
353 
354 static void wlan_lmac_if_register_super_chan_display(
355 					struct wlan_lmac_if_rx_ops *rx_ops)
356 {
357 	rx_ops->reg_rx_ops.reg_display_super_chan_list =
358 		wlan_reg_display_super_chan_list;
359 }
360 
361 #ifdef CONFIG_AFC_SUPPORT
362 static void wlan_lmac_if_register_afc_handlers(
363 					struct wlan_lmac_if_rx_ops *rx_ops)
364 {
365 	rx_ops->reg_rx_ops.afc_event_handler = tgt_reg_process_afc_event;
366 	rx_ops->reg_rx_ops.reg_set_afc_dev_type = tgt_reg_set_afc_dev_type;
367 	rx_ops->reg_rx_ops.reg_get_afc_dev_type = tgt_reg_get_afc_dev_type;
368 }
369 #else
370 static inline void wlan_lmac_if_register_afc_handlers(
371 					struct wlan_lmac_if_rx_ops *rx_ops)
372 {
373 }
374 #endif
375 
376 #else
377 static inline void wlan_lmac_if_register_master_list_ext_handler(
378 					struct wlan_lmac_if_rx_ops *rx_ops)
379 {
380 }
381 
382 static inline void wlan_lmac_if_register_afc_handlers(
383 					struct wlan_lmac_if_rx_ops *rx_ops)
384 {
385 }
386 
387 static inline void wlan_lmac_if_register_super_chan_display(
388 					struct wlan_lmac_if_rx_ops *rx_ops)
389 {
390 }
391 #endif
392 
393 #if defined(CONFIG_BAND_6GHZ)
394 static void wlan_lmac_if_register_6g_edge_chan_supp(
395 					struct wlan_lmac_if_rx_ops *rx_ops)
396 {
397 	rx_ops->reg_rx_ops.reg_set_lower_6g_edge_ch_supp =
398 		tgt_reg_set_lower_6g_edge_ch_supp;
399 
400 	rx_ops->reg_rx_ops.reg_set_disable_upper_6g_edge_ch_supp =
401 		tgt_reg_set_disable_upper_6g_edge_ch_supp;
402 }
403 #else
404 static inline void wlan_lmac_if_register_6g_edge_chan_supp(
405 					struct wlan_lmac_if_rx_ops *rx_ops)
406 {
407 }
408 #endif
409 
410 #ifdef WLAN_REG_PARTIAL_OFFLOAD
411 /**
412  * wlan_lmac_if_umac_reg_rx_ops_register_po() - Function to register Reg RX ops
413  * for Partial Offload
414  * rx_ops: Pointer to wlan_lmac_if_dfs_rx_ops
415  *
416  * Return: void
417  */
418 static void wlan_lmac_if_umac_reg_rx_ops_register_po(
419 					struct wlan_lmac_if_rx_ops *rx_ops)
420 {
421 	rx_ops->reg_rx_ops.reg_program_default_cc =
422 		ucfg_reg_program_default_cc;
423 
424 	rx_ops->reg_rx_ops.reg_get_current_regdomain =
425 		wlan_reg_get_curr_regdomain;
426 }
427 #else
428 static void wlan_lmac_if_umac_reg_rx_ops_register_po(
429 					struct wlan_lmac_if_rx_ops *rx_ops)
430 {
431 }
432 #endif
433 
434 static void wlan_lmac_if_umac_reg_rx_ops_register(
435 	struct wlan_lmac_if_rx_ops *rx_ops)
436 {
437 	rx_ops->reg_rx_ops.master_list_handler =
438 		tgt_reg_process_master_chan_list;
439 
440 	wlan_lmac_if_register_master_list_ext_handler(rx_ops);
441 
442 	rx_ops->reg_rx_ops.reg_11d_new_cc_handler =
443 		tgt_reg_process_11d_new_country;
444 
445 	rx_ops->reg_rx_ops.reg_set_regdb_offloaded =
446 		tgt_reg_set_regdb_offloaded;
447 
448 	rx_ops->reg_rx_ops.reg_set_11d_offloaded =
449 		tgt_reg_set_11d_offloaded;
450 
451 	rx_ops->reg_rx_ops.reg_set_6ghz_supported =
452 		tgt_reg_set_6ghz_supported;
453 
454 	rx_ops->reg_rx_ops.reg_set_5dot9_ghz_supported =
455 		tgt_reg_set_5dot9_ghz_supported;
456 
457 	rx_ops->reg_rx_ops.get_dfs_region =
458 		wlan_reg_get_dfs_region;
459 
460 	rx_ops->reg_rx_ops.reg_ch_avoid_event_handler =
461 		tgt_reg_process_ch_avoid_event;
462 
463 	rx_ops->reg_rx_ops.reg_freq_to_chan =
464 		wlan_reg_freq_to_chan;
465 
466 	rx_ops->reg_rx_ops.reg_set_chan_144 =
467 		ucfg_reg_modify_chan_144;
468 
469 	rx_ops->reg_rx_ops.reg_get_chan_144 =
470 		ucfg_reg_get_en_chan_144;
471 
472 	wlan_lmac_if_umac_reg_rx_ops_register_po(rx_ops);
473 
474 	rx_ops->reg_rx_ops.reg_enable_dfs_channels =
475 		ucfg_reg_enable_dfs_channels;
476 
477 	rx_ops->reg_rx_ops.reg_modify_pdev_chan_range =
478 		wlan_reg_modify_pdev_chan_range;
479 
480 	rx_ops->reg_rx_ops.reg_update_pdev_wireless_modes =
481 		wlan_reg_update_pdev_wireless_modes;
482 
483 	rx_ops->reg_rx_ops.reg_is_range_only6g =
484 		wlan_reg_is_range_only6g;
485 
486 	rx_ops->reg_rx_ops.reg_is_range_overlap_6g =
487 		wlan_reg_is_range_overlap_6g;
488 
489 	rx_ops->reg_rx_ops.reg_ignore_fw_reg_offload_ind =
490 		tgt_reg_ignore_fw_reg_offload_ind;
491 
492 	rx_ops->reg_rx_ops.reg_disable_chan_coex =
493 		wlan_reg_disable_chan_coex;
494 
495 	rx_ops->reg_rx_ops.reg_get_unii_5g_bitmap =
496 		ucfg_reg_get_unii_5g_bitmap;
497 
498 	rx_ops->reg_rx_ops.reg_set_ext_tpc_supported =
499 		tgt_reg_set_ext_tpc_supported;
500 
501 	wlan_lmac_if_register_6g_edge_chan_supp(rx_ops);
502 
503 	wlan_lmac_if_register_afc_handlers(rx_ops);
504 
505 	wlan_lmac_if_register_super_chan_display(rx_ops);
506 }
507 
508 #ifdef CONVERGED_P2P_ENABLE
509 #ifdef WLAN_FEATURE_MCC_QUOTA
510 static inline void
511 wlan_lmac_if_umac_rx_ops_register_p2p_mcc_quota(struct wlan_lmac_if_rx_ops *rx_ops)
512 {
513 	rx_ops->p2p.mcc_quota_ev_handler = tgt_p2p_mcc_quota_event_cb;
514 }
515 #else
516 static inline void wlan_lmac_if_umac_rx_ops_register_p2p_mcc_quota(
517 				struct wlan_lmac_if_rx_ops *rx_ops)
518 {
519 }
520 #endif
521 
522 #ifdef FEATURE_P2P_LISTEN_OFFLOAD
523 static inline void
524 wlan_lmac_if_umac_rx_ops_register_p2p_listen_offload(struct wlan_lmac_if_rx_ops *rx_ops)
525 {
526 	rx_ops->p2p.lo_ev_handler = tgt_p2p_lo_event_cb;
527 }
528 #else
529 static inline void
530 wlan_lmac_if_umac_rx_ops_register_p2p_listen_offload(struct wlan_lmac_if_rx_ops *rx_ops)
531 {
532 }
533 #endif
534 
535 static void wlan_lmac_if_umac_rx_ops_register_p2p(
536 				struct wlan_lmac_if_rx_ops *rx_ops)
537 {
538 	wlan_lmac_if_umac_rx_ops_register_p2p_listen_offload(rx_ops);
539 	rx_ops->p2p.noa_ev_handler = tgt_p2p_noa_event_cb;
540 	rx_ops->p2p.add_mac_addr_filter_evt_handler =
541 		tgt_p2p_add_mac_addr_status_event_cb;
542 	wlan_lmac_if_umac_rx_ops_register_p2p_mcc_quota(rx_ops);
543 }
544 #else
545 static void wlan_lmac_if_umac_rx_ops_register_p2p(
546 				struct wlan_lmac_if_rx_ops *rx_ops)
547 {
548 }
549 #endif
550 
551 /*
552  * register_precac_auto_chan_rx_ops_freq() - Register auto chan switch rx ops
553  * for frequency based channel APIs.
554  * rx_ops: Pointer to wlan_lmac_if_dfs_rx_ops
555  */
556 #ifdef DFS_COMPONENT_ENABLE
557 #if defined(WLAN_DFS_PRECAC_AUTO_CHAN_SUPPORT) && defined(CONFIG_CHAN_FREQ_API)
558 static inline void
559 register_precac_auto_chan_rx_ops_freq(struct wlan_lmac_if_dfs_rx_ops *rx_ops)
560 {
561 	if (!rx_ops)
562 		return;
563 	rx_ops->dfs_get_precac_chan_state_for_freq =
564 		ucfg_dfs_get_precac_chan_state_for_freq;
565 }
566 #else
567 static inline void
568 register_precac_auto_chan_rx_ops_freq(struct wlan_lmac_if_dfs_rx_ops *rx_ops)
569 {
570 }
571 #endif
572 #endif
573 
574 #ifdef DFS_COMPONENT_ENABLE
575 #ifdef WLAN_DFS_PRECAC_AUTO_CHAN_SUPPORT
576 static inline void
577 register_precac_auto_chan_rx_ops(struct wlan_lmac_if_dfs_rx_ops *rx_ops)
578 {
579 	if (!rx_ops)
580 		return;
581 	rx_ops->dfs_set_precac_intermediate_chan =
582 		ucfg_dfs_set_precac_intermediate_chan;
583 	rx_ops->dfs_get_precac_intermediate_chan =
584 		ucfg_dfs_get_precac_intermediate_chan;
585 }
586 #else
587 static inline void
588 register_precac_auto_chan_rx_ops(struct wlan_lmac_if_dfs_rx_ops *rx_ops)
589 {
590 }
591 #endif
592 
593 /*
594  * register_dfs_rx_ops_for_freq() - Register DFS rx ops for frequency based
595  * channel APIs.
596  * rx_ops: Pointer to wlan_lmac_if_dfs_rx_ops.
597  */
598 #ifdef CONFIG_CHAN_FREQ_API
599 static void register_dfs_rx_ops_for_freq(struct wlan_lmac_if_dfs_rx_ops *rx_ops)
600 {
601 	if (!rx_ops)
602 		return;
603 	rx_ops->dfs_set_current_channel_for_freq =
604 		tgt_dfs_set_current_channel_for_freq;
605 }
606 #endif
607 
608 /*
609  * register_rcac_dfs_rx_ops() - Register DFS RX-Ops for RCAC specific
610  * APIs.
611  * @rx_ops: Pointer to wlan_lmac_if_dfs_rx_ops.
612  */
613 #ifdef QCA_SUPPORT_ADFS_RCAC
614 static void register_rcac_dfs_rx_ops(struct wlan_lmac_if_dfs_rx_ops *rx_ops)
615 {
616 	if (!rx_ops)
617 		return;
618 	rx_ops->dfs_set_rcac_enable = ucfg_dfs_set_rcac_enable;
619 	rx_ops->dfs_get_rcac_enable = ucfg_dfs_get_rcac_enable;
620 	rx_ops->dfs_set_rcac_freq = ucfg_dfs_set_rcac_freq;
621 	rx_ops->dfs_get_rcac_freq = ucfg_dfs_get_rcac_freq;
622 	rx_ops->dfs_is_agile_rcac_enabled = ucfg_dfs_is_agile_rcac_enabled;
623 }
624 #else
625 static inline void
626 register_rcac_dfs_rx_ops(struct wlan_lmac_if_dfs_rx_ops *rx_ops)
627 {
628 }
629 #endif
630 
631 /*
632  * register_agile_dfs_rx_ops() - Register Rx-Ops for Agile Specific APIs
633  * @rx_ops: Pointer to wlan_lmac_if_dfs_rx_ops.
634  */
635 #ifdef QCA_SUPPORT_AGILE_DFS
636 static void register_agile_dfs_rx_ops(struct wlan_lmac_if_dfs_rx_ops *rx_ops)
637 {
638 	if (!rx_ops)
639 		return;
640 	rx_ops->dfs_agile_sm_deliver_evt = utils_dfs_agile_sm_deliver_evt;
641 }
642 #else
643 static inline void
644 register_agile_dfs_rx_ops(struct wlan_lmac_if_dfs_rx_ops *rx_ops)
645 {
646 }
647 #endif
648 
649 #ifdef QCA_SUPPORT_DFS_CHAN_POSTNOL
650 /* register_dfs_chan_postnol_rx_ops() - Register DFS Rx-Ops for postNOL
651  * channel change APIs.
652  * @rx_ops: Pointer to wlan_lmac_if_dfs_rx_ops.
653  */
654 static void
655 register_dfs_chan_postnol_rx_ops(struct wlan_lmac_if_dfs_rx_ops *rx_ops)
656 {
657 	if (!rx_ops)
658 		return;
659 
660 	rx_ops->dfs_set_postnol_freq = ucfg_dfs_set_postnol_freq;
661 	rx_ops->dfs_set_postnol_mode = ucfg_dfs_set_postnol_mode;
662 	rx_ops->dfs_set_postnol_cfreq2 = ucfg_dfs_set_postnol_cfreq2;
663 	rx_ops->dfs_get_postnol_freq = ucfg_dfs_get_postnol_freq;
664 	rx_ops->dfs_get_postnol_mode = ucfg_dfs_get_postnol_mode;
665 	rx_ops->dfs_get_postnol_cfreq2 = ucfg_dfs_get_postnol_cfreq2;
666 }
667 #else
668 static inline void
669 register_dfs_chan_postnol_rx_ops(struct wlan_lmac_if_dfs_rx_ops *rx_ops)
670 {
671 }
672 #endif
673 
674 #ifdef QCA_DFS_BW_EXPAND
675 /* register_dfs_bw_expand_rx_ops() - Register DFS Rx-Ops for BW Expand
676  * @rx_ops: Pointer to wlan_lmac_if_dfs_rx_ops.
677  */
678 static void
679 register_dfs_bw_expand_rx_ops(struct wlan_lmac_if_dfs_rx_ops *rx_ops)
680 {
681 	if (!rx_ops)
682 		return;
683 
684 	rx_ops->dfs_set_bw_expand = ucfg_dfs_set_bw_expand;
685 	rx_ops->dfs_get_bw_expand = ucfg_dfs_get_bw_expand;
686 }
687 #else
688 static inline void
689 register_dfs_bw_expand_rx_ops(struct wlan_lmac_if_dfs_rx_ops *rx_ops)
690 {
691 }
692 #endif
693 
694 #ifdef QCA_DFS_BW_PUNCTURE
695 /* register_dfs_puncture_rx_ops() - Register DFS Rx-Ops for DFS puncture.
696  * @rx_ops: Pointer to wlan_lmac_if_dfs_rx_ops.
697  */
698 static void
699 register_dfs_puncture_rx_ops(struct wlan_lmac_if_dfs_rx_ops *rx_ops)
700 {
701 	if (!rx_ops)
702 		return;
703 
704 	rx_ops->dfs_set_dfs_puncture = ucfg_dfs_set_dfs_puncture;
705 	rx_ops->dfs_get_dfs_puncture = ucfg_dfs_get_dfs_puncture;
706 }
707 #else
708 static inline void
709 register_dfs_puncture_rx_ops(struct wlan_lmac_if_dfs_rx_ops *rx_ops)
710 {
711 }
712 #endif
713 
714 #ifdef WLAN_MGMT_RX_REO_SUPPORT
715 static QDF_STATUS
716 wlan_lmac_if_mgmt_rx_reo_rx_ops_register(
717 	struct wlan_lmac_if_mgmt_txrx_rx_ops *mgmt_txrx_rx_ops)
718 {
719 	struct wlan_lmac_if_mgmt_rx_reo_rx_ops *mgmt_rx_reo_rx_ops;
720 
721 	mgmt_rx_reo_rx_ops = &mgmt_txrx_rx_ops->mgmt_rx_reo_rx_ops;
722 	mgmt_rx_reo_rx_ops->fw_consumed_event_handler =
723 			tgt_mgmt_rx_reo_fw_consumed_event_handler;
724 	mgmt_rx_reo_rx_ops->host_drop_handler =
725 			tgt_mgmt_rx_reo_host_drop_handler;
726 
727 	return QDF_STATUS_SUCCESS;
728 }
729 #else
730 static QDF_STATUS
731 wlan_lmac_if_mgmt_rx_reo_rx_ops_register(
732 	struct wlan_lmac_if_mgmt_txrx_rx_ops *mgmt_txrx_rx_ops)
733 {
734 	return QDF_STATUS_SUCCESS;
735 }
736 #endif
737 
738 static QDF_STATUS
739 wlan_lmac_if_mgmt_txrx_rx_ops_register(struct wlan_lmac_if_rx_ops *rx_ops)
740 {
741 	struct wlan_lmac_if_mgmt_txrx_rx_ops *mgmt_txrx_rx_ops;
742 
743 	if (!rx_ops) {
744 		qdf_print("lmac if rx ops pointer is NULL");
745 		return QDF_STATUS_E_NULL_VALUE;
746 	}
747 
748 	/* mgmt txrx rx ops */
749 	mgmt_txrx_rx_ops = &rx_ops->mgmt_txrx_rx_ops;
750 
751 	mgmt_txrx_rx_ops->mgmt_tx_completion_handler =
752 			tgt_mgmt_txrx_tx_completion_handler;
753 	mgmt_txrx_rx_ops->mgmt_rx_frame_handler =
754 			tgt_mgmt_txrx_rx_frame_handler;
755 	mgmt_txrx_rx_ops->mgmt_txrx_get_nbuf_from_desc_id =
756 			tgt_mgmt_txrx_get_nbuf_from_desc_id;
757 	mgmt_txrx_rx_ops->mgmt_txrx_get_peer_from_desc_id =
758 			tgt_mgmt_txrx_get_peer_from_desc_id;
759 	mgmt_txrx_rx_ops->mgmt_txrx_get_vdev_id_from_desc_id =
760 			tgt_mgmt_txrx_get_vdev_id_from_desc_id;
761 	mgmt_txrx_rx_ops->mgmt_txrx_get_free_desc_pool_count =
762 			tgt_mgmt_txrx_get_free_desc_pool_count;
763 	mgmt_txrx_rx_ops->mgmt_rx_frame_entry =
764 			tgt_mgmt_txrx_rx_frame_entry;
765 
766 	return wlan_lmac_if_mgmt_rx_reo_rx_ops_register(mgmt_txrx_rx_ops);
767 }
768 
769 #if defined(WLAN_DFS_PARTIAL_OFFLOAD) && defined(HOST_DFS_SPOOF_TEST)
770 static void dfs_action_on_status_assign(
771 		struct wlan_lmac_if_dfs_rx_ops *dfs_rx_ops)
772 {
773 	dfs_rx_ops->dfs_action_on_status = tgt_dfs_action_on_status_from_fw;
774 }
775 #else
776 static inline void dfs_action_on_status_assign(
777 		struct wlan_lmac_if_dfs_rx_ops *dfs_rx_ops)
778 {
779 }
780 #endif
781 
782 static QDF_STATUS
783 wlan_lmac_if_umac_dfs_rx_ops_register(struct wlan_lmac_if_rx_ops *rx_ops)
784 {
785 	struct wlan_lmac_if_dfs_rx_ops *dfs_rx_ops;
786 
787 	dfs_rx_ops = &rx_ops->dfs_rx_ops;
788 
789 	dfs_rx_ops->dfs_get_radars = tgt_dfs_get_radars;
790 	dfs_rx_ops->dfs_process_phyerr = tgt_dfs_process_phyerr;
791 	dfs_rx_ops->dfs_destroy_object = tgt_dfs_destroy_object;
792 	dfs_rx_ops->dfs_radar_enable = tgt_dfs_radar_enable;
793 	dfs_rx_ops->dfs_is_radar_enabled = tgt_dfs_is_radar_enabled;
794 	dfs_rx_ops->dfs_control = tgt_dfs_control;
795 	dfs_rx_ops->dfs_is_precac_timer_running =
796 		tgt_dfs_is_precac_timer_running;
797 	dfs_rx_ops->dfs_agile_precac_start =
798 		tgt_dfs_agile_precac_start;
799 	dfs_rx_ops->dfs_set_agile_precac_state =
800 		tgt_dfs_set_agile_precac_state;
801 	dfs_rx_ops->dfs_start_precac_timer = utils_dfs_start_precac_timer;
802 	dfs_rx_ops->dfs_cancel_precac_timer = utils_dfs_cancel_precac_timer;
803 	dfs_rx_ops->dfs_reset_adfs_config = ucfg_dfs_reset_agile_config;
804 	dfs_rx_ops->dfs_override_precac_timeout =
805 		ucfg_dfs_override_precac_timeout;
806 	dfs_rx_ops->dfs_set_precac_enable = ucfg_dfs_set_precac_enable;
807 	dfs_rx_ops->dfs_get_agile_precac_enable =
808 		ucfg_dfs_get_agile_precac_enable;
809 	dfs_rx_ops->dfs_get_override_precac_timeout =
810 		ucfg_dfs_get_override_precac_timeout;
811 	dfs_rx_ops->dfs_process_radar_ind = tgt_dfs_process_radar_ind;
812 	dfs_rx_ops->dfs_dfs_cac_complete_ind = tgt_dfs_cac_complete;
813 	dfs_rx_ops->dfs_dfs_ocac_complete_ind = tgt_dfs_ocac_complete;
814 	dfs_rx_ops->dfs_stop = tgt_dfs_stop;
815 	dfs_rx_ops->dfs_reinit_timers = ucfg_dfs_reinit_timers;
816 	dfs_rx_ops->dfs_enable_stadfs = tgt_dfs_enable_stadfs;
817 	dfs_rx_ops->dfs_is_stadfs_enabled = tgt_dfs_is_stadfs_enabled;
818 	dfs_rx_ops->dfs_process_phyerr_filter_offload =
819 		tgt_dfs_process_phyerr_filter_offload;
820 	dfs_rx_ops->dfs_is_phyerr_filter_offload =
821 		tgt_dfs_is_phyerr_filter_offload;
822 
823 	dfs_action_on_status_assign(dfs_rx_ops);
824 
825 	dfs_rx_ops->dfs_override_status_timeout =
826 		ucfg_dfs_set_override_status_timeout;
827 	dfs_rx_ops->dfs_get_override_status_timeout =
828 		ucfg_dfs_get_override_status_timeout;
829 	dfs_rx_ops->dfs_reset_spoof_test =
830 		tgt_dfs_reset_spoof_test;
831 	dfs_rx_ops->dfs_is_disable_radar_marking_set =
832 		utils_dfs_get_disable_radar_marking;
833 	dfs_rx_ops->dfs_set_nol_subchannel_marking =
834 		ucfg_dfs_set_nol_subchannel_marking;
835 	dfs_rx_ops->dfs_get_nol_subchannel_marking =
836 		ucfg_dfs_get_nol_subchannel_marking;
837 	dfs_rx_ops->dfs_set_bw_reduction =
838 		utils_dfs_bw_reduce;
839 	dfs_rx_ops->dfs_is_bw_reduction_needed =
840 		utils_dfs_is_bw_reduce;
841 	dfs_rx_ops->dfs_allow_hw_pulses =
842 		ucfg_dfs_allow_hw_pulses;
843 	dfs_rx_ops->dfs_is_hw_pulses_allowed =
844 		ucfg_dfs_is_hw_pulses_allowed;
845 	dfs_rx_ops->dfs_set_fw_adfs_support =
846 		tgt_dfs_set_fw_adfs_support;
847 	dfs_rx_ops->dfs_reset_dfs_prevchan =
848 		utils_dfs_reset_dfs_prevchan;
849 	dfs_rx_ops->dfs_init_tmp_psoc_nol =
850 		tgt_dfs_init_tmp_psoc_nol;
851 	dfs_rx_ops->dfs_deinit_tmp_psoc_nol =
852 		tgt_dfs_deinit_tmp_psoc_nol;
853 	dfs_rx_ops->dfs_save_dfs_nol_in_psoc =
854 		tgt_dfs_save_dfs_nol_in_psoc;
855 	dfs_rx_ops->dfs_reinit_nol_from_psoc_copy =
856 		tgt_dfs_reinit_nol_from_psoc_copy;
857 	dfs_rx_ops->dfs_reinit_precac_lists =
858 		tgt_dfs_reinit_precac_lists;
859 	dfs_rx_ops->dfs_complete_deferred_tasks =
860 		tgt_dfs_complete_deferred_tasks;
861 	register_precac_auto_chan_rx_ops(dfs_rx_ops);
862 	register_precac_auto_chan_rx_ops_freq(dfs_rx_ops);
863 	register_dfs_rx_ops_for_freq(dfs_rx_ops);
864 	register_rcac_dfs_rx_ops(dfs_rx_ops);
865 	register_agile_dfs_rx_ops(dfs_rx_ops);
866 	register_dfs_chan_postnol_rx_ops(dfs_rx_ops);
867 	register_dfs_bw_expand_rx_ops(dfs_rx_ops);
868 	register_dfs_puncture_rx_ops(dfs_rx_ops);
869 
870 	return QDF_STATUS_SUCCESS;
871 }
872 #else
873 static QDF_STATUS
874 wlan_lmac_if_umac_dfs_rx_ops_register(struct wlan_lmac_if_rx_ops *rx_ops)
875 {
876 	return QDF_STATUS_SUCCESS;
877 }
878 #endif
879 
880 #ifdef FEATURE_WLAN_TDLS
881 static QDF_STATUS
882 wlan_lmac_if_umac_tdls_rx_ops_register(struct wlan_lmac_if_rx_ops *rx_ops)
883 {
884 	rx_ops->tdls_rx_ops.tdls_ev_handler = tgt_tdls_event_handler;
885 
886 	return QDF_STATUS_SUCCESS;
887 }
888 #else
889 static QDF_STATUS
890 wlan_lmac_if_umac_tdls_rx_ops_register(struct wlan_lmac_if_rx_ops *rx_ops)
891 {
892 	return QDF_STATUS_SUCCESS;
893 }
894 #endif
895 
896 #ifdef WLAN_SUPPORT_GREEN_AP
897 static QDF_STATUS
898 wlan_lmac_if_umac_green_ap_rx_ops_register(struct wlan_lmac_if_rx_ops *rx_ops)
899 {
900 	rx_ops->green_ap_rx_ops.is_ps_enabled = wlan_green_ap_is_ps_enabled;
901 	rx_ops->green_ap_rx_ops.is_dbg_print_enabled =
902 					ucfg_green_ap_get_debug_prints;
903 	rx_ops->green_ap_rx_ops.ps_set = ucfg_green_ap_set_ps_config;
904 	rx_ops->green_ap_rx_ops.ps_get = ucfg_green_ap_get_ps_config;
905 	rx_ops->green_ap_rx_ops.suspend_handle = wlan_green_ap_suspend_handle;
906 
907 	return QDF_STATUS_SUCCESS;
908 }
909 #else
910 static QDF_STATUS
911 wlan_lmac_if_umac_green_ap_rx_ops_register(struct wlan_lmac_if_rx_ops *rx_ops)
912 {
913 	return QDF_STATUS_SUCCESS;
914 }
915 #endif
916 
917 #ifdef QCA_WIFI_FTM
918 static QDF_STATUS
919 wlan_lmac_if_umac_ftm_rx_ops_register(struct wlan_lmac_if_rx_ops *rx_ops)
920 {
921 	struct wlan_lmac_if_ftm_rx_ops *ftm_rx_ops;
922 
923 	ftm_rx_ops = &rx_ops->ftm_rx_ops;
924 
925 	ftm_rx_ops->ftm_ev_handler = wlan_ftm_process_utf_event;
926 
927 	return QDF_STATUS_SUCCESS;
928 }
929 #else
930 static QDF_STATUS
931 wlan_lmac_if_umac_ftm_rx_ops_register(struct wlan_lmac_if_rx_ops *rx_ops)
932 {
933 	return QDF_STATUS_SUCCESS;
934 }
935 #endif
936 
937 #ifdef WLAN_FEATURE_11BE_MLO
938 /**
939  * wlan_lmac_if_mlo_mgr_rx_ops_register() - API to register mlo mgr Rx Ops
940  * @rx_ops: pointer to lmac rx ops
941  *
942  * This API will be used to register function pointers for FW events
943  *
944  * Return: void
945  */
946 static void
947 wlan_lmac_if_mlo_mgr_rx_ops_register(struct wlan_lmac_if_rx_ops *rx_ops)
948 {
949 	/* register handler for received mlo related events */
950 	rx_ops->mlo_rx_ops.process_link_set_active_resp =
951 		mlo_process_link_set_active_resp;
952 }
953 #else
954 static void
955 wlan_lmac_if_mlo_mgr_rx_ops_register(struct wlan_lmac_if_rx_ops *rx_ops)
956 {
957 }
958 #endif /* WLAN_FEATURE_11BE_MLO */
959 
960 #if defined(WLAN_SUPPORT_TWT) && defined(WLAN_TWT_CONV_SUPPORTED)
961 static
962 void wlan_lmac_if_twt_rx_ops_register(struct wlan_lmac_if_rx_ops *rx_ops)
963 {
964 	tgt_twt_register_rx_ops(rx_ops);
965 }
966 #else
967 static
968 void wlan_lmac_if_twt_rx_ops_register(struct wlan_lmac_if_rx_ops *rx_ops)
969 {
970 }
971 #endif /* WLAN_SUPPORT_TWT && WLAN_TWT_CONV_SUPPORTED */
972 
973 #ifdef WLAN_FEATURE_DBAM_CONFIG
974 static void
975 wlan_lmac_if_dbam_rx_ops_register(struct wlan_lmac_if_rx_ops *rx_ops)
976 {
977 	rx_ops->dbam_rx_ops.dbam_resp_event = target_if_dbam_process_event;
978 }
979 #else
980 static void
981 wlan_lmac_if_dbam_rx_ops_register(struct wlan_lmac_if_rx_ops *rx_ops)
982 {
983 }
984 #endif /* WLAN_FEATURE_DBAM_CONFIG */
985 
986 /**
987  * wlan_lmac_if_umac_rx_ops_register() - UMAC rx handler register
988  * @rx_ops: Pointer to rx_ops structure to be populated
989  *
990  * Register umac RX callabacks which will be called by DA/OL/WMA/WMI
991  *
992  * Return: QDF_STATUS_SUCCESS - in case of success
993  */
994 QDF_STATUS
995 wlan_lmac_if_umac_rx_ops_register(struct wlan_lmac_if_rx_ops *rx_ops)
996 {
997 	/* Component specific public api's to be called to register
998 	 * respective callbacks
999 	 * Ex: rx_ops->fp = function;
1000 	 */
1001 
1002 	if (!rx_ops) {
1003 		qdf_print("lmac if rx ops pointer is NULL");
1004 		return QDF_STATUS_E_INVAL;
1005 	}
1006 
1007 	wlan_lmac_if_mgmt_txrx_rx_ops_register(rx_ops);
1008 
1009 	/* scan rx ops */
1010 	rx_ops->scan.scan_ev_handler = tgt_scan_event_handler;
1011 	rx_ops->scan.scan_set_max_active_scans = tgt_scan_set_max_active_scans;
1012 
1013 	wlan_lmac_if_atf_rx_ops_register(rx_ops);
1014 
1015 	wlan_lmac_if_cp_stats_rx_ops_register(rx_ops);
1016 
1017 	wlan_target_if_dcs_rx_ops_register(rx_ops);
1018 
1019 	wlan_lmac_if_sa_api_rx_ops_register(rx_ops);
1020 
1021 	wlan_lmac_if_cfr_rx_ops_register(rx_ops);
1022 
1023 	wlan_lmac_if_crypto_rx_ops_register(rx_ops);
1024 	/* wifi_pos rx ops */
1025 	wlan_lmac_if_umac_rx_ops_register_wifi_pos(rx_ops);
1026 
1027 	/* tdls rx ops */
1028 	wlan_lmac_if_umac_tdls_rx_ops_register(rx_ops);
1029 
1030 	wlan_lmac_if_umac_reg_rx_ops_register(rx_ops);
1031 
1032 	/* p2p rx ops */
1033 	wlan_lmac_if_umac_rx_ops_register_p2p(rx_ops);
1034 
1035 	/* DFS rx_ops */
1036 	wlan_lmac_if_umac_dfs_rx_ops_register(rx_ops);
1037 
1038 	wlan_lmac_if_umac_green_ap_rx_ops_register(rx_ops);
1039 
1040 	/* FTM rx_ops */
1041 	wlan_lmac_if_umac_ftm_rx_ops_register(rx_ops);
1042 
1043 	/* FILS Discovery */
1044 	wlan_lmac_if_fd_rx_ops_register(rx_ops);
1045 
1046 	/* MLME rx_ops */
1047 	tgt_vdev_mgr_rx_ops_register(rx_ops);
1048 
1049 	wlan_lmac_if_mlo_mgr_rx_ops_register(rx_ops);
1050 
1051 	wlan_lmac_if_twt_rx_ops_register(rx_ops);
1052 
1053 	wlan_lmac_if_dbam_rx_ops_register(rx_ops);
1054 
1055 	return QDF_STATUS_SUCCESS;
1056 }
1057 
1058 /**
1059  * wlan_lmac_if_set_umac_txops_registration_cb() - tx registration
1060  * callback assignment
1061  * @dev_type: Dev type can be either Direct attach or Offload
1062  * @handler: handler to be called for LMAC tx ops registration
1063  *
1064  * API to assign appropriate tx registration callback handler based on the
1065  * device type(Offload or Direct attach)
1066  *
1067  * Return: QDF_STATUS_SUCCESS - in case of success
1068  */
1069 QDF_STATUS wlan_lmac_if_set_umac_txops_registration_cb(QDF_STATUS (*handler)
1070 				(struct wlan_lmac_if_tx_ops *))
1071 {
1072 	wlan_lmac_if_umac_tx_ops_register = handler;
1073 	return QDF_STATUS_SUCCESS;
1074 }
1075 qdf_export_symbol(wlan_lmac_if_set_umac_txops_registration_cb);
1076 
1077 /**
1078  * wlan_lmac_if_set_umac_crypto_rxpn_ops_registration_cb() - crypto rxpn
1079  * registration callback assignment
1080  * @dev_type: Dev type can be either Direct attach or Offload
1081  * @handler: handler to be called for LMAC crypto rxpn ops registration
1082  *
1083  * API to assign appropriate crypto rxpn registration callback handler
1084  * based on the device type
1085  *
1086  * Return: QDF_STATUS_SUCCESS - in case of success
1087  */
1088 QDF_STATUS wlan_lmac_if_set_umac_crypto_rxpn_ops_registration_cb(
1089 		QDF_STATUS (*handler)(struct wlan_lmac_if_rx_ops *))
1090 {
1091 	wlan_lmac_if_umac_crypto_rxpn_ops_register = handler;
1092 	return QDF_STATUS_SUCCESS;
1093 }
1094 qdf_export_symbol(wlan_lmac_if_set_umac_crypto_rxpn_ops_registration_cb);
1095