From 53fe7000bae75d4e13f47f5ffecd58b204e20fed Mon Sep 17 00:00:00 2001 From: aloksing Date: Wed, 26 May 2021 16:04:48 +0530 Subject: [PATCH] qcacmn: Move monitor related fields from soc/pdev to mon_soc/mon_pdev PATCH[6/7]: This patch consists following changes: -Move monitor related pdev variables to struct dp_mon_pdev -Move monitor relted soc variables to struct dp_mon_soc -Move cookie to monitor link desc va to monitor file -Add APIs to access monitor related variables -Add dummy APIs to build without monitor support. Change-Id: I032a480b1383d061f984cee3ba6b10ac7a0ff350 CRs-Fixed: 2983781 --- dp/wifi3.0/dp_htt.c | 66 -- dp/wifi3.0/dp_internal.h | 125 +++- dp/wifi3.0/dp_ipa.c | 2 +- dp/wifi3.0/dp_main.c | 151 ++--- dp/wifi3.0/dp_peer.c | 8 +- dp/wifi3.0/dp_rx.c | 7 +- dp/wifi3.0/dp_rx.h | 34 -- dp/wifi3.0/dp_rx_buffer_pool.h | 1 - dp/wifi3.0/dp_rx_err.c | 3 +- dp/wifi3.0/dp_stats.c | 15 +- dp/wifi3.0/dp_tx.c | 10 +- dp/wifi3.0/dp_txrx_wds.c | 31 +- dp/wifi3.0/dp_txrx_wds.h | 30 +- dp/wifi3.0/dp_types.h | 201 +----- dp/wifi3.0/dp_wdi_event.c | 10 - dp/wifi3.0/li/dp_li_rx.c | 4 +- dp/wifi3.0/monitor/dp_mon.c | 841 +++++++++++++++++--------- dp/wifi3.0/monitor/dp_mon.h | 628 ++++++++++++++++++- dp/wifi3.0/monitor/dp_mon_filter.c | 277 +++++---- dp/wifi3.0/monitor/dp_mon_filter.h | 20 +- dp/wifi3.0/monitor/dp_rx_mon_dest.c | 203 ++++--- dp/wifi3.0/monitor/dp_rx_mon_status.c | 176 +++--- 22 files changed, 1766 insertions(+), 1077 deletions(-) diff --git a/dp/wifi3.0/dp_htt.c b/dp/wifi3.0/dp_htt.c index 3349c2cbad..f4d1ea1f0c 100644 --- a/dp/wifi3.0/dp_htt.c +++ b/dp/wifi3.0/dp_htt.c @@ -23,7 +23,6 @@ #include "dp_types.h" #include "dp_internal.h" #include "dp_rx.h" -#include "dp_rx_mon.h" #include "htt_stats.h" #include "htt_ppdu_stats.h" #include "dp_htt.h" @@ -57,71 +56,6 @@ ((pkt->htc_pkt.Status != QDF_STATUS_E_CANCELED) && \ (pkt->htc_pkt.Status != QDF_STATUS_E_RESOURCES)) -QDF_STATUS dp_rx_populate_cbf_hdr(struct dp_soc *soc, - uint32_t mac_id, - uint32_t event, - qdf_nbuf_t mpdu, - uint32_t msdu_timestamp) -{ - uint32_t data_size, hdr_size, ppdu_id, align4byte; - struct dp_pdev *pdev = dp_get_pdev_for_lmac_id(soc, mac_id); - uint32_t *msg_word; - - if (!pdev) - return QDF_STATUS_E_INVAL; - - ppdu_id = pdev->ppdu_info.com_info.ppdu_id; - - hdr_size = HTT_T2H_PPDU_STATS_IND_HDR_SIZE - + qdf_offsetof(htt_ppdu_stats_rx_mgmtctrl_payload_tlv, payload); - - data_size = qdf_nbuf_len(mpdu); - - qdf_nbuf_push_head(mpdu, hdr_size); - - msg_word = (uint32_t *)qdf_nbuf_data(mpdu); - /* - * Populate the PPDU Stats Indication header - */ - HTT_H2T_MSG_TYPE_SET(*msg_word, HTT_T2H_MSG_TYPE_PPDU_STATS_IND); - HTT_T2H_PPDU_STATS_MAC_ID_SET(*msg_word, mac_id); - HTT_T2H_PPDU_STATS_PDEV_ID_SET(*msg_word, pdev->pdev_id); - align4byte = ((data_size + - qdf_offsetof(htt_ppdu_stats_rx_mgmtctrl_payload_tlv, payload) - + 3) >> 2) << 2; - HTT_T2H_PPDU_STATS_PAYLOAD_SIZE_SET(*msg_word, align4byte); - msg_word++; - HTT_T2H_PPDU_STATS_PPDU_ID_SET(*msg_word, ppdu_id); - msg_word++; - - *msg_word = msdu_timestamp; - msg_word++; - /* Skip reserved field */ - msg_word++; - /* - * Populate MGMT_CTRL Payload TLV first - */ - HTT_STATS_TLV_TAG_SET(*msg_word, - HTT_PPDU_STATS_RX_MGMTCTRL_PAYLOAD_TLV); - - align4byte = ((data_size - sizeof(htt_tlv_hdr_t) + - qdf_offsetof(htt_ppdu_stats_rx_mgmtctrl_payload_tlv, payload) - + 3) >> 2) << 2; - HTT_STATS_TLV_LENGTH_SET(*msg_word, align4byte); - msg_word++; - - HTT_PPDU_STATS_RX_MGMTCTRL_TLV_FRAME_LENGTH_SET( - *msg_word, data_size); - msg_word++; - - dp_wdi_event_handler(event, soc, (void *)mpdu, - HTT_INVALID_PEER, WDI_NO_VAL, pdev->pdev_id); - - qdf_nbuf_pull_head(mpdu, hdr_size); - - return QDF_STATUS_SUCCESS; -} - /* * htt_htc_pkt_alloc() - Allocate HTC packet buffer * @htt_soc: HTT SOC handle diff --git a/dp/wifi3.0/dp_internal.h b/dp/wifi3.0/dp_internal.h index 212ce1ce04..c3273f48d9 100644 --- a/dp/wifi3.0/dp_internal.h +++ b/dp/wifi3.0/dp_internal.h @@ -454,6 +454,19 @@ bool monitor_vdev_timer_stop(struct dp_soc *soc) #endif #ifndef WIFI_MONITOR_SUPPORT +#define MON_BUF_MIN_ENTRIES 64 +static inline struct qdf_mem_multi_page_t* +monitor_get_link_desc_pages(struct dp_soc *soc, uint32_t mac_id) +{ + return NULL; +} + +static inline uint32_t * +monitor_get_total_link_descs(struct dp_soc *soc, uint32_t mac_id) +{ + return NULL; +} + static inline QDF_STATUS monitor_drop_inv_peer_pkts(struct dp_vdev *vdev, struct ieee80211_frame *wh) { @@ -482,6 +495,97 @@ static inline void monitor_vdev_delete(struct dp_soc *soc, struct dp_vdev *vdev) static inline void dp_peer_ppdu_delayed_ba_init(struct dp_peer *peer) { } + +static inline void 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) +{ +} + +static inline void +monitor_set_chan_band(struct dp_pdev *pdev, enum reg_wifi_band chan_band) +{ +} + +static inline void +monitor_set_chan_freq(struct dp_pdev *pdev, qdf_freq_t chan_freq) +{ +} + +static inline void monitor_set_chan_num(struct dp_pdev *pdev, int chan_num) +{ +} + +static inline bool monitor_is_enable_mcopy_mode(struct dp_pdev *pdev) +{ + return false; +} + +static inline +void monitor_neighbour_peer_list_remove(struct dp_pdev *pdev, + struct dp_vdev *vdev, + struct dp_neighbour_peer *peer) +{ +} + +static inline bool monitor_is_chan_band_known(struct dp_pdev *pdev) +{ + return false; +} + +static inline enum reg_wifi_band +monitor_get_chan_band(struct dp_pdev *pdev) +{ + return 0; +} + +static inline void monitor_get_mpdu_status(struct dp_pdev *pdev, + struct dp_soc *soc, + uint8_t *rx_tlv_hdr) +{ +} + +static inline void monitor_print_tx_stats(struct dp_pdev *pdev) +{ +} + +static inline +QDF_STATUS monitor_mcopy_check_deliver(struct dp_pdev *pdev, + uint16_t peer_id, uint32_t ppdu_id, + uint8_t first_msdu) +{ + return QDF_STATUS_SUCCESS; +} + +static inline bool monitor_is_enable_tx_sniffer(struct dp_pdev *pdev) +{ + return false; +} + +static inline struct dp_vdev* +monitor_get_monitor_vdev_from_pdev(struct dp_pdev *pdev) +{ + return NULL; +} + +static inline QDF_STATUS monitor_check_com_info_ppdu_id(struct dp_pdev *pdev, + void *rx_desc) +{ + return QDF_STATUS_E_FAILURE; +} + +static inline struct mon_rx_status* +monitor_get_rx_status_addr(struct dp_pdev *pdev) +{ + return NULL; +} + +static inline bool monitor_is_enable_enhanced_stats(struct dp_pdev *pdev) +{ + return false; +} #endif #define DP_MAX_TIMER_EXEC_TIME_TICKS \ @@ -2021,15 +2125,6 @@ void dp_wdi_event_handler(enum WDI_EVENT event, struct dp_soc *soc, int dp_wdi_event_attach(struct dp_pdev *txrx_pdev); int dp_wdi_event_detach(struct dp_pdev *txrx_pdev); -/** - * dp_get_pldev() - function to get pktlog device handle - * @soc_hdl: datapath soc handle - * @pdev_id: physical device id - * - * Return: pktlog device handle or NULL - */ -void *dp_get_pldev(struct cdp_soc_t *soc_hdl, uint8_t pdev_id); - static inline void dp_hif_update_pipe_callback(struct dp_soc *dp_soc, void *cb_context, @@ -2642,18 +2737,6 @@ static inline uint32_t dp_history_get_next_index(qdf_atomic_t *curr_idx, */ void dp_rx_skip_tlvs(struct dp_soc *soc, qdf_nbuf_t nbuf, uint32_t l3_padding); -/** - * dp_soc_is_full_mon_enable () - Return if full monitor mode is enabled - * @soc: DP soc handle - * - * Return: Full monitor mode status - */ -static inline bool dp_soc_is_full_mon_enable(struct dp_pdev *pdev) -{ - return (pdev->soc->full_mon_mode && pdev->monitor_configured) ? - true : false; -} - #ifndef FEATURE_WDS static inline void dp_hmwds_ast_add_notify(struct dp_peer *peer, diff --git a/dp/wifi3.0/dp_ipa.c b/dp/wifi3.0/dp_ipa.c index cac0bae320..8df2e1a9f3 100644 --- a/dp/wifi3.0/dp_ipa.c +++ b/dp/wifi3.0/dp_ipa.c @@ -139,7 +139,7 @@ QDF_STATUS dp_ipa_handle_rx_buf_smmu_mapping(struct dp_soc *soc, for (i = 0; i < soc->pdev_count; i++) { pdev = soc->pdev_list[i]; - if (pdev && pdev->monitor_configured) + if (pdev && monitor_is_configured(pdev)) return QDF_STATUS_SUCCESS; } diff --git a/dp/wifi3.0/dp_main.c b/dp/wifi3.0/dp_main.c index 559517a83e..4c8043db7a 100644 --- a/dp/wifi3.0/dp_main.c +++ b/dp/wifi3.0/dp_main.c @@ -32,7 +32,6 @@ #include "dp_tx.h" #include "dp_tx_desc.h" #include "dp_rx.h" -#include "dp_rx_mon.h" #ifdef DP_RATETABLE_SUPPORT #include "dp_ratetable.h" #endif @@ -44,7 +43,6 @@ #include "cdp_txrx_cmn_reg.h" #include #include "dp_peer.h" -#include "dp_rx_mon.h" #include "htt_stats.h" #include "dp_htt.h" #ifdef WLAN_SUPPORT_RX_FISA @@ -53,14 +51,10 @@ #include "htt_ppdu_stats.h" #include "qdf_mem.h" /* qdf_mem_malloc,free */ #include "cfg_ucfg_api.h" -#include "dp_mon_filter.h" #ifdef QCA_LL_TX_FLOW_CONTROL_V2 #include "cdp_txrx_flow_ctrl_v2.h" #else -#ifdef WIFI_MONITOR_SUPPORT -#include -#endif static inline void cdp_dump_flow_pool_info(struct cdp_soc_t *soc) @@ -68,6 +62,9 @@ cdp_dump_flow_pool_info(struct cdp_soc_t *soc) return; } #endif +#ifdef WIFI_MONITOR_SUPPORT +#include +#endif #include "dp_ipa.h" #include "dp_cal_client_api.h" #ifdef FEATURE_WDS @@ -2509,6 +2506,7 @@ static void dp_interrupt_timer(void *arg) uint8_t dp_intr_id = wlan_cfg_get_num_contexts(soc->wlan_cfg_ctx); uint32_t lmac_iter; int max_mac_rings = wlan_cfg_get_num_mac_rings(pdev->wlan_cfg_ctx); + enum reg_wifi_band mon_band; /* * this logic makes all data path interfacing rings (UMAC/LMAC) @@ -2529,8 +2527,9 @@ static void dp_interrupt_timer(void *arg) if (!qdf_atomic_read(&soc->cmn_init_done)) return; - if (pdev->mon_chan_band != REG_BAND_UNKNOWN) { - lmac_id = pdev->ch_band_lmac_id_mapping[pdev->mon_chan_band]; + if (monitor_is_chan_band_known(pdev)) { + mon_band = monitor_get_chan_band(pdev); + lmac_id = pdev->ch_band_lmac_id_mapping[mon_band]; if (qdf_likely(lmac_id != DP_MON_INVALID_LMAC_ID)) { dp_intr_id = soc->mon_intr_id_lmac_map[lmac_id]; dp_srng_record_timer_entry(soc, dp_intr_id); @@ -3074,10 +3073,15 @@ void dp_hw_link_desc_pool_banks_free(struct dp_soc *soc, uint32_t mac_id) { struct qdf_mem_multi_page_t *pages; - if (mac_id != WLAN_INVALID_PDEV_ID) - pages = &soc->mon_link_desc_pages[mac_id]; - else + if (mac_id != WLAN_INVALID_PDEV_ID) { + pages = monitor_get_link_desc_pages(soc, mac_id); + if (!pages) + /* monitor_get_link_desc_pages returns NULL only + * if monitor SOC is NULL */ + QDF_ASSERT(pages); + } else { pages = &soc->link_desc_pages; + } if (pages->dma_pages) { wlan_minidump_remove((void *) @@ -3129,12 +3133,17 @@ QDF_STATUS dp_hw_link_desc_pool_banks_alloc(struct dp_soc *soc, uint32_t mac_id) * with REO queue descriptors */ if (mac_id != WLAN_INVALID_PDEV_ID) { - pages = &soc->mon_link_desc_pages[mac_id]; + pages = monitor_get_link_desc_pages(soc, mac_id); + if (!pages) + /* monitor_get_link_desc_pages returns NULL only + * if monitor SOC is NULL + */ + QDF_ASSERT(pages); dp_srng = &soc->rxdma_mon_desc_ring[mac_id]; num_entries = dp_srng->alloc_size / hal_srng_get_entrysize(soc->hal_soc, RXDMA_MONITOR_DESC); - total_link_descs = &soc->total_mon_link_descs[mac_id]; + total_link_descs = monitor_get_total_link_descs(soc, mac_id); qdf_str_lcopy(minidump_str, "mon_link_desc_bank", MINIDUMP_STR_SIZE); } else { @@ -3375,6 +3384,7 @@ void dp_link_desc_ring_replenish(struct dp_soc *soc, uint32_t mac_id) uint32_t count = 0; void *desc_srng; int link_desc_size = hal_get_link_desc_size(soc->hal_soc); + uint32_t *total_link_descs_addr; uint32_t total_link_descs; uint32_t scatter_buf_num; uint32_t num_entries_per_buf = 0; @@ -3391,8 +3401,15 @@ void dp_link_desc_ring_replenish(struct dp_soc *soc, uint32_t mac_id) total_link_descs = soc->total_link_descs; desc_srng = soc->wbm_idle_link_ring.hal_srng; } else { - pages = &soc->mon_link_desc_pages[mac_id]; - total_link_descs = soc->total_mon_link_descs[mac_id]; + pages = monitor_get_link_desc_pages(soc, mac_id); + if (!pages) + /* monitor_get_link_desc_pages returns NULL only + * if monitor SOC is NULL + */ + QDF_ASSERT(pages); + total_link_descs_addr = + monitor_get_total_link_descs(soc, mac_id); + total_link_descs = *total_link_descs_addr; desc_srng = soc->rxdma_mon_desc_ring[mac_id].hal_srng; } @@ -4528,36 +4545,6 @@ static void dp_cleanup_ipa_rx_refill_buf_ring(struct dp_soc *soc, } #endif -#ifdef ATH_SUPPORT_EXT_STAT -/*dp_peer_cal_clients_stats_update - update peer stats on cal client timer - * @soc : Datapath SOC - * @peer : Datapath peer - * @arg : argument to iter function - */ -static void -dp_peer_cal_clients_stats_update(struct dp_soc *soc, - struct dp_peer *peer, - void *arg) -{ - dp_cal_client_update_peer_stats(&peer->stats); -} - -/*dp_iterate_update_peer_list - update peer stats on cal client timer - * @pdev_hdl: pdev handle - */ -void dp_iterate_update_peer_list(struct cdp_pdev *pdev_hdl) -{ - struct dp_pdev *pdev = (struct dp_pdev *)pdev_hdl; - - dp_pdev_iterate_peer(pdev, dp_peer_cal_clients_stats_update, NULL, - DP_MOD_ID_CDP); -} -#else -void dp_iterate_update_peer_list(struct cdp_pdev *pdev_hdl) -{ -} -#endif - #ifdef DP_TX_HW_DESC_HISTORY /** * dp_soc_tx_hw_desc_history_attach - Attach TX HW descriptor history @@ -4925,7 +4912,6 @@ static void dp_pdev_deinit(struct cdp_pdev *txrx_pdev, int force) dp_rx_pdev_desc_pool_deinit(pdev); dp_pdev_bkp_stats_detach(pdev); qdf_event_destroy(&pdev->fw_peer_stats_event); - dp_cal_client_detach(&pdev->cal_client_ctx); if (pdev->sojourn_buf) qdf_nbuf_free(pdev->sojourn_buf); @@ -5844,7 +5830,6 @@ static QDF_STATUS dp_vdev_attach_wifi3(struct cdp_soc_t *cdp_soc, if (wlan_op_mode_monitor == vdev->opmode) { monitor_vdev_attach(vdev); - pdev->monitor_vdev = vdev; return QDF_STATUS_SUCCESS; } @@ -6066,7 +6051,6 @@ static QDF_STATUS dp_vdev_detach_wifi3(struct cdp_soc_t *cdp_soc, struct dp_soc *soc = (struct dp_soc *)cdp_soc; struct dp_pdev *pdev; struct dp_neighbour_peer *peer = NULL; - struct dp_neighbour_peer *temp_peer = NULL; struct dp_peer *vap_self_peer = NULL; struct dp_vdev *vdev = dp_vdev_get_ref_by_id(soc, vdev_id, DP_MOD_ID_CDP); @@ -6113,23 +6097,7 @@ static QDF_STATUS dp_vdev_detach_wifi3(struct cdp_soc_t *cdp_soc, */ dp_vdev_id_map_tbl_remove(soc, vdev); - qdf_spin_lock_bh(&pdev->neighbour_peer_mutex); - if (!soc->hw_nac_monitor_support) { - TAILQ_FOREACH(peer, &pdev->neighbour_peers_list, - neighbour_peer_list_elem) { - QDF_ASSERT(peer->vdev != vdev); - } - } else { - TAILQ_FOREACH_SAFE(peer, &pdev->neighbour_peers_list, - neighbour_peer_list_elem, temp_peer) { - if (peer->vdev == vdev) { - TAILQ_REMOVE(&pdev->neighbour_peers_list, peer, - neighbour_peer_list_elem); - qdf_mem_free(peer); - } - } - } - qdf_spin_unlock_bh(&pdev->neighbour_peer_mutex); + monitor_neighbour_peer_list_remove(pdev, vdev, peer); dp_tx_vdev_multipass_deinit(vdev); @@ -7083,7 +7051,6 @@ void dp_vdev_unref_delete(struct dp_soc *soc, struct dp_vdev *vdev, if (wlan_op_mode_monitor == vdev->opmode) { monitor_vdev_delete(soc, vdev); - pdev->monitor_vdev = NULL; goto free_vdev; } @@ -7702,7 +7669,7 @@ void dp_aggregate_pdev_stats(struct dp_pdev *pdev) qdf_mem_zero(&pdev->stats.rx, sizeof(pdev->stats.rx)); qdf_mem_zero(&pdev->stats.tx_i, sizeof(pdev->stats.tx_i)); - if (pdev->mcopy_mode) + if (monitor_is_enable_mcopy_mode(pdev)) DP_UPDATE_STATS(pdev, pdev->invalid_peer); soc = pdev->soc; @@ -8445,6 +8412,8 @@ static QDF_STATUS dp_set_pdev_param(struct cdp_soc_t *cdp_soc, uint8_t pdev_id, struct dp_pdev *pdev = dp_get_pdev_from_soc_pdev_id_wifi3((struct dp_soc *)cdp_soc, pdev_id); + enum reg_wifi_band chan_band; + if (!pdev) return QDF_STATUS_E_FAILURE; @@ -8510,12 +8479,12 @@ static QDF_STATUS dp_set_pdev_param(struct cdp_soc_t *cdp_soc, uint8_t pdev_id, val.cdp_pdev_param_fltr_neigh_peers); break; case CDP_MONITOR_CHANNEL: - pdev->mon_chan_num = val.cdp_pdev_param_monitor_chan; + monitor_set_chan_num(pdev, val.cdp_pdev_param_monitor_chan); break; case CDP_MONITOR_FREQUENCY: - pdev->mon_chan_freq = val.cdp_pdev_param_mon_freq; - pdev->mon_chan_band = - wlan_reg_freq_to_band(pdev->mon_chan_freq); + chan_band = wlan_reg_freq_to_band(val.cdp_pdev_param_mon_freq); + monitor_set_chan_freq(pdev, val.cdp_pdev_param_mon_freq); + monitor_set_chan_band(pdev, chan_band); break; case CDP_CONFIG_BSS_COLOR: monitor_set_bsscolor(pdev, val.cdp_pdev_param_bss_color); @@ -10697,9 +10666,6 @@ static struct cdp_ctrl_ops dp_ops_ctrl = { .txrx_get_sec_type = dp_get_sec_type, .txrx_wdi_event_sub = dp_wdi_event_sub, .txrx_wdi_event_unsub = dp_wdi_event_unsub, -#ifdef WDI_EVENT_ENABLE - .txrx_get_pldev = dp_get_pldev, -#endif .txrx_set_pdev_param = dp_set_pdev_param, .txrx_get_pdev_param = dp_get_pdev_param, .txrx_set_peer_param = dp_set_peer_param, @@ -11333,11 +11299,7 @@ static QDF_STATUS dp_bus_suspend(struct cdp_soc_t *soc_hdl, uint8_t pdev_id) qdf_timer_stop(&soc->int_timer); /* Stop monitor reap timer and reap any pending frames in ring */ - if (((pdev->rx_pktlog_mode != DP_RX_PKTLOG_DISABLED) || - dp_is_enable_reap_timer_non_pkt(pdev))) { - if (monitor_reap_timer_stop(soc)) - monitor_service_mon_rings(soc, DP_MON_REAP_BUDGET); - } + monitor_stop_reap_timer(pdev); dp_suspend_fse_cache_flush(soc); @@ -11358,9 +11320,7 @@ static QDF_STATUS dp_bus_resume(struct cdp_soc_t *soc_hdl, uint8_t pdev_id) qdf_timer_mod(&soc->int_timer, DP_INTR_POLL_TIMER_MS); /* Start monitor reap timer */ - if (((pdev->rx_pktlog_mode != DP_RX_PKTLOG_DISABLED) || - dp_is_enable_reap_timer_non_pkt(pdev))) - monitor_reap_timer_start(soc); + monitor_start_reap_timer(pdev); dp_resume_fse_cache_flush(soc); @@ -11389,11 +11349,7 @@ static void dp_process_wow_ack_rsp(struct cdp_soc_t *soc_hdl, uint8_t pdev_id) * response from FW reap mon status ring to make sure no packets pending * in the ring. */ - if (((pdev->rx_pktlog_mode != DP_RX_PKTLOG_DISABLED) || - dp_is_enable_reap_timer_non_pkt(pdev)) && - soc->reap_timer_init) { - monitor_service_mon_rings(soc, DP_MON_REAP_BUDGET); - } + monitor_stop_reap_timer(pdev); } /** @@ -11415,11 +11371,7 @@ static void dp_process_target_suspend_req(struct cdp_soc_t *soc_hdl, } /* Stop monitor reap timer and reap any pending frames in ring */ - if (((pdev->rx_pktlog_mode != DP_RX_PKTLOG_DISABLED) || - dp_is_enable_reap_timer_non_pkt(pdev))) { - if (monitor_reap_timer_stop(soc)) - monitor_service_mon_rings(soc, DP_MON_REAP_BUDGET); - } + monitor_stop_reap_timer(pdev); } static struct cdp_bus_ops dp_ops_bus = { @@ -12870,8 +12822,6 @@ static void dp_soc_cfg_dump(struct dp_soc *soc, uint32_t target_type) dp_init_info("DP soc Dump for Target = %d", target_type); dp_init_info("ast_override_support = %d, da_war_enabled = %d,", soc->ast_override_support, soc->da_war_enabled); - dp_init_info("hw_nac_monitor_support = %d", - soc->hw_nac_monitor_support); wlan_cfg_dp_soc_ctx_dump(soc->wlan_cfg_ctx); } @@ -13205,14 +13155,6 @@ static QDF_STATUS dp_pdev_init(struct cdp_soc_t *txrx_soc, /* set the reo destination during initialization */ dp_pdev_set_default_reo(pdev); - /* - * initialize ppdu tlv list - */ - TAILQ_INIT(&pdev->ppdu_info_list); - TAILQ_INIT(&pdev->sched_comp_ppdu_list); - pdev->tlv_count = 0; - pdev->list_depth = 0; - qdf_mem_zero(&pdev->sojourn_stats, sizeof(struct cdp_tx_sojourn_stats)); pdev->sojourn_buf = qdf_nbuf_alloc(pdev->soc->osdev, @@ -13226,11 +13168,6 @@ static QDF_STATUS dp_pdev_init(struct cdp_soc_t *txrx_soc, sojourn_buf = qdf_nbuf_data(pdev->sojourn_buf); qdf_mem_zero(sojourn_buf, sizeof(struct cdp_tx_sojourn_stats)); - /* initlialize cal client timer */ - dp_cal_client_attach(&pdev->cal_client_ctx, - dp_pdev_to_cdp_pdev(pdev), - pdev->soc->osdev, - &dp_iterate_update_peer_list); qdf_event_create(&pdev->fw_peer_stats_event); pdev->num_tx_allowed = wlan_cfg_get_num_tx_desc(soc->wlan_cfg_ctx); diff --git a/dp/wifi3.0/dp_peer.c b/dp/wifi3.0/dp_peer.c index ccfc438667..5f081289ad 100644 --- a/dp/wifi3.0/dp_peer.c +++ b/dp/wifi3.0/dp_peer.c @@ -29,15 +29,11 @@ #include #include #include -#ifdef FEATURE_WDS -#include "dp_txrx_wds.h" -#endif #ifdef WIFI_MONITOR_SUPPORT #include #endif - -#ifdef WLAN_TX_PKT_CAPTURE_ENH -#include "dp_tx_capture.h" +#ifdef FEATURE_WDS +#include "dp_txrx_wds.h" #endif #ifdef QCA_PEER_EXT_STATS diff --git a/dp/wifi3.0/dp_rx.c b/dp/wifi3.0/dp_rx.c index e664af3466..9fdf02c06d 100644 --- a/dp/wifi3.0/dp_rx.c +++ b/dp/wifi3.0/dp_rx.c @@ -28,17 +28,16 @@ #include "if_meta_hdr.h" #endif #include "dp_internal.h" -#include "dp_rx_mon.h" #include "dp_ipa.h" -#ifdef FEATURE_WDS -#include "dp_txrx_wds.h" -#endif #include "dp_hist.h" #include "dp_rx_buffer_pool.h" #ifdef WIFI_MONITOR_SUPPORT #include "dp_htt.h" #include #endif +#ifdef FEATURE_WDS +#include "dp_txrx_wds.h" +#endif #ifndef QCA_HOST_MODE_WIFI_DISABLED diff --git a/dp/wifi3.0/dp_rx.h b/dp/wifi3.0/dp_rx.h index 56f3798756..affc691819 100644 --- a/dp/wifi3.0/dp_rx.h +++ b/dp/wifi3.0/dp_rx.h @@ -1081,40 +1081,6 @@ void *dp_rx_cookie_2_link_desc_va(struct dp_soc *soc, return link_desc_va; } -/** - * dp_rx_cookie_2_mon_link_desc_va() - Converts cookie to a virtual address of - * the MSDU Link Descriptor - * @pdev: core txrx pdev context - * @buf_info: buf_info includes cookie that used to lookup virtual address of - * link descriptor. Normally this is just an index into a per pdev array. - * - * This is the VA of the link descriptor in monitor mode destination ring, - * that HAL layer later uses to retrieve the list of MSDU's for a given MPDU. - * - * Return: void *: Virtual Address of the Rx descriptor - */ -static inline -void *dp_rx_cookie_2_mon_link_desc_va(struct dp_pdev *pdev, - struct hal_buf_info *buf_info, - int mac_id) -{ - void *link_desc_va; - struct qdf_mem_multi_page_t *pages; - uint16_t page_id = LINK_DESC_COOKIE_PAGE_ID(buf_info->sw_cookie); - - pages = &pdev->soc->mon_link_desc_pages[mac_id]; - if (!pages) - return NULL; - - if (qdf_unlikely(page_id >= pages->num_pages)) - return NULL; - - link_desc_va = pages->dma_pages[page_id].page_v_addr_start + - (buf_info->paddr - pages->dma_pages[page_id].page_p_addr); - - return link_desc_va; -} - #ifndef QCA_HOST_MODE_WIFI_DISABLED /* * dp_rx_intrabss_fwd() - API for intrabss fwd. For EAPOL diff --git a/dp/wifi3.0/dp_rx_buffer_pool.h b/dp/wifi3.0/dp_rx_buffer_pool.h index 2cebc2af64..0c5212f99d 100644 --- a/dp/wifi3.0/dp_rx_buffer_pool.h +++ b/dp/wifi3.0/dp_rx_buffer_pool.h @@ -26,7 +26,6 @@ #include "wlan_cfg.h" #include "dp_internal.h" #include "dp_rx.h" -#include "dp_rx_mon.h" #ifdef WLAN_FEATURE_RX_PREALLOC_BUFFER_POOL /** diff --git a/dp/wifi3.0/dp_rx_err.c b/dp/wifi3.0/dp_rx_err.c index 2c9d86463d..0e073ecc53 100644 --- a/dp/wifi3.0/dp_rx_err.c +++ b/dp/wifi3.0/dp_rx_err.c @@ -914,9 +914,8 @@ dp_rx_chain_msdus(struct dp_soc *soc, qdf_nbuf_t nbuf, dp_pdev->invalid_peer_head_msdu = NULL; dp_pdev->invalid_peer_tail_msdu = NULL; - hal_rx_mon_hw_desc_get_mpdu_status(soc->hal_soc, rx_tlv_hdr, - &(dp_pdev->ppdu_info.rx_status)); + monitor_get_mpdu_status(dp_pdev, soc, rx_tlv_hdr); } if (dp_pdev->ppdu_id == hal_rx_attn_phy_ppdu_id_get(soc->hal_soc, diff --git a/dp/wifi3.0/dp_stats.c b/dp/wifi3.0/dp_stats.c index 2ed8916640..8a9ff35a40 100644 --- a/dp/wifi3.0/dp_stats.c +++ b/dp/wifi3.0/dp_stats.c @@ -21,7 +21,6 @@ #include "dp_internal.h" #include "htt_stats.h" #include "htt_ppdu_stats.h" -#include "dp_htt.h" #ifdef QCA_PEER_EXT_STATS #include @@ -172,10 +171,6 @@ const char *intfrm_delay_bucket[CDP_DELAY_BUCKET_MAX + 1] = { }; #endif -#ifdef WLAN_TX_PKT_CAPTURE_ENH -#include "dp_tx_capture.h" -#endif - #define TID_COUNTER_STATS 1 /* Success/drop stats type */ #define TID_DELAY_STATS 2 /* Delay stats type */ @@ -6250,13 +6245,9 @@ dp_print_pdev_tx_stats(struct dp_pdev *pdev) } DP_PRINT_STATS("BA not received for delayed_ba: %d", pdev->stats.cdp_delayed_ba_not_recev); - DP_PRINT_STATS("ppdu info schedule completion list depth: %d", - pdev->sched_comp_list_depth); - DP_PRINT_STATS("cur sched cmdid: %d", pdev->last_sched_cmdid); - DP_PRINT_STATS("delivered sched cmdid: %d", - pdev->delivered_sched_cmdid); - DP_PRINT_STATS("ppdu info list depth: %d", - pdev->list_depth); + + monitor_print_tx_stats(pdev); + DP_PRINT_STATS("tx_ppdu_proc: %llu", pdev->stats.tx_ppdu_proc); DP_PRINT_STATS("ack ba comes twice: %llu", diff --git a/dp/wifi3.0/dp_tx.c b/dp/wifi3.0/dp_tx.c index ff8d871ede..5249435211 100644 --- a/dp/wifi3.0/dp_tx.c +++ b/dp/wifi3.0/dp_tx.c @@ -34,9 +34,6 @@ #endif #include "enet.h" #include "dp_internal.h" -#ifdef FEATURE_WDS -#include "dp_txrx_wds.h" -#endif #ifdef ATH_SUPPORT_IQUE #include "dp_txrx_me.h" #endif @@ -47,6 +44,9 @@ #ifdef WIFI_MONITOR_SUPPORT #include #endif +#ifdef FEATURE_WDS +#include "dp_txrx_wds.h" +#endif /* Flag to skip CCE classify when mesh or tid override enabled */ #define DP_TX_SKIP_CCE_CLASSIFY \ @@ -1994,7 +1994,7 @@ dp_tx_send_msdu_single(struct dp_vdev *vdev, qdf_nbuf_t nbuf, HTT_TX_TCL_METADATA_VALID_HTT_SET(htt_tcl_metadata, 1); dp_tx_desc_update_fast_comp_flag(soc, tx_desc, - !pdev->enhanced_stats_en); + !monitor_is_enable_enhanced_stats(pdev)); dp_tx_update_mesh_flags(soc, vdev, tx_desc); @@ -3837,7 +3837,7 @@ static inline void dp_tx_sojourn_stats_process(struct dp_pdev *pdev, uint64_t delta_ms; struct cdp_tx_sojourn_stats *sojourn_stats; - if (qdf_unlikely(pdev->enhanced_stats_en == 0)) + if (qdf_unlikely(!monitor_is_enable_enhanced_stats(pdev))) return; if (qdf_unlikely(tid == HTT_INVALID_TID || diff --git a/dp/wifi3.0/dp_txrx_wds.c b/dp/wifi3.0/dp_txrx_wds.c index bfeba7a529..00ab14328e 100644 --- a/dp/wifi3.0/dp_txrx_wds.c +++ b/dp/wifi3.0/dp_txrx_wds.c @@ -24,6 +24,9 @@ #include "dp_internal.h" #include "dp_tx.h" #include "enet.h" +#ifdef WIFI_MONITOR_SUPPORT +#include "dp_mon.h" +#endif #include "dp_txrx_wds.h" /* Generic AST entry aging timer value */ @@ -1176,7 +1179,8 @@ dp_get_completion_indication_for_stack(struct dp_soc *soc, uint8_t last_msdu = ts->last_msdu; uint32_t txcap_hdr_size = sizeof(struct tx_capture_hdr); - if (qdf_unlikely(!pdev->tx_sniffer_enable && !pdev->mcopy_mode && + if (qdf_unlikely(!monitor_is_enable_tx_sniffer(pdev) && + !monitor_is_enable_mcopy_mode(pdev) && !pdev->latency_capture_enable)) return QDF_STATUS_E_NOSUPPORT; @@ -1186,24 +1190,13 @@ dp_get_completion_indication_for_stack(struct dp_soc *soc, return QDF_STATUS_E_INVAL; } - if (pdev->mcopy_mode) { - /* If mcopy is enabled and mcopy_mode is M_COPY deliver 1st MSDU - * per PPDU. If mcopy_mode is M_COPY_EXTENDED deliver 1st MSDU - * for each MPDU - */ - if (pdev->mcopy_mode == M_COPY) { - if ((pdev->m_copy_id.tx_ppdu_id == ppdu_id) && - (pdev->m_copy_id.tx_peer_id == peer_id)) { - return QDF_STATUS_E_INVAL; - } - } - - if (!first_msdu) - return QDF_STATUS_E_INVAL; - - pdev->m_copy_id.tx_ppdu_id = ppdu_id; - pdev->m_copy_id.tx_peer_id = peer_id; - } + /* If mcopy is enabled and mcopy_mode is M_COPY deliver 1st MSDU + * per PPDU. If mcopy_mode is M_COPY_EXTENDED deliver 1st MSDU + * for each MPDU + */ + if (monitor_mcopy_check_deliver(pdev, peer_id, ppdu_id, first_msdu) != + QDF_STATUS_SUCCESS) + return QDF_STATUS_E_INVAL; if (qdf_unlikely(qdf_nbuf_headroom(netbuf) < txcap_hdr_size)) { netbuf = qdf_nbuf_realloc_headroom(netbuf, txcap_hdr_size); diff --git a/dp/wifi3.0/dp_txrx_wds.h b/dp/wifi3.0/dp_txrx_wds.h index 285908fa8a..616c430631 100644 --- a/dp/wifi3.0/dp_txrx_wds.h +++ b/dp/wifi3.0/dp_txrx_wds.h @@ -152,7 +152,6 @@ dp_rx_wds_add_or_update_ast(struct dp_soc *soc, struct dp_peer *ta_peer, struct dp_ast_entry *ast; uint32_t flags = DP_AST_FLAGS_HM; uint32_t ret = 0; - struct dp_neighbour_peer *neighbour_peer = NULL; struct dp_pdev *pdev = ta_peer->vdev->pdev; uint8_t wds_src_mac[QDF_MAC_ADDR_SIZE]; @@ -230,32 +229,9 @@ dp_rx_wds_add_or_update_ast(struct dp_soc *soc, struct dp_peer *ta_peer, * smart monitor is enabled and send add_ast command * to FW. */ - if (pdev->neighbour_peers_added) { - qdf_mem_copy(wds_src_mac, - (qdf_nbuf_data(nbuf) + - QDF_MAC_ADDR_SIZE), - QDF_MAC_ADDR_SIZE); - - qdf_spin_lock_bh(&pdev->neighbour_peer_mutex); - TAILQ_FOREACH(neighbour_peer, - &pdev->neighbour_peers_list, - neighbour_peer_list_elem) { - if (!qdf_mem_cmp(&neighbour_peer->neighbour_peers_macaddr, - wds_src_mac, - QDF_MAC_ADDR_SIZE)) { - ret = dp_peer_add_ast(soc, - ta_peer, - wds_src_mac, - CDP_TXRX_AST_TYPE_WDS, - flags); - QDF_TRACE(QDF_MODULE_ID_DP, - QDF_TRACE_LEVEL_INFO, - "sa valid and nac roamed to wds"); - break; - } - } - qdf_spin_unlock_bh(&pdev->neighbour_peer_mutex); - } + monitor_neighbour_peer_add_ast(pdev, ta_peer, + wds_src_mac, nbuf, + flags); return; } } diff --git a/dp/wifi3.0/dp_types.h b/dp/wifi3.0/dp_types.h index 52bd85d782..2da17eec4d 100644 --- a/dp/wifi3.0/dp_types.h +++ b/dp/wifi3.0/dp_types.h @@ -55,9 +55,6 @@ #include #endif -#ifdef WLAN_TX_PKT_CAPTURE_ENH -#include "dp_tx_capture.h" -#endif //#include "dp_tx.h" #define REPT_MU_MIMO 1 @@ -1710,17 +1707,6 @@ struct dp_soc { /* total link descriptors for regular RX and TX */ uint32_t total_link_descs; - /* monitor link descriptor pages */ - struct qdf_mem_multi_page_t mon_link_desc_pages[MAX_NUM_LMAC_HW]; - - /* total link descriptors for monitor mode for each radio */ - uint32_t total_mon_link_descs[MAX_NUM_LMAC_HW]; - - /* Monitor Link descriptor memory banks */ - struct link_desc_bank - mon_link_desc_banks[MAX_NUM_LMAC_HW][MAX_MON_LINK_DESC_BANKS]; - uint32_t num_mon_link_desc_banks[MAX_NUM_LMAC_HW]; - /* Link descriptor Idle list for HW internal use (SRNG mode) */ struct dp_srng wbm_idle_link_ring; @@ -1969,8 +1955,6 @@ struct dp_soc { bool is_last_stats_ctx_init; #endif /* WLAN_FEATURE_STATS_EXT */ - /* Smart monitor capability for HKv2 */ - uint8_t hw_nac_monitor_support; /* Flag to indicate if HTT v2 is enabled*/ bool is_peer_map_unmap_v2; /* Per peer per Tid ba window size support */ @@ -2023,8 +2007,6 @@ struct dp_soc { } skip_fisa_param; #endif #endif /* WLAN_SUPPORT_RX_FLOW_TAG || WLAN_SUPPORT_RX_FISA */ - /* Full monitor mode support */ - bool full_mon_mode; /* SG supported for msdu continued packets from wbm release ring */ bool wbm_release_desc_rx_sg_support; bool peer_map_attach_success; @@ -2291,13 +2273,6 @@ struct rx_protocol_tag_stats { #endif /* WLAN_SUPPORT_RX_PROTOCOL_TYPE_TAG */ -#ifndef WLAN_TX_PKT_CAPTURE_ENH -struct dp_pdev_tx_capture { -}; - -struct dp_peer_tx_capture { -}; -#endif #ifdef WLAN_RX_PKT_CAPTURE_ENH /* Template data to be set for Enhanced RX Monitor packets */ #define RX_MON_CAP_ENH_TRAILER 0xdeadc0dedeadda7a @@ -2388,9 +2363,6 @@ struct dp_pdev { /* TXRX SOC handle */ struct dp_soc *soc; - /* Stuck count on monitor destination ring MPDU process */ - uint32_t mon_dest_ring_stuck_cnt; - bool pdev_deinit; /* pdev status down or up required to handle dynamic hw @@ -2433,42 +2405,9 @@ struct dp_pdev { /* PDEV transmit lock */ qdf_spinlock_t tx_lock; -#ifndef REMOVE_PKT_LOG - bool pkt_log_init; - /* Pktlog pdev */ - struct pktlog_dev_t *pl_dev; -#endif /* #ifndef REMOVE_PKT_LOG */ - - /* Monitor mode interface and status storage */ - struct dp_vdev *monitor_vdev; - - /* Monitor mode operation channel */ - int mon_chan_num; - - /* Monitor mode operation frequency */ - qdf_freq_t mon_chan_freq; - - /* Monitor mode band */ - enum reg_wifi_band mon_chan_band; - - /* monitor mode lock */ - qdf_spinlock_t mon_lock; - /*tx_mutex for me*/ DP_MUTEX_TYPE tx_mutex; - /* monitor */ - bool monitor_configured; - - /* Smart Mesh */ - bool filter_neighbour_peers; - - /*flag to indicate neighbour_peers_list not empty */ - bool neighbour_peers_added; - /* smart mesh mutex */ - qdf_spinlock_t neighbour_peer_mutex; - /* Neighnour peer list */ - TAILQ_HEAD(, dp_neighbour_peer) neighbour_peers_list; /* msdu chain head & tail */ qdf_nbuf_t invalid_peer_head_msdu; qdf_nbuf_t invalid_peer_tail_msdu; @@ -2482,19 +2421,6 @@ struct dp_pdev { /* Global RX decap mode for the device */ enum htt_pkt_type rx_decap_mode; - /* Enhanced Stats is enabled */ - bool enhanced_stats_en; - - /* advance filter mode and type*/ - uint8_t mon_filter_mode; - uint16_t fp_mgmt_filter; - uint16_t fp_ctrl_filter; - uint16_t fp_data_filter; - uint16_t mo_mgmt_filter; - uint16_t mo_ctrl_filter; - uint16_t mo_data_filter; - uint16_t md_data_filter; - qdf_atomic_t num_tx_outstanding; int32_t tx_descs_max; @@ -2511,8 +2437,6 @@ struct dp_pdev { /* dscp_tid_map_*/ uint8_t dscp_tid_map[DP_MAX_TID_MAPS][DSCP_TID_MAP_MAX]; - struct hal_rx_ppdu_info ppdu_info; - /* operating channel */ struct { uint8_t num; @@ -2520,32 +2444,6 @@ struct dp_pdev { uint16_t freq; } operating_channel; - qdf_nbuf_queue_t rx_status_q; - uint32_t mon_ppdu_status; - struct cdp_mon_status rx_mon_recv_status; - /* monitor mode status/destination ring PPDU and MPDU count */ - struct cdp_pdev_mon_stats rx_mon_stats; - /* to track duplicate link descriptor indications by HW for a WAR */ - uint64_t mon_last_linkdesc_paddr; - /* to track duplicate buffer indications by HW for a WAR */ - uint32_t mon_last_buf_cookie; - /* 128 bytes mpdu header queue per user for ppdu */ - qdf_nbuf_queue_t mpdu_q[MAX_MU_USERS]; - /* is this a mpdu header TLV and not msdu header TLV */ - bool is_mpdu_hdr[MAX_MU_USERS]; - /* per user 128 bytes msdu header list for MPDU */ - struct msdu_list msdu_list[MAX_MU_USERS]; - /* RX enhanced capture mode */ - uint8_t rx_enh_capture_mode; - /* Rx per peer enhanced capture mode */ - bool rx_enh_capture_peer; - struct dp_vdev *rx_enh_monitor_vdev; - /* RX enhanced capture trailer enable/disable flag */ - bool is_rx_enh_capture_trailer_enabled; -#ifdef WLAN_RX_PKT_CAPTURE_ENH - /* RX per MPDU/PPDU information */ - struct cdp_rx_indication_mpdu mpdu_ind; -#endif /* pool addr for mcast enhance buff */ struct { int size; @@ -2575,69 +2473,21 @@ struct dp_pdev { /* map this pdev to a particular Reo Destination ring */ enum cdp_host_reo_dest_ring reo_dest; - /* Packet log mode */ - uint8_t rx_pktlog_mode; - /* Enable pktlog logging cbf */ - bool rx_pktlog_cbf; - /* WDI event handlers */ struct wdi_event_subscribe_t **wdi_event_list; /* ppdu_id of last received HTT TX stats */ uint32_t last_ppdu_id; - struct { - uint8_t last_user; - qdf_nbuf_t buf; - } tx_ppdu_info; - - bool tx_sniffer_enable; - /* mirror copy mode */ - enum m_copy_mode mcopy_mode; bool cfr_rcc_mode; - bool enable_reap_timer_non_pkt; - bool bpr_enable; /* enable time latency check for tx completion */ bool latency_capture_enable; /* enable calculation of delay stats*/ bool delay_stats_flag; - struct { - uint32_t tx_ppdu_id; - uint16_t tx_peer_id; - uint32_t rx_ppdu_id; - } m_copy_id; - - /* To check if PPDU Tx stats are enabled for Pktlog */ - bool pktlog_ppdu_stats; - void *dp_txrx_handle; /* Advanced data path handle */ - -#ifdef ATH_SUPPORT_NAC_RSSI - bool nac_rssi_filtering; -#endif - - /* ppdu_stats lock for queue concurrency between cores*/ - qdf_spinlock_t ppdu_stats_lock; - - /* list of ppdu tlvs */ - TAILQ_HEAD(, ppdu_info) ppdu_info_list; - TAILQ_HEAD(, ppdu_info) sched_comp_ppdu_list; - - uint32_t sched_comp_list_depth; - uint16_t delivered_sched_cmdid; - uint16_t last_sched_cmdid; - uint32_t tlv_count; - uint32_t list_depth; uint32_t ppdu_id; bool first_nbuf; - struct { - qdf_nbuf_t last_nbuf; /*Ptr to mgmt last buf */ - uint8_t *mgmt_buf; /* Ptr to mgmt. payload in HTT ppdu stats */ - uint32_t mgmt_buf_len; /* Len of mgmt. payload in ppdu stats */ - uint32_t ppdu_id; - } mgmtctrl_frm_info; - /* Current noise-floor reading for the pdev channel */ int16_t chan_noise_floor; @@ -2652,8 +2502,6 @@ struct dp_pdev { * with same MAC address across 2 radios */ uint8_t is_primary; - /* Context of cal client timer */ - struct cdp_cal_client *cal_client_ctx; struct cdp_tx_sojourn_stats sojourn_stats; qdf_nbuf_t sojourn_buf; @@ -2662,11 +2510,6 @@ struct dp_pdev { union dp_rx_desc_list_elem_t *free_list_head; union dp_rx_desc_list_elem_t *free_list_tail; - /* Pdev level flag to check peer based pktlog enabled or - * disabled - */ - uint8_t dp_peer_based_pktlog; - /* Cached peer_id from htt_peer_details_tlv */ uint16_t fw_stats_peer_id; @@ -2705,12 +2548,6 @@ struct dp_pdev { #endif /* WLAN_SUPPORT_RX_TAG_STATISTICS */ #endif /* WLAN_SUPPORT_RX_PROTOCOL_TYPE_TAG */ - /* tx packet capture enhancement */ - enum cdp_tx_enh_capture_mode tx_capture_enabled; - struct dp_pdev_tx_capture tx_capture; - - uint32_t *ppdu_tlv_buf; /* Buffer to hold HTT ppdu stats TLVs*/ - #ifdef WLAN_SUPPORT_RX_FLOW_TAG /** * Pointer to DP Flow FST at SOC level if @@ -2728,38 +2565,13 @@ struct dp_pdev { data_stall_detect_cb data_stall_detect_callback; #endif /* WLAN_SUPPORT_DATA_STALL */ - struct dp_mon_filter **filter; /* Monitor Filter pointer */ - -#ifdef QCA_SUPPORT_FULL_MON - /* List to maintain all MPDUs for a PPDU in monitor mode */ - TAILQ_HEAD(, dp_mon_mpdu) mon_mpdu_q; - - /* TODO: define per-user mpdu list - * struct dp_mon_mpdu_list mpdu_list[MAX_MU_USERS]; - */ - struct hal_rx_mon_desc_info *mon_desc; -#endif - qdf_nbuf_t mcopy_status_nbuf; - /* flag to indicate whether LRO hash command has been sent to FW */ uint8_t is_lro_hash_configured; - /* Flag to hold on to monitor destination ring */ - bool hold_mon_dest_ring; - -#ifdef WLAN_ATF_ENABLE - /* ATF stats enable */ - bool dp_atf_stats_enable; -#endif - - /* Maintains first status buffer's paddr of a PPDU */ - uint64_t status_buf_addr; #ifdef HTT_STATS_DEBUGFS_SUPPORT /* HTT stats debugfs params */ struct pdev_htt_stats_dbgfs_cfg *dbgfs_cfg; #endif - /* Flag to inidicate monitor rings are initialized */ - uint8_t pdev_mon_init; struct { qdf_work_t work; qdf_workqueue_t *work_queue; @@ -3560,4 +3372,17 @@ void dp_rx_refill_buff_pool_enqueue(struct dp_soc *soc); #else static inline void dp_rx_refill_buff_pool_enqueue(struct dp_soc *soc) {} #endif +QDF_STATUS dp_srng_alloc(struct dp_soc *soc, struct dp_srng *srng, + int ring_type, uint32_t num_entries, + bool cached); +void dp_srng_free(struct dp_soc *soc, struct dp_srng *srng); +QDF_STATUS dp_srng_init(struct dp_soc *soc, struct dp_srng *srng, + int ring_type, int ring_num, int mac_id); +void dp_srng_deinit(struct dp_soc *soc, struct dp_srng *srng, + int ring_type, int ring_num); + +enum timer_yield_status +dp_should_timer_irq_yield(struct dp_soc *soc, uint32_t work_done, + uint64_t start_time); + #endif /* _DP_TYPES_H_ */ diff --git a/dp/wifi3.0/dp_wdi_event.c b/dp/wifi3.0/dp_wdi_event.c index 17d3d09ea0..b912928cc6 100644 --- a/dp/wifi3.0/dp_wdi_event.c +++ b/dp/wifi3.0/dp_wdi_event.c @@ -25,16 +25,6 @@ #endif #ifdef WDI_EVENT_ENABLE -void *dp_get_pldev(struct cdp_soc_t *soc_hdl, uint8_t pdev_id) -{ - struct dp_soc *soc = cdp_soc_t_to_dp_soc(soc_hdl); - struct dp_pdev *pdev = dp_get_pdev_from_soc_pdev_id_wifi3(soc, pdev_id); - - if (!pdev) - return NULL; - - return pdev->pl_dev; -} /* * dp_wdi_event_next_sub() - Return handle for Next WDI event * @wdi_sub: WDI Event handle diff --git a/dp/wifi3.0/li/dp_li_rx.c b/dp/wifi3.0/li/dp_li_rx.c index 92642191fd..b809d5593c 100644 --- a/dp/wifi3.0/li/dp_li_rx.c +++ b/dp/wifi3.0/li/dp_li_rx.c @@ -31,8 +31,10 @@ #include "if_meta_hdr.h" #endif #include "dp_internal.h" -#include "dp_rx_mon.h" #include "dp_ipa.h" +#ifdef WIFI_MONITOR_SUPPORT +#include +#endif #ifdef FEATURE_WDS #include "dp_txrx_wds.h" #endif diff --git a/dp/wifi3.0/monitor/dp_mon.c b/dp/wifi3.0/monitor/dp_mon.c index bded198b9f..c5a4b42b35 100644 --- a/dp/wifi3.0/monitor/dp_mon.c +++ b/dp/wifi3.0/monitor/dp_mon.c @@ -17,9 +17,9 @@ #include "dp_rx.h" #include "dp_peer.h" #include -#include #include #include +#include #include "htt_ppdu_stats.h" #include "dp_cal_client_api.h" #if defined(DP_CON_MON) @@ -34,6 +34,8 @@ #define RNG_ERR "SRNG setup failed for" #define mon_init_err(params...) QDF_TRACE_ERROR(QDF_MODULE_ID_DP_INIT, params) +#define mon_init_info(params...) \ + __QDF_TRACE_FL(QDF_TRACE_LEVEL_INFO_HIGH, QDF_MODULE_ID_DP_INIT, ## params) #define HTT_MGMT_CTRL_TLV_HDR_RESERVERD_LEN 16 #define HTT_TLV_HDR_LEN HTT_T2H_EXT_STATS_CONF_TLV_HDR_SIZE #define HTT_SHIFT_UPPER_TIMESTAMP 32 @@ -49,19 +51,6 @@ #include "dp_tx_capture.h" #endif -QDF_STATUS dp_srng_alloc(struct dp_soc *soc, struct dp_srng *srng, - int ring_type, uint32_t num_entries, - bool cached); -void dp_srng_free(struct dp_soc *soc, struct dp_srng *srng); -QDF_STATUS dp_srng_init(struct dp_soc *soc, struct dp_srng *srng, - int ring_type, int ring_num, int mac_id); -void dp_srng_deinit(struct dp_soc *soc, struct dp_srng *srng, - int ring_type, int ring_num); - -enum timer_yield_status -dp_should_timer_irq_yield(struct dp_soc *soc, uint32_t work_done, - uint64_t start_time); - static QDF_STATUS dp_vdev_set_monitor_mode_rings(struct dp_pdev *pdev, uint8_t delayed_replenish); @@ -283,8 +272,9 @@ dp_config_full_mon_mode(struct cdp_soc_t *soc_handle, uint8_t val) { struct dp_soc *soc = (struct dp_soc *)soc_handle; + struct dp_mon_soc *mon_soc = soc->monitor_soc; - soc->full_mon_mode = val; + mon_soc->full_mon_mode = val; dp_cdp_err("Configure full monitor mode val: %d ", val); return QDF_STATUS_SUCCESS; @@ -301,9 +291,11 @@ dp_config_full_mon_mode(struct cdp_soc_t *soc_handle, static inline void dp_pdev_disable_mcopy_code(struct dp_pdev *pdev) { - pdev->mcopy_mode = M_COPY_DISABLED; - pdev->monitor_configured = false; - pdev->monitor_vdev = NULL; + struct dp_mon_pdev *mon_pdev = pdev->monitor_pdev; + + mon_pdev->mcopy_mode = M_COPY_DISABLED; + mon_pdev->monitor_configured = false; + mon_pdev->mvdev = NULL; } #ifdef QCA_SUPPORT_FULL_MON @@ -312,8 +304,9 @@ dp_soc_config_full_mon_mode(struct dp_pdev *pdev, enum dp_full_mon_config val) { struct dp_soc *soc = pdev->soc; QDF_STATUS status = QDF_STATUS_SUCCESS; + struct dp_mon_soc *mon_soc = soc->monitor_soc; - if (!soc->full_mon_mode) + if (!mon_soc->full_mon_mode) return QDF_STATUS_SUCCESS; if ((htt_h2t_full_mon_cfg(soc->htt_handle, @@ -348,28 +341,31 @@ QDF_STATUS dp_reset_monitor_mode(struct cdp_soc_t *soc_hdl, dp_get_pdev_from_soc_pdev_id_wifi3((struct dp_soc *)soc, pdev_id); QDF_STATUS status = QDF_STATUS_SUCCESS; + struct dp_mon_pdev *mon_pdev; if (!pdev) return QDF_STATUS_E_FAILURE; - qdf_spin_lock_bh(&pdev->mon_lock); + mon_pdev = pdev->monitor_pdev; + + qdf_spin_lock_bh(&mon_pdev->mon_lock); dp_soc_config_full_mon_mode(pdev, DP_FULL_MON_DISABLE); - pdev->monitor_vdev = NULL; - pdev->monitor_configured = false; + mon_pdev->mvdev = NULL; + mon_pdev->monitor_configured = false; /* * Lite monitor mode, smart monitor mode and monitor * mode uses this APIs to filter reset and mode disable */ - if (pdev->mcopy_mode) { + if (mon_pdev->mcopy_mode) { #if defined(FEATURE_PERPKT_INFO) dp_pdev_disable_mcopy_code(pdev); dp_mon_filter_reset_mcopy_mode(pdev); #endif /* FEATURE_PERPKT_INFO */ } else if (special_monitor) { #if defined(ATH_SUPPORT_NAC) - dp_mon_filter_reset_smart_monitor(pdev); + dp_mon_filter_reset_smart_monitor(mon_pdev); #endif /* ATH_SUPPORT_NAC */ } else { dp_mon_filter_reset_mon_mode(pdev); @@ -381,7 +377,7 @@ QDF_STATUS dp_reset_monitor_mode(struct cdp_soc_t *soc_hdl, soc); } - qdf_spin_unlock_bh(&pdev->mon_lock); + qdf_spin_unlock_bh(&mon_pdev->mon_lock); return QDF_STATUS_SUCCESS; } @@ -405,11 +401,13 @@ dp_pdev_set_advance_monitor_filter(struct cdp_soc_t *soc_hdl, uint8_t pdev_id, dp_get_pdev_from_soc_pdev_id_wifi3((struct dp_soc *)soc, pdev_id); QDF_STATUS status = QDF_STATUS_SUCCESS; + struct dp_mon_pdev *mon_pdev; - if (!pdev) + if (!pdev || !pdev->monitor_pdev) return QDF_STATUS_E_FAILURE; - vdev = pdev->monitor_vdev; + mon_pdev = pdev->monitor_pdev; + vdev = mon_pdev->mvdev; if (!vdev) return QDF_STATUS_E_FAILURE; @@ -419,20 +417,20 @@ dp_pdev_set_advance_monitor_filter(struct cdp_soc_t *soc_hdl, uint8_t pdev_id, pdev, pdev_id, soc, vdev); /*Check if current pdev's monitor_vdev exists */ - if (!pdev->monitor_vdev) { + if (!mon_pdev->mvdev) { QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR, "vdev=%pK", vdev); qdf_assert(vdev); } /* update filter mode, type in pdev structure */ - pdev->mon_filter_mode = filter_val->mode; - pdev->fp_mgmt_filter = filter_val->fp_mgmt; - pdev->fp_ctrl_filter = filter_val->fp_ctrl; - pdev->fp_data_filter = filter_val->fp_data; - pdev->mo_mgmt_filter = filter_val->mo_mgmt; - pdev->mo_ctrl_filter = filter_val->mo_ctrl; - pdev->mo_data_filter = filter_val->mo_data; + mon_pdev->mon_filter_mode = filter_val->mode; + mon_pdev->fp_mgmt_filter = filter_val->fp_mgmt; + mon_pdev->fp_ctrl_filter = filter_val->fp_ctrl; + mon_pdev->fp_data_filter = filter_val->fp_data; + mon_pdev->mo_mgmt_filter = filter_val->mo_mgmt; + mon_pdev->mo_ctrl_filter = filter_val->mo_ctrl; + mon_pdev->mo_data_filter = filter_val->mo_data; dp_mon_filter_setup_mon_mode(pdev); status = dp_mon_filter_update(pdev); @@ -482,12 +480,19 @@ static QDF_STATUS dp_vdev_set_monitor_mode(struct cdp_soc_t *dp_soc, struct dp_vdev *vdev = dp_vdev_get_ref_by_id(soc, vdev_id, DP_MOD_ID_CDP); QDF_STATUS status = QDF_STATUS_SUCCESS; + struct dp_mon_pdev *mon_pdev; if (!vdev) return QDF_STATUS_E_FAILURE; pdev = vdev->pdev; - pdev->monitor_vdev = vdev; + + if (!pdev || !pdev->monitor_pdev) + return QDF_STATUS_E_FAILURE; + + mon_pdev = pdev->monitor_pdev; + mon_pdev->mvdev = vdev; + QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_WARN, "pdev=%pK, pdev_id=%d, soc=%pK vdev=%pK\n", pdev, pdev->pdev_id, pdev->soc, vdev); @@ -506,14 +511,14 @@ static QDF_STATUS dp_vdev_set_monitor_mode(struct cdp_soc_t *dp_soc, } /*Check if current pdev's monitor_vdev exists */ - if (pdev->monitor_configured) { + if (mon_pdev->monitor_configured) { QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_DEBUG, "monitor vap already created vdev=%pK\n", vdev); status = QDF_STATUS_E_RESOURCES; goto fail; } - pdev->monitor_configured = true; + mon_pdev->monitor_configured = true; dp_soc_config_full_mon_mode(pdev, DP_FULL_MON_ENABLE); dp_mon_filter_setup_mon_mode(pdev); @@ -521,8 +526,8 @@ static QDF_STATUS dp_vdev_set_monitor_mode(struct cdp_soc_t *dp_soc, if (status != QDF_STATUS_SUCCESS) { dp_cdp_err("%pK: Failed to reset monitor filters", soc); dp_mon_filter_reset_mon_mode(pdev); - pdev->monitor_configured = false; - pdev->monitor_vdev = NULL; + mon_pdev->monitor_configured = false; + mon_pdev->mvdev = NULL; } fail: @@ -541,13 +546,14 @@ static QDF_STATUS dp_config_debug_sniffer(struct dp_pdev *pdev, int val) { QDF_STATUS status = QDF_STATUS_SUCCESS; + struct dp_mon_pdev *mon_pdev = pdev->monitor_pdev; /* * Note: The mirror copy mode cannot co-exist with any other * monitor modes. Hence disabling the filter for this mode will * reset the monitor destination ring filters. */ - if (pdev->mcopy_mode) { + if (mon_pdev->mcopy_mode) { #ifdef FEATURE_PERPKT_INFO dp_soc_config_full_mon_mode(pdev, DP_FULL_MON_DISABLE); dp_pdev_disable_mcopy_code(pdev); @@ -561,8 +567,8 @@ dp_config_debug_sniffer(struct dp_pdev *pdev, int val) } switch (val) { case 0: - pdev->tx_sniffer_enable = 0; - pdev->monitor_configured = false; + mon_pdev->tx_sniffer_enable = 0; + mon_pdev->monitor_configured = false; /* * We don't need to reset the Rx monitor status ring or call @@ -570,14 +576,12 @@ dp_config_debug_sniffer(struct dp_pdev *pdev, int val) * disabled. The Rx monitor status ring will be disabled when * the last mode using the monitor status ring get disabled. */ - if (!pdev->pktlog_ppdu_stats && !pdev->enhanced_stats_en && - !pdev->bpr_enable) { + if (!mon_pdev->pktlog_ppdu_stats && + !mon_pdev->enhanced_stats_en && + !mon_pdev->bpr_enable) { dp_h2t_cfg_stats_msg_send(pdev, 0, pdev->pdev_id); - } else if (pdev->enhanced_stats_en && !pdev->bpr_enable) { - dp_h2t_cfg_stats_msg_send(pdev, - DP_PPDU_STATS_CFG_ENH_STATS, - pdev->pdev_id); - } else if (!pdev->enhanced_stats_en && pdev->bpr_enable) { + } else if (!mon_pdev->enhanced_stats_en && + mon_pdev->bpr_enable) { dp_h2t_cfg_stats_msg_send(pdev, DP_PPDU_STATS_CFG_BPR_ENH, pdev->pdev_id); @@ -589,25 +593,25 @@ dp_config_debug_sniffer(struct dp_pdev *pdev, int val) break; case 1: - pdev->tx_sniffer_enable = 1; - pdev->monitor_configured = false; + mon_pdev->tx_sniffer_enable = 1; + mon_pdev->monitor_configured = false; - if (!pdev->pktlog_ppdu_stats) + if (!mon_pdev->pktlog_ppdu_stats) dp_h2t_cfg_stats_msg_send(pdev, DP_PPDU_STATS_CFG_SNIFFER, pdev->pdev_id); break; case 2: case 4: - if (pdev->monitor_vdev) { + if (mon_pdev->mvdev) { status = QDF_STATUS_E_RESOURCES; break; } #ifdef FEATURE_PERPKT_INFO - pdev->mcopy_mode = val; - pdev->tx_sniffer_enable = 0; - pdev->monitor_configured = true; + mon_pdev->mcopy_mode = val; + mon_pdev->tx_sniffer_enable = 0; + mon_pdev->monitor_configured = true; if (!wlan_cfg_is_delay_mon_replenish(pdev->soc->wlan_cfg_ctx)) dp_vdev_set_monitor_mode_rings(pdev, true); @@ -626,7 +630,7 @@ dp_config_debug_sniffer(struct dp_pdev *pdev, int val) return status; } - if (!pdev->pktlog_ppdu_stats) + if (!mon_pdev->pktlog_ppdu_stats) dp_h2t_cfg_stats_msg_send(pdev, DP_PPDU_STATS_CFG_SNIFFER, pdev->pdev_id); @@ -650,18 +654,19 @@ static void dp_flush_monitor_rings(struct dp_soc *soc) uint8_t dp_intr_id; int budget; void *mon_dst_srng; + struct dp_mon_pdev *mon_pdev = pdev->monitor_pdev; /* Reset monitor filters before reaping the ring*/ - qdf_spin_lock_bh(&pdev->mon_lock); + qdf_spin_lock_bh(&mon_pdev->mon_lock); dp_mon_filter_reset_mon_mode(pdev); if (dp_mon_filter_update(pdev) != QDF_STATUS_SUCCESS) dp_info("failed to reset monitor filters"); - qdf_spin_unlock_bh(&pdev->mon_lock); + qdf_spin_unlock_bh(&mon_pdev->mon_lock); - if (pdev->mon_chan_band == REG_BAND_UNKNOWN) + if (mon_pdev->mon_chan_band == REG_BAND_UNKNOWN) return; - lmac_id = pdev->ch_band_lmac_id_mapping[pdev->mon_chan_band]; + lmac_id = pdev->ch_band_lmac_id_mapping[mon_pdev->mon_chan_band]; if (qdf_unlikely(lmac_id == DP_MON_INVALID_LMAC_ID)) return; @@ -829,10 +834,11 @@ static uint8_t dp_get_mon_vdev_from_pdev_wifi3(struct cdp_soc_t *soc_hdl, struct dp_soc *soc = cdp_soc_t_to_dp_soc(soc_hdl); struct dp_pdev *pdev = dp_get_pdev_from_soc_pdev_id_wifi3(soc, pdev_id); - if (qdf_unlikely(!pdev || !pdev->monitor_vdev)) + if (qdf_unlikely(!pdev || !pdev->monitor_pdev || + !pdev->monitor_pdev->mvdev)) return -EINVAL; - return pdev->monitor_vdev->vdev_id; + return pdev->monitor_pdev->mvdev->vdev_id; } /* @@ -870,12 +876,14 @@ dp_peer_tx_cleanup(struct dp_vdev *vdev, struct dp_peer *peer) */ void dp_deliver_mgmt_frm(struct dp_pdev *pdev, qdf_nbuf_t nbuf) { - if (pdev->tx_sniffer_enable || pdev->mcopy_mode) { + struct dp_mon_pdev *mon_pdev = pdev->monitor_pdev; + + if (mon_pdev->tx_sniffer_enable || mon_pdev->mcopy_mode) { dp_wdi_event_handler(WDI_EVENT_TX_MGMT_CTRL, pdev->soc, nbuf, HTT_INVALID_PEER, WDI_NO_VAL, pdev->pdev_id); } else { - if (!pdev->bpr_enable) + if (!mon_pdev->bpr_enable) qdf_nbuf_free(nbuf); } } @@ -900,9 +908,10 @@ dp_process_ppdu_stats_tx_mgmtctrl_payload_tlv(struct dp_pdev *pdev, struct cdp_tx_mgmt_comp_info *ptr_mgmt_comp_info; uint32_t *msg_word; uint32_t tsf_hdr; + struct dp_mon_pdev *mon_pdev = pdev->monitor_pdev; - if ((!pdev->tx_sniffer_enable) && (!pdev->mcopy_mode) && - (!pdev->bpr_enable) && (!pdev->tx_capture_enabled)) + if ((!mon_pdev->tx_sniffer_enable) && (!mon_pdev->mcopy_mode) && + (!mon_pdev->bpr_enable) && (!mon_pdev->tx_capture_enabled)) return QDF_STATUS_SUCCESS; /* @@ -912,7 +921,7 @@ dp_process_ppdu_stats_tx_mgmtctrl_payload_tlv(struct dp_pdev *pdev, msg_word = msg_word + 2; tsf_hdr = *msg_word; - trim_size = ((pdev->mgmtctrl_frm_info.mgmt_buf + + trim_size = ((mon_pdev->mgmtctrl_frm_info.mgmt_buf + HTT_MGMT_CTRL_TLV_HDR_RESERVERD_LEN) - qdf_nbuf_data(tag_buf)); @@ -920,9 +929,9 @@ dp_process_ppdu_stats_tx_mgmtctrl_payload_tlv(struct dp_pdev *pdev, return QDF_STATUS_SUCCESS; qdf_nbuf_trim_tail(tag_buf, qdf_nbuf_len(tag_buf) - - pdev->mgmtctrl_frm_info.mgmt_buf_len); + mon_pdev->mgmtctrl_frm_info.mgmt_buf_len); - if (pdev->tx_capture_enabled) { + if (mon_pdev->tx_capture_enabled) { head_size = sizeof(struct cdp_tx_mgmt_comp_info); if (qdf_unlikely(qdf_nbuf_headroom(tag_buf) < head_size)) { qdf_err("Fail to get headroom h_sz %zu h_avail %d\n", @@ -941,7 +950,7 @@ dp_process_ppdu_stats_tx_mgmtctrl_payload_tlv(struct dp_pdev *pdev, nbuf_ptr = (uint32_t *)qdf_nbuf_push_head(tag_buf, head_size); *nbuf_ptr = ppdu_id; } - if (pdev->bpr_enable) { + if (mon_pdev->bpr_enable) { dp_wdi_event_handler(WDI_EVENT_TX_BEACON, pdev->soc, tag_buf, HTT_INVALID_PEER, WDI_NO_VAL, pdev->pdev_id); @@ -2177,6 +2186,7 @@ dp_process_ppdu_stats_user_compltn_flush_tlv(struct dp_pdev *pdev, uint32_t peer_id; uint8_t tid; struct dp_peer *peer; + struct dp_mon_pdev *mon_pdev = pdev->monitor_pdev; ppdu_desc = (struct cdp_tx_completion_ppdu *) qdf_nbuf_data(ppdu_info->nbuf); @@ -2216,11 +2226,11 @@ dp_process_ppdu_stats_user_compltn_flush_tlv(struct dp_pdev *pdev, add_ppdu_to_sched_list: ppdu_info->done = 1; - TAILQ_REMOVE(&pdev->ppdu_info_list, ppdu_info, ppdu_info_list_elem); - pdev->list_depth--; - TAILQ_INSERT_TAIL(&pdev->sched_comp_ppdu_list, ppdu_info, + TAILQ_REMOVE(&mon_pdev->ppdu_info_list, ppdu_info, ppdu_info_list_elem); + mon_pdev->list_depth--; + TAILQ_INSERT_TAIL(&mon_pdev->sched_comp_ppdu_list, ppdu_info, ppdu_info_list_elem); - pdev->sched_comp_list_depth++; + mon_pdev->sched_comp_list_depth++; } /** @@ -2239,6 +2249,7 @@ dp_process_ppdu_stats_sch_cmd_status_tlv(struct dp_pdev *pdev, struct dp_peer *peer; uint8_t num_users; uint8_t i; + struct dp_mon_pdev *mon_pdev = pdev->monitor_pdev; ppdu_desc = (struct cdp_tx_completion_ppdu *) qdf_nbuf_data(ppdu_info->nbuf); @@ -2364,11 +2375,11 @@ dp_process_ppdu_stats_sch_cmd_status_tlv(struct dp_pdev *pdev, } } - TAILQ_REMOVE(&pdev->ppdu_info_list, ppdu_info, ppdu_info_list_elem); - pdev->list_depth--; - TAILQ_INSERT_TAIL(&pdev->sched_comp_ppdu_list, ppdu_info, + TAILQ_REMOVE(&mon_pdev->ppdu_info_list, ppdu_info, ppdu_info_list_elem); + mon_pdev->list_depth--; + TAILQ_INSERT_TAIL(&mon_pdev->sched_comp_ppdu_list, ppdu_info, ppdu_info_list_elem); - pdev->sched_comp_list_depth++; + mon_pdev->sched_comp_list_depth++; } /** @@ -2391,13 +2402,14 @@ static inline uint32_t *dp_validate_fix_ppdu_tlv(struct dp_pdev *pdev, uint16_t tlv_len) { uint32_t *tlv_desc = tag_buf; + struct dp_mon_pdev *mon_pdev = pdev->monitor_pdev; qdf_assert_always(tlv_len != 0); if (tlv_len < tlv_expected_size) { - qdf_mem_zero(pdev->ppdu_tlv_buf, tlv_expected_size); - qdf_mem_copy(pdev->ppdu_tlv_buf, tag_buf, tlv_len); - tlv_desc = pdev->ppdu_tlv_buf; + qdf_mem_zero(mon_pdev->ppdu_tlv_buf, tlv_expected_size); + qdf_mem_copy(mon_pdev->ppdu_tlv_buf, tag_buf, tlv_len); + tlv_desc = mon_pdev->ppdu_tlv_buf; } return tlv_desc; @@ -2520,11 +2532,12 @@ dp_ppdu_desc_user_phy_tx_time_update(struct dp_pdev *pdev, struct cdp_tx_completion_ppdu_user *user) { uint32_t nss_ru_width_sum = 0; + struct dp_mon_pdev *mon_pdev = pdev->monitor_pdev; if (!pdev || !ppdu_desc || !user) return; - if (!pdev->dp_atf_stats_enable) + if (!mon_pdev->dp_atf_stats_enable) return; if (ppdu_desc->frame_type != CDP_PPDU_FTYPE_DATA) @@ -2576,6 +2589,7 @@ dp_ppdu_desc_user_stats_update(struct dp_pdev *pdev, uint32_t tlv_bitmap_default; uint16_t i; uint32_t num_users; + struct dp_mon_pdev *mon_pdev = pdev->monitor_pdev; ppdu_desc = (struct cdp_tx_completion_ppdu *) qdf_nbuf_data(ppdu_info->nbuf); @@ -2584,8 +2598,8 @@ dp_ppdu_desc_user_stats_update(struct dp_pdev *pdev, ppdu_desc->ppdu_id = ppdu_info->ppdu_id; tlv_bitmap_expected = HTT_PPDU_DEFAULT_TLV_BITMAP; - if (pdev->tx_sniffer_enable || pdev->mcopy_mode || - pdev->tx_capture_enabled) { + if (mon_pdev->tx_sniffer_enable || mon_pdev->mcopy_mode || + mon_pdev->tx_capture_enabled) { if (ppdu_info->is_ampdu) tlv_bitmap_expected = dp_htt_get_ppdu_sniffer_ampdu_tlv_bitmap( @@ -2686,17 +2700,18 @@ void dp_ppdu_desc_deliver(struct dp_pdev *pdev, bool starved = 0; bool matched = 0; bool recv_ack_ba_done = 0; + struct dp_mon_pdev *mon_pdev = pdev->monitor_pdev; if (ppdu_info->tlv_bitmap & (1 << HTT_PPDU_STATS_USR_COMPLTN_ACK_BA_STATUS_TLV) && ppdu_info->done) recv_ack_ba_done = 1; - pdev->last_sched_cmdid = ppdu_info->sched_cmdid; + mon_pdev->last_sched_cmdid = ppdu_info->sched_cmdid; - s_ppdu_info = TAILQ_FIRST(&pdev->sched_comp_ppdu_list); + s_ppdu_info = TAILQ_FIRST(&mon_pdev->sched_comp_ppdu_list); - TAILQ_FOREACH_SAFE(s_ppdu_info, &pdev->sched_comp_ppdu_list, + TAILQ_FOREACH_SAFE(s_ppdu_info, &mon_pdev->sched_comp_ppdu_list, ppdu_info_list_elem, ppdu_info_next) { if (s_ppdu_info->tsf_l32 > ppdu_info->tsf_l32) time_delta = (MAX_TSF_32 - s_ppdu_info->tsf_l32) + @@ -2718,10 +2733,10 @@ void dp_ppdu_desc_deliver(struct dp_pdev *pdev, starved = 1; } - pdev->delivered_sched_cmdid = s_ppdu_info->sched_cmdid; - TAILQ_REMOVE(&pdev->sched_comp_ppdu_list, s_ppdu_info, + mon_pdev->delivered_sched_cmdid = s_ppdu_info->sched_cmdid; + TAILQ_REMOVE(&mon_pdev->sched_comp_ppdu_list, s_ppdu_info, ppdu_info_list_elem); - pdev->sched_comp_list_depth--; + mon_pdev->sched_comp_list_depth--; nbuf = s_ppdu_info->nbuf; qdf_assert_always(nbuf); @@ -2753,7 +2768,7 @@ void dp_ppdu_desc_deliver(struct dp_pdev *pdev, * for all frames including mgmt/control * frames should be delivered to upper layer */ - if (pdev->tx_sniffer_enable || pdev->mcopy_mode) { + if (mon_pdev->tx_sniffer_enable || mon_pdev->mcopy_mode) { dp_wdi_event_handler(WDI_EVENT_TX_PPDU_DESC, pdev->soc, nbuf, HTT_INVALID_PEER, @@ -2805,11 +2820,12 @@ struct ppdu_info *dp_get_ppdu_desc(struct dp_pdev *pdev, uint32_t ppdu_id, struct cdp_tx_completion_ppdu *tmp_ppdu_desc = NULL; struct cdp_tx_completion_ppdu_user *tmp_user; uint32_t time_delta; + struct dp_mon_pdev *mon_pdev = pdev->monitor_pdev; /* * Find ppdu_id node exists or not */ - TAILQ_FOREACH_SAFE(ppdu_info, &pdev->ppdu_info_list, + TAILQ_FOREACH_SAFE(ppdu_info, &mon_pdev->ppdu_info_list, ppdu_info_list_elem, ppdu_info_next) { if (ppdu_info && (ppdu_info->ppdu_id == ppdu_id)) { if (ppdu_info->tsf_l32 > tsf_l32) @@ -2819,9 +2835,9 @@ struct ppdu_info *dp_get_ppdu_desc(struct dp_pdev *pdev, uint32_t ppdu_id, time_delta = tsf_l32 - ppdu_info->tsf_l32; if (time_delta > WRAP_DROP_TSF_DELTA) { - TAILQ_REMOVE(&pdev->ppdu_info_list, + TAILQ_REMOVE(&mon_pdev->ppdu_info_list, ppdu_info, ppdu_info_list_elem); - pdev->list_depth--; + mon_pdev->list_depth--; pdev->stats.ppdu_wrap_drop++; tmp_ppdu_desc = (struct cdp_tx_completion_ppdu *) @@ -2852,7 +2868,7 @@ struct ppdu_info *dp_get_ppdu_desc(struct dp_pdev *pdev, uint32_t ppdu_id, if (!ppdu_info && tlv_type == HTT_PPDU_STATS_USR_COMPLTN_ACK_BA_STATUS_TLV) { TAILQ_FOREACH(s_ppdu_info, - &pdev->sched_comp_ppdu_list, + &mon_pdev->sched_comp_ppdu_list, ppdu_info_list_elem) { if (s_ppdu_info && (s_ppdu_info->ppdu_id == ppdu_id)) { if (s_ppdu_info->tsf_l32 > tsf_l32) @@ -2919,11 +2935,11 @@ struct ppdu_info *dp_get_ppdu_desc(struct dp_pdev *pdev, uint32_t ppdu_id, * Flush the head ppdu descriptor if ppdu desc list reaches max * threshold */ - if (pdev->list_depth > HTT_PPDU_DESC_MAX_DEPTH) { - ppdu_info = TAILQ_FIRST(&pdev->ppdu_info_list); - TAILQ_REMOVE(&pdev->ppdu_info_list, + if (mon_pdev->list_depth > HTT_PPDU_DESC_MAX_DEPTH) { + ppdu_info = TAILQ_FIRST(&mon_pdev->ppdu_info_list); + TAILQ_REMOVE(&mon_pdev->ppdu_info_list, ppdu_info, ppdu_info_list_elem); - pdev->list_depth--; + mon_pdev->list_depth--; pdev->stats.ppdu_drop++; qdf_nbuf_free(ppdu_info->nbuf); ppdu_info->nbuf = NULL; @@ -2967,9 +2983,9 @@ struct ppdu_info *dp_get_ppdu_desc(struct dp_pdev *pdev, uint32_t ppdu_id, * No lock is needed because all PPDU TLVs are processed in * same context and this list is updated in same context */ - TAILQ_INSERT_TAIL(&pdev->ppdu_info_list, ppdu_info, + TAILQ_INSERT_TAIL(&mon_pdev->ppdu_info_list, ppdu_info, ppdu_info_list_elem); - pdev->list_depth++; + mon_pdev->list_depth++; return ppdu_info; } @@ -2993,6 +3009,7 @@ static struct ppdu_info *dp_htt_process_tlv(struct dp_pdev *pdev, struct cdp_tx_completion_ppdu *ppdu_desc = NULL; uint8_t max_users = CDP_MU_MAX_USERS; uint32_t tsf_l32; + struct dp_mon_pdev *mon_pdev = pdev->monitor_pdev; uint32_t *msg_word = (uint32_t *)qdf_nbuf_data(htt_t2h_msg); @@ -3023,9 +3040,9 @@ static struct ppdu_info *dp_htt_process_tlv(struct dp_pdev *pdev, * doesn't contain any ppdu information */ if (tlv_type == HTT_PPDU_STATS_TX_MGMTCTRL_PAYLOAD_TLV) { - pdev->mgmtctrl_frm_info.mgmt_buf = tlv_buf; - pdev->mgmtctrl_frm_info.ppdu_id = ppdu_id; - pdev->mgmtctrl_frm_info.mgmt_buf_len = + mon_pdev->mgmtctrl_frm_info.mgmt_buf = tlv_buf; + mon_pdev->mgmtctrl_frm_info.ppdu_id = ppdu_id; + mon_pdev->mgmtctrl_frm_info.mgmt_buf_len = HTT_PPDU_STATS_TX_MGMTCTRL_TLV_FRAME_LENGTH_GET (*(msg_word + 1)); msg_word = @@ -3060,8 +3077,8 @@ static struct ppdu_info *dp_htt_process_tlv(struct dp_pdev *pdev, * Increment pdev level tlv count to monitor * missing TLVs */ - pdev->tlv_count++; - ppdu_info->last_tlv_cnt = pdev->tlv_count; + mon_pdev->tlv_count++; + ppdu_info->last_tlv_cnt = mon_pdev->tlv_count; msg_word = (uint32_t *)((uint8_t *)tlv_buf + tlv_length); length -= (tlv_length); } @@ -3073,8 +3090,8 @@ static struct ppdu_info *dp_htt_process_tlv(struct dp_pdev *pdev, tlv_bitmap_expected = HTT_PPDU_DEFAULT_TLV_BITMAP; - if (pdev->tx_sniffer_enable || pdev->mcopy_mode || - pdev->tx_capture_enabled) { + if (mon_pdev->tx_sniffer_enable || mon_pdev->mcopy_mode || + mon_pdev->tx_capture_enabled) { if (ppdu_info->is_ampdu) tlv_bitmap_expected = dp_htt_get_ppdu_sniffer_ampdu_tlv_bitmap( @@ -3159,6 +3176,7 @@ static bool dp_txrx_ppdu_stats_handler(struct dp_soc *soc, struct dp_pdev *pdev = soc->pdev_list[pdev_id]; struct ppdu_info *ppdu_info = NULL; bool free_buf = true; + struct dp_mon_pdev *mon_pdev = pdev->monitor_pdev; if (pdev_id >= MAX_PDEV_CNT) return true; @@ -3167,16 +3185,16 @@ static bool dp_txrx_ppdu_stats_handler(struct dp_soc *soc, if (!pdev) return true; - if (!pdev->enhanced_stats_en && !pdev->tx_sniffer_enable && - !pdev->mcopy_mode && !pdev->bpr_enable) + if (!mon_pdev->enhanced_stats_en && !mon_pdev->tx_sniffer_enable && + !mon_pdev->mcopy_mode && !mon_pdev->bpr_enable) return free_buf; - qdf_spin_lock_bh(&pdev->ppdu_stats_lock); + qdf_spin_lock_bh(&mon_pdev->ppdu_stats_lock); ppdu_info = dp_htt_process_tlv(pdev, htt_t2h_msg); - if (pdev->mgmtctrl_frm_info.mgmt_buf) { + if (mon_pdev->mgmtctrl_frm_info.mgmt_buf) { if (dp_process_ppdu_stats_tx_mgmtctrl_payload_tlv - (pdev, htt_t2h_msg, pdev->mgmtctrl_frm_info.ppdu_id) != + (pdev, htt_t2h_msg, mon_pdev->mgmtctrl_frm_info.ppdu_id) != QDF_STATUS_SUCCESS) free_buf = false; } @@ -3184,11 +3202,11 @@ static bool dp_txrx_ppdu_stats_handler(struct dp_soc *soc, if (ppdu_info) dp_ppdu_desc_deliver(pdev, ppdu_info); - pdev->mgmtctrl_frm_info.mgmt_buf = NULL; - pdev->mgmtctrl_frm_info.mgmt_buf_len = 0; - pdev->mgmtctrl_frm_info.ppdu_id = 0; + mon_pdev->mgmtctrl_frm_info.mgmt_buf = NULL; + mon_pdev->mgmtctrl_frm_info.mgmt_buf_len = 0; + mon_pdev->mgmtctrl_frm_info.ppdu_id = 0; - qdf_spin_unlock_bh(&pdev->ppdu_stats_lock); + qdf_spin_unlock_bh(&mon_pdev->ppdu_stats_lock); return free_buf; } @@ -3242,9 +3260,11 @@ dp_ppdu_stats_ind_handler(struct htt_soc *soc, */ static QDF_STATUS dp_htt_ppdu_stats_attach(struct dp_pdev *pdev) { - pdev->ppdu_tlv_buf = qdf_mem_malloc(HTT_T2H_MAX_MSG_SIZE); + struct dp_mon_pdev *mon_pdev = pdev->monitor_pdev; - if (!pdev->ppdu_tlv_buf) { + mon_pdev->ppdu_tlv_buf = qdf_mem_malloc(HTT_T2H_MAX_MSG_SIZE); + + if (!mon_pdev->ppdu_tlv_buf) { QDF_TRACE_ERROR(QDF_MODULE_ID_DP, "ppdu_tlv_buf alloc fail"); return QDF_STATUS_E_NOMEM; } @@ -3261,33 +3281,35 @@ static QDF_STATUS dp_htt_ppdu_stats_attach(struct dp_pdev *pdev) static void dp_htt_ppdu_stats_detach(struct dp_pdev *pdev) { struct ppdu_info *ppdu_info, *ppdu_info_next; + struct dp_mon_pdev *mon_pdev = pdev->monitor_pdev; - TAILQ_FOREACH_SAFE(ppdu_info, &pdev->ppdu_info_list, + + TAILQ_FOREACH_SAFE(ppdu_info, &mon_pdev->ppdu_info_list, ppdu_info_list_elem, ppdu_info_next) { if (!ppdu_info) break; - TAILQ_REMOVE(&pdev->ppdu_info_list, + TAILQ_REMOVE(&mon_pdev->ppdu_info_list, ppdu_info, ppdu_info_list_elem); - pdev->list_depth--; + mon_pdev->list_depth--; qdf_assert_always(ppdu_info->nbuf); qdf_nbuf_free(ppdu_info->nbuf); qdf_mem_free(ppdu_info); } - TAILQ_FOREACH_SAFE(ppdu_info, &pdev->sched_comp_ppdu_list, + TAILQ_FOREACH_SAFE(ppdu_info, &mon_pdev->sched_comp_ppdu_list, ppdu_info_list_elem, ppdu_info_next) { if (!ppdu_info) break; - TAILQ_REMOVE(&pdev->sched_comp_ppdu_list, + TAILQ_REMOVE(&mon_pdev->sched_comp_ppdu_list, ppdu_info, ppdu_info_list_elem); - pdev->sched_comp_list_depth--; + mon_pdev->sched_comp_list_depth--; qdf_assert_always(ppdu_info->nbuf); qdf_nbuf_free(ppdu_info->nbuf); qdf_mem_free(ppdu_info); } - if (pdev->ppdu_tlv_buf) - qdf_mem_free(pdev->ppdu_tlv_buf); + if (mon_pdev->ppdu_tlv_buf) + qdf_mem_free(mon_pdev->ppdu_tlv_buf); } void @@ -3297,8 +3319,9 @@ dp_print_pdev_rx_mon_stats(struct dp_pdev *pdev) uint32_t *stat_ring_ppdu_ids; uint32_t *dest_ring_ppdu_ids; int i, idx; + struct dp_mon_pdev *mon_pdev = pdev->monitor_pdev; - rx_mon_stats = &pdev->rx_mon_stats; + rx_mon_stats = &mon_pdev->rx_mon_stats; DP_PRINT_STATS("PDEV Rx Monitor Stats:\n"); @@ -3348,7 +3371,7 @@ dp_print_pdev_rx_mon_stats(struct dp_pdev *pdev) if (!stat_ring_ppdu_ids || !dest_ring_ppdu_ids) DP_PRINT_STATS("Unable to allocate ppdu id hist mem\n"); - qdf_spin_lock_bh(&pdev->mon_lock); + qdf_spin_lock_bh(&mon_pdev->mon_lock); idx = rx_mon_stats->ppdu_id_hist_idx; qdf_mem_copy(stat_ring_ppdu_ids, rx_mon_stats->stat_ring_ppdu_id_hist, @@ -3356,7 +3379,7 @@ dp_print_pdev_rx_mon_stats(struct dp_pdev *pdev) qdf_mem_copy(dest_ring_ppdu_ids, rx_mon_stats->dest_ring_ppdu_id_hist, sizeof(uint32_t) * MAX_PPDU_ID_HIST); - qdf_spin_unlock_bh(&pdev->mon_lock); + qdf_spin_unlock_bh(&mon_pdev->mon_lock); DP_PRINT_STATS("PPDU Id history:"); DP_PRINT_STATS("stat_ring_ppdu_ids\t dest_ring_ppdu_ids"); @@ -3382,34 +3405,40 @@ dp_print_pdev_rx_mon_stats(struct dp_pdev *pdev) static QDF_STATUS dp_set_bpr_enable(struct dp_pdev *pdev, int val) { + struct dp_mon_pdev *mon_pdev = pdev->monitor_pdev; + switch (val) { case CDP_BPR_DISABLE: - pdev->bpr_enable = CDP_BPR_DISABLE; - if (!pdev->pktlog_ppdu_stats && !pdev->enhanced_stats_en && - !pdev->tx_sniffer_enable && !pdev->mcopy_mode) { + mon_pdev->bpr_enable = CDP_BPR_DISABLE; + if (!mon_pdev->pktlog_ppdu_stats && + !mon_pdev->enhanced_stats_en && + !mon_pdev->tx_sniffer_enable && !mon_pdev->mcopy_mode) { dp_h2t_cfg_stats_msg_send(pdev, 0, pdev->pdev_id); - } else if (pdev->enhanced_stats_en && - !pdev->tx_sniffer_enable && !pdev->mcopy_mode && - !pdev->pktlog_ppdu_stats) { + } else if (mon_pdev->enhanced_stats_en && + !mon_pdev->tx_sniffer_enable && + !mon_pdev->mcopy_mode && + !mon_pdev->pktlog_ppdu_stats) { dp_h2t_cfg_stats_msg_send(pdev, DP_PPDU_STATS_CFG_ENH_STATS, pdev->pdev_id); } break; case CDP_BPR_ENABLE: - pdev->bpr_enable = CDP_BPR_ENABLE; - if (!pdev->enhanced_stats_en && !pdev->tx_sniffer_enable && - !pdev->mcopy_mode && !pdev->pktlog_ppdu_stats) { + mon_pdev->bpr_enable = CDP_BPR_ENABLE; + if (!mon_pdev->enhanced_stats_en && + !mon_pdev->tx_sniffer_enable && + !mon_pdev->mcopy_mode && !mon_pdev->pktlog_ppdu_stats) { dp_h2t_cfg_stats_msg_send(pdev, DP_PPDU_STATS_CFG_BPR, pdev->pdev_id); - } else if (pdev->enhanced_stats_en && - !pdev->tx_sniffer_enable && !pdev->mcopy_mode && - !pdev->pktlog_ppdu_stats) { + } else if (mon_pdev->enhanced_stats_en && + !mon_pdev->tx_sniffer_enable && + !mon_pdev->mcopy_mode && + !mon_pdev->pktlog_ppdu_stats) { dp_h2t_cfg_stats_msg_send(pdev, DP_PPDU_STATS_CFG_BPR_ENH, pdev->pdev_id); - } else if (pdev->pktlog_ppdu_stats) { + } else if (mon_pdev->pktlog_ppdu_stats) { dp_h2t_cfg_stats_msg_send(pdev, DP_PPDU_STATS_CFG_BPR_PKTLOG, pdev->pdev_id); @@ -3436,7 +3465,7 @@ static int dp_set_filter_neigh_peers(struct dp_pdev *pdev, /* Enable/Disable smart mesh filtering. This flag will be checked * during rx processing to check if packets are from NAC clients. */ - pdev->filter_neighbour_peers = val; + pdev->monitor_pdev->filter_neighbour_peers = val; return 0; } #endif /* ATH_SUPPORT_NAC */ @@ -3449,7 +3478,7 @@ static void dp_set_atf_stats_enable(struct dp_pdev *pdev, bool value) return; } - pdev->dp_atf_stats_enable = value; + pdev->monitor_pdev->dp_atf_stats_enable = value; } #endif @@ -3461,7 +3490,7 @@ static void dp_set_atf_stats_enable(struct dp_pdev *pdev, bool value) static void dp_mon_set_bsscolor(struct dp_pdev *pdev, uint8_t bsscolor) { - pdev->rx_mon_recv_status.bsscolor = bsscolor; + pdev->monitor_pdev->rx_mon_recv_status.bsscolor = bsscolor; } /** @@ -3473,9 +3502,10 @@ dp_mon_set_bsscolor(struct dp_pdev *pdev, uint8_t bsscolor) static bool dp_pdev_get_filter_ucast_data(struct cdp_pdev *pdev_handle) { struct dp_pdev *pdev = (struct dp_pdev *)pdev_handle; + struct dp_mon_pdev *mon_pdev = pdev->monitor_pdev; - if ((pdev->fp_data_filter & FILTER_DATA_UCAST) || - (pdev->mo_data_filter & FILTER_DATA_UCAST)) + if ((mon_pdev->fp_data_filter & FILTER_DATA_UCAST) || + (mon_pdev->mo_data_filter & FILTER_DATA_UCAST)) return true; return false; @@ -3489,9 +3519,10 @@ static bool dp_pdev_get_filter_ucast_data(struct cdp_pdev *pdev_handle) static bool dp_pdev_get_filter_mcast_data(struct cdp_pdev *pdev_handle) { struct dp_pdev *pdev = (struct dp_pdev *)pdev_handle; + struct dp_mon_pdev *mon_pdev = pdev->monitor_pdev; - if ((pdev->fp_data_filter & FILTER_DATA_MCAST) || - (pdev->mo_data_filter & FILTER_DATA_MCAST)) + if ((mon_pdev->fp_data_filter & FILTER_DATA_MCAST) || + (mon_pdev->mo_data_filter & FILTER_DATA_MCAST)) return true; return false; @@ -3505,11 +3536,12 @@ static bool dp_pdev_get_filter_mcast_data(struct cdp_pdev *pdev_handle) static bool dp_pdev_get_filter_non_data(struct cdp_pdev *pdev_handle) { struct dp_pdev *pdev = (struct dp_pdev *)pdev_handle; + struct dp_mon_pdev *mon_pdev = pdev->monitor_pdev; - if ((pdev->fp_mgmt_filter & FILTER_MGMT_ALL) || - (pdev->mo_mgmt_filter & FILTER_MGMT_ALL)) { - if ((pdev->fp_ctrl_filter & FILTER_CTRL_ALL) || - (pdev->mo_ctrl_filter & FILTER_CTRL_ALL)) { + if ((mon_pdev->fp_mgmt_filter & FILTER_MGMT_ALL) || + (mon_pdev->mo_mgmt_filter & FILTER_MGMT_ALL)) { + if ((mon_pdev->fp_ctrl_filter & FILTER_CTRL_ALL) || + (mon_pdev->mo_ctrl_filter & FILTER_CTRL_ALL)) { return true; } } @@ -3585,6 +3617,7 @@ int dp_set_pktlog_wifi3(struct dp_pdev *pdev, uint32_t event, (pdev->wlan_cfg_ctx); uint8_t mac_id = 0; struct dp_mon_soc *mon_soc; + struct dp_mon_pdev *mon_pdev = pdev->monitor_pdev; soc = pdev->soc; mon_soc = soc->monitor_soc; @@ -3597,43 +3630,43 @@ int dp_set_pktlog_wifi3(struct dp_pdev *pdev, uint32_t event, if (enable) { switch (event) { case WDI_EVENT_RX_DESC: - if (pdev->monitor_vdev) { + if (mon_pdev->mvdev) { /* Nothing needs to be done if monitor mode is * enabled */ - pdev->rx_pktlog_mode = DP_RX_PKTLOG_FULL; + mon_pdev->rx_pktlog_mode = DP_RX_PKTLOG_FULL; return 0; } - if (pdev->rx_pktlog_mode != DP_RX_PKTLOG_FULL) { - pdev->rx_pktlog_mode = DP_RX_PKTLOG_FULL; + if (mon_pdev->rx_pktlog_mode != DP_RX_PKTLOG_FULL) { + mon_pdev->rx_pktlog_mode = DP_RX_PKTLOG_FULL; dp_mon_filter_setup_rx_pkt_log_full(pdev); if (dp_mon_filter_update(pdev) != QDF_STATUS_SUCCESS) { dp_cdp_err("%pK: Pktlog full filters set failed", soc); dp_mon_filter_reset_rx_pkt_log_full(pdev); - pdev->rx_pktlog_mode = + mon_pdev->rx_pktlog_mode = DP_RX_PKTLOG_DISABLED; return 0; } if (mon_soc->reap_timer_init && - (!dp_is_enable_reap_timer_non_pkt(pdev))) + (!monitor_is_enable_reap_timer_non_pkt(pdev))) qdf_timer_mod(&mon_soc->mon_reap_timer, DP_INTR_POLL_TIMER_MS); } break; case WDI_EVENT_LITE_RX: - if (pdev->monitor_vdev) { + if (mon_pdev->mvdev) { /* Nothing needs to be done if monitor mode is * enabled */ - pdev->rx_pktlog_mode = DP_RX_PKTLOG_LITE; + mon_pdev->rx_pktlog_mode = DP_RX_PKTLOG_LITE; return 0; } - if (pdev->rx_pktlog_mode != DP_RX_PKTLOG_LITE) { - pdev->rx_pktlog_mode = DP_RX_PKTLOG_LITE; + if (mon_pdev->rx_pktlog_mode != DP_RX_PKTLOG_LITE) { + mon_pdev->rx_pktlog_mode = DP_RX_PKTLOG_LITE; /* * Set the packet log lite mode filter. @@ -3642,14 +3675,14 @@ int dp_set_pktlog_wifi3(struct dp_pdev *pdev, uint32_t event, if (dp_mon_filter_update(pdev) != QDF_STATUS_SUCCESS) { dp_cdp_err("%pK: Pktlog lite filters set failed", soc); - dp_mon_filter_reset_rx_pkt_log_lite(pdev); - pdev->rx_pktlog_mode = + dp_mon_filter_reset_rx_pkt_log_lite(mon_pdev); + mon_pdev->rx_pktlog_mode = DP_RX_PKTLOG_DISABLED; return 0; } if (mon_soc->reap_timer_init && - (!dp_is_enable_reap_timer_non_pkt(pdev))) + (!monitor_is_enable_reap_timer_non_pkt(pdev))) qdf_timer_mod(&mon_soc->mon_reap_timer, DP_INTR_POLL_TIMER_MS); } @@ -3660,7 +3693,7 @@ int dp_set_pktlog_wifi3(struct dp_pdev *pdev, uint32_t event, int mac_for_pdev = dp_get_mac_id_for_pdev( mac_id, pdev->pdev_id); - pdev->pktlog_ppdu_stats = true; + mon_pdev->pktlog_ppdu_stats = true; dp_h2t_cfg_stats_msg_send(pdev, DP_PPDU_TXLITE_STATS_BITMASK_CFG, mac_for_pdev); @@ -3668,17 +3701,17 @@ int dp_set_pktlog_wifi3(struct dp_pdev *pdev, uint32_t event, break; case WDI_EVENT_RX_CBF: - if (pdev->monitor_vdev) { + if (mon_pdev->mvdev) { /* Nothing needs to be done if monitor mode is * enabled */ dp_info("Monitor mode, CBF setting filters"); - pdev->rx_pktlog_cbf = true; + mon_pdev->rx_pktlog_cbf = true; return 0; } - if (!pdev->rx_pktlog_cbf) { - pdev->rx_pktlog_cbf = true; - pdev->monitor_configured = true; + if (!mon_pdev->rx_pktlog_cbf) { + mon_pdev->rx_pktlog_cbf = true; + mon_pdev->monitor_configured = true; dp_vdev_set_monitor_mode_buf_rings(pdev); /* * Set the packet log lite mode filter. @@ -3690,14 +3723,14 @@ int dp_set_pktlog_wifi3(struct dp_pdev *pdev, uint32_t event, QDF_STATUS_SUCCESS) { dp_err("Pktlog set CBF filters failed"); dp_mon_filter_reset_rx_pktlog_cbf(pdev); - pdev->rx_pktlog_mode = + mon_pdev->rx_pktlog_mode = DP_RX_PKTLOG_DISABLED; - pdev->monitor_configured = false; + mon_pdev->monitor_configured = false; return 0; } if (mon_soc->reap_timer_init && - !dp_is_enable_reap_timer_non_pkt(pdev)) + !monitor_is_enable_reap_timer_non_pkt(pdev)) qdf_timer_mod(&mon_soc->mon_reap_timer, DP_INTR_POLL_TIMER_MS); } @@ -3711,15 +3744,17 @@ int dp_set_pktlog_wifi3(struct dp_pdev *pdev, uint32_t event, switch (event) { case WDI_EVENT_RX_DESC: case WDI_EVENT_LITE_RX: - if (pdev->monitor_vdev) { + if (mon_pdev->mvdev) { /* Nothing needs to be done if monitor mode is * enabled */ - pdev->rx_pktlog_mode = DP_RX_PKTLOG_DISABLED; + mon_pdev->rx_pktlog_mode = + DP_RX_PKTLOG_DISABLED; return 0; } - if (pdev->rx_pktlog_mode != DP_RX_PKTLOG_DISABLED) { - pdev->rx_pktlog_mode = DP_RX_PKTLOG_DISABLED; + if (mon_pdev->rx_pktlog_mode != DP_RX_PKTLOG_DISABLED) { + mon_pdev->rx_pktlog_mode = + DP_RX_PKTLOG_DISABLED; dp_mon_filter_reset_rx_pkt_log_full(pdev); if (dp_mon_filter_update(pdev) != QDF_STATUS_SUCCESS) { @@ -3727,7 +3762,7 @@ int dp_set_pktlog_wifi3(struct dp_pdev *pdev, uint32_t event, return 0; } - dp_mon_filter_reset_rx_pkt_log_lite(pdev); + dp_mon_filter_reset_rx_pkt_log_lite(mon_pdev); if (dp_mon_filter_update(pdev) != QDF_STATUS_SUCCESS) { dp_cdp_err("%pK: Pktlog filters reset failed", soc); @@ -3735,7 +3770,7 @@ int dp_set_pktlog_wifi3(struct dp_pdev *pdev, uint32_t event, } if (mon_soc->reap_timer_init && - (!dp_is_enable_reap_timer_non_pkt(pdev))) + (!monitor_is_enable_reap_timer_non_pkt(pdev))) qdf_timer_stop(&mon_soc->mon_reap_timer); } break; @@ -3750,18 +3785,18 @@ int dp_set_pktlog_wifi3(struct dp_pdev *pdev, uint32_t event, dp_get_mac_id_for_pdev(mac_id, pdev->pdev_id); - pdev->pktlog_ppdu_stats = false; - if (!pdev->enhanced_stats_en && - !pdev->tx_sniffer_enable && - !pdev->mcopy_mode) { + mon_pdev->pktlog_ppdu_stats = false; + if (!mon_pdev->enhanced_stats_en && + !mon_pdev->tx_sniffer_enable && + !mon_pdev->mcopy_mode) { dp_h2t_cfg_stats_msg_send(pdev, 0, mac_for_pdev); - } else if (pdev->tx_sniffer_enable || - pdev->mcopy_mode) { + } else if (mon_pdev->tx_sniffer_enable || + mon_pdev->mcopy_mode) { dp_h2t_cfg_stats_msg_send(pdev, DP_PPDU_STATS_CFG_SNIFFER, mac_for_pdev); - } else if (pdev->enhanced_stats_en) { + } else if (mon_pdev->enhanced_stats_en) { dp_h2t_cfg_stats_msg_send(pdev, DP_PPDU_STATS_CFG_ENH_STATS, mac_for_pdev); @@ -3770,7 +3805,7 @@ int dp_set_pktlog_wifi3(struct dp_pdev *pdev, uint32_t event, break; case WDI_EVENT_RX_CBF: - pdev->rx_pktlog_cbf = false; + mon_pdev->rx_pktlog_cbf = false; break; default: @@ -3796,6 +3831,7 @@ static void dp_pktlogmod_exit(struct dp_pdev *pdev) struct dp_soc *soc = pdev->soc; struct hif_opaque_softc *scn = soc->hif_handle; struct dp_mon_soc *mon_soc = soc->monitor_soc; + struct dp_mon_pdev *mon_pdev = pdev->monitor_pdev; if (!scn) { dp_err("Invalid hif(scn) handle"); @@ -3803,13 +3839,13 @@ static void dp_pktlogmod_exit(struct dp_pdev *pdev) } /* stop mon_reap_timer if it has been started */ - if (pdev->rx_pktlog_mode != DP_RX_PKTLOG_DISABLED && + if (mon_pdev->rx_pktlog_mode != DP_RX_PKTLOG_DISABLED && mon_soc->reap_timer_init && - (!dp_is_enable_reap_timer_non_pkt(pdev))) + (!monitor_is_enable_reap_timer_non_pkt(pdev))) qdf_timer_sync_cancel(&mon_soc->mon_reap_timer); pktlogmod_exit(scn); - pdev->pkt_log_init = false; + mon_pdev->pkt_log_init = false; } #endif #endif /*DP_CON_MON*/ @@ -3867,14 +3903,15 @@ struct dp_vdev *dp_rx_nac_filter(struct dp_pdev *pdev, { struct ieee80211_frame *wh; struct dp_neighbour_peer *peer = NULL; + struct dp_mon_pdev *mon_pdev = pdev->monitor_pdev; wh = (struct ieee80211_frame *)rx_pkt_hdr; if ((wh->i_fc[1] & IEEE80211_FC1_DIR_MASK) != IEEE80211_FC1_DIR_TODS) return NULL; - qdf_spin_lock_bh(&pdev->neighbour_peer_mutex); - TAILQ_FOREACH(peer, &pdev->neighbour_peers_list, + qdf_spin_lock_bh(&mon_pdev->neighbour_peer_mutex); + TAILQ_FOREACH(peer, &mon_pdev->neighbour_peers_list, neighbour_peer_list_elem) { if (qdf_mem_cmp(&peer->neighbour_peers_macaddr.raw[0], wh->i_addr2, QDF_MAC_ADDR_SIZE) == 0) { @@ -3887,12 +3924,12 @@ struct dp_vdev *dp_rx_nac_filter(struct dp_pdev *pdev, peer->neighbour_peers_macaddr.raw[4], peer->neighbour_peers_macaddr.raw[5]); - qdf_spin_unlock_bh(&pdev->neighbour_peer_mutex); + qdf_spin_unlock_bh(&mon_pdev->neighbour_peer_mutex); - return pdev->monitor_vdev; + return mon_pdev->mvdev; } } - qdf_spin_unlock_bh(&pdev->neighbour_peer_mutex); + qdf_spin_unlock_bh(&mon_pdev->neighbour_peer_mutex); return NULL; } @@ -3901,8 +3938,9 @@ static QDF_STATUS dp_filter_neighbour_peer(struct dp_pdev *pdev, uint8_t *rx_pkt_hdr) { struct dp_vdev *vdev = NULL; + struct dp_mon_pdev *mon_pdev = pdev->monitor_pdev; - if (pdev->filter_neighbour_peers) { + if (mon_pdev->filter_neighbour_peers) { /* Next Hop scenario not yet handle */ vdev = dp_rx_nac_filter(pdev, rx_pkt_hdr); if (vdev) { @@ -3940,6 +3978,7 @@ static int dp_update_filter_neighbour_peers(struct cdp_soc_t *soc_hdl, struct dp_neighbour_peer *peer = NULL; struct dp_vdev *vdev = dp_vdev_get_ref_by_id(soc, vdev_id, DP_MOD_ID_CDP); + struct dp_mon_pdev *mon_pdev; if (!vdev || !macaddr) goto fail0; @@ -3949,6 +3988,8 @@ static int dp_update_filter_neighbour_peers(struct cdp_soc_t *soc_hdl, if (!pdev) goto fail0; + mon_pdev = pdev->monitor_pdev; + /* Store address of NAC (neighbour peer) which will be checked * against TA of received packets. */ @@ -3966,55 +4007,54 @@ static int dp_update_filter_neighbour_peers(struct cdp_soc_t *soc_hdl, macaddr, QDF_MAC_ADDR_SIZE); peer->vdev = vdev; - qdf_spin_lock_bh(&pdev->neighbour_peer_mutex); + qdf_spin_lock_bh(&mon_pdev->neighbour_peer_mutex); /* add this neighbour peer into the list */ - TAILQ_INSERT_TAIL(&pdev->neighbour_peers_list, peer, + TAILQ_INSERT_TAIL(&mon_pdev->neighbour_peers_list, peer, neighbour_peer_list_elem); - qdf_spin_unlock_bh(&pdev->neighbour_peer_mutex); + qdf_spin_unlock_bh(&mon_pdev->neighbour_peer_mutex); /* first neighbour */ - if (!pdev->neighbour_peers_added) { + if (!mon_pdev->neighbour_peers_added) { QDF_STATUS status = QDF_STATUS_SUCCESS; - pdev->neighbour_peers_added = true; - + mon_pdev->neighbour_peers_added = true; dp_mon_filter_setup_smart_monitor(pdev); status = dp_mon_filter_update(pdev); if (status != QDF_STATUS_SUCCESS) { dp_cdp_err("%pK: smart mon filter setup failed", soc); - dp_mon_filter_reset_smart_monitor(pdev); - pdev->neighbour_peers_added = false; + dp_mon_filter_reset_smart_monitor(mon_pdev); + mon_pdev->neighbour_peers_added = false; } } } else if (cmd == DP_NAC_PARAM_DEL) { - qdf_spin_lock_bh(&pdev->neighbour_peer_mutex); - TAILQ_FOREACH(peer, &pdev->neighbour_peers_list, + qdf_spin_lock_bh(&mon_pdev->neighbour_peer_mutex); + TAILQ_FOREACH(peer, &mon_pdev->neighbour_peers_list, neighbour_peer_list_elem) { if (!qdf_mem_cmp(&peer->neighbour_peers_macaddr.raw[0], macaddr, QDF_MAC_ADDR_SIZE)) { /* delete this peer from the list */ - TAILQ_REMOVE(&pdev->neighbour_peers_list, + TAILQ_REMOVE(&mon_pdev->neighbour_peers_list, peer, neighbour_peer_list_elem); qdf_mem_free(peer); break; } } /* last neighbour deleted */ - if (TAILQ_EMPTY(&pdev->neighbour_peers_list)) { + if (TAILQ_EMPTY(&mon_pdev->neighbour_peers_list)) { QDF_STATUS status = QDF_STATUS_SUCCESS; - dp_mon_filter_reset_smart_monitor(pdev); + dp_mon_filter_reset_smart_monitor(mon_pdev); status = dp_mon_filter_update(pdev); if (status != QDF_STATUS_SUCCESS) { dp_cdp_err("%pK: smart mon filter clear failed", soc); } - pdev->neighbour_peers_added = false; + mon_pdev->neighbour_peers_added = false; } - qdf_spin_unlock_bh(&pdev->neighbour_peer_mutex); + qdf_spin_unlock_bh(&mon_pdev->neighbour_peer_mutex); } dp_vdev_unref_delete(soc, vdev, DP_MOD_ID_CDP); return 1; @@ -4047,14 +4087,17 @@ static QDF_STATUS dp_vdev_get_neighbour_rssi(struct cdp_soc_t *soc_hdl, struct dp_pdev *pdev; struct dp_neighbour_peer *peer = NULL; QDF_STATUS status = QDF_STATUS_E_FAILURE; + struct dp_mon_pdev *mon_pdev; if (!vdev) return status; pdev = vdev->pdev; + mon_pdev = pdev->monitor_pdev; + *rssi = 0; - qdf_spin_lock_bh(&pdev->neighbour_peer_mutex); - TAILQ_FOREACH(peer, &pdev->neighbour_peers_list, + qdf_spin_lock_bh(&mon_pdev->neighbour_peer_mutex); + TAILQ_FOREACH(peer, &mon_pdev->neighbour_peers_list, neighbour_peer_list_elem) { if (qdf_mem_cmp(&peer->neighbour_peers_macaddr.raw[0], mac_addr, QDF_MAC_ADDR_SIZE) == 0) { @@ -4063,7 +4106,7 @@ static QDF_STATUS dp_vdev_get_neighbour_rssi(struct cdp_soc_t *soc_hdl, break; } } - qdf_spin_unlock_bh(&pdev->neighbour_peer_mutex); + qdf_spin_unlock_bh(&mon_pdev->neighbour_peer_mutex); dp_vdev_unref_delete(soc, vdev, DP_MOD_ID_CDP); return status; } @@ -4079,12 +4122,15 @@ dp_config_for_nac_rssi(struct cdp_soc_t *cdp_soc, struct dp_vdev *vdev = dp_vdev_get_ref_by_id(soc, vdev_id, DP_MOD_ID_CDP); struct dp_pdev *pdev; + struct dp_mon_pdev *mon_pdev; if (!vdev) return QDF_STATUS_E_FAILURE; pdev = (struct dp_pdev *)vdev->pdev; - pdev->nac_rssi_filtering = 1; + + mon_pdev = pdev->monitor_pdev; + mon_pdev->nac_rssi_filtering = 1; /* Store address of NAC (neighbour peer) which will be checked * against TA of received packets. */ @@ -4127,6 +4173,7 @@ static void dp_cfr_filter(struct cdp_soc_t *soc_hdl, struct htt_rx_ring_tlv_filter htt_tlv_filter = {0}; int max_mac_rings; uint8_t mac_id = 0; + struct dp_mon_pdev *mon_pdev; pdev = dp_get_pdev_from_soc_pdev_id_wifi3(soc, pdev_id); if (!pdev) { @@ -4134,7 +4181,9 @@ static void dp_cfr_filter(struct cdp_soc_t *soc_hdl, return; } - if (pdev->monitor_vdev) { + mon_pdev = pdev->monitor_pdev; + + if (mon_pdev->mvdev) { dp_info("No action is needed since monitor mode is enabled\n"); return; } @@ -4200,6 +4249,7 @@ dp_enable_mon_reap_timer(struct cdp_soc_t *soc_hdl, uint8_t pdev_id, struct dp_soc *soc = cdp_soc_t_to_dp_soc(soc_hdl); struct dp_pdev *pdev = NULL; struct dp_mon_soc *mon_soc = soc->monitor_soc; + struct dp_mon_pdev *mon_pdev = pdev->monitor_pdev; pdev = dp_get_pdev_from_soc_pdev_id_wifi3(soc, pdev_id); if (!pdev) { @@ -4207,9 +4257,9 @@ dp_enable_mon_reap_timer(struct cdp_soc_t *soc_hdl, uint8_t pdev_id, return; } - pdev->enable_reap_timer_non_pkt = enable; - if (pdev->rx_pktlog_mode != DP_RX_PKTLOG_DISABLED) { - dp_debug("pktlog enabled %d", pdev->rx_pktlog_mode); + mon_pdev->enable_reap_timer_non_pkt = enable; + if (mon_pdev->rx_pktlog_mode != DP_RX_PKTLOG_DISABLED) { + dp_debug("pktlog enabled %d", mon_pdev->rx_pktlog_mode); return; } @@ -4241,27 +4291,30 @@ void dp_pkt_log_init(struct cdp_soc_t *soc_hdl, uint8_t pdev_id, void *scn) struct dp_soc *soc = cdp_soc_t_to_dp_soc(soc_hdl); struct dp_pdev *handle = dp_get_pdev_from_soc_pdev_id_wifi3(soc, pdev_id); + struct dp_mon_pdev *mon_pdev; if (!handle) { dp_err("pdev handle is NULL"); return; } - if (handle->pkt_log_init) { + mon_pdev = handle->monitor_pdev; + + if (mon_pdev->pkt_log_init) { mon_init_err("%pK: Packet log not initialized", soc); return; } - pktlog_sethandle(&handle->pl_dev, scn); - pktlog_set_pdev_id(handle->pl_dev, pdev_id); + pktlog_sethandle(&mon_pdev->pl_dev, scn); + pktlog_set_pdev_id(mon_pdev->pl_dev, pdev_id); pktlog_set_callback_regtype(PKTLOG_DEFAULT_CALLBACK_REGISTRATION); if (pktlogmod_init(scn)) { QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR, "%s: pktlogmod_init failed", __func__); - handle->pkt_log_init = false; + mon_pdev->pkt_log_init = false; } else { - handle->pkt_log_init = true; + mon_pdev->pkt_log_init = true; } } @@ -4297,16 +4350,17 @@ static void dp_neighbour_peers_detach(struct dp_pdev *pdev) { struct dp_neighbour_peer *peer = NULL; struct dp_neighbour_peer *temp_peer = NULL; + struct dp_mon_pdev *mon_pdev = pdev->monitor_pdev; - TAILQ_FOREACH_SAFE(peer, &pdev->neighbour_peers_list, + TAILQ_FOREACH_SAFE(peer, &mon_pdev->neighbour_peers_list, neighbour_peer_list_elem, temp_peer) { /* delete this peer from the list */ - TAILQ_REMOVE(&pdev->neighbour_peers_list, + TAILQ_REMOVE(&mon_pdev->neighbour_peers_list, peer, neighbour_peer_list_elem); qdf_mem_free(peer); } - qdf_spinlock_destroy(&pdev->neighbour_peer_mutex); + qdf_spinlock_destroy(&mon_pdev->neighbour_peer_mutex); } /* @@ -4318,8 +4372,10 @@ static void dp_neighbour_peers_detach(struct dp_pdev *pdev) */ static inline bool is_ppdu_txrx_capture_enabled(struct dp_pdev *pdev) { - if (!pdev->pktlog_ppdu_stats && !pdev->tx_sniffer_enable && - !pdev->mcopy_mode) + struct dp_mon_pdev *mon_pdev = pdev->monitor_pdev; + + if (!mon_pdev->pktlog_ppdu_stats && !mon_pdev->tx_sniffer_enable && + !mon_pdev->mcopy_mode) return true; else return false; @@ -4338,6 +4394,7 @@ dp_enable_enhanced_stats(struct cdp_soc_t *soc, uint8_t pdev_id) { struct dp_pdev *pdev = NULL; QDF_STATUS status = QDF_STATUS_SUCCESS; + struct dp_mon_pdev *mon_pdev; pdev = dp_get_pdev_from_soc_pdev_id_wifi3((struct dp_soc *)soc, pdev_id); @@ -4345,25 +4402,28 @@ dp_enable_enhanced_stats(struct cdp_soc_t *soc, uint8_t pdev_id) if (!pdev) return QDF_STATUS_E_FAILURE; - if (pdev->enhanced_stats_en == 0) - dp_cal_client_timer_start(pdev->cal_client_ctx); + mon_pdev = pdev->monitor_pdev; - pdev->enhanced_stats_en = 1; + if (mon_pdev->enhanced_stats_en == 0) + dp_cal_client_timer_start(mon_pdev->cal_client_ctx); - dp_mon_filter_setup_enhanced_stats(pdev); + mon_pdev->enhanced_stats_en = 1; + + dp_mon_filter_setup_enhanced_stats(mon_pdev); status = dp_mon_filter_update(pdev); if (status != QDF_STATUS_SUCCESS) { dp_cdp_err("%pK: Failed to set enhanced mode filters", soc); dp_mon_filter_reset_enhanced_stats(pdev); - dp_cal_client_timer_stop(pdev->cal_client_ctx); - pdev->enhanced_stats_en = 0; + dp_cal_client_timer_stop(mon_pdev->cal_client_ctx); + mon_pdev->enhanced_stats_en = 0; return QDF_STATUS_E_FAILURE; } - if (is_ppdu_txrx_capture_enabled(pdev) && !pdev->bpr_enable) { + if (is_ppdu_txrx_capture_enabled(pdev) && !mon_pdev->bpr_enable) { dp_h2t_cfg_stats_msg_send(pdev, DP_PPDU_STATS_CFG_ENH_STATS, pdev->pdev_id); - } else if (is_ppdu_txrx_capture_enabled(pdev) && pdev->bpr_enable) { + } else if (is_ppdu_txrx_capture_enabled(pdev) && + mon_pdev->bpr_enable) { dp_h2t_cfg_stats_msg_send(pdev, DP_PPDU_STATS_CFG_BPR_ENH, pdev->pdev_id); @@ -4385,18 +4445,22 @@ dp_disable_enhanced_stats(struct cdp_soc_t *soc, uint8_t pdev_id) struct dp_pdev *pdev = dp_get_pdev_from_soc_pdev_id_wifi3((struct dp_soc *)soc, pdev_id); + struct dp_mon_pdev *mon_pdev; + if (!pdev) return QDF_STATUS_E_FAILURE; - if (pdev->enhanced_stats_en == 1) - dp_cal_client_timer_stop(pdev->cal_client_ctx); + mon_pdev = pdev->monitor_pdev; - pdev->enhanced_stats_en = 0; + if (mon_pdev->enhanced_stats_en == 1) + dp_cal_client_timer_stop(mon_pdev->cal_client_ctx); - if (is_ppdu_txrx_capture_enabled(pdev) && !pdev->bpr_enable) { + mon_pdev->enhanced_stats_en = 0; + + if (is_ppdu_txrx_capture_enabled(pdev) && !mon_pdev->bpr_enable) { dp_h2t_cfg_stats_msg_send(pdev, 0, pdev->pdev_id); - } else if (is_ppdu_txrx_capture_enabled(pdev) && pdev->bpr_enable) { + } else if (is_ppdu_txrx_capture_enabled(pdev) && mon_pdev->bpr_enable) { dp_h2t_cfg_stats_msg_send(pdev, DP_PPDU_STATS_CFG_BPR, pdev->pdev_id); @@ -4430,10 +4494,13 @@ dp_enable_peer_based_pktlog(struct cdp_soc_t *soc, uint8_t pdev_id, struct dp_pdev *pdev = dp_get_pdev_from_soc_pdev_id_wifi3((struct dp_soc *)soc, pdev_id); + struct dp_mon_pdev *mon_pdev; if (!pdev) return QDF_STATUS_E_FAILURE; + mon_pdev = pdev->monitor_pdev; + peer = dp_peer_find_hash_find((struct dp_soc *)soc, mac_addr, 0, DP_VDEV_ALL, DP_MOD_ID_CDP); @@ -4443,7 +4510,7 @@ dp_enable_peer_based_pktlog(struct cdp_soc_t *soc, uint8_t pdev_id, } peer->peer_based_pktlog_filter = enb_dsb; - pdev->dp_peer_based_pktlog = enb_dsb; + mon_pdev->dp_peer_based_pktlog = enb_dsb; dp_peer_unref_delete(peer, DP_MOD_ID_CDP); @@ -4515,11 +4582,12 @@ static QDF_STATUS dp_vdev_set_monitor_mode_rings(struct dp_pdev *pdev, QDF_STATUS status = QDF_STATUS_SUCCESS; struct dp_srng *mon_buf_ring; uint32_t num_entries; + struct dp_mon_pdev *mon_pdev = pdev->monitor_pdev; pdev_cfg_ctx = pdev->wlan_cfg_ctx; /* If monitor rings are aleady initilized, return from here */ - if (pdev->pdev_mon_init) + if (mon_pdev->pdev_mon_init) return QDF_STATUS_SUCCESS; for (mac_id = 0; mac_id < NUM_RXDMA_RINGS_PER_PDEV; mac_id++) { @@ -4573,7 +4641,7 @@ static QDF_STATUS dp_vdev_set_monitor_mode_rings(struct dp_pdev *pdev, soc->rxdma_mon_dst_ring[mac_for_pdev].hal_srng, RXDMA_MONITOR_DST); } - pdev->pdev_mon_init = 1; + mon_pdev->pdev_mon_init = 1; return QDF_STATUS_SUCCESS; @@ -4601,12 +4669,14 @@ static void dp_mon_vdev_timer(void *arg) uint32_t lmac_iter; int max_mac_rings = wlan_cfg_get_num_mac_rings(pdev->wlan_cfg_ctx); struct dp_mon_soc *mon_soc = soc->monitor_soc; + struct dp_mon_pdev *mon_pdev = pdev->monitor_pdev; if (!qdf_atomic_read(&soc->cmn_init_done)) return; - if (pdev->mon_chan_band != REG_BAND_UNKNOWN) - lmac_id = pdev->ch_band_lmac_id_mapping[pdev->mon_chan_band]; + if (mon_pdev->mon_chan_band != REG_BAND_UNKNOWN) + lmac_id = + pdev->ch_band_lmac_id_mapping[mon_pdev->mon_chan_band]; start_time = qdf_get_log_timestamp(); dp_is_hw_dbs_enable(soc, &max_mac_rings); @@ -4743,9 +4813,180 @@ static bool dp_mon_vdev_timer_stop(struct dp_mon_soc *mon_soc) return false; } +static QDF_STATUS dp_mcopy_check_deliver(struct dp_mon_pdev *mon_pdev, + uint16_t peer_id, + uint32_t ppdu_id, + uint8_t first_msdu) +{ + if (mon_pdev->mcopy_mode) { + if (mon_pdev->mcopy_mode == M_COPY) { + if ((mon_pdev->m_copy_id.tx_ppdu_id == ppdu_id) && + (mon_pdev->m_copy_id.tx_peer_id == peer_id)) { + return QDF_STATUS_E_INVAL; + } + } + + if (!first_msdu) + return QDF_STATUS_E_INVAL; + + mon_pdev->m_copy_id.tx_ppdu_id = ppdu_id; + mon_pdev->m_copy_id.tx_peer_id = peer_id; + } + + return QDF_STATUS_SUCCESS; +} + +static void dp_mon_neighbour_peer_add_ast(struct dp_pdev *pdev, + struct dp_peer *ta_peer, + uint8_t *mac_addr, + qdf_nbuf_t nbuf, + uint32_t flags) +{ + struct dp_neighbour_peer *neighbour_peer = NULL; + struct dp_mon_pdev *mon_pdev = pdev->monitor_pdev; + struct dp_soc *soc = pdev->soc; + uint32_t ret = 0; + + if (mon_pdev->neighbour_peers_added) { + qdf_mem_copy(mac_addr, + (qdf_nbuf_data(nbuf) + + QDF_MAC_ADDR_SIZE), + QDF_MAC_ADDR_SIZE); + + qdf_spin_lock_bh(&mon_pdev->neighbour_peer_mutex); + TAILQ_FOREACH(neighbour_peer, + &mon_pdev->neighbour_peers_list, + neighbour_peer_list_elem) { + if (!qdf_mem_cmp(&neighbour_peer->neighbour_peers_macaddr, + mac_addr, + QDF_MAC_ADDR_SIZE)) { + ret = dp_peer_add_ast(soc, + ta_peer, + mac_addr, + CDP_TXRX_AST_TYPE_WDS, + flags); + QDF_TRACE(QDF_MODULE_ID_DP, + QDF_TRACE_LEVEL_INFO, + "sa valid and nac roamed to wds"); + break; + } + } + qdf_spin_unlock_bh(&mon_pdev->neighbour_peer_mutex); + } +} + +#ifdef WDI_EVENT_ENABLE +void *dp_get_pldev(struct cdp_soc_t *soc_hdl, uint8_t pdev_id) +{ + struct dp_soc *soc = cdp_soc_t_to_dp_soc(soc_hdl); + struct dp_pdev *pdev = dp_get_pdev_from_soc_pdev_id_wifi3(soc, pdev_id); + + if (!pdev && !pdev->monitor_pdev) + return NULL; + + return pdev->monitor_pdev->pl_dev; +} +#endif + +QDF_STATUS dp_rx_populate_cbf_hdr(struct dp_soc *soc, + uint32_t mac_id, + uint32_t event, + qdf_nbuf_t mpdu, + uint32_t msdu_timestamp) +{ + uint32_t data_size, hdr_size, ppdu_id, align4byte; + struct dp_pdev *pdev = dp_get_pdev_for_lmac_id(soc, mac_id); + uint32_t *msg_word; + + if (!pdev) + return QDF_STATUS_E_INVAL; + + ppdu_id = pdev->monitor_pdev->ppdu_info.com_info.ppdu_id; + + hdr_size = HTT_T2H_PPDU_STATS_IND_HDR_SIZE + + qdf_offsetof(htt_ppdu_stats_rx_mgmtctrl_payload_tlv, payload); + + data_size = qdf_nbuf_len(mpdu); + + qdf_nbuf_push_head(mpdu, hdr_size); + + msg_word = (uint32_t *)qdf_nbuf_data(mpdu); + /* + * Populate the PPDU Stats Indication header + */ + HTT_H2T_MSG_TYPE_SET(*msg_word, HTT_T2H_MSG_TYPE_PPDU_STATS_IND); + HTT_T2H_PPDU_STATS_MAC_ID_SET(*msg_word, mac_id); + HTT_T2H_PPDU_STATS_PDEV_ID_SET(*msg_word, pdev->pdev_id); + align4byte = ((data_size + + qdf_offsetof(htt_ppdu_stats_rx_mgmtctrl_payload_tlv, payload) + + 3) >> 2) << 2; + HTT_T2H_PPDU_STATS_PAYLOAD_SIZE_SET(*msg_word, align4byte); + msg_word++; + HTT_T2H_PPDU_STATS_PPDU_ID_SET(*msg_word, ppdu_id); + msg_word++; + + *msg_word = msdu_timestamp; + msg_word++; + /* Skip reserved field */ + msg_word++; + /* + * Populate MGMT_CTRL Payload TLV first + */ + HTT_STATS_TLV_TAG_SET(*msg_word, + HTT_PPDU_STATS_RX_MGMTCTRL_PAYLOAD_TLV); + + align4byte = ((data_size - sizeof(htt_tlv_hdr_t) + + qdf_offsetof(htt_ppdu_stats_rx_mgmtctrl_payload_tlv, payload) + + 3) >> 2) << 2; + HTT_STATS_TLV_LENGTH_SET(*msg_word, align4byte); + msg_word++; + + HTT_PPDU_STATS_RX_MGMTCTRL_TLV_FRAME_LENGTH_SET( + *msg_word, data_size); + msg_word++; + + dp_wdi_event_handler(event, soc, (void *)mpdu, + HTT_INVALID_PEER, WDI_NO_VAL, pdev->pdev_id); + + qdf_nbuf_pull_head(mpdu, hdr_size); + + return QDF_STATUS_SUCCESS; +} + +#ifdef ATH_SUPPORT_EXT_STAT +/*dp_peer_cal_clients_stats_update - update peer stats on cal client timer + * @soc : Datapath SOC + * @peer : Datapath peer + * @arg : argument to iter function + */ +static void +dp_peer_cal_clients_stats_update(struct dp_soc *soc, + struct dp_peer *peer, + void *arg) +{ + dp_cal_client_update_peer_stats(&peer->stats); +} + +/*dp_iterate_update_peer_list - update peer stats on cal client timer + * @pdev_hdl: pdev handle + */ +void dp_iterate_update_peer_list(struct cdp_pdev *pdev_hdl) +{ + struct dp_pdev *pdev = (struct dp_pdev *)pdev_hdl; + + dp_pdev_iterate_peer(pdev, dp_peer_cal_clients_stats_update, NULL, + DP_MOD_ID_CDP); +} +#else +void dp_iterate_update_peer_list(struct cdp_pdev *pdev_hdl) +{ +} +#endif + QDF_STATUS dp_mon_soc_cfg_init(struct dp_soc *soc) { int target_type; + struct dp_mon_soc *mon_soc = soc->monitor_soc; target_type = hal_get_target_type(soc->hal_soc); switch (target_type) { @@ -4763,12 +5004,12 @@ QDF_STATUS dp_mon_soc_cfg_init(struct dp_soc *soc) case TARGET_TYPE_QCA9574: wlan_cfg_set_mon_delayed_replenish_entries(soc->wlan_cfg_ctx, MON_BUF_MIN_ENTRIES); - soc->hw_nac_monitor_support = 1; + mon_soc->hw_nac_monitor_support = 1; break; case TARGET_TYPE_QCN9000: wlan_cfg_set_mon_delayed_replenish_entries(soc->wlan_cfg_ctx, MON_BUF_MIN_ENTRIES); - soc->hw_nac_monitor_support = 1; + mon_soc->hw_nac_monitor_support = 1; if (cfg_get(soc->ctrl_psoc, CFG_DP_FULL_MON_MODE)) dp_config_full_mon_mode((struct cdp_soc_t *)soc, 1); break; @@ -4776,18 +5017,22 @@ QDF_STATUS dp_mon_soc_cfg_init(struct dp_soc *soc) case TARGET_TYPE_QCN6122: wlan_cfg_set_mon_delayed_replenish_entries(soc->wlan_cfg_ctx, MON_BUF_MIN_ENTRIES); - soc->hw_nac_monitor_support = 1; + mon_soc->hw_nac_monitor_support = 1; break; case TARGET_TYPE_QCN9224: wlan_cfg_set_mon_delayed_replenish_entries(soc->wlan_cfg_ctx, MON_BUF_MIN_ENTRIES); - soc->hw_nac_monitor_support = 1; + mon_soc->hw_nac_monitor_support = 1; break; default: qdf_print("%s: Unknown tgt type %d\n", __func__, target_type); qdf_assert_always(0); break; } + + mon_init_info("hw_nac_monitor_support = %d", + mon_soc->hw_nac_monitor_support); + return QDF_STATUS_SUCCESS; } @@ -4851,6 +5096,7 @@ QDF_STATUS dp_mon_pdev_detach(struct dp_pdev *pdev) QDF_STATUS dp_mon_pdev_init(struct dp_pdev *pdev) { struct dp_soc *soc; + struct dp_mon_pdev *mon_pdev; if (!pdev) { mon_init_err("pdev is NULL"); @@ -4858,33 +5104,45 @@ QDF_STATUS dp_mon_pdev_init(struct dp_pdev *pdev) } soc = pdev->soc; + mon_pdev = pdev->monitor_pdev; - pdev->filter = dp_mon_filter_alloc(pdev); - if (!pdev->filter) { + mon_pdev->filter = dp_mon_filter_alloc(mon_pdev); + if (!mon_pdev->filter) { mon_init_err("%pK: Memory allocation failed for monitor filter", pdev); return QDF_STATUS_E_NOMEM; } - qdf_spinlock_create(&pdev->ppdu_stats_lock); - qdf_spinlock_create(&pdev->neighbour_peer_mutex); - pdev->monitor_configured = false; - pdev->mon_chan_band = REG_BAND_UNKNOWN; - /* Monitor filter init */ - pdev->mon_filter_mode = MON_FILTER_ALL; + qdf_spinlock_create(&mon_pdev->ppdu_stats_lock); + qdf_spinlock_create(&mon_pdev->neighbour_peer_mutex); + mon_pdev->monitor_configured = false; + mon_pdev->mon_chan_band = REG_BAND_UNKNOWN; - TAILQ_INIT(&pdev->neighbour_peers_list); - pdev->neighbour_peers_added = false; - pdev->monitor_configured = false; + TAILQ_INIT(&mon_pdev->neighbour_peers_list); + mon_pdev->neighbour_peers_added = false; + mon_pdev->monitor_configured = false; /* Monitor filter init */ - pdev->mon_filter_mode = MON_FILTER_ALL; - pdev->fp_mgmt_filter = FILTER_MGMT_ALL; - pdev->fp_ctrl_filter = FILTER_CTRL_ALL; - pdev->fp_data_filter = FILTER_DATA_ALL; - pdev->mo_mgmt_filter = FILTER_MGMT_ALL; - pdev->mo_ctrl_filter = FILTER_CTRL_ALL; - pdev->mo_data_filter = FILTER_DATA_ALL; + mon_pdev->mon_filter_mode = MON_FILTER_ALL; + mon_pdev->fp_mgmt_filter = FILTER_MGMT_ALL; + mon_pdev->fp_ctrl_filter = FILTER_CTRL_ALL; + mon_pdev->fp_data_filter = FILTER_DATA_ALL; + mon_pdev->mo_mgmt_filter = FILTER_MGMT_ALL; + mon_pdev->mo_ctrl_filter = FILTER_CTRL_ALL; + mon_pdev->mo_data_filter = FILTER_DATA_ALL; + /* + * initialize ppdu tlv list + */ + TAILQ_INIT(&mon_pdev->ppdu_info_list); + TAILQ_INIT(&mon_pdev->sched_comp_ppdu_list); + + mon_pdev->list_depth = 0; + mon_pdev->tlv_count = 0; + /* initlialize cal client timer */ + dp_cal_client_attach(&mon_pdev->cal_client_ctx, + dp_pdev_to_cdp_pdev(pdev), + pdev->soc->osdev, + &dp_iterate_update_peer_list); if (dp_htt_ppdu_stats_attach(pdev) != QDF_STATUS_SUCCESS) goto fail0; @@ -4897,30 +5155,38 @@ QDF_STATUS dp_mon_pdev_init(struct dp_pdev *pdev) /* allocate buffers and replenish the monitor RxDMA ring */ dp_rx_pdev_mon_buffers_alloc(pdev); dp_tx_ppdu_stats_attach(pdev); + mon_pdev->is_dp_mon_pdev_initialized = true; return QDF_STATUS_SUCCESS; fail1: dp_htt_ppdu_stats_detach(pdev); fail0: - qdf_spinlock_destroy(&pdev->neighbour_peer_mutex); - qdf_spinlock_destroy(&pdev->ppdu_stats_lock); - dp_mon_filter_dealloc(pdev); + qdf_spinlock_destroy(&mon_pdev->neighbour_peer_mutex); + qdf_spinlock_destroy(&mon_pdev->ppdu_stats_lock); + dp_mon_filter_dealloc(mon_pdev); return QDF_STATUS_E_FAILURE; } QDF_STATUS dp_mon_pdev_deinit(struct dp_pdev *pdev) { + struct dp_mon_pdev *mon_pdev = pdev->monitor_pdev; + + if (!mon_pdev->is_dp_mon_pdev_initialized) + return QDF_STATUS_SUCCESS; + dp_tx_ppdu_stats_detach(pdev); dp_rx_pdev_mon_buffers_free(pdev); dp_rx_pdev_mon_desc_pool_deinit(pdev); dp_mon_rings_deinit(pdev); + dp_cal_client_detach(&mon_pdev->cal_client_ctx); dp_htt_ppdu_stats_detach(pdev); - qdf_spinlock_destroy(&pdev->ppdu_stats_lock); + qdf_spinlock_destroy(&mon_pdev->ppdu_stats_lock); dp_neighbour_peers_detach(pdev); dp_pktlogmod_exit(pdev); - - if (pdev->filter) - dp_mon_filter_dealloc(pdev); + if (mon_pdev->filter) + dp_mon_filter_dealloc(mon_pdev); + dp_mon_rings_deinit(pdev); + mon_pdev->is_dp_mon_pdev_initialized = false; return QDF_STATUS_SUCCESS; } @@ -4938,6 +5204,7 @@ QDF_STATUS dp_mon_vdev_attach(struct dp_vdev *vdev) vdev->monitor_vdev = mon_vdev; dp_vdev_set_monitor_mode_buf_rings(pdev); + pdev->monitor_pdev->mvdev = vdev; return QDF_STATUS_SUCCESS; } @@ -4945,9 +5212,12 @@ QDF_STATUS dp_mon_vdev_attach(struct dp_vdev *vdev) QDF_STATUS dp_mon_vdev_detach(struct dp_vdev *vdev) { struct dp_mon_vdev *mon_vdev = vdev->monitor_vdev; + struct dp_pdev *pdev = vdev->pdev; qdf_mem_free(mon_vdev); vdev->monitor_vdev = NULL; + pdev->monitor_pdev->mvdev = NULL; + return QDF_STATUS_SUCCESS; } @@ -5054,6 +5324,8 @@ static struct dp_mon_ops monitor_ops = { .mon_reap_timer_start = dp_mon_reap_timer_start, .mon_reap_timer_stop = dp_mon_reap_timer_stop, .mon_reap_timer_deinit = dp_mon_reap_timer_deinit, + .mon_mcopy_check_deliver = dp_mcopy_check_deliver, + .mon_neighbour_peer_add_ast = dp_mon_neighbour_peer_add_ast, }; static struct cdp_mon_ops dp_ops_mon = { @@ -5111,6 +5383,9 @@ static inline void dp_mon_cdp_ops_register(struct dp_soc *soc) ops->host_stats_ops->txrx_disable_enhanced_stats = dp_disable_enhanced_stats; #endif /* FEATURE_PERPKT_INFO */ +#ifdef WDI_EVENT_ENABLE + ops->ctrl_ops->txrx_get_pldev = dp_get_pldev; +#endif return; } @@ -5149,6 +5424,9 @@ static inline void dp_mon_cdp_ops_deregister(struct dp_soc *soc) ops->host_stats_ops->txrx_enable_enhanced_stats = NULL; ops->host_stats_ops->txrx_disable_enhanced_stats = NULL; #endif /* FEATURE_PERPKT_INFO */ +#ifdef WDI_EVENT_ENABLE + ops->ctrl_ops->txrx_get_pldev = NULL; +#endif return; } @@ -5184,6 +5462,7 @@ QDF_STATUS dp_mon_soc_detach(struct dp_soc *soc) } mon_soc = soc->monitor_soc; + dp_mon_cdp_ops_deregister(soc); soc->monitor_soc = NULL; qdf_mem_free(mon_soc); return QDF_STATUS_SUCCESS; diff --git a/dp/wifi3.0/monitor/dp_mon.h b/dp/wifi3.0/monitor/dp_mon.h index e14fe9f6ea..5e211fd290 100644 --- a/dp/wifi3.0/monitor/dp_mon.h +++ b/dp/wifi3.0/monitor/dp_mon.h @@ -13,6 +13,10 @@ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ +#ifdef WLAN_TX_PKT_CAPTURE_ENH +#include "dp_tx_capture.h" +#endif + #define DP_INTR_POLL_TIMER_MS 5 #define MON_VDEV_TIMER_INIT 0x1 @@ -20,6 +24,7 @@ /* Budget to reap monitor status ring */ #define DP_MON_REAP_BUDGET 1024 +#define MON_BUF_MIN_ENTRIES 64 #define mon_rx_warn(params...) QDF_TRACE_WARN(QDF_MODULE_ID_DP_RX, params) @@ -121,11 +126,35 @@ struct dp_mon_ops { void (*mon_reap_timer_start)(struct dp_mon_soc *mon_soc); bool (*mon_reap_timer_stop)(struct dp_mon_soc *mon_soc); void (*mon_reap_timer_deinit)(struct dp_mon_soc *mon_soc); + QDF_STATUS (*mon_mcopy_check_deliver)(struct dp_mon_pdev *mon_pdev, + uint16_t peer_id, + uint32_t ppdu_id, + uint8_t first_msdu); + void (*mon_neighbour_peer_add_ast)(struct dp_pdev *pdev, + struct dp_peer *ta_peer, + uint8_t *mac_addr, + qdf_nbuf_t nbuf, + uint32_t flags); }; struct dp_mon_soc { /* Holds all monitor related fields extracted from dp_soc */ /* Holds pointer to monitor ops */ + /* monitor link descriptor pages */ + struct qdf_mem_multi_page_t mon_link_desc_pages[MAX_NUM_LMAC_HW]; + + /* total link descriptors for monitor mode for each radio */ + uint32_t total_mon_link_descs[MAX_NUM_LMAC_HW]; + + /* Monitor Link descriptor memory banks */ + struct link_desc_bank + mon_link_desc_banks[MAX_NUM_LMAC_HW][MAX_MON_LINK_DESC_BANKS]; + uint32_t num_mon_link_desc_banks[MAX_NUM_LMAC_HW]; + /* Smart monitor capability for HKv2 */ + uint8_t hw_nac_monitor_support; + + /* Full monitor mode support */ + bool full_mon_mode; /*interrupt timer*/ qdf_timer_t mon_reap_timer; @@ -138,6 +167,170 @@ struct dp_mon_soc { }; struct dp_mon_pdev { + /* monitor */ + bool monitor_configured; + + struct dp_mon_filter **filter; /* Monitor Filter pointer */ + + /* advance filter mode and type*/ + uint8_t mon_filter_mode; + uint16_t fp_mgmt_filter; + uint16_t fp_ctrl_filter; + uint16_t fp_data_filter; + uint16_t mo_mgmt_filter; + uint16_t mo_ctrl_filter; + uint16_t mo_data_filter; + uint16_t md_data_filter; + + struct dp_pdev_tx_capture tx_capture; + + /* tx packet capture enhancement */ + enum cdp_tx_enh_capture_mode tx_capture_enabled; + /* Stuck count on monitor destination ring MPDU process */ + uint32_t mon_dest_ring_stuck_cnt; + /* monitor mode lock */ + qdf_spinlock_t mon_lock; + + /* Monitor mode operation channel */ + int mon_chan_num; + + /* Monitor mode operation frequency */ + qdf_freq_t mon_chan_freq; + + /* Monitor mode band */ + enum reg_wifi_band mon_chan_band; + + uint32_t mon_ppdu_status; + /* monitor mode status/destination ring PPDU and MPDU count */ + struct cdp_pdev_mon_stats rx_mon_stats; + /* Monitor mode interface and status storage */ + struct dp_vdev *mvdev; + struct cdp_mon_status rx_mon_recv_status; + /* to track duplicate link descriptor indications by HW for a WAR */ + uint64_t mon_last_linkdesc_paddr; + /* to track duplicate buffer indications by HW for a WAR */ + uint32_t mon_last_buf_cookie; + +#ifdef QCA_SUPPORT_FULL_MON + /* List to maintain all MPDUs for a PPDU in monitor mode */ + TAILQ_HEAD(, dp_mon_mpdu) mon_mpdu_q; + + /* TODO: define per-user mpdu list + * struct dp_mon_mpdu_list mpdu_list[MAX_MU_USERS]; + */ + struct hal_rx_mon_desc_info *mon_desc; +#endif + /* Flag to hold on to monitor destination ring */ + bool hold_mon_dest_ring; + + /* Flag to inidicate monitor rings are initialized */ + uint8_t pdev_mon_init; +#ifndef REMOVE_PKT_LOG + bool pkt_log_init; + struct pktlog_dev_t *pl_dev; /* Pktlog pdev */ +#endif /* #ifndef REMOVE_PKT_LOG */ + + /* Smart Mesh */ + bool filter_neighbour_peers; + + /*flag to indicate neighbour_peers_list not empty */ + bool neighbour_peers_added; + /* smart mesh mutex */ + qdf_spinlock_t neighbour_peer_mutex; + /* Neighnour peer list */ + TAILQ_HEAD(, dp_neighbour_peer) neighbour_peers_list; + /* Enhanced Stats is enabled */ + bool enhanced_stats_en; + qdf_nbuf_queue_t rx_status_q; + + /* 128 bytes mpdu header queue per user for ppdu */ + qdf_nbuf_queue_t mpdu_q[MAX_MU_USERS]; + + /* is this a mpdu header TLV and not msdu header TLV */ + bool is_mpdu_hdr[MAX_MU_USERS]; + + /* per user 128 bytes msdu header list for MPDU */ + struct msdu_list msdu_list[MAX_MU_USERS]; + + /* RX enhanced capture mode */ + uint8_t rx_enh_capture_mode; + /* Rx per peer enhanced capture mode */ + bool rx_enh_capture_peer; + struct dp_vdev *rx_enh_monitor_vdev; + /* RX enhanced capture trailer enable/disable flag */ + bool is_rx_enh_capture_trailer_enabled; +#ifdef WLAN_RX_PKT_CAPTURE_ENH + /* RX per MPDU/PPDU information */ + struct cdp_rx_indication_mpdu mpdu_ind; +#endif + + /* Packet log mode */ + uint8_t rx_pktlog_mode; + /* Enable pktlog logging cbf */ + bool rx_pktlog_cbf; + + bool tx_sniffer_enable; + /* mirror copy mode */ + enum m_copy_mode mcopy_mode; + bool enable_reap_timer_non_pkt; + bool bpr_enable; + /* Pdev level flag to check peer based pktlog enabled or + * disabled + */ + uint8_t dp_peer_based_pktlog; + +#ifdef WLAN_ATF_ENABLE + /* ATF stats enable */ + bool dp_atf_stats_enable; +#endif + + /* Maintains first status buffer's paddr of a PPDU */ + uint64_t status_buf_addr; + struct hal_rx_ppdu_info ppdu_info; + + struct { + uint8_t last_user; + qdf_nbuf_t buf; + } tx_ppdu_info; + + struct { + uint32_t tx_ppdu_id; + uint16_t tx_peer_id; + uint32_t rx_ppdu_id; + } m_copy_id; + + /* To check if PPDU Tx stats are enabled for Pktlog */ + bool pktlog_ppdu_stats; + +#ifdef ATH_SUPPORT_NAC_RSSI + bool nac_rssi_filtering; +#endif + + /* ppdu_stats lock for queue concurrency between cores*/ + qdf_spinlock_t ppdu_stats_lock; + + /* list of ppdu tlvs */ + TAILQ_HEAD(, ppdu_info) ppdu_info_list; + TAILQ_HEAD(, ppdu_info) sched_comp_ppdu_list; + + uint32_t sched_comp_list_depth; + uint16_t delivered_sched_cmdid; + uint16_t last_sched_cmdid; + uint32_t tlv_count; + uint32_t list_depth; + + struct { + qdf_nbuf_t last_nbuf; /*Ptr to mgmt last buf */ + uint8_t *mgmt_buf; /* Ptr to mgmt. payload in HTT ppdu stats */ + uint32_t mgmt_buf_len; /* Len of mgmt. payload in ppdu stats */ + uint32_t ppdu_id; + } mgmtctrl_frm_info; + /* Context of cal client timer */ + struct cdp_cal_client *cal_client_ctx; + uint32_t *ppdu_tlv_buf; /* Buffer to hold HTT ppdu stats TLVs*/ + + qdf_nbuf_t mcopy_status_nbuf; + bool is_dp_mon_pdev_initialized; }; struct dp_mon_vdev { @@ -157,6 +350,9 @@ struct dp_mon_peer { #endif }; +struct mon_ops { +}; + #ifdef FEATURE_PERPKT_INFO void dp_deliver_mgmt_frm(struct dp_pdev *pdev, qdf_nbuf_t nbuf); #else @@ -167,6 +363,12 @@ void dp_deliver_mgmt_frm(struct dp_pdev *pdev, qdf_nbuf_t nbuf) #endif #ifndef WLAN_TX_PKT_CAPTURE_ENH +struct dp_pdev_tx_capture { +}; + +struct dp_peer_tx_capture { +}; + /** * dp_peer_tid_queue_init() – Initialize ppdu stats queue per TID * @peer: Datapath peer @@ -340,21 +542,282 @@ void dp_print_pdev_tx_capture_stats(struct dp_pdev *pdev) } #endif +/** + * dp_rx_cookie_2_mon_link_desc_va() - Converts cookie to a virtual address of + * the MSDU Link Descriptor + * @pdev: core txrx pdev context + * @buf_info: buf_info includes cookie that used to lookup virtual address of + * link descriptor. Normally this is just an index into a per pdev array. + * + * This is the VA of the link descriptor in monitor mode destination ring, + * that HAL layer later uses to retrieve the list of MSDU's for a given MPDU. + * + * Return: void *: Virtual Address of the Rx descriptor + */ +static inline +void *dp_rx_cookie_2_mon_link_desc_va(struct dp_pdev *pdev, + struct hal_buf_info *buf_info, + int mac_id) +{ + void *link_desc_va; + struct qdf_mem_multi_page_t *pages; + uint16_t page_id = LINK_DESC_COOKIE_PAGE_ID(buf_info->sw_cookie); + struct dp_mon_soc *mon_soc = pdev->soc->monitor_soc; + + if (!mon_soc) + return NULL; + + pages = &mon_soc->mon_link_desc_pages[mac_id]; + if (!pages) + return NULL; + + if (qdf_unlikely(page_id >= pages->num_pages)) + return NULL; + + link_desc_va = pages->dma_pages[page_id].page_v_addr_start + + (buf_info->paddr - pages->dma_pages[page_id].page_p_addr); + + return link_desc_va; +} + +/** + * dp_soc_is_full_mon_enable () - Return if full monitor mode is enabled + * @soc: DP soc handle + * + * Return: Full monitor mode status + */ +static inline bool dp_soc_is_full_mon_enable(struct dp_pdev *pdev) +{ + return (pdev->soc->monitor_soc->full_mon_mode && + pdev->monitor_pdev->monitor_configured) ? true : false; +} + /* - * dp_is_enable_reap_timer_non_pkt() - check if mon reap timer is + * monitor_is_enable_reap_timer_non_pkt() - check if mon reap timer is * enabled by non-pkt log or not * @pdev: point to dp pdev * * Return: true if mon reap timer is enabled by non-pkt log */ -static inline bool dp_is_enable_reap_timer_non_pkt(struct dp_pdev *pdev) +static inline bool monitor_is_enable_reap_timer_non_pkt(struct dp_pdev *pdev) { - if (!pdev) { - dp_err("null pdev"); + if (!pdev || !pdev->monitor_pdev) return false; + + return pdev->monitor_pdev->enable_reap_timer_non_pkt; +} + +/* + * monitor_is_enable_mcopy_mode() - check if mcopy mode is enabled + * @pdev: point to dp pdev + * + * Return: true if mcopy mode is enabled + */ +static inline bool monitor_is_enable_mcopy_mode(struct dp_pdev *pdev) +{ + if (!pdev || !pdev->monitor_pdev) + return false; + + return pdev->monitor_pdev->mcopy_mode; +} + +/* + * monitor_is_enable_tx_sniffer() - check if tx sniffer is enabled + * @pdev: point to dp pdev + * + * Return: true if tx sniffer is enabled + */ +static inline bool monitor_is_enable_tx_sniffer(struct dp_pdev *pdev) +{ + if (!pdev || !pdev->monitor_pdev) + return false; + + return pdev->monitor_pdev->tx_sniffer_enable; +} + +/* + * monitor_is_set_monitor_configured() - check if monitor configured is set + * @pdev: point to dp pdev + * + * Return: true if monitor configured is set + */ +static inline bool monitor_is_configured(struct dp_pdev *pdev) +{ + if (!pdev || !pdev->monitor_pdev) + return false; + + return pdev->monitor_pdev->monitor_configured; +} + +static inline QDF_STATUS monitor_check_com_info_ppdu_id(struct dp_pdev *pdev, + void *rx_desc) +{ + struct cdp_mon_status *rs; + struct dp_mon_pdev *mon_pdev; + uint32_t msdu_ppdu_id = 0; + + if (!pdev || !pdev->monitor_pdev) + return QDF_STATUS_E_FAILURE; + + mon_pdev = pdev->monitor_pdev; + if (qdf_likely(1 != mon_pdev->ppdu_info.rx_status.rxpcu_filter_pass)) + return QDF_STATUS_E_FAILURE; + + rs = &pdev->monitor_pdev->rx_mon_recv_status; + if (!rs || rs->cdp_rs_rxdma_err) + return QDF_STATUS_E_FAILURE; + + msdu_ppdu_id = hal_rx_get_ppdu_id(pdev->soc->hal_soc, rx_desc); + + if (msdu_ppdu_id != mon_pdev->ppdu_info.com_info.ppdu_id) { + QDF_TRACE(QDF_MODULE_ID_DP, + QDF_TRACE_LEVEL_ERROR, + "msdu_ppdu_id=%x,com_info.ppdu_id=%x", + msdu_ppdu_id, + mon_pdev->ppdu_info.com_info.ppdu_id); + return QDF_STATUS_E_FAILURE; } - return pdev->enable_reap_timer_non_pkt; + return QDF_STATUS_SUCCESS; +} + +static inline struct mon_rx_status* +monitor_get_rx_status_addr(struct dp_pdev *pdev) +{ + if (!pdev || !pdev->monitor_pdev) + return NULL; + + return &pdev->monitor_pdev->ppdu_info.rx_status; +} + +/* + * monitor_is_chan_band_known() - check if monitor chan band known + * @pdev: point to dp pdev + * + * Return: true if chan band known + */ +static inline bool monitor_is_chan_band_known(struct dp_pdev *pdev) +{ + if (!pdev || !pdev->monitor_pdev) + return false; + + if (pdev->monitor_pdev->mon_chan_band != REG_BAND_UNKNOWN) + return true; + + return false; +} + +/* + * monitor_get_chan_band() - get chan band + * @pdev: point to dp pdev + * + * Return: wifi channel band + */ +static inline enum reg_wifi_band +monitor_get_chan_band(struct dp_pdev *pdev) +{ + return pdev->monitor_pdev->mon_chan_band; +} + +/* + * monitor_print_tx_stats() - print tx stats from monitor pdev + * @pdev: point to dp pdev + * + */ +static inline void monitor_print_tx_stats(struct dp_pdev *pdev) +{ + if (!pdev || !pdev->monitor_pdev) + return; + + DP_PRINT_STATS("ppdu info schedule completion list depth: %d", + pdev->monitor_pdev->sched_comp_list_depth); + DP_PRINT_STATS("delivered sched cmdid: %d", + pdev->monitor_pdev->delivered_sched_cmdid); + DP_PRINT_STATS("cur sched cmdid: %d", + pdev->monitor_pdev->last_sched_cmdid); + DP_PRINT_STATS("ppdu info list depth: %d", + pdev->monitor_pdev->list_depth); +} + +/* + * monitor_is_enable_enhanced_stats() - check if enhanced stats enabled + * @pdev: point to dp pdev + * + * Return: true if enhanced stats is enabled + */ +static inline bool monitor_is_enable_enhanced_stats(struct dp_pdev *pdev) +{ + if (!pdev || !pdev->monitor_pdev) + return false; + + return pdev->monitor_pdev->enhanced_stats_en; +} + +/* + * monitor_set_chan_num() - set channel number + * @pdev: point to dp pdev + * @chan_num: channel number + * + * Return: + */ +static inline void monitor_set_chan_num(struct dp_pdev *pdev, int chan_num) +{ + if (!pdev || !pdev->monitor_pdev) + return; + + pdev->monitor_pdev->mon_chan_num = chan_num; +} + +/* + * monitor_set_chan_freq() - set channel frequency + * @pdev: point to dp pdev + * @chan_freq: channel frequency + * + * Return: + */ +static inline void +monitor_set_chan_freq(struct dp_pdev *pdev, qdf_freq_t chan_freq) +{ + if (!pdev || !pdev->monitor_pdev) + return; + + pdev->monitor_pdev->mon_chan_freq = chan_freq; +} + +/* + * monitor_set_chan_band() - set channel band + * @pdev: point to dp pdev + * @chan_band: channel band + * + * Return: + */ +static inline void +monitor_set_chan_band(struct dp_pdev *pdev, enum reg_wifi_band chan_band) +{ + if (!pdev || !pdev->monitor_pdev) + return; + + pdev->monitor_pdev->mon_chan_band = chan_band; +} + +/* + * monitor_get_mpdu_status() - get mpdu status + * @pdev: point to dp pdev + * @soc: point to dp soc + * + */ +static inline void monitor_get_mpdu_status(struct dp_pdev *pdev, + struct dp_soc *soc, + uint8_t *rx_tlv_hdr) +{ + struct dp_mon_pdev *mon_pdev; + + if (!pdev || !pdev->monitor_pdev) + return; + + mon_pdev = pdev->monitor_pdev; + hal_rx_mon_hw_desc_get_mpdu_status(soc->hal_soc, rx_tlv_hdr, + &mon_pdev->ppdu_info.rx_status); } #ifdef FEATURE_NAC_RSSI @@ -364,8 +827,11 @@ static inline QDF_STATUS monitor_drop_inv_peer_pkts(struct dp_vdev *vdev, struct dp_pdev *pdev = vdev->pdev; struct dp_soc *soc = pdev->soc; - if (!soc->hw_nac_monitor_support && - pdev->filter_neighbour_peers && + if (!soc->monitor_soc) + return QDF_STATUS_E_FAILURE; + + if (!soc->monitor_soc->hw_nac_monitor_support && + pdev->monitor_pdev->filter_neighbour_peers && vdev->opmode == wlan_op_mode_sta) { mon_rx_warn("%pK: Drop inv peer pkts with STA RA:%pm", soc, wh->i_addr1); @@ -416,6 +882,15 @@ static inline void monitor_vdev_register_osif(struct dp_vdev *vdev, vdev->monitor_vdev->osif_rx_mon = txrx_ops->rx.mon; } +static inline struct dp_vdev* +monitor_get_monitor_vdev_from_pdev(struct dp_pdev *pdev) +{ + if (!pdev || !pdev->monitor_pdev || !pdev->monitor_pdev->mvdev) + return NULL; + + return pdev->monitor_pdev->mvdev; +} + static inline bool monitor_is_vdev_timer_running(struct dp_soc *soc) { struct dp_mon_soc *mon_soc; @@ -428,6 +903,21 @@ static inline bool monitor_is_vdev_timer_running(struct dp_soc *soc) return mon_soc->mon_vdev_timer_state & MON_VDEV_TIMER_RUNNING; } +static inline struct qdf_mem_multi_page_t* +monitor_get_link_desc_pages(struct dp_soc *soc, uint32_t mac_id) +{ + if (!soc || !soc->monitor_soc) + return NULL; + + return &soc->monitor_soc->mon_link_desc_pages[mac_id]; +} + +static inline uint32_t * +monitor_get_total_link_descs(struct dp_soc *soc, uint32_t mac_id) +{ + return &soc->monitor_soc->total_mon_link_descs[mac_id]; +} + static inline QDF_STATUS monitor_pdev_attach(struct dp_pdev *pdev) { struct dp_mon_ops *monitor_ops; @@ -1473,7 +1963,7 @@ bool monitor_reap_timer_stop(struct dp_soc *soc) return false; } - monitor_ops->mon_reap_timer_stop(mon_soc); + return monitor_ops->mon_reap_timer_stop(mon_soc); } static inline @@ -1556,6 +2046,54 @@ bool monitor_vdev_timer_stop(struct dp_soc *soc) return monitor_ops->mon_vdev_timer_stop(mon_soc); } +static inline +QDF_STATUS monitor_mcopy_check_deliver(struct dp_pdev *pdev, + uint16_t peer_id, uint32_t ppdu_id, + uint8_t first_msdu) +{ + struct dp_mon_ops *monitor_ops; + struct dp_mon_pdev *mon_pdev = pdev->monitor_pdev; + struct dp_mon_soc *mon_soc = pdev->soc->monitor_soc; + + if (!mon_soc) { + qdf_err("monitor soc is NULL"); + return QDF_STATUS_SUCCESS; + } + + monitor_ops = mon_soc->mon_ops; + if (!monitor_ops || !monitor_ops->mon_mcopy_check_deliver) { + qdf_err("callback not registered"); + return QDF_STATUS_SUCCESS; + } + + return monitor_ops->mon_mcopy_check_deliver(mon_pdev, peer_id, + ppdu_id, first_msdu); +} + +static inline void 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) +{ + struct dp_mon_soc *mon_soc = pdev->soc->monitor_soc; + struct dp_mon_ops *monitor_ops; + + if (!mon_soc) { + qdf_err("monitor soc is NULL"); + return; + } + + monitor_ops = mon_soc->mon_ops; + if (!monitor_ops || !monitor_ops->mon_neighbour_peer_add_ast) { + qdf_err("callback not registered"); + return; + } + + return monitor_ops->mon_neighbour_peer_add_ast(pdev, ta_peer, mac_addr, + nbuf, flags); +} + static inline void monitor_vdev_delete(struct dp_soc *soc, struct dp_vdev *vdev) { if (soc->intr_mode == DP_INTR_POLL) { @@ -1569,3 +2107,77 @@ static inline void monitor_vdev_delete(struct dp_soc *soc, struct dp_vdev *vdev) monitor_vdev_detach(vdev); } +#ifdef DP_POWER_SAVE +/* + * monitor_stop_reap_timer() - stop reap timer + * @pdev: point to dp pdev + * + * Return: + */ +static inline void monitor_stop_reap_timer(struct dp_pdev *pdev) +{ + struct dp_soc *soc; + + if (!pdev || !pdev->monitor_pdev) + return; + + soc = pdev->soc; + + if (((pdev->monitor_pdev->rx_pktlog_mode != DP_RX_PKTLOG_DISABLED) || + monitor_is_enable_reap_timer_non_pkt(pdev))) { + if (monitor_reap_timer_stop(soc)) + monitor_service_mon_rings(soc, DP_MON_REAP_BUDGET); + } +} + +/* + * monitor_start_reap_timer() - start reap timer + * @pdev: point to dp pdev + * + * Return: + */ +static inline void monitor_start_reap_timer(struct dp_pdev *pdev) +{ + struct dp_soc *soc; + + if (!pdev || !pdev->monitor_pdev) + return; + + soc = pdev->soc; + if (((pdev->monitor_pdev->rx_pktlog_mode != DP_RX_PKTLOG_DISABLED) || + monitor_is_enable_reap_timer_non_pkt(pdev))) + monitor_reap_timer_start(soc); +} +#endif + +static inline +void monitor_neighbour_peer_list_remove(struct dp_pdev *pdev, + struct dp_vdev *vdev, + struct dp_neighbour_peer *peer) +{ + struct dp_mon_pdev *mon_pdev; + struct dp_neighbour_peer *temp_peer = NULL; + + if (!pdev || !pdev->monitor_pdev) + return; + + mon_pdev = pdev->monitor_pdev; + qdf_spin_lock_bh(&mon_pdev->neighbour_peer_mutex); + if (!pdev->soc->monitor_soc->hw_nac_monitor_support) { + TAILQ_FOREACH(peer, &mon_pdev->neighbour_peers_list, + neighbour_peer_list_elem) { + QDF_ASSERT(peer->vdev != vdev); + } + } else { + TAILQ_FOREACH_SAFE(peer, &mon_pdev->neighbour_peers_list, + neighbour_peer_list_elem, temp_peer) { + if (peer->vdev == vdev) { + TAILQ_REMOVE(&mon_pdev->neighbour_peers_list, + peer, + neighbour_peer_list_elem); + qdf_mem_free(peer); + } + } + } + qdf_spin_unlock_bh(&mon_pdev->neighbour_peer_mutex); +} diff --git a/dp/wifi3.0/monitor/dp_mon_filter.c b/dp/wifi3.0/monitor/dp_mon_filter.c index dfb80df2e0..6e3a84bb0d 100644 --- a/dp/wifi3.0/monitor/dp_mon_filter.c +++ b/dp/wifi3.0/monitor/dp_mon_filter.c @@ -21,6 +21,7 @@ #include "dp_types.h" #include "dp_internal.h" #include "dp_htt.h" +#include "dp_mon.h" #include "dp_mon_filter.h" /** @@ -51,7 +52,7 @@ static int8_t *dp_mon_filter_mode_type_to_str[DP_MON_FILTER_MAX_MODE] = { * @mode: The filter modes * @tlv_filter: tlv filter */ -static void dp_mon_filter_show_filter(struct dp_pdev *pdev, +static void dp_mon_filter_show_filter(struct dp_mon_pdev *mon_pdev, enum dp_mon_filter_mode mode, struct dp_mon_filter *filter) { @@ -192,6 +193,7 @@ static void dp_mon_filter_ht2_setup(struct dp_soc *soc, struct dp_pdev *pdev, { int32_t current_mode = 0; struct htt_rx_ring_tlv_filter *tlv_filter = &filter->tlv_filter; + struct dp_mon_pdev *mon_pdev = pdev->monitor_pdev; /* * Loop through all the modes. @@ -199,7 +201,7 @@ static void dp_mon_filter_ht2_setup(struct dp_soc *soc, struct dp_pdev *pdev, for (current_mode = 0; current_mode < DP_MON_FILTER_MAX_MODE; current_mode++) { struct dp_mon_filter *mon_filter = - &pdev->filter[current_mode][srng_type]; + &mon_pdev->filter[current_mode][srng_type]; uint32_t src_filter = 0, dst_filter = 0; /* @@ -305,7 +307,7 @@ static void dp_mon_filter_ht2_setup(struct dp_soc *soc, struct dp_pdev *pdev, DP_MON_FILTER_SET(tlv_filter, FILTER_MD_CTRL, dst_filter); } - dp_mon_filter_show_filter(pdev, 0, filter); + dp_mon_filter_show_filter(mon_pdev, 0, filter); } /** @@ -338,44 +340,46 @@ dp_mon_filter_reset_mon_srng(struct dp_soc *soc, struct dp_pdev *pdev, */ static QDF_STATUS dp_mon_filter_check_co_exist(struct dp_pdev *pdev) { + struct dp_mon_pdev *mon_pdev = pdev->monitor_pdev; + /* * Check if the Rx Enhanced capture mode, monitor mode, * smart_monitor_mode and mcopy mode can co-exist together. */ - if ((pdev->rx_enh_capture_mode != CDP_RX_ENH_CAPTURE_DISABLED) && - ((pdev->neighbour_peers_added && pdev->monitor_vdev) || - pdev->mcopy_mode)) { + if ((mon_pdev->rx_enh_capture_mode != CDP_RX_ENH_CAPTURE_DISABLED) && + ((mon_pdev->neighbour_peers_added && mon_pdev->mvdev) || + mon_pdev->mcopy_mode)) { dp_mon_filter_err("%pK:Rx Capture mode can't exist with modes:\n" "Smart Monitor Mode:%d\n" "M_Copy Mode:%d", pdev->soc, - pdev->neighbour_peers_added, - pdev->mcopy_mode); + mon_pdev->neighbour_peers_added, + mon_pdev->mcopy_mode); return QDF_STATUS_E_FAILURE; } /* * Check if the monitor mode cannot co-exist with any other mode. */ - if ((pdev->monitor_vdev && pdev->monitor_configured) && - (pdev->mcopy_mode || pdev->neighbour_peers_added)) { + if ((mon_pdev->mvdev && mon_pdev->monitor_configured) && + (mon_pdev->mcopy_mode || mon_pdev->neighbour_peers_added)) { dp_mon_filter_err("%pK: Monitor mode can't exist with modes\n" "M_Copy Mode:%d\n" "Smart Monitor Mode:%d", - pdev->soc, pdev->mcopy_mode, - pdev->neighbour_peers_added); + pdev->soc, mon_pdev->mcopy_mode, + mon_pdev->neighbour_peers_added); return QDF_STATUS_E_FAILURE; } /* * Check if the smart monitor mode can co-exist with any other mode */ - if (pdev->neighbour_peers_added && - ((pdev->mcopy_mode) || pdev->monitor_configured)) { - dp_mon_filter_err("%pK: Smart Monitor mode can't exist with modes\n" + if (mon_pdev->neighbour_peers_added && + ((mon_pdev->mcopy_mode) || mon_pdev->monitor_configured)) { + dp_mon_filter_err("%pk: Smart Monitor mode can't exist with modes\n" "M_Copy Mode:%d\n" "Monitor Mode:%d", - pdev->soc, pdev->mcopy_mode, - pdev->monitor_configured); + pdev->soc, mon_pdev->mcopy_mode, + mon_pdev->monitor_configured); return QDF_STATUS_E_FAILURE; } @@ -383,13 +387,13 @@ static QDF_STATUS dp_mon_filter_check_co_exist(struct dp_pdev *pdev) * Check if the m_copy, monitor mode and the smart_monitor_mode * can co-exist togther. */ - if (pdev->mcopy_mode && - (pdev->monitor_vdev || pdev->neighbour_peers_added)) { + if (mon_pdev->mcopy_mode && + (mon_pdev->mvdev || mon_pdev->neighbour_peers_added)) { dp_mon_filter_err("%pK: mcopy mode can't exist with modes\n" "Monitor Mode:%pK\n" "Smart Monitor Mode:%d", - pdev->soc, pdev->monitor_vdev, - pdev->neighbour_peers_added); + pdev->soc, mon_pdev->mvdev, + mon_pdev->neighbour_peers_added); return QDF_STATUS_E_FAILURE; } @@ -397,12 +401,12 @@ static QDF_STATUS dp_mon_filter_check_co_exist(struct dp_pdev *pdev) * Check if the Rx packet log lite or full can co-exist with * the enable modes. */ - if ((pdev->rx_pktlog_mode != DP_RX_PKTLOG_DISABLED) && - !pdev->rx_pktlog_cbf && - (pdev->monitor_vdev || pdev->monitor_configured)) { + if ((mon_pdev->rx_pktlog_mode != DP_RX_PKTLOG_DISABLED) && + !mon_pdev->rx_pktlog_cbf && + (mon_pdev->mvdev || mon_pdev->monitor_configured)) { dp_mon_filter_err("%pK: Rx pktlog full/lite can't exist with modes\n" "Monitor Mode:%d", pdev->soc, - pdev->monitor_configured); + mon_pdev->monitor_configured); return QDF_STATUS_E_FAILURE; } return QDF_STATUS_SUCCESS; @@ -414,11 +418,11 @@ static QDF_STATUS dp_mon_filter_check_co_exist(struct dp_pdev *pdev) * Check if the Rx packet log lite or full can co-exist with * the enable modes. */ - if ((pdev->rx_pktlog_mode != DP_RX_PKTLOG_DISABLED) && - (pdev->monitor_vdev || pdev->monitor_configured)) { - dp_mon_filter_err("%pK: Rx pktlog full/lite can't exist with modes\n" - "Monitor Mode:%d", pdev->soc, - pdev->monitor_configured); + if ((mon_pdev->rx_pktlog_mode != DP_RX_PKTLOG_DISABLED) && + (mon_pdev->mvdev || mon_pdev->monitor_configured)) { + dp_mon_filter_err("%pK: Rx pktlog full/lite can't exist with modes\n" + "Monitor Mode:%d", pdev->soc, + mon_pdev->monitor_configured); return QDF_STATUS_E_FAILURE; } @@ -433,7 +437,7 @@ static QDF_STATUS dp_mon_filter_check_co_exist(struct dp_pdev *pdev) * * Return: QDF_STATUS */ -static void dp_mon_filter_set_mon_cmn(struct dp_pdev *pdev, +static void dp_mon_filter_set_mon_cmn(struct dp_mon_pdev *mon_pdev, struct dp_mon_filter *filter) { filter->tlv_filter.mpdu_start = 1; @@ -450,16 +454,16 @@ static void dp_mon_filter_set_mon_cmn(struct dp_pdev *pdev, filter->tlv_filter.ppdu_end_status_done = 0; filter->tlv_filter.header_per_msdu = 1; filter->tlv_filter.enable_fp = - (pdev->mon_filter_mode & MON_FILTER_PASS) ? 1 : 0; + (mon_pdev->mon_filter_mode & MON_FILTER_PASS) ? 1 : 0; filter->tlv_filter.enable_mo = - (pdev->mon_filter_mode & MON_FILTER_OTHER) ? 1 : 0; + (mon_pdev->mon_filter_mode & MON_FILTER_OTHER) ? 1 : 0; - filter->tlv_filter.fp_mgmt_filter = pdev->fp_mgmt_filter; - filter->tlv_filter.fp_ctrl_filter = pdev->fp_ctrl_filter; - filter->tlv_filter.fp_data_filter = pdev->fp_data_filter; - filter->tlv_filter.mo_mgmt_filter = pdev->mo_mgmt_filter; - filter->tlv_filter.mo_ctrl_filter = pdev->mo_ctrl_filter; - filter->tlv_filter.mo_data_filter = pdev->mo_data_filter; + filter->tlv_filter.fp_mgmt_filter = mon_pdev->fp_mgmt_filter; + filter->tlv_filter.fp_ctrl_filter = mon_pdev->fp_ctrl_filter; + filter->tlv_filter.fp_data_filter = mon_pdev->fp_data_filter; + filter->tlv_filter.mo_mgmt_filter = mon_pdev->mo_mgmt_filter; + filter->tlv_filter.mo_ctrl_filter = mon_pdev->mo_ctrl_filter; + filter->tlv_filter.mo_data_filter = mon_pdev->mo_data_filter; filter->tlv_filter.offset_valid = false; } @@ -470,7 +474,7 @@ static void dp_mon_filter_set_mon_cmn(struct dp_pdev *pdev, * * Return: QDF_STATUS */ -static void dp_mon_filter_set_status_cmn(struct dp_pdev *pdev, +static void dp_mon_filter_set_status_cmn(struct dp_mon_pdev *mon_pdev, struct dp_mon_filter *filter) { filter->tlv_filter.mpdu_start = 1; @@ -491,7 +495,7 @@ static void dp_mon_filter_set_status_cmn(struct dp_pdev *pdev, filter->tlv_filter.fp_data_filter = FILTER_DATA_ALL; filter->tlv_filter.offset_valid = false; - if (pdev->mon_filter_mode & MON_FILTER_OTHER) { + if (mon_pdev->mon_filter_mode & MON_FILTER_OTHER) { filter->tlv_filter.enable_mo = 1; filter->tlv_filter.mo_mgmt_filter = FILTER_MGMT_ALL; filter->tlv_filter.mo_ctrl_filter = FILTER_CTRL_ALL; @@ -562,26 +566,26 @@ static void dp_mon_filter_set_cbf_cmn(struct dp_pdev *pdev, #ifdef FEATURE_PERPKT_INFO /** * dp_mon_filter_setup_enhanced_stats() - Setup the enhanced stats filter - * @pdev: DP pdev handle + * @mon_pdev: Monitor DP pdev handle */ -void dp_mon_filter_setup_enhanced_stats(struct dp_pdev *pdev) +void dp_mon_filter_setup_enhanced_stats(struct dp_mon_pdev *mon_pdev) { struct dp_mon_filter filter = {0}; enum dp_mon_filter_mode mode = DP_MON_FILTER_ENHACHED_STATS_MODE; enum dp_mon_filter_srng_type srng_type = DP_MON_FILTER_SRNG_TYPE_RXDMA_MONITOR_STATUS; - if (!pdev) { - dp_mon_filter_err("pdev Context is null"); + if (!mon_pdev) { + dp_mon_filter_err("Monitor pdev Context is null"); return; } /* Enabled the filter */ filter.valid = true; - dp_mon_filter_set_status_cmn(pdev, &filter); - dp_mon_filter_show_filter(pdev, mode, &filter); - pdev->filter[mode][srng_type] = filter; + dp_mon_filter_set_status_cmn(mon_pdev, &filter); + dp_mon_filter_show_filter(mon_pdev, mode, &filter); + mon_pdev->filter[mode][srng_type] = filter; } /** @@ -594,12 +598,15 @@ void dp_mon_filter_reset_enhanced_stats(struct dp_pdev *pdev) enum dp_mon_filter_mode mode = DP_MON_FILTER_ENHACHED_STATS_MODE; enum dp_mon_filter_srng_type srng_type = DP_MON_FILTER_SRNG_TYPE_RXDMA_MONITOR_STATUS; + struct dp_mon_pdev *mon_pdev; + if (!pdev) { dp_mon_filter_err("pdev Context is null"); return; } - pdev->filter[mode][srng_type] = filter; + mon_pdev = pdev->monitor_pdev; + mon_pdev->filter[mode][srng_type] = filter; } /** @@ -613,6 +620,7 @@ void dp_mon_filter_setup_mcopy_mode(struct dp_pdev *pdev) enum dp_mon_filter_mode mode = DP_MON_FILTER_MCOPY_MODE; enum dp_mon_filter_srng_type srng_type = DP_MON_FILTER_SRNG_TYPE_RXDMA_MONITOR_STATUS; + struct dp_mon_pdev *mon_pdev; if (!pdev) { dp_mon_filter_err("pdev Context is null"); @@ -625,19 +633,24 @@ void dp_mon_filter_setup_mcopy_mode(struct dp_pdev *pdev) return; } + mon_pdev = pdev->monitor_pdev; + if (!mon_pdev) { + dp_mon_filter_err("monitor pdev Context is null"); + return; + } /* Enabled the filter */ filter.valid = true; - dp_mon_filter_set_mon_cmn(pdev, &filter); + dp_mon_filter_set_mon_cmn(mon_pdev, &filter); filter.tlv_filter.fp_data_filter = 0; filter.tlv_filter.mo_data_filter = 0; - dp_mon_filter_show_filter(pdev, mode, &filter); + dp_mon_filter_show_filter(mon_pdev, mode, &filter); srng_type = ((soc->wlan_cfg_ctx->rxdma1_enable) ? DP_MON_FILTER_SRNG_TYPE_RXDMA_MON_BUF : DP_MON_FILTER_SRNG_TYPE_RXDMA_BUF); - pdev->filter[mode][srng_type] = filter; + mon_pdev->filter[mode][srng_type] = filter; /* Clear the filter as the same filter will be used to set the * monitor status ring @@ -646,16 +659,16 @@ void dp_mon_filter_setup_mcopy_mode(struct dp_pdev *pdev) /* Enabled the filter */ filter.valid = true; - dp_mon_filter_set_status_cmn(pdev, &filter); + dp_mon_filter_set_status_cmn(mon_pdev, &filter); /* Setup the filter */ filter.tlv_filter.enable_mo = 1; filter.tlv_filter.packet_header = 1; filter.tlv_filter.mpdu_end = 1; - dp_mon_filter_show_filter(pdev, mode, &filter); + dp_mon_filter_show_filter(mon_pdev, mode, &filter); srng_type = DP_MON_FILTER_SRNG_TYPE_RXDMA_MONITOR_STATUS; - pdev->filter[mode][srng_type] = filter; + mon_pdev->filter[mode][srng_type] = filter; } /** @@ -669,6 +682,7 @@ void dp_mon_filter_reset_mcopy_mode(struct dp_pdev *pdev) enum dp_mon_filter_mode mode = DP_MON_FILTER_MCOPY_MODE; enum dp_mon_filter_srng_type srng_type = DP_MON_FILTER_SRNG_TYPE_RXDMA_MONITOR_STATUS; + struct dp_mon_pdev *mon_pdev; if (!pdev) { dp_mon_filter_err("pdev Context is null"); @@ -681,13 +695,14 @@ void dp_mon_filter_reset_mcopy_mode(struct dp_pdev *pdev) return; } + mon_pdev = pdev->monitor_pdev; srng_type = ((soc->wlan_cfg_ctx->rxdma1_enable) ? DP_MON_FILTER_SRNG_TYPE_RXDMA_MON_BUF : DP_MON_FILTER_SRNG_TYPE_RXDMA_BUF); - pdev->filter[mode][srng_type] = filter; + mon_pdev->filter[mode][srng_type] = filter; srng_type = DP_MON_FILTER_SRNG_TYPE_RXDMA_MONITOR_STATUS; - pdev->filter[mode][srng_type] = filter; + mon_pdev->filter[mode][srng_type] = filter; } #endif /* FEATURE_PERPKT_INFO */ @@ -700,9 +715,12 @@ void dp_mon_filter_setup_smart_monitor(struct dp_pdev *pdev) { struct dp_mon_filter filter = {0}; struct dp_soc *soc = NULL; + struct dp_mon_soc *mon_soc; + enum dp_mon_filter_mode mode = DP_MON_FILTER_SMART_MONITOR_MODE; enum dp_mon_filter_srng_type srng_type = DP_MON_FILTER_SRNG_TYPE_RXDMA_MONITOR_STATUS; + struct dp_mon_pdev *mon_pdev; if (!pdev) { dp_mon_filter_err("pdev Context is null"); @@ -715,36 +733,39 @@ void dp_mon_filter_setup_smart_monitor(struct dp_pdev *pdev) return; } + mon_soc = soc->monitor_soc; + mon_pdev = pdev->monitor_pdev; + /* Enabled the filter */ filter.valid = true; - dp_mon_filter_set_status_cmn(pdev, &filter); + dp_mon_filter_set_status_cmn(mon_pdev, &filter); - if (soc->hw_nac_monitor_support) { + if (mon_soc->hw_nac_monitor_support) { filter.tlv_filter.enable_md = 1; filter.tlv_filter.packet_header = 1; filter.tlv_filter.md_data_filter = FILTER_DATA_ALL; } - dp_mon_filter_show_filter(pdev, mode, &filter); - pdev->filter[mode][srng_type] = filter; + dp_mon_filter_show_filter(mon_pdev, mode, &filter); + mon_pdev->filter[mode][srng_type] = filter; } /** * dp_mon_filter_reset_smart_monitor() - Reset the smart monitor mode filter * @pdev: DP pdev handle */ -void dp_mon_filter_reset_smart_monitor(struct dp_pdev *pdev) +void dp_mon_filter_reset_smart_monitor(struct dp_mon_pdev *mon_pdev) { struct dp_mon_filter filter = {0}; enum dp_mon_filter_mode mode = DP_MON_FILTER_SMART_MONITOR_MODE; enum dp_mon_filter_srng_type srng_type = DP_MON_FILTER_SRNG_TYPE_RXDMA_MONITOR_STATUS; - if (!pdev) { - dp_mon_filter_err("pdev Context is null"); + + if (!mon_pdev) { + dp_mon_filter_err("monitor pdev Context is null"); return; } - - pdev->filter[mode][srng_type] = filter; + mon_pdev->filter[mode][srng_type] = filter; } #endif /* ATH_SUPPORT_NAC_RSSI || ATH_SUPPORT_NAC */ @@ -760,6 +781,7 @@ void dp_mon_filter_setup_rx_enh_capture(struct dp_pdev *pdev) enum dp_mon_filter_mode mode = DP_MON_FILTER_RX_CAPTURE_MODE; enum dp_mon_filter_srng_type srng_type = DP_MON_FILTER_SRNG_TYPE_RXDMA_MONITOR_STATUS; + struct dp_mon_pdev *mon_pdev; if (!pdev) { dp_mon_filter_err("pdev Context is null"); @@ -772,9 +794,11 @@ void dp_mon_filter_setup_rx_enh_capture(struct dp_pdev *pdev) return; } + mon_pdev = pdev->monitor_pdev; + /* Enabled the filter */ filter.valid = true; - dp_mon_filter_set_mon_cmn(pdev, &filter); + dp_mon_filter_set_mon_cmn(mon_pdev, &filter); filter.tlv_filter.fp_mgmt_filter = 0; filter.tlv_filter.fp_ctrl_filter = 0; @@ -783,12 +807,12 @@ void dp_mon_filter_setup_rx_enh_capture(struct dp_pdev *pdev) filter.tlv_filter.mo_ctrl_filter = 0; filter.tlv_filter.mo_data_filter = 0; - dp_mon_filter_show_filter(pdev, mode, &filter); + dp_mon_filter_show_filter(mon_pdev, mode, &filter); srng_type = ((soc->wlan_cfg_ctx->rxdma1_enable) ? DP_MON_FILTER_SRNG_TYPE_RXDMA_MON_BUF : DP_MON_FILTER_SRNG_TYPE_RXDMA_BUF); - pdev->filter[mode][srng_type] = filter; + mon_pdev->filter[mode][srng_type] = filter; /* Clear the filter as the same filter will be used to set the * monitor status ring @@ -797,31 +821,31 @@ void dp_mon_filter_setup_rx_enh_capture(struct dp_pdev *pdev) /* Enabled the filter */ filter.valid = true; - dp_mon_filter_set_status_cmn(pdev, &filter); + dp_mon_filter_set_status_cmn(mon_pdev, &filter); /* Setup the filter */ filter.tlv_filter.mpdu_end = 1; filter.tlv_filter.enable_mo = 1; filter.tlv_filter.packet_header = 1; - if (pdev->rx_enh_capture_mode == CDP_RX_ENH_CAPTURE_MPDU) { + if (mon_pdev->rx_enh_capture_mode == CDP_RX_ENH_CAPTURE_MPDU) { filter.tlv_filter.header_per_msdu = 0; filter.tlv_filter.enable_mo = 0; - } else if (pdev->rx_enh_capture_mode == + } else if (mon_pdev->rx_enh_capture_mode == CDP_RX_ENH_CAPTURE_MPDU_MSDU) { bool is_rx_mon_proto_flow_tag_enabled = wlan_cfg_is_rx_mon_protocol_flow_tag_enabled(soc->wlan_cfg_ctx); filter.tlv_filter.header_per_msdu = 1; filter.tlv_filter.enable_mo = 0; - if (pdev->is_rx_enh_capture_trailer_enabled || + if (mon_pdev->is_rx_enh_capture_trailer_enabled || is_rx_mon_proto_flow_tag_enabled) filter.tlv_filter.msdu_end = 1; } - dp_mon_filter_show_filter(pdev, mode, &filter); + dp_mon_filter_show_filter(mon_pdev, mode, &filter); srng_type = DP_MON_FILTER_SRNG_TYPE_RXDMA_MONITOR_STATUS; - pdev->filter[mode][srng_type] = filter; + mon_pdev->filter[mode][srng_type] = filter; } /** @@ -835,6 +859,7 @@ void dp_mon_filter_reset_rx_enh_capture(struct dp_pdev *pdev) enum dp_mon_filter_mode mode = DP_MON_FILTER_RX_CAPTURE_MODE; enum dp_mon_filter_srng_type srng_type = DP_MON_FILTER_SRNG_TYPE_RXDMA_MONITOR_STATUS; + struct dp_mon_pdev *mon_pdev; if (!pdev) { dp_mon_filter_err("pdev Context is null"); @@ -847,13 +872,14 @@ void dp_mon_filter_reset_rx_enh_capture(struct dp_pdev *pdev) return; } + mon_pdev = pdev->monitor_pdev; srng_type = ((soc->wlan_cfg_ctx->rxdma1_enable) ? DP_MON_FILTER_SRNG_TYPE_RXDMA_MON_BUF : DP_MON_FILTER_SRNG_TYPE_RXDMA_BUF); - pdev->filter[mode][srng_type] = filter; + mon_pdev->filter[mode][srng_type] = filter; srng_type = DP_MON_FILTER_SRNG_TYPE_RXDMA_MONITOR_STATUS; - pdev->filter[mode][srng_type] = filter; + mon_pdev->filter[mode][srng_type] = filter; } #endif /* WLAN_RX_PKT_CAPTURE_ENH */ @@ -868,6 +894,7 @@ void dp_mon_filter_setup_mon_mode(struct dp_pdev *pdev) enum dp_mon_filter_mode mode = DP_MON_FILTER_MONITOR_MODE; enum dp_mon_filter_srng_type srng_type = DP_MON_FILTER_SRNG_TYPE_RXDMA_MONITOR_STATUS; + struct dp_mon_pdev *mon_pdev; if (!pdev) { dp_mon_filter_err("pdev Context is null"); @@ -880,14 +907,15 @@ void dp_mon_filter_setup_mon_mode(struct dp_pdev *pdev) return; } + mon_pdev = pdev->monitor_pdev; filter.valid = true; - dp_mon_filter_set_mon_cmn(pdev, &filter); - dp_mon_filter_show_filter(pdev, mode, &filter); + dp_mon_filter_set_mon_cmn(mon_pdev, &filter); + dp_mon_filter_show_filter(mon_pdev, mode, &filter); srng_type = ((soc->wlan_cfg_ctx->rxdma1_enable) ? DP_MON_FILTER_SRNG_TYPE_RXDMA_MON_BUF : DP_MON_FILTER_SRNG_TYPE_RXDMA_BUF); - pdev->filter[mode][srng_type] = filter; + mon_pdev->filter[mode][srng_type] = filter; /* Clear the filter as the same filter will be used to set the * monitor status ring @@ -896,12 +924,12 @@ void dp_mon_filter_setup_mon_mode(struct dp_pdev *pdev) /* Enabled the filter */ filter.valid = true; - dp_mon_filter_set_status_cmn(pdev, &filter); - dp_mon_filter_show_filter(pdev, mode, &filter); + dp_mon_filter_set_status_cmn(mon_pdev, &filter); + dp_mon_filter_show_filter(mon_pdev, mode, &filter); /* Store the above filter */ srng_type = DP_MON_FILTER_SRNG_TYPE_RXDMA_MONITOR_STATUS; - pdev->filter[mode][srng_type] = filter; + mon_pdev->filter[mode][srng_type] = filter; } /** @@ -915,6 +943,7 @@ void dp_mon_filter_reset_mon_mode(struct dp_pdev *pdev) enum dp_mon_filter_mode mode = DP_MON_FILTER_MONITOR_MODE; enum dp_mon_filter_srng_type srng_type = DP_MON_FILTER_SRNG_TYPE_RXDMA_MONITOR_STATUS; + struct dp_mon_pdev *mon_pdev; if (!pdev) { dp_mon_filter_err("pdev Context is null"); @@ -927,13 +956,14 @@ void dp_mon_filter_reset_mon_mode(struct dp_pdev *pdev) return; } + mon_pdev = pdev->monitor_pdev; srng_type = ((soc->wlan_cfg_ctx->rxdma1_enable) ? DP_MON_FILTER_SRNG_TYPE_RXDMA_MON_BUF : DP_MON_FILTER_SRNG_TYPE_RXDMA_BUF); - pdev->filter[mode][srng_type] = filter; + mon_pdev->filter[mode][srng_type] = filter; srng_type = DP_MON_FILTER_SRNG_TYPE_RXDMA_MONITOR_STATUS; - pdev->filter[mode][srng_type] = filter; + mon_pdev->filter[mode][srng_type] = filter; } #ifdef WDI_EVENT_ENABLE @@ -947,14 +977,17 @@ void dp_mon_filter_setup_rx_pkt_log_full(struct dp_pdev *pdev) enum dp_mon_filter_mode mode = DP_MON_FILTER_PKT_LOG_FULL_MODE; enum dp_mon_filter_srng_type srng_type = DP_MON_FILTER_SRNG_TYPE_RXDMA_MONITOR_STATUS; + struct dp_mon_pdev *mon_pdev; + if (!pdev) { dp_mon_filter_err("pdev Context is null"); return; } + mon_pdev = pdev->monitor_pdev; /* Enabled the filter */ filter.valid = true; - dp_mon_filter_set_status_cmn(pdev, &filter); + dp_mon_filter_set_status_cmn(mon_pdev, &filter); /* Setup the filter */ filter.tlv_filter.packet_header = 1; @@ -963,8 +996,8 @@ void dp_mon_filter_setup_rx_pkt_log_full(struct dp_pdev *pdev) filter.tlv_filter.mpdu_end = 1; filter.tlv_filter.attention = 1; - dp_mon_filter_show_filter(pdev, mode, &filter); - pdev->filter[mode][srng_type] = filter; + dp_mon_filter_show_filter(mon_pdev, mode, &filter); + mon_pdev->filter[mode][srng_type] = filter; } /** @@ -977,12 +1010,15 @@ void dp_mon_filter_reset_rx_pkt_log_full(struct dp_pdev *pdev) enum dp_mon_filter_mode mode = DP_MON_FILTER_PKT_LOG_FULL_MODE; enum dp_mon_filter_srng_type srng_type = DP_MON_FILTER_SRNG_TYPE_RXDMA_MONITOR_STATUS; + struct dp_mon_pdev *mon_pdev; + if (!pdev) { dp_mon_filter_err("pdev Context is null"); return; } - pdev->filter[mode][srng_type] = filter; + mon_pdev = pdev->monitor_pdev; + mon_pdev->filter[mode][srng_type] = filter; } /** @@ -995,35 +1031,39 @@ void dp_mon_filter_setup_rx_pkt_log_lite(struct dp_pdev *pdev) enum dp_mon_filter_mode mode = DP_MON_FILTER_PKT_LOG_LITE_MODE; enum dp_mon_filter_srng_type srng_type = DP_MON_FILTER_SRNG_TYPE_RXDMA_MONITOR_STATUS; + struct dp_mon_pdev *mon_pdev; + if (!pdev) { dp_mon_filter_err("pdev Context is null"); return; } + mon_pdev = pdev->monitor_pdev; /* Enabled the filter */ filter.valid = true; - dp_mon_filter_set_status_cmn(pdev, &filter); + dp_mon_filter_set_status_cmn(mon_pdev, &filter); - dp_mon_filter_show_filter(pdev, mode, &filter); - pdev->filter[mode][srng_type] = filter; + dp_mon_filter_show_filter(mon_pdev, mode, &filter); + mon_pdev->filter[mode][srng_type] = filter; } /** * dp_mon_filter_reset_rx_pkt_log_lite() - Reset the Rx pktlog lite mode filter - * @pdev: DP pdev handle + * @mon_pdev: Monitor pdev handle */ -void dp_mon_filter_reset_rx_pkt_log_lite(struct dp_pdev *pdev) +void dp_mon_filter_reset_rx_pkt_log_lite(struct dp_mon_pdev *mon_pdev) { struct dp_mon_filter filter = {0}; enum dp_mon_filter_mode mode = DP_MON_FILTER_PKT_LOG_LITE_MODE; enum dp_mon_filter_srng_type srng_type = DP_MON_FILTER_SRNG_TYPE_RXDMA_MONITOR_STATUS; - if (!pdev) { - dp_mon_filter_err("pdev Context is null"); + + if (!mon_pdev) { + dp_mon_filter_err("monitor pdev Context is null"); return; } - pdev->filter[mode][srng_type] = filter; + mon_pdev->filter[mode][srng_type] = filter; } /** @@ -1037,6 +1077,7 @@ void dp_mon_filter_setup_rx_pkt_log_cbf(struct dp_pdev *pdev) enum dp_mon_filter_mode mode = DP_MON_FILTER_PKT_LOG_CBF_MODE; enum dp_mon_filter_srng_type srng_type = DP_MON_FILTER_SRNG_TYPE_RXDMA_MONITOR_STATUS; + struct dp_mon_pdev *mon_pdev = pdev->monitor_pdev; if (!pdev) { dp_mon_filter_err("pdev Context is null"); @@ -1052,8 +1093,8 @@ void dp_mon_filter_setup_rx_pkt_log_cbf(struct dp_pdev *pdev) /* Enabled the filter */ filter.valid = true; dp_mon_filter_set_status_cbf(pdev, &filter); - dp_mon_filter_show_filter(pdev, mode, &filter); - pdev->filter[mode][srng_type] = filter; + dp_mon_filter_show_filter(mon_pdev, mode, &filter); + mon_pdev->filter[mode][srng_type] = filter; /* Clear the filter as the same filter will be used to set the * monitor status ring @@ -1062,12 +1103,12 @@ void dp_mon_filter_setup_rx_pkt_log_cbf(struct dp_pdev *pdev) filter.valid = true; dp_mon_filter_set_cbf_cmn(pdev, &filter); - dp_mon_filter_show_filter(pdev, mode, &filter); + dp_mon_filter_show_filter(mon_pdev, mode, &filter); srng_type = ((soc->wlan_cfg_ctx->rxdma1_enable) ? DP_MON_FILTER_SRNG_TYPE_RXDMA_MON_BUF : DP_MON_FILTER_SRNG_TYPE_RXDMA_BUF); - pdev->filter[mode][srng_type] = filter; + mon_pdev->filter[mode][srng_type] = filter; } /** @@ -1081,6 +1122,8 @@ void dp_mon_filter_reset_rx_pktlog_cbf(struct dp_pdev *pdev) enum dp_mon_filter_mode mode = DP_MON_FILTER_PKT_LOG_CBF_MODE; enum dp_mon_filter_srng_type srng_type = DP_MON_FILTER_SRNG_TYPE_RXDMA_BUF; + struct dp_mon_pdev *mon_pdev = pdev->monitor_pdev; + if (!pdev) { QDF_TRACE(QDF_MODULE_ID_MON_FILTER, QDF_TRACE_LEVEL_ERROR, FL("pdev Context is null")); @@ -1097,10 +1140,10 @@ void dp_mon_filter_reset_rx_pktlog_cbf(struct dp_pdev *pdev) srng_type = ((soc->wlan_cfg_ctx->rxdma1_enable) ? DP_MON_FILTER_SRNG_TYPE_RXDMA_MON_BUF : DP_MON_FILTER_SRNG_TYPE_RXDMA_BUF); - pdev->filter[mode][srng_type] = filter; + mon_pdev->filter[mode][srng_type] = filter; srng_type = DP_MON_FILTER_SRNG_TYPE_RXDMA_MONITOR_STATUS; - pdev->filter[mode][srng_type] = filter; + mon_pdev->filter[mode][srng_type] = filter; } #endif /* WDI_EVENT_ENABLE */ @@ -1121,7 +1164,7 @@ void dp_mon_filter_reset_rx_pktlog_cbf(struct dp_pdev *pdev) */ static inline bool dp_mon_should_reset_buf_ring_filter(struct dp_pdev *pdev) { - return (pdev->monitor_vdev) ? true : false; + return (pdev->monitor_pdev->mvdev) ? true : false; } #else static inline bool dp_mon_should_reset_buf_ring_filter(struct dp_pdev *pdev) @@ -1145,12 +1188,14 @@ QDF_STATUS dp_mon_filter_update(struct dp_pdev *pdev) enum dp_mon_filter_srng_type mon_srng_type = DP_MON_FILTER_SRNG_TYPE_RXDMA_MON_BUF; QDF_STATUS status = QDF_STATUS_SUCCESS; + struct dp_mon_pdev *mon_pdev; if (!pdev) { dp_mon_filter_err("pdev Context is null"); return QDF_STATUS_E_FAILURE; } + mon_pdev = pdev->monitor_pdev; soc = pdev->soc; if (!soc) { dp_mon_filter_err("Soc Context is null"); @@ -1184,7 +1229,7 @@ QDF_STATUS dp_mon_filter_update(struct dp_pdev *pdev) * reset when monitor mode gets enabled/disabled. */ if (soc->wlan_cfg_ctx->rxdma1_enable) { - if (pdev->monitor_configured || mon_mode_set) { + if (mon_pdev->monitor_configured || mon_mode_set) { status = dp_mon_ht2_rx_ring_cfg(soc, pdev, mon_srng_type, &filter.tlv_filter); @@ -1232,20 +1277,20 @@ QDF_STATUS dp_mon_filter_update(struct dp_pdev *pdev) * the radio object. * @pdev: DP pdev handle */ -void dp_mon_filter_dealloc(struct dp_pdev *pdev) +void dp_mon_filter_dealloc(struct dp_mon_pdev *mon_pdev) { enum dp_mon_filter_mode mode; struct dp_mon_filter **mon_filter = NULL; - if (!pdev) { - dp_mon_filter_err("pdev Context is null"); + if (!mon_pdev) { + dp_mon_filter_err("Monitor pdev Context is null"); return; } - mon_filter = pdev->filter; + mon_filter = mon_pdev->filter; /* - * Check if the monitor filters are already allocated to the pdev. + * Check if the monitor filters are already allocated to the mon_pdev. */ if (!mon_filter) { dp_mon_filter_err("Found NULL memmory for the Monitor filter"); @@ -1265,20 +1310,20 @@ void dp_mon_filter_dealloc(struct dp_pdev *pdev) } qdf_mem_free(mon_filter); - pdev->filter = NULL; + mon_pdev->filter = NULL; } /** * dp_mon_filter_alloc() - Allocate the filter objects to be stored in * the radio object. - * @pdev: DP pdev handle + * @mon_pdev: DP pdev handle */ -struct dp_mon_filter **dp_mon_filter_alloc(struct dp_pdev *pdev) +struct dp_mon_filter **dp_mon_filter_alloc(struct dp_mon_pdev *mon_pdev) { struct dp_mon_filter **mon_filter = NULL; enum dp_mon_filter_mode mode; - if (!pdev) { + if (!mon_pdev) { dp_mon_filter_err("pdev Context is null"); return NULL; } @@ -1303,13 +1348,13 @@ struct dp_mon_filter **dp_mon_filter_alloc(struct dp_pdev *pdev) /* Assign the mon_filter to the pdev->filter such * that the dp_mon_filter_dealloc() can free up the filters. */ if (!mon_filter[mode]) { - pdev->filter = mon_filter; + mon_pdev->filter = mon_filter; goto fail; } } return mon_filter; fail: - dp_mon_filter_dealloc(pdev); + dp_mon_filter_dealloc(mon_pdev); return NULL; } diff --git a/dp/wifi3.0/monitor/dp_mon_filter.h b/dp/wifi3.0/monitor/dp_mon_filter.h index d8ecefbe79..c628228b86 100644 --- a/dp/wifi3.0/monitor/dp_mon_filter.h +++ b/dp/wifi3.0/monitor/dp_mon_filter.h @@ -155,9 +155,9 @@ enum dp_mon_filter_action { #ifdef FEATURE_PERPKT_INFO /** * dp_mon_filter_setup_enhanced_stats() - Setup the enhanced stats filter - * @pdev: DP pdev handle + * @mon_pdev: Monitor DP pdev handle */ -void dp_mon_filter_setup_enhanced_stats(struct dp_pdev *pdev); +void dp_mon_filter_setup_enhanced_stats(struct dp_mon_pdev *mon_pdev); /*** * dp_mon_filter_reset_enhanced_stats() - Reset the enhanced stats filter @@ -187,9 +187,9 @@ void dp_mon_filter_setup_smart_monitor(struct dp_pdev *pdev); /** * dp_mon_filter_reset_smart_monitor() - Reset the smart monitor mode filter - * @pdev: DP pdev handle + * @mon_pdev: monitor pdev handle */ -void dp_mon_filter_reset_smart_monitor(struct dp_pdev *pdev); +void dp_mon_filter_reset_smart_monitor(struct dp_mon_pdev *mon_pdev); #endif /* ATH_SUPPORT_NAC_RSSI || ATH_SUPPORT_NAC */ #ifdef WLAN_RX_PKT_CAPTURE_ENH @@ -240,9 +240,9 @@ void dp_mon_filter_setup_rx_pkt_log_lite(struct dp_pdev *pdev); /** * dp_mon_filter_reset_rx_pkt_log_lite() - Reset the Rx pktlog lite mode filter - * @pdev: DP pdev handle + * @mon_pdev: Monitor pdev handle */ -void dp_mon_filter_reset_rx_pkt_log_lite(struct dp_pdev *pdev); +void dp_mon_filter_reset_rx_pkt_log_lite(struct dp_mon_pdev *mon_pdev); /** * dp_mon_filter_setup_rx_pkt_log_cbf() - Setup the Rx pktlog cbf mode filter @@ -270,14 +270,14 @@ QDF_STATUS dp_mon_filter_update(struct dp_pdev *pdev); /** * dp_mon_filter_dealloc() - Deallocate the filter objects to be stored in * the radio object. - * @pdev: DP pdev handle + * @mon_pdev: monitor pdev handle */ -void dp_mon_filter_dealloc(struct dp_pdev *pdev); +void dp_mon_filter_dealloc(struct dp_mon_pdev *mon_pdev); /** * dp_mon_filter_alloc() - Allocate the filter objects to be stored in * the radio object. - * @pdev: DP pdev handle + * @mon_pdev: monitor pdev handle */ -struct dp_mon_filter **dp_mon_filter_alloc(struct dp_pdev *pdev); +struct dp_mon_filter **dp_mon_filter_alloc(struct dp_mon_pdev *mon_pdev); #endif /* #ifndef _DP_MON_FILTER_H_ */ diff --git a/dp/wifi3.0/monitor/dp_rx_mon_dest.c b/dp/wifi3.0/monitor/dp_rx_mon_dest.c index c80a095a53..40f4979481 100644 --- a/dp/wifi3.0/monitor/dp_rx_mon_dest.c +++ b/dp/wifi3.0/monitor/dp_rx_mon_dest.c @@ -43,9 +43,10 @@ static inline void dp_handle_tx_capture(struct dp_soc *soc, struct dp_pdev *pdev, qdf_nbuf_t mon_mpdu) { - struct hal_rx_ppdu_info *ppdu_info = &pdev->ppdu_info; + struct dp_mon_pdev *mon_pdev = pdev->monitor_pdev; + struct hal_rx_ppdu_info *ppdu_info = &mon_pdev->ppdu_info; - if (pdev->tx_capture_enabled + if (mon_pdev->tx_capture_enabled == CDP_TX_ENH_CAPTURE_DISABLED) return; @@ -59,9 +60,11 @@ dp_handle_tx_capture(struct dp_soc *soc, struct dp_pdev *pdev, static void dp_tx_capture_get_user_id(struct dp_pdev *dp_pdev, void *rx_desc_tlv) { - if (dp_pdev->tx_capture_enabled + struct dp_mon_pdev *mon_pdev = dp_pdev->monitor_pdev; + + if (mon_pdev->tx_capture_enabled != CDP_TX_ENH_CAPTURE_DISABLED) - dp_pdev->ppdu_info.rx_info.user_id = + mon_pdev->ppdu_info.rx_info.user_id = hal_rx_hw_desc_mpdu_user_id(dp_pdev->soc->hal_soc, rx_desc_tlv); } @@ -191,12 +194,14 @@ dp_rx_mon_mpdu_pop(struct dp_soc *soc, uint32_t mac_id, qdf_dma_addr_t buf_paddr = 0; uint32_t rx_link_buf_info[HAL_RX_BUFFINFO_NUM_DWORDS]; struct cdp_mon_status *rs; + struct dp_mon_pdev *mon_pdev; if (qdf_unlikely(!dp_pdev)) { dp_rx_mon_dest_debug("%pK: pdev is null for mac_id = %d", soc, mac_id); return rx_bufs_used; } + mon_pdev = dp_pdev->monitor_pdev; msdu = 0; last = NULL; @@ -204,7 +209,7 @@ dp_rx_mon_mpdu_pop(struct dp_soc *soc, uint32_t mac_id, hal_rx_reo_ent_buf_paddr_get(soc->hal_soc, rxdma_dst_ring_desc, &buf_info, &msdu_cnt); - rs = &dp_pdev->rx_mon_recv_status; + rs = &mon_pdev->rx_mon_recv_status; rs->cdp_rs_rxdma_err = false; if ((hal_rx_reo_ent_rxdma_push_reason_get(rxdma_dst_ring_desc) == HAL_RX_WBM_RXDMA_PSH_RSN_ERROR)) { @@ -214,11 +219,11 @@ dp_rx_mon_mpdu_pop(struct dp_soc *soc, uint32_t mac_id, if (qdf_unlikely((rxdma_err == HAL_RXDMA_ERR_FLUSH_REQUEST) || (rxdma_err == HAL_RXDMA_ERR_MPDU_LENGTH) || (rxdma_err == HAL_RXDMA_ERR_OVERFLOW) || - (rxdma_err == HAL_RXDMA_ERR_FCS && dp_pdev->mcopy_mode) || + (rxdma_err == HAL_RXDMA_ERR_FCS && mon_pdev->mcopy_mode) || (rxdma_err == HAL_RXDMA_ERR_FCS && - dp_pdev->rx_pktlog_cbf))) { + mon_pdev->rx_pktlog_cbf))) { drop_mpdu = true; - dp_pdev->rx_mon_stats.dest_mpdu_drop++; + mon_pdev->rx_mon_stats.dest_mpdu_drop++; } rs->cdp_rs_rxdma_err = true; } @@ -228,9 +233,9 @@ dp_rx_mon_mpdu_pop(struct dp_soc *soc, uint32_t mac_id, do { /* WAR for duplicate link descriptors received from HW */ - if (qdf_unlikely(dp_pdev->mon_last_linkdesc_paddr == + if (qdf_unlikely(mon_pdev->mon_last_linkdesc_paddr == buf_info.paddr)) { - dp_pdev->rx_mon_stats.dup_mon_linkdesc_cnt++; + mon_pdev->rx_mon_stats.dup_mon_linkdesc_cnt++; return rx_bufs_used; } @@ -257,7 +262,7 @@ dp_rx_mon_mpdu_pop(struct dp_soc *soc, uint32_t mac_id, buf_paddr = dp_rx_mon_get_paddr_from_desc(rx_desc); /* WAR for duplicate buffers received from HW */ - if (qdf_unlikely(dp_pdev->mon_last_buf_cookie == + if (qdf_unlikely(mon_pdev->mon_last_buf_cookie == msdu_list.sw_cookie[i] || DP_RX_MON_IS_BUFFER_ADDR_NULL(rx_desc) || msdu_list.paddr[i] != buf_paddr || @@ -266,8 +271,8 @@ dp_rx_mon_mpdu_pop(struct dp_soc *soc, uint32_t mac_id, * buffers in this MPDU */ drop_mpdu = true; - dp_pdev->rx_mon_stats.dup_mon_buf_cnt++; - dp_pdev->mon_last_linkdesc_paddr = + mon_pdev->rx_mon_stats.dup_mon_buf_cnt++; + mon_pdev->mon_last_linkdesc_paddr = buf_info.paddr; continue; } @@ -285,13 +290,13 @@ dp_rx_mon_mpdu_pop(struct dp_soc *soc, uint32_t mac_id, rx_desc->pool_id)) { drop_mpdu = true; msdu = NULL; - dp_pdev->mon_last_linkdesc_paddr = + mon_pdev->mon_last_linkdesc_paddr = buf_info.paddr; goto next_msdu; } if (drop_mpdu) { - dp_pdev->mon_last_linkdesc_paddr = + mon_pdev->mon_last_linkdesc_paddr = buf_info.paddr; dp_rx_mon_buffer_free(rx_desc); msdu = NULL; @@ -311,7 +316,7 @@ dp_rx_mon_mpdu_pop(struct dp_soc *soc, uint32_t mac_id, drop_mpdu = true; dp_rx_mon_buffer_free(rx_desc); msdu = NULL; - dp_pdev->mon_last_linkdesc_paddr = + mon_pdev->mon_last_linkdesc_paddr = buf_info.paddr; goto next_msdu; } @@ -346,12 +351,12 @@ dp_rx_mon_mpdu_pop(struct dp_soc *soc, uint32_t mac_id, rx_desc_tlv); if (*ppdu_id == msdu_ppdu_id) - dp_pdev->rx_mon_stats.ppdu_id_match++; + mon_pdev->rx_mon_stats.ppdu_id_match++; else - dp_pdev->rx_mon_stats.ppdu_id_mismatch + mon_pdev->rx_mon_stats.ppdu_id_mismatch ++; - dp_pdev->mon_last_linkdesc_paddr = + mon_pdev->mon_last_linkdesc_paddr = buf_info.paddr; if (dp_rx_mon_alloc_parent_buffer(head_msdu) @@ -370,7 +375,7 @@ dp_rx_mon_mpdu_pop(struct dp_soc *soc, uint32_t mac_id, rx_desc_tlv)) hal_rx_mon_hw_desc_get_mpdu_status(soc->hal_soc, rx_desc_tlv, - &(dp_pdev->ppdu_info.rx_status)); + &mon_pdev->ppdu_info.rx_status); dp_rx_mon_parse_desc_buffer(soc, &(msdu_list.msdu_info[i]), @@ -430,7 +435,7 @@ dp_rx_mon_mpdu_pop(struct dp_soc *soc, uint32_t mac_id, } next_msdu: - dp_pdev->mon_last_buf_cookie = msdu_list.sw_cookie[i]; + mon_pdev->mon_last_buf_cookie = msdu_list.sw_cookie[i]; rx_bufs_used++; dp_rx_add_to_free_desc_list(head, tail, rx_desc); @@ -551,11 +556,14 @@ qdf_nbuf_t dp_rx_mon_frag_restitch_mpdu_from_msdus(struct dp_soc *soc, uint32_t pad_byte_pholder = 0; qdf_nbuf_t msdu_curr; uint16_t rx_mon_tlv_size = soc->rx_mon_pkt_tlv_size; + struct dp_mon_pdev *mon_pdev; if (qdf_unlikely(!dp_pdev)) { dp_rx_mon_dest_debug("%pK: pdev is null for mac_id = %d", soc, mac_id); return NULL; } + + mon_pdev = dp_pdev->monitor_pdev; qdf_mem_zero(&buf_info, sizeof(struct hal_rx_mon_dest_buf_info)); if (!head_msdu || !tail_msdu) @@ -576,7 +584,7 @@ qdf_nbuf_t dp_rx_mon_frag_restitch_mpdu_from_msdus(struct dp_soc *soc, rx_mon_tlv_size; rx_status->cdp_rs_fcs_err = hal_rx_tlv_mpdu_fcs_err_get(soc->hal_soc, rx_desc); - dp_pdev->ppdu_info.rx_status.rs_fcs_err = rx_status->cdp_rs_fcs_err; + mon_pdev->ppdu_info.rx_status.rs_fcs_err = rx_status->cdp_rs_fcs_err; rx_desc = qdf_nbuf_get_frag_addr(head_msdu, 0) - rx_mon_tlv_size; hal_rx_priv_info_get_from_tlv(soc->hal_soc, rx_desc, @@ -936,6 +944,7 @@ qdf_nbuf_t dp_rx_mon_restitch_mpdu_from_msdus(struct dp_soc *soc, struct ieee80211_frame *wh; struct ieee80211_qoscntl *qos; struct dp_pdev *dp_pdev = dp_get_pdev_for_lmac_id(soc, mac_id); + struct dp_mon_pdev *mon_pdev; head_frag_list = NULL; mpdu_buf = NULL; @@ -945,6 +954,8 @@ qdf_nbuf_t dp_rx_mon_restitch_mpdu_from_msdus(struct dp_soc *soc, return NULL; } + mon_pdev = dp_pdev->monitor_pdev; + /* The nbuf has been pulled just beyond the status and points to the * payload */ @@ -966,7 +977,7 @@ qdf_nbuf_t dp_rx_mon_restitch_mpdu_from_msdus(struct dp_soc *soc, rx_status->cdp_rs_fcs_err = hal_rx_tlv_mpdu_fcs_err_get(soc->hal_soc, rx_desc); - dp_pdev->ppdu_info.rx_status.rs_fcs_err = rx_status->cdp_rs_fcs_err; + mon_pdev->ppdu_info.rx_status.rs_fcs_err = rx_status->cdp_rs_fcs_err; /* Fill out the rx_status from the PPDU start and end fields */ /* HAL_RX_GET_PPDU_STATUS(soc, mac_id, rx_status); */ @@ -1307,6 +1318,7 @@ static inline QDF_STATUS dp_send_mgmt_packet_to_stack(struct dp_soc *soc, uint32_t *nbuf_data; struct ieee80211_frame *wh; qdf_frag_t addr; + struct dp_mon_pdev *mon_pdev = pdev->monitor_pdev; if (!nbuf) return QDF_STATUS_E_INVAL; @@ -1335,7 +1347,7 @@ static inline QDF_STATUS dp_send_mgmt_packet_to_stack(struct dp_soc *soc, qdf_nbuf_free(nbuf); return QDF_STATUS_E_INVAL; } - *nbuf_data = pdev->ppdu_info.com_info.ppdu_id; + *nbuf_data = mon_pdev->ppdu_info.com_info.ppdu_id; dp_wdi_event_handler(WDI_EVENT_RX_MGMT_CTRL, soc, nbuf, HTT_INVALID_PEER, @@ -1443,11 +1455,14 @@ static QDF_STATUS dp_rx_mon_process_dest_pktlog(struct dp_soc *soc, void *data; struct ieee80211_frame *wh; uint8_t type, subtype; + struct dp_mon_pdev *mon_pdev; if (!pdev) return QDF_STATUS_E_INVAL; - if (pdev->rx_pktlog_cbf) { + mon_pdev = pdev->monitor_pdev; + + if (mon_pdev->rx_pktlog_cbf) { if (qdf_nbuf_get_nr_frags(mpdu)) data = qdf_nbuf_get_frag_addr(mpdu, 0); else @@ -1465,7 +1480,7 @@ static QDF_STATUS dp_rx_mon_process_dest_pktlog(struct dp_soc *soc, subtype = (wh)->i_fc[0] & IEEE80211_FC0_SUBTYPE_MASK; if (type == IEEE80211_FC0_TYPE_MGT && subtype == IEEE80211_FCO_SUBTYPE_ACTION_NO_ACK) { - msdu_timestamp = pdev->ppdu_info.rx_status.tsft; + msdu_timestamp = mon_pdev->ppdu_info.rx_status.tsft; dp_rx_populate_cbf_hdr(soc, mac_id, event, mpdu, @@ -1488,16 +1503,22 @@ QDF_STATUS dp_rx_mon_deliver(struct dp_soc *soc, uint32_t mac_id, qdf_nbuf_t head_msdu, qdf_nbuf_t tail_msdu) { struct dp_pdev *pdev = dp_get_pdev_for_lmac_id(soc, mac_id); - struct cdp_mon_status *rs = &pdev->rx_mon_recv_status; + struct cdp_mon_status *rs; qdf_nbuf_t mon_skb, skb_next; qdf_nbuf_t mon_mpdu = NULL; - struct dp_vdev *vdev; + struct dp_mon_vdev *mon_vdev; + struct dp_mon_pdev *mon_pdev; - if (!pdev || (!pdev->monitor_vdev && !pdev->mcopy_mode && - !pdev->rx_pktlog_cbf)) + if (!pdev) + goto mon_deliver_fail; + + mon_pdev = pdev->monitor_pdev; + rs = &mon_pdev->rx_mon_recv_status; + + if (!mon_pdev->mvdev && !mon_pdev->mcopy_mode && + !mon_pdev->rx_pktlog_cbf) goto mon_deliver_fail; - vdev = pdev->monitor_vdev; /* restitch mon MPDU for delivery via monitor interface */ mon_mpdu = dp_rx_mon_restitch_mpdu(soc, mac_id, head_msdu, tail_msdu, rs); @@ -1513,22 +1534,26 @@ QDF_STATUS dp_rx_mon_deliver(struct dp_soc *soc, uint32_t mac_id, /* monitor vap cannot be present when mcopy is enabled * hence same skb can be consumed */ - if (pdev->mcopy_mode) + if (mon_pdev->mcopy_mode) return dp_send_mgmt_packet_to_stack(soc, mon_mpdu, pdev); - if (mon_mpdu && pdev->monitor_vdev && pdev->monitor_vdev->osif_vdev && - vdev->monitor_vdev->osif_rx_mon) { - pdev->ppdu_info.rx_status.ppdu_id = - pdev->ppdu_info.com_info.ppdu_id; - pdev->ppdu_info.rx_status.device_id = soc->device_id; - pdev->ppdu_info.rx_status.chan_noise_floor = + if (mon_mpdu && mon_pdev->mvdev && + mon_pdev->mvdev->osif_vdev && + mon_pdev->mvdev->monitor_vdev && + mon_pdev->mvdev->monitor_vdev->osif_rx_mon) { + mon_vdev = mon_pdev->mvdev->monitor_vdev; + + mon_pdev->ppdu_info.rx_status.ppdu_id = + mon_pdev->ppdu_info.com_info.ppdu_id; + mon_pdev->ppdu_info.rx_status.device_id = soc->device_id; + mon_pdev->ppdu_info.rx_status.chan_noise_floor = pdev->chan_noise_floor; /* convert rssi_comb from dBm to positive dB value */ - dp_rx_mon_rssi_convert(&pdev->ppdu_info.rx_status); + dp_rx_mon_rssi_convert(&mon_pdev->ppdu_info.rx_status); dp_handle_tx_capture(soc, pdev, mon_mpdu); - if (!qdf_nbuf_update_radiotap(&pdev->ppdu_info.rx_status, + if (!qdf_nbuf_update_radiotap(&mon_pdev->ppdu_info.rx_status, mon_mpdu, qdf_nbuf_headroom(mon_mpdu))) { DP_STATS_INC(pdev, dropped.mon_radiotap_update_err, 1); @@ -1536,13 +1561,14 @@ QDF_STATUS dp_rx_mon_deliver(struct dp_soc *soc, uint32_t mac_id, } dp_rx_mon_update_pf_tag_to_buf_headroom(soc, mon_mpdu); - vdev->monitor_vdev->osif_rx_mon(pdev->monitor_vdev->osif_vdev, - mon_mpdu, - &pdev->ppdu_info.rx_status); + + mon_vdev->osif_rx_mon(mon_pdev->mvdev->osif_vdev, + mon_mpdu, + &mon_pdev->ppdu_info.rx_status); } else { dp_rx_mon_dest_debug("%pK: mon_mpdu=%pK monitor_vdev %pK osif_vdev %pK" - , soc, mon_mpdu, pdev->monitor_vdev, - (pdev->monitor_vdev ? pdev->monitor_vdev->osif_vdev + , soc, mon_mpdu, mon_pdev->mvdev, + (mon_pdev->mvdev ? mon_pdev->mvdev->osif_vdev : NULL)); goto mon_deliver_fail; } @@ -1579,19 +1605,23 @@ QDF_STATUS dp_rx_mon_deliver_non_std(struct dp_soc *soc, struct dp_pdev *pdev = dp_get_pdev_for_lmac_id(soc, mac_id); ol_txrx_rx_mon_fp osif_rx_mon; qdf_nbuf_t dummy_msdu; - struct dp_vdev *vdev; + struct dp_mon_pdev *mon_pdev; + struct dp_mon_vdev *mon_vdev; /* Sanity checking */ - if (!pdev || !pdev->monitor_vdev) + if (!pdev || !pdev->monitor_pdev) goto mon_deliver_non_std_fail; - vdev = pdev->monitor_vdev; + mon_pdev = pdev->monitor_pdev; - if (!vdev->monitor_vdev->osif_rx_mon) + if (!mon_pdev->mvdev || !mon_pdev->mvdev || + !mon_pdev->mvdev->monitor_vdev || + !mon_pdev->mvdev->monitor_vdev->osif_rx_mon) goto mon_deliver_non_std_fail; + mon_vdev = mon_pdev->mvdev->monitor_vdev; /* Generate a dummy skb_buff */ - osif_rx_mon = vdev->monitor_vdev->osif_rx_mon; + osif_rx_mon = mon_vdev->osif_rx_mon; dummy_msdu = qdf_nbuf_alloc(soc->osdev, MAX_MONITOR_HEADER, MAX_MONITOR_HEADER, 4, FALSE); if (!dummy_msdu) @@ -1600,11 +1630,12 @@ QDF_STATUS dp_rx_mon_deliver_non_std(struct dp_soc *soc, qdf_nbuf_set_pktlen(dummy_msdu, 0); qdf_nbuf_set_next(dummy_msdu, NULL); - pdev->ppdu_info.rx_status.ppdu_id = - pdev->ppdu_info.com_info.ppdu_id; + mon_pdev->ppdu_info.rx_status.ppdu_id = + mon_pdev->ppdu_info.com_info.ppdu_id; /* Apply the radio header to this dummy skb */ - if (!qdf_nbuf_update_radiotap(&pdev->ppdu_info.rx_status, dummy_msdu, + if (!qdf_nbuf_update_radiotap(&mon_pdev->ppdu_info.rx_status, + dummy_msdu, qdf_nbuf_headroom(dummy_msdu))) { DP_STATS_INC(pdev, dropped.mon_radiotap_update_err, 1); qdf_nbuf_free(dummy_msdu); @@ -1612,13 +1643,13 @@ QDF_STATUS dp_rx_mon_deliver_non_std(struct dp_soc *soc, } /* deliver to the user layer application */ - osif_rx_mon(pdev->monitor_vdev->osif_vdev, + osif_rx_mon(mon_pdev->mvdev->osif_vdev, dummy_msdu, NULL); /* Clear rx_status*/ - qdf_mem_zero(&pdev->ppdu_info.rx_status, - sizeof(pdev->ppdu_info.rx_status)); - pdev->mon_ppdu_status = DP_PPDU_STATUS_START; + qdf_mem_zero(&mon_pdev->ppdu_info.rx_status, + sizeof(mon_pdev->ppdu_info.rx_status)); + mon_pdev->mon_ppdu_status = DP_PPDU_STATUS_START; return QDF_STATUS_SUCCESS; @@ -1645,12 +1676,14 @@ void dp_rx_mon_dest_process(struct dp_soc *soc, struct dp_intr *int_ctx, uint32_t mpdu_rx_bufs_used; int mac_for_pdev = mac_id; struct cdp_pdev_mon_stats *rx_mon_stats; + struct dp_mon_pdev *mon_pdev; if (!pdev) { dp_rx_mon_dest_debug("%pK: pdev is null for mac_id = %d", soc, mac_id); return; } + mon_pdev = pdev->monitor_pdev; mon_dst_srng = dp_rxdma_get_mon_dst_ring(pdev, mac_for_pdev); if (!mon_dst_srng || !hal_srng_initialized(mon_dst_srng)) { @@ -1663,7 +1696,7 @@ void dp_rx_mon_dest_process(struct dp_soc *soc, struct dp_intr *int_ctx, qdf_assert((hal_soc && pdev)); - qdf_spin_lock_bh(&pdev->mon_lock); + qdf_spin_lock_bh(&mon_pdev->mon_lock); if (qdf_unlikely(dp_srng_access_start(int_ctx, soc, mon_dst_srng))) { QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR, @@ -1674,9 +1707,9 @@ void dp_rx_mon_dest_process(struct dp_soc *soc, struct dp_intr *int_ctx, } pdev_id = pdev->pdev_id; - ppdu_id = pdev->ppdu_info.com_info.ppdu_id; + ppdu_id = mon_pdev->ppdu_info.com_info.ppdu_id; rx_bufs_used = 0; - rx_mon_stats = &pdev->rx_mon_stats; + rx_mon_stats = &mon_pdev->rx_mon_stats; while (qdf_likely(rxdma_dst_ring_desc = hal_srng_dst_peek(hal_soc, mon_dst_srng))) { @@ -1695,34 +1728,35 @@ void dp_rx_mon_dest_process(struct dp_soc *soc, struct dp_intr *int_ctx, rx_bufs_used += mpdu_rx_bufs_used; if (mpdu_rx_bufs_used) - pdev->mon_dest_ring_stuck_cnt = 0; + mon_pdev->mon_dest_ring_stuck_cnt = 0; else - pdev->mon_dest_ring_stuck_cnt++; + mon_pdev->mon_dest_ring_stuck_cnt++; - if (pdev->mon_dest_ring_stuck_cnt > + if (mon_pdev->mon_dest_ring_stuck_cnt > MON_DEST_RING_STUCK_MAX_CNT) { dp_info("destination ring stuck"); dp_info("ppdu_id status=%d dest=%d", - pdev->ppdu_info.com_info.ppdu_id, ppdu_id); + mon_pdev->ppdu_info.com_info.ppdu_id, ppdu_id); rx_mon_stats->mon_rx_dest_stuck++; - pdev->ppdu_info.com_info.ppdu_id = ppdu_id; + mon_pdev->ppdu_info.com_info.ppdu_id = ppdu_id; continue; } - if (ppdu_id != pdev->ppdu_info.com_info.ppdu_id) { + if (ppdu_id != mon_pdev->ppdu_info.com_info.ppdu_id) { rx_mon_stats->stat_ring_ppdu_id_hist[ rx_mon_stats->ppdu_id_hist_idx] = - pdev->ppdu_info.com_info.ppdu_id; + mon_pdev->ppdu_info.com_info.ppdu_id; rx_mon_stats->dest_ring_ppdu_id_hist[ rx_mon_stats->ppdu_id_hist_idx] = ppdu_id; rx_mon_stats->ppdu_id_hist_idx = (rx_mon_stats->ppdu_id_hist_idx + 1) & (MAX_PPDU_ID_HIST - 1); - pdev->mon_ppdu_status = DP_PPDU_STATUS_START; - qdf_mem_zero(&(pdev->ppdu_info.rx_status), - sizeof(pdev->ppdu_info.rx_status)); + mon_pdev->mon_ppdu_status = DP_PPDU_STATUS_START; + qdf_mem_zero(&mon_pdev->ppdu_info.rx_status, + sizeof(mon_pdev->ppdu_info.rx_status)); dp_rx_mon_dest_debug("%pK: ppdu_id %x != ppdu_info.com_info.ppdu_id %x", - soc, ppdu_id, pdev->ppdu_info.com_info.ppdu_id); + soc, ppdu_id, + mon_pdev->ppdu_info.com_info.ppdu_id); break; } @@ -1737,7 +1771,7 @@ void dp_rx_mon_dest_process(struct dp_soc *soc, struct dp_intr *int_ctx, dp_srng_access_end(int_ctx, soc, mon_dst_srng); - qdf_spin_unlock_bh(&pdev->mon_lock); + qdf_spin_unlock_bh(&mon_pdev->mon_lock); if (rx_bufs_used) { rx_mon_stats->dest_ppdu_done++; @@ -1844,6 +1878,7 @@ dp_rx_pdev_mon_buf_desc_pool_init(struct dp_pdev *pdev, uint32_t mac_id) struct rx_desc_pool *rx_desc_pool; uint32_t rx_desc_pool_size; struct wlan_cfg_dp_soc_ctxt *soc_cfg_ctx = soc->wlan_cfg_ctx; + struct dp_mon_pdev *mon_pdev = pdev->monitor_pdev; mon_buf_ring = &soc->rxdma_mon_buf_ring[mac_id]; @@ -1869,9 +1904,9 @@ dp_rx_pdev_mon_buf_desc_pool_init(struct dp_pdev *pdev, uint32_t mac_id) dp_rx_desc_pool_init(soc, mac_id, rx_desc_pool_size, rx_desc_pool); - pdev->mon_last_linkdesc_paddr = 0; + mon_pdev->mon_last_linkdesc_paddr = 0; - pdev->mon_last_buf_cookie = DP_RX_DESC_COOKIE_MAX + 1; + mon_pdev->mon_last_buf_cookie = DP_RX_DESC_COOKIE_MAX + 1; /* Attach full monitor mode resources */ dp_full_mon_attach(pdev); @@ -2084,7 +2119,7 @@ dp_rx_pdev_mon_desc_pool_init(struct dp_pdev *pdev) int mac_id; for (mac_id = 0; mac_id < NUM_RXDMA_RINGS_PER_PDEV; mac_id++) dp_rx_pdev_mon_cmn_desc_pool_init(pdev, mac_id); - qdf_spinlock_create(&pdev->mon_lock); + qdf_spinlock_create(&pdev->monitor_pdev->mon_lock); } void @@ -2094,7 +2129,7 @@ dp_rx_pdev_mon_desc_pool_deinit(struct dp_pdev *pdev) for (mac_id = 0; mac_id < NUM_RXDMA_RINGS_PER_PDEV; mac_id++) dp_rx_pdev_mon_cmn_desc_pool_deinit(pdev, mac_id); - qdf_spinlock_destroy(&pdev->mon_lock); + qdf_spinlock_destroy(&pdev->monitor_pdev->mon_lock); } void dp_rx_pdev_mon_desc_pool_free(struct dp_pdev *pdev) @@ -2112,7 +2147,7 @@ dp_rx_pdev_mon_buffers_free(struct dp_pdev *pdev) for (mac_id = 0; mac_id < NUM_RXDMA_RINGS_PER_PDEV; mac_id++) dp_rx_pdev_mon_cmn_buffers_free(pdev, mac_id); - pdev->pdev_mon_init = 0; + pdev->monitor_pdev->pdev_mon_init = 0; } QDF_STATUS @@ -2154,6 +2189,7 @@ dp_mon_dest_srng_drop_for_mac(struct dp_pdev *pdev, uint32_t mac_id) uint32_t rx_link_buf_info[HAL_RX_BUFFINFO_NUM_DWORDS]; struct rx_desc_pool *rx_desc_pool; uint32_t reap_cnt = 0; + struct dp_mon_pdev *mon_pdev; if (qdf_unlikely(!soc || !soc->hal_soc)) return reap_cnt; @@ -2164,11 +2200,12 @@ dp_mon_dest_srng_drop_for_mac(struct dp_pdev *pdev, uint32_t mac_id) return reap_cnt; hal_soc = soc->hal_soc; + mon_pdev = pdev->monitor_pdev; - qdf_spin_lock_bh(&pdev->mon_lock); + qdf_spin_lock_bh(&mon_pdev->mon_lock); if (qdf_unlikely(hal_srng_access_start(hal_soc, mon_dst_srng))) { - qdf_spin_unlock_bh(&pdev->mon_lock); + qdf_spin_unlock_bh(&mon_pdev->mon_lock); return reap_cnt; } @@ -2186,7 +2223,7 @@ dp_mon_dest_srng_drop_for_mac(struct dp_pdev *pdev, uint32_t mac_id) buf_info, mac_id); if (qdf_unlikely(!rx_msdu_link_desc)) { - pdev->rx_mon_stats.mon_link_desc_invalid++; + mon_pdev->rx_mon_stats.mon_link_desc_invalid++; goto next_entry; } @@ -2201,7 +2238,7 @@ dp_mon_dest_srng_drop_for_mac(struct dp_pdev *pdev, uint32_t mac_id) msdu_list.sw_cookie[i]); if (qdf_unlikely(!rx_desc)) { - pdev->rx_mon_stats. + mon_pdev->rx_mon_stats. mon_rx_desc_invalid++; continue; } @@ -2213,7 +2250,7 @@ dp_mon_dest_srng_drop_for_mac(struct dp_pdev *pdev, uint32_t mac_id) if (qdf_unlikely(!rx_desc->in_use || !nbuf || msdu_list.paddr[i] != buf_paddr)) { - pdev->rx_mon_stats. + mon_pdev->rx_mon_stats. mon_nbuf_sanity_err++; continue; } @@ -2263,7 +2300,7 @@ next_entry: hal_srng_access_end(hal_soc, mon_dst_srng); - qdf_spin_unlock_bh(&pdev->mon_lock); + qdf_spin_unlock_bh(&mon_pdev->mon_lock); if (rx_bufs_used) { dp_rx_buffers_replenish(soc, mac_id, diff --git a/dp/wifi3.0/monitor/dp_rx_mon_status.c b/dp/wifi3.0/monitor/dp_rx_mon_status.c index 7f59caa9d5..a954536ee0 100644 --- a/dp/wifi3.0/monitor/dp_rx_mon_status.c +++ b/dp/wifi3.0/monitor/dp_rx_mon_status.c @@ -24,11 +24,11 @@ #include "qdf_trace.h" #include "qdf_nbuf.h" #include "hal_api_mon.h" -#include "dp_rx_mon.h" #include "dp_internal.h" #include "qdf_mem.h" /* qdf_mem_malloc,free */ #include "dp_htt.h" #include "dp_mon.h" +#include "dp_rx_mon.h" #include "htt.h" @@ -83,6 +83,7 @@ dp_rx_mon_handle_status_buf_done(struct dp_pdev *pdev, struct dp_rx_desc *rx_desc; void *rx_tlv; QDF_STATUS buf_status; + struct dp_mon_pdev *mon_pdev = pdev->monitor_pdev; hal_soc = soc->hal_soc; @@ -117,11 +118,11 @@ dp_rx_mon_handle_status_buf_done(struct dp_pdev *pdev, if (buf_status != QDF_STATUS_SUCCESS) { dp_err_rl("Monitor status ring: DMA is not done " "for nbuf: %pK", status_nbuf); - pdev->rx_mon_stats.tlv_tag_status_err++; + mon_pdev->rx_mon_stats.tlv_tag_status_err++; return DP_MON_STATUS_NO_DMA; } - pdev->rx_mon_stats.status_buf_done_war++; + mon_pdev->rx_mon_stats.status_buf_done_war++; return DP_MON_STATUS_REPLENISH; } @@ -834,13 +835,15 @@ dp_rx_handle_mcopy_mode(struct dp_soc *soc, struct dp_pdev *pdev, uint16_t size = 0; struct ieee80211_frame *wh; uint32_t *nbuf_data; + struct dp_mon_pdev *mon_pdev = pdev->monitor_pdev; if (!ppdu_info->ppdu_msdu_info[fcs_ok_mpdu_cnt].first_msdu_payload) return QDF_STATUS_SUCCESS; /* For M_COPY mode only one msdu per ppdu is sent to upper layer*/ - if (pdev->mcopy_mode == M_COPY) { - if (pdev->m_copy_id.rx_ppdu_id == ppdu_info->com_info.ppdu_id) + if (mon_pdev->mcopy_mode == M_COPY) { + if (mon_pdev->m_copy_id.rx_ppdu_id == + ppdu_info->com_info.ppdu_id) return QDF_STATUS_SUCCESS; } @@ -860,11 +863,11 @@ dp_rx_handle_mcopy_mode(struct dp_soc *soc, struct dp_pdev *pdev, } nbuf_data = (uint32_t *)qdf_nbuf_data(nbuf); - *nbuf_data = pdev->ppdu_info.com_info.ppdu_id; + *nbuf_data = mon_pdev->ppdu_info.com_info.ppdu_id; /* only retain RX MSDU payload in the skb */ qdf_nbuf_trim_tail(nbuf, qdf_nbuf_len(nbuf) - ppdu_info->ppdu_msdu_info[fcs_ok_mpdu_cnt].payload_len); if (deliver_frame) { - pdev->m_copy_id.rx_ppdu_id = ppdu_info->com_info.ppdu_id; + mon_pdev->m_copy_id.rx_ppdu_id = ppdu_info->com_info.ppdu_id; dp_wdi_event_handler(WDI_EVENT_RX_DATA, soc, nbuf, HTT_INVALID_PEER, WDI_NO_VAL, pdev->pdev_id); @@ -899,19 +902,22 @@ dp_rx_mcopy_handle_last_mpdu(struct dp_soc *soc, struct dp_pdev *pdev, { QDF_STATUS mcopy_status; qdf_nbuf_t nbuf_clone = NULL; + struct dp_mon_pdev *mon_pdev = pdev->monitor_pdev; + /* If the MPDU end tlv and RX header are received in different buffers, * process the RX header based on fcs status. */ - if (pdev->mcopy_status_nbuf) { + if (mon_pdev->mcopy_status_nbuf) { /* For M_COPY mode only one msdu per ppdu is sent to upper layer*/ - if (pdev->mcopy_mode == M_COPY) { - if (pdev->m_copy_id.rx_ppdu_id == + if (mon_pdev->mcopy_mode == M_COPY) { + if (mon_pdev->m_copy_id.rx_ppdu_id == ppdu_info->com_info.ppdu_id) goto end1; } if (ppdu_info->is_fcs_passed) { - nbuf_clone = qdf_nbuf_clone(pdev->mcopy_status_nbuf); + nbuf_clone = + qdf_nbuf_clone(mon_pdev->mcopy_status_nbuf); if (!nbuf_clone) { QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR, @@ -919,7 +925,8 @@ dp_rx_mcopy_handle_last_mpdu(struct dp_soc *soc, struct dp_pdev *pdev, goto end1; } - pdev->m_copy_id.rx_ppdu_id = ppdu_info->com_info.ppdu_id; + mon_pdev->m_copy_id.rx_ppdu_id = + ppdu_info->com_info.ppdu_id; dp_wdi_event_handler(WDI_EVENT_RX_DATA, soc, nbuf_clone, HTT_INVALID_PEER, @@ -927,8 +934,8 @@ dp_rx_mcopy_handle_last_mpdu(struct dp_soc *soc, struct dp_pdev *pdev, ppdu_info->is_fcs_passed = false; } end1: - qdf_nbuf_free(pdev->mcopy_status_nbuf); - pdev->mcopy_status_nbuf = NULL; + qdf_nbuf_free(mon_pdev->mcopy_status_nbuf); + mon_pdev->mcopy_status_nbuf = NULL; } /* If the MPDU end tlv and RX header are received in different buffers, @@ -938,17 +945,17 @@ end1: */ if ((ppdu_info->fcs_ok_cnt + ppdu_info->fcs_err_cnt) != ppdu_info->com_info.mpdu_cnt) { - pdev->mcopy_status_nbuf = qdf_nbuf_clone(status_nbuf); - if (pdev->mcopy_status_nbuf) { - mcopy_status = dp_rx_handle_mcopy_mode( - soc, pdev, + mon_pdev->mcopy_status_nbuf = qdf_nbuf_clone(status_nbuf); + if (mon_pdev->mcopy_status_nbuf) { + mcopy_status = + dp_rx_handle_mcopy_mode(soc, pdev, ppdu_info, - pdev->mcopy_status_nbuf, + mon_pdev->mcopy_status_nbuf, ppdu_info->fcs_ok_cnt, false); if (mcopy_status == QDF_STATUS_SUCCESS) { - qdf_nbuf_free(pdev->mcopy_status_nbuf); - pdev->mcopy_status_nbuf = NULL; + qdf_nbuf_free(mon_pdev->mcopy_status_nbuf); + mon_pdev->mcopy_status_nbuf = NULL; } } } @@ -975,7 +982,9 @@ dp_rx_mcopy_process_ppdu_info(struct dp_pdev *pdev, struct hal_rx_ppdu_info *ppdu_info, uint32_t tlv_status) { - if (!pdev->mcopy_mode) + struct dp_mon_pdev *mon_pdev = pdev->monitor_pdev; + + if (!mon_pdev->mcopy_mode) return; /* The fcs status is received in MPDU end tlv. If the RX header @@ -1025,6 +1034,7 @@ dp_rx_process_mcopy_mode(struct dp_soc *soc, struct dp_pdev *pdev, QDF_STATUS mcopy_status; qdf_nbuf_t nbuf_clone = NULL; uint8_t fcs_ok_mpdu_cnt = 0; + struct dp_mon_pdev *mon_pdev = pdev->monitor_pdev; dp_rx_mcopy_handle_last_mpdu(soc, pdev, ppdu_info, status_nbuf); @@ -1035,7 +1045,7 @@ dp_rx_process_mcopy_mode(struct dp_soc *soc, struct dp_pdev *pdev, goto end; /* For M_COPY mode only one msdu per ppdu is sent to upper layer*/ - if (pdev->mcopy_mode == M_COPY) + if (mon_pdev->mcopy_mode == M_COPY) ppdu_info->fcs_ok_cnt = 1; while (fcs_ok_mpdu_cnt < ppdu_info->fcs_ok_cnt) { @@ -1092,16 +1102,17 @@ dp_rx_handle_smart_mesh_mode(struct dp_soc *soc, struct dp_pdev *pdev, qdf_nbuf_t nbuf) { uint8_t size = 0; - struct dp_vdev *vdev; + struct dp_mon_vdev *mon_vdev; + struct dp_mon_pdev *mon_pdev = pdev->monitor_pdev; - if (!pdev->monitor_vdev) { + if (!mon_pdev->mvdev) { QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR, "[%s]:[%d] Monitor vdev is NULL !!", __func__, __LINE__); return 1; } - vdev = pdev->monitor_vdev; + mon_vdev = mon_pdev->mvdev->monitor_vdev; if (!ppdu_info->msdu_info.first_msdu_payload) { QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR, @@ -1125,15 +1136,15 @@ dp_rx_handle_smart_mesh_mode(struct dp_soc *soc, struct dp_pdev *pdev, /* Only retain RX MSDU payload in the skb */ qdf_nbuf_trim_tail(nbuf, qdf_nbuf_len(nbuf) - ppdu_info->msdu_info.payload_len); - if (!qdf_nbuf_update_radiotap(&pdev->ppdu_info.rx_status, nbuf, + if (!qdf_nbuf_update_radiotap(&mon_pdev->ppdu_info.rx_status, nbuf, qdf_nbuf_headroom(nbuf))) { DP_STATS_INC(pdev, dropped.mon_radiotap_update_err, 1); return 1; } - vdev->monitor_vdev->osif_rx_mon(pdev->monitor_vdev->osif_vdev, - nbuf, NULL); - pdev->ppdu_info.rx_status.monitor_direct_used = 0; + mon_vdev->osif_rx_mon(mon_pdev->mvdev->osif_vdev, + nbuf, NULL); + mon_pdev->ppdu_info.rx_status.monitor_direct_used = 0; return 0; } @@ -1488,6 +1499,7 @@ dp_rx_handle_ppdu_stats(struct dp_soc *soc, struct dp_pdev *pdev, { qdf_nbuf_t ppdu_nbuf; struct cdp_rx_indication_ppdu *cdp_rx_ppdu; + struct dp_mon_pdev *mon_pdev = pdev->monitor_pdev; /* * Do not allocate if fcs error, @@ -1504,9 +1516,9 @@ dp_rx_handle_ppdu_stats(struct dp_soc *soc, struct dp_pdev *pdev, struct dp_neighbour_peer *peer = NULL; uint8_t rssi = ppdu_info->rx_status.rssi_comb; - qdf_spin_lock_bh(&pdev->neighbour_peer_mutex); - if (pdev->neighbour_peers_added) { - TAILQ_FOREACH(peer, &pdev->neighbour_peers_list, + qdf_spin_lock_bh(&mon_pdev->neighbour_peer_mutex); + if (mon_pdev->neighbour_peers_added) { + TAILQ_FOREACH(peer, &mon_pdev->neighbour_peers_list, neighbour_peer_list_elem) { if (!qdf_mem_cmp(&peer->neighbour_peers_macaddr, &ppdu_info->nac_info.mac_addr2, @@ -1516,7 +1528,7 @@ dp_rx_handle_ppdu_stats(struct dp_soc *soc, struct dp_pdev *pdev, } } } - qdf_spin_unlock_bh(&pdev->neighbour_peer_mutex); + qdf_spin_unlock_bh(&mon_pdev->neighbour_peer_mutex); } else { dp_info("Neighbour peers RSSI update failed! fc_valid = %d, to_ds_flag = %d and mac_addr2_valid = %d", ppdu_info->nac_info.fc_valid, @@ -1527,7 +1539,7 @@ dp_rx_handle_ppdu_stats(struct dp_soc *soc, struct dp_pdev *pdev, /* need not generate wdi event when mcopy, cfr rcc mode and * enhanced stats are not enabled */ - if (!pdev->mcopy_mode && !pdev->enhanced_stats_en && + if (!mon_pdev->mcopy_mode && !mon_pdev->enhanced_stats_en && !dp_cfr_rcc_mode_status(pdev)) return; @@ -1536,7 +1548,7 @@ dp_rx_handle_ppdu_stats(struct dp_soc *soc, struct dp_pdev *pdev, if (!ppdu_info->rx_status.frame_control_info_valid || (ppdu_info->rx_status.ast_index == HAL_AST_IDX_INVALID)) { - if (!(pdev->mcopy_mode || + if (!(mon_pdev->mcopy_mode || (dp_bb_captured_chan_status(pdev, ppdu_info) == QDF_STATUS_SUCCESS))) return; @@ -1563,7 +1575,8 @@ dp_rx_handle_ppdu_stats(struct dp_soc *soc, struct dp_pdev *pdev, soc, ppdu_nbuf, cdp_rx_ppdu->peer_id, WDI_NO_VAL, pdev->pdev_id); - } else if (pdev->mcopy_mode || dp_cfr_rcc_mode_status(pdev)) { + } else if (mon_pdev->mcopy_mode || + dp_cfr_rcc_mode_status(pdev)) { dp_wdi_event_handler(WDI_EVENT_RX_PPDU_DESC, soc, ppdu_nbuf, HTT_INVALID_PEER, WDI_NO_VAL, pdev->pdev_id); @@ -1742,6 +1755,8 @@ dp_rx_mon_status_process_tlv(struct dp_soc *soc, struct dp_intr *int_ctx, enum WDI_EVENT pktlog_mode = WDI_NO_VAL; bool nbuf_used; uint32_t rx_enh_capture_mode; + struct dp_mon_soc *mon_soc = soc->monitor_soc; + struct dp_mon_pdev *mon_pdev; if (!pdev) { dp_rx_mon_status_debug("%pK: pdev is null for mac_id = %d", soc, @@ -1749,24 +1764,25 @@ dp_rx_mon_status_process_tlv(struct dp_soc *soc, struct dp_intr *int_ctx, return; } - ppdu_info = &pdev->ppdu_info; - rx_mon_stats = &pdev->rx_mon_stats; + mon_pdev = pdev->monitor_pdev; + ppdu_info = &mon_pdev->ppdu_info; + rx_mon_stats = &mon_pdev->rx_mon_stats; - if (pdev->mon_ppdu_status != DP_PPDU_STATUS_START) + if (mon_pdev->mon_ppdu_status != DP_PPDU_STATUS_START) return; - rx_enh_capture_mode = pdev->rx_enh_capture_mode; + rx_enh_capture_mode = mon_pdev->rx_enh_capture_mode; - while (!qdf_nbuf_is_queue_empty(&pdev->rx_status_q)) { + while (!qdf_nbuf_is_queue_empty(&mon_pdev->rx_status_q)) { - status_nbuf = qdf_nbuf_queue_remove(&pdev->rx_status_q); + status_nbuf = qdf_nbuf_queue_remove(&mon_pdev->rx_status_q); rx_tlv = qdf_nbuf_data(status_nbuf); rx_tlv_start = rx_tlv; nbuf_used = false; - if ((pdev->monitor_vdev) || (pdev->enhanced_stats_en) || - (pdev->mcopy_mode) || (dp_cfr_rcc_mode_status(pdev)) || + if ((mon_pdev->mvdev) || (mon_pdev->enhanced_stats_en) || + (mon_pdev->mcopy_mode) || (dp_cfr_rcc_mode_status(pdev)) || (rx_enh_capture_mode != CDP_RX_ENH_CAPTURE_DISABLED)) { do { tlv_status = hal_rx_status_get_tlv_info(rx_tlv, @@ -1795,14 +1811,14 @@ dp_rx_mon_status_process_tlv(struct dp_soc *soc, struct dp_intr *int_ctx, (tlv_status == HAL_TLV_STATUS_MPDU_END) || (tlv_status == HAL_TLV_STATUS_MSDU_END)); } - if (pdev->dp_peer_based_pktlog) { + if (mon_pdev->dp_peer_based_pktlog) { dp_rx_process_peer_based_pktlog(soc, ppdu_info, status_nbuf, pdev->pdev_id); } else { - if (pdev->rx_pktlog_mode == DP_RX_PKTLOG_FULL) + if (mon_pdev->rx_pktlog_mode == DP_RX_PKTLOG_FULL) pktlog_mode = WDI_EVENT_RX_DESC; - else if (pdev->rx_pktlog_mode == DP_RX_PKTLOG_LITE) + else if (mon_pdev->rx_pktlog_mode == DP_RX_PKTLOG_LITE) pktlog_mode = WDI_EVENT_LITE_RX; if (pktlog_mode != WDI_NO_VAL) @@ -1813,13 +1829,14 @@ dp_rx_mon_status_process_tlv(struct dp_soc *soc, struct dp_intr *int_ctx, } /* smart monitor vap and m_copy cannot co-exist */ - if (ppdu_info->rx_status.monitor_direct_used && pdev->neighbour_peers_added - && pdev->monitor_vdev) { + if (ppdu_info->rx_status.monitor_direct_used && + mon_pdev->neighbour_peers_added && + mon_pdev->mvdev) { smart_mesh_status = dp_rx_handle_smart_mesh_mode(soc, pdev, ppdu_info, status_nbuf); if (smart_mesh_status) qdf_nbuf_free(status_nbuf); - } else if (qdf_unlikely(pdev->mcopy_mode)) { + } else if (qdf_unlikely(mon_pdev->mcopy_mode)) { dp_rx_process_mcopy_mode(soc, pdev, ppdu_info, tlv_status, status_nbuf); @@ -1841,39 +1858,41 @@ dp_rx_mon_status_process_tlv(struct dp_soc *soc, struct dp_intr *int_ctx, rx_mon_stats->status_ppdu_done++; dp_rx_mon_handle_mu_ul_info(ppdu_info); - if (pdev->tx_capture_enabled + if (mon_pdev->tx_capture_enabled != CDP_TX_ENH_CAPTURE_DISABLED) dp_send_ack_frame_to_stack(soc, pdev, ppdu_info); - if (pdev->enhanced_stats_en || - pdev->mcopy_mode || pdev->neighbour_peers_added) + if (mon_pdev->enhanced_stats_en || + mon_pdev->mcopy_mode || + mon_pdev->neighbour_peers_added) dp_rx_handle_ppdu_stats(soc, pdev, ppdu_info); else if (dp_cfr_rcc_mode_status(pdev)) dp_rx_handle_cfr(soc, pdev, ppdu_info); - pdev->mon_ppdu_status = DP_PPDU_STATUS_DONE; + mon_pdev->mon_ppdu_status = DP_PPDU_STATUS_DONE; /* * if chan_num is not fetched correctly from ppdu RX TLV, * get it from pdev saved. */ - if (qdf_unlikely(pdev->ppdu_info.rx_status.chan_num == 0)) - pdev->ppdu_info.rx_status.chan_num = pdev->mon_chan_num; + if (qdf_unlikely(mon_pdev->ppdu_info.rx_status.chan_num == 0)) + mon_pdev->ppdu_info.rx_status.chan_num = + mon_pdev->mon_chan_num; /* * if chan_freq is not fetched correctly from ppdu RX TLV, * get it from pdev saved. */ - if (qdf_unlikely(pdev->ppdu_info.rx_status.chan_freq == 0)) { - pdev->ppdu_info.rx_status.chan_freq = - pdev->mon_chan_freq; + if (qdf_unlikely(mon_pdev->ppdu_info.rx_status.chan_freq == 0)) { + mon_pdev->ppdu_info.rx_status.chan_freq = + mon_pdev->mon_chan_freq; } - if (!soc->full_mon_mode) + if (!mon_soc->full_mon_mode) dp_rx_mon_dest_process(soc, int_ctx, mac_id, quota); - pdev->mon_ppdu_status = DP_PPDU_STATUS_START; + mon_pdev->mon_ppdu_status = DP_PPDU_STATUS_START; } } return; @@ -1960,6 +1979,7 @@ dp_rx_mon_status_srng_process(struct dp_soc *soc, struct dp_intr *int_ctx, QDF_STATUS status; enum dp_mon_reap_status reap_status; uint32_t work_done = 0; + struct dp_mon_pdev *mon_pdev; if (!pdev) { dp_rx_mon_status_debug("%pK: pdev is null for mac_id = %d", @@ -1967,6 +1987,8 @@ dp_rx_mon_status_srng_process(struct dp_soc *soc, struct dp_intr *int_ctx, return work_done; } + mon_pdev = pdev->monitor_pdev; + mon_status_srng = soc->rxdma_mon_status_ring[mac_id].hal_srng; qdf_assert(mon_status_srng); @@ -2074,7 +2096,7 @@ dp_rx_mon_status_srng_process(struct dp_soc *soc, struct dp_intr *int_ctx, } /* Put the status_nbuf to queue */ - qdf_nbuf_queue_add(&pdev->rx_status_q, status_nbuf); + qdf_nbuf_queue_add(&mon_pdev->rx_status_q, status_nbuf); } else { union dp_rx_desc_list_elem_t *desc_list = NULL; @@ -2169,7 +2191,9 @@ uint32_t dp_mon_process(struct dp_soc *soc, struct dp_intr *int_ctx, uint32_t mac_id, uint32_t quota) { - if (qdf_unlikely(soc->full_mon_mode)) + struct dp_mon_soc *mon_soc = soc->monitor_soc; + + if (qdf_unlikely(mon_soc->full_mon_mode)) return dp_rx_mon_process(soc, int_ctx, mac_id, quota); return dp_rx_mon_status_process(soc, int_ctx, mac_id, quota); @@ -2244,6 +2268,7 @@ dp_rx_pdev_mon_status_desc_pool_init(struct dp_pdev *pdev, uint32_t mac_id) uint32_t num_entries; struct rx_desc_pool *rx_desc_pool; struct wlan_cfg_dp_soc_ctxt *soc_cfg_ctx; + struct dp_mon_pdev *mon_pdev = pdev->monitor_pdev; soc_cfg_ctx = soc->wlan_cfg_ctx; mon_status_ring = &soc->rxdma_mon_status_ring[mac_id]; @@ -2263,31 +2288,32 @@ dp_rx_pdev_mon_status_desc_pool_init(struct dp_pdev *pdev, uint32_t mac_id) dp_rx_desc_pool_init(soc, mac_id, num_entries + 1, rx_desc_pool); - qdf_nbuf_queue_init(&pdev->rx_status_q); + qdf_nbuf_queue_init(&mon_pdev->rx_status_q); - pdev->mon_ppdu_status = DP_PPDU_STATUS_START; + mon_pdev->mon_ppdu_status = DP_PPDU_STATUS_START; - qdf_mem_zero(&pdev->ppdu_info, sizeof(pdev->ppdu_info)); + qdf_mem_zero(&mon_pdev->ppdu_info, sizeof(mon_pdev->ppdu_info)); /* * Set last_ppdu_id to HAL_INVALID_PPDU_ID in order to avoid ppdu_id * match with '0' ppdu_id from monitor status ring */ - pdev->ppdu_info.com_info.last_ppdu_id = HAL_INVALID_PPDU_ID; + mon_pdev->ppdu_info.com_info.last_ppdu_id = HAL_INVALID_PPDU_ID; - qdf_mem_zero(&pdev->rx_mon_stats, sizeof(pdev->rx_mon_stats)); + qdf_mem_zero(&mon_pdev->rx_mon_stats, sizeof(mon_pdev->rx_mon_stats)); - dp_rx_mon_init_dbg_ppdu_stats(&pdev->ppdu_info, - &pdev->rx_mon_stats); + dp_rx_mon_init_dbg_ppdu_stats(&mon_pdev->ppdu_info, + &mon_pdev->rx_mon_stats); for (i = 0; i < MAX_MU_USERS; i++) { - qdf_nbuf_queue_init(&pdev->mpdu_q[i]); - pdev->is_mpdu_hdr[i] = true; + qdf_nbuf_queue_init(&mon_pdev->mpdu_q[i]); + mon_pdev->is_mpdu_hdr[i] = true; } - qdf_mem_zero(pdev->msdu_list, sizeof(pdev->msdu_list[MAX_MU_USERS])); + qdf_mem_zero(mon_pdev->msdu_list, + sizeof(mon_pdev->msdu_list[MAX_MU_USERS])); - pdev->rx_enh_capture_mode = CDP_RX_ENH_CAPTURE_DISABLED; + mon_pdev->rx_enh_capture_mode = CDP_RX_ENH_CAPTURE_DISABLED; } void