1 /* 2 * Copyright (c) 2016-2018 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: This file has the DFS dispatcher API implementation which is exposed 22 * to outside of DFS component. 23 */ 24 #include <wlan_objmgr_pdev_obj.h> 25 #include "wlan_dfs_tgt_api.h" 26 #include "wlan_lmac_if_def.h" 27 #include "wlan_lmac_if_api.h" 28 #include "wlan_dfs_mlme_api.h" 29 #include "../../core/src/dfs.h" 30 #include "../../core/src/dfs_zero_cac.h" 31 #include "../../core/src/dfs_process_radar_found_ind.h" 32 #include <qdf_module.h> 33 #include "../../core/src/dfs_partial_offload_radar.h" 34 35 struct wlan_lmac_if_dfs_tx_ops * 36 wlan_psoc_get_dfs_txops(struct wlan_objmgr_psoc *psoc) 37 { 38 return &((psoc->soc_cb.tx_ops.dfs_tx_ops)); 39 } 40 41 bool tgt_dfs_is_pdev_5ghz(struct wlan_objmgr_pdev *pdev) 42 { 43 struct wlan_lmac_if_dfs_tx_ops *dfs_tx_ops; 44 struct wlan_objmgr_psoc *psoc; 45 bool is_5ghz = false; 46 QDF_STATUS status; 47 48 psoc = wlan_pdev_get_psoc(pdev); 49 if (!psoc) { 50 dfs_err(NULL, WLAN_DEBUG_DFS_ALWAYS, "null psoc"); 51 return false; 52 } 53 54 dfs_tx_ops = wlan_psoc_get_dfs_txops(psoc); 55 if (!(dfs_tx_ops && dfs_tx_ops->dfs_is_pdev_5ghz)) { 56 dfs_err(NULL, WLAN_DEBUG_DFS_ALWAYS, "dfs_tx_ops is null"); 57 return false; 58 } 59 60 status = dfs_tx_ops->dfs_is_pdev_5ghz(pdev, &is_5ghz); 61 if (QDF_IS_STATUS_ERROR(status)) { 62 dfs_err(NULL, WLAN_DEBUG_DFS_ALWAYS, "Failed to get is_5ghz value"); 63 return false; 64 } 65 66 return is_5ghz; 67 } 68 69 QDF_STATUS tgt_dfs_set_current_channel(struct wlan_objmgr_pdev *pdev, 70 uint16_t dfs_ch_freq, 71 uint64_t dfs_ch_flags, 72 uint16_t dfs_ch_flagext, 73 uint8_t dfs_ch_ieee, 74 uint8_t dfs_ch_vhtop_ch_freq_seg1, 75 uint8_t dfs_ch_vhtop_ch_freq_seg2) 76 { 77 struct wlan_dfs *dfs; 78 79 if (!tgt_dfs_is_pdev_5ghz(pdev)) 80 return QDF_STATUS_SUCCESS; 81 82 dfs = global_dfs_to_mlme.pdev_get_comp_private_obj(pdev); 83 if (!dfs) { 84 dfs_err(dfs, WLAN_DEBUG_DFS_ALWAYS, "dfs is NULL"); 85 return QDF_STATUS_E_FAILURE; 86 } 87 88 dfs_set_current_channel(dfs, 89 dfs_ch_freq, 90 dfs_ch_flags, 91 dfs_ch_flagext, 92 dfs_ch_ieee, 93 dfs_ch_vhtop_ch_freq_seg1, 94 dfs_ch_vhtop_ch_freq_seg2); 95 96 return QDF_STATUS_SUCCESS; 97 } 98 qdf_export_symbol(tgt_dfs_set_current_channel); 99 100 QDF_STATUS tgt_dfs_radar_enable(struct wlan_objmgr_pdev *pdev, 101 int no_cac, uint32_t opmode) 102 { 103 struct wlan_dfs *dfs; 104 struct wlan_lmac_if_dfs_tx_ops *dfs_tx_ops; 105 struct wlan_objmgr_psoc *psoc; 106 QDF_STATUS status; 107 108 dfs = global_dfs_to_mlme.pdev_get_comp_private_obj(pdev); 109 if (!dfs) { 110 dfs_err(dfs, WLAN_DEBUG_DFS_ALWAYS, "dfs is NULL"); 111 return QDF_STATUS_E_FAILURE; 112 } 113 114 if (!dfs->dfs_is_offload_enabled) { 115 dfs_radar_enable(dfs, no_cac, opmode); 116 return QDF_STATUS_SUCCESS; 117 } 118 119 psoc = wlan_pdev_get_psoc(pdev); 120 if (!psoc) { 121 dfs_err(dfs, WLAN_DEBUG_DFS_ALWAYS, "psoc is null"); 122 return QDF_STATUS_E_FAILURE; 123 } 124 125 dfs_tx_ops = wlan_psoc_get_dfs_txops(psoc); 126 if (!dfs_tx_ops) { 127 dfs_err(dfs, WLAN_DEBUG_DFS_ALWAYS, "dfs_tx_ops is null"); 128 return QDF_STATUS_E_FAILURE; 129 } 130 131 status = dfs_tx_ops->dfs_send_offload_enable_cmd(pdev, true); 132 if (QDF_IS_STATUS_ERROR(status)) 133 dfs_err(dfs, WLAN_DEBUG_DFS_ALWAYS, 134 "Failed to enable dfs offload, pdev_id: %d", 135 wlan_objmgr_pdev_get_pdev_id(pdev)); 136 137 return status; 138 } 139 qdf_export_symbol(tgt_dfs_radar_enable); 140 141 void tgt_dfs_is_radar_enabled(struct wlan_objmgr_pdev *pdev, int *ignore_dfs) 142 { 143 struct wlan_dfs *dfs; 144 145 dfs = global_dfs_to_mlme.pdev_get_comp_private_obj(pdev); 146 if (!dfs) { 147 dfs_err(dfs, WLAN_DEBUG_DFS_ALWAYS, "dfs is NULL"); 148 return; 149 } 150 151 dfs_is_radar_enabled(dfs, ignore_dfs); 152 } 153 154 qdf_export_symbol(tgt_dfs_is_radar_enabled); 155 156 QDF_STATUS tgt_dfs_process_phyerr(struct wlan_objmgr_pdev *pdev, 157 void *buf, 158 uint16_t datalen, 159 uint8_t r_rssi, 160 uint8_t r_ext_rssi, 161 uint32_t r_rs_tstamp, 162 uint64_t r_fulltsf) 163 { 164 struct wlan_dfs *dfs; 165 166 dfs = global_dfs_to_mlme.pdev_get_comp_private_obj(pdev); 167 if (!dfs) { 168 dfs_err(dfs, WLAN_DEBUG_DFS_ALWAYS, "dfs is NULL"); 169 return QDF_STATUS_E_FAILURE; 170 } 171 172 if (!dfs->dfs_is_offload_enabled) 173 dfs_process_phyerr(dfs, buf, datalen, r_rssi, 174 r_ext_rssi, r_rs_tstamp, r_fulltsf); 175 else 176 dfs_info(dfs, WLAN_DEBUG_DFS_ALWAYS, 177 "Unexpect phyerror as DFS is offloaded, pdev_id: %d", 178 wlan_objmgr_pdev_get_pdev_id(pdev)); 179 180 return QDF_STATUS_SUCCESS; 181 } 182 qdf_export_symbol(tgt_dfs_process_phyerr); 183 184 #ifdef QCA_MCL_DFS_SUPPORT 185 QDF_STATUS tgt_dfs_process_phyerr_filter_offload(struct wlan_objmgr_pdev *pdev, 186 struct radar_event_info 187 *wlan_radar_event) 188 { 189 struct wlan_dfs *dfs; 190 191 dfs = global_dfs_to_mlme.pdev_get_comp_private_obj(pdev); 192 if (!dfs) { 193 dfs_err(dfs, WLAN_DEBUG_DFS_ALWAYS, "dfs is NULL"); 194 return QDF_STATUS_E_FAILURE; 195 } 196 if (!dfs->dfs_is_offload_enabled) 197 dfs_process_phyerr_filter_offload(dfs, wlan_radar_event); 198 else 199 dfs_info(dfs, WLAN_DEBUG_DFS_ALWAYS, 200 "Unexpect phyerror as DFS is offloaded, pdev_id: %d", 201 wlan_objmgr_pdev_get_pdev_id(pdev)); 202 203 return QDF_STATUS_SUCCESS; 204 } 205 qdf_export_symbol(tgt_dfs_process_phyerr_filter_offload); 206 207 QDF_STATUS tgt_dfs_is_phyerr_filter_offload(struct wlan_objmgr_psoc *psoc, 208 bool *is_phyerr_filter_offload) 209 { 210 struct dfs_soc_priv_obj *soc_obj; 211 212 if (!psoc) { 213 dfs_err(NULL, WLAN_DEBUG_DFS_ALWAYS, "psoc is null"); 214 return QDF_STATUS_E_FAILURE; 215 } 216 217 soc_obj = wlan_objmgr_psoc_get_comp_private_obj(psoc, 218 WLAN_UMAC_COMP_DFS); 219 if (!soc_obj) { 220 dfs_err(NULL, WLAN_DEBUG_DFS_ALWAYS, 221 "Failed to get dfs psoc component"); 222 return QDF_STATUS_E_FAILURE; 223 } 224 225 *is_phyerr_filter_offload = soc_obj->dfs_is_phyerr_filter_offload; 226 227 return QDF_STATUS_SUCCESS; 228 } 229 qdf_export_symbol(tgt_dfs_is_phyerr_filter_offload); 230 #else 231 QDF_STATUS tgt_dfs_process_phyerr_filter_offload(struct wlan_objmgr_pdev *pdev, 232 struct radar_event_info 233 *wlan_radar_event) 234 { 235 return QDF_STATUS_SUCCESS; 236 } 237 238 QDF_STATUS tgt_dfs_is_phyerr_filter_offload(struct wlan_objmgr_psoc *psoc, 239 bool *is_phyerr_filter_offload) 240 { 241 return QDF_STATUS_SUCCESS; 242 } 243 #endif 244 245 QDF_STATUS tgt_dfs_is_precac_timer_running(struct wlan_objmgr_pdev *pdev, 246 bool *is_precac_timer_running) 247 { 248 struct wlan_dfs *dfs; 249 250 if (!tgt_dfs_is_pdev_5ghz(pdev)) 251 return QDF_STATUS_SUCCESS; 252 253 dfs = global_dfs_to_mlme.pdev_get_comp_private_obj(pdev); 254 if (!dfs) { 255 dfs_err(dfs, WLAN_DEBUG_DFS_ALWAYS, "dfs is NULL"); 256 return QDF_STATUS_E_FAILURE; 257 } 258 259 *is_precac_timer_running = dfs_is_precac_timer_running(dfs); 260 261 return QDF_STATUS_SUCCESS; 262 } 263 qdf_export_symbol(tgt_dfs_is_precac_timer_running); 264 265 QDF_STATUS tgt_dfs_get_radars(struct wlan_objmgr_pdev *pdev) 266 { 267 struct wlan_dfs *dfs; 268 269 if (!tgt_dfs_is_pdev_5ghz(pdev)) 270 return QDF_STATUS_SUCCESS; 271 272 dfs = global_dfs_to_mlme.pdev_get_comp_private_obj(pdev); 273 if (!dfs) { 274 dfs_err(dfs, WLAN_DEBUG_DFS_ALWAYS, "dfs is NULL"); 275 return QDF_STATUS_E_FAILURE; 276 } 277 278 if (!dfs->dfs_is_offload_enabled) 279 dfs_get_radars(dfs); 280 281 return QDF_STATUS_SUCCESS; 282 } 283 qdf_export_symbol(tgt_dfs_get_radars); 284 285 QDF_STATUS tgt_dfs_destroy_object(struct wlan_objmgr_pdev *pdev) 286 { 287 struct wlan_dfs *dfs; 288 289 dfs = global_dfs_to_mlme.pdev_get_comp_private_obj(pdev); 290 if (!dfs) { 291 dfs_err(dfs, WLAN_DEBUG_DFS_ALWAYS, "dfs is NULL"); 292 return QDF_STATUS_E_FAILURE; 293 } 294 295 dfs_destroy_object(dfs); 296 297 return QDF_STATUS_SUCCESS; 298 } 299 qdf_export_symbol(tgt_dfs_destroy_object); 300 301 #ifdef QCA_MCL_DFS_SUPPORT 302 QDF_STATUS tgt_dfs_set_tx_leakage_threshold(struct wlan_objmgr_pdev *pdev, 303 uint16_t tx_leakage_threshold) 304 { 305 struct wlan_dfs *dfs; 306 307 dfs = global_dfs_to_mlme.pdev_get_comp_private_obj(pdev); 308 if (!dfs) { 309 dfs_err(dfs, WLAN_DEBUG_DFS_ALWAYS, "dfs is NULL"); 310 return QDF_STATUS_E_FAILURE; 311 } 312 313 dfs->tx_leakage_threshold = tx_leakage_threshold; 314 315 return QDF_STATUS_SUCCESS; 316 } 317 qdf_export_symbol(tgt_dfs_set_tx_leakage_threshold); 318 #endif 319 320 QDF_STATUS tgt_dfs_control(struct wlan_objmgr_pdev *pdev, 321 u_int id, 322 void *indata, 323 uint32_t insize, 324 void *outdata, 325 uint32_t *outsize, 326 int *error) 327 { 328 struct wlan_dfs *dfs; 329 330 dfs = global_dfs_to_mlme.pdev_get_comp_private_obj(pdev); 331 if (!dfs) { 332 dfs_err(dfs, WLAN_DEBUG_DFS_ALWAYS, "dfs is NULL"); 333 return QDF_STATUS_E_FAILURE; 334 } 335 336 *error = dfs_control(dfs, id, indata, insize, outdata, outsize); 337 338 return QDF_STATUS_SUCCESS; 339 } 340 qdf_export_symbol(tgt_dfs_control); 341 342 QDF_STATUS tgt_dfs_find_vht80_chan_for_precac(struct wlan_objmgr_pdev *pdev, 343 uint32_t chan_mode, 344 uint8_t ch_freq_seg1, 345 uint32_t *cfreq1, 346 uint32_t *cfreq2, 347 uint32_t *phy_mode, 348 bool *dfs_set_cfreq2, 349 bool *set_agile) 350 { 351 struct wlan_dfs *dfs; 352 353 dfs = global_dfs_to_mlme.pdev_get_comp_private_obj(pdev); 354 if (!dfs) { 355 dfs_err(dfs, WLAN_DEBUG_DFS_ALWAYS, "dfs is NULL"); 356 return QDF_STATUS_E_FAILURE; 357 } 358 359 dfs_find_vht80_chan_for_precac(dfs, 360 chan_mode, 361 ch_freq_seg1, 362 cfreq1, 363 cfreq2, 364 phy_mode, 365 dfs_set_cfreq2, 366 set_agile); 367 368 return QDF_STATUS_SUCCESS; 369 } 370 qdf_export_symbol(tgt_dfs_find_vht80_chan_for_precac); 371 372 QDF_STATUS tgt_dfs_process_radar_ind(struct wlan_objmgr_pdev *pdev, 373 struct radar_found_info *radar_found) 374 { 375 struct wlan_dfs *dfs; 376 QDF_STATUS status = QDF_STATUS_E_FAILURE; 377 378 if (!pdev) { 379 dfs_err(NULL, WLAN_DEBUG_DFS_ALWAYS, "null pdev"); 380 return status; 381 } 382 383 dfs = global_dfs_to_mlme.pdev_get_comp_private_obj(pdev); 384 if (!dfs) { 385 dfs_err(dfs, WLAN_DEBUG_DFS_ALWAYS, "dfs is null"); 386 return status; 387 } 388 389 dfs->dfs_radar_found_for_fo = 1; 390 status = dfs_process_radar_ind(dfs, radar_found); 391 dfs->dfs_radar_found_for_fo = 0; 392 393 return status; 394 } 395 qdf_export_symbol(tgt_dfs_process_radar_ind); 396 397 #ifndef QCA_MCL_DFS_SUPPORT 398 QDF_STATUS tgt_dfs_cac_complete(struct wlan_objmgr_pdev *pdev, uint32_t vdev_id) 399 { 400 return QDF_STATUS_SUCCESS; 401 } 402 #else 403 QDF_STATUS tgt_dfs_cac_complete(struct wlan_objmgr_pdev *pdev, uint32_t vdev_id) 404 { 405 dfs_mlme_proc_cac(pdev, vdev_id); 406 407 return QDF_STATUS_SUCCESS; 408 } 409 #endif 410 qdf_export_symbol(tgt_dfs_cac_complete); 411 412 QDF_STATUS tgt_dfs_reg_ev_handler(struct wlan_objmgr_psoc *psoc) 413 { 414 struct wlan_lmac_if_dfs_tx_ops *dfs_tx_ops; 415 416 if (!psoc) { 417 dfs_err(NULL, WLAN_DEBUG_DFS_ALWAYS, "null psoc"); 418 return QDF_STATUS_E_FAILURE; 419 } 420 421 dfs_tx_ops = wlan_psoc_get_dfs_txops(psoc); 422 if (!dfs_tx_ops) { 423 dfs_err(NULL, WLAN_DEBUG_DFS_ALWAYS, "null dfs_tx_ops"); 424 return QDF_STATUS_E_FAILURE; 425 } 426 427 if (dfs_tx_ops->dfs_reg_ev_handler) 428 return dfs_tx_ops->dfs_reg_ev_handler(psoc); 429 430 return QDF_STATUS_E_FAILURE; 431 } 432 qdf_export_symbol(tgt_dfs_reg_ev_handler); 433 434 QDF_STATUS tgt_dfs_stop(struct wlan_objmgr_pdev *pdev) 435 { 436 struct wlan_dfs *dfs; 437 438 if (!tgt_dfs_is_pdev_5ghz(pdev)) 439 return QDF_STATUS_SUCCESS; 440 441 dfs = global_dfs_to_mlme.pdev_get_comp_private_obj(pdev); 442 if (!dfs) { 443 dfs_err(dfs, WLAN_DEBUG_DFS_ALWAYS, "dfs is NULL"); 444 return QDF_STATUS_E_FAILURE; 445 } 446 447 dfs_stop(dfs); 448 449 return QDF_STATUS_SUCCESS; 450 } 451 qdf_export_symbol(tgt_dfs_stop); 452 453 QDF_STATUS tgt_dfs_process_emulate_bang_radar_cmd(struct wlan_objmgr_pdev *pdev, 454 struct dfs_emulate_bang_radar_test_cmd *dfs_unit_test) 455 { 456 struct wlan_objmgr_psoc *psoc; 457 struct wlan_lmac_if_dfs_tx_ops *dfs_tx_ops; 458 459 psoc = wlan_pdev_get_psoc(pdev); 460 if (!psoc) { 461 dfs_err(NULL, WLAN_DEBUG_DFS_ALWAYS, "psoc is null"); 462 return QDF_STATUS_E_FAILURE; 463 } 464 465 dfs_tx_ops = wlan_psoc_get_dfs_txops(psoc); 466 if (dfs_tx_ops && dfs_tx_ops->dfs_process_emulate_bang_radar_cmd) 467 return dfs_tx_ops->dfs_process_emulate_bang_radar_cmd(pdev, 468 dfs_unit_test); 469 else 470 dfs_err(NULL, WLAN_DEBUG_DFS_ALWAYS, 471 "dfs_tx_ops=%pK", dfs_tx_ops); 472 473 return QDF_STATUS_E_FAILURE; 474 } 475 qdf_export_symbol(tgt_dfs_process_emulate_bang_radar_cmd); 476 477 #ifdef QCA_MCL_DFS_SUPPORT 478 QDF_STATUS tgt_dfs_set_phyerr_filter_offload(struct wlan_objmgr_pdev *pdev) 479 { 480 struct wlan_objmgr_psoc *psoc; 481 struct wlan_lmac_if_dfs_tx_ops *dfs_tx_ops; 482 struct dfs_soc_priv_obj *soc_obj; 483 484 psoc = wlan_pdev_get_psoc(pdev); 485 if (!psoc) { 486 dfs_err(NULL, WLAN_DEBUG_DFS_ALWAYS, "psoc is null"); 487 return QDF_STATUS_E_FAILURE; 488 } 489 490 soc_obj = wlan_objmgr_psoc_get_comp_private_obj(psoc, 491 WLAN_UMAC_COMP_DFS); 492 if (!soc_obj) { 493 dfs_err(NULL, WLAN_DEBUG_DFS_ALWAYS, 494 "Failed to get dfs psoc component"); 495 return QDF_STATUS_E_FAILURE; 496 } 497 dfs_tx_ops = wlan_psoc_get_dfs_txops(psoc); 498 if (dfs_tx_ops && dfs_tx_ops->dfs_set_phyerr_filter_offload) 499 return dfs_tx_ops->dfs_set_phyerr_filter_offload(pdev, 500 soc_obj->dfs_is_phyerr_filter_offload); 501 else 502 dfs_err(NULL, WLAN_DEBUG_DFS_ALWAYS, 503 "dfs_tx_ops=%pK", dfs_tx_ops); 504 505 return QDF_STATUS_E_FAILURE; 506 } 507 qdf_export_symbol(tgt_dfs_set_phyerr_filter_offload); 508 #endif 509 510 #if defined(WLAN_DFS_PARTIAL_OFFLOAD) && defined(HOST_DFS_SPOOF_TEST) 511 QDF_STATUS 512 tgt_dfs_send_avg_params_to_fw(struct wlan_objmgr_pdev *pdev, 513 struct dfs_radar_found_params *params) 514 { 515 struct wlan_objmgr_psoc *psoc; 516 struct wlan_lmac_if_dfs_tx_ops *dfs_tx_ops; 517 struct wlan_dfs *dfs; 518 QDF_STATUS status = QDF_STATUS_E_FAILURE; 519 520 dfs = global_dfs_to_mlme.pdev_get_comp_private_obj(pdev); 521 if (!dfs) { 522 dfs_err(dfs, WLAN_DEBUG_DFS_ALWAYS, "dfs is NULL"); 523 return status; 524 } 525 526 psoc = wlan_pdev_get_psoc(pdev); 527 if (!psoc) { 528 dfs_err(NULL, WLAN_DEBUG_DFS_ALWAYS, "psoc is null"); 529 return status; 530 } 531 532 dfs_tx_ops = wlan_psoc_get_dfs_txops(psoc); 533 if (dfs_tx_ops && dfs_tx_ops->dfs_send_avg_radar_params_to_fw) 534 status = dfs_tx_ops->dfs_send_avg_radar_params_to_fw(pdev, 535 params); 536 537 if (QDF_IS_STATUS_SUCCESS(status)) { 538 dfs->dfs_average_params_sent = 1; 539 dfs_info(dfs, WLAN_DEBUG_DFS_ALWAYS, 540 "Average radar parameters sent %d", 541 dfs->dfs_average_params_sent); 542 } 543 544 return status; 545 } 546 547 qdf_export_symbol(tgt_dfs_send_avg_params_to_fw); 548 549 QDF_STATUS tgt_dfs_action_on_status_from_fw(struct wlan_objmgr_pdev *pdev, 550 uint32_t *status) 551 { 552 struct wlan_dfs *dfs; 553 554 dfs = global_dfs_to_mlme.pdev_get_comp_private_obj(pdev); 555 if (!dfs) { 556 dfs_err(dfs, WLAN_DEBUG_DFS_ALWAYS, "dfs is NULL"); 557 return QDF_STATUS_E_FAILURE; 558 } 559 560 dfs_action_on_fw_radar_status_check(dfs, status); 561 562 return QDF_STATUS_SUCCESS; 563 } 564 565 qdf_export_symbol(tgt_dfs_action_on_status_from_fw); 566 567 QDF_STATUS tgt_dfs_reset_spoof_test(struct wlan_objmgr_pdev *pdev) 568 { 569 struct wlan_dfs *dfs; 570 571 if (!tgt_dfs_is_pdev_5ghz(pdev)) 572 return QDF_STATUS_SUCCESS; 573 574 dfs = global_dfs_to_mlme.pdev_get_comp_private_obj(pdev); 575 if (!dfs) { 576 dfs_err(dfs, WLAN_DEBUG_DFS_ALWAYS, "dfs is NULL"); 577 return QDF_STATUS_E_FAILURE; 578 } 579 580 dfs_reset_spoof_test(dfs); 581 582 return QDF_STATUS_SUCCESS; 583 } 584 585 qdf_export_symbol(tgt_dfs_reset_spoof_test); 586 #endif 587