1 /* 2 * Copyright (c) 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 any 6 * purpose with or without fee is hereby granted, provided that the above 7 * copyright notice and this permission notice appear in all copies. 8 * 9 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 10 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 11 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 12 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 13 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 14 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 15 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 16 */ 17 18 #ifndef _DP_MON_2_0_H_ 19 #define _DP_MON_2_0_H_ 20 21 #if !defined(DISABLE_MON_CONFIG) 22 #include <qdf_lock.h> 23 #include <dp_types.h> 24 #include <dp_mon.h> 25 #include <dp_mon_filter.h> 26 #include <dp_htt.h> 27 #include <dp_mon.h> 28 #ifdef WLAN_PKT_CAPTURE_TX_2_0 29 #include <dp_tx_mon_2.0.h> 30 #endif 31 #define DP_MON_RING_FILL_LEVEL_DEFAULT 2048 32 #define DP_MON_DATA_BUFFER_SIZE 2048 33 #define DP_MON_DESC_MAGIC 0xdeadabcd 34 #define DP_MON_MAX_STATUS_BUF 1200 35 #define DP_MON_QUEUE_DEPTH_MAX 16 36 #define DP_MON_MSDU_LOGGING 0 37 #define DP_MON_MPDU_LOGGING 1 38 #define DP_MON_DESC_ADDR_MASK 0x000000FFFFFFFFFF 39 #define DP_MON_DESC_ADDR_SHIFT 40 40 #define DP_MON_DESC_FIXED_ADDR_MASK 0xFFFFFF 41 #define DP_MON_DESC_FIXED_ADDR ((uint64_t)DP_MON_DESC_FIXED_ADDR_MASK << \ 42 DP_MON_DESC_COOKIE_LSB) 43 #define DP_MON_DESC_COOKIE_MASK 0xFFFFFF0000000000 44 #define DP_MON_DESC_COOKIE_SHIFT 24 45 #define DP_MON_DESC_COOKIE_LSB 40 46 #define DP_MON_GET_COOKIE(mon_desc) \ 47 ((uint32_t)(((unsigned long long)(mon_desc) & DP_MON_DESC_COOKIE_MASK) \ 48 >> DP_MON_DESC_COOKIE_LSB)) 49 50 #ifdef DP_RX_MON_DESC_64_BIT 51 #define DP_MON_GET_DESC(mon_desc) \ 52 ((struct dp_mon_desc *)(uintptr_t)(((unsigned long long)(mon_desc) & \ 53 DP_MON_DESC_ADDR_MASK) | ((unsigned long long)DP_MON_DESC_FIXED_ADDR))) 54 55 #else 56 #define DP_MON_GET_DESC(mon_desc) \ 57 ((struct dp_mon_desc *)(uintptr_t)(((unsigned long)(mon_desc) & \ 58 DP_MON_DESC_ADDR_MASK))) 59 #endif 60 61 #define DP_MON_DECAP_FORMAT_INVALID 0xff 62 #define DP_MON_MIN_FRAGS_FOR_RESTITCH 2 63 64 #ifdef MONITOR_TLV_RECORDING_ENABLE 65 #define MONITOR_TLV_RECORDING_RX 1 66 #define MONITOR_TLV_RECORDING_TX 2 67 #define MONITOR_TLV_RECORDING_RXTX 3 68 69 #define MAX_TLV_LOGGING_SIZE 1024 70 71 #define MAX_PPDU_START_TLV_NUM 38 72 #define MAX_MPDU_TLV_NUM 160 73 #define MAX_PPDU_END_TLV_NUM 57 74 75 #define MAX_NUM_PPDU_RECORD 4 76 #define MAX_TLVS_PER_PPDU 255 77 78 /* 79 * struct dp_mon_tlv_info - recorded information of each TLV 80 * @tlv_tag: tlv tag 81 * @data: union of struct of fields to be recorded for each TLV 82 * 83 * Tag and its corresponding important fields are stored in this struct 84 */ 85 struct dp_mon_tlv_info { 86 uint32_t tlv_tag:10; 87 union { 88 struct hal_ppdu_start_tlv_record ppdu_start; 89 struct hal_ppdu_start_user_info_tlv_record ppdu_start_user_info; 90 struct hal_mpdu_start_tlv_record mpdu_start; 91 struct hal_mpdu_end_tlv_record mpdu_end; 92 struct hal_header_tlv_record header; 93 struct hal_msdu_end_tlv_record msdu_end; 94 struct hal_mon_buffer_addr_tlv_record mon_buffer_addr; 95 struct hal_phy_location_tlv_record phy_location; 96 struct hal_ppdu_end_user_stats_tlv_record ppdu_end_user_stats; 97 struct hal_pcu_ppdu_end_info_tlv_record pcu_ppdu_end_info; 98 struct hal_phy_rx_ht_sig_tlv_record phy_rx_ht_sig; 99 uint32_t data:22; 100 } data; 101 }; 102 103 /* 104 * struct dp_tx_mon_tlv_info - recorded information of each Tx TLV 105 * @tlv_tag: tlv tag 106 * @data: union of struct of fields to be recorded for each TLV 107 * 108 * Tag and its corresponding important fields are stored in this struct 109 */ 110 111 struct dp_tx_mon_tlv_info { 112 uint32_t tlv_tag:10; 113 union { 114 /*struct of Tx TLVs to be added here*/ 115 uint32_t data:22; 116 } data; 117 }; 118 119 /** 120 * struct dp_mon_tlv_logger - contains indexes and other data of the buffer 121 * @buff: buffer in which TLVs are stored 122 * @curr_ppdu_pos: position of the next ppdu to be written 123 * @ppdu_start_idx: starting index form which PPDU start level TLVs are stored for a ppdu 124 * @mpdu_idx: starting index form which MPDU TLVs are stored for a ppdu 125 * @ppdu_end_idx: starting index form which PPDU end level TLVs are stored for a ppdu 126 * @max_ppdu_start_idx: ending index for PPDU start level TLVs for a ppdu 127 * @max_mpdu_idx: ending index for MPDU level TLVs for a ppdu 128 * @max_ppdu_end_idx: ending index for PPDU end level TLVs for a ppdu 129 * @wrap_flag: flag toggle between consecutive PPDU 130 * @tlv_logging_enable: check is tlv logging is enabled 131 * 132 */ 133 struct dp_mon_tlv_logger { 134 void *buff; 135 uint16_t curr_ppdu_pos; 136 uint16_t ppdu_start_idx; 137 uint16_t mpdu_idx; 138 uint16_t ppdu_end_idx; 139 uint16_t max_ppdu_start_idx; 140 uint16_t max_ppdu_end_idx; 141 uint16_t max_mpdu_idx; 142 uint8_t wrap_flag; 143 bool tlv_logging_enable; 144 }; 145 #endif 146 147 /* monitor frame filter modes */ 148 enum dp_mon_frm_filter_mode { 149 /* mode filter pass */ 150 DP_MON_FRM_FILTER_MODE_FP = 0, 151 /* mode monitor direct */ 152 DP_MON_FRM_FILTER_MODE_MD = 1, 153 /* mode monitor other */ 154 DP_MON_FRM_FILTER_MODE_MO = 2, 155 /* mode filter pass monitor other */ 156 DP_MON_FRM_FILTER_MODE_FP_MO = 3, 157 }; 158 159 /* mpdu filter categories */ 160 enum dp_mpdu_filter_category { 161 /* category filter pass */ 162 DP_MPDU_FILTER_CATEGORY_FP = 0, 163 /* category monitor direct */ 164 DP_MPDU_FILTER_CATEGORY_MD = 1, 165 /* category monitor other */ 166 DP_MPDU_FILTER_CATEGORY_MO = 2, 167 /* category filter pass monitor override */ 168 DP_MPDU_FILTER_CATEGORY_FP_MO = 3, 169 }; 170 171 /** 172 * struct dp_mon_filter_be - Monitor TLV filter 173 * @rx_tlv_filter: Rx MON TLV filter 174 * @tx_tlv_filter: Tx MON TLV filter 175 * @tx_valid: enable/disable Tx Mon TLV filter 176 */ 177 struct dp_mon_filter_be { 178 struct dp_mon_filter rx_tlv_filter; 179 #ifdef WLAN_PKT_CAPTURE_TX_2_0 180 struct htt_tx_ring_tlv_filter tx_tlv_filter; 181 #endif 182 bool tx_valid; 183 }; 184 185 /** 186 * struct dp_mon_desc 187 * 188 * @buf_addr: virtual address 189 * @paddr: physical address 190 * @in_use: desc is in use 191 * @unmapped: used to mark desc an unmapped if the corresponding 192 * nbuf is already unmapped 193 * @cookie_2: unique cookie provided as part of 64 bit cookie to HW 194 * @end_offset: offset in status buffer where DMA ended 195 * @cookie: unique desc identifier 196 * @magic: magic number to validate desc data 197 */ 198 struct dp_mon_desc { 199 uint8_t *buf_addr; 200 qdf_dma_addr_t paddr; 201 uint32_t in_use:1, 202 unmapped:1, 203 cookie_2:24; 204 uint16_t end_offset; 205 uint32_t cookie; 206 uint32_t magic; 207 }; 208 209 /** 210 * struct dp_mon_desc_list_elem_t 211 * @next: Next pointer to form free list 212 * @mon_desc: DP mon descriptor 213 */ 214 union dp_mon_desc_list_elem_t { 215 union dp_mon_desc_list_elem_t *next; 216 struct dp_mon_desc mon_desc; 217 }; 218 219 /** 220 * struct dp_mon_desc_pool - monitor desc pool 221 * @pool_size: number of descriptor in the pool 222 * @array: pointer to array of descriptor 223 * @freelist: pointer to free descriptor list 224 * @lock: Protection for the descriptor pool 225 * @owner: owner for nbuf 226 * @buf_size: Buffer size 227 * @buf_alignment: Buffer alignment 228 * @pf_cache: page frag cache 229 */ 230 struct dp_mon_desc_pool { 231 uint32_t pool_size; 232 union dp_mon_desc_list_elem_t *array; 233 union dp_mon_desc_list_elem_t *freelist; 234 qdf_spinlock_t lock; 235 uint8_t owner; 236 uint16_t buf_size; 237 uint8_t buf_alignment; 238 qdf_frag_cache_t pf_cache; 239 }; 240 241 /* 242 * NB: intentionally not using kernel-doc comment because the kernel-doc 243 * script does not handle the TAILQ_HEAD macro 244 * struct dp_mon_pdev_be - BE specific monitor pdev object 245 * @mon_pdev: monitor pdev structure 246 * @filter_be: filters sent to fw 247 * @tx_mon_mode: tx monitor mode 248 * @tx_mon_filter_length: tx monitor filter length 249 * @tx_monitor_be: pointer to tx monitor be structure 250 * @tx_stats: tx monitor drop stats 251 * @rx_mon_wq_lock: Rx mon workqueue lock 252 * @rx_mon_workqueue: Rx mon workqueue 253 * @rx_mon_work: Rx mon work 254 * @rx_mon_queue: RxMON queue 255 * @rx_mon_free_queue: RxMON ppdu info free element queue 256 * @ppdu_info_lock: RxPPDU ppdu info queue lock 257 * @rx_mon_queue_depth: RxMON queue depth 258 * @ppdu_info_cache: PPDU info cache 259 * @desc_count: reaped status desc count 260 * @status: reaped status buffer per ppdu 261 * @lite_mon_rx_config: rx litemon config 262 * @lite_mon_tx_config: tx litemon config 263 * @prev_rxmon_desc: prev destination desc 264 * @prev_rxmon_cookie: prev rxmon cookie 265 * @prev_rxmon_pkt_desc: prev packet buff desc 266 * @prev_rxmon_pkt_cookie: prev packet buff desc cookie 267 * @total_free_elem: total free element in queue 268 * @rx_tlv_logger: Rx TLV logger struct 269 */ 270 struct dp_mon_pdev_be { 271 struct dp_mon_pdev mon_pdev; 272 struct dp_mon_filter_be **filter_be; 273 #ifdef WLAN_PKT_CAPTURE_TX_2_0 274 uint8_t tx_mon_mode; 275 uint8_t tx_mon_filter_length; 276 struct dp_pdev_tx_monitor_be tx_monitor_be; 277 struct dp_tx_monitor_drop_stats tx_stats; 278 #endif 279 #if defined(WLAN_PKT_CAPTURE_RX_2_0) && defined(QCA_MONITOR_2_0_PKT_SUPPORT) 280 qdf_spinlock_t rx_mon_wq_lock; 281 qdf_workqueue_t *rx_mon_workqueue; 282 qdf_work_t rx_mon_work; 283 284 TAILQ_HEAD(, hal_rx_ppdu_info) rx_mon_queue; 285 TAILQ_HEAD(, hal_rx_ppdu_info) rx_mon_free_queue; 286 qdf_spinlock_t ppdu_info_lock; 287 qdf_kmem_cache_t ppdu_info_cache; 288 #endif 289 uint16_t rx_mon_queue_depth; 290 uint16_t desc_count; 291 struct dp_mon_desc *status[DP_MON_MAX_STATUS_BUF]; 292 #ifdef QCA_SUPPORT_LITE_MONITOR 293 struct dp_lite_mon_rx_config *lite_mon_rx_config; 294 struct dp_lite_mon_tx_config *lite_mon_tx_config; 295 #endif 296 void *prev_rxmon_desc; 297 uint32_t prev_rxmon_cookie; 298 void *prev_rxmon_pkt_desc; 299 uint32_t prev_rxmon_pkt_cookie; 300 uint32_t total_free_elem; 301 #ifdef MONITOR_TLV_RECORDING_ENABLE 302 struct dp_mon_tlv_logger *rx_tlv_log; 303 struct dp_mon_tlv_logger *tx_tlv_log; 304 #endif 305 }; 306 307 /** 308 * struct dp_mon_soc_be - BE specific monitor soc 309 * @mon_soc: Monitor soc structure 310 * @tx_mon_buf_ring: TxMon replenish ring 311 * @tx_mon_dst_ring: TxMon Destination ring 312 * @tx_desc_mon: descriptor pool for tx mon src ring 313 * @rx_desc_mon: descriptor pool for rx mon src ring 314 * @rx_mon_ring_fill_level: rx mon ring refill level 315 * @tx_mon_ring_fill_level: tx mon ring refill level 316 * @tx_low_thresh_intrs: number of tx mon low threshold interrupts received 317 * @rx_low_thresh_intrs: number of rx mon low threshold interrupts received 318 * @is_dp_mon_soc_initialized: flag to indicate soc is initialized 319 */ 320 struct dp_mon_soc_be { 321 struct dp_mon_soc mon_soc; 322 /* Source ring for Tx monitor */ 323 struct dp_srng tx_mon_buf_ring; 324 struct dp_srng tx_mon_dst_ring[MAX_NUM_LMAC_HW]; 325 326 /* Sw descriptor pool for tx mon source ring */ 327 struct dp_mon_desc_pool tx_desc_mon; 328 /* Sw descriptor pool for rx mon source ring */ 329 struct dp_mon_desc_pool rx_desc_mon; 330 331 uint16_t rx_mon_ring_fill_level; 332 uint16_t tx_mon_ring_fill_level; 333 uint32_t tx_low_thresh_intrs; 334 uint32_t rx_low_thresh_intrs; 335 336 bool is_dp_mon_soc_initialized; 337 }; 338 #endif 339 340 /** 341 * dp_mon_desc_pool_init() - Monitor descriptor pool init 342 * @mon_desc_pool: mon desc pool 343 * @pool_size: Pool size 344 * 345 * Return: non-zero for failure, zero for success 346 */ 347 QDF_STATUS 348 dp_mon_desc_pool_init(struct dp_mon_desc_pool *mon_desc_pool, 349 uint32_t pool_size); 350 351 /** 352 * dp_mon_desc_pool_deinit()- monitor descriptor pool deinit 353 * @mon_desc_pool: mon desc pool 354 * 355 * Return: None 356 * 357 */ 358 void dp_mon_desc_pool_deinit(struct dp_mon_desc_pool *mon_desc_pool); 359 360 /** 361 * dp_mon_desc_pool_free()- monitor descriptor pool free 362 * @soc: DP soc handle 363 * @mon_desc_pool: mon desc pool 364 * @ctx_type: DP context type 365 * 366 * Return: None 367 * 368 */ 369 void dp_mon_desc_pool_free(struct dp_soc *soc, 370 struct dp_mon_desc_pool *mon_desc_pool, 371 enum dp_ctxt_type ctx_type); 372 373 /** 374 * dp_mon_desc_pool_alloc() - Monitor descriptor pool alloc 375 * @soc: DP soc handle 376 * @ctx_type: DP context type 377 * @pool_size: Pool size 378 * @mon_desc_pool: mon desc pool 379 * 380 * Return: non-zero for failure, zero for success 381 */ 382 QDF_STATUS dp_mon_desc_pool_alloc(struct dp_soc *soc, 383 enum dp_ctxt_type ctx_type, 384 uint32_t pool_size, 385 struct dp_mon_desc_pool *mon_desc_pool); 386 387 /** 388 * dp_mon_pool_frag_unmap_and_free() - free the mon desc frag called during 389 * de-initialization of wifi module. 390 * 391 * @dp_soc: DP soc handle 392 * @mon_desc_pool: monitor descriptor pool pointer 393 * 394 * Return: None 395 */ 396 void dp_mon_pool_frag_unmap_and_free(struct dp_soc *dp_soc, 397 struct dp_mon_desc_pool *mon_desc_pool); 398 399 /** 400 * dp_mon_buffers_replenish() - replenish monitor ring with nbufs 401 * 402 * @dp_soc: core txrx main context 403 * @dp_mon_srng: dp monitor circular ring 404 * @mon_desc_pool: Pointer to free mon descriptor pool 405 * @num_req_buffers: number of buffer to be replenished 406 * @desc_list: list of descs if called from dp_rx_process 407 * or NULL during dp rx initialization or out of buffer 408 * interrupt. 409 * @tail: tail of descs list 410 * @replenish_cnt_ref: pointer to update replenish_cnt 411 * 412 * Return: return success or failure 413 */ 414 QDF_STATUS dp_mon_buffers_replenish(struct dp_soc *dp_soc, 415 struct dp_srng *dp_mon_srng, 416 struct dp_mon_desc_pool *mon_desc_pool, 417 uint32_t num_req_buffers, 418 union dp_mon_desc_list_elem_t **desc_list, 419 union dp_mon_desc_list_elem_t **tail, 420 uint32_t *replenish_cnt_ref); 421 422 /** 423 * dp_mon_filter_show_tx_filter_be() - Show the set filters 424 * @mode: The filter modes 425 * @filter: tlv filter 426 */ 427 void dp_mon_filter_show_tx_filter_be(enum dp_mon_filter_mode mode, 428 struct dp_mon_filter_be *filter); 429 430 /** 431 * dp_mon_filter_show_rx_filter_be() - Show the set filters 432 * @mode: The filter modes 433 * @filter: tlv filter 434 */ 435 void dp_mon_filter_show_rx_filter_be(enum dp_mon_filter_mode mode, 436 struct dp_mon_filter_be *filter); 437 438 /** 439 * dp_vdev_set_monitor_mode_buf_rings_tx_2_0() - Add buffers to tx ring 440 * @pdev: Pointer to dp_pdev object 441 * @num_of_buffers: Number of buffers to allocate 442 * 443 * Return: QDF_STATUS 444 */ 445 QDF_STATUS dp_vdev_set_monitor_mode_buf_rings_tx_2_0(struct dp_pdev *pdev, 446 uint16_t num_of_buffers); 447 448 /** 449 * dp_vdev_set_monitor_mode_buf_rings_rx_2_0() - Add buffers to rx ring 450 * @pdev: Pointer to dp_pdev object 451 * 452 * Return: QDF_STATUS 453 */ 454 QDF_STATUS dp_vdev_set_monitor_mode_buf_rings_rx_2_0(struct dp_pdev *pdev); 455 456 #ifdef QCA_ENHANCED_STATS_SUPPORT 457 /** 458 * dp_mon_get_puncture_type() - Get puncture type 459 * @puncture_pattern: puncture bitmap 460 * @bw: Bandwidth 461 */ 462 enum cdp_punctured_modes 463 dp_mon_get_puncture_type(uint16_t puncture_pattern, uint8_t bw); 464 #endif 465 466 /** 467 * dp_mon_desc_get() - get monitor sw descriptor 468 * 469 * @cookie: cookie 470 * 471 * Return: dp_mon_desc 472 */ 473 static inline 474 struct dp_mon_desc *dp_mon_desc_get(uint64_t *cookie) 475 { 476 return (struct dp_mon_desc *)cookie; 477 } 478 479 /** 480 * __dp_mon_add_to_free_desc_list() - Adds to a local free descriptor list 481 * 482 * @head: pointer to the head of local free list 483 * @tail: pointer to the tail of local free list 484 * @new: new descriptor that is added to the free list 485 * @func_name: caller func name 486 * 487 * Return: void 488 */ 489 static inline 490 void __dp_mon_add_to_free_desc_list(union dp_mon_desc_list_elem_t **head, 491 union dp_mon_desc_list_elem_t **tail, 492 struct dp_mon_desc *new, 493 const char *func_name) 494 { 495 if (!(head && new)) 496 return; 497 498 new->buf_addr = NULL; 499 new->in_use = 0; 500 501 ((union dp_mon_desc_list_elem_t *)new)->next = *head; 502 *head = (union dp_mon_desc_list_elem_t *)new; 503 /* reset tail if head->next is NULL */ 504 if (!*tail || !(*head)->next) 505 *tail = *head; 506 } 507 508 #define dp_mon_add_to_free_desc_list(head, tail, new) \ 509 __dp_mon_add_to_free_desc_list(head, tail, new, __func__) 510 511 /** 512 * dp_mon_add_desc_list_to_free_list() - append unused desc_list back to 513 * freelist. 514 * 515 * @soc: core txrx main context 516 * @local_desc_list: local desc list provided by the caller 517 * @tail: attach the point to last desc of local desc list 518 * @mon_desc_pool: monitor descriptor pool pointer 519 */ 520 521 void 522 dp_mon_add_desc_list_to_free_list(struct dp_soc *soc, 523 union dp_mon_desc_list_elem_t **local_desc_list, 524 union dp_mon_desc_list_elem_t **tail, 525 struct dp_mon_desc_pool *mon_desc_pool); 526 527 /** 528 * dp_rx_mon_add_frag_to_skb() - Add page frag to skb 529 * 530 * @ppdu_info: PPDU status info 531 * @nbuf: SKB to which frag need to be added 532 * @status_frag: Frag to add 533 * 534 * Return: void 535 */ 536 static inline void 537 dp_rx_mon_add_frag_to_skb(struct hal_rx_ppdu_info *ppdu_info, 538 qdf_nbuf_t nbuf, 539 qdf_frag_t status_frag) 540 { 541 uint16_t num_frags; 542 543 num_frags = qdf_nbuf_get_nr_frags(nbuf); 544 if (num_frags < QDF_NBUF_MAX_FRAGS) { 545 qdf_nbuf_add_rx_frag(status_frag, nbuf, 546 ppdu_info->data - (unsigned char *)status_frag, 547 ppdu_info->hdr_len, 548 RX_MONITOR_BUFFER_SIZE, 549 false); 550 } else { 551 dp_mon_err("num_frags exceeding MAX frags"); 552 qdf_assert_always(0); 553 } 554 } 555 556 #if !defined(DISABLE_MON_CONFIG) && (defined(WLAN_PKT_CAPTURE_TX_2_0) || \ 557 defined(WLAN_PKT_CAPTURE_RX_2_0)) 558 /** 559 * dp_mon_get_context_size_be() - get BE specific size for mon pdev/soc 560 * @context_type: context type for which the size is needed 561 * 562 * Return: size in bytes for the context_type 563 */ 564 static inline 565 qdf_size_t dp_mon_get_context_size_be(enum dp_context_type context_type) 566 { 567 switch (context_type) { 568 case DP_CONTEXT_TYPE_MON_SOC: 569 return sizeof(struct dp_mon_soc_be); 570 case DP_CONTEXT_TYPE_MON_PDEV: 571 return sizeof(struct dp_mon_pdev_be); 572 default: 573 return 0; 574 } 575 } 576 #endif 577 578 /** 579 * dp_get_be_mon_soc_from_dp_mon_soc() - get dp_mon_soc_be from dp_mon_soc 580 * @soc: dp_mon_soc pointer 581 * 582 * Return: dp_mon_soc_be pointer 583 */ 584 static inline 585 struct dp_mon_soc_be *dp_get_be_mon_soc_from_dp_mon_soc(struct dp_mon_soc *soc) 586 { 587 return (struct dp_mon_soc_be *)soc; 588 } 589 590 /** 591 * dp_get_be_mon_pdev_from_dp_mon_pdev() - get dp_mon_pdev_be from dp_mon_pdev 592 * @mon_pdev: dp_mon_pdev pointer 593 * 594 * Return: dp_mon_pdev_be pointer 595 */ 596 static inline 597 struct dp_mon_pdev_be *dp_get_be_mon_pdev_from_dp_mon_pdev(struct dp_mon_pdev *mon_pdev) 598 { 599 return (struct dp_mon_pdev_be *)mon_pdev; 600 } 601 602 #ifdef QCA_ENHANCED_STATS_SUPPORT 603 /* 604 * dp_enable_enhanced_stats_2_0() - BE Wrapper to enable stats 605 * @soc: Datapath soc handle 606 * @pdev_id: Pdev Id on which stats will get enable 607 * 608 * Return: status success/failure 609 */ 610 QDF_STATUS 611 dp_enable_enhanced_stats_2_0(struct cdp_soc_t *soc, uint8_t pdev_id); 612 613 /* 614 * dp_disable_enhanced_stats_2_0() - BE Wrapper to disable stats 615 * @soc: Datapath soc handle 616 * @pdev_id: Pdev Id on which stats will get disable 617 * 618 * Return: status success/failure 619 */ 620 QDF_STATUS 621 dp_disable_enhanced_stats_2_0(struct cdp_soc_t *soc, uint8_t pdev_id); 622 #endif /* QCA_ENHANCED_STATS_SUPPORT */ 623 624 #ifdef WLAN_PKT_CAPTURE_RX_2_0 625 static inline unsigned long long 626 dp_mon_get_debug_desc_addr(union dp_mon_desc_list_elem_t **desc_list) 627 { 628 unsigned long long desc; 629 630 desc = (unsigned long)&((*desc_list)->mon_desc); 631 desc = (unsigned long long)((unsigned long long)desc & DP_MON_DESC_ADDR_MASK); 632 desc = (desc | ((unsigned long long)(*desc_list)->mon_desc.cookie_2 << DP_MON_DESC_ADDR_SHIFT)); 633 return desc; 634 } 635 #else 636 static inline unsigned long long 637 dp_mon_get_debug_desc_addr(union dp_mon_desc_list_elem_t **desc_list) 638 { 639 unsigned long long desc = (unsigned long long)&((*desc_list)->mon_desc); 640 return desc; 641 } 642 #endif 643 #endif /* _DP_MON_2_0_H_ */ 644