浏览代码

qcacmn: Restructure Rx TLV recording

Restructured Rx TLV recording implementation.
Shifted definitions to monitor 2.0 files.

CRs-Fixed: 3410093
Change-Id: I083f3a37e5caff668976c9ca955926afe16a242d
Aniruddha Mishra 2 年之前
父节点
当前提交
a70effe5d4

+ 16 - 8
dp/wifi3.0/monitor/2.0/dp_mon_2.0.c

@@ -1313,18 +1313,22 @@ static void dp_mon_register_intr_ops_2_0(struct dp_soc *soc)
 /*
  * dp_mon_pdev_tlv_logger_init() - initializes struct dp_mon_tlv_logger
  *
- * @mon_pdev: pointer to dp_mon_pdev
+ * @pdev: pointer to dp_pdev
  *
  * Return: QDF_STATUS
  */
 static
-QDF_STATUS dp_mon_pdev_tlv_logger_init(struct dp_mon_pdev *mon_pdev)
+QDF_STATUS dp_mon_pdev_tlv_logger_init(struct dp_pdev *pdev)
 {
+	struct dp_mon_pdev *mon_pdev = pdev->monitor_pdev;
+	struct dp_mon_pdev_be *mon_pdev_be = NULL;
 	struct dp_mon_tlv_logger *tlv_log = NULL;
 
 	if (!mon_pdev)
 		return QDF_STATUS_E_INVAL;
 
+	mon_pdev_be = dp_get_be_mon_pdev_from_dp_mon_pdev(mon_pdev);
+
 	tlv_log = qdf_mem_malloc(sizeof(struct dp_mon_tlv_logger));
 	if (!tlv_log) {
 		qdf_err("Memory allocation failed");
@@ -1351,7 +1355,7 @@ QDF_STATUS dp_mon_pdev_tlv_logger_init(struct dp_mon_pdev *mon_pdev)
 
 	tlv_log->tlv_logging_enable = 1;
 
-	mon_pdev->rx_tlv_log = tlv_log;
+	mon_pdev_be->rx_tlv_log = tlv_log;
 
 	return QDF_STATUS_SUCCESS;
 }
@@ -1359,19 +1363,23 @@ QDF_STATUS dp_mon_pdev_tlv_logger_init(struct dp_mon_pdev *mon_pdev)
 /*
  * dp_mon_pdev_tlv_logger_deinit() - deinitializes struct dp_mon_tlv_logger
  *
- * @mon_pdev: pointer to dp_mon_pdev
+ * @pdev: pointer to dp_pdev
  *
  * Return: QDF_STATUS
  */
 static
-QDF_STATUS dp_mon_pdev_tlv_logger_deinit(struct dp_mon_pdev *mon_pdev)
+QDF_STATUS dp_mon_pdev_tlv_logger_deinit(struct dp_pdev *pdev)
 {
+	struct dp_mon_pdev *mon_pdev = pdev->monitor_pdev;
+	struct dp_mon_pdev_be *mon_pdev_be = NULL;
 	struct dp_mon_tlv_logger *tlv_log = NULL;
 
 	if (!mon_pdev)
 		return QDF_STATUS_E_INVAL;
 
-	tlv_log = mon_pdev->rx_tlv_log;
+	mon_pdev_be = dp_get_be_mon_pdev_from_dp_mon_pdev(mon_pdev);
+
+	tlv_log = mon_pdev_be->rx_tlv_log;
 	if (!tlv_log || !(tlv_log->buff))
 		return QDF_STATUS_E_INVAL;
 
@@ -1386,13 +1394,13 @@ QDF_STATUS dp_mon_pdev_tlv_logger_deinit(struct dp_mon_pdev *mon_pdev)
 #else
 
 static inline
-QDF_STATUS dp_mon_pdev_tlv_logger_init(struct dp_mon_pdev *mon_pdev)
+QDF_STATUS dp_mon_pdev_tlv_logger_init(struct dp_pdev *pdev)
 {
 	return QDF_STATUS_SUCCESS;
 }
 
 static inline
-QDF_STATUS dp_mon_pdev_tlv_logger_deinit(struct dp_mon_pdev *mon_pdev)
+QDF_STATUS dp_mon_pdev_tlv_logger_deinit(struct dp_pdev *pdev)
 {
 	return QDF_STATUS_SUCCESS;
 }

+ 56 - 0
dp/wifi3.0/monitor/2.0/dp_mon_2.0.h

@@ -47,6 +47,58 @@
 
 #define MAX_NUM_PPDU_RECORD 4
 #define MAX_TLVS_PER_PPDU 255
+
+/*
+ * struct dp_mon_tlv_info - recorded information of each TLV
+ * @tlv_tag: tlv tag
+ * @data: union of struct of fields to be recorded for each TLV
+ *
+ * Tag and its corresponding important fields are stored in this struct
+ */
+struct dp_mon_tlv_info {
+	uint32_t tlv_tag:10;
+	union {
+		struct hal_ppdu_start_tlv_record ppdu_start;
+		struct hal_ppdu_start_user_info_tlv_record  ppdu_start_user_info;
+		struct hal_mpdu_start_tlv_record mpdu_start;
+		struct hal_mpdu_end_tlv_record mpdu_end;
+		struct hal_header_tlv_record header;
+		struct hal_msdu_end_tlv_record msdu_end;
+		struct hal_mon_buffer_addr_tlv_record mon_buffer_addr;
+		struct hal_phy_location_tlv_record phy_location;
+		struct hal_ppdu_end_user_stats_tlv_record ppdu_end_user_stats;
+		struct hal_pcu_ppdu_end_info_tlv_record pcu_ppdu_end_info;
+		struct hal_phy_rx_ht_sig_tlv_record phy_rx_ht_sig;
+		uint32_t data:22;
+	} data;
+};
+
+/**
+ * struct dp_mon_tlv_logger - contains indexes and other data of the buffer
+ * @buff: buffer in which TLVs are stored
+ * @curr_ppdu_pos: position of the next ppdu to be written
+ * @ppdu_start_idx: starting index form which PPDU start level TLVs are stored for a ppdu
+ * @mpdu_idx: starting index form which MPDU TLVs are stored for a ppdu
+ * @ppdu_end_idx: starting index form which PPDU end level TLVs are stored for a ppdu
+ * @max_ppdu_start_idx: ending index for PPDU start level TLVs for a ppdu
+ * @max_mpdu_idx: ending index for MPDU level TLVs for a ppdu
+ * @max_ppdu_end_idx: ending index for PPDU end level TLVs for a ppdu
+ * @wrap_flag: flag toggle between consecutive PPDU
+ * @tlv_logging_enable: check is tlv logging is enabled
+ *
+ */
+struct dp_mon_tlv_logger {
+	void *buff;
+	uint16_t curr_ppdu_pos;
+	uint16_t ppdu_start_idx;
+	uint16_t mpdu_idx;
+	uint16_t ppdu_end_idx;
+	uint16_t max_ppdu_start_idx;
+	uint16_t max_ppdu_end_idx;
+	uint16_t max_mpdu_idx;
+	uint8_t wrap_flag;
+	bool tlv_logging_enable;
+};
 #endif
 
 /* monitor frame filter modes */
@@ -166,6 +218,7 @@ struct dp_mon_desc_pool {
  * @prev_rxmon_cookie: prev rxmon cookie
  * @ppdu_info_cache: PPDU info cache
  * @total_free_elem: total free element in queue
+ * @rx_tlv_logger: Rx TLV logger struct
  */
 struct dp_mon_pdev_be {
 	struct dp_mon_pdev mon_pdev;
@@ -192,6 +245,9 @@ struct dp_mon_pdev_be {
 	uint32_t prev_rxmon_cookie;
 	qdf_kmem_cache_t ppdu_info_cache;
 	uint32_t total_free_elem;
+#ifdef MONITOR_TLV_RECORDING_ENABLE
+	struct dp_mon_tlv_logger *rx_tlv_log;
+#endif
 };
 
 /**

+ 16 - 16
dp/wifi3.0/monitor/2.0/dp_rx_mon_2.0.c

@@ -367,16 +367,16 @@ void dp_rx_mon_pf_tag_to_buf_headroom_2_0(void *nbuf,
  * dp_mon_record_index_update() - update the indexes of dp_mon_tlv_logger
  *                                 to store next tlv
  *
- * @mon_pdev: pointer to dp_mon_pdev
+ * @mon_pdev_be: pointer to dp_mon_pdev_be
  *
  * Return
  */
 void
-dp_mon_record_index_update(struct dp_mon_pdev *mon_pdev) {
+dp_mon_record_index_update(struct dp_mon_pdev_be *mon_pdev_be) {
 	struct dp_mon_tlv_logger *tlv_log = NULL;
 	struct dp_mon_tlv_info *tlv_info = NULL;
 
-	tlv_log = mon_pdev->rx_tlv_log;
+	tlv_log = mon_pdev_be->rx_tlv_log;
 	tlv_info = (struct dp_mon_tlv_info *)tlv_log->buff;
 
 	(tlv_log->curr_ppdu_pos + 1 == MAX_NUM_PPDU_RECORD) ?
@@ -400,13 +400,13 @@ dp_mon_record_index_update(struct dp_mon_pdev *mon_pdev) {
 /**
  * dp_mon_record_tlv() - Store the contents of the tlv in buffer
  *
- * @mon_pdev: pointe to dp_mon_pdev
+ * @mon_pdev_be: pointe to dp_mon_pdev_be
  * @ppdu_info: struct hal_rx_ppdu_info
  *
  * Return
  */
 void
-dp_mon_record_tlv(struct dp_mon_pdev *mon_pdev,
+dp_mon_record_tlv(struct dp_mon_pdev_be *mon_pdev_be,
 		  struct hal_rx_ppdu_info *ppdu_info) {
 	struct dp_mon_tlv_logger *tlv_log = NULL;
 	struct dp_mon_tlv_info *tlv_info = NULL;
@@ -415,10 +415,10 @@ dp_mon_record_tlv(struct dp_mon_pdev *mon_pdev,
 	uint16_t *mpdu_idx = NULL;
 	uint16_t *ppdu_end_idx = NULL;
 
-	if (!mon_pdev || !(mon_pdev->rx_tlv_log))
+	if (!mon_pdev_be || !(mon_pdev_be->rx_tlv_log))
 		return;
 
-	tlv_log = mon_pdev->rx_tlv_log;
+	tlv_log = mon_pdev_be->rx_tlv_log;
 	if (!tlv_log->tlv_logging_enable || !(tlv_log->buff))
 		return;
 
@@ -546,16 +546,16 @@ dp_mon_record_tlv(struct dp_mon_pdev *mon_pdev,
 /**
  * dp_mon_record_clear_buffer() - Clear the buffer to record next PPDU
  *
- * @mon_pdev: pointer to dp_mon_pdev
+ * @mon_pdev_be: pointer to dp_mon_pdev_be
  *
  * Return
  */
 void
-dp_mon_record_clear_buffer(struct dp_mon_pdev *mon_pdev) {
+dp_mon_record_clear_buffer(struct dp_mon_pdev_be *mon_pdev_be) {
 	struct dp_mon_tlv_logger *rx_tlv_log = NULL;
 	struct dp_mon_tlv_info *tlv_info = NULL;
 
-	rx_tlv_log = mon_pdev->rx_tlv_log;
+	rx_tlv_log = mon_pdev_be->rx_tlv_log;
 	tlv_info = (struct dp_mon_tlv_info *)rx_tlv_log->buff;
 	qdf_mem_zero(&tlv_info[rx_tlv_log->ppdu_start_idx],
 		     MAX_TLVS_PER_PPDU * sizeof(struct dp_mon_tlv_info));
@@ -564,16 +564,16 @@ dp_mon_record_clear_buffer(struct dp_mon_pdev *mon_pdev) {
 #else
 
 void
-dp_mon_record_index_update(struct dp_mon_pdev *mon_pdev) {
+dp_mon_record_index_update(struct dp_mon_pdev_be *mon_pdev_be) {
 }
 
 void
-dp_mon_record_tlv(struct dp_mon_pdev *mon_pdev,
+dp_mon_record_tlv(struct dp_mon_pdev_be *mon_pdev_be,
 		  struct hal_rx_ppdu_info *ppdu_info) {
 }
 
 void
-dp_mon_record_clear_buffer(struct dp_mon_pdev *mon_pdev) {
+dp_mon_record_clear_buffer(struct dp_mon_pdev_be *mon_pdev_be) {
 }
 
 #endif
@@ -1779,14 +1779,14 @@ dp_rx_mon_process_status_tlv(struct dp_pdev *pdev)
 		rx_tlv = buf;
 		rx_tlv_start = buf;
 
-		dp_mon_record_clear_buffer(mon_pdev);
+		dp_mon_record_clear_buffer(mon_pdev_be);
 
 		do {
 			tlv_status = hal_rx_status_get_tlv_info(rx_tlv,
 								ppdu_info,
 								pdev->soc->hal_soc,
 								buf);
-			dp_mon_record_tlv(mon_pdev, ppdu_info);
+			dp_mon_record_tlv(mon_pdev_be, ppdu_info);
 			work_done += dp_rx_mon_process_tlv_status(pdev,
 								  ppdu_info,
 								  buf,
@@ -1816,7 +1816,7 @@ dp_rx_mon_process_status_tlv(struct dp_pdev *pdev)
 		qdf_frag_free(buf);
 		DP_STATS_INC(mon_soc, frag_free, 1);
 		mon_pdev->rx_mon_stats.status_buf_count++;
-		dp_mon_record_index_update(mon_pdev);
+		dp_mon_record_index_update(mon_pdev_be);
 	}
 
 	dp_mon_rx_stats_update_rssi_dbm_params(mon_pdev, ppdu_info);

+ 2 - 3
dp/wifi3.0/monitor/dp_mon.c

@@ -5887,7 +5887,7 @@ QDF_STATUS dp_mon_pdev_init(struct dp_pdev *pdev)
 		mon_ops->mon_pdev_ext_init(pdev);
 
 	if (mon_ops->mon_rx_pdev_tlv_logger_init)
-		mon_ops->mon_rx_pdev_tlv_logger_init(pdev->monitor_pdev);
+		mon_ops->mon_rx_pdev_tlv_logger_init(pdev);
 
 	mon_pdev->is_dp_mon_pdev_initialized = true;
 
@@ -5937,8 +5937,7 @@ QDF_STATUS dp_mon_pdev_deinit(struct dp_pdev *pdev)
 		mon_ops->mon_pdev_ext_deinit(pdev);
 
 	if (mon_ops->mon_rx_pdev_tlv_logger_deinit)
-		mon_ops->mon_rx_pdev_tlv_logger_deinit(
-					pdev->monitor_pdev);
+		mon_ops->mon_rx_pdev_tlv_logger_deinit(pdev);
 
 	/* detach monitor function */
 	dp_monitor_tx_ppdu_stats_detach(pdev);

+ 2 - 133
dp/wifi3.0/monitor/dp_mon.h

@@ -100,132 +100,6 @@ static inline bool dp_is_monitor_mode_using_poll(struct dp_soc *soc)
 }
 #endif
 
-#ifdef MONITOR_TLV_RECORDING_ENABLE
-/*
- * struct dp_mon_tlv_info - recorded information of each TLV
- * @tlv_tag: tlv tag
- * @data: other fields recorded for a TLV
- *
- * Tag and its corresponding important fields are stored in this struct
- */
-struct ppdu_start_tlv_record {
-	uint32_t ppdu_id:10;
-};
-
-struct ppdu_start_user_info_tlv_record {
-	uint32_t user_id:6,
-		rate_mcs:4,
-		nss:3,
-		reception_type:3,
-		sgi:2;
-};
-
-struct mpdu_start_tlv_record {
-	uint32_t user_id:6,
-		wrap_flag:1;
-};
-
-struct mpdu_end_tlv_record {
-	uint32_t user_id:6,
-		fcs_err:1,
-		wrap_flag:1;
-};
-
-struct header_tlv_record {
-	uint32_t wrap_flag:1;
-};
-
-struct msdu_end_tlv_record {
-	uint32_t user_id:6,
-		msdu_num:8,
-		tid:4,
-		tcp_proto:1,
-		udp_proto:1,
-		wrap_flag:1;
-};
-
-struct mon_buffer_addr_tlv_record {
-	uint32_t dma_length:12,
-		truncation:1,
-		continuation:1,
-		wrap_flag:1;
-};
-
-struct phy_location_tlv_record {
-	uint32_t rtt_cfr_status:8,
-		rtt_num_streams:8,
-		rx_location_info_valid:1;
-};
-
-struct ppdu_end_user_stats_tlv_record {
-	uint32_t ast_index:16,
-		pkt_type:4;
-};
-
-struct pcu_ppdu_end_info_tlv_record {
-	uint32_t dialog_topken:8,
-		bb_captured_reason:3,
-		bb_captured_channel:1,
-		bb_captured_timeout:1,
-		mpdu_delimiter_error_seen:1;
-};
-
-struct phy_rx_ht_sig_tlv_record {
-	uint32_t crc:8,
-		mcs:7,
-		stbc:2,
-		aggregation:1,
-		short_gi:1,
-		fes_coding:1,
-		cbw:1;
-};
-
-struct dp_mon_tlv_info {
-	uint32_t tlv_tag:10;
-	union {
-		struct ppdu_start_tlv_record ppdu_start;
-		struct ppdu_start_user_info_tlv_record  ppdu_start_user_info;
-		struct mpdu_start_tlv_record mpdu_start;
-		struct mpdu_end_tlv_record mpdu_end;
-		struct header_tlv_record header;
-		struct msdu_end_tlv_record msdu_end;
-		struct mon_buffer_addr_tlv_record mon_buffer_addr;
-		struct phy_location_tlv_record phy_location;
-		struct ppdu_end_user_stats_tlv_record ppdu_end_user_stats;
-		struct pcu_ppdu_end_info_tlv_record pcu_ppdu_end_info;
-		struct phy_rx_ht_sig_tlv_record phy_rx_ht_sig;
-		uint32_t data;
-	} data;
-};
-
-/**
- * struct dp_mon_tlv_logger - contains indexes and other data of the buffer
- * @buff: buffer in which TLVs are stored
- * @curr_ppdu_pos: position of the next ppdu to be written
- * @ppdu_start_idx: starting index form which PPDU start level TLVs are stored for a ppdu
- * @mpdu_idx: starting index form which MPDU TLVs are stored for a ppdu
- * @ppdu_end_idx: starting index form which PPDU end level TLVs are stored for a ppdu
- * @max_ppdu_start_idx: ending index for PPDU start level TLVs for a ppdu
- * @max_mpdu_idx: ending index for MPDU level TLVs for a ppdu
- * @max_ppdu_end_idx: ending index for PPDU end level TLVs for a ppdu
- * @wrap_flag: flag toggle between consecutive PPDU
- * @tlv_logging_enable: check is tlv logging is enabled
- *
- */
-struct dp_mon_tlv_logger {
-	void *buff;
-	uint16_t curr_ppdu_pos;
-	uint16_t ppdu_start_idx;
-	uint16_t mpdu_idx;
-	uint16_t ppdu_end_idx;
-	uint16_t max_ppdu_start_idx;
-	uint16_t max_ppdu_end_idx;
-	uint16_t max_mpdu_idx;
-	uint8_t wrap_flag;
-	bool tlv_logging_enable;
-};
-#endif
-
 /**
  * dp_mon_soc_attach() - DP monitor soc attach
  * @soc: Datapath SOC handle
@@ -950,8 +824,8 @@ struct dp_mon_ops {
 #endif
 	QDF_STATUS (*mon_pdev_ext_init)(struct dp_pdev *pdev);
 	QDF_STATUS (*mon_pdev_ext_deinit)(struct dp_pdev *pdev);
-	QDF_STATUS (*mon_rx_pdev_tlv_logger_init)(struct dp_mon_pdev *mon_pdev);
-	QDF_STATUS (*mon_rx_pdev_tlv_logger_deinit)(struct dp_mon_pdev *mon_pdev);
+	QDF_STATUS (*mon_rx_pdev_tlv_logger_init)(struct dp_pdev *pdev);
+	QDF_STATUS (*mon_rx_pdev_tlv_logger_deinit)(struct dp_pdev *pdev);
 	QDF_STATUS (*mon_lite_mon_alloc)(struct dp_pdev *pdev);
 	void (*mon_lite_mon_dealloc)(struct dp_pdev *pdev);
 	void (*mon_lite_mon_vdev_delete)(struct dp_pdev *pdev,
@@ -1129,11 +1003,6 @@ struct  dp_mon_pdev {
 	uint16_t mo_data_filter;
 	uint16_t md_data_filter;
 
-#ifdef MONITOR_TLV_RECORDING_ENABLE
-	/*Rx TLV logger*/
-	struct dp_mon_tlv_logger *rx_tlv_log;
-#endif
-
 #ifdef WLAN_TX_PKT_CAPTURE_ENH
 	struct dp_pdev_tx_capture tx_capture;
 	bool stop_tx_capture_work_q_timer;

+ 79 - 2
hal/wifi3.0/be/hal_be_api_mon.h

@@ -1075,14 +1075,91 @@ enum txmon_generated_response {
 };
 
 #ifdef MONITOR_TLV_RECORDING_ENABLE
+
+/*
+ * Please make sure that the maximum total size of fields in each TLV
+ * is 22 bits.
+ * 10 bits are reserved for tlv_tag
+ */
+struct hal_ppdu_start_tlv_record {
+	uint32_t ppdu_id:10;
+};
+
+struct hal_ppdu_start_user_info_tlv_record {
+	uint32_t user_id:6,
+		rate_mcs:4,
+		nss:3,
+		reception_type:3,
+		sgi:2;
+};
+
+struct hal_mpdu_start_tlv_record {
+	uint32_t user_id:6,
+		wrap_flag:1;
+};
+
+struct hal_mpdu_end_tlv_record {
+	uint32_t user_id:6,
+		fcs_err:1,
+		wrap_flag:1;
+};
+
+struct hal_header_tlv_record {
+	uint32_t wrap_flag:1;
+};
+
+struct hal_msdu_end_tlv_record {
+	uint32_t user_id:6,
+		msdu_num:8,
+		tid:4,
+		tcp_proto:1,
+		udp_proto:1,
+		wrap_flag:1;
+};
+
+struct hal_mon_buffer_addr_tlv_record {
+	uint32_t dma_length:12,
+		truncation:1,
+		continuation:1,
+		wrap_flag:1;
+};
+
+struct hal_phy_location_tlv_record {
+	uint32_t rtt_cfr_status:8,
+		rtt_num_streams:8,
+		rx_location_info_valid:1;
+};
+
+struct hal_ppdu_end_user_stats_tlv_record {
+	uint32_t ast_index:16,
+		 pkt_type:4;
+};
+
+struct hal_pcu_ppdu_end_info_tlv_record {
+	uint32_t dialog_topken:8,
+		 bb_captured_reason:3,
+		 bb_captured_channel:1,
+		 bb_captured_timeout:1,
+		 mpdu_delimiter_error_seen:1;
+};
+
+struct hal_phy_rx_ht_sig_tlv_record {
+	uint32_t crc:8,
+		 mcs:7,
+		 stbc:2,
+		 aggregation:1,
+		 short_gi:1,
+		 fes_coding:1,
+		 cbw:1;
+};
 /*
- * enum ppdu_tlv_category - Categories of TLV
+ * enum hal_ppdu_tlv_category - Categories of TLV
  * @PPDU_START: PPDU start level TLV
  * @MPDU: MPDU level TLV
  * @PPDU_END: PPDU end level TLV
  *
  */
-enum ppdu_tlv_category {
+enum hal_ppdu_tlv_category {
 	CATEGORY_PPDU_START = 1,
 	CATEGORY_MPDU,
 	CATEGORY_PPDU_END