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