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