1 /* 2 * Copyright (c) 2011,2017-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 #include <wlan_spectral_tgt_api.h> 21 #include <wlan_spectral_utils_api.h> 22 #include <target_type.h> 23 24 #ifdef DIRECT_BUF_RX_ENABLE 25 #include <target_if_direct_buf_rx_api.h> 26 27 #define DBR_EVENT_TIMEOUT_IN_MS_SPECTRAL 1 28 #define DBR_NUM_RESP_PER_EVENT_SPECTRAL 2 29 #endif 30 31 void * tgt_get_pdev_target_handle(struct wlan_objmgr_pdev * pdev)32 tgt_get_pdev_target_handle(struct wlan_objmgr_pdev *pdev) 33 { 34 struct pdev_spectral *ps; 35 36 if (!pdev) { 37 spectral_err("PDEV is NULL!"); 38 return NULL; 39 } 40 ps = wlan_objmgr_pdev_get_comp_private_obj(pdev, 41 WLAN_UMAC_COMP_SPECTRAL); 42 if (!ps) { 43 spectral_err("PDEV SPECTRAL object is NULL!"); 44 return NULL; 45 } 46 return ps->psptrl_target_handle; 47 } 48 49 void * tgt_get_psoc_target_handle(struct wlan_objmgr_psoc * psoc)50 tgt_get_psoc_target_handle(struct wlan_objmgr_psoc *psoc) 51 { 52 struct spectral_context *sc; 53 54 if (!psoc) { 55 spectral_err("psoc is NULL!"); 56 return NULL; 57 } 58 59 sc = wlan_objmgr_psoc_get_comp_private_obj(psoc, 60 WLAN_UMAC_COMP_SPECTRAL); 61 if (!sc) { 62 spectral_err("psoc Spectral object is NULL!"); 63 return NULL; 64 } 65 66 return sc->psoc_target_handle; 67 } 68 69 QDF_STATUS tgt_spectral_control(struct wlan_objmgr_pdev * pdev,struct spectral_cp_request * sscan_req)70 tgt_spectral_control( 71 struct wlan_objmgr_pdev *pdev, 72 struct spectral_cp_request *sscan_req) 73 { 74 struct spectral_context *sc; 75 76 if (!pdev) { 77 spectral_err("PDEV is NULL!"); 78 return -EPERM; 79 } 80 sc = spectral_get_spectral_ctx_from_pdev(pdev); 81 if (!sc) { 82 spectral_err("spectral context is NULL!"); 83 return -EPERM; 84 } 85 return spectral_control_cmn(pdev, sscan_req); 86 } 87 88 void * tgt_pdev_spectral_init(struct wlan_objmgr_pdev * pdev)89 tgt_pdev_spectral_init(struct wlan_objmgr_pdev *pdev) 90 { 91 struct wlan_objmgr_psoc *psoc = NULL; 92 struct wlan_lmac_if_tx_ops *tx_ops; 93 94 psoc = wlan_pdev_get_psoc(pdev); 95 tx_ops = wlan_psoc_get_lmac_if_txops(psoc); 96 if (!tx_ops) { 97 spectral_err("tx_ops is NULL"); 98 return NULL; 99 } 100 101 return tx_ops->sptrl_tx_ops.sptrlto_pdev_spectral_init(pdev); 102 } 103 104 void tgt_pdev_spectral_deinit(struct wlan_objmgr_pdev * pdev)105 tgt_pdev_spectral_deinit(struct wlan_objmgr_pdev *pdev) 106 { 107 struct wlan_objmgr_psoc *psoc = NULL; 108 struct wlan_lmac_if_tx_ops *tx_ops; 109 110 psoc = wlan_pdev_get_psoc(pdev); 111 tx_ops = wlan_psoc_get_lmac_if_txops(psoc); 112 if (!tx_ops) { 113 spectral_err("tx_ops is NULL"); 114 return; 115 } 116 117 tx_ops->sptrl_tx_ops.sptrlto_pdev_spectral_deinit(pdev); 118 } 119 120 void * tgt_psoc_spectral_init(struct wlan_objmgr_psoc * psoc)121 tgt_psoc_spectral_init(struct wlan_objmgr_psoc *psoc) 122 { 123 struct wlan_lmac_if_tx_ops *tx_ops; 124 125 if (!psoc) { 126 spectral_err("psoc is null"); 127 return NULL; 128 } 129 130 tx_ops = wlan_psoc_get_lmac_if_txops(psoc); 131 if (!tx_ops) { 132 spectral_err("tx_ops is NULL"); 133 return NULL; 134 } 135 136 return tx_ops->sptrl_tx_ops.sptrlto_psoc_spectral_init(psoc); 137 } 138 139 void tgt_psoc_spectral_deinit(struct wlan_objmgr_psoc * psoc)140 tgt_psoc_spectral_deinit(struct wlan_objmgr_psoc *psoc) 141 { 142 struct wlan_lmac_if_tx_ops *tx_ops; 143 144 if (!psoc) { 145 spectral_err("psoc is null"); 146 return; 147 } 148 149 tx_ops = wlan_psoc_get_lmac_if_txops(psoc); 150 if (!tx_ops) { 151 spectral_err("tx_ops is NULL"); 152 return; 153 } 154 155 tx_ops->sptrl_tx_ops.sptrlto_psoc_spectral_deinit(psoc); 156 } 157 158 QDF_STATUS tgt_set_spectral_config(struct wlan_objmgr_pdev * pdev,const struct spectral_cp_param * param,const enum spectral_scan_mode smode,enum spectral_cp_error_code * err)159 tgt_set_spectral_config(struct wlan_objmgr_pdev *pdev, 160 const struct spectral_cp_param *param, 161 const enum spectral_scan_mode smode, 162 enum spectral_cp_error_code *err) 163 { 164 struct wlan_objmgr_psoc *psoc = NULL; 165 struct wlan_lmac_if_tx_ops *tx_ops; 166 167 psoc = wlan_pdev_get_psoc(pdev); 168 tx_ops = wlan_psoc_get_lmac_if_txops(psoc); 169 if (!tx_ops) { 170 spectral_err("tx_ops is NULL"); 171 return QDF_STATUS_E_FAILURE; 172 } 173 174 return tx_ops->sptrl_tx_ops.sptrlto_set_spectral_config(pdev, param, 175 smode, err); 176 } 177 178 QDF_STATUS tgt_get_spectral_config(struct wlan_objmgr_pdev * pdev,struct spectral_config * sptrl_config,const enum spectral_scan_mode smode)179 tgt_get_spectral_config(struct wlan_objmgr_pdev *pdev, 180 struct spectral_config *sptrl_config, 181 const enum spectral_scan_mode smode) 182 { 183 struct wlan_objmgr_psoc *psoc = NULL; 184 struct wlan_lmac_if_tx_ops *tx_ops; 185 186 psoc = wlan_pdev_get_psoc(pdev); 187 tx_ops = wlan_psoc_get_lmac_if_txops(psoc); 188 if (!tx_ops) { 189 spectral_err("tx_ops is NULL"); 190 return QDF_STATUS_E_FAILURE; 191 } 192 193 return tx_ops->sptrl_tx_ops.sptrlto_get_spectral_config(pdev, 194 sptrl_config, 195 smode); 196 } 197 198 QDF_STATUS tgt_start_spectral_scan(struct wlan_objmgr_pdev * pdev,uint8_t vdev_id,enum spectral_scan_mode smode,enum spectral_cp_error_code * err)199 tgt_start_spectral_scan(struct wlan_objmgr_pdev *pdev, 200 uint8_t vdev_id, 201 enum spectral_scan_mode smode, 202 enum spectral_cp_error_code *err) 203 { 204 struct wlan_objmgr_psoc *psoc = NULL; 205 struct wlan_lmac_if_tx_ops *tx_ops; 206 207 psoc = wlan_pdev_get_psoc(pdev); 208 tx_ops = wlan_psoc_get_lmac_if_txops(psoc); 209 if (!tx_ops) { 210 spectral_err("tx_ops is NULL"); 211 return QDF_STATUS_E_FAILURE; 212 } 213 214 return tx_ops->sptrl_tx_ops.sptrlto_start_spectral_scan(pdev, vdev_id, 215 smode, err); 216 } 217 218 QDF_STATUS tgt_stop_spectral_scan(struct wlan_objmgr_pdev * pdev,enum spectral_scan_mode smode,enum spectral_cp_error_code * err)219 tgt_stop_spectral_scan(struct wlan_objmgr_pdev *pdev, 220 enum spectral_scan_mode smode, 221 enum spectral_cp_error_code *err) 222 { 223 struct wlan_objmgr_psoc *psoc; 224 struct wlan_lmac_if_tx_ops *tx_ops; 225 226 psoc = wlan_pdev_get_psoc(pdev); 227 tx_ops = wlan_psoc_get_lmac_if_txops(psoc); 228 if (!tx_ops) { 229 spectral_err("tx_ops is NULL"); 230 return QDF_STATUS_E_FAILURE; 231 } 232 233 return tx_ops->sptrl_tx_ops.sptrlto_stop_spectral_scan(pdev, smode, 234 err); 235 } 236 237 bool tgt_is_spectral_active(struct wlan_objmgr_pdev * pdev,enum spectral_scan_mode smode)238 tgt_is_spectral_active(struct wlan_objmgr_pdev *pdev, 239 enum spectral_scan_mode smode) 240 { 241 struct wlan_objmgr_psoc *psoc = NULL; 242 struct wlan_lmac_if_tx_ops *tx_ops; 243 244 psoc = wlan_pdev_get_psoc(pdev); 245 tx_ops = wlan_psoc_get_lmac_if_txops(psoc); 246 if (!tx_ops) { 247 spectral_err("tx_ops is NULL"); 248 return false; 249 } 250 251 return tx_ops->sptrl_tx_ops.sptrlto_is_spectral_active(pdev, smode); 252 } 253 254 bool tgt_is_spectral_enabled(struct wlan_objmgr_pdev * pdev,enum spectral_scan_mode smode)255 tgt_is_spectral_enabled(struct wlan_objmgr_pdev *pdev, 256 enum spectral_scan_mode smode) 257 { 258 struct wlan_objmgr_psoc *psoc = NULL; 259 struct wlan_lmac_if_tx_ops *tx_ops; 260 261 psoc = wlan_pdev_get_psoc(pdev); 262 tx_ops = wlan_psoc_get_lmac_if_txops(psoc); 263 if (!tx_ops) { 264 spectral_err("tx_ops is NULL"); 265 return false; 266 } 267 268 return tx_ops->sptrl_tx_ops.sptrlto_is_spectral_enabled(pdev, smode); 269 } 270 271 QDF_STATUS tgt_set_debug_level(struct wlan_objmgr_pdev * pdev,u_int32_t debug_level)272 tgt_set_debug_level(struct wlan_objmgr_pdev *pdev, u_int32_t debug_level) 273 { 274 struct wlan_objmgr_psoc *psoc = NULL; 275 struct wlan_lmac_if_tx_ops *tx_ops; 276 277 psoc = wlan_pdev_get_psoc(pdev); 278 tx_ops = wlan_psoc_get_lmac_if_txops(psoc); 279 if (!tx_ops) { 280 spectral_err("tx_ops is NULL"); 281 return QDF_STATUS_E_FAILURE; 282 } 283 284 return tx_ops->sptrl_tx_ops.sptrlto_set_debug_level(pdev, debug_level); 285 } 286 287 u_int32_t tgt_get_debug_level(struct wlan_objmgr_pdev * pdev)288 tgt_get_debug_level(struct wlan_objmgr_pdev *pdev) 289 { 290 struct wlan_objmgr_psoc *psoc = NULL; 291 struct wlan_lmac_if_tx_ops *tx_ops; 292 293 psoc = wlan_pdev_get_psoc(pdev); 294 tx_ops = wlan_psoc_get_lmac_if_txops(psoc); 295 if (!tx_ops) { 296 spectral_err("tx_ops is NULL"); 297 return -EINVAL; 298 } 299 300 return tx_ops->sptrl_tx_ops.sptrlto_get_debug_level(pdev); 301 } 302 303 QDF_STATUS tgt_get_spectral_capinfo(struct wlan_objmgr_pdev * pdev,struct spectral_caps * scaps)304 tgt_get_spectral_capinfo(struct wlan_objmgr_pdev *pdev, 305 struct spectral_caps *scaps) 306 { 307 struct wlan_objmgr_psoc *psoc = NULL; 308 struct wlan_lmac_if_tx_ops *tx_ops; 309 310 psoc = wlan_pdev_get_psoc(pdev); 311 tx_ops = wlan_psoc_get_lmac_if_txops(psoc); 312 if (!tx_ops) { 313 spectral_err("tx_ops is NULL"); 314 return QDF_STATUS_E_FAILURE; 315 } 316 317 return tx_ops->sptrl_tx_ops.sptrlto_get_spectral_capinfo(pdev, scaps); 318 } 319 320 QDF_STATUS tgt_get_spectral_diagstats(struct wlan_objmgr_pdev * pdev,struct spectral_diag_stats * stats)321 tgt_get_spectral_diagstats(struct wlan_objmgr_pdev *pdev, 322 struct spectral_diag_stats *stats) 323 { 324 struct wlan_objmgr_psoc *psoc = NULL; 325 struct wlan_lmac_if_tx_ops *tx_ops; 326 327 psoc = wlan_pdev_get_psoc(pdev); 328 tx_ops = wlan_psoc_get_lmac_if_txops(psoc); 329 if (!tx_ops) { 330 spectral_err("tx_ops is NULL"); 331 return QDF_STATUS_E_FAILURE; 332 } 333 334 return tx_ops->sptrl_tx_ops.sptrlto_get_spectral_diagstats(pdev, stats); 335 } 336 337 QDF_STATUS tgt_register_spectral_wmi_ops(struct wlan_objmgr_psoc * psoc,struct spectral_wmi_ops * wmi_ops)338 tgt_register_spectral_wmi_ops(struct wlan_objmgr_psoc *psoc, 339 struct spectral_wmi_ops *wmi_ops) 340 { 341 struct wlan_lmac_if_sptrl_tx_ops *psptrl_tx_ops = NULL; 342 struct wlan_lmac_if_tx_ops *tx_ops; 343 344 if (!psoc) { 345 spectral_err("psoc is null"); 346 return QDF_STATUS_E_INVAL; 347 } 348 349 if (!wmi_ops) { 350 spectral_err("WMI operations table is null"); 351 return QDF_STATUS_E_INVAL; 352 } 353 354 tx_ops = wlan_psoc_get_lmac_if_txops(psoc); 355 if (!tx_ops) { 356 spectral_err("tx_ops is NULL"); 357 return QDF_STATUS_E_INVAL; 358 } 359 360 psptrl_tx_ops = &tx_ops->sptrl_tx_ops; 361 362 return psptrl_tx_ops->sptrlto_register_spectral_wmi_ops(psoc, wmi_ops); 363 } 364 365 QDF_STATUS tgt_register_spectral_tgt_ops(struct wlan_objmgr_psoc * psoc,struct spectral_tgt_ops * tgt_ops)366 tgt_register_spectral_tgt_ops(struct wlan_objmgr_psoc *psoc, 367 struct spectral_tgt_ops *tgt_ops) 368 { 369 struct wlan_lmac_if_sptrl_tx_ops *psptrl_tx_ops; 370 struct wlan_lmac_if_tx_ops *tx_ops; 371 372 if (!psoc) { 373 spectral_err("psoc is null"); 374 return QDF_STATUS_E_INVAL; 375 } 376 377 if (!tgt_ops) { 378 spectral_err("Target operations table is null"); 379 return QDF_STATUS_E_INVAL; 380 } 381 382 tx_ops = wlan_psoc_get_lmac_if_txops(psoc); 383 if (!tx_ops) { 384 spectral_err("tx_ops is NULL"); 385 return QDF_STATUS_E_INVAL; 386 } 387 388 psptrl_tx_ops = &tx_ops->sptrl_tx_ops; 389 390 return psptrl_tx_ops->sptrlto_register_spectral_tgt_ops(psoc, tgt_ops); 391 } 392 393 void tgt_spectral_register_nl_cb(struct wlan_objmgr_pdev * pdev,struct spectral_nl_cb * nl_cb)394 tgt_spectral_register_nl_cb( 395 struct wlan_objmgr_pdev *pdev, 396 struct spectral_nl_cb *nl_cb) 397 { 398 struct wlan_objmgr_psoc *psoc = NULL; 399 struct wlan_lmac_if_sptrl_tx_ops *psptrl_tx_ops = NULL; 400 struct wlan_lmac_if_tx_ops *tx_ops; 401 402 if (!pdev) { 403 spectral_err("PDEV is NULL!"); 404 return; 405 } 406 psoc = wlan_pdev_get_psoc(pdev); 407 tx_ops = wlan_psoc_get_lmac_if_txops(psoc); 408 if (!tx_ops) { 409 spectral_err("tx_ops is NULL"); 410 return; 411 } 412 413 psptrl_tx_ops = &tx_ops->sptrl_tx_ops; 414 415 return psptrl_tx_ops->sptrlto_register_netlink_cb(pdev, nl_cb); 416 } 417 418 bool tgt_spectral_use_nl_bcast(struct wlan_objmgr_pdev * pdev)419 tgt_spectral_use_nl_bcast(struct wlan_objmgr_pdev *pdev) 420 { 421 struct wlan_objmgr_psoc *psoc = NULL; 422 struct wlan_lmac_if_sptrl_tx_ops *psptrl_tx_ops = NULL; 423 struct wlan_lmac_if_tx_ops *tx_ops; 424 425 psoc = wlan_pdev_get_psoc(pdev); 426 tx_ops = wlan_psoc_get_lmac_if_txops(psoc); 427 if (!tx_ops) { 428 spectral_err("tx_ops is NULL"); 429 return false; 430 } 431 432 psptrl_tx_ops = &tx_ops->sptrl_tx_ops; 433 434 return psptrl_tx_ops->sptrlto_use_nl_bcast(pdev); 435 } 436 tgt_spectral_deregister_nl_cb(struct wlan_objmgr_pdev * pdev)437 void tgt_spectral_deregister_nl_cb(struct wlan_objmgr_pdev *pdev) 438 { 439 struct wlan_objmgr_psoc *psoc = NULL; 440 struct wlan_lmac_if_sptrl_tx_ops *psptrl_tx_ops = NULL; 441 struct wlan_lmac_if_tx_ops *tx_ops; 442 443 if (!pdev) { 444 spectral_err("PDEV is NULL!"); 445 return; 446 } 447 psoc = wlan_pdev_get_psoc(pdev); 448 tx_ops = wlan_psoc_get_lmac_if_txops(psoc); 449 if (!tx_ops) { 450 spectral_err("tx_ops is NULL"); 451 return; 452 } 453 454 psptrl_tx_ops = &tx_ops->sptrl_tx_ops; 455 456 psptrl_tx_ops->sptrlto_deregister_netlink_cb(pdev); 457 } 458 459 int tgt_spectral_process_report(struct wlan_objmgr_pdev * pdev,void * payload)460 tgt_spectral_process_report(struct wlan_objmgr_pdev *pdev, 461 void *payload) 462 { 463 struct wlan_objmgr_psoc *psoc = NULL; 464 struct wlan_lmac_if_sptrl_tx_ops *psptrl_tx_ops = NULL; 465 struct wlan_lmac_if_tx_ops *tx_ops; 466 467 psoc = wlan_pdev_get_psoc(pdev); 468 tx_ops = wlan_psoc_get_lmac_if_txops(psoc); 469 if (!tx_ops) { 470 spectral_err("tx_ops is NULL"); 471 return -EINVAL; 472 } 473 474 psptrl_tx_ops = &tx_ops->sptrl_tx_ops; 475 476 return psptrl_tx_ops->sptrlto_process_spectral_report(pdev, payload); 477 } 478 479 uint32_t tgt_spectral_get_target_type(struct wlan_objmgr_psoc * psoc)480 tgt_spectral_get_target_type(struct wlan_objmgr_psoc *psoc) 481 { 482 uint32_t target_type = 0; 483 struct wlan_lmac_if_target_tx_ops *target_type_tx_ops; 484 struct wlan_lmac_if_tx_ops *tx_ops; 485 486 tx_ops = wlan_psoc_get_lmac_if_txops(psoc); 487 if (!tx_ops) { 488 spectral_err("tx_ops is NULL"); 489 return target_type; 490 } 491 492 target_type_tx_ops = &tx_ops->target_tx_ops; 493 494 if (target_type_tx_ops->tgt_get_tgt_type) 495 target_type = target_type_tx_ops->tgt_get_tgt_type(psoc); 496 497 return target_type; 498 } 499 500 #ifdef DIRECT_BUF_RX_ENABLE 501 QDF_STATUS tgt_spectral_register_to_dbr(struct wlan_objmgr_pdev * pdev)502 tgt_spectral_register_to_dbr(struct wlan_objmgr_pdev *pdev) 503 { 504 struct wlan_objmgr_psoc *psoc; 505 struct wlan_lmac_if_direct_buf_rx_tx_ops *dbr_tx_ops = NULL; 506 struct wlan_lmac_if_sptrl_tx_ops *sptrl_tx_ops = NULL; 507 struct dbr_module_config dbr_config = {0}; 508 struct wlan_lmac_if_tx_ops *tx_ops; 509 510 psoc = wlan_pdev_get_psoc(pdev); 511 tx_ops = wlan_psoc_get_lmac_if_txops(psoc); 512 if (!tx_ops) { 513 spectral_err("tx_ops is NULL"); 514 return QDF_STATUS_E_FAILURE; 515 } 516 517 dbr_tx_ops = &tx_ops->dbr_tx_ops; 518 sptrl_tx_ops = &tx_ops->sptrl_tx_ops; 519 dbr_config.num_resp_per_event = DBR_NUM_RESP_PER_EVENT_SPECTRAL; 520 dbr_config.event_timeout_in_ms = DBR_EVENT_TIMEOUT_IN_MS_SPECTRAL; 521 522 if ((sptrl_tx_ops->sptrlto_direct_dma_support) && 523 (sptrl_tx_ops->sptrlto_direct_dma_support(pdev))) { 524 if (sptrl_tx_ops->sptrlto_check_and_do_dbr_buff_debug) 525 sptrl_tx_ops->sptrlto_check_and_do_dbr_buff_debug(pdev); 526 if (dbr_tx_ops->direct_buf_rx_module_register) 527 dbr_tx_ops->direct_buf_rx_module_register 528 (pdev, 0, &dbr_config, 529 spectral_dbr_event_handler); 530 if (sptrl_tx_ops->sptrlto_check_and_do_dbr_ring_debug) 531 sptrl_tx_ops->sptrlto_check_and_do_dbr_ring_debug(pdev); 532 } 533 534 return QDF_STATUS_SUCCESS; 535 } 536 537 QDF_STATUS tgt_spectral_unregister_to_dbr(struct wlan_objmgr_pdev * pdev)538 tgt_spectral_unregister_to_dbr(struct wlan_objmgr_pdev *pdev) 539 { 540 struct wlan_objmgr_psoc *psoc; 541 struct wlan_lmac_if_direct_buf_rx_tx_ops *dbr_tx_ops = NULL; 542 struct wlan_lmac_if_sptrl_tx_ops *sptrl_tx_ops = NULL; 543 struct wlan_lmac_if_tx_ops *tx_ops; 544 545 psoc = wlan_pdev_get_psoc(pdev); 546 tx_ops = wlan_psoc_get_lmac_if_txops(psoc); 547 if (!tx_ops) { 548 spectral_err("tx_ops is NULL"); 549 return QDF_STATUS_E_FAILURE; 550 } 551 552 dbr_tx_ops = &tx_ops->dbr_tx_ops; 553 sptrl_tx_ops = &tx_ops->sptrl_tx_ops; 554 555 if ((sptrl_tx_ops->sptrlto_direct_dma_support) && 556 (sptrl_tx_ops->sptrlto_direct_dma_support(pdev))) { 557 /* Stop DBR debug as the buffers itself are freed now */ 558 if (dbr_tx_ops->direct_buf_rx_stop_ring_debug) 559 dbr_tx_ops->direct_buf_rx_stop_ring_debug(pdev, 0); 560 561 /*No need to zero-out as buffers are anyway getting freed*/ 562 if (dbr_tx_ops->direct_buf_rx_stop_buffer_poisoning) 563 dbr_tx_ops->direct_buf_rx_stop_buffer_poisoning 564 (pdev, 0); 565 if (dbr_tx_ops->direct_buf_rx_module_unregister) 566 dbr_tx_ops->direct_buf_rx_module_unregister 567 (pdev, 0); 568 569 return QDF_STATUS_SUCCESS; 570 } 571 572 return QDF_STATUS_E_FAILURE; 573 } 574 #else 575 QDF_STATUS tgt_spectral_register_to_dbr(struct wlan_objmgr_pdev * pdev)576 tgt_spectral_register_to_dbr(struct wlan_objmgr_pdev *pdev) 577 { 578 return QDF_STATUS_SUCCESS; 579 } 580 581 QDF_STATUS tgt_spectral_unregister_to_dbr(struct wlan_objmgr_pdev * pdev)582 tgt_spectral_unregister_to_dbr(struct wlan_objmgr_pdev *pdev) 583 { 584 return QDF_STATUS_SUCCESS; 585 } 586 #endif /* DIRECT_BUF_RX_ENABLE */ 587 588 #ifdef DIRECT_BUF_RX_DEBUG tgt_set_spectral_dma_debug(struct wlan_objmgr_pdev * pdev,enum spectral_dma_debug dma_debug_type,bool dma_debug_enable)589 QDF_STATUS tgt_set_spectral_dma_debug(struct wlan_objmgr_pdev *pdev, 590 enum spectral_dma_debug dma_debug_type, 591 bool dma_debug_enable) 592 { 593 struct wlan_objmgr_psoc *psoc; 594 struct wlan_lmac_if_tx_ops *tx_ops; 595 596 psoc = wlan_pdev_get_psoc(pdev); 597 if (!psoc) { 598 spectral_err("psoc is NULL!"); 599 return QDF_STATUS_E_FAILURE; 600 } 601 602 tx_ops = wlan_psoc_get_lmac_if_txops(psoc); 603 if (!tx_ops) { 604 spectral_err("tx_ops is NULL"); 605 return QDF_STATUS_E_FAILURE; 606 } 607 608 return tx_ops->sptrl_tx_ops.sptrlto_set_dma_debug(pdev, dma_debug_type, 609 dma_debug_enable); 610 } 611 #else tgt_set_spectral_dma_debug(struct wlan_objmgr_pdev * pdev,enum spectral_dma_debug dma_debug_type,bool dma_debug_enable)612 QDF_STATUS tgt_set_spectral_dma_debug(struct wlan_objmgr_pdev *pdev, 613 enum spectral_dma_debug dma_debug_type, 614 bool dma_debug_enable) 615 { 616 return QDF_STATUS_SUCCESS; 617 } 618 #endif 619 620 QDF_STATUS tgt_spectral_register_events(struct wlan_objmgr_psoc * psoc)621 tgt_spectral_register_events(struct wlan_objmgr_psoc *psoc) 622 { 623 struct wlan_lmac_if_tx_ops *tx_ops; 624 struct wlan_lmac_if_sptrl_tx_ops *psptrl_tx_ops; 625 626 if (!psoc) { 627 spectral_err("psoc is null"); 628 return QDF_STATUS_E_INVAL; 629 } 630 631 tx_ops = wlan_psoc_get_lmac_if_txops(psoc); 632 if (!tx_ops) { 633 spectral_err("tx_ops is NULL"); 634 return QDF_STATUS_E_INVAL; 635 } 636 637 psptrl_tx_ops = &tx_ops->sptrl_tx_ops; 638 639 return psptrl_tx_ops->sptrlto_register_events(psoc); 640 } 641 642 QDF_STATUS tgt_spectral_unregister_events(struct wlan_objmgr_psoc * psoc)643 tgt_spectral_unregister_events(struct wlan_objmgr_psoc *psoc) 644 { 645 struct wlan_lmac_if_tx_ops *tx_ops; 646 struct wlan_lmac_if_sptrl_tx_ops *psptrl_tx_ops; 647 648 if (!psoc) { 649 spectral_err("psoc is null"); 650 return QDF_STATUS_E_INVAL; 651 } 652 653 tx_ops = wlan_psoc_get_lmac_if_txops(psoc); 654 if (!tx_ops) { 655 spectral_err("tx_ops is NULL"); 656 return QDF_STATUS_E_INVAL; 657 } 658 659 psptrl_tx_ops = &tx_ops->sptrl_tx_ops; 660 661 return psptrl_tx_ops->sptrlto_unregister_events(psoc); 662 } 663 664 QDF_STATUS tgt_spectral_init_pdev_feature_caps(struct wlan_objmgr_pdev * pdev)665 tgt_spectral_init_pdev_feature_caps(struct wlan_objmgr_pdev *pdev) 666 { 667 struct wlan_lmac_if_sptrl_tx_ops *spectral_tx_ops; 668 669 if (!pdev) { 670 spectral_err("pdev is NULL!"); 671 return QDF_STATUS_E_INVAL; 672 } 673 674 spectral_tx_ops = wlan_spectral_pdev_get_lmac_if_txops(pdev); 675 if (!spectral_tx_ops) { 676 spectral_err("Spectral txops is null"); 677 return QDF_STATUS_E_FAILURE; 678 } 679 680 return spectral_tx_ops->sptrlto_init_pdev_feature_caps(pdev); 681 } 682