Эх сурвалжийг харах

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
aloksing 4 жил өмнө
parent
commit
53fe7000ba

+ 0 - 66
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

+ 104 - 21
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,

+ 1 - 1
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;
 	}
 

+ 44 - 107
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 <qdf_util.h>
 #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 <dp_mon.h>
-#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 <dp_mon.h>
+#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);

+ 2 - 6
dp/wifi3.0/dp_peer.c

@@ -29,15 +29,11 @@
 #include <hal_reo.h>
 #include <cdp_txrx_handle.h>
 #include <wlan_cfg.h>
-#ifdef FEATURE_WDS
-#include "dp_txrx_wds.h"
-#endif
 #ifdef WIFI_MONITOR_SUPPORT
 #include <dp_mon.h>
 #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

+ 3 - 4
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 <dp_mon.h>
 #endif
+#ifdef FEATURE_WDS
+#include "dp_txrx_wds.h"
+#endif
 
 #ifndef QCA_HOST_MODE_WIFI_DISABLED
 

+ 0 - 34
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

+ 0 - 1
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
 /**

+ 1 - 2
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,

+ 3 - 12
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 <cdp_txrx_hist_struct.h>
@@ -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",

+ 5 - 5
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 <dp_mon.h>
 #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 ||

+ 12 - 19
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);

+ 3 - 27
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;
 		}
 	}

+ 13 - 188
dp/wifi3.0/dp_types.h

@@ -55,9 +55,6 @@
 #include <pktlog.h>
 #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_ */

+ 0 - 10
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

+ 3 - 1
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 <dp_mon.h>
+#endif
 #ifdef FEATURE_WDS
 #include "dp_txrx_wds.h"
 #endif

Файлын зөрүү хэтэрхий том тул дарагдсан байна
+ 208 - 175
dp/wifi3.0/monitor/dp_mon.c


+ 620 - 8
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);
+}

+ 162 - 117
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;
-
-	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;
+		(mon_pdev->mon_filter_mode & MON_FILTER_OTHER) ? 1 : 0;
+
+	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;
 }

+ 10 - 10
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_ */

+ 120 - 83
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)
+		goto mon_deliver_fail;
+
+	mon_pdev = pdev->monitor_pdev;
+	rs = &mon_pdev->rx_mon_recv_status;
 
-	if (!pdev || (!pdev->monitor_vdev && !pdev->mcopy_mode &&
-		      !pdev->rx_pktlog_cbf))
+	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,

+ 101 - 75
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

Энэ ялгаанд хэт олон файл өөрчлөгдсөн тул зарим файлыг харуулаагүй болно