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