1 /*
2 * Copyright (c) 2016-2021 The Linux Foundation. All rights reserved.
3 * Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved.
4 * Copyright (c) 2007-2008 Sam Leffler, Errno Consulting
5 * All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
9 * are met:
10 * 1. Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in the
14 * documentation and/or other materials provided with the distribution.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
17 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
18 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
19 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
20 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
21 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
22 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
23 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
25 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */
27
28 /**
29 * DOC: This file has Zero CAC DFS APIs.
30 */
31
32 #ifndef _DFS_ZERO_CAC_H_
33 #define _DFS_ZERO_CAC_H_
34
35 #include "dfs.h"
36 #include <wlan_dfs_tgt_api.h>
37
38 #ifdef WLAN_FEATURE_11BE
39 #define TREE_DEPTH_320 5
40 #define TREE_DEPTH_MAX TREE_DEPTH_320
41 #else
42 #define TREE_DEPTH_MAX TREE_DEPTH_160
43 #endif
44
45 #define TREE_DEPTH_160 4
46 #define TREE_DEPTH_80 3
47 #define TREE_DEPTH_40 2
48 #define TREE_DEPTH_20 1
49 #define N_SUBCHANS_FOR_80BW 4
50 #define N_SUBCHANS_FOR_160BW 8
51
52 #define INITIAL_20_CHAN_OFFSET -6
53 #define INITIAL_40_CHAN_OFFSET -4
54 #define INITIAL_80_CHAN_OFFSET 0
55
56 #define NEXT_20_CHAN_OFFSET 4
57 #define NEXT_40_CHAN_OFFSET 8
58 #define NEXT_80_CHAN_OFFSET 16
59
60 #define DFS_CHWIDTH_20_VAL 20
61 #define DFS_CHWIDTH_40_VAL 40
62 #define DFS_CHWIDTH_80_VAL 80
63 #define DFS_CHWIDTH_160_VAL 160
64 #define DFS_CHWIDTH_165_VAL 165
65 #define DFS_CHWIDTH_240_VAL 240
66 #define DFS_CHWIDTH_320_VAL 320
67
68 #define WEATHER_CHAN_START 120
69 #define WEATHER_CHAN_END 128
70
71 /* PreCAC timeout durations in ms. */
72 #define MIN_PRECAC_DURATION (6 * 60 * 1000) /* 6 mins */
73 #define MIN_WEATHER_PRECAC_DURATION (60 * 60 * 1000) /* 1 hour */
74 #define MAX_PRECAC_DURATION (4 * 60 * 60 * 1000) /* 4 hours */
75 #define MAX_WEATHER_PRECAC_DURATION (24 * 60 * 60 * 1000) /* 24 hours */
76 #define MIN_RCAC_DURATION (62 * 1000) /* 62 seconds */
77 #define MAX_RCAC_DURATION 0xffffffff
78
79 #define PCAC_DFS_INDEX_ZERO 0
80 #define PCAC_TIMER_NOT_RUNNING 0
81 #define PRECAC_NOT_STARTED 0
82
83 /* While building precac tree, the center of the 165MHz channel or the
84 * restricted 80p80 channel(which includes channels 132, 136, 140, 144,
85 * 149, 153, 157 and 161) is assumed to be 146(center channel) or
86 * 5730(center frequency).
87 */
88 #define RESTRICTED_80P80_CHAN_CENTER_FREQ 5730
89 #define RESTRICTED_80P80_LEFT_80_CENTER_CHAN 138
90 #define RESTRICTED_80P80_RIGHT_80_CENTER_CHAN 155
91 #define RESTRICTED_80P80_LEFT_80_CENTER_FREQ 5690
92 #define RESTRICTED_80P80_RIGHT_80_CENTER_FREQ 5775
93
94 /* While building the precac tree with 320 MHz root, the center of the
95 * right side 160 MHz channel(which includes real IEEE channels 132, 136,
96 * 140, 144 and pseudo IEEE channels 148, 152, 156, 160)
97 */
98 #define CENTER_OF_320_MHZ 5650
99 #define CENTER_OF_PSEUDO_160 5730
100 #define LAST_20_CENTER_OF_FIRST_160 5320
101 #define FIRST_20_CENTER_OF_LAST_80 5745
102
103 /* Depth of the tree of a given bandwidth. */
104 #define DEPTH_320_ROOT 0
105 #define DEPTH_160_ROOT 1
106 #define DEPTH_80_ROOT 2
107 #define DEPTH_40_ROOT 3
108 #define DEPTH_20_ROOT 4
109
110 #ifdef QCA_DFS_BW_EXPAND
111 /* Column of the phymode_decoupler array */
112 enum phymode_decoupler_col {
113 CH_WIDTH_COL = 1
114 };
115 #endif /* QCA_DFS_BW_EXPAND */
116
117 /**
118 * struct precac_tree_node - Individual tree node structure for every node in
119 * the precac forest maintained.
120 * @left_child: Pointer to the left child of the node.
121 * @right_child: Pointer to the right child of the node.
122 * @ch_ieee: Center channel ieee value.
123 * @ch_freq: Center channel frequency value (BSTree node key value).
124 * @n_caced_subchs: Number of CACed subchannels of the ch_ieee.
125 * @n_nol_subchs: Number of subchannels of the ch_ieee in NOL.
126 * @n_valid_subchs: Number of subchannels of the ch_ieee available (as per
127 * the country's channel list).
128 * @bandwidth: Bandwidth of the ch_ieee (in the current node).
129 * @depth: Depth of the precac tree node.
130 */
131 struct precac_tree_node {
132 struct precac_tree_node *left_child;
133 struct precac_tree_node *right_child;
134 uint8_t ch_ieee;
135 uint8_t n_caced_subchs;
136 uint8_t n_nol_subchs;
137 uint8_t n_valid_subchs;
138 uint8_t depth;
139 uint16_t bandwidth;
140 uint16_t ch_freq;
141 };
142
143 /**
144 * enum precac_chan_state - Enum for PreCAC state of a channel.
145 * @PRECAC_ERR: Invalid preCAC state.
146 * @PRECAC_REQUIRED: preCAC need to be done on the channel.
147 * @PRECAC_NOW: preCAC is running on the channel.
148 * @PRECAC_DONE: preCAC is done and channel is clear.
149 * @PRECAC_NOL: preCAC is done and radar is detected.
150 */
151 enum precac_chan_state {
152 PRECAC_ERR = -1,
153 PRECAC_REQUIRED,
154 PRECAC_NOW,
155 PRECAC_DONE,
156 PRECAC_NOL,
157 };
158
159 /**
160 * struct dfs_precac_entry - PreCAC entry.
161 * @pe_list: PreCAC entry.
162 * @vht80_ch_ieee: VHT80 centre channel IEEE value.
163 * @vht80_ch_freq: VHT80 centre channel frequency value.
164 * @center_ch_ieee: Center channel IEEE value of given bandwidth 20/40/80/
165 * 160. For 165MHz channel, the value is 146.
166 * @center_ch_freq: Center frequency of given bandwidth 20/40/80/160. For
167 * 165MHz channel, the value is 5730.
168 * @bw: Bandwidth of the precac entry.
169 * @dfs: Pointer to wlan_dfs structure.
170 * @tree_root: Tree root node with 80MHz channel key.
171 * @non_dfs_subch_count: Number of non DFS subchannels in the entry.
172 */
173 struct dfs_precac_entry {
174 TAILQ_ENTRY(dfs_precac_entry) pe_list;
175 uint8_t vht80_ch_ieee;
176 uint16_t vht80_ch_freq;
177 uint8_t center_ch_ieee;
178 uint16_t center_ch_freq;
179 uint16_t bw;
180 struct wlan_dfs *dfs;
181 struct precac_tree_node *tree_root;
182 uint8_t non_dfs_subch_count;
183 };
184
185 /**
186 * dfs_zero_cac_timer_init() - Initialize zero-cac timers
187 * @dfs_soc_obj: Pointer to DFS SOC object structure.
188 */
189 #if defined(ATH_SUPPORT_ZERO_CAC_DFS) && !defined(MOBILE_DFS_SUPPORT)
190 void dfs_zero_cac_timer_init(struct dfs_soc_priv_obj *dfs_soc_obj);
191 #else
192 static inline void
dfs_zero_cac_timer_init(struct dfs_soc_priv_obj * dfs_soc_obj)193 dfs_zero_cac_timer_init(struct dfs_soc_priv_obj *dfs_soc_obj)
194 {
195 }
196 #endif
197 /**
198 * dfs_print_precaclists() - Print precac list.
199 * @dfs: Pointer to wlan_dfs structure.
200 */
201 #if !defined(MOBILE_DFS_SUPPORT) && (defined(ATH_SUPPORT_ZERO_CAC_DFS) || \
202 defined(QCA_SUPPORT_AGILE_DFS))
203 void dfs_print_precaclists(struct wlan_dfs *dfs);
204 #else
dfs_print_precaclists(struct wlan_dfs * dfs)205 static inline void dfs_print_precaclists(struct wlan_dfs *dfs)
206 {
207 }
208 #endif
209
210 /**
211 * dfs_reset_precac_lists() - Resets the precac lists.
212 * @dfs: Pointer to wlan_dfs structure.
213 */
214 #if !defined(MOBILE_DFS_SUPPORT) && (defined(ATH_SUPPORT_ZERO_CAC_DFS) || \
215 defined(QCA_SUPPORT_AGILE_DFS))
216 void dfs_reset_precac_lists(struct wlan_dfs *dfs);
217 #else
dfs_reset_precac_lists(struct wlan_dfs * dfs)218 static inline void dfs_reset_precac_lists(struct wlan_dfs *dfs)
219 {
220 }
221 #endif
222
223 /**
224 * dfs_reset_precaclists() - Clears and initializes precac_list.
225 * @dfs: Pointer to wlan_dfs structure.
226 */
227 #if !defined(MOBILE_DFS_SUPPORT) && (defined(ATH_SUPPORT_ZERO_CAC_DFS) || \
228 defined(QCA_SUPPORT_AGILE_DFS))
229 void dfs_reset_precaclists(struct wlan_dfs *dfs);
230 #else
dfs_reset_precaclists(struct wlan_dfs * dfs)231 static inline void dfs_reset_precaclists(struct wlan_dfs *dfs)
232 {
233 }
234 #endif
235
236 /**
237 * dfs_deinit_precac_list() - Clears the precac list.
238 * @dfs: Pointer to wlan_dfs dtructure.
239 */
240 void dfs_deinit_precac_list(struct wlan_dfs *dfs);
241
242 /**
243 * dfs_zero_cac_detach() - Free zero_cac memory.
244 * @dfs: Pointer to wlan_dfs dtructure.
245 */
246 #if !defined(MOBILE_DFS_SUPPORT) && defined(ATH_SUPPORT_ZERO_CAC_DFS)
247 void dfs_zero_cac_detach(struct wlan_dfs *dfs);
248 #else
dfs_zero_cac_detach(struct wlan_dfs * dfs)249 static inline void dfs_zero_cac_detach(struct wlan_dfs *dfs)
250 {
251 }
252 #endif
253
254 /**
255 * dfs_init_precac_list() - Init precac list.
256 * @dfs: Pointer to wlan_dfs dtructure.
257 */
258 void dfs_init_precac_list(struct wlan_dfs *dfs);
259
260 #if !defined(MOBILE_DFS_SUPPORT) && (defined(ATH_SUPPORT_ZERO_CAC_DFS) || \
261 defined(QCA_SUPPORT_AGILE_DFS))
262 /**
263 * dfs_start_precac_timer_for_freq() - Start precac timer.
264 * @dfs: Pointer to wlan_dfs structure.
265 * @precac_chan_freq: Frequency to start precac timer.
266 */
267 #ifdef CONFIG_CHAN_FREQ_API
268 void dfs_start_precac_timer_for_freq(struct wlan_dfs *dfs,
269 uint16_t precac_chan_freq);
270 #endif
271 #else
272 #ifdef CONFIG_CHAN_FREQ_API
273 static inline
dfs_start_precac_timer_for_freq(struct wlan_dfs * dfs,uint16_t precac_chan_freq)274 void dfs_start_precac_timer_for_freq(struct wlan_dfs *dfs,
275 uint16_t precac_chan_freq)
276 {
277 }
278 #endif
279 #endif
280
281 /**
282 * dfs_cancel_precac_timer() - Cancel the precac timer.
283 * @dfs: Pointer to wlan_dfs structure.
284 */
285 #if !defined(MOBILE_DFS_SUPPORT) && defined(ATH_SUPPORT_ZERO_CAC_DFS)
286 void dfs_cancel_precac_timer(struct wlan_dfs *dfs);
287 #else
dfs_cancel_precac_timer(struct wlan_dfs * dfs)288 static inline void dfs_cancel_precac_timer(struct wlan_dfs *dfs)
289 {
290 }
291 #endif
292
293 /**
294 * dfs_zero_cac_attach() - Initialize dfs zerocac variables.
295 * @dfs: Pointer to DFS structure.
296 */
297 #if !defined(MOBILE_DFS_SUPPORT) && defined(ATH_SUPPORT_ZERO_CAC_DFS)
298 void dfs_zero_cac_attach(struct wlan_dfs *dfs);
299 #else
dfs_zero_cac_attach(struct wlan_dfs * dfs)300 static inline void dfs_zero_cac_attach(struct wlan_dfs *dfs)
301 {
302 }
303 #endif
304
305 /**
306 * dfs_zero_cac_reset() - Reset Zero cac DFS variables.
307 * @dfs: Pointer to wlan_dfs structure.
308 */
309 #if !defined(MOBILE_DFS_SUPPORT) && defined(ATH_SUPPORT_ZERO_CAC_DFS)
310 void dfs_zero_cac_reset(struct wlan_dfs *dfs);
311 #else
dfs_zero_cac_reset(struct wlan_dfs * dfs)312 static inline void dfs_zero_cac_reset(struct wlan_dfs *dfs)
313 {
314 }
315 #endif
316
317 /**
318 * dfs_zero_cac_timer_detach() - Free Zero cac DFS variables.
319 * @dfs_soc_obj: Pointer to dfs_soc_priv_obj structure.
320 */
321 #if defined(ATH_SUPPORT_ZERO_CAC_DFS) && !defined(MOBILE_DFS_SUPPORT)
322 void dfs_zero_cac_timer_detach(struct dfs_soc_priv_obj *dfs_soc_obj);
323 #else
324 static inline void
dfs_zero_cac_timer_detach(struct dfs_soc_priv_obj * dfs_soc_obj)325 dfs_zero_cac_timer_detach(struct dfs_soc_priv_obj *dfs_soc_obj)
326 {
327 }
328 #endif
329
330 /**
331 * dfs_is_precac_done() - Is precac done.
332 * @dfs: Pointer to wlan_dfs structure.
333 * @chan: Pointer to dfs_channel for which preCAC done is checked.
334 *
335 * Return:
336 * * True: If precac is done on channel.
337 * * False: If precac is not done on channel.
338 */
339 #if !defined(MOBILE_DFS_SUPPORT) && (defined(ATH_SUPPORT_ZERO_CAC_DFS) || \
340 defined(QCA_SUPPORT_AGILE_DFS))
341 bool dfs_is_precac_done(struct wlan_dfs *dfs, struct dfs_channel *chan);
342 #else
dfs_is_precac_done(struct wlan_dfs * dfs,struct dfs_channel * chan)343 static inline bool dfs_is_precac_done(struct wlan_dfs *dfs,
344 struct dfs_channel *chan)
345 {
346 return false;
347 }
348 #endif
349
350 #ifdef WLAN_DFS_PRECAC_AUTO_CHAN_SUPPORT
351 /**
352 * dfs_decide_precac_preferred_chan_for_freq() - Choose operating channel among
353 * configured DFS channel and
354 * intermediate channel based on
355 * precac status of configured
356 * DFS channel.
357 * @dfs: Pointer to wlan_dfs structure.
358 * @pref_chan_freq: Configured DFS channel frequency
359 * @mode: Configured PHY mode.
360 *
361 * Return: True if intermediate channel needs to configure. False otherwise.
362 */
363
364 #ifdef CONFIG_CHAN_FREQ_API
365 bool
366 dfs_decide_precac_preferred_chan_for_freq(struct wlan_dfs *dfs,
367 uint16_t *pref_chan_freq,
368 enum wlan_phymode mode);
369 #endif
370 #else
371 #ifdef CONFIG_CHAN_FREQ_API
372 static inline void
dfs_decide_precac_preferred_chan_for_freq(struct wlan_dfs * dfs,uint8_t * pref_chan,enum wlan_phymode mode)373 dfs_decide_precac_preferred_chan_for_freq(struct wlan_dfs *dfs,
374 uint8_t *pref_chan,
375 enum wlan_phymode mode)
376 {
377 }
378 #endif
379 #endif
380
381 /**
382 * dfs_get_ieeechan_for_precac_for_freq() - Get chan of required bandwidth from
383 * precac_list.
384 * @dfs: Pointer to wlan_dfs structure.
385 * @exclude_pri_chan_freq: Primary channel freq to be excluded for preCAC.
386 * @exclude_sec_chan_freq: Secondary channel freq to be excluded for preCAC.
387 * @bandwidth: Bandwidth of requested channel.
388 */
389 #ifdef CONFIG_CHAN_FREQ_API
390 uint16_t dfs_get_ieeechan_for_precac_for_freq(struct wlan_dfs *dfs,
391 uint16_t exclude_pri_chan_freq,
392 uint16_t exclude_sec_chan_freq,
393 uint16_t bandwidth);
394 #endif
395
396 /**
397 * dfs_override_precac_timeout() - Override the default precac timeout.
398 * @dfs: Pointer to wlan_dfs structure.
399 * @precac_timeout: Precac timeout value.
400 */
401 #if !defined(MOBILE_DFS_SUPPORT) && (defined(ATH_SUPPORT_ZERO_CAC_DFS) || \
402 defined(QCA_SUPPORT_AGILE_DFS))
403 int dfs_override_precac_timeout(struct wlan_dfs *dfs,
404 int precac_timeout);
405 #else
dfs_override_precac_timeout(struct wlan_dfs * dfs,int precac_timeout)406 static inline int dfs_override_precac_timeout(struct wlan_dfs *dfs,
407 int precac_timeout)
408 {
409 return 0;
410 }
411 #endif
412
413 /**
414 * dfs_get_override_precac_timeout() - Get precac timeout.
415 * @dfs: Pointer wlan_dfs structure.
416 * @precac_timeout: Get precac timeout value in this variable.
417 */
418 #if !defined(MOBILE_DFS_SUPPORT) && (defined(ATH_SUPPORT_ZERO_CAC_DFS) || \
419 defined(QCA_SUPPORT_AGILE_DFS))
420 int dfs_get_override_precac_timeout(struct wlan_dfs *dfs,
421 int *precac_timeout);
422 #else
dfs_get_override_precac_timeout(struct wlan_dfs * dfs,int * precac_timeout)423 static inline int dfs_get_override_precac_timeout(struct wlan_dfs *dfs,
424 int *precac_timeout)
425 {
426 return 0;
427 }
428 #endif
429
430 #if defined(QCA_SUPPORT_AGILE_DFS)
431 /**
432 * dfs_find_pdev_for_agile_precac() - Find pdev to select channel for precac.
433 * @pdev: Pointer to wlan_objmgr_pdev structure.
434 * @cur_agile_dfs_index: current agile dfs index
435 */
436 void dfs_find_pdev_for_agile_precac(struct wlan_objmgr_pdev *pdev,
437 uint8_t *cur_agile_dfs_index);
438
439 /**
440 * dfs_prepare_agile_precac_chan() - Send Agile set request for given pdev.
441 * @dfs: Pointer to wlan_dfs structure.
442 * @is_chan_found: True if a channel is available for PreCAC, false otherwise.
443 */
444 void dfs_prepare_agile_precac_chan(struct wlan_dfs *dfs, bool *is_chan_found);
445
446 /**
447 * dfs_process_ocac_complete() - Process Off-Channel CAC complete indication.
448 * @pdev :Pointer to wlan_objmgr_pdev structure.
449 * @ocac_status: Off channel CAC complete status
450 * @center_freq1 : For 20/40/80/160Mhz, it is the center of the corresponding
451 * band. For 80P80/165MHz, it is the center of the left 80MHz.
452 * @center_freq2 : It is valid and non-zero only for 80P80/165MHz. It indicates
453 * the Center Frequency of the right 80MHz segment.
454 * @chwidth : Width of the channel for which OCAC completion is received.
455 */
456 void dfs_process_ocac_complete(struct wlan_objmgr_pdev *pdev,
457 enum ocac_status_type ocac_status,
458 uint32_t center_freq1,
459 uint32_t center_freq2,
460 enum phy_ch_width chwidth);
461
462 /*
463 * dfs_is_ocac_complete_event_for_cur_agile_chan() - Check if the OCAC
464 * completion event from FW is received for the currently configured agile
465 * channel in host.
466 *
467 * @dfs: Pointer to dfs structure.
468 * @center_freq_mhz1: Center frequency of the band when the precac width is
469 * 20/40/80/160MHz and center frequency of the left 80MHz in case of restricted
470 * 80P80/165MHz.
471 * @center_freq_mhz2: Center frequency of the right 80MHz in case of restricted
472 * 80P80/165MHz. It is zero for other channel widths.
473 * @chwidth: Agile channel width for which the completion event is received.
474 *
475 * return: True if the channel on which OCAC completion event received is same
476 * as currently configured agile channel in host. False otherwise.
477 */
478 bool dfs_is_ocac_complete_event_for_cur_agile_chan(struct wlan_dfs *dfs);
479 /**
480 * dfs_set_agilecac_chan_for_freq() - Find chan freq for agile CAC.
481 * @dfs: Pointer to wlan_dfs structure.
482 * @chan_freq: Pointer to channel freq for agile set request.
483 * @pri_chan_freq: Current primary IEEE channel freq.
484 * @sec_chan_freq: Current secondary IEEE channel freq (in HT80_80 mode).
485 *
486 * Find an IEEE channel freq for agileCAC which is not the current operating
487 * channels (indicated by pri_chan_freq, sec_chan_freq).
488 */
489 #ifdef CONFIG_CHAN_FREQ_API
490 void dfs_set_agilecac_chan_for_freq(struct wlan_dfs *dfs,
491 uint16_t *chan_freq,
492 uint16_t pri_chan_freq,
493 uint16_t sec_chan_freq);
494 #endif
495
496 /**
497 * dfs_compute_agile_and_curchan_width() - Compute the agile/current channel
498 * width from dfs structure.
499 * @dfs: Pointer to wlan_dfs structure.
500 * @agile_ch_width: Agile channel width.
501 * @cur_ch_width: Current home channel width.
502 */
503 void
504 dfs_compute_agile_and_curchan_width(struct wlan_dfs *dfs,
505 enum phy_ch_width *agile_ch_width,
506 enum phy_ch_width *cur_ch_width);
507
508 /**
509 * dfs_agile_precac_start() - Start agile precac.
510 * @dfs: Pointer to wlan_dfs structure.
511 */
512 void dfs_agile_precac_start(struct wlan_dfs *dfs);
513
514 /**
515 * dfs_start_agile_precac_timer() - Start precac timer for the given channel.
516 * @dfs: Pointer to wlan_dfs structure.
517 * @ocac_status: Status of the off channel CAC.
518 * @adfs_param: Agile DFS CAC parameters.
519 *
520 * Start the precac timer with proper timeout values based on the channel to
521 * be preCACed. The preCAC channel number and chwidth information is present
522 * in the adfs_param argument. Once the timer is started, update the timeout
523 * fields in adfs_param.
524 */
525 void dfs_start_agile_precac_timer(struct wlan_dfs *dfs,
526 enum ocac_status_type ocac_status,
527 struct dfs_agile_cac_params *adfs_param);
528
529 /**
530 * dfs_set_fw_adfs_support() - Set FW aDFS support in dfs object.
531 * @dfs: Pointer to wlan_dfs structure.
532 * @fw_adfs_support_160: aDFS enabled when pdev is on 160/80P80MHz.
533 * @fw_adfs_support_non_160: aDFS enabled when pdev is on 20/40/80MHz.
534 * @fw_adfs_support_320: aDFS enabled when pdev is on 320 MHz.
535 *
536 * Return: void.
537 */
538 void dfs_set_fw_adfs_support(struct wlan_dfs *dfs,
539 bool fw_adfs_support_160,
540 bool fw_adfs_support_non_160,
541 bool fw_adfs_support_320);
542 #else
dfs_find_pdev_for_agile_precac(struct wlan_objmgr_pdev * pdev,uint8_t * cur_agile_dfs_index)543 static inline void dfs_find_pdev_for_agile_precac(struct wlan_objmgr_pdev *pdev,
544 uint8_t *cur_agile_dfs_index)
545 {
546 }
547
dfs_prepare_agile_precac_chan(struct wlan_dfs * dfs,bool * is_chan_found)548 static inline void dfs_prepare_agile_precac_chan(struct wlan_dfs *dfs,
549 bool *is_chan_found)
550 {
551 }
552
553 static inline void
dfs_process_ocac_complete(struct wlan_objmgr_pdev * pdev,enum ocac_status_type ocac_status,uint32_t center_freq1,uint32_t center_freq2,enum phy_ch_width chwidth)554 dfs_process_ocac_complete(struct wlan_objmgr_pdev *pdev,
555 enum ocac_status_type ocac_status,
556 uint32_t center_freq1,
557 uint32_t center_freq2,
558 enum phy_ch_width chwidth)
559 {
560 }
561
562 static inline bool
dfs_is_ocac_complete_event_for_cur_agile_chan(struct wlan_dfs * dfs)563 dfs_is_ocac_complete_event_for_cur_agile_chan(struct wlan_dfs *dfs)
564 {
565 return false;
566 }
567
568 #ifdef CONFIG_CHAN_FREQ_API
569 static inline void
dfs_set_agilecac_chan_for_freq(struct wlan_dfs * dfs,uint16_t * chan_freq,uint16_t pri_chan_freq,uint16_t sec_chan_freq)570 dfs_set_agilecac_chan_for_freq(struct wlan_dfs *dfs,
571 uint16_t *chan_freq,
572 uint16_t pri_chan_freq,
573 uint16_t sec_chan_freq)
574 {
575 }
576 #endif
577
578 static inline void
dfs_compute_agile_and_curchan_width(struct wlan_dfs * dfs,enum phy_ch_width * agile_ch_width,enum phy_ch_width * cur_ch_width)579 dfs_compute_agile_and_curchan_width(struct wlan_dfs *dfs,
580 enum phy_ch_width *agile_ch_width,
581 enum phy_ch_width *cur_ch_width)
582 {
583 }
584
dfs_agile_precac_start(struct wlan_dfs * dfs)585 static inline void dfs_agile_precac_start(struct wlan_dfs *dfs)
586 {
587 }
588
589 static inline void
dfs_start_agile_precac_timer(struct wlan_dfs * dfs,enum ocac_status_type ocac_status,struct dfs_agile_cac_params * adfs_param)590 dfs_start_agile_precac_timer(struct wlan_dfs *dfs,
591 enum ocac_status_type ocac_status,
592 struct dfs_agile_cac_params *adfs_param)
593 {
594 }
595
596 static inline void
dfs_set_fw_adfs_support(struct wlan_dfs * dfs,bool fw_adfs_support_160,bool fw_adfs_support_non_160,bool fw_adfs_support_320)597 dfs_set_fw_adfs_support(struct wlan_dfs *dfs,
598 bool fw_adfs_support_160,
599 bool fw_adfs_support_non_160,
600 bool fw_adfs_support_320)
601 {
602 }
603 #endif
604
605 #if defined(QCA_SUPPORT_AGILE_DFS) || defined(ATH_SUPPORT_ZERO_CAC_DFS)
606 /**
607 * dfs_agile_soc_obj_init() - Initialize soc obj for agile precac.
608 * @dfs: Pointer to wlan_dfs structure.
609 * @psoc: Pointer to psoc object
610 */
611 void dfs_agile_soc_obj_init(struct wlan_dfs *dfs,
612 struct wlan_objmgr_psoc *psoc);
613 #else
dfs_agile_soc_obj_init(struct wlan_dfs * dfs,struct wlan_objmgr_psoc * psoc)614 static inline void dfs_agile_soc_obj_init(struct wlan_dfs *dfs,
615 struct wlan_objmgr_psoc *psoc)
616 {
617 }
618 #endif
619
620 /**
621 * dfs_set_precac_enable() - Set precac enable flag.
622 * @dfs: Pointer to wlan_dfs structure.
623 * @value: input value for dfs_legacy_precac_ucfg flag.
624 */
625 #if !defined(MOBILE_DFS_SUPPORT) && (defined(ATH_SUPPORT_ZERO_CAC_DFS) || \
626 defined(QCA_SUPPORT_AGILE_DFS))
627 void dfs_set_precac_enable(struct wlan_dfs *dfs,
628 uint32_t value);
629 #else
dfs_set_precac_enable(struct wlan_dfs * dfs,uint32_t value)630 static inline void dfs_set_precac_enable(struct wlan_dfs *dfs,
631 uint32_t value)
632 {
633 }
634 #endif
635
636 /**
637 * dfs_is_agile_precac_enabled() - Check if agile preCAC is enabled for the DFS.
638 * @dfs: Pointer to the wlan_dfs object.
639 *
640 * Return: True if agile DFS is enabled, else false.
641 *
642 * For agile preCAC to be enabled,
643 * 1. User configuration should be set.
644 * 2. Target should support aDFS.
645 */
646 #ifdef QCA_SUPPORT_AGILE_DFS
647 bool dfs_is_agile_precac_enabled(struct wlan_dfs *dfs);
648 #else
dfs_is_agile_precac_enabled(struct wlan_dfs * dfs)649 static inline bool dfs_is_agile_precac_enabled(struct wlan_dfs *dfs)
650 {
651 return false;
652 }
653 #endif
654
655 /**
656 * dfs_is_precac_domain() - Check if current DFS domain supports preCAC.
657 * @dfs: Pointer to the wlan_dfs object.
658 *
659 * Return: True if current DFS domain supports preCAC, else false.
660 *
661 * preCAC is currently supported in,
662 * 1. ETSI domain.
663 *
664 */
665 #if defined(QCA_SUPPORT_AGILE_DFS) || defined(ATH_SUPPORT_ZERO_CAC_DFS)
666 bool dfs_is_precac_domain(struct wlan_dfs *dfs);
667 #else
dfs_is_precac_domain(struct wlan_dfs * dfs)668 static inline bool dfs_is_precac_domain(struct wlan_dfs *dfs)
669 {
670 return false;
671 }
672 #endif
673
674 /**
675 * dfs_is_rcac_domain() - Check if current DFS domain supports agile RCAC.
676 * @dfs: Pointer to the wlan_dfs object.
677 *
678 * Return: True if current DFS domain supports RCAC, else false.
679 *
680 * preCAC is currently supported in,
681 * 1. FCC domain.
682 * 2. MKK domain.
683 * 3. MKKN domain.
684 *
685 */
686 #if defined(QCA_SUPPORT_ADFS_RCAC)
687 bool dfs_is_rcac_domain(struct wlan_dfs *dfs);
688 #else
dfs_is_rcac_domain(struct wlan_dfs * dfs)689 static inline bool dfs_is_rcac_domain(struct wlan_dfs *dfs)
690 {
691 return false;
692 }
693 #endif
694
695 #ifdef WLAN_DFS_PRECAC_AUTO_CHAN_SUPPORT
696 /**
697 * dfs_set_precac_intermediate_chan() - Set intermediate chan to be used while
698 * doing precac.
699 * @dfs: Pointer to wlan_dfs structure.
700 * @value: input value for dfs_legacy_precac_ucfg flag.
701 *
702 * Return:
703 * * 0 - Successfully set intermediate channel.
704 * * -EINVAL - Invalid channel.
705 */
706 int32_t dfs_set_precac_intermediate_chan(struct wlan_dfs *dfs,
707 uint32_t value);
708 #else
dfs_set_precac_intermediate_chan(struct wlan_dfs * dfs,uint32_t value)709 static inline int32_t dfs_set_precac_intermediate_chan(struct wlan_dfs *dfs,
710 uint32_t value)
711 {
712 return 0;
713 }
714 #endif
715
716 #ifdef WLAN_DFS_PRECAC_AUTO_CHAN_SUPPORT
717 /**
718 * dfs_get_precac_intermediate_chan() - Get configured precac
719 * intermediate channel.
720 * @dfs: Pointer to wlan_dfs structure.
721 *
722 * Return: Configured intermediate channel number.
723 */
724 uint32_t dfs_get_precac_intermediate_chan(struct wlan_dfs *dfs);
725 #else
dfs_get_intermediate_chan(struct wlan_dfs * dfs)726 static inline uint32_t dfs_get_intermediate_chan(struct wlan_dfs *dfs)
727 {
728 return 0;
729 }
730 #endif
731
732 #ifdef WLAN_DFS_PRECAC_AUTO_CHAN_SUPPORT
733
734 /**
735 * dfs_get_precac_chan_state_for_freq() - Get precac status of a given channel.
736 * @dfs: Pointer to wlan_dfs structure.
737 * @precac_chan_freq: Channel freq for which precac state need to be checked.
738 */
739
740 #ifdef CONFIG_CHAN_FREQ_API
741 enum precac_chan_state
742 dfs_get_precac_chan_state_for_freq(struct wlan_dfs *dfs,
743 uint16_t precac_chan_freq);
744 #endif
745
746 #else
747 #ifdef CONFIG_CHAN_FREQ_API
748 static inline enum precac_chan_state
dfs_get_precac_chan_state_for_freq(struct wlan_dfs * dfs,uint16_t precac_chan_freq)749 dfs_get_precac_chan_state_for_freq(struct wlan_dfs *dfs,
750 uint16_t precac_chan_freq)
751 {
752 return PRECAC_REQUIRED;
753 }
754 #endif
755 #endif
756
757 /**
758 * dfs_reinit_precac_lists() - Reinit DFS preCAC lists.
759 * @src_dfs: Source DFS from which the preCAC list is copied.
760 * @dest_dfs: Destination DFS to which the preCAC list is copied.
761 * @low_5g_freq: Low 5G frequency value of the destination DFS.
762 * @high_5g_freq: High 5G frequency value of the destination DFS.
763 *
764 * Copy all the preCAC list entries from the source DFS to the destination DFS
765 * which fall within the frequency range of low_5g_freq and high_5g_freq.
766 *
767 * Return: None (void).
768 */
769 #if !defined(MOBILE_DFS_SUPPORT) && (defined(ATH_SUPPORT_ZERO_CAC_DFS) || \
770 defined(QCA_SUPPORT_AGILE_DFS))
771 void dfs_reinit_precac_lists(struct wlan_dfs *src_dfs,
772 struct wlan_dfs *dest_dfs,
773 uint16_t low_5g_freq,
774 uint16_t high_5g_freq);
775 #else
dfs_reinit_precac_lists(struct wlan_dfs * src_dfs,struct wlan_dfs * dest_dfs,uint16_t low_5g_freq,uint16_t high_5g_freq)776 static inline void dfs_reinit_precac_lists(struct wlan_dfs *src_dfs,
777 struct wlan_dfs *dest_dfs,
778 uint16_t low_5g_freq,
779 uint16_t high_5g_freq)
780 {
781 }
782 #endif
783
784 /**
785 * dfs_is_precac_done_on_non_80p80_chan_for_freq() - Is precac done on
786 * a 20/40/80/160/165/320 MHz channel.
787 * @dfs: Pointer to wlan_dfs structure.
788 * @chan_freq: Channel frequency
789 *
790 * Return:
791 * * True: If CAC is done on channel.
792 * * False: If CAC is not done on channel.
793 */
794 #ifdef CONFIG_CHAN_FREQ_API
795 bool
796 dfs_is_precac_done_on_non_80p80_chan_for_freq(struct wlan_dfs *dfs,
797 uint16_t chan_freq);
798 #endif
799
800 /**
801 * dfs_is_precac_done_on_80p80_chan() - Is precac done on 80+80 MHz channel.
802 * @dfs: Pointer to wlan_dfs structure.
803 * @chan: Pointer to dfs_channel for which preCAC done is checked.
804 *
805 * Return:
806 * * True: If CAC is done on channel.
807 * * False: If CAC is not done on channel.
808 */
809 bool dfs_is_precac_done_on_80p80_chan(struct wlan_dfs *dfs,
810 struct dfs_channel *chan);
811
812 #if !defined(MOBILE_DFS_SUPPORT) && (defined(ATH_SUPPORT_ZERO_CAC_DFS) || \
813 defined(QCA_SUPPORT_AGILE_DFS))
814 #ifdef CONFIG_CHAN_FREQ_API
815 /**
816 * dfs_find_curchwidth_and_center_chan_for_freq() - Find the channel width
817 * enum, primary and secondary
818 * center channel value of
819 * the current channel.
820 * @dfs: Pointer to wlan_dfs structure.
821 * @chwidth: Channel width enum of current channel.
822 * @primary_chan_freq: Primary IEEE channel freq.
823 * @secondary_chan_freq: Secondary IEEE channel freq (in HT80_80 mode).
824 */
825 void
826 dfs_find_curchwidth_and_center_chan_for_freq(struct wlan_dfs *dfs,
827 enum phy_ch_width *chwidth,
828 uint16_t *primary_chan_freq,
829 uint16_t *secondary_chan_freq);
830 #endif
831
832 #ifdef CONFIG_CHAN_FREQ_API
833 /**
834 * dfs_mark_precac_done_for_freq() - Mark the channel as preCAC done.
835 * @dfs: Pointer to wlan_dfs structure.
836 * @pri_chan_freq: Primary channel IEEE freq.
837 * @sec_chan_freq: Secondary channel IEEE freq(only in HT80_80 mode).
838 * @chan_width: Channel width enum.
839 */
840 void dfs_mark_precac_done_for_freq(struct wlan_dfs *dfs,
841 uint16_t pri_chan_freq,
842 uint16_t sec_chan_freq,
843 enum phy_ch_width chan_width);
844 #endif
845
846 /**
847 * dfs_mark_precac_nol_for_freq() - Mark the precac channel as radar.
848 * @dfs: Pointer to wlan_dfs structure.
849 * @is_radar_found_on_secondary_seg: Radar found on secondary seg for Cascade.
850 * @detector_id: detector id which found RADAR in HW.
851 * @freq_list: Array of radar found frequencies.
852 * @num_channels: Number of radar found subchannels.
853 */
854 #ifdef CONFIG_CHAN_FREQ_API
855 void dfs_mark_precac_nol_for_freq(struct wlan_dfs *dfs,
856 uint8_t is_radar_found_on_secondary_seg,
857 uint8_t detector_id,
858 uint16_t *freq_list,
859 uint8_t num_channels);
860 #endif
861
862 /**
863 * dfs_unmark_precac_nol_for_freq() - Unmark the precac channel as radar.
864 * @dfs: Pointer to wlan_dfs structure.
865 * @chan_freq: channel freq marked as radar.
866 */
867 #ifdef CONFIG_CHAN_FREQ_API
868 void dfs_unmark_precac_nol_for_freq(struct wlan_dfs *dfs, uint16_t chan_freq);
869 #endif
870
871 #else
872
873 #ifdef CONFIG_CHAN_FREQ_API
874 static inline void
dfs_find_curchwidth_and_center_chan_for_freq(struct wlan_dfs * dfs,enum phy_ch_width * chwidth,uint16_t * primary_chan_freq,uint16_t * secondary_chan_freq)875 dfs_find_curchwidth_and_center_chan_for_freq(struct wlan_dfs *dfs,
876 enum phy_ch_width *chwidth,
877 uint16_t *primary_chan_freq,
878 uint16_t *secondary_chan_freq)
879 {
880 }
881 #endif
882
883 #ifdef CONFIG_CHAN_FREQ_API
dfs_mark_precac_done_for_freq(struct wlan_dfs * dfs,uint16_t pri_chan_freq,uint16_t sec_chan_freq,enum phy_ch_width chan_width)884 static inline void dfs_mark_precac_done_for_freq(struct wlan_dfs *dfs,
885 uint16_t pri_chan_freq,
886 uint16_t sec_chan_freq,
887 enum phy_ch_width chan_width)
888 {
889 }
890 #endif
891
892 #ifdef CONFIG_CHAN_FREQ_API
893 static inline void
dfs_mark_precac_nol_for_freq(struct wlan_dfs * dfs,uint8_t is_radar_found_on_secondary_seg,uint8_t detector_id,uint16_t * freq,uint8_t num_channels)894 dfs_mark_precac_nol_for_freq(struct wlan_dfs *dfs,
895 uint8_t is_radar_found_on_secondary_seg,
896 uint8_t detector_id,
897 uint16_t *freq,
898 uint8_t num_channels)
899 {
900 }
901 #endif
902
903 #ifdef CONFIG_CHAN_FREQ_API
dfs_unmark_precac_nol_for_freq(struct wlan_dfs * dfs,uint16_t chan_freq)904 static inline void dfs_unmark_precac_nol_for_freq(struct wlan_dfs *dfs,
905 uint16_t chan_freq)
906 {
907 }
908 #endif
909 #endif
910
911 /**
912 * dfs_is_precac_timer_running() - Check whether precac timer is running.
913 * @dfs: Pointer to wlan_dfs structure.
914 */
915 #if !defined(MOBILE_DFS_SUPPORT) && (defined(ATH_SUPPORT_ZERO_CAC_DFS) || \
916 defined(QCA_SUPPORT_AGILE_DFS))
917 bool dfs_is_precac_timer_running(struct wlan_dfs *dfs);
918 #else
dfs_is_precac_timer_running(struct wlan_dfs * dfs)919 static inline bool dfs_is_precac_timer_running(struct wlan_dfs *dfs)
920 {
921 return false;
922 }
923 #endif
924
925 #ifdef CONFIG_CHAN_FREQ_API
926 #define VHT160_FREQ_DIFF 80
927
928 #define INITIAL_20_CHAN_FREQ_OFFSET -70
929 #define INITIAL_40_CHAN_FREQ_OFFSET -60
930 #define INITIAL_80_CHAN_FREQ_OFFSET -40
931 #define INITIAL_160_CHAN_FREQ_OFFSET 0
932
933 #define NEXT_20_CHAN_FREQ_OFFSET 20
934 #define NEXT_40_CHAN_FREQ_OFFSET 40
935 #define NEXT_80_CHAN_FREQ_OFFSET 80
936 #define NEXT_160_CHAN_FREQ_OFFSET 160
937 #define NEXT_320_CHAN_FREQ_OFFSET 320
938
939 #define WEATHER_CHAN_START_FREQ 5600
940 #define WEATHER_CHAN_END_FREQ 5640
941
942 #endif
943
944 /**
945 * dfs_set_rcac_enable() - Set rcac enable flag.
946 * @dfs: Pointer to wlan_dfs structure.
947 * @rcac_en: input value to configure rolling cac feature.
948 */
949 #ifdef QCA_SUPPORT_ADFS_RCAC
950 QDF_STATUS dfs_set_rcac_enable(struct wlan_dfs *dfs,
951 bool rcac_en);
952 #else
953 static inline QDF_STATUS
dfs_set_rcac_enable(struct wlan_dfs * dfs,bool rcac_en)954 dfs_set_rcac_enable(struct wlan_dfs *dfs,
955 bool rcac_en)
956 {
957 return QDF_STATUS_SUCCESS;
958 }
959 #endif
960
961 /**
962 * dfs_get_rcac_enable() - Get rcac enable flag.
963 * @dfs: Pointer to wlan_dfs structure.
964 * @rcac_en: Variable to hold the current rcac config.
965 */
966 #ifdef QCA_SUPPORT_ADFS_RCAC
967 QDF_STATUS dfs_get_rcac_enable(struct wlan_dfs *dfs,
968 bool *rcac_en);
969 #else
970 static inline QDF_STATUS
dfs_get_rcac_enable(struct wlan_dfs * dfs,bool * rcac_en)971 dfs_get_rcac_enable(struct wlan_dfs *dfs,
972 bool *rcac_en)
973 {
974 return QDF_STATUS_SUCCESS;
975 }
976 #endif
977
978 /**
979 * dfs_set_rcac_freq() - Set user configured rolling CAC frequency.
980 * @dfs: Pointer to wlan_dfs structure.
981 * @rcac_freq: User preferred rolling cac frequency.
982 */
983 #ifdef QCA_SUPPORT_ADFS_RCAC
984 QDF_STATUS dfs_set_rcac_freq(struct wlan_dfs *dfs,
985 qdf_freq_t rcac_freq);
986 #else
987 static inline QDF_STATUS
dfs_set_rcac_freq(struct wlan_dfs * dfs,qdf_freq_t rcac_freq)988 dfs_set_rcac_freq(struct wlan_dfs *dfs,
989 qdf_freq_t rcac_freq)
990 {
991 return QDF_STATUS_SUCCESS;
992 }
993 #endif
994
995 /**
996 * dfs_get_rcac_freq() - Get user configured rolling CAC frequency.
997 * @dfs: Pointer to wlan_dfs structure.
998 * @rcac_freq: Variable to store the user preferred rolling cac frequency.
999 */
1000 #ifdef QCA_SUPPORT_ADFS_RCAC
1001 QDF_STATUS dfs_get_rcac_freq(struct wlan_dfs *dfs,
1002 qdf_freq_t *rcac_freq);
1003 #else
1004 static inline QDF_STATUS
dfs_get_rcac_freq(struct wlan_dfs * dfs,qdf_freq_t * rcac_freq)1005 dfs_get_rcac_freq(struct wlan_dfs *dfs,
1006 qdf_freq_t *rcac_freq)
1007 {
1008 return QDF_STATUS_SUCCESS;
1009 }
1010 #endif
1011
1012 /**
1013 * dfs_rcac_timer_init() - Initialize rolling cac timer.
1014 * @dfs_soc_obj: Pointer to DFS SOC object structure.
1015 */
1016 #ifdef QCA_SUPPORT_ADFS_RCAC
1017 void dfs_rcac_timer_init(struct dfs_soc_priv_obj *dfs_soc_obj);
1018 #else
1019 static inline void
dfs_rcac_timer_init(struct dfs_soc_priv_obj * dfs_soc_obj)1020 dfs_rcac_timer_init(struct dfs_soc_priv_obj *dfs_soc_obj)
1021 {
1022 }
1023 #endif
1024
1025 /**
1026 * dfs_rcac_timer_deinit() - Free rolling cac timer object.
1027 * @dfs_soc_obj: Pointer to dfs_soc_priv_obj structure.
1028 */
1029 #ifdef QCA_SUPPORT_ADFS_RCAC
1030 void dfs_rcac_timer_deinit(struct dfs_soc_priv_obj *dfs_soc_obj);
1031 #else
1032 static inline void
dfs_rcac_timer_deinit(struct dfs_soc_priv_obj * dfs_soc_obj)1033 dfs_rcac_timer_deinit(struct dfs_soc_priv_obj *dfs_soc_obj)
1034 {
1035 }
1036 #endif
1037
1038 #ifdef QCA_SUPPORT_AGILE_DFS
1039 #define DFS_AGILE_SM_SPIN_LOCK(_soc_obj) \
1040 qdf_spin_lock_bh(&((_soc_obj)->dfs_agile_sm_lock))
1041 #define DFS_AGILE_SM_SPIN_UNLOCK(_soc_obj) \
1042 qdf_spin_unlock_bh(&((_soc_obj)->dfs_agile_sm_lock))
1043
1044 /**
1045 * dfs_agile_sm_deliver_evt() - Deliver the event to AGILE SM.
1046 * @dfs_soc_obj: Pointer to DFS soc object that holds the SM handle.
1047 * @event: Event ID.
1048 * @event_data_len: Length of event data.
1049 * @event_data: pointer to event data.
1050 *
1051 * Return: Success if event is handled, else failure.
1052 */
1053 QDF_STATUS dfs_agile_sm_deliver_evt(struct dfs_soc_priv_obj *dfs_soc_obj,
1054 enum dfs_agile_sm_evt event,
1055 uint16_t event_data_len,
1056 void *event_data);
1057
1058 /**
1059 * dfs_agile_sm_create() - Create the AGILE state machine.
1060 * @dfs_soc_obj: Pointer to dfs_soc object that holds the SM handle.
1061 *
1062 * Return: QDF_STATUS_SUCCESS if successful, else failure status.
1063 */
1064 QDF_STATUS dfs_agile_sm_create(struct dfs_soc_priv_obj *dfs_soc_obj);
1065
1066 /**
1067 * dfs_agile_sm_destroy() - Destroy the AGILE state machine.
1068 * @dfs_soc_obj: Pointer to dfs_soc object that holds the SM handle.
1069 *
1070 * Return: QDF_STATUS_SUCCESS if successful, else failure status.
1071 */
1072 QDF_STATUS dfs_agile_sm_destroy(struct dfs_soc_priv_obj *dfs_soc_obj);
1073
1074 /**
1075 * dfs_is_agile_cac_enabled() - Determine if Agile PreCAC/RCAC is enabled.
1076 * @dfs: Pointer to struct wlan_dfs.
1077 *
1078 * Return: True if either Agile PreCAC/RCAC is enabled, false otherwise.
1079 */
1080 bool dfs_is_agile_cac_enabled(struct wlan_dfs *dfs);
1081
1082 /* dfs_translate_chwidth_enum2val() - Translate the given channel width enum
1083 * to it's value.
1084 * @dfs: Pointer to WLAN DFS structure.
1085 * @chwidth: Channel width enum of the pdev's current channel.
1086 *
1087 * Return: The Bandwidth value for the given channel width enum.
1088 */
1089 uint16_t
1090 dfs_translate_chwidth_enum2val(struct wlan_dfs *dfs,
1091 enum phy_ch_width chwidth);
1092 #else
1093
1094 static inline
dfs_agile_sm_deliver_evt(struct dfs_soc_priv_obj * dfs_soc_obj,enum dfs_agile_sm_evt event,uint16_t event_data_len,void * event_data)1095 QDF_STATUS dfs_agile_sm_deliver_evt(struct dfs_soc_priv_obj *dfs_soc_obj,
1096 enum dfs_agile_sm_evt event,
1097 uint16_t event_data_len,
1098 void *event_data)
1099 {
1100 return QDF_STATUS_SUCCESS;
1101 }
1102
1103 static inline
dfs_agile_sm_create(struct dfs_soc_priv_obj * dfs_soc_obj)1104 QDF_STATUS dfs_agile_sm_create(struct dfs_soc_priv_obj *dfs_soc_obj)
1105 {
1106 return QDF_STATUS_SUCCESS;
1107 }
1108
1109 static inline
dfs_agile_sm_destroy(struct dfs_soc_priv_obj * dfs_soc_obj)1110 QDF_STATUS dfs_agile_sm_destroy(struct dfs_soc_priv_obj *dfs_soc_obj)
1111 {
1112 return QDF_STATUS_SUCCESS;
1113 }
1114
dfs_is_agile_cac_enabled(struct wlan_dfs * dfs)1115 static inline bool dfs_is_agile_cac_enabled(struct wlan_dfs *dfs)
1116 {
1117 return false;
1118 }
1119
dfs_translate_chwidth_enum2val(struct wlan_dfs * dfs,enum phy_ch_width chwidth)1120 static inline uint16_t dfs_translate_chwidth_enum2val(struct wlan_dfs *dfs,
1121 enum phy_ch_width chwidth)
1122 {
1123 return false;
1124 }
1125 #endif /* QCA_SUPPORT_AGILE_DFS */
1126
1127 #ifdef QCA_SUPPORT_ADFS_RCAC
1128 /**
1129 * dfs_is_agile_rcac_enabled() - Determine if Rolling CAC is enabled or not.
1130 * @dfs: Pointer to struct wlan_dfs.
1131 *
1132 * Following are the conditions needed to assertain that rolling CAC
1133 * is enabled:
1134 * 1. DFS domain of the PDEV must be FCC or MKK.
1135 * 2. User has enabled Rolling CAC configuration.
1136 * 3. FW capability to support ADFS. Only non-160 capability is checked here.
1137 * If we happen to choose the next RCAC channel as 160/80-80,
1138 * 'dfs_fw_adfs_support_160' is also verified.
1139 *
1140 *
1141 * Return: True if RCAC support is enabled, false otherwise.
1142 */
1143 bool dfs_is_agile_rcac_enabled(struct wlan_dfs *dfs);
1144
1145 /**
1146 * dfs_prepare_agile_rcac_channel() - Prepare agile RCAC channel.
1147 * @dfs: Pointer to struct wlan_dfs.
1148 * @is_rcac_chan_available: Flag to indicate if a valid RCAC channel is
1149 * found.
1150 */
1151 void dfs_prepare_agile_rcac_channel(struct wlan_dfs *dfs,
1152 bool *is_rcac_chan_available);
1153 /**
1154 * dfs_start_agile_rcac_timer() - Start Agile RCAC timer.
1155 * @dfs: Pointer to struct wlan_dfs.
1156 *
1157 */
1158 void dfs_start_agile_rcac_timer(struct wlan_dfs *dfs);
1159
1160 /**
1161 * dfs_stop_agile_rcac_timer() - Stop Agile RCAC timer.
1162 * @dfs: Pointer to struct wlan_dfs.
1163 *
1164 */
1165 void dfs_stop_agile_rcac_timer(struct wlan_dfs *dfs);
1166
1167 /**
1168 * dfs_agile_cleanup_rcac() - Reset parameters of wlan_dfs relatewd to RCAC
1169 *
1170 * @dfs: Pointer to struct wlan_dfs.
1171 */
1172 void dfs_agile_cleanup_rcac(struct wlan_dfs *dfs);
1173 #else
dfs_is_agile_rcac_enabled(struct wlan_dfs * dfs)1174 static inline bool dfs_is_agile_rcac_enabled(struct wlan_dfs *dfs)
1175 {
1176 return false;
1177 }
1178
dfs_agile_cleanup_rcac(struct wlan_dfs * dfs)1179 static inline void dfs_agile_cleanup_rcac(struct wlan_dfs *dfs)
1180 {
1181 }
1182
1183 static inline void
dfs_prepare_agile_rcac_channel(struct wlan_dfs * dfs,bool * is_rcac_chan_available)1184 dfs_prepare_agile_rcac_channel(struct wlan_dfs *dfs,
1185 bool *is_rcac_chan_available)
1186 {
1187 }
1188
dfs_start_agile_rcac_timer(struct wlan_dfs * dfs)1189 static inline void dfs_start_agile_rcac_timer(struct wlan_dfs *dfs)
1190 {
1191 }
1192
dfs_stop_agile_rcac_timer(struct wlan_dfs * dfs)1193 static inline void dfs_stop_agile_rcac_timer(struct wlan_dfs *dfs)
1194 {
1195 }
1196 #endif /* QCA_SUPPORT_ADFS_RCAC */
1197
1198 #if defined(QCA_SUPPORT_AGILE_DFS) || defined(ATH_SUPPORT_ZERO_CAC_DFS) || \
1199 defined(QCA_SUPPORT_ADFS_RCAC)
1200 /**
1201 * dfs_process_radar_ind_on_agile_chan() - Process radar indication event on
1202 * agile channel.
1203 * @dfs: Pointer to wlan_dfs structure.
1204 * @radar_found: Pointer to radar_found_info structure.
1205 *
1206 * Return: QDF_STATUS
1207 */
1208 QDF_STATUS
1209 dfs_process_radar_ind_on_agile_chan(struct wlan_dfs *dfs,
1210 struct radar_found_info *radar_found);
1211 #else
1212 static inline QDF_STATUS
dfs_process_radar_ind_on_agile_chan(struct wlan_dfs * dfs,struct radar_found_info * radar_found)1213 dfs_process_radar_ind_on_agile_chan(struct wlan_dfs *dfs,
1214 struct radar_found_info *radar_found)
1215 {
1216 return QDF_STATUS_E_FAILURE;
1217 }
1218 #endif
1219
1220 #ifdef ATH_SUPPORT_ZERO_CAC_DFS
1221 /**
1222 * dfs_precac_status_for_channel() - Find the preCAC status of the given
1223 * channel.
1224 *
1225 * @dfs: Pointer to wlan_dfs dfs.
1226 * @deschan: DFS channel to check preCAC status.
1227 *
1228 * Return:
1229 * DFS_NO_PRECAC_COMPLETED_CHANS - 0 preCAC completed channels.
1230 * DFS_PRECAC_COMPLETED_CHAN - Given channel is preCAC completed.
1231 * DFS_PRECAC_REQUIRED_CHAN - Given channel requires preCAC.
1232 */
1233 enum precac_status_for_chan
1234 dfs_precac_status_for_channel(struct wlan_dfs *dfs,
1235 struct dfs_channel *deschan);
1236 #else
1237 static inline enum precac_status_for_chan
dfs_precac_status_for_channel(struct wlan_dfs * dfs,struct dfs_channel * deschan)1238 dfs_precac_status_for_channel(struct wlan_dfs *dfs,
1239 struct dfs_channel *deschan)
1240 {
1241 return DFS_INVALID_PRECAC_STATUS;
1242 }
1243 #endif
1244
1245 #if (defined(QCA_SUPPORT_AGILE_DFS) || defined(QCA_SUPPORT_ADFS_RCAC)) && \
1246 defined(WLAN_DFS_TRUE_160MHZ_SUPPORT) && defined(WLAN_DFS_FULL_OFFLOAD)
1247 /**
1248 * dfs_translate_radar_params_for_agile_chan() - Translate radar params from
1249 * 160MHz synthesizer model to 80MHz synthesizer model for Agile channel.
1250 * @dfs: Pointer to wlan_dfs dfs.
1251 * @r_info: Radar found parameters received from FW that are converted to 80MHz
1252 * syntesizer model(both input and output).
1253 *
1254 * Return: void.
1255 */
1256
1257 void dfs_translate_radar_params_for_agile_chan(struct wlan_dfs *dfs,
1258 struct radar_found_info *r_info);
1259 #else
1260 static inline void
dfs_translate_radar_params_for_agile_chan(struct wlan_dfs * dfs,struct radar_found_info * r_info)1261 dfs_translate_radar_params_for_agile_chan(struct wlan_dfs *dfs,
1262 struct radar_found_info *r_info)
1263 {
1264 }
1265 #endif
1266
1267 /**
1268 * dfs_is_subset_channel_for_freq() - Find out if prev channel and current
1269 * channel are subsets of each other.
1270 * @old_subchans_freq: Pointer to previous sub-channels freq.
1271 * @old_n_chans: Number of previous sub-channels.
1272 * @new_subchans_freq: Pointer to new sub-channels freq.
1273 * @new_n_chans: Number of new sub-channels
1274 */
1275 #ifdef CONFIG_CHAN_FREQ_API
1276 bool
1277 dfs_is_subset_channel_for_freq(uint16_t *old_subchans_freq,
1278 uint8_t old_n_chans,
1279 uint16_t *new_subchans_freq,
1280 uint8_t new_n_chans);
1281 #endif
1282
1283 #ifdef QCA_DFS_BW_EXPAND
1284 /**
1285 * dfs_bwexpand_find_usr_cnf_chan() - Find the User configured channel for
1286 * BW Expand.
1287 * @dfs: Pointer to wlan_dfs object.
1288 *
1289 * Return: User configured frequency.
1290 */
1291 qdf_freq_t dfs_bwexpand_find_usr_cnf_chan(struct wlan_dfs *dfs);
1292
1293 /**
1294 * dfs_bwexpand_try_jumping_to_target_subchan() - Expand the current channel
1295 * bandwidth or jump to a (subset of) user configured target channel.
1296 * Example: Current channel is 60 HT20 and user configured target channel is
1297 * 100 HT160. Agile SM runs on the subchans with 20Mhz BW of 100 HT160, here
1298 * Agile SM runs on 100HT20 and after completion of agile CAC, it checks
1299 * the API dfs_bwexpand_try_jumping_to_target_subchan for possibility of
1300 * BW Expansion and only 20Mhz subchan is available. There is no possible for
1301 * higher bandwidth channel. Then agile CAC runs on the adjacent subchannel
1302 * 104 HT20. After agile CAC completion, the API is checked again for possible
1303 * bandwidth expansion and 102 HT40 is available. The API invokes channel change
1304 * to higher bandwidth.
1305 * @dfs: Pointer to wlan_dfs object.
1306 *
1307 * Return: TRUE, if Bandwidth expansion is success.
1308 * FALSE, if Bandwidth expansion is failure.
1309 */
1310 bool dfs_bwexpand_try_jumping_to_target_subchan(struct wlan_dfs *dfs);
1311
1312 /**
1313 * dfs_is_rcac_cac_done()- Check RCAC is completed on the subset of the
1314 * user configured target channel.
1315 * @dfs: Pointer to wlan_dfs.
1316 * @chan: Pointer to dfs_channel object of user configured target channel.
1317 * @subset_chan: Pointer to dfs_channel object of subchannel in which RCAC is
1318 * completed.
1319 *
1320 * Return: Boolean value.
1321 */
1322 bool dfs_is_rcac_cac_done(struct wlan_dfs *dfs,
1323 struct dfs_channel *chan,
1324 struct dfs_channel *subset_chan);
1325
1326 /*
1327 * dfs_get_configured_bwexpand_dfs_chan() - Get a DFS chan when frequency and
1328 * phymode is provided.
1329 * @dfs: pointer to wlan_dfs.
1330 * @user_chan: pointer to dfs_channel.
1331 * @target_mode: phymode of type wlan_phymode.
1332 */
1333 bool dfs_get_configured_bwexpand_dfs_chan(struct wlan_dfs *dfs,
1334 struct dfs_channel *user_chan,
1335 enum wlan_phymode target_mode);
1336 #else
1337 static inline
dfs_bwexpand_find_usr_cnf_chan(struct wlan_dfs * dfs)1338 qdf_freq_t dfs_bwexpand_find_usr_cnf_chan(struct wlan_dfs *dfs)
1339 {
1340 return 0;
1341 }
1342
1343 static inline
dfs_bwexpand_try_jumping_to_target_subchan(struct wlan_dfs * dfs)1344 bool dfs_bwexpand_try_jumping_to_target_subchan(struct wlan_dfs *dfs)
1345 {
1346 return false;
1347 }
1348
1349 static inline
dfs_is_rcac_cac_done(struct wlan_dfs * dfs,struct dfs_channel * chan,struct dfs_channel * subset_chan)1350 bool dfs_is_rcac_cac_done(struct wlan_dfs *dfs,
1351 struct dfs_channel *chan,
1352 struct dfs_channel *subset_chan)
1353 {
1354 return false;
1355 }
1356
1357 static inline
dfs_get_configured_bwexpand_dfs_chan(struct wlan_dfs * dfs,struct dfs_channel * user_chan,enum wlan_phymode target_mode)1358 bool dfs_get_configured_bwexpand_dfs_chan(struct wlan_dfs *dfs,
1359 struct dfs_channel *user_chan,
1360 enum wlan_phymode target_mode)
1361 {
1362 return false;
1363 }
1364 #endif /* QCA_DFS_BW_EXPAND */
1365
1366 #if defined(QCA_DFS_BW_PUNCTURE) && !defined(CONFIG_REG_CLIENT)
1367 /**
1368 * dfs_create_punc_sm() - Wrapper API to Create DFS puncture state machine.
1369 * @dfs: pointer to wlan_dfs.
1370 *
1371 * Return: Nothing.
1372 */
1373 void dfs_create_punc_sm(struct wlan_dfs *dfs);
1374
1375 /**
1376 * dfs_destroy_punc_sm() - Wrapper API to Destroy DFS puncture state machine.
1377 * @dfs: pointer to wlan_dfs.
1378 *
1379 * Return: Nothing.
1380 */
1381 void dfs_destroy_punc_sm(struct wlan_dfs *dfs);
1382
1383 /**
1384 * dfs_punc_sm_stop_all() - API to stop all puncture SM object.
1385 * @dfs: pointer to wlan_dfs.
1386 *
1387 * Return: Nothing.
1388 */
1389 void dfs_punc_sm_stop_all(struct wlan_dfs *dfs);
1390
1391 /**
1392 * dfs_punc_sm_stop() - Stop DFS puncture state machine.
1393 * @dfs: Pointer to wlan_dfs.
1394 * @indx: Index of DFS puncture state machine.
1395 * @dfs_punc_arr: Pointer to DFS puncture state machine object.
1396 *
1397 * Return: Nothing.
1398 */
1399 void dfs_punc_sm_stop(struct wlan_dfs *dfs,
1400 uint8_t indx,
1401 struct dfs_punc_obj *dfs_punc_arr);
1402
1403 /**
1404 * dfs_punc_sm_create() - Create DFS puncture state machine.
1405 * @dfs_punc: Pointer to DFS puncture state machine object.
1406 *
1407 * Return: Success if SM is created.
1408 */
1409 QDF_STATUS dfs_punc_sm_create(struct dfs_punc_obj *dfs_punc);
1410
1411 /**
1412 * dfs_punc_sm_destroy() - Destroy DFS puncture state machine.
1413 * @dfs_punc: Pointer to DFS puncture state machine object.
1414 *
1415 * Return: Success if SM is destroyed.
1416 */
1417 QDF_STATUS dfs_punc_sm_destroy(struct dfs_punc_obj *dfs_punc);
1418
1419 /**
1420 * dfs_punc_cac_timer_attach() - Attach puncture CAC timer to DFS puncture
1421 * state machine.
1422 * @dfs: Pointer to wlan_dfs.
1423 * @dfs_punc_arr: Pointer to DFS puncture state machine object.
1424 *
1425 * Return: Nothing.
1426 */
1427 void dfs_punc_cac_timer_attach(struct wlan_dfs *dfs,
1428 struct dfs_punc_obj *dfs_punc_arr);
1429
1430 /**
1431 * dfs_handle_dfs_puncture_unpuncture() - Handles DFS puncture and unpuncturing.
1432 * @dfs: Pointer to wlan_dfs.
1433 *
1434 * Return: Nothing.
1435 */
1436 void dfs_handle_dfs_puncture_unpuncture(struct wlan_dfs *dfs);
1437
1438 /**
1439 * dfs_punc_cac_timer_reset() - Reset puncture CAC timer.
1440 * @dfs_punc_arr: Pointer to DFS puncture state machine object.
1441 *
1442 * Return: Nothing.
1443 */
1444 void dfs_punc_cac_timer_reset(struct dfs_punc_obj *dfs_punc_arr);
1445
1446 /**
1447 * dfs_punc_cac_timer_detach() - Detach puncture CAC timer from DFS puncture
1448 * state machine.
1449 * @dfs_punc_arr: Pointer to DFS puncture state machine object.
1450 *
1451 * Return: Nothing.
1452 */
1453 void dfs_punc_cac_timer_detach(struct dfs_punc_obj *dfs_punc_arr);
1454
1455 /**
1456 * dfs_start_punc_cac_timer() - Start puncture CAC timer.
1457 * @dfs_punc_arr: Pointer to DFS puncture state machine object.
1458 * @is_weather_chan: check if the channel is weather channel.
1459 *
1460 * Return: Nothing.
1461 */
1462 void dfs_start_punc_cac_timer(struct dfs_punc_obj *dfs_punc_arr,
1463 bool is_weather_chan);
1464
1465 /**
1466 * dfs_cancel_punc_cac_timer() - Cancel puncture CAC timer.
1467 * @dfs_punc_arr: Pointer to DFS puncture state machine object.
1468 *
1469 * Return: Nothing.
1470 */
1471 void dfs_cancel_punc_cac_timer(struct dfs_punc_obj *dfs_punc_arr);
1472
1473 /**
1474 * utils_dfs_puncturing_sm_deliver_evt() - Utility API to post events to DFS
1475 * puncture state machine.
1476 * @pdev: Pointer to DFS pdev object.
1477 * @sm_indx: Index of state machine.
1478 * @event: Event to be posted to DFS Puncturing SM.
1479 *
1480 * Return: Nothing.
1481 */
1482 void utils_dfs_puncturing_sm_deliver_evt(struct wlan_objmgr_pdev *pdev,
1483 uint8_t sm_indx,
1484 enum dfs_punc_sm_evt event);
1485 /**
1486 * dfs_puncturing_sm_deliver_evt() - API to post events to DFS puncture
1487 * state machine.
1488 * @dfs: Pointer to wlan_dfs.
1489 * @event: Event to be posted to DFS Puncturing SM.
1490 * @event_data_len: Size of event data.
1491 * @event_data: Event data.
1492 *
1493 * Return: Nothing.
1494 */
1495 QDF_STATUS dfs_puncturing_sm_deliver_evt(struct wlan_dfs *dfs,
1496 enum dfs_punc_sm_evt event,
1497 uint16_t event_data_len,
1498 void *event_data);
1499
1500 /**
1501 * dfs_handle_nol_puncture() - Send SM event post NOL expiry.
1502 * @dfs: Pointer to wlan_dfs.
1503 * @nolfreq: NOL channel frequency.
1504 *
1505 * Return: Nothing.
1506 */
1507 void dfs_handle_nol_puncture(struct wlan_dfs *dfs, qdf_freq_t nolfreq);
1508
1509 /**
1510 * dfs_is_ignore_radar_for_punctured_chans() - Store the radar bitmap and check
1511 * if radar is found in already
1512 * punctured channel and ignore the
1513 * radar.
1514 * @dfs: Wlan_dfs structure
1515 * @dfs_curr_radar_bitmap: Variable to store radar bitmap.
1516 *
1517 * Return: If radar is found on punctured channel then return true.
1518 * Else return false.
1519 */
1520 bool dfs_is_ignore_radar_for_punctured_chans(struct wlan_dfs *dfs,
1521 uint16_t dfs_curr_radar_bitmap);
1522 #else
1523 static inline
dfs_create_punc_sm(struct wlan_dfs * dfs)1524 void dfs_create_punc_sm(struct wlan_dfs *dfs)
1525 {
1526 }
1527
1528 static inline
dfs_destroy_punc_sm(struct wlan_dfs * dfs)1529 void dfs_destroy_punc_sm(struct wlan_dfs *dfs)
1530 {
1531 }
1532
1533 static inline
dfs_punc_sm_stop_all(struct wlan_dfs * dfs)1534 void dfs_punc_sm_stop_all(struct wlan_dfs *dfs)
1535 {
1536 }
1537
1538 static inline
dfs_punc_sm_stop(struct wlan_dfs * dfs,uint8_t indx,struct dfs_punc_obj * dfs_punc_arr)1539 void dfs_punc_sm_stop(struct wlan_dfs *dfs,
1540 uint8_t indx,
1541 struct dfs_punc_obj *dfs_punc_arr)
1542 {
1543 }
1544
1545 static inline
dfs_punc_sm_create(struct dfs_punc_obj * dfs_punc)1546 QDF_STATUS dfs_punc_sm_create(struct dfs_punc_obj *dfs_punc)
1547 {
1548 return QDF_STATUS_E_FAILURE;
1549 }
1550
1551 static inline
dfs_punc_sm_destroy(struct dfs_punc_obj * dfs_punc)1552 QDF_STATUS dfs_punc_sm_destroy(struct dfs_punc_obj *dfs_punc)
1553 {
1554 return QDF_STATUS_E_FAILURE;
1555 }
1556
1557 static inline
dfs_punc_cac_timer_attach(struct wlan_dfs * dfs,struct dfs_punc_obj * dfs_punc_arr)1558 void dfs_punc_cac_timer_attach(struct wlan_dfs *dfs,
1559 struct dfs_punc_obj *dfs_punc_arr)
1560 {
1561 }
1562
1563 static inline
dfs_handle_dfs_puncture_unpuncture(struct wlan_dfs * dfs)1564 void dfs_handle_dfs_puncture_unpuncture(struct wlan_dfs *dfs)
1565 {
1566 }
1567
1568 static inline
dfs_punc_cac_timer_reset(struct dfs_punc_obj * dfs_punc_arr)1569 void dfs_punc_cac_timer_reset(struct dfs_punc_obj *dfs_punc_arr)
1570 {
1571 }
1572
1573 static inline
dfs_punc_cac_timer_detach(struct dfs_punc_obj * dfs_punc_arr)1574 void dfs_punc_cac_timer_detach(struct dfs_punc_obj *dfs_punc_arr)
1575 {
1576 }
1577
1578 static inline
dfs_start_punc_cac_timer(struct dfs_punc_obj * dfs_punc_arr,bool is_weather_chan)1579 void dfs_start_punc_cac_timer(struct dfs_punc_obj *dfs_punc_arr,
1580 bool is_weather_chan)
1581 {
1582 }
1583
1584 static inline
dfs_cancel_punc_cac_timer(struct dfs_punc_obj * dfs_punc_arr)1585 void dfs_cancel_punc_cac_timer(struct dfs_punc_obj *dfs_punc_arr)
1586 {
1587 }
1588
1589 static inline
utils_dfs_puncturing_sm_deliver_evt(struct wlan_objmgr_pdev * pdev,uint8_t sm_indx,enum dfs_punc_sm_evt event)1590 void utils_dfs_puncturing_sm_deliver_evt(struct wlan_objmgr_pdev *pdev,
1591 uint8_t sm_indx,
1592 enum dfs_punc_sm_evt event)
1593 {
1594 }
1595
1596 static inline
dfs_puncturing_sm_deliver_evt(struct wlan_dfs * dfs,enum dfs_punc_sm_evt event,uint16_t event_data_len,void * event_data)1597 QDF_STATUS dfs_puncturing_sm_deliver_evt(struct wlan_dfs *dfs,
1598 enum dfs_punc_sm_evt event,
1599 uint16_t event_data_len,
1600 void *event_data)
1601 {
1602 return QDF_STATUS_E_FAILURE;
1603 }
1604
1605 static inline
dfs_handle_nol_puncture(struct wlan_dfs * dfs,qdf_freq_t nolfreq)1606 void dfs_handle_nol_puncture(struct wlan_dfs *dfs, qdf_freq_t nolfreq)
1607 {
1608 }
1609
1610 static inline
dfs_is_ignore_radar_for_punctured_chans(struct wlan_dfs * dfs,uint16_t dfs_curr_radar_bitmap)1611 bool dfs_is_ignore_radar_for_punctured_chans(struct wlan_dfs *dfs,
1612 uint16_t dfs_curr_radar_bitmap)
1613 {
1614 return false;
1615 }
1616 #endif /* DFS_BW_PUNCTURE */
1617 #endif /* _DFS_ZERO_CAC_H_ */
1618