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 * 5 * 6 * Permission to use, copy, modify, and/or distribute this software for 7 * any purpose with or without fee is hereby granted, provided that the 8 * above copyright notice and this permission notice appear in all 9 * copies. 10 * 11 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL 12 * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED 13 * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE 14 * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL 15 * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR 16 * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER 17 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR 18 * PERFORMANCE OF THIS SOFTWARE. 19 */ 20 21 /** 22 * DOC: This file has the DFS dispatcher API which is exposed to outside of DFS 23 * component. 24 */ 25 26 #ifndef _WLAN_DFS_UTILS_API_H_ 27 #define _WLAN_DFS_UTILS_API_H_ 28 29 #include "wlan_dfs_ucfg_api.h" 30 #include "wlan_reg_services_api.h" 31 #include <wlan_objmgr_vdev_obj.h> 32 33 /* Add channel to nol */ 34 #define DFS_NOL_SET 1 35 36 /* Remove channel from nol */ 37 #define DFS_NOL_RESET 0 38 39 /* Mark nol-history flag for the channel */ 40 #define DFS_NOL_HISTORY_SET 1 41 42 /* Clear nol-history flag from the channel */ 43 #define DFS_NOL_HISTORY_RESET 0 44 45 /* Max nol channels */ 46 #define DFS_MAX_NOL_CHANNEL 80 47 48 /* WLAN 2.4GHz start freq */ 49 #define DFS_24_GHZ_BASE_FREQ (2407) 50 51 /* WLAN 5GHz start freq */ 52 #define DFS_5_GHZ_BASE_FREQ (5000) 53 54 /* WLAN 2.4 GHz channel number 6 */ 55 #define DFS_24_GHZ_CHANNEL_6 (6) 56 57 /* WLAN 2.4 GHz channel number 14 */ 58 #define DFS_24_GHZ_CHANNEL_14 (14) 59 60 /* WLAN 2.4 GHz channel number 15 */ 61 #define DFS_24_GHZ_CHANNEL_15 (15) 62 63 /* WLAN 2.4 GHz channel number 27 */ 64 #define DFS_24_GHZ_CHANNEL_27 (27) 65 66 /* WLAN 5GHz channel number 170 */ 67 #define DFS_5_GHZ_CHANNEL_170 (170) 68 69 /* WLAN 5MHz channel spacing */ 70 #define DFS_CHAN_SPACING_5MHZ (5) 71 72 /* WLAN 20Hz channel spacing */ 73 #define DFS_CHAN_SPACING_20MHZ (20) 74 75 /* WLAN 2.4GHz channel number 14 freq */ 76 #define DFS_CHAN_14_FREQ (2484) 77 78 /* WLAN 2.4GHz channel number 15 freq */ 79 #define DFS_CHAN_15_FREQ (2512) 80 81 /* WLAN 5GHz channel number 170 freq */ 82 #define DFS_CHAN_170_FREQ (5852) 83 84 #define IS_CHAN_DFS(_flags) ((_flags) & REGULATORY_CHAN_RADAR) 85 86 extern struct dfs_to_mlme global_dfs_to_mlme; 87 88 /** 89 * utils_dfs_cac_valid_reset_for_freq() - Cancels the dfs_cac_valid_timer timer. 90 * @pdev: Pointer to DFS pdev object. 91 * @prevchan_freq: Prevchan frequency. 92 * @prevchan_flags: Prevchan flags. 93 * 94 * Wrapper function for dfs_cac_valid_reset_for_freq(). This function called 95 * from outside of DFS component. 96 */ 97 #ifdef CONFIG_CHAN_FREQ_API 98 QDF_STATUS utils_dfs_cac_valid_reset_for_freq(struct wlan_objmgr_pdev *pdev, 99 uint16_t prevchan_freq, 100 uint32_t prevchan_flags); 101 #endif 102 103 /** 104 * utils_dfs_reset() - Reset DFS members. 105 * @pdev: Pointer to DFS pdev object. 106 */ 107 QDF_STATUS utils_dfs_reset(struct wlan_objmgr_pdev *pdev); 108 109 /** 110 * utils_dfs_is_freq_in_nol() - check if given channel in nol list 111 * @pdev: Pointer to DFS pdev object 112 * @freq: channel frequency 113 * 114 * check if given channel in nol list. 115 * 116 * Return: true if channel in nol, false else 117 */ 118 bool utils_dfs_is_freq_in_nol(struct wlan_objmgr_pdev *pdev, uint32_t freq); 119 120 /** 121 * utils_dfs_reset_precaclists() - Clears and initializes precac_list. 122 * @pdev: Pointer to DFS pdev object. 123 * 124 * Wrapper function for dfs_reset_precaclists(). This function called from 125 * outside of DFS component. 126 */ 127 QDF_STATUS utils_dfs_reset_precaclists(struct wlan_objmgr_pdev *pdev); 128 129 /** 130 * utils_dfs_unmark_precac_nol_for_freq() - Clears precac channel marked as NOL. 131 * @pdev: Pointer to DFS pdev object. 132 * @chan_freq: channel freq to be unmarked as NOL. 133 * 134 * Return void. 135 */ 136 #ifdef CONFIG_CHAN_FREQ_API 137 void utils_dfs_unmark_precac_nol_for_freq(struct wlan_objmgr_pdev *pdev, 138 uint16_t chan_freq); 139 #endif 140 141 /** 142 * utils_dfs_cancel_precac_timer() - Cancel the precac timer. 143 * @pdev: Pointer to DFS pdev object. 144 * 145 * wrapper function for dfs_cancel_precac_timer(). this function called from 146 * outside of dfs component. 147 */ 148 QDF_STATUS utils_dfs_cancel_precac_timer(struct wlan_objmgr_pdev *pdev); 149 150 /** 151 * utils_dfs_start_precac_timer() - Start the precac timer. 152 * @pdev: Pointer to DFS pdev object. 153 * 154 * Wrapper function for dfs_start_precac_timer(). This function called from 155 * outside of dfs component. 156 * 157 * Return: 158 * * QDF_STATUS_E_FAILURE: Failed to start timer. 159 * * QDF_STATUS_SUCCESS: Timer started successfully. 160 */ 161 QDF_STATUS utils_dfs_start_precac_timer(struct wlan_objmgr_pdev *pdev); 162 163 #ifdef WLAN_DFS_PRECAC_AUTO_CHAN_SUPPORT 164 /** 165 * utils_dfs_precac_decide_pref_chan_for_freq() - Choose preferred channel 166 * @pdev: Pointer to DFS pdev object. 167 * @ch_freq: Pointer to channel frequency. 168 * @mode: Configured PHY mode. 169 * 170 * Wrapper function for dfs_decide_precac_preferred_chan_for_freq(). This 171 * function called from outside of dfs component. 172 * 173 * Return: True if intermediate channel needs to configure. False otherwise. 174 */ 175 #ifdef CONFIG_CHAN_FREQ_API 176 bool 177 utils_dfs_precac_decide_pref_chan_for_freq(struct wlan_objmgr_pdev *pdev, 178 uint16_t *ch_freq, 179 enum wlan_phymode mode); 180 #endif 181 #endif 182 183 /** 184 * utils_dfs_cancel_cac_timer() - Cancels the CAC timer. 185 * @pdev: Pointer to DFS pdev object. 186 * 187 * wrapper function for dfs_cancel_cac_timer(). this 188 * function called from outside of dfs component. 189 */ 190 QDF_STATUS utils_dfs_cancel_cac_timer(struct wlan_objmgr_pdev *pdev); 191 192 /** 193 * utils_dfs_start_cac_timer() - Starts the CAC timer. 194 * @pdev: Pointer to DFS pdev object. 195 * 196 * wrapper function for dfs_start_cac_timer(). this 197 * function called from outside of dfs component. 198 */ 199 QDF_STATUS utils_dfs_start_cac_timer(struct wlan_objmgr_pdev *pdev); 200 201 /** 202 * utils_dfs_cac_stop() - Clear the AP CAC timer. 203 * @pdev: Pointer to DFS pdev object. 204 * 205 * wrapper function for dfs_cac_stop(). this 206 * function called from outside of dfs component. 207 */ 208 QDF_STATUS utils_dfs_cac_stop(struct wlan_objmgr_pdev *pdev); 209 210 /** 211 * utils_dfs_stacac_stop() - Clear the STA CAC timer. 212 * @pdev: Pointer to DFS pdev object. 213 * 214 * wrapper function for dfs_stacac_stop(). this 215 * function called from outside of dfs component. 216 */ 217 QDF_STATUS utils_dfs_stacac_stop(struct wlan_objmgr_pdev *pdev); 218 219 /** 220 * utils_dfs_get_usenol() - Returns use_nol flag. 221 * @pdev: Pointer to DFS pdev object. 222 * @usenol: Pointer to usenol value. 223 * 224 * wrapper function for dfs_get_usenol(). this 225 * function called from outside of dfs component. 226 */ 227 QDF_STATUS utils_dfs_get_usenol(struct wlan_objmgr_pdev *pdev, 228 uint16_t *usenol); 229 230 /** 231 * utils_dfs_is_spruce_spur_war_applicable() - Is Spruce spur WAR applicable 232 * @pdev: Pointer to DFS pdev object. 233 * 234 * Spur or leakage transmissions is observed in Spruce HW in 235 * frequencies from 5260MHz to 5320MHz when one of the following 236 * conditions is true, 237 * i) The AP is transmitting in 52/56/60/64 in 80MHz mode and then the AP 238 * moves to the adjacent channel 36/44/48 in 80MHz mode and starts 239 * transmitting. 240 * ii) The AP is transmitting in 36/44/48/52/56/60/64 in 160MHz mode and then 241 * the AP moves to the adjacent channel 36/44/48 in 80MHz mode and starts 242 * transmitting. 243 * 244 * Hence, the spruce spur WAR becomes applicable when, 245 * a) the target is Spruce, 246 * b) the primary channel is 52/56/60/64, and the home channel width is 80MHz. 247 * c) or, the primary channel is 36/44/48/52/56/60/64 and the home channel width 248 * is 160MHz. 249 * 250 * When the conditions (a) and (b) or (c) is true, random channel selection 251 * should make sure to prevent moving to the adjacent channels 36/44/48 in 252 * 80MHz mode. Failing to do so will cause spur transmissions in channel 52 253 * through 64. 254 * 255 * Return: true if Spruce spur WAR is applicable else false. 256 */ 257 bool utils_dfs_is_spruce_spur_war_applicable(struct wlan_objmgr_pdev *pdev); 258 259 /** 260 * utils_dfs_radar_disable() - Disables the radar. 261 * @pdev: Pointer to DFS pdev object. 262 * 263 * wrapper function for dfs_radar_disable(). this 264 * function called from outside of dfs component. 265 */ 266 QDF_STATUS utils_dfs_radar_disable(struct wlan_objmgr_pdev *pdev); 267 268 /** 269 * utils_dfs_set_update_nol_flag() - Sets update_nol flag. 270 * @pdev: Pointer to DFS pdev object. 271 * @val: update_nol flag. 272 * 273 * wrapper function for dfs_set_update_nol_flag(). this 274 * function called from outside of dfs component. 275 */ 276 QDF_STATUS utils_dfs_set_update_nol_flag(struct wlan_objmgr_pdev *pdev, 277 bool val); 278 279 /** 280 * utils_dfs_get_update_nol_flag() - Returns update_nol flag. 281 * @pdev: Pointer to DFS pdev object. 282 * @nol_flag: Fill nol_flag in this variable. 283 * 284 * wrapper function for dfs_get_update_nol_flag(). this 285 * function called from outside of dfs component. 286 */ 287 QDF_STATUS utils_dfs_get_update_nol_flag(struct wlan_objmgr_pdev *pdev, 288 bool *nol_flag); 289 290 /** 291 * utils_dfs_get_dfs_use_nol() - Get usenol. 292 * @pdev: Pointer to DFS pdev object. 293 * @dfs_use_nol: Pointer to dfs_use_nol. 294 * 295 * wrapper function for dfs_get_dfs_use_nol(). this 296 * function called from outside of dfs component. 297 */ 298 QDF_STATUS utils_dfs_get_dfs_use_nol(struct wlan_objmgr_pdev *pdev, 299 int *dfs_use_nol); 300 301 /** 302 * utils_dfs_get_nol_timeout() - Get NOL timeout. 303 * @pdev: Pointer to DFS pdev object. 304 * @dfs_nol_timeout: Pointer to dfs_nol_timeout. 305 * 306 * wrapper function for dfs_get_nol_timeout(). this 307 * function called from outside of dfs component. 308 */ 309 QDF_STATUS utils_dfs_get_nol_timeout(struct wlan_objmgr_pdev *pdev, 310 int *dfs_nol_timeout); 311 312 /** 313 * utils_dfs_nol_addchan() - Add channel to NOL. 314 * @pdev: Pointer to DFS pdev object. 315 * @freq: channel frequency to add to NOL. 316 * @dfs_nol_timeout: NOL timeout. 317 * 318 * wrapper function for dfs_nol_addchan(). this 319 * function called from outside of dfs component. 320 */ 321 QDF_STATUS utils_dfs_nol_addchan(struct wlan_objmgr_pdev *pdev, 322 uint16_t freq, 323 uint32_t dfs_nol_timeout); 324 325 /** 326 * utils_dfs_nol_update() - NOL update 327 * @pdev: Pointer to DFS pdev object. 328 * 329 * wrapper function for dfs_nol_update(). this 330 * function called from outside of dfs component. 331 */ 332 QDF_STATUS utils_dfs_nol_update(struct wlan_objmgr_pdev *pdev); 333 334 /** 335 * utils_dfs_second_segment_radar_disable() - Disables the second segment radar. 336 * @pdev: Pointer to DFS pdev object. 337 * 338 * This is called when AP detects the radar, to (potentially) disable 339 * the radar code. 340 */ 341 QDF_STATUS utils_dfs_second_segment_radar_disable( 342 struct wlan_objmgr_pdev *pdev); 343 344 /** 345 * utils_dfs_fetch_nol_ie_info() - Fills the arguments with NOL information 346 * needed for sending RCSA. 347 * @pdev: Pointer to DFS pdev object. 348 * @nol_ie_bandwidth: Minimum DFS subchannel Bandwidth. 349 * @nol_ie_startfreq: Radar affected channel list start subchannel's centre 350 * frequency. 351 * @nol_ie_bitmap: Bitmap of radar affected subchannels. 352 */ 353 QDF_STATUS utils_dfs_fetch_nol_ie_info(struct wlan_objmgr_pdev *pdev, 354 uint8_t *nol_ie_bandwidth, 355 uint16_t *nol_ie_startfreq, 356 uint8_t *nol_ie_bitmap); 357 358 /** 359 * utils_dfs_set_rcsa_flags() - Set flags that are required for sending 360 * RCSA and NOL IE. 361 * @pdev: Pointer to DFS pdev object. 362 * @is_rcsa_ie_sent: Boolean to check if RCSA IE should be sent or not. 363 * @is_nol_ie_sent: Boolean to check if NOL IE should be sent or not. 364 */ 365 366 QDF_STATUS utils_dfs_set_rcsa_flags(struct wlan_objmgr_pdev *pdev, 367 bool is_rcsa_ie_sent, 368 bool is_nol_ie_sent); 369 370 /** 371 * utils_dfs_get_rcsa_flags() - Get flags that are required for sending 372 * RCSA and NOL IE. 373 * @pdev: Pointer to DFS pdev object. 374 * @is_rcsa_ie_sent: Boolean to check if RCSA IE should be sent or not. 375 * @is_nol_ie_sent: Boolean to check if NOL IE should be sent or not. 376 */ 377 378 QDF_STATUS utils_dfs_get_rcsa_flags(struct wlan_objmgr_pdev *pdev, 379 bool *is_rcsa_ie_sent, 380 bool *is_nol_ie_sent); 381 382 /** 383 * utils_dfs_process_nol_ie_bitmap() - Update NOL with external radar 384 * information. 385 * @pdev: Pointer to DFS pdev object. 386 * @nol_ie_bandwidth: Minimum DFS subchannel Bandwidth. 387 * @nol_ie_startfreq: Radar affected channel list start channel's 388 * centre frequency. 389 * @nol_ie_bitmap: Bitmap of radar affected subchannels. 390 * 391 * Return: True if NOL IE should be propagated, else false. 392 */ 393 bool utils_dfs_process_nol_ie_bitmap(struct wlan_objmgr_pdev *pdev, 394 uint8_t nol_ie_bandwidth, 395 uint16_t nol_ie_startfreq, 396 uint8_t nol_ie_bitmap); 397 398 /** 399 * utils_dfs_bw_reduce() - Set bw reduce. 400 * @pdev: Pointer to DFS pdev object. 401 * @bw_reduce: Fill bw_reduce value in this variable. 402 * 403 * Return: QDF_STATUS 404 */ 405 QDF_STATUS utils_dfs_bw_reduce(struct wlan_objmgr_pdev *pdev, 406 bool bw_reduce); 407 408 /** 409 * utils_dfs_is_bw_reduce() - Get bw reduce. 410 * @pdev: Pointer to DFS pdev object. 411 * @bw_reduce: Pointer to get bw_reduce value. 412 * 413 * Return: QDF_STATUS 414 */ 415 QDF_STATUS utils_dfs_is_bw_reduce(struct wlan_objmgr_pdev *pdev, 416 bool *bw_reduce); 417 /** 418 * utils_dfs_set_cac_timer_running() - Sets the cac timer running. 419 * @pdev: Pointer to DFS pdev object. 420 * @val: Set this value to dfs_cac_timer_running variable. 421 */ 422 QDF_STATUS utils_dfs_set_cac_timer_running(struct wlan_objmgr_pdev *pdev, 423 int val); 424 425 /** 426 * utils_dfs_get_nol_chfreq_and_chwidth() - Sets the cac timer running. 427 * @pdev: Pointer to DFS pdev object. 428 * @nollist: Pointer to NOL channel entry. 429 * @nol_chfreq: Pointer to save channel frequency. 430 * @nol_chwidth: Pointer to save channel width. 431 * @index: Index into nol list. 432 */ 433 QDF_STATUS utils_dfs_get_nol_chfreq_and_chwidth(struct wlan_objmgr_pdev *pdev, 434 void *nollist, 435 uint32_t *nol_chfreq, 436 uint32_t *nol_chwidth, 437 int index); 438 439 /** 440 * utils_dfs_get_random_channel_for_freq() - Get random channel. 441 * @pdev: Pointer to DFS pdev object. 442 * @flags: random channel selection flags. 443 * @ch_params: current channel params. 444 * @hw_mode: current operating mode. 445 * @target_chan: Pointer to target_chan freq. 446 * @acs_info: acs range info. 447 * 448 * wrapper function for get_random_chan(). this 449 * function called from outside of dfs component. 450 * 451 * Return: QDF_STATUS 452 */ 453 #ifdef CONFIG_CHAN_FREQ_API 454 QDF_STATUS 455 utils_dfs_get_random_channel_for_freq(struct wlan_objmgr_pdev *pdev, 456 uint16_t flags, 457 struct ch_params *ch_params, 458 uint32_t *hw_mode, uint16_t *target_chan, 459 struct dfs_acs_info *acs_info); 460 #endif 461 462 /** 463 * utils_dfs_get_vdev_random_channel_for_freq() - Get random channel for vdev 464 * @pdev: Pointer to DFS pdev object. 465 * @vdev: vdev of the request 466 * @flags: random channel selection flags. 467 * @ch_params: current channel params. 468 * @hw_mode: current operating mode. 469 * @target_chan_freq: Pointer to target_chan_freq. 470 * @acs_info: acs range info. 471 * 472 * Get random channel based on vdev interface type. If the vdev is null, 473 * the function will get random channel by SAP interface type. 474 * 475 * Return: QDF_STATUS 476 */ 477 #ifdef CONFIG_CHAN_FREQ_API 478 QDF_STATUS utils_dfs_get_vdev_random_channel_for_freq( 479 struct wlan_objmgr_pdev *pdev, struct wlan_objmgr_vdev *vdev, 480 uint16_t flags, struct ch_params *ch_params, uint32_t *hw_mode, 481 uint16_t *target_chan_freq, struct dfs_acs_info *acs_info); 482 #endif 483 484 /** 485 * utils_dfs_bw_reduced_channel_for_freq() - Get BW reduced channel. 486 * @pdev: Pointer to DFS pdev object. 487 * @ch_params: current channel params. 488 * @hw_mode: current operating mode. 489 * @target_chan_freq: Pointer to target_chan freq. 490 * 491 * wrapper function for get bw_reduced_channel. this 492 * function called from outside of dfs component. 493 * 494 * Return: QDF_STATUS 495 */ 496 #ifdef CONFIG_CHAN_FREQ_API 497 QDF_STATUS utils_dfs_bw_reduced_channel_for_freq(struct wlan_objmgr_pdev *pdev, 498 struct ch_params *ch_params, 499 uint32_t *hw_mode, 500 uint16_t *target_chan_freq); 501 #endif 502 503 /** 504 * utils_dfs_init_nol() - Initialize nol from platform driver. 505 * @pdev: pdev handler. 506 * 507 * Initialize nol from platform driver. 508 * 509 * Return: None 510 */ 511 #ifdef QCA_DFS_NOL_PLATFORM_DRV_SUPPORT 512 void utils_dfs_init_nol(struct wlan_objmgr_pdev *pdev); 513 #else utils_dfs_init_nol(struct wlan_objmgr_pdev * pdev)514 static inline void utils_dfs_init_nol(struct wlan_objmgr_pdev *pdev) 515 { 516 } 517 #endif 518 /** 519 * utils_dfs_save_nol() - save nol list to platform driver. 520 * @pdev: pdev handler. 521 * 522 * Save nol list to platform driver. 523 * 524 * Return: None 525 */ 526 void utils_dfs_save_nol(struct wlan_objmgr_pdev *pdev); 527 528 /** 529 * utils_dfs_print_nol_channels() - log nol channels. 530 * @pdev: pdev handler. 531 * 532 * log nol channels. 533 * 534 * Return: None 535 */ 536 #ifdef DFS_COMPONENT_ENABLE 537 void utils_dfs_print_nol_channels(struct wlan_objmgr_pdev *pdev); 538 #else utils_dfs_print_nol_channels(struct wlan_objmgr_pdev * pdev)539 static inline void utils_dfs_print_nol_channels(struct wlan_objmgr_pdev *pdev) 540 { 541 } 542 #endif 543 544 /** 545 * utils_dfs_clear_nol_channels() - clear nol list. 546 * @pdev: pdev handler. 547 * 548 * log nol channels. 549 * 550 * Return: None 551 */ 552 void utils_dfs_clear_nol_channels(struct wlan_objmgr_pdev *pdev); 553 554 /** 555 * utils_is_dfs_chan_for_freq() - is channel dfs. 556 * @pdev: pdev handler. 557 * @chan_freq: Channel frequency in MHZ. 558 * 559 * is channel dfs. 560 * 561 * Return: True if channel dfs, else false. 562 */ 563 #ifdef CONFIG_CHAN_FREQ_API utils_is_dfs_chan_for_freq(struct wlan_objmgr_pdev * pdev,uint32_t chan_freq)564 static inline bool utils_is_dfs_chan_for_freq(struct wlan_objmgr_pdev *pdev, 565 uint32_t chan_freq) 566 { 567 return wlan_reg_is_dfs_for_freq(pdev, chan_freq); 568 } 569 #endif 570 571 /** 572 * utils_is_dfs_cfreq2_ch() - is channel dfs cfreq2. 573 * @pdev: pdev handler. 574 * 575 * is channel dfs. 576 * 577 * Return: True if channel dfs cfreq2, else false. 578 */ 579 bool utils_is_dfs_cfreq2_ch(struct wlan_objmgr_pdev *pdev); 580 581 /** 582 * utils_dfs_reg_update_nol_chan_for_freq() - set nol channel 583 * 584 * @pdev: pdev ptr 585 * @ch_list: freq channel list to be returned 586 * @num_ch: number of channels 587 * @nol_ch: nol flag 588 * 589 * Return: void 590 */ 591 #ifdef CONFIG_CHAN_FREQ_API 592 void utils_dfs_reg_update_nol_chan_for_freq(struct wlan_objmgr_pdev *pdev, 593 uint16_t *ch_list, 594 uint8_t num_ch, 595 bool nol_ch); 596 #endif 597 /** 598 * utils_dfs_freq_to_chan() - convert channel freq to channel number 599 * @freq: frequency 600 * 601 * Return: channel number 602 */ 603 uint8_t utils_dfs_freq_to_chan(uint32_t freq); 604 605 /** 606 * utils_dfs_chan_to_freq() - convert channel number to frequency 607 * @chan: channel number 608 * 609 * Return: frequency 610 */ 611 #ifdef DFS_COMPONENT_ENABLE 612 uint32_t utils_dfs_chan_to_freq(uint8_t chan); 613 #else utils_dfs_chan_to_freq(uint8_t chan)614 static inline uint32_t utils_dfs_chan_to_freq(uint8_t chan) 615 { 616 return 0; 617 } 618 #endif 619 /** 620 * utils_dfs_update_cur_chan_flags() - Update DFS channel flag and flagext. 621 * @pdev: Pointer to DFS pdev object. 622 * @flags: New channel flags 623 * @flagext: New Extended flags 624 * 625 * Return: QDF_STATUS 626 */ 627 QDF_STATUS utils_dfs_update_cur_chan_flags(struct wlan_objmgr_pdev *pdev, 628 uint64_t flags, 629 uint16_t flagext); 630 631 #ifdef MOBILE_DFS_SUPPORT 632 /** 633 * utils_dfs_mark_leaking_chan_for_freq() - to mark channel leaking in to nol 634 * @pdev: Pointer to pdev structure. 635 * @ch_width: channel width 636 * @temp_ch_lst_sz: the target channel list 637 * @temp_ch_lst: the target frequency list 638 * 639 * This function removes the channels from temp channel list that 640 * (if selected as target channel) will cause leakage in one of 641 * the NOL channels 642 * 643 * Return: QDF_STATUS 644 */ 645 #ifdef CONFIG_CHAN_FREQ_API 646 QDF_STATUS utils_dfs_mark_leaking_chan_for_freq(struct wlan_objmgr_pdev *pdev, 647 enum phy_ch_width ch_width, 648 uint8_t temp_ch_lst_sz, 649 uint16_t *temp_ch_lst); 650 #endif 651 652 /** 653 * utils_dfs_can_ignore_radar_event() - check whether to skip radar event 654 * processing 655 * @pdev: Pointer to pdev structure. 656 * 657 * This function will check with policy mgr to process radar event or not based 658 * on current concurrency mode and dfs policy. 659 * 660 * Return: true - ignore radar event processing, otherwise false. 661 */ 662 bool utils_dfs_can_ignore_radar_event(struct wlan_objmgr_pdev *pdev); 663 #else 664 #ifdef CONFIG_CHAN_FREQ_API utils_dfs_mark_leaking_chan_for_freq(struct wlan_objmgr_pdev * pdev,enum phy_ch_width ch_width,uint8_t temp_ch_lst_sz,uint16_t * temp_ch_lst)665 static inline QDF_STATUS utils_dfs_mark_leaking_chan_for_freq 666 (struct wlan_objmgr_pdev *pdev, 667 enum phy_ch_width ch_width, 668 uint8_t temp_ch_lst_sz, 669 uint16_t *temp_ch_lst) 670 { 671 return QDF_STATUS_SUCCESS; 672 } 673 #endif 674 static inline bool utils_dfs_can_ignore_radar_event(struct wlan_objmgr_pdev * pdev)675 utils_dfs_can_ignore_radar_event(struct wlan_objmgr_pdev *pdev) 676 { 677 return false; 678 } 679 #endif 680 /** 681 * utils_get_dfsdomain() - Get DFS domain. 682 * @pdev: Pointer to PDEV structure. 683 * 684 * Return: DFS domain. 685 */ 686 int utils_get_dfsdomain(struct wlan_objmgr_pdev *pdev); 687 688 #if defined(WLAN_DFS_PARTIAL_OFFLOAD) && defined(HOST_DFS_SPOOF_TEST) 689 /** 690 * utils_dfs_is_spoof_check_failed() - get spoof check status. 691 * @pdev: pdev ptr 692 * @is_spoof_check_failed: pointer containing the status. 693 * 694 * Return: QDF_STATUS. 695 */ 696 QDF_STATUS utils_dfs_is_spoof_check_failed(struct wlan_objmgr_pdev *pdev, 697 bool *is_spoof_check_failed); 698 699 /** 700 * utils_dfs_is_spoof_done() - get spoof check status. 701 * @pdev: pdev ptr 702 * 703 * Return: True if dfs_spoof_test_done is set. 704 */ 705 bool utils_dfs_is_spoof_done(struct wlan_objmgr_pdev *pdev); 706 #else 707 static inline utils_dfs_is_spoof_check_failed(struct wlan_objmgr_pdev * pdev,bool * is_spoof_check_failed)708 QDF_STATUS utils_dfs_is_spoof_check_failed(struct wlan_objmgr_pdev *pdev, 709 bool *is_spoof_check_failed) 710 { 711 return QDF_STATUS_SUCCESS; 712 } 713 714 static inline utils_dfs_is_spoof_done(struct wlan_objmgr_pdev * pdev)715 bool utils_dfs_is_spoof_done(struct wlan_objmgr_pdev *pdev) 716 { 717 return true; 718 } 719 #endif 720 721 /** 722 * dfs_get_num_chans() - Get the number of channels supported by the regulatory. 723 * 724 * Return: Number of supported channels. 725 */ 726 int dfs_get_num_chans(void); 727 728 /** 729 * utils_dfs_get_chan_list() - Get channel list from regdb. 730 * @pdev: Pointer to DFS pdev object. 731 * @clist: Pointer to current channel list 732 * @num_chan: number of channels in the current channel list. 733 */ 734 void utils_dfs_get_chan_list(struct wlan_objmgr_pdev *pdev, 735 void *clist, 736 uint32_t *num_chan); 737 738 /** 739 * utils_dfs_get_nol_history_chan_list() - Get nol_history channels from regdb 740 * component. 741 * @pdev: Pointer to pdev structure. 742 * @clist: Pointer to channel list. 743 * @num_chan: number of channels. 744 */ 745 void utils_dfs_get_nol_history_chan_list(struct wlan_objmgr_pdev *pdev, 746 void *clist, uint32_t *num_chan); 747 748 /** 749 * utils_dfs_reg_update_nol_history_chan_for_freq() - set nol history channel 750 * 751 * @pdev: pdev ptr 752 * @freq_list: freq channel list to be returned 753 * @num_chan: number of channels 754 * @nol_history_chan: nol history flag 755 * 756 * Return: void 757 */ 758 #ifdef CONFIG_CHAN_FREQ_API 759 void 760 utils_dfs_reg_update_nol_history_chan_for_freq(struct wlan_objmgr_pdev *pdev, 761 uint16_t *freq_list, 762 uint8_t num_chan, 763 bool nol_history_chan); 764 #endif 765 766 /** 767 * utils_dfs_is_cac_required() - Check if CAC is required on the cur_chan. 768 * @pdev: pdev ptr 769 * @cur_chan: Pointer to current channel of wlan_channel structure. 770 * @prev_chan: Pointer to previous channel of wlan_channel structure. 771 * @continue_current_cac: If AP can start CAC then this variable indicates 772 * whether to continue with the current CAC or restart the CAC. This variable 773 * is valid only if this function returns true. 774 * 775 * Return: true if AP requires CAC or can continue current CAC, else false. 776 */ 777 bool utils_dfs_is_cac_required(struct wlan_objmgr_pdev *pdev, 778 struct wlan_channel *cur_chan, 779 struct wlan_channel *prev_chan, 780 bool *continue_current_cac); 781 782 /** 783 * utils_dfs_is_cac_required_on_dfs_curchan() - Check if CAC is required on the 784 * dfs_curchan. 785 * @pdev: pdev ptr 786 * @continue_current_cac: If AP can start CAC then this variable indicates 787 * whether to continue with the current CAC or restart the CAC. This variable 788 * is valid only if this function returns true. 789 * @is_vap_restart: Flag to indicate if vap is restarted/started. 790 * True: VAP restart. False: VAP start 791 * 792 * This API checks if the dfs_curchan is a subset of the dfs_prevchan. 793 * dfs_curchan and dfs_prevchan are updated after start response by 794 * dfs_set_current_channel(). 795 * 796 * Return: true if AP requires CAC or can continue current CAC, else false. 797 */ 798 bool 799 utils_dfs_is_cac_required_on_dfs_curchan(struct wlan_objmgr_pdev *pdev, 800 bool *continue_current_cac, 801 bool is_vap_restart); 802 803 /** 804 * utils_dfs_is_precac_done() - Check if precac has been done in chosen channel 805 * @pdev: Pointer to DFS pdev object. 806 * @wlan_chan: Pointer to wlan channel object that can be accessed by other 807 * components. 808 * Wrapper function for dfs_is_precac_done(). This API is called from outside 809 * the dfs component. 810 * 811 * Return: 812 * * True :If precac is done on channel. 813 * * False:If precac is not done on channel. 814 */ 815 bool utils_dfs_is_precac_done(struct wlan_objmgr_pdev *pdev, 816 struct wlan_channel *wlan_chan); 817 /** 818 * utils_dfs_get_disable_radar_marking() - Retrieve the value of disable radar. 819 * marking. 820 * @pdev: Pointer to DFS pdev object. 821 * @disable_radar_marking: pointer to retrieve the value of 822 * disable_radar_marking. 823 */ 824 #if defined(WLAN_DFS_FULL_OFFLOAD) && defined(QCA_DFS_NOL_OFFLOAD) 825 QDF_STATUS utils_dfs_get_disable_radar_marking(struct wlan_objmgr_pdev *pdev, 826 bool *disable_radar_marking); 827 #else 828 static inline utils_dfs_get_disable_radar_marking(struct wlan_objmgr_pdev * pdev,bool * disable_radar_marking)829 QDF_STATUS utils_dfs_get_disable_radar_marking(struct wlan_objmgr_pdev *pdev, 830 bool *disable_radar_marking) 831 { 832 return QDF_STATUS_SUCCESS; 833 } 834 #endif 835 836 /** 837 * utils_dfs_deliver_event() - Deliver DFS event to userspace. 838 * @pdev: Pointer to DFS pdev object 839 * @freq: frequency radar hit on 840 * @event: event being sent 841 */ 842 void utils_dfs_deliver_event(struct wlan_objmgr_pdev *pdev, uint16_t freq, 843 enum WLAN_DFS_EVENTS event); 844 845 /** 846 * utils_dfs_reset_dfs_prevchan() - Reset DFS previous channel structure. 847 * @pdev: Pointer to DFS pdev object. 848 * 849 * Return: None. 850 */ 851 void utils_dfs_reset_dfs_prevchan(struct wlan_objmgr_pdev *pdev); 852 853 #ifdef QCA_SUPPORT_AGILE_DFS 854 /** 855 * utils_dfs_agile_sm_deliver_evt() - API to post events to DFS Agile SM. 856 * @pdev: Pointer to DFS pdev object. 857 * @event: Event to be posted to DFS AGILE SM. 858 * 859 * Return: None. 860 */ 861 void utils_dfs_agile_sm_deliver_evt(struct wlan_objmgr_pdev *pdev, 862 enum dfs_agile_sm_evt event); 863 #else 864 static inline utils_dfs_agile_sm_deliver_evt(struct wlan_objmgr_pdev * pdev,enum dfs_agile_sm_evt event)865 void utils_dfs_agile_sm_deliver_evt(struct wlan_objmgr_pdev *pdev, 866 enum dfs_agile_sm_evt event) 867 { 868 } 869 #endif/*QCA_SUPPORT_AGILE_DFS*/ 870 871 #ifdef QCA_SUPPORT_ADFS_RCAC 872 /** 873 * utils_dfs_get_rcac_channel() - Get the completed Rolling CAC channel if 874 * available. 875 * @pdev: Pointer to DFS pdev object. 876 * @chan_params: current channel params. 877 * @target_chan_freq: Pointer to target_chan freq. 878 * 879 * Return: QDF_STATUS. 880 */ 881 QDF_STATUS utils_dfs_get_rcac_channel(struct wlan_objmgr_pdev *pdev, 882 struct ch_params *chan_params, 883 qdf_freq_t *target_chan_freq); 884 #else 885 static inline utils_dfs_get_rcac_channel(struct wlan_objmgr_pdev * pdev,struct ch_params * chan_params,qdf_freq_t * target_chan_freq)886 QDF_STATUS utils_dfs_get_rcac_channel(struct wlan_objmgr_pdev *pdev, 887 struct ch_params *chan_params, 888 qdf_freq_t *target_chan_freq) 889 { 890 return QDF_STATUS_SUCCESS; 891 } 892 #endif /* QCA_SUPPORT_ADFS_RCAC */ 893 894 #ifdef ATH_SUPPORT_ZERO_CAC_DFS 895 /** 896 * utils_dfs_precac_status_for_channel() - API to find the preCAC status 897 * of the given channel. 898 * @pdev: Pointer to DFS pdev object. 899 * @deschan: Pointer to desired channel of wlan_channel structure. 900 */ 901 enum precac_status_for_chan 902 utils_dfs_precac_status_for_channel(struct wlan_objmgr_pdev *pdev, 903 struct wlan_channel *deschan); 904 #else 905 static inline enum precac_status_for_chan utils_dfs_precac_status_for_channel(struct wlan_objmgr_pdev * pdev,struct wlan_channel * deschan)906 utils_dfs_precac_status_for_channel(struct wlan_objmgr_pdev *pdev, 907 struct wlan_channel *deschan) 908 { 909 return DFS_INVALID_PRECAC_STATUS; 910 } 911 #endif 912 913 #if defined(WLAN_DISP_CHAN_INFO) 914 /** 915 * utils_dfs_get_chan_dfs_state() - Get the channel state array of the channels 916 * in a radio. 917 * @pdev: Pointer to the pdev. 918 * @dfs_ch_s: Output channel state array of the dfs channels in the radio. 919 * 920 * Return: QDF_STATUS. 921 */ 922 QDF_STATUS utils_dfs_get_chan_dfs_state(struct wlan_objmgr_pdev *pdev, 923 enum channel_dfs_state *dfs_ch_s); 924 925 /** 926 * utils_dfs_update_chan_state_array() - Update the channel state of the dfs 927 * channel indicated by the frequency. The dfs event is converted to 928 * appropriate dfs state. 929 * @pdev: Pointer to the pdev. 930 * @freq: Input frequency. 931 * @event: Input dfs event. 932 * 933 * Return: QDF_STATUS. 934 */ 935 QDF_STATUS utils_dfs_update_chan_state_array(struct wlan_objmgr_pdev *pdev, 936 qdf_freq_t freq, 937 enum WLAN_DFS_EVENTS event); 938 939 /** 940 * dfs_init_chan_state_array() - Initialize the dfs channel state array. 941 * 942 * @pdev: Pointer to the pdev. 943 * 944 * Return: QDF_STATUS. 945 */ 946 QDF_STATUS dfs_init_chan_state_array(struct wlan_objmgr_pdev *pdev); 947 #else 948 static inline utils_dfs_get_chan_dfs_state(struct wlan_objmgr_pdev * pdev,enum channel_dfs_state * dfs_ch_s)949 QDF_STATUS utils_dfs_get_chan_dfs_state(struct wlan_objmgr_pdev *pdev, 950 enum channel_dfs_state *dfs_ch_s) 951 { 952 return QDF_STATUS_E_NOSUPPORT; 953 } 954 955 static inline utils_dfs_update_chan_state_array(struct wlan_objmgr_pdev * pdev,uint16_t freq,enum WLAN_DFS_EVENTS event)956 QDF_STATUS utils_dfs_update_chan_state_array(struct wlan_objmgr_pdev *pdev, 957 uint16_t freq, 958 enum WLAN_DFS_EVENTS event) 959 { 960 return QDF_STATUS_E_NOSUPPORT; 961 } 962 963 static inline dfs_init_chan_state_array(struct wlan_objmgr_pdev * pdev)964 QDF_STATUS dfs_init_chan_state_array(struct wlan_objmgr_pdev *pdev) 965 { 966 return QDF_STATUS_E_NOSUPPORT; 967 } 968 #endif /* WLAN_DISP_CHAN_INFO */ 969 970 /** 971 * utils_dfs_radar_enable() - Enables the radar. 972 * @pdev: Pointer to DFS pdev object. 973 * 974 * This is called each time for eCSA occurs but don't change channel due 975 * to channel switch disabled in dfs test mode. 976 * 977 * Return: QDF_STATUS. 978 */ 979 QDF_STATUS utils_dfs_radar_enable(struct wlan_objmgr_pdev *pdev); 980 981 /** 982 * utils_dfs_convert_freq_to_index() - Converts a channel frequency 983 * to the DFS channel state array index. The input frequency should be a 5 GHz 984 * channel frequency and this check should be done in the caller. 985 * 986 * @freq: Input DFS channel frequency. 987 * @index: Output DFS channel state array index. 988 * 989 * Return: None. 990 */ 991 void utils_dfs_convert_freq_to_index(qdf_freq_t freq, int8_t *index); 992 993 /** 994 * utils_dfs_convert_wlan_phymode_to_chwidth() - Map phymode to 995 * channel width. 996 * @phymode: phymode of type wlan_phymode. 997 * 998 * Return channel width of type phy_ch_width 999 */ 1000 enum phy_ch_width 1001 utils_dfs_convert_wlan_phymode_to_chwidth(enum wlan_phymode phymode); 1002 1003 /** 1004 * utils_dfs_get_radar_bitmap_from_nolie() - Read the NOL IE bitmap of the RCSA 1005 * frame, puncture the nol infected channels and formulate the radar puncture 1006 * bitmap. 1007 * @pdev: Pointer to struct wlan_objmgr_pdev 1008 * @phy_mode: Phymode of enum wlan_phymode. 1009 * @nol_ie_start_freq: Start frequency of the NOL infected channels 1010 * @nol_ie_bitmap : NOL IE bitmap 1011 * 1012 * Return: Punctured radar bitmap 1013 */ 1014 #if defined(WLAN_FEATURE_11BE) && defined(QCA_DFS_BW_EXPAND) && \ 1015 defined(QCA_DFS_RCSA_SUPPORT) 1016 uint16_t 1017 utils_dfs_get_radar_bitmap_from_nolie(struct wlan_objmgr_pdev *pdev, 1018 enum wlan_phymode phy_mode, 1019 qdf_freq_t nol_ie_start_freq, 1020 uint8_t nol_ie_bitmap); 1021 #else 1022 static inline uint16_t utils_dfs_get_radar_bitmap_from_nolie(struct wlan_objmgr_pdev * pdev,enum wlan_phymode phy_mode,qdf_freq_t nol_ie_start_freq,uint8_t nol_ie_bitmap)1023 utils_dfs_get_radar_bitmap_from_nolie(struct wlan_objmgr_pdev *pdev, 1024 enum wlan_phymode phy_mode, 1025 qdf_freq_t nol_ie_start_freq, 1026 uint8_t nol_ie_bitmap) 1027 { 1028 return NO_SCHANS_PUNC; 1029 } 1030 #endif 1031 #endif /* _WLAN_DFS_UTILS_API_H_ */ 1032