1 /* 2 * Copyright (c) 2016-2020 The Linux Foundation. All rights reserved. 3 * 4 * 5 * Permission to use, copy, modify, and/or distribute this software for 6 * any purpose with or without fee is hereby granted, provided that the 7 * above copyright notice and this permission notice appear in all 8 * copies. 9 * 10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL 11 * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED 12 * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE 13 * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL 14 * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR 15 * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER 16 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR 17 * PERFORMANCE OF THIS SOFTWARE. 18 */ 19 20 /** 21 * DOC: Functions to call mlme functions from DFS component. 22 */ 23 24 #include "wlan_dfs_mlme_api.h" 25 #include "wlan_objmgr_vdev_obj.h" 26 #include "wlan_objmgr_pdev_obj.h" 27 #include "../../core/src/dfs.h" 28 #include "scheduler_api.h" 29 #include <wlan_reg_ucfg_api.h> 30 #ifdef QCA_MCL_DFS_SUPPORT 31 #include "wni_api.h" 32 #endif 33 34 void dfs_mlme_start_rcsa(struct wlan_objmgr_pdev *pdev, 35 bool *wait_for_csa) 36 { 37 if (global_dfs_to_mlme.dfs_start_rcsa) 38 global_dfs_to_mlme.dfs_start_rcsa(pdev, wait_for_csa); 39 } 40 41 #ifndef QCA_MCL_DFS_SUPPORT 42 #ifdef CONFIG_CHAN_NUM_API 43 void dfs_mlme_mark_dfs(struct wlan_objmgr_pdev *pdev, 44 uint8_t ieee, 45 uint16_t freq, 46 uint8_t vhtop_ch_freq_seg2, 47 uint64_t flags) 48 { 49 if (global_dfs_to_mlme.mlme_mark_dfs) 50 global_dfs_to_mlme.mlme_mark_dfs(pdev, 51 ieee, 52 freq, 53 vhtop_ch_freq_seg2, 54 flags); 55 } 56 #endif 57 #ifdef CONFIG_CHAN_FREQ_API 58 void dfs_mlme_mark_dfs_for_freq(struct wlan_objmgr_pdev *pdev, 59 uint8_t ieee, 60 uint16_t freq, 61 uint16_t vhtop_ch_freq_seg2, 62 uint64_t flags) 63 { 64 if (global_dfs_to_mlme.mlme_mark_dfs_for_freq) 65 global_dfs_to_mlme.mlme_mark_dfs_for_freq(pdev, 66 ieee, 67 freq, 68 vhtop_ch_freq_seg2, 69 flags); 70 } 71 #endif 72 #else /* Else of ndef MCL_DFS_SUPPORT */ 73 #ifdef CONFIG_CHAN_NUM_API 74 static void dfs_send_radar_ind(struct wlan_objmgr_pdev *pdev, 75 void *object, 76 void *arg) 77 { 78 struct scheduler_msg sme_msg = {0}; 79 uint8_t vdev_id = wlan_vdev_get_id((struct wlan_objmgr_vdev *)object); 80 81 sme_msg.type = eWNI_SME_DFS_RADAR_FOUND; 82 sme_msg.bodyptr = NULL; 83 sme_msg.bodyval = vdev_id; 84 scheduler_post_message(QDF_MODULE_ID_DFS, 85 QDF_MODULE_ID_SME, 86 QDF_MODULE_ID_SME, &sme_msg); 87 dfs_info(NULL, WLAN_DEBUG_DFS_ALWAYS, "eWNI_SME_DFS_RADAR_FOUND pdev%d posted", 88 vdev_id); 89 } 90 #endif 91 92 /* dfs_send_radar_ind_for_freq() - Send radar found indication. 93 * @pdev: Pointer to wlan_objmgr_pdev. 94 * @object: Pointer to wlan_objmgr_vdev. 95 * @arg : void pointer to args. 96 */ 97 #ifdef CONFIG_CHAN_FREQ_API 98 static void dfs_send_radar_ind_for_freq(struct wlan_objmgr_pdev *pdev, 99 void *object, 100 void *arg) 101 { 102 struct scheduler_msg sme_msg = {0}; 103 uint8_t vdev_id = wlan_vdev_get_id((struct wlan_objmgr_vdev *)object); 104 105 sme_msg.type = eWNI_SME_DFS_RADAR_FOUND; 106 sme_msg.bodyptr = NULL; 107 sme_msg.bodyval = vdev_id; 108 scheduler_post_message(QDF_MODULE_ID_DFS, 109 QDF_MODULE_ID_SME, 110 QDF_MODULE_ID_SME, &sme_msg); 111 dfs_info(NULL, WLAN_DEBUG_DFS_ALWAYS, "eWNI_SME_DFS_RADAR_FOUND pdev%d posted", 112 vdev_id); 113 } 114 #endif 115 116 #ifdef CONFIG_CHAN_NUM_API 117 void dfs_mlme_mark_dfs(struct wlan_objmgr_pdev *pdev, 118 uint8_t ieee, 119 uint16_t freq, 120 uint8_t vhtop_ch_freq_seg2, 121 uint64_t flags) 122 { 123 struct wlan_objmgr_vdev *vdev; 124 125 if (!pdev) { 126 dfs_err(NULL, WLAN_DEBUG_DFS_ALWAYS, "null pdev"); 127 return; 128 } 129 130 vdev = wlan_pdev_peek_active_first_vdev(pdev, WLAN_DFS_ID); 131 132 if (vdev) { 133 dfs_send_radar_ind(pdev, vdev, NULL); 134 wlan_objmgr_vdev_release_ref(vdev, WLAN_DFS_ID); 135 } 136 } 137 #endif 138 139 #ifdef CONFIG_CHAN_FREQ_API 140 void dfs_mlme_mark_dfs_for_freq(struct wlan_objmgr_pdev *pdev, 141 uint8_t ieee, 142 uint16_t freq, 143 uint16_t vhtop_ch_freq_seg2, 144 uint64_t flags) 145 { 146 struct wlan_objmgr_vdev *vdev; 147 148 if (!pdev) { 149 dfs_err(NULL, WLAN_DEBUG_DFS_ALWAYS, "null pdev"); 150 return; 151 } 152 153 vdev = wlan_pdev_peek_active_first_vdev(pdev, WLAN_DFS_ID); 154 155 if (vdev) { 156 dfs_send_radar_ind_for_freq(pdev, vdev, NULL); 157 wlan_objmgr_vdev_release_ref(vdev, WLAN_DFS_ID); 158 } 159 } 160 #endif 161 #endif 162 163 #ifndef QCA_MCL_DFS_SUPPORT 164 #ifdef CONFIG_CHAN_NUM_API 165 void dfs_mlme_start_csa(struct wlan_objmgr_pdev *pdev, 166 uint8_t ieee_chan, uint16_t freq, 167 uint8_t cfreq2, uint64_t flags) 168 { 169 if (global_dfs_to_mlme.mlme_start_csa) 170 global_dfs_to_mlme.mlme_start_csa(pdev, ieee_chan, freq, cfreq2, 171 flags); 172 } 173 #endif 174 #ifdef CONFIG_CHAN_FREQ_API 175 void dfs_mlme_start_csa_for_freq(struct wlan_objmgr_pdev *pdev, 176 uint8_t ieee_chan, uint16_t freq, 177 uint16_t cfreq2, uint64_t flags) 178 { 179 if (global_dfs_to_mlme.mlme_start_csa_for_freq) 180 global_dfs_to_mlme.mlme_start_csa_for_freq(pdev, ieee_chan, 181 freq, cfreq2, flags); 182 } 183 #endif 184 #else 185 #ifdef CONFIG_CHAN_NUM_API 186 void dfs_mlme_start_csa(struct wlan_objmgr_pdev *pdev, 187 uint8_t ieee_chan, uint16_t freq, 188 uint8_t cfreq2, uint64_t flags) 189 { 190 struct wlan_objmgr_vdev *vdev; 191 192 if (!pdev) { 193 dfs_err(NULL, WLAN_DEBUG_DFS_ALWAYS, "null pdev"); 194 return; 195 } 196 197 vdev = wlan_pdev_peek_active_first_vdev(pdev, WLAN_DFS_ID); 198 199 if (vdev) { 200 dfs_send_radar_ind(pdev, vdev, NULL); 201 wlan_objmgr_vdev_release_ref(vdev, WLAN_DFS_ID); 202 } 203 } 204 #endif 205 #ifdef CONFIG_CHAN_FREQ_API 206 void dfs_mlme_start_csa_for_freq(struct wlan_objmgr_pdev *pdev, 207 uint8_t ieee_chan, uint16_t freq, 208 uint16_t cfreq2, uint64_t flags) 209 { 210 struct wlan_objmgr_vdev *vdev; 211 212 if (!pdev) { 213 dfs_err(NULL, WLAN_DEBUG_DFS_ALWAYS, "null pdev"); 214 return; 215 } 216 217 vdev = wlan_pdev_peek_active_first_vdev(pdev, WLAN_DFS_ID); 218 219 if (vdev) { 220 dfs_send_radar_ind(pdev, vdev, NULL); 221 wlan_objmgr_vdev_release_ref(vdev, WLAN_DFS_ID); 222 } 223 } 224 #endif 225 #endif 226 227 #ifndef QCA_MCL_DFS_SUPPORT 228 void dfs_mlme_proc_cac(struct wlan_objmgr_pdev *pdev, uint32_t vdev_id) 229 { 230 if (global_dfs_to_mlme.mlme_proc_cac) 231 global_dfs_to_mlme.mlme_proc_cac(pdev); 232 } 233 #else 234 void dfs_mlme_proc_cac(struct wlan_objmgr_pdev *pdev, uint32_t vdev_id) 235 { 236 struct scheduler_msg sme_msg = {0}; 237 238 sme_msg.type = eWNI_SME_DFS_CAC_COMPLETE; 239 sme_msg.bodyptr = NULL; 240 sme_msg.bodyval = vdev_id; 241 scheduler_post_message(QDF_MODULE_ID_DFS, 242 QDF_MODULE_ID_SME, 243 QDF_MODULE_ID_SME, &sme_msg); 244 dfs_info(NULL, WLAN_DEBUG_DFS_ALWAYS, "eWNI_SME_DFS_CAC_COMPLETE vdev%d posted", 245 vdev_id); 246 } 247 #endif 248 249 void dfs_mlme_deliver_event_up_after_cac(struct wlan_objmgr_pdev *pdev) 250 { 251 if (global_dfs_to_mlme.mlme_deliver_event_up_after_cac) 252 global_dfs_to_mlme.mlme_deliver_event_up_after_cac( 253 pdev); 254 } 255 256 void dfs_mlme_get_dfs_ch_nchans(struct wlan_objmgr_pdev *pdev, 257 int *nchans) 258 { 259 if (global_dfs_to_mlme.mlme_get_dfs_ch_nchans) 260 global_dfs_to_mlme.mlme_get_dfs_ch_nchans(pdev, 261 nchans); 262 } 263 264 #ifdef CONFIG_CHAN_NUM_API 265 QDF_STATUS dfs_mlme_get_extchan(struct wlan_objmgr_pdev *pdev, 266 uint16_t *dfs_ch_freq, 267 uint64_t *dfs_ch_flags, 268 uint16_t *dfs_ch_flagext, 269 uint8_t *dfs_ch_ieee, 270 uint8_t *dfs_ch_vhtop_ch_freq_seg1, 271 uint8_t *dfs_ch_vhtop_ch_freq_seg2) 272 { 273 if (global_dfs_to_mlme.mlme_get_extchan) 274 return global_dfs_to_mlme.mlme_get_extchan(pdev, 275 dfs_ch_freq, 276 dfs_ch_flags, 277 dfs_ch_flagext, 278 dfs_ch_ieee, 279 dfs_ch_vhtop_ch_freq_seg1, 280 dfs_ch_vhtop_ch_freq_seg2); 281 282 return QDF_STATUS_E_FAILURE; 283 } 284 #endif 285 286 #ifdef CONFIG_CHAN_FREQ_API 287 QDF_STATUS dfs_mlme_get_extchan_for_freq(struct wlan_objmgr_pdev *pdev, 288 uint16_t *dfs_chan_freq, 289 uint64_t *dfs_chan_flags, 290 uint16_t *dfs_chan_flagext, 291 uint8_t *dfs_chan_ieee, 292 uint8_t *dfs_chan_vhtop_ch_freq_seg1, 293 uint8_t *dfs_chan_vhtop_ch_freq_seg2, 294 uint16_t *dfs_chan_mhz_freq_seg1, 295 uint16_t *dfs_chan_mhz_freq_seg2) 296 { 297 if (global_dfs_to_mlme.mlme_get_extchan_for_freq) 298 return global_dfs_to_mlme.mlme_get_extchan_for_freq(pdev, 299 dfs_chan_freq, 300 dfs_chan_flags, 301 dfs_chan_flagext, 302 dfs_chan_ieee, 303 dfs_chan_vhtop_ch_freq_seg1, 304 dfs_chan_vhtop_ch_freq_seg2, 305 dfs_chan_mhz_freq_seg1, 306 dfs_chan_mhz_freq_seg2); 307 308 return QDF_STATUS_E_FAILURE; 309 } 310 #endif 311 312 void dfs_mlme_set_no_chans_available(struct wlan_objmgr_pdev *pdev, 313 int val) 314 { 315 if (global_dfs_to_mlme.mlme_set_no_chans_available) 316 global_dfs_to_mlme.mlme_set_no_chans_available( 317 pdev, 318 val); 319 } 320 321 int dfs_mlme_ieee2mhz(struct wlan_objmgr_pdev *pdev, int ieee, uint64_t flag) 322 { 323 int freq = 0; 324 325 if (global_dfs_to_mlme.mlme_ieee2mhz) 326 global_dfs_to_mlme.mlme_ieee2mhz(pdev, 327 ieee, 328 flag, 329 &freq); 330 331 return freq; 332 } 333 334 #ifdef CONFIG_CHAN_NUM_API 335 QDF_STATUS 336 dfs_mlme_find_dot11_channel(struct wlan_objmgr_pdev *pdev, 337 uint8_t ieee, 338 uint8_t des_cfreq2, 339 int mode, 340 uint16_t *dfs_ch_freq, 341 uint64_t *dfs_ch_flags, 342 uint16_t *dfs_ch_flagext, 343 uint8_t *dfs_ch_ieee, 344 uint8_t *dfs_ch_vhtop_ch_freq_seg1, 345 uint8_t *dfs_ch_vhtop_ch_freq_seg2) 346 { 347 if (global_dfs_to_mlme.mlme_find_dot11_channel) 348 return global_dfs_to_mlme.mlme_find_dot11_channel(pdev, 349 ieee, 350 des_cfreq2, 351 mode, 352 dfs_ch_freq, 353 dfs_ch_flags, 354 dfs_ch_flagext, 355 dfs_ch_ieee, 356 dfs_ch_vhtop_ch_freq_seg1, 357 dfs_ch_vhtop_ch_freq_seg2); 358 return QDF_STATUS_E_FAILURE; 359 } 360 #endif 361 362 #ifdef CONFIG_CHAN_FREQ_API 363 QDF_STATUS 364 dfs_mlme_find_dot11_chan_for_freq(struct wlan_objmgr_pdev *pdev, 365 uint16_t freq, 366 uint16_t des_cfreq2, 367 int mode, 368 uint16_t *dfs_chan_freq, 369 uint64_t *dfs_chan_flag, 370 uint16_t *dfs_flagext, 371 uint8_t *dfs_chan_ieee, 372 uint8_t *dfs_cfreq1, 373 uint8_t *dfs_cfreq2, 374 uint16_t *cfreq1_mhz, 375 uint16_t *cfreq2_mhz) 376 { 377 if (global_dfs_to_mlme.mlme_find_dot11_chan_for_freq) 378 return global_dfs_to_mlme.mlme_find_dot11_chan_for_freq(pdev, 379 freq, 380 des_cfreq2, 381 mode, 382 dfs_chan_freq, 383 dfs_chan_flag, 384 dfs_flagext, 385 dfs_chan_ieee, 386 dfs_cfreq1, 387 dfs_cfreq2, 388 cfreq1_mhz, 389 cfreq2_mhz); 390 return QDF_STATUS_E_FAILURE; 391 } 392 #endif 393 394 #ifdef CONFIG_CHAN_NUM_API 395 void dfs_mlme_get_dfs_ch_channels(struct wlan_objmgr_pdev *pdev, 396 uint16_t *dfs_ch_freq, 397 uint64_t *dfs_ch_flags, 398 uint16_t *dfs_ch_flagext, 399 uint8_t *dfs_ch_ieee, 400 uint8_t *dfs_ch_vhtop_ch_freq_seg1, 401 uint8_t *dfs_ch_vhtop_ch_freq_seg2, 402 int index) 403 { 404 if (global_dfs_to_mlme.mlme_get_dfs_ch_channels) 405 global_dfs_to_mlme.mlme_get_dfs_ch_channels(pdev, 406 dfs_ch_freq, 407 dfs_ch_flags, 408 dfs_ch_flagext, 409 dfs_ch_ieee, 410 dfs_ch_vhtop_ch_freq_seg1, 411 dfs_ch_vhtop_ch_freq_seg2, 412 index); 413 } 414 #endif 415 416 #ifdef CONFIG_CHAN_FREQ_API 417 void dfs_mlme_get_dfs_channels_for_freq(struct wlan_objmgr_pdev *pdev, 418 uint16_t *dfs_chan_freq, 419 uint64_t *dfs_chan_flags, 420 uint16_t *dfs_chan_flagext, 421 uint8_t *dfs_chan_ieee, 422 uint8_t *dfs_chan_vhtop_freq_seg1, 423 uint8_t *dfs_chan_vhtop_freq_seg2, 424 uint16_t *dfs_ch_mhz_freq_seg1, 425 uint16_t *dfs_ch_mhz_freq_seg2, 426 int index) 427 { 428 if (global_dfs_to_mlme.mlme_get_dfs_channels_for_freq) 429 global_dfs_to_mlme.mlme_get_dfs_channels_for_freq(pdev, 430 dfs_chan_freq, 431 dfs_chan_flags, 432 dfs_chan_flagext, 433 dfs_chan_ieee, 434 dfs_chan_vhtop_freq_seg1, 435 dfs_chan_vhtop_freq_seg2, 436 dfs_ch_mhz_freq_seg1, 437 dfs_ch_mhz_freq_seg2, 438 index); 439 } 440 #endif 441 442 uint32_t dfs_mlme_dfs_ch_flags_ext(struct wlan_objmgr_pdev *pdev) 443 { 444 uint16_t flag_ext = 0; 445 446 if (global_dfs_to_mlme.mlme_dfs_ch_flags_ext) 447 global_dfs_to_mlme.mlme_dfs_ch_flags_ext(pdev, 448 &flag_ext); 449 450 return flag_ext; 451 } 452 453 void dfs_mlme_channel_change_by_precac(struct wlan_objmgr_pdev *pdev) 454 { 455 if (global_dfs_to_mlme.mlme_channel_change_by_precac) 456 global_dfs_to_mlme.mlme_channel_change_by_precac( 457 pdev); 458 } 459 460 void dfs_mlme_nol_timeout_notification(struct wlan_objmgr_pdev *pdev) 461 { 462 if (global_dfs_to_mlme.mlme_nol_timeout_notification) 463 global_dfs_to_mlme.mlme_nol_timeout_notification( 464 pdev); 465 } 466 467 void dfs_mlme_clist_update(struct wlan_objmgr_pdev *pdev, 468 void *nollist, 469 int nentries) 470 { 471 if (global_dfs_to_mlme.mlme_clist_update) 472 global_dfs_to_mlme.mlme_clist_update(pdev, 473 nollist, 474 nentries); 475 } 476 477 #ifdef CONFIG_CHAN_NUM_API 478 int dfs_mlme_get_cac_timeout(struct wlan_objmgr_pdev *pdev, 479 uint16_t dfs_ch_freq, 480 uint8_t dfs_ch_vhtop_ch_freq_seg2, 481 uint64_t dfs_ch_flags) 482 { 483 int cac_timeout = 0; 484 485 if (global_dfs_to_mlme.mlme_get_cac_timeout) 486 global_dfs_to_mlme.mlme_get_cac_timeout(pdev, 487 dfs_ch_freq, 488 dfs_ch_vhtop_ch_freq_seg2, 489 dfs_ch_flags, 490 &cac_timeout); 491 492 return cac_timeout; 493 } 494 #endif 495 496 #ifdef CONFIG_CHAN_FREQ_API 497 int dfs_mlme_get_cac_timeout_for_freq(struct wlan_objmgr_pdev *pdev, 498 uint16_t dfs_chan_freq, 499 uint16_t dfs_cfreq2, 500 uint64_t dfs_ch_flags) 501 { 502 int cac_timeout = 0; 503 504 if (global_dfs_to_mlme.mlme_get_cac_timeout_for_freq) 505 global_dfs_to_mlme.mlme_get_cac_timeout_for_freq(pdev, 506 dfs_chan_freq, 507 dfs_cfreq2, 508 dfs_ch_flags, 509 &cac_timeout); 510 511 return cac_timeout; 512 } 513 #endif 514 515 #if defined(WLAN_DFS_PARTIAL_OFFLOAD) && defined(HOST_DFS_SPOOF_TEST) 516 int dfs_mlme_rebuild_chan_list_with_non_dfs_channels( 517 struct wlan_objmgr_pdev *pdev) 518 { 519 if (!global_dfs_to_mlme.mlme_rebuild_chan_list_with_non_dfs_channels) 520 return 1; 521 522 return global_dfs_to_mlme.mlme_rebuild_chan_list_with_non_dfs_channels( 523 pdev); 524 } 525 526 void dfs_mlme_restart_vaps_with_non_dfs_chan(struct wlan_objmgr_pdev *pdev, 527 int no_chans_avail) 528 { 529 if (!global_dfs_to_mlme.mlme_restart_vaps_with_non_dfs_chan) 530 return; 531 532 global_dfs_to_mlme.mlme_restart_vaps_with_non_dfs_chan(pdev, 533 no_chans_avail); 534 } 535 #endif 536 537 #if defined(WLAN_SUPPORT_PRIMARY_ALLOWED_CHAN) 538 bool dfs_mlme_check_allowed_prim_chanlist(struct wlan_objmgr_pdev *pdev, 539 uint32_t chan_freq) 540 { 541 if (!global_dfs_to_mlme.mlme_check_allowed_prim_chanlist) 542 return true; 543 544 return global_dfs_to_mlme.mlme_check_allowed_prim_chanlist(pdev, 545 chan_freq); 546 } 547 548 #endif 549 550 #if defined(WLAN_DFS_FULL_OFFLOAD) && defined(QCA_DFS_NOL_OFFLOAD) 551 void dfs_mlme_handle_dfs_scan_violation(struct wlan_objmgr_pdev *pdev) 552 { 553 bool dfs_enable = 0; 554 555 /*Disable all DFS channels in master channel list and ic channel list */ 556 ucfg_reg_enable_dfs_channels(pdev, dfs_enable); 557 558 /* send the updated channel list to FW */ 559 global_dfs_to_mlme.mlme_update_scan_channel_list(pdev); 560 } 561 #endif 562 563 bool dfs_mlme_is_opmode_sta(struct wlan_objmgr_pdev *pdev) 564 { 565 if (!global_dfs_to_mlme.mlme_is_opmode_sta) 566 return false; 567 568 return global_dfs_to_mlme.mlme_is_opmode_sta(pdev); 569 } 570 571 void dfs_mlme_acquire_radar_mode_switch_lock(struct wlan_objmgr_pdev *pdev) 572 { 573 if (!global_dfs_to_mlme.mlme_acquire_radar_mode_switch_lock) 574 return; 575 576 global_dfs_to_mlme.mlme_acquire_radar_mode_switch_lock(pdev); 577 } 578 579 void dfs_mlme_release_radar_mode_switch_lock(struct wlan_objmgr_pdev *pdev) 580 { 581 if (!global_dfs_to_mlme.mlme_release_radar_mode_switch_lock) 582 return; 583 584 global_dfs_to_mlme.mlme_release_radar_mode_switch_lock(pdev); 585 } 586