1 /* 2 * Copyright (c) 2016-2021, The Linux Foundation. All rights reserved. 3 4 * Permission to use, copy, modify, and/or distribute this software for any 5 * purpose with or without fee is hereby granted, provided that the above 6 * copyright notice and this permission notice appear in all copies. 7 8 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 9 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 10 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 11 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 12 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 13 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 14 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 15 */ 16 17 #ifndef _DP_MON_H_ 18 #define _DP_MON_H_ 19 20 #include "qdf_trace.h" 21 #include "dp_internal.h" 22 #include "dp_types.h" 23 #include "dp_htt.h" 24 25 #ifdef WLAN_TX_PKT_CAPTURE_ENH 26 #include "dp_tx_capture.h" 27 #endif 28 29 #define DP_INTR_POLL_TIMER_MS 5 30 31 #define MON_VDEV_TIMER_INIT 0x1 32 #define MON_VDEV_TIMER_RUNNING 0x2 33 34 /* Budget to reap monitor status ring */ 35 #define DP_MON_REAP_BUDGET 1024 36 #define MON_BUF_MIN_ENTRIES 64 37 38 #define RNG_ERR "SRNG setup failed for" 39 #define dp_mon_info(params...) \ 40 __QDF_TRACE_FL(QDF_TRACE_LEVEL_INFO_HIGH, QDF_MODULE_ID_MON, ## params) 41 #define dp_mon_err(params...) QDF_TRACE_ERROR(QDF_MODULE_ID_MON, params) 42 #define dp_mon_debug(params...) QDF_TRACE_DEBUG(QDF_MODULE_ID_MON, params) 43 #define dp_mon_warn(params...) QDF_TRACE_WARN(QDF_MODULE_ID_MON, params) 44 45 struct dp_mon_ops { 46 QDF_STATUS (*mon_soc_cfg_init)(struct dp_soc *soc); 47 QDF_STATUS (*mon_pdev_attach)(struct dp_pdev *pdev); 48 QDF_STATUS (*mon_pdev_detach)(struct dp_pdev *pdev); 49 QDF_STATUS (*mon_pdev_init)(struct dp_pdev *pdev); 50 QDF_STATUS (*mon_pdev_deinit)(struct dp_pdev *pdev); 51 QDF_STATUS (*mon_vdev_attach)(struct dp_vdev *vdev); 52 QDF_STATUS (*mon_vdev_detach)(struct dp_vdev *vdev); 53 QDF_STATUS (*mon_peer_attach)(struct dp_peer *peer); 54 QDF_STATUS (*mon_peer_detach)(struct dp_peer *peer); 55 QDF_STATUS (*mon_config_debug_sniffer)(struct dp_pdev *pdev, int val); 56 void (*mon_flush_rings)(struct dp_soc *soc); 57 #if !defined(DISABLE_MON_CONFIG) 58 QDF_STATUS (*mon_htt_srng_setup)(struct dp_soc *soc, 59 struct dp_pdev *pdev, 60 int mac_id, 61 int mac_for_pdev); 62 #endif 63 #if !defined(DISABLE_MON_CONFIG) && defined(MON_ENABLE_DROP_FOR_MAC) 64 uint32_t (*mon_drop_packets_for_mac)(struct dp_pdev *pdev, 65 uint32_t mac_id, 66 uint32_t quota); 67 #endif 68 #if defined(DP_CON_MON) 69 void (*mon_service_rings)(struct dp_soc *soc, uint32_t quota); 70 #endif 71 #ifndef DISABLE_MON_CONFIG 72 uint32_t (*mon_process)(struct dp_soc *soc, 73 struct dp_intr *int_ctx, 74 uint32_t mac_id, 75 uint32_t quota); 76 #endif 77 void (*mon_peer_tx_init)(struct dp_pdev *pdev, struct dp_peer *peer); 78 void (*mon_peer_tx_cleanup)(struct dp_vdev *vdev, 79 struct dp_peer *peer); 80 #ifdef WLAN_TX_PKT_CAPTURE_ENH 81 void (*mon_peer_tid_peer_id_update)(struct dp_peer *peer, 82 uint16_t peer_id); 83 void (*mon_tx_ppdu_stats_attach)(struct dp_pdev *pdev); 84 void (*mon_tx_ppdu_stats_detach)(struct dp_pdev *pdev); 85 QDF_STATUS (*mon_tx_capture_debugfs_init)(struct dp_pdev *pdev); 86 void (*mon_peer_tx_capture_filter_check)(struct dp_pdev *pdev, 87 struct dp_peer *peer); 88 QDF_STATUS (*mon_tx_add_to_comp_queue)(struct dp_soc *soc, 89 struct dp_tx_desc_s *desc, 90 struct hal_tx_completion_status *ts, 91 struct dp_peer *peer); 92 QDF_STATUS (*mon_update_msdu_to_list)(struct dp_soc *soc, 93 struct dp_pdev *pdev, 94 struct dp_peer *peer, 95 struct hal_tx_completion_status *ts, 96 qdf_nbuf_t netbuf); 97 #endif 98 #if defined(WDI_EVENT_ENABLE) &&\ 99 (defined(QCA_ENHANCED_STATS_SUPPORT) || !defined(REMOVE_PKT_LOG)) 100 bool (*mon_ppdu_stats_ind_handler)(struct htt_soc *soc, 101 uint32_t *msg_word, 102 qdf_nbuf_t htt_t2h_msg); 103 #endif 104 QDF_STATUS (*mon_htt_ppdu_stats_attach)(struct dp_pdev *pdev); 105 void (*mon_htt_ppdu_stats_detach)(struct dp_pdev *pdev); 106 void (*mon_print_pdev_rx_mon_stats)(struct dp_pdev *pdev); 107 108 #ifdef WLAN_TX_PKT_CAPTURE_ENH 109 void (*mon_print_pdev_tx_capture_stats)(struct dp_pdev *pdev); 110 QDF_STATUS (*mon_config_enh_tx_capture)(struct dp_pdev *pdev, 111 uint8_t val); 112 #endif 113 #ifdef WLAN_RX_PKT_CAPTURE_ENH 114 QDF_STATUS (*mon_config_enh_rx_capture)(struct dp_pdev *pdev, 115 uint8_t val); 116 #endif 117 #ifdef QCA_SUPPORT_BPR 118 QDF_STATUS (*mon_set_bpr_enable)(struct dp_pdev *pdev, int val); 119 #endif 120 #ifdef ATH_SUPPORT_NAC 121 int (*mon_set_filter_neigh_peers)(struct dp_pdev *pdev, bool val); 122 #endif 123 #ifdef WLAN_ATF_ENABLE 124 void (*mon_set_atf_stats_enable)(struct dp_pdev *pdev, bool value); 125 #endif 126 void (*mon_set_bsscolor)(struct dp_pdev *pdev, uint8_t bsscolor); 127 bool (*mon_pdev_get_filter_ucast_data)(struct cdp_pdev *pdev_handle); 128 bool (*mon_pdev_get_filter_non_data)(struct cdp_pdev *pdev_handle); 129 bool (*mon_pdev_get_filter_mcast_data)(struct cdp_pdev *pdev_handle); 130 #ifdef WDI_EVENT_ENABLE 131 int (*mon_set_pktlog_wifi3)(struct dp_pdev *pdev, uint32_t event, 132 bool enable); 133 #endif 134 #if defined(DP_CON_MON) && !defined(REMOVE_PKT_LOG) 135 void (*mon_pktlogmod_exit)(struct dp_pdev *pdev); 136 #endif 137 void (*mon_vdev_set_monitor_mode_buf_rings)(struct dp_pdev *pdev); 138 void (*mon_neighbour_peers_detach)(struct dp_pdev *pdev); 139 #ifdef FEATURE_NAC_RSSI 140 QDF_STATUS (*mon_filter_neighbour_peer)(struct dp_pdev *pdev, 141 uint8_t *rx_pkt_hdr); 142 #endif 143 void (*mon_vdev_timer_init)(struct dp_soc *soc); 144 void (*mon_vdev_timer_start)(struct dp_soc *soc); 145 bool (*mon_vdev_timer_stop)(struct dp_soc *soc); 146 void (*mon_vdev_timer_deinit)(struct dp_soc *soc); 147 void (*mon_reap_timer_init)(struct dp_soc *soc); 148 void (*mon_reap_timer_start)(struct dp_soc *soc); 149 bool (*mon_reap_timer_stop)(struct dp_soc *soc); 150 void (*mon_reap_timer_deinit)(struct dp_soc *soc); 151 #ifdef QCA_MCOPY_SUPPORT 152 QDF_STATUS (*mon_mcopy_check_deliver)(struct dp_pdev *pdev, 153 uint16_t peer_id, 154 uint32_t ppdu_id, 155 uint8_t first_msdu); 156 #endif 157 void (*mon_neighbour_peer_add_ast)(struct dp_pdev *pdev, 158 struct dp_peer *ta_peer, 159 uint8_t *mac_addr, 160 qdf_nbuf_t nbuf, 161 uint32_t flags); 162 }; 163 164 struct dp_mon_soc { 165 /* Holds all monitor related fields extracted from dp_soc */ 166 /* Holds pointer to monitor ops */ 167 /* monitor link descriptor pages */ 168 struct qdf_mem_multi_page_t mon_link_desc_pages[MAX_NUM_LMAC_HW]; 169 170 /* total link descriptors for monitor mode for each radio */ 171 uint32_t total_mon_link_descs[MAX_NUM_LMAC_HW]; 172 173 /* Monitor Link descriptor memory banks */ 174 struct link_desc_bank 175 mon_link_desc_banks[MAX_NUM_LMAC_HW][MAX_MON_LINK_DESC_BANKS]; 176 uint32_t num_mon_link_desc_banks[MAX_NUM_LMAC_HW]; 177 /* Smart monitor capability for HKv2 */ 178 uint8_t hw_nac_monitor_support; 179 180 /* Full monitor mode support */ 181 bool full_mon_mode; 182 183 /*interrupt timer*/ 184 qdf_timer_t mon_reap_timer; 185 uint8_t reap_timer_init; 186 187 qdf_timer_t mon_vdev_timer; 188 uint8_t mon_vdev_timer_state; 189 190 struct dp_mon_ops *mon_ops; 191 bool monitor_mode_v2; 192 }; 193 194 struct dp_mon_pdev { 195 /* monitor */ 196 bool monitor_configured; 197 198 struct dp_mon_filter **filter; /* Monitor Filter pointer */ 199 200 /* advance filter mode and type*/ 201 uint8_t mon_filter_mode; 202 uint16_t fp_mgmt_filter; 203 uint16_t fp_ctrl_filter; 204 uint16_t fp_data_filter; 205 uint16_t mo_mgmt_filter; 206 uint16_t mo_ctrl_filter; 207 uint16_t mo_data_filter; 208 uint16_t md_data_filter; 209 210 #ifdef WLAN_TX_PKT_CAPTURE_ENH 211 struct dp_pdev_tx_capture tx_capture; 212 #endif 213 214 /* tx packet capture enhancement */ 215 enum cdp_tx_enh_capture_mode tx_capture_enabled; 216 /* Stuck count on monitor destination ring MPDU process */ 217 uint32_t mon_dest_ring_stuck_cnt; 218 /* monitor mode lock */ 219 qdf_spinlock_t mon_lock; 220 221 /* Monitor mode operation channel */ 222 int mon_chan_num; 223 224 /* Monitor mode operation frequency */ 225 qdf_freq_t mon_chan_freq; 226 227 /* Monitor mode band */ 228 enum reg_wifi_band mon_chan_band; 229 230 uint32_t mon_ppdu_status; 231 /* monitor mode status/destination ring PPDU and MPDU count */ 232 struct cdp_pdev_mon_stats rx_mon_stats; 233 /* Monitor mode interface and status storage */ 234 struct dp_vdev *mvdev; 235 struct cdp_mon_status rx_mon_recv_status; 236 /* to track duplicate link descriptor indications by HW for a WAR */ 237 uint64_t mon_last_linkdesc_paddr; 238 /* to track duplicate buffer indications by HW for a WAR */ 239 uint32_t mon_last_buf_cookie; 240 241 #ifdef QCA_SUPPORT_FULL_MON 242 /* List to maintain all MPDUs for a PPDU in monitor mode */ 243 TAILQ_HEAD(, dp_mon_mpdu) mon_mpdu_q; 244 245 /* TODO: define per-user mpdu list 246 * struct dp_mon_mpdu_list mpdu_list[MAX_MU_USERS]; 247 */ 248 struct hal_rx_mon_desc_info *mon_desc; 249 #endif 250 /* Flag to hold on to monitor destination ring */ 251 bool hold_mon_dest_ring; 252 253 /* Flag to inidicate monitor rings are initialized */ 254 uint8_t pdev_mon_init; 255 #ifndef REMOVE_PKT_LOG 256 bool pkt_log_init; 257 struct pktlog_dev_t *pl_dev; /* Pktlog pdev */ 258 #endif /* #ifndef REMOVE_PKT_LOG */ 259 260 /* Smart Mesh */ 261 bool filter_neighbour_peers; 262 263 /*flag to indicate neighbour_peers_list not empty */ 264 bool neighbour_peers_added; 265 /* smart mesh mutex */ 266 qdf_spinlock_t neighbour_peer_mutex; 267 /* Neighnour peer list */ 268 TAILQ_HEAD(, dp_neighbour_peer) neighbour_peers_list; 269 /* Enhanced Stats is enabled */ 270 bool enhanced_stats_en; 271 qdf_nbuf_queue_t rx_status_q; 272 273 /* 128 bytes mpdu header queue per user for ppdu */ 274 qdf_nbuf_queue_t mpdu_q[MAX_MU_USERS]; 275 276 /* is this a mpdu header TLV and not msdu header TLV */ 277 bool is_mpdu_hdr[MAX_MU_USERS]; 278 279 /* per user 128 bytes msdu header list for MPDU */ 280 struct msdu_list msdu_list[MAX_MU_USERS]; 281 282 /* RX enhanced capture mode */ 283 uint8_t rx_enh_capture_mode; 284 /* Rx per peer enhanced capture mode */ 285 bool rx_enh_capture_peer; 286 struct dp_vdev *rx_enh_monitor_vdev; 287 /* RX enhanced capture trailer enable/disable flag */ 288 bool is_rx_enh_capture_trailer_enabled; 289 #ifdef WLAN_RX_PKT_CAPTURE_ENH 290 /* RX per MPDU/PPDU information */ 291 struct cdp_rx_indication_mpdu mpdu_ind; 292 #endif 293 294 /* Packet log mode */ 295 uint8_t rx_pktlog_mode; 296 /* Enable pktlog logging cbf */ 297 bool rx_pktlog_cbf; 298 299 bool tx_sniffer_enable; 300 /* mirror copy mode */ 301 enum m_copy_mode mcopy_mode; 302 bool enable_reap_timer_non_pkt; 303 bool bpr_enable; 304 /* Pdev level flag to check peer based pktlog enabled or 305 * disabled 306 */ 307 uint8_t dp_peer_based_pktlog; 308 309 #ifdef WLAN_ATF_ENABLE 310 /* ATF stats enable */ 311 bool dp_atf_stats_enable; 312 #endif 313 314 /* Maintains first status buffer's paddr of a PPDU */ 315 uint64_t status_buf_addr; 316 struct hal_rx_ppdu_info ppdu_info; 317 318 /* ppdu_id of last received HTT TX stats */ 319 uint32_t last_ppdu_id; 320 struct { 321 uint8_t last_user; 322 qdf_nbuf_t buf; 323 } tx_ppdu_info; 324 325 struct { 326 uint32_t tx_ppdu_id; 327 uint16_t tx_peer_id; 328 uint32_t rx_ppdu_id; 329 } m_copy_id; 330 331 /* To check if PPDU Tx stats are enabled for Pktlog */ 332 bool pktlog_ppdu_stats; 333 334 #ifdef ATH_SUPPORT_NAC_RSSI 335 bool nac_rssi_filtering; 336 #endif 337 338 /* ppdu_stats lock for queue concurrency between cores*/ 339 qdf_spinlock_t ppdu_stats_lock; 340 341 /* list of ppdu tlvs */ 342 TAILQ_HEAD(, ppdu_info) ppdu_info_list; 343 TAILQ_HEAD(, ppdu_info) sched_comp_ppdu_list; 344 345 uint32_t sched_comp_list_depth; 346 uint16_t delivered_sched_cmdid; 347 uint16_t last_sched_cmdid; 348 uint32_t tlv_count; 349 uint32_t list_depth; 350 351 struct { 352 qdf_nbuf_t last_nbuf; /*Ptr to mgmt last buf */ 353 uint8_t *mgmt_buf; /* Ptr to mgmt. payload in HTT ppdu stats */ 354 uint32_t mgmt_buf_len; /* Len of mgmt. payload in ppdu stats */ 355 uint32_t ppdu_id; 356 } mgmtctrl_frm_info; 357 /* Context of cal client timer */ 358 struct cdp_cal_client *cal_client_ctx; 359 uint32_t *ppdu_tlv_buf; /* Buffer to hold HTT ppdu stats TLVs*/ 360 361 qdf_nbuf_t mcopy_status_nbuf; 362 bool is_dp_mon_pdev_initialized; 363 /* indicates if spcl vap is configured */ 364 bool scan_spcl_vap_configured; 365 #ifdef QCA_SUPPORT_SCAN_SPCL_VAP_STATS 366 /* enable spcl vap stats reset on ch change */ 367 bool reset_scan_spcl_vap_stats_enable; 368 #endif 369 }; 370 371 struct dp_mon_vdev { 372 /* callback to hand rx monitor 802.11 MPDU to the OS shim */ 373 ol_txrx_rx_mon_fp osif_rx_mon; 374 #ifdef QCA_SUPPORT_SCAN_SPCL_VAP_STATS 375 struct cdp_scan_spcl_vap_stats *scan_spcl_vap_stats; 376 #endif 377 }; 378 379 struct dp_mon_peer { 380 #ifdef WLAN_TX_PKT_CAPTURE_ENH 381 struct dp_peer_tx_capture tx_capture; 382 #endif 383 #ifdef FEATURE_PERPKT_INFO 384 /* delayed ba ppdu stats handling */ 385 struct cdp_delayed_tx_completion_ppdu_user delayed_ba_ppdu_stats; 386 /* delayed ba flag */ 387 bool last_delayed_ba; 388 /* delayed ba ppdu id */ 389 uint32_t last_delayed_ba_ppduid; 390 #endif 391 }; 392 393 #if defined(QCA_TX_CAPTURE_SUPPORT) || defined(QCA_ENHANCED_STATS_SUPPORT) 394 void dp_deliver_mgmt_frm(struct dp_pdev *pdev, qdf_nbuf_t nbuf); 395 #else 396 static inline 397 void dp_deliver_mgmt_frm(struct dp_pdev *pdev, qdf_nbuf_t nbuf) 398 { 399 } 400 #endif 401 402 #if defined(WLAN_SUPPORT_RX_PROTOCOL_TYPE_TAG) ||\ 403 defined(WLAN_SUPPORT_RX_FLOW_TAG) 404 /** 405 * dp_rx_mon_update_protocol_flow_tag() - Performs necessary checks for monitor 406 * mode and then tags appropriate packets 407 * @soc: core txrx main context 408 * @vdev: pdev on which packet is received 409 * @msdu: QDF packet buffer on which the protocol tag should be set 410 * @rx_desc: base address where the RX TLVs start 411 * Return: void 412 */ 413 void dp_rx_mon_update_protocol_flow_tag(struct dp_soc *soc, 414 struct dp_pdev *dp_pdev, 415 qdf_nbuf_t msdu, void *rx_desc); 416 #endif /* WLAN_SUPPORT_RX_PROTOCOL_TYPE_TAG || WLAN_SUPPORT_RX_FLOW_TAG */ 417 418 #if !defined(WLAN_SUPPORT_RX_PROTOCOL_TYPE_TAG) &&\ 419 !defined(WLAN_SUPPORT_RX_FLOW_TAG) 420 /** 421 * dp_rx_mon_update_protocol_flow_tag() - Performs necessary checks for monitor 422 * mode and then tags appropriate packets 423 * @soc: core txrx main context 424 * @vdev: pdev on which packet is received 425 * @msdu: QDF packet buffer on which the protocol tag should be set 426 * @rx_desc: base address where the RX TLVs start 427 * Return: void 428 */ 429 static inline 430 void dp_rx_mon_update_protocol_flow_tag(struct dp_soc *soc, 431 struct dp_pdev *dp_pdev, 432 qdf_nbuf_t msdu, void *rx_desc) 433 { 434 } 435 #endif /* WLAN_SUPPORT_RX_PROTOCOL_TYPE_TAG || WLAN_SUPPORT_RX_FLOW_TAG */ 436 437 #ifndef WLAN_TX_PKT_CAPTURE_ENH 438 static inline 439 QDF_STATUS dp_peer_set_tx_capture_enabled(struct dp_pdev *pdev, 440 struct dp_peer *peer_handle, 441 uint8_t value, uint8_t *peer_mac) 442 { 443 return QDF_STATUS_SUCCESS; 444 } 445 446 /** 447 * dp_peer_tid_queue_init() – Initialize ppdu stats queue per TID 448 * @peer: Datapath peer 449 * 450 */ 451 static inline void dp_peer_tid_queue_init(struct dp_peer *peer) 452 { 453 } 454 455 /** 456 * dp_peer_tid_queue_cleanup() – remove ppdu stats queue per TID 457 * @peer: Datapath peer 458 * 459 */ 460 static inline void dp_peer_tid_queue_cleanup(struct dp_peer *peer) 461 { 462 } 463 464 /** 465 * dp_peer_update_80211_hdr() – dp peer update 80211 hdr 466 * @vdev: Datapath vdev 467 * @peer: Datapath peer 468 * 469 */ 470 static inline void 471 dp_peer_update_80211_hdr(struct dp_vdev *vdev, struct dp_peer *peer) 472 { 473 } 474 475 /** 476 * dp_tx_ppdu_stats_attach - Initialize Tx PPDU stats and enhanced capture 477 * @pdev: DP PDEV 478 * 479 * Return: none 480 */ 481 static inline void dp_tx_ppdu_stats_attach(struct dp_pdev *pdev) 482 { 483 } 484 485 /** 486 * dp_tx_ppdu_stats_detach - Cleanup Tx PPDU stats and enhanced capture 487 * @pdev: DP PDEV 488 * 489 * Return: none 490 */ 491 static inline void dp_tx_ppdu_stats_detach(struct dp_pdev *pdev) 492 { 493 } 494 495 /** 496 * dp_tx_add_to_comp_queue() - add completion msdu to queue 497 * @soc: DP Soc handle 498 * @tx_desc: software Tx descriptor 499 * @ts : Tx completion status from HAL/HTT descriptor 500 * @peer: DP peer 501 * 502 * Return: none 503 */ 504 static inline 505 QDF_STATUS dp_tx_add_to_comp_queue(struct dp_soc *soc, 506 struct dp_tx_desc_s *desc, 507 struct hal_tx_completion_status *ts, 508 struct dp_peer *peer) 509 { 510 return QDF_STATUS_E_FAILURE; 511 } 512 513 /** 514 * dp_update_msdu_to_list(): Function to queue msdu from wbm 515 * @pdev: dp_pdev 516 * @peer: dp_peer 517 * @ts: hal tx completion status 518 * @netbuf: msdu 519 * 520 * return: status 521 */ 522 static inline 523 QDF_STATUS dp_update_msdu_to_list(struct dp_soc *soc, 524 struct dp_pdev *pdev, 525 struct dp_peer *peer, 526 struct hal_tx_completion_status *ts, 527 qdf_nbuf_t netbuf) 528 { 529 return QDF_STATUS_E_FAILURE; 530 } 531 532 /* 533 * dp_peer_tx_capture_filter_check: check filter is enable for the filter 534 * and update tx_cap_enabled flag 535 * @pdev: DP PDEV handle 536 * @peer: DP PEER handle 537 * 538 * return: void 539 */ 540 static inline 541 void dp_peer_tx_capture_filter_check(struct dp_pdev *pdev, 542 struct dp_peer *peer) 543 { 544 } 545 546 /* 547 * dp_tx_capture_debugfs_init: tx capture debugfs init 548 * @pdev: DP PDEV handle 549 * 550 * return: QDF_STATUS 551 */ 552 static inline 553 QDF_STATUS dp_tx_capture_debugfs_init(struct dp_pdev *pdev) 554 { 555 return QDF_STATUS_E_FAILURE; 556 } 557 #endif 558 559 #ifdef WLAN_TX_PKT_CAPTURE_ENH 560 extern uint8_t 561 dp_cpu_ring_map[DP_NSS_CPU_RING_MAP_MAX][WLAN_CFG_INT_NUM_CONTEXTS_MAX]; 562 #endif 563 564 int 565 dp_htt_get_ppdu_sniffer_ampdu_tlv_bitmap(uint32_t bitmap); 566 /** 567 * dp_ppdu_desc_user_stats_update(): Function to update TX user stats 568 * @pdev: DP pdev handle 569 * @ppdu_info: per PPDU TLV descriptor 570 * 571 * return: void 572 */ 573 void 574 dp_ppdu_desc_user_stats_update(struct dp_pdev *pdev, 575 struct ppdu_info *ppdu_info); 576 577 #ifdef WDI_EVENT_ENABLE 578 void dp_pkt_log_init(struct cdp_soc_t *soc_hdl, uint8_t pdev_id, void *scn); 579 #else 580 static inline void 581 dp_pkt_log_init(struct cdp_soc_t *soc_hdl, uint8_t pdev_id, void *scn) 582 { 583 } 584 #endif 585 586 #ifdef WDI_EVENT_ENABLE 587 QDF_STATUS dp_peer_stats_notify(struct dp_pdev *pdev, struct dp_peer *peer); 588 #else 589 static inline QDF_STATUS dp_peer_stats_notify(struct dp_pdev *pdev, 590 struct dp_peer *peer) 591 { 592 return QDF_STATUS_SUCCESS; 593 } 594 #endif 595 596 #ifndef WLAN_TX_PKT_CAPTURE_ENH 597 /** 598 * dp_tx_ppdu_stats_process - Deferred PPDU stats handler 599 * @context: Opaque work context (PDEV) 600 * 601 * Return: none 602 */ 603 static inline void dp_tx_ppdu_stats_process(void *context) 604 { 605 } 606 607 /* 608 * dp_tx_capture_htt_frame_counter: increment counter for htt_frame_type 609 * pdev: DP pdev handle 610 * htt_frame_type: htt frame type received from fw 611 * 612 * return: void 613 */ 614 static inline 615 void dp_tx_capture_htt_frame_counter(struct dp_pdev *pdev, 616 uint32_t htt_frame_type) 617 { 618 } 619 620 /* 621 * dp_tx_cature_stats: print tx capture stats 622 * @pdev: DP PDEV handle 623 * 624 * return: void 625 */ 626 static inline 627 void dp_print_pdev_tx_capture_stats(struct dp_pdev *pdev) 628 { 629 } 630 #endif 631 632 /** 633 * dp_rx_cookie_2_mon_link_desc_va() - Converts cookie to a virtual address of 634 * the MSDU Link Descriptor 635 * @pdev: core txrx pdev context 636 * @buf_info: buf_info includes cookie that used to lookup virtual address of 637 * link descriptor. Normally this is just an index into a per pdev array. 638 * 639 * This is the VA of the link descriptor in monitor mode destination ring, 640 * that HAL layer later uses to retrieve the list of MSDU's for a given MPDU. 641 * 642 * Return: void *: Virtual Address of the Rx descriptor 643 */ 644 static inline 645 void *dp_rx_cookie_2_mon_link_desc_va(struct dp_pdev *pdev, 646 struct hal_buf_info *buf_info, 647 int mac_id) 648 { 649 void *link_desc_va; 650 struct qdf_mem_multi_page_t *pages; 651 uint16_t page_id = LINK_DESC_COOKIE_PAGE_ID(buf_info->sw_cookie); 652 struct dp_mon_soc *mon_soc = pdev->soc->monitor_soc; 653 654 if (!mon_soc) 655 return NULL; 656 657 pages = &mon_soc->mon_link_desc_pages[mac_id]; 658 if (!pages) 659 return NULL; 660 661 if (qdf_unlikely(page_id >= pages->num_pages)) 662 return NULL; 663 664 link_desc_va = pages->dma_pages[page_id].page_v_addr_start + 665 (buf_info->paddr - pages->dma_pages[page_id].page_p_addr); 666 667 return link_desc_va; 668 } 669 670 /** 671 * dp_soc_is_full_mon_enable () - Return if full monitor mode is enabled 672 * @soc: DP soc handle 673 * 674 * Return: Full monitor mode status 675 */ 676 static inline bool dp_soc_is_full_mon_enable(struct dp_pdev *pdev) 677 { 678 return (pdev->soc->monitor_soc->full_mon_mode && 679 pdev->monitor_pdev->monitor_configured) ? true : false; 680 } 681 682 /* 683 * dp_mon_is_enable_reap_timer_non_pkt() - check if mon reap timer is 684 * enabled by non-pkt log or not 685 * @pdev: point to dp pdev 686 * 687 * Return: true if mon reap timer is enabled by non-pkt log 688 */ 689 static inline bool dp_mon_is_enable_reap_timer_non_pkt(struct dp_pdev *pdev) 690 { 691 if (qdf_unlikely(!pdev || !pdev->monitor_pdev)) 692 return false; 693 694 return pdev->monitor_pdev->enable_reap_timer_non_pkt; 695 } 696 697 /* 698 * dp_monitor_is_enable_mcopy_mode() - check if mcopy mode is enabled 699 * @pdev: point to dp pdev 700 * 701 * Return: true if mcopy mode is enabled 702 */ 703 static inline bool dp_monitor_is_enable_mcopy_mode(struct dp_pdev *pdev) 704 { 705 if (qdf_unlikely(!pdev || !pdev->monitor_pdev)) 706 return false; 707 708 return pdev->monitor_pdev->mcopy_mode; 709 } 710 711 /* 712 * dp_monitor_is_enable_tx_sniffer() - check if tx sniffer is enabled 713 * @pdev: point to dp pdev 714 * 715 * Return: true if tx sniffer is enabled 716 */ 717 static inline bool dp_monitor_is_enable_tx_sniffer(struct dp_pdev *pdev) 718 { 719 if (qdf_unlikely(!pdev || !pdev->monitor_pdev)) 720 return false; 721 722 return pdev->monitor_pdev->tx_sniffer_enable; 723 } 724 725 /* 726 * dp_monitor_is_set_monitor_configured() - check if monitor configured is set 727 * @pdev: point to dp pdev 728 * 729 * Return: true if monitor configured is set 730 */ 731 static inline bool dp_monitor_is_configured(struct dp_pdev *pdev) 732 { 733 if (qdf_unlikely(!pdev || !pdev->monitor_pdev)) 734 return false; 735 736 return pdev->monitor_pdev->monitor_configured; 737 } 738 739 /* 740 * dp_monitor_check_com_info_ppdu_id() - check if msdu ppdu_id matches with 741 * com info ppdu_id 742 * @pdev: point to dp pdev 743 * @rx_desc: point to rx_desc 744 * 745 * Return: success if ppdu_id matches 746 */ 747 static inline QDF_STATUS dp_monitor_check_com_info_ppdu_id(struct dp_pdev *pdev, 748 void *rx_desc) 749 { 750 struct cdp_mon_status *rs; 751 struct dp_mon_pdev *mon_pdev; 752 uint32_t msdu_ppdu_id = 0; 753 754 if (qdf_unlikely(!pdev || !pdev->monitor_pdev)) 755 return QDF_STATUS_E_FAILURE; 756 757 mon_pdev = pdev->monitor_pdev; 758 if (qdf_likely(1 != mon_pdev->ppdu_info.rx_status.rxpcu_filter_pass)) 759 return QDF_STATUS_E_FAILURE; 760 761 rs = &pdev->monitor_pdev->rx_mon_recv_status; 762 if (!rs || rs->cdp_rs_rxdma_err) 763 return QDF_STATUS_E_FAILURE; 764 765 msdu_ppdu_id = hal_rx_get_ppdu_id(pdev->soc->hal_soc, rx_desc); 766 if (msdu_ppdu_id != mon_pdev->ppdu_info.com_info.ppdu_id) { 767 QDF_TRACE(QDF_MODULE_ID_DP, 768 QDF_TRACE_LEVEL_ERROR, 769 "msdu_ppdu_id=%x,com_info.ppdu_id=%x", 770 msdu_ppdu_id, 771 mon_pdev->ppdu_info.com_info.ppdu_id); 772 return QDF_STATUS_E_FAILURE; 773 } 774 775 return QDF_STATUS_SUCCESS; 776 } 777 778 /* 779 * dp_monitor_get_rx_status() - get rx status 780 * @pdev: point to dp pdev 781 * 782 * Return: return rx status pointer 783 */ 784 static inline struct mon_rx_status* 785 dp_monitor_get_rx_status(struct dp_pdev *pdev) 786 { 787 if (qdf_unlikely(!pdev || !pdev->monitor_pdev)) 788 return NULL; 789 790 return &pdev->monitor_pdev->ppdu_info.rx_status; 791 } 792 793 /* 794 * dp_monitor_is_chan_band_known() - check if monitor chan band known 795 * @pdev: point to dp pdev 796 * 797 * Return: true if chan band known 798 */ 799 static inline bool dp_monitor_is_chan_band_known(struct dp_pdev *pdev) 800 { 801 if (qdf_unlikely(!pdev || !pdev->monitor_pdev)) 802 return false; 803 804 if (pdev->monitor_pdev->mon_chan_band != REG_BAND_UNKNOWN) 805 return true; 806 807 return false; 808 } 809 810 /* 811 * dp_monitor_get_chan_band() - get chan band 812 * @pdev: point to dp pdev 813 * 814 * Return: wifi channel band 815 */ 816 static inline enum reg_wifi_band 817 dp_monitor_get_chan_band(struct dp_pdev *pdev) 818 { 819 return pdev->monitor_pdev->mon_chan_band; 820 } 821 822 /* 823 * dp_monitor_print_tx_stats() - print tx stats from monitor pdev 824 * @pdev: point to dp pdev 825 * 826 */ 827 static inline void dp_monitor_print_tx_stats(struct dp_pdev *pdev) 828 { 829 if (qdf_unlikely(!pdev || !pdev->monitor_pdev)) 830 return; 831 832 DP_PRINT_STATS("ppdu info schedule completion list depth: %d", 833 pdev->monitor_pdev->sched_comp_list_depth); 834 DP_PRINT_STATS("delivered sched cmdid: %d", 835 pdev->monitor_pdev->delivered_sched_cmdid); 836 DP_PRINT_STATS("cur sched cmdid: %d", 837 pdev->monitor_pdev->last_sched_cmdid); 838 DP_PRINT_STATS("ppdu info list depth: %d", 839 pdev->monitor_pdev->list_depth); 840 } 841 842 /* 843 * dp_monitor_set_chan_num() - set channel number 844 * @pdev: point to dp pdev 845 * @chan_num: channel number 846 * 847 */ 848 static inline void dp_monitor_set_chan_num(struct dp_pdev *pdev, int chan_num) 849 { 850 if (qdf_unlikely(!pdev || !pdev->monitor_pdev)) 851 return; 852 853 pdev->monitor_pdev->mon_chan_num = chan_num; 854 } 855 856 /* 857 * dp_monitor_set_chan_freq() - set channel frequency 858 * @pdev: point to dp pdev 859 * @chan_freq: channel frequency 860 * 861 */ 862 static inline void 863 dp_monitor_set_chan_freq(struct dp_pdev *pdev, qdf_freq_t chan_freq) 864 { 865 if (qdf_unlikely(!pdev || !pdev->monitor_pdev)) 866 return; 867 868 pdev->monitor_pdev->mon_chan_freq = chan_freq; 869 } 870 871 /* 872 * dp_monitor_set_chan_band() - set channel band 873 * @pdev: point to dp pdev 874 * @chan_band: channel band 875 * 876 */ 877 static inline void 878 dp_monitor_set_chan_band(struct dp_pdev *pdev, enum reg_wifi_band chan_band) 879 { 880 if (qdf_unlikely(!pdev || !pdev->monitor_pdev)) 881 return; 882 883 pdev->monitor_pdev->mon_chan_band = chan_band; 884 } 885 886 /* 887 * dp_monitor_get_mpdu_status() - get mpdu status 888 * @pdev: point to dp pdev 889 * @soc: point to dp soc 890 * @rx_tlv_hdr: point to rx tlv header 891 * 892 */ 893 static inline void dp_monitor_get_mpdu_status(struct dp_pdev *pdev, 894 struct dp_soc *soc, 895 uint8_t *rx_tlv_hdr) 896 { 897 struct dp_mon_pdev *mon_pdev; 898 899 if (qdf_unlikely(!pdev || !pdev->monitor_pdev)) 900 return; 901 902 mon_pdev = pdev->monitor_pdev; 903 hal_rx_mon_hw_desc_get_mpdu_status(soc->hal_soc, rx_tlv_hdr, 904 &mon_pdev->ppdu_info.rx_status); 905 } 906 907 #ifdef FEATURE_NAC_RSSI 908 /* 909 * dp_monitor_drop_inv_peer_pkts() - drop invalid peer pkts 910 * @vdev: point to dp vdev 911 * 912 * Return: success if sta mode and filter for neighbour peers enabled 913 */ 914 static inline QDF_STATUS dp_monitor_drop_inv_peer_pkts(struct dp_vdev *vdev) 915 { 916 struct dp_pdev *pdev = vdev->pdev; 917 struct dp_soc *soc = pdev->soc; 918 919 if (!soc->monitor_soc) 920 return QDF_STATUS_E_FAILURE; 921 922 if (!soc->monitor_soc->hw_nac_monitor_support && 923 pdev->monitor_pdev->filter_neighbour_peers && 924 vdev->opmode == wlan_op_mode_sta) 925 return QDF_STATUS_SUCCESS; 926 927 return QDF_STATUS_E_FAILURE; 928 } 929 #endif 930 931 /* 932 * dp_peer_ppdu_delayed_ba_init() - Initialize ppdu in peer 933 * @peer: Datapath peer 934 * 935 * return: void 936 */ 937 #ifdef FEATURE_PERPKT_INFO 938 static inline void dp_peer_ppdu_delayed_ba_init(struct dp_peer *peer) 939 { 940 struct dp_mon_peer *mon_peer = peer->monitor_peer; 941 942 if (!mon_peer) 943 return; 944 945 qdf_mem_zero(&mon_peer->delayed_ba_ppdu_stats, 946 sizeof(struct cdp_delayed_tx_completion_ppdu_user)); 947 mon_peer->last_delayed_ba = false; 948 mon_peer->last_delayed_ba_ppduid = 0; 949 } 950 #else 951 static inline void dp_peer_ppdu_delayed_ba_init(struct dp_peer *peer) 952 { 953 } 954 #endif 955 956 /* 957 * dp_monitor_vdev_register_osif() - Register osif rx mon 958 * @vdev: point to vdev 959 * @txrx_ops: point to ol txrx ops 960 * 961 * Return: void 962 */ 963 static inline void dp_monitor_vdev_register_osif(struct dp_vdev *vdev, 964 struct ol_txrx_ops *txrx_ops) 965 { 966 if (!vdev->monitor_vdev) 967 return; 968 969 vdev->monitor_vdev->osif_rx_mon = txrx_ops->rx.mon; 970 } 971 972 /* 973 * dp_monitor_get_monitor_vdev_from_pdev() - Get monitor vdev 974 * @pdev: point to pdev 975 * 976 * Return: pointer to vdev 977 */ 978 static inline struct dp_vdev* 979 dp_monitor_get_monitor_vdev_from_pdev(struct dp_pdev *pdev) 980 { 981 if (!pdev || !pdev->monitor_pdev || !pdev->monitor_pdev->mvdev) 982 return NULL; 983 984 return pdev->monitor_pdev->mvdev; 985 } 986 987 /* 988 * dp_monitor_is_vdev_timer_running() - Get vdev timer status 989 * @soc: point to soc 990 * 991 * Return: true if timer running 992 */ 993 static inline bool dp_monitor_is_vdev_timer_running(struct dp_soc *soc) 994 { 995 if (qdf_unlikely(!soc || !soc->monitor_soc)) 996 return false; 997 998 return !!(soc->monitor_soc->mon_vdev_timer_state & 999 MON_VDEV_TIMER_RUNNING); 1000 } 1001 1002 /* 1003 * dp_monitor_get_link_desc_pages() - Get link desc pages 1004 * @soc: point to soc 1005 * @mac_id: mac id 1006 * 1007 * Return: return point to link desc pages 1008 */ 1009 static inline struct qdf_mem_multi_page_t* 1010 dp_monitor_get_link_desc_pages(struct dp_soc *soc, uint32_t mac_id) 1011 { 1012 if (qdf_unlikely(!soc || !soc->monitor_soc)) 1013 return NULL; 1014 1015 return &soc->monitor_soc->mon_link_desc_pages[mac_id]; 1016 } 1017 1018 /* 1019 * dp_monitor_get_total_link_descs() - Get total link descs 1020 * @soc: point to soc 1021 * @mac_id: mac id 1022 * 1023 * Return: return point total link descs 1024 */ 1025 static inline uint32_t * 1026 dp_monitor_get_total_link_descs(struct dp_soc *soc, uint32_t mac_id) 1027 { 1028 return &soc->monitor_soc->total_mon_link_descs[mac_id]; 1029 } 1030 1031 /* 1032 * dp_monitor_pdev_attach() - Monitor pdev attach 1033 * @pdev: point to pdev 1034 * 1035 * Return: return QDF_STATUS 1036 */ 1037 static inline QDF_STATUS dp_monitor_pdev_attach(struct dp_pdev *pdev) 1038 { 1039 struct dp_mon_ops *monitor_ops; 1040 struct dp_mon_soc *mon_soc = pdev->soc->monitor_soc; 1041 1042 /* 1043 * mon_soc uninitialized modular support enabled 1044 * monitor related attach/detach/init/deinit 1045 * will be done while monitor insmod 1046 */ 1047 if (!mon_soc) 1048 return QDF_STATUS_SUCCESS; 1049 1050 monitor_ops = mon_soc->mon_ops; 1051 if (!monitor_ops || !monitor_ops->mon_pdev_attach) { 1052 dp_mon_debug("callback not registered"); 1053 return QDF_STATUS_E_FAILURE; 1054 } 1055 1056 return monitor_ops->mon_pdev_attach(pdev); 1057 } 1058 1059 /* 1060 * dp_monitor_pdev_detach() - Monitor pdev detach 1061 * @pdev: point to pdev 1062 * 1063 * Return: return QDF_STATUS 1064 */ 1065 static inline QDF_STATUS dp_monitor_pdev_detach(struct dp_pdev *pdev) 1066 { 1067 struct dp_mon_ops *monitor_ops; 1068 struct dp_mon_soc *mon_soc = pdev->soc->monitor_soc; 1069 1070 /* 1071 * mon_soc uninitialized modular support enabled 1072 * monitor related attach/detach/init/deinit 1073 * will be done while monitor insmod 1074 */ 1075 if (!mon_soc) 1076 return QDF_STATUS_SUCCESS; 1077 1078 monitor_ops = mon_soc->mon_ops; 1079 if (!monitor_ops || !monitor_ops->mon_pdev_detach) { 1080 dp_mon_debug("callback not registered"); 1081 return QDF_STATUS_E_FAILURE; 1082 } 1083 1084 return monitor_ops->mon_pdev_detach(pdev); 1085 } 1086 1087 /* 1088 * dp_monitor_vdev_attach() - Monitor vdev attach 1089 * @vdev: point to vdev 1090 * 1091 * Return: return QDF_STATUS 1092 */ 1093 static inline QDF_STATUS dp_monitor_vdev_attach(struct dp_vdev *vdev) 1094 { 1095 struct dp_mon_ops *monitor_ops; 1096 struct dp_mon_soc *mon_soc = vdev->pdev->soc->monitor_soc; 1097 1098 if (!mon_soc) 1099 return QDF_STATUS_E_FAILURE; 1100 1101 monitor_ops = mon_soc->mon_ops; 1102 if (!monitor_ops || !monitor_ops->mon_vdev_attach) { 1103 dp_mon_debug("callback not registered"); 1104 return QDF_STATUS_E_FAILURE; 1105 } 1106 1107 return monitor_ops->mon_vdev_attach(vdev); 1108 } 1109 1110 /* 1111 * dp_monitor_vdev_detach() - Monitor vdev detach 1112 * @vdev: point to vdev 1113 * 1114 * Return: return QDF_STATUS 1115 */ 1116 static inline QDF_STATUS dp_monitor_vdev_detach(struct dp_vdev *vdev) 1117 { 1118 struct dp_mon_ops *monitor_ops; 1119 struct dp_mon_soc *mon_soc = vdev->pdev->soc->monitor_soc; 1120 1121 if (!mon_soc) 1122 return QDF_STATUS_E_FAILURE; 1123 1124 monitor_ops = mon_soc->mon_ops; 1125 if (!monitor_ops || !monitor_ops->mon_vdev_detach) { 1126 dp_mon_debug("callback not registered"); 1127 return QDF_STATUS_E_FAILURE; 1128 } 1129 1130 return monitor_ops->mon_vdev_detach(vdev); 1131 } 1132 1133 /* 1134 * dp_monitor_peer_attach() - Monitor peer attach 1135 * @soc: point to soc 1136 * @peer: point to peer 1137 * 1138 * Return: return QDF_STATUS 1139 */ 1140 static inline QDF_STATUS dp_monitor_peer_attach(struct dp_soc *soc, 1141 struct dp_peer *peer) 1142 { 1143 struct dp_mon_ops *monitor_ops; 1144 struct dp_mon_soc *mon_soc = soc->monitor_soc; 1145 1146 if (!mon_soc) 1147 return QDF_STATUS_E_FAILURE; 1148 1149 monitor_ops = mon_soc->mon_ops; 1150 if (!monitor_ops || !monitor_ops->mon_peer_attach) { 1151 dp_mon_debug("callback not registered"); 1152 return QDF_STATUS_E_FAILURE; 1153 } 1154 1155 return monitor_ops->mon_peer_attach(peer); 1156 } 1157 1158 /* 1159 * dp_monitor_peer_detach() - Monitor peer detach 1160 * @soc: point to soc 1161 * @peer: point to peer 1162 * 1163 * Return: return QDF_STATUS 1164 */ 1165 static inline QDF_STATUS dp_monitor_peer_detach(struct dp_soc *soc, 1166 struct dp_peer *peer) 1167 { 1168 struct dp_mon_ops *monitor_ops; 1169 struct dp_mon_soc *mon_soc = soc->monitor_soc; 1170 1171 if (!mon_soc) 1172 return QDF_STATUS_E_FAILURE; 1173 1174 monitor_ops = mon_soc->mon_ops; 1175 if (!monitor_ops || !monitor_ops->mon_peer_detach) { 1176 dp_mon_debug("callback not registered"); 1177 return QDF_STATUS_E_FAILURE; 1178 } 1179 1180 return monitor_ops->mon_peer_detach(peer); 1181 } 1182 1183 /* 1184 * dp_monitor_pdev_init() - Monitor pdev init 1185 * @pdev: point to pdev 1186 * 1187 * Return: return QDF_STATUS 1188 */ 1189 static inline QDF_STATUS dp_monitor_pdev_init(struct dp_pdev *pdev) 1190 { 1191 struct dp_mon_ops *monitor_ops; 1192 struct dp_mon_soc *mon_soc = pdev->soc->monitor_soc; 1193 1194 /* 1195 * mon_soc uninitialized when modular support enabled 1196 * monitor related attach/detach/init/deinit 1197 * will be done while monitor insmod 1198 */ 1199 if (!mon_soc) 1200 return QDF_STATUS_SUCCESS; 1201 1202 monitor_ops = mon_soc->mon_ops; 1203 if (!monitor_ops || !monitor_ops->mon_pdev_init) { 1204 dp_mon_debug("callback not registered"); 1205 return QDF_STATUS_E_FAILURE; 1206 } 1207 1208 return monitor_ops->mon_pdev_init(pdev); 1209 } 1210 1211 /* 1212 * dp_monitor_pdev_deinit() - Monitor pdev deinit 1213 * @pdev: point to pdev 1214 * 1215 * Return: return QDF_STATUS 1216 */ 1217 static inline QDF_STATUS dp_monitor_pdev_deinit(struct dp_pdev *pdev) 1218 { 1219 struct dp_mon_ops *monitor_ops; 1220 struct dp_mon_soc *mon_soc = pdev->soc->monitor_soc; 1221 1222 /* 1223 * mon_soc uninitialized modular when support enabled 1224 * monitor related attach/detach/init/deinit 1225 * will be done while monitor insmod 1226 */ 1227 if (!mon_soc) 1228 return QDF_STATUS_SUCCESS; 1229 1230 monitor_ops = mon_soc->mon_ops; 1231 if (!monitor_ops || !monitor_ops->mon_pdev_deinit) { 1232 dp_mon_debug("callback not registered"); 1233 return QDF_STATUS_E_FAILURE; 1234 } 1235 1236 return monitor_ops->mon_pdev_deinit(pdev); 1237 } 1238 1239 /* 1240 * dp_monitor_soc_cfg_init() - Monitor sco cfg init 1241 * @soc: point to soc 1242 * 1243 * Return: return QDF_STATUS 1244 */ 1245 static inline QDF_STATUS dp_monitor_soc_cfg_init(struct dp_soc *soc) 1246 { 1247 struct dp_mon_ops *monitor_ops; 1248 struct dp_mon_soc *mon_soc = soc->monitor_soc; 1249 1250 /* 1251 * this API is getting call from dp_soc_init, 1252 * mon_soc will be uninitialized when monitor support enabled 1253 * So returning QDF_STATUS_SUCCESS. 1254 * soc cfg init will be done while monitor insmod. 1255 */ 1256 if (!mon_soc) 1257 return QDF_STATUS_SUCCESS; 1258 1259 monitor_ops = mon_soc->mon_ops; 1260 if (!monitor_ops || !monitor_ops->mon_soc_cfg_init) { 1261 dp_mon_debug("callback not registered"); 1262 return QDF_STATUS_E_FAILURE; 1263 } 1264 1265 return monitor_ops->mon_soc_cfg_init(soc); 1266 } 1267 1268 /* 1269 * dp_monitor_config_debug_sniffer() - Monitor config debug sniffer 1270 * @pdev: point to pdev 1271 * @val: val 1272 * 1273 * Return: return QDF_STATUS 1274 */ 1275 static inline QDF_STATUS dp_monitor_config_debug_sniffer(struct dp_pdev *pdev, 1276 int val) 1277 { 1278 struct dp_mon_ops *monitor_ops; 1279 struct dp_mon_soc *mon_soc = pdev->soc->monitor_soc; 1280 1281 if (!mon_soc) 1282 return QDF_STATUS_E_FAILURE; 1283 1284 monitor_ops = mon_soc->mon_ops; 1285 if (!monitor_ops || !monitor_ops->mon_config_debug_sniffer) { 1286 dp_mon_debug("callback not registered"); 1287 return QDF_STATUS_E_FAILURE; 1288 } 1289 1290 return monitor_ops->mon_config_debug_sniffer(pdev, val); 1291 } 1292 1293 /* 1294 * dp_monitor_flush_rings() - Flush monitor rings 1295 * @soc: point to soc 1296 * 1297 * Return: None 1298 */ 1299 static inline void dp_monitor_flush_rings(struct dp_soc *soc) 1300 { 1301 struct dp_mon_ops *monitor_ops; 1302 struct dp_mon_soc *mon_soc = soc->monitor_soc; 1303 1304 if (!mon_soc) { 1305 dp_mon_debug("monitor soc is NULL"); 1306 return; 1307 } 1308 1309 monitor_ops = mon_soc->mon_ops; 1310 if (!monitor_ops || !monitor_ops->mon_flush_rings) { 1311 dp_mon_debug("callback not registered"); 1312 return; 1313 } 1314 1315 return monitor_ops->mon_flush_rings(soc); 1316 } 1317 1318 /* 1319 * dp_monitor_htt_srng_setup() - Setup htt srng 1320 * @soc: point to soc 1321 * @pdev: point to pdev 1322 * @mac_id: lmac id 1323 * @mac for pdev: pdev id 1324 * 1325 * Return: QDF_STATUS 1326 */ 1327 #if !defined(DISABLE_MON_CONFIG) 1328 static inline QDF_STATUS dp_monitor_htt_srng_setup(struct dp_soc *soc, 1329 struct dp_pdev *pdev, 1330 int mac_id, 1331 int mac_for_pdev) 1332 { 1333 struct dp_mon_ops *monitor_ops; 1334 struct dp_mon_soc *mon_soc = soc->monitor_soc; 1335 1336 if (!mon_soc) { 1337 dp_mon_debug("monitor soc is NULL"); 1338 return QDF_STATUS_SUCCESS; 1339 } 1340 1341 monitor_ops = mon_soc->mon_ops; 1342 if (!monitor_ops || !monitor_ops->mon_htt_srng_setup) { 1343 dp_mon_debug("callback not registered"); 1344 return QDF_STATUS_E_FAILURE; 1345 } 1346 1347 return monitor_ops->mon_htt_srng_setup(soc, pdev, mac_id, 1348 mac_for_pdev); 1349 } 1350 #else 1351 static inline QDF_STATUS dp_monitor_htt_srng_setup(struct dp_soc *soc, 1352 struct dp_pdev *pdev, 1353 int mac_id, 1354 int mac_for_pdev) 1355 { 1356 return QDF_STATUS_SUCCESS; 1357 } 1358 #endif 1359 1360 /* 1361 * dp_monitor_service_mon_rings() - service monitor rings 1362 * @soc: point to soc 1363 * @quota: reap budget 1364 * 1365 * Return: None 1366 */ 1367 #if defined(DP_CON_MON) 1368 static inline 1369 void dp_monitor_service_mon_rings(struct dp_soc *soc, uint32_t quota) 1370 { 1371 struct dp_mon_ops *monitor_ops; 1372 struct dp_mon_soc *mon_soc = soc->monitor_soc; 1373 1374 if (!mon_soc) { 1375 dp_mon_debug("monitor soc is NULL"); 1376 return; 1377 } 1378 1379 monitor_ops = mon_soc->mon_ops; 1380 if (!monitor_ops || !monitor_ops->mon_service_rings) { 1381 dp_mon_debug("callback not registered"); 1382 return; 1383 } 1384 1385 return monitor_ops->mon_service_rings(soc, quota); 1386 } 1387 #endif 1388 1389 /* 1390 * dp_monitor_process() - Process monitor 1391 * @soc: point to soc 1392 * @int_ctx: interrupt ctx 1393 * @mac_id: lma 1394 * @quota: 1395 * 1396 * Return: None 1397 */ 1398 #ifndef DISABLE_MON_CONFIG 1399 static inline 1400 uint32_t dp_monitor_process(struct dp_soc *soc, struct dp_intr *int_ctx, 1401 uint32_t mac_id, uint32_t quota) 1402 { 1403 struct dp_mon_ops *monitor_ops; 1404 struct dp_mon_soc *mon_soc = soc->monitor_soc; 1405 1406 if (!mon_soc) { 1407 dp_mon_debug("monitor soc is NULL"); 1408 return 0; 1409 } 1410 1411 monitor_ops = mon_soc->mon_ops; 1412 if (!monitor_ops || !monitor_ops->mon_process) { 1413 dp_mon_debug("callback not registered"); 1414 return 0; 1415 } 1416 1417 return monitor_ops->mon_process(soc, int_ctx, mac_id, quota); 1418 } 1419 #else 1420 static inline 1421 uint32_t dp_monitor_process(struct dp_soc *soc, struct dp_intr *int_ctx, 1422 uint32_t mac_id, uint32_t quota) 1423 { 1424 return 0; 1425 } 1426 #endif 1427 1428 /* 1429 * dp_monitor_drop_packets_for_mac() - monitor_drop_packets_for_mac 1430 * @pdev: point to pdev 1431 * @mac_id: 1432 * @quota: 1433 * 1434 * Return: 1435 */ 1436 #if !defined(DISABLE_MON_CONFIG) && defined(MON_ENABLE_DROP_FOR_MAC) 1437 static inline 1438 uint32_t dp_monitor_drop_packets_for_mac(struct dp_pdev *pdev, 1439 uint32_t mac_id, uint32_t quota) 1440 { 1441 struct dp_mon_ops *monitor_ops; 1442 struct dp_mon_soc *mon_soc = pdev->soc->monitor_soc; 1443 1444 if (!mon_soc) { 1445 dp_mon_debug("monitor soc is NULL"); 1446 return 0; 1447 } 1448 1449 monitor_ops = mon_soc->mon_ops; 1450 if (!monitor_ops || !monitor_ops->mon_drop_packets_for_mac) { 1451 dp_mon_debug("callback not registered"); 1452 return 0; 1453 } 1454 1455 return monitor_ops->mon_drop_packets_for_mac(pdev, 1456 mac_id, quota); 1457 } 1458 #else 1459 static inline 1460 uint32_t dp_monitor_drop_packets_for_mac(struct dp_pdev *pdev, 1461 uint32_t mac_id, uint32_t quota) 1462 { 1463 return 0; 1464 } 1465 #endif 1466 1467 /* 1468 * dp_monitor_peer_tx_init() - peer tx init 1469 * @pdev: point to pdev 1470 * @peer: point to peer 1471 * 1472 * Return: None 1473 */ 1474 static inline void dp_monitor_peer_tx_init(struct dp_pdev *pdev, 1475 struct dp_peer *peer) 1476 { 1477 struct dp_mon_ops *monitor_ops; 1478 struct dp_mon_soc *mon_soc = pdev->soc->monitor_soc; 1479 1480 if (!mon_soc) { 1481 dp_mon_debug("monitor soc is NULL"); 1482 return; 1483 } 1484 1485 monitor_ops = mon_soc->mon_ops; 1486 if (!monitor_ops || !monitor_ops->mon_peer_tx_init) { 1487 dp_mon_debug("callback not registered"); 1488 return; 1489 } 1490 1491 return monitor_ops->mon_peer_tx_init(pdev, peer); 1492 } 1493 1494 /* 1495 * dp_monitor_peer_tx_cleanup() - peer tx cleanup 1496 * @vdev: point to vdev 1497 * @peer: point to peer 1498 * 1499 * Return: None 1500 */ 1501 static inline void dp_monitor_peer_tx_cleanup(struct dp_vdev *vdev, 1502 struct dp_peer *peer) 1503 { 1504 struct dp_mon_ops *monitor_ops; 1505 struct dp_mon_soc *mon_soc = vdev->pdev->soc->monitor_soc; 1506 1507 if (!mon_soc) { 1508 dp_mon_debug("monitor soc is NULL"); 1509 return; 1510 } 1511 1512 monitor_ops = mon_soc->mon_ops; 1513 if (!monitor_ops || !monitor_ops->mon_peer_tx_cleanup) { 1514 dp_mon_debug("callback not registered"); 1515 return; 1516 } 1517 1518 return monitor_ops->mon_peer_tx_cleanup(vdev, peer); 1519 } 1520 1521 #ifdef WLAN_TX_PKT_CAPTURE_ENH 1522 /* 1523 * dp_monitor_peer_tid_peer_id_update() - peer tid update 1524 * @soc: point to soc 1525 * @peer: point to peer 1526 * @peer_id: peer id 1527 * 1528 * Return: None 1529 */ 1530 static inline 1531 void dp_monitor_peer_tid_peer_id_update(struct dp_soc *soc, 1532 struct dp_peer *peer, 1533 uint16_t peer_id) 1534 { 1535 struct dp_mon_ops *monitor_ops; 1536 struct dp_mon_soc *mon_soc = soc->monitor_soc; 1537 1538 if (!mon_soc) { 1539 dp_mon_debug("monitor soc is NULL"); 1540 return; 1541 } 1542 1543 monitor_ops = mon_soc->mon_ops; 1544 if (!monitor_ops || !monitor_ops->mon_peer_tid_peer_id_update) { 1545 dp_mon_debug("callback not registered"); 1546 return; 1547 } 1548 1549 return monitor_ops->mon_peer_tid_peer_id_update(peer, peer_id); 1550 } 1551 1552 /* 1553 * dp_monitor_tx_ppdu_stats_attach() - Attach tx ppdu stats 1554 * @pdev: point to pdev 1555 * 1556 * Return: None 1557 */ 1558 static inline void dp_monitor_tx_ppdu_stats_attach(struct dp_pdev *pdev) 1559 { 1560 struct dp_mon_ops *monitor_ops; 1561 struct dp_mon_soc *mon_soc = pdev->soc->monitor_soc; 1562 1563 if (!mon_soc) { 1564 dp_mon_debug("monitor soc is NULL"); 1565 return; 1566 } 1567 1568 monitor_ops = mon_soc->mon_ops; 1569 if (!monitor_ops || !monitor_ops->mon_tx_ppdu_stats_attach) { 1570 dp_mon_debug("callback not registered"); 1571 return; 1572 } 1573 1574 return monitor_ops->mon_tx_ppdu_stats_attach(pdev); 1575 } 1576 1577 /* 1578 * dp_monitor_tx_ppdu_stats_detach() - Detach tx ppdu stats 1579 * @pdev: point to pdev 1580 * 1581 * Return: None 1582 */ 1583 static inline void dp_monitor_tx_ppdu_stats_detach(struct dp_pdev *pdev) 1584 { 1585 struct dp_mon_ops *monitor_ops; 1586 struct dp_mon_soc *mon_soc = pdev->soc->monitor_soc; 1587 1588 if (!mon_soc) { 1589 dp_mon_debug("monitor soc is NULL"); 1590 return; 1591 } 1592 1593 monitor_ops = mon_soc->mon_ops; 1594 if (!monitor_ops || !monitor_ops->mon_tx_ppdu_stats_detach) { 1595 dp_mon_debug("callback not registered"); 1596 return; 1597 } 1598 1599 return monitor_ops->mon_tx_ppdu_stats_detach(pdev); 1600 } 1601 1602 /* 1603 * dp_monitor_tx_capture_debugfs_init() - Init tx capture debugfs 1604 * @pdev: point to pdev 1605 * 1606 * Return: QDF_STATUS_SUCCESS 1607 */ 1608 static inline 1609 QDF_STATUS dp_monitor_tx_capture_debugfs_init(struct dp_pdev *pdev) 1610 { 1611 struct dp_mon_ops *monitor_ops; 1612 struct dp_mon_soc *mon_soc = pdev->soc->monitor_soc; 1613 1614 if (!mon_soc) { 1615 dp_mon_debug("monitor soc is NULL"); 1616 return QDF_STATUS_E_FAILURE; 1617 } 1618 1619 monitor_ops = mon_soc->mon_ops; 1620 if (!monitor_ops || !monitor_ops->mon_tx_capture_debugfs_init) { 1621 dp_mon_debug("callback not registered"); 1622 return QDF_STATUS_E_FAILURE; 1623 } 1624 1625 return monitor_ops->mon_tx_capture_debugfs_init(pdev); 1626 } 1627 1628 /* 1629 * dp_monitor_peer_tx_capture_filter_check() - Check tx capture filter 1630 * @pdev: point to pdev 1631 * @peer: point to peer 1632 * 1633 * Return: None 1634 */ 1635 static inline void dp_monitor_peer_tx_capture_filter_check(struct dp_pdev *pdev, 1636 struct dp_peer *peer) 1637 { 1638 struct dp_mon_ops *monitor_ops; 1639 struct dp_mon_soc *mon_soc = pdev->soc->monitor_soc; 1640 1641 if (!mon_soc) { 1642 dp_mon_debug("monitor soc is NULL"); 1643 return; 1644 } 1645 1646 monitor_ops = mon_soc->mon_ops; 1647 if (!monitor_ops || !monitor_ops->mon_peer_tx_capture_filter_check) { 1648 dp_mon_debug("callback not registered"); 1649 return; 1650 } 1651 1652 return monitor_ops->mon_peer_tx_capture_filter_check(pdev, peer); 1653 } 1654 1655 /* 1656 * dp_monitor_tx_add_to_comp_queue() - add completion msdu to queue 1657 * @soc: point to soc 1658 * @desc: point to tx desc 1659 * @ts: Tx completion status from HAL/HTT descriptor 1660 * @peer: DP peer 1661 * 1662 * Return: None 1663 */ 1664 static inline 1665 QDF_STATUS dp_monitor_tx_add_to_comp_queue(struct dp_soc *soc, 1666 struct dp_tx_desc_s *desc, 1667 struct hal_tx_completion_status *ts, 1668 struct dp_peer *peer) 1669 { 1670 struct dp_mon_ops *monitor_ops; 1671 struct dp_mon_soc *mon_soc = soc->monitor_soc; 1672 1673 if (!mon_soc) { 1674 dp_mon_debug("monitor soc is NULL"); 1675 return QDF_STATUS_SUCCESS; 1676 } 1677 1678 monitor_ops = mon_soc->mon_ops; 1679 if (!monitor_ops || !monitor_ops->mon_tx_add_to_comp_queue) { 1680 dp_mon_debug("callback not registered"); 1681 return QDF_STATUS_E_FAILURE; 1682 } 1683 1684 return monitor_ops->mon_tx_add_to_comp_queue(soc, desc, ts, peer); 1685 } 1686 1687 static inline 1688 QDF_STATUS monitor_update_msdu_to_list(struct dp_soc *soc, 1689 struct dp_pdev *pdev, 1690 struct dp_peer *peer, 1691 struct hal_tx_completion_status *ts, 1692 qdf_nbuf_t netbuf) 1693 { 1694 struct dp_mon_ops *monitor_ops; 1695 struct dp_mon_soc *mon_soc = soc->monitor_soc; 1696 1697 if (!mon_soc) { 1698 dp_mon_debug("monitor soc is NULL"); 1699 return QDF_STATUS_SUCCESS; 1700 } 1701 1702 monitor_ops = mon_soc->mon_ops; 1703 if (!monitor_ops || !monitor_ops->mon_update_msdu_to_list) { 1704 dp_mon_debug("callback not registered"); 1705 return QDF_STATUS_E_FAILURE; 1706 } 1707 1708 return monitor_ops->mon_update_msdu_to_list(soc, pdev, 1709 peer, ts, netbuf); 1710 } 1711 1712 #else 1713 static inline 1714 void dp_monitor_peer_tid_peer_id_update(struct dp_soc *soc, 1715 struct dp_peer *peer, 1716 uint16_t peer_id) 1717 { 1718 } 1719 1720 static inline void dp_monitor_tx_ppdu_stats_attach(struct dp_pdev *pdev) 1721 { 1722 } 1723 1724 static inline void dp_monitor_tx_ppdu_stats_detach(struct dp_pdev *pdev) 1725 { 1726 } 1727 1728 static inline 1729 QDF_STATUS dp_monitor_tx_capture_debugfs_init(struct dp_pdev *pdev) 1730 { 1731 return QDF_STATUS_E_FAILURE; 1732 } 1733 1734 static inline void dp_monitor_peer_tx_capture_filter_check(struct dp_pdev *pdev, 1735 struct dp_peer *peer) 1736 { 1737 } 1738 1739 static inline 1740 QDF_STATUS dp_monitor_tx_add_to_comp_queue(struct dp_soc *soc, 1741 struct dp_tx_desc_s *desc, 1742 struct hal_tx_completion_status *ts, 1743 struct dp_peer *peer) 1744 { 1745 return QDF_STATUS_E_FAILURE; 1746 } 1747 1748 static inline 1749 QDF_STATUS monitor_update_msdu_to_list(struct dp_soc *soc, 1750 struct dp_pdev *pdev, 1751 struct dp_peer *peer, 1752 struct hal_tx_completion_status *ts, 1753 qdf_nbuf_t netbuf) 1754 { 1755 return QDF_STATUS_E_FAILURE; 1756 } 1757 #endif 1758 1759 /* 1760 * dp_monitor_ppdu_stats_ind_handler() - PPDU stats msg handler 1761 * @htt_soc: HTT SOC handle 1762 * @msg_word: Pointer to payload 1763 * @htt_t2h_msg: HTT msg nbuf 1764 * 1765 * Return: True if buffer should be freed by caller. 1766 */ 1767 #if defined(WDI_EVENT_ENABLE) &&\ 1768 (defined(QCA_ENHANCED_STATS_SUPPORT) || !defined(REMOVE_PKT_LOG)) 1769 static inline bool dp_monitor_ppdu_stats_ind_handler(struct htt_soc *soc, 1770 uint32_t *msg_word, 1771 qdf_nbuf_t htt_t2h_msg) 1772 { 1773 struct dp_mon_ops *monitor_ops; 1774 struct dp_mon_soc *mon_soc = soc->dp_soc->monitor_soc; 1775 1776 if (!mon_soc) { 1777 dp_mon_debug("monitor soc is NULL"); 1778 return true; 1779 } 1780 1781 monitor_ops = mon_soc->mon_ops; 1782 if (!monitor_ops || !monitor_ops->mon_ppdu_stats_ind_handler) { 1783 dp_mon_debug("callback not registered"); 1784 return true; 1785 } 1786 1787 return monitor_ops->mon_ppdu_stats_ind_handler(soc, msg_word, 1788 htt_t2h_msg); 1789 } 1790 #else 1791 static inline bool dp_monitor_ppdu_stats_ind_handler(struct htt_soc *soc, 1792 uint32_t *msg_word, 1793 qdf_nbuf_t htt_t2h_msg) 1794 { 1795 return true; 1796 } 1797 #endif 1798 1799 /* 1800 * dp_monitor_htt_ppdu_stats_attach() - attach resources for HTT PPDU 1801 * stats processing 1802 * @pdev: Datapath PDEV handle 1803 * 1804 * Return: QDF_STATUS 1805 */ 1806 static inline QDF_STATUS dp_monitor_htt_ppdu_stats_attach(struct dp_pdev *pdev) 1807 { 1808 struct dp_mon_ops *monitor_ops; 1809 struct dp_mon_soc *mon_soc = pdev->soc->monitor_soc; 1810 1811 if (!mon_soc) { 1812 dp_mon_debug("monitor soc is NULL"); 1813 return QDF_STATUS_SUCCESS; 1814 } 1815 1816 monitor_ops = mon_soc->mon_ops; 1817 if (!monitor_ops || !monitor_ops->mon_htt_ppdu_stats_attach) { 1818 dp_mon_debug("callback not registered"); 1819 return QDF_STATUS_E_FAILURE; 1820 } 1821 1822 return monitor_ops->mon_htt_ppdu_stats_attach(pdev); 1823 } 1824 1825 /* 1826 * dp_monitor_htt_ppdu_stats_detach() - detach stats resources 1827 * @pdev: Datapath PDEV handle 1828 * 1829 * Return: void 1830 */ 1831 static inline void dp_monitor_htt_ppdu_stats_detach(struct dp_pdev *pdev) 1832 { 1833 struct dp_mon_ops *monitor_ops; 1834 struct dp_mon_soc *mon_soc = pdev->soc->monitor_soc; 1835 1836 if (!mon_soc) { 1837 dp_mon_debug("monitor soc is NULL"); 1838 return; 1839 } 1840 1841 monitor_ops = mon_soc->mon_ops; 1842 if (!monitor_ops || !monitor_ops->mon_htt_ppdu_stats_detach) { 1843 dp_mon_debug("callback not registered"); 1844 return; 1845 } 1846 1847 return monitor_ops->mon_htt_ppdu_stats_detach(pdev); 1848 } 1849 1850 /* 1851 * dp_monitor_print_pdev_rx_mon_stats() - print rx mon stats 1852 * @pdev: Datapath PDEV handle 1853 * 1854 * Return: void 1855 */ 1856 static inline void dp_monitor_print_pdev_rx_mon_stats(struct dp_pdev *pdev) 1857 { 1858 struct dp_mon_ops *monitor_ops; 1859 struct dp_mon_soc *mon_soc = pdev->soc->monitor_soc; 1860 1861 if (!mon_soc) { 1862 dp_mon_debug("monitor soc is NULL"); 1863 return; 1864 } 1865 1866 monitor_ops = mon_soc->mon_ops; 1867 if (!monitor_ops || !monitor_ops->mon_print_pdev_rx_mon_stats) { 1868 dp_mon_debug("callback not registered"); 1869 return; 1870 } 1871 1872 return monitor_ops->mon_print_pdev_rx_mon_stats(pdev); 1873 } 1874 1875 /* 1876 * dp_monitor_print_pdev_tx_capture_stats() - print tx capture stats 1877 * @pdev: Datapath PDEV handle 1878 * 1879 * Return: void 1880 */ 1881 #ifdef WLAN_TX_PKT_CAPTURE_ENH 1882 static inline void dp_monitor_print_pdev_tx_capture_stats(struct dp_pdev *pdev) 1883 { 1884 struct dp_mon_ops *monitor_ops; 1885 struct dp_mon_soc *mon_soc = pdev->soc->monitor_soc; 1886 1887 if (!mon_soc) { 1888 dp_mon_debug("monitor soc is NULL"); 1889 return; 1890 } 1891 1892 monitor_ops = mon_soc->mon_ops; 1893 if (!monitor_ops || !monitor_ops->mon_print_pdev_tx_capture_stats) { 1894 dp_mon_debug("callback not registered"); 1895 return; 1896 } 1897 1898 return monitor_ops->mon_print_pdev_tx_capture_stats(pdev); 1899 } 1900 1901 static inline QDF_STATUS dp_monitor_config_enh_tx_capture(struct dp_pdev *pdev, 1902 uint32_t val) 1903 { 1904 struct dp_mon_ops *monitor_ops; 1905 struct dp_mon_soc *mon_soc = pdev->soc->monitor_soc; 1906 1907 if (!mon_soc) { 1908 dp_mon_debug("monitor soc is NULL"); 1909 return QDF_STATUS_E_FAILURE; 1910 } 1911 1912 monitor_ops = mon_soc->mon_ops; 1913 if (!monitor_ops || !monitor_ops->mon_config_enh_tx_capture) { 1914 dp_mon_debug("callback not registered"); 1915 return QDF_STATUS_E_FAILURE; 1916 } 1917 1918 return monitor_ops->mon_config_enh_tx_capture(pdev, val); 1919 } 1920 #else 1921 static inline void dp_monitor_print_pdev_tx_capture_stats(struct dp_pdev *pdev) 1922 { 1923 } 1924 1925 static inline QDF_STATUS dp_monitor_config_enh_tx_capture(struct dp_pdev *pdev, 1926 uint32_t val) 1927 { 1928 return QDF_STATUS_E_INVAL; 1929 } 1930 #endif 1931 1932 #ifdef WLAN_RX_PKT_CAPTURE_ENH 1933 static inline QDF_STATUS dp_monitor_config_enh_rx_capture(struct dp_pdev *pdev, 1934 uint32_t val) 1935 { 1936 struct dp_mon_ops *monitor_ops; 1937 struct dp_mon_soc *mon_soc = pdev->soc->monitor_soc; 1938 1939 if (!mon_soc) { 1940 dp_mon_debug("monitor soc is NULL"); 1941 return QDF_STATUS_E_FAILURE; 1942 } 1943 1944 monitor_ops = mon_soc->mon_ops; 1945 if (!monitor_ops || !monitor_ops->mon_config_enh_rx_capture) { 1946 dp_mon_debug("callback not registered"); 1947 return QDF_STATUS_E_FAILURE; 1948 } 1949 1950 return monitor_ops->mon_config_enh_rx_capture(pdev, val); 1951 } 1952 #else 1953 static inline QDF_STATUS dp_monitor_config_enh_rx_capture(struct dp_pdev *pdev, 1954 uint32_t val) 1955 { 1956 return QDF_STATUS_E_INVAL; 1957 } 1958 #endif 1959 1960 #ifdef QCA_SUPPORT_BPR 1961 static inline QDF_STATUS dp_monitor_set_bpr_enable(struct dp_pdev *pdev, 1962 uint32_t val) 1963 { 1964 struct dp_mon_ops *monitor_ops; 1965 struct dp_mon_soc *mon_soc = pdev->soc->monitor_soc; 1966 1967 if (!mon_soc) { 1968 dp_mon_debug("monitor soc is NULL"); 1969 return QDF_STATUS_E_FAILURE; 1970 } 1971 1972 monitor_ops = mon_soc->mon_ops; 1973 if (!monitor_ops || !monitor_ops->mon_set_bpr_enable) { 1974 dp_mon_debug("callback not registered"); 1975 return QDF_STATUS_E_FAILURE; 1976 } 1977 1978 return monitor_ops->mon_set_bpr_enable(pdev, val); 1979 } 1980 #else 1981 static inline QDF_STATUS dp_monitor_set_bpr_enable(struct dp_pdev *pdev, 1982 uint32_t val) 1983 { 1984 return QDF_STATUS_E_FAILURE; 1985 } 1986 #endif 1987 1988 #ifdef ATH_SUPPORT_NAC 1989 static inline 1990 int dp_monitor_set_filter_neigh_peers(struct dp_pdev *pdev, bool val) 1991 { 1992 struct dp_mon_ops *monitor_ops; 1993 struct dp_mon_soc *mon_soc = pdev->soc->monitor_soc; 1994 1995 if (!mon_soc) { 1996 dp_mon_debug("monitor soc is NULL"); 1997 return 0; 1998 } 1999 2000 monitor_ops = mon_soc->mon_ops; 2001 if (!monitor_ops || !monitor_ops->mon_set_filter_neigh_peers) { 2002 dp_mon_debug("callback not registered"); 2003 return 0; 2004 } 2005 2006 return monitor_ops->mon_set_filter_neigh_peers(pdev, val); 2007 } 2008 #else 2009 static inline 2010 int dp_monitor_set_filter_neigh_peers(struct dp_pdev *pdev, bool val) 2011 { 2012 return 0; 2013 } 2014 #endif 2015 2016 #ifdef WLAN_ATF_ENABLE 2017 static inline 2018 void dp_monitor_set_atf_stats_enable(struct dp_pdev *pdev, bool value) 2019 { 2020 struct dp_mon_ops *monitor_ops; 2021 struct dp_mon_soc *mon_soc = pdev->soc->monitor_soc; 2022 2023 if (!mon_soc) { 2024 dp_mon_debug("monitor soc is NULL"); 2025 return; 2026 } 2027 2028 monitor_ops = mon_soc->mon_ops; 2029 if (!monitor_ops || !monitor_ops->mon_set_atf_stats_enable) { 2030 dp_mon_debug("callback not registered"); 2031 return; 2032 } 2033 2034 return monitor_ops->mon_set_atf_stats_enable(pdev, value); 2035 } 2036 #else 2037 static inline 2038 void dp_monitor_set_atf_stats_enable(struct dp_pdev *pdev, bool value) 2039 { 2040 } 2041 #endif 2042 2043 static inline 2044 void dp_monitor_set_bsscolor(struct dp_pdev *pdev, uint8_t bsscolor) 2045 { 2046 struct dp_mon_ops *monitor_ops; 2047 struct dp_mon_soc *mon_soc = pdev->soc->monitor_soc; 2048 2049 if (!mon_soc) { 2050 dp_mon_debug("monitor soc is NULL"); 2051 return; 2052 } 2053 2054 monitor_ops = mon_soc->mon_ops; 2055 if (!monitor_ops || !monitor_ops->mon_set_bsscolor) { 2056 dp_mon_debug("callback not registered"); 2057 return; 2058 } 2059 2060 return monitor_ops->mon_set_bsscolor(pdev, bsscolor); 2061 } 2062 2063 static inline 2064 bool dp_monitor_pdev_get_filter_mcast_data(struct cdp_pdev *pdev_handle) 2065 { 2066 struct dp_mon_ops *monitor_ops; 2067 struct dp_pdev *pdev = (struct dp_pdev *)pdev_handle; 2068 struct dp_mon_soc *mon_soc = pdev->soc->monitor_soc; 2069 2070 if (!mon_soc) { 2071 dp_mon_debug("monitor soc is NULL"); 2072 return false; 2073 } 2074 2075 monitor_ops = mon_soc->mon_ops; 2076 if (!monitor_ops || !monitor_ops->mon_pdev_get_filter_mcast_data) { 2077 dp_mon_debug("callback not registered"); 2078 return false; 2079 } 2080 2081 return monitor_ops->mon_pdev_get_filter_mcast_data(pdev_handle); 2082 } 2083 2084 static inline 2085 bool dp_monitor_pdev_get_filter_non_data(struct cdp_pdev *pdev_handle) 2086 { 2087 struct dp_mon_ops *monitor_ops; 2088 struct dp_pdev *pdev = (struct dp_pdev *)pdev_handle; 2089 struct dp_mon_soc *mon_soc = pdev->soc->monitor_soc; 2090 2091 if (!mon_soc) { 2092 dp_mon_debug("monitor soc is NULL"); 2093 return false; 2094 } 2095 2096 monitor_ops = mon_soc->mon_ops; 2097 if (!monitor_ops || !monitor_ops->mon_pdev_get_filter_non_data) { 2098 dp_mon_debug("callback not registered"); 2099 return false; 2100 } 2101 2102 return monitor_ops->mon_pdev_get_filter_non_data(pdev_handle); 2103 } 2104 2105 static inline 2106 bool dp_monitor_pdev_get_filter_ucast_data(struct cdp_pdev *pdev_handle) 2107 { 2108 struct dp_mon_ops *monitor_ops; 2109 struct dp_pdev *pdev = (struct dp_pdev *)pdev_handle; 2110 struct dp_mon_soc *mon_soc = pdev->soc->monitor_soc; 2111 2112 if (!mon_soc) { 2113 dp_mon_debug("monitor soc is NULL"); 2114 return false; 2115 } 2116 2117 monitor_ops = mon_soc->mon_ops; 2118 if (!monitor_ops || !monitor_ops->mon_pdev_get_filter_ucast_data) { 2119 dp_mon_debug("callback not registered"); 2120 return false; 2121 } 2122 2123 return monitor_ops->mon_pdev_get_filter_ucast_data(pdev_handle); 2124 } 2125 2126 #ifdef WDI_EVENT_ENABLE 2127 static inline 2128 int dp_monitor_set_pktlog_wifi3(struct dp_pdev *pdev, uint32_t event, 2129 bool enable) 2130 { 2131 struct dp_mon_ops *monitor_ops; 2132 struct dp_mon_soc *mon_soc = pdev->soc->monitor_soc; 2133 2134 if (!mon_soc) { 2135 dp_mon_debug("monitor soc is NULL"); 2136 return 0; 2137 } 2138 2139 monitor_ops = mon_soc->mon_ops; 2140 if (!monitor_ops || !monitor_ops->mon_set_pktlog_wifi3) { 2141 dp_mon_debug("callback not registered"); 2142 return 0; 2143 } 2144 2145 return monitor_ops->mon_set_pktlog_wifi3(pdev, event, enable); 2146 } 2147 #else 2148 static inline 2149 int dp_monitor_set_pktlog_wifi3(struct dp_pdev *pdev, uint32_t event, 2150 bool enable) 2151 { 2152 return 0; 2153 } 2154 #endif 2155 2156 #if defined(DP_CON_MON) && !defined(REMOVE_PKT_LOG) 2157 static inline void dp_monitor_pktlogmod_exit(struct dp_pdev *pdev) 2158 { 2159 struct dp_mon_ops *monitor_ops; 2160 struct dp_mon_soc *mon_soc = pdev->soc->monitor_soc; 2161 2162 if (!mon_soc) { 2163 dp_mon_debug("monitor soc is NULL"); 2164 return; 2165 } 2166 2167 monitor_ops = mon_soc->mon_ops; 2168 if (!monitor_ops || !monitor_ops->mon_pktlogmod_exit) { 2169 dp_mon_debug("callback not registered"); 2170 return; 2171 } 2172 2173 return monitor_ops->mon_pktlogmod_exit(pdev); 2174 } 2175 #else 2176 static inline void dp_monitor_pktlogmod_exit(struct dp_pdev *pdev) {} 2177 #endif 2178 2179 static inline 2180 void dp_monitor_vdev_set_monitor_mode_buf_rings(struct dp_pdev *pdev) 2181 { 2182 struct dp_mon_ops *monitor_ops; 2183 struct dp_mon_soc *mon_soc = pdev->soc->monitor_soc; 2184 2185 if (!mon_soc) { 2186 dp_mon_debug("monitor soc is NULL"); 2187 return; 2188 } 2189 2190 monitor_ops = mon_soc->mon_ops; 2191 if (!monitor_ops || !monitor_ops->mon_vdev_set_monitor_mode_buf_rings) { 2192 dp_mon_debug("callback not registered"); 2193 return; 2194 } 2195 2196 return monitor_ops->mon_vdev_set_monitor_mode_buf_rings(pdev); 2197 } 2198 2199 static inline 2200 void dp_monitor_neighbour_peers_detach(struct dp_pdev *pdev) 2201 { 2202 struct dp_mon_ops *monitor_ops; 2203 struct dp_mon_soc *mon_soc = pdev->soc->monitor_soc; 2204 2205 if (!mon_soc) { 2206 dp_mon_debug("monitor soc is NULL"); 2207 return; 2208 } 2209 2210 monitor_ops = mon_soc->mon_ops; 2211 if (!monitor_ops || !monitor_ops->mon_neighbour_peers_detach) { 2212 dp_mon_debug("callback not registered"); 2213 return; 2214 } 2215 2216 return monitor_ops->mon_neighbour_peers_detach(pdev); 2217 } 2218 2219 #ifdef FEATURE_NAC_RSSI 2220 static inline QDF_STATUS dp_monitor_filter_neighbour_peer(struct dp_pdev *pdev, 2221 uint8_t *rx_pkt_hdr) 2222 { 2223 struct dp_mon_ops *monitor_ops; 2224 struct dp_mon_soc *mon_soc = pdev->soc->monitor_soc; 2225 2226 if (!mon_soc) { 2227 dp_mon_debug("monitor soc is NULL"); 2228 return QDF_STATUS_E_FAILURE; 2229 } 2230 2231 monitor_ops = mon_soc->mon_ops; 2232 if (!monitor_ops || !monitor_ops->mon_filter_neighbour_peer) { 2233 dp_mon_debug("callback not registered"); 2234 return QDF_STATUS_E_FAILURE; 2235 } 2236 2237 return monitor_ops->mon_filter_neighbour_peer(pdev, rx_pkt_hdr); 2238 } 2239 #endif 2240 2241 static inline 2242 void dp_monitor_reap_timer_init(struct dp_soc *soc) 2243 { 2244 struct dp_mon_ops *monitor_ops; 2245 struct dp_mon_soc *mon_soc = soc->monitor_soc; 2246 2247 if (!mon_soc) { 2248 dp_mon_debug("monitor soc is NULL"); 2249 return; 2250 } 2251 2252 monitor_ops = mon_soc->mon_ops; 2253 if (!monitor_ops || !monitor_ops->mon_reap_timer_init) { 2254 dp_mon_debug("callback not registered"); 2255 return; 2256 } 2257 2258 monitor_ops->mon_reap_timer_init(soc); 2259 } 2260 2261 static inline 2262 void dp_monitor_reap_timer_deinit(struct dp_soc *soc) 2263 { 2264 struct dp_mon_ops *monitor_ops; 2265 struct dp_mon_soc *mon_soc = soc->monitor_soc; 2266 2267 if (!mon_soc) { 2268 dp_mon_debug("monitor soc is NULL"); 2269 return; 2270 } 2271 2272 monitor_ops = mon_soc->mon_ops; 2273 if (!monitor_ops || !monitor_ops->mon_reap_timer_deinit) { 2274 dp_mon_debug("callback not registered"); 2275 return; 2276 } 2277 2278 monitor_ops->mon_reap_timer_deinit(soc); 2279 } 2280 2281 static inline 2282 void dp_monitor_reap_timer_start(struct dp_soc *soc) 2283 { 2284 struct dp_mon_ops *monitor_ops; 2285 struct dp_mon_soc *mon_soc = soc->monitor_soc; 2286 2287 if (!mon_soc) { 2288 dp_mon_debug("monitor soc is NULL"); 2289 return; 2290 } 2291 2292 monitor_ops = mon_soc->mon_ops; 2293 if (!monitor_ops || !monitor_ops->mon_reap_timer_start) { 2294 dp_mon_debug("callback not registered"); 2295 return; 2296 } 2297 2298 monitor_ops->mon_reap_timer_start(soc); 2299 } 2300 2301 static inline 2302 bool dp_monitor_reap_timer_stop(struct dp_soc *soc) 2303 { 2304 struct dp_mon_ops *monitor_ops; 2305 struct dp_mon_soc *mon_soc = soc->monitor_soc; 2306 2307 if (!mon_soc) { 2308 dp_mon_debug("monitor soc is NULL"); 2309 return false; 2310 } 2311 2312 monitor_ops = mon_soc->mon_ops; 2313 if (!monitor_ops || !monitor_ops->mon_reap_timer_stop) { 2314 dp_mon_debug("callback not registered"); 2315 return false; 2316 } 2317 2318 return monitor_ops->mon_reap_timer_stop(soc); 2319 } 2320 2321 static inline 2322 void dp_monitor_vdev_timer_init(struct dp_soc *soc) 2323 { 2324 struct dp_mon_ops *monitor_ops; 2325 struct dp_mon_soc *mon_soc = soc->monitor_soc; 2326 2327 if (!mon_soc) { 2328 dp_mon_debug("monitor soc is NULL"); 2329 return; 2330 } 2331 2332 monitor_ops = mon_soc->mon_ops; 2333 if (!monitor_ops || !monitor_ops->mon_vdev_timer_init) { 2334 dp_mon_debug("callback not registered"); 2335 return; 2336 } 2337 2338 monitor_ops->mon_vdev_timer_init(soc); 2339 } 2340 2341 static inline 2342 void dp_monitor_vdev_timer_deinit(struct dp_soc *soc) 2343 { 2344 struct dp_mon_ops *monitor_ops; 2345 struct dp_mon_soc *mon_soc = soc->monitor_soc; 2346 2347 if (!mon_soc) { 2348 dp_mon_debug("monitor soc is NULL"); 2349 return; 2350 } 2351 2352 monitor_ops = mon_soc->mon_ops; 2353 if (!monitor_ops || !monitor_ops->mon_vdev_timer_deinit) { 2354 dp_mon_debug("callback not registered"); 2355 return; 2356 } 2357 2358 monitor_ops->mon_vdev_timer_deinit(soc); 2359 } 2360 2361 static inline 2362 void dp_monitor_vdev_timer_start(struct dp_soc *soc) 2363 { 2364 struct dp_mon_ops *monitor_ops; 2365 struct dp_mon_soc *mon_soc = soc->monitor_soc; 2366 2367 if (!mon_soc) { 2368 dp_mon_debug("monitor soc is NULL"); 2369 return; 2370 } 2371 2372 monitor_ops = mon_soc->mon_ops; 2373 if (!monitor_ops || !monitor_ops->mon_vdev_timer_start) { 2374 dp_mon_debug("callback not registered"); 2375 return; 2376 } 2377 2378 monitor_ops->mon_vdev_timer_start(soc); 2379 } 2380 2381 static inline 2382 bool dp_monitor_vdev_timer_stop(struct dp_soc *soc) 2383 { 2384 struct dp_mon_ops *monitor_ops; 2385 struct dp_mon_soc *mon_soc = soc->monitor_soc; 2386 2387 if (!mon_soc) { 2388 dp_mon_debug("monitor soc is NULL"); 2389 return false; 2390 } 2391 2392 monitor_ops = mon_soc->mon_ops; 2393 if (!monitor_ops || !monitor_ops->mon_vdev_timer_stop) { 2394 dp_mon_debug("callback not registered"); 2395 return false; 2396 } 2397 2398 return monitor_ops->mon_vdev_timer_stop(soc); 2399 } 2400 2401 #ifdef QCA_MCOPY_SUPPORT 2402 static inline 2403 QDF_STATUS dp_monitor_mcopy_check_deliver(struct dp_pdev *pdev, 2404 uint16_t peer_id, uint32_t ppdu_id, 2405 uint8_t first_msdu) 2406 { 2407 struct dp_mon_ops *monitor_ops; 2408 struct dp_mon_soc *mon_soc = pdev->soc->monitor_soc; 2409 2410 if (!mon_soc) { 2411 dp_mon_debug("monitor soc is NULL"); 2412 return QDF_STATUS_E_FAILURE; 2413 } 2414 2415 monitor_ops = mon_soc->mon_ops; 2416 if (!monitor_ops || !monitor_ops->mon_mcopy_check_deliver) { 2417 dp_mon_debug("callback not registered"); 2418 return QDF_STATUS_E_FAILURE; 2419 } 2420 2421 return monitor_ops->mon_mcopy_check_deliver(pdev, peer_id, 2422 ppdu_id, first_msdu); 2423 } 2424 #else 2425 static inline 2426 QDF_STATUS dp_monitor_mcopy_check_deliver(struct dp_pdev *pdev, 2427 uint16_t peer_id, uint32_t ppdu_id, 2428 uint8_t first_msdu) 2429 { 2430 return QDF_STATUS_SUCCESS; 2431 } 2432 #endif 2433 2434 /* 2435 * dp_monitor_neighbour_peer_add_ast() - Add ast entry 2436 * @pdev: point to dp pdev 2437 * @ta_peer: point to peer 2438 * @mac_addr: mac address 2439 * @nbuf: point to nbuf 2440 * @flags: flags 2441 * 2442 * Return: void 2443 */ 2444 static inline void 2445 dp_monitor_neighbour_peer_add_ast(struct dp_pdev *pdev, 2446 struct dp_peer *ta_peer, 2447 uint8_t *mac_addr, 2448 qdf_nbuf_t nbuf, 2449 uint32_t flags) 2450 { 2451 struct dp_mon_soc *mon_soc = pdev->soc->monitor_soc; 2452 struct dp_mon_ops *monitor_ops; 2453 2454 if (!mon_soc) { 2455 dp_mon_debug("monitor soc is NULL"); 2456 return; 2457 } 2458 2459 monitor_ops = mon_soc->mon_ops; 2460 if (!monitor_ops || !monitor_ops->mon_neighbour_peer_add_ast) { 2461 dp_mon_debug("callback not registered"); 2462 return; 2463 } 2464 2465 return monitor_ops->mon_neighbour_peer_add_ast(pdev, ta_peer, mac_addr, 2466 nbuf, flags); 2467 } 2468 2469 /* 2470 * dp_monitor_vdev_delete() - delete monitor vdev 2471 * @soc: point to dp soc 2472 * @vdev: point to dp vdev 2473 * 2474 * Return: void 2475 */ 2476 static inline void dp_monitor_vdev_delete(struct dp_soc *soc, 2477 struct dp_vdev *vdev) 2478 { 2479 if (soc->intr_mode == DP_INTR_POLL) { 2480 qdf_timer_sync_cancel(&soc->int_timer); 2481 dp_monitor_flush_rings(soc); 2482 } else if (soc->intr_mode == DP_INTR_MSI) { 2483 if (dp_monitor_vdev_timer_stop(soc)) 2484 dp_monitor_flush_rings(soc); 2485 } 2486 2487 dp_monitor_vdev_detach(vdev); 2488 } 2489 2490 #ifdef DP_POWER_SAVE 2491 /* 2492 * dp_monitor_pktlog_reap_pending_frames() - reap pending frames 2493 * @pdev: point to dp pdev 2494 * 2495 * Return: void 2496 */ 2497 static inline void dp_monitor_pktlog_reap_pending_frames(struct dp_pdev *pdev) 2498 { 2499 struct dp_soc *soc; 2500 2501 if (qdf_unlikely(!pdev || !pdev->monitor_pdev)) 2502 return; 2503 2504 soc = pdev->soc; 2505 2506 if (((pdev->monitor_pdev->rx_pktlog_mode != DP_RX_PKTLOG_DISABLED) || 2507 dp_mon_is_enable_reap_timer_non_pkt(pdev))) { 2508 if (dp_monitor_reap_timer_stop(soc)) 2509 dp_monitor_service_mon_rings(soc, DP_MON_REAP_BUDGET); 2510 } 2511 } 2512 2513 /* 2514 * dp_monitor_pktlog_start_reap_timer() - start reap timer 2515 * @pdev: point to dp pdev 2516 * 2517 * Return: void 2518 */ 2519 static inline void dp_monitor_pktlog_start_reap_timer(struct dp_pdev *pdev) 2520 { 2521 struct dp_soc *soc; 2522 2523 if (qdf_unlikely(!pdev || !pdev->monitor_pdev)) 2524 return; 2525 2526 soc = pdev->soc; 2527 if (((pdev->monitor_pdev->rx_pktlog_mode != DP_RX_PKTLOG_DISABLED) || 2528 dp_mon_is_enable_reap_timer_non_pkt(pdev))) 2529 dp_monitor_reap_timer_start(soc); 2530 } 2531 #endif 2532 2533 /* 2534 * dp_monitor_neighbour_peer_list_remove() - remove neighbour peer list 2535 * @pdev: point to dp pdev 2536 * @vdev: point to dp vdev 2537 * @peer: point to dp_neighbour_peer 2538 * 2539 * Return: void 2540 */ 2541 static inline 2542 void dp_monitor_neighbour_peer_list_remove(struct dp_pdev *pdev, 2543 struct dp_vdev *vdev, 2544 struct dp_neighbour_peer *peer) 2545 { 2546 struct dp_mon_pdev *mon_pdev; 2547 struct dp_neighbour_peer *temp_peer = NULL; 2548 2549 if (qdf_unlikely(!pdev || !pdev->monitor_pdev)) 2550 return; 2551 2552 mon_pdev = pdev->monitor_pdev; 2553 qdf_spin_lock_bh(&mon_pdev->neighbour_peer_mutex); 2554 if (!pdev->soc->monitor_soc->hw_nac_monitor_support) { 2555 TAILQ_FOREACH(peer, &mon_pdev->neighbour_peers_list, 2556 neighbour_peer_list_elem) { 2557 QDF_ASSERT(peer->vdev != vdev); 2558 } 2559 } else { 2560 TAILQ_FOREACH_SAFE(peer, &mon_pdev->neighbour_peers_list, 2561 neighbour_peer_list_elem, temp_peer) { 2562 if (peer->vdev == vdev) { 2563 TAILQ_REMOVE(&mon_pdev->neighbour_peers_list, 2564 peer, 2565 neighbour_peer_list_elem); 2566 qdf_mem_free(peer); 2567 } 2568 } 2569 } 2570 qdf_spin_unlock_bh(&mon_pdev->neighbour_peer_mutex); 2571 } 2572 2573 static inline 2574 void dp_monitor_pdev_set_mon_vdev(struct dp_vdev *vdev) 2575 { 2576 if (!vdev->pdev->monitor_pdev) 2577 return; 2578 2579 vdev->pdev->monitor_pdev->mvdev = vdev; 2580 } 2581 2582 static inline 2583 void dp_monitor_pdev_config_scan_spcl_vap(struct dp_pdev *pdev, bool val) 2584 { 2585 if (!pdev || !pdev->monitor_pdev) 2586 return; 2587 2588 pdev->monitor_pdev->scan_spcl_vap_configured = val; 2589 } 2590 2591 #ifdef QCA_SUPPORT_SCAN_SPCL_VAP_STATS 2592 static inline 2593 void dp_monitor_pdev_reset_scan_spcl_vap_stats_enable(struct dp_pdev *pdev, 2594 bool val) 2595 { 2596 if (!pdev || !pdev->monitor_pdev) 2597 return; 2598 2599 pdev->monitor_pdev->reset_scan_spcl_vap_stats_enable = val; 2600 } 2601 #else 2602 static inline 2603 void dp_monitor_pdev_reset_scan_spcl_vap_stats_enable(struct dp_pdev *pdev, 2604 bool val) 2605 { 2606 } 2607 #endif 2608 2609 QDF_STATUS dp_mon_soc_attach(struct dp_soc *soc); 2610 QDF_STATUS dp_mon_soc_detach(struct dp_soc *soc); 2611 QDF_STATUS dp_mon_pdev_attach(struct dp_pdev *pdev); 2612 QDF_STATUS dp_mon_pdev_detach(struct dp_pdev *pdev); 2613 QDF_STATUS dp_mon_pdev_init(struct dp_pdev *pdev); 2614 QDF_STATUS dp_mon_pdev_deinit(struct dp_pdev *pdev); 2615 QDF_STATUS dp_mon_soc_cfg_init(struct dp_soc *soc); 2616 void dp_mon_cdp_ops_register(struct dp_soc *soc); 2617 void dp_mon_cdp_ops_deregister(struct dp_soc *soc); 2618 void dp_mon_ops_register(struct dp_mon_soc *mon_soc); 2619 QDF_STATUS dp_mon_htt_srng_setup(struct dp_soc *soc, 2620 struct dp_pdev *pdev, 2621 int mac_id, 2622 int mac_for_pdev); 2623 #ifdef QCA_ENHANCED_STATS_SUPPORT 2624 QDF_STATUS dp_peer_qos_stats_notify(struct dp_pdev *dp_pdev, 2625 struct cdp_rx_stats_ppdu_user *ppdu_user); 2626 #endif 2627 2628 #endif /* _DP_MON_H_ */ 2629