1 /* 2 * Copyright (c) 2016-2021, The Linux Foundation. All rights reserved. 3 * Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. All rights reserved. 4 * 5 * Permission to use, copy, modify, and/or distribute this software for 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 #include "dp_rx_mon.h" 26 27 #include <dp_mon_filter.h> 28 #ifdef WLAN_TX_PKT_CAPTURE_ENH 29 #include "dp_tx_capture.h" 30 #endif 31 32 #ifdef QCA_SUPPORT_LITE_MONITOR 33 #include "dp_lite_mon.h" 34 #endif 35 36 #define DP_INTR_POLL_TIMER_MS 5 37 #define DP_HIST_TRACK_SIZE 50 38 39 #define MON_VDEV_TIMER_INIT 0x1 40 #define MON_VDEV_TIMER_RUNNING 0x2 41 42 /* Budget to reap monitor status ring */ 43 #define DP_MON_REAP_BUDGET 1024 44 #define MON_BUF_MIN_ENTRIES 64 45 46 /* 40MHZ BW 2 20MHZ sub bands */ 47 #define SUB40BW 2 48 /* 80MHZ BW 4 20MHZ sub bands */ 49 #define SUB80BW 4 50 /* 160MHZ BW 8 20MHZ sub bands */ 51 #define SUB160BW 8 52 /* 320MHZ BW 16 20MHZ sub bands */ 53 #define SUB320BW 16 54 55 #define RNG_ERR "SRNG setup failed for" 56 #define dp_mon_info(params...) \ 57 __QDF_TRACE_FL(QDF_TRACE_LEVEL_INFO_HIGH, QDF_MODULE_ID_MON, ## params) 58 #define dp_mon_err(params...) QDF_TRACE_ERROR(QDF_MODULE_ID_MON, params) 59 #define dp_mon_debug(params...) QDF_TRACE_DEBUG(QDF_MODULE_ID_MON, params) 60 #define dp_mon_warn(params...) QDF_TRACE_WARN(QDF_MODULE_ID_MON, params) 61 62 #define dp_mon_warn_rl(params...) QDF_TRACE_WARN_RL(QDF_MODULE_ID_MON, params) 63 #define dp_mon_debug_rl(params...) QDF_TRACE_DEBUG_RL(QDF_MODULE_ID_MON, params) 64 #define dp_mon_info_rl(params...) \ 65 __QDF_TRACE_RL(QDF_TRACE_LEVEL_INFO_HIGH, QDF_MODULE_ID_MON, ## params) 66 67 #ifdef WLAN_FEATURE_LOCAL_PKT_CAPTURE 68 #define IS_LOCAL_PKT_CAPTURE_RUNNING(var, field) ((var)->field) 69 #else 70 #define IS_LOCAL_PKT_CAPTURE_RUNNING(var, field) 0 71 #endif 72 73 #ifdef QCA_ENHANCED_STATS_SUPPORT 74 typedef struct dp_peer_extd_tx_stats dp_mon_peer_tx_stats; 75 typedef struct dp_peer_extd_rx_stats dp_mon_peer_rx_stats; 76 77 #define DP_UPDATE_MON_STATS(_tgtobj, _srcobj) \ 78 DP_UPDATE_EXTD_STATS(_tgtobj, _srcobj) 79 #endif 80 81 #ifndef WLAN_TX_PKT_CAPTURE_ENH 82 struct dp_pdev_tx_capture { 83 }; 84 85 struct dp_peer_tx_capture { 86 }; 87 #endif 88 89 /** 90 * struct ieee80211_ctlframe_addr2 - control frame addr 91 * @i_fc: frame control 92 * @i_aidordur: aid or duration 93 * @i_addr1: address 1 94 * @i_addr2: address 2 95 */ 96 struct ieee80211_ctlframe_addr2 { 97 uint8_t i_fc[2]; 98 uint8_t i_aidordur[2]; 99 uint8_t i_addr1[QDF_NET_MAC_ADDR_MAX_LEN]; 100 uint8_t i_addr2[QDF_NET_MAC_ADDR_MAX_LEN]; 101 } __packed; 102 103 #ifndef WLAN_TX_PKT_CAPTURE_ENH 104 static inline void 105 dp_process_ppdu_stats_update_failed_bitmap(struct dp_pdev *pdev, 106 void *data, 107 uint32_t ppdu_id, 108 uint32_t size) 109 { 110 } 111 #endif 112 113 #ifdef DP_CON_MON_MSI_ENABLED 114 static inline bool dp_is_monitor_mode_using_poll(struct dp_soc *soc) 115 { 116 return false; 117 } 118 #else 119 static inline bool dp_is_monitor_mode_using_poll(struct dp_soc *soc) 120 { 121 return true; 122 } 123 #endif 124 125 #if !defined(DISABLE_MON_CONFIG) && defined(CONFIG_LITHIUM) 126 /** 127 * dp_mon_htt_srng_setup_1_0() - Prepare HTT messages for Monitor rings 128 * @soc: soc handle 129 * @pdev: physical device handle 130 * @mac_id: ring number 131 * @mac_for_pdev: mac_id 132 * 133 * Return: non-zero for failure, zero for success 134 */ 135 QDF_STATUS dp_mon_htt_srng_setup_1_0(struct dp_soc *soc, 136 struct dp_pdev *pdev, 137 int mac_id, 138 int mac_for_pdev); 139 140 /** 141 * dp_mon_rings_alloc_1_0() - DP monitor rings allocation 142 * @pdev: physical device handle 143 * 144 * Return: non-zero for failure, zero for success 145 */ 146 QDF_STATUS dp_mon_rings_alloc_1_0(struct dp_pdev *pdev); 147 148 /** 149 * dp_mon_rings_free_1_0() - DP monitor rings deallocation 150 * @pdev: physical device handle 151 * 152 * Return: non-zero for failure, zero for success 153 */ 154 void dp_mon_rings_free_1_0(struct dp_pdev *pdev); 155 156 /** 157 * dp_mon_rings_init_1_0() - DP monitor rings initialization 158 * @pdev: physical device handle 159 * 160 * Return: non-zero for failure, zero for success 161 */ 162 QDF_STATUS dp_mon_rings_init_1_0(struct dp_pdev *pdev); 163 164 /** 165 * dp_mon_rings_deinit_1_0() - DP monitor rings deinitialization 166 * @pdev: physical device handle 167 * 168 * Return: non-zero for failure, zero for success 169 */ 170 void dp_mon_rings_deinit_1_0(struct dp_pdev *pdev); 171 #else 172 static inline 173 void dp_mon_rings_deinit_1_0(struct dp_pdev *pdev) 174 { 175 } 176 177 static inline 178 void dp_mon_rings_free_1_0(struct dp_pdev *pdev) 179 { 180 } 181 182 static inline 183 QDF_STATUS dp_mon_rings_init_1_0(struct dp_pdev *pdev) 184 { 185 return QDF_STATUS_SUCCESS; 186 } 187 188 static inline 189 QDF_STATUS dp_mon_rings_alloc_1_0(struct dp_pdev *pdev) 190 { 191 return QDF_STATUS_SUCCESS; 192 } 193 194 static inline 195 QDF_STATUS dp_mon_htt_srng_setup_1_0(struct dp_soc *soc, 196 struct dp_pdev *pdev, 197 int mac_id, 198 int mac_for_pdev) 199 { 200 return QDF_STATUS_SUCCESS; 201 } 202 203 #endif 204 205 /** 206 * dp_mon_soc_attach() - DP monitor soc attach 207 * @soc: Datapath SOC handle 208 * 209 * Return: QDF_STATUS_SUCCESS: Success 210 * QDF_STATUS_E_NOMEM: Error 211 */ 212 QDF_STATUS dp_mon_soc_attach(struct dp_soc *soc); 213 214 /** 215 * dp_mon_soc_detach() - DP monitor soc detach 216 * @soc: Datapath SOC handle 217 * 218 * Return: QDF_STATUS_SUCCESS: Success 219 * QDF_STATUS_E_FAILURE: Error 220 */ 221 QDF_STATUS dp_mon_soc_detach(struct dp_soc *soc); 222 223 /** 224 * dp_mon_soc_cfg_init() - DP monitor soc config init 225 * @soc: Datapath SOC handle 226 * 227 * Return: QDF_STATUS_SUCCESS: Success 228 * QDF_STATUS_E_FAILURE: Error 229 */ 230 QDF_STATUS dp_mon_soc_cfg_init(struct dp_soc *soc); 231 232 /** 233 * dp_mon_pdev_attach() - DP monitor pdev attach 234 * @pdev: Datapath pdev handle 235 * 236 * Return: QDF_STATUS_SUCCESS: Success 237 * QDF_STATUS_E_NOMEM: Error 238 */ 239 QDF_STATUS dp_mon_pdev_attach(struct dp_pdev *pdev); 240 241 /** 242 * dp_mon_pdev_detach() - DP monitor pdev detach 243 * @pdev: Datapath pdev handle 244 * 245 * Return: QDF_STATUS_SUCCESS: Success 246 * QDF_STATUS_E_FAILURE: Error 247 */ 248 QDF_STATUS dp_mon_pdev_detach(struct dp_pdev *pdev); 249 250 /** 251 * dp_mon_pdev_init() - DP monitor pdev init 252 * @pdev: Datapath pdev handle 253 * 254 * Return: QDF_STATUS_SUCCESS: Success 255 * QDF_STATUS_E_FAILURE: Error 256 */ 257 QDF_STATUS dp_mon_pdev_init(struct dp_pdev *pdev); 258 259 /** 260 * dp_mon_pdev_deinit() - DP monitor pdev deinit 261 * @pdev: Datapath pdev handle 262 * 263 * Return: QDF_STATUS_SUCCESS: Success 264 * QDF_STATUS_E_FAILURE: Error 265 */ 266 QDF_STATUS dp_mon_pdev_deinit(struct dp_pdev *pdev); 267 268 /** 269 * dp_mon_vdev_attach() - DP monitor vdev attach 270 * @vdev: Datapath vdev handle 271 * 272 * Return: QDF_STATUS_SUCCESS: Success 273 * QDF_STATUS_E_NOMEM: Error 274 */ 275 QDF_STATUS dp_mon_vdev_attach(struct dp_vdev *vdev); 276 277 /** 278 * dp_mon_vdev_detach() - DP monitor vdev detach 279 * @vdev: Datapath vdev handle 280 * 281 * Return: QDF_STATUS_SUCCESS: Success 282 * QDF_STATUS_E_FAILURE: Error 283 */ 284 QDF_STATUS dp_mon_vdev_detach(struct dp_vdev *vdev); 285 286 /** 287 * dp_mon_peer_attach() - DP monitor peer attach 288 * @peer: Datapath peer handle 289 * 290 * Return: QDF_STATUS_SUCCESS: Success 291 * QDF_STATUS_E_NOMEM: Error 292 */ 293 #if defined(WLAN_TX_PKT_CAPTURE_ENH) || defined(FEATURE_PERPKT_INFO) 294 QDF_STATUS dp_mon_peer_attach(struct dp_peer *peer); 295 #else 296 static inline 297 QDF_STATUS dp_mon_peer_attach(struct dp_peer *peer) 298 { 299 return QDF_STATUS_SUCCESS; 300 } 301 #endif 302 303 /** 304 * dp_mon_peer_detach() - DP monitor peer detach 305 * @peer: Datapath peer handle 306 * 307 * Return: QDF_STATUS_SUCCESS: Success 308 * QDF_STATUS_E_FAILURE: Error 309 */ 310 QDF_STATUS dp_mon_peer_detach(struct dp_peer *peer); 311 312 /** 313 * dp_mon_peer_get_peerstats_ctx() - Get peer stats context from monitor peer 314 * @peer: Datapath peer handle 315 * 316 * Return: peerstats_ctx 317 */ 318 struct cdp_peer_rate_stats_ctx *dp_mon_peer_get_peerstats_ctx(struct 319 dp_peer *peer); 320 321 #ifdef QCA_ENHANCED_STATS_SUPPORT 322 /** 323 * dp_mon_peer_reset_stats() - Reset monitor peer stats 324 * @peer: Datapath peer handle 325 * 326 * Return: none 327 */ 328 void dp_mon_peer_reset_stats(struct dp_peer *peer); 329 330 /** 331 * dp_mon_peer_get_stats() - Get monitor peer stats 332 * 333 * @peer: Datapath peer handle 334 * @arg: Pointer to stats struct 335 * @type: Update type 336 * 337 * Return: none 338 */ 339 void dp_mon_peer_get_stats(struct dp_peer *peer, void *arg, 340 enum cdp_stat_update_type type); 341 342 /** 343 * dp_mon_invalid_peer_update_pdev_stats() - Update pdev stats from 344 * invalid monitor peer 345 * @pdev: Datapath pdev handle 346 * 347 * Return: none 348 */ 349 void dp_mon_invalid_peer_update_pdev_stats(struct dp_pdev *pdev); 350 351 /** 352 * dp_mon_peer_get_stats_param() - Get stats param value from monitor peer 353 * @peer: Datapath peer handle 354 * @type: Stats type requested 355 * @buf: Pointer to buffer for stats param 356 * 357 * Return: QDF_STATUS 358 */ 359 QDF_STATUS dp_mon_peer_get_stats_param(struct dp_peer *peer, 360 enum cdp_peer_stats_type type, 361 cdp_peer_stats_param_t *buf); 362 #else 363 static inline void dp_mon_peer_reset_stats(struct dp_peer *peer) 364 { 365 } 366 367 static inline 368 void dp_mon_peer_get_stats(struct dp_peer *peer, void *arg, 369 enum cdp_stat_update_type type) 370 { 371 } 372 373 static inline void dp_mon_invalid_peer_update_pdev_stats(struct dp_pdev *pdev) 374 { 375 } 376 377 static inline 378 QDF_STATUS dp_mon_peer_get_stats_param(struct dp_peer *peer, 379 enum cdp_peer_stats_type type, 380 cdp_peer_stats_param_t *buf) 381 { 382 return QDF_STATUS_E_FAILURE; 383 } 384 #endif 385 386 /** 387 * dp_mon_cdp_ops_register() - Register monitor cdp ops 388 * @soc: Datapath soc handle 389 * 390 */ 391 void dp_mon_cdp_ops_register(struct dp_soc *soc); 392 393 /** 394 * dp_mon_cdp_ops_deregister() - deregister monitor cdp ops 395 * @soc: Datapath soc handle 396 * 397 */ 398 void dp_mon_cdp_ops_deregister(struct dp_soc *soc); 399 400 /** 401 * dp_mon_intr_ops_deregister() - deregister monitor interrupt ops 402 * @soc: Datapath soc handle 403 * 404 */ 405 void dp_mon_intr_ops_deregister(struct dp_soc *soc); 406 407 /** 408 * dp_mon_feature_ops_deregister() - deregister monitor feature ops 409 * @soc: Datapath soc handle 410 * 411 */ 412 void dp_mon_feature_ops_deregister(struct dp_soc *soc); 413 414 /** 415 * dp_mon_ops_free() - free monitor ops 416 * @soc: Datapath soc handle 417 * 418 */ 419 void dp_mon_ops_free(struct dp_soc *soc); 420 421 /** 422 * dp_mon_ops_register() - Register monitor ops 423 * @soc: Datapath soc handle 424 * 425 */ 426 void dp_mon_ops_register(struct dp_soc *soc); 427 428 #ifndef DISABLE_MON_CONFIG 429 void dp_mon_register_intr_ops(struct dp_soc *soc); 430 #else 431 static inline void dp_mon_register_intr_ops(struct dp_soc *soc) 432 {} 433 #endif 434 435 /** 436 * dp_mon_htt_srng_setup() - DP mon htt srng setup 437 * @soc: Datapath soc handle 438 * @pdev: Datapath pdev handle 439 * @mac_id: mac id 440 * @mac_for_pdev: mac id mapped pdev 441 * 442 * Return: QDF_STATUS_SUCCESS: Success 443 * QDF_STATUS_E_FAILURE: Error 444 */ 445 QDF_STATUS dp_mon_htt_srng_setup(struct dp_soc *soc, 446 struct dp_pdev *pdev, 447 int mac_id, 448 int mac_for_pdev); 449 450 /** 451 * dp_config_debug_sniffer()- API to enable/disable debug sniffer 452 * @pdev: DP_PDEV handle 453 * @val: user provided value 454 * 455 * Return: 0 for success. nonzero for failure. 456 */ 457 #if defined(QCA_MCOPY_SUPPORT) || defined(QCA_TX_CAPTURE_SUPPORT) 458 QDF_STATUS 459 dp_config_debug_sniffer(struct dp_pdev *pdev, int val); 460 #else 461 static inline QDF_STATUS 462 dp_config_debug_sniffer(struct dp_pdev *pdev, int val) { 463 return QDF_STATUS_E_INVAL; 464 } 465 #endif /* QCA_MCOPY_SUPPORT || QCA_TX_CAPTURE_SUPPORT */ 466 467 /** 468 * dp_mon_config_undecoded_metadata_capture()- API to enable/disable undecoded 469 * metadata capture 470 * @pdev: DP_PDEV handle 471 * @val: user provided value 472 * 473 * Return: 0 for success. nonzero for failure. 474 */ 475 #ifdef QCA_UNDECODED_METADATA_SUPPORT 476 QDF_STATUS 477 dp_mon_config_undecoded_metadata_capture(struct dp_pdev *pdev, int val); 478 #else 479 static inline QDF_STATUS 480 dp_mon_config_undecoded_metadata_capture(struct dp_pdev *pdev, int val) { 481 return QDF_STATUS_E_INVAL; 482 } 483 #endif /* QCA_UNDECODED_METADATA_SUPPORT */ 484 485 /** 486 * dp_htt_ppdu_stats_attach() - attach resources for HTT PPDU stats processing 487 * @pdev: Datapath PDEV handle 488 * 489 * Return: QDF_STATUS_SUCCESS: Success 490 * QDF_STATUS_E_NOMEM: Error 491 */ 492 QDF_STATUS dp_htt_ppdu_stats_attach(struct dp_pdev *pdev); 493 494 /** 495 * dp_htt_ppdu_stats_detach() - detach stats resources 496 * @pdev: Datapath PDEV handle 497 * 498 * Return: void 499 */ 500 void dp_htt_ppdu_stats_detach(struct dp_pdev *pdev); 501 502 /** 503 * dp_set_bpr_enable() - API to enable/disable bpr feature 504 * @pdev: DP_PDEV handle. 505 * @val: Provided value. 506 * 507 * Return: 0 for success. nonzero for failure. 508 */ 509 #ifdef QCA_SUPPORT_BPR 510 QDF_STATUS 511 dp_set_bpr_enable(struct dp_pdev *pdev, int val); 512 #endif 513 514 #ifdef ATH_SUPPORT_NAC 515 int dp_set_filter_neigh_peers(struct dp_pdev *pdev, 516 bool val); 517 #endif /* ATH_SUPPORT_NAC */ 518 519 #ifdef WLAN_ATF_ENABLE 520 void dp_set_atf_stats_enable(struct dp_pdev *pdev, bool value); 521 #endif 522 523 /** 524 * dp_mon_set_bsscolor() - sets bsscolor for tx capture 525 * @pdev: Datapath PDEV handle 526 * @bsscolor: new bsscolor 527 */ 528 void 529 dp_mon_set_bsscolor(struct dp_pdev *pdev, uint8_t bsscolor); 530 531 /** 532 * dp_pdev_get_filter_ucast_data() - get DP PDEV monitor ucast filter 533 * @pdev_handle: Datapath PDEV handle 534 * 535 * Return: true on ucast filter flag set 536 */ 537 bool dp_pdev_get_filter_ucast_data(struct cdp_pdev *pdev_handle); 538 539 /** 540 * dp_pdev_get_filter_mcast_data() - get DP PDEV monitor mcast filter 541 * @pdev_handle: Datapath PDEV handle 542 * 543 * Return: true on mcast filter flag set 544 */ 545 bool dp_pdev_get_filter_mcast_data(struct cdp_pdev *pdev_handle); 546 547 /** 548 * dp_pdev_get_filter_non_data() - get DP PDEV monitor non_data filter 549 * @pdev_handle: Datapath PDEV handle 550 * 551 * Return: true on non data filter flag set 552 */ 553 bool dp_pdev_get_filter_non_data(struct cdp_pdev *pdev_handle); 554 555 /** 556 * dp_set_pktlog_wifi3() - attach txrx vdev 557 * @pdev: Datapath PDEV handle 558 * @event: which event's notifications are being subscribed to 559 * @enable: WDI event subscribe or not. (True or False) 560 * 561 * Return: Success, NULL on failure 562 */ 563 #ifdef WDI_EVENT_ENABLE 564 int dp_set_pktlog_wifi3(struct dp_pdev *pdev, uint32_t event, 565 bool enable); 566 #endif 567 568 /* MCL specific functions */ 569 #if defined(DP_CON_MON) && !defined(REMOVE_PKT_LOG) 570 /** 571 * dp_pktlogmod_exit() - API to cleanup pktlog info 572 * @pdev: Pdev handle 573 * 574 * Return: none 575 */ 576 void dp_pktlogmod_exit(struct dp_pdev *pdev); 577 #else 578 static inline 579 void dp_pktlogmod_exit(struct dp_pdev *handle) 580 { 581 } 582 #endif 583 584 #ifdef QCA_MONITOR_PKT_SUPPORT 585 /** 586 * dp_vdev_set_monitor_mode_buf_rings() - set monitor mode buf rings 587 * @pdev: DP pdev object 588 * 589 * Allocate SW descriptor pool, buffers, link descriptor memory 590 * Initialize monitor related SRNGs 591 * 592 * Return: QDF_STATUS 593 */ 594 QDF_STATUS dp_vdev_set_monitor_mode_buf_rings(struct dp_pdev *pdev); 595 596 /** 597 * dp_vdev_set_monitor_mode_rings() - set monitor mode rings 598 * @pdev: DP pdev object 599 * @delayed_replenish: 600 * 601 * Allocate SW descriptor pool, buffers, link descriptor memory 602 * Initialize monitor related SRNGs 603 * 604 * Return: QDF_STATUS 605 */ 606 QDF_STATUS dp_vdev_set_monitor_mode_rings(struct dp_pdev *pdev, 607 uint8_t delayed_replenish); 608 609 #else 610 static inline QDF_STATUS 611 dp_vdev_set_monitor_mode_buf_rings(struct dp_pdev *pdev) 612 { 613 return QDF_STATUS_SUCCESS; 614 } 615 616 static inline QDF_STATUS 617 dp_vdev_set_monitor_mode_rings(struct dp_pdev *pdev, 618 uint8_t delayed_replenish) 619 { 620 return QDF_STATUS_SUCCESS; 621 } 622 #endif 623 624 #if defined(WDI_EVENT_ENABLE) &&\ 625 (defined(QCA_ENHANCED_STATS_SUPPORT) || !defined(REMOVE_PKT_LOG) ||\ 626 defined(WLAN_FEATURE_PKT_CAPTURE_V2)) 627 /** 628 * dp_ppdu_stats_ind_handler() - PPDU stats msg handler 629 * @soc: HTT SOC handle 630 * @msg_word: Pointer to payload 631 * @htt_t2h_msg: HTT msg nbuf 632 * 633 * Return: True if buffer should be freed by caller. 634 */ 635 bool dp_ppdu_stats_ind_handler(struct htt_soc *soc, 636 uint32_t *msg_word, 637 qdf_nbuf_t htt_t2h_msg); 638 #endif 639 640 #if defined(QCA_ENHANCED_STATS_SUPPORT) || \ 641 (!defined(WLAN_TX_PKT_CAPTURE_ENH) || defined(WLAN_PKT_CAPTURE_TX_2_0)) 642 /** 643 * dp_ppdu_desc_deliver(): Function to deliver Tx PPDU status descriptor 644 * to upper layer 645 * @pdev: DP pdev handle 646 * @ppdu_info: per PPDU TLV descriptor 647 * 648 * return: void 649 */ 650 void dp_ppdu_desc_deliver(struct dp_pdev *pdev, struct ppdu_info *ppdu_info); 651 #endif 652 653 #ifdef QCA_RSSI_DB2DBM 654 /** 655 * dp_mon_pdev_params_rssi_dbm_conv() --> to set rssi in dbm conversion 656 * params into monitor pdev. 657 * @cdp_soc: dp soc handle. 658 * @params: cdp_rssi_db2dbm_param_dp structure value. 659 * 660 * Return: QDF_STATUS_SUCCESS if value set successfully 661 * QDF_STATUS_E_INVAL false if error 662 */ 663 QDF_STATUS 664 dp_mon_pdev_params_rssi_dbm_conv(struct cdp_soc_t *cdp_soc, 665 struct cdp_rssi_db2dbm_param_dp *params); 666 #else 667 static inline QDF_STATUS 668 dp_mon_pdev_params_rssi_dbm_conv(struct cdp_soc_t *cdp_soc, 669 struct cdp_rssi_db2dbm_param_dp *params) 670 { 671 return QDF_STATUS_E_INVAL; 672 } 673 #endif /* QCA_RSSI_DB2DBM */ 674 675 #if !defined(DISABLE_MON_CONFIG) 676 typedef QDF_STATUS (*mon_pdev_htt_srng_setup_fp)(struct dp_soc *soc, 677 struct dp_pdev *pdev, 678 int mac_id, 679 int mac_for_pdev); 680 #endif 681 typedef QDF_STATUS (*mon_rings_alloc_fp)(struct dp_pdev *pdev); 682 typedef void (*mon_rings_free_fp)(struct dp_pdev *pdev); 683 typedef QDF_STATUS (*mon_rings_init_fp)(struct dp_pdev *pdev); 684 typedef void (*mon_rings_deinit_fp)(struct dp_pdev *pdev); 685 typedef QDF_STATUS (*mon_soc_attach_fp)(struct dp_soc *soc); 686 typedef QDF_STATUS (*mon_soc_detach_fp)(struct dp_soc *soc); 687 typedef QDF_STATUS (*mon_soc_init_fp)(struct dp_soc *soc); 688 typedef void (*mon_soc_deinit_fp)(struct dp_soc *soc); 689 690 struct dp_mon_ops { 691 QDF_STATUS (*mon_soc_cfg_init)(struct dp_soc *soc); 692 mon_soc_attach_fp mon_soc_attach[2]; 693 mon_soc_detach_fp mon_soc_detach[2]; 694 mon_soc_init_fp mon_soc_init[2]; 695 mon_soc_deinit_fp mon_soc_deinit[2]; 696 QDF_STATUS (*mon_pdev_alloc)(struct dp_pdev *pdev); 697 void (*mon_pdev_free)(struct dp_pdev *pdev); 698 QDF_STATUS (*mon_pdev_attach)(struct dp_pdev *pdev); 699 QDF_STATUS (*mon_pdev_detach)(struct dp_pdev *pdev); 700 QDF_STATUS (*mon_pdev_init)(struct dp_pdev *pdev); 701 QDF_STATUS (*mon_pdev_deinit)(struct dp_pdev *pdev); 702 QDF_STATUS (*mon_vdev_attach)(struct dp_vdev *vdev); 703 QDF_STATUS (*mon_vdev_detach)(struct dp_vdev *vdev); 704 QDF_STATUS (*mon_peer_attach)(struct dp_peer *peer); 705 QDF_STATUS (*mon_peer_detach)(struct dp_peer *peer); 706 struct cdp_peer_rate_stats_ctx *(*mon_peer_get_peerstats_ctx)(struct 707 dp_peer *peer); 708 void (*mon_peer_reset_stats)(struct dp_peer *peer); 709 void (*mon_peer_get_stats)(struct dp_peer *peer, void *arg, 710 enum cdp_stat_update_type type); 711 void (*mon_invalid_peer_update_pdev_stats)(struct dp_pdev *pdev); 712 QDF_STATUS (*mon_peer_get_stats_param)(struct dp_peer *peer, 713 enum cdp_peer_stats_type type, 714 cdp_peer_stats_param_t *buf); 715 QDF_STATUS (*mon_config_debug_sniffer)(struct dp_pdev *pdev, int val); 716 void (*mon_flush_rings)(struct dp_soc *soc); 717 #if !defined(DISABLE_MON_CONFIG) 718 mon_pdev_htt_srng_setup_fp mon_pdev_htt_srng_setup[2]; 719 QDF_STATUS (*mon_soc_htt_srng_setup)(struct dp_soc *soc); 720 #endif 721 #if !defined(DISABLE_MON_CONFIG) && defined(MON_ENABLE_DROP_FOR_MAC) 722 uint32_t (*mon_drop_packets_for_mac)(struct dp_pdev *pdev, 723 uint32_t mac_id, 724 uint32_t quota, 725 bool force_flush); 726 #endif 727 #if defined(DP_CON_MON) 728 void (*mon_service_rings)(struct dp_soc *soc, uint32_t quota); 729 #endif 730 #ifndef DISABLE_MON_CONFIG 731 uint32_t (*mon_rx_process)(struct dp_soc *soc, 732 struct dp_intr *int_ctx, 733 uint32_t mac_id, 734 uint32_t quota); 735 uint32_t (*mon_tx_process)(struct dp_soc *soc, 736 struct dp_intr *int_ctx, 737 uint32_t mac_id, 738 uint32_t quota); 739 void (*print_txmon_ring_stat)(struct dp_pdev *pdev); 740 #endif 741 void (*mon_peer_tx_init)(struct dp_pdev *pdev, struct dp_peer *peer); 742 void (*mon_peer_tx_cleanup)(struct dp_vdev *vdev, 743 struct dp_peer *peer); 744 #ifdef WIFI_MONITOR_SUPPORT 745 void (*mon_peer_tid_peer_id_update)(struct dp_peer *peer, 746 uint16_t peer_id); 747 void (*mon_tx_ppdu_stats_attach)(struct dp_pdev *pdev); 748 void (*mon_tx_ppdu_stats_detach)(struct dp_pdev *pdev); 749 QDF_STATUS (*mon_tx_capture_debugfs_init)(struct dp_pdev *pdev); 750 void (*mon_peer_tx_capture_filter_check)(struct dp_pdev *pdev, 751 struct dp_peer *peer); 752 QDF_STATUS (*mon_tx_add_to_comp_queue)(struct dp_soc *soc, 753 struct dp_tx_desc_s *desc, 754 struct hal_tx_completion_status *ts, 755 uint16_t peer_id); 756 QDF_STATUS (*mon_update_msdu_to_list)(struct dp_soc *soc, 757 struct dp_pdev *pdev, 758 struct dp_peer *peer, 759 struct hal_tx_completion_status *ts, 760 qdf_nbuf_t netbuf); 761 QDF_STATUS 762 (*mon_peer_tx_capture_get_stats)(struct dp_peer *peer, 763 struct cdp_peer_tx_capture_stats *sts); 764 QDF_STATUS 765 (*mon_pdev_tx_capture_get_stats)(struct dp_pdev *pdev, 766 struct cdp_pdev_tx_capture_stats *sts); 767 #endif 768 #if defined(WDI_EVENT_ENABLE) &&\ 769 (defined(QCA_ENHANCED_STATS_SUPPORT) || !defined(REMOVE_PKT_LOG) ||\ 770 defined(WLAN_FEATURE_PKT_CAPTURE_V2)) 771 bool (*mon_ppdu_stats_ind_handler)(struct htt_soc *soc, 772 uint32_t *msg_word, 773 qdf_nbuf_t htt_t2h_msg); 774 #endif 775 QDF_STATUS (*mon_htt_ppdu_stats_attach)(struct dp_pdev *pdev); 776 void (*mon_htt_ppdu_stats_detach)(struct dp_pdev *pdev); 777 void (*mon_print_pdev_rx_mon_stats)(struct dp_pdev *pdev); 778 779 #ifdef WIFI_MONITOR_SUPPORT 780 void (*mon_print_pdev_tx_capture_stats)(struct dp_pdev *pdev); 781 QDF_STATUS (*mon_config_enh_tx_capture)(struct dp_pdev *pdev, 782 uint8_t val); 783 QDF_STATUS (*mon_tx_peer_filter)(struct dp_pdev *pdev_handle, 784 struct dp_peer *peer_handle, 785 uint8_t is_tx_pkt_cap_enable, 786 uint8_t *peer_mac); 787 #endif 788 #ifdef WLAN_RX_PKT_CAPTURE_ENH 789 QDF_STATUS (*mon_config_enh_rx_capture)(struct dp_pdev *pdev, 790 uint8_t val); 791 #endif 792 #ifdef QCA_SUPPORT_BPR 793 QDF_STATUS (*mon_set_bpr_enable)(struct dp_pdev *pdev, int val); 794 #endif 795 #ifdef ATH_SUPPORT_NAC 796 int (*mon_set_filter_neigh_peers)(struct dp_pdev *pdev, bool val); 797 #endif 798 #ifdef WLAN_ATF_ENABLE 799 void (*mon_set_atf_stats_enable)(struct dp_pdev *pdev, bool value); 800 #endif 801 void (*mon_set_bsscolor)(struct dp_pdev *pdev, uint8_t bsscolor); 802 bool (*mon_pdev_get_filter_ucast_data)(struct cdp_pdev *pdev_handle); 803 bool (*mon_pdev_get_filter_non_data)(struct cdp_pdev *pdev_handle); 804 bool (*mon_pdev_get_filter_mcast_data)(struct cdp_pdev *pdev_handle); 805 #ifdef WDI_EVENT_ENABLE 806 int (*mon_set_pktlog_wifi3)(struct dp_pdev *pdev, uint32_t event, 807 bool enable); 808 #endif 809 #if defined(DP_CON_MON) && !defined(REMOVE_PKT_LOG) 810 void (*mon_pktlogmod_exit)(struct dp_pdev *pdev); 811 #endif 812 QDF_STATUS (*mon_vdev_set_monitor_mode_buf_rings)(struct dp_pdev *pdev); 813 QDF_STATUS (*mon_vdev_set_monitor_mode_rings)(struct dp_pdev *pdev, 814 uint8_t delayed_replenish); 815 void (*mon_neighbour_peers_detach)(struct dp_pdev *pdev); 816 #ifdef FEATURE_NAC_RSSI 817 QDF_STATUS (*mon_filter_neighbour_peer)(struct dp_pdev *pdev, 818 uint8_t *rx_pkt_hdr); 819 #endif 820 void (*mon_vdev_timer_init)(struct dp_soc *soc); 821 void (*mon_vdev_timer_start)(struct dp_soc *soc); 822 bool (*mon_vdev_timer_stop)(struct dp_soc *soc); 823 void (*mon_vdev_timer_deinit)(struct dp_soc *soc); 824 void (*mon_reap_timer_init)(struct dp_soc *soc); 825 bool (*mon_reap_timer_start)(struct dp_soc *soc, 826 enum cdp_mon_reap_source source); 827 bool (*mon_reap_timer_stop)(struct dp_soc *soc, 828 enum cdp_mon_reap_source source); 829 void (*mon_reap_timer_deinit)(struct dp_soc *soc); 830 #ifdef QCA_MCOPY_SUPPORT 831 QDF_STATUS (*mon_mcopy_check_deliver)(struct dp_pdev *pdev, 832 uint16_t peer_id, 833 uint32_t ppdu_id, 834 uint8_t first_msdu); 835 #endif 836 void (*mon_neighbour_peer_add_ast)(struct dp_pdev *pdev, 837 struct dp_peer *ta_peer, 838 uint8_t *mac_addr, 839 qdf_nbuf_t nbuf, 840 uint32_t flags); 841 #ifdef QCA_ENHANCED_STATS_SUPPORT 842 void (*mon_filter_setup_enhanced_stats)(struct dp_pdev *pdev); 843 void (*mon_filter_reset_enhanced_stats)(struct dp_pdev *pdev); 844 void (*mon_tx_stats_update)(struct dp_mon_peer *mon_peer, 845 struct cdp_tx_completion_ppdu_user *ppdu); 846 void (*mon_tx_enable_enhanced_stats)(struct dp_pdev *pdev); 847 void (*mon_tx_disable_enhanced_stats)(struct dp_pdev *pdev); 848 void (*mon_ppdu_desc_deliver)(struct dp_pdev *pdev, 849 struct ppdu_info *ppdu_info); 850 bool (*mon_ppdu_stats_feat_enable_check)(struct dp_pdev *pdev); 851 void (*mon_ppdu_desc_notify)(struct dp_pdev *pdev, qdf_nbuf_t nbuf); 852 #endif 853 #ifdef QCA_MCOPY_SUPPORT 854 void (*mon_filter_setup_mcopy_mode)(struct dp_pdev *pdev); 855 void (*mon_filter_reset_mcopy_mode)(struct dp_pdev *pdev); 856 #endif 857 #if defined(ATH_SUPPORT_NAC_RSSI) || defined(ATH_SUPPORT_NAC) 858 void (*mon_filter_setup_smart_monitor)(struct dp_pdev *pdev); 859 void (*mon_filter_reset_smart_monitor)(struct dp_pdev *pdev); 860 #endif 861 void (*mon_filter_set_reset_mon_mac_filter)(struct dp_pdev *pdev, 862 bool val); 863 #ifdef WLAN_RX_PKT_CAPTURE_ENH 864 void (*mon_filter_setup_rx_enh_capture)(struct dp_pdev *pdev); 865 void (*mon_filter_reset_rx_enh_capture)(struct dp_pdev *pdev); 866 #endif 867 void (*mon_filter_setup_rx_mon_mode)(struct dp_pdev *pdev); 868 void (*mon_filter_reset_rx_mon_mode)(struct dp_pdev *pdev); 869 void (*mon_filter_setup_tx_mon_mode)(struct dp_pdev *pdev); 870 void (*mon_filter_reset_tx_mon_mode)(struct dp_pdev *pdev); 871 #ifdef WDI_EVENT_ENABLE 872 void (*mon_filter_setup_rx_pkt_log_full)(struct dp_pdev *pdev); 873 void (*mon_filter_reset_rx_pkt_log_full)(struct dp_pdev *pdev); 874 void (*mon_filter_setup_rx_pkt_log_lite)(struct dp_pdev *pdev); 875 void (*mon_filter_reset_rx_pkt_log_lite)(struct dp_pdev *pdev); 876 void (*mon_filter_setup_rx_pkt_log_cbf)(struct dp_pdev *pdev); 877 void (*mon_filter_reset_rx_pkt_log_cbf)(struct dp_pdev *pdev); 878 #ifdef BE_PKTLOG_SUPPORT 879 void (*mon_filter_setup_pktlog_hybrid)(struct dp_pdev *pdev); 880 void (*mon_filter_reset_pktlog_hybrid)(struct dp_pdev *pdev); 881 #endif 882 #endif 883 QDF_STATUS (*rx_mon_filter_update)(struct dp_pdev *pdev); 884 QDF_STATUS (*tx_mon_filter_update)(struct dp_pdev *pdev); 885 QDF_STATUS (*set_mon_mode_buf_rings_tx)(struct dp_pdev *pdev, 886 uint16_t num_buf); 887 888 QDF_STATUS (*tx_mon_filter_alloc)(struct dp_pdev *pdev); 889 void (*tx_mon_filter_dealloc)(struct dp_pdev *pdev); 890 mon_rings_alloc_fp mon_rings_alloc[2]; 891 mon_rings_free_fp mon_rings_free[2]; 892 mon_rings_init_fp mon_rings_init[2]; 893 mon_rings_deinit_fp mon_rings_deinit[2]; 894 895 QDF_STATUS (*rx_mon_buffers_alloc)(struct dp_pdev *pdev); 896 void (*rx_mon_buffers_free)(struct dp_pdev *pdev); 897 void (*rx_mon_desc_pool_init)(struct dp_pdev *pdev); 898 void (*rx_mon_desc_pool_deinit)(struct dp_pdev *pdev); 899 QDF_STATUS (*rx_mon_desc_pool_alloc)(struct dp_pdev *pdev); 900 void (*rx_mon_desc_pool_free)(struct dp_pdev *pdev); 901 void (*tx_mon_desc_pool_init)(struct dp_pdev *pdev); 902 void (*tx_mon_desc_pool_deinit)(struct dp_pdev *pdev); 903 QDF_STATUS (*tx_mon_desc_pool_alloc)(struct dp_pdev *pdev); 904 void (*tx_mon_desc_pool_free)(struct dp_pdev *pdev); 905 void (*rx_mon_enable)(uint32_t *msg_word, 906 struct htt_rx_ring_tlv_filter *tlv_filter); 907 void (*rx_hdr_length_set)(uint32_t *msg_word, 908 struct htt_rx_ring_tlv_filter *tlv_filter); 909 void (*rx_packet_length_set)(uint32_t *msg_word, 910 struct htt_rx_ring_tlv_filter *tlv_filter); 911 void (*rx_wmask_subscribe)(struct dp_soc *soc, 912 uint32_t *msg_word, int pdev_id, 913 struct htt_rx_ring_tlv_filter *tlv_filter); 914 void (*rx_pkt_tlv_offset)(uint32_t *msg_word, 915 struct htt_rx_ring_tlv_filter *tlv_filter); 916 void (*rx_enable_mpdu_logging)(uint32_t *msg_word, 917 struct htt_rx_ring_tlv_filter *tlv_filter); 918 void (*rx_enable_fpmo)(uint32_t *msg_word, 919 struct htt_rx_ring_tlv_filter *tlv_filter); 920 #ifndef DISABLE_MON_CONFIG 921 void (*mon_register_intr_ops)(struct dp_soc *soc); 922 #endif 923 void (*mon_register_feature_ops)(struct dp_soc *soc); 924 #ifdef QCA_ENHANCED_STATS_SUPPORT 925 void (*mon_rx_stats_update)(struct dp_mon_peer *mon_peer, 926 struct cdp_rx_indication_ppdu *ppdu, 927 struct cdp_rx_stats_ppdu_user *ppdu_user); 928 void (*mon_rx_populate_ppdu_usr_info)(struct mon_rx_user_status *rx_user_status, 929 struct cdp_rx_stats_ppdu_user *ppdu_user); 930 void (*mon_rx_populate_ppdu_info)(struct hal_rx_ppdu_info *hal_ppdu_info, 931 struct cdp_rx_indication_ppdu *ppdu); 932 #endif 933 QDF_STATUS (*rx_mon_refill_buf_ring)(struct dp_intr *int_ctx); 934 QDF_STATUS (*tx_mon_refill_buf_ring)(struct dp_intr *int_ctx); 935 #ifdef QCA_UNDECODED_METADATA_SUPPORT 936 QDF_STATUS (*mon_config_undecoded_metadata_capture) 937 (struct dp_pdev *pdev, int val); 938 void (*mon_filter_setup_undecoded_metadata_capture) 939 (struct dp_pdev *pdev); 940 void (*mon_filter_reset_undecoded_metadata_capture) 941 (struct dp_pdev *pdev); 942 #endif 943 QDF_STATUS (*mon_pdev_ext_init)(struct dp_pdev *pdev); 944 QDF_STATUS (*mon_pdev_ext_deinit)(struct dp_pdev *pdev); 945 QDF_STATUS (*mon_rx_pdev_tlv_logger_init)(struct dp_pdev *pdev); 946 QDF_STATUS (*mon_rx_pdev_tlv_logger_deinit)(struct dp_pdev *pdev); 947 QDF_STATUS (*mon_lite_mon_alloc)(struct dp_pdev *pdev); 948 void (*mon_lite_mon_dealloc)(struct dp_pdev *pdev); 949 void (*mon_lite_mon_vdev_delete)(struct dp_pdev *pdev, 950 struct dp_vdev *vdev); 951 void (*mon_lite_mon_disable_rx)(struct dp_pdev *pdev); 952 bool (*mon_lite_mon_is_rx_adv_filter_enable)(struct dp_pdev *pdev); 953 /* Print advanced monitor stats */ 954 void (*mon_rx_print_advanced_stats) 955 (struct dp_soc *soc, struct dp_pdev *pdev); 956 QDF_STATUS (*mon_rx_ppdu_info_cache_create)(struct dp_pdev *pdev); 957 void (*mon_rx_ppdu_info_cache_destroy)(struct dp_pdev *pdev); 958 void (*mon_mac_filter_set)(uint32_t *msg_word, 959 struct htt_rx_ring_tlv_filter *tlv_filter); 960 #ifdef WLAN_FEATURE_LOCAL_PKT_CAPTURE 961 QDF_STATUS (*start_local_pkt_capture)(struct dp_pdev *pdev); 962 QDF_STATUS (*stop_local_pkt_capture)(struct dp_pdev *pdev); 963 bool (*is_local_pkt_capture_running)(struct dp_pdev *pdev); 964 #endif /* WLAN_FEATURE_LOCAL_PKT_CAPTURE */ 965 }; 966 967 /** 968 * struct dp_mon_soc_stats - monitor stats 969 * @frag_alloc: Number of frags allocated 970 * @frag_free: Number of frags freed 971 * @empty_queue: Number of frags freed due to empty queue 972 */ 973 struct dp_mon_soc_stats { 974 uint32_t frag_alloc; 975 uint32_t frag_free; 976 uint32_t empty_queue; 977 }; 978 979 struct dp_mon_soc { 980 /* Holds all monitor related fields extracted from dp_soc */ 981 /* Holds pointer to monitor ops */ 982 /* monitor link descriptor pages */ 983 struct qdf_mem_multi_page_t mon_link_desc_pages[MAX_NUM_LMAC_HW]; 984 985 /* total link descriptors for monitor mode for each radio */ 986 uint32_t total_mon_link_descs[MAX_NUM_LMAC_HW]; 987 988 /* Monitor Link descriptor memory banks */ 989 struct link_desc_bank 990 mon_link_desc_banks[MAX_NUM_LMAC_HW][MAX_MON_LINK_DESC_BANKS]; 991 uint32_t num_mon_link_desc_banks[MAX_NUM_LMAC_HW]; 992 /* Smart monitor capability for HKv2 */ 993 uint8_t hw_nac_monitor_support; 994 995 /* Full monitor mode support */ 996 bool full_mon_mode; 997 998 /*interrupt timer*/ 999 qdf_timer_t mon_reap_timer; 1000 uint8_t reap_timer_init; 1001 1002 qdf_spinlock_t reap_timer_lock; 1003 1004 /* Bitmap to record trigger sources of the reap timer */ 1005 qdf_bitmap(mon_reap_src_bitmap, CDP_MON_REAP_SOURCE_NUM); 1006 1007 qdf_timer_t mon_vdev_timer; 1008 uint8_t mon_vdev_timer_state; 1009 1010 struct dp_mon_ops *mon_ops; 1011 bool monitor_mode_v2; 1012 #ifndef DISABLE_MON_CONFIG 1013 uint32_t (*mon_rx_process)(struct dp_soc *soc, 1014 struct dp_intr *int_ctx, 1015 uint32_t mac_id, 1016 uint32_t quota); 1017 #endif 1018 1019 #ifdef WLAN_TX_PKT_CAPTURE_ENH 1020 struct dp_soc_tx_capture dp_soc_tx_capt; 1021 #endif 1022 /* monitor stats */ 1023 struct dp_mon_soc_stats stats; 1024 }; 1025 1026 #ifdef WLAN_CONFIG_TELEMETRY_AGENT 1027 struct dp_mon_peer_airtime_consumption { 1028 uint32_t consumption; 1029 uint16_t avg_consumption_per_sec; 1030 }; 1031 1032 /** 1033 * struct dp_mon_peer_airtime_stats - Monitor peer airtime stats 1034 * @tx_airtime_consumption: tx artime consumption of peer 1035 * @rx_airtime_consumption: rx airtime consumption of peer 1036 * @last_update_time: Time when last avergae of airtime is done 1037 */ 1038 struct dp_mon_peer_airtime_stats { 1039 struct dp_mon_peer_airtime_consumption tx_airtime_consumption[WME_AC_MAX]; 1040 struct dp_mon_peer_airtime_consumption rx_airtime_consumption[WME_AC_MAX]; 1041 uint64_t last_update_time; 1042 }; 1043 1044 /** 1045 * struct dp_mon_peer_deterministic - Monitor peer deterministic stats 1046 * @deter: Deterministic stats per data tid 1047 * @avg_tx_rate: Avg TX rate 1048 */ 1049 struct dp_mon_peer_deterministic { 1050 struct cdp_peer_deter_stats deter[CDP_DATA_TID_MAX]; 1051 uint64_t avg_tx_rate; 1052 }; 1053 #endif 1054 1055 /** 1056 * struct dp_mon_peer_stats - Monitor peer stats 1057 * @tx: tx stats 1058 * @rx: rx stats 1059 * @airtime_stats: mon peer airtime stats 1060 * @deter_stats: Deterministic stats 1061 */ 1062 struct dp_mon_peer_stats { 1063 #ifdef QCA_ENHANCED_STATS_SUPPORT 1064 dp_mon_peer_tx_stats tx; 1065 dp_mon_peer_rx_stats rx; 1066 #ifdef WLAN_CONFIG_TELEMETRY_AGENT 1067 struct dp_mon_peer_airtime_stats airtime_stats; 1068 struct dp_mon_peer_deterministic deter_stats; 1069 #endif 1070 #endif 1071 }; 1072 1073 struct dp_mon_peer { 1074 #ifdef WLAN_TX_PKT_CAPTURE_ENH 1075 struct dp_peer_tx_capture tx_capture; 1076 #endif 1077 #ifdef FEATURE_PERPKT_INFO 1078 /* delayed ba ppdu stats handling */ 1079 struct cdp_delayed_tx_completion_ppdu_user delayed_ba_ppdu_stats; 1080 /* delayed ba flag */ 1081 bool last_delayed_ba; 1082 /* delayed ba ppdu id */ 1083 uint32_t last_delayed_ba_ppduid; 1084 #endif 1085 uint8_t tx_cap_enabled:1, /* Peer's tx-capture is enabled */ 1086 rx_cap_enabled:1; /* Peer's rx-capture is enabled */ 1087 1088 /* Peer level flag to check peer based pktlog enabled or 1089 * disabled 1090 */ 1091 uint8_t peer_based_pktlog_filter; 1092 1093 /* Monitor peer stats */ 1094 struct dp_mon_peer_stats stats; 1095 1096 /* peer extended statistics context */ 1097 struct cdp_peer_rate_stats_ctx *peerstats_ctx; 1098 }; 1099 1100 struct dp_rx_mon_rssi_offset { 1101 /* Temperature based rssi offset */ 1102 int32_t rssi_temp_offset; 1103 /* Low noise amplifier bypass offset */ 1104 int32_t xlna_bypass_offset; 1105 /* Low noise amplifier bypass threshold */ 1106 int32_t xlna_bypass_threshold; 1107 /* 3 Bytes of xbar_config are used for RF to BB mapping */ 1108 uint32_t xbar_config; 1109 /* min noise floor in active chains per channel */ 1110 int8_t min_nf_dbm; 1111 /* this value is sum of temp_oofset + min_nf*/ 1112 int32_t rssi_offset; 1113 }; 1114 1115 struct dp_ring_ppdu_id_tracker { 1116 uint64_t time_ppdu_id_mon_dest; 1117 uint32_t ppdu_id_mon_dest; 1118 uint64_t time_ppdu_id_mon_status; 1119 uint32_t ppdu_id_mon_status; 1120 uint32_t dest_hp; 1121 uint32_t dest_tp; 1122 int32_t dest_hw_hp; 1123 int32_t dest_hw_tp; 1124 uint32_t status_hp; 1125 uint32_t status_tp; 1126 int32_t status_hw_hp; 1127 int32_t status_hw_tp; 1128 }; 1129 1130 struct dp_mon_pdev { 1131 /* monitor */ 1132 bool monitor_configured; 1133 uint32_t mon_vdev_id; 1134 1135 struct dp_mon_filter **filter; /* Monitor Filter pointer */ 1136 1137 /* advance filter mode and type*/ 1138 uint8_t mon_filter_mode; 1139 uint16_t fp_mgmt_filter; 1140 uint16_t fp_ctrl_filter; 1141 uint16_t fp_data_filter; 1142 uint16_t mo_mgmt_filter; 1143 uint16_t mo_ctrl_filter; 1144 uint16_t mo_data_filter; 1145 uint16_t md_data_filter; 1146 1147 #ifdef WLAN_TX_PKT_CAPTURE_ENH 1148 struct dp_pdev_tx_capture tx_capture; 1149 bool stop_tx_capture_work_q_timer; 1150 #endif 1151 1152 /* tx packet capture enhancement */ 1153 enum cdp_tx_enh_capture_mode tx_capture_enabled; 1154 /* Stuck count on monitor destination ring MPDU process */ 1155 uint32_t mon_dest_ring_stuck_cnt; 1156 /* monitor mode lock */ 1157 qdf_spinlock_t mon_lock; 1158 1159 /* Monitor mode operation channel */ 1160 int mon_chan_num; 1161 1162 /* Monitor mode operation frequency */ 1163 qdf_freq_t mon_chan_freq; 1164 1165 /* Monitor mode band */ 1166 enum reg_wifi_band mon_chan_band; 1167 1168 uint32_t mon_ppdu_status; 1169 /* monitor mode status/destination ring PPDU and MPDU count */ 1170 struct cdp_pdev_mon_stats rx_mon_stats; 1171 /* Monitor mode interface and status storage */ 1172 struct dp_vdev *mvdev; 1173 struct cdp_mon_status rx_mon_recv_status; 1174 /* to track duplicate link descriptor indications by HW for a WAR */ 1175 uint64_t mon_last_linkdesc_paddr; 1176 /* to track duplicate buffer indications by HW for a WAR */ 1177 uint32_t mon_last_buf_cookie; 1178 1179 #ifdef QCA_SUPPORT_FULL_MON 1180 /* List to maintain all MPDUs for a PPDU in monitor mode */ 1181 TAILQ_HEAD(, dp_mon_mpdu) mon_mpdu_q; 1182 1183 /* TODO: define per-user mpdu list 1184 * struct dp_mon_mpdu_list mpdu_list[MAX_MU_USERS]; 1185 */ 1186 struct hal_rx_mon_desc_info *mon_desc; 1187 struct dp_ring_ppdu_id_tracker hist_ppdu_id_mon_d[DP_HIST_TRACK_SIZE]; 1188 struct dp_ring_ppdu_id_tracker hist_ppdu_id_mon_s[DP_HIST_TRACK_SIZE]; 1189 uint8_t hist_mon_dest_idx; 1190 uint8_t hist_mon_status_idx; 1191 #endif 1192 bool set_reset_mon; 1193 bool is_bkpressure; 1194 /* Flag to hold on to monitor destination ring */ 1195 bool hold_mon_dest_ring; 1196 uint64_t reap_status[DP_MON_STATUS_MAX]; 1197 uint64_t prev_status[DP_MON_STATUS_MAX]; 1198 uint64_t status_match[DP_MON_STATUS_MAX]; 1199 1200 /* Flag to indicate monitor rings are initialized */ 1201 uint8_t pdev_mon_init; 1202 #ifndef REMOVE_PKT_LOG 1203 bool pkt_log_init; 1204 struct pktlog_dev_t *pl_dev; /* Pktlog pdev */ 1205 #endif /* #ifndef REMOVE_PKT_LOG */ 1206 1207 /* Smart Mesh */ 1208 bool filter_neighbour_peers; 1209 1210 /*flag to indicate neighbour_peers_list not empty */ 1211 bool neighbour_peers_added; 1212 /* smart mesh mutex */ 1213 qdf_spinlock_t neighbour_peer_mutex; 1214 /* Neighnour peer list */ 1215 TAILQ_HEAD(, dp_neighbour_peer) neighbour_peers_list; 1216 /* Enhanced Stats is enabled */ 1217 uint8_t enhanced_stats_en; 1218 qdf_nbuf_queue_t rx_status_q; 1219 1220 /* 128 bytes mpdu header queue per user for ppdu */ 1221 qdf_nbuf_queue_t mpdu_q[MAX_MU_USERS]; 1222 1223 /* is this a mpdu header TLV and not msdu header TLV */ 1224 bool is_mpdu_hdr[MAX_MU_USERS]; 1225 1226 /* per user 128 bytes msdu header list for MPDU */ 1227 struct msdu_list msdu_list[MAX_MU_USERS]; 1228 1229 /* RX enhanced capture mode */ 1230 uint8_t rx_enh_capture_mode; 1231 /* Rx per peer enhanced capture mode */ 1232 bool rx_enh_capture_peer; 1233 struct dp_vdev *rx_enh_monitor_vdev; 1234 /* RX enhanced capture trailer enable/disable flag */ 1235 bool is_rx_enh_capture_trailer_enabled; 1236 #ifdef WLAN_RX_PKT_CAPTURE_ENH 1237 /* RX per MPDU/PPDU information */ 1238 struct cdp_rx_indication_mpdu mpdu_ind; 1239 #endif 1240 1241 /* Packet log mode */ 1242 uint8_t rx_pktlog_mode; 1243 /* Enable pktlog logging cbf */ 1244 bool rx_pktlog_cbf; 1245 1246 #ifdef BE_PKTLOG_SUPPORT 1247 /* Enable pktlog logging hybrid */ 1248 bool pktlog_hybrid_mode; 1249 #endif 1250 bool tx_sniffer_enable; 1251 /* mirror copy mode */ 1252 enum m_copy_mode mcopy_mode; 1253 bool bpr_enable; 1254 /* Pdev level flag to check peer based pktlog enabled or 1255 * disabled 1256 */ 1257 uint8_t dp_peer_based_pktlog; 1258 1259 #ifdef WLAN_ATF_ENABLE 1260 /* ATF stats enable */ 1261 bool dp_atf_stats_enable; 1262 #endif 1263 1264 /* Maintains first status buffer's paddr of a PPDU */ 1265 uint64_t status_buf_addr; 1266 struct hal_rx_ppdu_info ppdu_info; 1267 1268 /* ppdu_id of last received HTT TX stats */ 1269 uint32_t last_ppdu_id; 1270 struct { 1271 uint8_t last_user; 1272 qdf_nbuf_t buf; 1273 } tx_ppdu_info; 1274 1275 struct { 1276 uint32_t tx_ppdu_id; 1277 uint16_t tx_peer_id; 1278 uint32_t rx_ppdu_id; 1279 } m_copy_id; 1280 1281 /* To check if PPDU Tx stats are enabled for Pktlog */ 1282 bool pktlog_ppdu_stats; 1283 1284 #ifdef ATH_SUPPORT_NAC_RSSI 1285 bool nac_rssi_filtering; 1286 #endif 1287 1288 /* ppdu_stats lock for queue concurrency between cores*/ 1289 qdf_spinlock_t ppdu_stats_lock; 1290 1291 /* list of ppdu tlvs */ 1292 TAILQ_HEAD(, ppdu_info) ppdu_info_list; 1293 TAILQ_HEAD(, ppdu_info) sched_comp_ppdu_list; 1294 1295 uint32_t sched_comp_list_depth; 1296 uint16_t delivered_sched_cmdid; 1297 uint16_t last_sched_cmdid; 1298 uint32_t tlv_count; 1299 uint32_t list_depth; 1300 1301 struct { 1302 qdf_nbuf_t last_nbuf; /*Ptr to mgmt last buf */ 1303 uint8_t *mgmt_buf; /* Ptr to mgmt. payload in HTT ppdu stats */ 1304 uint32_t mgmt_buf_len; /* Len of mgmt. payload in ppdu stats */ 1305 uint32_t ppdu_id; 1306 } mgmtctrl_frm_info; 1307 /* Context of cal client timer */ 1308 struct cdp_cal_client *cal_client_ctx; 1309 uint32_t *ppdu_tlv_buf; /* Buffer to hold HTT ppdu stats TLVs*/ 1310 1311 qdf_nbuf_t mcopy_status_nbuf; 1312 bool is_dp_mon_pdev_initialized; 1313 /* indicates if spcl vap is configured */ 1314 bool scan_spcl_vap_configured; 1315 bool undecoded_metadata_capture; 1316 #ifdef QCA_UNDECODED_METADATA_SUPPORT 1317 uint32_t phyrx_error_mask; 1318 uint32_t phyrx_error_mask_cont; 1319 #endif 1320 #ifdef QCA_SUPPORT_SCAN_SPCL_VAP_STATS 1321 /* enable spcl vap stats reset on ch change */ 1322 bool reset_scan_spcl_vap_stats_enable; 1323 #endif 1324 bool is_tlv_hdr_64_bit; 1325 /* TLV header size*/ 1326 uint8_t tlv_hdr_size; 1327 1328 /* Invalid monitor peer to account for stats in mcopy mode */ 1329 struct dp_mon_peer *invalid_mon_peer; 1330 1331 bool rssi_dbm_conv_support; 1332 struct dp_rx_mon_rssi_offset rssi_offsets; 1333 uint8_t phy_ppdu_id_size; 1334 #ifdef WLAN_FEATURE_LOCAL_PKT_CAPTURE 1335 bool is_local_pkt_capture_running; 1336 #endif 1337 }; 1338 1339 struct dp_mon_vdev { 1340 /* callback to hand rx monitor 802.11 MPDU to the OS shim */ 1341 ol_txrx_rx_mon_fp osif_rx_mon; 1342 #ifdef QCA_SUPPORT_SCAN_SPCL_VAP_STATS 1343 struct cdp_scan_spcl_vap_stats *scan_spcl_vap_stats; 1344 #endif 1345 }; 1346 1347 #if defined(QCA_TX_CAPTURE_SUPPORT) || defined(QCA_ENHANCED_STATS_SUPPORT) 1348 void dp_deliver_mgmt_frm(struct dp_pdev *pdev, qdf_nbuf_t nbuf); 1349 #else 1350 static inline 1351 void dp_deliver_mgmt_frm(struct dp_pdev *pdev, qdf_nbuf_t nbuf) 1352 { 1353 } 1354 #endif 1355 1356 #if defined(WLAN_SUPPORT_RX_PROTOCOL_TYPE_TAG) ||\ 1357 defined(WLAN_SUPPORT_RX_FLOW_TAG) 1358 /** 1359 * dp_rx_mon_update_protocol_flow_tag() - Performs necessary checks for monitor 1360 * mode and then tags appropriate packets 1361 * @soc: core txrx main context 1362 * @dp_pdev: pdev on which packet is received 1363 * @msdu: QDF packet buffer on which the protocol tag should be set 1364 * @rx_desc: base address where the RX TLVs start 1365 * 1366 * Return: void 1367 */ 1368 void dp_rx_mon_update_protocol_flow_tag(struct dp_soc *soc, 1369 struct dp_pdev *dp_pdev, 1370 qdf_nbuf_t msdu, void *rx_desc); 1371 #endif /* WLAN_SUPPORT_RX_PROTOCOL_TYPE_TAG || WLAN_SUPPORT_RX_FLOW_TAG */ 1372 1373 #if !defined(WLAN_SUPPORT_RX_PROTOCOL_TYPE_TAG) &&\ 1374 !defined(WLAN_SUPPORT_RX_FLOW_TAG) 1375 /** 1376 * dp_rx_mon_update_protocol_flow_tag() - Performs necessary checks for monitor 1377 * mode and then tags appropriate packets 1378 * @soc: core txrx main context 1379 * @dp_pdev: pdev on which packet is received 1380 * @msdu: QDF packet buffer on which the protocol tag should be set 1381 * @rx_desc: base address where the RX TLVs start 1382 * 1383 * Return: void 1384 */ 1385 static inline 1386 void dp_rx_mon_update_protocol_flow_tag(struct dp_soc *soc, 1387 struct dp_pdev *dp_pdev, 1388 qdf_nbuf_t msdu, void *rx_desc) 1389 { 1390 } 1391 #endif /* WLAN_SUPPORT_RX_PROTOCOL_TYPE_TAG || WLAN_SUPPORT_RX_FLOW_TAG */ 1392 1393 #ifndef WLAN_TX_PKT_CAPTURE_ENH 1394 /** 1395 * dp_peer_tid_queue_init() - Initialize ppdu stats queue per TID 1396 * @peer: Datapath peer 1397 * 1398 */ 1399 static inline void dp_peer_tid_queue_init(struct dp_peer *peer) 1400 { 1401 } 1402 1403 /** 1404 * dp_peer_tid_queue_cleanup() - remove ppdu stats queue per TID 1405 * @peer: Datapath peer 1406 * 1407 */ 1408 static inline void dp_peer_tid_queue_cleanup(struct dp_peer *peer) 1409 { 1410 } 1411 1412 /** 1413 * dp_peer_update_80211_hdr() - dp peer update 80211 hdr 1414 * @vdev: Datapath vdev 1415 * @peer: Datapath peer 1416 * 1417 */ 1418 static inline void 1419 dp_peer_update_80211_hdr(struct dp_vdev *vdev, struct dp_peer *peer) 1420 { 1421 } 1422 1423 /** 1424 * dp_get_peer_tx_capture_stats() - to get peer tx capture stats 1425 * @peer: DP PEER handle 1426 * @stats: pointor to peer tx capture stats 1427 * 1428 * return: QDF_STATUS 1429 */ 1430 static inline QDF_STATUS 1431 dp_get_peer_tx_capture_stats(struct dp_peer *peer, 1432 struct cdp_peer_tx_capture_stats *stats) 1433 { 1434 return QDF_STATUS_E_FAILURE; 1435 } 1436 1437 /** 1438 * dp_get_pdev_tx_capture_stats() - to get pdev tx capture stats 1439 * @pdev: DP PDEV handle 1440 * @stats: pointor to pdev tx capture stats 1441 * 1442 * return: QDF_STATUS 1443 */ 1444 static inline QDF_STATUS 1445 dp_get_pdev_tx_capture_stats(struct dp_pdev *pdev, 1446 struct cdp_pdev_tx_capture_stats *stats) 1447 { 1448 return QDF_STATUS_E_FAILURE; 1449 } 1450 #endif 1451 1452 #ifdef WLAN_TX_PKT_CAPTURE_ENH 1453 extern uint8_t 1454 dp_cpu_ring_map[DP_NSS_CPU_RING_MAP_MAX][WLAN_CFG_INT_NUM_CONTEXTS_MAX]; 1455 #endif 1456 1457 /** 1458 * dp_htt_get_ppdu_sniffer_ampdu_tlv_bitmap() - Get ppdu stats tlv 1459 * bitmap for sniffer mode 1460 * @bitmap: received bitmap 1461 * 1462 * Return: expected bitmap value, returns zero if doesn't match with 1463 * either 64-bit Tx window or 256-bit window tlv bitmap 1464 */ 1465 int 1466 dp_htt_get_ppdu_sniffer_ampdu_tlv_bitmap(uint32_t bitmap); 1467 1468 #if (defined(DP_CON_MON) || defined(WDI_EVENT_ENABLE)) &&\ 1469 (!defined(REMOVE_PKT_LOG)) 1470 /** 1471 * dp_pkt_log_init() - API to initialize packet log 1472 * @soc_hdl: Datapath soc handle 1473 * @pdev_id: id of data path pdev handle 1474 * @scn: HIF context 1475 * 1476 * Return: none 1477 */ 1478 void dp_pkt_log_init(struct cdp_soc_t *soc_hdl, uint8_t pdev_id, void *scn); 1479 #else 1480 static inline void 1481 dp_pkt_log_init(struct cdp_soc_t *soc_hdl, uint8_t pdev_id, void *scn) 1482 { 1483 } 1484 #endif 1485 1486 #if defined(WDI_EVENT_ENABLE) && defined(QCA_ENHANCED_STATS_SUPPORT) 1487 QDF_STATUS dp_peer_stats_notify(struct dp_pdev *pdev, struct dp_peer *peer); 1488 #else 1489 static inline QDF_STATUS dp_peer_stats_notify(struct dp_pdev *pdev, 1490 struct dp_peer *peer) 1491 { 1492 return QDF_STATUS_SUCCESS; 1493 } 1494 #endif 1495 1496 #if defined(FEATURE_PERPKT_INFO) && defined(WDI_EVENT_ENABLE) 1497 void dp_send_stats_event(struct dp_pdev *pdev, struct dp_peer *peer, 1498 uint16_t peer_id); 1499 #else 1500 static inline 1501 void dp_send_stats_event(struct dp_pdev *pdev, struct dp_peer *peer, 1502 uint16_t peer_id) 1503 { 1504 } 1505 #endif 1506 1507 #ifndef WLAN_TX_PKT_CAPTURE_ENH 1508 /** 1509 * dp_tx_ppdu_stats_process - Deferred PPDU stats handler 1510 * @context: Opaque work context (PDEV) 1511 * 1512 * Return: none 1513 */ 1514 static inline void dp_tx_ppdu_stats_process(void *context) 1515 { 1516 } 1517 1518 /** 1519 * dp_tx_capture_htt_frame_counter: increment counter for htt_frame_type 1520 * @pdev: DP pdev handle 1521 * @htt_frame_type: htt frame type received from fw 1522 * 1523 * return: void 1524 */ 1525 static inline 1526 void dp_tx_capture_htt_frame_counter(struct dp_pdev *pdev, 1527 uint32_t htt_frame_type) 1528 { 1529 } 1530 1531 #endif 1532 1533 /** 1534 * dp_rx_cookie_2_mon_link_desc_va() - Converts cookie to a virtual address of 1535 * the MSDU Link Descriptor 1536 * @pdev: core txrx pdev context 1537 * @buf_info: buf_info includes cookie that used to lookup virtual address of 1538 * link descriptor. Normally this is just an index into a per pdev array. 1539 * @mac_id: mac id 1540 * 1541 * This is the VA of the link descriptor in monitor mode destination ring, 1542 * that HAL layer later uses to retrieve the list of MSDU's for a given MPDU. 1543 * 1544 * Return: void *: Virtual Address of the Rx descriptor 1545 */ 1546 static inline 1547 void *dp_rx_cookie_2_mon_link_desc_va(struct dp_pdev *pdev, 1548 struct hal_buf_info *buf_info, 1549 int mac_id) 1550 { 1551 void *link_desc_va; 1552 struct qdf_mem_multi_page_t *pages; 1553 uint16_t page_id = LINK_DESC_COOKIE_PAGE_ID(buf_info->sw_cookie); 1554 struct dp_mon_soc *mon_soc = pdev->soc->monitor_soc; 1555 1556 if (!mon_soc) 1557 return NULL; 1558 1559 pages = &mon_soc->mon_link_desc_pages[mac_id]; 1560 if (!pages) 1561 return NULL; 1562 1563 if (qdf_unlikely(page_id >= pages->num_pages)) 1564 return NULL; 1565 1566 link_desc_va = pages->dma_pages[page_id].page_v_addr_start + 1567 (buf_info->paddr - pages->dma_pages[page_id].page_p_addr); 1568 1569 return link_desc_va; 1570 } 1571 1572 /** 1573 * dp_soc_is_full_mon_enable() - Return if full monitor mode is enabled 1574 * @pdev: point to dp pdev 1575 * 1576 * Return: Full monitor mode status 1577 */ 1578 static inline bool dp_soc_is_full_mon_enable(struct dp_pdev *pdev) 1579 { 1580 return (pdev->soc->monitor_soc->full_mon_mode && 1581 pdev->monitor_pdev->monitor_configured) ? true : false; 1582 } 1583 1584 /** 1585 * dp_monitor_is_enable_mcopy_mode() - check if mcopy mode is enabled 1586 * @pdev: point to dp pdev 1587 * 1588 * Return: true if mcopy mode is enabled 1589 */ 1590 static inline bool dp_monitor_is_enable_mcopy_mode(struct dp_pdev *pdev) 1591 { 1592 if (qdf_unlikely(!pdev || !pdev->monitor_pdev)) 1593 return false; 1594 1595 return pdev->monitor_pdev->mcopy_mode; 1596 } 1597 1598 /** 1599 * dp_monitor_is_enable_tx_sniffer() - check if tx sniffer is enabled 1600 * @pdev: point to dp pdev 1601 * 1602 * Return: true if tx sniffer is enabled 1603 */ 1604 static inline bool dp_monitor_is_enable_tx_sniffer(struct dp_pdev *pdev) 1605 { 1606 if (qdf_unlikely(!pdev || !pdev->monitor_pdev)) 1607 return false; 1608 1609 return pdev->monitor_pdev->tx_sniffer_enable; 1610 } 1611 1612 /** 1613 * dp_monitor_is_configured() - check if monitor configured is set 1614 * @pdev: point to dp pdev 1615 * 1616 * Return: true if monitor configured is set 1617 */ 1618 static inline bool dp_monitor_is_configured(struct dp_pdev *pdev) 1619 { 1620 if (qdf_unlikely(!pdev || !pdev->monitor_pdev)) 1621 return false; 1622 1623 return pdev->monitor_pdev->monitor_configured; 1624 } 1625 1626 /** 1627 * dp_monitor_check_com_info_ppdu_id() - check if msdu ppdu_id matches with 1628 * com info ppdu_id 1629 * @pdev: point to dp pdev 1630 * @rx_desc: point to rx_desc 1631 * 1632 * Return: success if ppdu_id matches 1633 */ 1634 static inline QDF_STATUS dp_monitor_check_com_info_ppdu_id(struct dp_pdev *pdev, 1635 void *rx_desc) 1636 { 1637 struct cdp_mon_status *rs; 1638 struct dp_mon_pdev *mon_pdev; 1639 uint32_t msdu_ppdu_id = 0; 1640 1641 if (qdf_unlikely(!pdev || !pdev->monitor_pdev)) 1642 return QDF_STATUS_E_FAILURE; 1643 1644 mon_pdev = pdev->monitor_pdev; 1645 if (qdf_likely(1 != mon_pdev->ppdu_info.rx_status.rxpcu_filter_pass)) 1646 return QDF_STATUS_E_FAILURE; 1647 1648 rs = &pdev->monitor_pdev->rx_mon_recv_status; 1649 if (!rs || rs->cdp_rs_rxdma_err) 1650 return QDF_STATUS_E_FAILURE; 1651 1652 msdu_ppdu_id = hal_rx_get_ppdu_id(pdev->soc->hal_soc, rx_desc); 1653 if (msdu_ppdu_id != mon_pdev->ppdu_info.com_info.ppdu_id) { 1654 QDF_TRACE(QDF_MODULE_ID_DP, 1655 QDF_TRACE_LEVEL_ERROR, 1656 "msdu_ppdu_id=%x,com_info.ppdu_id=%x", 1657 msdu_ppdu_id, 1658 mon_pdev->ppdu_info.com_info.ppdu_id); 1659 return QDF_STATUS_E_FAILURE; 1660 } 1661 1662 return QDF_STATUS_SUCCESS; 1663 } 1664 1665 /** 1666 * dp_monitor_get_rx_status() - get rx status 1667 * @pdev: point to dp pdev 1668 * 1669 * Return: return rx status pointer 1670 */ 1671 static inline struct mon_rx_status* 1672 dp_monitor_get_rx_status(struct dp_pdev *pdev) 1673 { 1674 if (qdf_unlikely(!pdev || !pdev->monitor_pdev)) 1675 return NULL; 1676 1677 return &pdev->monitor_pdev->ppdu_info.rx_status; 1678 } 1679 1680 /** 1681 * dp_monitor_is_chan_band_known() - check if monitor chan band known 1682 * @pdev: point to dp pdev 1683 * 1684 * Return: true if chan band known 1685 */ 1686 static inline bool dp_monitor_is_chan_band_known(struct dp_pdev *pdev) 1687 { 1688 if (qdf_unlikely(!pdev || !pdev->monitor_pdev)) 1689 return false; 1690 1691 if (pdev->monitor_pdev->mon_chan_band != REG_BAND_UNKNOWN) 1692 return true; 1693 1694 return false; 1695 } 1696 1697 /** 1698 * dp_monitor_get_chan_band() - get chan band 1699 * @pdev: point to dp pdev 1700 * 1701 * Return: wifi channel band 1702 */ 1703 static inline enum reg_wifi_band 1704 dp_monitor_get_chan_band(struct dp_pdev *pdev) 1705 { 1706 return pdev->monitor_pdev->mon_chan_band; 1707 } 1708 1709 /** 1710 * dp_monitor_print_tx_stats() - print tx stats from monitor pdev 1711 * @pdev: point to dp pdev 1712 * 1713 */ 1714 static inline void dp_monitor_print_tx_stats(struct dp_pdev *pdev) 1715 { 1716 if (qdf_unlikely(!pdev || !pdev->monitor_pdev)) 1717 return; 1718 1719 DP_PRINT_STATS("ppdu info schedule completion list depth: %d", 1720 pdev->monitor_pdev->sched_comp_list_depth); 1721 DP_PRINT_STATS("delivered sched cmdid: %d", 1722 pdev->monitor_pdev->delivered_sched_cmdid); 1723 DP_PRINT_STATS("cur sched cmdid: %d", 1724 pdev->monitor_pdev->last_sched_cmdid); 1725 DP_PRINT_STATS("ppdu info list depth: %d", 1726 pdev->monitor_pdev->list_depth); 1727 } 1728 1729 /** 1730 * dp_monitor_set_chan_num() - set channel number 1731 * @pdev: point to dp pdev 1732 * @chan_num: channel number 1733 * 1734 */ 1735 static inline void dp_monitor_set_chan_num(struct dp_pdev *pdev, int chan_num) 1736 { 1737 if (qdf_unlikely(!pdev || !pdev->monitor_pdev)) 1738 return; 1739 1740 pdev->monitor_pdev->mon_chan_num = chan_num; 1741 } 1742 1743 /** 1744 * dp_monitor_get_chan_num() - get channel number 1745 * @pdev: DP pdev handle 1746 * 1747 * Return: channel number 1748 */ 1749 static inline int dp_monitor_get_chan_num(struct dp_pdev *pdev) 1750 { 1751 if (qdf_unlikely(!pdev || !pdev->monitor_pdev)) 1752 return 0; 1753 1754 return pdev->monitor_pdev->mon_chan_num; 1755 } 1756 1757 /** 1758 * dp_monitor_set_chan_freq() - set channel frequency 1759 * @pdev: point to dp pdev 1760 * @chan_freq: channel frequency 1761 * 1762 */ 1763 static inline void 1764 dp_monitor_set_chan_freq(struct dp_pdev *pdev, qdf_freq_t chan_freq) 1765 { 1766 if (qdf_unlikely(!pdev || !pdev->monitor_pdev)) 1767 return; 1768 1769 pdev->monitor_pdev->mon_chan_freq = chan_freq; 1770 } 1771 1772 /** 1773 * dp_monitor_get_chan_freq() - get channel frequency 1774 * @pdev: DP pdev handle 1775 * 1776 * Return: channel frequency 1777 */ 1778 static inline qdf_freq_t 1779 dp_monitor_get_chan_freq(struct dp_pdev *pdev) 1780 { 1781 if (qdf_unlikely(!pdev || !pdev->monitor_pdev)) 1782 return 0; 1783 1784 return pdev->monitor_pdev->mon_chan_freq; 1785 } 1786 1787 /** 1788 * dp_monitor_set_chan_band() - set channel band 1789 * @pdev: point to dp pdev 1790 * @chan_band: channel band 1791 * 1792 */ 1793 static inline void 1794 dp_monitor_set_chan_band(struct dp_pdev *pdev, enum reg_wifi_band chan_band) 1795 { 1796 if (qdf_unlikely(!pdev || !pdev->monitor_pdev)) 1797 return; 1798 1799 pdev->monitor_pdev->mon_chan_band = chan_band; 1800 } 1801 1802 /** 1803 * dp_monitor_get_mpdu_status() - get mpdu status 1804 * @pdev: point to dp pdev 1805 * @soc: point to dp soc 1806 * @rx_tlv_hdr: point to rx tlv header 1807 * 1808 */ 1809 static inline void dp_monitor_get_mpdu_status(struct dp_pdev *pdev, 1810 struct dp_soc *soc, 1811 uint8_t *rx_tlv_hdr) 1812 { 1813 struct dp_mon_pdev *mon_pdev; 1814 1815 if (qdf_unlikely(!pdev || !pdev->monitor_pdev)) 1816 return; 1817 1818 mon_pdev = pdev->monitor_pdev; 1819 hal_rx_mon_hw_desc_get_mpdu_status(soc->hal_soc, rx_tlv_hdr, 1820 &mon_pdev->ppdu_info.rx_status); 1821 } 1822 1823 #ifdef FEATURE_NAC_RSSI 1824 /** 1825 * dp_monitor_drop_inv_peer_pkts() - drop invalid peer pkts 1826 * @vdev: point to dp vdev 1827 * 1828 * Return: success if sta mode and filter for neighbour peers enabled 1829 */ 1830 static inline QDF_STATUS dp_monitor_drop_inv_peer_pkts(struct dp_vdev *vdev) 1831 { 1832 struct dp_pdev *pdev = vdev->pdev; 1833 struct dp_soc *soc = pdev->soc; 1834 1835 if (!soc->monitor_soc) 1836 return QDF_STATUS_E_FAILURE; 1837 1838 if (!soc->monitor_soc->hw_nac_monitor_support && 1839 pdev->monitor_pdev->filter_neighbour_peers && 1840 vdev->opmode == wlan_op_mode_sta) 1841 return QDF_STATUS_SUCCESS; 1842 1843 return QDF_STATUS_E_FAILURE; 1844 } 1845 #else 1846 static inline QDF_STATUS dp_monitor_drop_inv_peer_pkts(struct dp_vdev *vdev) 1847 { 1848 return QDF_STATUS_E_FAILURE; 1849 } 1850 #endif 1851 1852 /** 1853 * dp_peer_ppdu_delayed_ba_init() - Initialize ppdu in peer 1854 * @peer: Datapath peer 1855 * 1856 * return: void 1857 */ 1858 #ifdef FEATURE_PERPKT_INFO 1859 static inline void dp_peer_ppdu_delayed_ba_init(struct dp_peer *peer) 1860 { 1861 struct dp_mon_peer *mon_peer = peer->monitor_peer; 1862 1863 if (!mon_peer) 1864 return; 1865 1866 qdf_mem_zero(&mon_peer->delayed_ba_ppdu_stats, 1867 sizeof(struct cdp_delayed_tx_completion_ppdu_user)); 1868 mon_peer->last_delayed_ba = false; 1869 mon_peer->last_delayed_ba_ppduid = 0; 1870 } 1871 #else 1872 static inline void dp_peer_ppdu_delayed_ba_init(struct dp_peer *peer) 1873 { 1874 } 1875 #endif 1876 1877 /** 1878 * dp_monitor_vdev_register_osif() - Register osif rx mon 1879 * @vdev: point to vdev 1880 * @txrx_ops: point to ol txrx ops 1881 * 1882 * Return: void 1883 */ 1884 static inline void dp_monitor_vdev_register_osif(struct dp_vdev *vdev, 1885 struct ol_txrx_ops *txrx_ops) 1886 { 1887 if (!vdev->monitor_vdev) 1888 return; 1889 1890 vdev->monitor_vdev->osif_rx_mon = txrx_ops->rx.mon; 1891 } 1892 1893 /** 1894 * dp_monitor_get_monitor_vdev_from_pdev() - Get monitor vdev 1895 * @pdev: point to pdev 1896 * 1897 * Return: pointer to vdev 1898 */ 1899 static inline struct dp_vdev* 1900 dp_monitor_get_monitor_vdev_from_pdev(struct dp_pdev *pdev) 1901 { 1902 if (!pdev || !pdev->monitor_pdev || !pdev->monitor_pdev->mvdev) 1903 return NULL; 1904 1905 return pdev->monitor_pdev->mvdev; 1906 } 1907 1908 /** 1909 * dp_monitor_is_vdev_timer_running() - Get vdev timer status 1910 * @soc: point to soc 1911 * 1912 * Return: true if timer running 1913 */ 1914 static inline bool dp_monitor_is_vdev_timer_running(struct dp_soc *soc) 1915 { 1916 if (qdf_unlikely(!soc || !soc->monitor_soc)) 1917 return false; 1918 1919 return !!(soc->monitor_soc->mon_vdev_timer_state & 1920 MON_VDEV_TIMER_RUNNING); 1921 } 1922 1923 /** 1924 * dp_monitor_get_link_desc_pages() - Get link desc pages 1925 * @soc: point to soc 1926 * @mac_id: mac id 1927 * 1928 * Return: return point to link desc pages 1929 */ 1930 static inline struct qdf_mem_multi_page_t* 1931 dp_monitor_get_link_desc_pages(struct dp_soc *soc, uint32_t mac_id) 1932 { 1933 if (qdf_unlikely(!soc || !soc->monitor_soc)) 1934 return NULL; 1935 1936 return &soc->monitor_soc->mon_link_desc_pages[mac_id]; 1937 } 1938 1939 #ifndef WLAN_SOFTUMAC_SUPPORT 1940 /* 1941 * dp_monitor_get_link_desc_ring() - Get link desc ring 1942 * @soc: point to soc 1943 * @mac_id: mac id 1944 * 1945 * Return: return point to link desc ring 1946 */ 1947 static inline hal_ring_handle_t 1948 dp_monitor_get_link_desc_ring(struct dp_soc *soc, uint32_t mac_id) 1949 { 1950 return soc->rxdma_mon_desc_ring[mac_id].hal_srng; 1951 } 1952 1953 static inline uint32_t 1954 dp_monitor_get_num_link_desc_ring_entries(struct dp_soc *soc, uint32_t mac_id) 1955 { 1956 struct dp_srng *ring; 1957 1958 ring = &soc->rxdma_mon_desc_ring[mac_id]; 1959 1960 return ring->alloc_size / hal_srng_get_entrysize(soc->hal_soc, 1961 RXDMA_MONITOR_DESC); 1962 } 1963 #else 1964 static inline hal_ring_handle_t 1965 dp_monitor_get_link_desc_ring(struct dp_soc *soc, uint32_t mac_id) 1966 { 1967 return soc->sw2rxdma_link_ring[mac_id].hal_srng; 1968 } 1969 1970 static inline uint32_t 1971 dp_monitor_get_num_link_desc_ring_entries(struct dp_soc *soc, uint32_t mac_id) 1972 { 1973 struct dp_srng *ring; 1974 1975 ring = &soc->sw2rxdma_link_ring[mac_id]; 1976 1977 return ring->alloc_size / hal_srng_get_entrysize(soc->hal_soc, 1978 SW2RXDMA_LINK_RELEASE); 1979 } 1980 #endif 1981 1982 /** 1983 * dp_monitor_get_total_link_descs() - Get total link descs 1984 * @soc: point to soc 1985 * @mac_id: mac id 1986 * 1987 * Return: return point total link descs 1988 */ 1989 static inline uint32_t * 1990 dp_monitor_get_total_link_descs(struct dp_soc *soc, uint32_t mac_id) 1991 { 1992 return &soc->monitor_soc->total_mon_link_descs[mac_id]; 1993 } 1994 1995 /** 1996 * dp_monitor_pdev_attach() - Monitor pdev attach 1997 * @pdev: point to pdev 1998 * 1999 * Return: return QDF_STATUS 2000 */ 2001 static inline QDF_STATUS dp_monitor_pdev_attach(struct dp_pdev *pdev) 2002 { 2003 struct dp_mon_ops *monitor_ops; 2004 struct dp_mon_soc *mon_soc = pdev->soc->monitor_soc; 2005 2006 /* 2007 * mon_soc uninitialized modular support enabled 2008 * monitor related attach/detach/init/deinit 2009 * will be done while monitor insmod 2010 */ 2011 if (!mon_soc) 2012 return QDF_STATUS_SUCCESS; 2013 2014 monitor_ops = mon_soc->mon_ops; 2015 if (!monitor_ops || !monitor_ops->mon_pdev_attach) { 2016 dp_mon_debug("callback not registered"); 2017 return QDF_STATUS_E_FAILURE; 2018 } 2019 2020 return monitor_ops->mon_pdev_attach(pdev); 2021 } 2022 2023 /** 2024 * dp_monitor_pdev_detach() - Monitor pdev detach 2025 * @pdev: point to pdev 2026 * 2027 * Return: return QDF_STATUS 2028 */ 2029 static inline QDF_STATUS dp_monitor_pdev_detach(struct dp_pdev *pdev) 2030 { 2031 struct dp_mon_ops *monitor_ops; 2032 struct dp_mon_soc *mon_soc = pdev->soc->monitor_soc; 2033 2034 /* 2035 * mon_soc uninitialized modular support enabled 2036 * monitor related attach/detach/init/deinit 2037 * will be done while monitor insmod 2038 */ 2039 if (!mon_soc) 2040 return QDF_STATUS_SUCCESS; 2041 2042 monitor_ops = mon_soc->mon_ops; 2043 if (!monitor_ops || !monitor_ops->mon_pdev_detach) { 2044 dp_mon_debug("callback not registered"); 2045 return QDF_STATUS_E_FAILURE; 2046 } 2047 2048 return monitor_ops->mon_pdev_detach(pdev); 2049 } 2050 2051 /** 2052 * dp_monitor_vdev_attach() - Monitor vdev attach 2053 * @vdev: point to vdev 2054 * 2055 * Return: return QDF_STATUS 2056 */ 2057 static inline QDF_STATUS dp_monitor_vdev_attach(struct dp_vdev *vdev) 2058 { 2059 struct dp_mon_ops *monitor_ops; 2060 struct dp_mon_soc *mon_soc = vdev->pdev->soc->monitor_soc; 2061 2062 if (!mon_soc) 2063 return QDF_STATUS_E_FAILURE; 2064 2065 monitor_ops = mon_soc->mon_ops; 2066 if (!monitor_ops || !monitor_ops->mon_vdev_attach) { 2067 dp_mon_debug("callback not registered"); 2068 return QDF_STATUS_E_FAILURE; 2069 } 2070 2071 return monitor_ops->mon_vdev_attach(vdev); 2072 } 2073 2074 /** 2075 * dp_monitor_vdev_detach() - Monitor vdev detach 2076 * @vdev: point to vdev 2077 * 2078 * Return: return QDF_STATUS 2079 */ 2080 static inline QDF_STATUS dp_monitor_vdev_detach(struct dp_vdev *vdev) 2081 { 2082 struct dp_mon_ops *monitor_ops; 2083 struct dp_mon_soc *mon_soc = vdev->pdev->soc->monitor_soc; 2084 2085 if (!mon_soc) 2086 return QDF_STATUS_E_FAILURE; 2087 2088 monitor_ops = mon_soc->mon_ops; 2089 if (!monitor_ops || !monitor_ops->mon_vdev_detach) { 2090 dp_mon_debug("callback not registered"); 2091 return QDF_STATUS_E_FAILURE; 2092 } 2093 2094 return monitor_ops->mon_vdev_detach(vdev); 2095 } 2096 2097 /** 2098 * dp_monitor_peer_attach() - Monitor peer attach 2099 * @soc: point to soc 2100 * @peer: point to peer 2101 * 2102 * Return: return QDF_STATUS 2103 */ 2104 static inline QDF_STATUS dp_monitor_peer_attach(struct dp_soc *soc, 2105 struct dp_peer *peer) 2106 { 2107 struct dp_mon_ops *monitor_ops; 2108 struct dp_mon_soc *mon_soc = soc->monitor_soc; 2109 2110 if (!mon_soc) 2111 return QDF_STATUS_E_FAILURE; 2112 2113 monitor_ops = mon_soc->mon_ops; 2114 if (!monitor_ops || !monitor_ops->mon_peer_attach) { 2115 dp_mon_debug("callback not registered"); 2116 return QDF_STATUS_E_FAILURE; 2117 } 2118 2119 return monitor_ops->mon_peer_attach(peer); 2120 } 2121 2122 /** 2123 * dp_monitor_peer_detach() - Monitor peer detach 2124 * @soc: point to soc 2125 * @peer: point to peer 2126 * 2127 * Return: return QDF_STATUS 2128 */ 2129 static inline QDF_STATUS dp_monitor_peer_detach(struct dp_soc *soc, 2130 struct dp_peer *peer) 2131 { 2132 struct dp_mon_ops *monitor_ops; 2133 struct dp_mon_soc *mon_soc = soc->monitor_soc; 2134 2135 if (!mon_soc) 2136 return QDF_STATUS_E_FAILURE; 2137 2138 monitor_ops = mon_soc->mon_ops; 2139 if (!monitor_ops || !monitor_ops->mon_peer_detach) { 2140 dp_mon_debug("callback not registered"); 2141 return QDF_STATUS_E_FAILURE; 2142 } 2143 2144 return monitor_ops->mon_peer_detach(peer); 2145 } 2146 2147 /** 2148 * dp_monitor_peer_get_peerstats_ctx() - Get peerstats context from monitor peer 2149 * @soc: Datapath soc handle 2150 * @peer: Datapath peer handle 2151 * 2152 * Return: peer stats context 2153 */ 2154 static inline struct cdp_peer_rate_stats_ctx* 2155 dp_monitor_peer_get_peerstats_ctx(struct dp_soc *soc, struct dp_peer *peer) 2156 { 2157 struct dp_mon_ops *monitor_ops; 2158 struct dp_mon_soc *mon_soc = soc->monitor_soc; 2159 2160 if (!mon_soc) 2161 return NULL; 2162 2163 monitor_ops = mon_soc->mon_ops; 2164 if (!monitor_ops || !monitor_ops->mon_peer_get_peerstats_ctx) { 2165 dp_mon_debug("callback not registered"); 2166 return NULL; 2167 } 2168 2169 return monitor_ops->mon_peer_get_peerstats_ctx(peer); 2170 } 2171 2172 /** 2173 * dp_monitor_peer_reset_stats() - Reset monitor peer stats 2174 * @soc: Datapath soc handle 2175 * @peer: Datapath peer handle 2176 * 2177 * Return: none 2178 */ 2179 static inline void dp_monitor_peer_reset_stats(struct dp_soc *soc, 2180 struct dp_peer *peer) 2181 { 2182 struct dp_mon_ops *monitor_ops; 2183 struct dp_mon_soc *mon_soc = soc->monitor_soc; 2184 2185 if (!mon_soc) 2186 return; 2187 2188 monitor_ops = mon_soc->mon_ops; 2189 if (!monitor_ops || !monitor_ops->mon_peer_reset_stats) { 2190 dp_mon_debug("callback not registered"); 2191 return; 2192 } 2193 2194 monitor_ops->mon_peer_reset_stats(peer); 2195 } 2196 2197 /** 2198 * dp_monitor_peer_get_stats() - Get monitor peer stats 2199 * @soc: Datapath soc handle 2200 * @peer: Datapath peer handle 2201 * @arg: Pointer to stats struct 2202 * @type: Update type 2203 * 2204 * Return: none 2205 */ 2206 static inline 2207 void dp_monitor_peer_get_stats(struct dp_soc *soc, struct dp_peer *peer, 2208 void *arg, enum cdp_stat_update_type type) 2209 { 2210 struct dp_mon_ops *monitor_ops; 2211 struct dp_mon_soc *mon_soc = soc->monitor_soc; 2212 2213 if (!mon_soc) 2214 return; 2215 2216 monitor_ops = mon_soc->mon_ops; 2217 if (!monitor_ops || !monitor_ops->mon_peer_get_stats) { 2218 dp_mon_debug("callback not registered"); 2219 return; 2220 } 2221 2222 monitor_ops->mon_peer_get_stats(peer, arg, type); 2223 } 2224 2225 /** 2226 * dp_monitor_invalid_peer_update_pdev_stats() - Update pdev stats from 2227 * invalid monitor peer 2228 * @soc: Datapath soc handle 2229 * @pdev: Datapath pdev handle 2230 * 2231 * Return: none 2232 */ 2233 static inline 2234 void dp_monitor_invalid_peer_update_pdev_stats(struct dp_soc *soc, 2235 struct dp_pdev *pdev) 2236 { 2237 struct dp_mon_ops *monitor_ops; 2238 struct dp_mon_soc *mon_soc = soc->monitor_soc; 2239 2240 if (!mon_soc) 2241 return; 2242 2243 monitor_ops = mon_soc->mon_ops; 2244 if (!monitor_ops || !monitor_ops->mon_invalid_peer_update_pdev_stats) { 2245 dp_mon_debug("callback not registered"); 2246 return; 2247 } 2248 2249 monitor_ops->mon_invalid_peer_update_pdev_stats(pdev); 2250 } 2251 2252 /** 2253 * dp_monitor_peer_get_stats_param() - Get stats param value from monitor peer 2254 * @soc: Datapath soc handle 2255 * @peer: Datapath peer handle 2256 * @type: Stats type requested 2257 * @buf: Pointer to buffer for stats param 2258 * 2259 * Return: QDF_STATUS 2260 */ 2261 static inline QDF_STATUS 2262 dp_monitor_peer_get_stats_param(struct dp_soc *soc, struct dp_peer *peer, 2263 enum cdp_peer_stats_type type, 2264 cdp_peer_stats_param_t *buf) 2265 { 2266 struct dp_mon_ops *monitor_ops; 2267 struct dp_mon_soc *mon_soc = soc->monitor_soc; 2268 2269 if (!mon_soc) 2270 return QDF_STATUS_E_FAILURE; 2271 2272 monitor_ops = mon_soc->mon_ops; 2273 if (!monitor_ops || !monitor_ops->mon_peer_get_stats_param) { 2274 dp_mon_debug("callback not registered"); 2275 return QDF_STATUS_E_FAILURE; 2276 } 2277 2278 return monitor_ops->mon_peer_get_stats_param(peer, type, buf); 2279 } 2280 2281 /** 2282 * dp_monitor_pdev_init() - Monitor pdev init 2283 * @pdev: point to pdev 2284 * 2285 * Return: return QDF_STATUS 2286 */ 2287 static inline QDF_STATUS dp_monitor_pdev_init(struct dp_pdev *pdev) 2288 { 2289 struct dp_mon_ops *monitor_ops; 2290 struct dp_mon_soc *mon_soc = pdev->soc->monitor_soc; 2291 2292 /* 2293 * mon_soc uninitialized when modular support enabled 2294 * monitor related attach/detach/init/deinit 2295 * will be done while monitor insmod 2296 */ 2297 if (!mon_soc) 2298 return QDF_STATUS_SUCCESS; 2299 2300 monitor_ops = mon_soc->mon_ops; 2301 if (!monitor_ops || !monitor_ops->mon_pdev_init) { 2302 dp_mon_debug("callback not registered"); 2303 return QDF_STATUS_E_FAILURE; 2304 } 2305 2306 return monitor_ops->mon_pdev_init(pdev); 2307 } 2308 2309 /** 2310 * dp_monitor_pdev_deinit() - Monitor pdev deinit 2311 * @pdev: point to pdev 2312 * 2313 * Return: return QDF_STATUS 2314 */ 2315 static inline QDF_STATUS dp_monitor_pdev_deinit(struct dp_pdev *pdev) 2316 { 2317 struct dp_mon_ops *monitor_ops; 2318 struct dp_mon_soc *mon_soc = pdev->soc->monitor_soc; 2319 2320 /* 2321 * mon_soc uninitialized modular when support enabled 2322 * monitor related attach/detach/init/deinit 2323 * will be done while monitor insmod 2324 */ 2325 if (!mon_soc) 2326 return QDF_STATUS_SUCCESS; 2327 2328 monitor_ops = mon_soc->mon_ops; 2329 if (!monitor_ops || !monitor_ops->mon_pdev_deinit) { 2330 dp_mon_debug("callback not registered"); 2331 return QDF_STATUS_E_FAILURE; 2332 } 2333 2334 return monitor_ops->mon_pdev_deinit(pdev); 2335 } 2336 2337 /** 2338 * dp_monitor_soc_cfg_init() - Monitor sco cfg init 2339 * @soc: point to soc 2340 * 2341 * Return: return QDF_STATUS 2342 */ 2343 static inline QDF_STATUS dp_monitor_soc_cfg_init(struct dp_soc *soc) 2344 { 2345 struct dp_mon_ops *monitor_ops; 2346 struct dp_mon_soc *mon_soc = soc->monitor_soc; 2347 2348 /* 2349 * this API is getting call from dp_soc_init, 2350 * mon_soc will be uninitialized when monitor support enabled 2351 * So returning QDF_STATUS_SUCCESS. 2352 * soc cfg init will be done while monitor insmod. 2353 */ 2354 if (!mon_soc) 2355 return QDF_STATUS_SUCCESS; 2356 2357 monitor_ops = mon_soc->mon_ops; 2358 if (!monitor_ops || !monitor_ops->mon_soc_cfg_init) { 2359 dp_mon_debug("callback not registered"); 2360 return QDF_STATUS_E_FAILURE; 2361 } 2362 2363 return monitor_ops->mon_soc_cfg_init(soc); 2364 } 2365 2366 /** 2367 * dp_monitor_config_debug_sniffer() - Monitor config debug sniffer 2368 * @pdev: point to pdev 2369 * @val: val 2370 * 2371 * Return: return QDF_STATUS 2372 */ 2373 static inline QDF_STATUS dp_monitor_config_debug_sniffer(struct dp_pdev *pdev, 2374 int val) 2375 { 2376 struct dp_mon_ops *monitor_ops; 2377 struct dp_mon_soc *mon_soc = pdev->soc->monitor_soc; 2378 2379 if (!mon_soc) 2380 return QDF_STATUS_E_FAILURE; 2381 2382 monitor_ops = mon_soc->mon_ops; 2383 if (!monitor_ops || !monitor_ops->mon_config_debug_sniffer) { 2384 dp_mon_debug("callback not registered"); 2385 return QDF_STATUS_E_FAILURE; 2386 } 2387 2388 return monitor_ops->mon_config_debug_sniffer(pdev, val); 2389 } 2390 2391 /** 2392 * dp_monitor_flush_rings() - Flush monitor rings 2393 * @soc: point to soc 2394 * 2395 * Return: None 2396 */ 2397 static inline void dp_monitor_flush_rings(struct dp_soc *soc) 2398 { 2399 struct dp_mon_ops *monitor_ops; 2400 struct dp_mon_soc *mon_soc = soc->monitor_soc; 2401 2402 if (!mon_soc) { 2403 dp_mon_debug("monitor soc is NULL"); 2404 return; 2405 } 2406 2407 monitor_ops = mon_soc->mon_ops; 2408 if (!monitor_ops || !monitor_ops->mon_flush_rings) { 2409 dp_mon_debug("callback not registered"); 2410 return; 2411 } 2412 2413 return monitor_ops->mon_flush_rings(soc); 2414 } 2415 2416 /** 2417 * dp_monitor_config_undecoded_metadata_capture() - Monitor config 2418 * undecoded metadata capture 2419 * @pdev: point to pdev 2420 * @val: val 2421 * 2422 * Return: return QDF_STATUS 2423 */ 2424 #ifdef QCA_UNDECODED_METADATA_SUPPORT 2425 static inline 2426 QDF_STATUS dp_monitor_config_undecoded_metadata_capture(struct dp_pdev *pdev, 2427 int val) 2428 { 2429 struct dp_mon_ops *monitor_ops; 2430 struct dp_mon_soc *mon_soc = pdev->soc->monitor_soc; 2431 2432 if (!mon_soc) 2433 return QDF_STATUS_E_FAILURE; 2434 2435 monitor_ops = mon_soc->mon_ops; 2436 if (!monitor_ops || 2437 !monitor_ops->mon_config_undecoded_metadata_capture) { 2438 dp_mon_debug("callback not registered"); 2439 return QDF_STATUS_E_FAILURE; 2440 } 2441 2442 return monitor_ops->mon_config_undecoded_metadata_capture(pdev, val); 2443 } 2444 2445 static inline QDF_STATUS 2446 dp_monitor_config_undecoded_metadata_phyrx_error_mask(struct dp_pdev *pdev, 2447 int mask, int mask_cont) 2448 { 2449 struct dp_mon_ops *monitor_ops; 2450 struct dp_mon_pdev *mon_pdev = pdev->monitor_pdev; 2451 struct dp_mon_soc *mon_soc = pdev->soc->monitor_soc; 2452 2453 if (!mon_soc) 2454 return QDF_STATUS_E_FAILURE; 2455 2456 if (!mon_pdev) 2457 return QDF_STATUS_E_FAILURE; 2458 2459 monitor_ops = mon_soc->mon_ops; 2460 if (!monitor_ops || 2461 !monitor_ops->mon_config_undecoded_metadata_capture) { 2462 dp_mon_debug("callback not registered"); 2463 return QDF_STATUS_E_FAILURE; 2464 } 2465 2466 if (!mon_pdev->undecoded_metadata_capture) { 2467 qdf_info("mask:0x%x mask_cont:0x%x", mask, mask_cont); 2468 return QDF_STATUS_SUCCESS; 2469 } 2470 2471 mon_pdev->phyrx_error_mask = mask; 2472 mon_pdev->phyrx_error_mask_cont = mask_cont; 2473 2474 return monitor_ops->mon_config_undecoded_metadata_capture(pdev, 1); 2475 } 2476 2477 static inline QDF_STATUS 2478 dp_monitor_get_undecoded_metadata_phyrx_error_mask(struct dp_pdev *pdev, 2479 int *mask, int *mask_cont) 2480 { 2481 struct dp_mon_pdev *mon_pdev = pdev->monitor_pdev; 2482 2483 if (!mon_pdev) 2484 return QDF_STATUS_E_FAILURE; 2485 2486 *mask = mon_pdev->phyrx_error_mask; 2487 *mask_cont = mon_pdev->phyrx_error_mask_cont; 2488 2489 return QDF_STATUS_SUCCESS; 2490 } 2491 #else 2492 static inline 2493 QDF_STATUS dp_monitor_config_undecoded_metadata_capture(struct dp_pdev *pdev, 2494 int val) 2495 { 2496 return QDF_STATUS_SUCCESS; 2497 } 2498 2499 static inline QDF_STATUS 2500 dp_monitor_config_undecoded_metadata_phyrx_error_mask(struct dp_pdev *pdev, 2501 int mask1, int mask2) 2502 { 2503 return QDF_STATUS_SUCCESS; 2504 } 2505 2506 static inline QDF_STATUS 2507 dp_monitor_get_undecoded_metadata_phyrx_error_mask(struct dp_pdev *pdev, 2508 int *mask, int *mask_cont) 2509 { 2510 return QDF_STATUS_SUCCESS; 2511 } 2512 #endif /* QCA_UNDECODED_METADATA_SUPPORT */ 2513 2514 /** 2515 * dp_monitor_htt_srng_setup() - Setup htt srng 2516 * @soc: point to soc 2517 * @pdev: point to pdev 2518 * @mac_id: lmac id 2519 * @mac_for_pdev: pdev id 2520 * 2521 * Return: QDF_STATUS 2522 */ 2523 #if !defined(DISABLE_MON_CONFIG) 2524 static inline QDF_STATUS dp_monitor_htt_srng_setup(struct dp_soc *soc, 2525 struct dp_pdev *pdev, 2526 int mac_id, 2527 int mac_for_pdev) 2528 { 2529 struct dp_mon_ops *monitor_ops; 2530 struct dp_mon_soc *mon_soc = soc->monitor_soc; 2531 QDF_STATUS status = QDF_STATUS_SUCCESS; 2532 2533 if (!mon_soc) { 2534 dp_mon_debug("monitor soc is NULL"); 2535 return QDF_STATUS_SUCCESS; 2536 } 2537 2538 monitor_ops = mon_soc->mon_ops; 2539 if (!monitor_ops) { 2540 dp_mon_err("monitor_ops is NULL"); 2541 return QDF_STATUS_E_FAILURE; 2542 } 2543 2544 if (monitor_ops->mon_pdev_htt_srng_setup[0]) { 2545 status = monitor_ops->mon_pdev_htt_srng_setup[0](soc, pdev, 2546 mac_id, mac_for_pdev); 2547 if (QDF_IS_STATUS_ERROR(status)) { 2548 dp_mon_err("error: %d", status); 2549 goto error; 2550 } 2551 } 2552 2553 if (monitor_ops->mon_pdev_htt_srng_setup[1]) { 2554 status = monitor_ops->mon_pdev_htt_srng_setup[1](soc, pdev, 2555 mac_id, mac_for_pdev); 2556 if (QDF_IS_STATUS_ERROR(status)) { 2557 dp_mon_err("error: %d", status); 2558 goto error; 2559 } 2560 } 2561 2562 error: 2563 return status; 2564 } 2565 2566 static inline QDF_STATUS dp_monitor_soc_htt_srng_setup(struct dp_soc *soc) 2567 { 2568 struct dp_mon_ops *monitor_ops; 2569 struct dp_mon_soc *mon_soc = soc->monitor_soc; 2570 2571 if (!mon_soc) { 2572 dp_mon_debug("monitor soc is NULL"); 2573 return QDF_STATUS_SUCCESS; 2574 } 2575 2576 monitor_ops = mon_soc->mon_ops; 2577 if (!monitor_ops || !monitor_ops->mon_soc_htt_srng_setup) { 2578 dp_mon_debug("callback not registered"); 2579 return QDF_STATUS_E_FAILURE; 2580 } 2581 2582 return monitor_ops->mon_soc_htt_srng_setup(soc); 2583 } 2584 #else 2585 static inline QDF_STATUS dp_monitor_htt_srng_setup(struct dp_soc *soc, 2586 struct dp_pdev *pdev, 2587 int mac_id, 2588 int mac_for_pdev) 2589 { 2590 return QDF_STATUS_SUCCESS; 2591 } 2592 #endif 2593 2594 /** 2595 * dp_monitor_service_mon_rings() - service monitor rings 2596 * @soc: point to soc 2597 * @quota: reap budget 2598 * 2599 * Return: None 2600 */ 2601 #if defined(DP_CON_MON) 2602 static inline 2603 void dp_monitor_service_mon_rings(struct dp_soc *soc, uint32_t quota) 2604 { 2605 struct dp_mon_ops *monitor_ops; 2606 struct dp_mon_soc *mon_soc = soc->monitor_soc; 2607 2608 if (!mon_soc) { 2609 dp_mon_debug("monitor soc is NULL"); 2610 return; 2611 } 2612 2613 monitor_ops = mon_soc->mon_ops; 2614 if (!monitor_ops || !monitor_ops->mon_service_rings) { 2615 dp_mon_debug("callback not registered"); 2616 return; 2617 } 2618 2619 return monitor_ops->mon_service_rings(soc, quota); 2620 } 2621 #endif 2622 2623 /** 2624 * dp_monitor_process() - Process monitor 2625 * @soc: point to soc 2626 * @int_ctx: interrupt ctx 2627 * @mac_id: lma 2628 * @quota: 2629 * 2630 * Return: None 2631 */ 2632 #ifndef DISABLE_MON_CONFIG 2633 static inline 2634 uint32_t dp_monitor_process(struct dp_soc *soc, struct dp_intr *int_ctx, 2635 uint32_t mac_id, uint32_t quota) 2636 { 2637 struct dp_mon_soc *mon_soc = soc->monitor_soc; 2638 2639 if (!mon_soc) { 2640 dp_mon_debug("monitor soc is NULL"); 2641 return 0; 2642 } 2643 2644 if (!mon_soc->mon_rx_process) { 2645 dp_mon_debug("callback not registered"); 2646 return 0; 2647 } 2648 2649 return mon_soc->mon_rx_process(soc, int_ctx, mac_id, quota); 2650 } 2651 2652 static inline 2653 uint32_t dp_tx_mon_process(struct dp_soc *soc, struct dp_intr *int_ctx, 2654 uint32_t mac_id, uint32_t quota) 2655 { 2656 struct dp_mon_soc *mon_soc = soc->monitor_soc; 2657 struct dp_mon_ops *monitor_ops; 2658 2659 if (!mon_soc) { 2660 dp_mon_debug("monitor soc is NULL"); 2661 return 0; 2662 } 2663 2664 monitor_ops = mon_soc->mon_ops; 2665 if (!monitor_ops || !monitor_ops->mon_tx_process) { 2666 dp_mon_debug("callback not registered"); 2667 return 0; 2668 } 2669 2670 return monitor_ops->mon_tx_process(soc, int_ctx, mac_id, quota); 2671 } 2672 2673 static inline 2674 uint32_t dp_tx_mon_buf_refill(struct dp_intr *int_ctx) 2675 { 2676 struct dp_soc *soc = int_ctx->soc; 2677 struct dp_mon_ops *monitor_ops; 2678 struct dp_mon_soc *mon_soc = soc->monitor_soc; 2679 2680 if (!mon_soc) { 2681 dp_mon_debug("monitor soc is NULL"); 2682 return 0; 2683 } 2684 2685 monitor_ops = mon_soc->mon_ops; 2686 if (!monitor_ops || !monitor_ops->tx_mon_refill_buf_ring) { 2687 dp_mon_debug("callback not registered"); 2688 return 0; 2689 } 2690 2691 return monitor_ops->tx_mon_refill_buf_ring(int_ctx); 2692 } 2693 2694 static inline 2695 uint32_t dp_rx_mon_buf_refill(struct dp_intr *int_ctx) 2696 { 2697 struct dp_soc *soc = int_ctx->soc; 2698 struct dp_mon_ops *monitor_ops; 2699 struct dp_mon_soc *mon_soc = soc->monitor_soc; 2700 2701 if (!mon_soc) { 2702 dp_mon_debug("monitor soc is NULL"); 2703 return 0; 2704 } 2705 2706 monitor_ops = mon_soc->mon_ops; 2707 if (!monitor_ops || !monitor_ops->rx_mon_refill_buf_ring) { 2708 dp_mon_debug("callback not registered"); 2709 return 0; 2710 } 2711 2712 return monitor_ops->rx_mon_refill_buf_ring(int_ctx); 2713 } 2714 2715 static inline 2716 void dp_print_txmon_ring_stat_from_hal(struct dp_pdev *pdev) 2717 { 2718 struct dp_soc *soc = pdev->soc; 2719 struct dp_mon_soc *mon_soc = soc->monitor_soc; 2720 struct dp_mon_ops *monitor_ops; 2721 2722 if (!mon_soc) { 2723 dp_mon_debug("monitor soc is NULL"); 2724 return; 2725 } 2726 2727 monitor_ops = mon_soc->mon_ops; 2728 if (!monitor_ops || !monitor_ops->print_txmon_ring_stat) { 2729 dp_mon_debug("callback not registered"); 2730 return; 2731 } 2732 2733 monitor_ops->print_txmon_ring_stat(pdev); 2734 } 2735 2736 #else 2737 static inline 2738 uint32_t dp_monitor_process(struct dp_soc *soc, struct dp_intr *int_ctx, 2739 uint32_t mac_id, uint32_t quota) 2740 { 2741 return 0; 2742 } 2743 2744 static inline uint32_t 2745 dp_tx_mon_process(struct dp_soc *soc, struct dp_intr *int_ctx, 2746 uint32_t mac_id, uint32_t quota) 2747 { 2748 return 0; 2749 } 2750 2751 static inline 2752 uint32_t dp_tx_mon_buf_refill(struct dp_intr *int_ctx) 2753 { 2754 return 0; 2755 } 2756 2757 static inline 2758 uint32_t dp_rx_mon_buf_refill(struct dp_intr *int_ctx) 2759 { 2760 return 0; 2761 } 2762 2763 static inline 2764 void dp_print_txmon_ring_stat_from_hal(struct dp_pdev *pdev) 2765 { 2766 } 2767 #endif 2768 2769 /** 2770 * dp_monitor_drop_packets_for_mac() - monitor_drop_packets_for_mac 2771 * @pdev: point to pdev 2772 * @mac_id: 2773 * @quota: 2774 * 2775 * Return: 2776 */ 2777 #if !defined(DISABLE_MON_CONFIG) && defined(MON_ENABLE_DROP_FOR_MAC) 2778 static inline 2779 uint32_t dp_monitor_drop_packets_for_mac(struct dp_pdev *pdev, 2780 uint32_t mac_id, uint32_t quota) 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 dp_mon_debug("monitor soc is NULL"); 2787 return 0; 2788 } 2789 2790 monitor_ops = mon_soc->mon_ops; 2791 if (!monitor_ops || !monitor_ops->mon_drop_packets_for_mac) { 2792 dp_mon_debug("callback not registered"); 2793 return 0; 2794 } 2795 2796 return monitor_ops->mon_drop_packets_for_mac(pdev, 2797 mac_id, quota, false); 2798 } 2799 #else 2800 static inline 2801 uint32_t dp_monitor_drop_packets_for_mac(struct dp_pdev *pdev, 2802 uint32_t mac_id, uint32_t quota) 2803 { 2804 return 0; 2805 } 2806 #endif 2807 2808 /** 2809 * dp_monitor_peer_tx_init() - peer tx init 2810 * @pdev: point to pdev 2811 * @peer: point to peer 2812 * 2813 * Return: None 2814 */ 2815 static inline void dp_monitor_peer_tx_init(struct dp_pdev *pdev, 2816 struct dp_peer *peer) 2817 { 2818 struct dp_mon_ops *monitor_ops; 2819 struct dp_mon_soc *mon_soc = pdev->soc->monitor_soc; 2820 2821 if (!mon_soc) { 2822 dp_mon_debug("monitor soc is NULL"); 2823 return; 2824 } 2825 2826 monitor_ops = mon_soc->mon_ops; 2827 if (!monitor_ops || !monitor_ops->mon_peer_tx_init) { 2828 dp_mon_debug("callback not registered"); 2829 return; 2830 } 2831 2832 return monitor_ops->mon_peer_tx_init(pdev, peer); 2833 } 2834 2835 /** 2836 * dp_monitor_peer_tx_cleanup() - peer tx cleanup 2837 * @vdev: point to vdev 2838 * @peer: point to peer 2839 * 2840 * Return: None 2841 */ 2842 static inline void dp_monitor_peer_tx_cleanup(struct dp_vdev *vdev, 2843 struct dp_peer *peer) 2844 { 2845 struct dp_mon_ops *monitor_ops; 2846 struct dp_mon_soc *mon_soc = vdev->pdev->soc->monitor_soc; 2847 2848 if (!mon_soc) { 2849 dp_mon_debug("monitor soc is NULL"); 2850 return; 2851 } 2852 2853 monitor_ops = mon_soc->mon_ops; 2854 if (!monitor_ops || !monitor_ops->mon_peer_tx_cleanup) { 2855 dp_mon_debug("callback not registered"); 2856 return; 2857 } 2858 2859 return monitor_ops->mon_peer_tx_cleanup(vdev, peer); 2860 } 2861 2862 #ifdef WIFI_MONITOR_SUPPORT 2863 /** 2864 * dp_monitor_peer_tid_peer_id_update() - peer tid update 2865 * @soc: point to soc 2866 * @peer: point to peer 2867 * @peer_id: peer id 2868 * 2869 * Return: None 2870 */ 2871 static inline 2872 void dp_monitor_peer_tid_peer_id_update(struct dp_soc *soc, 2873 struct dp_peer *peer, 2874 uint16_t peer_id) 2875 { 2876 struct dp_mon_ops *monitor_ops; 2877 struct dp_mon_soc *mon_soc = soc->monitor_soc; 2878 2879 if (!mon_soc) { 2880 dp_mon_debug("monitor soc is NULL"); 2881 return; 2882 } 2883 2884 monitor_ops = mon_soc->mon_ops; 2885 if (!monitor_ops || !monitor_ops->mon_peer_tid_peer_id_update) { 2886 dp_mon_debug("callback not registered"); 2887 return; 2888 } 2889 2890 return monitor_ops->mon_peer_tid_peer_id_update(peer, peer_id); 2891 } 2892 2893 /** 2894 * dp_monitor_tx_ppdu_stats_attach() - Attach tx ppdu stats 2895 * @pdev: point to pdev 2896 * 2897 * Return: None 2898 */ 2899 static inline void dp_monitor_tx_ppdu_stats_attach(struct dp_pdev *pdev) 2900 { 2901 struct dp_mon_ops *monitor_ops; 2902 struct dp_mon_soc *mon_soc = pdev->soc->monitor_soc; 2903 2904 if (!mon_soc) { 2905 dp_mon_debug("monitor soc is NULL"); 2906 return; 2907 } 2908 2909 monitor_ops = mon_soc->mon_ops; 2910 if (!monitor_ops || !monitor_ops->mon_tx_ppdu_stats_attach) { 2911 dp_mon_debug("callback not registered"); 2912 return; 2913 } 2914 2915 return monitor_ops->mon_tx_ppdu_stats_attach(pdev); 2916 } 2917 2918 /** 2919 * dp_monitor_tx_ppdu_stats_detach() - Detach tx ppdu stats 2920 * @pdev: point to pdev 2921 * 2922 * Return: None 2923 */ 2924 static inline void dp_monitor_tx_ppdu_stats_detach(struct dp_pdev *pdev) 2925 { 2926 struct dp_mon_ops *monitor_ops; 2927 struct dp_mon_soc *mon_soc = pdev->soc->monitor_soc; 2928 2929 if (!mon_soc) { 2930 dp_mon_debug("monitor soc is NULL"); 2931 return; 2932 } 2933 2934 monitor_ops = mon_soc->mon_ops; 2935 if (!monitor_ops || !monitor_ops->mon_tx_ppdu_stats_detach) { 2936 dp_mon_debug("callback not registered"); 2937 return; 2938 } 2939 2940 return monitor_ops->mon_tx_ppdu_stats_detach(pdev); 2941 } 2942 2943 /** 2944 * dp_monitor_tx_capture_debugfs_init() - Init tx capture debugfs 2945 * @pdev: point to pdev 2946 * 2947 * Return: QDF_STATUS_SUCCESS 2948 */ 2949 static inline 2950 QDF_STATUS dp_monitor_tx_capture_debugfs_init(struct dp_pdev *pdev) 2951 { 2952 struct dp_mon_ops *monitor_ops; 2953 struct dp_mon_soc *mon_soc = pdev->soc->monitor_soc; 2954 2955 if (!mon_soc) { 2956 dp_mon_debug("monitor soc is NULL"); 2957 return QDF_STATUS_E_FAILURE; 2958 } 2959 2960 monitor_ops = mon_soc->mon_ops; 2961 if (!monitor_ops || !monitor_ops->mon_tx_capture_debugfs_init) { 2962 dp_mon_debug("callback not registered"); 2963 return QDF_STATUS_E_FAILURE; 2964 } 2965 2966 return monitor_ops->mon_tx_capture_debugfs_init(pdev); 2967 } 2968 2969 /** 2970 * dp_monitor_peer_tx_capture_filter_check() - Check tx capture filter 2971 * @pdev: point to pdev 2972 * @peer: point to peer 2973 * 2974 * Return: None 2975 */ 2976 static inline void dp_monitor_peer_tx_capture_filter_check(struct dp_pdev *pdev, 2977 struct dp_peer *peer) 2978 { 2979 struct dp_mon_ops *monitor_ops; 2980 struct dp_mon_soc *mon_soc = pdev->soc->monitor_soc; 2981 2982 if (!mon_soc) { 2983 dp_mon_debug("monitor soc is NULL"); 2984 return; 2985 } 2986 2987 monitor_ops = mon_soc->mon_ops; 2988 if (!monitor_ops || !monitor_ops->mon_peer_tx_capture_filter_check) { 2989 dp_mon_debug("callback not registered"); 2990 return; 2991 } 2992 2993 return monitor_ops->mon_peer_tx_capture_filter_check(pdev, peer); 2994 } 2995 2996 /** 2997 * dp_monitor_tx_add_to_comp_queue() - add completion msdu to queue 2998 * 2999 * This API returns QDF_STATUS_SUCCESS in case where buffer is added 3000 * to txmonitor queue successfully caller will not free the buffer in 3001 * this case. In other cases this API return QDF_STATUS_E_FAILURE and 3002 * caller frees the buffer 3003 * 3004 * @soc: point to soc 3005 * @desc: point to tx desc 3006 * @ts: Tx completion status from HAL/HTT descriptor 3007 * @peer_id: DP peer id 3008 * 3009 * Return: QDF_STATUS 3010 * 3011 */ 3012 static inline 3013 QDF_STATUS dp_monitor_tx_add_to_comp_queue(struct dp_soc *soc, 3014 struct dp_tx_desc_s *desc, 3015 struct hal_tx_completion_status *ts, 3016 uint16_t peer_id) 3017 { 3018 struct dp_mon_ops *monitor_ops; 3019 struct dp_mon_soc *mon_soc = soc->monitor_soc; 3020 3021 if (!mon_soc) { 3022 dp_mon_debug("monitor soc is NULL"); 3023 return QDF_STATUS_E_FAILURE; 3024 } 3025 3026 monitor_ops = mon_soc->mon_ops; 3027 if (!monitor_ops || !monitor_ops->mon_tx_add_to_comp_queue) { 3028 dp_mon_debug("callback not registered"); 3029 return QDF_STATUS_E_FAILURE; 3030 } 3031 3032 return monitor_ops->mon_tx_add_to_comp_queue(soc, desc, ts, peer_id); 3033 } 3034 3035 static inline 3036 QDF_STATUS monitor_update_msdu_to_list(struct dp_soc *soc, 3037 struct dp_pdev *pdev, 3038 struct dp_peer *peer, 3039 struct hal_tx_completion_status *ts, 3040 qdf_nbuf_t netbuf) 3041 { 3042 struct dp_mon_ops *monitor_ops; 3043 struct dp_mon_soc *mon_soc = soc->monitor_soc; 3044 3045 if (!mon_soc) { 3046 dp_mon_debug("monitor soc is NULL"); 3047 return QDF_STATUS_SUCCESS; 3048 } 3049 3050 monitor_ops = mon_soc->mon_ops; 3051 if (!monitor_ops || !monitor_ops->mon_update_msdu_to_list) { 3052 dp_mon_debug("callback not registered"); 3053 return QDF_STATUS_E_FAILURE; 3054 } 3055 3056 return monitor_ops->mon_update_msdu_to_list(soc, pdev, 3057 peer, ts, netbuf); 3058 } 3059 3060 /** 3061 * dp_monitor_peer_tx_capture_get_stats - to get Peer Tx Capture stats 3062 * @soc: DP SOC handle 3063 * @peer: DP PEER handle 3064 * @stats: Pointer Peer tx capture stats 3065 * 3066 * Return: QDF_STATUS_E_FAILURE or QDF_STATUS_SUCCESS 3067 */ 3068 static inline QDF_STATUS 3069 dp_monitor_peer_tx_capture_get_stats(struct dp_soc *soc, struct dp_peer *peer, 3070 struct cdp_peer_tx_capture_stats *stats) 3071 { 3072 struct dp_mon_ops *monitor_ops; 3073 struct dp_mon_soc *mon_soc = soc->monitor_soc; 3074 3075 if (!mon_soc) { 3076 dp_mon_debug("monitor soc is NULL"); 3077 return QDF_STATUS_E_FAILURE; 3078 } 3079 3080 monitor_ops = mon_soc->mon_ops; 3081 if (!monitor_ops || !monitor_ops->mon_peer_tx_capture_get_stats) { 3082 dp_mon_debug("callback not registered"); 3083 return QDF_STATUS_E_FAILURE; 3084 } 3085 3086 return monitor_ops->mon_peer_tx_capture_get_stats(peer, stats); 3087 } 3088 3089 /** 3090 * dp_monitor_pdev_tx_capture_get_stats - to get pdev tx capture stats 3091 * @soc: DP SOC handle 3092 * @pdev: DP PDEV handle 3093 * @stats: Pointer to pdev tx capture stats 3094 * 3095 * Return: QDF_STATUS_E_FAILURE or QDF_STATUS_SUCCESS 3096 */ 3097 static inline QDF_STATUS 3098 dp_monitor_pdev_tx_capture_get_stats(struct dp_soc *soc, struct dp_pdev *pdev, 3099 struct cdp_pdev_tx_capture_stats *stats) 3100 { 3101 struct dp_mon_ops *monitor_ops; 3102 struct dp_mon_soc *mon_soc = soc->monitor_soc; 3103 3104 if (!mon_soc) { 3105 dp_mon_debug("monitor soc is NULL"); 3106 return QDF_STATUS_E_FAILURE; 3107 } 3108 3109 monitor_ops = mon_soc->mon_ops; 3110 if (!monitor_ops || !monitor_ops->mon_pdev_tx_capture_get_stats) { 3111 dp_mon_debug("callback not registered"); 3112 return QDF_STATUS_E_FAILURE; 3113 } 3114 3115 return monitor_ops->mon_pdev_tx_capture_get_stats(pdev, stats); 3116 } 3117 #else 3118 static inline 3119 void dp_monitor_peer_tid_peer_id_update(struct dp_soc *soc, 3120 struct dp_peer *peer, 3121 uint16_t peer_id) 3122 { 3123 } 3124 3125 static inline void dp_monitor_tx_ppdu_stats_attach(struct dp_pdev *pdev) 3126 { 3127 } 3128 3129 static inline void dp_monitor_tx_ppdu_stats_detach(struct dp_pdev *pdev) 3130 { 3131 } 3132 3133 static inline 3134 QDF_STATUS dp_monitor_tx_capture_debugfs_init(struct dp_pdev *pdev) 3135 { 3136 return QDF_STATUS_E_FAILURE; 3137 } 3138 3139 static inline void dp_monitor_peer_tx_capture_filter_check(struct dp_pdev *pdev, 3140 struct dp_peer *peer) 3141 { 3142 } 3143 3144 static inline 3145 QDF_STATUS dp_monitor_tx_add_to_comp_queue(struct dp_soc *soc, 3146 struct dp_tx_desc_s *desc, 3147 struct hal_tx_completion_status *ts, 3148 uint16_t peer_id) 3149 { 3150 return QDF_STATUS_E_FAILURE; 3151 } 3152 3153 static inline 3154 QDF_STATUS monitor_update_msdu_to_list(struct dp_soc *soc, 3155 struct dp_pdev *pdev, 3156 struct dp_peer *peer, 3157 struct hal_tx_completion_status *ts, 3158 qdf_nbuf_t netbuf) 3159 { 3160 return QDF_STATUS_E_FAILURE; 3161 } 3162 3163 static inline QDF_STATUS 3164 dp_monitor_peer_tx_capture_get_stats(struct dp_soc *soc, struct dp_peer *peer, 3165 struct cdp_peer_tx_capture_stats *stats) 3166 { 3167 return QDF_STATUS_E_FAILURE; 3168 } 3169 3170 static inline QDF_STATUS 3171 dp_monitor_pdev_tx_capture_get_stats(struct dp_soc *soc, struct dp_pdev *pdev, 3172 struct cdp_pdev_tx_capture_stats *stats) 3173 { 3174 return QDF_STATUS_E_FAILURE; 3175 } 3176 #endif 3177 3178 /** 3179 * dp_monitor_ppdu_stats_ind_handler() - PPDU stats msg handler 3180 * @soc: HTT SOC handle 3181 * @msg_word: Pointer to payload 3182 * @htt_t2h_msg: HTT msg nbuf 3183 * 3184 * Return: True if buffer should be freed by caller. 3185 */ 3186 #if defined(WDI_EVENT_ENABLE) &&\ 3187 (defined(QCA_ENHANCED_STATS_SUPPORT) || !defined(REMOVE_PKT_LOG) ||\ 3188 defined(WLAN_FEATURE_PKT_CAPTURE_V2)) 3189 static inline bool dp_monitor_ppdu_stats_ind_handler(struct htt_soc *soc, 3190 uint32_t *msg_word, 3191 qdf_nbuf_t htt_t2h_msg) 3192 { 3193 struct dp_mon_ops *monitor_ops; 3194 struct dp_mon_soc *mon_soc = soc->dp_soc->monitor_soc; 3195 3196 if (!mon_soc) { 3197 dp_mon_debug("monitor soc is NULL"); 3198 return true; 3199 } 3200 3201 monitor_ops = mon_soc->mon_ops; 3202 if (!monitor_ops || !monitor_ops->mon_ppdu_stats_ind_handler) { 3203 dp_mon_debug("callback not registered"); 3204 return true; 3205 } 3206 3207 return monitor_ops->mon_ppdu_stats_ind_handler(soc, msg_word, 3208 htt_t2h_msg); 3209 } 3210 #else 3211 static inline bool dp_monitor_ppdu_stats_ind_handler(struct htt_soc *soc, 3212 uint32_t *msg_word, 3213 qdf_nbuf_t htt_t2h_msg) 3214 { 3215 return true; 3216 } 3217 #endif 3218 3219 /** 3220 * dp_monitor_htt_ppdu_stats_attach() - attach resources for HTT PPDU 3221 * stats processing 3222 * @pdev: Datapath PDEV handle 3223 * 3224 * Return: QDF_STATUS 3225 */ 3226 static inline QDF_STATUS dp_monitor_htt_ppdu_stats_attach(struct dp_pdev *pdev) 3227 { 3228 struct dp_mon_ops *monitor_ops; 3229 struct dp_mon_soc *mon_soc = pdev->soc->monitor_soc; 3230 3231 if (!mon_soc) { 3232 dp_mon_debug("monitor soc is NULL"); 3233 return QDF_STATUS_SUCCESS; 3234 } 3235 3236 monitor_ops = mon_soc->mon_ops; 3237 if (!monitor_ops || !monitor_ops->mon_htt_ppdu_stats_attach) { 3238 dp_mon_debug("callback not registered"); 3239 return QDF_STATUS_E_FAILURE; 3240 } 3241 3242 return monitor_ops->mon_htt_ppdu_stats_attach(pdev); 3243 } 3244 3245 /** 3246 * dp_monitor_htt_ppdu_stats_detach() - detach stats resources 3247 * @pdev: Datapath PDEV handle 3248 * 3249 * Return: void 3250 */ 3251 static inline void dp_monitor_htt_ppdu_stats_detach(struct dp_pdev *pdev) 3252 { 3253 struct dp_mon_ops *monitor_ops; 3254 struct dp_mon_soc *mon_soc = pdev->soc->monitor_soc; 3255 3256 if (!mon_soc) { 3257 dp_mon_debug("monitor soc is NULL"); 3258 return; 3259 } 3260 3261 monitor_ops = mon_soc->mon_ops; 3262 if (!monitor_ops || !monitor_ops->mon_htt_ppdu_stats_detach) { 3263 dp_mon_debug("callback not registered"); 3264 return; 3265 } 3266 3267 return monitor_ops->mon_htt_ppdu_stats_detach(pdev); 3268 } 3269 3270 /** 3271 * dp_monitor_print_pdev_rx_mon_stats() - print rx mon stats 3272 * @pdev: Datapath PDEV handle 3273 * 3274 * Return: void 3275 */ 3276 static inline void dp_monitor_print_pdev_rx_mon_stats(struct dp_pdev *pdev) 3277 { 3278 struct dp_mon_ops *monitor_ops; 3279 struct dp_mon_soc *mon_soc = pdev->soc->monitor_soc; 3280 3281 if (!mon_soc) { 3282 dp_mon_debug("monitor soc is NULL"); 3283 return; 3284 } 3285 3286 monitor_ops = mon_soc->mon_ops; 3287 if (!monitor_ops || !monitor_ops->mon_print_pdev_rx_mon_stats) { 3288 dp_mon_debug("callback not registered"); 3289 return; 3290 } 3291 3292 return monitor_ops->mon_print_pdev_rx_mon_stats(pdev); 3293 } 3294 3295 #ifdef WIFI_MONITOR_SUPPORT 3296 /** 3297 * dp_monitor_print_pdev_tx_capture_stats() - print tx capture stats 3298 * @pdev: Datapath PDEV handle 3299 * 3300 * Return: void 3301 */ 3302 static inline void dp_monitor_print_pdev_tx_capture_stats(struct dp_pdev *pdev) 3303 { 3304 struct dp_mon_ops *monitor_ops; 3305 struct dp_mon_soc *mon_soc = pdev->soc->monitor_soc; 3306 3307 if (!mon_soc) { 3308 dp_mon_debug("monitor soc is NULL"); 3309 return; 3310 } 3311 3312 monitor_ops = mon_soc->mon_ops; 3313 if (!monitor_ops || !monitor_ops->mon_print_pdev_tx_capture_stats) { 3314 dp_mon_debug("callback not registered"); 3315 return; 3316 } 3317 3318 return monitor_ops->mon_print_pdev_tx_capture_stats(pdev); 3319 } 3320 3321 /** 3322 * dp_monitor_config_enh_tx_capture() - configure tx capture 3323 * @pdev: Datapath PDEV handle 3324 * @val: mode 3325 * 3326 * Return: status 3327 */ 3328 static inline QDF_STATUS dp_monitor_config_enh_tx_capture(struct dp_pdev *pdev, 3329 uint32_t val) 3330 { 3331 struct dp_mon_ops *monitor_ops; 3332 struct dp_mon_soc *mon_soc = pdev->soc->monitor_soc; 3333 3334 if (!mon_soc) { 3335 dp_mon_debug("monitor soc is NULL"); 3336 return QDF_STATUS_E_FAILURE; 3337 } 3338 3339 monitor_ops = mon_soc->mon_ops; 3340 if (!monitor_ops || !monitor_ops->mon_config_enh_tx_capture) { 3341 dp_mon_debug("callback not registered"); 3342 return QDF_STATUS_E_FAILURE; 3343 } 3344 3345 return monitor_ops->mon_config_enh_tx_capture(pdev, val); 3346 } 3347 3348 /** 3349 * dp_monitor_tx_peer_filter() - add tx monitor peer filter 3350 * @pdev: Datapath PDEV handle 3351 * @peer: Datapath PEER handle 3352 * @is_tx_pkt_cap_enable: flag for tx capture enable/disable 3353 * @peer_mac: peer mac address 3354 * 3355 * Return: status 3356 */ 3357 static inline QDF_STATUS dp_monitor_tx_peer_filter(struct dp_pdev *pdev, 3358 struct dp_peer *peer, 3359 uint8_t is_tx_pkt_cap_enable, 3360 uint8_t *peer_mac) 3361 { 3362 struct dp_mon_ops *monitor_ops; 3363 struct dp_mon_soc *mon_soc = pdev->soc->monitor_soc; 3364 3365 if (!mon_soc) { 3366 qdf_err("monitor soc is NULL"); 3367 return QDF_STATUS_E_FAILURE; 3368 } 3369 3370 monitor_ops = mon_soc->mon_ops; 3371 if (!monitor_ops || !monitor_ops->mon_tx_peer_filter) { 3372 qdf_err("callback not registered"); 3373 return QDF_STATUS_E_FAILURE; 3374 } 3375 3376 return monitor_ops->mon_tx_peer_filter(pdev, peer, is_tx_pkt_cap_enable, 3377 peer_mac); 3378 } 3379 #endif 3380 3381 #ifdef WLAN_RX_PKT_CAPTURE_ENH 3382 static inline QDF_STATUS dp_monitor_config_enh_rx_capture(struct dp_pdev *pdev, 3383 uint32_t val) 3384 { 3385 struct dp_mon_ops *monitor_ops; 3386 struct dp_mon_soc *mon_soc = pdev->soc->monitor_soc; 3387 3388 if (!mon_soc) { 3389 dp_mon_debug("monitor soc is NULL"); 3390 return QDF_STATUS_E_FAILURE; 3391 } 3392 3393 monitor_ops = mon_soc->mon_ops; 3394 if (!monitor_ops || !monitor_ops->mon_config_enh_rx_capture) { 3395 dp_mon_debug("callback not registered"); 3396 return QDF_STATUS_E_FAILURE; 3397 } 3398 3399 return monitor_ops->mon_config_enh_rx_capture(pdev, val); 3400 } 3401 #else 3402 static inline QDF_STATUS dp_monitor_config_enh_rx_capture(struct dp_pdev *pdev, 3403 uint32_t val) 3404 { 3405 return QDF_STATUS_E_INVAL; 3406 } 3407 #endif 3408 3409 #ifdef QCA_SUPPORT_BPR 3410 static inline QDF_STATUS dp_monitor_set_bpr_enable(struct dp_pdev *pdev, 3411 uint32_t val) 3412 { 3413 struct dp_mon_ops *monitor_ops; 3414 struct dp_mon_soc *mon_soc = pdev->soc->monitor_soc; 3415 3416 if (!mon_soc) { 3417 dp_mon_debug("monitor soc is NULL"); 3418 return QDF_STATUS_E_FAILURE; 3419 } 3420 3421 monitor_ops = mon_soc->mon_ops; 3422 if (!monitor_ops || !monitor_ops->mon_set_bpr_enable) { 3423 dp_mon_debug("callback not registered"); 3424 return QDF_STATUS_E_FAILURE; 3425 } 3426 3427 return monitor_ops->mon_set_bpr_enable(pdev, val); 3428 } 3429 #else 3430 static inline QDF_STATUS dp_monitor_set_bpr_enable(struct dp_pdev *pdev, 3431 uint32_t val) 3432 { 3433 return QDF_STATUS_E_FAILURE; 3434 } 3435 #endif 3436 3437 #ifdef ATH_SUPPORT_NAC 3438 static inline 3439 int dp_monitor_set_filter_neigh_peers(struct dp_pdev *pdev, bool val) 3440 { 3441 struct dp_mon_ops *monitor_ops; 3442 struct dp_mon_soc *mon_soc = pdev->soc->monitor_soc; 3443 3444 if (!mon_soc) { 3445 dp_mon_debug("monitor soc is NULL"); 3446 return 0; 3447 } 3448 3449 monitor_ops = mon_soc->mon_ops; 3450 if (!monitor_ops || !monitor_ops->mon_set_filter_neigh_peers) { 3451 dp_mon_debug("callback not registered"); 3452 return 0; 3453 } 3454 3455 return monitor_ops->mon_set_filter_neigh_peers(pdev, val); 3456 } 3457 #else 3458 static inline 3459 int dp_monitor_set_filter_neigh_peers(struct dp_pdev *pdev, bool val) 3460 { 3461 return 0; 3462 } 3463 #endif 3464 3465 #ifdef WLAN_ATF_ENABLE 3466 static inline 3467 void dp_monitor_set_atf_stats_enable(struct dp_pdev *pdev, bool value) 3468 { 3469 struct dp_mon_ops *monitor_ops; 3470 struct dp_mon_soc *mon_soc = pdev->soc->monitor_soc; 3471 3472 if (!mon_soc) { 3473 dp_mon_debug("monitor soc is NULL"); 3474 return; 3475 } 3476 3477 monitor_ops = mon_soc->mon_ops; 3478 if (!monitor_ops || !monitor_ops->mon_set_atf_stats_enable) { 3479 dp_mon_debug("callback not registered"); 3480 return; 3481 } 3482 3483 return monitor_ops->mon_set_atf_stats_enable(pdev, value); 3484 } 3485 #else 3486 static inline 3487 void dp_monitor_set_atf_stats_enable(struct dp_pdev *pdev, bool value) 3488 { 3489 } 3490 #endif 3491 3492 static inline 3493 void dp_monitor_set_bsscolor(struct dp_pdev *pdev, uint8_t bsscolor) 3494 { 3495 struct dp_mon_ops *monitor_ops; 3496 struct dp_mon_soc *mon_soc = pdev->soc->monitor_soc; 3497 3498 if (!mon_soc) { 3499 dp_mon_debug("monitor soc is NULL"); 3500 return; 3501 } 3502 3503 monitor_ops = mon_soc->mon_ops; 3504 if (!monitor_ops || !monitor_ops->mon_set_bsscolor) { 3505 dp_mon_debug("callback not registered"); 3506 return; 3507 } 3508 3509 return monitor_ops->mon_set_bsscolor(pdev, bsscolor); 3510 } 3511 3512 static inline 3513 bool dp_monitor_pdev_get_filter_mcast_data(struct cdp_pdev *pdev_handle) 3514 { 3515 struct dp_mon_ops *monitor_ops; 3516 struct dp_pdev *pdev = (struct dp_pdev *)pdev_handle; 3517 struct dp_mon_soc *mon_soc = pdev->soc->monitor_soc; 3518 3519 if (!mon_soc) { 3520 dp_mon_debug("monitor soc is NULL"); 3521 return false; 3522 } 3523 3524 monitor_ops = mon_soc->mon_ops; 3525 if (!monitor_ops || !monitor_ops->mon_pdev_get_filter_mcast_data) { 3526 dp_mon_debug("callback not registered"); 3527 return false; 3528 } 3529 3530 return monitor_ops->mon_pdev_get_filter_mcast_data(pdev_handle); 3531 } 3532 3533 static inline 3534 bool dp_monitor_pdev_get_filter_non_data(struct cdp_pdev *pdev_handle) 3535 { 3536 struct dp_mon_ops *monitor_ops; 3537 struct dp_pdev *pdev = (struct dp_pdev *)pdev_handle; 3538 struct dp_mon_soc *mon_soc = pdev->soc->monitor_soc; 3539 3540 if (!mon_soc) { 3541 dp_mon_debug("monitor soc is NULL"); 3542 return false; 3543 } 3544 3545 monitor_ops = mon_soc->mon_ops; 3546 if (!monitor_ops || !monitor_ops->mon_pdev_get_filter_non_data) { 3547 dp_mon_debug("callback not registered"); 3548 return false; 3549 } 3550 3551 return monitor_ops->mon_pdev_get_filter_non_data(pdev_handle); 3552 } 3553 3554 static inline 3555 bool dp_monitor_pdev_get_filter_ucast_data(struct cdp_pdev *pdev_handle) 3556 { 3557 struct dp_mon_ops *monitor_ops; 3558 struct dp_pdev *pdev = (struct dp_pdev *)pdev_handle; 3559 struct dp_mon_soc *mon_soc = pdev->soc->monitor_soc; 3560 3561 if (!mon_soc) { 3562 dp_mon_debug("monitor soc is NULL"); 3563 return false; 3564 } 3565 3566 monitor_ops = mon_soc->mon_ops; 3567 if (!monitor_ops || !monitor_ops->mon_pdev_get_filter_ucast_data) { 3568 dp_mon_debug("callback not registered"); 3569 return false; 3570 } 3571 3572 return monitor_ops->mon_pdev_get_filter_ucast_data(pdev_handle); 3573 } 3574 3575 #ifdef WDI_EVENT_ENABLE 3576 static inline 3577 int dp_monitor_set_pktlog_wifi3(struct dp_pdev *pdev, uint32_t event, 3578 bool enable) 3579 { 3580 struct dp_mon_ops *monitor_ops; 3581 struct dp_mon_soc *mon_soc = pdev->soc->monitor_soc; 3582 3583 if (!mon_soc) { 3584 dp_mon_debug("monitor soc is NULL"); 3585 return 0; 3586 } 3587 3588 monitor_ops = mon_soc->mon_ops; 3589 if (!monitor_ops || !monitor_ops->mon_set_pktlog_wifi3) { 3590 dp_mon_debug("callback not registered"); 3591 return 0; 3592 } 3593 3594 return monitor_ops->mon_set_pktlog_wifi3(pdev, event, enable); 3595 } 3596 #else 3597 static inline 3598 int dp_monitor_set_pktlog_wifi3(struct dp_pdev *pdev, uint32_t event, 3599 bool enable) 3600 { 3601 return 0; 3602 } 3603 #endif 3604 3605 #if defined(DP_CON_MON) && !defined(REMOVE_PKT_LOG) 3606 static inline void dp_monitor_pktlogmod_exit(struct dp_pdev *pdev) 3607 { 3608 struct dp_mon_ops *monitor_ops; 3609 struct dp_mon_soc *mon_soc = pdev->soc->monitor_soc; 3610 3611 if (!mon_soc) { 3612 dp_mon_debug("monitor soc is NULL"); 3613 return; 3614 } 3615 3616 monitor_ops = mon_soc->mon_ops; 3617 if (!monitor_ops || !monitor_ops->mon_pktlogmod_exit) { 3618 dp_mon_debug("callback not registered"); 3619 return; 3620 } 3621 3622 return monitor_ops->mon_pktlogmod_exit(pdev); 3623 } 3624 #else 3625 static inline void dp_monitor_pktlogmod_exit(struct dp_pdev *pdev) {} 3626 #endif 3627 3628 static inline 3629 QDF_STATUS dp_monitor_vdev_set_monitor_mode_buf_rings(struct dp_pdev *pdev) 3630 { 3631 struct dp_mon_ops *monitor_ops; 3632 struct dp_mon_soc *mon_soc = pdev->soc->monitor_soc; 3633 3634 if (!mon_soc) { 3635 dp_mon_debug("monitor soc is NULL"); 3636 return QDF_STATUS_E_FAILURE; 3637 } 3638 3639 monitor_ops = mon_soc->mon_ops; 3640 if (!monitor_ops || !monitor_ops->mon_vdev_set_monitor_mode_buf_rings) { 3641 dp_mon_debug("callback not registered"); 3642 return QDF_STATUS_E_FAILURE; 3643 } 3644 3645 return monitor_ops->mon_vdev_set_monitor_mode_buf_rings(pdev); 3646 } 3647 3648 static inline 3649 void dp_monitor_neighbour_peers_detach(struct dp_pdev *pdev) 3650 { 3651 struct dp_mon_ops *monitor_ops; 3652 struct dp_mon_soc *mon_soc = pdev->soc->monitor_soc; 3653 3654 if (!mon_soc) { 3655 dp_mon_debug("monitor soc is NULL"); 3656 return; 3657 } 3658 3659 monitor_ops = mon_soc->mon_ops; 3660 if (!monitor_ops || !monitor_ops->mon_neighbour_peers_detach) { 3661 dp_mon_debug("callback not registered"); 3662 return; 3663 } 3664 3665 return monitor_ops->mon_neighbour_peers_detach(pdev); 3666 } 3667 3668 #ifdef FEATURE_NAC_RSSI 3669 static inline QDF_STATUS dp_monitor_filter_neighbour_peer(struct dp_pdev *pdev, 3670 uint8_t *rx_pkt_hdr) 3671 { 3672 struct dp_mon_ops *monitor_ops; 3673 struct dp_mon_soc *mon_soc = pdev->soc->monitor_soc; 3674 3675 if (!mon_soc) { 3676 dp_mon_debug("monitor soc is NULL"); 3677 return QDF_STATUS_E_FAILURE; 3678 } 3679 3680 monitor_ops = mon_soc->mon_ops; 3681 if (!monitor_ops || !monitor_ops->mon_filter_neighbour_peer) { 3682 dp_mon_debug("callback not registered"); 3683 return QDF_STATUS_E_FAILURE; 3684 } 3685 3686 return monitor_ops->mon_filter_neighbour_peer(pdev, rx_pkt_hdr); 3687 } 3688 #else 3689 static inline QDF_STATUS dp_monitor_filter_neighbour_peer(struct dp_pdev *pdev, 3690 uint8_t *rx_pkt_hdr) 3691 { 3692 return QDF_STATUS_E_FAILURE; 3693 } 3694 #endif 3695 3696 static inline 3697 void dp_monitor_reap_timer_init(struct dp_soc *soc) 3698 { 3699 struct dp_mon_ops *monitor_ops; 3700 struct dp_mon_soc *mon_soc = soc->monitor_soc; 3701 3702 if (!mon_soc) { 3703 dp_mon_debug("monitor soc is NULL"); 3704 return; 3705 } 3706 3707 monitor_ops = mon_soc->mon_ops; 3708 if (!monitor_ops || !monitor_ops->mon_reap_timer_init) { 3709 dp_mon_debug("callback not registered"); 3710 return; 3711 } 3712 3713 monitor_ops->mon_reap_timer_init(soc); 3714 } 3715 3716 static inline 3717 void dp_monitor_reap_timer_deinit(struct dp_soc *soc) 3718 { 3719 struct dp_mon_ops *monitor_ops; 3720 struct dp_mon_soc *mon_soc = soc->monitor_soc; 3721 3722 if (!mon_soc) { 3723 dp_mon_debug("monitor soc is NULL"); 3724 return; 3725 } 3726 3727 monitor_ops = mon_soc->mon_ops; 3728 if (!monitor_ops || !monitor_ops->mon_reap_timer_deinit) { 3729 dp_mon_debug("callback not registered"); 3730 return; 3731 } 3732 3733 monitor_ops->mon_reap_timer_deinit(soc); 3734 } 3735 3736 /** 3737 * dp_monitor_reap_timer_start() - start reap timer of monitor status ring 3738 * @soc: point to soc 3739 * @source: trigger source 3740 * 3741 * Return: true if timer-start is performed, false otherwise. 3742 */ 3743 static inline bool 3744 dp_monitor_reap_timer_start(struct dp_soc *soc, 3745 enum cdp_mon_reap_source source) 3746 { 3747 struct dp_mon_ops *monitor_ops; 3748 struct dp_mon_soc *mon_soc = soc->monitor_soc; 3749 3750 if (!mon_soc) { 3751 dp_mon_debug("monitor soc is NULL"); 3752 return false; 3753 } 3754 3755 monitor_ops = mon_soc->mon_ops; 3756 if (!monitor_ops || !monitor_ops->mon_reap_timer_start) { 3757 dp_mon_debug("callback not registered"); 3758 return false; 3759 } 3760 3761 return monitor_ops->mon_reap_timer_start(soc, source); 3762 } 3763 3764 /** 3765 * dp_monitor_reap_timer_stop() - stop reap timer of monitor status ring 3766 * @soc: point to soc 3767 * @source: trigger source 3768 * 3769 * Return: true if timer-stop is performed, false otherwise. 3770 */ 3771 static inline bool 3772 dp_monitor_reap_timer_stop(struct dp_soc *soc, 3773 enum cdp_mon_reap_source source) 3774 { 3775 struct dp_mon_ops *monitor_ops; 3776 struct dp_mon_soc *mon_soc = soc->monitor_soc; 3777 3778 if (!mon_soc) { 3779 dp_mon_debug("monitor soc is NULL"); 3780 return false; 3781 } 3782 3783 monitor_ops = mon_soc->mon_ops; 3784 if (!monitor_ops || !monitor_ops->mon_reap_timer_stop) { 3785 dp_mon_debug("callback not registered"); 3786 return false; 3787 } 3788 3789 return monitor_ops->mon_reap_timer_stop(soc, source); 3790 } 3791 3792 static inline 3793 void dp_monitor_vdev_timer_init(struct dp_soc *soc) 3794 { 3795 struct dp_mon_ops *monitor_ops; 3796 struct dp_mon_soc *mon_soc = soc->monitor_soc; 3797 3798 if (!mon_soc) { 3799 dp_mon_debug("monitor soc is NULL"); 3800 return; 3801 } 3802 3803 monitor_ops = mon_soc->mon_ops; 3804 if (!monitor_ops || !monitor_ops->mon_vdev_timer_init) { 3805 dp_mon_debug("callback not registered"); 3806 return; 3807 } 3808 3809 monitor_ops->mon_vdev_timer_init(soc); 3810 } 3811 3812 static inline 3813 void dp_monitor_vdev_timer_deinit(struct dp_soc *soc) 3814 { 3815 struct dp_mon_ops *monitor_ops; 3816 struct dp_mon_soc *mon_soc = soc->monitor_soc; 3817 3818 if (!mon_soc) { 3819 dp_mon_debug("monitor soc is NULL"); 3820 return; 3821 } 3822 3823 monitor_ops = mon_soc->mon_ops; 3824 if (!monitor_ops || !monitor_ops->mon_vdev_timer_deinit) { 3825 dp_mon_debug("callback not registered"); 3826 return; 3827 } 3828 3829 monitor_ops->mon_vdev_timer_deinit(soc); 3830 } 3831 3832 static inline 3833 void dp_monitor_vdev_timer_start(struct dp_soc *soc) 3834 { 3835 struct dp_mon_ops *monitor_ops; 3836 struct dp_mon_soc *mon_soc = soc->monitor_soc; 3837 3838 if (!mon_soc) { 3839 dp_mon_debug("monitor soc is NULL"); 3840 return; 3841 } 3842 3843 monitor_ops = mon_soc->mon_ops; 3844 if (!monitor_ops || !monitor_ops->mon_vdev_timer_start) { 3845 dp_mon_debug("callback not registered"); 3846 return; 3847 } 3848 3849 monitor_ops->mon_vdev_timer_start(soc); 3850 } 3851 3852 static inline 3853 bool dp_monitor_vdev_timer_stop(struct dp_soc *soc) 3854 { 3855 struct dp_mon_ops *monitor_ops; 3856 struct dp_mon_soc *mon_soc = soc->monitor_soc; 3857 3858 if (!mon_soc) { 3859 dp_mon_debug("monitor soc is NULL"); 3860 return false; 3861 } 3862 3863 monitor_ops = mon_soc->mon_ops; 3864 if (!monitor_ops || !monitor_ops->mon_vdev_timer_stop) { 3865 dp_mon_debug("callback not registered"); 3866 return false; 3867 } 3868 3869 return monitor_ops->mon_vdev_timer_stop(soc); 3870 } 3871 3872 #ifdef QCA_MCOPY_SUPPORT 3873 static inline 3874 QDF_STATUS dp_monitor_mcopy_check_deliver(struct dp_pdev *pdev, 3875 uint16_t peer_id, uint32_t ppdu_id, 3876 uint8_t first_msdu) 3877 { 3878 struct dp_mon_ops *monitor_ops; 3879 struct dp_mon_soc *mon_soc = pdev->soc->monitor_soc; 3880 3881 if (!mon_soc) { 3882 dp_mon_debug("monitor soc is NULL"); 3883 return QDF_STATUS_E_FAILURE; 3884 } 3885 3886 monitor_ops = mon_soc->mon_ops; 3887 if (!monitor_ops || !monitor_ops->mon_mcopy_check_deliver) { 3888 dp_mon_debug("callback not registered"); 3889 return QDF_STATUS_E_FAILURE; 3890 } 3891 3892 return monitor_ops->mon_mcopy_check_deliver(pdev, peer_id, 3893 ppdu_id, first_msdu); 3894 } 3895 #else 3896 static inline 3897 QDF_STATUS dp_monitor_mcopy_check_deliver(struct dp_pdev *pdev, 3898 uint16_t peer_id, uint32_t ppdu_id, 3899 uint8_t first_msdu) 3900 { 3901 return QDF_STATUS_SUCCESS; 3902 } 3903 #endif 3904 3905 /** 3906 * dp_monitor_neighbour_peer_add_ast() - Add ast entry 3907 * @pdev: point to dp pdev 3908 * @ta_peer: point to peer 3909 * @mac_addr: mac address 3910 * @nbuf: point to nbuf 3911 * @flags: flags 3912 * 3913 * Return: void 3914 */ 3915 static inline void 3916 dp_monitor_neighbour_peer_add_ast(struct dp_pdev *pdev, 3917 struct dp_peer *ta_peer, 3918 uint8_t *mac_addr, 3919 qdf_nbuf_t nbuf, 3920 uint32_t flags) 3921 { 3922 struct dp_mon_soc *mon_soc = pdev->soc->monitor_soc; 3923 struct dp_mon_ops *monitor_ops; 3924 3925 if (!mon_soc) { 3926 dp_mon_debug("monitor soc is NULL"); 3927 return; 3928 } 3929 3930 monitor_ops = mon_soc->mon_ops; 3931 if (!monitor_ops || !monitor_ops->mon_neighbour_peer_add_ast) { 3932 dp_mon_debug("callback not registered"); 3933 return; 3934 } 3935 3936 return monitor_ops->mon_neighbour_peer_add_ast(pdev, ta_peer, mac_addr, 3937 nbuf, flags); 3938 } 3939 3940 /** 3941 * dp_monitor_vdev_delete() - delete monitor vdev 3942 * @soc: point to dp soc 3943 * @vdev: point to dp vdev 3944 * 3945 * Return: void 3946 */ 3947 static inline void dp_monitor_vdev_delete(struct dp_soc *soc, 3948 struct dp_vdev *vdev) 3949 { 3950 if (soc->intr_mode == DP_INTR_POLL) { 3951 qdf_timer_sync_cancel(&soc->int_timer); 3952 dp_monitor_flush_rings(soc); 3953 } else if (soc->intr_mode == DP_INTR_MSI) { 3954 dp_monitor_vdev_timer_stop(soc); 3955 dp_monitor_flush_rings(soc); 3956 } 3957 3958 dp_monitor_vdev_detach(vdev); 3959 } 3960 3961 #ifdef DP_POWER_SAVE 3962 /** 3963 * dp_monitor_reap_timer_suspend() - Stop monitor reap timer 3964 * and reap any pending frames in ring 3965 * @soc: DP soc context 3966 * 3967 * Return: void 3968 */ 3969 static inline void 3970 dp_monitor_reap_timer_suspend(struct dp_soc *soc) 3971 { 3972 if (dp_monitor_reap_timer_stop(soc, CDP_MON_REAP_SOURCE_ANY)) 3973 dp_monitor_service_mon_rings(soc, DP_MON_REAP_BUDGET); 3974 } 3975 3976 #endif 3977 3978 /** 3979 * dp_monitor_neighbour_peer_list_remove() - remove neighbour peer list 3980 * @pdev: point to dp pdev 3981 * @vdev: point to dp vdev 3982 * @peer: point to dp_neighbour_peer 3983 * 3984 * Return: void 3985 */ 3986 static inline 3987 void dp_monitor_neighbour_peer_list_remove(struct dp_pdev *pdev, 3988 struct dp_vdev *vdev, 3989 struct dp_neighbour_peer *peer) 3990 { 3991 struct dp_mon_pdev *mon_pdev; 3992 struct dp_neighbour_peer *temp_peer = NULL; 3993 3994 if (qdf_unlikely(!pdev || !pdev->monitor_pdev)) 3995 return; 3996 3997 mon_pdev = pdev->monitor_pdev; 3998 qdf_spin_lock_bh(&mon_pdev->neighbour_peer_mutex); 3999 if (!pdev->soc->monitor_soc->hw_nac_monitor_support) { 4000 TAILQ_FOREACH(peer, &mon_pdev->neighbour_peers_list, 4001 neighbour_peer_list_elem) { 4002 QDF_ASSERT(peer->vdev != vdev); 4003 } 4004 } else { 4005 TAILQ_FOREACH_SAFE(peer, &mon_pdev->neighbour_peers_list, 4006 neighbour_peer_list_elem, temp_peer) { 4007 if (peer->vdev == vdev) { 4008 TAILQ_REMOVE(&mon_pdev->neighbour_peers_list, 4009 peer, 4010 neighbour_peer_list_elem); 4011 qdf_mem_free(peer); 4012 } 4013 } 4014 } 4015 qdf_spin_unlock_bh(&mon_pdev->neighbour_peer_mutex); 4016 } 4017 4018 static inline 4019 void dp_monitor_pdev_set_mon_vdev(struct dp_vdev *vdev) 4020 { 4021 if (!vdev->pdev->monitor_pdev) 4022 return; 4023 4024 vdev->pdev->monitor_pdev->mvdev = vdev; 4025 } 4026 4027 static inline 4028 void dp_monitor_pdev_config_scan_spcl_vap(struct dp_pdev *pdev, bool val) 4029 { 4030 if (!pdev || !pdev->monitor_pdev) 4031 return; 4032 4033 pdev->monitor_pdev->scan_spcl_vap_configured = val; 4034 } 4035 4036 #ifdef QCA_SUPPORT_SCAN_SPCL_VAP_STATS 4037 static inline 4038 void dp_monitor_pdev_reset_scan_spcl_vap_stats_enable(struct dp_pdev *pdev, 4039 bool val) 4040 { 4041 if (!pdev || !pdev->monitor_pdev) 4042 return; 4043 4044 pdev->monitor_pdev->reset_scan_spcl_vap_stats_enable = val; 4045 } 4046 #else 4047 static inline 4048 void dp_monitor_pdev_reset_scan_spcl_vap_stats_enable(struct dp_pdev *pdev, 4049 bool val) 4050 { 4051 } 4052 #endif 4053 4054 #if defined(CONFIG_MON_WORD_BASED_TLV) 4055 static inline void 4056 dp_mon_rx_wmask_subscribe(struct dp_soc *soc, 4057 uint32_t *msg_word, int pdev_id, 4058 struct htt_rx_ring_tlv_filter *tlv_filter) 4059 { 4060 struct dp_mon_soc *mon_soc = soc->monitor_soc; 4061 struct dp_mon_ops *monitor_ops; 4062 4063 if (!mon_soc) { 4064 dp_mon_debug("mon soc is NULL"); 4065 return; 4066 4067 } 4068 4069 monitor_ops = mon_soc->mon_ops; 4070 if (!monitor_ops || !monitor_ops->rx_wmask_subscribe) { 4071 dp_mon_debug("callback not registered"); 4072 return; 4073 } 4074 4075 monitor_ops->rx_wmask_subscribe(soc, msg_word, pdev_id, tlv_filter); 4076 } 4077 #else 4078 static inline void 4079 dp_mon_rx_wmask_subscribe(struct dp_soc *soc, 4080 uint32_t *msg_word, int pdev_id, 4081 struct htt_rx_ring_tlv_filter *tlv_filter) 4082 { 4083 } 4084 #endif 4085 4086 static inline void 4087 dp_mon_rx_enable_pkt_tlv_offset(struct dp_soc *soc, uint32_t *msg_word, 4088 struct htt_rx_ring_tlv_filter *tlv_filter) 4089 { 4090 struct dp_mon_soc *mon_soc = soc->monitor_soc; 4091 struct dp_mon_ops *monitor_ops; 4092 4093 if (!mon_soc) { 4094 dp_mon_debug("mon soc is NULL"); 4095 return; 4096 } 4097 4098 monitor_ops = mon_soc->mon_ops; 4099 if (!monitor_ops || !monitor_ops->rx_pkt_tlv_offset) { 4100 dp_mon_debug("callback not registered"); 4101 return; 4102 } 4103 4104 monitor_ops->rx_pkt_tlv_offset(msg_word, tlv_filter); 4105 } 4106 4107 static inline void 4108 dp_mon_rx_enable_mpdu_logging(struct dp_soc *soc, uint32_t *msg_word, 4109 struct htt_rx_ring_tlv_filter *tlv_filter) 4110 { 4111 struct dp_mon_soc *mon_soc = soc->monitor_soc; 4112 struct dp_mon_ops *monitor_ops; 4113 4114 if (!mon_soc) { 4115 dp_mon_debug("mon soc is NULL"); 4116 return; 4117 4118 } 4119 4120 monitor_ops = mon_soc->mon_ops; 4121 if (!monitor_ops || !monitor_ops->rx_enable_mpdu_logging) { 4122 dp_mon_debug("callback not registered"); 4123 return; 4124 } 4125 4126 monitor_ops->rx_enable_mpdu_logging(msg_word, tlv_filter); 4127 } 4128 4129 /** 4130 * dp_mon_rx_enable_fpmo() - set fpmo filters 4131 * @soc: dp soc handle 4132 * @msg_word: msg word 4133 * @tlv_filter: rx fing filter config 4134 * 4135 * Return: void 4136 */ 4137 static inline void 4138 dp_mon_rx_enable_fpmo(struct dp_soc *soc, uint32_t *msg_word, 4139 struct htt_rx_ring_tlv_filter *tlv_filter) 4140 { 4141 struct dp_mon_soc *mon_soc = soc->monitor_soc; 4142 struct dp_mon_ops *monitor_ops; 4143 4144 if (!mon_soc) { 4145 dp_mon_debug("mon soc is NULL"); 4146 return; 4147 } 4148 4149 monitor_ops = mon_soc->mon_ops; 4150 if (!monitor_ops || !monitor_ops->rx_enable_fpmo) { 4151 dp_mon_debug("callback not registered"); 4152 return; 4153 } 4154 4155 monitor_ops->rx_enable_fpmo(msg_word, tlv_filter); 4156 } 4157 4158 /** 4159 * dp_mon_rx_hdr_length_set() - set rx hdr tlv length 4160 * @soc: dp soc handle 4161 * @msg_word: msg word 4162 * @tlv_filter: rx fing filter config 4163 * 4164 * Return: void 4165 */ 4166 static inline void 4167 dp_mon_rx_hdr_length_set(struct dp_soc *soc, uint32_t *msg_word, 4168 struct htt_rx_ring_tlv_filter *tlv_filter) 4169 { 4170 struct dp_mon_soc *mon_soc = soc->monitor_soc; 4171 struct dp_mon_ops *monitor_ops; 4172 4173 if (!mon_soc) { 4174 dp_mon_debug("mon soc is NULL"); 4175 return; 4176 } 4177 4178 monitor_ops = mon_soc->mon_ops; 4179 if (!monitor_ops || !monitor_ops->rx_hdr_length_set) { 4180 dp_mon_debug("callback not registered"); 4181 return; 4182 } 4183 4184 monitor_ops->rx_hdr_length_set(msg_word, tlv_filter); 4185 } 4186 4187 static inline void 4188 dp_mon_rx_packet_length_set(struct dp_soc *soc, uint32_t *msg_word, 4189 struct htt_rx_ring_tlv_filter *tlv_filter) 4190 { 4191 struct dp_mon_soc *mon_soc = soc->monitor_soc; 4192 struct dp_mon_ops *monitor_ops; 4193 4194 if (!mon_soc) { 4195 dp_mon_debug("mon soc is NULL"); 4196 return; 4197 4198 } 4199 4200 monitor_ops = mon_soc->mon_ops; 4201 if (!monitor_ops || !monitor_ops->rx_packet_length_set) { 4202 dp_mon_debug("callback not registered"); 4203 return; 4204 } 4205 4206 monitor_ops->rx_packet_length_set(msg_word, tlv_filter); 4207 } 4208 4209 static inline void 4210 dp_rx_mon_enable(struct dp_soc *soc, uint32_t *msg_word, 4211 struct htt_rx_ring_tlv_filter *tlv_filter) 4212 { 4213 struct dp_mon_soc *mon_soc = soc->monitor_soc; 4214 struct dp_mon_ops *monitor_ops; 4215 4216 if (!mon_soc) { 4217 dp_mon_debug("mon soc is NULL"); 4218 return; 4219 } 4220 4221 monitor_ops = mon_soc->mon_ops; 4222 if (!monitor_ops || !monitor_ops->rx_mon_enable) { 4223 dp_mon_debug("callback not registered"); 4224 return; 4225 } 4226 4227 monitor_ops->rx_mon_enable(msg_word, tlv_filter); 4228 } 4229 4230 static inline void 4231 dp_mon_rx_mac_filter_set(struct dp_soc *soc, uint32_t *msg_word, 4232 struct htt_rx_ring_tlv_filter *tlv_filter) 4233 { 4234 struct dp_mon_soc *mon_soc = soc->monitor_soc; 4235 struct dp_mon_ops *monitor_ops; 4236 4237 if (!mon_soc) { 4238 dp_mon_debug("mon soc is NULL"); 4239 return; 4240 } 4241 4242 monitor_ops = mon_soc->mon_ops; 4243 if (!monitor_ops || !monitor_ops->mon_mac_filter_set) { 4244 dp_mon_debug("callback not registered"); 4245 return; 4246 } 4247 4248 monitor_ops->mon_mac_filter_set(msg_word, tlv_filter); 4249 } 4250 4251 #ifdef QCA_ENHANCED_STATS_SUPPORT 4252 QDF_STATUS dp_peer_qos_stats_notify(struct dp_pdev *dp_pdev, 4253 struct cdp_rx_stats_ppdu_user *ppdu_user); 4254 #endif 4255 4256 /** 4257 * dp_print_pdev_rx_mon_stats() - print rx mon stats 4258 * @pdev: device object 4259 * 4260 * Return: void 4261 */ 4262 void 4263 dp_print_pdev_rx_mon_stats(struct dp_pdev *pdev); 4264 4265 /** 4266 * dp_mcopy_check_deliver() - mcopy check deliver 4267 * @pdev: DP pdev handle 4268 * @peer_id: peer id 4269 * @ppdu_id: ppdu 4270 * @first_msdu: flag to indicate first msdu of ppdu 4271 * Return: 0 on success, not 0 on failure 4272 */ 4273 QDF_STATUS dp_mcopy_check_deliver(struct dp_pdev *pdev, 4274 uint16_t peer_id, 4275 uint32_t ppdu_id, 4276 uint8_t first_msdu); 4277 4278 /** 4279 * dp_pdev_set_advance_monitor_filter() - Set DP PDEV monitor filter 4280 * @soc_hdl: soc handle 4281 * @pdev_id: id of Datapath PDEV handle 4282 * @filter_val: Flag to select Filter for monitor mode 4283 * 4284 * Return: 0 on success, not 0 on failure 4285 */ 4286 #ifdef QCA_ADVANCE_MON_FILTER_SUPPORT 4287 QDF_STATUS 4288 dp_pdev_set_advance_monitor_filter(struct cdp_soc_t *soc_hdl, uint8_t pdev_id, 4289 struct cdp_monitor_filter *filter_val); 4290 #else 4291 static inline QDF_STATUS 4292 dp_pdev_set_advance_monitor_filter(struct cdp_soc_t *soc_hdl, uint8_t pdev_id, 4293 struct cdp_monitor_filter *filter_val) 4294 { 4295 return QDF_STATUS_E_INVAL; 4296 } 4297 #endif /* QCA_ADVANCE_MON_FILTER_SUPPORT */ 4298 4299 /** 4300 * dp_deliver_tx_mgmt() - Deliver mgmt frame for tx capture 4301 * @cdp_soc : data path soc handle 4302 * @pdev_id : pdev_id 4303 * @nbuf: Management frame buffer 4304 * 4305 * Return: QDF_STATUS_SUCCESS on success 4306 * QDF_STATUS_E_FAILURE on failure 4307 */ 4308 QDF_STATUS 4309 dp_deliver_tx_mgmt(struct cdp_soc_t *cdp_soc, uint8_t pdev_id, qdf_nbuf_t nbuf); 4310 4311 /** 4312 * dp_filter_neighbour_peer() - API to filter neighbour peer 4313 * @pdev : DP pdev handle 4314 * @rx_pkt_hdr : packet header 4315 * 4316 * Return: QDF_STATUS_SUCCESS on success 4317 * QDF_STATUS_E_FAILURE on failure 4318 */ 4319 #ifdef FEATURE_NAC_RSSI 4320 QDF_STATUS dp_filter_neighbour_peer(struct dp_pdev *pdev, 4321 uint8_t *rx_pkt_hdr); 4322 #else 4323 static inline 4324 QDF_STATUS dp_filter_neighbour_peer(struct dp_pdev *pdev, 4325 uint8_t *rx_pkt_hdr) 4326 { 4327 return QDF_STATUS_SUCCESS; 4328 } 4329 #endif /* FEATURE_NAC_RSSI */ 4330 4331 /** 4332 * dp_neighbour_peers_detach() - Detach neighbour peers(nac clients) 4333 * @pdev: device object 4334 * 4335 * Return: void 4336 */ 4337 void dp_neighbour_peers_detach(struct dp_pdev *pdev); 4338 4339 /** 4340 * dp_reset_monitor_mode() - Disable monitor mode 4341 * @soc_hdl: Datapath soc handle 4342 * @pdev_id: id of datapath PDEV handle 4343 * @smart_monitor: smart monitor flag 4344 * 4345 * Return: QDF_STATUS 4346 */ 4347 QDF_STATUS dp_reset_monitor_mode(struct cdp_soc_t *soc_hdl, 4348 uint8_t pdev_id, 4349 uint8_t smart_monitor); 4350 4351 /** 4352 * dp_reset_monitor_mode_unlock() - Disable monitor mode with no locks 4353 * @soc_hdl: Datapath soc handle 4354 * @pdev_id: id of datapath PDEV handle 4355 * @smart_monitor: smart monitor flag 4356 * 4357 * Return: QDF_STATUS 4358 */ 4359 #ifdef WIFI_MONITOR_SUPPORT 4360 QDF_STATUS dp_reset_monitor_mode_unlock(struct cdp_soc_t *soc_hdl, 4361 uint8_t pdev_id, 4362 uint8_t smart_monitor); 4363 #else 4364 QDF_STATUS dp_reset_monitor_mode_unlock(struct cdp_soc_t *soc_hdl, 4365 uint8_t pdev_id, 4366 uint8_t smart_monitor) 4367 { 4368 return QDF_STATUS_SUCCESS; 4369 } 4370 #endif 4371 4372 static inline 4373 struct dp_mon_ops *dp_mon_ops_get(struct dp_soc *soc) 4374 { 4375 if (soc && soc->monitor_soc) 4376 return soc->monitor_soc->mon_ops; 4377 4378 return NULL; 4379 } 4380 4381 static inline 4382 struct cdp_mon_ops *dp_mon_cdp_ops_get(struct dp_soc *soc) 4383 { 4384 struct cdp_ops *ops = soc->cdp_soc.ops; 4385 4386 return ops->mon_ops; 4387 } 4388 4389 /** 4390 * dp_monitor_soc_attach() - Monitor SOC attach 4391 * @soc: DP soc handle 4392 * 4393 * Return: void 4394 */ 4395 static inline void dp_monitor_soc_attach(struct dp_soc *soc) 4396 { 4397 struct dp_mon_ops *mon_ops; 4398 4399 mon_ops = dp_mon_ops_get(soc); 4400 4401 if (mon_ops && mon_ops->mon_soc_attach[0]) 4402 mon_ops->mon_soc_attach[0](soc); 4403 4404 if (mon_ops && mon_ops->mon_soc_attach[1]) 4405 mon_ops->mon_soc_attach[1](soc); 4406 } 4407 4408 /** 4409 * dp_monitor_soc_detach() - Monitor SOC detach 4410 * @soc: DP soc handle 4411 * 4412 * Return: void 4413 */ 4414 static inline void dp_monitor_soc_detach(struct dp_soc *soc) 4415 { 4416 struct dp_mon_ops *mon_ops; 4417 4418 mon_ops = dp_mon_ops_get(soc); 4419 4420 if (mon_ops && mon_ops->mon_soc_detach[0]) 4421 mon_ops->mon_soc_detach[0](soc); 4422 4423 if (mon_ops && mon_ops->mon_soc_detach[1]) 4424 mon_ops->mon_soc_detach[1](soc); 4425 } 4426 4427 /** 4428 * dp_monitor_soc_init() - Monitor SOC init 4429 * @soc: DP soc handle 4430 * 4431 * Return: void 4432 */ 4433 static inline void dp_monitor_soc_init(struct dp_soc *soc) 4434 { 4435 struct dp_mon_ops *mon_ops; 4436 4437 mon_ops = dp_mon_ops_get(soc); 4438 4439 if (mon_ops && mon_ops->mon_soc_init[0]) 4440 mon_ops->mon_soc_init[0](soc); 4441 4442 if (mon_ops && mon_ops->mon_soc_init[1]) 4443 mon_ops->mon_soc_init[1](soc); 4444 } 4445 4446 /** 4447 * dp_monitor_soc_deinit() - Monitor SOC deinit 4448 * @soc: DP soc handle 4449 * 4450 * Return: void 4451 */ 4452 static inline void dp_monitor_soc_deinit(struct dp_soc *soc) 4453 { 4454 struct dp_mon_ops *mon_ops; 4455 4456 mon_ops = dp_mon_ops_get(soc); 4457 4458 if (mon_ops && mon_ops->mon_soc_deinit[0]) 4459 mon_ops->mon_soc_deinit[0](soc); 4460 4461 if (mon_ops && mon_ops->mon_soc_deinit[1]) 4462 mon_ops->mon_soc_deinit[1](soc); 4463 } 4464 4465 /** 4466 * dp_ppdu_desc_user_stats_update(): Function to update TX user stats 4467 * @pdev: DP pdev handle 4468 * @ppdu_info: per PPDU TLV descriptor 4469 * 4470 * Return: void 4471 */ 4472 #ifdef QCA_ENHANCED_STATS_SUPPORT 4473 void 4474 dp_ppdu_desc_user_stats_update(struct dp_pdev *pdev, 4475 struct ppdu_info *ppdu_info); 4476 #else 4477 static inline void 4478 dp_ppdu_desc_user_stats_update(struct dp_pdev *pdev, 4479 struct ppdu_info *ppdu_info) 4480 { 4481 } 4482 #endif /* QCA_ENHANCED_STATS_SUPPORT */ 4483 4484 #ifdef CONFIG_LITHIUM 4485 /** 4486 * dp_mon_ops_register_1_0(): register legacy monitor ops 4487 * @mon_soc: monitor soc handle 4488 * 4489 * return: void 4490 */ 4491 void dp_mon_ops_register_1_0(struct dp_mon_soc *mon_soc); 4492 4493 /** 4494 * dp_mon_cdp_ops_register_1_0(): register legacy monitor cdp ops 4495 * @ops: cdp ops handle 4496 * 4497 * return: void 4498 */ 4499 void dp_mon_cdp_ops_register_1_0(struct cdp_ops *ops); 4500 #else 4501 static inline void dp_mon_cdp_ops_register_1_0(struct cdp_ops *ops) 4502 { 4503 } 4504 4505 static inline void dp_mon_ops_register_1_0(struct dp_mon_soc *mon_soc) 4506 { 4507 } 4508 #endif 4509 4510 #if defined(WLAN_CFR_ENABLE) && defined(WLAN_ENH_CFR_ENABLE) 4511 /** 4512 * dp_cfr_filter_register_1_0(): register cfr filter setting API 4513 * @ops: cdp ops handle 4514 * 4515 * return: void 4516 */ 4517 void dp_cfr_filter_register_1_0(struct cdp_ops *ops); 4518 #endif 4519 4520 QDF_STATUS dp_mon_pdev_htt_srng_setup_2_0(struct dp_soc *soc, 4521 struct dp_pdev *pdev, 4522 int mac_id, 4523 int mac_for_pdev); 4524 QDF_STATUS dp_mon_soc_htt_srng_setup_2_0(struct dp_soc *soc); 4525 QDF_STATUS dp_mon_soc_attach_2_0(struct dp_soc *soc); 4526 QDF_STATUS dp_mon_soc_init_2_0(struct dp_soc *soc); 4527 void dp_mon_soc_deinit_2_0(struct dp_soc *soc); 4528 QDF_STATUS dp_mon_soc_detach_2_0(struct dp_soc *soc); 4529 void dp_pdev_mon_rings_deinit_2_0(struct dp_pdev *pdev); 4530 QDF_STATUS dp_pdev_mon_rings_init_2_0(struct dp_pdev *pdev); 4531 void dp_pdev_mon_rings_free_2_0(struct dp_pdev *pdev); 4532 QDF_STATUS dp_pdev_mon_rings_alloc_2_0(struct dp_pdev *pdev); 4533 4534 #ifdef WLAN_PKT_CAPTURE_TX_2_0 4535 /** 4536 * dp_mon_ops_register_tx_2_0(): register monitor tx ops 2.0 4537 * @mon_soc: monitor soc handle 4538 * 4539 * return: void 4540 */ 4541 void dp_mon_ops_register_tx_2_0(struct dp_mon_soc *mon_soc); 4542 #else 4543 static inline 4544 void dp_mon_ops_register_tx_2_0(struct dp_mon_soc *mon_soc) 4545 { 4546 } 4547 #endif /* WLAN_PKT_CAPTURE_TX_2_0 */ 4548 4549 #if defined(WLAN_PKT_CAPTURE_TX_2_0) || \ 4550 defined(WLAN_PKT_CAPTURE_RX_2_0) 4551 /** 4552 * dp_mon_ops_register_2_0(): register monitor ops 4553 * @mon_soc: monitor soc handle 4554 * 4555 * return: void 4556 */ 4557 void dp_mon_ops_register_2_0(struct dp_mon_soc *mon_soc); 4558 4559 /** 4560 * dp_mon_cdp_ops_register_2_0(): register monitor cdp ops 4561 * @ops: cdp ops handle 4562 * 4563 * return: void 4564 */ 4565 void dp_mon_cdp_ops_register_2_0(struct cdp_ops *ops); 4566 4567 #if defined(WLAN_CFR_ENABLE) && defined(WLAN_ENH_CFR_ENABLE) 4568 /** 4569 * dp_cfr_filter_register_2_0(): register cfr filter setting API 4570 * @ops: cdp ops handle 4571 * 4572 * return: void 4573 */ 4574 void dp_cfr_filter_register_2_0(struct cdp_ops *ops); 4575 #endif 4576 void dp_mon_ops_register_cmn_2_0(struct dp_mon_soc *mon_soc); 4577 #else 4578 static inline void 4579 dp_mon_ops_register_2_0(struct dp_mon_soc *mon_soc) 4580 { 4581 } 4582 4583 static inline void 4584 dp_mon_cdp_ops_register_2_0(struct cdp_ops *ops) 4585 { 4586 } 4587 4588 static inline void 4589 dp_mon_ops_register_cmn_2_0(struct dp_mon_soc *mon_soc) 4590 { 4591 } 4592 #endif /* WLAN_PKT_CAPTURE_TX_2_0 OR WLAN_PKT_CAPTURE_RX_2_0 */ 4593 4594 #ifdef WLAN_PKT_CAPTURE_RX_2_0 4595 /** 4596 * dp_mon_ops_register_rx_2_0(): register monitor rx ops 2.0 4597 * @mon_soc: monitor soc handle 4598 * 4599 * return: void 4600 */ 4601 void dp_mon_ops_register_rx_2_0(struct dp_mon_soc *mon_soc); 4602 #else 4603 static inline 4604 void dp_mon_ops_register_rx_2_0(struct dp_mon_soc *mon_soc) 4605 { 4606 } 4607 #endif 4608 4609 /** 4610 * dp_mon_register_feature_ops(): Register mon feature ops 4611 * @soc: Datapath soc context 4612 * 4613 * return: void 4614 */ 4615 static inline 4616 void dp_mon_register_feature_ops(struct dp_soc *soc) 4617 { 4618 struct dp_mon_ops *mon_ops = NULL; 4619 4620 mon_ops = dp_mon_ops_get(soc); 4621 if (!mon_ops) { 4622 dp_mon_err("Monitor ops is NULL"); 4623 return; 4624 } 4625 if (mon_ops->mon_register_feature_ops) 4626 mon_ops->mon_register_feature_ops(soc); 4627 } 4628 4629 /** 4630 * dp_pdev_get_rx_mon_stats(): Get pdev Rx monitor stats 4631 * @soc_hdl: soc handle 4632 * @pdev_id: id of pdev handle 4633 * @stats: User allocated stats buffer 4634 * 4635 * return: status success/failure 4636 */ 4637 QDF_STATUS dp_pdev_get_rx_mon_stats(struct cdp_soc_t *soc_hdl, uint8_t pdev_id, 4638 struct cdp_pdev_mon_stats *stats); 4639 4640 /** 4641 * dp_enable_mon_reap_timer() - enable/disable reap timer 4642 * @soc_hdl: Datapath soc handle 4643 * @source: trigger source of the timer 4644 * @enable: Enable/Disable reap timer of monitor status ring 4645 * 4646 * Return: true if a timer-start/stop is performed, false otherwise. 4647 */ 4648 bool dp_enable_mon_reap_timer(struct cdp_soc_t *soc_hdl, 4649 enum cdp_mon_reap_source source, bool enable); 4650 4651 QDF_STATUS dp_vdev_set_monitor_mode(struct cdp_soc_t *dp_soc, 4652 uint8_t vdev_id, 4653 uint8_t special_monitor); 4654 4655 #ifdef QCA_ENHANCED_STATS_SUPPORT 4656 /** 4657 * dp_enable_enhanced_stats() - enable enhanced and MLD Link Peer stats 4658 * @soc: Datapath soc handle 4659 * @pdev_id: Pdev Id on which stats will get enable 4660 * 4661 * Return: status success/failure 4662 */ 4663 QDF_STATUS 4664 dp_enable_enhanced_stats(struct cdp_soc_t *soc, uint8_t pdev_id); 4665 4666 /** 4667 * dp_disable_enhanced_stats() - disable enhanced and MLD Link Peer stats 4668 * @soc: Datapath soc handle 4669 * @pdev_id: Pdev Id on which stats will get disable 4670 * 4671 * Return: status success/failure 4672 */ 4673 QDF_STATUS 4674 dp_disable_enhanced_stats(struct cdp_soc_t *soc, uint8_t pdev_id); 4675 #endif /* QCA_ENHANCED_STATS_SUPPORT */ 4676 4677 /* 4678 * dp_monitor_lite_mon_disable_rx() - disables rx lite mon 4679 * @pdev: dp pdev 4680 * 4681 * Return: void 4682 */ 4683 static inline void 4684 dp_monitor_lite_mon_disable_rx(struct dp_pdev *pdev) 4685 { 4686 struct dp_mon_ops *monitor_ops; 4687 struct dp_mon_soc *mon_soc = pdev->soc->monitor_soc; 4688 4689 if (!mon_soc) { 4690 dp_mon_debug("monitor soc is NULL"); 4691 return; 4692 } 4693 4694 monitor_ops = mon_soc->mon_ops; 4695 if (!monitor_ops || 4696 !monitor_ops->mon_lite_mon_disable_rx) { 4697 dp_mon_debug("callback not registered"); 4698 return; 4699 } 4700 4701 return monitor_ops->mon_lite_mon_disable_rx(pdev); 4702 } 4703 4704 /* 4705 * dp_monitor_lite_mon_is_rx_adv_filter_enable() 4706 * - check if advance mon filter is already applied 4707 * @pdev: dp pdev 4708 * 4709 * Return: bool 4710 */ 4711 static inline bool 4712 dp_monitor_lite_mon_is_rx_adv_filter_enable(struct dp_pdev *pdev) 4713 { 4714 struct dp_mon_ops *monitor_ops; 4715 struct dp_mon_soc *mon_soc = pdev->soc->monitor_soc; 4716 4717 if (!mon_soc) { 4718 dp_mon_debug("monitor soc is NULL"); 4719 return false; 4720 } 4721 4722 monitor_ops = mon_soc->mon_ops; 4723 if (!monitor_ops || 4724 !monitor_ops->mon_lite_mon_disable_rx) { 4725 dp_mon_debug("callback not registered"); 4726 return false; 4727 } 4728 4729 return monitor_ops->mon_lite_mon_is_rx_adv_filter_enable(pdev); 4730 } 4731 4732 #ifndef QCA_SUPPORT_LITE_MONITOR 4733 static inline void 4734 dp_lite_mon_disable_rx(struct dp_pdev *pdev) 4735 { 4736 } 4737 4738 static inline void 4739 dp_lite_mon_disable_tx(struct dp_pdev *pdev) 4740 { 4741 } 4742 4743 static inline bool 4744 dp_lite_mon_is_rx_adv_filter_enable(struct dp_pdev *pdev) 4745 { 4746 return false; 4747 } 4748 4749 static inline bool 4750 dp_lite_mon_get_filter_ucast_data(struct cdp_pdev *pdev_handle) 4751 { 4752 return false; 4753 } 4754 4755 static inline bool 4756 dp_lite_mon_get_filter_mcast_data(struct cdp_pdev *pdev_handle) 4757 { 4758 return false; 4759 } 4760 4761 static inline bool 4762 dp_lite_mon_get_filter_non_data(struct cdp_pdev *pdev_handle) 4763 { 4764 return false; 4765 } 4766 4767 static inline int 4768 dp_lite_mon_is_level_msdu(struct dp_mon_pdev *mon_pdev) 4769 { 4770 return 0; 4771 } 4772 4773 static inline int 4774 dp_lite_mon_is_rx_enabled(struct dp_mon_pdev *mon_pdev) 4775 { 4776 return 0; 4777 } 4778 4779 static inline int 4780 dp_lite_mon_is_tx_enabled(struct dp_mon_pdev *mon_pdev) 4781 { 4782 return 0; 4783 } 4784 4785 static inline QDF_STATUS 4786 dp_lite_mon_alloc(struct dp_pdev *pdev) 4787 { 4788 return QDF_STATUS_SUCCESS; 4789 } 4790 4791 static inline void 4792 dp_lite_mon_dealloc(struct dp_pdev *pdev) 4793 { 4794 } 4795 4796 static inline void 4797 dp_lite_mon_vdev_delete(struct dp_pdev *pdev, struct dp_vdev *vdev) 4798 { 4799 } 4800 4801 static inline int 4802 dp_lite_mon_config_nac_peer(struct cdp_soc_t *soc_hdl, 4803 uint8_t vdev_id, 4804 uint32_t cmd, uint8_t *macaddr) 4805 { 4806 return 0; 4807 } 4808 4809 static inline QDF_STATUS 4810 dp_lite_mon_config_nac_rssi_peer(struct cdp_soc_t *soc_hdl, 4811 uint8_t vdev_id, 4812 enum cdp_nac_param_cmd cmd, 4813 char *bssid, char *macaddr, 4814 uint8_t chan_num) 4815 { 4816 return QDF_STATUS_E_FAILURE; 4817 } 4818 4819 static inline QDF_STATUS 4820 dp_lite_mon_get_nac_peer_rssi(struct cdp_soc_t *soc_hdl, 4821 uint8_t vdev_id, char *macaddr, 4822 uint8_t *rssi) 4823 { 4824 return QDF_STATUS_E_FAILURE; 4825 } 4826 4827 static inline QDF_STATUS 4828 dp_lite_mon_rx_mpdu_process(struct dp_pdev *pdev, 4829 struct hal_rx_ppdu_info *ppdu_info, 4830 qdf_nbuf_t mon_mpdu, uint16_t mpdu_id, 4831 uint8_t user) 4832 { 4833 return QDF_STATUS_E_FAILURE; 4834 } 4835 4836 static inline int 4837 dp_lite_mon_get_legacy_feature_enabled(struct cdp_soc_t *soc, 4838 uint8_t pdev_id, 4839 uint8_t direction) 4840 { 4841 return 0; 4842 } 4843 #endif 4844 4845 #ifdef WLAN_CONFIG_TELEMETRY_AGENT 4846 static inline 4847 void dp_monitor_peer_telemetry_stats(struct dp_peer *peer, 4848 struct cdp_peer_telemetry_stats *stats) 4849 { 4850 struct dp_mon_peer_stats *mon_peer_stats = NULL; 4851 uint8_t ac; 4852 4853 if (qdf_unlikely(!peer->monitor_peer)) 4854 return; 4855 4856 mon_peer_stats = &peer->monitor_peer->stats; 4857 for (ac = 0; ac < WME_AC_MAX; ac++) { 4858 stats->tx_airtime_consumption[ac] = 4859 mon_peer_stats->airtime_stats.tx_airtime_consumption[ac].avg_consumption_per_sec; 4860 stats->rx_airtime_consumption[ac] = 4861 mon_peer_stats->airtime_stats.rx_airtime_consumption[ac].avg_consumption_per_sec; 4862 } 4863 stats->tx_mpdu_retried = mon_peer_stats->tx.retries; 4864 stats->tx_mpdu_total = mon_peer_stats->tx.tx_mpdus_tried; 4865 stats->rx_mpdu_retried = mon_peer_stats->rx.mpdu_retry_cnt; 4866 stats->rx_mpdu_total = mon_peer_stats->rx.rx_mpdus; 4867 stats->snr = CDP_SNR_OUT(mon_peer_stats->rx.avg_snr); 4868 } 4869 4870 static inline 4871 void dp_monitor_peer_deter_stats(struct dp_peer *peer, 4872 struct cdp_peer_deter_stats *stats) 4873 { 4874 struct dp_mon_peer_stats *mon_peer_stats = NULL; 4875 struct cdp_peer_deter_stats *deter_stats; 4876 4877 if (qdf_unlikely(!peer->monitor_peer)) 4878 return; 4879 4880 mon_peer_stats = &peer->monitor_peer->stats; 4881 deter_stats = &mon_peer_stats->deter_stats.deter[0]; 4882 qdf_mem_copy(stats, deter_stats, sizeof(*stats) * CDP_DATA_TID_MAX); 4883 } 4884 #endif 4885 4886 /** 4887 * dp_monitor_is_tx_cap_enabled() - get tx-cature enabled/disabled 4888 * @peer: DP peer handle 4889 * 4890 * Return: true if tx-capture is enabled 4891 */ 4892 static inline bool dp_monitor_is_tx_cap_enabled(struct dp_peer *peer) 4893 { 4894 return peer->monitor_peer ? peer->monitor_peer->tx_cap_enabled : 0; 4895 } 4896 4897 /** 4898 * dp_monitor_is_rx_cap_enabled() - get rx-cature enabled/disabled 4899 * @peer: DP peer handle 4900 * 4901 * Return: true if rx-capture is enabled 4902 */ 4903 static inline bool dp_monitor_is_rx_cap_enabled(struct dp_peer *peer) 4904 { 4905 return peer->monitor_peer ? peer->monitor_peer->rx_cap_enabled : 0; 4906 } 4907 4908 #if !(!defined(DISABLE_MON_CONFIG) && (defined(WLAN_PKT_CAPTURE_TX_2_0) || \ 4909 defined(WLAN_PKT_CAPTURE_RX_2_0))) 4910 /** 4911 * dp_mon_get_context_size_be() - get BE specific size for mon pdev/soc 4912 * @context_type: context type for which the size is needed 4913 * 4914 * Return: size in bytes for the context_type 4915 */ 4916 static inline 4917 qdf_size_t dp_mon_get_context_size_be(enum dp_context_type context_type) 4918 { 4919 switch (context_type) { 4920 case DP_CONTEXT_TYPE_MON_SOC: 4921 return sizeof(struct dp_mon_soc); 4922 case DP_CONTEXT_TYPE_MON_PDEV: 4923 return sizeof(struct dp_mon_pdev); 4924 default: 4925 return 0; 4926 } 4927 } 4928 #endif 4929 4930 /** 4931 * dp_mon_rx_print_advanced_stats() - print advanced monitor stats 4932 * @soc: DP soc handle 4933 * @pdev: DP pdev handle 4934 * 4935 * Return: void 4936 */ 4937 static inline void 4938 dp_mon_rx_print_advanced_stats(struct dp_soc *soc, 4939 struct dp_pdev *pdev) 4940 { 4941 struct dp_mon_soc *mon_soc = soc->monitor_soc; 4942 struct dp_mon_ops *monitor_ops; 4943 4944 if (!mon_soc) { 4945 dp_mon_debug("mon soc is NULL"); 4946 return; 4947 } 4948 4949 monitor_ops = mon_soc->mon_ops; 4950 if (!monitor_ops || 4951 !monitor_ops->mon_rx_print_advanced_stats) { 4952 dp_mon_debug("callback not registered"); 4953 return; 4954 } 4955 return monitor_ops->mon_rx_print_advanced_stats(soc, pdev); 4956 } 4957 4958 #ifdef WLAN_CONFIG_TELEMETRY_AGENT 4959 /* 4960 * dp_update_pdev_mon_telemetry_airtime_stats() - update telemetry airtime 4961 * stats in monitor pdev 4962 * 4963 *@soc: dp soc handle 4964 *@pdev_id: pdev id 4965 * 4966 * This API is used to update telemetry airtime stats in monitor pdev 4967 * 4968 * Return: Success if stats are updated, else failure 4969 */ 4970 4971 QDF_STATUS dp_pdev_update_telemetry_airtime_stats(struct cdp_soc_t *soc, 4972 uint8_t pdev_id); 4973 #endif 4974 4975 /* 4976 * dp_mon_register_lpc_ops_1_0() - set local packet capture 1_0 mon ops 4977 * @mon_ops: monitor ops 4978 * 4979 * This function initializes the mon_ops callbacks. 4980 * index [0] is for Monitor 1.0 and index [1] is for Monitor 2.0 4981 * based on the @WLAN_FEATURE_LOCAL_PKT_CAPTURE macro, it sets the 4982 * appropriate callbacks 4983 * 4984 * Return: None 4985 */ 4986 void dp_mon_register_lpc_ops_1_0(struct dp_mon_ops *mon_ops); 4987 4988 /* 4989 * dp_mon_register_tx_pkt_enh_ops_1_0() - set tx pkt enh mon ops 4990 * @mon_ops: monitor ops 4991 * 4992 * Return: None 4993 */ 4994 void dp_mon_register_tx_pkt_enh_ops_1_0(struct dp_mon_ops *mon_ops); 4995 4996 #ifdef WLAN_FEATURE_LOCAL_PKT_CAPTURE 4997 /* 4998 * dp_local_pkt_capture_tx_config() - local packet capture tx config 4999 * @pdev: physical device handle 5000 * 5001 * Return: QDF_STATUS 5002 */ 5003 QDF_STATUS dp_local_pkt_capture_tx_config(struct dp_pdev *pdev); 5004 #else 5005 static inline 5006 QDF_STATUS dp_local_pkt_capture_tx_config(struct dp_pdev *pdev) 5007 { 5008 return QDF_STATUS_SUCCESS; 5009 } 5010 #endif 5011 5012 #ifdef WIFI_MONITOR_SUPPORT 5013 void 5014 dp_check_and_dump_full_mon_info(struct dp_soc *soc, struct dp_pdev *pdev, 5015 int mac_id, int war); 5016 #else 5017 void 5018 dp_check_and_dump_full_mon_info(struct dp_soc *soc, struct dp_pdev *pdev, 5019 int mac_id, int war); 5020 5021 { 5022 } 5023 #endif 5024 5025 #endif /* _DP_MON_H_ */ 5026