xref: /wlan-dirver/qca-wifi-host-cmn/umac/dfs/dispatcher/src/wlan_dfs_mlme_api.c (revision bea437e2293c3d4fb1b5704fcf633aedac996962)
1 /*
2  * Copyright (c) 2016-2020 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 /**
21  * DOC: Functions to call mlme functions from DFS component.
22  */
23 
24 #include "wlan_dfs_mlme_api.h"
25 #include "wlan_objmgr_vdev_obj.h"
26 #include "wlan_objmgr_pdev_obj.h"
27 #include "../../core/src/dfs.h"
28 #include "scheduler_api.h"
29 #include <wlan_reg_ucfg_api.h>
30 #ifdef QCA_MCL_DFS_SUPPORT
31 #include "wni_api.h"
32 #endif
33 
34 void dfs_mlme_start_rcsa(struct wlan_objmgr_pdev *pdev,
35 		bool *wait_for_csa)
36 {
37 	if (global_dfs_to_mlme.dfs_start_rcsa)
38 		global_dfs_to_mlme.dfs_start_rcsa(pdev, wait_for_csa);
39 }
40 
41 #ifndef QCA_MCL_DFS_SUPPORT
42 #ifdef CONFIG_CHAN_NUM_API
43 void dfs_mlme_mark_dfs(struct wlan_objmgr_pdev *pdev,
44 		uint8_t ieee,
45 		uint16_t freq,
46 		uint8_t vhtop_ch_freq_seg2,
47 		uint64_t flags)
48 {
49 	if (global_dfs_to_mlme.mlme_mark_dfs)
50 		global_dfs_to_mlme.mlme_mark_dfs(pdev,
51 				ieee,
52 				freq,
53 				vhtop_ch_freq_seg2,
54 				flags);
55 }
56 #endif
57 #ifdef CONFIG_CHAN_FREQ_API
58 void dfs_mlme_mark_dfs_for_freq(struct wlan_objmgr_pdev *pdev,
59 				uint8_t ieee,
60 				uint16_t freq,
61 				uint16_t vhtop_ch_freq_seg2,
62 				uint64_t flags)
63 {
64 	if (global_dfs_to_mlme.mlme_mark_dfs_for_freq)
65 	global_dfs_to_mlme.mlme_mark_dfs_for_freq(pdev,
66 						  ieee,
67 						  freq,
68 						  vhtop_ch_freq_seg2,
69 						  flags);
70 }
71 #endif
72 #else /* Else of ndef MCL_DFS_SUPPORT */
73 #ifdef CONFIG_CHAN_NUM_API
74 static void dfs_send_radar_ind(struct wlan_objmgr_pdev *pdev,
75 		void *object,
76 		void *arg)
77 {
78 	struct scheduler_msg sme_msg = {0};
79 	uint8_t vdev_id = wlan_vdev_get_id((struct wlan_objmgr_vdev *)object);
80 
81 	sme_msg.type = eWNI_SME_DFS_RADAR_FOUND;
82 	sme_msg.bodyptr = NULL;
83 	sme_msg.bodyval = vdev_id;
84 	scheduler_post_message(QDF_MODULE_ID_DFS,
85 			       QDF_MODULE_ID_SME,
86 			       QDF_MODULE_ID_SME, &sme_msg);
87 	dfs_info(NULL, WLAN_DEBUG_DFS_ALWAYS, "eWNI_SME_DFS_RADAR_FOUND pdev%d posted",
88 		    vdev_id);
89 }
90 #endif
91 
92 /* dfs_send_radar_ind_for_freq() - Send radar found indication.
93  * @pdev: Pointer to wlan_objmgr_pdev.
94  * @object: Pointer to wlan_objmgr_vdev.
95  * @arg : void pointer to args.
96  */
97 #ifdef CONFIG_CHAN_FREQ_API
98 static void dfs_send_radar_ind_for_freq(struct wlan_objmgr_pdev *pdev,
99 					void *object,
100 					void *arg)
101 {
102 	struct scheduler_msg sme_msg = {0};
103 	uint8_t vdev_id = wlan_vdev_get_id((struct wlan_objmgr_vdev *)object);
104 
105 	sme_msg.type = eWNI_SME_DFS_RADAR_FOUND;
106 	sme_msg.bodyptr = NULL;
107 	sme_msg.bodyval = vdev_id;
108 	scheduler_post_message(QDF_MODULE_ID_DFS,
109 			       QDF_MODULE_ID_SME,
110 			       QDF_MODULE_ID_SME, &sme_msg);
111 	dfs_info(NULL, WLAN_DEBUG_DFS_ALWAYS, "eWNI_SME_DFS_RADAR_FOUND pdev%d posted",
112 		 vdev_id);
113 }
114 #endif
115 
116 #ifdef CONFIG_CHAN_NUM_API
117 void dfs_mlme_mark_dfs(struct wlan_objmgr_pdev *pdev,
118 		uint8_t ieee,
119 		uint16_t freq,
120 		uint8_t vhtop_ch_freq_seg2,
121 		uint64_t flags)
122 {
123 	struct wlan_objmgr_vdev *vdev;
124 
125 	if (!pdev) {
126 		dfs_err(NULL, WLAN_DEBUG_DFS_ALWAYS,  "null pdev");
127 		return;
128 	}
129 
130 	vdev = wlan_pdev_peek_active_first_vdev(pdev, WLAN_DFS_ID);
131 
132 	if (vdev) {
133 		dfs_send_radar_ind(pdev, vdev, NULL);
134 		wlan_objmgr_vdev_release_ref(vdev, WLAN_DFS_ID);
135 	}
136 }
137 #endif
138 
139 #ifdef CONFIG_CHAN_FREQ_API
140 void dfs_mlme_mark_dfs_for_freq(struct wlan_objmgr_pdev *pdev,
141 				uint8_t ieee,
142 				uint16_t freq,
143 				uint16_t vhtop_ch_freq_seg2,
144 				uint64_t flags)
145 {
146 	struct wlan_objmgr_vdev *vdev;
147 
148 	if (!pdev) {
149 		dfs_err(NULL, WLAN_DEBUG_DFS_ALWAYS,  "null pdev");
150 		return;
151 	}
152 
153 	vdev = wlan_pdev_peek_active_first_vdev(pdev, WLAN_DFS_ID);
154 
155 	if (vdev) {
156 		dfs_send_radar_ind_for_freq(pdev, vdev, NULL);
157 		wlan_objmgr_vdev_release_ref(vdev, WLAN_DFS_ID);
158 	}
159 }
160 #endif
161 #endif
162 
163 #ifndef QCA_MCL_DFS_SUPPORT
164 #ifdef CONFIG_CHAN_NUM_API
165 void dfs_mlme_start_csa(struct wlan_objmgr_pdev *pdev,
166 		uint8_t ieee_chan, uint16_t freq,
167 		uint8_t cfreq2, uint64_t flags)
168 {
169 	if (global_dfs_to_mlme.mlme_start_csa)
170 		global_dfs_to_mlme.mlme_start_csa(pdev, ieee_chan, freq, cfreq2,
171 				flags);
172 }
173 #endif
174 #ifdef CONFIG_CHAN_FREQ_API
175 void dfs_mlme_start_csa_for_freq(struct wlan_objmgr_pdev *pdev,
176 				 uint8_t ieee_chan, uint16_t freq,
177 				 uint16_t cfreq2, uint64_t flags)
178 {
179 	if (global_dfs_to_mlme.mlme_start_csa_for_freq)
180 		global_dfs_to_mlme.mlme_start_csa_for_freq(pdev, ieee_chan,
181 							   freq, cfreq2, flags);
182 }
183 #endif
184 #else
185 #ifdef CONFIG_CHAN_NUM_API
186 void dfs_mlme_start_csa(struct wlan_objmgr_pdev *pdev,
187 			uint8_t ieee_chan, uint16_t freq,
188 			uint8_t cfreq2, uint64_t flags)
189 {
190 	struct wlan_objmgr_vdev *vdev;
191 
192 	if (!pdev) {
193 		dfs_err(NULL, WLAN_DEBUG_DFS_ALWAYS,  "null pdev");
194 		return;
195 	}
196 
197 	vdev = wlan_pdev_peek_active_first_vdev(pdev, WLAN_DFS_ID);
198 
199 	if (vdev) {
200 		dfs_send_radar_ind(pdev, vdev, NULL);
201 		wlan_objmgr_vdev_release_ref(vdev, WLAN_DFS_ID);
202 	}
203 }
204 #endif
205 #ifdef CONFIG_CHAN_FREQ_API
206 void dfs_mlme_start_csa_for_freq(struct wlan_objmgr_pdev *pdev,
207 				 uint8_t ieee_chan, uint16_t freq,
208 				 uint16_t cfreq2, uint64_t flags)
209 {
210 	struct wlan_objmgr_vdev *vdev;
211 
212 	if (!pdev) {
213 		dfs_err(NULL, WLAN_DEBUG_DFS_ALWAYS,  "null pdev");
214 		return;
215 	}
216 
217 	vdev = wlan_pdev_peek_active_first_vdev(pdev, WLAN_DFS_ID);
218 
219 	if (vdev) {
220 		dfs_send_radar_ind(pdev, vdev, NULL);
221 		wlan_objmgr_vdev_release_ref(vdev, WLAN_DFS_ID);
222 	}
223 }
224 #endif
225 #endif
226 
227 #ifndef QCA_MCL_DFS_SUPPORT
228 void dfs_mlme_proc_cac(struct wlan_objmgr_pdev *pdev, uint32_t vdev_id)
229 {
230 	if (global_dfs_to_mlme.mlme_proc_cac)
231 		global_dfs_to_mlme.mlme_proc_cac(pdev);
232 }
233 #else
234 void dfs_mlme_proc_cac(struct wlan_objmgr_pdev *pdev, uint32_t vdev_id)
235 {
236 	struct scheduler_msg sme_msg = {0};
237 
238 	sme_msg.type = eWNI_SME_DFS_CAC_COMPLETE;
239 	sme_msg.bodyptr = NULL;
240 	sme_msg.bodyval = vdev_id;
241 	scheduler_post_message(QDF_MODULE_ID_DFS,
242 			       QDF_MODULE_ID_SME,
243 			       QDF_MODULE_ID_SME, &sme_msg);
244 	dfs_info(NULL, WLAN_DEBUG_DFS_ALWAYS, "eWNI_SME_DFS_CAC_COMPLETE vdev%d posted",
245 		    vdev_id);
246 }
247 #endif
248 
249 void dfs_mlme_deliver_event_up_after_cac(struct wlan_objmgr_pdev *pdev)
250 {
251 	if (global_dfs_to_mlme.mlme_deliver_event_up_after_cac)
252 		global_dfs_to_mlme.mlme_deliver_event_up_after_cac(
253 				pdev);
254 }
255 
256 void dfs_mlme_get_dfs_ch_nchans(struct wlan_objmgr_pdev *pdev,
257 		int *nchans)
258 {
259 	if (global_dfs_to_mlme.mlme_get_dfs_ch_nchans)
260 		global_dfs_to_mlme.mlme_get_dfs_ch_nchans(pdev,
261 				nchans);
262 }
263 
264 #ifdef CONFIG_CHAN_NUM_API
265 QDF_STATUS dfs_mlme_get_extchan(struct wlan_objmgr_pdev *pdev,
266 		uint16_t *dfs_ch_freq,
267 		uint64_t *dfs_ch_flags,
268 		uint16_t *dfs_ch_flagext,
269 		uint8_t *dfs_ch_ieee,
270 		uint8_t *dfs_ch_vhtop_ch_freq_seg1,
271 		uint8_t *dfs_ch_vhtop_ch_freq_seg2)
272 {
273 	if (global_dfs_to_mlme.mlme_get_extchan)
274 		return global_dfs_to_mlme.mlme_get_extchan(pdev,
275 				dfs_ch_freq,
276 				dfs_ch_flags,
277 				dfs_ch_flagext,
278 				dfs_ch_ieee,
279 				dfs_ch_vhtop_ch_freq_seg1,
280 				dfs_ch_vhtop_ch_freq_seg2);
281 
282 	return QDF_STATUS_E_FAILURE;
283 }
284 #endif
285 
286 #ifdef CONFIG_CHAN_FREQ_API
287 QDF_STATUS dfs_mlme_get_extchan_for_freq(struct wlan_objmgr_pdev *pdev,
288 					 uint16_t *dfs_chan_freq,
289 					 uint64_t *dfs_chan_flags,
290 					 uint16_t *dfs_chan_flagext,
291 					 uint8_t *dfs_chan_ieee,
292 					 uint8_t *dfs_chan_vhtop_ch_freq_seg1,
293 					 uint8_t *dfs_chan_vhtop_ch_freq_seg2,
294 					 uint16_t *dfs_chan_mhz_freq_seg1,
295 					 uint16_t *dfs_chan_mhz_freq_seg2)
296 {
297 	if (global_dfs_to_mlme.mlme_get_extchan_for_freq)
298 		return global_dfs_to_mlme.mlme_get_extchan_for_freq(pdev,
299 				dfs_chan_freq,
300 				dfs_chan_flags,
301 				dfs_chan_flagext,
302 				dfs_chan_ieee,
303 				dfs_chan_vhtop_ch_freq_seg1,
304 				dfs_chan_vhtop_ch_freq_seg2,
305 				dfs_chan_mhz_freq_seg1,
306 				dfs_chan_mhz_freq_seg2);
307 
308 	return QDF_STATUS_E_FAILURE;
309 }
310 #endif
311 
312 void dfs_mlme_set_no_chans_available(struct wlan_objmgr_pdev *pdev,
313 		int val)
314 {
315 	if (global_dfs_to_mlme.mlme_set_no_chans_available)
316 		global_dfs_to_mlme.mlme_set_no_chans_available(
317 				pdev,
318 				val);
319 }
320 
321 int dfs_mlme_ieee2mhz(struct wlan_objmgr_pdev *pdev, int ieee, uint64_t flag)
322 {
323 	int freq = 0;
324 
325 	if (global_dfs_to_mlme.mlme_ieee2mhz)
326 		global_dfs_to_mlme.mlme_ieee2mhz(pdev,
327 				ieee,
328 				flag,
329 				&freq);
330 
331 	return freq;
332 }
333 
334 #ifdef CONFIG_CHAN_NUM_API
335 QDF_STATUS
336 dfs_mlme_find_dot11_channel(struct wlan_objmgr_pdev *pdev,
337 			    uint8_t ieee,
338 			    uint8_t des_cfreq2,
339 			    int mode,
340 			    uint16_t *dfs_ch_freq,
341 			    uint64_t *dfs_ch_flags,
342 			    uint16_t *dfs_ch_flagext,
343 			    uint8_t *dfs_ch_ieee,
344 			    uint8_t *dfs_ch_vhtop_ch_freq_seg1,
345 			    uint8_t *dfs_ch_vhtop_ch_freq_seg2)
346 {
347 	if (global_dfs_to_mlme.mlme_find_dot11_channel)
348 		return global_dfs_to_mlme.mlme_find_dot11_channel(pdev,
349 								  ieee,
350 								  des_cfreq2,
351 								  mode,
352 								  dfs_ch_freq,
353 								  dfs_ch_flags,
354 								  dfs_ch_flagext,
355 								  dfs_ch_ieee,
356 								  dfs_ch_vhtop_ch_freq_seg1,
357 								  dfs_ch_vhtop_ch_freq_seg2);
358 	return QDF_STATUS_E_FAILURE;
359 }
360 #endif
361 
362 #ifdef CONFIG_CHAN_FREQ_API
363 QDF_STATUS
364 dfs_mlme_find_dot11_chan_for_freq(struct wlan_objmgr_pdev *pdev,
365 				  uint16_t freq,
366 				  uint16_t des_cfreq2,
367 				  int mode,
368 				  uint16_t *dfs_chan_freq,
369 				  uint64_t *dfs_chan_flag,
370 				  uint16_t *dfs_flagext,
371 				  uint8_t *dfs_chan_ieee,
372 				  uint8_t *dfs_cfreq1,
373 				  uint8_t *dfs_cfreq2,
374 				  uint16_t *cfreq1_mhz,
375 				  uint16_t *cfreq2_mhz)
376 {
377 	if (global_dfs_to_mlme.mlme_find_dot11_chan_for_freq)
378 	return global_dfs_to_mlme.mlme_find_dot11_chan_for_freq(pdev,
379 								freq,
380 								des_cfreq2,
381 								mode,
382 								dfs_chan_freq,
383 								dfs_chan_flag,
384 								dfs_flagext,
385 								dfs_chan_ieee,
386 								dfs_cfreq1,
387 								dfs_cfreq2,
388 								cfreq1_mhz,
389 								cfreq2_mhz);
390 	return QDF_STATUS_E_FAILURE;
391 }
392 #endif
393 
394 #ifdef CONFIG_CHAN_NUM_API
395 void dfs_mlme_get_dfs_ch_channels(struct wlan_objmgr_pdev *pdev,
396 		uint16_t *dfs_ch_freq,
397 		uint64_t *dfs_ch_flags,
398 		uint16_t *dfs_ch_flagext,
399 		uint8_t *dfs_ch_ieee,
400 		uint8_t *dfs_ch_vhtop_ch_freq_seg1,
401 		uint8_t *dfs_ch_vhtop_ch_freq_seg2,
402 		int index)
403 {
404 	if (global_dfs_to_mlme.mlme_get_dfs_ch_channels)
405 		global_dfs_to_mlme.mlme_get_dfs_ch_channels(pdev,
406 				dfs_ch_freq,
407 				dfs_ch_flags,
408 				dfs_ch_flagext,
409 				dfs_ch_ieee,
410 				dfs_ch_vhtop_ch_freq_seg1,
411 				dfs_ch_vhtop_ch_freq_seg2,
412 				index);
413 }
414 #endif
415 
416 #ifdef CONFIG_CHAN_FREQ_API
417 void dfs_mlme_get_dfs_channels_for_freq(struct wlan_objmgr_pdev *pdev,
418 					uint16_t *dfs_chan_freq,
419 					uint64_t *dfs_chan_flags,
420 					uint16_t *dfs_chan_flagext,
421 					uint8_t *dfs_chan_ieee,
422 					uint8_t *dfs_chan_vhtop_freq_seg1,
423 					uint8_t *dfs_chan_vhtop_freq_seg2,
424 					uint16_t *dfs_ch_mhz_freq_seg1,
425 					uint16_t *dfs_ch_mhz_freq_seg2,
426 					int index)
427 {
428 	if (global_dfs_to_mlme.mlme_get_dfs_channels_for_freq)
429 		global_dfs_to_mlme.mlme_get_dfs_channels_for_freq(pdev,
430 				dfs_chan_freq,
431 				dfs_chan_flags,
432 				dfs_chan_flagext,
433 				dfs_chan_ieee,
434 				dfs_chan_vhtop_freq_seg1,
435 				dfs_chan_vhtop_freq_seg2,
436 				dfs_ch_mhz_freq_seg1,
437 				dfs_ch_mhz_freq_seg2,
438 				index);
439 }
440 #endif
441 
442 uint32_t dfs_mlme_dfs_ch_flags_ext(struct wlan_objmgr_pdev *pdev)
443 {
444 	uint16_t flag_ext = 0;
445 
446 	if (global_dfs_to_mlme.mlme_dfs_ch_flags_ext)
447 		global_dfs_to_mlme.mlme_dfs_ch_flags_ext(pdev,
448 				&flag_ext);
449 
450 	return flag_ext;
451 }
452 
453 void dfs_mlme_channel_change_by_precac(struct wlan_objmgr_pdev *pdev)
454 {
455 	if (global_dfs_to_mlme.mlme_channel_change_by_precac)
456 		global_dfs_to_mlme.mlme_channel_change_by_precac(
457 				pdev);
458 }
459 
460 void dfs_mlme_nol_timeout_notification(struct wlan_objmgr_pdev *pdev)
461 {
462 	if (global_dfs_to_mlme.mlme_nol_timeout_notification)
463 		global_dfs_to_mlme.mlme_nol_timeout_notification(
464 				pdev);
465 }
466 
467 void dfs_mlme_clist_update(struct wlan_objmgr_pdev *pdev,
468 		void *nollist,
469 		int nentries)
470 {
471 	if (global_dfs_to_mlme.mlme_clist_update)
472 		global_dfs_to_mlme.mlme_clist_update(pdev,
473 				nollist,
474 				nentries);
475 }
476 
477 #ifdef CONFIG_CHAN_NUM_API
478 int dfs_mlme_get_cac_timeout(struct wlan_objmgr_pdev *pdev,
479 		uint16_t dfs_ch_freq,
480 		uint8_t dfs_ch_vhtop_ch_freq_seg2,
481 		uint64_t dfs_ch_flags)
482 {
483 	int cac_timeout = 0;
484 
485 	if (global_dfs_to_mlme.mlme_get_cac_timeout)
486 		global_dfs_to_mlme.mlme_get_cac_timeout(pdev,
487 				dfs_ch_freq,
488 				dfs_ch_vhtop_ch_freq_seg2,
489 				dfs_ch_flags,
490 				&cac_timeout);
491 
492 	return cac_timeout;
493 }
494 #endif
495 
496 #ifdef CONFIG_CHAN_FREQ_API
497 int dfs_mlme_get_cac_timeout_for_freq(struct wlan_objmgr_pdev *pdev,
498 				      uint16_t dfs_chan_freq,
499 				      uint16_t dfs_cfreq2,
500 				      uint64_t dfs_ch_flags)
501 {
502 	int cac_timeout = 0;
503 
504 	if (global_dfs_to_mlme.mlme_get_cac_timeout_for_freq)
505 		global_dfs_to_mlme.mlme_get_cac_timeout_for_freq(pdev,
506 								 dfs_chan_freq,
507 								 dfs_cfreq2,
508 								 dfs_ch_flags,
509 								 &cac_timeout);
510 
511 	return cac_timeout;
512 }
513 #endif
514 
515 #if defined(WLAN_DFS_PARTIAL_OFFLOAD) && defined(HOST_DFS_SPOOF_TEST)
516 int dfs_mlme_rebuild_chan_list_with_non_dfs_channels(
517 		struct wlan_objmgr_pdev *pdev)
518 {
519 	if (!global_dfs_to_mlme.mlme_rebuild_chan_list_with_non_dfs_channels)
520 		return 1;
521 
522 	return global_dfs_to_mlme.mlme_rebuild_chan_list_with_non_dfs_channels(
523 			pdev);
524 }
525 
526 void dfs_mlme_restart_vaps_with_non_dfs_chan(struct wlan_objmgr_pdev *pdev,
527 					     int no_chans_avail)
528 {
529 	if (!global_dfs_to_mlme.mlme_restart_vaps_with_non_dfs_chan)
530 		return;
531 
532 	global_dfs_to_mlme.mlme_restart_vaps_with_non_dfs_chan(pdev,
533 							       no_chans_avail);
534 }
535 #endif
536 
537 #if defined(WLAN_SUPPORT_PRIMARY_ALLOWED_CHAN)
538 bool dfs_mlme_check_allowed_prim_chanlist(struct wlan_objmgr_pdev *pdev,
539 					  uint32_t chan_freq)
540 {
541 	if (!global_dfs_to_mlme.mlme_check_allowed_prim_chanlist)
542 		return true;
543 
544 	return global_dfs_to_mlme.mlme_check_allowed_prim_chanlist(pdev,
545 								   chan_freq);
546 }
547 
548 #endif
549 
550 #if defined(WLAN_DFS_FULL_OFFLOAD) && defined(QCA_DFS_NOL_OFFLOAD)
551 void dfs_mlme_handle_dfs_scan_violation(struct wlan_objmgr_pdev *pdev)
552 {
553 	bool dfs_enable = 0;
554 
555 	/*Disable all DFS channels in master channel list and ic channel list */
556 	ucfg_reg_enable_dfs_channels(pdev, dfs_enable);
557 
558 	/* send the updated channel list to FW */
559 	global_dfs_to_mlme.mlme_update_scan_channel_list(pdev);
560 }
561 #endif
562 
563 bool dfs_mlme_is_opmode_sta(struct wlan_objmgr_pdev *pdev)
564 {
565 	if (!global_dfs_to_mlme.mlme_is_opmode_sta)
566 		return false;
567 
568 	return global_dfs_to_mlme.mlme_is_opmode_sta(pdev);
569 }
570 
571 void dfs_mlme_acquire_radar_mode_switch_lock(struct wlan_objmgr_pdev *pdev)
572 {
573 	if (!global_dfs_to_mlme.mlme_acquire_radar_mode_switch_lock)
574 		return;
575 
576 	global_dfs_to_mlme.mlme_acquire_radar_mode_switch_lock(pdev);
577 }
578 
579 void dfs_mlme_release_radar_mode_switch_lock(struct wlan_objmgr_pdev *pdev)
580 {
581 	if (!global_dfs_to_mlme.mlme_release_radar_mode_switch_lock)
582 		return;
583 
584 	global_dfs_to_mlme.mlme_release_radar_mode_switch_lock(pdev);
585 }
586