qcacmn: Support enhanced Rx capture

Support Rx capture mode to deliver first 128 bytes of
each MSDU, along with some meta data.

Change-Id: I1ffa8b1a029d46f68aa78520bacc019de8af7a82
diff --git a/dp/wifi3.0/dp_rx_mon_status.c b/dp/wifi3.0/dp_rx_mon_status.c
index 2e871da..72a5f7e 100644
--- a/dp/wifi3.0/dp_rx_mon_status.c
+++ b/dp/wifi3.0/dp_rx_mon_status.c
@@ -32,6 +32,26 @@
 #include "dp_ratetable.h"
 #endif
 
+#ifdef WLAN_RX_PKT_CAPTURE_ENH
+#include "dp_rx_mon_feature.h"
+#else
+static QDF_STATUS
+dp_rx_handle_enh_capture(struct dp_soc *soc, struct dp_pdev *pdev,
+			 struct hal_rx_ppdu_info *ppdu_info)
+{
+	return QDF_STATUS_SUCCESS;
+}
+
+static void
+dp_rx_mon_enh_capture_process(struct dp_pdev *pdev, uint32_t tlv_status,
+			      qdf_nbuf_t status_nbuf,
+			      struct hal_rx_ppdu_info *ppdu_info,
+			      bool *nbuf_used,
+			      uint32_t rx_enh_capture_mode)
+{
+}
+#endif
+
 /**
 * dp_rx_populate_cdp_indication_ppdu() - Populate cdp rx indication structure
 * @pdev: pdev ctx
@@ -531,9 +551,13 @@
 	uint8_t *rx_tlv_start;
 	uint32_t tlv_status = HAL_TLV_STATUS_BUF_DONE;
 	QDF_STATUS m_copy_status = QDF_STATUS_SUCCESS;
+	QDF_STATUS enh_log_status = QDF_STATUS_SUCCESS;
 	struct cdp_pdev_mon_stats *rx_mon_stats;
 	int smart_mesh_status;
 	enum WDI_EVENT pktlog_mode = WDI_NO_VAL;
+	bool nbuf_used;
+	uint32_t rx_enh_capture_mode;
+
 
 	ppdu_info = &pdev->ppdu_info;
 	rx_mon_stats = &pdev->rx_mon_stats;
@@ -541,16 +565,19 @@
 	if (pdev->mon_ppdu_status != DP_PPDU_STATUS_START)
 		return;
 
+	rx_enh_capture_mode = pdev->rx_enh_capture_mode;
+
 	while (!qdf_nbuf_is_queue_empty(&pdev->rx_status_q)) {
 
 		status_nbuf = qdf_nbuf_queue_remove(&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) {
-
+		    pdev->mcopy_mode ||
+		    (rx_enh_capture_mode != CDP_RX_ENH_CAPTURE_DISABLED)) {
 			do {
 				tlv_status = hal_rx_status_get_tlv_info(rx_tlv,
 						ppdu_info, pdev->soc->hal_soc);
@@ -558,12 +585,18 @@
 				dp_rx_mon_update_dbg_ppdu_stats(ppdu_info,
 								rx_mon_stats);
 
+				dp_rx_mon_enh_capture_process(pdev, tlv_status,
+					status_nbuf, ppdu_info,
+					&nbuf_used, rx_enh_capture_mode);
+
 				rx_tlv = hal_rx_status_get_next_tlv(rx_tlv);
 
 				if ((rx_tlv - rx_tlv_start) >= RX_BUFFER_SIZE)
 					break;
 
-			} while (tlv_status == HAL_TLV_STATUS_PPDU_NOT_DONE);
+			} while ((tlv_status == HAL_TLV_STATUS_PPDU_NOT_DONE) ||
+				 (tlv_status == HAL_TLV_STATUS_HEADER) ||
+				 (tlv_status == HAL_TLV_STATUS_MPDU_END));
 		}
 		if (pdev->dp_peer_based_pktlog) {
 			dp_rx_process_peer_based_pktlog(soc, ppdu_info,
@@ -593,6 +626,14 @@
 						pdev, ppdu_info, status_nbuf);
 			if (m_copy_status == QDF_STATUS_SUCCESS)
 				qdf_nbuf_free(status_nbuf);
+		} else if (rx_enh_capture_mode != CDP_RX_ENH_CAPTURE_DISABLED) {
+			if (!nbuf_used)
+				qdf_nbuf_free(status_nbuf);
+
+			if (tlv_status == HAL_TLV_STATUS_PPDU_DONE)
+				enh_log_status =
+				dp_rx_handle_enh_capture(soc,
+							 pdev, ppdu_info);
 		} else {
 			qdf_nbuf_free(status_nbuf);
 		}
@@ -1022,6 +1063,7 @@
 	union dp_rx_desc_list_elem_t *tail = NULL;
 	struct dp_srng *mon_status_ring;
 	uint32_t num_entries;
+	uint32_t i;
 	struct rx_desc_pool *rx_desc_pool;
 	QDF_STATUS status;
 	int mac_for_pdev = dp_get_mac_id_for_mac(soc, ring_id);
@@ -1065,5 +1107,13 @@
 	dp_rx_mon_init_dbg_ppdu_stats(&pdev->ppdu_info,
 				      &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_mem_zero(pdev->msdu_list, sizeof(pdev->msdu_list[MAX_MU_USERS]));
+
+	pdev->rx_enh_capture_mode = CDP_RX_ENH_CAPTURE_DISABLED;
+
 	return QDF_STATUS_SUCCESS;
 }