xref: /wlan-dirver/qca-wifi-host-cmn/umac/dfs/dispatcher/src/wlan_dfs_utils_api.c (revision 503663c6daafffe652fa360bde17243568cd6d2a)
1 /*
2  * Copyright (c) 2016-2019 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: This file has the DFS dispatcher API implementation which is exposed
22  * to outside of DFS component.
23  */
24 #include <wlan_objmgr_vdev_obj.h>
25 #include "wlan_dfs_utils_api.h"
26 #include "wlan_dfs_init_deinit_api.h"
27 #include "wlan_dfs_mlme_api.h"
28 #include "../../core/src/dfs.h"
29 #include "../../core/src/dfs_zero_cac.h"
30 #include <wlan_reg_services_api.h>
31 #include "../../core/src/dfs_random_chan_sel.h"
32 #ifdef QCA_DFS_USE_POLICY_MANAGER
33 #include "wlan_policy_mgr_api.h"
34 #endif
35 #ifdef QCA_DFS_NOL_PLATFORM_DRV_SUPPORT
36 #include <pld_common.h>
37 #endif
38 #include <qdf_module.h>
39 
40 struct dfs_nol_info {
41 	uint16_t num_chans;
42 	struct dfsreq_nolelem dfs_nol[DFS_MAX_NOL_CHANNEL];
43 };
44 
45 QDF_STATUS utils_dfs_reset(struct wlan_objmgr_pdev *pdev)
46 {
47 	struct wlan_dfs *dfs;
48 
49 	dfs = wlan_pdev_get_dfs_obj(pdev);
50 	if (!dfs)
51 		return  QDF_STATUS_E_FAILURE;
52 
53 	dfs_reset(dfs);
54 	dfs_nol_update(dfs);
55 	dfs_reset_precaclists(dfs);
56 
57 	return QDF_STATUS_SUCCESS;
58 }
59 
60 bool utils_dfs_is_freq_in_nol(struct wlan_objmgr_pdev *pdev, uint32_t freq)
61 {
62 	struct wlan_dfs *dfs;
63 
64 	dfs = wlan_pdev_get_dfs_obj(pdev);
65 	if (!dfs)
66 		return false;
67 
68 	return dfs_is_freq_in_nol(dfs, freq);
69 }
70 
71 #ifdef CONFIG_CHAN_NUM_API
72 QDF_STATUS utils_dfs_cac_valid_reset(struct wlan_objmgr_pdev *pdev,
73 		uint8_t prevchan_ieee,
74 		uint32_t prevchan_flags)
75 {
76 	struct wlan_dfs *dfs;
77 
78 	dfs = wlan_pdev_get_dfs_obj(pdev);
79 	if (!dfs)
80 		return  QDF_STATUS_E_FAILURE;
81 
82 	dfs_cac_valid_reset(dfs, prevchan_ieee, prevchan_flags);
83 
84 	return QDF_STATUS_SUCCESS;
85 }
86 qdf_export_symbol(utils_dfs_cac_valid_reset);
87 #endif
88 
89 #ifdef CONFIG_CHAN_FREQ_API
90 QDF_STATUS utils_dfs_cac_valid_reset_for_freq(struct wlan_objmgr_pdev *pdev,
91 					      uint16_t prevchan_freq,
92 					      uint32_t prevchan_flags)
93 {
94 	struct wlan_dfs *dfs;
95 
96 	dfs = wlan_pdev_get_dfs_obj(pdev);
97 	if (!dfs)
98 		return  QDF_STATUS_E_FAILURE;
99 
100 	dfs_cac_valid_reset_for_freq(dfs, prevchan_freq, prevchan_flags);
101 
102 	return QDF_STATUS_SUCCESS;
103 }
104 
105 qdf_export_symbol(utils_dfs_cac_valid_reset_for_freq);
106 #endif
107 
108 QDF_STATUS utils_dfs_reset_precaclists(struct wlan_objmgr_pdev *pdev)
109 {
110 	struct wlan_dfs *dfs;
111 
112 	dfs = wlan_pdev_get_dfs_obj(pdev);
113 	if (!dfs)
114 		return  QDF_STATUS_E_FAILURE;
115 
116 	dfs_reset_precaclists(dfs);
117 
118 	return QDF_STATUS_SUCCESS;
119 }
120 qdf_export_symbol(utils_dfs_reset_precaclists);
121 
122 #ifdef CONFIG_CHAN_NUM_API
123 void utils_dfs_unmark_precac_nol(struct wlan_objmgr_pdev *pdev, uint8_t chan)
124 {
125 	struct wlan_dfs *dfs;
126 
127 	dfs = wlan_pdev_get_dfs_obj(pdev);
128 	if (!dfs)
129 		return;
130 
131 	dfs_unmark_precac_nol(dfs, chan);
132 }
133 
134 qdf_export_symbol(utils_dfs_unmark_precac_nol);
135 #endif
136 
137 #ifdef CONFIG_CHAN_FREQ_API
138 void utils_dfs_unmark_precac_nol_for_freq(struct wlan_objmgr_pdev *pdev,
139 					  uint16_t chan_freq)
140 {
141 	struct wlan_dfs *dfs;
142 
143 	dfs = wlan_pdev_get_dfs_obj(pdev);
144 	if (!dfs)
145 		return;
146 
147 	dfs_unmark_precac_nol_for_freq(dfs, chan_freq);
148 }
149 
150 qdf_export_symbol(utils_dfs_unmark_precac_nol_for_freq);
151 #endif
152 
153 QDF_STATUS utils_dfs_cancel_precac_timer(struct wlan_objmgr_pdev *pdev)
154 {
155 	struct wlan_dfs *dfs;
156 
157 	dfs = wlan_pdev_get_dfs_obj(pdev);
158 	if (!dfs)
159 		return  QDF_STATUS_E_FAILURE;
160 
161 	dfs_cancel_precac_timer(dfs);
162 
163 	return QDF_STATUS_SUCCESS;
164 }
165 qdf_export_symbol(utils_dfs_cancel_precac_timer);
166 
167 #ifdef CONFIG_CHAN_FREQ_API
168 QDF_STATUS utils_dfs_start_precac_timer(struct wlan_objmgr_pdev *pdev)
169 {
170 	struct wlan_dfs *dfs;
171 
172 	dfs = wlan_pdev_get_dfs_obj(pdev);
173 	if (!dfs) {
174 		dfs_err(dfs, WLAN_DEBUG_DFS_ALWAYS, "NULL dfs");
175 		return  QDF_STATUS_E_FAILURE;
176 	}
177 
178 	if (!dfs->dfs_precac_secondary_freq_mhz)
179 		return QDF_STATUS_E_FAILURE;
180 
181 	dfs_start_precac_timer_for_freq(dfs,
182 					dfs->dfs_precac_secondary_freq_mhz);
183 	return QDF_STATUS_SUCCESS;
184 }
185 #else
186 #ifdef CONFIG_CHAN_NUM_API
187 QDF_STATUS utils_dfs_start_precac_timer(struct wlan_objmgr_pdev *pdev)
188 {
189 	struct wlan_dfs *dfs;
190 
191 	dfs = wlan_pdev_get_dfs_obj(pdev);
192 	if (!dfs) {
193 		dfs_err(dfs, WLAN_DEBUG_DFS_ALWAYS, "NULL dfs");
194 		return  QDF_STATUS_E_FAILURE;
195 	}
196 
197 	if (!dfs->dfs_precac_secondary_freq)
198 		return QDF_STATUS_E_FAILURE;
199 	dfs_start_precac_timer(dfs,
200 			       dfs->dfs_precac_secondary_freq);
201 	return QDF_STATUS_SUCCESS;
202 }
203 #endif
204 #endif
205 
206 #ifdef WLAN_DFS_PRECAC_AUTO_CHAN_SUPPORT
207 #ifdef CONFIG_CHAN_NUM_API
208 bool
209 utils_dfs_precac_decide_pref_chan(struct wlan_objmgr_pdev *pdev,
210 				  uint8_t *ch_ieee,
211 				  enum wlan_phymode mode)
212 {
213 	struct wlan_dfs *dfs;
214 
215 	dfs = wlan_pdev_get_dfs_obj(pdev);
216 	if (!dfs) {
217 		dfs_err(dfs, WLAN_DEBUG_DFS_ALWAYS, "NULL dfs");
218 		return false;
219 	}
220 	return dfs_decide_precac_preferred_chan(dfs, ch_ieee, mode);
221 }
222 #endif
223 
224 #ifdef CONFIG_CHAN_FREQ_API
225 bool
226 utils_dfs_precac_decide_pref_chan_for_freq(struct wlan_objmgr_pdev *pdev,
227 					   uint16_t *chan_freq,
228 					   enum wlan_phymode mode)
229 {
230 	struct wlan_dfs *dfs;
231 
232 	dfs = wlan_pdev_get_dfs_obj(pdev);
233 	if (!dfs) {
234 		dfs_err(dfs, WLAN_DEBUG_DFS_ALWAYS, "NULL dfs");
235 		return false;
236 	}
237 	return dfs_decide_precac_preferred_chan_for_freq(dfs, chan_freq, mode);
238 }
239 #endif
240 #endif
241 QDF_STATUS utils_dfs_cancel_cac_timer(struct wlan_objmgr_pdev *pdev)
242 {
243 	struct wlan_dfs *dfs;
244 
245 	dfs = wlan_pdev_get_dfs_obj(pdev);
246 	if (!dfs)
247 		return  QDF_STATUS_E_FAILURE;
248 
249 	dfs_cancel_cac_timer(dfs);
250 
251 	return QDF_STATUS_SUCCESS;
252 }
253 qdf_export_symbol(utils_dfs_cancel_cac_timer);
254 
255 QDF_STATUS utils_dfs_start_cac_timer(struct wlan_objmgr_pdev *pdev)
256 {
257 	struct wlan_dfs *dfs;
258 
259 	dfs = wlan_pdev_get_dfs_obj(pdev);
260 	if (!dfs)
261 		return  QDF_STATUS_E_FAILURE;
262 
263 	dfs_start_cac_timer(dfs);
264 
265 	return QDF_STATUS_SUCCESS;
266 }
267 qdf_export_symbol(utils_dfs_start_cac_timer);
268 
269 QDF_STATUS utils_dfs_cac_stop(struct wlan_objmgr_pdev *pdev)
270 {
271 	struct wlan_dfs *dfs;
272 
273 	dfs = wlan_pdev_get_dfs_obj(pdev);
274 	if (!dfs)
275 		return  QDF_STATUS_E_FAILURE;
276 
277 	dfs_cac_stop(dfs);
278 	return  QDF_STATUS_SUCCESS;
279 }
280 qdf_export_symbol(utils_dfs_cac_stop);
281 
282 /** dfs_fill_chan_info() - Fill the dfs channel structure with wlan
283  * channel.
284  * @chan: Pointer to DFS channel structure.
285  * @wlan_chan: Pointer to WLAN Channel structure.
286  *
287  * Return: void
288  */
289 #ifdef CONFIG_CHAN_FREQ_API
290 static void dfs_fill_chan_info(struct dfs_channel *chan,
291 			       struct wlan_channel *wlan_chan)
292 {
293 	chan->dfs_ch_freq = wlan_chan->ch_freq;
294 	chan->dfs_ch_flags = wlan_chan->ch_flags;
295 	chan->dfs_ch_flagext = wlan_chan->ch_flagext;
296 	chan->dfs_ch_ieee = wlan_chan->ch_ieee;
297 	chan->dfs_ch_vhtop_ch_freq_seg1 = wlan_chan->ch_freq_seg1;
298 	chan->dfs_ch_vhtop_ch_freq_seg2 = wlan_chan->ch_freq_seg2;
299 	chan->dfs_ch_mhz_freq_seg1 = wlan_chan->ch_cfreq1;
300 	chan->dfs_ch_mhz_freq_seg2 = wlan_chan->ch_cfreq2;
301 }
302 #else
303 #ifdef CONFIG_CHAN_NUM_API
304 static void dfs_fill_chan_info(struct dfs_channel *chan,
305 			       struct wlan_channel *wlan_chan)
306 {
307 	chan->dfs_ch_freq = wlan_chan->ch_freq;
308 	chan->dfs_ch_flags = wlan_chan->ch_flags;
309 	chan->dfs_ch_flagext = wlan_chan->ch_flagext;
310 	chan->dfs_ch_ieee = wlan_chan->ch_ieee;
311 	chan->dfs_ch_vhtop_ch_freq_seg1 = wlan_chan->ch_freq_seg1;
312 	chan->dfs_ch_vhtop_ch_freq_seg2 = wlan_chan->ch_freq_seg2;
313 }
314 #endif
315 #endif
316 
317 bool utils_dfs_is_precac_done(struct wlan_objmgr_pdev *pdev,
318 			      struct wlan_channel *wlan_chan)
319 {
320 	struct wlan_dfs *dfs;
321 	struct dfs_channel chan;
322 
323 	dfs = wlan_pdev_get_dfs_obj(pdev);
324 	if (!dfs)
325 		return false;
326 
327 	dfs_fill_chan_info(&chan, wlan_chan);
328 
329 	return dfs_is_precac_done(dfs, &chan);
330 }
331 
332 bool utils_dfs_is_cac_required(struct wlan_objmgr_pdev *pdev,
333 			       struct wlan_channel *cur_chan,
334 			       struct wlan_channel *prev_chan,
335 			       bool *continue_current_cac)
336 {
337 	struct wlan_dfs *dfs;
338 	struct dfs_channel cur_channel;
339 	struct dfs_channel prev_channel;
340 
341 	dfs = wlan_pdev_get_dfs_obj(pdev);
342 	if (!dfs)
343 		return false;
344 
345 	dfs_fill_chan_info(&cur_channel, cur_chan);
346 	dfs_fill_chan_info(&prev_channel, prev_chan);
347 
348 	return dfs_is_cac_required(dfs,
349 				   &cur_channel,
350 				   &prev_channel,
351 				   continue_current_cac);
352 }
353 
354 bool
355 utils_dfs_is_cac_required_on_dfs_curchan(struct wlan_objmgr_pdev *pdev,
356 					 bool *continue_current_cac)
357 {
358 	struct wlan_dfs *dfs;
359 
360 	dfs = wlan_pdev_get_dfs_obj(pdev);
361 	if (!dfs)
362 		return false;
363 
364 	return dfs_is_cac_required(dfs,
365 				   dfs->dfs_curchan,
366 				   dfs->dfs_prevchan,
367 				   continue_current_cac);
368 }
369 
370 QDF_STATUS utils_dfs_stacac_stop(struct wlan_objmgr_pdev *pdev)
371 {
372 	struct wlan_dfs *dfs;
373 
374 	dfs = wlan_pdev_get_dfs_obj(pdev);
375 	if (!dfs)
376 		return  QDF_STATUS_E_FAILURE;
377 
378 	dfs_stacac_stop(dfs);
379 
380 	return QDF_STATUS_SUCCESS;
381 }
382 qdf_export_symbol(utils_dfs_stacac_stop);
383 
384 QDF_STATUS utils_dfs_get_usenol(struct wlan_objmgr_pdev *pdev, uint16_t *usenol)
385 {
386 	struct wlan_dfs *dfs;
387 
388 	dfs = wlan_pdev_get_dfs_obj(pdev);
389 	if (!dfs)
390 		return  QDF_STATUS_E_FAILURE;
391 
392 	*usenol = dfs_get_use_nol(dfs);
393 
394 	return QDF_STATUS_SUCCESS;
395 }
396 qdf_export_symbol(utils_dfs_get_usenol);
397 
398 QDF_STATUS utils_dfs_radar_disable(struct wlan_objmgr_pdev *pdev)
399 {
400 	struct wlan_dfs *dfs;
401 
402 	dfs = wlan_pdev_get_dfs_obj(pdev);
403 	if (!dfs)
404 		return  QDF_STATUS_E_FAILURE;
405 
406 	dfs_radar_disable(dfs);
407 
408 	return QDF_STATUS_SUCCESS;
409 }
410 qdf_export_symbol(utils_dfs_radar_disable);
411 
412 QDF_STATUS utils_dfs_set_update_nol_flag(struct wlan_objmgr_pdev *pdev,
413 		bool val)
414 {
415 	struct wlan_dfs *dfs;
416 
417 	dfs = wlan_pdev_get_dfs_obj(pdev);
418 	if (!dfs)
419 		return  QDF_STATUS_E_FAILURE;
420 
421 	dfs_set_update_nol_flag(dfs, val);
422 
423 	return QDF_STATUS_SUCCESS;
424 }
425 qdf_export_symbol(utils_dfs_set_update_nol_flag);
426 
427 QDF_STATUS utils_dfs_get_update_nol_flag(struct wlan_objmgr_pdev *pdev,
428 		bool *nol_flag)
429 {
430 	struct wlan_dfs *dfs;
431 
432 	dfs = wlan_pdev_get_dfs_obj(pdev);
433 	if (!dfs)
434 		return  QDF_STATUS_E_FAILURE;
435 
436 	*nol_flag = dfs_get_update_nol_flag(dfs);
437 
438 	return QDF_STATUS_SUCCESS;
439 }
440 qdf_export_symbol(utils_dfs_get_update_nol_flag);
441 
442 QDF_STATUS utils_dfs_get_dfs_use_nol(struct wlan_objmgr_pdev *pdev,
443 		int *dfs_use_nol)
444 {
445 	struct wlan_dfs *dfs;
446 
447 	dfs = wlan_pdev_get_dfs_obj(pdev);
448 	if (!dfs)
449 		return  QDF_STATUS_E_FAILURE;
450 
451 	*dfs_use_nol = dfs_get_use_nol(dfs);
452 
453 	return QDF_STATUS_SUCCESS;
454 }
455 qdf_export_symbol(utils_dfs_get_dfs_use_nol);
456 
457 QDF_STATUS utils_dfs_get_nol_timeout(struct wlan_objmgr_pdev *pdev,
458 		int *dfs_nol_timeout)
459 {
460 	struct wlan_dfs *dfs;
461 
462 	dfs = wlan_pdev_get_dfs_obj(pdev);
463 	if (!dfs)
464 		return  QDF_STATUS_E_FAILURE;
465 
466 	*dfs_nol_timeout = dfs_get_nol_timeout(dfs);
467 
468 	return QDF_STATUS_SUCCESS;
469 }
470 qdf_export_symbol(utils_dfs_get_nol_timeout);
471 
472 QDF_STATUS utils_dfs_nol_addchan(struct wlan_objmgr_pdev *pdev,
473 		uint16_t freq,
474 		uint32_t dfs_nol_timeout)
475 {
476 	struct wlan_dfs *dfs;
477 
478 	dfs = wlan_pdev_get_dfs_obj(pdev);
479 	if (!dfs)
480 		return  QDF_STATUS_E_FAILURE;
481 
482 	DFS_NOL_ADD_CHAN_LOCKED(dfs, freq, dfs_nol_timeout);
483 
484 	return QDF_STATUS_SUCCESS;
485 }
486 qdf_export_symbol(utils_dfs_nol_addchan);
487 
488 QDF_STATUS utils_dfs_nol_update(struct wlan_objmgr_pdev *pdev)
489 {
490 	struct wlan_dfs *dfs;
491 
492 	dfs = wlan_pdev_get_dfs_obj(pdev);
493 	if (!dfs)
494 		return  QDF_STATUS_E_FAILURE;
495 
496 	dfs_nol_update(dfs);
497 
498 	return QDF_STATUS_SUCCESS;
499 }
500 qdf_export_symbol(utils_dfs_nol_update);
501 
502 QDF_STATUS utils_dfs_second_segment_radar_disable(struct wlan_objmgr_pdev *pdev)
503 {
504 	struct wlan_dfs *dfs;
505 
506 	dfs = wlan_pdev_get_dfs_obj(pdev);
507 	if (!dfs)
508 		return  QDF_STATUS_E_FAILURE;
509 
510 	dfs_second_segment_radar_disable(dfs);
511 
512 	return QDF_STATUS_SUCCESS;
513 }
514 
515 QDF_STATUS utils_dfs_bw_reduce(struct wlan_objmgr_pdev *pdev, bool bw_reduce)
516 {
517 	struct wlan_dfs *dfs;
518 
519 	dfs = wlan_pdev_get_dfs_obj(pdev);
520 	if (!dfs)
521 		return  QDF_STATUS_E_FAILURE;
522 
523 	dfs->dfs_bw_reduced = bw_reduce;
524 
525 	return QDF_STATUS_SUCCESS;
526 }
527 
528 qdf_export_symbol(utils_dfs_bw_reduce);
529 
530 QDF_STATUS utils_dfs_is_bw_reduce(struct wlan_objmgr_pdev *pdev,
531 				  bool *bw_reduce)
532 {
533 	struct wlan_dfs *dfs;
534 
535 	dfs = wlan_pdev_get_dfs_obj(pdev);
536 	if (!dfs)
537 		return  QDF_STATUS_E_FAILURE;
538 
539 	*bw_reduce = dfs->dfs_bw_reduced;
540 
541 	return QDF_STATUS_SUCCESS;
542 }
543 
544 QDF_STATUS utils_dfs_fetch_nol_ie_info(struct wlan_objmgr_pdev *pdev,
545 				       uint8_t *nol_ie_bandwidth,
546 				       uint16_t *nol_ie_startfreq,
547 				       uint8_t *nol_ie_bitmap)
548 {
549 	struct wlan_dfs *dfs;
550 
551 	dfs = wlan_pdev_get_dfs_obj(pdev);
552 	if (!dfs)
553 		return  QDF_STATUS_E_FAILURE;
554 
555 	dfs_fetch_nol_ie_info(dfs, nol_ie_bandwidth, nol_ie_startfreq,
556 			      nol_ie_bitmap);
557 
558 	return QDF_STATUS_SUCCESS;
559 }
560 
561 QDF_STATUS utils_dfs_set_rcsa_flags(struct wlan_objmgr_pdev *pdev,
562 				    bool is_rcsa_ie_sent,
563 				    bool is_nol_ie_sent)
564 {
565 	struct wlan_dfs *dfs;
566 
567 	dfs = wlan_pdev_get_dfs_obj(pdev);
568 	if (!dfs)
569 		return  QDF_STATUS_E_FAILURE;
570 
571 	dfs_set_rcsa_flags(dfs, is_rcsa_ie_sent, is_nol_ie_sent);
572 
573 	return QDF_STATUS_SUCCESS;
574 }
575 
576 QDF_STATUS utils_dfs_get_rcsa_flags(struct wlan_objmgr_pdev *pdev,
577 				    bool *is_rcsa_ie_sent,
578 				    bool *is_nol_ie_sent)
579 {
580 	struct wlan_dfs *dfs;
581 
582 	dfs = wlan_pdev_get_dfs_obj(pdev);
583 	if (!dfs)
584 		return  QDF_STATUS_E_FAILURE;
585 	dfs_get_rcsa_flags(dfs, is_rcsa_ie_sent, is_nol_ie_sent);
586 
587 	return QDF_STATUS_SUCCESS;
588 }
589 
590 bool utils_dfs_process_nol_ie_bitmap(struct wlan_objmgr_pdev *pdev,
591 				     uint8_t nol_ie_bandwidth,
592 				     uint16_t nol_ie_startfreq,
593 				     uint8_t nol_ie_bitmap)
594 {
595 	struct wlan_dfs *dfs;
596 
597 	dfs = wlan_pdev_get_dfs_obj(pdev);
598 	if (!dfs)
599 		return  false;
600 	return dfs_process_nol_ie_bitmap(dfs, nol_ie_bandwidth,
601 					 nol_ie_startfreq,
602 					 nol_ie_bitmap);
603 }
604 
605 QDF_STATUS utils_dfs_set_cac_timer_running(struct wlan_objmgr_pdev *pdev,
606 		int val)
607 {
608 	struct wlan_dfs *dfs;
609 
610 	dfs = wlan_pdev_get_dfs_obj(pdev);
611 	if (!dfs)
612 		return  QDF_STATUS_E_FAILURE;
613 
614 	dfs->dfs_cac_timer_running = val;
615 
616 	return QDF_STATUS_SUCCESS;
617 }
618 qdf_export_symbol(utils_dfs_set_cac_timer_running);
619 
620 QDF_STATUS utils_dfs_get_nol_chfreq_and_chwidth(struct wlan_objmgr_pdev *pdev,
621 		void *nollist,
622 		uint32_t *nol_chfreq,
623 		uint32_t *nol_chwidth,
624 		int index)
625 {
626 	struct wlan_dfs *dfs;
627 
628 	dfs = wlan_pdev_get_dfs_obj(pdev);
629 	if (!dfs)
630 		return  QDF_STATUS_E_FAILURE;
631 
632 	dfs_get_nol_chfreq_and_chwidth(nollist, nol_chfreq, nol_chwidth, index);
633 
634 	return QDF_STATUS_SUCCESS;
635 }
636 qdf_export_symbol(utils_dfs_get_nol_chfreq_and_chwidth);
637 
638 QDF_STATUS utils_dfs_update_cur_chan_flags(struct wlan_objmgr_pdev *pdev,
639 		uint64_t flags,
640 		uint16_t flagext)
641 {
642 	struct wlan_dfs *dfs;
643 
644 	dfs = wlan_pdev_get_dfs_obj(pdev);
645 	if (!dfs)
646 		return  QDF_STATUS_E_FAILURE;
647 
648 	dfs_update_cur_chan_flags(dfs, flags, flagext);
649 
650 	return QDF_STATUS_SUCCESS;
651 }
652 
653 static void utils_dfs_get_max_phy_mode(struct wlan_objmgr_pdev *pdev,
654 		uint32_t *phy_mode)
655 {
656 	return;
657 }
658 
659 static void utils_dfs_get_max_sup_width(struct wlan_objmgr_pdev *pdev,
660 		uint8_t *ch_width)
661 {
662 	return;
663 }
664 
665 #ifndef QCA_DFS_USE_POLICY_MANAGER
666 void utils_dfs_get_nol_history_chan_list(struct wlan_objmgr_pdev *pdev,
667 					 void *clist, uint32_t *num_chan)
668 {
669 	int i, j = 0;
670 	struct regulatory_channel *cur_chan_list;
671 	struct wlan_dfs *dfs;
672 	struct dfs_channel *chan_list = (struct dfs_channel *)clist;
673 
674 	*num_chan = 0;
675 
676 	dfs = wlan_pdev_get_dfs_obj(pdev);
677 	if (!dfs)
678 		return;
679 
680 	cur_chan_list = qdf_mem_malloc(NUM_CHANNELS * sizeof(*cur_chan_list));
681 	if (!cur_chan_list)
682 		return;
683 
684 	if (wlan_reg_get_current_chan_list(
685 			pdev, cur_chan_list) != QDF_STATUS_SUCCESS) {
686 		dfs_alert(dfs, WLAN_DEBUG_DFS_ALWAYS,
687 			  "failed to get cur_chan list");
688 		qdf_mem_free(cur_chan_list);
689 		return;
690 	}
691 
692 	for (i = 0; i < NUM_CHANNELS; i++) {
693 		if (cur_chan_list[i].nol_history) {
694 			chan_list[j].dfs_ch_freq = cur_chan_list[i].center_freq;
695 			j++;
696 		}
697 	}
698 
699 	*num_chan = j;
700 	qdf_mem_free(cur_chan_list);
701 }
702 
703 void utils_dfs_get_chan_list(struct wlan_objmgr_pdev *pdev,
704 			     void *clist, uint32_t *num_chan)
705 {
706 	int i = 0, j = 0;
707 	enum channel_state state;
708 	struct regulatory_channel *cur_chan_list;
709 	struct wlan_dfs *dfs;
710 	struct dfs_channel *chan_list = (struct dfs_channel *)clist;
711 
712 	dfs = wlan_pdev_get_dfs_obj(pdev);
713 	if (!dfs)
714 		return;
715 
716 	cur_chan_list = qdf_mem_malloc(NUM_CHANNELS *
717 			sizeof(struct regulatory_channel));
718 	if (!cur_chan_list) {
719 		*num_chan = 0;
720 		return;
721 	}
722 
723 	if (wlan_reg_get_current_chan_list(
724 			pdev, cur_chan_list) != QDF_STATUS_SUCCESS) {
725 		*num_chan = 0;
726 		dfs_alert(dfs, WLAN_DEBUG_DFS_ALWAYS,
727 				"failed to get curr channel list");
728 		return;
729 	}
730 
731 	for (i = 0; i < NUM_CHANNELS; i++) {
732 		state = cur_chan_list[i].state;
733 		if (state == CHANNEL_STATE_DFS ||
734 				state == CHANNEL_STATE_ENABLE) {
735 			chan_list[j].dfs_ch_ieee = cur_chan_list[i].chan_num;
736 			chan_list[j].dfs_ch_freq = cur_chan_list[i].center_freq;
737 			if (state == CHANNEL_STATE_DFS)
738 				chan_list[j].dfs_ch_flagext =
739 					WLAN_CHAN_DFS;
740 
741 			if (cur_chan_list[i].nol_history)
742 				chan_list[j].dfs_ch_flagext |=
743 					WLAN_CHAN_HISTORY_RADAR;
744 			j++;
745 		}
746 	}
747 	*num_chan = j;
748 	qdf_mem_free(cur_chan_list);
749 
750 	return;
751 }
752 
753 /**
754  * utils_dfs_get_channel_list() - Get channel list from regdb component, based
755  * on current channel list.
756  * @pdev: Pointer to pdev structure.
757  * @vdev: vdev of request
758  * @chan: Pointer to channel list.
759  * @num_chan: number of channels.
760  *
761  * Get regdb channel list based on dfs current channel.
762  * Ex: When  AP is operating in 5GHz channel, filter 2.4GHz and 4.9GHZ channels
763  * so that the random channel function does not select either 2.4GHz or 4.9GHz
764  * channel.
765  */
766 #ifdef CONFIG_CHAN_FREQ_API
767 static void utils_dfs_get_channel_list(struct wlan_objmgr_pdev *pdev,
768 				       struct wlan_objmgr_vdev *vdev,
769 				       struct dfs_channel *chan_list,
770 				       uint32_t *num_chan)
771 {
772 	struct dfs_channel *tmp_chan_list = NULL;
773 	struct wlan_dfs *dfs;
774 	bool is_curchan_5g;
775 	bool is_curchan_24g;
776 	bool is_curchan_49g;
777 	uint32_t chan_num;
778 	uint32_t center_freq;
779 	uint16_t flagext;
780 	int i, j = 0;
781 
782 	dfs = wlan_pdev_get_dfs_obj(pdev);
783 	if (!dfs) {
784 		dfs_err(dfs, WLAN_DEBUG_DFS_ALWAYS, "null dfs");
785 		return;
786 	}
787 
788 	tmp_chan_list = qdf_mem_malloc(*num_chan * sizeof(*tmp_chan_list));
789 	if (!tmp_chan_list)
790 		return;
791 
792 	utils_dfs_get_chan_list(pdev, (void *)tmp_chan_list, num_chan);
793 
794 	chan_num = dfs->dfs_curchan->dfs_ch_ieee;
795 	center_freq = dfs->dfs_curchan->dfs_ch_freq;
796 	is_curchan_5g = WLAN_REG_IS_5GHZ_CH_FREQ(center_freq);
797 	is_curchan_24g = WLAN_REG_IS_24GHZ_CH_FREQ(center_freq);
798 	is_curchan_49g = WLAN_REG_IS_49GHZ_FREQ(center_freq);
799 
800 	for (i = 0; i < *num_chan; i++) {
801 		chan_num = tmp_chan_list[i].dfs_ch_ieee;
802 		center_freq = tmp_chan_list[i].dfs_ch_freq;
803 		flagext = tmp_chan_list[i].dfs_ch_flagext;
804 		/* No change in prototype needed. Hence retaining same func */
805 		if (!dfs_mlme_check_allowed_prim_chanlist(pdev, center_freq))
806 			continue;
807 
808 		if ((is_curchan_5g) && WLAN_REG_IS_5GHZ_CH_FREQ(center_freq)) {
809 			chan_list[j].dfs_ch_ieee = chan_num;
810 			chan_list[j].dfs_ch_freq = center_freq;
811 			chan_list[j].dfs_ch_flagext = flagext;
812 			j++;
813 		} else if ((is_curchan_24g) &&
814 				WLAN_REG_IS_24GHZ_CH_FREQ(center_freq)) {
815 			chan_list[j].dfs_ch_ieee = chan_num;
816 			chan_list[j].dfs_ch_freq = center_freq;
817 			j++;
818 		} else if ((is_curchan_49g) &&
819 				WLAN_REG_IS_49GHZ_FREQ(center_freq)) {
820 			chan_list[j].dfs_ch_ieee = chan_num;
821 			chan_list[j].dfs_ch_freq = center_freq;
822 			j++;
823 		}
824 	}
825 
826 	*num_chan = j;
827 
828 	qdf_mem_free(tmp_chan_list);
829 }
830 #else /* NUM_API */
831 #ifdef CONFIG_CHAN_NUM_API
832 static void utils_dfs_get_channel_list(struct wlan_objmgr_pdev *pdev,
833 				       struct wlan_objmgr_vdev *vdev,
834 				       struct dfs_channel *chan_list,
835 				       uint32_t *num_chan)
836 {
837 	struct dfs_channel *tmp_chan_list = NULL;
838 	struct wlan_dfs *dfs;
839 	bool is_curchan_5g;
840 	bool is_curchan_24g;
841 	bool is_curchan_49g;
842 	uint32_t chan_num;
843 	uint32_t center_freq;
844 	uint16_t flagext;
845 	int i, j = 0;
846 
847 	dfs = wlan_pdev_get_dfs_obj(pdev);
848 	if (!dfs) {
849 		dfs_err(dfs, WLAN_DEBUG_DFS_ALWAYS, "null dfs");
850 		return;
851 	}
852 
853 	tmp_chan_list = qdf_mem_malloc(*num_chan * sizeof(*tmp_chan_list));
854 	if (!tmp_chan_list)
855 		return;
856 
857 	utils_dfs_get_chan_list(pdev, (void *)tmp_chan_list, num_chan);
858 
859 	chan_num = dfs->dfs_curchan->dfs_ch_ieee;
860 	center_freq = dfs->dfs_curchan->dfs_ch_freq;
861 	is_curchan_5g = WLAN_REG_IS_5GHZ_CH(chan_num);
862 	is_curchan_24g = WLAN_REG_IS_24GHZ_CH(chan_num);
863 	is_curchan_49g = WLAN_REG_IS_49GHZ_FREQ(center_freq);
864 
865 	for (i = 0; i < *num_chan; i++) {
866 		chan_num = tmp_chan_list[i].dfs_ch_ieee;
867 		center_freq = tmp_chan_list[i].dfs_ch_freq;
868 		flagext = tmp_chan_list[i].dfs_ch_flagext;
869 
870 		if (!dfs_mlme_check_allowed_prim_chanlist(pdev, chan_num))
871 			continue;
872 
873 		if ((is_curchan_5g) && WLAN_REG_IS_5GHZ_CH(chan_num)) {
874 			chan_list[j].dfs_ch_ieee = chan_num;
875 			chan_list[j].dfs_ch_freq = center_freq;
876 			chan_list[j].dfs_ch_flagext = flagext;
877 			j++;
878 		} else if ((is_curchan_24g) &&
879 				WLAN_REG_IS_24GHZ_CH(chan_num)) {
880 			chan_list[j].dfs_ch_ieee = chan_num;
881 			chan_list[j].dfs_ch_freq = center_freq;
882 			j++;
883 		} else if ((is_curchan_49g) &&
884 				WLAN_REG_IS_49GHZ_FREQ(center_freq)) {
885 			chan_list[j].dfs_ch_ieee = chan_num;
886 			chan_list[j].dfs_ch_freq = center_freq;
887 			j++;
888 		}
889 	}
890 
891 	*num_chan = j;
892 
893 	qdf_mem_free(tmp_chan_list);
894 }
895 #endif
896 #endif
897 
898 #else
899 
900 void utils_dfs_get_nol_history_chan_list(struct wlan_objmgr_pdev *pdev,
901 					 void *clist, uint32_t *num_chan)
902 {
903 	utils_dfs_get_chan_list(pdev, clist, num_chan);
904 }
905 
906 static void utils_dfs_get_channel_list(struct wlan_objmgr_pdev *pdev,
907 				       struct wlan_objmgr_vdev *vdev,
908 				       struct dfs_channel *chan_list,
909 				       uint32_t *num_chan)
910 {
911 	uint32_t pcl_ch[QDF_MAX_NUM_CHAN] = {0};
912 	uint8_t weight_list[QDF_MAX_NUM_CHAN] = {0};
913 	uint32_t len;
914 	uint32_t weight_len;
915 	int i;
916 	struct wlan_objmgr_psoc *psoc;
917 	uint32_t conn_count = 0;
918 	enum policy_mgr_con_mode mode;
919 
920 	psoc = wlan_pdev_get_psoc(pdev);
921 	if (!psoc) {
922 		*num_chan = 0;
923 		dfs_err(NULL, WLAN_DEBUG_DFS_ALWAYS,  "null psoc");
924 		return;
925 	}
926 
927 	len = QDF_ARRAY_SIZE(pcl_ch);
928 	weight_len = QDF_ARRAY_SIZE(weight_list);
929 
930 	if (vdev)
931 		mode = policy_mgr_convert_device_mode_to_qdf_type(
932 				wlan_vdev_mlme_get_opmode(vdev));
933 	else
934 		mode = PM_SAP_MODE;
935 	conn_count = policy_mgr_mode_specific_connection_count(
936 			psoc, mode, NULL);
937 	if (0 == conn_count)
938 		policy_mgr_get_pcl(psoc, mode, pcl_ch,
939 				   &len, weight_list, weight_len);
940 	else
941 		policy_mgr_get_pcl_for_existing_conn(
942 			psoc, mode, pcl_ch, &len, weight_list,
943 			weight_len, true);
944 
945 	if (*num_chan < len) {
946 		dfs_err(NULL, WLAN_DEBUG_DFS_ALWAYS,
947 				"Invalid len src=%d, dst=%d",
948 				*num_chan, len);
949 		*num_chan = 0;
950 		return;
951 	}
952 
953 	for (i = 0; i < len; i++) {
954 		chan_list[i].dfs_ch_ieee  =
955 			wlan_reg_freq_to_chan(pdev, pcl_ch[i]);
956 		chan_list[i].dfs_ch_freq  = pcl_ch[i];
957 	}
958 	*num_chan = i;
959 	dfs_info(NULL, WLAN_DEBUG_DFS_ALWAYS, "num channels %d", i);
960 }
961 
962 void utils_dfs_get_chan_list(struct wlan_objmgr_pdev *pdev,
963 			     void *clist, uint32_t *num_chan)
964 {
965 	utils_dfs_get_channel_list(pdev, NULL, (struct dfs_channel *)clist,
966 				   num_chan);
967 }
968 #endif
969 
970 #ifdef CONFIG_CHAN_NUM_API
971 QDF_STATUS utils_dfs_get_vdev_random_channel(
972 	struct wlan_objmgr_pdev *pdev, struct wlan_objmgr_vdev *vdev,
973 	uint16_t flags, struct ch_params *ch_params, uint32_t *hw_mode,
974 	uint8_t *target_chan, struct dfs_acs_info *acs_info)
975 {
976 	uint32_t dfs_reg;
977 	uint32_t num_chan = NUM_CHANNELS;
978 	struct wlan_dfs *dfs = NULL;
979 	struct wlan_objmgr_psoc *psoc;
980 	struct dfs_channel *chan_list = NULL;
981 	struct dfs_channel cur_chan;
982 	QDF_STATUS status = QDF_STATUS_E_FAILURE;
983 
984 	*target_chan = 0;
985 	psoc = wlan_pdev_get_psoc(pdev);
986 	if (!psoc) {
987 		dfs_err(dfs, WLAN_DEBUG_DFS_ALWAYS,  "null psoc");
988 		goto random_chan_error;
989 	}
990 
991 	dfs = wlan_pdev_get_dfs_obj(pdev);
992 	if (!dfs) {
993 		dfs_err(dfs, WLAN_DEBUG_DFS_ALWAYS,  "null dfs");
994 		goto random_chan_error;
995 	}
996 
997 	wlan_reg_get_dfs_region(pdev, &dfs_reg);
998 	chan_list = qdf_mem_malloc(num_chan * sizeof(*chan_list));
999 	if (!chan_list)
1000 		goto random_chan_error;
1001 
1002 	utils_dfs_get_channel_list(pdev, vdev, chan_list, &num_chan);
1003 	if (!num_chan) {
1004 		dfs_err(dfs, WLAN_DEBUG_DFS_ALWAYS,  "zero channels");
1005 		goto random_chan_error;
1006 	}
1007 
1008 	cur_chan.dfs_ch_vhtop_ch_freq_seg1 = ch_params->center_freq_seg0;
1009 	cur_chan.dfs_ch_vhtop_ch_freq_seg2 = ch_params->center_freq_seg1;
1010 
1011 	if (!ch_params->ch_width)
1012 		utils_dfs_get_max_sup_width(pdev,
1013 				(uint8_t *)&ch_params->ch_width);
1014 
1015 	*target_chan = dfs_prepare_random_channel(dfs, chan_list,
1016 		num_chan, flags, (uint8_t *)&ch_params->ch_width,
1017 		&cur_chan, (uint8_t)dfs_reg, acs_info);
1018 
1019 	ch_params->center_freq_seg0 = cur_chan.dfs_ch_vhtop_ch_freq_seg1;
1020 	ch_params->center_freq_seg1 = cur_chan.dfs_ch_vhtop_ch_freq_seg2;
1021 	dfs_info(dfs, WLAN_DEBUG_DFS_RANDOM_CHAN,
1022 			"input width=%d", ch_params->ch_width);
1023 
1024 	if (*target_chan) {
1025 		wlan_reg_set_channel_params(pdev,
1026 				*target_chan, 0, ch_params);
1027 		utils_dfs_get_max_phy_mode(pdev, hw_mode);
1028 		status = QDF_STATUS_SUCCESS;
1029 	}
1030 
1031 	dfs_info(dfs, WLAN_DEBUG_DFS_RANDOM_CHAN,
1032 			"ch=%d, seg0=%d, seg1=%d, width=%d",
1033 			*target_chan, ch_params->center_freq_seg0,
1034 			ch_params->center_freq_seg1, ch_params->ch_width);
1035 
1036 random_chan_error:
1037 	qdf_mem_free(chan_list);
1038 
1039 	return status;
1040 }
1041 
1042 qdf_export_symbol(utils_dfs_get_vdev_random_channel);
1043 #endif
1044 
1045 #ifdef CONFIG_CHAN_FREQ_API
1046 QDF_STATUS utils_dfs_get_vdev_random_channel_for_freq(
1047 	struct wlan_objmgr_pdev *pdev, struct wlan_objmgr_vdev *vdev,
1048 	uint16_t flags, struct ch_params *chan_params, uint32_t *hw_mode,
1049 	uint16_t *target_chan_freq, struct dfs_acs_info *acs_info)
1050 {
1051 	uint32_t dfs_reg;
1052 	uint32_t num_chan = NUM_CHANNELS;
1053 	struct wlan_dfs *dfs = NULL;
1054 	struct wlan_objmgr_psoc *psoc;
1055 	struct dfs_channel *chan_list = NULL;
1056 	struct dfs_channel cur_chan;
1057 	QDF_STATUS status = QDF_STATUS_E_FAILURE;
1058 
1059 	*target_chan_freq = 0;
1060 	psoc = wlan_pdev_get_psoc(pdev);
1061 	if (!psoc) {
1062 		dfs_err(dfs, WLAN_DEBUG_DFS_ALWAYS,  "null psoc");
1063 		goto random_chan_error;
1064 	}
1065 
1066 	dfs = wlan_pdev_get_dfs_obj(pdev);
1067 	if (!dfs) {
1068 		dfs_err(dfs, WLAN_DEBUG_DFS_ALWAYS,  "null dfs");
1069 		goto random_chan_error;
1070 	}
1071 
1072 	wlan_reg_get_dfs_region(pdev, &dfs_reg);
1073 	chan_list = qdf_mem_malloc(num_chan * sizeof(*chan_list));
1074 	if (!chan_list)
1075 		goto random_chan_error;
1076 
1077 	utils_dfs_get_channel_list(pdev, vdev, chan_list, &num_chan);
1078 	if (!num_chan) {
1079 		dfs_err(dfs, WLAN_DEBUG_DFS_ALWAYS,  "zero channels");
1080 		goto random_chan_error;
1081 	}
1082 
1083 	cur_chan.dfs_ch_vhtop_ch_freq_seg1 = chan_params->center_freq_seg0;
1084 	cur_chan.dfs_ch_vhtop_ch_freq_seg2 = chan_params->center_freq_seg1;
1085 	cur_chan.dfs_ch_mhz_freq_seg1 = chan_params->mhz_freq_seg0;
1086 	cur_chan.dfs_ch_mhz_freq_seg2 = chan_params->mhz_freq_seg1;
1087 
1088 	if (!chan_params->ch_width)
1089 		utils_dfs_get_max_sup_width(pdev,
1090 					    (uint8_t *)&chan_params->ch_width);
1091 
1092 	*target_chan_freq = dfs_prepare_random_channel_for_freq(dfs, chan_list,
1093 		num_chan, flags, (uint8_t *)&chan_params->ch_width,
1094 		&cur_chan, (uint8_t)dfs_reg, acs_info);
1095 
1096 	chan_params->center_freq_seg0 = cur_chan.dfs_ch_vhtop_ch_freq_seg1;
1097 	chan_params->center_freq_seg1 = cur_chan.dfs_ch_vhtop_ch_freq_seg2;
1098 	chan_params->mhz_freq_seg0 =  cur_chan.dfs_ch_mhz_freq_seg1;
1099 	chan_params->mhz_freq_seg1 =  cur_chan.dfs_ch_mhz_freq_seg2;
1100 
1101 	dfs_info(dfs, WLAN_DEBUG_DFS_RANDOM_CHAN,
1102 		 "input width=%d", chan_params->ch_width);
1103 
1104 	if (*target_chan_freq) {
1105 		wlan_reg_set_channel_params_for_freq(pdev, *target_chan_freq, 0,
1106 						     chan_params);
1107 		utils_dfs_get_max_phy_mode(pdev, hw_mode);
1108 		status = QDF_STATUS_SUCCESS;
1109 	}
1110 
1111 	dfs_info(dfs, WLAN_DEBUG_DFS_RANDOM_CHAN,
1112 		 "ch=%d, seg0=%d, seg1=%d, width=%d",
1113 		 *target_chan_freq, chan_params->center_freq_seg0,
1114 		 chan_params->center_freq_seg1, chan_params->ch_width);
1115 
1116 random_chan_error:
1117 	qdf_mem_free(chan_list);
1118 
1119 	return status;
1120 }
1121 
1122 qdf_export_symbol(utils_dfs_get_vdev_random_channel_for_freq);
1123 #endif
1124 
1125 #ifdef CONFIG_CHAN_NUM_API
1126 QDF_STATUS utils_dfs_get_random_channel(
1127 	struct wlan_objmgr_pdev *pdev,
1128 	uint16_t flags,
1129 	struct ch_params *ch_params,
1130 	uint32_t *hw_mode,
1131 	uint8_t *target_chan,
1132 	struct dfs_acs_info *acs_info)
1133 {
1134 	return utils_dfs_get_vdev_random_channel(
1135 		pdev, NULL, flags, ch_params, hw_mode, target_chan,
1136 		acs_info);
1137 }
1138 qdf_export_symbol(utils_dfs_get_random_channel);
1139 #endif
1140 
1141 #ifdef CONFIG_CHAN_FREQ_API
1142 QDF_STATUS utils_dfs_get_random_channel_for_freq(
1143 	struct wlan_objmgr_pdev *pdev,
1144 	uint16_t flags,
1145 	struct ch_params *ch_params,
1146 	uint32_t *hw_mode,
1147 	uint16_t *target_chan_freq,
1148 	struct dfs_acs_info *acs_info)
1149 {
1150 	return utils_dfs_get_vdev_random_channel_for_freq(pdev, NULL, flags,
1151 							  ch_params, hw_mode,
1152 							  target_chan_freq,
1153 							  acs_info);
1154 }
1155 
1156 qdf_export_symbol(utils_dfs_get_random_channel_for_freq);
1157 #endif
1158 
1159 #ifdef CONFIG_CHAN_NUM_API
1160 QDF_STATUS utils_dfs_bw_reduced_channel(
1161 	struct wlan_objmgr_pdev *pdev,
1162 	struct ch_params *ch_params,
1163 	uint32_t *hw_mode,
1164 	uint8_t *target_chan)
1165 {
1166 	struct wlan_dfs *dfs = NULL;
1167 	struct wlan_objmgr_psoc *psoc;
1168 	enum channel_state ch_state;
1169 	QDF_STATUS status = QDF_STATUS_E_FAILURE;
1170 
1171 	*target_chan = 0;
1172 	psoc = wlan_pdev_get_psoc(pdev);
1173 	if (!psoc) {
1174 		dfs_err(dfs, WLAN_DEBUG_DFS_ALWAYS,  "null psoc");
1175 		return status;
1176 	}
1177 
1178 	dfs = wlan_pdev_get_dfs_obj(pdev);
1179 	if (!dfs) {
1180 		dfs_err(dfs, WLAN_DEBUG_DFS_ALWAYS,  "null dfs");
1181 		return status;
1182 	}
1183 
1184 	ch_state = wlan_reg_get_channel_state(pdev,
1185 					      dfs->dfs_curchan->dfs_ch_ieee);
1186 
1187 	if (ch_state == CHANNEL_STATE_DFS ||
1188 	    ch_state == CHANNEL_STATE_ENABLE) {
1189 		ch_params->center_freq_seg0 =
1190 			dfs->dfs_curchan->dfs_ch_vhtop_ch_freq_seg1;
1191 		ch_params->center_freq_seg1 =
1192 			dfs->dfs_curchan->dfs_ch_vhtop_ch_freq_seg2;
1193 		wlan_reg_set_channel_params(pdev,
1194 					    dfs->dfs_curchan->dfs_ch_ieee,
1195 					    0, ch_params);
1196 
1197 		*target_chan = dfs->dfs_curchan->dfs_ch_ieee;
1198 		utils_dfs_get_max_phy_mode(pdev, hw_mode);
1199 
1200 		return QDF_STATUS_SUCCESS;
1201 	}
1202 
1203 	return status;
1204 }
1205 
1206 qdf_export_symbol(utils_dfs_bw_reduced_channel);
1207 #endif
1208 
1209 #ifdef CONFIG_CHAN_FREQ_API
1210 QDF_STATUS utils_dfs_bw_reduced_channel_for_freq(
1211 						 struct wlan_objmgr_pdev *pdev,
1212 						 struct ch_params *chan_params,
1213 						 uint32_t *hw_mode,
1214 						 uint16_t *target_chan_freq)
1215 {
1216 	struct wlan_dfs *dfs = NULL;
1217 	struct wlan_objmgr_psoc *psoc;
1218 	enum channel_state ch_state;
1219 	QDF_STATUS status = QDF_STATUS_E_FAILURE;
1220 	struct dfs_channel *dfs_curchan;
1221 
1222 	*target_chan_freq = 0;
1223 	psoc = wlan_pdev_get_psoc(pdev);
1224 	if (!psoc) {
1225 		dfs_err(dfs, WLAN_DEBUG_DFS_ALWAYS,  "null psoc");
1226 		return status;
1227 	}
1228 
1229 	dfs = wlan_pdev_get_dfs_obj(pdev);
1230 	if (!dfs) {
1231 		dfs_err(dfs, WLAN_DEBUG_DFS_ALWAYS,  "null dfs");
1232 		return status;
1233 	}
1234 	dfs_curchan = dfs->dfs_curchan;
1235 	ch_state =
1236 	    wlan_reg_get_channel_state_for_freq(pdev,
1237 						dfs_curchan->dfs_ch_freq);
1238 
1239 	if (ch_state == CHANNEL_STATE_DFS ||
1240 	    ch_state == CHANNEL_STATE_ENABLE) {
1241 		chan_params->mhz_freq_seg0 =
1242 			dfs_curchan->dfs_ch_mhz_freq_seg1;
1243 		chan_params->mhz_freq_seg1 =
1244 			dfs_curchan->dfs_ch_mhz_freq_seg2;
1245 		wlan_reg_set_channel_params_for_freq(pdev,
1246 						     dfs_curchan->dfs_ch_freq,
1247 						     0, chan_params);
1248 
1249 		*target_chan_freq = dfs_curchan->dfs_ch_freq;
1250 		utils_dfs_get_max_phy_mode(pdev, hw_mode);
1251 
1252 		return QDF_STATUS_SUCCESS;
1253 	}
1254 
1255 	return status;
1256 }
1257 
1258 qdf_export_symbol(utils_dfs_bw_reduced_channel_for_freq);
1259 #endif
1260 
1261 
1262 #ifdef QCA_DFS_NOL_PLATFORM_DRV_SUPPORT
1263 void utils_dfs_init_nol(struct wlan_objmgr_pdev *pdev)
1264 {
1265 	struct wlan_dfs *dfs;
1266 	struct wlan_objmgr_psoc *psoc;
1267 	qdf_device_t qdf_dev;
1268 	struct dfs_nol_info *dfs_nolinfo;
1269 	int len;
1270 
1271 	dfs = wlan_pdev_get_dfs_obj(pdev);
1272 	psoc = wlan_pdev_get_psoc(pdev);
1273 	if (!dfs || !psoc) {
1274 		dfs_err(dfs, WLAN_DEBUG_DFS_ALWAYS,
1275 				"dfs %pK, psoc %pK", dfs, psoc);
1276 		return;
1277 	}
1278 
1279 	qdf_dev = psoc->soc_objmgr.qdf_dev;
1280 	if (!qdf_dev->dev) {
1281 		dfs_err(dfs, WLAN_DEBUG_DFS_ALWAYS,  "null device");
1282 		return;
1283 	}
1284 
1285 	dfs_nolinfo = qdf_mem_malloc(sizeof(*dfs_nolinfo));
1286 	if (!dfs_nolinfo)
1287 		return;
1288 
1289 	qdf_mem_zero(dfs_nolinfo, sizeof(*dfs_nolinfo));
1290 	len = pld_wlan_get_dfs_nol(qdf_dev->dev, (void *)dfs_nolinfo,
1291 				   (uint16_t)sizeof(*dfs_nolinfo));
1292 	if (len > 0) {
1293 		dfs_set_nol(dfs, dfs_nolinfo->dfs_nol, dfs_nolinfo->num_chans);
1294 		dfs_info(dfs, WLAN_DEBUG_DFS_ALWAYS, "nol channels in pld");
1295 		DFS_PRINT_NOL_LOCKED(dfs);
1296 	} else {
1297 		dfs_err(dfs, WLAN_DEBUG_DFS_ALWAYS,  "no nol in pld");
1298 	}
1299 	qdf_mem_free(dfs_nolinfo);
1300 }
1301 #endif
1302 qdf_export_symbol(utils_dfs_init_nol);
1303 
1304 #ifndef QCA_DFS_NOL_PLATFORM_DRV_SUPPORT
1305 void utils_dfs_save_nol(struct wlan_objmgr_pdev *pdev)
1306 {
1307 }
1308 #else
1309 void utils_dfs_save_nol(struct wlan_objmgr_pdev *pdev)
1310 {
1311 	struct dfs_nol_info *dfs_nolinfo;
1312 	struct wlan_dfs *dfs = NULL;
1313 	struct wlan_objmgr_psoc *psoc;
1314 	qdf_device_t qdf_dev;
1315 	int num_chans = 0;
1316 
1317 	dfs = wlan_pdev_get_dfs_obj(pdev);
1318 	if (!dfs) {
1319 		dfs_err(dfs, WLAN_DEBUG_DFS_ALWAYS,  "null dfs");
1320 		return;
1321 	}
1322 
1323 	psoc = wlan_pdev_get_psoc(pdev);
1324 	if (!psoc) {
1325 		dfs_err(dfs, WLAN_DEBUG_DFS_ALWAYS,  "null psoc");
1326 		return;
1327 	}
1328 
1329 	qdf_dev = psoc->soc_objmgr.qdf_dev;
1330 	if (!qdf_dev->dev) {
1331 		dfs_err(dfs, WLAN_DEBUG_DFS_ALWAYS,  "null device");
1332 		return;
1333 	}
1334 
1335 	dfs_nolinfo = qdf_mem_malloc(sizeof(*dfs_nolinfo));
1336 	if (!dfs_nolinfo)
1337 		return;
1338 
1339 	qdf_mem_zero(dfs_nolinfo, sizeof(*dfs_nolinfo));
1340 	DFS_GET_NOL_LOCKED(dfs, dfs_nolinfo->dfs_nol, &num_chans);
1341 	if (num_chans > 0) {
1342 
1343 		if (num_chans > DFS_MAX_NOL_CHANNEL)
1344 			dfs_nolinfo->num_chans = DFS_MAX_NOL_CHANNEL;
1345 		else
1346 			dfs_nolinfo->num_chans = num_chans;
1347 
1348 		pld_wlan_set_dfs_nol(qdf_dev->dev, (void *)dfs_nolinfo,
1349 				     (uint16_t)sizeof(*dfs_nolinfo));
1350 	}
1351 	qdf_mem_free(dfs_nolinfo);
1352 }
1353 #endif
1354 qdf_export_symbol(utils_dfs_save_nol);
1355 
1356 void utils_dfs_print_nol_channels(struct wlan_objmgr_pdev *pdev)
1357 {
1358 	struct wlan_dfs *dfs = NULL;
1359 
1360 	dfs = wlan_pdev_get_dfs_obj(pdev);
1361 	if (!dfs) {
1362 		dfs_err(dfs, WLAN_DEBUG_DFS_ALWAYS,  "null dfs");
1363 		return;
1364 	}
1365 
1366 	DFS_PRINT_NOL_LOCKED(dfs);
1367 }
1368 qdf_export_symbol(utils_dfs_print_nol_channels);
1369 
1370 void utils_dfs_clear_nol_channels(struct wlan_objmgr_pdev *pdev)
1371 {
1372 	struct wlan_dfs *dfs = NULL;
1373 
1374 	dfs = wlan_pdev_get_dfs_obj(pdev);
1375 	if (!dfs) {
1376 		dfs_err(dfs, WLAN_DEBUG_DFS_ALWAYS,  "null dfs");
1377 		return;
1378 	}
1379 
1380 	/* First print list */
1381 	DFS_PRINT_NOL_LOCKED(dfs);
1382 
1383 	/* clear local cache first */
1384 	dfs_nol_timer_cleanup(dfs);
1385 	dfs_nol_update(dfs);
1386 
1387 	/*
1388 	 * update platform driver nol list with local cache which is zero,
1389 	 * cleared in above step, so this will clear list in platform driver.
1390 	 */
1391 	utils_dfs_save_nol(pdev);
1392 }
1393 qdf_export_symbol(utils_dfs_clear_nol_channels);
1394 
1395 #ifdef CONFIG_CHAN_NUM_API
1396 void utils_dfs_reg_update_nol_ch(struct wlan_objmgr_pdev *pdev,
1397 		uint8_t *ch_list,
1398 		uint8_t num_ch,
1399 		bool nol_ch)
1400 {
1401 	/* TODO : Need locking?*/
1402 	wlan_reg_update_nol_ch(pdev, ch_list, num_ch, nol_ch);
1403 }
1404 qdf_export_symbol(utils_dfs_reg_update_nol_ch);
1405 #endif
1406 
1407 #ifdef CONFIG_CHAN_FREQ_API
1408 void utils_dfs_reg_update_nol_chan_for_freq(struct wlan_objmgr_pdev *pdev,
1409 					  uint16_t *freq_list,
1410 					  uint8_t num_chan,
1411 					  bool nol_chan)
1412 {
1413 	wlan_reg_update_nol_ch_for_freq(pdev, freq_list, num_chan, nol_chan);
1414 }
1415 
1416 qdf_export_symbol(utils_dfs_reg_update_nol_chan_for_freq);
1417 #endif
1418 
1419 #ifdef CONFIG_CHAN_NUM_API
1420 void utils_dfs_reg_update_nol_history_ch(struct wlan_objmgr_pdev *pdev,
1421 					 uint8_t *ch_list,
1422 					 uint8_t num_ch,
1423 					 bool nol_history_ch)
1424 {
1425 	wlan_reg_update_nol_history_ch(pdev, ch_list, num_ch, nol_history_ch);
1426 }
1427 #endif
1428 
1429 #ifdef CONFIG_CHAN_FREQ_API
1430 void
1431 utils_dfs_reg_update_nol_history_chan_for_freq(struct wlan_objmgr_pdev *pdev,
1432 					       uint16_t *freq_list,
1433 					       uint8_t num_chan,
1434 					       bool nol_history_chan)
1435 {
1436 	wlan_reg_update_nol_history_ch_for_freq(pdev, freq_list, num_chan,
1437 						nol_history_chan);
1438 }
1439 #endif
1440 
1441 uint8_t utils_dfs_freq_to_chan(uint32_t freq)
1442 {
1443 	uint8_t chan;
1444 
1445 	if (freq == 0)
1446 		return 0;
1447 
1448 	if (freq > DFS_24_GHZ_BASE_FREQ && freq < DFS_CHAN_14_FREQ)
1449 		chan = ((freq - DFS_24_GHZ_BASE_FREQ) / DFS_CHAN_SPACING_5MHZ);
1450 	else if (freq == DFS_CHAN_14_FREQ)
1451 		chan = DFS_24_GHZ_CHANNEL_14;
1452 	else if ((freq > DFS_24_GHZ_BASE_FREQ) && (freq < DFS_5_GHZ_BASE_FREQ))
1453 		chan = (((freq - DFS_CHAN_15_FREQ) / DFS_CHAN_SPACING_20MHZ) +
1454 			DFS_24_GHZ_CHANNEL_15);
1455 	else
1456 		chan = (freq - DFS_5_GHZ_BASE_FREQ) / DFS_CHAN_SPACING_5MHZ;
1457 
1458 	return chan;
1459 }
1460 qdf_export_symbol(utils_dfs_freq_to_chan);
1461 
1462 uint32_t utils_dfs_chan_to_freq(uint8_t chan)
1463 {
1464 	if (chan == 0)
1465 		return 0;
1466 
1467 	if (chan < DFS_24_GHZ_CHANNEL_14)
1468 		return DFS_24_GHZ_BASE_FREQ + (chan * DFS_CHAN_SPACING_5MHZ);
1469 	else if (chan == DFS_24_GHZ_CHANNEL_14)
1470 		return DFS_CHAN_14_FREQ;
1471 	else if (chan < DFS_24_GHZ_CHANNEL_27)
1472 		return DFS_CHAN_15_FREQ + ((chan - DFS_24_GHZ_CHANNEL_15) *
1473 				DFS_CHAN_SPACING_20MHZ);
1474 	else if (chan == DFS_5_GHZ_CHANNEL_170)
1475 		return DFS_CHAN_170_FREQ;
1476 	else
1477 		return DFS_5_GHZ_BASE_FREQ + (chan * DFS_CHAN_SPACING_5MHZ);
1478 }
1479 qdf_export_symbol(utils_dfs_chan_to_freq);
1480 
1481 #ifdef QCA_MCL_DFS_SUPPORT
1482 #ifdef CONFIG_CHAN_NUM_API
1483 QDF_STATUS utils_dfs_mark_leaking_ch(struct wlan_objmgr_pdev *pdev,
1484 	enum phy_ch_width ch_width,
1485 	uint8_t temp_ch_lst_sz,
1486 	uint8_t *temp_ch_lst)
1487 {
1488 	struct wlan_dfs *dfs = NULL;
1489 
1490 	dfs = wlan_pdev_get_dfs_obj(pdev);
1491 	if (!dfs) {
1492 		dfs_err(dfs, WLAN_DEBUG_DFS_ALWAYS,  "null dfs");
1493 		return  QDF_STATUS_E_FAILURE;
1494 	}
1495 
1496 	return dfs_mark_leaking_ch(dfs, ch_width, temp_ch_lst_sz, temp_ch_lst);
1497 }
1498 qdf_export_symbol(utils_dfs_mark_leaking_ch);
1499 #endif
1500 
1501 #ifdef CONFIG_CHAN_FREQ_API
1502 QDF_STATUS utils_dfs_mark_leaking_chan_for_freq(struct wlan_objmgr_pdev *pdev,
1503 	enum phy_ch_width ch_width,
1504 	uint8_t temp_chan_lst_sz,
1505 	uint16_t *temp_freq_lst)
1506 {
1507 	struct wlan_dfs *dfs = NULL;
1508 
1509 	dfs = wlan_pdev_get_dfs_obj(pdev);
1510 	if (!dfs) {
1511 		dfs_err(dfs, WLAN_DEBUG_DFS_ALWAYS,  "null dfs");
1512 		return  QDF_STATUS_E_FAILURE;
1513 	}
1514 
1515 	return dfs_mark_leaking_chan_for_freq(dfs, ch_width, temp_chan_lst_sz,
1516 					    temp_freq_lst);
1517 }
1518 qdf_export_symbol(utils_dfs_mark_leaking_chan_for_freq);
1519 #endif
1520 #endif
1521 
1522 int utils_get_dfsdomain(struct wlan_objmgr_pdev *pdev)
1523 {
1524 	enum dfs_reg dfsdomain;
1525 
1526 	wlan_reg_get_dfs_region(pdev, &dfsdomain);
1527 
1528 	return dfsdomain;
1529 }
1530 
1531 uint16_t utils_dfs_get_cur_rd(struct wlan_objmgr_pdev *pdev)
1532 {
1533 	struct cur_regdmn_info cur_regdmn;
1534 
1535 	wlan_reg_get_curr_regdomain(pdev, &cur_regdmn);
1536 
1537 	return cur_regdmn.regdmn_pair_id;
1538 }
1539 
1540 #if defined(WLAN_DFS_PARTIAL_OFFLOAD) && defined(HOST_DFS_SPOOF_TEST)
1541 QDF_STATUS utils_dfs_is_spoof_check_failed(struct wlan_objmgr_pdev *pdev,
1542 					   bool *is_spoof_check_failed)
1543 {
1544 	struct wlan_dfs *dfs;
1545 
1546 	if (!tgt_dfs_is_pdev_5ghz(pdev))
1547 		return QDF_STATUS_SUCCESS;
1548 
1549 	dfs = wlan_pdev_get_dfs_obj(pdev);
1550 	if (!dfs) {
1551 		dfs_err(dfs, WLAN_DEBUG_DFS_ALWAYS,  "dfs is null");
1552 		return  QDF_STATUS_E_FAILURE;
1553 	}
1554 
1555 	*is_spoof_check_failed = dfs->dfs_spoof_check_failed;
1556 
1557 	return QDF_STATUS_SUCCESS;
1558 }
1559 
1560 qdf_export_symbol(utils_dfs_is_spoof_check_failed);
1561 #endif
1562 
1563 int dfs_get_num_chans(void)
1564 {
1565 	return NUM_CHANNELS;
1566 }
1567 
1568 #if defined(WLAN_DFS_FULL_OFFLOAD) && defined(QCA_DFS_NOL_OFFLOAD)
1569 QDF_STATUS utils_dfs_get_disable_radar_marking(struct wlan_objmgr_pdev *pdev,
1570 					       bool *disable_radar_marking)
1571 {
1572 	struct wlan_dfs *dfs;
1573 
1574 	if (!tgt_dfs_is_pdev_5ghz(pdev))
1575 		return QDF_STATUS_SUCCESS;
1576 
1577 	dfs = wlan_pdev_get_dfs_obj(pdev);
1578 	if (!dfs) {
1579 		dfs_err(dfs, WLAN_DEBUG_DFS_ALWAYS,  "dfs is null");
1580 		return  QDF_STATUS_E_FAILURE;
1581 	}
1582 
1583 	*disable_radar_marking = dfs_get_disable_radar_marking(dfs);
1584 
1585 	return QDF_STATUS_SUCCESS;
1586 }
1587 
1588 qdf_export_symbol(utils_dfs_get_disable_radar_marking);
1589 
1590 bool utils_is_dfs_cfreq2_ch(struct wlan_objmgr_pdev *pdev)
1591 {
1592 	struct wlan_dfs *dfs;
1593 
1594 	dfs = wlan_pdev_get_dfs_obj(pdev);
1595 	if (!dfs)
1596 		return false;
1597 
1598 	return WLAN_IS_CHAN_DFS_CFREQ2(dfs->dfs_curchan);
1599 }
1600 
1601 qdf_export_symbol(utils_is_dfs_cfreq2_ch);
1602 #endif
1603 
1604 void utils_dfs_deliver_event(struct wlan_objmgr_pdev *pdev, uint16_t freq,
1605 			     enum WLAN_DFS_EVENTS event)
1606 {
1607 	if (global_dfs_to_mlme.mlme_dfs_deliver_event)
1608 		global_dfs_to_mlme.mlme_dfs_deliver_event(pdev, freq, event);
1609 }
1610 
1611 void utils_dfs_reset_dfs_prevchan(struct wlan_objmgr_pdev *pdev)
1612 {
1613 	struct wlan_dfs *dfs;
1614 
1615 	if (!tgt_dfs_is_pdev_5ghz(pdev))
1616 		return;
1617 
1618 	dfs = wlan_pdev_get_dfs_obj(pdev);
1619 	if (!dfs) {
1620 		dfs_err(dfs, WLAN_DEBUG_DFS_ALWAYS,  "dfs is null");
1621 		return;
1622 	}
1623 
1624 	dfs_reset_dfs_prevchan(dfs);
1625 }
1626