Browse Source

qcacmn: Add dump stats feature for Lithium

Add support for dump statistics in Lithium.
Statistics include:
	1. Tx path packet flow
	2. Tx Histogram stats per interrupt
	3. Rx path packet flow
	4. Rx Histogram stats per interrupt

Change-Id: I7f399b717a9fb29a3d6ab672b669c6e323f61e27
CRs-Fixed: 2023386
Venkata Sharath Chandra Manchala 8 years ago
parent
commit
a405eb741b

+ 13 - 0
dp/inc/cdp_txrx_cmn.h

@@ -474,4 +474,17 @@ int cdp_txrx_stats(ol_txrx_soc_handle soc, struct cdp_vdev *vdev,
 	return 0;
 }
 
+/**
+  * cdp_display_stats(): function to map to dump stats
+  * @soc: soc handle
+  * @value: statistics option
+  */
+static inline QDF_STATUS
+cdp_display_stats(ol_txrx_soc_handle soc, uint16_t value)
+{
+	if (soc->ops->cmn_drv_ops->display_stats)
+		return soc->ops->cmn_drv_ops->display_stats(soc, value);
+
+	return 0;
+}
 #endif /* _CDP_TXRX_CMN_H_ */

+ 45 - 0
dp/inc/cdp_txrx_cmn_struct.h

@@ -51,6 +51,22 @@
 #define SUPPORTED_BW 4
 #define SUPPORTED_RECEPTION_TYPES 4
 
+/* Options for Dump Statistics */
+#define CDP_HDD_STATS               0
+#define CDP_TXRX_PATH_STATS         1
+#define CDP_TXRX_HIST_STATS         2
+#define CDP_TXRX_TSO_STATS          3
+#define CDP_HDD_NETIF_OPER_HISTORY  4
+#define CDP_DUMP_TX_FLOW_POOL_INFO  5
+#define CDP_TXRX_DESC_STATS         6
+#define CDP_HIF_STATS               7
+#define CDP_LRO_STATS               8
+#define CDP_NAPI_STATS              9
+#define CDP_SCHEDULER_STATS        21
+#define CDP_TX_QUEUE_STATS         22
+#define CDP_BUNDLE_STATS           23
+#define CDP_CREDIT_STATS           24
+
 /* WME stream classes */
 #define WME_AC_BE    0    /* best effort */
 #define WME_AC_BK    1    /* background */
@@ -701,6 +717,31 @@ struct cdp_peer_stats {
 	struct cdp_rx_stats rx;
 };
 
+/* Tx completions per interrupt */
+struct cdp_hist_tx_comp {
+	uint32_t pkts_1;
+	uint32_t pkts_2_20;
+	uint32_t pkts_21_40;
+	uint32_t pkts_41_60;
+	uint32_t pkts_61_80;
+	uint32_t pkts_81_100;
+	uint32_t pkts_101_200;
+	uint32_t pkts_201_plus;
+};
+
+/* Rx ring descriptors reaped per interrupt */
+struct cdp_hist_rx_ind {
+	uint32_t pkts_1;
+	uint32_t pkts_2_20;
+	uint32_t pkts_21_40;
+	uint32_t pkts_41_60;
+	uint32_t pkts_61_80;
+	uint32_t pkts_81_100;
+	uint32_t pkts_101_200;
+	uint32_t pkts_201_plus;
+};
+
+
 struct cdp_pdev_stats {
 	/* packets dropped on rx */
 	struct {
@@ -724,5 +765,9 @@ struct cdp_pdev_stats {
 	struct cdp_tx_stats tx;
 	/* CDP Rx Stats */
 	struct cdp_rx_stats rx;
+	/* Number of Tx completions per interrupt */
+	struct cdp_hist_tx_comp tx_comp_histogram;
+	/* Number of Rx ring descriptors reaped per interrupt */
+	struct cdp_hist_rx_ind rx_ind_histogram;
 };
 #endif

+ 0 - 16
dp/inc/cdp_txrx_mob_def.h

@@ -29,22 +29,6 @@
 #define OL_TXQ_PAUSE_REASON_VDEV_STOP         (1 << 3)
 #define OL_TXQ_PAUSE_REASON_THERMAL_MITIGATION (1 << 4)
 
-/* command options for dumpStats*/
-#define WLAN_HDD_STATS        0
-#define WLAN_TXRX_STATS       1
-#define WLAN_TXRX_HIST_STATS  2
-#define WLAN_TXRX_TSO_STATS   3
-#define WLAN_HDD_NETIF_OPER_HISTORY 4
-#define WLAN_DUMP_TX_FLOW_POOL_INFO 5
-#define WLAN_TXRX_DESC_STATS  6
-#define WLAN_HIF_STATS  7
-#define WLAN_LRO_STATS  8
-#define WLAN_NAPI_STATS  9
-#define WLAN_SCHEDULER_STATS        21
-#define WLAN_TX_QUEUE_STATS         22
-#define WLAN_BUNDLE_STATS           23
-#define WLAN_CREDIT_STATS           24
-
 #define OL_TXRX_INVALID_NUM_PEERS (-1)
 
 #define OL_TXRX_MAC_ADDR_LEN 6

+ 2 - 2
dp/inc/cdp_txrx_ops.h

@@ -199,6 +199,8 @@ struct cdp_cmn_ops {
 
 	A_STATUS(*txrx_stats)(struct cdp_vdev *vdev,
 		struct ol_txrx_stats_req *req, enum cdp_stats stats);
+
+	QDF_STATUS (*display_stats)(void *psoc, uint16_t value);
 };
 
 struct cdp_ctrl_ops {
@@ -849,12 +851,10 @@ struct cdp_throttle_ops {
 
 /**
  * struct cdp_ocb_ops - mcl ocb ops
- * @display_stats:
  * @clear_stats:
  * @stats:
  */
 struct cdp_mob_stats_ops {
-	QDF_STATUS (*display_stats)(uint16_t bitmap);
 	void (*clear_stats)(uint16_t bitmap);
 	int (*stats)(uint8_t vdev_id, char *buffer, unsigned buf_len);
 };

+ 0 - 8
dp/inc/cdp_txrx_stats.h

@@ -33,14 +33,6 @@
 #define _CDP_TXRX_STATS_H_
 #include <cdp_txrx_ops.h>
 
-static inline QDF_STATUS
-cdp_display_stats(ol_txrx_soc_handle soc, uint16_t bitmap)
-{
-	if (soc->ops->mob_stats_ops->display_stats)
-		return soc->ops->mob_stats_ops->display_stats(bitmap);
-	return QDF_STATUS_SUCCESS;
-}
-
 static inline void
 cdp_clear_stats(ol_txrx_soc_handle soc, uint16_t bitmap)
 {

+ 96 - 0
dp/wifi3.0/dp_internal.h

@@ -108,6 +108,96 @@ while (0)
 	DP_STATS_AGGR(_handle_a, _handle_b, _field.num); \
 	DP_STATS_AGGR(_handle_a, _handle_b, _field.bytes);\
 }
+
+
+#define DP_HIST_INIT() \
+	uint32_t num_of_packets[MAX_PDEV_CNT] = {0};
+
+#define DP_HIST_PACKET_COUNT_INC(_pdev_id) \
+{ \
+		++num_of_packets[_pdev_id]; \
+}
+
+#define DP_TX_HISTOGRAM_UPDATE(_pdev, _p_cntrs) \
+	do {                                                              \
+		if (_p_cntrs == 1) {                                      \
+			DP_STATS_INC(_pdev,                               \
+				tx_comp_histogram.pkts_1, 1);             \
+		} else if (_p_cntrs > 1 && _p_cntrs <= 20) {              \
+			DP_STATS_INC(_pdev,                               \
+				tx_comp_histogram.pkts_2_20, 1);          \
+		} else if (_p_cntrs > 20 && _p_cntrs <= 40) {             \
+			DP_STATS_INC(_pdev,                               \
+				tx_comp_histogram.pkts_21_40, 1);         \
+		} else if (_p_cntrs > 40 && _p_cntrs <= 60) {             \
+			DP_STATS_INC(_pdev,                               \
+				tx_comp_histogram.pkts_41_60, 1);         \
+		} else if (_p_cntrs > 60 && _p_cntrs <= 80) {             \
+			DP_STATS_INC(_pdev,                               \
+				tx_comp_histogram.pkts_61_80, 1);         \
+		} else if (_p_cntrs > 80 && _p_cntrs <= 100) {            \
+			DP_STATS_INC(_pdev,                               \
+				tx_comp_histogram.pkts_81_100, 1);        \
+		} else if (_p_cntrs > 100 && _p_cntrs <= 200) {           \
+			DP_STATS_INC(_pdev,                               \
+				tx_comp_histogram.pkts_101_200, 1);       \
+		} else if (_p_cntrs > 200) {                              \
+			DP_STATS_INC(_pdev,                               \
+				tx_comp_histogram.pkts_201_plus, 1);      \
+		}                                                         \
+	} while (0)
+
+#define DP_RX_HISTOGRAM_UPDATE(_pdev, _p_cntrs) \
+	do {                                                              \
+		if (_p_cntrs == 1) {                                      \
+			DP_STATS_INC(_pdev,                               \
+				rx_ind_histogram.pkts_1, 1);              \
+		} else if (_p_cntrs > 1 && _p_cntrs <= 20) {              \
+			DP_STATS_INC(_pdev,                               \
+				rx_ind_histogram.pkts_2_20, 1);           \
+		} else if (_p_cntrs > 20 && _p_cntrs <= 40) {             \
+			DP_STATS_INC(_pdev,                               \
+				rx_ind_histogram.pkts_21_40, 1);          \
+		} else if (_p_cntrs > 40 && _p_cntrs <= 60) {             \
+			DP_STATS_INC(_pdev,                               \
+				rx_ind_histogram.pkts_41_60, 1);          \
+		} else if (_p_cntrs > 60 && _p_cntrs <= 80) {             \
+			DP_STATS_INC(_pdev,                               \
+				rx_ind_histogram.pkts_61_80, 1);          \
+		} else if (_p_cntrs > 80 && _p_cntrs <= 100) {            \
+			DP_STATS_INC(_pdev,                               \
+				rx_ind_histogram.pkts_81_100, 1);         \
+		} else if (_p_cntrs > 100 && _p_cntrs <= 200) {           \
+			DP_STATS_INC(_pdev,                               \
+				rx_ind_histogram.pkts_101_200, 1);        \
+		} else if (_p_cntrs > 200) {                              \
+			DP_STATS_INC(_pdev,                               \
+				rx_ind_histogram.pkts_201_plus, 1);       \
+		}                                                         \
+	} while (0)
+
+#define DP_TX_HIST_STATS_PER_PDEV() \
+	do { \
+		uint8_t hist_stats = 0; \
+		for (hist_stats = 0; hist_stats < soc->pdev_count; \
+				hist_stats++) { \
+			DP_TX_HISTOGRAM_UPDATE(soc->pdev_list[hist_stats], \
+					num_of_packets[hist_stats]); \
+		} \
+	}  while (0)
+
+
+#define DP_RX_HIST_STATS_PER_PDEV() \
+	do { \
+		uint8_t hist_stats = 0; \
+		for (hist_stats = 0; hist_stats < soc->pdev_count; \
+				hist_stats++) { \
+			DP_RX_HISTOGRAM_UPDATE(soc->pdev_list[hist_stats], \
+					num_of_packets[hist_stats]); \
+		} \
+	}  while (0)
+
+
 #else
 #define DP_STATS_INC(_handle, _field, _delta)
 #define DP_STATS_INCC(_handle, _field, _delta, _cond)
@@ -117,6 +207,12 @@ while (0)
 #define DP_STATS_INCC_PKT(_handle, _field, _count, _bytes)
 #define DP_STATS_AGGR(_handle_a, _handle_b, _field)
 #define DP_STATS_AGGR_PKT(_handle_a, _handle_b, _field)
+#define DP_HIST_INIT()
+#define DP_HIST_PACKET_COUNT_INC(_pdev_id)
+#define DP_TX_HISTOGRAM_UPDATE(_pdev, _p_cntrs)
+#define DP_RX_HISTOGRAM_UPDATE(_pdev, _p_cntrs)
+#define DP_RX_HIST_STATS_PER_PDEV()
+#define DP_TX_HIST_STATS_PER_PDEV()
 #endif
 
 

+ 178 - 1
dp/wifi3.0/dp_main.c

@@ -1134,6 +1134,7 @@ static struct cdp_pdev *dp_pdev_attach_wifi3(struct cdp_soc_t *txrx_soc,
 	pdev->osif_pdev = ctrl_pdev;
 	pdev->pdev_id = pdev_id;
 	soc->pdev_list[pdev_id] = pdev;
+	soc->pdev_count++;
 
 	TAILQ_INIT(&pdev->vdev_list);
 	pdev->vdev_count = 0;
@@ -1325,7 +1326,7 @@ static void dp_pdev_detach_wifi3(struct cdp_pdev *txrx_pdev, int force)
 		RXDMA_MONITOR_DESC, 0);
 
 	soc->pdev_list[pdev->pdev_id] = NULL;
-
+	soc->pdev_count--;
 	qdf_mem_free(pdev);
 }
 
@@ -3094,6 +3095,180 @@ static int dp_txrx_stats(struct cdp_vdev *vdev,
 	return 0;
 }
 
+/*
+ * dp_txrx_path_stats() - Function to display dump stats
+ * @soc - soc handle
+ *
+ * return: none
+ */
+static void dp_txrx_path_stats(struct dp_soc *soc)
+{
+	uint8_t error_code;
+	uint8_t loop_pdev;
+	struct dp_pdev *pdev;
+
+	for (loop_pdev = 0; loop_pdev < soc->pdev_count; loop_pdev++) {
+
+		pdev = soc->pdev_list[loop_pdev];
+		dp_aggregate_pdev_stats(pdev);
+		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
+			"Tx path Statistics:");
+
+		DP_TRACE(NONE, "from stack: %u msdus (%u bytes)",
+			pdev->stats.tx_i.rcvd.num,
+			pdev->stats.tx_i.rcvd.bytes);
+		DP_TRACE(NONE, "processed from host: %u msdus (%u bytes)",
+			pdev->stats.tx_i.processed.num,
+			pdev->stats.tx_i.processed.bytes);
+		DP_TRACE(NONE, "successfully transmitted: %u msdus (%u bytes)",
+			pdev->stats.tx.tx_success.num,
+			pdev->stats.tx.tx_success.bytes);
+
+		DP_TRACE(NONE, "Dropped in host:");
+		DP_TRACE(NONE, "Total packets dropped: %u,",
+			pdev->stats.tx_i.dropped.dropped_pkt.num);
+		DP_TRACE(NONE, "Descriptor not available: %u",
+			pdev->stats.tx_i.dropped.desc_na);
+		DP_TRACE(NONE, "Ring full: %u",
+			pdev->stats.tx_i.dropped.ring_full);
+		DP_TRACE(NONE, "Enqueue fail: %u",
+			pdev->stats.tx_i.dropped.enqueue_fail);
+		DP_TRACE(NONE, "DMA Error: %u",
+			pdev->stats.tx_i.dropped.dma_error);
+
+		DP_TRACE(NONE, "Dropped in hardware:");
+		DP_TRACE(NONE, "total packets dropped: %u",
+			pdev->stats.tx.tx_failed);
+		DP_TRACE(NONE, "mpdu age out: %u",
+			pdev->stats.tx.dropped.mpdu_age_out);
+		DP_TRACE(NONE, "firmware discard reason1: %u",
+			pdev->stats.tx.dropped.fw_discard_reason1);
+		DP_TRACE(NONE, "firmware discard reason2: %u",
+			pdev->stats.tx.dropped.fw_discard_reason2);
+		DP_TRACE(NONE, "firmware discard reason3: %u",
+			pdev->stats.tx.dropped.fw_discard_reason3);
+		DP_TRACE(NONE, "peer_invalid: %u",
+			pdev->soc->stats.tx.tx_invalid_peer.num);
+
+
+		DP_TRACE(NONE, "Tx packets sent per interrupt:");
+		DP_TRACE(NONE, "Single Packet: %u",
+			pdev->stats.tx_comp_histogram.pkts_1);
+		DP_TRACE(NONE, "2-20 Packets:  %u",
+			pdev->stats.tx_comp_histogram.pkts_2_20);
+		DP_TRACE(NONE, "21-40 Packets: %u",
+			pdev->stats.tx_comp_histogram.pkts_21_40);
+		DP_TRACE(NONE, "41-60 Packets: %u",
+			pdev->stats.tx_comp_histogram.pkts_41_60);
+		DP_TRACE(NONE, "61-80 Packets: %u",
+			pdev->stats.tx_comp_histogram.pkts_61_80);
+		DP_TRACE(NONE, "81-100 Packets: %u",
+			pdev->stats.tx_comp_histogram.pkts_81_100);
+		DP_TRACE(NONE, "101-200 Packets: %u",
+			pdev->stats.tx_comp_histogram.pkts_101_200);
+		DP_TRACE(NONE, "   201+ Packets: %u",
+			pdev->stats.tx_comp_histogram.pkts_201_plus);
+
+		DP_TRACE(NONE, "Rx path statistics");
+
+		DP_TRACE(NONE, "delivered %u msdus ( %u bytes),",
+			pdev->stats.rx.to_stack.num,
+			pdev->stats.rx.to_stack.bytes);
+		DP_TRACE(NONE, "received on reo %u msdus ( %u bytes),",
+			pdev->stats.rx.rcvd_reo.num,
+			pdev->stats.rx.rcvd_reo.bytes);
+		DP_TRACE(NONE, "intra-bss packets %u msdus ( %u bytes),",
+			pdev->stats.rx.intra_bss.num,
+			pdev->stats.rx.intra_bss.bytes);
+		DP_TRACE(NONE, "raw packets %u msdus ( %u bytes),",
+			pdev->stats.rx.raw.num,
+			pdev->stats.rx.raw.bytes);
+		DP_TRACE(NONE, "dropped: error %u msdus",
+			pdev->stats.rx.err.mic_err);
+		DP_TRACE(NONE, "peer invalid %u",
+			pdev->soc->stats.rx.err.rx_invalid_peer.num);
+
+		DP_TRACE(NONE, "Reo Statistics");
+		DP_TRACE(NONE, "rbm error: %u msdus",
+			pdev->soc->stats.rx.err.invalid_rbm);
+		DP_TRACE(NONE, "hal ring access fail: %u msdus",
+			pdev->soc->stats.rx.err.hal_ring_access_fail);
+
+		DP_TRACE(NONE, "Reo errors");
+
+		for (error_code = 0; error_code < REO_ERROR_TYPE_MAX;
+				error_code++) {
+			DP_TRACE(NONE, "Reo error number (%u): %u msdus",
+				error_code,
+				pdev->soc->stats.rx.err.reo_error[error_code]);
+		}
+
+		for (error_code = 0; error_code < MAX_RXDMA_ERRORS;
+				error_code++) {
+			DP_TRACE(NONE, "Rxdma error number (%u): %u msdus",
+				error_code,
+				pdev->soc->stats.rx.err
+				.rxdma_error[error_code]);
+		}
+
+		DP_TRACE(NONE, "Rx packets reaped per interrupt:");
+		DP_TRACE(NONE, "Single Packet: %u",
+			 pdev->stats.rx_ind_histogram.pkts_1);
+		DP_TRACE(NONE, "2-20 Packets:  %u",
+			 pdev->stats.rx_ind_histogram.pkts_2_20);
+		DP_TRACE(NONE, "21-40 Packets: %u",
+			 pdev->stats.rx_ind_histogram.pkts_21_40);
+		DP_TRACE(NONE, "41-60 Packets: %u",
+			 pdev->stats.rx_ind_histogram.pkts_41_60);
+		DP_TRACE(NONE, "61-80 Packets: %u",
+			 pdev->stats.rx_ind_histogram.pkts_61_80);
+		DP_TRACE(NONE, "81-100 Packets: %u",
+			 pdev->stats.rx_ind_histogram.pkts_81_100);
+		DP_TRACE(NONE, "101-200 Packets: %u",
+			 pdev->stats.rx_ind_histogram.pkts_101_200);
+		DP_TRACE(NONE, "   201+ Packets: %u",
+			 pdev->stats.rx_ind_histogram.pkts_201_plus);
+	}
+}
+
+/*
+ * dp_txrx_dump_stats() -  Dump statistics
+ * @value - Statistics option
+ */
+static QDF_STATUS dp_txrx_dump_stats(void *psoc, uint16_t value)
+{
+	struct dp_soc *soc =
+		(struct dp_soc *)psoc;
+	QDF_STATUS status = QDF_STATUS_SUCCESS;
+
+	if (!soc) {
+		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
+			"%s: soc is NULL", __func__);
+		return QDF_STATUS_E_INVAL;
+	}
+
+	switch (value) {
+	case CDP_TXRX_PATH_STATS:
+		dp_txrx_path_stats(soc);
+		break;
+	case CDP_TXRX_TSO_STATS:
+		/* TODO: NOT IMPLEMENTED */
+		break;
+	case CDP_DUMP_TX_FLOW_POOL_INFO:
+		/* TODO: NOT IMPLEMENTED */
+		break;
+	case CDP_TXRX_DESC_STATS:
+		/* TODO: NOT IMPLEMENTED */
+		break;
+	default:
+		status = QDF_STATUS_E_INVAL;
+		break;
+	}
+
+	return status;
+
+}
+
 static struct cdp_cmn_ops dp_ops_cmn = {
 	.txrx_soc_attach_target = dp_soc_attach_target_wifi3,
 	.txrx_vdev_attach = dp_vdev_attach_wifi3,
@@ -3119,6 +3294,7 @@ static struct cdp_cmn_ops dp_ops_cmn = {
 	.set_pdev_dscp_tid_map = dp_set_pdev_dscp_tid_map_wifi3,
 	.txrx_stats = dp_txrx_stats,
 	.txrx_set_monitor_mode = dp_vdev_set_monitor_mode,
+	.display_stats = dp_txrx_dump_stats,
 	/* TODO: Add other functions */
 };
 
@@ -3230,6 +3406,7 @@ static struct cdp_throttle_ops dp_ops_throttle = {
 };
 
 static struct cdp_mob_stats_ops dp_ops_mob_stats = {
+	/* WIFI 3.0 DP NOT IMPLEMENTED YET */
 };
 
 static struct cdp_cfg_ops dp_ops_cfg = {

+ 7 - 0
dp/wifi3.0/dp_rx.c

@@ -611,6 +611,7 @@ dp_rx_process(struct dp_soc *soc, void *hal_ring, uint32_t quota)
 	struct dp_srng *dp_rxdma_srng;
 	struct rx_desc_pool *rx_desc_pool;
 
+	DP_HIST_INIT();
 	/* Debug -- Remove later */
 	qdf_assert(soc && hal_ring);
 
@@ -625,6 +626,7 @@ dp_rx_process(struct dp_soc *soc, void *hal_ring, uint32_t quota)
 		 * Need API to convert from hal_ring pointer to
 		 * Ring Type / Ring Id combo
 		 */
+		DP_STATS_INC(soc, rx.err.hal_ring_access_fail, 1);
 		QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR,
 			FL("HAL RING Access Failed -- %p"), hal_ring);
 		hal_srng_access_end(hal_soc, hal_ring);
@@ -709,6 +711,7 @@ dp_rx_process(struct dp_soc *soc, void *hal_ring, uint32_t quota)
 
 		ampdu_flag = (mpdu_desc_info.mpdu_flags &
 				HAL_MPDU_F_AMPDU_FLAG);
+
 		DP_STATS_INCC(peer, rx.ampdu_cnt, 1, ampdu_flag);
 		DP_STATS_INCC(peer, rx.non_ampdu_cnt, 1, !(ampdu_flag));
 
@@ -723,6 +726,7 @@ dp_rx_process(struct dp_soc *soc, void *hal_ring, uint32_t quota)
 		DP_STATS_INCC(peer, rx.amsdu_cnt, 1,
 				!(amsdu_flag));
 
+		DP_HIST_PACKET_COUNT_INC(vdev->pdev->pdev_id);
 		qdf_nbuf_queue_add(&vdev->rxq, rx_desc->nbuf);
 fail:
 		dp_rx_add_to_free_desc_list(&head[rx_desc->pool_id],
@@ -732,6 +736,9 @@ fail:
 done:
 	hal_srng_access_end(hal_soc, hal_ring);
 
+	/* Update histogram statistics by looping through pdev's */
+	DP_RX_HIST_STATS_PER_PDEV();
+
 	for (mac_id = 0; mac_id < MAX_PDEV_CNT; mac_id++) {
 		/*
 		 * continue with next mac_id if no pkts were reaped

+ 11 - 1
dp/wifi3.0/dp_rx_err.c

@@ -464,6 +464,7 @@ dp_rx_err_process(struct dp_soc *soc, void *hal_ring, uint32_t quota)
 		 * Need API to convert from hal_ring pointer to
 		 * Ring Type / Ring Id combo
 		 */
+		DP_STATS_INC(soc, rx.err.hal_ring_access_fail, 1);
 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
 			FL("HAL RING Access Failed -- %p"), hal_ring);
 		goto done;
@@ -485,7 +486,6 @@ dp_rx_err_process(struct dp_soc *soc, void *hal_ring, uint32_t quota)
 		if (qdf_unlikely(rbm != HAL_RX_BUF_RBM_SW3_BM)) {
 			/* TODO */
 			/* Call appropriate handler */
-
 			DP_STATS_INC(soc, rx.err.invalid_rbm, 1);
 			QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
 			FL("Invalid RBM %d"), rbm);
@@ -505,6 +505,8 @@ dp_rx_err_process(struct dp_soc *soc, void *hal_ring, uint32_t quota)
 
 		if (mpdu_desc_info.mpdu_flags & HAL_MPDU_F_FRAGMENT) {
 			/* TODO */
+			DP_STATS_INC(soc,
+				rx.err.reo_error[HAL_MPDU_F_FRAGMENT], 1);
 			rx_bufs_used += dp_rx_frag_handle(soc,
 					ring_desc, &mpdu_desc_info,
 					&head, &tail, quota);
@@ -513,6 +515,10 @@ dp_rx_err_process(struct dp_soc *soc, void *hal_ring, uint32_t quota)
 
 		if (hal_rx_reo_is_pn_error(ring_desc)) {
 			/* TOD0 */
+			DP_STATS_INC(soc,
+				rx.err.
+				reo_error[HAL_REO_ERR_PN_CHECK_FAILED],
+				1);
 			rx_bufs_used += dp_rx_pn_error_handle(soc,
 					ring_desc, &mpdu_desc_info,
 					&head, &tail, quota);
@@ -521,6 +527,10 @@ dp_rx_err_process(struct dp_soc *soc, void *hal_ring, uint32_t quota)
 
 		if (hal_rx_reo_is_2k_jump(ring_desc)) {
 			/* TOD0 */
+			DP_STATS_INC(soc,
+				rx.err.
+				reo_error[HAL_REO_ERR_REGULAR_FRAME_2K_JUMP],
+				1);
 			rx_bufs_used += dp_rx_2k_jump_handle(soc,
 					ring_desc, &mpdu_desc_info,
 					&head, &tail, quota);

+ 4 - 0
dp/wifi3.0/dp_tx.c

@@ -1743,6 +1743,7 @@ static void dp_tx_comp_process_desc(struct dp_soc *soc,
 	uint32_t length;
 	struct dp_peer *peer;
 
+	DP_HIST_INIT();
 	desc = comp_head;
 
 	while (desc) {
@@ -1786,10 +1787,13 @@ static void dp_tx_comp_process_desc(struct dp_soc *soc,
 			DP_TX_FREE_DMA_TO_DEVICE(soc, desc->vdev, desc->nbuf);
 		}
 
+		DP_HIST_PACKET_COUNT_INC(desc->pdev->pdev_id);
+		DP_TRACE(NONE, "pdev_id: %u", desc->pdev->pdev_id);
 		next = desc->next;
 		dp_tx_desc_release(desc, desc->pool_id);
 		desc = next;
 	}
+	DP_TX_HIST_STATS_PER_PDEV();
 }
 
 /**