xref: /wlan-dirver/qca-wifi-host-cmn/umac/global_umac_dispatcher/lmac_if/src/wlan_lmac_if.c (revision a175314c51a4ce5cec2835cc8a8c7dc0c1810915)
1 /*
2  * Copyright (c) 2016-2018 The Linux Foundation. All rights reserved.
3  *
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 #endif /* WIFI_POS_CONVERGED */
37 #ifdef WLAN_FEATURE_NAN_CONVERGENCE
38 #include "target_if_nan.h"
39 #endif /* WLAN_FEATURE_NAN_CONVERGENCE */
40 #include "wlan_reg_tgt_api.h"
41 #ifdef CONVERGED_P2P_ENABLE
42 #include "wlan_p2p_tgt_api.h"
43 #endif
44 #ifdef CONVERGED_TDLS_ENABLE
45 #include "wlan_tdls_tgt_api.h"
46 #endif
47 
48 #ifdef WLAN_CONV_CRYPTO_SUPPORTED
49 #include "wlan_crypto_global_api.h"
50 #endif
51 #ifdef DFS_COMPONENT_ENABLE
52 #include <wlan_dfs_tgt_api.h>
53 #include <wlan_dfs_utils_api.h>
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 #endif /* QCA_SUPPORT_CP_STATS */
69 
70 /* Function pointer for OL/WMA specific UMAC tx_ops
71  * registration.
72  */
73 QDF_STATUS (*wlan_lmac_if_umac_tx_ops_register)
74 				(struct wlan_lmac_if_tx_ops *tx_ops);
75 qdf_export_symbol(wlan_lmac_if_umac_tx_ops_register);
76 
77 #ifdef QCA_SUPPORT_CP_STATS
78 /**
79  * wlan_lmac_if_cp_stats_rx_ops_register() - API to register cp stats Rx Ops
80  * @rx_ops:	pointer to lmac rx ops
81  *
82  * This API will be used to register function pointers for FW events
83  *
84  * Return: void
85  */
86 static void
87 wlan_lmac_if_cp_stats_rx_ops_register(struct wlan_lmac_if_rx_ops *rx_ops)
88 {
89 	tgt_cp_stats_register_rx_ops(rx_ops);
90 }
91 #else
92 static void
93 wlan_lmac_if_cp_stats_rx_ops_register(struct wlan_lmac_if_rx_ops *rx_ops)
94 {
95 }
96 #endif /* QCA_SUPPORT_CP_STATS */
97 
98 #ifdef WLAN_ATF_ENABLE
99 /**
100  * wlan_lmac_if_atf_rx_ops_register() - Function to register ATF RX ops.
101  */
102 static void
103 wlan_lmac_if_atf_rx_ops_register(struct wlan_lmac_if_rx_ops *rx_ops)
104 {
105 	struct wlan_lmac_if_atf_rx_ops *atf_rx_ops = &rx_ops->atf_rx_ops;
106 
107 	/* ATF rx ops */
108 	atf_rx_ops->atf_get_atf_commit = tgt_atf_get_atf_commit;
109 	atf_rx_ops->atf_get_fmcap = tgt_atf_get_fmcap;
110 	atf_rx_ops->atf_get_obss_scale = tgt_atf_get_obss_scale;
111 	atf_rx_ops->atf_get_mode = tgt_atf_get_mode;
112 	atf_rx_ops->atf_get_msdu_desc = tgt_atf_get_msdu_desc;
113 	atf_rx_ops->atf_get_max_vdevs = tgt_atf_get_max_vdevs;
114 	atf_rx_ops->atf_get_peers = tgt_atf_get_peers;
115 	atf_rx_ops->atf_get_tput_based = tgt_atf_get_tput_based;
116 	atf_rx_ops->atf_get_logging = tgt_atf_get_logging;
117 	atf_rx_ops->atf_get_txbuf_share = tgt_atf_get_txbuf_share;
118 	atf_rx_ops->atf_get_txbuf_max = tgt_atf_get_txbuf_max;
119 	atf_rx_ops->atf_get_txbuf_min = tgt_atf_get_txbuf_min;
120 	atf_rx_ops->atf_get_ssidgroup = tgt_atf_get_ssidgroup;
121 	atf_rx_ops->atf_get_tx_block_count = tgt_atf_get_tx_block_count;
122 	atf_rx_ops->atf_get_peer_blk_txtraffic = tgt_atf_get_peer_blk_txtraffic;
123 	atf_rx_ops->atf_get_vdev_blk_txtraffic = tgt_atf_get_vdev_blk_txtraffic;
124 	atf_rx_ops->atf_get_sched = tgt_atf_get_sched;
125 	atf_rx_ops->atf_get_tx_tokens = tgt_atf_get_tx_tokens;
126 	atf_rx_ops->atf_get_shadow_tx_tokens = tgt_atf_get_shadow_tx_tokens;
127 	atf_rx_ops->atf_get_shadow_alloted_tx_tokens =
128 					tgt_atf_get_shadow_alloted_tx_tokens;
129 	atf_rx_ops->atf_get_txtokens_common = tgt_atf_get_txtokens_common;
130 	atf_rx_ops->atf_get_peer_stats = tgt_atf_get_peer_stats;
131 	atf_rx_ops->atf_get_token_allocated = tgt_atf_get_token_allocated;
132 	atf_rx_ops->atf_get_token_utilized = tgt_atf_get_token_utilized;
133 
134 	atf_rx_ops->atf_set_sched = tgt_atf_set_sched;
135 	atf_rx_ops->atf_set_fmcap = tgt_atf_set_fmcap;
136 	atf_rx_ops->atf_set_obss_scale = tgt_atf_set_obss_scale;
137 	atf_rx_ops->atf_set_msdu_desc = tgt_atf_set_msdu_desc;
138 	atf_rx_ops->atf_set_max_vdevs = tgt_atf_set_max_vdevs;
139 	atf_rx_ops->atf_set_peers = tgt_atf_set_peers;
140 	atf_rx_ops->atf_set_peer_stats = tgt_atf_set_peer_stats;
141 	atf_rx_ops->atf_set_vdev_blk_txtraffic = tgt_atf_set_vdev_blk_txtraffic;
142 	atf_rx_ops->atf_set_peer_blk_txtraffic = tgt_atf_set_peer_blk_txtraffic;
143 	atf_rx_ops->atf_set_tx_block_count = tgt_atf_set_tx_block_count;
144 	atf_rx_ops->atf_set_token_allocated = tgt_atf_set_token_allocated;
145 	atf_rx_ops->atf_set_token_utilized = tgt_atf_set_token_utilized;
146 }
147 #else
148 static void
149 wlan_lmac_if_atf_rx_ops_register(struct wlan_lmac_if_rx_ops *rx_ops)
150 {
151 }
152 #endif
153 
154 #ifdef WLAN_SUPPORT_FILS
155 static void
156 wlan_lmac_if_fd_rx_ops_register(struct wlan_lmac_if_rx_ops *rx_ops)
157 {
158 	struct wlan_lmac_if_fd_rx_ops *fd_rx_ops = &rx_ops->fd_rx_ops;
159 
160 	fd_rx_ops->fd_is_fils_enable = tgt_fd_is_fils_enable;
161 	fd_rx_ops->fd_alloc = tgt_fd_alloc;
162 	fd_rx_ops->fd_stop = tgt_fd_stop;
163 	fd_rx_ops->fd_free = tgt_fd_free;
164 	fd_rx_ops->fd_get_valid_fd_period = tgt_fd_get_valid_fd_period;
165 	fd_rx_ops->fd_swfda_handler = tgt_fd_swfda_handler;
166 }
167 #else
168 static void
169 wlan_lmac_if_fd_rx_ops_register(struct wlan_lmac_if_rx_ops *rx_ops)
170 {
171 }
172 #endif
173 
174 #ifdef WLAN_SA_API_ENABLE
175 /**
176  * wlan_lmac_if_sa_api_rx_ops_register() - Function to register SA_API RX ops.
177  */
178 static void
179 wlan_lmac_if_sa_api_rx_ops_register(struct wlan_lmac_if_rx_ops *rx_ops)
180 {
181 	struct wlan_lmac_if_sa_api_rx_ops *sa_api_rx_ops = &rx_ops->sa_api_rx_ops;
182 
183 	/* SA API rx ops */
184 	sa_api_rx_ops->sa_api_get_sa_supported = tgt_sa_api_get_sa_supported;
185 	sa_api_rx_ops->sa_api_get_validate_sw  = tgt_sa_api_get_validate_sw;
186 	sa_api_rx_ops->sa_api_enable_sa        = tgt_sa_api_enable_sa;
187 	sa_api_rx_ops->sa_api_get_sa_enable    = tgt_sa_api_get_sa_enable;
188 
189 	sa_api_rx_ops->sa_api_peer_assoc_hanldler = tgt_sa_api_peer_assoc_hanldler;
190 	sa_api_rx_ops->sa_api_update_tx_feedback = tgt_sa_api_update_tx_feedback;
191 	sa_api_rx_ops->sa_api_update_rx_feedback = tgt_sa_api_update_rx_feedback;
192 
193 	sa_api_rx_ops->sa_api_ucfg_set_param = tgt_sa_api_ucfg_set_param;
194 	sa_api_rx_ops->sa_api_ucfg_get_param = tgt_sa_api_ucfg_get_param;
195 
196 	sa_api_rx_ops->sa_api_is_tx_feedback_enabled = tgt_sa_api_is_tx_feedback_enabled;
197 	sa_api_rx_ops->sa_api_is_rx_feedback_enabled = tgt_sa_api_is_rx_feedback_enabled;
198 
199 	sa_api_rx_ops->sa_api_convert_rate_2g = tgt_sa_api_convert_rate_2g;
200 	sa_api_rx_ops->sa_api_convert_rate_5g = tgt_sa_api_convert_rate_5g;
201 	sa_api_rx_ops->sa_api_get_sa_mode = tgt_sa_api_get_sa_mode;
202 
203 	sa_api_rx_ops->sa_api_get_beacon_txantenna = tgt_sa_api_get_beacon_txantenna;
204 	sa_api_rx_ops->sa_api_cwm_action = tgt_sa_api_cwm_action;
205 }
206 #else
207 static void
208 wlan_lmac_if_sa_api_rx_ops_register(struct wlan_lmac_if_rx_ops *rx_ops)
209 {
210 }
211 #endif
212 
213 
214 #ifdef WLAN_CONV_CRYPTO_SUPPORTED
215 static void
216 wlan_lmac_if_crypto_rx_ops_register(struct wlan_lmac_if_rx_ops *rx_ops)
217 {
218 	wlan_crypto_register_crypto_rx_ops(&rx_ops->crypto_rx_ops);
219 }
220 #else
221 static void
222 wlan_lmac_if_crypto_rx_ops_register(struct wlan_lmac_if_rx_ops *rx_ops)
223 {
224 }
225 #endif
226 
227 #ifdef WIFI_POS_CONVERGED
228 static void wlan_lmac_if_umac_rx_ops_register_wifi_pos(
229 				struct wlan_lmac_if_rx_ops *rx_ops)
230 {
231 	target_if_wifi_pos_register_rx_ops(rx_ops);
232 }
233 #else
234 static void wlan_lmac_if_umac_rx_ops_register_wifi_pos(
235 				struct wlan_lmac_if_rx_ops *rx_ops)
236 {
237 }
238 #endif /* WIFI_POS_CONVERGED */
239 
240 #ifdef WLAN_FEATURE_NAN_CONVERGENCE
241 static void wlan_lmac_if_register_nan_rx_ops(struct wlan_lmac_if_rx_ops *rx_ops)
242 {
243 	target_if_nan_register_rx_ops(rx_ops);
244 }
245 #else
246 static void wlan_lmac_if_register_nan_rx_ops(struct wlan_lmac_if_rx_ops *rx_ops)
247 {
248 }
249 #endif /* WLAN_FEATURE_NAN_CONVERGENCE */
250 
251 static void wlan_lmac_if_umac_reg_rx_ops_register(
252 	struct wlan_lmac_if_rx_ops *rx_ops)
253 {
254 	rx_ops->reg_rx_ops.master_list_handler =
255 		tgt_reg_process_master_chan_list;
256 
257 	rx_ops->reg_rx_ops.reg_11d_new_cc_handler =
258 		tgt_reg_process_11d_new_country;
259 
260 	rx_ops->reg_rx_ops.reg_set_regdb_offloaded =
261 		tgt_reg_set_regdb_offloaded;
262 
263 	rx_ops->reg_rx_ops.reg_set_11d_offloaded =
264 		tgt_reg_set_11d_offloaded;
265 
266 	rx_ops->reg_rx_ops.get_dfs_region =
267 		wlan_reg_get_dfs_region;
268 
269 	rx_ops->reg_rx_ops.reg_ch_avoid_event_handler =
270 		tgt_reg_process_ch_avoid_event;
271 
272 	rx_ops->reg_rx_ops.reg_freq_to_chan =
273 		wlan_reg_freq_to_chan;
274 
275 	rx_ops->reg_rx_ops.reg_set_chan_144 =
276 		ucfg_reg_modify_chan_144;
277 
278 	rx_ops->reg_rx_ops.reg_get_chan_144 =
279 		ucfg_reg_get_en_chan_144;
280 
281 	rx_ops->reg_rx_ops.reg_program_default_cc =
282 		ucfg_reg_program_default_cc;
283 
284 	rx_ops->reg_rx_ops.reg_get_current_regdomain =
285 		wlan_reg_get_curr_regdomain;
286 }
287 
288 #ifdef CONVERGED_P2P_ENABLE
289 static void wlan_lmac_if_umac_rx_ops_register_p2p(
290 				struct wlan_lmac_if_rx_ops *rx_ops)
291 {
292 	rx_ops->p2p.lo_ev_handler = tgt_p2p_lo_event_cb;
293 	rx_ops->p2p.noa_ev_handler = tgt_p2p_noa_event_cb;
294 }
295 #else
296 static void wlan_lmac_if_umac_rx_ops_register_p2p(
297 				struct wlan_lmac_if_rx_ops *rx_ops)
298 {
299 }
300 #endif
301 
302 #ifdef DFS_COMPONENT_ENABLE
303 #ifdef WLAN_DFS_PRECAC_AUTO_CHAN_SUPPORT
304 static inline void
305 register_precac_auto_chan_rx_ops(struct wlan_lmac_if_dfs_rx_ops *rx_ops)
306 {
307 	if (!rx_ops)
308 		return;
309 	rx_ops->dfs_set_precac_intermediate_chan =
310 		ucfg_dfs_set_precac_intermediate_chan;
311 	rx_ops->dfs_get_precac_intermediate_chan =
312 		ucfg_dfs_get_precac_intermediate_chan;
313 	rx_ops->dfs_get_precac_chan_state = ucfg_dfs_get_precac_chan_state;
314 }
315 #else
316 static inline void
317 register_precac_auto_chan_rx_ops(struct wlan_lmac_if_dfs_rx_ops *rx_ops)
318 {
319 }
320 #endif
321 
322 static QDF_STATUS
323 wlan_lmac_if_umac_dfs_rx_ops_register(struct wlan_lmac_if_rx_ops *rx_ops)
324 {
325 	struct wlan_lmac_if_dfs_rx_ops *dfs_rx_ops;
326 
327 	dfs_rx_ops = &rx_ops->dfs_rx_ops;
328 
329 	dfs_rx_ops->dfs_get_radars = tgt_dfs_get_radars;
330 	dfs_rx_ops->dfs_process_phyerr = tgt_dfs_process_phyerr;
331 	dfs_rx_ops->dfs_destroy_object = tgt_dfs_destroy_object;
332 	dfs_rx_ops->dfs_radar_enable = tgt_dfs_radar_enable;
333 	dfs_rx_ops->dfs_is_radar_enabled = tgt_dfs_is_radar_enabled;
334 	dfs_rx_ops->dfs_control = tgt_dfs_control;
335 	dfs_rx_ops->dfs_is_precac_timer_running =
336 		tgt_dfs_is_precac_timer_running;
337 	dfs_rx_ops->dfs_find_vht80_chan_for_precac =
338 		tgt_dfs_find_vht80_chan_for_precac;
339 	dfs_rx_ops->dfs_start_precac_timer = utils_dfs_start_precac_timer;
340 	dfs_rx_ops->dfs_cancel_precac_timer = utils_dfs_cancel_precac_timer;
341 	dfs_rx_ops->dfs_override_precac_timeout =
342 		ucfg_dfs_override_precac_timeout;
343 	dfs_rx_ops->dfs_set_precac_enable = ucfg_dfs_set_precac_enable;
344 	dfs_rx_ops->dfs_get_precac_enable = ucfg_dfs_get_precac_enable;
345 	dfs_rx_ops->dfs_get_override_precac_timeout =
346 		ucfg_dfs_get_override_precac_timeout;
347 	dfs_rx_ops->dfs_set_current_channel = tgt_dfs_set_current_channel;
348 	dfs_rx_ops->dfs_process_radar_ind = tgt_dfs_process_radar_ind;
349 	dfs_rx_ops->dfs_dfs_cac_complete_ind = tgt_dfs_cac_complete;
350 	dfs_rx_ops->dfs_stop = tgt_dfs_stop;
351 	dfs_rx_ops->dfs_process_phyerr_filter_offload =
352 		tgt_dfs_process_phyerr_filter_offload;
353 	dfs_rx_ops->dfs_is_phyerr_filter_offload =
354 		tgt_dfs_is_phyerr_filter_offload;
355 	dfs_rx_ops->dfs_action_on_status = tgt_dfs_action_on_status_from_fw;
356 	dfs_rx_ops->dfs_override_status_timeout =
357 		ucfg_dfs_set_override_status_timeout;
358 	dfs_rx_ops->dfs_get_override_status_timeout =
359 		ucfg_dfs_get_override_status_timeout;
360 	dfs_rx_ops->dfs_reset_spoof_test =
361 		tgt_dfs_reset_spoof_test;
362 
363 	register_precac_auto_chan_rx_ops(dfs_rx_ops);
364 
365 	return QDF_STATUS_SUCCESS;
366 }
367 #else
368 static QDF_STATUS
369 wlan_lmac_if_umac_dfs_rx_ops_register(struct wlan_lmac_if_rx_ops *rx_ops)
370 {
371 	return QDF_STATUS_SUCCESS;
372 }
373 #endif
374 
375 #ifdef CONVERGED_TDLS_ENABLE
376 static QDF_STATUS
377 wlan_lmac_if_umac_tdls_rx_ops_register(struct wlan_lmac_if_rx_ops *rx_ops)
378 {
379 	rx_ops->tdls_rx_ops.tdls_ev_handler = tgt_tdls_event_handler;
380 
381 	return QDF_STATUS_SUCCESS;
382 }
383 #else
384 static QDF_STATUS
385 wlan_lmac_if_umac_tdls_rx_ops_register(struct wlan_lmac_if_rx_ops *rx_ops)
386 {
387 	return QDF_STATUS_SUCCESS;
388 }
389 #endif
390 
391 #ifdef WLAN_SUPPORT_GREEN_AP
392 static QDF_STATUS
393 wlan_lmac_if_umac_green_ap_rx_ops_register(struct wlan_lmac_if_rx_ops *rx_ops)
394 {
395 	rx_ops->green_ap_rx_ops.is_ps_enabled = wlan_green_ap_is_ps_enabled;
396 	rx_ops->green_ap_rx_ops.is_dbg_print_enabled =
397 					ucfg_green_ap_get_debug_prints;
398 	rx_ops->green_ap_rx_ops.ps_set = ucfg_green_ap_set_ps_config;
399 	rx_ops->green_ap_rx_ops.ps_get = ucfg_green_ap_get_ps_config;
400 	rx_ops->green_ap_rx_ops.suspend_handle = wlan_green_ap_suspend_handle;
401 
402 	return QDF_STATUS_SUCCESS;
403 }
404 #else
405 static QDF_STATUS
406 wlan_lmac_if_umac_green_ap_rx_ops_register(struct wlan_lmac_if_rx_ops *rx_ops)
407 {
408 	return QDF_STATUS_SUCCESS;
409 }
410 #endif
411 
412 static QDF_STATUS
413 wlan_lmac_if_umac_ftm_rx_ops_register(struct wlan_lmac_if_rx_ops *rx_ops)
414 {
415 	struct wlan_lmac_if_ftm_rx_ops *ftm_rx_ops;
416 
417 	ftm_rx_ops = &rx_ops->ftm_rx_ops;
418 
419 	ftm_rx_ops->ftm_ev_handler = wlan_ftm_process_utf_event;
420 
421 	return QDF_STATUS_SUCCESS;
422 }
423 
424 /**
425  * wlan_lmac_if_umac_rx_ops_register() - UMAC rx handler register
426  * @rx_ops: Pointer to rx_ops structure to be populated
427  *
428  * Register umac RX callabacks which will be called by DA/OL/WMA/WMI
429  *
430  * Return: QDF_STATUS_SUCCESS - in case of success
431  */
432 QDF_STATUS
433 wlan_lmac_if_umac_rx_ops_register(struct wlan_lmac_if_rx_ops *rx_ops)
434 {
435 	/* Component specific public api's to be called to register
436 	 * respective callbacks
437 	 * Ex: rx_ops->fp = function;
438 	 */
439 	struct wlan_lmac_if_mgmt_txrx_rx_ops *mgmt_txrx_rx_ops;
440 
441 	if (!rx_ops) {
442 		qdf_print("%s: lmac if rx ops pointer is NULL", __func__);
443 		return QDF_STATUS_E_INVAL;
444 	}
445 
446 	/* mgmt txrx rx ops */
447 	mgmt_txrx_rx_ops = &rx_ops->mgmt_txrx_rx_ops;
448 
449 	mgmt_txrx_rx_ops->mgmt_tx_completion_handler =
450 			tgt_mgmt_txrx_tx_completion_handler;
451 	mgmt_txrx_rx_ops->mgmt_rx_frame_handler =
452 			tgt_mgmt_txrx_rx_frame_handler;
453 	mgmt_txrx_rx_ops->mgmt_txrx_get_nbuf_from_desc_id =
454 			tgt_mgmt_txrx_get_nbuf_from_desc_id;
455 	mgmt_txrx_rx_ops->mgmt_txrx_get_peer_from_desc_id =
456 			tgt_mgmt_txrx_get_peer_from_desc_id;
457 	mgmt_txrx_rx_ops->mgmt_txrx_get_vdev_id_from_desc_id =
458 			tgt_mgmt_txrx_get_vdev_id_from_desc_id;
459 	mgmt_txrx_rx_ops->mgmt_txrx_get_free_desc_pool_count =
460 			tgt_mgmt_txrx_get_free_desc_pool_count;
461 
462 	/* scan rx ops */
463 	rx_ops->scan.scan_ev_handler = tgt_scan_event_handler;
464 	rx_ops->scan.scan_set_max_active_scans = tgt_scan_set_max_active_scans;
465 
466 	wlan_lmac_if_atf_rx_ops_register(rx_ops);
467 
468 	wlan_lmac_if_cp_stats_rx_ops_register(rx_ops);
469 
470 	wlan_lmac_if_sa_api_rx_ops_register(rx_ops);
471 
472 	wlan_lmac_if_crypto_rx_ops_register(rx_ops);
473 	/* wifi_pos rx ops */
474 	wlan_lmac_if_umac_rx_ops_register_wifi_pos(rx_ops);
475 
476 	/* tdls rx ops */
477 	wlan_lmac_if_umac_tdls_rx_ops_register(rx_ops);
478 
479 	wlan_lmac_if_register_nan_rx_ops(rx_ops);
480 
481 	wlan_lmac_if_umac_reg_rx_ops_register(rx_ops);
482 
483 	/* p2p rx ops */
484 	wlan_lmac_if_umac_rx_ops_register_p2p(rx_ops);
485 
486 	/* DFS rx_ops */
487 	wlan_lmac_if_umac_dfs_rx_ops_register(rx_ops);
488 
489 	wlan_lmac_if_umac_green_ap_rx_ops_register(rx_ops);
490 
491 	/* FTM rx_ops */
492 	wlan_lmac_if_umac_ftm_rx_ops_register(rx_ops);
493 
494 	/* FILS Discovery */
495 	wlan_lmac_if_fd_rx_ops_register(rx_ops);
496 
497 	return QDF_STATUS_SUCCESS;
498 }
499 
500 /**
501  * wlan_lmac_if_set_umac_txops_registration_cb() - tx registration
502  * callback assignment
503  * @dev_type: Dev type can be either Direct attach or Offload
504  * @handler: handler to be called for LMAC tx ops registration
505  *
506  * API to assign appropriate tx registration callback handler based on the
507  * device type(Offload or Direct attach)
508  *
509  * Return: QDF_STATUS_SUCCESS - in case of success
510  */
511 QDF_STATUS wlan_lmac_if_set_umac_txops_registration_cb(QDF_STATUS (*handler)
512 				(struct wlan_lmac_if_tx_ops *))
513 {
514 	wlan_lmac_if_umac_tx_ops_register = handler;
515 	return QDF_STATUS_SUCCESS;
516 }
517 qdf_export_symbol(wlan_lmac_if_set_umac_txops_registration_cb);
518 
519