1 /* 2 * Copyright (c) 2016-2019 The Linux Foundation. All rights reserved. 3 * 4 * Permission to use, copy, modify, and/or distribute this software for 5 * any purpose with or without fee is hereby granted, provided that the 6 * above copyright notice and this permission notice appear in all 7 * copies. 8 * 9 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL 10 * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED 11 * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE 12 * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL 13 * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR 14 * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER 15 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR 16 * PERFORMANCE OF THIS SOFTWARE. 17 */ 18 19 /** 20 * @file cdp_txrx_peer.h 21 * @brief Define the host data path peer API functions 22 * called by the host control SW and the OS interface module 23 */ 24 #ifndef _CDP_TXRX_PEER_H_ 25 #define _CDP_TXRX_PEER_H_ 26 #include <cdp_txrx_ops.h> 27 #include "cdp_txrx_handle.h" 28 29 /** 30 * cdp_peer_register() - Register peer into physical device 31 * @soc - data path soc handle 32 * @pdev - data path device instance 33 * @sta_desc - peer description 34 * 35 * Register peer into physical device 36 * 37 * Return: QDF_STATUS_SUCCESS registration success 38 * QDF_STATUS_E_NOSUPPORT not support this feature 39 */ 40 static inline QDF_STATUS 41 cdp_peer_register(ol_txrx_soc_handle soc, struct cdp_pdev *pdev, 42 struct ol_txrx_desc_type *sta_desc) 43 { 44 if (!soc || !soc->ops || !soc->ops->peer_ops) { 45 QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL, 46 "%s invalid instance", __func__); 47 return QDF_STATUS_E_INVAL; 48 } 49 50 if (soc->ops->peer_ops->register_peer) 51 return soc->ops->peer_ops->register_peer(pdev, sta_desc); 52 53 return QDF_STATUS_E_NOSUPPORT; 54 } 55 56 /** 57 * cdp_clear_peer() - remove peer from physical device 58 * @soc - data path soc handle 59 * @pdev - data path device instance 60 * @peer_addr - peer mac address 61 * 62 * remove peer from physical device 63 * 64 * Return: QDF_STATUS_SUCCESS registration success 65 * QDF_STATUS_E_NOSUPPORT not support this feature 66 */ 67 static inline QDF_STATUS 68 cdp_clear_peer(ol_txrx_soc_handle soc, struct cdp_pdev *pdev, 69 struct qdf_mac_addr peer_addr) 70 { 71 if (!soc || !soc->ops || !soc->ops->peer_ops) { 72 QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL, 73 "%s invalid instance", __func__); 74 return QDF_STATUS_E_INVAL; 75 } 76 77 if (soc->ops->peer_ops->clear_peer) 78 return soc->ops->peer_ops->clear_peer(pdev, peer_addr); 79 80 return QDF_STATUS_E_NOSUPPORT; 81 } 82 83 /** 84 * cdp_peer_register_ocb_peer() - register ocb peer from physical device 85 * @soc - data path soc handle 86 * @cds_ctx - cds void context 87 * @mac_addr - mac address for ocb self peer 88 * @peer_id - local peer id 89 * 90 * register ocb peer from physical device 91 * 92 * Return: QDF_STATUS_SUCCESS registration success 93 * QDF_STATUS_E_NOSUPPORT not support this feature 94 */ 95 static inline QDF_STATUS 96 cdp_peer_register_ocb_peer(ol_txrx_soc_handle soc, 97 uint8_t *mac_addr, uint8_t *peer_id) 98 { 99 if (!soc || !soc->ops || !soc->ops->peer_ops) { 100 QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL, 101 "%s invalid instance", __func__); 102 return QDF_STATUS_E_INVAL; 103 } 104 105 if (soc->ops->peer_ops->register_ocb_peer) 106 return soc->ops->peer_ops->register_ocb_peer(mac_addr, peer_id); 107 108 return QDF_STATUS_E_NOSUPPORT; 109 } 110 111 /** 112 * cdp_peer_remove_for_vdev() - remove peer instance from virtual interface 113 * @soc - data path soc handle 114 * @vdev - virtual interface instance 115 * @callback - remove done notification callback function pointer 116 * @callback_context - callback caller context 117 * @remove_last_peer - removed peer is last peer or not 118 * 119 * remove peer instance from virtual interface 120 * 121 * Return: NONE 122 */ 123 static inline void 124 cdp_peer_remove_for_vdev(ol_txrx_soc_handle soc, 125 struct cdp_vdev *vdev, ol_txrx_vdev_peer_remove_cb callback, 126 void *callback_context, bool remove_last_peer) 127 { 128 if (!soc || !soc->ops || !soc->ops->peer_ops) { 129 QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL, 130 "%s invalid instance", __func__); 131 return; 132 } 133 134 if (soc->ops->peer_ops->remove_peers_for_vdev) 135 return soc->ops->peer_ops->remove_peers_for_vdev( 136 vdev, callback, callback_context, remove_last_peer); 137 138 return; 139 } 140 141 /** 142 * cdp_peer_remove_for_vdev_no_lock() - remove peer instance from vdev 143 * @soc - data path soc handle 144 * @vdev - virtual interface instance 145 * @callback - remove done notification callback function pointer 146 * @callback_context - callback caller context 147 * 148 * remove peer instance from virtual interface without lock 149 * 150 * Return: NONE 151 */ 152 static inline void 153 cdp_peer_remove_for_vdev_no_lock(ol_txrx_soc_handle soc, 154 struct cdp_vdev *vdev, 155 ol_txrx_vdev_peer_remove_cb callback, 156 void *callback_context) 157 { 158 if (!soc || !soc->ops || !soc->ops->peer_ops) { 159 QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL, 160 "%s invalid instance", __func__); 161 return; 162 } 163 164 if (soc->ops->peer_ops->remove_peers_for_vdev_no_lock) 165 return soc->ops->peer_ops->remove_peers_for_vdev_no_lock( 166 vdev, callback, callback_context); 167 } 168 169 /** 170 * cdp_peer_get_ref_by_addr() - Find peer by peer mac address and inc peer ref 171 * @soc - data path soc handle 172 * @pdev - data path device instance 173 * @peer_addr - peer mac address 174 * @peer_id - local peer id with target mac address 175 * @debug_id - debug_id to track caller 176 * 177 * To release the peer ref, cdp_peer_release_ref needs to be called. 178 * 179 * Return: peer instance void pointer 180 * NULL cannot find target peer 181 */ 182 static inline void 183 *cdp_peer_get_ref_by_addr(ol_txrx_soc_handle soc, struct cdp_pdev *pdev, 184 uint8_t *peer_addr, uint8_t *peer_id, 185 enum peer_debug_id_type debug_id) 186 { 187 if (!soc || !soc->ops || !soc->ops->peer_ops) { 188 QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL, 189 "%s invalid instance", __func__); 190 return NULL; 191 } 192 193 if (soc->ops->peer_ops->peer_get_ref_by_addr) 194 return soc->ops->peer_ops->peer_get_ref_by_addr( 195 pdev, peer_addr, peer_id, debug_id); 196 197 return NULL; 198 } 199 200 /** 201 * cdp_peer_release_ref() - Release peer reference 202 * @soc - data path soc handle 203 * @peer - peer pointer 204 * @debug_id - debug_id to track caller 205 * 206 * Return:void 207 */ 208 static inline void 209 cdp_peer_release_ref(ol_txrx_soc_handle soc, void *peer, 210 enum peer_debug_id_type debug_id) 211 { 212 if (!soc || !soc->ops || !soc->ops->peer_ops) { 213 QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL, 214 "%s invalid instance", __func__); 215 return; 216 } 217 218 if (soc->ops->peer_ops->peer_release_ref) 219 soc->ops->peer_ops->peer_release_ref(peer, debug_id); 220 } 221 222 /** 223 * cdp_peer_find_by_addr() - Find peer by peer mac address 224 * @soc - data path soc handle 225 * @pdev - data path device instance 226 * @peer_addr - peer mac address 227 * @peer_id - local peer id with target mac address 228 * 229 * Find peer and local peer id by peer mac address 230 * 231 * Return: peer instance void pointer 232 * NULL cannot find target peer 233 */ 234 static inline void 235 *cdp_peer_find_by_addr(ol_txrx_soc_handle soc, struct cdp_pdev *pdev, 236 uint8_t *peer_addr, uint8_t *peer_id) 237 { 238 if (!soc || !soc->ops || !soc->ops->peer_ops) { 239 QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL, 240 "%s invalid instance", __func__); 241 return NULL; 242 } 243 244 if (soc->ops->peer_ops->find_peer_by_addr) 245 return soc->ops->peer_ops->find_peer_by_addr( 246 pdev, peer_addr, peer_id); 247 248 return NULL; 249 } 250 251 /** 252 * cdp_peer_find_by_addr_and_vdev() - Find peer by peer mac address within vdev 253 * @soc - data path soc handle 254 * @pdev - data path device instance 255 * @vdev - virtual interface instance 256 * @peer_addr - peer mac address 257 * @peer_id - local peer id with target mac address 258 * 259 * Find peer by peer mac address within vdev 260 * 261 * Return: peer instance void pointer 262 * NULL cannot find target peer 263 */ 264 static inline void 265 *cdp_peer_find_by_addr_and_vdev(ol_txrx_soc_handle soc, struct cdp_pdev *pdev, 266 struct cdp_vdev *vdev, uint8_t *peer_addr, uint8_t *peer_id) 267 { 268 if (!soc || !soc->ops || !soc->ops->peer_ops) { 269 QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL, 270 "%s invalid instance", __func__); 271 return NULL; 272 } 273 274 if (soc->ops->peer_ops->find_peer_by_addr_and_vdev) 275 return soc->ops->peer_ops->find_peer_by_addr_and_vdev( 276 pdev, vdev, peer_addr, peer_id); 277 278 return NULL; 279 } 280 281 /** 282 * cdp_peer_find_by_local_id() - Find peer by local peer id 283 * @soc - data path soc handle 284 * @pdev - data path device instance 285 * @local_peer_id - local peer id want to find 286 * 287 * Find peer by local peer id within physical device 288 * 289 * Return: peer instance void pointer 290 * NULL cannot find target peer 291 */ 292 static inline void 293 *cdp_peer_find_by_local_id(ol_txrx_soc_handle soc, struct cdp_pdev *pdev, 294 uint8_t local_peer_id) 295 { 296 if (!soc || !soc->ops || !soc->ops->peer_ops) { 297 QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL, 298 "%s invalid instance", __func__); 299 return NULL; 300 } 301 302 if (soc->ops->peer_ops->peer_find_by_local_id) 303 return soc->ops->peer_ops->peer_find_by_local_id( 304 pdev, local_peer_id); 305 306 return NULL; 307 } 308 309 /** 310 * cdp_peer_state_update() - update peer local state 311 * @soc - data path soc handle 312 * @pdev - data path device instance 313 * @peer_addr - peer mac address 314 * @state - new peer local state 315 * 316 * update peer local state 317 * 318 * Return: QDF_STATUS_SUCCESS registration success 319 * QDF_STATUS_E_NOSUPPORT not support this feature 320 */ 321 static inline QDF_STATUS 322 cdp_peer_state_update(ol_txrx_soc_handle soc, struct cdp_pdev *pdev, 323 uint8_t *peer_addr, enum ol_txrx_peer_state state) 324 { 325 if (!soc || !soc->ops || !soc->ops->peer_ops) { 326 QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL, 327 "%s invalid instance", __func__); 328 return QDF_STATUS_E_INVAL; 329 } 330 331 if (soc->ops->peer_ops->peer_state_update) 332 return soc->ops->peer_ops->peer_state_update( 333 pdev, peer_addr, state); 334 335 return QDF_STATUS_E_NOSUPPORT; 336 } 337 338 /** 339 * cdp_peer_state_get() - Get local peer state 340 * @soc - data path soc handle 341 * @peer - peer instance 342 * 343 * Get local peer state 344 * 345 * Return: peer status 346 */ 347 static inline int 348 cdp_peer_state_get(ol_txrx_soc_handle soc, void *peer) 349 { 350 if (!soc || !soc->ops || !soc->ops->peer_ops) { 351 QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL, 352 "%s invalid instance", __func__); 353 return 0; 354 } 355 356 if (soc->ops->peer_ops->get_peer_state) 357 return soc->ops->peer_ops->get_peer_state(peer); 358 359 return 0; 360 } 361 362 /** 363 * cdp_peer_get_local_peer_id() - Find local peer id within peer instance 364 * @soc - data path soc handle 365 * @peer - peer instance 366 * 367 * Find local peer id within peer instance 368 * 369 * Return: local peer id 370 * HTT_INVALID_PEER Invalid peer 371 */ 372 static inline uint16_t 373 cdp_peer_get_local_peer_id(ol_txrx_soc_handle soc, void *peer) 374 { 375 if (!soc || !soc->ops || !soc->ops->peer_ops) { 376 QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL, 377 "%s invalid instance", __func__); 378 return HTT_INVALID_PEER; 379 } 380 381 if (soc->ops->peer_ops->local_peer_id) 382 return soc->ops->peer_ops->local_peer_id(peer); 383 384 return HTT_INVALID_PEER; 385 } 386 387 /** 388 * cdp_peer_get_vdevid() - Get virtual interface id which peer registered 389 * @soc - data path soc handle 390 * @peer - peer instance 391 * @vdev_id - virtual interface id which peer registered 392 * 393 * Get virtual interface id which peer registered 394 * 395 * Return: QDF_STATUS_SUCCESS registration success 396 * QDF_STATUS_E_NOSUPPORT not support this feature 397 */ 398 static inline QDF_STATUS 399 cdp_peer_get_vdevid(ol_txrx_soc_handle soc, void *peer, uint8_t *vdev_id) 400 { 401 if (!soc || !soc->ops || !soc->ops->peer_ops) { 402 QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL, 403 "%s invalid instance", __func__); 404 return QDF_STATUS_E_INVAL; 405 } 406 407 if (soc->ops->peer_ops->get_vdevid) 408 return soc->ops->peer_ops->get_vdevid(peer, vdev_id); 409 410 return QDF_STATUS_E_NOSUPPORT; 411 } 412 413 /** 414 * cdp_peer_get_vdev_by_sta_id() - Get vdev instance by local peer id 415 * @soc - data path soc handle 416 * @pdev - data path device instance 417 * @peer_addr - peer mac address 418 * 419 * Get virtual interface id by local peer id 420 * 421 * Return: Virtual interface instance 422 * NULL in case cannot find 423 */ 424 static inline struct cdp_vdev 425 *cdp_peer_get_vdev_by_peer_addr(ol_txrx_soc_handle soc, struct cdp_pdev *pdev, 426 struct qdf_mac_addr peer_addr) 427 { 428 if (!soc || !soc->ops || !soc->ops->peer_ops) { 429 QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL, 430 "%s invalid instance", __func__); 431 return NULL; 432 } 433 434 if (soc->ops->peer_ops->get_vdev_by_peer_addr) 435 return soc->ops->peer_ops->get_vdev_by_peer_addr(pdev, 436 peer_addr); 437 438 return NULL; 439 } 440 441 /** 442 * cdp_peer_get_peer_mac_addr() - Get peer mac address 443 * @soc - data path soc handle 444 * @peer - peer instance 445 * 446 * Get peer mac address 447 * 448 * Return: peer mac address pointer 449 * NULL in case cannot find 450 */ 451 static inline uint8_t 452 *cdp_peer_get_peer_mac_addr(ol_txrx_soc_handle soc, void *peer) 453 { 454 if (!soc || !soc->ops || !soc->ops->peer_ops) { 455 QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL, 456 "%s invalid instance", __func__); 457 return NULL; 458 } 459 460 if (soc->ops->peer_ops->peer_get_peer_mac_addr) 461 return soc->ops->peer_ops->peer_get_peer_mac_addr(peer); 462 463 return NULL; 464 } 465 466 /** 467 * cdp_peer_get_vdev() - Get virtual interface instance which peer belongs 468 * @soc - data path soc handle 469 * @peer - peer instance 470 * 471 * Get virtual interface instance which peer belongs 472 * 473 * Return: virtual interface instance pointer 474 * NULL in case cannot find 475 */ 476 static inline struct cdp_vdev 477 *cdp_peer_get_vdev(ol_txrx_soc_handle soc, void *peer) 478 { 479 if (!soc || !soc->ops || !soc->ops->peer_ops) { 480 QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL, 481 "%s invalid instance", __func__); 482 return NULL; 483 } 484 485 if (soc->ops->peer_ops->get_vdev_for_peer) 486 return soc->ops->peer_ops->get_vdev_for_peer(peer); 487 488 return NULL; 489 } 490 491 /** 492 * cdp_peer_update_ibss_add_peer_num_of_vdev() - update number of peer 493 * @soc - data path soc handle 494 * @vdev - virtual interface instance 495 * @peer_num_delta - number of peer should be updated 496 * 497 * update number of peer 498 * 499 * Return: updated number of peer 500 * 0 fail 501 */ 502 static inline int16_t 503 cdp_peer_update_ibss_add_peer_num_of_vdev(ol_txrx_soc_handle soc, 504 struct cdp_vdev *vdev, int16_t peer_num_delta) 505 { 506 if (!soc || !soc->ops || !soc->ops->peer_ops) { 507 QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL, 508 "%s invalid instance", __func__); 509 return 0; 510 } 511 512 if (soc->ops->peer_ops->update_ibss_add_peer_num_of_vdev) 513 return soc->ops->peer_ops->update_ibss_add_peer_num_of_vdev( 514 vdev, peer_num_delta); 515 516 return 0; 517 } 518 519 /** 520 * cdp_peer_copy_mac_addr_raw() - copy peer mac address 521 * @soc - data path soc handle 522 * @vdev - virtual interface instance 523 * @bss_addr - mac address should be copied 524 * 525 * copy peer mac address 526 * 527 * Return: none 528 */ 529 static inline void 530 cdp_peer_copy_mac_addr_raw(ol_txrx_soc_handle soc, 531 struct cdp_vdev *vdev, uint8_t *bss_addr) 532 { 533 if (!soc || !soc->ops || !soc->ops->peer_ops) { 534 QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL, 535 "%s invalid instance", __func__); 536 return; 537 } 538 539 if (soc->ops->peer_ops->copy_mac_addr_raw) 540 return soc->ops->peer_ops->copy_mac_addr_raw(vdev, bss_addr); 541 542 return; 543 } 544 545 /** 546 * cdp_peer_add_last_real_peer() - Add peer with last peer marking 547 * @soc - data path soc handle 548 * @pdev - data path device instance 549 * @vdev - virtual interface instance 550 * @peer_id - local peer id 551 * 552 * copy peer mac address 553 * 554 * Return: none 555 */ 556 static inline void 557 cdp_peer_add_last_real_peer(ol_txrx_soc_handle soc, 558 struct cdp_pdev *pdev, struct cdp_vdev *vdev, uint8_t *peer_id) 559 { 560 if (!soc || !soc->ops || !soc->ops->peer_ops) { 561 QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL, 562 "%s invalid instance", __func__); 563 return; 564 } 565 566 if (soc->ops->peer_ops->add_last_real_peer) 567 return soc->ops->peer_ops->add_last_real_peer( 568 pdev, vdev, peer_id); 569 return; 570 } 571 572 /** 573 * cdp_peer_is_vdev_restore_last_peer() - restore last peer 574 * @soc - data path soc handle 575 * @peer - peer instance pointer 576 * 577 * restore last peer 578 * 579 * Return: true, restore success 580 * fasle, restore fail 581 */ 582 static inline bool 583 cdp_peer_is_vdev_restore_last_peer(ol_txrx_soc_handle soc, void *peer) 584 { 585 if (!soc || !soc->ops || !soc->ops->peer_ops) { 586 QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL, 587 "%s invalid instance", __func__); 588 return false; 589 } 590 591 if (soc->ops->peer_ops->is_vdev_restore_last_peer) 592 return soc->ops->peer_ops->is_vdev_restore_last_peer(peer); 593 594 return false; 595 } 596 597 /** 598 * cdp_peer_update_last_real_peer() - update last real peer 599 * @soc - data path soc handle 600 * @pdev - data path device instance 601 * @peer - peer instance pointer 602 * @peer_id - local peer id 603 * @restore_last_peer - restore last peer or not 604 * 605 * update last real peer 606 * 607 * Return: none 608 */ 609 static inline void 610 cdp_peer_update_last_real_peer(ol_txrx_soc_handle soc, struct cdp_pdev *pdev, 611 void *vdev, uint8_t *peer_id, bool restore_last_peer) 612 { 613 if (!soc || !soc->ops || !soc->ops->peer_ops) { 614 QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL, 615 "%s invalid instance", __func__); 616 return; 617 } 618 619 if (soc->ops->peer_ops->update_last_real_peer) 620 return soc->ops->peer_ops->update_last_real_peer(pdev, vdev, 621 peer_id, restore_last_peer); 622 623 return; 624 } 625 626 /** 627 * ol_txrx_peer_detach_force_delete() - Detach and delete a peer's data object 628 * @peer - the object to detach 629 * 630 * Detach a peer and force the peer object to be removed. It is called during 631 * roaming scenario when the firmware has already deleted a peer. 632 * Peer object is freed immediately to avoid duplicate peers during roam sync 633 * indication processing. 634 * 635 * Return: None 636 */ 637 static inline void cdp_peer_detach_force_delete(ol_txrx_soc_handle soc, 638 void *peer) 639 { 640 if (!soc || !soc->ops || !soc->ops->peer_ops) { 641 QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL, 642 "%s invalid instance", __func__); 643 return; 644 } 645 646 if (soc->ops->peer_ops->peer_detach_force_delete) 647 return soc->ops->peer_ops->peer_detach_force_delete(peer); 648 649 return; 650 } 651 652 /** 653 * is_cdp_peer_detach_force_delete_supported() - To check if force delete 654 * operation is supported 655 * @soc: pointer to SOC handle 656 * 657 * Some of the platforms support force delete operation and some of them 658 * don't. This API returns true if API which handles force delete operation 659 * is registered and false otherwise. 660 * 661 * Return: true if API which handles force delete operation is registered 662 * false in all other cases 663 */ 664 static inline bool 665 is_cdp_peer_detach_force_delete_supported(ol_txrx_soc_handle soc) 666 { 667 if (!soc || !soc->ops || !soc->ops->peer_ops) { 668 QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL, 669 "%s invalid instance", __func__); 670 return false; 671 } 672 673 if (soc->ops->peer_ops->peer_detach_force_delete) 674 return true; 675 676 return false; 677 } 678 #endif /* _CDP_TXRX_PEER_H_ */ 679