1 /* 2 * Copyright (c) 2016-2021 The Linux Foundation. All rights reserved. 3 * Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. All rights reserved. 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 #ifndef _DP_RINGS_H_ 21 #define _DP_RINGS_H_ 22 23 #include <dp_types.h> 24 #include <dp_internal.h> 25 #ifdef WIFI_MONITOR_SUPPORT 26 #include <dp_mon.h> 27 #endif 28 29 #ifndef QCA_HOST_MODE_WIFI_DISABLED 30 31 /** 32 * dp_srng_get_cpu() - Get the smp processor id for srng processing 33 * 34 * Return: smp processor id 35 */ 36 static inline int dp_srng_get_cpu(void) 37 { 38 return smp_processor_id(); 39 } 40 41 #else /* QCA_HOST_MODE_WIFI_DISABLED */ 42 43 /** 44 * dp_srng_get_cpu() - Get the smp processor id for srng processing 45 * 46 * Return: smp processor id 47 */ 48 static inline int dp_srng_get_cpu(void) 49 { 50 return 0; 51 } 52 53 #endif /* QCA_HOST_MODE_WIFI_DISABLED */ 54 55 /** 56 * dp_interrupt_timer() - timer poll for interrupts 57 * @arg: SoC Handle 58 * 59 * Return: 60 * 61 */ 62 void dp_interrupt_timer(void *arg); 63 64 /** 65 * dp_soc_print_inactive_objects() - prints inactive peer and vdev list 66 * @soc: DP SOC handle 67 * 68 */ 69 void dp_soc_print_inactive_objects(struct dp_soc *soc); 70 71 /** 72 * dp_get_tx_pending() - read pending tx 73 * @pdev_handle: Datapath PDEV handle 74 * 75 * Return: outstanding tx 76 */ 77 int32_t dp_get_tx_pending(struct cdp_pdev *pdev_handle); 78 79 /** 80 * dp_find_missing_tx_comp() - check for leaked descriptor in tx path 81 * @soc: DP SOC context 82 * 83 * Parse through descriptors in all pools and validate magic number and 84 * completion time. Trigger self recovery if magic value is corrupted. 85 * 86 * Return: None. 87 */ 88 void dp_find_missing_tx_comp(struct dp_soc *soc); 89 90 void dp_enable_verbose_debug(struct dp_soc *soc); 91 92 QDF_STATUS dp_peer_legacy_setup(struct dp_soc *soc, struct dp_peer *peer); 93 94 #ifndef WLAN_SOFTUMAC_SUPPORT 95 96 /** 97 * dp_service_lmac_rings()- timer to reap lmac rings 98 * @arg: SoC Handle 99 * 100 * Return: 101 * 102 */ 103 void dp_service_lmac_rings(void *arg); 104 105 /** 106 * dp_service_srngs() - Top level interrupt handler for DP Ring interrupts 107 * @dp_ctx: DP SOC handle 108 * @dp_budget: Number of frames/descriptors that can be processed in one shot 109 * @cpu: CPU on which this instance is running 110 * 111 * Return: remaining budget/quota for the soc device 112 */ 113 uint32_t dp_service_srngs(void *dp_ctx, uint32_t dp_budget, int cpu); 114 115 /** 116 * dp_soc_attach_poll() - Register handlers for DP interrupts 117 * @txrx_soc: DP SOC handle 118 * 119 * Host driver will register for “DP_NUM_INTERRUPT_CONTEXTS” number of NAPI 120 * contexts. Each NAPI context will have a tx_ring_mask , rx_ring_mask ,and 121 * rx_monitor_ring mask to indicate the rings that are processed by the handler. 122 * 123 * Return: 0 for success, nonzero for failure. 124 */ 125 QDF_STATUS dp_soc_attach_poll(struct cdp_soc_t *txrx_soc); 126 127 /** 128 * dp_soc_interrupt_attach() - Register handlers for DP interrupts 129 * @txrx_soc: DP SOC handle 130 * 131 * Host driver will register for “DP_NUM_INTERRUPT_CONTEXTS” number of NAPI 132 * contexts. Each NAPI context will have a tx_ring_mask , rx_ring_mask ,and 133 * rx_monitor_ring mask to indicate the rings that are processed by the handler. 134 * 135 * Return: 0 for success. nonzero for failure. 136 */ 137 QDF_STATUS dp_soc_interrupt_attach(struct cdp_soc_t *txrx_soc); 138 139 /** 140 * dp_hw_link_desc_ring_free() - Free h/w link desc rings 141 * @soc: DP SOC handle 142 * 143 * Return: none 144 */ 145 void dp_hw_link_desc_ring_free(struct dp_soc *soc); 146 147 /** 148 * dp_hw_link_desc_ring_alloc() - Allocate hw link desc rings 149 * @soc: DP SOC handle 150 * 151 * Allocate memory for WBM_IDLE_LINK srng ring if the number of 152 * link descriptors is less then the max_allocated size. else 153 * allocate memory for wbm_idle_scatter_buffer. 154 * 155 * Return: QDF_STATUS_SUCCESS: success 156 * QDF_STATUS_E_NO_MEM: No memory (Failure) 157 */ 158 QDF_STATUS dp_hw_link_desc_ring_alloc(struct dp_soc *soc); 159 160 /** 161 * dp_hw_link_desc_ring_init() - Initialize hw link desc rings 162 * @soc: DP SOC handle 163 * 164 * Return: QDF_STATUS_SUCCESS: success 165 * QDF_STATUS_E_FAILURE: failure 166 */ 167 QDF_STATUS dp_hw_link_desc_ring_init(struct dp_soc *soc); 168 169 /** 170 * dp_hw_link_desc_ring_deinit() - Reset hw link desc rings 171 * @soc: DP SOC handle 172 * 173 * Return: None 174 */ 175 void dp_hw_link_desc_ring_deinit(struct dp_soc *soc); 176 177 /** 178 * dp_ipa_hal_tx_init_alt_data_ring() - IPA hal init data rings 179 * @soc: DP SOC handle 180 * 181 * Return: None 182 */ 183 void dp_ipa_hal_tx_init_alt_data_ring(struct dp_soc *soc); 184 185 /* 186 * dp_soc_reset_ring_map() - Reset cpu ring map 187 * @soc: Datapath soc handler 188 * 189 * This api resets the default cpu ring map 190 */ 191 void dp_soc_reset_cpu_ring_map(struct dp_soc *soc); 192 193 /* 194 * dp_soc_reset_ipa_vlan_intr_mask() - reset interrupt mask for IPA offloaded 195 * ring for vlan tagged traffic 196 * @dp_soc - DP Soc handle 197 * 198 * Return: Return void 199 */ 200 void dp_soc_reset_ipa_vlan_intr_mask(struct dp_soc *soc); 201 202 /* 203 * dp_soc_reset_intr_mask() - reset interrupt mask 204 * @dp_soc - DP Soc handle 205 * 206 * Return: Return void 207 */ 208 void dp_soc_reset_intr_mask(struct dp_soc *soc); 209 210 /* 211 * dp_reo_frag_dst_set() - configure reo register to set the 212 * fragment destination ring 213 * @soc : Datapath soc 214 * @frag_dst_ring : output parameter to set fragment destination ring 215 * 216 * Based on offload_radio below fragment destination rings is selected 217 * 0 - TCL 218 * 1 - SW1 219 * 2 - SW2 220 * 3 - SW3 221 * 4 - SW4 222 * 5 - Release 223 * 6 - FW 224 * 7 - alternate select 225 * 226 * return: void 227 */ 228 void dp_reo_frag_dst_set(struct dp_soc *soc, uint8_t *frag_dst_ring); 229 230 /** 231 * dp_dscp_tid_map_setup(): Initialize the dscp-tid maps 232 * @pdev: DP_PDEV handle 233 * 234 * Return: void 235 */ 236 void 237 dp_dscp_tid_map_setup(struct dp_pdev *pdev); 238 239 /** 240 * dp_pcp_tid_map_setup(): Initialize the pcp-tid maps 241 * @pdev: DP_PDEV handle 242 * 243 * Return: void 244 */ 245 void 246 dp_pcp_tid_map_setup(struct dp_pdev *pdev); 247 248 /** 249 * dp_soc_deinit() - Deinitialize txrx SOC 250 * @txrx_soc: Opaque DP SOC handle 251 * 252 * Return: None 253 */ 254 void dp_soc_deinit(void *txrx_soc); 255 256 #ifdef QCA_HOST2FW_RXBUF_RING 257 void 258 dp_htt_setup_rxdma_err_dst_ring(struct dp_soc *soc, int mac_id, 259 int lmac_id); 260 #endif 261 262 /* 263 * dp_peer_setup_wifi3() - initialize the peer 264 * @soc_hdl: soc handle object 265 * @vdev_id : vdev_id of vdev object 266 * @peer_mac: Peer's mac address 267 * @peer_setup_info: peer setup info for MLO 268 * 269 * Return: QDF_STATUS 270 */ 271 QDF_STATUS 272 dp_peer_setup_wifi3(struct cdp_soc_t *soc_hdl, uint8_t vdev_id, 273 uint8_t *peer_mac, 274 struct cdp_peer_setup_info *setup_info); 275 276 uint32_t dp_get_tx_rings_grp_bitmap(struct cdp_soc_t *soc_hdl); 277 278 /* 279 * dp_set_ba_aging_timeout() - set ba aging timeout per AC 280 * @txrx_soc: cdp soc handle 281 * @ac: Access category 282 * @value: timeout value in millisec 283 * 284 * Return: void 285 */ 286 void dp_set_ba_aging_timeout(struct cdp_soc_t *txrx_soc, 287 uint8_t ac, uint32_t value); 288 289 /* 290 * dp_get_ba_aging_timeout() - get ba aging timeout per AC 291 * @txrx_soc: cdp soc handle 292 * @ac: access category 293 * @value: timeout value in millisec 294 * 295 * Return: void 296 */ 297 void dp_get_ba_aging_timeout(struct cdp_soc_t *txrx_soc, 298 uint8_t ac, uint32_t *value); 299 300 /* 301 * dp_set_pdev_reo_dest() - set the reo destination ring for this pdev 302 * @txrx_soc: cdp soc handle 303 * @pdev_id: id of physical device object 304 * @val: reo destination ring index (1 - 4) 305 * 306 * Return: QDF_STATUS 307 */ 308 QDF_STATUS 309 dp_set_pdev_reo_dest(struct cdp_soc_t *txrx_soc, uint8_t pdev_id, 310 enum cdp_host_reo_dest_ring val); 311 312 /* 313 * dp_get_pdev_reo_dest() - get the reo destination for this pdev 314 * @txrx_soc: cdp soc handle 315 * @pdev_id: id of physical device object 316 * 317 * Return: reo destination ring index 318 */ 319 enum cdp_host_reo_dest_ring 320 dp_get_pdev_reo_dest(struct cdp_soc_t *txrx_soc, uint8_t pdev_id); 321 322 /** 323 * dp_set_pdev_pcp_tid_map_wifi3(): update pcp tid map in pdev 324 * @psoc: dp soc handle 325 * @pdev_id: id of DP_PDEV handle 326 * @pcp: pcp value 327 * @tid: tid value passed by the user 328 * 329 * Return: QDF_STATUS_SUCCESS on success 330 */ 331 QDF_STATUS dp_set_pdev_pcp_tid_map_wifi3(ol_txrx_soc_handle psoc, 332 uint8_t pdev_id, 333 uint8_t pcp, uint8_t tid); 334 335 /** 336 * dp_set_vdev_pcp_tid_map_wifi3(): update pcp tid map in vdev 337 * @soc_hdl: DP soc handle 338 * @vdev_id: id of DP_VDEV handle 339 * @pcp: pcp value 340 * @tid: tid value passed by the user 341 * 342 * Return: QDF_STATUS_SUCCESS on success 343 */ 344 QDF_STATUS dp_set_vdev_pcp_tid_map_wifi3(struct cdp_soc_t *soc_hdl, 345 uint8_t vdev_id, 346 uint8_t pcp, uint8_t tid); 347 348 /* * 349 * dp_dump_wbm_idle_hptp() -dump wbm idle ring, hw hp tp info. 350 * @soc: dp soc. 351 * @pdev: dp pdev. 352 * 353 * Return: None. 354 */ 355 void 356 dp_dump_wbm_idle_hptp(struct dp_soc *soc, struct dp_pdev *pdev); 357 358 /** 359 * dp_display_srng_info() - Dump the srng HP TP info 360 * @soc_hdl: CDP Soc handle 361 * 362 * This function dumps the SW hp/tp values for the important rings. 363 * HW hp/tp values are not being dumped, since it can lead to 364 * READ NOC error when UMAC is in low power state. MCC does not have 365 * device force wake working yet. 366 * 367 * Return: none 368 */ 369 void dp_display_srng_info(struct cdp_soc_t *soc_hdl); 370 371 #if defined(DP_POWER_SAVE) || defined(FEATURE_RUNTIME_PM) 372 void dp_drain_txrx(struct cdp_soc_t *soc_handle); 373 374 /* 375 * dp_update_ring_hptp() - update dp rings hptp 376 * @soc: dp soc handler 377 * @force_flush_tx: force flush the Tx ring hp 378 */ 379 void dp_update_ring_hptp(struct dp_soc *soc, bool force_flush_tx); 380 #endif 381 382 #ifdef WLAN_FEATURE_STATS_EXT 383 /** 384 * dp_request_rx_hw_stats - request rx hardware stats 385 * @soc_hdl: soc handle 386 * @vdev_id: vdev id 387 * 388 * Return: None 389 */ 390 QDF_STATUS 391 dp_request_rx_hw_stats(struct cdp_soc_t *soc_hdl, uint8_t vdev_id); 392 #endif 393 394 /** 395 * dp_reset_rx_hw_ext_stats - Reset rx hardware ext stats 396 * @soc_hdl: soc handle 397 * 398 * Return: None 399 */ 400 void dp_reset_rx_hw_ext_stats(struct cdp_soc_t *soc_hdl); 401 402 void dp_pdev_set_default_reo(struct dp_pdev *pdev); 403 404 /** 405 * dp_soc_init() - Initialize txrx SOC 406 * @soc: Opaque DP SOC handle 407 * @htc_handle: Opaque HTC handle 408 * @hif_handle: Opaque HIF handle 409 * 410 * Return: DP SOC handle on success, NULL on failure 411 */ 412 void *dp_soc_init(struct dp_soc *soc, HTC_HANDLE htc_handle, 413 struct hif_opaque_softc *hif_handle); 414 415 void dp_tx_init_cmd_credit_ring(struct dp_soc *soc); 416 417 /** 418 * dp_soc_srng_deinit() - de-initialize soc srng rings 419 * @soc: Datapath soc handle 420 * 421 */ 422 void dp_soc_srng_deinit(struct dp_soc *soc); 423 424 /** 425 * dp_soc_srng_init() - Initialize soc level srng rings 426 * @soc: Datapath soc handle 427 * 428 * return: QDF_STATUS_SUCCESS on success 429 * QDF_STATUS_E_FAILURE on failure 430 */ 431 QDF_STATUS dp_soc_srng_init(struct dp_soc *soc); 432 433 /** 434 * dp_soc_srng_free() - free soc level srng rings 435 * @soc: Datapath soc handle 436 * 437 */ 438 void dp_soc_srng_free(struct dp_soc *soc); 439 440 /** 441 * dp_soc_srng_alloc() - Allocate memory for soc level srng rings 442 * @soc: Datapath soc handle 443 * 444 * return: QDF_STATUS_SUCCESS on success 445 * QDF_STATUS_E_NOMEM on failure 446 */ 447 QDF_STATUS dp_soc_srng_alloc(struct dp_soc *soc); 448 449 /** 450 * dp_soc_cfg_attach() - set target specific configuration in 451 * dp soc cfg. 452 * @soc: dp soc handle 453 */ 454 void dp_soc_cfg_attach(struct dp_soc *soc); 455 456 /** 457 * dp_soc_set_interrupt_mode() - Set the interrupt mode in soc 458 * @soc: DP soc handle 459 * 460 * Set the appropriate interrupt mode flag in the soc 461 */ 462 void dp_soc_set_interrupt_mode(struct dp_soc *soc); 463 464 #else /* WLAN_SOFTUMAC_SUPPORT */ 465 static inline void dp_service_lmac_rings(void *arg) 466 { 467 } 468 469 static inline 470 uint32_t dp_service_srngs(void *dp_ctx, uint32_t dp_budget, int cpu) 471 { 472 return 0; 473 } 474 475 static inline void dp_soc_interrupt_detach(struct cdp_soc_t *txrx_soc) 476 { 477 struct dp_soc *soc = (struct dp_soc *)txrx_soc; 478 479 if (soc->intr_mode == DP_INTR_POLL) 480 qdf_timer_free(&soc->int_timer); 481 482 qdf_mem_set(&soc->mon_intr_id_lmac_map, 483 sizeof(soc->mon_intr_id_lmac_map), 484 DP_MON_INVALID_LMAC_ID); 485 } 486 487 /* 488 * dp_soc_interrupt_attach() - Register handlers for DP interrupts 489 * @txrx_soc: DP SOC handle 490 * 491 * Host driver will register for “DP_NUM_INTERRUPT_CONTEXTS” number of NAPI 492 * contexts. Each NAPI context will have a tx_ring_mask , rx_ring_mask ,and 493 * rx_monitor_ring mask to indicate the rings that are processed by the handler. 494 * 495 * Return: 0 for success. nonzero for failure. 496 */ 497 static inline QDF_STATUS dp_soc_interrupt_attach(struct cdp_soc_t *txrx_soc) 498 { 499 struct dp_soc *soc = (struct dp_soc *)txrx_soc; 500 501 qdf_mem_set(&soc->mon_intr_id_lmac_map, 502 sizeof(soc->mon_intr_id_lmac_map), 503 DP_MON_INVALID_LMAC_ID); 504 505 return QDF_STATUS_SUCCESS; 506 } 507 508 static inline void dp_hw_link_desc_ring_free(struct dp_soc *soc) 509 { 510 } 511 512 static inline QDF_STATUS dp_hw_link_desc_ring_alloc(struct dp_soc *soc) 513 { 514 return QDF_STATUS_SUCCESS; 515 } 516 517 static inline QDF_STATUS dp_hw_link_desc_ring_init(struct dp_soc *soc) 518 { 519 return QDF_STATUS_SUCCESS; 520 } 521 522 static inline void dp_hw_link_desc_ring_deinit(struct dp_soc *soc) 523 { 524 } 525 526 static inline void dp_ipa_hal_tx_init_alt_data_ring(struct dp_soc *soc) 527 { 528 } 529 530 static inline void dp_soc_reset_cpu_ring_map(struct dp_soc *soc) 531 { 532 } 533 534 static inline void dp_soc_reset_ipa_vlan_intr_mask(struct dp_soc *soc) 535 { 536 } 537 538 static inline void dp_soc_reset_intr_mask(struct dp_soc *soc) 539 { 540 } 541 542 static inline 543 void dp_reo_frag_dst_set(struct dp_soc *soc, uint8_t *frag_dst_ring) 544 { 545 } 546 547 /** 548 * dp_dscp_tid_map_setup(): Initialize the dscp-tid maps 549 * @pdev: DP_PDEV handle 550 * 551 * Return: void 552 */ 553 static inline void 554 dp_dscp_tid_map_setup(struct dp_pdev *pdev) 555 { 556 } 557 558 /** 559 * dp_pcp_tid_map_setup(): Initialize the pcp-tid maps 560 * @pdev: DP_PDEV handle 561 * 562 * Return: void 563 */ 564 static inline void 565 dp_pcp_tid_map_setup(struct dp_pdev *pdev) 566 { 567 } 568 569 #ifdef QCA_HOST2FW_RXBUF_RING 570 static inline void 571 dp_htt_setup_rxdma_err_dst_ring(struct dp_soc *soc, int mac_id, 572 int lmac_id) 573 { 574 } 575 #endif 576 577 /* * 578 * dp_dump_wbm_idle_hptp() -dump wbm idle ring, hw hp tp info. 579 * @soc: dp soc. 580 * @pdev: dp pdev. 581 * 582 * Return: None. 583 */ 584 static inline void 585 dp_dump_wbm_idle_hptp(struct dp_soc *soc, struct dp_pdev *pdev) 586 { 587 } 588 589 static inline void dp_pdev_set_default_reo(struct dp_pdev *pdev) 590 { 591 } 592 593 static inline void dp_tx_init_cmd_credit_ring(struct dp_soc *soc) 594 { 595 } 596 597 /** 598 * dp_soc_srng_deinit() - de-initialize soc srng rings 599 * @soc: Datapath soc handle 600 * 601 */ 602 static inline void dp_soc_srng_deinit(struct dp_soc *soc) 603 { 604 } 605 606 /** 607 * dp_soc_srng_init() - Initialize soc level srng rings 608 * @soc: Datapath soc handle 609 * 610 * return: QDF_STATUS_SUCCESS on success 611 * QDF_STATUS_E_FAILURE on failure 612 */ 613 static inline QDF_STATUS dp_soc_srng_init(struct dp_soc *soc) 614 { 615 dp_enable_verbose_debug(soc); 616 617 return QDF_STATUS_SUCCESS; 618 } 619 620 /** 621 * dp_soc_srng_free() - free soc level srng rings 622 * @soc: Datapath soc handle 623 * 624 */ 625 static inline void dp_soc_srng_free(struct dp_soc *soc) 626 { 627 } 628 629 /** 630 * dp_soc_srng_alloc() - Allocate memory for soc level srng rings 631 * @soc: Datapath soc handle 632 * 633 * return: QDF_STATUS_SUCCESS on success 634 * QDF_STATUS_E_NOMEM on failure 635 */ 636 static inline QDF_STATUS dp_soc_srng_alloc(struct dp_soc *soc) 637 { 638 return QDF_STATUS_SUCCESS; 639 } 640 641 /* 642 * dp_soc_attach_poll() - Register handlers for DP interrupts 643 * @txrx_soc: DP SOC handle 644 * 645 * Host driver will register for “DP_NUM_INTERRUPT_CONTEXTS” number of NAPI 646 * contexts. Each NAPI context will have a tx_ring_mask , rx_ring_mask ,and 647 * rx_monitor_ring mask to indicate the rings that are processed by the handler. 648 * 649 * Return: 0 for success, nonzero for failure. 650 */ 651 static inline QDF_STATUS dp_soc_attach_poll(struct cdp_soc_t *txrx_soc) 652 { 653 struct dp_soc *soc = (struct dp_soc *)txrx_soc; 654 655 qdf_mem_set(&soc->mon_intr_id_lmac_map, 656 sizeof(soc->mon_intr_id_lmac_map), DP_MON_INVALID_LMAC_ID); 657 soc->intr_mode = DP_INTR_POLL; 658 659 qdf_timer_init(soc->osdev, &soc->int_timer, 660 dp_interrupt_timer, (void *)soc, 661 QDF_TIMER_TYPE_WAKE_APPS); 662 663 return QDF_STATUS_SUCCESS; 664 } 665 666 static inline void dp_soc_set_interrupt_mode(struct dp_soc *soc) 667 { 668 soc->intr_mode = DP_INTR_INTEGRATED; 669 670 if (!(soc->wlan_cfg_ctx->napi_enabled) || 671 (dp_is_monitor_mode_using_poll(soc) && 672 soc->cdp_soc.ol_ops->get_con_mode && 673 soc->cdp_soc.ol_ops->get_con_mode() == QDF_GLOBAL_MONITOR_MODE)) { 674 soc->intr_mode = DP_INTR_POLL; 675 } else { 676 soc->intr_mode = DP_INTR_MSI; 677 } 678 } 679 680 /** 681 * dp_display_srng_info() - Dump the ring Read/Write idx info 682 * @soc_hdl: CDP Soc handle 683 * 684 * This function dumps the SW Read/Write idx for the important rings. 685 * 686 * Return: none 687 */ 688 static inline void dp_display_srng_info(struct cdp_soc_t *soc_hdl) 689 { 690 /*TODO add support display SOFTUMAC data rings info*/ 691 } 692 693 #if defined(DP_POWER_SAVE) || defined(FEATURE_RUNTIME_PM) 694 static inline void dp_drain_txrx(struct cdp_soc_t *soc_handle) 695 { 696 } 697 #endif 698 #endif /* WLAN_SOFTUMAC_SUPPORT */ 699 700 #endif /* _DP_RINGS_H_ */ 701