1 /* 2 * Copyright (c) 2016-2021, The Linux Foundation. All rights reserved. 3 * Copyright (c) 2021-2022 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_H_ 19 #define _DP_MON_H_ 20 21 #include "qdf_trace.h" 22 #include "dp_internal.h" 23 #include "dp_types.h" 24 #include "dp_htt.h" 25 26 #include <dp_mon_filter.h> 27 #ifdef WLAN_TX_PKT_CAPTURE_ENH 28 #include "dp_tx_capture.h" 29 #endif 30 31 #define DP_INTR_POLL_TIMER_MS 5 32 33 #define MON_VDEV_TIMER_INIT 0x1 34 #define MON_VDEV_TIMER_RUNNING 0x2 35 36 /* Budget to reap monitor status ring */ 37 #define DP_MON_REAP_BUDGET 1024 38 #define MON_BUF_MIN_ENTRIES 64 39 40 #define RNG_ERR "SRNG setup failed for" 41 #define dp_mon_info(params...) \ 42 __QDF_TRACE_FL(QDF_TRACE_LEVEL_INFO_HIGH, QDF_MODULE_ID_MON, ## params) 43 #define dp_mon_err(params...) QDF_TRACE_ERROR(QDF_MODULE_ID_MON, params) 44 #define dp_mon_debug(params...) QDF_TRACE_DEBUG(QDF_MODULE_ID_MON, params) 45 #define dp_mon_warn(params...) QDF_TRACE_WARN(QDF_MODULE_ID_MON, params) 46 47 #ifdef QCA_ENHANCED_STATS_SUPPORT 48 typedef struct dp_peer_extd_tx_stats dp_mon_peer_tx_stats; 49 typedef struct dp_peer_extd_rx_stats dp_mon_peer_rx_stats; 50 51 #define DP_UPDATE_MON_STATS(_tgtobj, _srcobj) \ 52 DP_UPDATE_EXTD_STATS(_tgtobj, _srcobj) 53 #endif 54 55 #ifndef WLAN_TX_PKT_CAPTURE_ENH 56 struct dp_pdev_tx_capture { 57 }; 58 59 struct dp_peer_tx_capture { 60 }; 61 #endif 62 63 #ifndef WLAN_TX_PKT_CAPTURE_ENH 64 static inline void 65 dp_process_ppdu_stats_update_failed_bitmap(struct dp_pdev *pdev, 66 void *data, 67 uint32_t ppdu_id, 68 uint32_t size) 69 { 70 } 71 #endif 72 73 #ifdef DP_CON_MON_MSI_ENABLED 74 static inline bool dp_is_monitor_mode_using_poll(struct dp_soc *soc) 75 { 76 return false; 77 } 78 #else 79 static inline bool dp_is_monitor_mode_using_poll(struct dp_soc *soc) 80 { 81 return true; 82 } 83 #endif 84 85 /* 86 * dp_mon_soc_attach() - DP monitor soc attach 87 * @soc: Datapath SOC handle 88 * 89 * Return: QDF_STATUS_SUCCESS: Success 90 * QDF_STATUS_E_NOMEM: Error 91 */ 92 QDF_STATUS dp_mon_soc_attach(struct dp_soc *soc); 93 94 /* 95 * dp_mon_soc_detach() - DP monitor soc detach 96 * @soc: Datapath SOC handle 97 * 98 * Return: QDF_STATUS_SUCCESS: Success 99 * QDF_STATUS_E_FAILURE: Error 100 */ 101 QDF_STATUS dp_mon_soc_detach(struct dp_soc *soc); 102 103 /* 104 * dp_mon_soc_cfg_init() - DP monitor soc config init 105 * @soc: Datapath SOC handle 106 * 107 * Return: QDF_STATUS_SUCCESS: Success 108 * QDF_STATUS_E_FAILURE: Error 109 */ 110 QDF_STATUS dp_mon_soc_cfg_init(struct dp_soc *soc); 111 112 /* 113 * dp_mon_pdev_attach() - DP monitor pdev attach 114 * @pdev: Datapath pdev handle 115 * 116 * Return: QDF_STATUS_SUCCESS: Success 117 * QDF_STATUS_E_NOMEM: Error 118 */ 119 QDF_STATUS dp_mon_pdev_attach(struct dp_pdev *pdev); 120 121 /* 122 * dp_mon_pdev_detach() - DP monitor pdev detach 123 * @pdev: Datapath pdev handle 124 * 125 * Return: QDF_STATUS_SUCCESS: Success 126 * QDF_STATUS_E_FAILURE: Error 127 */ 128 QDF_STATUS dp_mon_pdev_detach(struct dp_pdev *pdev); 129 130 /* 131 * dp_mon_pdev_init() - DP monitor pdev init 132 * @pdev: Datapath pdev handle 133 * 134 * Return: QDF_STATUS_SUCCESS: Success 135 * QDF_STATUS_E_FAILURE: Error 136 */ 137 QDF_STATUS dp_mon_pdev_init(struct dp_pdev *pdev); 138 139 /* 140 * dp_mon_pdev_deinit() - DP monitor pdev deinit 141 * @pdev: Datapath pdev handle 142 * 143 * Return: QDF_STATUS_SUCCESS: Success 144 * QDF_STATUS_E_FAILURE: Error 145 */ 146 QDF_STATUS dp_mon_pdev_deinit(struct dp_pdev *pdev); 147 148 /* 149 * dp_mon_vdev_attach() - DP monitor vdev attach 150 * @vdev: Datapath vdev handle 151 * 152 * Return: QDF_STATUS_SUCCESS: Success 153 * QDF_STATUS_E_NOMEM: Error 154 */ 155 QDF_STATUS dp_mon_vdev_attach(struct dp_vdev *vdev); 156 157 /* 158 * dp_mon_vdev_detach() - DP monitor vdev detach 159 * @vdev: Datapath vdev handle 160 * 161 * Return: QDF_STATUS_SUCCESS: Success 162 * QDF_STATUS_E_FAILURE: Error 163 */ 164 QDF_STATUS dp_mon_vdev_detach(struct dp_vdev *vdev); 165 166 /* 167 * dp_mon_peer_attach() - DP monitor peer attach 168 * @peer: Datapath peer handle 169 * 170 * Return: QDF_STATUS_SUCCESS: Success 171 * QDF_STATUS_E_NOMEM: Error 172 */ 173 #if defined(WLAN_TX_PKT_CAPTURE_ENH) || defined(FEATURE_PERPKT_INFO) 174 QDF_STATUS dp_mon_peer_attach(struct dp_peer *peer); 175 #else 176 static inline 177 QDF_STATUS dp_mon_peer_attach(struct dp_peer *peer) 178 { 179 return QDF_STATUS_SUCCESS; 180 } 181 #endif 182 183 /* 184 * dp_mon_peer_detach() - DP monitor peer detach 185 * @peer: Datapath peer handle 186 * 187 * Return: QDF_STATUS_SUCCESS: Success 188 * QDF_STATUS_E_FAILURE: Error 189 */ 190 QDF_STATUS dp_mon_peer_detach(struct dp_peer *peer); 191 192 /* 193 * dp_mon_peer_get_rdkstats_ctx() - Get rdk stats context from monitor peer 194 * @peer: Datapath peer handle 195 * 196 * Return: rdkstats_ctx 197 */ 198 struct cdp_peer_rate_stats_ctx *dp_mon_peer_get_rdkstats_ctx(struct dp_peer *peer); 199 200 #ifdef QCA_ENHANCED_STATS_SUPPORT 201 /* 202 * dp_mon_peer_reset_stats() - Reset monitor peer stats 203 * @peer: Datapath peer handle 204 * 205 * Return: none 206 */ 207 void dp_mon_peer_reset_stats(struct dp_peer *peer); 208 209 /* 210 * dp_mon_peer_get_stats() - Get monitor peer stats 211 * 212 * @peer: Datapath peer handle 213 * @arg: Pointer to stats struct 214 * @type: Update type 215 * 216 * Return: none 217 */ 218 void dp_mon_peer_get_stats(struct dp_peer *peer, void *arg, 219 enum cdp_stat_update_type type); 220 221 /* 222 * dp_mon_invalid_peer_update_pdev_stats() - Update pdev stats from 223 * invalid monitor peer 224 * @pdev: Datapath pdev handle 225 * 226 * Return: none 227 */ 228 void dp_mon_invalid_peer_update_pdev_stats(struct dp_pdev *pdev); 229 230 /* 231 * dp_mon_peer_get_stats_param() - Get stats param value from monitor peer 232 * @peer: Datapath peer handle 233 * @type: Stats type requested 234 * @buf: Pointer to buffer for stats param 235 * 236 * Return: QDF_STATUS 237 */ 238 QDF_STATUS dp_mon_peer_get_stats_param(struct dp_peer *peer, 239 enum cdp_peer_stats_type type, 240 cdp_peer_stats_param_t *buf); 241 #else 242 static inline void dp_mon_peer_reset_stats(struct dp_peer *peer) 243 { 244 } 245 246 static inline 247 void dp_mon_peer_get_stats(struct dp_peer *peer, void *arg, 248 enum cdp_stat_update_type type) 249 { 250 } 251 252 static inline void dp_mon_invalid_peer_update_pdev_stats(struct dp_pdev *pdev) 253 { 254 } 255 256 static inline 257 QDF_STATUS dp_mon_peer_get_stats_param(struct dp_peer *peer, 258 enum cdp_peer_stats_type type, 259 cdp_peer_stats_param_t *buf) 260 { 261 return QDF_STATUS_E_FAILURE; 262 } 263 #endif 264 265 /* 266 * dp_mon_cdp_ops_register() - Register monitor cdp ops 267 * @soc: Datapath soc handle 268 * 269 */ 270 void dp_mon_cdp_ops_register(struct dp_soc *soc); 271 272 /* 273 * dp_mon_cdp_ops_deregister() - deregister monitor cdp ops 274 * @soc: Datapath soc handle 275 * 276 */ 277 void dp_mon_cdp_ops_deregister(struct dp_soc *soc); 278 279 /* 280 * dp_mon_intr_ops_deregister() - deregister monitor interrupt ops 281 * @soc: Datapath soc handle 282 * 283 */ 284 void dp_mon_intr_ops_deregister(struct dp_soc *soc); 285 286 /* 287 * dp_mon_feature_ops_deregister() - deregister monitor feature ops 288 * @soc: Datapath soc handle 289 * 290 */ 291 void dp_mon_feature_ops_deregister(struct dp_soc *soc); 292 293 /* 294 * dp_mon_ops_free() - free monitor ops 295 * @soc: Datapath soc handle 296 * 297 */ 298 void dp_mon_ops_free(struct dp_soc *soc); 299 300 /* 301 * dp_mon_ops_register() - Register monitor ops 302 * @soc: Datapath soc handle 303 * 304 */ 305 void dp_mon_ops_register(struct dp_soc *soc); 306 307 #ifndef DISABLE_MON_CONFIG 308 void dp_mon_register_intr_ops(struct dp_soc *soc); 309 #else 310 static inline void dp_mon_register_intr_ops(struct dp_soc *soc) 311 {} 312 #endif 313 314 /* 315 * dp_mon_htt_srng_setup() - DP mon htt srng setup 316 * @soc: Datapath soc handle 317 * @pdev: Datapath pdev handle 318 * @mac_id: mac id 319 * @mac_for_pdev: mac id mapped pdev 320 * 321 * Return: QDF_STATUS_SUCCESS: Success 322 * QDF_STATUS_E_FAILURE: Error 323 */ 324 QDF_STATUS dp_mon_htt_srng_setup(struct dp_soc *soc, 325 struct dp_pdev *pdev, 326 int mac_id, 327 int mac_for_pdev); 328 329 /* 330 * dp_config_debug_sniffer()- API to enable/disable debug sniffer 331 * @pdev: DP_PDEV handle 332 * @val: user provided value 333 * 334 * Return: 0 for success. nonzero for failure. 335 */ 336 #if defined(QCA_MCOPY_SUPPORT) || defined(QCA_TX_CAPTURE_SUPPORT) 337 QDF_STATUS 338 dp_config_debug_sniffer(struct dp_pdev *pdev, int val); 339 #else 340 static inline QDF_STATUS 341 dp_config_debug_sniffer(struct dp_pdev *pdev, int val) { 342 return QDF_STATUS_E_INVAL; 343 } 344 #endif /* QCA_MCOPY_SUPPORT || QCA_TX_CAPTURE_SUPPORT */ 345 346 /* 347 * dp_htt_ppdu_stats_attach() - attach resources for HTT PPDU stats processing 348 * @pdev: Datapath PDEV handle 349 * 350 * Return: QDF_STATUS_SUCCESS: Success 351 * QDF_STATUS_E_NOMEM: Error 352 */ 353 QDF_STATUS dp_htt_ppdu_stats_attach(struct dp_pdev *pdev); 354 355 /* 356 * dp_htt_ppdu_stats_detach() - detach stats resources 357 * @pdev: Datapath PDEV handle 358 * 359 * Return: void 360 */ 361 void dp_htt_ppdu_stats_detach(struct dp_pdev *pdev); 362 363 /* 364 *dp_set_bpr_enable() - API to enable/disable bpr feature 365 *@pdev_handle: DP_PDEV handle. 366 *@val: Provided value. 367 * 368 *Return: 0 for success. nonzero for failure. 369 */ 370 #ifdef QCA_SUPPORT_BPR 371 QDF_STATUS 372 dp_set_bpr_enable(struct dp_pdev *pdev, int val); 373 #endif 374 375 #ifdef ATH_SUPPORT_NAC 376 int dp_set_filter_neigh_peers(struct dp_pdev *pdev, 377 bool val); 378 #endif /* ATH_SUPPORT_NAC */ 379 380 #ifdef WLAN_ATF_ENABLE 381 void dp_set_atf_stats_enable(struct dp_pdev *pdev, bool value); 382 #endif 383 384 /** 385 * dp_set_bsscolor() - sets bsscolor for tx capture 386 * @pdev: Datapath PDEV handle 387 * @bsscolor: new bsscolor 388 */ 389 void 390 dp_mon_set_bsscolor(struct dp_pdev *pdev, uint8_t bsscolor); 391 392 /** 393 * dp_pdev_get_filter_ucast_data() - get DP PDEV monitor ucast filter 394 * @soc : data path soc handle 395 * @pdev_id : pdev_id 396 * Return: true on ucast filter flag set 397 */ 398 bool dp_pdev_get_filter_ucast_data(struct cdp_pdev *pdev_handle); 399 400 /** 401 * dp_pdev_get_filter_mcast_data() - get DP PDEV monitor mcast filter 402 * @pdev_handle: Datapath PDEV handle 403 * Return: true on mcast filter flag set 404 */ 405 bool dp_pdev_get_filter_mcast_data(struct cdp_pdev *pdev_handle); 406 407 /** 408 * dp_pdev_get_filter_non_data() - get DP PDEV monitor non_data filter 409 * @pdev_handle: Datapath PDEV handle 410 * Return: true on non data filter flag set 411 */ 412 bool dp_pdev_get_filter_non_data(struct cdp_pdev *pdev_handle); 413 414 /* 415 * dp_set_pktlog_wifi3() - attach txrx vdev 416 * @pdev: Datapath PDEV handle 417 * @event: which event's notifications are being subscribed to 418 * @enable: WDI event subscribe or not. (True or False) 419 * 420 * Return: Success, NULL on failure 421 */ 422 #ifdef WDI_EVENT_ENABLE 423 int dp_set_pktlog_wifi3(struct dp_pdev *pdev, uint32_t event, 424 bool enable); 425 #endif 426 427 /* MCL specific functions */ 428 #if defined(DP_CON_MON) && !defined(REMOVE_PKT_LOG) 429 /** 430 * dp_pktlogmod_exit() - API to cleanup pktlog info 431 * @pdev: Pdev handle 432 * 433 * Return: none 434 */ 435 void dp_pktlogmod_exit(struct dp_pdev *pdev); 436 #else 437 static inline 438 void dp_pktlogmod_exit(struct dp_pdev *handle) 439 { 440 } 441 #endif 442 443 #ifdef QCA_MONITOR_PKT_SUPPORT 444 /** 445 * dp_vdev_set_monitor_mode_buf_rings () - set monitor mode buf rings 446 * 447 * Allocate SW descriptor pool, buffers, link descriptor memory 448 * Initialize monitor related SRNGs 449 * 450 * @pdev: DP pdev object 451 * 452 * Return: void 453 */ 454 void dp_vdev_set_monitor_mode_buf_rings(struct dp_pdev *pdev); 455 456 /** 457 * dp_vdev_set_monitor_mode_rings () - set monitor mode rings 458 * 459 * Allocate SW descriptor pool, buffers, link descriptor memory 460 * Initialize monitor related SRNGs 461 * 462 * @pdev: DP pdev object 463 * 464 * Return: QDF_STATUS 465 */ 466 QDF_STATUS dp_vdev_set_monitor_mode_rings(struct dp_pdev *pdev, 467 uint8_t delayed_replenish); 468 469 #else 470 static inline void 471 dp_vdev_set_monitor_mode_buf_rings(struct dp_pdev *pdev) 472 { 473 } 474 475 static inline QDF_STATUS 476 dp_vdev_set_monitor_mode_rings(struct dp_pdev *pdev, 477 uint8_t delayed_replenish) 478 { 479 return QDF_STATUS_SUCCESS; 480 } 481 #endif 482 483 #if defined(WDI_EVENT_ENABLE) &&\ 484 (defined(QCA_ENHANCED_STATS_SUPPORT) || !defined(REMOVE_PKT_LOG)) 485 /* 486 * dp_ppdu_stats_ind_handler() - PPDU stats msg handler 487 * @htt_soc: HTT SOC handle 488 * @msg_word: Pointer to payload 489 * @htt_t2h_msg: HTT msg nbuf 490 * 491 * Return: True if buffer should be freed by caller. 492 */ 493 bool dp_ppdu_stats_ind_handler(struct htt_soc *soc, 494 uint32_t *msg_word, 495 qdf_nbuf_t htt_t2h_msg); 496 #endif 497 498 struct dp_mon_ops { 499 QDF_STATUS (*mon_soc_cfg_init)(struct dp_soc *soc); 500 QDF_STATUS (*mon_soc_attach)(struct dp_soc *soc); 501 QDF_STATUS (*mon_soc_detach)(struct dp_soc *soc); 502 QDF_STATUS (*mon_pdev_alloc)(struct dp_pdev *pdev); 503 QDF_STATUS (*mon_soc_init)(struct dp_soc *soc); 504 void (*mon_soc_deinit)(struct dp_soc *soc); 505 void (*mon_pdev_free)(struct dp_pdev *pdev); 506 QDF_STATUS (*mon_pdev_attach)(struct dp_pdev *pdev); 507 QDF_STATUS (*mon_pdev_detach)(struct dp_pdev *pdev); 508 QDF_STATUS (*mon_pdev_init)(struct dp_pdev *pdev); 509 QDF_STATUS (*mon_pdev_deinit)(struct dp_pdev *pdev); 510 QDF_STATUS (*mon_vdev_attach)(struct dp_vdev *vdev); 511 QDF_STATUS (*mon_vdev_detach)(struct dp_vdev *vdev); 512 QDF_STATUS (*mon_peer_attach)(struct dp_peer *peer); 513 QDF_STATUS (*mon_peer_detach)(struct dp_peer *peer); 514 struct cdp_peer_rate_stats_ctx *(*mon_peer_get_rdkstats_ctx)(struct dp_peer *peer); 515 void (*mon_peer_reset_stats)(struct dp_peer *peer); 516 void (*mon_peer_get_stats)(struct dp_peer *peer, void *arg, 517 enum cdp_stat_update_type type); 518 void (*mon_invalid_peer_update_pdev_stats)(struct dp_pdev *pdev); 519 QDF_STATUS (*mon_peer_get_stats_param)(struct dp_peer *peer, 520 enum cdp_peer_stats_type type, 521 cdp_peer_stats_param_t *buf); 522 QDF_STATUS (*mon_config_debug_sniffer)(struct dp_pdev *pdev, int val); 523 void (*mon_flush_rings)(struct dp_soc *soc); 524 #if !defined(DISABLE_MON_CONFIG) 525 QDF_STATUS (*mon_pdev_htt_srng_setup)(struct dp_soc *soc, 526 struct dp_pdev *pdev, 527 int mac_id, 528 int mac_for_pdev); 529 QDF_STATUS (*mon_soc_htt_srng_setup)(struct dp_soc *soc); 530 #endif 531 #if !defined(DISABLE_MON_CONFIG) && defined(MON_ENABLE_DROP_FOR_MAC) 532 uint32_t (*mon_drop_packets_for_mac)(struct dp_pdev *pdev, 533 uint32_t mac_id, 534 uint32_t quota); 535 #endif 536 #if defined(DP_CON_MON) 537 void (*mon_service_rings)(struct dp_soc *soc, uint32_t quota); 538 #endif 539 #ifndef DISABLE_MON_CONFIG 540 uint32_t (*mon_rx_process)(struct dp_soc *soc, 541 struct dp_intr *int_ctx, 542 uint32_t mac_id, 543 uint32_t quota); 544 uint32_t (*mon_tx_process)(struct dp_soc *soc, 545 struct dp_intr *int_ctx, 546 uint32_t mac_id, 547 uint32_t quota); 548 #endif 549 void (*mon_peer_tx_init)(struct dp_pdev *pdev, struct dp_peer *peer); 550 void (*mon_peer_tx_cleanup)(struct dp_vdev *vdev, 551 struct dp_peer *peer); 552 #ifdef WIFI_MONITOR_SUPPORT 553 void (*mon_peer_tid_peer_id_update)(struct dp_peer *peer, 554 uint16_t peer_id); 555 void (*mon_tx_ppdu_stats_attach)(struct dp_pdev *pdev); 556 void (*mon_tx_ppdu_stats_detach)(struct dp_pdev *pdev); 557 QDF_STATUS (*mon_tx_capture_debugfs_init)(struct dp_pdev *pdev); 558 void (*mon_peer_tx_capture_filter_check)(struct dp_pdev *pdev, 559 struct dp_peer *peer); 560 QDF_STATUS (*mon_tx_add_to_comp_queue)(struct dp_soc *soc, 561 struct dp_tx_desc_s *desc, 562 struct hal_tx_completion_status *ts, 563 uint16_t peer_id); 564 QDF_STATUS (*mon_update_msdu_to_list)(struct dp_soc *soc, 565 struct dp_pdev *pdev, 566 struct dp_peer *peer, 567 struct hal_tx_completion_status *ts, 568 qdf_nbuf_t netbuf); 569 QDF_STATUS 570 (*mon_peer_tx_capture_get_stats)(struct dp_peer *peer, 571 struct cdp_peer_tx_capture_stats *sts); 572 QDF_STATUS 573 (*mon_pdev_tx_capture_get_stats)(struct dp_pdev *pdev, 574 struct cdp_pdev_tx_capture_stats *sts); 575 #endif 576 #if defined(WDI_EVENT_ENABLE) &&\ 577 (defined(QCA_ENHANCED_STATS_SUPPORT) || !defined(REMOVE_PKT_LOG)) 578 bool (*mon_ppdu_stats_ind_handler)(struct htt_soc *soc, 579 uint32_t *msg_word, 580 qdf_nbuf_t htt_t2h_msg); 581 #endif 582 QDF_STATUS (*mon_htt_ppdu_stats_attach)(struct dp_pdev *pdev); 583 void (*mon_htt_ppdu_stats_detach)(struct dp_pdev *pdev); 584 void (*mon_print_pdev_rx_mon_stats)(struct dp_pdev *pdev); 585 586 #ifdef WIFI_MONITOR_SUPPORT 587 void (*mon_print_pdev_tx_capture_stats)(struct dp_pdev *pdev); 588 QDF_STATUS (*mon_config_enh_tx_capture)(struct dp_pdev *pdev, 589 uint8_t val); 590 QDF_STATUS (*mon_tx_peer_filter)(struct dp_pdev *pdev_handle, 591 struct dp_peer *peer_handle, 592 uint8_t is_tx_pkt_cap_enable, 593 uint8_t *peer_mac); 594 #endif 595 #ifdef WLAN_RX_PKT_CAPTURE_ENH 596 QDF_STATUS (*mon_config_enh_rx_capture)(struct dp_pdev *pdev, 597 uint8_t val); 598 #endif 599 #ifdef QCA_SUPPORT_BPR 600 QDF_STATUS (*mon_set_bpr_enable)(struct dp_pdev *pdev, int val); 601 #endif 602 #ifdef ATH_SUPPORT_NAC 603 int (*mon_set_filter_neigh_peers)(struct dp_pdev *pdev, bool val); 604 #endif 605 #ifdef WLAN_ATF_ENABLE 606 void (*mon_set_atf_stats_enable)(struct dp_pdev *pdev, bool value); 607 #endif 608 void (*mon_set_bsscolor)(struct dp_pdev *pdev, uint8_t bsscolor); 609 bool (*mon_pdev_get_filter_ucast_data)(struct cdp_pdev *pdev_handle); 610 bool (*mon_pdev_get_filter_non_data)(struct cdp_pdev *pdev_handle); 611 bool (*mon_pdev_get_filter_mcast_data)(struct cdp_pdev *pdev_handle); 612 #ifdef WDI_EVENT_ENABLE 613 int (*mon_set_pktlog_wifi3)(struct dp_pdev *pdev, uint32_t event, 614 bool enable); 615 #endif 616 #if defined(DP_CON_MON) && !defined(REMOVE_PKT_LOG) 617 void (*mon_pktlogmod_exit)(struct dp_pdev *pdev); 618 #endif 619 void (*mon_vdev_set_monitor_mode_buf_rings)(struct dp_pdev *pdev); 620 QDF_STATUS (*mon_vdev_set_monitor_mode_rings)(struct dp_pdev *pdev, 621 uint8_t delayed_replenish); 622 void (*mon_neighbour_peers_detach)(struct dp_pdev *pdev); 623 #ifdef FEATURE_NAC_RSSI 624 QDF_STATUS (*mon_filter_neighbour_peer)(struct dp_pdev *pdev, 625 uint8_t *rx_pkt_hdr); 626 #endif 627 void (*mon_vdev_timer_init)(struct dp_soc *soc); 628 void (*mon_vdev_timer_start)(struct dp_soc *soc); 629 bool (*mon_vdev_timer_stop)(struct dp_soc *soc); 630 void (*mon_vdev_timer_deinit)(struct dp_soc *soc); 631 void (*mon_reap_timer_init)(struct dp_soc *soc); 632 void (*mon_reap_timer_start)(struct dp_soc *soc); 633 bool (*mon_reap_timer_stop)(struct dp_soc *soc); 634 void (*mon_reap_timer_deinit)(struct dp_soc *soc); 635 #ifdef QCA_MCOPY_SUPPORT 636 QDF_STATUS (*mon_mcopy_check_deliver)(struct dp_pdev *pdev, 637 uint16_t peer_id, 638 uint32_t ppdu_id, 639 uint8_t first_msdu); 640 #endif 641 void (*mon_neighbour_peer_add_ast)(struct dp_pdev *pdev, 642 struct dp_peer *ta_peer, 643 uint8_t *mac_addr, 644 qdf_nbuf_t nbuf, 645 uint32_t flags); 646 #ifdef QCA_ENHANCED_STATS_SUPPORT 647 void (*mon_filter_setup_enhanced_stats)(struct dp_pdev *pdev); 648 void (*mon_filter_reset_enhanced_stats)(struct dp_pdev *pdev); 649 void (*mon_tx_stats_update)(struct dp_mon_peer *mon_peer, 650 struct cdp_tx_completion_ppdu_user *ppdu); 651 #endif 652 #ifdef QCA_MCOPY_SUPPORT 653 void (*mon_filter_setup_mcopy_mode)(struct dp_pdev *pdev); 654 void (*mon_filter_reset_mcopy_mode)(struct dp_pdev *pdev); 655 #endif 656 #if defined(ATH_SUPPORT_NAC_RSSI) || defined(ATH_SUPPORT_NAC) 657 void (*mon_filter_setup_smart_monitor)(struct dp_pdev *pdev); 658 void (*mon_filter_reset_smart_monitor)(struct dp_pdev *pdev); 659 #endif 660 #ifdef WLAN_RX_PKT_CAPTURE_ENH 661 void (*mon_filter_setup_rx_enh_capture)(struct dp_pdev *pdev); 662 void (*mon_filter_reset_rx_enh_capture)(struct dp_pdev *pdev); 663 #endif 664 void (*mon_filter_setup_rx_mon_mode)(struct dp_pdev *pdev); 665 void (*mon_filter_reset_rx_mon_mode)(struct dp_pdev *pdev); 666 void (*mon_filter_setup_tx_mon_mode)(struct dp_pdev *pdev); 667 void (*mon_filter_reset_tx_mon_mode)(struct dp_pdev *pdev); 668 #ifdef WDI_EVENT_ENABLE 669 void (*mon_filter_setup_rx_pkt_log_full)(struct dp_pdev *pdev); 670 void (*mon_filter_reset_rx_pkt_log_full)(struct dp_pdev *pdev); 671 void (*mon_filter_setup_rx_pkt_log_lite)(struct dp_pdev *pdev); 672 void (*mon_filter_reset_rx_pkt_log_lite)(struct dp_pdev *pdev); 673 void (*mon_filter_setup_rx_pkt_log_cbf)(struct dp_pdev *pdev); 674 void (*mon_filter_reset_rx_pkt_log_cbf)(struct dp_pdev *pdev); 675 #ifdef BE_PKTLOG_SUPPORT 676 void (*mon_filter_setup_pktlog_hybrid)(struct dp_pdev *pdev); 677 void (*mon_filter_reset_pktlog_hybrid)(struct dp_pdev *pdev); 678 #endif 679 #endif 680 QDF_STATUS (*rx_mon_filter_update)(struct dp_pdev *pdev); 681 QDF_STATUS (*tx_mon_filter_update)(struct dp_pdev *pdev); 682 683 QDF_STATUS (*tx_mon_filter_alloc)(struct dp_pdev *pdev); 684 void (*tx_mon_filter_dealloc)(struct dp_pdev *pdev); 685 QDF_STATUS (*mon_rings_alloc)(struct dp_pdev *pdev); 686 void (*mon_rings_free)(struct dp_pdev *pdev); 687 QDF_STATUS (*mon_rings_init)(struct dp_pdev *pdev); 688 void (*mon_rings_deinit)(struct dp_pdev *pdev); 689 690 QDF_STATUS (*rx_mon_buffers_alloc)(struct dp_pdev *pdev); 691 void (*rx_mon_buffers_free)(struct dp_pdev *pdev); 692 void (*rx_mon_desc_pool_init)(struct dp_pdev *pdev); 693 void (*rx_mon_desc_pool_deinit)(struct dp_pdev *pdev); 694 QDF_STATUS (*rx_mon_desc_pool_alloc)(struct dp_pdev *pdev); 695 void (*rx_mon_desc_pool_free)(struct dp_pdev *pdev); 696 void (*tx_mon_desc_pool_init)(struct dp_pdev *pdev); 697 void (*tx_mon_desc_pool_deinit)(struct dp_pdev *pdev); 698 QDF_STATUS (*tx_mon_desc_pool_alloc)(struct dp_pdev *pdev); 699 void (*tx_mon_desc_pool_free)(struct dp_pdev *pdev); 700 void (*rx_packet_length_set)(uint32_t *msg_word, 701 struct htt_rx_ring_tlv_filter *tlv_filter); 702 void (*rx_wmask_subscribe)(uint32_t *msg_word, 703 struct htt_rx_ring_tlv_filter *tlv_filter); 704 void (*rx_enable_mpdu_logging)(uint32_t *msg_word, 705 struct htt_rx_ring_tlv_filter *tlv_filter); 706 #ifndef DISABLE_MON_CONFIG 707 void (*mon_register_intr_ops)(struct dp_soc *soc); 708 #endif 709 void (*mon_register_feature_ops)(struct dp_soc *soc); 710 #ifdef QCA_ENHANCED_STATS_SUPPORT 711 void (*mon_rx_stats_update)(struct dp_mon_peer *mon_peer, 712 struct cdp_rx_indication_ppdu *ppdu, 713 struct cdp_rx_stats_ppdu_user *ppdu_user); 714 void (*mon_rx_populate_ppdu_usr_info)(struct mon_rx_user_status *rx_user_status, 715 struct cdp_rx_stats_ppdu_user *ppdu_user); 716 void (*mon_rx_populate_ppdu_info)(struct hal_rx_ppdu_info *hal_ppdu_info, 717 struct cdp_rx_indication_ppdu *ppdu); 718 #endif 719 QDF_STATUS (*rx_mon_refill_buf_ring)(struct dp_intr *int_ctx); 720 QDF_STATUS (*tx_mon_refill_buf_ring)(struct dp_intr *int_ctx); 721 722 }; 723 724 struct dp_mon_soc { 725 /* Holds all monitor related fields extracted from dp_soc */ 726 /* Holds pointer to monitor ops */ 727 /* monitor link descriptor pages */ 728 struct qdf_mem_multi_page_t mon_link_desc_pages[MAX_NUM_LMAC_HW]; 729 730 /* total link descriptors for monitor mode for each radio */ 731 uint32_t total_mon_link_descs[MAX_NUM_LMAC_HW]; 732 733 /* Monitor Link descriptor memory banks */ 734 struct link_desc_bank 735 mon_link_desc_banks[MAX_NUM_LMAC_HW][MAX_MON_LINK_DESC_BANKS]; 736 uint32_t num_mon_link_desc_banks[MAX_NUM_LMAC_HW]; 737 /* Smart monitor capability for HKv2 */ 738 uint8_t hw_nac_monitor_support; 739 740 /* Full monitor mode support */ 741 bool full_mon_mode; 742 743 /*interrupt timer*/ 744 qdf_timer_t mon_reap_timer; 745 uint8_t reap_timer_init; 746 747 qdf_timer_t mon_vdev_timer; 748 uint8_t mon_vdev_timer_state; 749 750 struct dp_mon_ops *mon_ops; 751 bool monitor_mode_v2; 752 #ifndef DISABLE_MON_CONFIG 753 uint32_t (*mon_rx_process)(struct dp_soc *soc, 754 struct dp_intr *int_ctx, 755 uint32_t mac_id, 756 uint32_t quota); 757 #endif 758 759 #ifdef WLAN_TX_PKT_CAPTURE_ENH 760 struct dp_soc_tx_capture dp_soc_tx_capt; 761 #endif 762 }; 763 764 /** 765 * struct dp_mon_peer_stats - Monitor peer stats 766 */ 767 struct dp_mon_peer_stats { 768 #ifdef QCA_ENHANCED_STATS_SUPPORT 769 dp_mon_peer_tx_stats tx; 770 dp_mon_peer_rx_stats rx; 771 #endif 772 }; 773 774 struct dp_mon_peer { 775 #ifdef WLAN_TX_PKT_CAPTURE_ENH 776 struct dp_peer_tx_capture tx_capture; 777 #endif 778 #ifdef FEATURE_PERPKT_INFO 779 /* delayed ba ppdu stats handling */ 780 struct cdp_delayed_tx_completion_ppdu_user delayed_ba_ppdu_stats; 781 /* delayed ba flag */ 782 bool last_delayed_ba; 783 /* delayed ba ppdu id */ 784 uint32_t last_delayed_ba_ppduid; 785 #endif 786 uint8_t tx_cap_enabled:1, /* Peer's tx-capture is enabled */ 787 rx_cap_enabled:1; /* Peer's rx-capture is enabled */ 788 789 /* Peer level flag to check peer based pktlog enabled or 790 * disabled 791 */ 792 uint8_t peer_based_pktlog_filter; 793 794 /* Monitor peer stats */ 795 struct dp_mon_peer_stats stats; 796 797 /* rdk statistics context */ 798 struct cdp_peer_rate_stats_ctx *rdkstats_ctx; 799 }; 800 801 struct dp_mon_pdev { 802 /* monitor */ 803 bool monitor_configured; 804 805 struct dp_mon_filter **filter; /* Monitor Filter pointer */ 806 807 /* advance filter mode and type*/ 808 uint8_t mon_filter_mode; 809 uint16_t fp_mgmt_filter; 810 uint16_t fp_ctrl_filter; 811 uint16_t fp_data_filter; 812 uint16_t mo_mgmt_filter; 813 uint16_t mo_ctrl_filter; 814 uint16_t mo_data_filter; 815 uint16_t md_data_filter; 816 817 #ifdef WLAN_TX_PKT_CAPTURE_ENH 818 struct dp_pdev_tx_capture tx_capture; 819 bool stop_tx_capture_work_q_timer; 820 #endif 821 822 /* tx packet capture enhancement */ 823 enum cdp_tx_enh_capture_mode tx_capture_enabled; 824 /* Stuck count on monitor destination ring MPDU process */ 825 uint32_t mon_dest_ring_stuck_cnt; 826 /* monitor mode lock */ 827 qdf_spinlock_t mon_lock; 828 829 /* Monitor mode operation channel */ 830 int mon_chan_num; 831 832 /* Monitor mode operation frequency */ 833 qdf_freq_t mon_chan_freq; 834 835 /* Monitor mode band */ 836 enum reg_wifi_band mon_chan_band; 837 838 uint32_t mon_ppdu_status; 839 /* monitor mode status/destination ring PPDU and MPDU count */ 840 struct cdp_pdev_mon_stats rx_mon_stats; 841 /* Monitor mode interface and status storage */ 842 struct dp_vdev *mvdev; 843 struct cdp_mon_status rx_mon_recv_status; 844 /* to track duplicate link descriptor indications by HW for a WAR */ 845 uint64_t mon_last_linkdesc_paddr; 846 /* to track duplicate buffer indications by HW for a WAR */ 847 uint32_t mon_last_buf_cookie; 848 849 #ifdef QCA_SUPPORT_FULL_MON 850 /* List to maintain all MPDUs for a PPDU in monitor mode */ 851 TAILQ_HEAD(, dp_mon_mpdu) mon_mpdu_q; 852 853 /* TODO: define per-user mpdu list 854 * struct dp_mon_mpdu_list mpdu_list[MAX_MU_USERS]; 855 */ 856 struct hal_rx_mon_desc_info *mon_desc; 857 #endif 858 /* Flag to hold on to monitor destination ring */ 859 bool hold_mon_dest_ring; 860 861 /* Flag to inidicate monitor rings are initialized */ 862 uint8_t pdev_mon_init; 863 #ifndef REMOVE_PKT_LOG 864 bool pkt_log_init; 865 struct pktlog_dev_t *pl_dev; /* Pktlog pdev */ 866 #endif /* #ifndef REMOVE_PKT_LOG */ 867 868 /* Smart Mesh */ 869 bool filter_neighbour_peers; 870 871 /*flag to indicate neighbour_peers_list not empty */ 872 bool neighbour_peers_added; 873 /* smart mesh mutex */ 874 qdf_spinlock_t neighbour_peer_mutex; 875 /* Neighnour peer list */ 876 TAILQ_HEAD(, dp_neighbour_peer) neighbour_peers_list; 877 /* Enhanced Stats is enabled */ 878 bool enhanced_stats_en; 879 qdf_nbuf_queue_t rx_status_q; 880 881 /* 128 bytes mpdu header queue per user for ppdu */ 882 qdf_nbuf_queue_t mpdu_q[MAX_MU_USERS]; 883 884 /* is this a mpdu header TLV and not msdu header TLV */ 885 bool is_mpdu_hdr[MAX_MU_USERS]; 886 887 /* per user 128 bytes msdu header list for MPDU */ 888 struct msdu_list msdu_list[MAX_MU_USERS]; 889 890 /* RX enhanced capture mode */ 891 uint8_t rx_enh_capture_mode; 892 /* Rx per peer enhanced capture mode */ 893 bool rx_enh_capture_peer; 894 struct dp_vdev *rx_enh_monitor_vdev; 895 /* RX enhanced capture trailer enable/disable flag */ 896 bool is_rx_enh_capture_trailer_enabled; 897 #ifdef WLAN_RX_PKT_CAPTURE_ENH 898 /* RX per MPDU/PPDU information */ 899 struct cdp_rx_indication_mpdu mpdu_ind; 900 #endif 901 902 /* Packet log mode */ 903 uint8_t rx_pktlog_mode; 904 /* Enable pktlog logging cbf */ 905 bool rx_pktlog_cbf; 906 907 #ifdef BE_PKTLOG_SUPPORT 908 /* Enable pktlog logging hybrid */ 909 bool pktlog_hybrid_mode; 910 #endif 911 bool tx_sniffer_enable; 912 /* mirror copy mode */ 913 enum m_copy_mode mcopy_mode; 914 bool enable_reap_timer_non_pkt; 915 bool bpr_enable; 916 /* Pdev level flag to check peer based pktlog enabled or 917 * disabled 918 */ 919 uint8_t dp_peer_based_pktlog; 920 921 #ifdef WLAN_ATF_ENABLE 922 /* ATF stats enable */ 923 bool dp_atf_stats_enable; 924 #endif 925 926 /* Maintains first status buffer's paddr of a PPDU */ 927 uint64_t status_buf_addr; 928 struct hal_rx_ppdu_info ppdu_info; 929 930 /* ppdu_id of last received HTT TX stats */ 931 uint32_t last_ppdu_id; 932 struct { 933 uint8_t last_user; 934 qdf_nbuf_t buf; 935 } tx_ppdu_info; 936 937 struct { 938 uint32_t tx_ppdu_id; 939 uint16_t tx_peer_id; 940 uint32_t rx_ppdu_id; 941 } m_copy_id; 942 943 /* To check if PPDU Tx stats are enabled for Pktlog */ 944 bool pktlog_ppdu_stats; 945 946 #ifdef ATH_SUPPORT_NAC_RSSI 947 bool nac_rssi_filtering; 948 #endif 949 950 /* ppdu_stats lock for queue concurrency between cores*/ 951 qdf_spinlock_t ppdu_stats_lock; 952 953 /* list of ppdu tlvs */ 954 TAILQ_HEAD(, ppdu_info) ppdu_info_list; 955 TAILQ_HEAD(, ppdu_info) sched_comp_ppdu_list; 956 957 uint32_t sched_comp_list_depth; 958 uint16_t delivered_sched_cmdid; 959 uint16_t last_sched_cmdid; 960 uint32_t tlv_count; 961 uint32_t list_depth; 962 963 struct { 964 qdf_nbuf_t last_nbuf; /*Ptr to mgmt last buf */ 965 uint8_t *mgmt_buf; /* Ptr to mgmt. payload in HTT ppdu stats */ 966 uint32_t mgmt_buf_len; /* Len of mgmt. payload in ppdu stats */ 967 uint32_t ppdu_id; 968 } mgmtctrl_frm_info; 969 /* Context of cal client timer */ 970 struct cdp_cal_client *cal_client_ctx; 971 uint32_t *ppdu_tlv_buf; /* Buffer to hold HTT ppdu stats TLVs*/ 972 973 qdf_nbuf_t mcopy_status_nbuf; 974 bool is_dp_mon_pdev_initialized; 975 /* indicates if spcl vap is configured */ 976 bool scan_spcl_vap_configured; 977 #ifdef QCA_SUPPORT_SCAN_SPCL_VAP_STATS 978 /* enable spcl vap stats reset on ch change */ 979 bool reset_scan_spcl_vap_stats_enable; 980 #endif 981 bool is_tlv_hdr_64_bit; 982 enum dp_mon_filter_mode current_filter_mode; 983 984 /* Invalid monitor peer to account for stats in mcopy mode */ 985 struct dp_mon_peer *invalid_mon_peer; 986 }; 987 988 struct dp_mon_vdev { 989 /* callback to hand rx monitor 802.11 MPDU to the OS shim */ 990 ol_txrx_rx_mon_fp osif_rx_mon; 991 #ifdef QCA_SUPPORT_SCAN_SPCL_VAP_STATS 992 struct cdp_scan_spcl_vap_stats *scan_spcl_vap_stats; 993 #endif 994 }; 995 996 #if defined(QCA_TX_CAPTURE_SUPPORT) || defined(QCA_ENHANCED_STATS_SUPPORT) 997 void dp_deliver_mgmt_frm(struct dp_pdev *pdev, qdf_nbuf_t nbuf); 998 #else 999 static inline 1000 void dp_deliver_mgmt_frm(struct dp_pdev *pdev, qdf_nbuf_t nbuf) 1001 { 1002 } 1003 #endif 1004 1005 #if defined(WLAN_SUPPORT_RX_PROTOCOL_TYPE_TAG) ||\ 1006 defined(WLAN_SUPPORT_RX_FLOW_TAG) 1007 /** 1008 * dp_rx_mon_update_protocol_flow_tag() - Performs necessary checks for monitor 1009 * mode and then tags appropriate packets 1010 * @soc: core txrx main context 1011 * @vdev: pdev on which packet is received 1012 * @msdu: QDF packet buffer on which the protocol tag should be set 1013 * @rx_desc: base address where the RX TLVs start 1014 * Return: void 1015 */ 1016 void dp_rx_mon_update_protocol_flow_tag(struct dp_soc *soc, 1017 struct dp_pdev *dp_pdev, 1018 qdf_nbuf_t msdu, void *rx_desc); 1019 #endif /* WLAN_SUPPORT_RX_PROTOCOL_TYPE_TAG || WLAN_SUPPORT_RX_FLOW_TAG */ 1020 1021 #if !defined(WLAN_SUPPORT_RX_PROTOCOL_TYPE_TAG) &&\ 1022 !defined(WLAN_SUPPORT_RX_FLOW_TAG) 1023 /** 1024 * dp_rx_mon_update_protocol_flow_tag() - Performs necessary checks for monitor 1025 * mode and then tags appropriate packets 1026 * @soc: core txrx main context 1027 * @vdev: pdev on which packet is received 1028 * @msdu: QDF packet buffer on which the protocol tag should be set 1029 * @rx_desc: base address where the RX TLVs start 1030 * Return: void 1031 */ 1032 static inline 1033 void dp_rx_mon_update_protocol_flow_tag(struct dp_soc *soc, 1034 struct dp_pdev *dp_pdev, 1035 qdf_nbuf_t msdu, void *rx_desc) 1036 { 1037 } 1038 #endif /* WLAN_SUPPORT_RX_PROTOCOL_TYPE_TAG || WLAN_SUPPORT_RX_FLOW_TAG */ 1039 1040 #ifndef WLAN_TX_PKT_CAPTURE_ENH 1041 /** 1042 * dp_peer_tid_queue_init() – Initialize ppdu stats queue per TID 1043 * @peer: Datapath peer 1044 * 1045 */ 1046 static inline void dp_peer_tid_queue_init(struct dp_peer *peer) 1047 { 1048 } 1049 1050 /** 1051 * dp_peer_tid_queue_cleanup() – remove ppdu stats queue per TID 1052 * @peer: Datapath peer 1053 * 1054 */ 1055 static inline void dp_peer_tid_queue_cleanup(struct dp_peer *peer) 1056 { 1057 } 1058 1059 /** 1060 * dp_peer_update_80211_hdr() – dp peer update 80211 hdr 1061 * @vdev: Datapath vdev 1062 * @peer: Datapath peer 1063 * 1064 */ 1065 static inline void 1066 dp_peer_update_80211_hdr(struct dp_vdev *vdev, struct dp_peer *peer) 1067 { 1068 } 1069 1070 /** 1071 * dp_get_peer_tx_capture_stats: to get peer tx capture stats 1072 * @peer: DP PEER handle 1073 * @stats: pointor to peer tx capture stats 1074 * 1075 * return: QDF_STATUS 1076 */ 1077 static inline QDF_STATUS 1078 dp_get_peer_tx_capture_stats(struct dp_peer *peer, 1079 struct cdp_peer_tx_capture_stats *stats) 1080 { 1081 return QDF_STATUS_E_FAILURE; 1082 } 1083 1084 /** 1085 * dp_get_pdev_tx_capture_stats: to get pdev tx capture stats 1086 * @pdev: DP PDEV handle 1087 * @stats: pointor to pdev tx capture stats 1088 * 1089 * return: QDF_STATUS 1090 */ 1091 static inline QDF_STATUS 1092 dp_get_pdev_tx_capture_stats(struct dp_pdev *pdev, 1093 struct cdp_pdev_tx_capture_stats *stats) 1094 { 1095 return QDF_STATUS_E_FAILURE; 1096 } 1097 #endif 1098 1099 #ifdef WLAN_TX_PKT_CAPTURE_ENH 1100 extern uint8_t 1101 dp_cpu_ring_map[DP_NSS_CPU_RING_MAP_MAX][WLAN_CFG_INT_NUM_CONTEXTS_MAX]; 1102 #endif 1103 1104 int 1105 dp_htt_get_ppdu_sniffer_ampdu_tlv_bitmap(uint32_t bitmap); 1106 1107 #ifdef WDI_EVENT_ENABLE 1108 void dp_pkt_log_init(struct cdp_soc_t *soc_hdl, uint8_t pdev_id, void *scn); 1109 #else 1110 static inline void 1111 dp_pkt_log_init(struct cdp_soc_t *soc_hdl, uint8_t pdev_id, void *scn) 1112 { 1113 } 1114 #endif 1115 1116 #if defined(WDI_EVENT_ENABLE) && defined(QCA_ENHANCED_STATS_SUPPORT) 1117 QDF_STATUS dp_peer_stats_notify(struct dp_pdev *pdev, struct dp_peer *peer); 1118 #else 1119 static inline QDF_STATUS dp_peer_stats_notify(struct dp_pdev *pdev, 1120 struct dp_peer *peer) 1121 { 1122 return QDF_STATUS_SUCCESS; 1123 } 1124 #endif 1125 1126 #if defined(FEATURE_PERPKT_INFO) && defined(WDI_EVENT_ENABLE) 1127 void dp_send_stats_event(struct dp_pdev *pdev, struct dp_peer *peer, 1128 uint16_t peer_id); 1129 #else 1130 static inline 1131 void dp_send_stats_event(struct dp_pdev *pdev, struct dp_peer *peer, 1132 uint16_t peer_id) 1133 { 1134 } 1135 #endif 1136 1137 #ifndef WLAN_TX_PKT_CAPTURE_ENH 1138 /** 1139 * dp_tx_ppdu_stats_process - Deferred PPDU stats handler 1140 * @context: Opaque work context (PDEV) 1141 * 1142 * Return: none 1143 */ 1144 static inline void dp_tx_ppdu_stats_process(void *context) 1145 { 1146 } 1147 1148 /* 1149 * dp_tx_capture_htt_frame_counter: increment counter for htt_frame_type 1150 * pdev: DP pdev handle 1151 * htt_frame_type: htt frame type received from fw 1152 * 1153 * return: void 1154 */ 1155 static inline 1156 void dp_tx_capture_htt_frame_counter(struct dp_pdev *pdev, 1157 uint32_t htt_frame_type) 1158 { 1159 } 1160 1161 #endif 1162 1163 /** 1164 * dp_rx_cookie_2_mon_link_desc_va() - Converts cookie to a virtual address of 1165 * the MSDU Link Descriptor 1166 * @pdev: core txrx pdev context 1167 * @buf_info: buf_info includes cookie that used to lookup virtual address of 1168 * link descriptor. Normally this is just an index into a per pdev array. 1169 * 1170 * This is the VA of the link descriptor in monitor mode destination ring, 1171 * that HAL layer later uses to retrieve the list of MSDU's for a given MPDU. 1172 * 1173 * Return: void *: Virtual Address of the Rx descriptor 1174 */ 1175 static inline 1176 void *dp_rx_cookie_2_mon_link_desc_va(struct dp_pdev *pdev, 1177 struct hal_buf_info *buf_info, 1178 int mac_id) 1179 { 1180 void *link_desc_va; 1181 struct qdf_mem_multi_page_t *pages; 1182 uint16_t page_id = LINK_DESC_COOKIE_PAGE_ID(buf_info->sw_cookie); 1183 struct dp_mon_soc *mon_soc = pdev->soc->monitor_soc; 1184 1185 if (!mon_soc) 1186 return NULL; 1187 1188 pages = &mon_soc->mon_link_desc_pages[mac_id]; 1189 if (!pages) 1190 return NULL; 1191 1192 if (qdf_unlikely(page_id >= pages->num_pages)) 1193 return NULL; 1194 1195 link_desc_va = pages->dma_pages[page_id].page_v_addr_start + 1196 (buf_info->paddr - pages->dma_pages[page_id].page_p_addr); 1197 1198 return link_desc_va; 1199 } 1200 1201 /** 1202 * dp_soc_is_full_mon_enable () - Return if full monitor mode is enabled 1203 * @soc: DP soc handle 1204 * 1205 * Return: Full monitor mode status 1206 */ 1207 static inline bool dp_soc_is_full_mon_enable(struct dp_pdev *pdev) 1208 { 1209 return (pdev->soc->monitor_soc->full_mon_mode && 1210 pdev->monitor_pdev->monitor_configured) ? true : false; 1211 } 1212 1213 /* 1214 * dp_mon_is_enable_reap_timer_non_pkt() - check if mon reap timer is 1215 * enabled by non-pkt log or not 1216 * @pdev: point to dp pdev 1217 * 1218 * Return: true if mon reap timer is enabled by non-pkt log 1219 */ 1220 static inline bool dp_mon_is_enable_reap_timer_non_pkt(struct dp_pdev *pdev) 1221 { 1222 if (qdf_unlikely(!pdev || !pdev->monitor_pdev)) 1223 return false; 1224 1225 return pdev->monitor_pdev->enable_reap_timer_non_pkt; 1226 } 1227 1228 /* 1229 * dp_monitor_is_enable_mcopy_mode() - check if mcopy mode is enabled 1230 * @pdev: point to dp pdev 1231 * 1232 * Return: true if mcopy mode is enabled 1233 */ 1234 static inline bool dp_monitor_is_enable_mcopy_mode(struct dp_pdev *pdev) 1235 { 1236 if (qdf_unlikely(!pdev || !pdev->monitor_pdev)) 1237 return false; 1238 1239 return pdev->monitor_pdev->mcopy_mode; 1240 } 1241 1242 /* 1243 * dp_monitor_is_enable_tx_sniffer() - check if tx sniffer is enabled 1244 * @pdev: point to dp pdev 1245 * 1246 * Return: true if tx sniffer is enabled 1247 */ 1248 static inline bool dp_monitor_is_enable_tx_sniffer(struct dp_pdev *pdev) 1249 { 1250 if (qdf_unlikely(!pdev || !pdev->monitor_pdev)) 1251 return false; 1252 1253 return pdev->monitor_pdev->tx_sniffer_enable; 1254 } 1255 1256 /* 1257 * dp_monitor_is_set_monitor_configured() - check if monitor configured is set 1258 * @pdev: point to dp pdev 1259 * 1260 * Return: true if monitor configured is set 1261 */ 1262 static inline bool dp_monitor_is_configured(struct dp_pdev *pdev) 1263 { 1264 if (qdf_unlikely(!pdev || !pdev->monitor_pdev)) 1265 return false; 1266 1267 return pdev->monitor_pdev->monitor_configured; 1268 } 1269 1270 /* 1271 * dp_monitor_check_com_info_ppdu_id() - check if msdu ppdu_id matches with 1272 * com info ppdu_id 1273 * @pdev: point to dp pdev 1274 * @rx_desc: point to rx_desc 1275 * 1276 * Return: success if ppdu_id matches 1277 */ 1278 static inline QDF_STATUS dp_monitor_check_com_info_ppdu_id(struct dp_pdev *pdev, 1279 void *rx_desc) 1280 { 1281 struct cdp_mon_status *rs; 1282 struct dp_mon_pdev *mon_pdev; 1283 uint32_t msdu_ppdu_id = 0; 1284 1285 if (qdf_unlikely(!pdev || !pdev->monitor_pdev)) 1286 return QDF_STATUS_E_FAILURE; 1287 1288 mon_pdev = pdev->monitor_pdev; 1289 if (qdf_likely(1 != mon_pdev->ppdu_info.rx_status.rxpcu_filter_pass)) 1290 return QDF_STATUS_E_FAILURE; 1291 1292 rs = &pdev->monitor_pdev->rx_mon_recv_status; 1293 if (!rs || rs->cdp_rs_rxdma_err) 1294 return QDF_STATUS_E_FAILURE; 1295 1296 msdu_ppdu_id = hal_rx_get_ppdu_id(pdev->soc->hal_soc, rx_desc); 1297 if (msdu_ppdu_id != mon_pdev->ppdu_info.com_info.ppdu_id) { 1298 QDF_TRACE(QDF_MODULE_ID_DP, 1299 QDF_TRACE_LEVEL_ERROR, 1300 "msdu_ppdu_id=%x,com_info.ppdu_id=%x", 1301 msdu_ppdu_id, 1302 mon_pdev->ppdu_info.com_info.ppdu_id); 1303 return QDF_STATUS_E_FAILURE; 1304 } 1305 1306 return QDF_STATUS_SUCCESS; 1307 } 1308 1309 /* 1310 * dp_monitor_get_rx_status() - get rx status 1311 * @pdev: point to dp pdev 1312 * 1313 * Return: return rx status pointer 1314 */ 1315 static inline struct mon_rx_status* 1316 dp_monitor_get_rx_status(struct dp_pdev *pdev) 1317 { 1318 if (qdf_unlikely(!pdev || !pdev->monitor_pdev)) 1319 return NULL; 1320 1321 return &pdev->monitor_pdev->ppdu_info.rx_status; 1322 } 1323 1324 /* 1325 * dp_monitor_is_chan_band_known() - check if monitor chan band known 1326 * @pdev: point to dp pdev 1327 * 1328 * Return: true if chan band known 1329 */ 1330 static inline bool dp_monitor_is_chan_band_known(struct dp_pdev *pdev) 1331 { 1332 if (qdf_unlikely(!pdev || !pdev->monitor_pdev)) 1333 return false; 1334 1335 if (pdev->monitor_pdev->mon_chan_band != REG_BAND_UNKNOWN) 1336 return true; 1337 1338 return false; 1339 } 1340 1341 /* 1342 * dp_monitor_get_chan_band() - get chan band 1343 * @pdev: point to dp pdev 1344 * 1345 * Return: wifi channel band 1346 */ 1347 static inline enum reg_wifi_band 1348 dp_monitor_get_chan_band(struct dp_pdev *pdev) 1349 { 1350 return pdev->monitor_pdev->mon_chan_band; 1351 } 1352 1353 /* 1354 * dp_monitor_print_tx_stats() - print tx stats from monitor pdev 1355 * @pdev: point to dp pdev 1356 * 1357 */ 1358 static inline void dp_monitor_print_tx_stats(struct dp_pdev *pdev) 1359 { 1360 if (qdf_unlikely(!pdev || !pdev->monitor_pdev)) 1361 return; 1362 1363 DP_PRINT_STATS("ppdu info schedule completion list depth: %d", 1364 pdev->monitor_pdev->sched_comp_list_depth); 1365 DP_PRINT_STATS("delivered sched cmdid: %d", 1366 pdev->monitor_pdev->delivered_sched_cmdid); 1367 DP_PRINT_STATS("cur sched cmdid: %d", 1368 pdev->monitor_pdev->last_sched_cmdid); 1369 DP_PRINT_STATS("ppdu info list depth: %d", 1370 pdev->monitor_pdev->list_depth); 1371 } 1372 1373 /* 1374 * dp_monitor_set_chan_num() - set channel number 1375 * @pdev: point to dp pdev 1376 * @chan_num: channel number 1377 * 1378 */ 1379 static inline void dp_monitor_set_chan_num(struct dp_pdev *pdev, int chan_num) 1380 { 1381 if (qdf_unlikely(!pdev || !pdev->monitor_pdev)) 1382 return; 1383 1384 pdev->monitor_pdev->mon_chan_num = chan_num; 1385 } 1386 1387 /* 1388 * dp_monitor_set_chan_freq() - set channel frequency 1389 * @pdev: point to dp pdev 1390 * @chan_freq: channel frequency 1391 * 1392 */ 1393 static inline void 1394 dp_monitor_set_chan_freq(struct dp_pdev *pdev, qdf_freq_t chan_freq) 1395 { 1396 if (qdf_unlikely(!pdev || !pdev->monitor_pdev)) 1397 return; 1398 1399 pdev->monitor_pdev->mon_chan_freq = chan_freq; 1400 } 1401 1402 /* 1403 * dp_monitor_set_chan_band() - set channel band 1404 * @pdev: point to dp pdev 1405 * @chan_band: channel band 1406 * 1407 */ 1408 static inline void 1409 dp_monitor_set_chan_band(struct dp_pdev *pdev, enum reg_wifi_band chan_band) 1410 { 1411 if (qdf_unlikely(!pdev || !pdev->monitor_pdev)) 1412 return; 1413 1414 pdev->monitor_pdev->mon_chan_band = chan_band; 1415 } 1416 1417 /* 1418 * dp_monitor_get_mpdu_status() - get mpdu status 1419 * @pdev: point to dp pdev 1420 * @soc: point to dp soc 1421 * @rx_tlv_hdr: point to rx tlv header 1422 * 1423 */ 1424 static inline void dp_monitor_get_mpdu_status(struct dp_pdev *pdev, 1425 struct dp_soc *soc, 1426 uint8_t *rx_tlv_hdr) 1427 { 1428 struct dp_mon_pdev *mon_pdev; 1429 1430 if (qdf_unlikely(!pdev || !pdev->monitor_pdev)) 1431 return; 1432 1433 mon_pdev = pdev->monitor_pdev; 1434 hal_rx_mon_hw_desc_get_mpdu_status(soc->hal_soc, rx_tlv_hdr, 1435 &mon_pdev->ppdu_info.rx_status); 1436 } 1437 1438 #ifdef FEATURE_NAC_RSSI 1439 /* 1440 * dp_monitor_drop_inv_peer_pkts() - drop invalid peer pkts 1441 * @vdev: point to dp vdev 1442 * 1443 * Return: success if sta mode and filter for neighbour peers enabled 1444 */ 1445 static inline QDF_STATUS dp_monitor_drop_inv_peer_pkts(struct dp_vdev *vdev) 1446 { 1447 struct dp_pdev *pdev = vdev->pdev; 1448 struct dp_soc *soc = pdev->soc; 1449 1450 if (!soc->monitor_soc) 1451 return QDF_STATUS_E_FAILURE; 1452 1453 if (!soc->monitor_soc->hw_nac_monitor_support && 1454 pdev->monitor_pdev->filter_neighbour_peers && 1455 vdev->opmode == wlan_op_mode_sta) 1456 return QDF_STATUS_SUCCESS; 1457 1458 return QDF_STATUS_E_FAILURE; 1459 } 1460 #endif 1461 1462 /* 1463 * dp_peer_ppdu_delayed_ba_init() - Initialize ppdu in peer 1464 * @peer: Datapath peer 1465 * 1466 * return: void 1467 */ 1468 #ifdef FEATURE_PERPKT_INFO 1469 static inline void dp_peer_ppdu_delayed_ba_init(struct dp_peer *peer) 1470 { 1471 struct dp_mon_peer *mon_peer = peer->monitor_peer; 1472 1473 if (!mon_peer) 1474 return; 1475 1476 qdf_mem_zero(&mon_peer->delayed_ba_ppdu_stats, 1477 sizeof(struct cdp_delayed_tx_completion_ppdu_user)); 1478 mon_peer->last_delayed_ba = false; 1479 mon_peer->last_delayed_ba_ppduid = 0; 1480 } 1481 #else 1482 static inline void dp_peer_ppdu_delayed_ba_init(struct dp_peer *peer) 1483 { 1484 } 1485 #endif 1486 1487 /* 1488 * dp_monitor_vdev_register_osif() - Register osif rx mon 1489 * @vdev: point to vdev 1490 * @txrx_ops: point to ol txrx ops 1491 * 1492 * Return: void 1493 */ 1494 static inline void dp_monitor_vdev_register_osif(struct dp_vdev *vdev, 1495 struct ol_txrx_ops *txrx_ops) 1496 { 1497 if (!vdev->monitor_vdev) 1498 return; 1499 1500 vdev->monitor_vdev->osif_rx_mon = txrx_ops->rx.mon; 1501 } 1502 1503 /* 1504 * dp_monitor_get_monitor_vdev_from_pdev() - Get monitor vdev 1505 * @pdev: point to pdev 1506 * 1507 * Return: pointer to vdev 1508 */ 1509 static inline struct dp_vdev* 1510 dp_monitor_get_monitor_vdev_from_pdev(struct dp_pdev *pdev) 1511 { 1512 if (!pdev || !pdev->monitor_pdev || !pdev->monitor_pdev->mvdev) 1513 return NULL; 1514 1515 return pdev->monitor_pdev->mvdev; 1516 } 1517 1518 /* 1519 * dp_monitor_is_vdev_timer_running() - Get vdev timer status 1520 * @soc: point to soc 1521 * 1522 * Return: true if timer running 1523 */ 1524 static inline bool dp_monitor_is_vdev_timer_running(struct dp_soc *soc) 1525 { 1526 if (qdf_unlikely(!soc || !soc->monitor_soc)) 1527 return false; 1528 1529 return !!(soc->monitor_soc->mon_vdev_timer_state & 1530 MON_VDEV_TIMER_RUNNING); 1531 } 1532 1533 /* 1534 * dp_monitor_get_link_desc_pages() - Get link desc pages 1535 * @soc: point to soc 1536 * @mac_id: mac id 1537 * 1538 * Return: return point to link desc pages 1539 */ 1540 static inline struct qdf_mem_multi_page_t* 1541 dp_monitor_get_link_desc_pages(struct dp_soc *soc, uint32_t mac_id) 1542 { 1543 if (qdf_unlikely(!soc || !soc->monitor_soc)) 1544 return NULL; 1545 1546 return &soc->monitor_soc->mon_link_desc_pages[mac_id]; 1547 } 1548 1549 /* 1550 * dp_monitor_get_total_link_descs() - Get total link descs 1551 * @soc: point to soc 1552 * @mac_id: mac id 1553 * 1554 * Return: return point total link descs 1555 */ 1556 static inline uint32_t * 1557 dp_monitor_get_total_link_descs(struct dp_soc *soc, uint32_t mac_id) 1558 { 1559 return &soc->monitor_soc->total_mon_link_descs[mac_id]; 1560 } 1561 1562 /* 1563 * dp_monitor_pdev_attach() - Monitor pdev attach 1564 * @pdev: point to pdev 1565 * 1566 * Return: return QDF_STATUS 1567 */ 1568 static inline QDF_STATUS dp_monitor_pdev_attach(struct dp_pdev *pdev) 1569 { 1570 struct dp_mon_ops *monitor_ops; 1571 struct dp_mon_soc *mon_soc = pdev->soc->monitor_soc; 1572 1573 /* 1574 * mon_soc uninitialized modular support enabled 1575 * monitor related attach/detach/init/deinit 1576 * will be done while monitor insmod 1577 */ 1578 if (!mon_soc) 1579 return QDF_STATUS_SUCCESS; 1580 1581 monitor_ops = mon_soc->mon_ops; 1582 if (!monitor_ops || !monitor_ops->mon_pdev_attach) { 1583 dp_mon_debug("callback not registered"); 1584 return QDF_STATUS_E_FAILURE; 1585 } 1586 1587 return monitor_ops->mon_pdev_attach(pdev); 1588 } 1589 1590 /* 1591 * dp_monitor_pdev_detach() - Monitor pdev detach 1592 * @pdev: point to pdev 1593 * 1594 * Return: return QDF_STATUS 1595 */ 1596 static inline QDF_STATUS dp_monitor_pdev_detach(struct dp_pdev *pdev) 1597 { 1598 struct dp_mon_ops *monitor_ops; 1599 struct dp_mon_soc *mon_soc = pdev->soc->monitor_soc; 1600 1601 /* 1602 * mon_soc uninitialized modular support enabled 1603 * monitor related attach/detach/init/deinit 1604 * will be done while monitor insmod 1605 */ 1606 if (!mon_soc) 1607 return QDF_STATUS_SUCCESS; 1608 1609 monitor_ops = mon_soc->mon_ops; 1610 if (!monitor_ops || !monitor_ops->mon_pdev_detach) { 1611 dp_mon_debug("callback not registered"); 1612 return QDF_STATUS_E_FAILURE; 1613 } 1614 1615 return monitor_ops->mon_pdev_detach(pdev); 1616 } 1617 1618 /* 1619 * dp_monitor_vdev_attach() - Monitor vdev attach 1620 * @vdev: point to vdev 1621 * 1622 * Return: return QDF_STATUS 1623 */ 1624 static inline QDF_STATUS dp_monitor_vdev_attach(struct dp_vdev *vdev) 1625 { 1626 struct dp_mon_ops *monitor_ops; 1627 struct dp_mon_soc *mon_soc = vdev->pdev->soc->monitor_soc; 1628 1629 if (!mon_soc) 1630 return QDF_STATUS_E_FAILURE; 1631 1632 monitor_ops = mon_soc->mon_ops; 1633 if (!monitor_ops || !monitor_ops->mon_vdev_attach) { 1634 dp_mon_debug("callback not registered"); 1635 return QDF_STATUS_E_FAILURE; 1636 } 1637 1638 return monitor_ops->mon_vdev_attach(vdev); 1639 } 1640 1641 /* 1642 * dp_monitor_vdev_detach() - Monitor vdev detach 1643 * @vdev: point to vdev 1644 * 1645 * Return: return QDF_STATUS 1646 */ 1647 static inline QDF_STATUS dp_monitor_vdev_detach(struct dp_vdev *vdev) 1648 { 1649 struct dp_mon_ops *monitor_ops; 1650 struct dp_mon_soc *mon_soc = vdev->pdev->soc->monitor_soc; 1651 1652 if (!mon_soc) 1653 return QDF_STATUS_E_FAILURE; 1654 1655 monitor_ops = mon_soc->mon_ops; 1656 if (!monitor_ops || !monitor_ops->mon_vdev_detach) { 1657 dp_mon_debug("callback not registered"); 1658 return QDF_STATUS_E_FAILURE; 1659 } 1660 1661 return monitor_ops->mon_vdev_detach(vdev); 1662 } 1663 1664 /* 1665 * dp_monitor_peer_attach() - Monitor peer attach 1666 * @soc: point to soc 1667 * @peer: point to peer 1668 * 1669 * Return: return QDF_STATUS 1670 */ 1671 static inline QDF_STATUS dp_monitor_peer_attach(struct dp_soc *soc, 1672 struct dp_peer *peer) 1673 { 1674 struct dp_mon_ops *monitor_ops; 1675 struct dp_mon_soc *mon_soc = soc->monitor_soc; 1676 1677 if (!mon_soc) 1678 return QDF_STATUS_E_FAILURE; 1679 1680 monitor_ops = mon_soc->mon_ops; 1681 if (!monitor_ops || !monitor_ops->mon_peer_attach) { 1682 dp_mon_debug("callback not registered"); 1683 return QDF_STATUS_E_FAILURE; 1684 } 1685 1686 return monitor_ops->mon_peer_attach(peer); 1687 } 1688 1689 /* 1690 * dp_monitor_peer_detach() - Monitor peer detach 1691 * @soc: point to soc 1692 * @peer: point to peer 1693 * 1694 * Return: return QDF_STATUS 1695 */ 1696 static inline QDF_STATUS dp_monitor_peer_detach(struct dp_soc *soc, 1697 struct dp_peer *peer) 1698 { 1699 struct dp_mon_ops *monitor_ops; 1700 struct dp_mon_soc *mon_soc = soc->monitor_soc; 1701 1702 if (!mon_soc) 1703 return QDF_STATUS_E_FAILURE; 1704 1705 monitor_ops = mon_soc->mon_ops; 1706 if (!monitor_ops || !monitor_ops->mon_peer_detach) { 1707 dp_mon_debug("callback not registered"); 1708 return QDF_STATUS_E_FAILURE; 1709 } 1710 1711 return monitor_ops->mon_peer_detach(peer); 1712 } 1713 1714 /* 1715 * dp_monitor_peer_get_rdkstats_ctx() - Get RDK stats context from monitor peer 1716 * @soc: Datapath soc handle 1717 * @peer: Datapath peer handle 1718 * 1719 * Return: RDK stats context 1720 */ 1721 static inline struct cdp_peer_rate_stats_ctx* 1722 dp_monitor_peer_get_rdkstats_ctx(struct dp_soc *soc, struct dp_peer *peer) 1723 { 1724 struct dp_mon_ops *monitor_ops; 1725 struct dp_mon_soc *mon_soc = soc->monitor_soc; 1726 1727 if (!mon_soc) 1728 return NULL; 1729 1730 monitor_ops = mon_soc->mon_ops; 1731 if (!monitor_ops || !monitor_ops->mon_peer_get_rdkstats_ctx) { 1732 dp_mon_debug("callback not registered"); 1733 return NULL; 1734 } 1735 1736 return monitor_ops->mon_peer_get_rdkstats_ctx(peer); 1737 } 1738 1739 /* 1740 * dp_monitor_peer_reset_stats() - Reset monitor peer stats 1741 * @soc: Datapath soc handle 1742 * @peer: Datapath peer handle 1743 * 1744 * Return: none 1745 */ 1746 static inline void dp_monitor_peer_reset_stats(struct dp_soc *soc, 1747 struct dp_peer *peer) 1748 { 1749 struct dp_mon_ops *monitor_ops; 1750 struct dp_mon_soc *mon_soc = soc->monitor_soc; 1751 1752 if (!mon_soc) 1753 return; 1754 1755 monitor_ops = mon_soc->mon_ops; 1756 if (!monitor_ops || !monitor_ops->mon_peer_reset_stats) { 1757 dp_mon_debug("callback not registered"); 1758 return; 1759 } 1760 1761 monitor_ops->mon_peer_reset_stats(peer); 1762 } 1763 1764 /* 1765 * dp_monitor_peer_get_stats() - Get monitor peer stats 1766 * @soc: Datapath soc handle 1767 * @peer: Datapath peer handle 1768 * @arg: Pointer to stats struct 1769 * @type: Update type 1770 * 1771 * Return: none 1772 */ 1773 static inline 1774 void dp_monitor_peer_get_stats(struct dp_soc *soc, struct dp_peer *peer, 1775 void *arg, enum cdp_stat_update_type type) 1776 { 1777 struct dp_mon_ops *monitor_ops; 1778 struct dp_mon_soc *mon_soc = soc->monitor_soc; 1779 1780 if (!mon_soc) 1781 return; 1782 1783 monitor_ops = mon_soc->mon_ops; 1784 if (!monitor_ops || !monitor_ops->mon_peer_get_stats) { 1785 dp_mon_debug("callback not registered"); 1786 return; 1787 } 1788 1789 monitor_ops->mon_peer_get_stats(peer, arg, type); 1790 } 1791 1792 /* 1793 * dp_monitor_invalid_peer_update_pdev_stats() - Update pdev stats from 1794 * invalid monitor peer 1795 * @soc: Datapath soc handle 1796 * @pdev: Datapath pdev handle 1797 * 1798 * Return: none 1799 */ 1800 static inline 1801 void dp_monitor_invalid_peer_update_pdev_stats(struct dp_soc *soc, 1802 struct dp_pdev *pdev) 1803 { 1804 struct dp_mon_ops *monitor_ops; 1805 struct dp_mon_soc *mon_soc = soc->monitor_soc; 1806 1807 if (!mon_soc) 1808 return; 1809 1810 monitor_ops = mon_soc->mon_ops; 1811 if (!monitor_ops || !monitor_ops->mon_invalid_peer_update_pdev_stats) { 1812 dp_mon_debug("callback not registered"); 1813 return; 1814 } 1815 1816 monitor_ops->mon_invalid_peer_update_pdev_stats(pdev); 1817 } 1818 1819 /* 1820 * dp_monitor_peer_get_stats_param() - Get stats param value from monitor peer 1821 * @soc: Datapath soc handle 1822 * @peer: Datapath peer handle 1823 * @type: Stats type requested 1824 * @buf: Pointer to buffer for stats param 1825 * 1826 * Return: QDF_STATUS 1827 */ 1828 static inline QDF_STATUS 1829 dp_monitor_peer_get_stats_param(struct dp_soc *soc, struct dp_peer *peer, 1830 enum cdp_peer_stats_type type, 1831 cdp_peer_stats_param_t *buf) 1832 { 1833 struct dp_mon_ops *monitor_ops; 1834 struct dp_mon_soc *mon_soc = soc->monitor_soc; 1835 1836 if (!mon_soc) 1837 return QDF_STATUS_E_FAILURE; 1838 1839 monitor_ops = mon_soc->mon_ops; 1840 if (!monitor_ops || !monitor_ops->mon_peer_get_stats_param) { 1841 dp_mon_debug("callback not registered"); 1842 return QDF_STATUS_E_FAILURE; 1843 } 1844 1845 return monitor_ops->mon_peer_get_stats_param(peer, type, buf); 1846 } 1847 1848 /* 1849 * dp_monitor_pdev_init() - Monitor pdev init 1850 * @pdev: point to pdev 1851 * 1852 * Return: return QDF_STATUS 1853 */ 1854 static inline QDF_STATUS dp_monitor_pdev_init(struct dp_pdev *pdev) 1855 { 1856 struct dp_mon_ops *monitor_ops; 1857 struct dp_mon_soc *mon_soc = pdev->soc->monitor_soc; 1858 1859 /* 1860 * mon_soc uninitialized when modular support enabled 1861 * monitor related attach/detach/init/deinit 1862 * will be done while monitor insmod 1863 */ 1864 if (!mon_soc) 1865 return QDF_STATUS_SUCCESS; 1866 1867 monitor_ops = mon_soc->mon_ops; 1868 if (!monitor_ops || !monitor_ops->mon_pdev_init) { 1869 dp_mon_debug("callback not registered"); 1870 return QDF_STATUS_E_FAILURE; 1871 } 1872 1873 return monitor_ops->mon_pdev_init(pdev); 1874 } 1875 1876 /* 1877 * dp_monitor_pdev_deinit() - Monitor pdev deinit 1878 * @pdev: point to pdev 1879 * 1880 * Return: return QDF_STATUS 1881 */ 1882 static inline QDF_STATUS dp_monitor_pdev_deinit(struct dp_pdev *pdev) 1883 { 1884 struct dp_mon_ops *monitor_ops; 1885 struct dp_mon_soc *mon_soc = pdev->soc->monitor_soc; 1886 1887 /* 1888 * mon_soc uninitialized modular when support enabled 1889 * monitor related attach/detach/init/deinit 1890 * will be done while monitor insmod 1891 */ 1892 if (!mon_soc) 1893 return QDF_STATUS_SUCCESS; 1894 1895 monitor_ops = mon_soc->mon_ops; 1896 if (!monitor_ops || !monitor_ops->mon_pdev_deinit) { 1897 dp_mon_debug("callback not registered"); 1898 return QDF_STATUS_E_FAILURE; 1899 } 1900 1901 return monitor_ops->mon_pdev_deinit(pdev); 1902 } 1903 1904 /* 1905 * dp_monitor_soc_cfg_init() - Monitor sco cfg init 1906 * @soc: point to soc 1907 * 1908 * Return: return QDF_STATUS 1909 */ 1910 static inline QDF_STATUS dp_monitor_soc_cfg_init(struct dp_soc *soc) 1911 { 1912 struct dp_mon_ops *monitor_ops; 1913 struct dp_mon_soc *mon_soc = soc->monitor_soc; 1914 1915 /* 1916 * this API is getting call from dp_soc_init, 1917 * mon_soc will be uninitialized when monitor support enabled 1918 * So returning QDF_STATUS_SUCCESS. 1919 * soc cfg init will be done while monitor insmod. 1920 */ 1921 if (!mon_soc) 1922 return QDF_STATUS_SUCCESS; 1923 1924 monitor_ops = mon_soc->mon_ops; 1925 if (!monitor_ops || !monitor_ops->mon_soc_cfg_init) { 1926 dp_mon_debug("callback not registered"); 1927 return QDF_STATUS_E_FAILURE; 1928 } 1929 1930 return monitor_ops->mon_soc_cfg_init(soc); 1931 } 1932 1933 /* 1934 * dp_monitor_config_debug_sniffer() - Monitor config debug sniffer 1935 * @pdev: point to pdev 1936 * @val: val 1937 * 1938 * Return: return QDF_STATUS 1939 */ 1940 static inline QDF_STATUS dp_monitor_config_debug_sniffer(struct dp_pdev *pdev, 1941 int val) 1942 { 1943 struct dp_mon_ops *monitor_ops; 1944 struct dp_mon_soc *mon_soc = pdev->soc->monitor_soc; 1945 1946 if (!mon_soc) 1947 return QDF_STATUS_E_FAILURE; 1948 1949 monitor_ops = mon_soc->mon_ops; 1950 if (!monitor_ops || !monitor_ops->mon_config_debug_sniffer) { 1951 dp_mon_debug("callback not registered"); 1952 return QDF_STATUS_E_FAILURE; 1953 } 1954 1955 return monitor_ops->mon_config_debug_sniffer(pdev, val); 1956 } 1957 1958 /* 1959 * dp_monitor_flush_rings() - Flush monitor rings 1960 * @soc: point to soc 1961 * 1962 * Return: None 1963 */ 1964 static inline void dp_monitor_flush_rings(struct dp_soc *soc) 1965 { 1966 struct dp_mon_ops *monitor_ops; 1967 struct dp_mon_soc *mon_soc = soc->monitor_soc; 1968 1969 if (!mon_soc) { 1970 dp_mon_debug("monitor soc is NULL"); 1971 return; 1972 } 1973 1974 monitor_ops = mon_soc->mon_ops; 1975 if (!monitor_ops || !monitor_ops->mon_flush_rings) { 1976 dp_mon_debug("callback not registered"); 1977 return; 1978 } 1979 1980 return monitor_ops->mon_flush_rings(soc); 1981 } 1982 1983 /* 1984 * dp_monitor_htt_srng_setup() - Setup htt srng 1985 * @soc: point to soc 1986 * @pdev: point to pdev 1987 * @mac_id: lmac id 1988 * @mac for pdev: pdev id 1989 * 1990 * Return: QDF_STATUS 1991 */ 1992 #if !defined(DISABLE_MON_CONFIG) 1993 static inline QDF_STATUS dp_monitor_htt_srng_setup(struct dp_soc *soc, 1994 struct dp_pdev *pdev, 1995 int mac_id, 1996 int mac_for_pdev) 1997 { 1998 struct dp_mon_ops *monitor_ops; 1999 struct dp_mon_soc *mon_soc = soc->monitor_soc; 2000 2001 if (!mon_soc) { 2002 dp_mon_debug("monitor soc is NULL"); 2003 return QDF_STATUS_SUCCESS; 2004 } 2005 2006 monitor_ops = mon_soc->mon_ops; 2007 if (!monitor_ops || !monitor_ops->mon_pdev_htt_srng_setup) { 2008 dp_mon_debug("callback not registered"); 2009 return QDF_STATUS_E_FAILURE; 2010 } 2011 2012 return monitor_ops->mon_pdev_htt_srng_setup(soc, pdev, mac_id, 2013 mac_for_pdev); 2014 } 2015 2016 static inline QDF_STATUS dp_monitor_soc_htt_srng_setup(struct dp_soc *soc) 2017 { 2018 struct dp_mon_ops *monitor_ops; 2019 struct dp_mon_soc *mon_soc = soc->monitor_soc; 2020 2021 if (!mon_soc) { 2022 dp_mon_debug("monitor soc is NULL"); 2023 return QDF_STATUS_SUCCESS; 2024 } 2025 2026 monitor_ops = mon_soc->mon_ops; 2027 if (!monitor_ops || !monitor_ops->mon_soc_htt_srng_setup) { 2028 dp_mon_debug("callback not registered"); 2029 return QDF_STATUS_E_FAILURE; 2030 } 2031 2032 return monitor_ops->mon_soc_htt_srng_setup(soc); 2033 } 2034 #else 2035 static inline QDF_STATUS dp_monitor_htt_srng_setup(struct dp_soc *soc, 2036 struct dp_pdev *pdev, 2037 int mac_id, 2038 int mac_for_pdev) 2039 { 2040 return QDF_STATUS_SUCCESS; 2041 } 2042 #endif 2043 2044 /* 2045 * dp_monitor_service_mon_rings() - service monitor rings 2046 * @soc: point to soc 2047 * @quota: reap budget 2048 * 2049 * Return: None 2050 */ 2051 #if defined(DP_CON_MON) 2052 static inline 2053 void dp_monitor_service_mon_rings(struct dp_soc *soc, uint32_t quota) 2054 { 2055 struct dp_mon_ops *monitor_ops; 2056 struct dp_mon_soc *mon_soc = soc->monitor_soc; 2057 2058 if (!mon_soc) { 2059 dp_mon_debug("monitor soc is NULL"); 2060 return; 2061 } 2062 2063 monitor_ops = mon_soc->mon_ops; 2064 if (!monitor_ops || !monitor_ops->mon_service_rings) { 2065 dp_mon_debug("callback not registered"); 2066 return; 2067 } 2068 2069 return monitor_ops->mon_service_rings(soc, quota); 2070 } 2071 #endif 2072 2073 /* 2074 * dp_rx_monitor_process() - Process monitor 2075 * @soc: point to soc 2076 * @int_ctx: interrupt ctx 2077 * @mac_id: lma 2078 * @quota: 2079 * 2080 * Return: None 2081 */ 2082 #ifndef DISABLE_MON_CONFIG 2083 static inline 2084 uint32_t dp_monitor_process(struct dp_soc *soc, struct dp_intr *int_ctx, 2085 uint32_t mac_id, uint32_t quota) 2086 { 2087 struct dp_mon_soc *mon_soc = soc->monitor_soc; 2088 2089 if (!mon_soc) { 2090 dp_mon_debug("monitor soc is NULL"); 2091 return 0; 2092 } 2093 2094 if (!mon_soc->mon_rx_process) { 2095 dp_mon_debug("callback not registered"); 2096 return 0; 2097 } 2098 2099 return mon_soc->mon_rx_process(soc, int_ctx, mac_id, quota); 2100 } 2101 2102 static inline 2103 uint32_t dp_tx_mon_process(struct dp_soc *soc, struct dp_intr *int_ctx, 2104 uint32_t mac_id, uint32_t quota) 2105 { 2106 struct dp_mon_soc *mon_soc = soc->monitor_soc; 2107 struct dp_mon_ops *monitor_ops; 2108 2109 if (!mon_soc) { 2110 dp_mon_debug("monitor soc is NULL"); 2111 return 0; 2112 } 2113 2114 monitor_ops = mon_soc->mon_ops; 2115 if (!monitor_ops || !monitor_ops->mon_tx_process) { 2116 dp_mon_debug("callback not registered"); 2117 return 0; 2118 } 2119 2120 return monitor_ops->mon_tx_process(soc, int_ctx, mac_id, quota); 2121 } 2122 2123 static inline 2124 uint32_t dp_tx_mon_buf_refill(struct dp_intr *int_ctx) 2125 { 2126 struct dp_soc *soc = int_ctx->soc; 2127 struct dp_mon_ops *monitor_ops; 2128 struct dp_mon_soc *mon_soc = soc->monitor_soc; 2129 2130 if (!mon_soc) { 2131 dp_mon_debug("monitor soc is NULL"); 2132 return 0; 2133 } 2134 2135 monitor_ops = mon_soc->mon_ops; 2136 if (!monitor_ops || !monitor_ops->tx_mon_refill_buf_ring) { 2137 dp_mon_debug("callback not registered"); 2138 return 0; 2139 } 2140 2141 return monitor_ops->tx_mon_refill_buf_ring(int_ctx); 2142 } 2143 2144 static inline 2145 uint32_t dp_rx_mon_buf_refill(struct dp_intr *int_ctx) 2146 { 2147 struct dp_soc *soc = int_ctx->soc; 2148 struct dp_mon_ops *monitor_ops; 2149 struct dp_mon_soc *mon_soc = soc->monitor_soc; 2150 2151 if (!mon_soc) { 2152 dp_mon_debug("monitor soc is NULL"); 2153 return 0; 2154 } 2155 2156 monitor_ops = mon_soc->mon_ops; 2157 if (!monitor_ops || !monitor_ops->rx_mon_refill_buf_ring) { 2158 dp_mon_debug("callback not registered"); 2159 return 0; 2160 } 2161 2162 return monitor_ops->rx_mon_refill_buf_ring(int_ctx); 2163 } 2164 #else 2165 static inline 2166 uint32_t dp_monitor_process(struct dp_soc *soc, struct dp_intr *int_ctx, 2167 uint32_t mac_id, uint32_t quota) 2168 { 2169 return 0; 2170 } 2171 2172 static inline uint32_t 2173 dp_tx_mon_process(struct dp_soc *soc, struct dp_intr *int_ctx, 2174 uint32_t mac_id, uint32_t quota) 2175 { 2176 return 0; 2177 } 2178 2179 static inline 2180 uint32_t dp_tx_mon_buf_refill(struct dp_intr *int_ctx) 2181 { 2182 } 2183 2184 static inline 2185 uint32_t dp_rx_mon_buf_refill(struct dp_intr *int_ctx) 2186 { 2187 } 2188 #endif 2189 2190 /* 2191 * dp_monitor_drop_packets_for_mac() - monitor_drop_packets_for_mac 2192 * @pdev: point to pdev 2193 * @mac_id: 2194 * @quota: 2195 * 2196 * Return: 2197 */ 2198 #if !defined(DISABLE_MON_CONFIG) && defined(MON_ENABLE_DROP_FOR_MAC) 2199 static inline 2200 uint32_t dp_monitor_drop_packets_for_mac(struct dp_pdev *pdev, 2201 uint32_t mac_id, uint32_t quota) 2202 { 2203 struct dp_mon_ops *monitor_ops; 2204 struct dp_mon_soc *mon_soc = pdev->soc->monitor_soc; 2205 2206 if (!mon_soc) { 2207 dp_mon_debug("monitor soc is NULL"); 2208 return 0; 2209 } 2210 2211 monitor_ops = mon_soc->mon_ops; 2212 if (!monitor_ops || !monitor_ops->mon_drop_packets_for_mac) { 2213 dp_mon_debug("callback not registered"); 2214 return 0; 2215 } 2216 2217 return monitor_ops->mon_drop_packets_for_mac(pdev, 2218 mac_id, quota); 2219 } 2220 #else 2221 static inline 2222 uint32_t dp_monitor_drop_packets_for_mac(struct dp_pdev *pdev, 2223 uint32_t mac_id, uint32_t quota) 2224 { 2225 return 0; 2226 } 2227 #endif 2228 2229 /* 2230 * dp_monitor_peer_tx_init() - peer tx init 2231 * @pdev: point to pdev 2232 * @peer: point to peer 2233 * 2234 * Return: None 2235 */ 2236 static inline void dp_monitor_peer_tx_init(struct dp_pdev *pdev, 2237 struct dp_peer *peer) 2238 { 2239 struct dp_mon_ops *monitor_ops; 2240 struct dp_mon_soc *mon_soc = pdev->soc->monitor_soc; 2241 2242 if (!mon_soc) { 2243 dp_mon_debug("monitor soc is NULL"); 2244 return; 2245 } 2246 2247 monitor_ops = mon_soc->mon_ops; 2248 if (!monitor_ops || !monitor_ops->mon_peer_tx_init) { 2249 dp_mon_debug("callback not registered"); 2250 return; 2251 } 2252 2253 return monitor_ops->mon_peer_tx_init(pdev, peer); 2254 } 2255 2256 /* 2257 * dp_monitor_peer_tx_cleanup() - peer tx cleanup 2258 * @vdev: point to vdev 2259 * @peer: point to peer 2260 * 2261 * Return: None 2262 */ 2263 static inline void dp_monitor_peer_tx_cleanup(struct dp_vdev *vdev, 2264 struct dp_peer *peer) 2265 { 2266 struct dp_mon_ops *monitor_ops; 2267 struct dp_mon_soc *mon_soc = vdev->pdev->soc->monitor_soc; 2268 2269 if (!mon_soc) { 2270 dp_mon_debug("monitor soc is NULL"); 2271 return; 2272 } 2273 2274 monitor_ops = mon_soc->mon_ops; 2275 if (!monitor_ops || !monitor_ops->mon_peer_tx_cleanup) { 2276 dp_mon_debug("callback not registered"); 2277 return; 2278 } 2279 2280 return monitor_ops->mon_peer_tx_cleanup(vdev, peer); 2281 } 2282 2283 #ifdef WIFI_MONITOR_SUPPORT 2284 /** 2285 * dp_monitor_peer_tid_peer_id_update() - peer tid update 2286 * @soc: point to soc 2287 * @peer: point to peer 2288 * @peer_id: peer id 2289 * 2290 * Return: None 2291 */ 2292 static inline 2293 void dp_monitor_peer_tid_peer_id_update(struct dp_soc *soc, 2294 struct dp_peer *peer, 2295 uint16_t peer_id) 2296 { 2297 struct dp_mon_ops *monitor_ops; 2298 struct dp_mon_soc *mon_soc = soc->monitor_soc; 2299 2300 if (!mon_soc) { 2301 dp_mon_debug("monitor soc is NULL"); 2302 return; 2303 } 2304 2305 monitor_ops = mon_soc->mon_ops; 2306 if (!monitor_ops || !monitor_ops->mon_peer_tid_peer_id_update) { 2307 dp_mon_debug("callback not registered"); 2308 return; 2309 } 2310 2311 return monitor_ops->mon_peer_tid_peer_id_update(peer, peer_id); 2312 } 2313 2314 /* 2315 * dp_monitor_tx_ppdu_stats_attach() - Attach tx ppdu stats 2316 * @pdev: point to pdev 2317 * 2318 * Return: None 2319 */ 2320 static inline void dp_monitor_tx_ppdu_stats_attach(struct dp_pdev *pdev) 2321 { 2322 struct dp_mon_ops *monitor_ops; 2323 struct dp_mon_soc *mon_soc = pdev->soc->monitor_soc; 2324 2325 if (!mon_soc) { 2326 dp_mon_debug("monitor soc is NULL"); 2327 return; 2328 } 2329 2330 monitor_ops = mon_soc->mon_ops; 2331 if (!monitor_ops || !monitor_ops->mon_tx_ppdu_stats_attach) { 2332 dp_mon_debug("callback not registered"); 2333 return; 2334 } 2335 2336 return monitor_ops->mon_tx_ppdu_stats_attach(pdev); 2337 } 2338 2339 /* 2340 * dp_monitor_tx_ppdu_stats_detach() - Detach tx ppdu stats 2341 * @pdev: point to pdev 2342 * 2343 * Return: None 2344 */ 2345 static inline void dp_monitor_tx_ppdu_stats_detach(struct dp_pdev *pdev) 2346 { 2347 struct dp_mon_ops *monitor_ops; 2348 struct dp_mon_soc *mon_soc = pdev->soc->monitor_soc; 2349 2350 if (!mon_soc) { 2351 dp_mon_debug("monitor soc is NULL"); 2352 return; 2353 } 2354 2355 monitor_ops = mon_soc->mon_ops; 2356 if (!monitor_ops || !monitor_ops->mon_tx_ppdu_stats_detach) { 2357 dp_mon_debug("callback not registered"); 2358 return; 2359 } 2360 2361 return monitor_ops->mon_tx_ppdu_stats_detach(pdev); 2362 } 2363 2364 /* 2365 * dp_monitor_tx_capture_debugfs_init() - Init tx capture debugfs 2366 * @pdev: point to pdev 2367 * 2368 * Return: QDF_STATUS_SUCCESS 2369 */ 2370 static inline 2371 QDF_STATUS dp_monitor_tx_capture_debugfs_init(struct dp_pdev *pdev) 2372 { 2373 struct dp_mon_ops *monitor_ops; 2374 struct dp_mon_soc *mon_soc = pdev->soc->monitor_soc; 2375 2376 if (!mon_soc) { 2377 dp_mon_debug("monitor soc is NULL"); 2378 return QDF_STATUS_E_FAILURE; 2379 } 2380 2381 monitor_ops = mon_soc->mon_ops; 2382 if (!monitor_ops || !monitor_ops->mon_tx_capture_debugfs_init) { 2383 dp_mon_debug("callback not registered"); 2384 return QDF_STATUS_E_FAILURE; 2385 } 2386 2387 return monitor_ops->mon_tx_capture_debugfs_init(pdev); 2388 } 2389 2390 /* 2391 * dp_monitor_peer_tx_capture_filter_check() - Check tx capture filter 2392 * @pdev: point to pdev 2393 * @peer: point to peer 2394 * 2395 * Return: None 2396 */ 2397 static inline void dp_monitor_peer_tx_capture_filter_check(struct dp_pdev *pdev, 2398 struct dp_peer *peer) 2399 { 2400 struct dp_mon_ops *monitor_ops; 2401 struct dp_mon_soc *mon_soc = pdev->soc->monitor_soc; 2402 2403 if (!mon_soc) { 2404 dp_mon_debug("monitor soc is NULL"); 2405 return; 2406 } 2407 2408 monitor_ops = mon_soc->mon_ops; 2409 if (!monitor_ops || !monitor_ops->mon_peer_tx_capture_filter_check) { 2410 dp_mon_debug("callback not registered"); 2411 return; 2412 } 2413 2414 return monitor_ops->mon_peer_tx_capture_filter_check(pdev, peer); 2415 } 2416 2417 /* 2418 * dp_monitor_tx_add_to_comp_queue() - add completion msdu to queue 2419 * 2420 * This API returns QDF_STATUS_SUCCESS in case where buffer is added 2421 * to txmonitor queue successfuly caller will not free the buffer in 2422 * this case. In other cases this API return QDF_STATUS_E_FAILURE and 2423 * caller frees the buffer 2424 * 2425 * @soc: point to soc 2426 * @desc: point to tx desc 2427 * @ts: Tx completion status from HAL/HTT descriptor 2428 * @peer id: DP peer id 2429 * 2430 * Return: QDF_STATUS 2431 * 2432 */ 2433 static inline 2434 QDF_STATUS dp_monitor_tx_add_to_comp_queue(struct dp_soc *soc, 2435 struct dp_tx_desc_s *desc, 2436 struct hal_tx_completion_status *ts, 2437 uint16_t peer_id) 2438 { 2439 struct dp_mon_ops *monitor_ops; 2440 struct dp_mon_soc *mon_soc = soc->monitor_soc; 2441 2442 if (!mon_soc) { 2443 dp_mon_debug("monitor soc is NULL"); 2444 return QDF_STATUS_E_FAILURE; 2445 } 2446 2447 monitor_ops = mon_soc->mon_ops; 2448 if (!monitor_ops || !monitor_ops->mon_tx_add_to_comp_queue) { 2449 dp_mon_debug("callback not registered"); 2450 return QDF_STATUS_E_FAILURE; 2451 } 2452 2453 return monitor_ops->mon_tx_add_to_comp_queue(soc, desc, ts, peer_id); 2454 } 2455 2456 static inline 2457 QDF_STATUS monitor_update_msdu_to_list(struct dp_soc *soc, 2458 struct dp_pdev *pdev, 2459 struct dp_peer *peer, 2460 struct hal_tx_completion_status *ts, 2461 qdf_nbuf_t netbuf) 2462 { 2463 struct dp_mon_ops *monitor_ops; 2464 struct dp_mon_soc *mon_soc = soc->monitor_soc; 2465 2466 if (!mon_soc) { 2467 dp_mon_debug("monitor soc is NULL"); 2468 return QDF_STATUS_SUCCESS; 2469 } 2470 2471 monitor_ops = mon_soc->mon_ops; 2472 if (!monitor_ops || !monitor_ops->mon_update_msdu_to_list) { 2473 dp_mon_debug("callback not registered"); 2474 return QDF_STATUS_E_FAILURE; 2475 } 2476 2477 return monitor_ops->mon_update_msdu_to_list(soc, pdev, 2478 peer, ts, netbuf); 2479 } 2480 2481 /* 2482 * dp_monitor_peer_tx_capture_get_stats - to get Peer Tx Capture stats 2483 * @soc: DP SOC handle 2484 * @peer: DP PEER handle 2485 * @stats: Pointer Peer tx capture stats 2486 * 2487 * Return: QDF_STATUS_E_FAILURE or QDF_STATUS_SUCCESS 2488 */ 2489 static inline QDF_STATUS 2490 dp_monitor_peer_tx_capture_get_stats(struct dp_soc *soc, struct dp_peer *peer, 2491 struct cdp_peer_tx_capture_stats *stats) 2492 { 2493 struct dp_mon_ops *monitor_ops; 2494 struct dp_mon_soc *mon_soc = soc->monitor_soc; 2495 2496 if (!mon_soc) { 2497 dp_mon_debug("monitor soc is NULL"); 2498 return QDF_STATUS_E_FAILURE; 2499 } 2500 2501 monitor_ops = mon_soc->mon_ops; 2502 if (!monitor_ops || !monitor_ops->mon_peer_tx_capture_get_stats) { 2503 dp_mon_debug("callback not registered"); 2504 return QDF_STATUS_E_FAILURE; 2505 } 2506 2507 return monitor_ops->mon_peer_tx_capture_get_stats(peer, stats); 2508 } 2509 2510 /* 2511 * dp_monitor_pdev_tx_capture_get_stats - to get pdev tx capture stats 2512 * @soc: DP SOC handle 2513 * @pdev: DP PDEV handle 2514 * @stats: Pointer to pdev tx capture stats 2515 * 2516 * Return: QDF_STATUS_E_FAILURE or QDF_STATUS_SUCCESS 2517 */ 2518 static inline QDF_STATUS 2519 dp_monitor_pdev_tx_capture_get_stats(struct dp_soc *soc, struct dp_pdev *pdev, 2520 struct cdp_pdev_tx_capture_stats *stats) 2521 { 2522 struct dp_mon_ops *monitor_ops; 2523 struct dp_mon_soc *mon_soc = soc->monitor_soc; 2524 2525 if (!mon_soc) { 2526 dp_mon_debug("monitor soc is NULL"); 2527 return QDF_STATUS_E_FAILURE; 2528 } 2529 2530 monitor_ops = mon_soc->mon_ops; 2531 if (!monitor_ops || !monitor_ops->mon_pdev_tx_capture_get_stats) { 2532 dp_mon_debug("callback not registered"); 2533 return QDF_STATUS_E_FAILURE; 2534 } 2535 2536 return monitor_ops->mon_pdev_tx_capture_get_stats(pdev, stats); 2537 } 2538 #else 2539 static inline 2540 void dp_monitor_peer_tid_peer_id_update(struct dp_soc *soc, 2541 struct dp_peer *peer, 2542 uint16_t peer_id) 2543 { 2544 } 2545 2546 static inline void dp_monitor_tx_ppdu_stats_attach(struct dp_pdev *pdev) 2547 { 2548 } 2549 2550 static inline void dp_monitor_tx_ppdu_stats_detach(struct dp_pdev *pdev) 2551 { 2552 } 2553 2554 static inline 2555 QDF_STATUS dp_monitor_tx_capture_debugfs_init(struct dp_pdev *pdev) 2556 { 2557 return QDF_STATUS_E_FAILURE; 2558 } 2559 2560 static inline void dp_monitor_peer_tx_capture_filter_check(struct dp_pdev *pdev, 2561 struct dp_peer *peer) 2562 { 2563 } 2564 2565 static inline 2566 QDF_STATUS dp_monitor_tx_add_to_comp_queue(struct dp_soc *soc, 2567 struct dp_tx_desc_s *desc, 2568 struct hal_tx_completion_status *ts, 2569 uint16_t peer_id) 2570 { 2571 return QDF_STATUS_E_FAILURE; 2572 } 2573 2574 static inline 2575 QDF_STATUS monitor_update_msdu_to_list(struct dp_soc *soc, 2576 struct dp_pdev *pdev, 2577 struct dp_peer *peer, 2578 struct hal_tx_completion_status *ts, 2579 qdf_nbuf_t netbuf) 2580 { 2581 return QDF_STATUS_E_FAILURE; 2582 } 2583 2584 static inline QDF_STATUS 2585 dp_monitor_peer_tx_capture_get_stats(struct dp_soc *soc, struct dp_peer *peer, 2586 struct cdp_peer_tx_capture_stats *stats) 2587 { 2588 return QDF_STATUS_E_FAILURE; 2589 } 2590 2591 static inline QDF_STATUS 2592 dp_monitor_pdev_tx_capture_get_stats(struct dp_soc *soc, struct dp_pdev *pdev, 2593 struct cdp_pdev_tx_capture_stats *stats) 2594 { 2595 return QDF_STATUS_E_FAILURE; 2596 } 2597 #endif 2598 2599 /* 2600 * dp_monitor_ppdu_stats_ind_handler() - PPDU stats msg handler 2601 * @htt_soc: HTT SOC handle 2602 * @msg_word: Pointer to payload 2603 * @htt_t2h_msg: HTT msg nbuf 2604 * 2605 * Return: True if buffer should be freed by caller. 2606 */ 2607 #if defined(WDI_EVENT_ENABLE) &&\ 2608 (defined(QCA_ENHANCED_STATS_SUPPORT) || !defined(REMOVE_PKT_LOG)) 2609 static inline bool dp_monitor_ppdu_stats_ind_handler(struct htt_soc *soc, 2610 uint32_t *msg_word, 2611 qdf_nbuf_t htt_t2h_msg) 2612 { 2613 struct dp_mon_ops *monitor_ops; 2614 struct dp_mon_soc *mon_soc = soc->dp_soc->monitor_soc; 2615 2616 if (!mon_soc) { 2617 dp_mon_debug("monitor soc is NULL"); 2618 return true; 2619 } 2620 2621 monitor_ops = mon_soc->mon_ops; 2622 if (!monitor_ops || !monitor_ops->mon_ppdu_stats_ind_handler) { 2623 dp_mon_debug("callback not registered"); 2624 return true; 2625 } 2626 2627 return monitor_ops->mon_ppdu_stats_ind_handler(soc, msg_word, 2628 htt_t2h_msg); 2629 } 2630 #else 2631 static inline bool dp_monitor_ppdu_stats_ind_handler(struct htt_soc *soc, 2632 uint32_t *msg_word, 2633 qdf_nbuf_t htt_t2h_msg) 2634 { 2635 return true; 2636 } 2637 #endif 2638 2639 /* 2640 * dp_monitor_htt_ppdu_stats_attach() - attach resources for HTT PPDU 2641 * stats processing 2642 * @pdev: Datapath PDEV handle 2643 * 2644 * Return: QDF_STATUS 2645 */ 2646 static inline QDF_STATUS dp_monitor_htt_ppdu_stats_attach(struct dp_pdev *pdev) 2647 { 2648 struct dp_mon_ops *monitor_ops; 2649 struct dp_mon_soc *mon_soc = pdev->soc->monitor_soc; 2650 2651 if (!mon_soc) { 2652 dp_mon_debug("monitor soc is NULL"); 2653 return QDF_STATUS_SUCCESS; 2654 } 2655 2656 monitor_ops = mon_soc->mon_ops; 2657 if (!monitor_ops || !monitor_ops->mon_htt_ppdu_stats_attach) { 2658 dp_mon_debug("callback not registered"); 2659 return QDF_STATUS_E_FAILURE; 2660 } 2661 2662 return monitor_ops->mon_htt_ppdu_stats_attach(pdev); 2663 } 2664 2665 /* 2666 * dp_monitor_htt_ppdu_stats_detach() - detach stats resources 2667 * @pdev: Datapath PDEV handle 2668 * 2669 * Return: void 2670 */ 2671 static inline void dp_monitor_htt_ppdu_stats_detach(struct dp_pdev *pdev) 2672 { 2673 struct dp_mon_ops *monitor_ops; 2674 struct dp_mon_soc *mon_soc = pdev->soc->monitor_soc; 2675 2676 if (!mon_soc) { 2677 dp_mon_debug("monitor soc is NULL"); 2678 return; 2679 } 2680 2681 monitor_ops = mon_soc->mon_ops; 2682 if (!monitor_ops || !monitor_ops->mon_htt_ppdu_stats_detach) { 2683 dp_mon_debug("callback not registered"); 2684 return; 2685 } 2686 2687 return monitor_ops->mon_htt_ppdu_stats_detach(pdev); 2688 } 2689 2690 /* 2691 * dp_monitor_print_pdev_rx_mon_stats() - print rx mon stats 2692 * @pdev: Datapath PDEV handle 2693 * 2694 * Return: void 2695 */ 2696 static inline void dp_monitor_print_pdev_rx_mon_stats(struct dp_pdev *pdev) 2697 { 2698 struct dp_mon_ops *monitor_ops; 2699 struct dp_mon_soc *mon_soc = pdev->soc->monitor_soc; 2700 2701 if (!mon_soc) { 2702 dp_mon_debug("monitor soc is NULL"); 2703 return; 2704 } 2705 2706 monitor_ops = mon_soc->mon_ops; 2707 if (!monitor_ops || !monitor_ops->mon_print_pdev_rx_mon_stats) { 2708 dp_mon_debug("callback not registered"); 2709 return; 2710 } 2711 2712 return monitor_ops->mon_print_pdev_rx_mon_stats(pdev); 2713 } 2714 2715 #ifdef WIFI_MONITOR_SUPPORT 2716 /* 2717 * dp_monitor_print_pdev_tx_capture_stats() - print tx capture stats 2718 * @pdev: Datapath PDEV handle 2719 * 2720 * Return: void 2721 */ 2722 static inline void dp_monitor_print_pdev_tx_capture_stats(struct dp_pdev *pdev) 2723 { 2724 struct dp_mon_ops *monitor_ops; 2725 struct dp_mon_soc *mon_soc = pdev->soc->monitor_soc; 2726 2727 if (!mon_soc) { 2728 dp_mon_debug("monitor soc is NULL"); 2729 return; 2730 } 2731 2732 monitor_ops = mon_soc->mon_ops; 2733 if (!monitor_ops || !monitor_ops->mon_print_pdev_tx_capture_stats) { 2734 dp_mon_debug("callback not registered"); 2735 return; 2736 } 2737 2738 return monitor_ops->mon_print_pdev_tx_capture_stats(pdev); 2739 } 2740 2741 /** 2742 * dp_monitor_config_enh_tx_capture() - configure tx capture 2743 * @pdev: Datapath PDEV handle 2744 * @val: mode 2745 * 2746 * Return: status 2747 */ 2748 static inline QDF_STATUS dp_monitor_config_enh_tx_capture(struct dp_pdev *pdev, 2749 uint32_t val) 2750 { 2751 struct dp_mon_ops *monitor_ops; 2752 struct dp_mon_soc *mon_soc = pdev->soc->monitor_soc; 2753 2754 if (!mon_soc) { 2755 dp_mon_debug("monitor soc is NULL"); 2756 return QDF_STATUS_E_FAILURE; 2757 } 2758 2759 monitor_ops = mon_soc->mon_ops; 2760 if (!monitor_ops || !monitor_ops->mon_config_enh_tx_capture) { 2761 dp_mon_debug("callback not registered"); 2762 return QDF_STATUS_E_FAILURE; 2763 } 2764 2765 return monitor_ops->mon_config_enh_tx_capture(pdev, val); 2766 } 2767 2768 /** 2769 * dp_monitor_tx_peer_filter() - add tx monitor peer filter 2770 * @pdev: Datapath PDEV handle 2771 * @peer: Datapath PEER handle 2772 * @is_tx_pkt_cap_enable: flag for tx capture enable/disable 2773 * @peer_mac: peer mac address 2774 * 2775 * Return: status 2776 */ 2777 static inline QDF_STATUS dp_monitor_tx_peer_filter(struct dp_pdev *pdev, 2778 struct dp_peer *peer, 2779 uint8_t is_tx_pkt_cap_enable, 2780 uint8_t *peer_mac) 2781 { 2782 struct dp_mon_ops *monitor_ops; 2783 struct dp_mon_soc *mon_soc = pdev->soc->monitor_soc; 2784 2785 if (!mon_soc) { 2786 qdf_err("monitor soc is NULL"); 2787 return QDF_STATUS_E_FAILURE; 2788 } 2789 2790 monitor_ops = mon_soc->mon_ops; 2791 if (!monitor_ops || !monitor_ops->mon_tx_peer_filter) { 2792 qdf_err("callback not registered"); 2793 return QDF_STATUS_E_FAILURE; 2794 } 2795 2796 return monitor_ops->mon_tx_peer_filter(pdev, peer, is_tx_pkt_cap_enable, 2797 peer_mac); 2798 } 2799 #endif 2800 2801 #ifdef WLAN_RX_PKT_CAPTURE_ENH 2802 static inline QDF_STATUS dp_monitor_config_enh_rx_capture(struct dp_pdev *pdev, 2803 uint32_t val) 2804 { 2805 struct dp_mon_ops *monitor_ops; 2806 struct dp_mon_soc *mon_soc = pdev->soc->monitor_soc; 2807 2808 if (!mon_soc) { 2809 dp_mon_debug("monitor soc is NULL"); 2810 return QDF_STATUS_E_FAILURE; 2811 } 2812 2813 monitor_ops = mon_soc->mon_ops; 2814 if (!monitor_ops || !monitor_ops->mon_config_enh_rx_capture) { 2815 dp_mon_debug("callback not registered"); 2816 return QDF_STATUS_E_FAILURE; 2817 } 2818 2819 return monitor_ops->mon_config_enh_rx_capture(pdev, val); 2820 } 2821 #else 2822 static inline QDF_STATUS dp_monitor_config_enh_rx_capture(struct dp_pdev *pdev, 2823 uint32_t val) 2824 { 2825 return QDF_STATUS_E_INVAL; 2826 } 2827 #endif 2828 2829 #ifdef QCA_SUPPORT_BPR 2830 static inline QDF_STATUS dp_monitor_set_bpr_enable(struct dp_pdev *pdev, 2831 uint32_t val) 2832 { 2833 struct dp_mon_ops *monitor_ops; 2834 struct dp_mon_soc *mon_soc = pdev->soc->monitor_soc; 2835 2836 if (!mon_soc) { 2837 dp_mon_debug("monitor soc is NULL"); 2838 return QDF_STATUS_E_FAILURE; 2839 } 2840 2841 monitor_ops = mon_soc->mon_ops; 2842 if (!monitor_ops || !monitor_ops->mon_set_bpr_enable) { 2843 dp_mon_debug("callback not registered"); 2844 return QDF_STATUS_E_FAILURE; 2845 } 2846 2847 return monitor_ops->mon_set_bpr_enable(pdev, val); 2848 } 2849 #else 2850 static inline QDF_STATUS dp_monitor_set_bpr_enable(struct dp_pdev *pdev, 2851 uint32_t val) 2852 { 2853 return QDF_STATUS_E_FAILURE; 2854 } 2855 #endif 2856 2857 #ifdef ATH_SUPPORT_NAC 2858 static inline 2859 int dp_monitor_set_filter_neigh_peers(struct dp_pdev *pdev, bool val) 2860 { 2861 struct dp_mon_ops *monitor_ops; 2862 struct dp_mon_soc *mon_soc = pdev->soc->monitor_soc; 2863 2864 if (!mon_soc) { 2865 dp_mon_debug("monitor soc is NULL"); 2866 return 0; 2867 } 2868 2869 monitor_ops = mon_soc->mon_ops; 2870 if (!monitor_ops || !monitor_ops->mon_set_filter_neigh_peers) { 2871 dp_mon_debug("callback not registered"); 2872 return 0; 2873 } 2874 2875 return monitor_ops->mon_set_filter_neigh_peers(pdev, val); 2876 } 2877 #else 2878 static inline 2879 int dp_monitor_set_filter_neigh_peers(struct dp_pdev *pdev, bool val) 2880 { 2881 return 0; 2882 } 2883 #endif 2884 2885 #ifdef WLAN_ATF_ENABLE 2886 static inline 2887 void dp_monitor_set_atf_stats_enable(struct dp_pdev *pdev, bool value) 2888 { 2889 struct dp_mon_ops *monitor_ops; 2890 struct dp_mon_soc *mon_soc = pdev->soc->monitor_soc; 2891 2892 if (!mon_soc) { 2893 dp_mon_debug("monitor soc is NULL"); 2894 return; 2895 } 2896 2897 monitor_ops = mon_soc->mon_ops; 2898 if (!monitor_ops || !monitor_ops->mon_set_atf_stats_enable) { 2899 dp_mon_debug("callback not registered"); 2900 return; 2901 } 2902 2903 return monitor_ops->mon_set_atf_stats_enable(pdev, value); 2904 } 2905 #else 2906 static inline 2907 void dp_monitor_set_atf_stats_enable(struct dp_pdev *pdev, bool value) 2908 { 2909 } 2910 #endif 2911 2912 static inline 2913 void dp_monitor_set_bsscolor(struct dp_pdev *pdev, uint8_t bsscolor) 2914 { 2915 struct dp_mon_ops *monitor_ops; 2916 struct dp_mon_soc *mon_soc = pdev->soc->monitor_soc; 2917 2918 if (!mon_soc) { 2919 dp_mon_debug("monitor soc is NULL"); 2920 return; 2921 } 2922 2923 monitor_ops = mon_soc->mon_ops; 2924 if (!monitor_ops || !monitor_ops->mon_set_bsscolor) { 2925 dp_mon_debug("callback not registered"); 2926 return; 2927 } 2928 2929 return monitor_ops->mon_set_bsscolor(pdev, bsscolor); 2930 } 2931 2932 static inline 2933 bool dp_monitor_pdev_get_filter_mcast_data(struct cdp_pdev *pdev_handle) 2934 { 2935 struct dp_mon_ops *monitor_ops; 2936 struct dp_pdev *pdev = (struct dp_pdev *)pdev_handle; 2937 struct dp_mon_soc *mon_soc = pdev->soc->monitor_soc; 2938 2939 if (!mon_soc) { 2940 dp_mon_debug("monitor soc is NULL"); 2941 return false; 2942 } 2943 2944 monitor_ops = mon_soc->mon_ops; 2945 if (!monitor_ops || !monitor_ops->mon_pdev_get_filter_mcast_data) { 2946 dp_mon_debug("callback not registered"); 2947 return false; 2948 } 2949 2950 return monitor_ops->mon_pdev_get_filter_mcast_data(pdev_handle); 2951 } 2952 2953 static inline 2954 bool dp_monitor_pdev_get_filter_non_data(struct cdp_pdev *pdev_handle) 2955 { 2956 struct dp_mon_ops *monitor_ops; 2957 struct dp_pdev *pdev = (struct dp_pdev *)pdev_handle; 2958 struct dp_mon_soc *mon_soc = pdev->soc->monitor_soc; 2959 2960 if (!mon_soc) { 2961 dp_mon_debug("monitor soc is NULL"); 2962 return false; 2963 } 2964 2965 monitor_ops = mon_soc->mon_ops; 2966 if (!monitor_ops || !monitor_ops->mon_pdev_get_filter_non_data) { 2967 dp_mon_debug("callback not registered"); 2968 return false; 2969 } 2970 2971 return monitor_ops->mon_pdev_get_filter_non_data(pdev_handle); 2972 } 2973 2974 static inline 2975 bool dp_monitor_pdev_get_filter_ucast_data(struct cdp_pdev *pdev_handle) 2976 { 2977 struct dp_mon_ops *monitor_ops; 2978 struct dp_pdev *pdev = (struct dp_pdev *)pdev_handle; 2979 struct dp_mon_soc *mon_soc = pdev->soc->monitor_soc; 2980 2981 if (!mon_soc) { 2982 dp_mon_debug("monitor soc is NULL"); 2983 return false; 2984 } 2985 2986 monitor_ops = mon_soc->mon_ops; 2987 if (!monitor_ops || !monitor_ops->mon_pdev_get_filter_ucast_data) { 2988 dp_mon_debug("callback not registered"); 2989 return false; 2990 } 2991 2992 return monitor_ops->mon_pdev_get_filter_ucast_data(pdev_handle); 2993 } 2994 2995 #ifdef WDI_EVENT_ENABLE 2996 static inline 2997 int dp_monitor_set_pktlog_wifi3(struct dp_pdev *pdev, uint32_t event, 2998 bool enable) 2999 { 3000 struct dp_mon_ops *monitor_ops; 3001 struct dp_mon_soc *mon_soc = pdev->soc->monitor_soc; 3002 3003 if (!mon_soc) { 3004 dp_mon_debug("monitor soc is NULL"); 3005 return 0; 3006 } 3007 3008 monitor_ops = mon_soc->mon_ops; 3009 if (!monitor_ops || !monitor_ops->mon_set_pktlog_wifi3) { 3010 dp_mon_debug("callback not registered"); 3011 return 0; 3012 } 3013 3014 return monitor_ops->mon_set_pktlog_wifi3(pdev, event, enable); 3015 } 3016 #else 3017 static inline 3018 int dp_monitor_set_pktlog_wifi3(struct dp_pdev *pdev, uint32_t event, 3019 bool enable) 3020 { 3021 return 0; 3022 } 3023 #endif 3024 3025 #if defined(DP_CON_MON) && !defined(REMOVE_PKT_LOG) 3026 static inline void dp_monitor_pktlogmod_exit(struct dp_pdev *pdev) 3027 { 3028 struct dp_mon_ops *monitor_ops; 3029 struct dp_mon_soc *mon_soc = pdev->soc->monitor_soc; 3030 3031 if (!mon_soc) { 3032 dp_mon_debug("monitor soc is NULL"); 3033 return; 3034 } 3035 3036 monitor_ops = mon_soc->mon_ops; 3037 if (!monitor_ops || !monitor_ops->mon_pktlogmod_exit) { 3038 dp_mon_debug("callback not registered"); 3039 return; 3040 } 3041 3042 return monitor_ops->mon_pktlogmod_exit(pdev); 3043 } 3044 #else 3045 static inline void dp_monitor_pktlogmod_exit(struct dp_pdev *pdev) {} 3046 #endif 3047 3048 static inline 3049 void dp_monitor_vdev_set_monitor_mode_buf_rings(struct dp_pdev *pdev) 3050 { 3051 struct dp_mon_ops *monitor_ops; 3052 struct dp_mon_soc *mon_soc = pdev->soc->monitor_soc; 3053 3054 if (!mon_soc) { 3055 dp_mon_debug("monitor soc is NULL"); 3056 return; 3057 } 3058 3059 monitor_ops = mon_soc->mon_ops; 3060 if (!monitor_ops || !monitor_ops->mon_vdev_set_monitor_mode_buf_rings) { 3061 dp_mon_debug("callback not registered"); 3062 return; 3063 } 3064 3065 return monitor_ops->mon_vdev_set_monitor_mode_buf_rings(pdev); 3066 } 3067 3068 static inline 3069 void dp_monitor_neighbour_peers_detach(struct dp_pdev *pdev) 3070 { 3071 struct dp_mon_ops *monitor_ops; 3072 struct dp_mon_soc *mon_soc = pdev->soc->monitor_soc; 3073 3074 if (!mon_soc) { 3075 dp_mon_debug("monitor soc is NULL"); 3076 return; 3077 } 3078 3079 monitor_ops = mon_soc->mon_ops; 3080 if (!monitor_ops || !monitor_ops->mon_neighbour_peers_detach) { 3081 dp_mon_debug("callback not registered"); 3082 return; 3083 } 3084 3085 return monitor_ops->mon_neighbour_peers_detach(pdev); 3086 } 3087 3088 #ifdef FEATURE_NAC_RSSI 3089 static inline QDF_STATUS dp_monitor_filter_neighbour_peer(struct dp_pdev *pdev, 3090 uint8_t *rx_pkt_hdr) 3091 { 3092 struct dp_mon_ops *monitor_ops; 3093 struct dp_mon_soc *mon_soc = pdev->soc->monitor_soc; 3094 3095 if (!mon_soc) { 3096 dp_mon_debug("monitor soc is NULL"); 3097 return QDF_STATUS_E_FAILURE; 3098 } 3099 3100 monitor_ops = mon_soc->mon_ops; 3101 if (!monitor_ops || !monitor_ops->mon_filter_neighbour_peer) { 3102 dp_mon_debug("callback not registered"); 3103 return QDF_STATUS_E_FAILURE; 3104 } 3105 3106 return monitor_ops->mon_filter_neighbour_peer(pdev, rx_pkt_hdr); 3107 } 3108 #endif 3109 3110 static inline 3111 void dp_monitor_reap_timer_init(struct dp_soc *soc) 3112 { 3113 struct dp_mon_ops *monitor_ops; 3114 struct dp_mon_soc *mon_soc = soc->monitor_soc; 3115 3116 if (!mon_soc) { 3117 dp_mon_debug("monitor soc is NULL"); 3118 return; 3119 } 3120 3121 monitor_ops = mon_soc->mon_ops; 3122 if (!monitor_ops || !monitor_ops->mon_reap_timer_init) { 3123 dp_mon_debug("callback not registered"); 3124 return; 3125 } 3126 3127 monitor_ops->mon_reap_timer_init(soc); 3128 } 3129 3130 static inline 3131 void dp_monitor_reap_timer_deinit(struct dp_soc *soc) 3132 { 3133 struct dp_mon_ops *monitor_ops; 3134 struct dp_mon_soc *mon_soc = soc->monitor_soc; 3135 3136 if (!mon_soc) { 3137 dp_mon_debug("monitor soc is NULL"); 3138 return; 3139 } 3140 3141 monitor_ops = mon_soc->mon_ops; 3142 if (!monitor_ops || !monitor_ops->mon_reap_timer_deinit) { 3143 dp_mon_debug("callback not registered"); 3144 return; 3145 } 3146 3147 monitor_ops->mon_reap_timer_deinit(soc); 3148 } 3149 3150 static inline 3151 void dp_monitor_reap_timer_start(struct dp_soc *soc) 3152 { 3153 struct dp_mon_ops *monitor_ops; 3154 struct dp_mon_soc *mon_soc = soc->monitor_soc; 3155 3156 if (!mon_soc) { 3157 dp_mon_debug("monitor soc is NULL"); 3158 return; 3159 } 3160 3161 monitor_ops = mon_soc->mon_ops; 3162 if (!monitor_ops || !monitor_ops->mon_reap_timer_start) { 3163 dp_mon_debug("callback not registered"); 3164 return; 3165 } 3166 3167 monitor_ops->mon_reap_timer_start(soc); 3168 } 3169 3170 static inline 3171 bool dp_monitor_reap_timer_stop(struct dp_soc *soc) 3172 { 3173 struct dp_mon_ops *monitor_ops; 3174 struct dp_mon_soc *mon_soc = soc->monitor_soc; 3175 3176 if (!mon_soc) { 3177 dp_mon_debug("monitor soc is NULL"); 3178 return false; 3179 } 3180 3181 monitor_ops = mon_soc->mon_ops; 3182 if (!monitor_ops || !monitor_ops->mon_reap_timer_stop) { 3183 dp_mon_debug("callback not registered"); 3184 return false; 3185 } 3186 3187 return monitor_ops->mon_reap_timer_stop(soc); 3188 } 3189 3190 static inline 3191 void dp_monitor_vdev_timer_init(struct dp_soc *soc) 3192 { 3193 struct dp_mon_ops *monitor_ops; 3194 struct dp_mon_soc *mon_soc = soc->monitor_soc; 3195 3196 if (!mon_soc) { 3197 dp_mon_debug("monitor soc is NULL"); 3198 return; 3199 } 3200 3201 monitor_ops = mon_soc->mon_ops; 3202 if (!monitor_ops || !monitor_ops->mon_vdev_timer_init) { 3203 dp_mon_debug("callback not registered"); 3204 return; 3205 } 3206 3207 monitor_ops->mon_vdev_timer_init(soc); 3208 } 3209 3210 static inline 3211 void dp_monitor_vdev_timer_deinit(struct dp_soc *soc) 3212 { 3213 struct dp_mon_ops *monitor_ops; 3214 struct dp_mon_soc *mon_soc = soc->monitor_soc; 3215 3216 if (!mon_soc) { 3217 dp_mon_debug("monitor soc is NULL"); 3218 return; 3219 } 3220 3221 monitor_ops = mon_soc->mon_ops; 3222 if (!monitor_ops || !monitor_ops->mon_vdev_timer_deinit) { 3223 dp_mon_debug("callback not registered"); 3224 return; 3225 } 3226 3227 monitor_ops->mon_vdev_timer_deinit(soc); 3228 } 3229 3230 static inline 3231 void dp_monitor_vdev_timer_start(struct dp_soc *soc) 3232 { 3233 struct dp_mon_ops *monitor_ops; 3234 struct dp_mon_soc *mon_soc = soc->monitor_soc; 3235 3236 if (!mon_soc) { 3237 dp_mon_debug("monitor soc is NULL"); 3238 return; 3239 } 3240 3241 monitor_ops = mon_soc->mon_ops; 3242 if (!monitor_ops || !monitor_ops->mon_vdev_timer_start) { 3243 dp_mon_debug("callback not registered"); 3244 return; 3245 } 3246 3247 monitor_ops->mon_vdev_timer_start(soc); 3248 } 3249 3250 static inline 3251 bool dp_monitor_vdev_timer_stop(struct dp_soc *soc) 3252 { 3253 struct dp_mon_ops *monitor_ops; 3254 struct dp_mon_soc *mon_soc = soc->monitor_soc; 3255 3256 if (!mon_soc) { 3257 dp_mon_debug("monitor soc is NULL"); 3258 return false; 3259 } 3260 3261 monitor_ops = mon_soc->mon_ops; 3262 if (!monitor_ops || !monitor_ops->mon_vdev_timer_stop) { 3263 dp_mon_debug("callback not registered"); 3264 return false; 3265 } 3266 3267 return monitor_ops->mon_vdev_timer_stop(soc); 3268 } 3269 3270 #ifdef QCA_MCOPY_SUPPORT 3271 static inline 3272 QDF_STATUS dp_monitor_mcopy_check_deliver(struct dp_pdev *pdev, 3273 uint16_t peer_id, uint32_t ppdu_id, 3274 uint8_t first_msdu) 3275 { 3276 struct dp_mon_ops *monitor_ops; 3277 struct dp_mon_soc *mon_soc = pdev->soc->monitor_soc; 3278 3279 if (!mon_soc) { 3280 dp_mon_debug("monitor soc is NULL"); 3281 return QDF_STATUS_E_FAILURE; 3282 } 3283 3284 monitor_ops = mon_soc->mon_ops; 3285 if (!monitor_ops || !monitor_ops->mon_mcopy_check_deliver) { 3286 dp_mon_debug("callback not registered"); 3287 return QDF_STATUS_E_FAILURE; 3288 } 3289 3290 return monitor_ops->mon_mcopy_check_deliver(pdev, peer_id, 3291 ppdu_id, first_msdu); 3292 } 3293 #else 3294 static inline 3295 QDF_STATUS dp_monitor_mcopy_check_deliver(struct dp_pdev *pdev, 3296 uint16_t peer_id, uint32_t ppdu_id, 3297 uint8_t first_msdu) 3298 { 3299 return QDF_STATUS_SUCCESS; 3300 } 3301 #endif 3302 3303 /* 3304 * dp_monitor_neighbour_peer_add_ast() - Add ast entry 3305 * @pdev: point to dp pdev 3306 * @ta_peer: point to peer 3307 * @mac_addr: mac address 3308 * @nbuf: point to nbuf 3309 * @flags: flags 3310 * 3311 * Return: void 3312 */ 3313 static inline void 3314 dp_monitor_neighbour_peer_add_ast(struct dp_pdev *pdev, 3315 struct dp_peer *ta_peer, 3316 uint8_t *mac_addr, 3317 qdf_nbuf_t nbuf, 3318 uint32_t flags) 3319 { 3320 struct dp_mon_soc *mon_soc = pdev->soc->monitor_soc; 3321 struct dp_mon_ops *monitor_ops; 3322 3323 if (!mon_soc) { 3324 dp_mon_debug("monitor soc is NULL"); 3325 return; 3326 } 3327 3328 monitor_ops = mon_soc->mon_ops; 3329 if (!monitor_ops || !monitor_ops->mon_neighbour_peer_add_ast) { 3330 dp_mon_debug("callback not registered"); 3331 return; 3332 } 3333 3334 return monitor_ops->mon_neighbour_peer_add_ast(pdev, ta_peer, mac_addr, 3335 nbuf, flags); 3336 } 3337 3338 /* 3339 * dp_monitor_vdev_delete() - delete monitor vdev 3340 * @soc: point to dp soc 3341 * @vdev: point to dp vdev 3342 * 3343 * Return: void 3344 */ 3345 static inline void dp_monitor_vdev_delete(struct dp_soc *soc, 3346 struct dp_vdev *vdev) 3347 { 3348 if (soc->intr_mode == DP_INTR_POLL) { 3349 qdf_timer_sync_cancel(&soc->int_timer); 3350 dp_monitor_flush_rings(soc); 3351 } else if (soc->intr_mode == DP_INTR_MSI) { 3352 if (dp_monitor_vdev_timer_stop(soc)) 3353 dp_monitor_flush_rings(soc); 3354 } 3355 3356 dp_monitor_vdev_detach(vdev); 3357 } 3358 3359 #ifdef DP_POWER_SAVE 3360 /* 3361 * dp_monitor_pktlog_reap_pending_frames() - reap pending frames 3362 * @pdev: point to dp pdev 3363 * 3364 * Return: void 3365 */ 3366 static inline void dp_monitor_pktlog_reap_pending_frames(struct dp_pdev *pdev) 3367 { 3368 struct dp_soc *soc; 3369 3370 if (qdf_unlikely(!pdev || !pdev->monitor_pdev)) 3371 return; 3372 3373 soc = pdev->soc; 3374 3375 if (((pdev->monitor_pdev->rx_pktlog_mode != DP_RX_PKTLOG_DISABLED) || 3376 dp_mon_is_enable_reap_timer_non_pkt(pdev))) { 3377 if (dp_monitor_reap_timer_stop(soc)) 3378 dp_monitor_service_mon_rings(soc, DP_MON_REAP_BUDGET); 3379 } 3380 } 3381 3382 /* 3383 * dp_monitor_pktlog_start_reap_timer() - start reap timer 3384 * @pdev: point to dp pdev 3385 * 3386 * Return: void 3387 */ 3388 static inline void dp_monitor_pktlog_start_reap_timer(struct dp_pdev *pdev) 3389 { 3390 struct dp_soc *soc; 3391 3392 if (qdf_unlikely(!pdev || !pdev->monitor_pdev)) 3393 return; 3394 3395 soc = pdev->soc; 3396 if (((pdev->monitor_pdev->rx_pktlog_mode != DP_RX_PKTLOG_DISABLED) || 3397 dp_mon_is_enable_reap_timer_non_pkt(pdev))) 3398 dp_monitor_reap_timer_start(soc); 3399 } 3400 #endif 3401 3402 /* 3403 * dp_monitor_neighbour_peer_list_remove() - remove neighbour peer list 3404 * @pdev: point to dp pdev 3405 * @vdev: point to dp vdev 3406 * @peer: point to dp_neighbour_peer 3407 * 3408 * Return: void 3409 */ 3410 static inline 3411 void dp_monitor_neighbour_peer_list_remove(struct dp_pdev *pdev, 3412 struct dp_vdev *vdev, 3413 struct dp_neighbour_peer *peer) 3414 { 3415 struct dp_mon_pdev *mon_pdev; 3416 struct dp_neighbour_peer *temp_peer = NULL; 3417 3418 if (qdf_unlikely(!pdev || !pdev->monitor_pdev)) 3419 return; 3420 3421 mon_pdev = pdev->monitor_pdev; 3422 qdf_spin_lock_bh(&mon_pdev->neighbour_peer_mutex); 3423 if (!pdev->soc->monitor_soc->hw_nac_monitor_support) { 3424 TAILQ_FOREACH(peer, &mon_pdev->neighbour_peers_list, 3425 neighbour_peer_list_elem) { 3426 QDF_ASSERT(peer->vdev != vdev); 3427 } 3428 } else { 3429 TAILQ_FOREACH_SAFE(peer, &mon_pdev->neighbour_peers_list, 3430 neighbour_peer_list_elem, temp_peer) { 3431 if (peer->vdev == vdev) { 3432 TAILQ_REMOVE(&mon_pdev->neighbour_peers_list, 3433 peer, 3434 neighbour_peer_list_elem); 3435 qdf_mem_free(peer); 3436 } 3437 } 3438 } 3439 qdf_spin_unlock_bh(&mon_pdev->neighbour_peer_mutex); 3440 } 3441 3442 static inline 3443 void dp_monitor_pdev_set_mon_vdev(struct dp_vdev *vdev) 3444 { 3445 if (!vdev->pdev->monitor_pdev) 3446 return; 3447 3448 vdev->pdev->monitor_pdev->mvdev = vdev; 3449 } 3450 3451 static inline 3452 void dp_monitor_pdev_config_scan_spcl_vap(struct dp_pdev *pdev, bool val) 3453 { 3454 if (!pdev || !pdev->monitor_pdev) 3455 return; 3456 3457 pdev->monitor_pdev->scan_spcl_vap_configured = val; 3458 } 3459 3460 #ifdef QCA_SUPPORT_SCAN_SPCL_VAP_STATS 3461 static inline 3462 void dp_monitor_pdev_reset_scan_spcl_vap_stats_enable(struct dp_pdev *pdev, 3463 bool val) 3464 { 3465 if (!pdev || !pdev->monitor_pdev) 3466 return; 3467 3468 pdev->monitor_pdev->reset_scan_spcl_vap_stats_enable = val; 3469 } 3470 #else 3471 static inline 3472 void dp_monitor_pdev_reset_scan_spcl_vap_stats_enable(struct dp_pdev *pdev, 3473 bool val) 3474 { 3475 } 3476 #endif 3477 3478 static inline void 3479 dp_mon_rx_wmask_subscribe(struct dp_soc *soc, uint32_t *msg_word, 3480 struct htt_rx_ring_tlv_filter *tlv_filter) 3481 { 3482 struct dp_mon_soc *mon_soc = soc->monitor_soc; 3483 struct dp_mon_ops *monitor_ops; 3484 3485 if (!mon_soc) { 3486 dp_mon_debug("mon soc is NULL"); 3487 return; 3488 3489 } 3490 3491 monitor_ops = mon_soc->mon_ops; 3492 if (!monitor_ops || !monitor_ops->rx_wmask_subscribe) { 3493 dp_mon_debug("callback not registered"); 3494 return; 3495 } 3496 3497 monitor_ops->rx_wmask_subscribe(msg_word, tlv_filter); 3498 } 3499 3500 static inline void 3501 dp_mon_rx_enable_mpdu_logging(struct dp_soc *soc, uint32_t *msg_word, 3502 struct htt_rx_ring_tlv_filter *tlv_filter) 3503 { 3504 struct dp_mon_soc *mon_soc = soc->monitor_soc; 3505 struct dp_mon_ops *monitor_ops; 3506 3507 if (!mon_soc) { 3508 dp_mon_debug("mon soc is NULL"); 3509 return; 3510 3511 } 3512 3513 monitor_ops = mon_soc->mon_ops; 3514 if (!monitor_ops || !monitor_ops->rx_enable_mpdu_logging) { 3515 dp_mon_debug("callback not registered"); 3516 return; 3517 } 3518 3519 monitor_ops->rx_enable_mpdu_logging(msg_word, tlv_filter); 3520 } 3521 3522 static inline void 3523 dp_mon_rx_packet_length_set(struct dp_soc *soc, uint32_t *msg_word, 3524 struct htt_rx_ring_tlv_filter *tlv_filter) 3525 { 3526 struct dp_mon_soc *mon_soc = soc->monitor_soc; 3527 struct dp_mon_ops *monitor_ops; 3528 3529 if (!mon_soc) { 3530 dp_mon_debug("mon soc is NULL"); 3531 return; 3532 3533 } 3534 3535 monitor_ops = mon_soc->mon_ops; 3536 if (!monitor_ops || !monitor_ops->rx_packet_length_set) { 3537 dp_mon_debug("callback not registered"); 3538 return; 3539 } 3540 3541 monitor_ops->rx_packet_length_set(msg_word, tlv_filter); 3542 } 3543 3544 #ifdef QCA_ENHANCED_STATS_SUPPORT 3545 QDF_STATUS dp_peer_qos_stats_notify(struct dp_pdev *dp_pdev, 3546 struct cdp_rx_stats_ppdu_user *ppdu_user); 3547 #endif 3548 3549 /* 3550 * dp_print_pdev_rx_mon_stats() - print rx mon stats 3551 * @pdev: device object 3552 * 3553 * Return: void 3554 */ 3555 void 3556 dp_print_pdev_rx_mon_stats(struct dp_pdev *pdev); 3557 3558 /** 3559 * dp_mcopy_check_deliver() - mcopy check deliver 3560 * @pdev: DP pdev handle 3561 * @peer_id: peer id 3562 * @ppdu_id: ppdu 3563 * @first_msdu: flag to indicate first msdu of ppdu 3564 * Return: 0 on success, not 0 on failure 3565 */ 3566 QDF_STATUS dp_mcopy_check_deliver(struct dp_pdev *pdev, 3567 uint16_t peer_id, 3568 uint32_t ppdu_id, 3569 uint8_t first_msdu); 3570 3571 /** 3572 * dp_pdev_set_advance_monitor_filter() - Set DP PDEV monitor filter 3573 * @soc: soc handle 3574 * @pdev_id: id of Datapath PDEV handle 3575 * @filter_val: Flag to select Filter for monitor mode 3576 * Return: 0 on success, not 0 on failure 3577 */ 3578 #ifdef QCA_ADVANCE_MON_FILTER_SUPPORT 3579 QDF_STATUS 3580 dp_pdev_set_advance_monitor_filter(struct cdp_soc_t *soc_hdl, uint8_t pdev_id, 3581 struct cdp_monitor_filter *filter_val); 3582 #else 3583 static inline QDF_STATUS 3584 dp_pdev_set_advance_monitor_filter(struct cdp_soc_t *soc_hdl, uint8_t pdev_id, 3585 struct cdp_monitor_filter *filter_val) 3586 { 3587 return QDF_STATUS_E_INVAL; 3588 } 3589 #endif /* QCA_ADVANCE_MON_FILTER_SUPPORT */ 3590 3591 /** 3592 * dp_deliver_tx_mgmt() - Deliver mgmt frame for tx capture 3593 * @cdp_soc : data path soc handle 3594 * @pdev_id : pdev_id 3595 * @nbuf: Management frame buffer 3596 */ 3597 QDF_STATUS 3598 dp_deliver_tx_mgmt(struct cdp_soc_t *cdp_soc, uint8_t pdev_id, qdf_nbuf_t nbuf); 3599 3600 /** 3601 * dp_filter_neighbour_peer() - API to filter neighbour peer 3602 * @pdev : DP pdev handle 3603 * @rx_pkt_hdr : packet header 3604 * 3605 * return: QDF_STATUS_SUCCESS on success 3606 * QDF_STATUS_E_FAILURE on failure 3607 */ 3608 #ifdef FEATURE_NAC_RSSI 3609 QDF_STATUS dp_filter_neighbour_peer(struct dp_pdev *pdev, 3610 uint8_t *rx_pkt_hdr); 3611 #else 3612 static inline 3613 QDF_STATUS dp_filter_neighbour_peer(struct dp_pdev *pdev, 3614 uint8_t *rx_pkt_hdr) 3615 { 3616 return QDF_STATUS_SUCCESS; 3617 } 3618 #endif /* FEATURE_NAC_RSSI */ 3619 3620 /* 3621 * dp_neighbour_peers_detach() - Detach neighbour peers(nac clients) 3622 * @pdev: device object 3623 * 3624 * Return: void 3625 */ 3626 void dp_neighbour_peers_detach(struct dp_pdev *pdev); 3627 3628 /** 3629 * dp_reset_monitor_mode() - Disable monitor mode 3630 * @soc_hdl: Datapath soc handle 3631 * @pdev_id: id of datapath PDEV handle 3632 * @smart_monitor: smart monitor flag 3633 * 3634 * Return: QDF_STATUS 3635 */ 3636 QDF_STATUS dp_reset_monitor_mode(struct cdp_soc_t *soc_hdl, 3637 uint8_t pdev_id, 3638 uint8_t smart_monitor); 3639 3640 static inline 3641 struct dp_mon_ops *dp_mon_ops_get(struct dp_soc *soc) 3642 { 3643 if (soc && soc->monitor_soc) 3644 return soc->monitor_soc->mon_ops; 3645 3646 return NULL; 3647 } 3648 3649 static inline 3650 struct cdp_mon_ops *dp_mon_cdp_ops_get(struct dp_soc *soc) 3651 { 3652 struct cdp_ops *ops = soc->cdp_soc.ops; 3653 3654 return ops->mon_ops; 3655 } 3656 3657 /** 3658 * dp_ppdu_desc_user_stats_update(): Function to update TX user stats 3659 * @pdev: DP pdev handle 3660 * @ppdu_info: per PPDU TLV descriptor 3661 * 3662 * return: void 3663 */ 3664 #ifdef QCA_ENHANCED_STATS_SUPPORT 3665 void 3666 dp_ppdu_desc_user_stats_update(struct dp_pdev *pdev, 3667 struct ppdu_info *ppdu_info); 3668 #else 3669 static inline void 3670 dp_ppdu_desc_user_stats_update(struct dp_pdev *pdev, 3671 struct ppdu_info *ppdu_info) 3672 { 3673 } 3674 #endif /* QCA_ENHANCED_STATS_SUPPORT */ 3675 3676 /** 3677 * dp_mon_ops_register_1_0(): register legacy monitor ops 3678 * @mon_soc: monitor soc handle 3679 * 3680 * return: void 3681 */ 3682 void dp_mon_ops_register_1_0(struct dp_mon_soc *mon_soc); 3683 3684 /** 3685 * dp_mon_cdp_ops_register_1_0(): register legacy monitor cdp ops 3686 * @ops: cdp ops handle 3687 * 3688 * return: void 3689 */ 3690 void dp_mon_cdp_ops_register_1_0(struct cdp_ops *ops); 3691 3692 #ifdef QCA_MONITOR_2_0_SUPPORT 3693 /** 3694 * dp_mon_ops_register_2_0(): register monitor ops 3695 * @mon_soc: monitor soc handle 3696 * 3697 * return: void 3698 */ 3699 void dp_mon_ops_register_2_0(struct dp_mon_soc *mon_soc); 3700 3701 /** 3702 * dp_mon_cdp_ops_register_2_0(): register monitor cdp ops 3703 * @ops: cdp ops handle 3704 * 3705 * return: void 3706 */ 3707 void dp_mon_cdp_ops_register_2_0(struct cdp_ops *ops); 3708 #endif /* QCA_MONITOR_2_0_SUPPORT */ 3709 3710 /** 3711 * dp_mon_register_feature_ops(): Register mon feature ops 3712 * @soc: Datapath soc context 3713 * 3714 * return: void 3715 */ 3716 static inline 3717 void dp_mon_register_feature_ops(struct dp_soc *soc) 3718 { 3719 struct dp_mon_ops *mon_ops = NULL; 3720 3721 mon_ops = dp_mon_ops_get(soc); 3722 if (!mon_ops) { 3723 dp_mon_err("Monitor ops is NULL"); 3724 return; 3725 } 3726 if (mon_ops->mon_register_feature_ops) 3727 mon_ops->mon_register_feature_ops(soc); 3728 } 3729 3730 /** 3731 * dp_pdev_get_rx_mon_stats(): Get pdev Rx monitor stats 3732 * @soc_hdl: soc handle 3733 * @pdev_id: id of pdev handle 3734 * @stats: User allocated stats buffer 3735 * 3736 * return: status success/failure 3737 */ 3738 QDF_STATUS dp_pdev_get_rx_mon_stats(struct cdp_soc_t *soc_hdl, uint8_t pdev_id, 3739 struct cdp_pdev_mon_stats *stats); 3740 #endif /* _DP_MON_H_ */ 3741