xref: /wlan-dirver/qca-wifi-host-cmn/umac/dfs/core/src/dfs_zero_cac.h (revision dd4dc88b837a295134aa9869114a2efee0f4894b)
1 /*
2  * Copyright (c) 2016-2019 The Linux Foundation. All rights reserved.
3  * Copyright (c) 2007-2008 Sam Leffler, Errno Consulting
4  * All rights reserved.
5  *
6  * Redistribution and use in source and binary forms, with or without
7  * modification, are permitted provided that the following conditions
8  * are met:
9  * 1. Redistributions of source code must retain the above copyright
10  *    notice, this list of conditions and the following disclaimer.
11  * 2. Redistributions in binary form must reproduce the above copyright
12  *    notice, this list of conditions and the following disclaimer in the
13  *    documentation and/or other materials provided with the distribution.
14  *
15  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
16  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
17  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
18  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
19  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
20  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
21  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
22  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
24  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25  */
26 
27 /**
28  * DOC: This file has Zero CAC DFS APIs.
29  */
30 
31 #ifndef _DFS_ZERO_CAC_H_
32 #define _DFS_ZERO_CAC_H_
33 
34 #include "dfs.h"
35 #include <wlan_dfs_tgt_api.h>
36 
37 #define VHT160_IEEE_FREQ_DIFF 16
38 #define OCAC_SUCCESS 0
39 #define OCAC_RESET 1
40 #define OCAC_CANCEL 2
41 
42 /**
43  * struct dfs_precac_entry - PreCAC entry.
44  * @pe_list:           PreCAC entry.
45  * @vht80_freq:        VHT80 freq.
46  * @precac_nol_timer:  Per element precac NOL timer.
47  * @dfs:               Pointer to wlan_dfs structure.
48  */
49 struct dfs_precac_entry {
50 	TAILQ_ENTRY(dfs_precac_entry) pe_list;
51 	uint8_t             vht80_freq;
52 	qdf_timer_t         precac_nol_timer;
53 	struct wlan_dfs     *dfs;
54 };
55 
56 /**
57  * enum precac_chan_state - Enum for PreCAC state of a channel.
58  * @PRECAC_ERR:            Invalid preCAC state.
59  * @PRECAC_REQUIRED:       preCAC need to be done on the channel.
60  * @PRECAC_NOW:            preCAC is running on the channel.
61  * @PRECAC_DONE:           preCAC is done and channel is clear.
62  * @PRECAC_NOL:            preCAC is done and radar is detected.
63  */
64 enum precac_chan_state {
65 	PRECAC_ERR      = -1,
66 	PRECAC_REQUIRED,
67 	PRECAC_NOW,
68 	PRECAC_DONE,
69 	PRECAC_NOL,
70 };
71 
72 /**
73  * dfs_zero_cac_timer_init() - Initialize zero-cac timers
74  * @dfs_soc_obj: Pointer to DFS SOC object structure.
75  */
76 #if !defined(QCA_MCL_DFS_SUPPORT)
77 void dfs_zero_cac_timer_init(struct dfs_soc_priv_obj *dfs_soc_obj);
78 #else
79 static inline void
80 dfs_zero_cac_timer_init(struct dfs_soc_priv_obj *dfs_soc_obj)
81 {
82 }
83 #endif
84 /**
85  * dfs_print_precaclists() - Print precac list.
86  * @dfs: Pointer to wlan_dfs structure.
87  */
88 #if defined(WLAN_DFS_PARTIAL_OFFLOAD) && !defined(QCA_MCL_DFS_SUPPORT)
89 void dfs_print_precaclists(struct wlan_dfs *dfs);
90 #else
91 static inline void dfs_print_precaclists(struct wlan_dfs *dfs)
92 {
93 }
94 #endif
95 
96 /**
97  * dfs_reset_precac_lists() - Resets the precac lists.
98  * @dfs: Pointer to wlan_dfs structure.
99  */
100 #if defined(WLAN_DFS_PARTIAL_OFFLOAD) && !defined(QCA_MCL_DFS_SUPPORT)
101 void dfs_reset_precac_lists(struct wlan_dfs *dfs);
102 #else
103 static inline void dfs_reset_precac_lists(struct wlan_dfs *dfs)
104 {
105 }
106 #endif
107 
108 /**
109  * dfs_reset_precaclists() - Clears and initiakizes precac_required_list,
110  *                           precac_done_list and precac_nol_list.
111  *
112  * @dfs: Pointer to wlan_dfs structure.
113  */
114 #if defined(WLAN_DFS_PARTIAL_OFFLOAD) && !defined(QCA_MCL_DFS_SUPPORT)
115 void dfs_reset_precaclists(struct wlan_dfs *dfs);
116 #else
117 static inline void dfs_reset_precaclists(struct wlan_dfs *dfs)
118 {
119 }
120 #endif
121 
122 /**
123  * dfs_deinit_precac_list() - Clears the precac list.
124  * @dfs: Pointer to wlan_dfs dtructure.
125  */
126 void dfs_deinit_precac_list(struct wlan_dfs *dfs);
127 
128 /**
129  * dfs_zero_cac_detach() - Free zero_cac memory.
130  * @dfs: Pointer to wlan_dfs dtructure.
131  */
132 #if defined(WLAN_DFS_PARTIAL_OFFLOAD) && !defined(QCA_MCL_DFS_SUPPORT)
133 void dfs_zero_cac_detach(struct wlan_dfs *dfs);
134 #else
135 static inline void dfs_zero_cac_detach(struct wlan_dfs *dfs)
136 {
137 }
138 #endif
139 
140 /**
141  * dfs_init_precac_list() - Init precac list.
142  * @dfs: Pointer to wlan_dfs dtructure.
143  */
144 void dfs_init_precac_list(struct wlan_dfs *dfs);
145 
146 /**
147  * dfs_start_precac_timer() - Start precac timer.
148  * @dfs: Pointer to wlan_dfs structure.
149  * @precac_chan: Start thr precac timer in this channel.
150  */
151 #if defined(WLAN_DFS_PARTIAL_OFFLOAD) && !defined(QCA_MCL_DFS_SUPPORT)
152 void dfs_start_precac_timer(struct wlan_dfs *dfs,
153 			    uint8_t precac_chan);
154 #else
155 static inline void dfs_start_precac_timer(struct wlan_dfs *dfs,
156 					  uint8_t precac_chan)
157 {
158 }
159 #endif
160 
161 /**
162  * dfs_cancel_precac_timer() - Cancel the precac timer.
163  * @dfs: Pointer to wlan_dfs structure.
164  */
165 #if defined(WLAN_DFS_PARTIAL_OFFLOAD) && !defined(QCA_MCL_DFS_SUPPORT)
166 void dfs_cancel_precac_timer(struct wlan_dfs *dfs);
167 #else
168 static inline void dfs_cancel_precac_timer(struct wlan_dfs *dfs)
169 {
170 }
171 #endif
172 
173 /**
174  * dfs_zero_cac_attach() - Initialize dfs zerocac variables.
175  * @dfs: Pointer to DFS structure.
176  */
177 #if defined(WLAN_DFS_PARTIAL_OFFLOAD) && !defined(QCA_MCL_DFS_SUPPORT)
178 void dfs_zero_cac_attach(struct wlan_dfs *dfs);
179 #else
180 static inline void dfs_zero_cac_attach(struct wlan_dfs *dfs)
181 {
182 }
183 #endif
184 
185 /**
186  * dfs_zero_cac_reset() - Reset Zero cac DFS variables.
187  * @dfs: Pointer to wlan_dfs structure.
188  */
189 #if defined(WLAN_DFS_PARTIAL_OFFLOAD) && !defined(QCA_MCL_DFS_SUPPORT)
190 void dfs_zero_cac_reset(struct wlan_dfs *dfs);
191 #else
192 static inline void dfs_zero_cac_reset(struct wlan_dfs *dfs)
193 {
194 }
195 #endif
196 
197 /**
198  * dfs_zero_cac_timer_detach() - Free Zero cac DFS variables.
199  * @dfs_soc_obj: Pointer to dfs_soc_priv_obj structure.
200  */
201 #if !defined(QCA_MCL_DFS_SUPPORT)
202 void dfs_zero_cac_timer_detach(struct dfs_soc_priv_obj *dfs_soc_obj);
203 #else
204 static inline void
205 dfs_zero_cac_timer_detach(struct dfs_soc_priv_obj *dfs_soc_obj)
206 {
207 }
208 #endif
209 
210 /**
211  * dfs_is_precac_done() - Is precac done.
212  * @dfs: Pointer to wlan_dfs structure.
213  * @chan: Pointer to dfs_channel for which preCAC done is checked.
214  *
215  * Return:
216  * * True:  If precac is done on channel.
217  * * False: If precac is not done on channel.
218  */
219 #if defined(WLAN_DFS_PARTIAL_OFFLOAD) && !defined(QCA_MCL_DFS_SUPPORT)
220 bool dfs_is_precac_done(struct wlan_dfs *dfs, struct dfs_channel *chan);
221 #else
222 static inline bool dfs_is_precac_done(struct wlan_dfs *dfs,
223 				      struct dfs_channel *chan)
224 {
225 	return false;
226 }
227 #endif
228 
229 #ifdef WLAN_DFS_PRECAC_AUTO_CHAN_SUPPORT
230 /**
231  * dfs_decide_precac_preferred_chan() - Choose operating channel among
232  *                                      configured DFS channel and
233  *                                      intermediate channel based on
234  *                                      precac status of configured
235  *                                      DFS channel.
236  * @dfs: Pointer to wlan_dfs structure.
237  * @pref_chan: Configured DFS channel.
238  * @mode: Configured PHY mode.
239  *
240  * Return: True if intermediate channel needs to configure. False otherwise.
241  */
242 bool
243 dfs_decide_precac_preferred_chan(struct wlan_dfs *dfs,
244 				  uint8_t *pref_chan,
245 				  enum wlan_phymode mode);
246 #else
247 static inline void dfs_decide_precac_preferred_chan(struct wlan_dfs *dfs,
248 						    uint8_t *pref_chan,
249 						    enum wlan_phymode mode)
250 {
251 }
252 #endif
253 
254 /**
255  * dfs_get_freq_from_precac_required_list() - Get VHT80 freq from
256  *                                            precac_required_list.
257  * @dfs: Pointer to wlan_dfs structure.
258  * @exclude_ieee_freq: Find a VHT80 freqency that is not equal to
259  *                     exclude_ieee_freq.
260  */
261 uint8_t dfs_get_freq_from_precac_required_list(struct wlan_dfs *dfs,
262 		uint8_t exclude_ieee_freq);
263 
264 /**
265  * dfs_override_precac_timeout() - Override the default precac timeout.
266  * @dfs: Pointer to wlan_dfs structure.
267  * @precac_timeout: Precac timeout value.
268  */
269 #if defined(WLAN_DFS_PARTIAL_OFFLOAD) && !defined(QCA_MCL_DFS_SUPPORT)
270 int dfs_override_precac_timeout(struct wlan_dfs *dfs,
271 		int precac_timeout);
272 #else
273 static inline int dfs_override_precac_timeout(struct wlan_dfs *dfs,
274 		int precac_timeout)
275 {
276 	return 0;
277 }
278 #endif
279 
280 /**
281  * dfs_get_override_precac_timeout() - Get precac timeout.
282  * @dfs: Pointer wlan_dfs structure.
283  * @precac_timeout: Get precac timeout value in this variable.
284  */
285 #if defined(WLAN_DFS_PARTIAL_OFFLOAD) && !defined(QCA_MCL_DFS_SUPPORT)
286 int dfs_get_override_precac_timeout(struct wlan_dfs *dfs,
287 		int *precac_timeout);
288 #else
289 static inline int dfs_get_override_precac_timeout(struct wlan_dfs *dfs,
290 		int *precac_timeout)
291 {
292 	return 0;
293 }
294 #endif
295 
296 /**
297  * dfs_find_vht80_chan_for_precac() - Find VHT80 channel for precac.
298  * @dfs: Pointer to wlan_dfs structure.
299  * @chan_mode: Channel mode.
300  * @ch_freq_seg1: Segment1 channel freq.
301  * @cfreq1: cfreq1.
302  * @cfreq2: cfreq2.
303  * @phy_mode: Precac phymode.
304  * @dfs_set_cfreq2: Precac cfreq2
305  * @set_agile: Agile mode flag.
306  *
307  * Zero-CAC-DFS algorithm:-
308  * Zero-CAC-DFS algorithm works in stealth mode.
309  * 1) When any channel change happens in VHT80 mode the algorithm
310  * changes the HW channel mode to VHT80_80/VHT160 mode and adds a
311  * new channel in the secondary VHT80 to perform precac and a
312  * precac timer is started. However the upper layer/UMAC is unaware
313  * of this change.
314  * 2) When the precac timer expires without being interrupted by
315  * any channel change the secondary VHT80 channel is moved from
316  * precac-required-list to precac-done-list.
317  * 3) If there is a radar detect at any time in any segment
318  * (segment-1 is preimary VHT80 and segment-2 is VHT80)then the
319  * channel is searched in both precac-reuired-list and precac-done-list
320  * and moved to precac-nol-list.
321  * 4) Whenever channel change happens if the new channel is a DFS
322  * channel then precac-done-list is searched and if the channel is
323  * found in the precac-done-list then the CAC is skipped.
324  * 5) The precac expiry timer makes a vedv_restart(channel change
325  * with current-upper-layer-channel-mode which is VHT80). In channel
326  * change the algorithm tries to pick a new channel from the
327  * precac-required list. If none found then channel mode remains same.
328  * Which means when all the channels in precac-required-list are
329  * exhausted the VHT80_80/VHT160 comes back to VHT80 mode.
330  */
331 #if defined(WLAN_DFS_PARTIAL_OFFLOAD) && !defined(QCA_MCL_DFS_SUPPORT)
332 void dfs_find_vht80_chan_for_precac(struct wlan_dfs *dfs,
333 		uint32_t chan_mode,
334 		uint8_t ch_freq_seg1,
335 		uint32_t *cfreq1,
336 		uint32_t *cfreq2,
337 		uint32_t *phy_mode,
338 		bool *dfs_set_cfreq2,
339 		bool *set_agile);
340 #else
341 static inline void dfs_find_vht80_chan_for_precac(struct wlan_dfs *dfs,
342 		uint32_t chan_mode,
343 		uint8_t ch_freq_seg1,
344 		uint32_t *cfreq1,
345 		uint32_t *cfreq2,
346 		uint32_t *phy_mode,
347 		bool *dfs_set_cfreq2,
348 		bool *set_agile)
349 {
350 }
351 #endif
352 
353 #if defined(QCA_SUPPORT_AGILE_DFS)
354 /**
355  * dfs_find_pdev_for_agile_precac() - Find pdev to select channel for precac.
356  * @pdev: Pointer to wlan_objmgr_pdev structure.
357  * @cur_precac_dfs_index: current precac index
358  */
359 void dfs_find_pdev_for_agile_precac(struct wlan_objmgr_pdev *pdev,
360 				    uint8_t *cur_precac_dfs_index);
361 
362 /**
363  * dfs_prepare_agile_precac_chan() - Send Agile set request for given pdev.
364  * @dfs: Pointer to wlan_dfs structure.
365  */
366 void dfs_prepare_agile_precac_chan(struct wlan_dfs *dfs);
367 
368 /**
369  * dfs_process_ocac_complete() - Process Off-Channel CAC complete indication.
370  * @pdev :Pointer to wlan_objmgr_pdev structure.
371  * @ocac_status: Off channel CAC complete status
372  * @center_freq : Center Frequency of O-CAC done indication.
373  */
374 void dfs_process_ocac_complete(struct wlan_objmgr_pdev *pdev,
375 			       uint32_t ocac_status,
376 			       uint32_t center_freq);
377 
378 /**
379  * dfs_find_vht80_chan_for_agile_precac() - .
380  * @pdev :Pointer to wlan_objmgr_pdev structure.
381  * @*ch_freq: Pointer to channel number for agile set request.
382  * @ch_freq_seg1 : Current primary beaconing channel number.
383  * @ch_freq_seg2 : Current secondary segment channel number.
384  */
385 void dfs_find_vht80_chan_for_agile_precac(struct wlan_dfs *dfs,
386 					  uint8_t *ch_freq,
387 					  uint8_t ch_freq_seg1,
388 					  uint8_t ch_freq_seg2);
389 /**
390  * dfs_agile_precac_start() - Start agile precac.
391  * @dfs: Pointer to wlan_dfs structure.
392  */
393 void dfs_agile_precac_start(struct wlan_dfs *dfs);
394 
395 /**
396  * dfs_start_agile_precac_timer() - Start precac timer.
397  * @dfs: Pointer to wlan_dfs structure.
398  * @precac_chan: Start thr precac timer in this channel.
399  * @ocac_status: Status of the off channel CAC.
400  */
401 void dfs_start_agile_precac_timer(struct wlan_dfs *dfs,
402 				  uint8_t precac_chan,
403 				  uint8_t ocac_status);
404 #else
405 static inline void dfs_find_pdev_for_agile_precac(struct wlan_objmgr_pdev *pdev,
406 						  uint8_t *cur_precac_dfs_index)
407 {
408 }
409 
410 static inline void dfs_prepare_agile_precac_chan(struct wlan_dfs *dfs)
411 {
412 }
413 
414 static inline void
415 dfs_process_ocac_complete(struct wlan_objmgr_pdev *pdev,
416 			  uint32_t ocac_status,
417 			  uint32_t center_freq)
418 {
419 }
420 
421 static inline void dfs_find_vht80_chan_for_agile_precac(struct wlan_dfs *dfs,
422 							uint8_t *ch_freq,
423 							uint8_t ch_freq_seg1,
424 							uint8_t ch_freq_seg2)
425 {
426 }
427 
428 static inline void dfs_agile_precac_start(struct wlan_dfs *dfs)
429 {
430 }
431 
432 static inline void dfs_start_agile_precac_timer(struct wlan_dfs *dfs,
433 						uint8_t precac_chan,
434 						uint8_t ocac_status)
435 {
436 }
437 #endif
438 
439 #if defined(QCA_SUPPORT_AGILE_DFS) || defined(ATH_SUPPORT_ZERO_CAC_DFS)
440 /**
441  * dfs_agile_soc_obj_init() - Initialize soc obj for agile precac.
442  * @dfs: Pointer to wlan_dfs structure.
443  * @precac_chan: Start thr precac timer in this channel.
444  * @ocac_status: Status of the off channel CAC.
445  */
446 void dfs_agile_soc_obj_init(struct wlan_dfs *dfs,
447 			    struct wlan_objmgr_psoc *psoc);
448 #else
449 static inline void dfs_agile_soc_obj_init(struct wlan_dfs *dfs,
450 					  struct wlan_objmgr_psoc *psoc)
451 {
452 }
453 #endif
454 
455 /**
456  * dfs_set_precac_enable() - Set precac enable flag.
457  * @dfs: Pointer to wlan_dfs structure.
458  * @value: input value for dfs_precac_enable flag.
459  */
460 #if defined(WLAN_DFS_PARTIAL_OFFLOAD) && !defined(QCA_MCL_DFS_SUPPORT)
461 void dfs_set_precac_enable(struct wlan_dfs *dfs,
462 		uint32_t value);
463 #else
464 static inline void dfs_set_precac_enable(struct wlan_dfs *dfs,
465 		uint32_t value)
466 {
467 }
468 #endif
469 
470 /**
471  * dfs_get_precac_enable() - Get precac enable flag.
472  * @dfs: Pointer to wlan_dfs structure.
473  */
474 #if defined(WLAN_DFS_PARTIAL_OFFLOAD) && !defined(QCA_MCL_DFS_SUPPORT)
475 uint32_t dfs_get_precac_enable(struct wlan_dfs *dfs);
476 #else
477 static inline uint32_t dfs_get_precac_enable(struct wlan_dfs *dfs)
478 {
479 	return 0;
480 }
481 #endif
482 
483 #ifdef WLAN_DFS_PRECAC_AUTO_CHAN_SUPPORT
484 /**
485  * dfs_set_precac_intermediate_chan() - Set intermediate chan to be used while
486  *                                      doing precac.
487  * @dfs: Pointer to wlan_dfs structure.
488  * @value: input value for dfs_precac_enable flag.
489  *
490  * Return:
491  * * 0       - Successfully set intermediate channel.
492  * * -EINVAL - Invalid channel.
493  */
494 int32_t dfs_set_precac_intermediate_chan(struct wlan_dfs *dfs,
495 					 uint32_t value);
496 #else
497 static inline int32_t dfs_set_precac_intermediate_chan(struct wlan_dfs *dfs,
498 						       uint32_t value)
499 {
500 	return 0;
501 }
502 #endif
503 
504 #ifdef WLAN_DFS_PRECAC_AUTO_CHAN_SUPPORT
505 /**
506  * dfs_get_precac_intermediate_chan() - Get configured precac
507  *					intermediate channel.
508  * @dfs: Pointer to wlan_dfs structure.
509  *
510  * Return: Configured intermediate channel number.
511  */
512 uint32_t dfs_get_precac_intermediate_chan(struct wlan_dfs *dfs);
513 #else
514 static inline uint32_t dfs_get_intermediate_chan(struct wlan_dfs *dfs)
515 {
516 	return 0;
517 }
518 #endif
519 
520 #ifdef WLAN_DFS_PRECAC_AUTO_CHAN_SUPPORT
521 /**
522  * dfs_get_precac_chan_state() - Get precac status of a given channel.
523  * @dfs:         Pointer to wlan_dfs structure.
524  * @precac_chan: Channel number for which precac state need to be checked.
525  *
526  * Return:
527  * * PRECAC_REQUIRED: Precac has not done on precac_chan.
528  * * PRECAC_NOW     : Precac is running on precac_chan.
529  * * PRECAC_DONE    : precac_chan is in precac done list.
530  * * PRECAC_NOL     : precac_chan is in precac NOL list.
531  * * PRECAC_ERR     : Invalid precac state.
532  */
533 enum precac_chan_state
534 dfs_get_precac_chan_state(struct wlan_dfs *dfs, uint8_t precac_chan);
535 #else
536 static inline enum precac_chan_state
537 dfs_get_precac_chan_state(struct wlan_dfs *dfs,
538 			  uint8_t precac_chan)
539 {
540 	return PRECAC_REQUIRED;
541 }
542 #endif
543 
544 /**
545  * dfs_zero_cac_reset() - Reset Zero cac DFS variables.
546  * @dfs: Pointer to wlan_dfs structure.
547  */
548 void dfs_zero_cac_reset(struct wlan_dfs *dfs);
549 
550 /**
551  * dfs_is_ht20_40_80_chan_in_precac_done_list() - Is precac done on a
552  *                                                VHT20/40/80 channel.
553  *@dfs: Pointer to wlan_dfs structure.
554  *@chan: Pointer to dfs_channel for which preCAC done is checked.
555  *
556  * Return:
557  * * True:  If channel is present in precac-done list.
558  * * False: If channel is not present in precac-done list.
559  */
560 bool dfs_is_ht20_40_80_chan_in_precac_done_list(struct wlan_dfs *dfs,
561 						struct dfs_channel *chan);
562 
563 /**
564  * dfs_is_ht8080_ht160_chan_in_precac_done_list() - Is precac done on
565  *                                                  VHT80+80 or VHT160
566  *                                                  channel.
567  * @dfs: Pointer to wlan_dfs structure.
568  * @chan: Pointer to dfs_channel for which preCAC done is checked.
569  *
570  * Return:
571  * * True:  If channel is present in precac-done list.
572  * * False: If channel is not present in precac-done list.
573  */
574 bool dfs_is_ht8080_ht160_chan_in_precac_done_list(struct wlan_dfs *dfs,
575 						  struct dfs_channel *chan);
576 
577 /**
578  * dfs_mark_precac_dfs() - Mark the precac channel as radar.
579  * @dfs: Pointer to wlan_dfs structure.
580  * @is_radar_found_on_secondary_seg: Radar found on secondary seg for Cascade.
581  * @detector_id: detector id which found RADAR in HW.
582  */
583 #if defined(WLAN_DFS_PARTIAL_OFFLOAD) && !defined(QCA_MCL_DFS_SUPPORT)
584 void dfs_mark_precac_dfs(struct wlan_dfs *dfs,
585 		uint8_t is_radar_found_on_secondary_seg,
586 		uint8_t detector_id);
587 #else
588 static inline void dfs_mark_precac_dfs(struct wlan_dfs *dfs,
589 		uint8_t is_radar_found_on_secondary_seg,
590 		uint8_t detector_id)
591 {
592 }
593 #endif
594 
595 /**
596  * dfs_is_precac_timer_running() - Check whether precac timer is running.
597  * @dfs: Pointer to wlan_dfs structure.
598  */
599 #if defined(WLAN_DFS_PARTIAL_OFFLOAD) && !defined(QCA_MCL_DFS_SUPPORT)
600 bool dfs_is_precac_timer_running(struct wlan_dfs *dfs);
601 #else
602 static inline bool dfs_is_precac_timer_running(struct wlan_dfs *dfs)
603 {
604 	return false;
605 }
606 #endif
607 #endif /* _DFS_ZERO_CAC_H_ */
608