1 /* 2 * Copyright (c) 2022-2024 Qualcomm Innovation Center, Inc. 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 * DOC: wlan_dp_main.h 20 * 21 * 22 */ 23 #ifndef __WLAN_DP_MAIN_H__ 24 #define __WLAN_DP_MAIN_H__ 25 26 #include "wlan_dp_public_struct.h" 27 #include "wlan_dp_priv.h" 28 #include "wlan_dp_objmgr.h" 29 30 #define NUM_RX_QUEUES 5 31 32 #define dp_enter() QDF_TRACE_ENTER(QDF_MODULE_ID_DP, "enter") 33 #define dp_exit() QDF_TRACE_EXIT(QDF_MODULE_ID_DP, "exit") 34 35 /** 36 * dp_allocate_ctx() - Allocate DP context 37 * 38 */ 39 QDF_STATUS dp_allocate_ctx(void); 40 41 /** 42 * dp_free_ctx() - Free DP context 43 * 44 */ 45 void dp_free_ctx(void); 46 47 /** 48 * dp_get_front_intf_no_lock() - Get the first interface from the intf list 49 * This API does not use any lock in it's implementation. It is the caller's 50 * directive to ensure concurrency safety. 51 * @dp_ctx: pointer to the DP context 52 * @out_intf: double pointer to pass the next interface 53 * 54 * Return: QDF_STATUS 55 */ 56 QDF_STATUS 57 dp_get_front_intf_no_lock(struct wlan_dp_psoc_context *dp_ctx, 58 struct wlan_dp_intf **out_intf); 59 60 /** 61 * dp_get_next_intf_no_lock() - Get the next intf from the intf list 62 * This API does not use any lock in it's implementation. It is the caller's 63 * directive to ensure concurrency safety. 64 * @dp_ctx: pointer to the DP context 65 * @cur_intf: pointer to the current intf 66 * @out_intf: double pointer to pass the next intf 67 * 68 * Return: QDF_STATUS 69 */ 70 QDF_STATUS 71 dp_get_next_intf_no_lock(struct wlan_dp_psoc_context *dp_ctx, 72 struct wlan_dp_intf *cur_intf, 73 struct wlan_dp_intf **out_intf); 74 75 /** 76 * __dp_take_ref_and_fetch_front_intf_safe - Helper macro to lock, fetch 77 * front and next intf, take ref and unlock. 78 * @dp_ctx: the global DP context 79 * @dp_intf: an dp_intf pointer to use as a cursor 80 * @dp_intf_next: dp_intf pointer to next intf 81 * 82 */ 83 #define __dp_take_ref_and_fetch_front_intf_safe(dp_ctx, dp_intf, \ 84 dp_intf_next) \ 85 qdf_spin_lock_bh(&dp_ctx->intf_list_lock), \ 86 dp_get_front_intf_no_lock(dp_ctx, &dp_intf), \ 87 dp_get_next_intf_no_lock(dp_ctx, dp_intf, &dp_intf_next), \ 88 qdf_spin_unlock_bh(&dp_ctx->intf_list_lock) 89 90 /** 91 * __dp_take_ref_and_fetch_next_intf_safe - Helper macro to lock, fetch next 92 * interface, take ref and unlock. 93 * @dp_ctx: the global DP context 94 * @dp_intf: dp_intf pointer to use as a cursor 95 * @dp_intf_next: dp_intf pointer to next interface 96 * 97 */ 98 #define __dp_take_ref_and_fetch_next_intf_safe(dp_ctx, dp_intf, \ 99 dp_intf_next) \ 100 qdf_spin_lock_bh(&dp_ctx->intf_list_lock), \ 101 dp_intf = dp_intf_next, \ 102 dp_get_next_intf_no_lock(dp_ctx, dp_intf, &dp_intf_next), \ 103 qdf_spin_unlock_bh(&dp_ctx->intf_list_lock) 104 105 /** 106 * __dp_is_intf_valid - Helper macro to return true/false for valid interface. 107 * @_dp_intf: an dp_intf pointer to use as a cursor 108 */ 109 #define __dp_is_intf_valid(_dp_intf) !!(_dp_intf) 110 111 /** 112 * dp_for_each_intf_held_safe - Interface iterator called 113 * in a delete safe manner 114 * @dp_ctx: the global DP context 115 * @dp_intf: an dp_intf pointer to use as a cursor 116 * @dp_intf_next: dp_intf pointer to the next interface 117 * 118 */ 119 #define dp_for_each_intf_held_safe(dp_ctx, dp_intf, dp_intf_next) \ 120 for (__dp_take_ref_and_fetch_front_intf_safe(dp_ctx, dp_intf, \ 121 dp_intf_next); \ 122 __dp_is_intf_valid(dp_intf); \ 123 __dp_take_ref_and_fetch_next_intf_safe(dp_ctx, dp_intf, \ 124 dp_intf_next)) 125 126 /** 127 * dp_get_intf_by_macaddr() - Api to Get interface from MAC address 128 * @dp_ctx: DP context 129 * @addr: MAC address 130 * 131 * Return: Pointer to DP interface. 132 */ 133 struct wlan_dp_intf* 134 dp_get_intf_by_macaddr(struct wlan_dp_psoc_context *dp_ctx, 135 struct qdf_mac_addr *addr); 136 137 /** 138 * dp_get_intf_by_netdev() - Api to Get interface from netdev 139 * @dp_ctx: DP context 140 * @dev: Pointer to network device 141 * 142 * Return: Pointer to DP interface. 143 */ 144 struct wlan_dp_intf* 145 dp_get_intf_by_netdev(struct wlan_dp_psoc_context *dp_ctx, qdf_netdev_t dev); 146 147 /** 148 * dp_get_front_link_no_lock() - Get the first link from the dp links list 149 * This API does not use any lock in it's implementation. It is the caller's 150 * directive to ensure concurrency safety. 151 * @dp_intf: DP interface handle 152 * @out_link: double pointer to pass the next link 153 * 154 * Return: QDF_STATUS 155 */ 156 QDF_STATUS 157 dp_get_front_link_no_lock(struct wlan_dp_intf *dp_intf, 158 struct wlan_dp_link **out_link); 159 160 /** 161 * dp_get_next_link_no_lock() - Get the next link from the link list 162 * This API does not use any lock in it's implementation. It is the caller's 163 * directive to ensure concurrency safety. 164 * @dp_intf: DP interface handle 165 * @cur_link: pointer to the currentlink 166 * @out_link: double pointer to pass the nextlink 167 * 168 * Return: QDF_STATUS 169 */ 170 QDF_STATUS 171 dp_get_next_link_no_lock(struct wlan_dp_intf *dp_intf, 172 struct wlan_dp_link *cur_link, 173 struct wlan_dp_link **out_link); 174 175 /** 176 * __dp_take_ref_and_fetch_front_link_safe - Helper macro to lock, fetch 177 * front and next link, take ref and unlock. 178 * @dp_intf: DP interface handle 179 * @dp_link: an dp_link pointer to use as a cursor 180 * @dp_link_next: dp_link pointer to nextlink 181 */ 182 #define __dp_take_ref_and_fetch_front_link_safe(dp_intf, dp_link, \ 183 dp_link_next) \ 184 qdf_spin_lock_bh(&(dp_intf)->dp_link_list_lock), \ 185 dp_get_front_link_no_lock(dp_intf, &(dp_link)), \ 186 dp_get_next_link_no_lock(dp_intf, dp_link, &(dp_link_next)), \ 187 qdf_spin_unlock_bh(&(dp_intf)->dp_link_list_lock) 188 189 /** 190 * __dp_take_ref_and_fetch_next_link_safe - Helper macro to lock, fetch next 191 * interface, take ref and unlock. 192 * @dp_intf: DP interface handle 193 * @dp_link: dp_link pointer to use as a cursor 194 * @dp_link_next: dp_link pointer to next link 195 */ 196 #define __dp_take_ref_and_fetch_next_link_safe(dp_intf, dp_link, \ 197 dp_link_next) \ 198 qdf_spin_lock_bh(&(dp_intf)->dp_link_list_lock), \ 199 dp_link = dp_link_next, \ 200 dp_get_next_link_no_lock(dp_intf, dp_link, &(dp_link_next)), \ 201 qdf_spin_unlock_bh(&(dp_intf)->dp_link_list_lock) 202 203 /** 204 * __dp_is_link_valid - Helper macro to return true/false for valid interface. 205 * @_dp_link: an dp_link pointer to use as a cursor 206 */ 207 #define __dp_is_link_valid(_dp_link) !!(_dp_link) 208 209 /** 210 * dp_for_each_link_held_safe - Interface iterator called 211 * in a delete safe manner 212 * @dp_intf: DP interface handle 213 * @dp_link: an dp_link pointer to use as a cursor 214 * @dp_link_next: dp_link pointer to the next interface 215 * 216 */ 217 #define dp_for_each_link_held_safe(dp_intf, dp_link, dp_link_next) \ 218 for (__dp_take_ref_and_fetch_front_link_safe(dp_intf, dp_link, \ 219 dp_link_next); \ 220 __dp_is_link_valid(dp_link); \ 221 __dp_take_ref_and_fetch_next_link_safe(dp_intf, dp_link, \ 222 dp_link_next)) 223 224 /* MAX iteration count to wait for dp packet process to complete */ 225 #define DP_TASK_MAX_WAIT_CNT 100 226 /* Milli seconds to wait when packet is getting processed */ 227 #define DP_TASK_WAIT_TIME 200 228 229 #define DP_TX_FN_CLR (1 << 0) 230 #define DP_TX_SAP_STOP (1 << 1) 231 #define DP_TX_DFS_CAC_BLOCK (1 << 2) 232 #define WLAN_DP_SUSPEND (1 << 3) 233 234 /** 235 * dp_wait_complete_tasks: Wait for DP tasks to complete 236 * @dp_ctx: DP context pointer 237 * 238 * This function waits for dp tasks like TX to be completed 239 * 240 * Return: None 241 */ 242 void dp_wait_complete_tasks(struct wlan_dp_psoc_context *dp_ctx); 243 244 #define NUM_RX_QUEUES 5 245 246 #define dp_enter() QDF_TRACE_ENTER(QDF_MODULE_ID_DP, "enter") 247 #define dp_exit() QDF_TRACE_EXIT(QDF_MODULE_ID_DP, "exit") 248 249 /** 250 * __wlan_dp_runtime_suspend() - Runtime suspend DP handler 251 * @soc: CDP SoC handle 252 * @pdev_id: DP PDEV ID 253 * 254 * Return: QDF_STATUS 255 */ 256 QDF_STATUS __wlan_dp_runtime_suspend(ol_txrx_soc_handle soc, uint8_t pdev_id); 257 258 /** 259 * __wlan_dp_runtime_resume() - Runtime suspend DP handler 260 * @soc: CDP SoC handle 261 * @pdev_id: DP PDEV ID 262 * 263 * Return: QDF_STATUS 264 */ 265 QDF_STATUS __wlan_dp_runtime_resume(ol_txrx_soc_handle soc, uint8_t pdev_id); 266 267 /** 268 * __wlan_dp_bus_suspend() - BUS suspend DP handler 269 * @soc: CDP SoC handle 270 * @pdev_id: DP PDEV ID 271 * 272 * Return: QDF_STATUS 273 */ 274 QDF_STATUS __wlan_dp_bus_suspend(ol_txrx_soc_handle soc, uint8_t pdev_id); 275 276 /** 277 * __wlan_dp_bus_resume() - BUS resume DP handler 278 * @soc: CDP SoC handle 279 * @pdev_id: DP PDEV ID 280 * 281 * Return: QDF_STATUS 282 */ 283 QDF_STATUS __wlan_dp_bus_resume(ol_txrx_soc_handle soc, uint8_t pdev_id); 284 285 /** 286 * wlan_dp_txrx_soc_attach() - Datapath soc attach 287 * @params: SoC attach params 288 * @is_wifi3_0_target: [OUT] Pointer to update if the target is wifi3.0 289 * 290 * Return: SoC handle 291 */ 292 void *wlan_dp_txrx_soc_attach(struct dp_txrx_soc_attach_params *params, 293 bool *is_wifi3_0_target); 294 295 /** 296 * wlan_dp_txrx_soc_detach() - Datapath SoC detach 297 * @soc: DP SoC handle 298 * 299 * Return: None 300 */ 301 void wlan_dp_txrx_soc_detach(ol_txrx_soc_handle soc); 302 303 /** 304 * wlan_dp_txrx_attach_target() - DP target attach 305 * @soc: DP SoC handle 306 * @pdev_id: DP pdev id 307 * 308 * Return: QDF_STATUS 309 */ 310 QDF_STATUS wlan_dp_txrx_attach_target(ol_txrx_soc_handle soc, uint8_t pdev_id); 311 312 /** 313 * wlan_dp_txrx_pdev_attach() - DP pdev attach 314 * @soc: DP SoC handle 315 * 316 * Return: QDF_STATUS 317 */ 318 QDF_STATUS wlan_dp_txrx_pdev_attach(ol_txrx_soc_handle soc); 319 320 /** 321 * wlan_dp_txrx_pdev_detach() - DP pdev detach 322 * @soc: DP SoC handle 323 * @pdev_id: DP pdev id 324 * @force: indicates if force detach is to be done or not 325 * 326 * Return: QDF_STATUS 327 */ 328 QDF_STATUS wlan_dp_txrx_pdev_detach(ol_txrx_soc_handle soc, uint8_t pdev_id, 329 int force); 330 331 #ifdef WLAN_FEATURE_11BE_MLO 332 /** 333 * dp_link_switch_notification() - DP notifier for MLO link switch 334 * @vdev: Objmgr vdev handle 335 * @lswitch_req: Link switch request params 336 * @notify_reason: Reason of notification 337 * 338 * Return: QDF_STATUS 339 */ 340 QDF_STATUS 341 dp_link_switch_notification(struct wlan_objmgr_vdev *vdev, 342 struct wlan_mlo_link_switch_req *lswitch_req, 343 enum wlan_mlo_link_switch_notify_reason notify_reason); 344 #endif 345 346 /** 347 * dp_peer_obj_create_notification(): dp peer create handler 348 * @peer: peer which is going to created by objmgr 349 * @arg: argument for vdev create handler 350 * 351 * Register this api with objmgr to detect peer is created 352 * 353 * Return: QDF_STATUS status in case of success else return error 354 */ 355 QDF_STATUS 356 dp_peer_obj_create_notification(struct wlan_objmgr_peer *peer, void *arg); 357 358 /** 359 * dp_peer_obj_destroy_notification(): dp peer delete handler 360 * @peer: peer which is going to delete by objmgr 361 * @arg: argument for vdev delete handler 362 * 363 * Register this api with objmgr to detect peer is deleted 364 * 365 * Return: QDF_STATUS status in case of success else return error 366 */ 367 QDF_STATUS 368 dp_peer_obj_destroy_notification(struct wlan_objmgr_peer *peer, void *arg); 369 370 /** 371 * dp_vdev_obj_destroy_notification() - Free per DP vdev object 372 * @vdev: vdev context 373 * @arg: Pointer to arguments 374 * 375 * This function gets called from object manager when vdev is being 376 * deleted and delete DP vdev context. 377 * 378 * Return: QDF_STATUS_SUCCESS - in case of success 379 */ 380 QDF_STATUS 381 dp_vdev_obj_destroy_notification(struct wlan_objmgr_vdev *vdev, void *arg); 382 383 /** 384 * dp_vdev_obj_create_notification() - Allocate per DP vdev object 385 * @vdev: vdev context 386 * @arg: Pointer to arguments 387 * 388 * This function gets called from object manager when vdev is being 389 * created and creates DP vdev context. 390 * 391 * Return: QDF_STATUS_SUCCESS - in case of success 392 */ 393 QDF_STATUS 394 dp_vdev_obj_create_notification(struct wlan_objmgr_vdev *vdev, void *arg); 395 396 /** 397 * dp_pdev_obj_create_notification() - Allocate per DP pdev object 398 * @pdev: pdev context 399 * @arg: Pointer to arguments 400 * 401 * This function gets called from object manager when pdev is being 402 * created and creates DP pdev context. 403 * 404 * Return: QDF_STATUS_SUCCESS - in case of success 405 */ 406 QDF_STATUS 407 dp_pdev_obj_create_notification(struct wlan_objmgr_pdev *pdev, void *arg); 408 409 /** 410 * dp_pdev_obj_destroy_notification() - Free per DP pdev object 411 * @pdev: pdev context 412 * @arg: Pointer to arguments 413 * 414 * This function gets called from object manager when pdev is being 415 * deleted and delete DP pdev context. 416 * 417 * Return: QDF_STATUS_SUCCESS - in case of success 418 */ 419 QDF_STATUS 420 dp_pdev_obj_destroy_notification(struct wlan_objmgr_pdev *pdev, void *arg); 421 422 /** 423 * dp_psoc_obj_create_notification() - Function to allocate per DP 424 * psoc private object 425 * @psoc: psoc context 426 * @arg: Pointer to arguments 427 * 428 * This function gets called from object manager when psoc is being 429 * created and creates DP soc context. 430 * 431 * Return: QDF_STATUS_SUCCESS - in case of success 432 */ 433 QDF_STATUS 434 dp_psoc_obj_create_notification(struct wlan_objmgr_psoc *psoc, void *arg); 435 436 /** 437 * dp_psoc_obj_destroy_notification() - Free psoc private object 438 * @psoc: psoc context 439 * @arg: Pointer to arguments 440 * 441 * This function gets called from object manager when psoc is being 442 * deleted and delete DP soc context. 443 * 444 * Return: QDF_STATUS_SUCCESS - in case of success 445 */ 446 QDF_STATUS 447 dp_psoc_obj_destroy_notification(struct wlan_objmgr_psoc *psoc, void *arg); 448 449 /** 450 * dp_attach_ctx() - Api to attach dp ctx 451 * @dp_ctx : DP Context 452 * 453 * Helper function to attach dp ctx 454 * 455 * Return: None. 456 */ 457 void dp_attach_ctx(struct wlan_dp_psoc_context *dp_ctx); 458 459 /** 460 * dp_detach_ctx() - to detach dp context 461 * 462 * Helper function to detach dp context 463 * 464 * Return: None. 465 */ 466 void dp_detach_ctx(void); 467 468 /** 469 * dp_get_context() - to get dp context 470 * 471 * Helper function to get dp context 472 * 473 * Return: dp context. 474 */ 475 struct wlan_dp_psoc_context *dp_get_context(void); 476 477 /** 478 * dp_add_latency_critical_client() - Add latency critical client 479 * @vdev: pointer to vdev object (Should not be NULL) 480 * @phymode: the phymode of the connected adapter 481 * 482 * This function checks if the present connection is latency critical 483 * and adds to the latency critical clients count and informs the 484 * datapath about this connection being latency critical. 485 * 486 * Returns: None 487 */ 488 static inline void dp_add_latency_critical_client(struct wlan_objmgr_vdev * vdev,enum qca_wlan_802_11_mode phymode)489 dp_add_latency_critical_client(struct wlan_objmgr_vdev *vdev, 490 enum qca_wlan_802_11_mode phymode) 491 { 492 struct wlan_dp_link *dp_link = dp_get_vdev_priv_obj(vdev); 493 struct wlan_dp_intf *dp_intf; 494 495 if (!dp_link) { 496 dp_err("No dp_link for objmgr vdev %pK", vdev); 497 return; 498 } 499 500 dp_intf = dp_link->dp_intf; 501 if (!dp_intf) { 502 dp_err("Invalid dp_intf for dp_link %pK (" QDF_MAC_ADDR_FMT ")", 503 dp_link, QDF_MAC_ADDR_REF(dp_link->mac_addr.bytes)); 504 return; 505 } 506 507 switch (phymode) { 508 case QCA_WLAN_802_11_MODE_11A: 509 case QCA_WLAN_802_11_MODE_11G: 510 qdf_atomic_inc(&dp_intf->dp_ctx->num_latency_critical_clients); 511 512 dp_debug("Adding latency critical connection for vdev %d", 513 dp_link->link_id); 514 cdp_vdev_inform_ll_conn(cds_get_context(QDF_MODULE_ID_SOC), 515 dp_link->link_id, 516 CDP_VDEV_LL_CONN_ADD); 517 break; 518 default: 519 break; 520 } 521 } 522 523 /** 524 * dp_del_latency_critical_client() - Add tlatency critical client 525 * @vdev: pointer to vdev object (Should not be NULL) 526 * @phymode: the phymode of the connected adapter 527 * 528 * This function checks if the present connection was latency critical 529 * and removes from the latency critical clients count and informs the 530 * datapath about the removed connection being latency critical. 531 * 532 * Returns: None 533 */ 534 static inline void dp_del_latency_critical_client(struct wlan_objmgr_vdev * vdev,enum qca_wlan_802_11_mode phymode)535 dp_del_latency_critical_client(struct wlan_objmgr_vdev *vdev, 536 enum qca_wlan_802_11_mode phymode) 537 { 538 struct wlan_dp_link *dp_link = dp_get_vdev_priv_obj(vdev); 539 struct wlan_dp_intf *dp_intf; 540 541 if (!dp_link) { 542 dp_err("No dp_link for objmgr vdev %pK", vdev); 543 return; 544 } 545 546 dp_intf = dp_link->dp_intf; 547 if (!dp_intf) { 548 dp_err("Invalid dp_intf for dp_link %pK (" QDF_MAC_ADDR_FMT ")", 549 dp_link, QDF_MAC_ADDR_REF(dp_link->mac_addr.bytes)); 550 return; 551 } 552 553 switch (phymode) { 554 case QCA_WLAN_802_11_MODE_11A: 555 case QCA_WLAN_802_11_MODE_11G: 556 qdf_atomic_dec(&dp_intf->dp_ctx->num_latency_critical_clients); 557 558 dp_info("Removing latency critical connection for vdev %d", 559 dp_link->link_id); 560 cdp_vdev_inform_ll_conn(cds_get_context(QDF_MODULE_ID_SOC), 561 dp_link->link_id, 562 CDP_VDEV_LL_CONN_DEL); 563 break; 564 default: 565 break; 566 } 567 } 568 569 /** 570 * is_dp_intf_valid() - to check DP interface valid 571 * @dp_intf: DP interface pointer 572 * 573 * API to check whether DP interface is valid 574 * 575 * Return: non zero value on interface valid 576 */ 577 int is_dp_intf_valid(struct wlan_dp_intf *dp_intf); 578 579 /** 580 * is_dp_link_valid() - check if DP link is valid 581 * @dp_link: DP link handle 582 * 583 * API to check whether DP link is valid 584 * 585 * Return: true if dp_link is valid, else false. 586 */ 587 bool is_dp_link_valid(struct wlan_dp_link *dp_link); 588 589 /** 590 * dp_send_rps_ind() - send rps indication to daemon 591 * @dp_intf: DP interface 592 * 593 * If RPS feature enabled by INI, send RPS enable indication to daemon 594 * Indication contents is the name of interface to find correct sysfs node 595 * Should send all available interfaces 596 * 597 * Return: none 598 */ 599 void dp_send_rps_ind(struct wlan_dp_intf *dp_intf); 600 601 /** 602 * dp_try_send_rps_ind() - try to send rps indication to daemon. 603 * @vdev: vdev handle 604 * 605 * If RPS flag is set in DP context then send rsp indication. 606 * 607 * Return: none 608 */ 609 void dp_try_send_rps_ind(struct wlan_objmgr_vdev *vdev); 610 611 /** 612 * dp_send_rps_disable_ind() - send rps disable indication to daemon 613 * @dp_intf: DP interface 614 * 615 * Return: none 616 */ 617 void dp_send_rps_disable_ind(struct wlan_dp_intf *dp_intf); 618 619 #ifdef QCA_CONFIG_RPS 620 /** 621 * dp_set_rps() - Enable/disable RPS for mode specified 622 * @vdev_id: vdev id which RPS needs to be enabled 623 * @enable: Set true to enable RPS in SAP mode 624 * 625 * Callback function registered with ipa 626 * 627 * Return: none 628 */ 629 void dp_set_rps(uint8_t vdev_id, bool enable); 630 #else dp_set_rps(uint8_t vdev_id,bool enable)631 static inline void dp_set_rps(uint8_t vdev_id, bool enable) 632 { 633 } 634 #endif 635 636 /** 637 * dp_set_rx_mode_rps() - Enable/disable RPS in SAP mode 638 * @enable: Set true to enable RPS in SAP mode 639 * 640 * Callback function registered with core datapath 641 * 642 * Return: none 643 */ 644 void dp_set_rx_mode_rps(bool enable); 645 646 /** 647 * dp_set_rps_cpu_mask - set RPS CPU mask for interfaces 648 * @dp_ctx: pointer to struct dp_context 649 * 650 * Return: none 651 */ 652 void dp_set_rps_cpu_mask(struct wlan_dp_psoc_context *dp_ctx); 653 654 /** 655 * dp_try_set_rps_cpu_mask() - try to set RPS CPU mask 656 * @psoc: psoc handle 657 * 658 * If RPS flag is set in DP context then set RPS CPU mask. 659 * 660 * Return: none 661 */ 662 void dp_try_set_rps_cpu_mask(struct wlan_objmgr_psoc *psoc); 663 664 /** 665 * dp_clear_rps_cpu_mask - clear RPS CPU mask for interfaces 666 * @dp_ctx: pointer to struct dp_context 667 * 668 * Return: none 669 */ 670 void dp_clear_rps_cpu_mask(struct wlan_dp_psoc_context *dp_ctx); 671 672 /** 673 * dp_mic_init_work() - init mic error work 674 * @dp_intf: Pointer to dp interface 675 * 676 * Return: None 677 */ 678 void dp_mic_init_work(struct wlan_dp_intf *dp_intf); 679 680 /** 681 * dp_mic_deinit_work() - deinitialize mic error work 682 * @dp_intf: Pointer to dp interface 683 * 684 * Return: None 685 */ 686 void dp_mic_deinit_work(struct wlan_dp_intf *dp_intf); 687 688 /** 689 * dp_rx_mic_error_ind() - MIC error indication handler 690 * @psoc: opaque handle for UMAC psoc object 691 * @pdev_id: physical device instance id 692 * @mic_failure_info: mic failure information 693 * 694 * This function indicates the Mic failure to the supplicant 695 * 696 * Return: None 697 */ 698 void 699 dp_rx_mic_error_ind(struct cdp_ctrl_objmgr_psoc *psoc, uint8_t pdev_id, 700 struct cdp_rx_mic_err_info *mic_failure_info); 701 /** 702 * dp_intf_get_tx_ops: get TX ops from the DP interface 703 * @psoc: pointer to psoc object 704 * 705 * Return: pointer to TX op callback 706 */ 707 static inline dp_intf_get_tx_ops(struct wlan_objmgr_psoc * psoc)708 struct wlan_dp_psoc_sb_ops *dp_intf_get_tx_ops(struct wlan_objmgr_psoc *psoc) 709 { 710 struct wlan_dp_psoc_context *dp_ctx; 711 712 if (!psoc) { 713 dp_err("psoc is null"); 714 return NULL; 715 } 716 717 dp_ctx = dp_psoc_get_priv(psoc); 718 if (!dp_ctx) { 719 dp_err("psoc private object is null"); 720 return NULL; 721 } 722 723 return &dp_ctx->sb_ops; 724 } 725 726 /** 727 * dp_intf_get_rx_ops: get RX ops from the DP interface 728 * @psoc: pointer to psoc object 729 * 730 * Return: pointer to RX op callback 731 */ 732 static inline dp_intf_get_rx_ops(struct wlan_objmgr_psoc * psoc)733 struct wlan_dp_psoc_nb_ops *dp_intf_get_rx_ops(struct wlan_objmgr_psoc *psoc) 734 { 735 struct wlan_dp_psoc_context *dp_ctx; 736 737 if (!psoc) { 738 dp_err("psoc is null"); 739 return NULL; 740 } 741 742 dp_ctx = dp_psoc_get_priv(psoc); 743 if (!dp_ctx) { 744 dp_err("psoc private object is null"); 745 return NULL; 746 } 747 748 return &dp_ctx->nb_ops; 749 } 750 751 /** 752 * dp_get_arp_request_ctx: get ARP req context from the DP context 753 * @psoc: pointer to psoc object 754 * 755 * Return: pointer to ARP request ctx. 756 */ 757 static inline dp_get_arp_request_ctx(struct wlan_objmgr_psoc * psoc)758 void *dp_get_arp_request_ctx(struct wlan_objmgr_psoc *psoc) 759 { 760 struct wlan_dp_psoc_context *dp_ctx; 761 762 dp_ctx = dp_psoc_get_priv(psoc); 763 if (!dp_ctx) { 764 dp_err("psoc private object is null"); 765 return NULL; 766 } 767 return dp_ctx->sb_ops.arp_request_ctx; 768 } 769 770 /** 771 * dp_get_arp_stats_event_handler() - callback api to update the 772 * stats received from FW 773 * @psoc : psoc handle 774 * @rsp: pointer to data received from FW. 775 * 776 * This is called when wlan driver received response event for 777 * get arp stats to firmware. 778 * 779 * Return: None 780 */ 781 QDF_STATUS dp_get_arp_stats_event_handler(struct wlan_objmgr_psoc *psoc, 782 struct dp_rsp_stats *rsp); 783 784 /** 785 * dp_trace_init() - Initialize DP trace 786 * @psoc: psoc handle 787 * 788 * Return: None 789 */ 790 791 void dp_trace_init(struct wlan_objmgr_psoc *psoc); 792 793 /** 794 * dp_set_dump_dp_trace() - set DP trace dump level 795 * @cmd_type : command type 796 * @count: count 797 * 798 * Return: None 799 */ 800 void dp_set_dump_dp_trace(uint16_t cmd_type, uint16_t count); 801 802 #ifdef WLAN_FEATURE_DP_BUS_BANDWIDTH 803 #define DP_BUS_BW_CFG(bus_bw_cfg) bus_bw_cfg 804 #define DP_BUS_BW_GET_RX_LVL(dp_ctx) (dp_ctx)->cur_rx_level 805 static inline bool dp_is_low_tput_gro_enable(struct wlan_dp_psoc_context * dp_ctx)806 dp_is_low_tput_gro_enable(struct wlan_dp_psoc_context *dp_ctx) 807 { 808 return (qdf_atomic_read(&dp_ctx->low_tput_gro_enable)) ? true : false; 809 } 810 #else 811 #define DP_BUS_BW_CFG(bus_bw_cfg) 0 812 #define DP_BUS_BW_GET_RX_LVL(dp_ctx) 0 813 static inline bool dp_is_low_tput_gro_enable(struct wlan_dp_psoc_context * dp_ctx)814 dp_is_low_tput_gro_enable(struct wlan_dp_psoc_context *dp_ctx) 815 { 816 return false; 817 } 818 #endif 819 820 #define DP_DATA_STALL_ENABLE BIT(0) 821 #define DP_HOST_STA_TX_TIMEOUT BIT(16) 822 #define DP_HOST_SAP_TX_TIMEOUT BIT(17) 823 #define DP_HOST_NUD_FAILURE BIT(18) 824 #define DP_TIMEOUT_WLM_MODE BIT(31) 825 #define FW_DATA_STALL_EVT_MASK 0x8000FFFF 826 827 /** 828 * dp_is_data_stall_event_enabled() - Check if data stall detection is enabled 829 * @evt: Data stall event to be checked 830 * 831 * Return: True if the data stall event is enabled 832 */ 833 bool dp_is_data_stall_event_enabled(uint32_t evt); 834 835 /* 836 * dp_get_net_dev_stats(): Get netdev stats 837 * @dp_intf: DP interface handle 838 * @stats: To hold netdev stats 839 * 840 * Return: None 841 */ 842 static inline void dp_get_net_dev_stats(struct wlan_dp_intf * dp_intf,qdf_net_dev_stats * stats)843 dp_get_net_dev_stats(struct wlan_dp_intf *dp_intf, qdf_net_dev_stats *stats) 844 { 845 qdf_mem_copy(stats, &dp_intf->stats, sizeof(dp_intf->stats)); 846 } 847 848 /* 849 * dp_clear_net_dev_stats(): Clear netdev stats 850 * @dp_intf: DP interface handle 851 * 852 * Return: None 853 */ 854 static inline dp_clear_net_dev_stats(struct wlan_dp_intf * dp_intf)855 void dp_clear_net_dev_stats(struct wlan_dp_intf *dp_intf) 856 { 857 qdf_mem_set(&dp_intf->stats, sizeof(dp_intf->stats), 0); 858 } 859 860 #ifdef FEATURE_DIRECT_LINK 861 /** 862 * dp_direct_link_init() - Initializes Direct Link datapath 863 * @dp_ctx: DP private context 864 * 865 * Return: QDF status 866 */ 867 QDF_STATUS dp_direct_link_init(struct wlan_dp_psoc_context *dp_ctx); 868 869 /** 870 * dp_direct_link_deinit() - De-initializes Direct Link datapath 871 * @dp_ctx: DP private context 872 * @is_ssr: true if SSR is in progress else false 873 * 874 * Return: None 875 */ 876 void dp_direct_link_deinit(struct wlan_dp_psoc_context *dp_ctx, bool is_ssr); 877 878 /** 879 * dp_config_direct_link: Set direct link config of vdev 880 * @dp_intf: DP interface handle 881 * @config_direct_link: Flag to enable direct link path 882 * @enable_low_latency: Flag to enable low link latency 883 * 884 * Return: QDF Status 885 */ 886 QDF_STATUS dp_config_direct_link(struct wlan_dp_intf *dp_intf, 887 bool config_direct_link, 888 bool enable_low_latency); 889 #else 890 static inline dp_direct_link_init(struct wlan_dp_psoc_context * dp_ctx)891 QDF_STATUS dp_direct_link_init(struct wlan_dp_psoc_context *dp_ctx) 892 { 893 return QDF_STATUS_SUCCESS; 894 } 895 896 static inline dp_direct_link_deinit(struct wlan_dp_psoc_context * dp_ctx,bool is_ssr)897 void dp_direct_link_deinit(struct wlan_dp_psoc_context *dp_ctx, bool is_ssr) 898 { 899 } 900 901 static inline dp_config_direct_link(struct wlan_dp_intf * dp_intf,bool config_direct_link,bool enable_low_latency)902 QDF_STATUS dp_config_direct_link(struct wlan_dp_intf *dp_intf, 903 bool config_direct_link, 904 bool enable_low_latency) 905 { 906 return QDF_STATUS_SUCCESS; 907 } 908 #endif 909 #ifdef WLAN_FEATURE_11BE 910 /** 911 * __wlan_dp_update_peer_map_unmap_version() - update peer map unmap version 912 * @version: Peer map unmap version pointer to be updated 913 * 914 * Return: None 915 */ 916 static inline void __wlan_dp_update_peer_map_unmap_version(uint8_t * version)917 __wlan_dp_update_peer_map_unmap_version(uint8_t *version) 918 { 919 /* 0x32 -> host supports HTT peer map v3 format and peer unmap v2 format. */ 920 *version = 0x32; 921 } 922 #else 923 static inline void __wlan_dp_update_peer_map_unmap_version(uint8_t * version)924 __wlan_dp_update_peer_map_unmap_version(uint8_t *version) 925 { 926 } 927 #endif 928 929 #ifdef WLAN_DP_PROFILE_SUPPORT 930 /** 931 * wlan_dp_get_profile_info() - Get DP memory profile info 932 * 933 * Return: None 934 */ 935 struct wlan_dp_memory_profile_info *wlan_dp_get_profile_info(void); 936 937 /** 938 * wlan_dp_select_profile_cfg() - Select DP profile configuration 939 * @psoc: psoc context 940 * 941 * Return: QDF_STATUS 942 */ 943 QDF_STATUS wlan_dp_select_profile_cfg(struct wlan_objmgr_psoc *psoc); 944 945 /** 946 * wlan_dp_soc_cfg_sync_profile() - Sync DP soc cfg items with profile 947 * @cdp_soc: cdp soc context 948 * 949 * Return: None 950 */ 951 void wlan_dp_soc_cfg_sync_profile(struct cdp_soc_t *cdp_soc); 952 953 /** 954 * wlan_dp_pdev_cfg_sync_profile() - Sync DP pdev cfg items with profile 955 * @cdp_soc: cdp soc context 956 * @pdev_id: pdev id 957 * 958 * Return: QDF_STATUS 959 */ 960 void wlan_dp_pdev_cfg_sync_profile(struct cdp_soc_t *cdp_soc, uint8_t pdev_id); 961 #else 962 963 static inline wlan_dp_select_profile_cfg(struct wlan_objmgr_psoc * psoc)964 QDF_STATUS wlan_dp_select_profile_cfg(struct wlan_objmgr_psoc *psoc) 965 { 966 return QDF_STATUS_E_NOSUPPORT; 967 } 968 #endif 969 970 /** 971 * wlan_dp_link_cdp_vdev_delete_notification() - CDP vdev delete notification 972 * @context: osif_vdev handle 973 * 974 * Return: None 975 */ 976 void wlan_dp_link_cdp_vdev_delete_notification(void *context); 977 978 /* DP CFG APIs - START */ 979 980 #ifdef WLAN_SUPPORT_RX_FISA 981 /** 982 * wlan_dp_cfg_is_rx_fisa_enabled() - Get Rx FISA enabled flag 983 * @dp_cfg: soc configuration context 984 * 985 * Return: true if enabled, false otherwise. 986 */ 987 static inline wlan_dp_cfg_is_rx_fisa_enabled(struct wlan_dp_psoc_cfg * dp_cfg)988 bool wlan_dp_cfg_is_rx_fisa_enabled(struct wlan_dp_psoc_cfg *dp_cfg) 989 { 990 return dp_cfg->is_rx_fisa_enabled; 991 } 992 993 /** 994 * wlan_dp_cfg_is_rx_fisa_lru_del_enabled() - Get Rx FISA LRU del enabled flag 995 * @dp_cfg: soc configuration context 996 * 997 * Return: true if enabled, false otherwise. 998 */ 999 static inline wlan_dp_cfg_is_rx_fisa_lru_del_enabled(struct wlan_dp_psoc_cfg * dp_cfg)1000 bool wlan_dp_cfg_is_rx_fisa_lru_del_enabled(struct wlan_dp_psoc_cfg *dp_cfg) 1001 { 1002 return dp_cfg->is_rx_fisa_lru_del_enabled; 1003 } 1004 #else 1005 static inline wlan_dp_cfg_is_rx_fisa_enabled(struct wlan_dp_psoc_cfg * dp_cfg)1006 bool wlan_dp_cfg_is_rx_fisa_enabled(struct wlan_dp_psoc_cfg *dp_cfg) 1007 { 1008 return false; 1009 } 1010 1011 static inline wlan_dp_cfg_is_rx_fisa_lru_del_enabled(struct wlan_dp_psoc_cfg * dp_cfg)1012 bool wlan_dp_cfg_is_rx_fisa_lru_del_enabled(struct wlan_dp_psoc_cfg *dp_cfg) 1013 { 1014 return false; 1015 } 1016 #endif 1017 1018 1019 /* DP CFG APIs - END */ 1020 /** 1021 * __wlan_dp_update_def_link() - update DP interface default link 1022 * @psoc: psoc handle 1023 * @intf_mac: interface MAC address 1024 * @vdev: objmgr vdev handle to set the def_link in dp_intf 1025 * 1026 */ 1027 void __wlan_dp_update_def_link(struct wlan_objmgr_psoc *psoc, 1028 struct qdf_mac_addr *intf_mac, 1029 struct wlan_objmgr_vdev *vdev); 1030 #endif 1031