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_INTERNAL_H_ 21 #define _DP_INTERNAL_H_ 22 23 #include "dp_types.h" 24 #include "dp_htt.h" 25 26 #define RX_BUFFER_SIZE_PKTLOG_LITE 1024 27 28 #define DP_PEER_WDS_COUNT_INVALID UINT_MAX 29 30 #define DP_BLOCKMEM_SIZE 4096 31 #define WBM2_SW_PPE_REL_RING_ID 6 32 #define WBM2_SW_PPE_REL_MAP_ID 11 33 /* Alignment for consistent memory for DP rings*/ 34 #define DP_RING_BASE_ALIGN 32 35 36 #define DP_RSSI_INVAL 0x80 37 #define DP_RSSI_AVG_WEIGHT 2 38 /* 39 * Formula to derive avg_rssi is taken from wifi2.o firmware 40 */ 41 #define DP_GET_AVG_RSSI(avg_rssi, last_rssi) \ 42 (((avg_rssi) - (((uint8_t)(avg_rssi)) >> DP_RSSI_AVG_WEIGHT)) \ 43 + ((((uint8_t)(last_rssi)) >> DP_RSSI_AVG_WEIGHT))) 44 45 /* Macro For NYSM value received in VHT TLV */ 46 #define VHT_SGI_NYSM 3 47 48 #define INVALID_WBM_RING_NUM 0xF 49 50 #ifdef FEATURE_DIRECT_LINK 51 #define DIRECT_LINK_REFILL_RING_ENTRIES 64 52 #ifdef IPA_OFFLOAD 53 #ifdef IPA_WDI3_VLAN_SUPPORT 54 #define DIRECT_LINK_REFILL_RING_IDX 4 55 #else 56 #define DIRECT_LINK_REFILL_RING_IDX 3 57 #endif 58 #else 59 #define DIRECT_LINK_REFILL_RING_IDX 2 60 #endif 61 #endif 62 63 /** 64 * struct htt_dbgfs_cfg - structure to maintain required htt data 65 * @msg_word: htt msg sent to upper layer 66 * @m: qdf debugfs file pointer 67 */ 68 struct htt_dbgfs_cfg { 69 uint32_t *msg_word; 70 qdf_debugfs_file_t m; 71 }; 72 73 /* Cookie MSB bits assigned for different use case. 74 * Note: User can't use last 3 bits, as it is reserved for pdev_id. 75 * If in future number of pdev are more than 3. 76 */ 77 /* Reserve for default case */ 78 #define DBG_STATS_COOKIE_DEFAULT 0x0 79 80 /* Reserve for DP Stats: 3rd bit */ 81 #define DBG_STATS_COOKIE_DP_STATS BIT(3) 82 83 /* Reserve for HTT Stats debugfs support: 4th bit */ 84 #define DBG_STATS_COOKIE_HTT_DBGFS BIT(4) 85 86 /*Reserve for HTT Stats debugfs support: 5th bit */ 87 #define DBG_SYSFS_STATS_COOKIE BIT(5) 88 89 /* Reserve for HTT Stats OBSS PD support: 6th bit */ 90 #define DBG_STATS_COOKIE_HTT_OBSS BIT(6) 91 92 /* 93 * Bitmap of HTT PPDU TLV types for Default mode 94 */ 95 #define HTT_PPDU_DEFAULT_TLV_BITMAP \ 96 (1 << HTT_PPDU_STATS_COMMON_TLV) | \ 97 (1 << HTT_PPDU_STATS_USR_COMMON_TLV) | \ 98 (1 << HTT_PPDU_STATS_USR_RATE_TLV) | \ 99 (1 << HTT_PPDU_STATS_SCH_CMD_STATUS_TLV) | \ 100 (1 << HTT_PPDU_STATS_USR_COMPLTN_COMMON_TLV) | \ 101 (1 << HTT_PPDU_STATS_USR_COMPLTN_ACK_BA_STATUS_TLV) 102 103 /* PPDU STATS CFG */ 104 #define DP_PPDU_STATS_CFG_ALL 0xFFFF 105 106 /* PPDU stats mask sent to FW to enable enhanced stats */ 107 #define DP_PPDU_STATS_CFG_ENH_STATS \ 108 (HTT_PPDU_DEFAULT_TLV_BITMAP) | \ 109 (1 << HTT_PPDU_STATS_USR_COMPLTN_FLUSH_TLV) | \ 110 (1 << HTT_PPDU_STATS_USR_COMMON_ARRAY_TLV) | \ 111 (1 << HTT_PPDU_STATS_USERS_INFO_TLV) 112 113 /* PPDU stats mask sent to FW to support debug sniffer feature */ 114 #define DP_PPDU_STATS_CFG_SNIFFER \ 115 (HTT_PPDU_DEFAULT_TLV_BITMAP) | \ 116 (1 << HTT_PPDU_STATS_USR_MPDU_ENQ_BITMAP_64_TLV) | \ 117 (1 << HTT_PPDU_STATS_USR_MPDU_ENQ_BITMAP_256_TLV) | \ 118 (1 << HTT_PPDU_STATS_USR_COMPLTN_BA_BITMAP_64_TLV) | \ 119 (1 << HTT_PPDU_STATS_USR_COMPLTN_BA_BITMAP_256_TLV) | \ 120 (1 << HTT_PPDU_STATS_USR_COMPLTN_FLUSH_TLV) | \ 121 (1 << HTT_PPDU_STATS_USR_COMPLTN_BA_BITMAP_256_TLV) | \ 122 (1 << HTT_PPDU_STATS_USR_COMPLTN_FLUSH_TLV) | \ 123 (1 << HTT_PPDU_STATS_USR_COMMON_ARRAY_TLV) | \ 124 (1 << HTT_PPDU_STATS_TX_MGMTCTRL_PAYLOAD_TLV) | \ 125 (1 << HTT_PPDU_STATS_USERS_INFO_TLV) 126 127 /* PPDU stats mask sent to FW to support BPR feature*/ 128 #define DP_PPDU_STATS_CFG_BPR \ 129 (1 << HTT_PPDU_STATS_TX_MGMTCTRL_PAYLOAD_TLV) | \ 130 (1 << HTT_PPDU_STATS_USERS_INFO_TLV) 131 132 /* PPDU stats mask sent to FW to support BPR and enhanced stats feature */ 133 #define DP_PPDU_STATS_CFG_BPR_ENH (DP_PPDU_STATS_CFG_BPR | \ 134 DP_PPDU_STATS_CFG_ENH_STATS) 135 /* PPDU stats mask sent to FW to support BPR and pcktlog stats feature */ 136 #define DP_PPDU_STATS_CFG_BPR_PKTLOG (DP_PPDU_STATS_CFG_BPR | \ 137 DP_PPDU_TXLITE_STATS_BITMASK_CFG) 138 139 /* 140 * Bitmap of HTT PPDU delayed ba TLV types for Default mode 141 */ 142 #define HTT_PPDU_DELAYED_BA_TLV_BITMAP \ 143 (1 << HTT_PPDU_STATS_COMMON_TLV) | \ 144 (1 << HTT_PPDU_STATS_USR_COMMON_TLV) | \ 145 (1 << HTT_PPDU_STATS_USR_RATE_TLV) 146 147 /* 148 * Bitmap of HTT PPDU TLV types for Delayed BA 149 */ 150 #define HTT_PPDU_STATUS_TLV_BITMAP \ 151 (1 << HTT_PPDU_STATS_COMMON_TLV) | \ 152 (1 << HTT_PPDU_STATS_USR_COMPLTN_ACK_BA_STATUS_TLV) 153 154 /* 155 * Bitmap of HTT PPDU TLV types for Sniffer mode bitmap 64 156 */ 157 #define HTT_PPDU_SNIFFER_AMPDU_TLV_BITMAP_64 \ 158 ((1 << HTT_PPDU_STATS_COMMON_TLV) | \ 159 (1 << HTT_PPDU_STATS_USR_COMMON_TLV) | \ 160 (1 << HTT_PPDU_STATS_USR_RATE_TLV) | \ 161 (1 << HTT_PPDU_STATS_SCH_CMD_STATUS_TLV) | \ 162 (1 << HTT_PPDU_STATS_USR_COMPLTN_COMMON_TLV) | \ 163 (1 << HTT_PPDU_STATS_USR_COMPLTN_ACK_BA_STATUS_TLV) | \ 164 (1 << HTT_PPDU_STATS_USR_COMPLTN_BA_BITMAP_64_TLV) | \ 165 (1 << HTT_PPDU_STATS_USR_MPDU_ENQ_BITMAP_64_TLV)) 166 167 /* 168 * Bitmap of HTT PPDU TLV types for Sniffer mode bitmap 256 169 */ 170 #define HTT_PPDU_SNIFFER_AMPDU_TLV_BITMAP_256 \ 171 ((1 << HTT_PPDU_STATS_COMMON_TLV) | \ 172 (1 << HTT_PPDU_STATS_USR_COMMON_TLV) | \ 173 (1 << HTT_PPDU_STATS_USR_RATE_TLV) | \ 174 (1 << HTT_PPDU_STATS_SCH_CMD_STATUS_TLV) | \ 175 (1 << HTT_PPDU_STATS_USR_COMPLTN_COMMON_TLV) | \ 176 (1 << HTT_PPDU_STATS_USR_COMPLTN_ACK_BA_STATUS_TLV) | \ 177 (1 << HTT_PPDU_STATS_USR_COMPLTN_BA_BITMAP_256_TLV) | \ 178 (1 << HTT_PPDU_STATS_USR_MPDU_ENQ_BITMAP_256_TLV)) 179 180 static const enum cdp_packet_type hal_2_dp_pkt_type_map[HAL_DOT11_MAX] = { 181 [HAL_DOT11A] = DOT11_A, 182 [HAL_DOT11B] = DOT11_B, 183 [HAL_DOT11N_MM] = DOT11_N, 184 [HAL_DOT11AC] = DOT11_AC, 185 [HAL_DOT11AX] = DOT11_AX, 186 [HAL_DOT11BA] = DOT11_MAX, 187 #ifdef WLAN_FEATURE_11BE 188 [HAL_DOT11BE] = DOT11_BE, 189 #else 190 [HAL_DOT11BE] = DOT11_MAX, 191 #endif 192 [HAL_DOT11AZ] = DOT11_MAX, 193 [HAL_DOT11N_GF] = DOT11_MAX, 194 }; 195 196 #ifdef WLAN_FEATURE_11BE 197 /** 198 * dp_get_mcs_array_index_by_pkt_type_mcs() - get the destination mcs index 199 * in array 200 * @pkt_type: host SW pkt type 201 * @mcs: mcs value for TX/RX rate 202 * 203 * Return: succeeded - valid index in mcs array 204 * fail - same value as MCS_MAX 205 */ 206 static inline uint8_t 207 dp_get_mcs_array_index_by_pkt_type_mcs(uint32_t pkt_type, uint32_t mcs) 208 { 209 uint8_t dst_mcs_idx = MCS_INVALID_ARRAY_INDEX; 210 211 switch (pkt_type) { 212 case DOT11_A: 213 dst_mcs_idx = 214 mcs >= MAX_MCS_11A ? (MAX_MCS - 1) : mcs; 215 break; 216 case DOT11_B: 217 dst_mcs_idx = 218 mcs >= MAX_MCS_11B ? (MAX_MCS - 1) : mcs; 219 break; 220 case DOT11_N: 221 dst_mcs_idx = 222 mcs >= MAX_MCS_11N ? (MAX_MCS - 1) : mcs; 223 break; 224 case DOT11_AC: 225 dst_mcs_idx = 226 mcs >= MAX_MCS_11AC ? (MAX_MCS - 1) : mcs; 227 break; 228 case DOT11_AX: 229 dst_mcs_idx = 230 mcs >= MAX_MCS_11AX ? (MAX_MCS - 1) : mcs; 231 break; 232 case DOT11_BE: 233 dst_mcs_idx = 234 mcs >= MAX_MCS_11BE ? (MAX_MCS - 1) : mcs; 235 break; 236 default: 237 break; 238 } 239 240 return dst_mcs_idx; 241 } 242 #else 243 static inline uint8_t 244 dp_get_mcs_array_index_by_pkt_type_mcs(uint32_t pkt_type, uint32_t mcs) 245 { 246 uint8_t dst_mcs_idx = MCS_INVALID_ARRAY_INDEX; 247 248 switch (pkt_type) { 249 case DOT11_A: 250 dst_mcs_idx = 251 mcs >= MAX_MCS_11A ? (MAX_MCS - 1) : mcs; 252 break; 253 case DOT11_B: 254 dst_mcs_idx = 255 mcs >= MAX_MCS_11B ? (MAX_MCS - 1) : mcs; 256 break; 257 case DOT11_N: 258 dst_mcs_idx = 259 mcs >= MAX_MCS_11N ? (MAX_MCS - 1) : mcs; 260 break; 261 case DOT11_AC: 262 dst_mcs_idx = 263 mcs >= MAX_MCS_11AC ? (MAX_MCS - 1) : mcs; 264 break; 265 case DOT11_AX: 266 dst_mcs_idx = 267 mcs >= MAX_MCS_11AX ? (MAX_MCS - 1) : mcs; 268 break; 269 default: 270 break; 271 } 272 273 return dst_mcs_idx; 274 } 275 #endif 276 277 #ifdef WIFI_MONITOR_SUPPORT 278 QDF_STATUS dp_mon_soc_attach(struct dp_soc *soc); 279 QDF_STATUS dp_mon_soc_detach(struct dp_soc *soc); 280 #else 281 static inline 282 QDF_STATUS dp_mon_soc_attach(struct dp_soc *soc) 283 { 284 return QDF_STATUS_SUCCESS; 285 } 286 287 static inline 288 QDF_STATUS dp_mon_soc_detach(struct dp_soc *soc) 289 { 290 return QDF_STATUS_SUCCESS; 291 } 292 #endif 293 294 /** 295 * dp_rx_err_match_dhost() - function to check whether dest-mac is correct 296 * @eh: Ethernet header of incoming packet 297 * @vdev: dp_vdev object of the VAP on which this data packet is received 298 * 299 * Return: 1 if the destination mac is correct, 300 * 0 if this frame is not correctly destined to this VAP/MLD 301 */ 302 int dp_rx_err_match_dhost(qdf_ether_header_t *eh, struct dp_vdev *vdev); 303 304 #ifdef MONITOR_MODULARIZED_ENABLE 305 static inline bool dp_monitor_modularized_enable(void) 306 { 307 return TRUE; 308 } 309 310 static inline QDF_STATUS 311 dp_mon_soc_attach_wrapper(struct dp_soc *soc) { return QDF_STATUS_SUCCESS; } 312 313 static inline QDF_STATUS 314 dp_mon_soc_detach_wrapper(struct dp_soc *soc) { return QDF_STATUS_SUCCESS; } 315 #else 316 static inline bool dp_monitor_modularized_enable(void) 317 { 318 return FALSE; 319 } 320 321 static inline QDF_STATUS dp_mon_soc_attach_wrapper(struct dp_soc *soc) 322 { 323 return dp_mon_soc_attach(soc); 324 } 325 326 static inline QDF_STATUS dp_mon_soc_detach_wrapper(struct dp_soc *soc) 327 { 328 return dp_mon_soc_detach(soc); 329 } 330 #endif 331 332 #ifndef WIFI_MONITOR_SUPPORT 333 #define MON_BUF_MIN_ENTRIES 64 334 335 static inline QDF_STATUS dp_monitor_pdev_attach(struct dp_pdev *pdev) 336 { 337 return QDF_STATUS_SUCCESS; 338 } 339 340 static inline QDF_STATUS dp_monitor_pdev_detach(struct dp_pdev *pdev) 341 { 342 return QDF_STATUS_SUCCESS; 343 } 344 345 static inline QDF_STATUS dp_monitor_vdev_attach(struct dp_vdev *vdev) 346 { 347 return QDF_STATUS_E_FAILURE; 348 } 349 350 static inline QDF_STATUS dp_monitor_vdev_detach(struct dp_vdev *vdev) 351 { 352 return QDF_STATUS_E_FAILURE; 353 } 354 355 static inline QDF_STATUS dp_monitor_peer_attach(struct dp_soc *soc, 356 struct dp_peer *peer) 357 { 358 return QDF_STATUS_SUCCESS; 359 } 360 361 static inline QDF_STATUS dp_monitor_peer_detach(struct dp_soc *soc, 362 struct dp_peer *peer) 363 { 364 return QDF_STATUS_E_FAILURE; 365 } 366 367 static inline struct cdp_peer_rate_stats_ctx* 368 dp_monitor_peer_get_peerstats_ctx(struct dp_soc *soc, struct dp_peer *peer) 369 { 370 return NULL; 371 } 372 373 static inline 374 void dp_monitor_peer_reset_stats(struct dp_soc *soc, struct dp_peer *peer) 375 { 376 } 377 378 static inline 379 void dp_monitor_peer_get_stats(struct dp_soc *soc, struct dp_peer *peer, 380 void *arg, enum cdp_stat_update_type type) 381 { 382 } 383 384 static inline 385 void dp_monitor_invalid_peer_update_pdev_stats(struct dp_soc *soc, 386 struct dp_pdev *pdev) 387 { 388 } 389 390 static inline 391 QDF_STATUS dp_monitor_peer_get_stats_param(struct dp_soc *soc, 392 struct dp_peer *peer, 393 enum cdp_peer_stats_type type, 394 cdp_peer_stats_param_t *buf) 395 { 396 return QDF_STATUS_E_FAILURE; 397 } 398 399 static inline QDF_STATUS dp_monitor_pdev_init(struct dp_pdev *pdev) 400 { 401 return QDF_STATUS_SUCCESS; 402 } 403 404 static inline QDF_STATUS dp_monitor_pdev_deinit(struct dp_pdev *pdev) 405 { 406 return QDF_STATUS_SUCCESS; 407 } 408 409 static inline QDF_STATUS dp_monitor_soc_cfg_init(struct dp_soc *soc) 410 { 411 return QDF_STATUS_SUCCESS; 412 } 413 414 static inline QDF_STATUS dp_monitor_config_debug_sniffer(struct dp_pdev *pdev, 415 int val) 416 { 417 return QDF_STATUS_E_FAILURE; 418 } 419 420 static inline void dp_monitor_flush_rings(struct dp_soc *soc) 421 { 422 } 423 424 static inline QDF_STATUS dp_monitor_htt_srng_setup(struct dp_soc *soc, 425 struct dp_pdev *pdev, 426 int mac_id, 427 int mac_for_pdev) 428 { 429 return QDF_STATUS_SUCCESS; 430 } 431 432 static inline void dp_monitor_service_mon_rings(struct dp_soc *soc, 433 uint32_t quota) 434 { 435 } 436 437 static inline 438 uint32_t dp_monitor_process(struct dp_soc *soc, struct dp_intr *int_ctx, 439 uint32_t mac_id, uint32_t quota) 440 { 441 return 0; 442 } 443 444 static inline 445 uint32_t dp_monitor_drop_packets_for_mac(struct dp_pdev *pdev, 446 uint32_t mac_id, uint32_t quota) 447 { 448 return 0; 449 } 450 451 static inline void dp_monitor_peer_tx_init(struct dp_pdev *pdev, 452 struct dp_peer *peer) 453 { 454 } 455 456 static inline void dp_monitor_peer_tx_cleanup(struct dp_vdev *vdev, 457 struct dp_peer *peer) 458 { 459 } 460 461 static inline 462 void dp_monitor_peer_tid_peer_id_update(struct dp_soc *soc, 463 struct dp_peer *peer, 464 uint16_t peer_id) 465 { 466 } 467 468 static inline void dp_monitor_tx_ppdu_stats_attach(struct dp_pdev *pdev) 469 { 470 } 471 472 static inline void dp_monitor_tx_ppdu_stats_detach(struct dp_pdev *pdev) 473 { 474 } 475 476 static inline 477 QDF_STATUS dp_monitor_tx_capture_debugfs_init(struct dp_pdev *pdev) 478 { 479 return QDF_STATUS_SUCCESS; 480 } 481 482 static inline void dp_monitor_peer_tx_capture_filter_check(struct dp_pdev *pdev, 483 struct dp_peer *peer) 484 { 485 } 486 487 static inline 488 QDF_STATUS dp_monitor_tx_add_to_comp_queue(struct dp_soc *soc, 489 struct dp_tx_desc_s *desc, 490 struct hal_tx_completion_status *ts, 491 uint16_t peer_id) 492 { 493 return QDF_STATUS_E_FAILURE; 494 } 495 496 static inline 497 QDF_STATUS monitor_update_msdu_to_list(struct dp_soc *soc, 498 struct dp_pdev *pdev, 499 struct dp_peer *peer, 500 struct hal_tx_completion_status *ts, 501 qdf_nbuf_t netbuf) 502 { 503 return QDF_STATUS_E_FAILURE; 504 } 505 506 static inline bool dp_monitor_ppdu_stats_ind_handler(struct htt_soc *soc, 507 uint32_t *msg_word, 508 qdf_nbuf_t htt_t2h_msg) 509 { 510 return true; 511 } 512 513 static inline QDF_STATUS dp_monitor_htt_ppdu_stats_attach(struct dp_pdev *pdev) 514 { 515 return QDF_STATUS_SUCCESS; 516 } 517 518 static inline void dp_monitor_htt_ppdu_stats_detach(struct dp_pdev *pdev) 519 { 520 } 521 522 static inline void dp_monitor_print_pdev_rx_mon_stats(struct dp_pdev *pdev) 523 { 524 } 525 526 static inline QDF_STATUS dp_monitor_config_enh_tx_capture(struct dp_pdev *pdev, 527 uint32_t val) 528 { 529 return QDF_STATUS_E_INVAL; 530 } 531 532 static inline QDF_STATUS dp_monitor_tx_peer_filter(struct dp_pdev *pdev, 533 struct dp_peer *peer, 534 uint8_t is_tx_pkt_cap_enable, 535 uint8_t *peer_mac) 536 { 537 return QDF_STATUS_E_INVAL; 538 } 539 540 static inline QDF_STATUS dp_monitor_config_enh_rx_capture(struct dp_pdev *pdev, 541 uint32_t val) 542 { 543 return QDF_STATUS_E_INVAL; 544 } 545 546 static inline 547 QDF_STATUS dp_monitor_set_bpr_enable(struct dp_pdev *pdev, uint32_t val) 548 { 549 return QDF_STATUS_E_FAILURE; 550 } 551 552 static inline 553 int dp_monitor_set_filter_neigh_peers(struct dp_pdev *pdev, bool val) 554 { 555 return 0; 556 } 557 558 static inline 559 void dp_monitor_set_atf_stats_enable(struct dp_pdev *pdev, bool value) 560 { 561 } 562 563 static inline 564 void dp_monitor_set_bsscolor(struct dp_pdev *pdev, uint8_t bsscolor) 565 { 566 } 567 568 static inline 569 bool dp_monitor_pdev_get_filter_mcast_data(struct cdp_pdev *pdev_handle) 570 { 571 return false; 572 } 573 574 static inline 575 bool dp_monitor_pdev_get_filter_non_data(struct cdp_pdev *pdev_handle) 576 { 577 return false; 578 } 579 580 static inline 581 bool dp_monitor_pdev_get_filter_ucast_data(struct cdp_pdev *pdev_handle) 582 { 583 return false; 584 } 585 586 static inline 587 int dp_monitor_set_pktlog_wifi3(struct dp_pdev *pdev, uint32_t event, 588 bool enable) 589 { 590 return 0; 591 } 592 593 static inline void dp_monitor_pktlogmod_exit(struct dp_pdev *pdev) 594 { 595 } 596 597 static inline 598 QDF_STATUS dp_monitor_vdev_set_monitor_mode_buf_rings(struct dp_pdev *pdev) 599 { 600 return QDF_STATUS_E_FAILURE; 601 } 602 603 static inline 604 void dp_monitor_neighbour_peers_detach(struct dp_pdev *pdev) 605 { 606 } 607 608 static inline QDF_STATUS dp_monitor_filter_neighbour_peer(struct dp_pdev *pdev, 609 uint8_t *rx_pkt_hdr) 610 { 611 return QDF_STATUS_E_FAILURE; 612 } 613 614 static inline void dp_monitor_print_pdev_tx_capture_stats(struct dp_pdev *pdev) 615 { 616 } 617 618 static inline 619 void dp_monitor_reap_timer_init(struct dp_soc *soc) 620 { 621 } 622 623 static inline 624 void dp_monitor_reap_timer_deinit(struct dp_soc *soc) 625 { 626 } 627 628 static inline 629 bool dp_monitor_reap_timer_start(struct dp_soc *soc, 630 enum cdp_mon_reap_source source) 631 { 632 return false; 633 } 634 635 static inline 636 bool dp_monitor_reap_timer_stop(struct dp_soc *soc, 637 enum cdp_mon_reap_source source) 638 { 639 return false; 640 } 641 642 static inline void 643 dp_monitor_reap_timer_suspend(struct dp_soc *soc) 644 { 645 } 646 647 static inline 648 void dp_monitor_vdev_timer_init(struct dp_soc *soc) 649 { 650 } 651 652 static inline 653 void dp_monitor_vdev_timer_deinit(struct dp_soc *soc) 654 { 655 } 656 657 static inline 658 void dp_monitor_vdev_timer_start(struct dp_soc *soc) 659 { 660 } 661 662 static inline 663 bool dp_monitor_vdev_timer_stop(struct dp_soc *soc) 664 { 665 return false; 666 } 667 668 static inline struct qdf_mem_multi_page_t* 669 dp_monitor_get_link_desc_pages(struct dp_soc *soc, uint32_t mac_id) 670 { 671 return NULL; 672 } 673 674 static inline uint32_t * 675 dp_monitor_get_total_link_descs(struct dp_soc *soc, uint32_t mac_id) 676 { 677 return NULL; 678 } 679 680 static inline QDF_STATUS dp_monitor_drop_inv_peer_pkts(struct dp_vdev *vdev) 681 { 682 return QDF_STATUS_E_FAILURE; 683 } 684 685 static inline bool dp_is_enable_reap_timer_non_pkt(struct dp_pdev *pdev) 686 { 687 return false; 688 } 689 690 static inline void dp_monitor_vdev_register_osif(struct dp_vdev *vdev, 691 struct ol_txrx_ops *txrx_ops) 692 { 693 } 694 695 static inline bool dp_monitor_is_vdev_timer_running(struct dp_soc *soc) 696 { 697 return false; 698 } 699 700 static inline 701 void dp_monitor_pdev_set_mon_vdev(struct dp_vdev *vdev) 702 { 703 } 704 705 static inline void dp_monitor_vdev_delete(struct dp_soc *soc, 706 struct dp_vdev *vdev) 707 { 708 } 709 710 static inline void dp_peer_ppdu_delayed_ba_init(struct dp_peer *peer) 711 { 712 } 713 714 static inline void dp_monitor_neighbour_peer_add_ast(struct dp_pdev *pdev, 715 struct dp_peer *ta_peer, 716 uint8_t *mac_addr, 717 qdf_nbuf_t nbuf, 718 uint32_t flags) 719 { 720 } 721 722 static inline void 723 dp_monitor_set_chan_band(struct dp_pdev *pdev, enum reg_wifi_band chan_band) 724 { 725 } 726 727 static inline void 728 dp_monitor_set_chan_freq(struct dp_pdev *pdev, qdf_freq_t chan_freq) 729 { 730 } 731 732 static inline void dp_monitor_set_chan_num(struct dp_pdev *pdev, int chan_num) 733 { 734 } 735 736 static inline bool dp_monitor_is_enable_mcopy_mode(struct dp_pdev *pdev) 737 { 738 return false; 739 } 740 741 static inline 742 void dp_monitor_neighbour_peer_list_remove(struct dp_pdev *pdev, 743 struct dp_vdev *vdev, 744 struct dp_neighbour_peer *peer) 745 { 746 } 747 748 static inline bool dp_monitor_is_chan_band_known(struct dp_pdev *pdev) 749 { 750 return false; 751 } 752 753 static inline enum reg_wifi_band 754 dp_monitor_get_chan_band(struct dp_pdev *pdev) 755 { 756 return 0; 757 } 758 759 static inline int 760 dp_monitor_get_chan_num(struct dp_pdev *pdev) 761 { 762 return 0; 763 } 764 765 static inline qdf_freq_t 766 dp_monitor_get_chan_freq(struct dp_pdev *pdev) 767 { 768 return 0; 769 } 770 771 static inline void dp_monitor_get_mpdu_status(struct dp_pdev *pdev, 772 struct dp_soc *soc, 773 uint8_t *rx_tlv_hdr) 774 { 775 } 776 777 static inline void dp_monitor_print_tx_stats(struct dp_pdev *pdev) 778 { 779 } 780 781 static inline 782 QDF_STATUS dp_monitor_mcopy_check_deliver(struct dp_pdev *pdev, 783 uint16_t peer_id, uint32_t ppdu_id, 784 uint8_t first_msdu) 785 { 786 return QDF_STATUS_SUCCESS; 787 } 788 789 static inline bool dp_monitor_is_enable_tx_sniffer(struct dp_pdev *pdev) 790 { 791 return false; 792 } 793 794 static inline struct dp_vdev* 795 dp_monitor_get_monitor_vdev_from_pdev(struct dp_pdev *pdev) 796 { 797 return NULL; 798 } 799 800 static inline QDF_STATUS dp_monitor_check_com_info_ppdu_id(struct dp_pdev *pdev, 801 void *rx_desc) 802 { 803 return QDF_STATUS_E_FAILURE; 804 } 805 806 static inline struct mon_rx_status* 807 dp_monitor_get_rx_status(struct dp_pdev *pdev) 808 { 809 return NULL; 810 } 811 812 static inline 813 void dp_monitor_pdev_config_scan_spcl_vap(struct dp_pdev *pdev, bool val) 814 { 815 } 816 817 static inline 818 void dp_monitor_pdev_reset_scan_spcl_vap_stats_enable(struct dp_pdev *pdev, 819 bool val) 820 { 821 } 822 823 static inline QDF_STATUS 824 dp_monitor_peer_tx_capture_get_stats(struct dp_soc *soc, struct dp_peer *peer, 825 struct cdp_peer_tx_capture_stats *stats) 826 { 827 return QDF_STATUS_E_FAILURE; 828 } 829 830 static inline QDF_STATUS 831 dp_monitor_pdev_tx_capture_get_stats(struct dp_soc *soc, struct dp_pdev *pdev, 832 struct cdp_pdev_tx_capture_stats *stats) 833 { 834 return QDF_STATUS_E_FAILURE; 835 } 836 837 #ifdef DP_POWER_SAVE 838 static inline 839 void dp_monitor_pktlog_reap_pending_frames(struct dp_pdev *pdev) 840 { 841 } 842 843 static inline 844 void dp_monitor_pktlog_start_reap_timer(struct dp_pdev *pdev) 845 { 846 } 847 #endif 848 849 static inline bool dp_monitor_is_configured(struct dp_pdev *pdev) 850 { 851 return false; 852 } 853 854 static inline void 855 dp_mon_rx_hdr_length_set(struct dp_soc *soc, uint32_t *msg_word, 856 struct htt_rx_ring_tlv_filter *tlv_filter) 857 { 858 } 859 860 static inline void dp_monitor_soc_init(struct dp_soc *soc) 861 { 862 } 863 864 static inline void dp_monitor_soc_deinit(struct dp_soc *soc) 865 { 866 } 867 868 static inline 869 QDF_STATUS dp_monitor_config_undecoded_metadata_capture(struct dp_pdev *pdev, 870 int val) 871 { 872 return QDF_STATUS_SUCCESS; 873 } 874 875 static inline QDF_STATUS 876 dp_monitor_config_undecoded_metadata_phyrx_error_mask(struct dp_pdev *pdev, 877 int mask1, int mask2) 878 { 879 return QDF_STATUS_SUCCESS; 880 } 881 882 static inline QDF_STATUS 883 dp_monitor_get_undecoded_metadata_phyrx_error_mask(struct dp_pdev *pdev, 884 int *mask, int *mask_cont) 885 { 886 return QDF_STATUS_SUCCESS; 887 } 888 889 static inline QDF_STATUS dp_monitor_soc_htt_srng_setup(struct dp_soc *soc) 890 { 891 return QDF_STATUS_E_FAILURE; 892 } 893 894 static inline bool dp_is_monitor_mode_using_poll(struct dp_soc *soc) 895 { 896 return false; 897 } 898 899 static inline 900 uint32_t dp_tx_mon_buf_refill(struct dp_intr *int_ctx) 901 { 902 return 0; 903 } 904 905 static inline uint32_t 906 dp_tx_mon_process(struct dp_soc *soc, struct dp_intr *int_ctx, 907 uint32_t mac_id, uint32_t quota) 908 { 909 return 0; 910 } 911 912 static inline uint32_t 913 dp_print_txmon_ring_stat_from_hal(struct dp_pdev *pdev) 914 { 915 return 0; 916 } 917 918 static inline 919 uint32_t dp_rx_mon_buf_refill(struct dp_intr *int_ctx) 920 { 921 return 0; 922 } 923 924 static inline bool dp_monitor_is_tx_cap_enabled(struct dp_peer *peer) 925 { 926 return 0; 927 } 928 929 static inline bool dp_monitor_is_rx_cap_enabled(struct dp_peer *peer) 930 { 931 return 0; 932 } 933 934 static inline void 935 dp_rx_mon_enable(struct dp_soc *soc, uint32_t *msg_word, 936 struct htt_rx_ring_tlv_filter *tlv_filter) 937 { 938 } 939 940 static inline void 941 dp_mon_rx_packet_length_set(struct dp_soc *soc, uint32_t *msg_word, 942 struct htt_rx_ring_tlv_filter *tlv_filter) 943 { 944 } 945 946 static inline void 947 dp_mon_rx_enable_mpdu_logging(struct dp_soc *soc, uint32_t *msg_word, 948 struct htt_rx_ring_tlv_filter *tlv_filter) 949 { 950 } 951 952 static inline void 953 dp_mon_rx_wmask_subscribe(struct dp_soc *soc, uint32_t *msg_word, 954 struct htt_rx_ring_tlv_filter *tlv_filter) 955 { 956 } 957 958 static inline void 959 dp_mon_rx_mac_filter_set(struct dp_soc *soc, uint32_t *msg_word, 960 struct htt_rx_ring_tlv_filter *tlv_filter) 961 { 962 } 963 964 static inline void 965 dp_mon_rx_enable_pkt_tlv_offset(struct dp_soc *soc, uint32_t *msg_word, 966 struct htt_rx_ring_tlv_filter *tlv_filter) 967 { 968 } 969 970 static inline void 971 dp_mon_rx_enable_fpmo(struct dp_soc *soc, uint32_t *msg_word, 972 struct htt_rx_ring_tlv_filter *tlv_filter) 973 { 974 } 975 976 #ifdef WLAN_CONFIG_TELEMETRY_AGENT 977 static inline 978 void dp_monitor_peer_telemetry_stats(struct dp_peer *peer, 979 struct cdp_peer_telemetry_stats *stats) 980 { 981 } 982 983 static inline 984 void dp_monitor_peer_deter_stats(struct dp_peer *peer, 985 struct cdp_peer_telemetry_stats *stats) 986 { 987 } 988 #endif /* WLAN_CONFIG_TELEMETRY_AGENT */ 989 #endif /* !WIFI_MONITOR_SUPPORT */ 990 991 /** 992 * cdp_soc_t_to_dp_soc() - typecast cdp_soc_t to 993 * dp soc handle 994 * @psoc: CDP psoc handle 995 * 996 * Return: struct dp_soc pointer 997 */ 998 static inline 999 struct dp_soc *cdp_soc_t_to_dp_soc(struct cdp_soc_t *psoc) 1000 { 1001 return (struct dp_soc *)psoc; 1002 } 1003 1004 #define DP_MAX_TIMER_EXEC_TIME_TICKS \ 1005 (QDF_LOG_TIMESTAMP_CYCLES_PER_10_US * 100 * 20) 1006 1007 /** 1008 * enum timer_yield_status - yield status code used in monitor mode timer. 1009 * @DP_TIMER_NO_YIELD: do not yield 1010 * @DP_TIMER_WORK_DONE: yield because work is done 1011 * @DP_TIMER_WORK_EXHAUST: yield because work quota is exhausted 1012 * @DP_TIMER_TIME_EXHAUST: yield due to time slot exhausted 1013 */ 1014 enum timer_yield_status { 1015 DP_TIMER_NO_YIELD, 1016 DP_TIMER_WORK_DONE, 1017 DP_TIMER_WORK_EXHAUST, 1018 DP_TIMER_TIME_EXHAUST, 1019 }; 1020 1021 #if DP_PRINT_ENABLE 1022 #include <qdf_types.h> /* qdf_vprint */ 1023 #include <cdp_txrx_handle.h> 1024 1025 enum { 1026 /* FATAL_ERR - print only irrecoverable error messages */ 1027 DP_PRINT_LEVEL_FATAL_ERR, 1028 1029 /* ERR - include non-fatal err messages */ 1030 DP_PRINT_LEVEL_ERR, 1031 1032 /* WARN - include warnings */ 1033 DP_PRINT_LEVEL_WARN, 1034 1035 /* INFO1 - include fundamental, infrequent events */ 1036 DP_PRINT_LEVEL_INFO1, 1037 1038 /* INFO2 - include non-fundamental but infrequent events */ 1039 DP_PRINT_LEVEL_INFO2, 1040 }; 1041 1042 #define dp_print(level, fmt, ...) do { \ 1043 if (level <= g_txrx_print_level) \ 1044 qdf_print(fmt, ## __VA_ARGS__); \ 1045 while (0) 1046 #define DP_PRINT(level, fmt, ...) do { \ 1047 dp_print(level, "DP: " fmt, ## __VA_ARGS__); \ 1048 while (0) 1049 #else 1050 #define DP_PRINT(level, fmt, ...) 1051 #endif /* DP_PRINT_ENABLE */ 1052 1053 #define DP_TRACE(LVL, fmt, args ...) \ 1054 QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_##LVL, \ 1055 fmt, ## args) 1056 1057 #ifdef WLAN_SYSFS_DP_STATS 1058 void DP_PRINT_STATS(const char *fmt, ...); 1059 #else /* WLAN_SYSFS_DP_STATS */ 1060 #ifdef DP_PRINT_NO_CONSOLE 1061 /* Stat prints should not go to console or kernel logs.*/ 1062 #define DP_PRINT_STATS(fmt, args ...)\ 1063 QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_INFO_HIGH, \ 1064 fmt, ## args) 1065 #else 1066 #define DP_PRINT_STATS(fmt, args ...)\ 1067 QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL,\ 1068 fmt, ## args) 1069 #endif 1070 #endif /* WLAN_SYSFS_DP_STATS */ 1071 1072 #define DP_STATS_INIT(_handle) \ 1073 qdf_mem_zero(&((_handle)->stats), sizeof((_handle)->stats)) 1074 1075 #define DP_TXRX_PEER_STATS_INIT(_handle, size) \ 1076 qdf_mem_zero(&((_handle)->stats[0]), size) 1077 1078 #define DP_STATS_CLR(_handle) \ 1079 qdf_mem_zero(&((_handle)->stats), sizeof((_handle)->stats)) 1080 1081 #define DP_TXRX_PEER_STATS_CLR(_handle, size) \ 1082 qdf_mem_zero(&((_handle)->stats[0]), size) 1083 1084 #ifndef DISABLE_DP_STATS 1085 #define DP_STATS_INC(_handle, _field, _delta) \ 1086 { \ 1087 if (likely(_handle)) \ 1088 _handle->stats._field += _delta; \ 1089 } 1090 1091 #define DP_PEER_LINK_STATS_INC(_handle, _field, _delta, _link) \ 1092 { \ 1093 if (likely(_handle)) \ 1094 _handle->stats[_link]._field += _delta; \ 1095 } 1096 1097 #define DP_PEER_STATS_FLAT_INC(_handle, _field, _delta) \ 1098 { \ 1099 if (likely(_handle)) \ 1100 _handle->_field += _delta; \ 1101 } 1102 1103 #define DP_STATS_INCC(_handle, _field, _delta, _cond) \ 1104 { \ 1105 if (_cond && likely(_handle)) \ 1106 _handle->stats._field += _delta; \ 1107 } 1108 1109 #define DP_PEER_LINK_STATS_INCC(_handle, _field, _delta, _cond, _link) \ 1110 { \ 1111 if (_cond && likely(_handle)) \ 1112 _handle->stats[_link]._field += _delta; \ 1113 } 1114 1115 #define DP_STATS_DEC(_handle, _field, _delta) \ 1116 { \ 1117 if (likely(_handle)) \ 1118 _handle->stats._field -= _delta; \ 1119 } 1120 1121 #define DP_PEER_STATS_FLAT_DEC(_handle, _field, _delta) \ 1122 { \ 1123 if (likely(_handle)) \ 1124 _handle->_field -= _delta; \ 1125 } 1126 1127 #define DP_STATS_UPD(_handle, _field, _delta) \ 1128 { \ 1129 if (likely(_handle)) \ 1130 _handle->stats._field = _delta; \ 1131 } 1132 1133 #define DP_PEER_LINK_STATS_UPD(_handle, _field, _delta, _link) \ 1134 { \ 1135 if (likely(_handle)) \ 1136 _handle->stats[_link]._field = _delta; \ 1137 } 1138 1139 #define DP_STATS_INC_PKT(_handle, _field, _count, _bytes) \ 1140 { \ 1141 DP_STATS_INC(_handle, _field.num, _count); \ 1142 DP_STATS_INC(_handle, _field.bytes, _bytes) \ 1143 } 1144 1145 #define DP_PEER_STATS_FLAT_INC_PKT(_handle, _field, _count, _bytes) \ 1146 { \ 1147 DP_PEER_STATS_FLAT_INC(_handle, _field.num, _count); \ 1148 DP_PEER_STATS_FLAT_INC(_handle, _field.bytes, _bytes) \ 1149 } 1150 1151 #define DP_STATS_INCC_PKT(_handle, _field, _count, _bytes, _cond) \ 1152 { \ 1153 DP_STATS_INCC(_handle, _field.num, _count, _cond); \ 1154 DP_STATS_INCC(_handle, _field.bytes, _bytes, _cond) \ 1155 } 1156 1157 #define DP_STATS_AGGR(_handle_a, _handle_b, _field) \ 1158 { \ 1159 _handle_a->stats._field += _handle_b->stats._field; \ 1160 } 1161 1162 #define DP_STATS_AGGR_PKT(_handle_a, _handle_b, _field) \ 1163 { \ 1164 DP_STATS_AGGR(_handle_a, _handle_b, _field.num); \ 1165 DP_STATS_AGGR(_handle_a, _handle_b, _field.bytes);\ 1166 } 1167 1168 #define DP_STATS_UPD_STRUCT(_handle_a, _handle_b, _field) \ 1169 { \ 1170 _handle_a->stats._field = _handle_b->stats._field; \ 1171 } 1172 1173 #else 1174 #define DP_STATS_INC(_handle, _field, _delta) 1175 #define DP_PEER_LINK_STATS_INC(_handle, _field, _delta, _link) 1176 #define DP_PEER_STATS_FLAT_INC(_handle, _field, _delta) 1177 #define DP_STATS_INCC(_handle, _field, _delta, _cond) 1178 #define DP_PEER_LINK_STATS_INCC(_handle, _field, _delta, _cond, _link) 1179 #define DP_STATS_DEC(_handle, _field, _delta) 1180 #define DP_PEER_STATS_FLAT_DEC(_handle, _field, _delta) 1181 #define DP_STATS_UPD(_handle, _field, _delta) 1182 #define DP_PEER_LINK_STATS_UPD(_handle, _field, _delta, _link) 1183 #define DP_STATS_INC_PKT(_handle, _field, _count, _bytes) 1184 #define DP_PEER_STATS_FLAT_INC_PKT(_handle, _field, _count, _bytes) 1185 #define DP_STATS_INCC_PKT(_handle, _field, _count, _bytes, _cond) 1186 #define DP_STATS_AGGR(_handle_a, _handle_b, _field) 1187 #define DP_STATS_AGGR_PKT(_handle_a, _handle_b, _field) 1188 #endif 1189 1190 #define DP_PEER_PER_PKT_STATS_INC(_handle, _field, _delta, _link) \ 1191 { \ 1192 DP_PEER_LINK_STATS_INC(_handle, per_pkt_stats._field, _delta, _link); \ 1193 } 1194 1195 #define DP_PEER_PER_PKT_STATS_INCC(_handle, _field, _delta, _cond, _link) \ 1196 { \ 1197 DP_PEER_LINK_STATS_INCC(_handle, per_pkt_stats._field, _delta, _cond, _link); \ 1198 } 1199 1200 #define DP_PEER_PER_PKT_STATS_INC_PKT(_handle, _field, _count, _bytes, _link) \ 1201 { \ 1202 DP_PEER_PER_PKT_STATS_INC(_handle, _field.num, _count, _link); \ 1203 DP_PEER_PER_PKT_STATS_INC(_handle, _field.bytes, _bytes, _link) \ 1204 } 1205 1206 #define DP_PEER_PER_PKT_STATS_INCC_PKT(_handle, _field, _count, _bytes, _cond, _link) \ 1207 { \ 1208 DP_PEER_PER_PKT_STATS_INCC(_handle, _field.num, _count, _cond, _link); \ 1209 DP_PEER_PER_PKT_STATS_INCC(_handle, _field.bytes, _bytes, _cond, _link) \ 1210 } 1211 1212 #define DP_PEER_PER_PKT_STATS_UPD(_handle, _field, _delta, _link) \ 1213 { \ 1214 DP_PEER_LINK_STATS_UPD(_handle, per_pkt_stats._field, _delta, _link); \ 1215 } 1216 1217 #ifndef QCA_ENHANCED_STATS_SUPPORT 1218 #define DP_PEER_EXTD_STATS_INC(_handle, _field, _delta, _link) \ 1219 { \ 1220 DP_PEER_LINK_STATS_INC(_handle, extd_stats._field, _delta, _link); \ 1221 } 1222 1223 #define DP_PEER_EXTD_STATS_INCC(_handle, _field, _delta, _cond, _link) \ 1224 { \ 1225 DP_PEER_LINK_STATS_INCC(_handle, extd_stats._field, _delta, _cond, _link); \ 1226 } 1227 1228 #define DP_PEER_EXTD_STATS_UPD(_handle, _field, _delta, _link) \ 1229 { \ 1230 DP_PEER_LINK_STATS_UPD(_handle, extd_stats._field, _delta, _link); \ 1231 } 1232 #endif 1233 1234 #if defined(QCA_VDEV_STATS_HW_OFFLOAD_SUPPORT) && \ 1235 defined(QCA_ENHANCED_STATS_SUPPORT) 1236 #define DP_PEER_TO_STACK_INCC_PKT(_handle, _count, _bytes, _cond) \ 1237 { \ 1238 if (_cond || !(_handle->hw_txrx_stats_en)) \ 1239 DP_PEER_STATS_FLAT_INC_PKT(_handle, to_stack, _count, _bytes); \ 1240 } 1241 1242 #define DP_PEER_TO_STACK_DECC(_handle, _count, _cond) \ 1243 { \ 1244 if (_cond || !(_handle->hw_txrx_stats_en)) \ 1245 DP_PEER_STATS_FLAT_DEC(_handle, to_stack.num, _count); \ 1246 } 1247 1248 #define DP_PEER_MC_INCC_PKT(_handle, _count, _bytes, _cond, _link) \ 1249 { \ 1250 if (_cond || !(_handle->hw_txrx_stats_en)) \ 1251 DP_PEER_PER_PKT_STATS_INC_PKT(_handle, rx.multicast, _count, _bytes, _link); \ 1252 } 1253 1254 #define DP_PEER_BC_INCC_PKT(_handle, _count, _bytes, _cond, _link) \ 1255 { \ 1256 if (_cond || !(_handle->hw_txrx_stats_en)) \ 1257 DP_PEER_PER_PKT_STATS_INC_PKT(_handle, rx.bcast, _count, _bytes, _link); \ 1258 } 1259 1260 #define DP_PEER_UC_INCC_PKT(_handle, _count, _bytes, _cond, _link) \ 1261 { \ 1262 if (_cond || !(_handle->hw_txrx_stats_en)) \ 1263 DP_PEER_PER_PKT_STATS_INC_PKT(_handle, rx.unicast, _count, _bytes, _link); \ 1264 } 1265 #elif defined(QCA_VDEV_STATS_HW_OFFLOAD_SUPPORT) 1266 #define DP_PEER_TO_STACK_INCC_PKT(_handle, _count, _bytes, _cond) \ 1267 { \ 1268 if (!(_handle->hw_txrx_stats_en)) \ 1269 DP_PEER_STATS_FLAT_INC_PKT(_handle, to_stack, _count, _bytes); \ 1270 } 1271 1272 #define DP_PEER_TO_STACK_DECC(_handle, _count, _cond) \ 1273 { \ 1274 if (!(_handle->hw_txrx_stats_en)) \ 1275 DP_PEER_STATS_FLAT_DEC(_handle, to_stack.num, _count); \ 1276 } 1277 1278 #define DP_PEER_MC_INCC_PKT(_handle, _count, _bytes, _cond, _link) \ 1279 { \ 1280 if (!(_handle->hw_txrx_stats_en)) \ 1281 DP_PEER_PER_PKT_STATS_INC_PKT(_handle, rx.multicast, _count, _bytes, _link); \ 1282 } 1283 1284 #define DP_PEER_BC_INCC_PKT(_handle, _count, _bytes, _cond, _link) \ 1285 { \ 1286 if (!(_handle->hw_txrx_stats_en)) \ 1287 DP_PEER_PER_PKT_STATS_INC_PKT(_handle, rx.bcast, _count, _bytes, _link); \ 1288 } 1289 1290 #define DP_PEER_UC_INCC_PKT(_handle, _count, _bytes, _cond, _link) \ 1291 { \ 1292 if (!(_handle->hw_txrx_stats_en)) \ 1293 DP_PEER_PER_PKT_STATS_INC_PKT(_handle, rx.unicast, _count, _bytes, _link); \ 1294 } 1295 #else 1296 #define DP_PEER_TO_STACK_INCC_PKT(_handle, _count, _bytes, _cond) \ 1297 DP_PEER_STATS_FLAT_INC_PKT(_handle, to_stack, _count, _bytes); 1298 1299 #define DP_PEER_TO_STACK_DECC(_handle, _count, _cond) \ 1300 DP_PEER_STATS_FLAT_DEC(_handle, to_stack.num, _count); 1301 1302 #define DP_PEER_MC_INCC_PKT(_handle, _count, _bytes, _cond, _link) \ 1303 DP_PEER_PER_PKT_STATS_INC_PKT(_handle, rx.multicast, _count, _bytes, _link); 1304 1305 #define DP_PEER_BC_INCC_PKT(_handle, _count, _bytes, _cond, _link) \ 1306 DP_PEER_PER_PKT_STATS_INC_PKT(_handle, rx.bcast, _count, _bytes, _link); 1307 1308 #define DP_PEER_UC_INCC_PKT(_handle, _count, _bytes, _cond, _link) \ 1309 DP_PEER_PER_PKT_STATS_INC_PKT(_handle, rx.unicast, _count, _bytes, _link); 1310 #endif 1311 1312 #ifdef ENABLE_DP_HIST_STATS 1313 #define DP_HIST_INIT() \ 1314 uint32_t num_of_packets[MAX_PDEV_CNT] = {0}; 1315 1316 #define DP_HIST_PACKET_COUNT_INC(_pdev_id) \ 1317 { \ 1318 ++num_of_packets[_pdev_id]; \ 1319 } 1320 1321 #define DP_TX_HISTOGRAM_UPDATE(_pdev, _p_cntrs) \ 1322 do { \ 1323 if (_p_cntrs == 1) { \ 1324 DP_STATS_INC(_pdev, \ 1325 tx_comp_histogram.pkts_1, 1); \ 1326 } else if (_p_cntrs > 1 && _p_cntrs <= 20) { \ 1327 DP_STATS_INC(_pdev, \ 1328 tx_comp_histogram.pkts_2_20, 1); \ 1329 } else if (_p_cntrs > 20 && _p_cntrs <= 40) { \ 1330 DP_STATS_INC(_pdev, \ 1331 tx_comp_histogram.pkts_21_40, 1); \ 1332 } else if (_p_cntrs > 40 && _p_cntrs <= 60) { \ 1333 DP_STATS_INC(_pdev, \ 1334 tx_comp_histogram.pkts_41_60, 1); \ 1335 } else if (_p_cntrs > 60 && _p_cntrs <= 80) { \ 1336 DP_STATS_INC(_pdev, \ 1337 tx_comp_histogram.pkts_61_80, 1); \ 1338 } else if (_p_cntrs > 80 && _p_cntrs <= 100) { \ 1339 DP_STATS_INC(_pdev, \ 1340 tx_comp_histogram.pkts_81_100, 1); \ 1341 } else if (_p_cntrs > 100 && _p_cntrs <= 200) { \ 1342 DP_STATS_INC(_pdev, \ 1343 tx_comp_histogram.pkts_101_200, 1); \ 1344 } else if (_p_cntrs > 200) { \ 1345 DP_STATS_INC(_pdev, \ 1346 tx_comp_histogram.pkts_201_plus, 1); \ 1347 } \ 1348 } while (0) 1349 1350 #define DP_RX_HISTOGRAM_UPDATE(_pdev, _p_cntrs) \ 1351 do { \ 1352 if (_p_cntrs == 1) { \ 1353 DP_STATS_INC(_pdev, \ 1354 rx_ind_histogram.pkts_1, 1); \ 1355 } else if (_p_cntrs > 1 && _p_cntrs <= 20) { \ 1356 DP_STATS_INC(_pdev, \ 1357 rx_ind_histogram.pkts_2_20, 1); \ 1358 } else if (_p_cntrs > 20 && _p_cntrs <= 40) { \ 1359 DP_STATS_INC(_pdev, \ 1360 rx_ind_histogram.pkts_21_40, 1); \ 1361 } else if (_p_cntrs > 40 && _p_cntrs <= 60) { \ 1362 DP_STATS_INC(_pdev, \ 1363 rx_ind_histogram.pkts_41_60, 1); \ 1364 } else if (_p_cntrs > 60 && _p_cntrs <= 80) { \ 1365 DP_STATS_INC(_pdev, \ 1366 rx_ind_histogram.pkts_61_80, 1); \ 1367 } else if (_p_cntrs > 80 && _p_cntrs <= 100) { \ 1368 DP_STATS_INC(_pdev, \ 1369 rx_ind_histogram.pkts_81_100, 1); \ 1370 } else if (_p_cntrs > 100 && _p_cntrs <= 200) { \ 1371 DP_STATS_INC(_pdev, \ 1372 rx_ind_histogram.pkts_101_200, 1); \ 1373 } else if (_p_cntrs > 200) { \ 1374 DP_STATS_INC(_pdev, \ 1375 rx_ind_histogram.pkts_201_plus, 1); \ 1376 } \ 1377 } while (0) 1378 1379 #define DP_TX_HIST_STATS_PER_PDEV() \ 1380 do { \ 1381 uint8_t hist_stats = 0; \ 1382 for (hist_stats = 0; hist_stats < soc->pdev_count; \ 1383 hist_stats++) { \ 1384 DP_TX_HISTOGRAM_UPDATE(soc->pdev_list[hist_stats], \ 1385 num_of_packets[hist_stats]); \ 1386 } \ 1387 } while (0) 1388 1389 1390 #define DP_RX_HIST_STATS_PER_PDEV() \ 1391 do { \ 1392 uint8_t hist_stats = 0; \ 1393 for (hist_stats = 0; hist_stats < soc->pdev_count; \ 1394 hist_stats++) { \ 1395 DP_RX_HISTOGRAM_UPDATE(soc->pdev_list[hist_stats], \ 1396 num_of_packets[hist_stats]); \ 1397 } \ 1398 } while (0) 1399 1400 #else 1401 #define DP_HIST_INIT() 1402 #define DP_HIST_PACKET_COUNT_INC(_pdev_id) 1403 #define DP_TX_HISTOGRAM_UPDATE(_pdev, _p_cntrs) 1404 #define DP_RX_HISTOGRAM_UPDATE(_pdev, _p_cntrs) 1405 #define DP_RX_HIST_STATS_PER_PDEV() 1406 #define DP_TX_HIST_STATS_PER_PDEV() 1407 #endif /* DISABLE_DP_STATS */ 1408 1409 #define FRAME_MASK_IPV4_ARP 1 1410 #define FRAME_MASK_IPV4_DHCP 2 1411 #define FRAME_MASK_IPV4_EAPOL 4 1412 #define FRAME_MASK_IPV6_DHCP 8 1413 1414 static inline int dp_log2_ceil(unsigned int value) 1415 { 1416 unsigned int tmp = value; 1417 int log2 = -1; 1418 1419 while (tmp) { 1420 log2++; 1421 tmp >>= 1; 1422 } 1423 if (1 << log2 != value) 1424 log2++; 1425 return log2; 1426 } 1427 1428 #ifdef QCA_SUPPORT_PEER_ISOLATION 1429 #define dp_get_peer_isolation(_peer) ((_peer)->isolation) 1430 1431 static inline void dp_set_peer_isolation(struct dp_txrx_peer *txrx_peer, 1432 bool val) 1433 { 1434 txrx_peer->isolation = val; 1435 } 1436 1437 #else 1438 #define dp_get_peer_isolation(_peer) (0) 1439 1440 static inline void dp_set_peer_isolation(struct dp_txrx_peer *peer, bool val) 1441 { 1442 } 1443 #endif /* QCA_SUPPORT_PEER_ISOLATION */ 1444 1445 bool dp_vdev_is_wds_ext_enabled(struct dp_vdev *vdev); 1446 1447 #ifdef QCA_SUPPORT_WDS_EXTENDED 1448 static inline void dp_wds_ext_peer_init(struct dp_txrx_peer *txrx_peer) 1449 { 1450 txrx_peer->wds_ext.init = 0; 1451 } 1452 #else 1453 static inline void dp_wds_ext_peer_init(struct dp_txrx_peer *txrx_peer) 1454 { 1455 } 1456 #endif /* QCA_SUPPORT_WDS_EXTENDED */ 1457 1458 #ifdef QCA_HOST2FW_RXBUF_RING 1459 static inline 1460 struct dp_srng *dp_get_rxdma_ring(struct dp_pdev *pdev, int lmac_id) 1461 { 1462 return &pdev->rx_mac_buf_ring[lmac_id]; 1463 } 1464 #else 1465 static inline 1466 struct dp_srng *dp_get_rxdma_ring(struct dp_pdev *pdev, int lmac_id) 1467 { 1468 return &pdev->soc->rx_refill_buf_ring[lmac_id]; 1469 } 1470 #endif 1471 1472 /* 1473 * The lmac ID for a particular channel band is fixed. 1474 * 2.4GHz band uses lmac_id = 1 1475 * 5GHz/6GHz band uses lmac_id=0 1476 */ 1477 #define DP_INVALID_LMAC_ID (-1) 1478 #define DP_MON_INVALID_LMAC_ID (-1) 1479 #define DP_MAC0_LMAC_ID 0 1480 #define DP_MAC1_LMAC_ID 1 1481 1482 #ifdef FEATURE_TSO_STATS 1483 /** 1484 * dp_init_tso_stats() - Clear tso stats 1485 * @pdev: pdev handle 1486 * 1487 * Return: None 1488 */ 1489 static inline 1490 void dp_init_tso_stats(struct dp_pdev *pdev) 1491 { 1492 if (pdev) { 1493 qdf_mem_zero(&((pdev)->stats.tso_stats), 1494 sizeof((pdev)->stats.tso_stats)); 1495 qdf_atomic_init(&pdev->tso_idx); 1496 } 1497 } 1498 1499 /** 1500 * dp_stats_tso_segment_histogram_update() - TSO Segment Histogram 1501 * @pdev: pdev handle 1502 * @_p_cntrs: number of tso segments for a tso packet 1503 * 1504 * Return: None 1505 */ 1506 void dp_stats_tso_segment_histogram_update(struct dp_pdev *pdev, 1507 uint8_t _p_cntrs); 1508 1509 /** 1510 * dp_tso_segment_update() - Collect tso segment information 1511 * @pdev: pdev handle 1512 * @stats_idx: tso packet number 1513 * @idx: tso segment number 1514 * @seg: tso segment 1515 * 1516 * Return: None 1517 */ 1518 void dp_tso_segment_update(struct dp_pdev *pdev, 1519 uint32_t stats_idx, 1520 uint8_t idx, 1521 struct qdf_tso_seg_t seg); 1522 1523 /** 1524 * dp_tso_packet_update() - TSO Packet information 1525 * @pdev: pdev handle 1526 * @stats_idx: tso packet number 1527 * @msdu: nbuf handle 1528 * @num_segs: tso segments 1529 * 1530 * Return: None 1531 */ 1532 void dp_tso_packet_update(struct dp_pdev *pdev, uint32_t stats_idx, 1533 qdf_nbuf_t msdu, uint16_t num_segs); 1534 1535 /** 1536 * dp_tso_segment_stats_update() - TSO Segment stats 1537 * @pdev: pdev handle 1538 * @stats_seg: tso segment list 1539 * @stats_idx: tso packet number 1540 * 1541 * Return: None 1542 */ 1543 void dp_tso_segment_stats_update(struct dp_pdev *pdev, 1544 struct qdf_tso_seg_elem_t *stats_seg, 1545 uint32_t stats_idx); 1546 1547 /** 1548 * dp_print_tso_stats() - dump tso statistics 1549 * @soc:soc handle 1550 * @level: verbosity level 1551 * 1552 * Return: None 1553 */ 1554 void dp_print_tso_stats(struct dp_soc *soc, 1555 enum qdf_stats_verbosity_level level); 1556 1557 /** 1558 * dp_txrx_clear_tso_stats() - clear tso stats 1559 * @soc: soc handle 1560 * 1561 * Return: None 1562 */ 1563 void dp_txrx_clear_tso_stats(struct dp_soc *soc); 1564 #else 1565 static inline 1566 void dp_init_tso_stats(struct dp_pdev *pdev) 1567 { 1568 } 1569 1570 static inline 1571 void dp_stats_tso_segment_histogram_update(struct dp_pdev *pdev, 1572 uint8_t _p_cntrs) 1573 { 1574 } 1575 1576 static inline 1577 void dp_tso_segment_update(struct dp_pdev *pdev, 1578 uint32_t stats_idx, 1579 uint32_t idx, 1580 struct qdf_tso_seg_t seg) 1581 { 1582 } 1583 1584 static inline 1585 void dp_tso_packet_update(struct dp_pdev *pdev, uint32_t stats_idx, 1586 qdf_nbuf_t msdu, uint16_t num_segs) 1587 { 1588 } 1589 1590 static inline 1591 void dp_tso_segment_stats_update(struct dp_pdev *pdev, 1592 struct qdf_tso_seg_elem_t *stats_seg, 1593 uint32_t stats_idx) 1594 { 1595 } 1596 1597 static inline 1598 void dp_print_tso_stats(struct dp_soc *soc, 1599 enum qdf_stats_verbosity_level level) 1600 { 1601 } 1602 1603 static inline 1604 void dp_txrx_clear_tso_stats(struct dp_soc *soc) 1605 { 1606 } 1607 #endif /* FEATURE_TSO_STATS */ 1608 1609 /** 1610 * dp_txrx_get_peer_per_pkt_stats_param() - Get peer per pkt stats param 1611 * @peer: DP peer handle 1612 * @type: Requested stats type 1613 * @buf: Buffer to hold the value 1614 * 1615 * Return: status success/failure 1616 */ 1617 QDF_STATUS dp_txrx_get_peer_per_pkt_stats_param(struct dp_peer *peer, 1618 enum cdp_peer_stats_type type, 1619 cdp_peer_stats_param_t *buf); 1620 1621 /** 1622 * dp_txrx_get_peer_extd_stats_param() - Get peer extd stats param 1623 * @peer: DP peer handle 1624 * @type: Requested stats type 1625 * @buf: Buffer to hold the value 1626 * 1627 * Return: status success/failure 1628 */ 1629 QDF_STATUS dp_txrx_get_peer_extd_stats_param(struct dp_peer *peer, 1630 enum cdp_peer_stats_type type, 1631 cdp_peer_stats_param_t *buf); 1632 1633 #define DP_HTT_T2H_HP_PIPE 5 1634 /** 1635 * dp_update_pdev_stats(): Update the pdev stats 1636 * @tgtobj: pdev handle 1637 * @srcobj: vdev stats structure 1638 * 1639 * Update the pdev stats from the specified vdev stats 1640 * 1641 * Return: None 1642 */ 1643 void dp_update_pdev_stats(struct dp_pdev *tgtobj, 1644 struct cdp_vdev_stats *srcobj); 1645 1646 /** 1647 * dp_update_vdev_ingress_stats(): Update the vdev ingress stats 1648 * @tgtobj: vdev handle 1649 * 1650 * Update the vdev ingress stats 1651 * 1652 * Return: None 1653 */ 1654 void dp_update_vdev_ingress_stats(struct dp_vdev *tgtobj); 1655 1656 /** 1657 * dp_update_vdev_rate_stats() - Update the vdev rate stats 1658 * @tgtobj: tgt buffer for vdev stats 1659 * @srcobj: srcobj vdev stats 1660 * 1661 * Return: None 1662 */ 1663 void dp_update_vdev_rate_stats(struct cdp_vdev_stats *tgtobj, 1664 struct cdp_vdev_stats *srcobj); 1665 1666 /** 1667 * dp_update_pdev_ingress_stats(): Update the pdev ingress stats 1668 * @tgtobj: pdev handle 1669 * @srcobj: vdev stats structure 1670 * 1671 * Update the pdev ingress stats from the specified vdev stats 1672 * 1673 * Return: None 1674 */ 1675 void dp_update_pdev_ingress_stats(struct dp_pdev *tgtobj, 1676 struct dp_vdev *srcobj); 1677 1678 /** 1679 * dp_update_vdev_stats(): Update the vdev stats 1680 * @soc: soc handle 1681 * @srcobj: DP_PEER object 1682 * @arg: point to vdev stats structure 1683 * 1684 * Update the vdev stats from the specified peer stats 1685 * 1686 * Return: None 1687 */ 1688 void dp_update_vdev_stats(struct dp_soc *soc, 1689 struct dp_peer *srcobj, 1690 void *arg); 1691 1692 /** 1693 * dp_update_vdev_stats_on_peer_unmap() - Update the vdev stats on peer unmap 1694 * @vdev: DP_VDEV handle 1695 * @peer: DP_PEER handle 1696 * 1697 * Return: None 1698 */ 1699 void dp_update_vdev_stats_on_peer_unmap(struct dp_vdev *vdev, 1700 struct dp_peer *peer); 1701 1702 #ifdef IPA_OFFLOAD 1703 #define DP_IPA_UPDATE_RX_STATS(__tgtobj, __srcobj) \ 1704 { \ 1705 DP_STATS_AGGR_PKT(__tgtobj, __srcobj, rx.rx_total); \ 1706 } 1707 1708 #define DP_IPA_UPDATE_PER_PKT_RX_STATS(__tgtobj, __srcobj) \ 1709 { \ 1710 (__tgtobj)->rx.rx_total.num += (__srcobj)->rx.rx_total.num; \ 1711 (__tgtobj)->rx.rx_total.bytes += (__srcobj)->rx.rx_total.bytes; \ 1712 } 1713 #else 1714 #define DP_IPA_UPDATE_PER_PKT_RX_STATS(tgtobj, srcobj) \ 1715 1716 #define DP_IPA_UPDATE_RX_STATS(tgtobj, srcobj) 1717 #endif 1718 1719 #define DP_UPDATE_STATS(_tgtobj, _srcobj) \ 1720 do { \ 1721 uint8_t i; \ 1722 uint8_t pream_type; \ 1723 for (pream_type = 0; pream_type < DOT11_MAX; pream_type++) { \ 1724 for (i = 0; i < MAX_MCS; i++) { \ 1725 DP_STATS_AGGR(_tgtobj, _srcobj, \ 1726 tx.pkt_type[pream_type].mcs_count[i]); \ 1727 DP_STATS_AGGR(_tgtobj, _srcobj, \ 1728 rx.pkt_type[pream_type].mcs_count[i]); \ 1729 } \ 1730 } \ 1731 \ 1732 for (i = 0; i < MAX_BW; i++) { \ 1733 DP_STATS_AGGR(_tgtobj, _srcobj, tx.bw[i]); \ 1734 DP_STATS_AGGR(_tgtobj, _srcobj, rx.bw[i]); \ 1735 } \ 1736 \ 1737 for (i = 0; i < SS_COUNT; i++) { \ 1738 DP_STATS_AGGR(_tgtobj, _srcobj, rx.nss[i]); \ 1739 DP_STATS_AGGR(_tgtobj, _srcobj, tx.nss[i]); \ 1740 } \ 1741 for (i = 0; i < WME_AC_MAX; i++) { \ 1742 DP_STATS_AGGR(_tgtobj, _srcobj, tx.wme_ac_type[i]); \ 1743 DP_STATS_AGGR(_tgtobj, _srcobj, rx.wme_ac_type[i]); \ 1744 DP_STATS_AGGR(_tgtobj, _srcobj, \ 1745 tx.wme_ac_type_bytes[i]); \ 1746 DP_STATS_AGGR(_tgtobj, _srcobj, \ 1747 rx.wme_ac_type_bytes[i]); \ 1748 DP_STATS_AGGR(_tgtobj, _srcobj, tx.excess_retries_per_ac[i]); \ 1749 \ 1750 } \ 1751 \ 1752 for (i = 0; i < MAX_GI; i++) { \ 1753 DP_STATS_AGGR(_tgtobj, _srcobj, tx.sgi_count[i]); \ 1754 DP_STATS_AGGR(_tgtobj, _srcobj, rx.sgi_count[i]); \ 1755 } \ 1756 \ 1757 for (i = 0; i < MAX_RECEPTION_TYPES; i++) \ 1758 DP_STATS_AGGR(_tgtobj, _srcobj, rx.reception_type[i]); \ 1759 \ 1760 if (!wlan_cfg_get_vdev_stats_hw_offload_config(soc->wlan_cfg_ctx)) { \ 1761 DP_STATS_AGGR_PKT(_tgtobj, _srcobj, tx.comp_pkt); \ 1762 DP_STATS_AGGR(_tgtobj, _srcobj, tx.tx_failed); \ 1763 } \ 1764 DP_STATS_AGGR_PKT(_tgtobj, _srcobj, tx.ucast); \ 1765 DP_STATS_AGGR_PKT(_tgtobj, _srcobj, tx.mcast); \ 1766 DP_STATS_AGGR_PKT(_tgtobj, _srcobj, tx.bcast); \ 1767 DP_STATS_AGGR_PKT(_tgtobj, _srcobj, tx.tx_success); \ 1768 DP_STATS_AGGR_PKT(_tgtobj, _srcobj, tx.nawds_mcast); \ 1769 DP_STATS_AGGR(_tgtobj, _srcobj, tx.nawds_mcast_drop); \ 1770 DP_STATS_AGGR(_tgtobj, _srcobj, tx.ofdma); \ 1771 DP_STATS_AGGR(_tgtobj, _srcobj, tx.stbc); \ 1772 DP_STATS_AGGR(_tgtobj, _srcobj, tx.ldpc); \ 1773 DP_STATS_AGGR(_tgtobj, _srcobj, tx.retries); \ 1774 DP_STATS_AGGR(_tgtobj, _srcobj, tx.non_amsdu_cnt); \ 1775 DP_STATS_AGGR(_tgtobj, _srcobj, tx.amsdu_cnt); \ 1776 DP_STATS_AGGR(_tgtobj, _srcobj, tx.non_ampdu_cnt); \ 1777 DP_STATS_AGGR(_tgtobj, _srcobj, tx.ampdu_cnt); \ 1778 DP_STATS_AGGR_PKT(_tgtobj, _srcobj, tx.dropped.fw_rem); \ 1779 DP_STATS_AGGR(_tgtobj, _srcobj, tx.dropped.fw_rem_tx); \ 1780 DP_STATS_AGGR(_tgtobj, _srcobj, tx.dropped.fw_rem_notx); \ 1781 DP_STATS_AGGR(_tgtobj, _srcobj, tx.dropped.fw_reason1); \ 1782 DP_STATS_AGGR(_tgtobj, _srcobj, tx.dropped.fw_reason2); \ 1783 DP_STATS_AGGR(_tgtobj, _srcobj, tx.dropped.fw_reason3); \ 1784 DP_STATS_AGGR(_tgtobj, _srcobj, tx.dropped.fw_rem_queue_disable); \ 1785 DP_STATS_AGGR(_tgtobj, _srcobj, tx.dropped.fw_rem_no_match); \ 1786 DP_STATS_AGGR(_tgtobj, _srcobj, tx.dropped.drop_threshold); \ 1787 DP_STATS_AGGR(_tgtobj, _srcobj, tx.dropped.drop_link_desc_na); \ 1788 DP_STATS_AGGR(_tgtobj, _srcobj, tx.dropped.invalid_drop); \ 1789 DP_STATS_AGGR(_tgtobj, _srcobj, tx.dropped.mcast_vdev_drop); \ 1790 DP_STATS_AGGR(_tgtobj, _srcobj, tx.dropped.invalid_rr); \ 1791 DP_STATS_AGGR(_tgtobj, _srcobj, tx.dropped.age_out); \ 1792 DP_STATS_AGGR_PKT(_tgtobj, _srcobj, tx.tx_ucast_total); \ 1793 DP_STATS_AGGR_PKT(_tgtobj, _srcobj, tx.tx_ucast_success); \ 1794 \ 1795 DP_STATS_AGGR(_tgtobj, _srcobj, rx.err.mic_err); \ 1796 DP_STATS_AGGR(_tgtobj, _srcobj, rx.err.decrypt_err); \ 1797 DP_STATS_AGGR(_tgtobj, _srcobj, rx.err.fcserr); \ 1798 DP_STATS_AGGR(_tgtobj, _srcobj, rx.err.pn_err); \ 1799 DP_STATS_AGGR(_tgtobj, _srcobj, rx.err.oor_err); \ 1800 DP_STATS_AGGR(_tgtobj, _srcobj, rx.err.jump_2k_err); \ 1801 DP_STATS_AGGR(_tgtobj, _srcobj, rx.err.rxdma_wifi_parse_err); \ 1802 if (_srcobj->stats.rx.snr != 0) \ 1803 DP_STATS_UPD_STRUCT(_tgtobj, _srcobj, rx.snr); \ 1804 DP_STATS_UPD_STRUCT(_tgtobj, _srcobj, rx.rx_rate); \ 1805 DP_STATS_AGGR(_tgtobj, _srcobj, rx.non_ampdu_cnt); \ 1806 DP_STATS_AGGR(_tgtobj, _srcobj, rx.ampdu_cnt); \ 1807 DP_STATS_AGGR(_tgtobj, _srcobj, rx.non_amsdu_cnt); \ 1808 DP_STATS_AGGR(_tgtobj, _srcobj, rx.amsdu_cnt); \ 1809 DP_STATS_AGGR(_tgtobj, _srcobj, rx.nawds_mcast_drop); \ 1810 DP_STATS_AGGR_PKT(_tgtobj, _srcobj, rx.to_stack); \ 1811 \ 1812 for (i = 0; i < CDP_MAX_RX_RINGS; i++) \ 1813 DP_STATS_AGGR_PKT(_tgtobj, _srcobj, rx.rcvd_reo[i]); \ 1814 \ 1815 for (i = 0; i < CDP_MAX_LMACS; i++) \ 1816 DP_STATS_AGGR_PKT(_tgtobj, _srcobj, rx.rx_lmac[i]); \ 1817 \ 1818 _srcobj->stats.rx.unicast.num = \ 1819 _srcobj->stats.rx.to_stack.num - \ 1820 _srcobj->stats.rx.multicast.num; \ 1821 _srcobj->stats.rx.unicast.bytes = \ 1822 _srcobj->stats.rx.to_stack.bytes - \ 1823 _srcobj->stats.rx.multicast.bytes; \ 1824 DP_STATS_AGGR_PKT(_tgtobj, _srcobj, rx.unicast); \ 1825 DP_STATS_AGGR_PKT(_tgtobj, _srcobj, rx.multicast); \ 1826 DP_STATS_AGGR_PKT(_tgtobj, _srcobj, rx.bcast); \ 1827 DP_STATS_AGGR_PKT(_tgtobj, _srcobj, rx.raw); \ 1828 DP_STATS_AGGR_PKT(_tgtobj, _srcobj, rx.intra_bss.pkts); \ 1829 DP_STATS_AGGR_PKT(_tgtobj, _srcobj, rx.intra_bss.fail); \ 1830 DP_STATS_AGGR_PKT(_tgtobj, _srcobj, rx.mec_drop); \ 1831 \ 1832 _tgtobj->stats.tx.last_ack_rssi = \ 1833 _srcobj->stats.tx.last_ack_rssi; \ 1834 DP_STATS_AGGR(_tgtobj, _srcobj, rx.multipass_rx_pkt_drop); \ 1835 DP_STATS_AGGR(_tgtobj, _srcobj, rx.peer_unauth_rx_pkt_drop); \ 1836 DP_STATS_AGGR(_tgtobj, _srcobj, rx.policy_check_drop); \ 1837 DP_IPA_UPDATE_RX_STATS(_tgtobj, _srcobj); \ 1838 } while (0) 1839 1840 #ifdef VDEV_PEER_PROTOCOL_COUNT 1841 #define DP_UPDATE_PROTOCOL_COUNT_STATS(_tgtobj, _srcobj) \ 1842 { \ 1843 uint8_t j; \ 1844 for (j = 0; j < CDP_TRACE_MAX; j++) { \ 1845 _tgtobj->tx.protocol_trace_cnt[j].egress_cnt += \ 1846 _srcobj->tx.protocol_trace_cnt[j].egress_cnt; \ 1847 _tgtobj->tx.protocol_trace_cnt[j].ingress_cnt += \ 1848 _srcobj->tx.protocol_trace_cnt[j].ingress_cnt; \ 1849 _tgtobj->rx.protocol_trace_cnt[j].egress_cnt += \ 1850 _srcobj->rx.protocol_trace_cnt[j].egress_cnt; \ 1851 _tgtobj->rx.protocol_trace_cnt[j].ingress_cnt += \ 1852 _srcobj->rx.protocol_trace_cnt[j].ingress_cnt; \ 1853 } \ 1854 } 1855 #else 1856 #define DP_UPDATE_PROTOCOL_COUNT_STATS(_tgtobj, _srcobj) 1857 #endif 1858 1859 #ifdef WLAN_FEATURE_11BE 1860 #define DP_UPDATE_11BE_STATS(_tgtobj, _srcobj) \ 1861 do { \ 1862 uint8_t i, mu_type; \ 1863 for (i = 0; i < MAX_MCS; i++) { \ 1864 _tgtobj->tx.su_be_ppdu_cnt.mcs_count[i] += \ 1865 _srcobj->tx.su_be_ppdu_cnt.mcs_count[i]; \ 1866 _tgtobj->rx.su_be_ppdu_cnt.mcs_count[i] += \ 1867 _srcobj->rx.su_be_ppdu_cnt.mcs_count[i]; \ 1868 } \ 1869 for (mu_type = 0; mu_type < TXRX_TYPE_MU_MAX; mu_type++) { \ 1870 for (i = 0; i < MAX_MCS; i++) { \ 1871 _tgtobj->tx.mu_be_ppdu_cnt[mu_type].mcs_count[i] += \ 1872 _srcobj->tx.mu_be_ppdu_cnt[mu_type].mcs_count[i]; \ 1873 _tgtobj->rx.mu_be_ppdu_cnt[mu_type].mcs_count[i] += \ 1874 _srcobj->rx.mu_be_ppdu_cnt[mu_type].mcs_count[i]; \ 1875 } \ 1876 } \ 1877 for (i = 0; i < MAX_PUNCTURED_MODE; i++) { \ 1878 _tgtobj->tx.punc_bw[i] += _srcobj->tx.punc_bw[i]; \ 1879 _tgtobj->rx.punc_bw[i] += _srcobj->rx.punc_bw[i]; \ 1880 } \ 1881 } while (0) 1882 #else 1883 #define DP_UPDATE_11BE_STATS(_tgtobj, _srcobj) 1884 #endif 1885 1886 #define DP_UPDATE_PER_PKT_STATS(_tgtobj, _srcobj) \ 1887 do { \ 1888 uint8_t i; \ 1889 _tgtobj->tx.ucast.num += _srcobj->tx.ucast.num; \ 1890 _tgtobj->tx.ucast.bytes += _srcobj->tx.ucast.bytes; \ 1891 _tgtobj->tx.mcast.num += _srcobj->tx.mcast.num; \ 1892 _tgtobj->tx.mcast.bytes += _srcobj->tx.mcast.bytes; \ 1893 _tgtobj->tx.bcast.num += _srcobj->tx.bcast.num; \ 1894 _tgtobj->tx.bcast.bytes += _srcobj->tx.bcast.bytes; \ 1895 _tgtobj->tx.nawds_mcast.num += _srcobj->tx.nawds_mcast.num; \ 1896 _tgtobj->tx.nawds_mcast.bytes += \ 1897 _srcobj->tx.nawds_mcast.bytes; \ 1898 _tgtobj->tx.tx_success.num += _srcobj->tx.tx_success.num; \ 1899 _tgtobj->tx.tx_success.bytes += _srcobj->tx.tx_success.bytes; \ 1900 _tgtobj->tx.nawds_mcast_drop += _srcobj->tx.nawds_mcast_drop; \ 1901 _tgtobj->tx.ofdma += _srcobj->tx.ofdma; \ 1902 _tgtobj->tx.non_amsdu_cnt += _srcobj->tx.non_amsdu_cnt; \ 1903 _tgtobj->tx.amsdu_cnt += _srcobj->tx.amsdu_cnt; \ 1904 _tgtobj->tx.dropped.fw_rem.num += \ 1905 _srcobj->tx.dropped.fw_rem.num; \ 1906 _tgtobj->tx.dropped.fw_rem.bytes += \ 1907 _srcobj->tx.dropped.fw_rem.bytes; \ 1908 _tgtobj->tx.dropped.fw_rem_notx += \ 1909 _srcobj->tx.dropped.fw_rem_notx; \ 1910 _tgtobj->tx.dropped.fw_rem_tx += \ 1911 _srcobj->tx.dropped.fw_rem_tx; \ 1912 _tgtobj->tx.dropped.age_out += _srcobj->tx.dropped.age_out; \ 1913 _tgtobj->tx.dropped.fw_reason1 += \ 1914 _srcobj->tx.dropped.fw_reason1; \ 1915 _tgtobj->tx.dropped.fw_reason2 += \ 1916 _srcobj->tx.dropped.fw_reason2; \ 1917 _tgtobj->tx.dropped.fw_reason3 += \ 1918 _srcobj->tx.dropped.fw_reason3; \ 1919 _tgtobj->tx.dropped.fw_rem_queue_disable += \ 1920 _srcobj->tx.dropped.fw_rem_queue_disable; \ 1921 _tgtobj->tx.dropped.fw_rem_no_match += \ 1922 _srcobj->tx.dropped.fw_rem_no_match; \ 1923 _tgtobj->tx.dropped.drop_threshold += \ 1924 _srcobj->tx.dropped.drop_threshold; \ 1925 _tgtobj->tx.dropped.drop_link_desc_na += \ 1926 _srcobj->tx.dropped.drop_link_desc_na; \ 1927 _tgtobj->tx.dropped.invalid_drop += \ 1928 _srcobj->tx.dropped.invalid_drop; \ 1929 _tgtobj->tx.dropped.mcast_vdev_drop += \ 1930 _srcobj->tx.dropped.mcast_vdev_drop; \ 1931 _tgtobj->tx.dropped.invalid_rr += \ 1932 _srcobj->tx.dropped.invalid_rr; \ 1933 _tgtobj->tx.failed_retry_count += \ 1934 _srcobj->tx.failed_retry_count; \ 1935 _tgtobj->tx.retry_count += _srcobj->tx.retry_count; \ 1936 _tgtobj->tx.multiple_retry_count += \ 1937 _srcobj->tx.multiple_retry_count; \ 1938 _tgtobj->tx.tx_success_twt.num += \ 1939 _srcobj->tx.tx_success_twt.num; \ 1940 _tgtobj->tx.tx_success_twt.bytes += \ 1941 _srcobj->tx.tx_success_twt.bytes; \ 1942 _tgtobj->tx.last_tx_ts = _srcobj->tx.last_tx_ts; \ 1943 _tgtobj->tx.release_src_not_tqm += \ 1944 _srcobj->tx.release_src_not_tqm; \ 1945 for (i = 0; i < QDF_PROTO_SUBTYPE_MAX; i++) { \ 1946 _tgtobj->tx.no_ack_count[i] += \ 1947 _srcobj->tx.no_ack_count[i];\ 1948 } \ 1949 \ 1950 _tgtobj->rx.multicast.num += _srcobj->rx.multicast.num; \ 1951 _tgtobj->rx.multicast.bytes += _srcobj->rx.multicast.bytes; \ 1952 _tgtobj->rx.bcast.num += _srcobj->rx.bcast.num; \ 1953 _tgtobj->rx.bcast.bytes += _srcobj->rx.bcast.bytes; \ 1954 _tgtobj->rx.unicast.num += _srcobj->rx.unicast.num; \ 1955 _tgtobj->rx.unicast.bytes += _srcobj->rx.unicast.bytes; \ 1956 _tgtobj->rx.raw.num += _srcobj->rx.raw.num; \ 1957 _tgtobj->rx.raw.bytes += _srcobj->rx.raw.bytes; \ 1958 _tgtobj->rx.nawds_mcast_drop += _srcobj->rx.nawds_mcast_drop; \ 1959 _tgtobj->rx.mcast_3addr_drop += _srcobj->rx.mcast_3addr_drop; \ 1960 _tgtobj->rx.mec_drop.num += _srcobj->rx.mec_drop.num; \ 1961 _tgtobj->rx.mec_drop.bytes += _srcobj->rx.mec_drop.bytes; \ 1962 _tgtobj->rx.intra_bss.pkts.num += \ 1963 _srcobj->rx.intra_bss.pkts.num; \ 1964 _tgtobj->rx.intra_bss.pkts.bytes += \ 1965 _srcobj->rx.intra_bss.pkts.bytes; \ 1966 _tgtobj->rx.intra_bss.fail.num += \ 1967 _srcobj->rx.intra_bss.fail.num; \ 1968 _tgtobj->rx.intra_bss.fail.bytes += \ 1969 _srcobj->rx.intra_bss.fail.bytes; \ 1970 _tgtobj->rx.intra_bss.mdns_no_fwd += \ 1971 _srcobj->rx.intra_bss.mdns_no_fwd; \ 1972 _tgtobj->rx.err.mic_err += _srcobj->rx.err.mic_err; \ 1973 _tgtobj->rx.err.decrypt_err += _srcobj->rx.err.decrypt_err; \ 1974 _tgtobj->rx.err.fcserr += _srcobj->rx.err.fcserr; \ 1975 _tgtobj->rx.err.pn_err += _srcobj->rx.err.pn_err; \ 1976 _tgtobj->rx.err.oor_err += _srcobj->rx.err.oor_err; \ 1977 _tgtobj->rx.err.jump_2k_err += _srcobj->rx.err.jump_2k_err; \ 1978 _tgtobj->rx.err.rxdma_wifi_parse_err += \ 1979 _srcobj->rx.err.rxdma_wifi_parse_err; \ 1980 _tgtobj->rx.non_amsdu_cnt += _srcobj->rx.non_amsdu_cnt; \ 1981 _tgtobj->rx.amsdu_cnt += _srcobj->rx.amsdu_cnt; \ 1982 _tgtobj->rx.rx_retries += _srcobj->rx.rx_retries; \ 1983 _tgtobj->rx.multipass_rx_pkt_drop += \ 1984 _srcobj->rx.multipass_rx_pkt_drop; \ 1985 _tgtobj->rx.peer_unauth_rx_pkt_drop += \ 1986 _srcobj->rx.peer_unauth_rx_pkt_drop; \ 1987 _tgtobj->rx.policy_check_drop += \ 1988 _srcobj->rx.policy_check_drop; \ 1989 _tgtobj->rx.to_stack_twt.num += _srcobj->rx.to_stack_twt.num; \ 1990 _tgtobj->rx.to_stack_twt.bytes += \ 1991 _srcobj->rx.to_stack_twt.bytes; \ 1992 _tgtobj->rx.last_rx_ts = _srcobj->rx.last_rx_ts; \ 1993 for (i = 0; i < CDP_MAX_RX_RINGS; i++) { \ 1994 _tgtobj->rx.rcvd_reo[i].num += \ 1995 _srcobj->rx.rcvd_reo[i].num; \ 1996 _tgtobj->rx.rcvd_reo[i].bytes += \ 1997 _srcobj->rx.rcvd_reo[i].bytes; \ 1998 } \ 1999 for (i = 0; i < CDP_MAX_LMACS; i++) { \ 2000 _tgtobj->rx.rx_lmac[i].num += \ 2001 _srcobj->rx.rx_lmac[i].num; \ 2002 _tgtobj->rx.rx_lmac[i].bytes += \ 2003 _srcobj->rx.rx_lmac[i].bytes; \ 2004 } \ 2005 DP_IPA_UPDATE_PER_PKT_RX_STATS(_tgtobj, _srcobj); \ 2006 DP_UPDATE_PROTOCOL_COUNT_STATS(_tgtobj, _srcobj); \ 2007 } while (0) 2008 2009 #define DP_UPDATE_EXTD_STATS(_tgtobj, _srcobj) \ 2010 do { \ 2011 uint8_t i, pream_type, mu_type; \ 2012 _tgtobj->tx.stbc += _srcobj->tx.stbc; \ 2013 _tgtobj->tx.ldpc += _srcobj->tx.ldpc; \ 2014 _tgtobj->tx.retries += _srcobj->tx.retries; \ 2015 _tgtobj->tx.ampdu_cnt += _srcobj->tx.ampdu_cnt; \ 2016 _tgtobj->tx.non_ampdu_cnt += _srcobj->tx.non_ampdu_cnt; \ 2017 _tgtobj->tx.num_ppdu_cookie_valid += \ 2018 _srcobj->tx.num_ppdu_cookie_valid; \ 2019 _tgtobj->tx.tx_ppdus += _srcobj->tx.tx_ppdus; \ 2020 _tgtobj->tx.tx_mpdus_success += _srcobj->tx.tx_mpdus_success; \ 2021 _tgtobj->tx.tx_mpdus_tried += _srcobj->tx.tx_mpdus_tried; \ 2022 _tgtobj->tx.tx_rate = _srcobj->tx.tx_rate; \ 2023 _tgtobj->tx.last_tx_rate = _srcobj->tx.last_tx_rate; \ 2024 _tgtobj->tx.last_tx_rate_mcs = _srcobj->tx.last_tx_rate_mcs; \ 2025 _tgtobj->tx.mcast_last_tx_rate = \ 2026 _srcobj->tx.mcast_last_tx_rate; \ 2027 _tgtobj->tx.mcast_last_tx_rate_mcs = \ 2028 _srcobj->tx.mcast_last_tx_rate_mcs; \ 2029 _tgtobj->tx.rnd_avg_tx_rate = _srcobj->tx.rnd_avg_tx_rate; \ 2030 _tgtobj->tx.avg_tx_rate = _srcobj->tx.avg_tx_rate; \ 2031 _tgtobj->tx.tx_ratecode = _srcobj->tx.tx_ratecode; \ 2032 _tgtobj->tx.pream_punct_cnt += _srcobj->tx.pream_punct_cnt; \ 2033 _tgtobj->tx.ru_start = _srcobj->tx.ru_start; \ 2034 _tgtobj->tx.ru_tones = _srcobj->tx.ru_tones; \ 2035 _tgtobj->tx.last_ack_rssi = _srcobj->tx.last_ack_rssi; \ 2036 _tgtobj->tx.nss_info = _srcobj->tx.nss_info; \ 2037 _tgtobj->tx.mcs_info = _srcobj->tx.mcs_info; \ 2038 _tgtobj->tx.bw_info = _srcobj->tx.bw_info; \ 2039 _tgtobj->tx.gi_info = _srcobj->tx.gi_info; \ 2040 _tgtobj->tx.preamble_info = _srcobj->tx.preamble_info; \ 2041 _tgtobj->tx.retries_mpdu += _srcobj->tx.retries_mpdu; \ 2042 _tgtobj->tx.mpdu_success_with_retries += \ 2043 _srcobj->tx.mpdu_success_with_retries; \ 2044 _tgtobj->tx.rts_success = _srcobj->tx.rts_success; \ 2045 _tgtobj->tx.rts_failure = _srcobj->tx.rts_failure; \ 2046 _tgtobj->tx.bar_cnt = _srcobj->tx.bar_cnt; \ 2047 _tgtobj->tx.ndpa_cnt = _srcobj->tx.ndpa_cnt; \ 2048 for (pream_type = 0; pream_type < DOT11_MAX; pream_type++) { \ 2049 for (i = 0; i < MAX_MCS; i++) \ 2050 _tgtobj->tx.pkt_type[pream_type].mcs_count[i] += \ 2051 _srcobj->tx.pkt_type[pream_type].mcs_count[i]; \ 2052 } \ 2053 for (i = 0; i < WME_AC_MAX; i++) { \ 2054 _tgtobj->tx.wme_ac_type[i] += _srcobj->tx.wme_ac_type[i]; \ 2055 _tgtobj->tx.wme_ac_type_bytes[i] += \ 2056 _srcobj->tx.wme_ac_type_bytes[i]; \ 2057 _tgtobj->tx.excess_retries_per_ac[i] += \ 2058 _srcobj->tx.excess_retries_per_ac[i]; \ 2059 } \ 2060 for (i = 0; i < MAX_GI; i++) { \ 2061 _tgtobj->tx.sgi_count[i] += _srcobj->tx.sgi_count[i]; \ 2062 } \ 2063 for (i = 0; i < SS_COUNT; i++) { \ 2064 _tgtobj->tx.nss[i] += _srcobj->tx.nss[i]; \ 2065 } \ 2066 for (i = 0; i < MAX_BW; i++) { \ 2067 _tgtobj->tx.bw[i] += _srcobj->tx.bw[i]; \ 2068 } \ 2069 for (i = 0; i < MAX_RU_LOCATIONS; i++) { \ 2070 _tgtobj->tx.ru_loc[i].num_msdu += \ 2071 _srcobj->tx.ru_loc[i].num_msdu; \ 2072 _tgtobj->tx.ru_loc[i].num_mpdu += \ 2073 _srcobj->tx.ru_loc[i].num_mpdu; \ 2074 _tgtobj->tx.ru_loc[i].mpdu_tried += \ 2075 _srcobj->tx.ru_loc[i].mpdu_tried; \ 2076 } \ 2077 for (i = 0; i < MAX_TRANSMIT_TYPES; i++) { \ 2078 _tgtobj->tx.transmit_type[i].num_msdu += \ 2079 _srcobj->tx.transmit_type[i].num_msdu; \ 2080 _tgtobj->tx.transmit_type[i].num_mpdu += \ 2081 _srcobj->tx.transmit_type[i].num_mpdu; \ 2082 _tgtobj->tx.transmit_type[i].mpdu_tried += \ 2083 _srcobj->tx.transmit_type[i].mpdu_tried; \ 2084 } \ 2085 for (i = 0; i < MAX_MU_GROUP_ID; i++) { \ 2086 _tgtobj->tx.mu_group_id[i] = _srcobj->tx.mu_group_id[i]; \ 2087 } \ 2088 _tgtobj->tx.tx_ucast_total.num += \ 2089 _srcobj->tx.tx_ucast_total.num;\ 2090 _tgtobj->tx.tx_ucast_total.bytes += \ 2091 _srcobj->tx.tx_ucast_total.bytes;\ 2092 _tgtobj->tx.tx_ucast_success.num += \ 2093 _srcobj->tx.tx_ucast_success.num; \ 2094 _tgtobj->tx.tx_ucast_success.bytes += \ 2095 _srcobj->tx.tx_ucast_success.bytes; \ 2096 \ 2097 for (i = 0; i < CDP_RSSI_CHAIN_LEN; i++) \ 2098 _tgtobj->tx.rssi_chain[i] = _srcobj->tx.rssi_chain[i]; \ 2099 _tgtobj->rx.mpdu_cnt_fcs_ok += _srcobj->rx.mpdu_cnt_fcs_ok; \ 2100 _tgtobj->rx.mpdu_cnt_fcs_err += _srcobj->rx.mpdu_cnt_fcs_err; \ 2101 _tgtobj->rx.non_ampdu_cnt += _srcobj->rx.non_ampdu_cnt; \ 2102 _tgtobj->rx.ampdu_cnt += _srcobj->rx.ampdu_cnt; \ 2103 _tgtobj->rx.rx_mpdus += _srcobj->rx.rx_mpdus; \ 2104 _tgtobj->rx.rx_ppdus += _srcobj->rx.rx_ppdus; \ 2105 _tgtobj->rx.rx_rate = _srcobj->rx.rx_rate; \ 2106 _tgtobj->rx.last_rx_rate = _srcobj->rx.last_rx_rate; \ 2107 _tgtobj->rx.rnd_avg_rx_rate = _srcobj->rx.rnd_avg_rx_rate; \ 2108 _tgtobj->rx.avg_rx_rate = _srcobj->rx.avg_rx_rate; \ 2109 _tgtobj->rx.rx_ratecode = _srcobj->rx.rx_ratecode; \ 2110 _tgtobj->rx.avg_snr = _srcobj->rx.avg_snr; \ 2111 _tgtobj->rx.rx_snr_measured_time = \ 2112 _srcobj->rx.rx_snr_measured_time; \ 2113 _tgtobj->rx.snr = _srcobj->rx.snr; \ 2114 _tgtobj->rx.last_snr = _srcobj->rx.last_snr; \ 2115 _tgtobj->rx.nss_info = _srcobj->rx.nss_info; \ 2116 _tgtobj->rx.mcs_info = _srcobj->rx.mcs_info; \ 2117 _tgtobj->rx.bw_info = _srcobj->rx.bw_info; \ 2118 _tgtobj->rx.gi_info = _srcobj->rx.gi_info; \ 2119 _tgtobj->rx.preamble_info = _srcobj->rx.preamble_info; \ 2120 _tgtobj->rx.mpdu_retry_cnt += _srcobj->rx.mpdu_retry_cnt; \ 2121 _tgtobj->rx.bar_cnt = _srcobj->rx.bar_cnt; \ 2122 _tgtobj->rx.ndpa_cnt = _srcobj->rx.ndpa_cnt; \ 2123 for (pream_type = 0; pream_type < DOT11_MAX; pream_type++) { \ 2124 for (i = 0; i < MAX_MCS; i++) { \ 2125 _tgtobj->rx.pkt_type[pream_type].mcs_count[i] += \ 2126 _srcobj->rx.pkt_type[pream_type].mcs_count[i]; \ 2127 } \ 2128 } \ 2129 for (i = 0; i < WME_AC_MAX; i++) { \ 2130 _tgtobj->rx.wme_ac_type[i] += _srcobj->rx.wme_ac_type[i]; \ 2131 _tgtobj->rx.wme_ac_type_bytes[i] += \ 2132 _srcobj->rx.wme_ac_type_bytes[i]; \ 2133 } \ 2134 for (i = 0; i < MAX_MCS; i++) { \ 2135 _tgtobj->rx.su_ax_ppdu_cnt.mcs_count[i] += \ 2136 _srcobj->rx.su_ax_ppdu_cnt.mcs_count[i]; \ 2137 _tgtobj->rx.rx_mpdu_cnt[i] += _srcobj->rx.rx_mpdu_cnt[i]; \ 2138 } \ 2139 for (mu_type = 0 ; mu_type < TXRX_TYPE_MU_MAX; mu_type++) { \ 2140 _tgtobj->rx.rx_mu[mu_type].mpdu_cnt_fcs_ok += \ 2141 _srcobj->rx.rx_mu[mu_type].mpdu_cnt_fcs_ok; \ 2142 _tgtobj->rx.rx_mu[mu_type].mpdu_cnt_fcs_err += \ 2143 _srcobj->rx.rx_mu[mu_type].mpdu_cnt_fcs_err; \ 2144 for (i = 0; i < SS_COUNT; i++) \ 2145 _tgtobj->rx.rx_mu[mu_type].ppdu_nss[i] += \ 2146 _srcobj->rx.rx_mu[mu_type].ppdu_nss[i]; \ 2147 for (i = 0; i < MAX_MCS; i++) \ 2148 _tgtobj->rx.rx_mu[mu_type].ppdu.mcs_count[i] += \ 2149 _srcobj->rx.rx_mu[mu_type].ppdu.mcs_count[i]; \ 2150 } \ 2151 for (i = 0; i < MAX_RECEPTION_TYPES; i++) { \ 2152 _tgtobj->rx.reception_type[i] += \ 2153 _srcobj->rx.reception_type[i]; \ 2154 _tgtobj->rx.ppdu_cnt[i] += _srcobj->rx.ppdu_cnt[i]; \ 2155 } \ 2156 for (i = 0; i < MAX_GI; i++) { \ 2157 _tgtobj->rx.sgi_count[i] += _srcobj->rx.sgi_count[i]; \ 2158 } \ 2159 for (i = 0; i < SS_COUNT; i++) { \ 2160 _tgtobj->rx.nss[i] += _srcobj->rx.nss[i]; \ 2161 _tgtobj->rx.ppdu_nss[i] += _srcobj->rx.ppdu_nss[i]; \ 2162 } \ 2163 for (i = 0; i < MAX_BW; i++) { \ 2164 _tgtobj->rx.bw[i] += _srcobj->rx.bw[i]; \ 2165 } \ 2166 DP_UPDATE_11BE_STATS(_tgtobj, _srcobj); \ 2167 } while (0) 2168 2169 /** 2170 * dp_peer_find_attach() - Allocates memory for peer objects 2171 * @soc: SoC handle 2172 * 2173 * Return: QDF_STATUS 2174 */ 2175 QDF_STATUS dp_peer_find_attach(struct dp_soc *soc); 2176 2177 /** 2178 * dp_peer_find_detach() - Frees memory for peer objects 2179 * @soc: SoC handle 2180 * 2181 * Return: none 2182 */ 2183 void dp_peer_find_detach(struct dp_soc *soc); 2184 2185 /** 2186 * dp_peer_find_hash_add() - add peer to peer_hash_table 2187 * @soc: soc handle 2188 * @peer: peer handle 2189 * 2190 * Return: none 2191 */ 2192 void dp_peer_find_hash_add(struct dp_soc *soc, struct dp_peer *peer); 2193 2194 /** 2195 * dp_peer_find_hash_remove() - remove peer from peer_hash_table 2196 * @soc: soc handle 2197 * @peer: peer handle 2198 * 2199 * Return: none 2200 */ 2201 void dp_peer_find_hash_remove(struct dp_soc *soc, struct dp_peer *peer); 2202 2203 /* unused?? */ 2204 void dp_peer_find_hash_erase(struct dp_soc *soc); 2205 2206 /** 2207 * dp_peer_vdev_list_add() - add peer into vdev's peer list 2208 * @soc: soc handle 2209 * @vdev: vdev handle 2210 * @peer: peer handle 2211 * 2212 * Return: none 2213 */ 2214 void dp_peer_vdev_list_add(struct dp_soc *soc, struct dp_vdev *vdev, 2215 struct dp_peer *peer); 2216 2217 /** 2218 * dp_peer_vdev_list_remove() - remove peer from vdev's peer list 2219 * @soc: SoC handle 2220 * @vdev: VDEV handle 2221 * @peer: peer handle 2222 * 2223 * Return: none 2224 */ 2225 void dp_peer_vdev_list_remove(struct dp_soc *soc, struct dp_vdev *vdev, 2226 struct dp_peer *peer); 2227 2228 /** 2229 * dp_peer_find_id_to_obj_add() - Add peer into peer_id table 2230 * @soc: SoC handle 2231 * @peer: peer handle 2232 * @peer_id: peer_id 2233 * 2234 * Return: None 2235 */ 2236 void dp_peer_find_id_to_obj_add(struct dp_soc *soc, 2237 struct dp_peer *peer, 2238 uint16_t peer_id); 2239 2240 /** 2241 * dp_txrx_peer_attach_add() - Attach txrx_peer and add it to peer_id table 2242 * @soc: SoC handle 2243 * @peer: peer handle 2244 * @txrx_peer: txrx peer handle 2245 * 2246 * Return: None 2247 */ 2248 void dp_txrx_peer_attach_add(struct dp_soc *soc, 2249 struct dp_peer *peer, 2250 struct dp_txrx_peer *txrx_peer); 2251 2252 /** 2253 * dp_peer_find_id_to_obj_remove() - remove peer from peer_id table 2254 * @soc: SoC handle 2255 * @peer_id: peer_id 2256 * 2257 * Return: None 2258 */ 2259 void dp_peer_find_id_to_obj_remove(struct dp_soc *soc, 2260 uint16_t peer_id); 2261 2262 /** 2263 * dp_vdev_unref_delete() - check and process vdev delete 2264 * @soc: DP specific soc pointer 2265 * @vdev: DP specific vdev pointer 2266 * @mod_id: module id 2267 * 2268 */ 2269 void dp_vdev_unref_delete(struct dp_soc *soc, struct dp_vdev *vdev, 2270 enum dp_mod_id mod_id); 2271 2272 /** 2273 * dp_peer_ppdu_delayed_ba_cleanup() - free ppdu allocated in peer 2274 * @peer: Datapath peer 2275 * 2276 * Return: void 2277 */ 2278 void dp_peer_ppdu_delayed_ba_cleanup(struct dp_peer *peer); 2279 2280 /** 2281 * dp_peer_rx_init() - Initialize receive TID state 2282 * @pdev: Datapath pdev 2283 * @peer: Datapath peer 2284 * 2285 */ 2286 void dp_peer_rx_init(struct dp_pdev *pdev, struct dp_peer *peer); 2287 2288 /** 2289 * dp_peer_cleanup() - Cleanup peer information 2290 * @vdev: Datapath vdev 2291 * @peer: Datapath peer 2292 * 2293 */ 2294 void dp_peer_cleanup(struct dp_vdev *vdev, struct dp_peer *peer); 2295 2296 /** 2297 * dp_peer_rx_cleanup() - Cleanup receive TID state 2298 * @vdev: Datapath vdev 2299 * @peer: Datapath peer 2300 * 2301 */ 2302 void dp_peer_rx_cleanup(struct dp_vdev *vdev, struct dp_peer *peer); 2303 2304 #ifdef DP_PEER_EXTENDED_API 2305 /** 2306 * dp_register_peer() - Register peer into physical device 2307 * @soc_hdl: data path soc handle 2308 * @pdev_id: device instance id 2309 * @sta_desc: peer description 2310 * 2311 * Register peer into physical device 2312 * 2313 * Return: QDF_STATUS_SUCCESS registration success 2314 * QDF_STATUS_E_FAULT peer not found 2315 */ 2316 QDF_STATUS dp_register_peer(struct cdp_soc_t *soc_hdl, uint8_t pdev_id, 2317 struct ol_txrx_desc_type *sta_desc); 2318 2319 /** 2320 * dp_clear_peer() - remove peer from physical device 2321 * @soc_hdl: data path soc handle 2322 * @pdev_id: device instance id 2323 * @peer_addr: peer mac address 2324 * 2325 * remove peer from physical device 2326 * 2327 * Return: QDF_STATUS_SUCCESS registration success 2328 * QDF_STATUS_E_FAULT peer not found 2329 */ 2330 QDF_STATUS dp_clear_peer(struct cdp_soc_t *soc_hdl, uint8_t pdev_id, 2331 struct qdf_mac_addr peer_addr); 2332 2333 /** 2334 * dp_find_peer_exist_on_vdev - find if peer exists on the given vdev 2335 * @soc_hdl: datapath soc handle 2336 * @vdev_id: vdev instance id 2337 * @peer_addr: peer mac address 2338 * 2339 * Return: true or false 2340 */ 2341 bool dp_find_peer_exist_on_vdev(struct cdp_soc_t *soc_hdl, uint8_t vdev_id, 2342 uint8_t *peer_addr); 2343 2344 /** 2345 * dp_find_peer_exist_on_other_vdev - find if peer exists 2346 * on other than the given vdev 2347 * @soc_hdl: datapath soc handle 2348 * @vdev_id: vdev instance id 2349 * @peer_addr: peer mac address 2350 * @max_bssid: max number of bssids 2351 * 2352 * Return: true or false 2353 */ 2354 bool dp_find_peer_exist_on_other_vdev(struct cdp_soc_t *soc_hdl, 2355 uint8_t vdev_id, uint8_t *peer_addr, 2356 uint16_t max_bssid); 2357 2358 /** 2359 * dp_peer_state_update() - update peer local state 2360 * @soc: datapath soc handle 2361 * @peer_mac: peer mac address 2362 * @state: new peer local state 2363 * 2364 * update peer local state 2365 * 2366 * Return: QDF_STATUS_SUCCESS registration success 2367 */ 2368 QDF_STATUS dp_peer_state_update(struct cdp_soc_t *soc, uint8_t *peer_mac, 2369 enum ol_txrx_peer_state state); 2370 2371 /** 2372 * dp_get_vdevid() - Get virtual interface id which peer registered 2373 * @soc_hdl: datapath soc handle 2374 * @peer_mac: peer mac address 2375 * @vdev_id: virtual interface id which peer registered 2376 * 2377 * Get virtual interface id which peer registered 2378 * 2379 * Return: QDF_STATUS_SUCCESS registration success 2380 */ 2381 QDF_STATUS dp_get_vdevid(struct cdp_soc_t *soc_hdl, uint8_t *peer_mac, 2382 uint8_t *vdev_id); 2383 2384 struct cdp_vdev *dp_get_vdev_by_peer_addr(struct cdp_pdev *pdev_handle, 2385 struct qdf_mac_addr peer_addr); 2386 2387 /** 2388 * dp_get_vdev_for_peer() - Get virtual interface instance which peer belongs 2389 * @peer: peer instance 2390 * 2391 * Get virtual interface instance which peer belongs 2392 * 2393 * Return: virtual interface instance pointer 2394 * NULL in case cannot find 2395 */ 2396 struct cdp_vdev *dp_get_vdev_for_peer(void *peer); 2397 2398 /** 2399 * dp_peer_get_peer_mac_addr() - Get peer mac address 2400 * @peer: peer instance 2401 * 2402 * Get peer mac address 2403 * 2404 * Return: peer mac address pointer 2405 * NULL in case cannot find 2406 */ 2407 uint8_t *dp_peer_get_peer_mac_addr(void *peer); 2408 2409 /** 2410 * dp_get_peer_state() - Get local peer state 2411 * @soc: datapath soc handle 2412 * @vdev_id: vdev id 2413 * @peer_mac: peer mac addr 2414 * 2415 * Get local peer state 2416 * 2417 * Return: peer status 2418 */ 2419 int dp_get_peer_state(struct cdp_soc_t *soc, uint8_t vdev_id, 2420 uint8_t *peer_mac); 2421 2422 /** 2423 * dp_local_peer_id_pool_init() - local peer id pool alloc for physical device 2424 * @pdev: data path device instance 2425 * 2426 * local peer id pool alloc for physical device 2427 * 2428 * Return: none 2429 */ 2430 void dp_local_peer_id_pool_init(struct dp_pdev *pdev); 2431 2432 /** 2433 * dp_local_peer_id_alloc() - allocate local peer id 2434 * @pdev: data path device instance 2435 * @peer: new peer instance 2436 * 2437 * allocate local peer id 2438 * 2439 * Return: none 2440 */ 2441 void dp_local_peer_id_alloc(struct dp_pdev *pdev, struct dp_peer *peer); 2442 2443 /** 2444 * dp_local_peer_id_free() - remove local peer id 2445 * @pdev: data path device instance 2446 * @peer: peer instance should be removed 2447 * 2448 * remove local peer id 2449 * 2450 * Return: none 2451 */ 2452 void dp_local_peer_id_free(struct dp_pdev *pdev, struct dp_peer *peer); 2453 2454 /** 2455 * dp_set_peer_as_tdls_peer() - set tdls peer flag to peer 2456 * @soc_hdl: datapath soc handle 2457 * @vdev_id: vdev_id 2458 * @peer_mac: peer mac addr 2459 * @val: tdls peer flag 2460 * 2461 * Return: none 2462 */ 2463 void dp_set_peer_as_tdls_peer(struct cdp_soc_t *soc_hdl, uint8_t vdev_id, 2464 uint8_t *peer_mac, bool val); 2465 #else 2466 static inline 2467 QDF_STATUS dp_get_vdevid(struct cdp_soc_t *soc_hdl, uint8_t *peer_mac, 2468 uint8_t *vdev_id) 2469 { 2470 return QDF_STATUS_E_NOSUPPORT; 2471 } 2472 2473 static inline void dp_local_peer_id_pool_init(struct dp_pdev *pdev) 2474 { 2475 } 2476 2477 static inline 2478 void dp_local_peer_id_alloc(struct dp_pdev *pdev, struct dp_peer *peer) 2479 { 2480 } 2481 2482 static inline 2483 void dp_local_peer_id_free(struct dp_pdev *pdev, struct dp_peer *peer) 2484 { 2485 } 2486 2487 static inline 2488 void dp_set_peer_as_tdls_peer(struct cdp_soc_t *soc_hdl, uint8_t vdev_id, 2489 uint8_t *peer_mac, bool val) 2490 { 2491 } 2492 #endif 2493 2494 /** 2495 * dp_find_peer_exist - find peer if already exists 2496 * @soc_hdl: datapath soc handle 2497 * @pdev_id: physical device instance id 2498 * @peer_addr: peer mac address 2499 * 2500 * Return: true or false 2501 */ 2502 bool dp_find_peer_exist(struct cdp_soc_t *soc_hdl, uint8_t pdev_id, 2503 uint8_t *peer_addr); 2504 2505 /** 2506 * dp_addba_resp_tx_completion_wifi3() - Update Rx Tid State 2507 * 2508 * @cdp_soc: Datapath soc handle 2509 * @peer_mac: Datapath peer mac address 2510 * @vdev_id: id of atapath vdev 2511 * @tid: TID number 2512 * @status: tx completion status 2513 * Return: 0 on success, error code on failure 2514 */ 2515 int dp_addba_resp_tx_completion_wifi3(struct cdp_soc_t *cdp_soc, 2516 uint8_t *peer_mac, uint16_t vdev_id, 2517 uint8_t tid, 2518 int status); 2519 2520 /** 2521 * dp_addba_requestprocess_wifi3() - Process ADDBA request from peer 2522 * @cdp_soc: Datapath soc handle 2523 * @peer_mac: Datapath peer mac address 2524 * @vdev_id: id of atapath vdev 2525 * @dialogtoken: dialogtoken from ADDBA frame 2526 * @tid: TID number 2527 * @batimeout: BA timeout 2528 * @buffersize: BA window size 2529 * @startseqnum: Start seq. number received in BA sequence control 2530 * 2531 * Return: 0 on success, error code on failure 2532 */ 2533 int dp_addba_requestprocess_wifi3(struct cdp_soc_t *cdp_soc, 2534 uint8_t *peer_mac, uint16_t vdev_id, 2535 uint8_t dialogtoken, uint16_t tid, 2536 uint16_t batimeout, 2537 uint16_t buffersize, 2538 uint16_t startseqnum); 2539 2540 /** 2541 * dp_addba_responsesetup_wifi3() - Process ADDBA request from peer 2542 * @cdp_soc: Datapath soc handle 2543 * @peer_mac: Datapath peer mac address 2544 * @vdev_id: id of atapath vdev 2545 * @tid: TID number 2546 * @dialogtoken: output dialogtoken 2547 * @statuscode: output dialogtoken 2548 * @buffersize: Output BA window size 2549 * @batimeout: Output BA timeout 2550 */ 2551 QDF_STATUS dp_addba_responsesetup_wifi3(struct cdp_soc_t *cdp_soc, 2552 uint8_t *peer_mac, uint16_t vdev_id, 2553 uint8_t tid, uint8_t *dialogtoken, 2554 uint16_t *statuscode, 2555 uint16_t *buffersize, 2556 uint16_t *batimeout); 2557 2558 /** 2559 * dp_set_addba_response() - Set a user defined ADDBA response status code 2560 * @cdp_soc: Datapath soc handle 2561 * @peer_mac: Datapath peer mac address 2562 * @vdev_id: id of atapath vdev 2563 * @tid: TID number 2564 * @statuscode: response status code to be set 2565 */ 2566 QDF_STATUS dp_set_addba_response(struct cdp_soc_t *cdp_soc, 2567 uint8_t *peer_mac, 2568 uint16_t vdev_id, uint8_t tid, 2569 uint16_t statuscode); 2570 2571 /** 2572 * dp_delba_process_wifi3() - Process DELBA from peer 2573 * @cdp_soc: Datapath soc handle 2574 * @peer_mac: Datapath peer mac address 2575 * @vdev_id: id of atapath vdev 2576 * @tid: TID number 2577 * @reasoncode: Reason code received in DELBA frame 2578 * 2579 * Return: 0 on success, error code on failure 2580 */ 2581 int dp_delba_process_wifi3(struct cdp_soc_t *cdp_soc, uint8_t *peer_mac, 2582 uint16_t vdev_id, int tid, 2583 uint16_t reasoncode); 2584 2585 /** 2586 * dp_rx_tid_update_ba_win_size() - Update the DP tid BA window size 2587 * @cdp_soc: soc handle 2588 * @peer_mac: mac address of peer handle 2589 * @vdev_id: id of vdev handle 2590 * @tid: tid 2591 * @buffersize: BA window size 2592 * 2593 * Return: success/failure of tid update 2594 */ 2595 QDF_STATUS dp_rx_tid_update_ba_win_size(struct cdp_soc_t *cdp_soc, 2596 uint8_t *peer_mac, uint16_t vdev_id, 2597 uint8_t tid, uint16_t buffersize); 2598 2599 /** 2600 * dp_delba_tx_completion_wifi3() - Handle delba tx completion 2601 * @cdp_soc: soc handle 2602 * @peer_mac: peer mac address 2603 * @vdev_id: id of the vdev handle 2604 * @tid: Tid number 2605 * @status: Tx completion status 2606 * 2607 * Indicate status of delba Tx to DP for stats update and retry 2608 * delba if tx failed. 2609 * 2610 * Return: 0 on success, error code on failure 2611 */ 2612 int dp_delba_tx_completion_wifi3(struct cdp_soc_t *cdp_soc, uint8_t *peer_mac, 2613 uint16_t vdev_id, uint8_t tid, 2614 int status); 2615 2616 /** 2617 * dp_rx_tid_setup_wifi3() - Setup receive TID state 2618 * @peer: Datapath peer handle 2619 * @tid: TID 2620 * @ba_window_size: BlockAck window size 2621 * @start_seq: Starting sequence number 2622 * 2623 * Return: QDF_STATUS code 2624 */ 2625 QDF_STATUS dp_rx_tid_setup_wifi3(struct dp_peer *peer, int tid, 2626 uint32_t ba_window_size, 2627 uint32_t start_seq); 2628 2629 #ifdef DP_UMAC_HW_RESET_SUPPORT 2630 /** 2631 * dp_pause_reo_send_cmd() - Pause Reo send commands. 2632 * @soc: dp soc 2633 * 2634 * Return: none 2635 */ 2636 void dp_pause_reo_send_cmd(struct dp_soc *soc); 2637 2638 /** 2639 * dp_resume_reo_send_cmd() - Resume Reo send commands. 2640 * @soc: dp soc 2641 * 2642 * Return: none 2643 */ 2644 void dp_resume_reo_send_cmd(struct dp_soc *soc); 2645 2646 /** 2647 * dp_cleanup_reo_cmd_module - Clean up the reo cmd module 2648 * @soc: DP SoC handle 2649 * 2650 * Return: none 2651 */ 2652 void dp_cleanup_reo_cmd_module(struct dp_soc *soc); 2653 2654 /** 2655 * dp_reo_desc_freelist_destroy() - Flush REO descriptors from deferred freelist 2656 * @soc: DP SOC handle 2657 * 2658 * Return: none 2659 */ 2660 void dp_reo_desc_freelist_destroy(struct dp_soc *soc); 2661 2662 /** 2663 * dp_reset_rx_reo_tid_queue() - Reset the reo tid queues 2664 * @soc: dp soc 2665 * @hw_qdesc_vaddr: starting address of the tid queues 2666 * @size: size of the memory pointed to by hw_qdesc_vaddr 2667 * 2668 * Return: none 2669 */ 2670 void dp_reset_rx_reo_tid_queue(struct dp_soc *soc, void *hw_qdesc_vaddr, 2671 uint32_t size); 2672 2673 #if defined(WLAN_FEATURE_11BE_MLO) && defined(WLAN_MLO_MULTI_CHIP) 2674 /** 2675 * dp_umac_reset_complete_umac_recovery() - Complete Umac reset session 2676 * @soc: dp soc handle 2677 * 2678 * Return: void 2679 */ 2680 void dp_umac_reset_complete_umac_recovery(struct dp_soc *soc); 2681 2682 /** 2683 * dp_umac_reset_initiate_umac_recovery() - Initiate Umac reset session 2684 * @soc: dp soc handle 2685 * @is_target_recovery: Flag to indicate if it is triggered for target recovery 2686 * 2687 * Return: void 2688 */ 2689 void dp_umac_reset_initiate_umac_recovery(struct dp_soc *soc, 2690 bool is_target_recovery); 2691 2692 /** 2693 * dp_umac_reset_handle_action_cb() - Function to call action callback 2694 * @soc: dp soc handle 2695 * @umac_reset_ctx: Umac reset context 2696 * @action: Action to call the callback for 2697 * 2698 * Return: QDF_STATUS status 2699 */ 2700 QDF_STATUS dp_umac_reset_handle_action_cb(struct dp_soc *soc, 2701 struct dp_soc_umac_reset_ctx *umac_reset_ctx, 2702 enum umac_reset_action action); 2703 2704 /** 2705 * dp_umac_reset_post_tx_cmd() - Iterate partner socs and post Tx command 2706 * @umac_reset_ctx: UMAC reset context 2707 * @tx_cmd: Tx command to be posted 2708 * 2709 * Return: QDF status of operation 2710 */ 2711 QDF_STATUS 2712 dp_umac_reset_post_tx_cmd(struct dp_soc_umac_reset_ctx *umac_reset_ctx, 2713 enum umac_reset_tx_cmd tx_cmd); 2714 2715 /** 2716 * dp_umac_reset_initiator_check() - Check if soc is the Umac reset initiator 2717 * @soc: dp soc handle 2718 * 2719 * Return: true if the soc is initiator or false otherwise 2720 */ 2721 bool dp_umac_reset_initiator_check(struct dp_soc *soc); 2722 2723 /** 2724 * dp_umac_reset_target_recovery_check() - Check if this is for target recovery 2725 * @soc: dp soc handle 2726 * 2727 * Return: true if the session is for target recovery or false otherwise 2728 */ 2729 bool dp_umac_reset_target_recovery_check(struct dp_soc *soc); 2730 2731 /** 2732 * dp_umac_reset_is_soc_ignored() - Check if this soc is to be ignored 2733 * @soc: dp soc handle 2734 * 2735 * Return: true if the soc is ignored or false otherwise 2736 */ 2737 bool dp_umac_reset_is_soc_ignored(struct dp_soc *soc); 2738 2739 /** 2740 * dp_mlo_umac_reset_stats_print() - API to print MLO umac reset stats 2741 * @soc: dp soc handle 2742 * 2743 * Return: QDF_STATUS 2744 */ 2745 QDF_STATUS dp_mlo_umac_reset_stats_print(struct dp_soc *soc); 2746 #else 2747 static inline 2748 QDF_STATUS dp_mlo_umac_reset_stats_print(struct dp_soc *soc) 2749 { 2750 return QDF_STATUS_SUCCESS; 2751 } 2752 #endif 2753 2754 #endif 2755 2756 #if defined(DP_UMAC_HW_RESET_SUPPORT) && defined(WLAN_FEATURE_11BE_MLO) && defined(WLAN_MLO_MULTI_CHIP) 2757 /** 2758 * dp_umac_reset_notify_asserted_soc() - API to notify the asserted SOC 2759 * @soc: dp soc 2760 * 2761 * Return: QDF_STATUS 2762 */ 2763 QDF_STATUS dp_umac_reset_notify_asserted_soc(struct dp_soc *soc); 2764 #else 2765 static inline 2766 QDF_STATUS dp_umac_reset_notify_asserted_soc(struct dp_soc *soc) 2767 { 2768 return QDF_STATUS_SUCCESS; 2769 } 2770 #endif 2771 2772 QDF_STATUS dp_reo_send_cmd(struct dp_soc *soc, enum hal_reo_cmd_type type, 2773 struct hal_reo_cmd_params *params, 2774 void (*callback_fn), void *data); 2775 2776 /** 2777 * dp_reo_cmdlist_destroy() - Free REO commands in the queue 2778 * @soc: DP SoC handle 2779 * 2780 * Return: none 2781 */ 2782 void dp_reo_cmdlist_destroy(struct dp_soc *soc); 2783 2784 /** 2785 * dp_reo_status_ring_handler() - Handler for REO Status ring 2786 * @int_ctx: pointer to DP interrupt context 2787 * @soc: DP Soc handle 2788 * 2789 * Return: Number of descriptors reaped 2790 */ 2791 uint32_t dp_reo_status_ring_handler(struct dp_intr *int_ctx, 2792 struct dp_soc *soc); 2793 2794 /** 2795 * dp_aggregate_vdev_stats() - Consolidate stats at VDEV level 2796 * @vdev: DP VDEV handle 2797 * @vdev_stats: aggregate statistics 2798 * 2799 * return: void 2800 */ 2801 void dp_aggregate_vdev_stats(struct dp_vdev *vdev, 2802 struct cdp_vdev_stats *vdev_stats); 2803 2804 void dp_rx_tid_stats_cb(struct dp_soc *soc, void *cb_ctxt, 2805 union hal_reo_status *reo_status); 2806 2807 /** 2808 * dp_rx_bar_stats_cb() - BAR received stats callback 2809 * @soc: SOC handle 2810 * @cb_ctxt: Call back context 2811 * @reo_status: Reo status 2812 * 2813 * Return: void 2814 */ 2815 void dp_rx_bar_stats_cb(struct dp_soc *soc, void *cb_ctxt, 2816 union hal_reo_status *reo_status); 2817 2818 uint16_t dp_tx_me_send_convert_ucast(struct cdp_soc_t *soc, uint8_t vdev_id, 2819 qdf_nbuf_t nbuf, 2820 uint8_t newmac[][QDF_MAC_ADDR_SIZE], 2821 uint8_t new_mac_cnt, uint8_t tid, 2822 bool is_igmp, bool is_dms_pkt); 2823 void dp_tx_me_alloc_descriptor(struct cdp_soc_t *soc, uint8_t pdev_id); 2824 2825 void dp_tx_me_free_descriptor(struct cdp_soc_t *soc, uint8_t pdev_id); 2826 2827 /** 2828 * dp_h2t_ext_stats_msg_send(): function to construct HTT message to pass to FW 2829 * @pdev: DP PDEV handle 2830 * @stats_type_upload_mask: stats type requested by user 2831 * @config_param_0: extra configuration parameters 2832 * @config_param_1: extra configuration parameters 2833 * @config_param_2: extra configuration parameters 2834 * @config_param_3: extra configuration parameters 2835 * @cookie: 2836 * @cookie_msb: 2837 * @mac_id: mac number 2838 * 2839 * Return: QDF STATUS 2840 */ 2841 QDF_STATUS dp_h2t_ext_stats_msg_send(struct dp_pdev *pdev, 2842 uint32_t stats_type_upload_mask, uint32_t config_param_0, 2843 uint32_t config_param_1, uint32_t config_param_2, 2844 uint32_t config_param_3, int cookie, int cookie_msb, 2845 uint8_t mac_id); 2846 2847 /** 2848 * dp_htt_stats_print_tag() - function to select the tag type and 2849 * print the corresponding tag structure 2850 * @pdev: pdev pointer 2851 * @tag_type: tag type that is to be printed 2852 * @tag_buf: pointer to the tag structure 2853 * 2854 * Return: void 2855 */ 2856 void dp_htt_stats_print_tag(struct dp_pdev *pdev, 2857 uint8_t tag_type, uint32_t *tag_buf); 2858 2859 /** 2860 * dp_htt_stats_copy_tag() - function to select the tag type and 2861 * copy the corresponding tag structure 2862 * @pdev: DP_PDEV handle 2863 * @tag_type: tag type that is to be printed 2864 * @tag_buf: pointer to the tag structure 2865 * 2866 * Return: void 2867 */ 2868 void dp_htt_stats_copy_tag(struct dp_pdev *pdev, uint8_t tag_type, uint32_t *tag_buf); 2869 2870 /** 2871 * dp_h2t_3tuple_config_send(): function to construct 3 tuple configuration 2872 * HTT message to pass to FW 2873 * @pdev: DP PDEV handle 2874 * @tuple_mask: tuple configuration to report 3 tuple hash value in either 2875 * toeplitz_2_or_4 or flow_id_toeplitz in MSDU START TLV. 2876 * 2877 * tuple_mask[1:0]: 2878 * 00 - Do not report 3 tuple hash value 2879 * 10 - Report 3 tuple hash value in toeplitz_2_or_4 2880 * 01 - Report 3 tuple hash value in flow_id_toeplitz 2881 * 11 - Report 3 tuple hash value in both toeplitz_2_or_4 & flow_id_toeplitz 2882 * @mac_id: MAC ID 2883 * 2884 * Return: QDF STATUS 2885 */ 2886 QDF_STATUS dp_h2t_3tuple_config_send(struct dp_pdev *pdev, uint32_t tuple_mask, 2887 uint8_t mac_id); 2888 /** 2889 * typedef dp_rxtid_stats_cmd_cb() - function pointer for peer 2890 * rx tid stats cmd call_back 2891 * @soc: 2892 * @cb_ctxt: 2893 * @reo_status: 2894 */ 2895 typedef void (*dp_rxtid_stats_cmd_cb)(struct dp_soc *soc, void *cb_ctxt, 2896 union hal_reo_status *reo_status); 2897 2898 /** 2899 * dp_peer_rxtid_stats() - Retried Rx TID (REO queue) stats from HW 2900 * @peer: DP peer handle 2901 * @dp_stats_cmd_cb: REO command callback function 2902 * @cb_ctxt: Callback context 2903 * 2904 * Return: count of tid stats cmd send succeeded 2905 */ 2906 int dp_peer_rxtid_stats(struct dp_peer *peer, 2907 dp_rxtid_stats_cmd_cb dp_stats_cmd_cb, 2908 void *cb_ctxt); 2909 2910 #ifdef IPA_OFFLOAD 2911 /** 2912 * dp_peer_update_tid_stats_from_reo() - update rx pkt and byte count from reo 2913 * @soc: soc handle 2914 * @cb_ctxt: combination of peer_id and tid 2915 * @reo_status: reo status 2916 * 2917 * Return: void 2918 */ 2919 void dp_peer_update_tid_stats_from_reo(struct dp_soc *soc, void *cb_ctxt, 2920 union hal_reo_status *reo_status); 2921 2922 int dp_peer_get_rxtid_stats_ipa(struct dp_peer *peer, 2923 dp_rxtid_stats_cmd_cb dp_stats_cmd_cb); 2924 #ifdef IPA_OPT_WIFI_DP 2925 void dp_ipa_wdi_opt_dpath_notify_flt_rlsd(int flt0_rslt, 2926 int flt1_rslt); 2927 void dp_ipa_wdi_opt_dpath_notify_flt_add_rem_cb(int flt0_rslt, int flt1_rslt); 2928 void dp_ipa_wdi_opt_dpath_notify_flt_rsvd(bool is_success); 2929 #endif 2930 #ifdef QCA_ENHANCED_STATS_SUPPORT 2931 /** 2932 * dp_peer_aggregate_tid_stats - aggregate rx tid stats 2933 * @peer: Data Path peer 2934 * 2935 * Return: void 2936 */ 2937 void dp_peer_aggregate_tid_stats(struct dp_peer *peer); 2938 #endif 2939 #else 2940 static inline void dp_peer_aggregate_tid_stats(struct dp_peer *peer) 2941 { 2942 } 2943 #endif 2944 2945 /** 2946 * dp_set_pn_check_wifi3() - enable PN check in REO for security 2947 * @soc: Datapath soc handle 2948 * @vdev_id: id of atapath vdev 2949 * @peer_mac: Datapath peer mac address 2950 * @sec_type: security type 2951 * @rx_pn: Receive pn starting number 2952 * 2953 */ 2954 QDF_STATUS 2955 dp_set_pn_check_wifi3(struct cdp_soc_t *soc, uint8_t vdev_id, 2956 uint8_t *peer_mac, enum cdp_sec_type sec_type, 2957 uint32_t *rx_pn); 2958 2959 /** 2960 * dp_set_key_sec_type_wifi3() - set security mode of key 2961 * @soc: Datapath soc handle 2962 * @vdev_id: id of atapath vdev 2963 * @peer_mac: Datapath peer mac address 2964 * @sec_type: security type 2965 * @is_unicast: key type 2966 * 2967 */ 2968 QDF_STATUS 2969 dp_set_key_sec_type_wifi3(struct cdp_soc_t *soc, uint8_t vdev_id, 2970 uint8_t *peer_mac, enum cdp_sec_type sec_type, 2971 bool is_unicast); 2972 2973 /** 2974 * dp_get_pdev_for_mac_id() - Return pdev for mac_id 2975 * @soc: handle to DP soc 2976 * @mac_id: MAC id 2977 * 2978 * Return: Return pdev corresponding to MAC 2979 */ 2980 void *dp_get_pdev_for_mac_id(struct dp_soc *soc, uint32_t mac_id); 2981 2982 QDF_STATUS 2983 dp_set_michael_key(struct cdp_soc_t *soc, uint8_t vdev_id, 2984 uint8_t *peer_mac, 2985 bool is_unicast, uint32_t *key); 2986 2987 /** 2988 * dp_check_pdev_exists() - Validate pdev before use 2989 * @soc: dp soc handle 2990 * @data: pdev handle 2991 * 2992 * Return: 0 - success/invalid - failure 2993 */ 2994 bool dp_check_pdev_exists(struct dp_soc *soc, struct dp_pdev *data); 2995 2996 /** 2997 * dp_update_delay_stats() - Update delay statistics in structure 2998 * and fill min, max and avg delay 2999 * @tstats: tid tx stats 3000 * @rstats: tid rx stats 3001 * @delay: delay in ms 3002 * @tid: tid value 3003 * @mode: type of tx delay mode 3004 * @ring_id: ring number 3005 * @delay_in_us: flag to indicate whether the delay is in ms or us 3006 * 3007 * Return: none 3008 */ 3009 void dp_update_delay_stats(struct cdp_tid_tx_stats *tstats, 3010 struct cdp_tid_rx_stats *rstats, uint32_t delay, 3011 uint8_t tid, uint8_t mode, uint8_t ring_id, 3012 bool delay_in_us); 3013 3014 /** 3015 * dp_print_ring_stats(): Print tail and head pointer 3016 * @pdev: DP_PDEV handle 3017 * 3018 * Return: void 3019 */ 3020 void dp_print_ring_stats(struct dp_pdev *pdev); 3021 3022 /** 3023 * dp_print_ring_stat_from_hal(): Print tail and head pointer through hal 3024 * @soc: soc handle 3025 * @srng: srng handle 3026 * @ring_type: ring type 3027 * 3028 * Return: void 3029 */ 3030 void 3031 dp_print_ring_stat_from_hal(struct dp_soc *soc, struct dp_srng *srng, 3032 enum hal_ring_type ring_type); 3033 3034 /** 3035 * dp_print_pdev_cfg_params() - Print the pdev cfg parameters 3036 * @pdev: DP pdev handle 3037 * 3038 * Return: void 3039 */ 3040 void dp_print_pdev_cfg_params(struct dp_pdev *pdev); 3041 3042 /** 3043 * dp_print_soc_cfg_params()- Dump soc wlan config parameters 3044 * @soc: Soc handle 3045 * 3046 * Return: void 3047 */ 3048 void dp_print_soc_cfg_params(struct dp_soc *soc); 3049 3050 /** 3051 * dp_srng_get_str_from_hal_ring_type() - Return string name for a ring 3052 * @ring_type: Ring 3053 * 3054 * Return: char const pointer 3055 */ 3056 const 3057 char *dp_srng_get_str_from_hal_ring_type(enum hal_ring_type ring_type); 3058 3059 /** 3060 * dp_txrx_path_stats() - Function to display dump stats 3061 * @soc: soc handle 3062 * 3063 * Return: none 3064 */ 3065 void dp_txrx_path_stats(struct dp_soc *soc); 3066 3067 /** 3068 * dp_print_per_ring_stats(): Packet count per ring 3069 * @soc: soc handle 3070 * 3071 * Return: None 3072 */ 3073 void dp_print_per_ring_stats(struct dp_soc *soc); 3074 3075 /** 3076 * dp_aggregate_pdev_stats(): Consolidate stats at PDEV level 3077 * @pdev: DP PDEV handle 3078 * 3079 * Return: void 3080 */ 3081 void dp_aggregate_pdev_stats(struct dp_pdev *pdev); 3082 3083 /** 3084 * dp_print_rx_rates(): Print Rx rate stats 3085 * @vdev: DP_VDEV handle 3086 * 3087 * Return:void 3088 */ 3089 void dp_print_rx_rates(struct dp_vdev *vdev); 3090 3091 /** 3092 * dp_print_tx_rates(): Print tx rates 3093 * @vdev: DP_VDEV handle 3094 * 3095 * Return:void 3096 */ 3097 void dp_print_tx_rates(struct dp_vdev *vdev); 3098 3099 /** 3100 * dp_print_peer_stats():print peer stats 3101 * @peer: DP_PEER handle 3102 * @peer_stats: buffer holding peer stats 3103 * 3104 * return void 3105 */ 3106 void dp_print_peer_stats(struct dp_peer *peer, 3107 struct cdp_peer_stats *peer_stats); 3108 3109 /** 3110 * dp_print_pdev_tx_stats(): Print Pdev level TX stats 3111 * @pdev: DP_PDEV Handle 3112 * 3113 * Return:void 3114 */ 3115 void 3116 dp_print_pdev_tx_stats(struct dp_pdev *pdev); 3117 3118 /** 3119 * dp_print_pdev_rx_stats(): Print Pdev level RX stats 3120 * @pdev: DP_PDEV Handle 3121 * 3122 * Return: void 3123 */ 3124 void 3125 dp_print_pdev_rx_stats(struct dp_pdev *pdev); 3126 3127 /** 3128 * dp_print_soc_tx_stats(): Print SOC level stats 3129 * @soc: DP_SOC Handle 3130 * 3131 * Return: void 3132 */ 3133 void dp_print_soc_tx_stats(struct dp_soc *soc); 3134 3135 #ifdef QCA_SUPPORT_DP_GLOBAL_CTX 3136 /** 3137 * dp_print_global_desc_count(): Print global desc in use 3138 * 3139 * Return: void 3140 */ 3141 void dp_print_global_desc_count(void); 3142 #else 3143 /** 3144 * dp_print_global_desc_count(): Print global desc in use 3145 * 3146 * Return: void 3147 */ 3148 static inline 3149 void dp_print_global_desc_count(void) 3150 { 3151 } 3152 #endif 3153 3154 /** 3155 * dp_print_soc_interrupt_stats() - Print interrupt stats for the soc 3156 * @soc: dp_soc handle 3157 * 3158 * Return: None 3159 */ 3160 void dp_print_soc_interrupt_stats(struct dp_soc *soc); 3161 3162 /** 3163 * dp_print_tx_ppeds_stats() - Print Tx in use stats for the soc in DS 3164 * @soc: dp_soc handle 3165 * 3166 * Return: None 3167 */ 3168 3169 void dp_print_tx_ppeds_stats(struct dp_soc *soc); 3170 #ifdef WLAN_DP_SRNG_USAGE_WM_TRACKING 3171 /** 3172 * dp_dump_srng_high_wm_stats() - Print the ring usage high watermark stats 3173 * for all SRNGs 3174 * @soc: DP soc handle 3175 * @srng_mask: SRNGs mask for dumping usage watermark stats 3176 * 3177 * Return: None 3178 */ 3179 void dp_dump_srng_high_wm_stats(struct dp_soc *soc, uint64_t srng_mask); 3180 #else 3181 static inline 3182 void dp_dump_srng_high_wm_stats(struct dp_soc *soc, uint64_t srng_mask) 3183 { 3184 } 3185 #endif 3186 3187 /** 3188 * dp_print_soc_rx_stats() - Print SOC level Rx stats 3189 * @soc: DP_SOC Handle 3190 * 3191 * Return: void 3192 */ 3193 void dp_print_soc_rx_stats(struct dp_soc *soc); 3194 3195 /** 3196 * dp_get_mac_id_for_pdev() - Return mac corresponding to pdev for mac 3197 * 3198 * @mac_id: MAC id 3199 * @pdev_id: pdev_id corresponding to pdev, 0 for MCL 3200 * 3201 * Single pdev using both MACs will operate on both MAC rings, 3202 * which is the case for MCL. 3203 * For WIN each PDEV will operate one ring, so index is zero. 3204 * 3205 */ 3206 static inline int dp_get_mac_id_for_pdev(uint32_t mac_id, uint32_t pdev_id) 3207 { 3208 if (mac_id && pdev_id) { 3209 qdf_print("Both mac_id and pdev_id cannot be non zero"); 3210 QDF_BUG(0); 3211 return 0; 3212 } 3213 return (mac_id + pdev_id); 3214 } 3215 3216 /** 3217 * dp_get_lmac_id_for_pdev_id() - Return lmac id corresponding to host pdev id 3218 * @soc: soc pointer 3219 * @mac_id: MAC id 3220 * @pdev_id: pdev_id corresponding to pdev, 0 for MCL 3221 * 3222 * For MCL, Single pdev using both MACs will operate on both MAC rings. 3223 * 3224 * For WIN, each PDEV will operate one ring. 3225 * 3226 */ 3227 static inline int 3228 dp_get_lmac_id_for_pdev_id 3229 (struct dp_soc *soc, uint32_t mac_id, uint32_t pdev_id) 3230 { 3231 if (!wlan_cfg_per_pdev_lmac_ring(soc->wlan_cfg_ctx)) { 3232 if (mac_id && pdev_id) { 3233 qdf_print("Both mac_id and pdev_id cannot be non zero"); 3234 QDF_BUG(0); 3235 return 0; 3236 } 3237 return (mac_id + pdev_id); 3238 } 3239 3240 return soc->pdev_list[pdev_id]->lmac_id; 3241 } 3242 3243 /** 3244 * dp_get_pdev_for_lmac_id() - Return pdev pointer corresponding to lmac id 3245 * @soc: soc pointer 3246 * @lmac_id: LMAC id 3247 * 3248 * For MCL, Single pdev exists 3249 * 3250 * For WIN, each PDEV will operate one ring. 3251 * 3252 */ 3253 static inline struct dp_pdev * 3254 dp_get_pdev_for_lmac_id(struct dp_soc *soc, uint32_t lmac_id) 3255 { 3256 uint8_t i = 0; 3257 3258 if (wlan_cfg_per_pdev_lmac_ring(soc->wlan_cfg_ctx)) { 3259 i = wlan_cfg_get_pdev_idx(soc->wlan_cfg_ctx, lmac_id); 3260 return ((i < MAX_PDEV_CNT) ? soc->pdev_list[i] : NULL); 3261 } 3262 3263 /* Typically for MCL as there only 1 PDEV*/ 3264 return soc->pdev_list[0]; 3265 } 3266 3267 /** 3268 * dp_calculate_target_pdev_id_from_host_pdev_id() - Return target pdev 3269 * corresponding to host pdev id 3270 * @soc: soc pointer 3271 * @mac_for_pdev: pdev_id corresponding to host pdev for WIN, mac id for MCL 3272 * 3273 * Return: target pdev_id for host pdev id. For WIN, this is derived through 3274 * a two step process: 3275 * 1. Get lmac_id corresponding to host pdev_id (lmac_id can change 3276 * during mode switch) 3277 * 2. Get target pdev_id (set up during WMI ready) from lmac_id 3278 * 3279 * For MCL, return the offset-1 translated mac_id 3280 */ 3281 static inline int 3282 dp_calculate_target_pdev_id_from_host_pdev_id 3283 (struct dp_soc *soc, uint32_t mac_for_pdev) 3284 { 3285 struct dp_pdev *pdev; 3286 3287 if (!wlan_cfg_per_pdev_lmac_ring(soc->wlan_cfg_ctx)) 3288 return DP_SW2HW_MACID(mac_for_pdev); 3289 3290 pdev = soc->pdev_list[mac_for_pdev]; 3291 3292 /*non-MCL case, get original target_pdev mapping*/ 3293 return wlan_cfg_get_target_pdev_id(soc->wlan_cfg_ctx, pdev->lmac_id); 3294 } 3295 3296 /** 3297 * dp_get_target_pdev_id_for_host_pdev_id() - Return target pdev corresponding 3298 * to host pdev id 3299 * @soc: soc pointer 3300 * @mac_for_pdev: pdev_id corresponding to host pdev for WIN, mac id for MCL 3301 * 3302 * Return: target pdev_id for host pdev id. 3303 * For WIN, return the value stored in pdev object. 3304 * For MCL, return the offset-1 translated mac_id. 3305 */ 3306 static inline int 3307 dp_get_target_pdev_id_for_host_pdev_id 3308 (struct dp_soc *soc, uint32_t mac_for_pdev) 3309 { 3310 struct dp_pdev *pdev; 3311 3312 if (!wlan_cfg_per_pdev_lmac_ring(soc->wlan_cfg_ctx)) 3313 return DP_SW2HW_MACID(mac_for_pdev); 3314 3315 pdev = soc->pdev_list[mac_for_pdev]; 3316 3317 return pdev->target_pdev_id; 3318 } 3319 3320 /** 3321 * dp_get_host_pdev_id_for_target_pdev_id() - Return host pdev corresponding 3322 * to target pdev id 3323 * @soc: soc pointer 3324 * @pdev_id: pdev_id corresponding to target pdev 3325 * 3326 * Return: host pdev_id for target pdev id. For WIN, this is derived through 3327 * a two step process: 3328 * 1. Get lmac_id corresponding to target pdev_id 3329 * 2. Get host pdev_id (set up during WMI ready) from lmac_id 3330 * 3331 * For MCL, return the 0-offset pdev_id 3332 */ 3333 static inline int 3334 dp_get_host_pdev_id_for_target_pdev_id 3335 (struct dp_soc *soc, uint32_t pdev_id) 3336 { 3337 struct dp_pdev *pdev; 3338 int lmac_id; 3339 3340 if (!wlan_cfg_per_pdev_lmac_ring(soc->wlan_cfg_ctx)) 3341 return DP_HW2SW_MACID(pdev_id); 3342 3343 /*non-MCL case, get original target_lmac mapping from target pdev*/ 3344 lmac_id = wlan_cfg_get_hw_mac_idx(soc->wlan_cfg_ctx, 3345 DP_HW2SW_MACID(pdev_id)); 3346 3347 /*Get host pdev from lmac*/ 3348 pdev = dp_get_pdev_for_lmac_id(soc, lmac_id); 3349 3350 return pdev ? pdev->pdev_id : INVALID_PDEV_ID; 3351 } 3352 3353 /** 3354 * dp_get_mac_id_for_mac() - Return mac corresponding WIN and MCL mac_ids 3355 * 3356 * @soc: handle to DP soc 3357 * @mac_id: MAC id 3358 * 3359 * Single pdev using both MACs will operate on both MAC rings, 3360 * which is the case for MCL. 3361 * For WIN each PDEV will operate one ring, so index is zero. 3362 * 3363 */ 3364 static inline int dp_get_mac_id_for_mac(struct dp_soc *soc, uint32_t mac_id) 3365 { 3366 /* 3367 * Single pdev using both MACs will operate on both MAC rings, 3368 * which is the case for MCL. 3369 */ 3370 if (!wlan_cfg_per_pdev_lmac_ring(soc->wlan_cfg_ctx)) 3371 return mac_id; 3372 3373 /* For WIN each PDEV will operate one ring, so index is zero. */ 3374 return 0; 3375 } 3376 3377 /** 3378 * dp_is_subtype_data() - check if the frame subtype is data 3379 * 3380 * @frame_ctrl: Frame control field 3381 * 3382 * check the frame control field and verify if the packet 3383 * is a data packet. 3384 * 3385 * Return: true or false 3386 */ 3387 static inline bool dp_is_subtype_data(uint16_t frame_ctrl) 3388 { 3389 if (((qdf_cpu_to_le16(frame_ctrl) & QDF_IEEE80211_FC0_TYPE_MASK) == 3390 QDF_IEEE80211_FC0_TYPE_DATA) && 3391 (((qdf_cpu_to_le16(frame_ctrl) & QDF_IEEE80211_FC0_SUBTYPE_MASK) == 3392 QDF_IEEE80211_FC0_SUBTYPE_DATA) || 3393 ((qdf_cpu_to_le16(frame_ctrl) & QDF_IEEE80211_FC0_SUBTYPE_MASK) == 3394 QDF_IEEE80211_FC0_SUBTYPE_QOS))) { 3395 return true; 3396 } 3397 3398 return false; 3399 } 3400 3401 #ifdef WDI_EVENT_ENABLE 3402 /** 3403 * dp_h2t_cfg_stats_msg_send(): function to construct HTT message to pass to FW 3404 * @pdev: DP PDEV handle 3405 * @stats_type_upload_mask: stats type requested by user 3406 * @mac_id: Mac id number 3407 * 3408 * return: QDF STATUS 3409 */ 3410 QDF_STATUS dp_h2t_cfg_stats_msg_send(struct dp_pdev *pdev, 3411 uint32_t stats_type_upload_mask, 3412 uint8_t mac_id); 3413 3414 /** 3415 * dp_wdi_event_unsub() - WDI event unsubscribe 3416 * @soc: soc handle 3417 * @pdev_id: id of pdev 3418 * @event_cb_sub_handle: subscribed event handle 3419 * @event: Event to be unsubscribe 3420 * 3421 * Return: 0 for success. nonzero for failure. 3422 */ 3423 int dp_wdi_event_unsub(struct cdp_soc_t *soc, uint8_t pdev_id, 3424 wdi_event_subscribe *event_cb_sub_handle, 3425 uint32_t event); 3426 3427 /** 3428 * dp_wdi_event_sub() - Subscribe WDI event 3429 * @soc: soc handle 3430 * @pdev_id: id of pdev 3431 * @event_cb_sub_handle: subscribe event handle 3432 * @event: Event to be subscribe 3433 * 3434 * Return: 0 for success. nonzero for failure. 3435 */ 3436 int dp_wdi_event_sub(struct cdp_soc_t *soc, uint8_t pdev_id, 3437 wdi_event_subscribe *event_cb_sub_handle, 3438 uint32_t event); 3439 3440 /** 3441 * dp_wdi_event_handler() - Event handler for WDI event 3442 * @event: wdi event number 3443 * @soc: soc handle 3444 * @data: pointer to data 3445 * @peer_id: peer id number 3446 * @status: HTT rx status 3447 * @pdev_id: id of pdev 3448 * 3449 * It will be called to register WDI event 3450 * 3451 * Return: None 3452 */ 3453 void dp_wdi_event_handler(enum WDI_EVENT event, struct dp_soc *soc, 3454 void *data, u_int16_t peer_id, 3455 int status, u_int8_t pdev_id); 3456 3457 /** 3458 * dp_wdi_event_attach() - Attach wdi event 3459 * @txrx_pdev: DP pdev handle 3460 * 3461 * Return: 0 for success. nonzero for failure. 3462 */ 3463 int dp_wdi_event_attach(struct dp_pdev *txrx_pdev); 3464 3465 /** 3466 * dp_wdi_event_detach() - Detach WDI event 3467 * @txrx_pdev: DP pdev handle 3468 * 3469 * Return: 0 for success. nonzero for failure. 3470 */ 3471 int dp_wdi_event_detach(struct dp_pdev *txrx_pdev); 3472 3473 static inline void 3474 dp_hif_update_pipe_callback(struct dp_soc *dp_soc, 3475 void *cb_context, 3476 QDF_STATUS (*callback)(void *, qdf_nbuf_t, uint8_t), 3477 uint8_t pipe_id) 3478 { 3479 struct hif_msg_callbacks hif_pipe_callbacks = { 0 }; 3480 3481 /* TODO: Temporary change to bypass HTC connection for this new 3482 * HIF pipe, which will be used for packet log and other high- 3483 * priority HTT messages. Proper HTC connection to be added 3484 * later once required FW changes are available 3485 */ 3486 hif_pipe_callbacks.rxCompletionHandler = callback; 3487 hif_pipe_callbacks.Context = cb_context; 3488 hif_update_pipe_callback(dp_soc->hif_handle, 3489 DP_HTT_T2H_HP_PIPE, &hif_pipe_callbacks); 3490 } 3491 #else 3492 static inline int dp_wdi_event_unsub(struct cdp_soc_t *soc, uint8_t pdev_id, 3493 wdi_event_subscribe *event_cb_sub_handle, 3494 uint32_t event) 3495 { 3496 return 0; 3497 } 3498 3499 static inline int dp_wdi_event_sub(struct cdp_soc_t *soc, uint8_t pdev_id, 3500 wdi_event_subscribe *event_cb_sub_handle, 3501 uint32_t event) 3502 { 3503 return 0; 3504 } 3505 3506 static inline 3507 void dp_wdi_event_handler(enum WDI_EVENT event, 3508 struct dp_soc *soc, 3509 void *data, u_int16_t peer_id, 3510 int status, u_int8_t pdev_id) 3511 { 3512 } 3513 3514 static inline int dp_wdi_event_attach(struct dp_pdev *txrx_pdev) 3515 { 3516 return 0; 3517 } 3518 3519 static inline int dp_wdi_event_detach(struct dp_pdev *txrx_pdev) 3520 { 3521 return 0; 3522 } 3523 3524 static inline QDF_STATUS dp_h2t_cfg_stats_msg_send(struct dp_pdev *pdev, 3525 uint32_t stats_type_upload_mask, uint8_t mac_id) 3526 { 3527 return 0; 3528 } 3529 3530 static inline void 3531 dp_hif_update_pipe_callback(struct dp_soc *dp_soc, void *cb_context, 3532 QDF_STATUS (*callback)(void *, qdf_nbuf_t, uint8_t), 3533 uint8_t pipe_id) 3534 { 3535 } 3536 #endif 3537 3538 #ifdef VDEV_PEER_PROTOCOL_COUNT 3539 /** 3540 * dp_vdev_peer_stats_update_protocol_cnt() - update per-peer protocol counters 3541 * @vdev: VDEV DP object 3542 * @nbuf: data packet 3543 * @txrx_peer: DP TXRX Peer object 3544 * @is_egress: whether egress or ingress 3545 * @is_rx: whether rx or tx 3546 * 3547 * This function updates the per-peer protocol counters 3548 * Return: void 3549 */ 3550 void dp_vdev_peer_stats_update_protocol_cnt(struct dp_vdev *vdev, 3551 qdf_nbuf_t nbuf, 3552 struct dp_txrx_peer *txrx_peer, 3553 bool is_egress, 3554 bool is_rx); 3555 3556 /** 3557 * dp_peer_stats_update_protocol_cnt() - update per-peer protocol counters 3558 * @soc: SOC DP object 3559 * @vdev_id: vdev_id 3560 * @nbuf: data packet 3561 * @is_egress: whether egress or ingress 3562 * @is_rx: whether rx or tx 3563 * 3564 * This function updates the per-peer protocol counters 3565 * 3566 * Return: void 3567 */ 3568 void dp_peer_stats_update_protocol_cnt(struct cdp_soc_t *soc, 3569 int8_t vdev_id, 3570 qdf_nbuf_t nbuf, 3571 bool is_egress, 3572 bool is_rx); 3573 3574 void dp_vdev_peer_stats_update_protocol_cnt_tx(struct dp_vdev *vdev_hdl, 3575 qdf_nbuf_t nbuf); 3576 3577 #else 3578 #define dp_vdev_peer_stats_update_protocol_cnt(vdev, nbuf, txrx_peer, \ 3579 is_egress, is_rx) 3580 3581 static inline 3582 void dp_vdev_peer_stats_update_protocol_cnt_tx(struct dp_vdev *vdev_hdl, 3583 qdf_nbuf_t nbuf) 3584 { 3585 } 3586 3587 #endif 3588 3589 #ifdef QCA_LL_TX_FLOW_CONTROL_V2 3590 /** 3591 * dp_tx_dump_flow_pool_info() - dump global_pool and flow_pool info 3592 * @soc_hdl: Handle to struct cdp_soc 3593 * 3594 * Return: none 3595 */ 3596 void dp_tx_dump_flow_pool_info(struct cdp_soc_t *soc_hdl); 3597 3598 /** 3599 * dp_tx_dump_flow_pool_info_compact() - dump flow pool info 3600 * @soc: DP soc context 3601 * 3602 * Return: none 3603 */ 3604 void dp_tx_dump_flow_pool_info_compact(struct dp_soc *soc); 3605 int dp_tx_delete_flow_pool(struct dp_soc *soc, struct dp_tx_desc_pool_s *pool, 3606 bool force); 3607 #else 3608 static inline void dp_tx_dump_flow_pool_info_compact(struct dp_soc *soc) 3609 { 3610 } 3611 #endif /* QCA_LL_TX_FLOW_CONTROL_V2 */ 3612 3613 #ifdef QCA_OL_DP_SRNG_LOCK_LESS_ACCESS 3614 static inline int 3615 dp_hal_srng_access_start(hal_soc_handle_t soc, hal_ring_handle_t hal_ring_hdl) 3616 { 3617 return hal_srng_access_start_unlocked(soc, hal_ring_hdl); 3618 } 3619 3620 static inline void 3621 dp_hal_srng_access_end(hal_soc_handle_t soc, hal_ring_handle_t hal_ring_hdl) 3622 { 3623 hal_srng_access_end_unlocked(soc, hal_ring_hdl); 3624 } 3625 3626 #else 3627 static inline int 3628 dp_hal_srng_access_start(hal_soc_handle_t soc, hal_ring_handle_t hal_ring_hdl) 3629 { 3630 return hal_srng_access_start(soc, hal_ring_hdl); 3631 } 3632 3633 static inline void 3634 dp_hal_srng_access_end(hal_soc_handle_t soc, hal_ring_handle_t hal_ring_hdl) 3635 { 3636 hal_srng_access_end(soc, hal_ring_hdl); 3637 } 3638 #endif 3639 3640 #ifdef WLAN_FEATURE_DP_EVENT_HISTORY 3641 /** 3642 * dp_srng_access_start() - Wrapper function to log access start of a hal ring 3643 * @int_ctx: pointer to DP interrupt context. This should not be NULL 3644 * @dp_soc: DP Soc handle 3645 * @hal_ring_hdl: opaque pointer to the HAL Rx Error Ring, which will be 3646 * serviced 3647 * 3648 * Return: 0 on success; error on failure 3649 */ 3650 int dp_srng_access_start(struct dp_intr *int_ctx, struct dp_soc *dp_soc, 3651 hal_ring_handle_t hal_ring_hdl); 3652 3653 /** 3654 * dp_srng_access_end() - Wrapper function to log access end of a hal ring 3655 * @int_ctx: pointer to DP interrupt context. This should not be NULL 3656 * @dp_soc: DP Soc handle 3657 * @hal_ring_hdl: opaque pointer to the HAL Rx Error Ring, which will be 3658 * serviced 3659 * 3660 * Return: void 3661 */ 3662 void dp_srng_access_end(struct dp_intr *int_ctx, struct dp_soc *dp_soc, 3663 hal_ring_handle_t hal_ring_hdl); 3664 3665 #else 3666 static inline int dp_srng_access_start(struct dp_intr *int_ctx, 3667 struct dp_soc *dp_soc, 3668 hal_ring_handle_t hal_ring_hdl) 3669 { 3670 hal_soc_handle_t hal_soc = dp_soc->hal_soc; 3671 3672 return dp_hal_srng_access_start(hal_soc, hal_ring_hdl); 3673 } 3674 3675 static inline void dp_srng_access_end(struct dp_intr *int_ctx, 3676 struct dp_soc *dp_soc, 3677 hal_ring_handle_t hal_ring_hdl) 3678 { 3679 hal_soc_handle_t hal_soc = dp_soc->hal_soc; 3680 3681 return dp_hal_srng_access_end(hal_soc, hal_ring_hdl); 3682 } 3683 #endif /* WLAN_FEATURE_DP_EVENT_HISTORY */ 3684 3685 #ifdef QCA_CACHED_RING_DESC 3686 /** 3687 * dp_srng_dst_get_next() - Wrapper function to get next ring desc 3688 * @dp_soc: DP Soc handle 3689 * @hal_ring_hdl: opaque pointer to the HAL Destination Ring 3690 * 3691 * Return: HAL ring descriptor 3692 */ 3693 static inline void *dp_srng_dst_get_next(struct dp_soc *dp_soc, 3694 hal_ring_handle_t hal_ring_hdl) 3695 { 3696 hal_soc_handle_t hal_soc = dp_soc->hal_soc; 3697 3698 return hal_srng_dst_get_next_cached(hal_soc, hal_ring_hdl); 3699 } 3700 3701 /** 3702 * dp_srng_dst_inv_cached_descs() - Wrapper function to invalidate cached 3703 * descriptors 3704 * @dp_soc: DP Soc handle 3705 * @hal_ring_hdl: opaque pointer to the HAL Rx Destination ring 3706 * @num_entries: Entry count 3707 * 3708 * Return: None 3709 */ 3710 static inline void dp_srng_dst_inv_cached_descs(struct dp_soc *dp_soc, 3711 hal_ring_handle_t hal_ring_hdl, 3712 uint32_t num_entries) 3713 { 3714 hal_soc_handle_t hal_soc = dp_soc->hal_soc; 3715 3716 hal_srng_dst_inv_cached_descs(hal_soc, hal_ring_hdl, num_entries); 3717 } 3718 #else 3719 static inline void *dp_srng_dst_get_next(struct dp_soc *dp_soc, 3720 hal_ring_handle_t hal_ring_hdl) 3721 { 3722 hal_soc_handle_t hal_soc = dp_soc->hal_soc; 3723 3724 return hal_srng_dst_get_next(hal_soc, hal_ring_hdl); 3725 } 3726 3727 static inline void dp_srng_dst_inv_cached_descs(struct dp_soc *dp_soc, 3728 hal_ring_handle_t hal_ring_hdl, 3729 uint32_t num_entries) 3730 { 3731 } 3732 #endif /* QCA_CACHED_RING_DESC */ 3733 3734 #if defined(QCA_CACHED_RING_DESC) && \ 3735 (defined(QCA_DP_RX_HW_SW_NBUF_DESC_PREFETCH) || \ 3736 defined(QCA_DP_TX_HW_SW_NBUF_DESC_PREFETCH)) 3737 /** 3738 * dp_srng_dst_prefetch() - Wrapper function to prefetch descs from dest ring 3739 * @hal_soc: HAL SOC handle 3740 * @hal_ring_hdl: opaque pointer to the HAL Rx Destination ring 3741 * @num_entries: Entry count 3742 * 3743 * Return: None 3744 */ 3745 static inline void *dp_srng_dst_prefetch(hal_soc_handle_t hal_soc, 3746 hal_ring_handle_t hal_ring_hdl, 3747 uint32_t num_entries) 3748 { 3749 return hal_srng_dst_prefetch(hal_soc, hal_ring_hdl, num_entries); 3750 } 3751 3752 /** 3753 * dp_srng_dst_prefetch_32_byte_desc() - Wrapper function to prefetch 3754 * 32 byte descriptor starting at 3755 * 64 byte offset 3756 * @hal_soc: HAL SOC handle 3757 * @hal_ring_hdl: opaque pointer to the HAL Rx Destination ring 3758 * @num_entries: Entry count 3759 * 3760 * Return: None 3761 */ 3762 static inline 3763 void *dp_srng_dst_prefetch_32_byte_desc(hal_soc_handle_t hal_soc, 3764 hal_ring_handle_t hal_ring_hdl, 3765 uint32_t num_entries) 3766 { 3767 return hal_srng_dst_prefetch_32_byte_desc(hal_soc, hal_ring_hdl, 3768 num_entries); 3769 } 3770 #else 3771 static inline void *dp_srng_dst_prefetch(hal_soc_handle_t hal_soc, 3772 hal_ring_handle_t hal_ring_hdl, 3773 uint32_t num_entries) 3774 { 3775 return NULL; 3776 } 3777 3778 static inline 3779 void *dp_srng_dst_prefetch_32_byte_desc(hal_soc_handle_t hal_soc, 3780 hal_ring_handle_t hal_ring_hdl, 3781 uint32_t num_entries) 3782 { 3783 return NULL; 3784 } 3785 #endif 3786 3787 #ifdef QCA_ENH_V3_STATS_SUPPORT 3788 /** 3789 * dp_pdev_print_delay_stats(): Print pdev level delay stats 3790 * @pdev: DP_PDEV handle 3791 * 3792 * Return:void 3793 */ 3794 void dp_pdev_print_delay_stats(struct dp_pdev *pdev); 3795 3796 /** 3797 * dp_pdev_print_tid_stats(): Print pdev level tid stats 3798 * @pdev: DP_PDEV handle 3799 * 3800 * Return:void 3801 */ 3802 void dp_pdev_print_tid_stats(struct dp_pdev *pdev); 3803 3804 /** 3805 * dp_pdev_print_rx_error_stats(): Print pdev level rx error stats 3806 * @pdev: DP_PDEV handle 3807 * 3808 * Return:void 3809 */ 3810 void dp_pdev_print_rx_error_stats(struct dp_pdev *pdev); 3811 #endif /* QCA_ENH_V3_STATS_SUPPORT */ 3812 3813 /** 3814 * dp_pdev_get_tid_stats(): Get accumulated pdev level tid_stats 3815 * @soc_hdl: soc handle 3816 * @pdev_id: id of dp_pdev handle 3817 * @tid_stats: Pointer for cdp_tid_stats_intf 3818 * 3819 * Return: QDF_STATUS_SUCCESS or QDF_STATUS_E_INVAL 3820 */ 3821 QDF_STATUS dp_pdev_get_tid_stats(struct cdp_soc_t *soc_hdl, uint8_t pdev_id, 3822 struct cdp_tid_stats_intf *tid_stats); 3823 3824 /** 3825 * dp_soc_set_txrx_ring_map() 3826 * @soc: DP handler for soc 3827 * 3828 * Return: Void 3829 */ 3830 void dp_soc_set_txrx_ring_map(struct dp_soc *soc); 3831 3832 /** 3833 * dp_vdev_to_cdp_vdev() - typecast dp vdev to cdp vdev 3834 * @vdev: DP vdev handle 3835 * 3836 * Return: struct cdp_vdev pointer 3837 */ 3838 static inline 3839 struct cdp_vdev *dp_vdev_to_cdp_vdev(struct dp_vdev *vdev) 3840 { 3841 return (struct cdp_vdev *)vdev; 3842 } 3843 3844 /** 3845 * dp_pdev_to_cdp_pdev() - typecast dp pdev to cdp pdev 3846 * @pdev: DP pdev handle 3847 * 3848 * Return: struct cdp_pdev pointer 3849 */ 3850 static inline 3851 struct cdp_pdev *dp_pdev_to_cdp_pdev(struct dp_pdev *pdev) 3852 { 3853 return (struct cdp_pdev *)pdev; 3854 } 3855 3856 /** 3857 * dp_soc_to_cdp_soc() - typecast dp psoc to cdp psoc 3858 * @psoc: DP psoc handle 3859 * 3860 * Return: struct cdp_soc pointer 3861 */ 3862 static inline 3863 struct cdp_soc *dp_soc_to_cdp_soc(struct dp_soc *psoc) 3864 { 3865 return (struct cdp_soc *)psoc; 3866 } 3867 3868 /** 3869 * dp_soc_to_cdp_soc_t() - typecast dp psoc to ol txrx soc handle 3870 * @psoc: DP psoc handle 3871 * 3872 * Return: struct cdp_soc_t pointer 3873 */ 3874 static inline 3875 struct cdp_soc_t *dp_soc_to_cdp_soc_t(struct dp_soc *psoc) 3876 { 3877 return (struct cdp_soc_t *)psoc; 3878 } 3879 3880 #if defined(WLAN_SUPPORT_RX_FLOW_TAG) || defined(WLAN_SUPPORT_RX_FISA) 3881 /** 3882 * dp_rx_flow_get_fse_stats() - Retrieve a flow's statistics 3883 * @pdev: pdev handle 3884 * @rx_flow_info: flow information in the Rx FST 3885 * @stats: stats to update 3886 * 3887 * Return: Success when flow statistcs is updated, error on failure 3888 */ 3889 QDF_STATUS dp_rx_flow_get_fse_stats(struct dp_pdev *pdev, 3890 struct cdp_rx_flow_info *rx_flow_info, 3891 struct cdp_flow_stats *stats); 3892 3893 /** 3894 * dp_rx_flow_delete_entry() - Delete a flow entry from flow search table 3895 * @pdev: pdev handle 3896 * @rx_flow_info: DP flow parameters 3897 * 3898 * Return: Success when flow is deleted, error on failure 3899 */ 3900 QDF_STATUS dp_rx_flow_delete_entry(struct dp_pdev *pdev, 3901 struct cdp_rx_flow_info *rx_flow_info); 3902 3903 /** 3904 * dp_rx_flow_add_entry() - Add a flow entry to flow search table 3905 * @pdev: DP pdev instance 3906 * @rx_flow_info: DP flow parameters 3907 * 3908 * Return: Success when flow is added, no-memory or already exists on error 3909 */ 3910 QDF_STATUS dp_rx_flow_add_entry(struct dp_pdev *pdev, 3911 struct cdp_rx_flow_info *rx_flow_info); 3912 3913 /** 3914 * dp_rx_fst_attach() - Initialize Rx FST and setup necessary parameters 3915 * @soc: SoC handle 3916 * @pdev: Pdev handle 3917 * 3918 * Return: Handle to flow search table entry 3919 */ 3920 QDF_STATUS dp_rx_fst_attach(struct dp_soc *soc, struct dp_pdev *pdev); 3921 3922 /** 3923 * dp_rx_fst_detach() - De-initialize Rx FST 3924 * @soc: SoC handle 3925 * @pdev: Pdev handle 3926 * 3927 * Return: None 3928 */ 3929 void dp_rx_fst_detach(struct dp_soc *soc, struct dp_pdev *pdev); 3930 3931 /** 3932 * dp_rx_flow_send_fst_fw_setup() - Program FST parameters in FW/HW post-attach 3933 * @soc: SoC handle 3934 * @pdev: Pdev handle 3935 * 3936 * Return: Success when fst parameters are programmed in FW, error otherwise 3937 */ 3938 QDF_STATUS dp_rx_flow_send_fst_fw_setup(struct dp_soc *soc, 3939 struct dp_pdev *pdev); 3940 3941 /** 3942 * dp_mon_rx_update_rx_flow_tag_stats() - Update a mon flow's statistics 3943 * @pdev: pdev handle 3944 * @flow_id: flow index (truncated hash) in the Rx FST 3945 * 3946 * Return: Success when flow statistcs is updated, error on failure 3947 */ 3948 QDF_STATUS 3949 dp_mon_rx_update_rx_flow_tag_stats(struct dp_pdev *pdev, uint32_t flow_id); 3950 3951 #else /* !((WLAN_SUPPORT_RX_FLOW_TAG) || defined(WLAN_SUPPORT_RX_FISA)) */ 3952 3953 /** 3954 * dp_rx_fst_attach() - Initialize Rx FST and setup necessary parameters 3955 * @soc: SoC handle 3956 * @pdev: Pdev handle 3957 * 3958 * Return: Handle to flow search table entry 3959 */ 3960 static inline 3961 QDF_STATUS dp_rx_fst_attach(struct dp_soc *soc, struct dp_pdev *pdev) 3962 { 3963 return QDF_STATUS_SUCCESS; 3964 } 3965 3966 /** 3967 * dp_rx_fst_detach() - De-initialize Rx FST 3968 * @soc: SoC handle 3969 * @pdev: Pdev handle 3970 * 3971 * Return: None 3972 */ 3973 static inline 3974 void dp_rx_fst_detach(struct dp_soc *soc, struct dp_pdev *pdev) 3975 { 3976 } 3977 #endif 3978 3979 /** 3980 * dp_rx_fst_attach_wrapper() - wrapper API for dp_rx_fst_attach 3981 * @soc: SoC handle 3982 * @pdev: Pdev handle 3983 * 3984 * Return: Handle to flow search table entry 3985 */ 3986 extern QDF_STATUS 3987 dp_rx_fst_attach_wrapper(struct dp_soc *soc, struct dp_pdev *pdev); 3988 3989 /** 3990 * dp_rx_fst_detach_wrapper() - wrapper API for dp_rx_fst_detach 3991 * @soc: SoC handle 3992 * @pdev: Pdev handle 3993 * 3994 * Return: None 3995 */ 3996 extern void 3997 dp_rx_fst_detach_wrapper(struct dp_soc *soc, struct dp_pdev *pdev); 3998 3999 /** 4000 * dp_vdev_get_ref() - API to take a reference for VDEV object 4001 * 4002 * @soc : core DP soc context 4003 * @vdev : DP vdev 4004 * @mod_id : module id 4005 * 4006 * Return: QDF_STATUS_SUCCESS if reference held successfully 4007 * else QDF_STATUS_E_INVAL 4008 */ 4009 static inline 4010 QDF_STATUS dp_vdev_get_ref(struct dp_soc *soc, struct dp_vdev *vdev, 4011 enum dp_mod_id mod_id) 4012 { 4013 if (!qdf_atomic_inc_not_zero(&vdev->ref_cnt)) 4014 return QDF_STATUS_E_INVAL; 4015 4016 qdf_atomic_inc(&vdev->mod_refs[mod_id]); 4017 4018 return QDF_STATUS_SUCCESS; 4019 } 4020 4021 /** 4022 * dp_vdev_get_ref_by_id() - Returns vdev object given the vdev id 4023 * @soc: core DP soc context 4024 * @vdev_id: vdev id from vdev object can be retrieved 4025 * @mod_id: module id which is requesting the reference 4026 * 4027 * Return: struct dp_vdev*: Pointer to DP vdev object 4028 */ 4029 static inline struct dp_vdev * 4030 dp_vdev_get_ref_by_id(struct dp_soc *soc, uint8_t vdev_id, 4031 enum dp_mod_id mod_id) 4032 { 4033 struct dp_vdev *vdev = NULL; 4034 if (qdf_unlikely(vdev_id >= MAX_VDEV_CNT)) 4035 return NULL; 4036 4037 qdf_spin_lock_bh(&soc->vdev_map_lock); 4038 vdev = soc->vdev_id_map[vdev_id]; 4039 4040 if (!vdev || dp_vdev_get_ref(soc, vdev, mod_id) != QDF_STATUS_SUCCESS) { 4041 qdf_spin_unlock_bh(&soc->vdev_map_lock); 4042 return NULL; 4043 } 4044 qdf_spin_unlock_bh(&soc->vdev_map_lock); 4045 4046 return vdev; 4047 } 4048 4049 /** 4050 * dp_get_pdev_from_soc_pdev_id_wifi3() - Returns pdev object given the pdev id 4051 * @soc: core DP soc context 4052 * @pdev_id: pdev id from pdev object can be retrieved 4053 * 4054 * Return: struct dp_pdev*: Pointer to DP pdev object 4055 */ 4056 static inline struct dp_pdev * 4057 dp_get_pdev_from_soc_pdev_id_wifi3(struct dp_soc *soc, 4058 uint8_t pdev_id) 4059 { 4060 if (qdf_unlikely(pdev_id >= MAX_PDEV_CNT)) 4061 return NULL; 4062 4063 return soc->pdev_list[pdev_id]; 4064 } 4065 4066 /** 4067 * dp_rx_tid_update_wifi3() - Update receive TID state 4068 * @peer: Datapath peer handle 4069 * @tid: TID 4070 * @ba_window_size: BlockAck window size 4071 * @start_seq: Starting sequence number 4072 * @bar_update: BAR update triggered 4073 * 4074 * Return: QDF_STATUS code 4075 */ 4076 QDF_STATUS dp_rx_tid_update_wifi3(struct dp_peer *peer, int tid, 4077 uint32_t ba_window_size, uint32_t start_seq, 4078 bool bar_update); 4079 4080 /** 4081 * dp_get_peer_mac_list(): function to get peer mac list of vdev 4082 * @soc: Datapath soc handle 4083 * @vdev_id: vdev id 4084 * @newmac: Table of the clients mac 4085 * @mac_cnt: No. of MACs required 4086 * @limit: Limit the number of clients 4087 * 4088 * Return: no of clients 4089 */ 4090 uint16_t dp_get_peer_mac_list(ol_txrx_soc_handle soc, uint8_t vdev_id, 4091 u_int8_t newmac[][QDF_MAC_ADDR_SIZE], 4092 u_int16_t mac_cnt, bool limit); 4093 4094 /** 4095 * dp_update_num_mac_rings_for_dbs() - Update No of MAC rings based on 4096 * DBS check 4097 * @soc: DP SoC context 4098 * @max_mac_rings: Pointer to variable for No of MAC rings 4099 * 4100 * Return: None 4101 */ 4102 void dp_update_num_mac_rings_for_dbs(struct dp_soc *soc, 4103 int *max_mac_rings); 4104 4105 4106 #if defined(WLAN_SUPPORT_RX_FISA) 4107 void dp_rx_dump_fisa_table(struct dp_soc *soc); 4108 4109 /** 4110 * dp_print_fisa_stats() - Print FISA stats 4111 * @soc: DP soc handle 4112 * 4113 * Return: None 4114 */ 4115 void dp_print_fisa_stats(struct dp_soc *soc); 4116 4117 /** 4118 * dp_rx_fst_update_cmem_params() - Update CMEM FST params 4119 * @soc: DP SoC context 4120 * @num_entries: Number of flow search entries 4121 * @cmem_ba_lo: CMEM base address low 4122 * @cmem_ba_hi: CMEM base address high 4123 * 4124 * Return: None 4125 */ 4126 void dp_rx_fst_update_cmem_params(struct dp_soc *soc, uint16_t num_entries, 4127 uint32_t cmem_ba_lo, uint32_t cmem_ba_hi); 4128 4129 void 4130 dp_rx_fst_update_pm_suspend_status(struct dp_soc *soc, bool suspended); 4131 4132 /** 4133 * dp_rx_fst_requeue_wq() - Re-queue pending work queue tasks 4134 * @soc: DP SoC context 4135 * 4136 * Return: None 4137 */ 4138 void dp_rx_fst_requeue_wq(struct dp_soc *soc); 4139 #else 4140 static inline void 4141 dp_rx_fst_update_cmem_params(struct dp_soc *soc, uint16_t num_entries, 4142 uint32_t cmem_ba_lo, uint32_t cmem_ba_hi) 4143 { 4144 } 4145 4146 static inline void 4147 dp_rx_fst_update_pm_suspend_status(struct dp_soc *soc, bool suspended) 4148 { 4149 } 4150 4151 static inline void 4152 dp_rx_fst_requeue_wq(struct dp_soc *soc) 4153 { 4154 } 4155 4156 static inline void dp_print_fisa_stats(struct dp_soc *soc) 4157 { 4158 } 4159 #endif /* WLAN_SUPPORT_RX_FISA */ 4160 4161 #ifdef MAX_ALLOC_PAGE_SIZE 4162 /** 4163 * dp_set_max_page_size() - Set the max page size for hw link desc. 4164 * @pages: link desc page handle 4165 * @max_alloc_size: max_alloc_size 4166 * 4167 * For MCL the page size is set to OS defined value and for WIN 4168 * the page size is set to the max_alloc_size cfg ini 4169 * param. 4170 * This is to ensure that WIN gets contiguous memory allocations 4171 * as per requirement. 4172 * 4173 * Return: None 4174 */ 4175 static inline 4176 void dp_set_max_page_size(struct qdf_mem_multi_page_t *pages, 4177 uint32_t max_alloc_size) 4178 { 4179 pages->page_size = qdf_page_size; 4180 } 4181 4182 #else 4183 static inline 4184 void dp_set_max_page_size(struct qdf_mem_multi_page_t *pages, 4185 uint32_t max_alloc_size) 4186 { 4187 pages->page_size = max_alloc_size; 4188 } 4189 #endif /* MAX_ALLOC_PAGE_SIZE */ 4190 4191 /** 4192 * dp_history_get_next_index() - get the next entry to record an entry 4193 * in the history. 4194 * @curr_idx: Current index where the last entry is written. 4195 * @max_entries: Max number of entries in the history 4196 * 4197 * This function assumes that the max number os entries is a power of 2. 4198 * 4199 * Return: The index where the next entry is to be written. 4200 */ 4201 static inline uint32_t dp_history_get_next_index(qdf_atomic_t *curr_idx, 4202 uint32_t max_entries) 4203 { 4204 uint32_t idx = qdf_atomic_inc_return(curr_idx); 4205 4206 return idx & (max_entries - 1); 4207 } 4208 4209 /** 4210 * dp_rx_skip_tlvs() - Skip TLVs len + L3 padding, save in nbuf->cb 4211 * @soc: Datapath soc handle 4212 * @nbuf: nbuf cb to be updated 4213 * @l3_padding: L3 padding 4214 * 4215 * Return: None 4216 */ 4217 void dp_rx_skip_tlvs(struct dp_soc *soc, qdf_nbuf_t nbuf, uint32_t l3_padding); 4218 4219 #ifndef FEATURE_WDS 4220 static inline void 4221 dp_hmwds_ast_add_notify(struct dp_peer *peer, 4222 uint8_t *mac_addr, 4223 enum cdp_txrx_ast_entry_type type, 4224 QDF_STATUS err, 4225 bool is_peer_map) 4226 { 4227 } 4228 #endif 4229 4230 #ifdef HTT_STATS_DEBUGFS_SUPPORT 4231 /** 4232 * dp_pdev_htt_stats_dbgfs_init() - Function to allocate memory and initialize 4233 * debugfs for HTT stats 4234 * @pdev: dp pdev handle 4235 * 4236 * Return: QDF_STATUS 4237 */ 4238 QDF_STATUS dp_pdev_htt_stats_dbgfs_init(struct dp_pdev *pdev); 4239 4240 /** 4241 * dp_pdev_htt_stats_dbgfs_deinit() - Function to remove debugfs entry for 4242 * HTT stats 4243 * @pdev: dp pdev handle 4244 * 4245 * Return: none 4246 */ 4247 void dp_pdev_htt_stats_dbgfs_deinit(struct dp_pdev *pdev); 4248 #else 4249 4250 /** 4251 * dp_pdev_htt_stats_dbgfs_init() - Function to allocate memory and initialize 4252 * debugfs for HTT stats 4253 * @pdev: dp pdev handle 4254 * 4255 * Return: QDF_STATUS 4256 */ 4257 static inline QDF_STATUS 4258 dp_pdev_htt_stats_dbgfs_init(struct dp_pdev *pdev) 4259 { 4260 return QDF_STATUS_SUCCESS; 4261 } 4262 4263 /** 4264 * dp_pdev_htt_stats_dbgfs_deinit() - Function to remove debugfs entry for 4265 * HTT stats 4266 * @pdev: dp pdev handle 4267 * 4268 * Return: none 4269 */ 4270 static inline void 4271 dp_pdev_htt_stats_dbgfs_deinit(struct dp_pdev *pdev) 4272 { 4273 } 4274 #endif /* HTT_STATS_DEBUGFS_SUPPORT */ 4275 4276 #ifndef WLAN_DP_FEATURE_SW_LATENCY_MGR 4277 /** 4278 * dp_soc_swlm_attach() - attach the software latency manager resources 4279 * @soc: Datapath global soc handle 4280 * 4281 * Return: QDF_STATUS 4282 */ 4283 static inline QDF_STATUS dp_soc_swlm_attach(struct dp_soc *soc) 4284 { 4285 return QDF_STATUS_SUCCESS; 4286 } 4287 4288 /** 4289 * dp_soc_swlm_detach() - detach the software latency manager resources 4290 * @soc: Datapath global soc handle 4291 * 4292 * Return: QDF_STATUS 4293 */ 4294 static inline QDF_STATUS dp_soc_swlm_detach(struct dp_soc *soc) 4295 { 4296 return QDF_STATUS_SUCCESS; 4297 } 4298 #endif /* !WLAN_DP_FEATURE_SW_LATENCY_MGR */ 4299 4300 /** 4301 * dp_get_peer_id(): function to get peer id by mac 4302 * @soc: Datapath soc handle 4303 * @vdev_id: vdev id 4304 * @mac: Peer mac address 4305 * 4306 * Return: valid peer id on success 4307 * HTT_INVALID_PEER on failure 4308 */ 4309 uint16_t dp_get_peer_id(ol_txrx_soc_handle soc, uint8_t vdev_id, uint8_t *mac); 4310 4311 #ifdef QCA_SUPPORT_WDS_EXTENDED 4312 /** 4313 * dp_wds_ext_set_peer_rx(): function to set peer rx handler 4314 * @soc: Datapath soc handle 4315 * @vdev_id: vdev id 4316 * @mac: Peer mac address 4317 * @rx: rx function pointer 4318 * @osif_peer: OSIF peer handle 4319 * 4320 * Return: QDF_STATUS_SUCCESS on success 4321 * QDF_STATUS_E_INVAL if peer is not found 4322 * QDF_STATUS_E_ALREADY if rx is already set/unset 4323 */ 4324 QDF_STATUS dp_wds_ext_set_peer_rx(ol_txrx_soc_handle soc, 4325 uint8_t vdev_id, 4326 uint8_t *mac, 4327 ol_txrx_rx_fp rx, 4328 ol_osif_peer_handle osif_peer); 4329 4330 /** 4331 * dp_wds_ext_get_peer_osif_handle(): function to get peer osif handle 4332 * @soc: Datapath soc handle 4333 * @vdev_id: vdev id 4334 * @mac: Peer mac address 4335 * @osif_peer: OSIF peer handle 4336 * 4337 * Return: QDF_STATUS_SUCCESS on success 4338 * QDF_STATUS_E_INVAL if peer is not found 4339 */ 4340 QDF_STATUS dp_wds_ext_get_peer_osif_handle( 4341 ol_txrx_soc_handle soc, 4342 uint8_t vdev_id, 4343 uint8_t *mac, 4344 ol_osif_peer_handle *osif_peer); 4345 4346 #endif /* QCA_SUPPORT_WDS_EXTENDED */ 4347 4348 #ifdef DP_MEM_PRE_ALLOC 4349 4350 /** 4351 * dp_context_alloc_mem() - allocate memory for DP context 4352 * @soc: datapath soc handle 4353 * @ctxt_type: DP context type 4354 * @ctxt_size: DP context size 4355 * 4356 * Return: DP context address 4357 */ 4358 void *dp_context_alloc_mem(struct dp_soc *soc, enum dp_ctxt_type ctxt_type, 4359 size_t ctxt_size); 4360 4361 /** 4362 * dp_context_free_mem() - Free memory of DP context 4363 * @soc: datapath soc handle 4364 * @ctxt_type: DP context type 4365 * @vaddr: Address of context memory 4366 * 4367 * Return: None 4368 */ 4369 void dp_context_free_mem(struct dp_soc *soc, enum dp_ctxt_type ctxt_type, 4370 void *vaddr); 4371 4372 /** 4373 * dp_desc_multi_pages_mem_alloc() - alloc memory over multiple pages 4374 * @soc: datapath soc handle 4375 * @desc_type: memory request source type 4376 * @pages: multi page information storage 4377 * @element_size: each element size 4378 * @element_num: total number of elements should be allocated 4379 * @memctxt: memory context 4380 * @cacheable: coherent memory or cacheable memory 4381 * 4382 * This function is a wrapper for memory allocation over multiple 4383 * pages, if dp prealloc method is registered, then will try prealloc 4384 * firstly. if prealloc failed, fall back to regular way over 4385 * qdf_mem_multi_pages_alloc(). 4386 * 4387 * Return: None 4388 */ 4389 void dp_desc_multi_pages_mem_alloc(struct dp_soc *soc, 4390 enum dp_desc_type desc_type, 4391 struct qdf_mem_multi_page_t *pages, 4392 size_t element_size, 4393 uint32_t element_num, 4394 qdf_dma_context_t memctxt, 4395 bool cacheable); 4396 4397 /** 4398 * dp_desc_multi_pages_mem_free() - free multiple pages memory 4399 * @soc: datapath soc handle 4400 * @desc_type: memory request source type 4401 * @pages: multi page information storage 4402 * @memctxt: memory context 4403 * @cacheable: coherent memory or cacheable memory 4404 * 4405 * This function is a wrapper for multiple pages memory free, 4406 * if memory is got from prealloc pool, put it back to pool. 4407 * otherwise free by qdf_mem_multi_pages_free(). 4408 * 4409 * Return: None 4410 */ 4411 void dp_desc_multi_pages_mem_free(struct dp_soc *soc, 4412 enum dp_desc_type desc_type, 4413 struct qdf_mem_multi_page_t *pages, 4414 qdf_dma_context_t memctxt, 4415 bool cacheable); 4416 4417 #else 4418 static inline 4419 void *dp_context_alloc_mem(struct dp_soc *soc, enum dp_ctxt_type ctxt_type, 4420 size_t ctxt_size) 4421 { 4422 return qdf_mem_malloc(ctxt_size); 4423 } 4424 4425 static inline 4426 void dp_context_free_mem(struct dp_soc *soc, enum dp_ctxt_type ctxt_type, 4427 void *vaddr) 4428 { 4429 qdf_mem_free(vaddr); 4430 } 4431 4432 static inline 4433 void dp_desc_multi_pages_mem_alloc(struct dp_soc *soc, 4434 enum dp_desc_type desc_type, 4435 struct qdf_mem_multi_page_t *pages, 4436 size_t element_size, 4437 uint32_t element_num, 4438 qdf_dma_context_t memctxt, 4439 bool cacheable) 4440 { 4441 qdf_mem_multi_pages_alloc(soc->osdev, pages, element_size, 4442 element_num, memctxt, cacheable); 4443 } 4444 4445 static inline 4446 void dp_desc_multi_pages_mem_free(struct dp_soc *soc, 4447 enum dp_desc_type desc_type, 4448 struct qdf_mem_multi_page_t *pages, 4449 qdf_dma_context_t memctxt, 4450 bool cacheable) 4451 { 4452 qdf_mem_multi_pages_free(soc->osdev, pages, 4453 memctxt, cacheable); 4454 } 4455 #endif 4456 4457 /** 4458 * struct dp_frag_history_opaque_atomic - Opaque struct for adding a fragmented 4459 * history. 4460 * @index: atomic index 4461 * @num_entries_per_slot: Number of entries per slot 4462 * @allocated: is allocated or not 4463 * @entry: pointers to array of records 4464 */ 4465 struct dp_frag_history_opaque_atomic { 4466 qdf_atomic_t index; 4467 uint16_t num_entries_per_slot; 4468 uint16_t allocated; 4469 void *entry[0]; 4470 }; 4471 4472 static inline QDF_STATUS 4473 dp_soc_frag_history_attach(struct dp_soc *soc, void *history_hdl, 4474 uint32_t max_slots, uint32_t max_entries_per_slot, 4475 uint32_t entry_size, 4476 bool attempt_prealloc, enum dp_ctxt_type ctxt_type) 4477 { 4478 struct dp_frag_history_opaque_atomic *history = 4479 (struct dp_frag_history_opaque_atomic *)history_hdl; 4480 size_t alloc_size = max_entries_per_slot * entry_size; 4481 int i; 4482 4483 for (i = 0; i < max_slots; i++) { 4484 if (attempt_prealloc) 4485 history->entry[i] = dp_context_alloc_mem(soc, ctxt_type, 4486 alloc_size); 4487 else 4488 history->entry[i] = qdf_mem_malloc(alloc_size); 4489 4490 if (!history->entry[i]) 4491 goto exit; 4492 } 4493 4494 qdf_atomic_init(&history->index); 4495 history->allocated = 1; 4496 history->num_entries_per_slot = max_entries_per_slot; 4497 4498 return QDF_STATUS_SUCCESS; 4499 exit: 4500 for (i = i - 1; i >= 0; i--) { 4501 if (attempt_prealloc) 4502 dp_context_free_mem(soc, ctxt_type, history->entry[i]); 4503 else 4504 qdf_mem_free(history->entry[i]); 4505 } 4506 4507 return QDF_STATUS_E_NOMEM; 4508 } 4509 4510 static inline 4511 void dp_soc_frag_history_detach(struct dp_soc *soc, 4512 void *history_hdl, uint32_t max_slots, 4513 bool attempt_prealloc, 4514 enum dp_ctxt_type ctxt_type) 4515 { 4516 struct dp_frag_history_opaque_atomic *history = 4517 (struct dp_frag_history_opaque_atomic *)history_hdl; 4518 int i; 4519 4520 for (i = 0; i < max_slots; i++) { 4521 if (attempt_prealloc) 4522 dp_context_free_mem(soc, ctxt_type, history->entry[i]); 4523 else 4524 qdf_mem_free(history->entry[i]); 4525 } 4526 4527 history->allocated = 0; 4528 } 4529 4530 /** 4531 * dp_get_frag_hist_next_atomic_idx() - get the next entry index to record an 4532 * entry in a fragmented history with 4533 * index being atomic. 4534 * @curr_idx: address of the current index where the last entry was written 4535 * @next_idx: pointer to update the next index 4536 * @slot: pointer to update the history slot to be selected 4537 * @slot_shift: BITwise shift mask for slot (in index) 4538 * @max_entries_per_slot: Max number of entries in a slot of history 4539 * @max_entries: Total number of entries in the history (sum of all slots) 4540 * 4541 * This function assumes that the "max_entries_per_slot" and "max_entries" 4542 * are a power-of-2. 4543 * 4544 * Return: None 4545 */ 4546 static inline void 4547 dp_get_frag_hist_next_atomic_idx(qdf_atomic_t *curr_idx, uint32_t *next_idx, 4548 uint16_t *slot, uint32_t slot_shift, 4549 uint32_t max_entries_per_slot, 4550 uint32_t max_entries) 4551 { 4552 uint32_t idx; 4553 4554 idx = qdf_do_div_rem(qdf_atomic_inc_return(curr_idx), max_entries); 4555 4556 *slot = idx >> slot_shift; 4557 *next_idx = idx & (max_entries_per_slot - 1); 4558 } 4559 4560 #ifdef FEATURE_RUNTIME_PM 4561 /** 4562 * dp_runtime_get() - Get dp runtime refcount 4563 * @soc: Datapath soc handle 4564 * 4565 * Get dp runtime refcount by increment of an atomic variable, which can block 4566 * dp runtime resume to wait to flush pending tx by runtime suspend. 4567 * 4568 * Return: Current refcount 4569 */ 4570 static inline int32_t dp_runtime_get(struct dp_soc *soc) 4571 { 4572 return qdf_atomic_inc_return(&soc->dp_runtime_refcount); 4573 } 4574 4575 /** 4576 * dp_runtime_put() - Return dp runtime refcount 4577 * @soc: Datapath soc handle 4578 * 4579 * Return dp runtime refcount by decrement of an atomic variable, allow dp 4580 * runtime resume finish. 4581 * 4582 * Return: Current refcount 4583 */ 4584 static inline int32_t dp_runtime_put(struct dp_soc *soc) 4585 { 4586 return qdf_atomic_dec_return(&soc->dp_runtime_refcount); 4587 } 4588 4589 /** 4590 * dp_runtime_get_refcount() - Get dp runtime refcount 4591 * @soc: Datapath soc handle 4592 * 4593 * Get dp runtime refcount by returning an atomic variable 4594 * 4595 * Return: Current refcount 4596 */ 4597 static inline int32_t dp_runtime_get_refcount(struct dp_soc *soc) 4598 { 4599 return qdf_atomic_read(&soc->dp_runtime_refcount); 4600 } 4601 4602 /** 4603 * dp_runtime_init() - Init DP related runtime PM clients and runtime refcount 4604 * @soc: Datapath soc handle 4605 * 4606 * Return: QDF_STATUS 4607 */ 4608 static inline void dp_runtime_init(struct dp_soc *soc) 4609 { 4610 hif_rtpm_register(HIF_RTPM_ID_DP, NULL); 4611 hif_rtpm_register(HIF_RTPM_ID_DP_RING_STATS, NULL); 4612 qdf_atomic_init(&soc->dp_runtime_refcount); 4613 } 4614 4615 /** 4616 * dp_runtime_deinit() - Deinit DP related runtime PM clients 4617 * 4618 * Return: None 4619 */ 4620 static inline void dp_runtime_deinit(void) 4621 { 4622 hif_rtpm_deregister(HIF_RTPM_ID_DP); 4623 hif_rtpm_deregister(HIF_RTPM_ID_DP_RING_STATS); 4624 } 4625 4626 /** 4627 * dp_runtime_pm_mark_last_busy() - Mark last busy when rx path in use 4628 * @soc: Datapath soc handle 4629 * 4630 * Return: None 4631 */ 4632 static inline void dp_runtime_pm_mark_last_busy(struct dp_soc *soc) 4633 { 4634 soc->rx_last_busy = qdf_get_log_timestamp_usecs(); 4635 4636 hif_rtpm_mark_last_busy(HIF_RTPM_ID_DP); 4637 } 4638 #else 4639 static inline int32_t dp_runtime_get(struct dp_soc *soc) 4640 { 4641 return 0; 4642 } 4643 4644 static inline int32_t dp_runtime_put(struct dp_soc *soc) 4645 { 4646 return 0; 4647 } 4648 4649 static inline QDF_STATUS dp_runtime_init(struct dp_soc *soc) 4650 { 4651 return QDF_STATUS_SUCCESS; 4652 } 4653 4654 static inline void dp_runtime_deinit(void) 4655 { 4656 } 4657 4658 static inline void dp_runtime_pm_mark_last_busy(struct dp_soc *soc) 4659 { 4660 } 4661 #endif 4662 4663 static inline enum QDF_GLOBAL_MODE dp_soc_get_con_mode(struct dp_soc *soc) 4664 { 4665 if (soc->cdp_soc.ol_ops->get_con_mode) 4666 return soc->cdp_soc.ol_ops->get_con_mode(); 4667 4668 return QDF_GLOBAL_MAX_MODE; 4669 } 4670 4671 /** 4672 * dp_pdev_bkp_stats_detach() - detach resources for back pressure stats 4673 * processing 4674 * @pdev: Datapath PDEV handle 4675 * 4676 */ 4677 void dp_pdev_bkp_stats_detach(struct dp_pdev *pdev); 4678 4679 /** 4680 * dp_pdev_bkp_stats_attach() - attach resources for back pressure stats 4681 * processing 4682 * @pdev: Datapath PDEV handle 4683 * 4684 * Return: QDF_STATUS_SUCCESS: Success 4685 * QDF_STATUS_E_NOMEM: Error 4686 */ 4687 4688 QDF_STATUS dp_pdev_bkp_stats_attach(struct dp_pdev *pdev); 4689 4690 /** 4691 * dp_peer_flush_frags() - Flush all fragments for a particular 4692 * peer 4693 * @soc_hdl: data path soc handle 4694 * @vdev_id: vdev id 4695 * @peer_mac: peer mac address 4696 * 4697 * Return: None 4698 */ 4699 void dp_peer_flush_frags(struct cdp_soc_t *soc_hdl, uint8_t vdev_id, 4700 uint8_t *peer_mac); 4701 4702 /** 4703 * dp_soc_reset_mon_intr_mask() - reset mon intr mask 4704 * @soc: pointer to dp_soc handle 4705 * 4706 * Return: 4707 */ 4708 void dp_soc_reset_mon_intr_mask(struct dp_soc *soc); 4709 4710 /** 4711 * dp_txrx_get_soc_stats() - will return cdp_soc_stats 4712 * @soc_hdl: soc handle 4713 * @soc_stats: buffer to hold the values 4714 * 4715 * Return: QDF_STATUS_SUCCESS: Success 4716 * QDF_STATUS_E_FAILURE: Error 4717 */ 4718 QDF_STATUS dp_txrx_get_soc_stats(struct cdp_soc_t *soc_hdl, 4719 struct cdp_soc_stats *soc_stats); 4720 4721 /** 4722 * dp_txrx_get_peer_delay_stats() - to get peer delay stats per TIDs 4723 * @soc_hdl: soc handle 4724 * @vdev_id: id of vdev handle 4725 * @peer_mac: mac of DP_PEER handle 4726 * @delay_stats: pointer to delay stats array 4727 * 4728 * Return: QDF_STATUS_SUCCESS: Success 4729 * QDF_STATUS_E_FAILURE: Error 4730 */ 4731 QDF_STATUS 4732 dp_txrx_get_peer_delay_stats(struct cdp_soc_t *soc_hdl, uint8_t vdev_id, 4733 uint8_t *peer_mac, 4734 struct cdp_delay_tid_stats *delay_stats); 4735 4736 /** 4737 * dp_txrx_get_peer_jitter_stats() - to get peer jitter stats per TIDs 4738 * @soc_hdl: soc handle 4739 * @pdev_id: id of pdev handle 4740 * @vdev_id: id of vdev handle 4741 * @peer_mac: mac of DP_PEER handle 4742 * @tid_stats: pointer to jitter stats array 4743 * 4744 * Return: QDF_STATUS_SUCCESS: Success 4745 * QDF_STATUS_E_FAILURE: Error 4746 */ 4747 QDF_STATUS 4748 dp_txrx_get_peer_jitter_stats(struct cdp_soc_t *soc_hdl, uint8_t pdev_id, 4749 uint8_t vdev_id, uint8_t *peer_mac, 4750 struct cdp_peer_tid_stats *tid_stats); 4751 4752 /** 4753 * dp_peer_get_tx_capture_stats() - to get peer Tx Capture stats 4754 * @soc_hdl: soc handle 4755 * @vdev_id: id of vdev handle 4756 * @peer_mac: mac of DP_PEER handle 4757 * @stats: pointer to peer tx capture stats 4758 * 4759 * Return: QDF_STATUS_SUCCESS: Success 4760 * QDF_STATUS_E_FAILURE: Error 4761 */ 4762 QDF_STATUS 4763 dp_peer_get_tx_capture_stats(struct cdp_soc_t *soc_hdl, 4764 uint8_t vdev_id, uint8_t *peer_mac, 4765 struct cdp_peer_tx_capture_stats *stats); 4766 4767 /** 4768 * dp_pdev_get_tx_capture_stats() - to get pdev Tx Capture stats 4769 * @soc_hdl: soc handle 4770 * @pdev_id: id of pdev handle 4771 * @stats: pointer to pdev tx capture stats 4772 * 4773 * Return: QDF_STATUS_SUCCESS: Success 4774 * QDF_STATUS_E_FAILURE: Error 4775 */ 4776 QDF_STATUS 4777 dp_pdev_get_tx_capture_stats(struct cdp_soc_t *soc_hdl, uint8_t pdev_id, 4778 struct cdp_pdev_tx_capture_stats *stats); 4779 4780 #ifdef HW_TX_DELAY_STATS_ENABLE 4781 /** 4782 * dp_is_vdev_tx_delay_stats_enabled(): Check if tx delay stats 4783 * is enabled for vdev 4784 * @vdev: dp vdev 4785 * 4786 * Return: true if tx delay stats is enabled for vdev else false 4787 */ 4788 static inline uint8_t dp_is_vdev_tx_delay_stats_enabled(struct dp_vdev *vdev) 4789 { 4790 return vdev->hw_tx_delay_stats_enabled; 4791 } 4792 4793 /** 4794 * dp_pdev_print_tx_delay_stats(): Print vdev tx delay stats 4795 * for pdev 4796 * @soc: dp soc 4797 * 4798 * Return: None 4799 */ 4800 void dp_pdev_print_tx_delay_stats(struct dp_soc *soc); 4801 4802 /** 4803 * dp_pdev_clear_tx_delay_stats() - clear tx delay stats 4804 * @soc: soc handle 4805 * 4806 * Return: None 4807 */ 4808 void dp_pdev_clear_tx_delay_stats(struct dp_soc *soc); 4809 #else 4810 static inline uint8_t dp_is_vdev_tx_delay_stats_enabled(struct dp_vdev *vdev) 4811 { 4812 return 0; 4813 } 4814 4815 static inline void dp_pdev_print_tx_delay_stats(struct dp_soc *soc) 4816 { 4817 } 4818 4819 static inline void dp_pdev_clear_tx_delay_stats(struct dp_soc *soc) 4820 { 4821 } 4822 #endif 4823 4824 static inline void 4825 dp_get_rx_hash_key_bytes(struct cdp_lro_hash_config *lro_hash) 4826 { 4827 qdf_get_random_bytes(lro_hash->toeplitz_hash_ipv4, 4828 (sizeof(lro_hash->toeplitz_hash_ipv4[0]) * 4829 LRO_IPV4_SEED_ARR_SZ)); 4830 qdf_get_random_bytes(lro_hash->toeplitz_hash_ipv6, 4831 (sizeof(lro_hash->toeplitz_hash_ipv6[0]) * 4832 LRO_IPV6_SEED_ARR_SZ)); 4833 } 4834 4835 #ifdef WLAN_CONFIG_TELEMETRY_AGENT 4836 /** 4837 * dp_get_pdev_telemetry_stats- API to get pdev telemetry stats 4838 * @soc_hdl: soc handle 4839 * @pdev_id: id of pdev handle 4840 * @stats: pointer to pdev telemetry stats 4841 * 4842 * Return: QDF_STATUS_SUCCESS: Success 4843 * QDF_STATUS_E_FAILURE: Error 4844 */ 4845 QDF_STATUS 4846 dp_get_pdev_telemetry_stats(struct cdp_soc_t *soc_hdl, uint8_t pdev_id, 4847 struct cdp_pdev_telemetry_stats *stats); 4848 4849 /** 4850 * dp_get_peer_telemetry_stats() - API to get peer telemetry stats 4851 * @soc_hdl: soc handle 4852 * @addr: peer mac 4853 * @stats: pointer to peer telemetry stats 4854 * 4855 * Return: QDF_STATUS_SUCCESS: Success 4856 * QDF_STATUS_E_FAILURE: Error 4857 */ 4858 QDF_STATUS 4859 dp_get_peer_telemetry_stats(struct cdp_soc_t *soc_hdl, uint8_t *addr, 4860 struct cdp_peer_telemetry_stats *stats); 4861 4862 /** 4863 * dp_get_peer_deter_stats() - API to get peer deterministic stats 4864 * @soc_hdl: soc handle 4865 * @vdev_id: id of vdev handle 4866 * @addr: peer mac 4867 * @stats: pointer to peer deterministic stats 4868 * 4869 * Return: QDF_STATUS_SUCCESS: Success 4870 * QDF_STATUS_E_FAILURE: Error 4871 */ 4872 QDF_STATUS 4873 dp_get_peer_deter_stats(struct cdp_soc_t *soc_hdl, 4874 uint8_t vdev_id, 4875 uint8_t *addr, 4876 struct cdp_peer_deter_stats *stats); 4877 4878 /** 4879 * dp_get_pdev_deter_stats() - API to get pdev deterministic stats 4880 * @soc_hdl: soc handle 4881 * @pdev_id: id of pdev handle 4882 * @stats: pointer to pdev deterministic stats 4883 * 4884 * Return: QDF_STATUS_SUCCESS: Success 4885 * QDF_STATUS_E_FAILURE: Error 4886 */ 4887 QDF_STATUS 4888 dp_get_pdev_deter_stats(struct cdp_soc_t *soc_hdl, uint8_t pdev_id, 4889 struct cdp_pdev_deter_stats *stats); 4890 4891 /** 4892 * dp_update_pdev_chan_util_stats() - API to update channel utilization stats 4893 * @soc_hdl: soc handle 4894 * @pdev_id: id of pdev handle 4895 * @ch_util: Pointer to channel util stats 4896 * 4897 * Return: QDF_STATUS_SUCCESS: Success 4898 * QDF_STATUS_E_FAILURE: Error 4899 */ 4900 QDF_STATUS 4901 dp_update_pdev_chan_util_stats(struct cdp_soc_t *soc_hdl, uint8_t pdev_id, 4902 struct cdp_pdev_chan_util_stats *ch_util); 4903 #endif /* WLAN_CONFIG_TELEMETRY_AGENT */ 4904 4905 #ifdef CONNECTIVITY_PKTLOG 4906 /** 4907 * dp_tx_send_pktlog() - send tx packet log 4908 * @soc: soc handle 4909 * @pdev: pdev handle 4910 * @tx_desc: TX software descriptor 4911 * @nbuf: nbuf 4912 * @status: status of tx packet 4913 * 4914 * This function is used to send tx packet for logging 4915 * 4916 * Return: None 4917 * 4918 */ 4919 static inline 4920 void dp_tx_send_pktlog(struct dp_soc *soc, struct dp_pdev *pdev, 4921 struct dp_tx_desc_s *tx_desc, 4922 qdf_nbuf_t nbuf, enum qdf_dp_tx_rx_status status) 4923 { 4924 ol_txrx_pktdump_cb packetdump_cb = pdev->dp_tx_packetdump_cb; 4925 4926 if (qdf_unlikely(packetdump_cb) && 4927 dp_tx_frm_std == tx_desc->frm_type) { 4928 packetdump_cb((ol_txrx_soc_handle)soc, pdev->pdev_id, 4929 tx_desc->vdev_id, nbuf, status, QDF_TX_DATA_PKT); 4930 } 4931 } 4932 4933 /** 4934 * dp_rx_send_pktlog() - send rx packet log 4935 * @soc: soc handle 4936 * @pdev: pdev handle 4937 * @nbuf: nbuf 4938 * @status: status of rx packet 4939 * 4940 * This function is used to send rx packet for logging 4941 * 4942 * Return: None 4943 * 4944 */ 4945 static inline 4946 void dp_rx_send_pktlog(struct dp_soc *soc, struct dp_pdev *pdev, 4947 qdf_nbuf_t nbuf, enum qdf_dp_tx_rx_status status) 4948 { 4949 ol_txrx_pktdump_cb packetdump_cb = pdev->dp_rx_packetdump_cb; 4950 4951 if (qdf_unlikely(packetdump_cb)) { 4952 packetdump_cb((ol_txrx_soc_handle)soc, pdev->pdev_id, 4953 QDF_NBUF_CB_RX_VDEV_ID(nbuf), 4954 nbuf, status, QDF_RX_DATA_PKT); 4955 } 4956 } 4957 4958 /** 4959 * dp_rx_err_send_pktlog() - send rx error packet log 4960 * @soc: soc handle 4961 * @pdev: pdev handle 4962 * @mpdu_desc_info: MPDU descriptor info 4963 * @nbuf: nbuf 4964 * @status: status of rx packet 4965 * @set_pktlen: weither to set packet length 4966 * 4967 * This API should only be called when we have not removed 4968 * Rx TLV from head, and head is pointing to rx_tlv 4969 * 4970 * This function is used to send rx packet from error path 4971 * for logging for which rx packet tlv is not removed. 4972 * 4973 * Return: None 4974 * 4975 */ 4976 static inline 4977 void dp_rx_err_send_pktlog(struct dp_soc *soc, struct dp_pdev *pdev, 4978 struct hal_rx_mpdu_desc_info *mpdu_desc_info, 4979 qdf_nbuf_t nbuf, enum qdf_dp_tx_rx_status status, 4980 bool set_pktlen) 4981 { 4982 ol_txrx_pktdump_cb packetdump_cb = pdev->dp_rx_packetdump_cb; 4983 qdf_size_t skip_size; 4984 uint16_t msdu_len, nbuf_len; 4985 uint8_t *rx_tlv_hdr; 4986 struct hal_rx_msdu_metadata msdu_metadata; 4987 4988 if (qdf_unlikely(packetdump_cb)) { 4989 rx_tlv_hdr = qdf_nbuf_data(nbuf); 4990 nbuf_len = hal_rx_msdu_start_msdu_len_get(soc->hal_soc, 4991 rx_tlv_hdr); 4992 hal_rx_msdu_metadata_get(soc->hal_soc, rx_tlv_hdr, 4993 &msdu_metadata); 4994 4995 if (mpdu_desc_info->bar_frame || 4996 (mpdu_desc_info->mpdu_flags & HAL_MPDU_F_FRAGMENT)) 4997 skip_size = soc->rx_pkt_tlv_size; 4998 else 4999 skip_size = soc->rx_pkt_tlv_size + 5000 msdu_metadata.l3_hdr_pad; 5001 5002 if (set_pktlen) { 5003 msdu_len = nbuf_len + skip_size; 5004 qdf_nbuf_set_pktlen(nbuf, qdf_min(msdu_len, 5005 (uint16_t)RX_DATA_BUFFER_SIZE)); 5006 } 5007 5008 qdf_nbuf_pull_head(nbuf, skip_size); 5009 packetdump_cb((ol_txrx_soc_handle)soc, pdev->pdev_id, 5010 QDF_NBUF_CB_RX_VDEV_ID(nbuf), 5011 nbuf, status, QDF_RX_DATA_PKT); 5012 qdf_nbuf_push_head(nbuf, skip_size); 5013 } 5014 } 5015 5016 #else 5017 static inline 5018 void dp_tx_send_pktlog(struct dp_soc *soc, struct dp_pdev *pdev, 5019 struct dp_tx_desc_s *tx_desc, 5020 qdf_nbuf_t nbuf, enum qdf_dp_tx_rx_status status) 5021 { 5022 } 5023 5024 static inline 5025 void dp_rx_send_pktlog(struct dp_soc *soc, struct dp_pdev *pdev, 5026 qdf_nbuf_t nbuf, enum qdf_dp_tx_rx_status status) 5027 { 5028 } 5029 5030 static inline 5031 void dp_rx_err_send_pktlog(struct dp_soc *soc, struct dp_pdev *pdev, 5032 struct hal_rx_mpdu_desc_info *mpdu_desc_info, 5033 qdf_nbuf_t nbuf, enum qdf_dp_tx_rx_status status, 5034 bool set_pktlen) 5035 { 5036 } 5037 #endif 5038 5039 /** 5040 * dp_pdev_update_fast_rx_flag() - Update Fast rx flag for a PDEV 5041 * @soc : Data path soc handle 5042 * @pdev : PDEV handle 5043 * 5044 * Return: None 5045 */ 5046 void dp_pdev_update_fast_rx_flag(struct dp_soc *soc, struct dp_pdev *pdev); 5047 5048 #ifdef FEATURE_DIRECT_LINK 5049 /** 5050 * dp_setup_direct_link_refill_ring(): Setup direct link refill ring for pdev 5051 * @soc_hdl: DP SOC handle 5052 * @pdev_id: pdev id 5053 * 5054 * Return: Handle to SRNG 5055 */ 5056 struct dp_srng *dp_setup_direct_link_refill_ring(struct cdp_soc_t *soc_hdl, 5057 uint8_t pdev_id); 5058 5059 /** 5060 * dp_destroy_direct_link_refill_ring(): Destroy direct link refill ring for 5061 * pdev 5062 * @soc_hdl: DP SOC handle 5063 * @pdev_id: pdev id 5064 * 5065 * Return: None 5066 */ 5067 void dp_destroy_direct_link_refill_ring(struct cdp_soc_t *soc_hdl, 5068 uint8_t pdev_id); 5069 #else 5070 static inline 5071 struct dp_srng *dp_setup_direct_link_refill_ring(struct cdp_soc_t *soc_hdl, 5072 uint8_t pdev_id) 5073 { 5074 return NULL; 5075 } 5076 5077 static inline 5078 void dp_destroy_direct_link_refill_ring(struct cdp_soc_t *soc_hdl, 5079 uint8_t pdev_id) 5080 { 5081 } 5082 #endif 5083 5084 #ifdef WLAN_FEATURE_DP_CFG_EVENT_HISTORY 5085 static inline 5086 void dp_cfg_event_record(struct dp_soc *soc, 5087 enum dp_cfg_event_type event, 5088 union dp_cfg_event_desc *cfg_event_desc) 5089 { 5090 struct dp_cfg_event_history *cfg_event_history = 5091 &soc->cfg_event_history; 5092 struct dp_cfg_event *entry; 5093 uint32_t idx; 5094 uint16_t slot; 5095 5096 dp_get_frag_hist_next_atomic_idx(&cfg_event_history->index, &idx, 5097 &slot, 5098 DP_CFG_EVT_HIST_SLOT_SHIFT, 5099 DP_CFG_EVT_HIST_PER_SLOT_MAX, 5100 DP_CFG_EVT_HISTORY_SIZE); 5101 5102 entry = &cfg_event_history->entry[slot][idx]; 5103 5104 entry->timestamp = qdf_get_log_timestamp(); 5105 entry->type = event; 5106 qdf_mem_copy(&entry->event_desc, cfg_event_desc, 5107 sizeof(entry->event_desc)); 5108 } 5109 5110 static inline void 5111 dp_cfg_event_record_vdev_evt(struct dp_soc *soc, enum dp_cfg_event_type event, 5112 struct dp_vdev *vdev) 5113 { 5114 union dp_cfg_event_desc cfg_evt_desc = {0}; 5115 struct dp_vdev_attach_detach_desc *vdev_evt = 5116 &cfg_evt_desc.vdev_evt; 5117 5118 if (qdf_unlikely(event != DP_CFG_EVENT_VDEV_ATTACH && 5119 event != DP_CFG_EVENT_VDEV_UNREF_DEL && 5120 event != DP_CFG_EVENT_VDEV_DETACH)) { 5121 qdf_assert_always(0); 5122 return; 5123 } 5124 5125 vdev_evt->vdev = vdev; 5126 vdev_evt->vdev_id = vdev->vdev_id; 5127 vdev_evt->ref_count = qdf_atomic_read(&vdev->ref_cnt); 5128 vdev_evt->mac_addr = vdev->mac_addr; 5129 5130 dp_cfg_event_record(soc, event, &cfg_evt_desc); 5131 } 5132 5133 static inline void 5134 dp_cfg_event_record_peer_evt(struct dp_soc *soc, enum dp_cfg_event_type event, 5135 struct dp_peer *peer, struct dp_vdev *vdev, 5136 uint8_t is_reuse) 5137 { 5138 union dp_cfg_event_desc cfg_evt_desc = {0}; 5139 struct dp_peer_cmn_ops_desc *peer_evt = &cfg_evt_desc.peer_cmn_evt; 5140 5141 if (qdf_unlikely(event != DP_CFG_EVENT_PEER_CREATE && 5142 event != DP_CFG_EVENT_PEER_DELETE && 5143 event != DP_CFG_EVENT_PEER_UNREF_DEL)) { 5144 qdf_assert_always(0); 5145 return; 5146 } 5147 5148 peer_evt->peer = peer; 5149 peer_evt->vdev = vdev; 5150 peer_evt->vdev_id = vdev->vdev_id; 5151 peer_evt->is_reuse = is_reuse; 5152 peer_evt->peer_ref_count = qdf_atomic_read(&peer->ref_cnt); 5153 peer_evt->vdev_ref_count = qdf_atomic_read(&vdev->ref_cnt); 5154 peer_evt->mac_addr = peer->mac_addr; 5155 peer_evt->vdev_mac_addr = vdev->mac_addr; 5156 5157 dp_cfg_event_record(soc, event, &cfg_evt_desc); 5158 } 5159 5160 static inline void 5161 dp_cfg_event_record_mlo_link_delink_evt(struct dp_soc *soc, 5162 enum dp_cfg_event_type event, 5163 struct dp_peer *mld_peer, 5164 struct dp_peer *link_peer, 5165 uint8_t idx, uint8_t result) 5166 { 5167 union dp_cfg_event_desc cfg_evt_desc = {0}; 5168 struct dp_mlo_add_del_link_desc *mlo_link_delink_evt = 5169 &cfg_evt_desc.mlo_link_delink_evt; 5170 5171 if (qdf_unlikely(event != DP_CFG_EVENT_MLO_ADD_LINK && 5172 event != DP_CFG_EVENT_MLO_DEL_LINK)) { 5173 qdf_assert_always(0); 5174 return; 5175 } 5176 5177 mlo_link_delink_evt->link_peer = link_peer; 5178 mlo_link_delink_evt->mld_peer = mld_peer; 5179 mlo_link_delink_evt->link_mac_addr = link_peer->mac_addr; 5180 mlo_link_delink_evt->mld_mac_addr = mld_peer->mac_addr; 5181 mlo_link_delink_evt->num_links = mld_peer->num_links; 5182 mlo_link_delink_evt->action_result = result; 5183 mlo_link_delink_evt->idx = idx; 5184 5185 dp_cfg_event_record(soc, event, &cfg_evt_desc); 5186 } 5187 5188 static inline void 5189 dp_cfg_event_record_mlo_setup_vdev_update_evt(struct dp_soc *soc, 5190 struct dp_peer *mld_peer, 5191 struct dp_vdev *prev_vdev, 5192 struct dp_vdev *new_vdev) 5193 { 5194 union dp_cfg_event_desc cfg_evt_desc = {0}; 5195 struct dp_mlo_setup_vdev_update_desc *vdev_update_evt = 5196 &cfg_evt_desc.mlo_setup_vdev_update; 5197 5198 vdev_update_evt->mld_peer = mld_peer; 5199 vdev_update_evt->prev_vdev = prev_vdev; 5200 vdev_update_evt->new_vdev = new_vdev; 5201 5202 dp_cfg_event_record(soc, DP_CFG_EVENT_MLO_SETUP_VDEV_UPDATE, 5203 &cfg_evt_desc); 5204 } 5205 5206 static inline void 5207 dp_cfg_event_record_peer_map_unmap_evt(struct dp_soc *soc, 5208 enum dp_cfg_event_type event, 5209 struct dp_peer *peer, 5210 uint8_t *mac_addr, 5211 uint8_t is_ml_peer, 5212 uint16_t peer_id, uint16_t ml_peer_id, 5213 uint16_t hw_peer_id, uint8_t vdev_id) 5214 { 5215 union dp_cfg_event_desc cfg_evt_desc = {0}; 5216 struct dp_rx_peer_map_unmap_desc *peer_map_unmap_evt = 5217 &cfg_evt_desc.peer_map_unmap_evt; 5218 5219 if (qdf_unlikely(event != DP_CFG_EVENT_PEER_MAP && 5220 event != DP_CFG_EVENT_PEER_UNMAP && 5221 event != DP_CFG_EVENT_MLO_PEER_MAP && 5222 event != DP_CFG_EVENT_MLO_PEER_UNMAP)) { 5223 qdf_assert_always(0); 5224 return; 5225 } 5226 5227 peer_map_unmap_evt->peer_id = peer_id; 5228 peer_map_unmap_evt->ml_peer_id = ml_peer_id; 5229 peer_map_unmap_evt->hw_peer_id = hw_peer_id; 5230 peer_map_unmap_evt->vdev_id = vdev_id; 5231 /* Peer may be NULL at times, but its not an issue. */ 5232 peer_map_unmap_evt->peer = peer; 5233 peer_map_unmap_evt->is_ml_peer = is_ml_peer; 5234 qdf_mem_copy(&peer_map_unmap_evt->mac_addr.raw, mac_addr, 5235 QDF_MAC_ADDR_SIZE); 5236 5237 dp_cfg_event_record(soc, event, &cfg_evt_desc); 5238 } 5239 5240 static inline void 5241 dp_cfg_event_record_peer_setup_evt(struct dp_soc *soc, 5242 enum dp_cfg_event_type event, 5243 struct dp_peer *peer, 5244 struct dp_vdev *vdev, 5245 uint8_t vdev_id, 5246 struct cdp_peer_setup_info *peer_setup_info) 5247 { 5248 union dp_cfg_event_desc cfg_evt_desc = {0}; 5249 struct dp_peer_setup_desc *peer_setup_evt = 5250 &cfg_evt_desc.peer_setup_evt; 5251 5252 if (qdf_unlikely(event != DP_CFG_EVENT_PEER_SETUP && 5253 event != DP_CFG_EVENT_MLO_SETUP)) { 5254 qdf_assert_always(0); 5255 return; 5256 } 5257 5258 peer_setup_evt->peer = peer; 5259 peer_setup_evt->vdev = vdev; 5260 if (vdev) 5261 peer_setup_evt->vdev_ref_count = qdf_atomic_read(&vdev->ref_cnt); 5262 peer_setup_evt->mac_addr = peer->mac_addr; 5263 peer_setup_evt->vdev_id = vdev_id; 5264 if (peer_setup_info) { 5265 peer_setup_evt->is_first_link = peer_setup_info->is_first_link; 5266 peer_setup_evt->is_primary_link = peer_setup_info->is_primary_link; 5267 qdf_mem_copy(peer_setup_evt->mld_mac_addr.raw, 5268 peer_setup_info->mld_peer_mac, 5269 QDF_MAC_ADDR_SIZE); 5270 } 5271 5272 dp_cfg_event_record(soc, event, &cfg_evt_desc); 5273 } 5274 #else 5275 5276 static inline void 5277 dp_cfg_event_record_vdev_evt(struct dp_soc *soc, enum dp_cfg_event_type event, 5278 struct dp_vdev *vdev) 5279 { 5280 } 5281 5282 static inline void 5283 dp_cfg_event_record_peer_evt(struct dp_soc *soc, enum dp_cfg_event_type event, 5284 struct dp_peer *peer, struct dp_vdev *vdev, 5285 uint8_t is_reuse) 5286 { 5287 } 5288 5289 static inline void 5290 dp_cfg_event_record_mlo_link_delink_evt(struct dp_soc *soc, 5291 enum dp_cfg_event_type event, 5292 struct dp_peer *mld_peer, 5293 struct dp_peer *link_peer, 5294 uint8_t idx, uint8_t result) 5295 { 5296 } 5297 5298 static inline void 5299 dp_cfg_event_record_mlo_setup_vdev_update_evt(struct dp_soc *soc, 5300 struct dp_peer *mld_peer, 5301 struct dp_vdev *prev_vdev, 5302 struct dp_vdev *new_vdev) 5303 { 5304 } 5305 5306 static inline void 5307 dp_cfg_event_record_peer_map_unmap_evt(struct dp_soc *soc, 5308 enum dp_cfg_event_type event, 5309 struct dp_peer *peer, 5310 uint8_t *mac_addr, 5311 uint8_t is_ml_peer, 5312 uint16_t peer_id, uint16_t ml_peer_id, 5313 uint16_t hw_peer_id, uint8_t vdev_id) 5314 { 5315 } 5316 5317 static inline void 5318 dp_cfg_event_record_peer_setup_evt(struct dp_soc *soc, 5319 enum dp_cfg_event_type event, 5320 struct dp_peer *peer, 5321 struct dp_vdev *vdev, 5322 uint8_t vdev_id, 5323 struct cdp_peer_setup_info *peer_setup_info) 5324 { 5325 } 5326 #endif 5327 5328 #ifndef WLAN_SOFTUMAC_SUPPORT 5329 /** 5330 * dp_soc_interrupt_detach() - Deregister any allocations done for interrupts 5331 * @txrx_soc: DP SOC handle 5332 * 5333 * Return: none 5334 */ 5335 void dp_soc_interrupt_detach(struct cdp_soc_t *txrx_soc); 5336 #endif 5337 5338 /** 5339 * dp_get_peer_stats()- Get peer stats 5340 * @peer: Datapath peer 5341 * @peer_stats: buffer for peer stats 5342 * 5343 * Return: none 5344 */ 5345 void dp_get_peer_stats(struct dp_peer *peer, 5346 struct cdp_peer_stats *peer_stats); 5347 5348 /** 5349 * dp_get_peer_hw_link_id() - get peer hardware link id 5350 * @soc: soc handle 5351 * @pdev: data path pdev 5352 * 5353 * Return: link_id 5354 */ 5355 static inline int 5356 dp_get_peer_hw_link_id(struct dp_soc *soc, 5357 struct dp_pdev *pdev) 5358 { 5359 if (wlan_cfg_is_peer_link_stats_enabled(soc->wlan_cfg_ctx)) 5360 return soc->arch_ops.get_hw_link_id(pdev); 5361 5362 return 0; 5363 } 5364 #endif /* #ifndef _DP_INTERNAL_H_ */ 5365