Sfoglia il codice sorgente

qcacmn: Control frame stats Rx BAR frames

Add Pdev level stats for Rx BAR frames.

Change-Id: I1cce56559fd1ffec11f873e35cb1c42b49c1c9ff
CRs-Fixed: 2110552
Pratik Gandhi 7 anni fa
parent
commit
51b6b6d21b
4 ha cambiato i file con 97 aggiunte e 8 eliminazioni
  1. 4 0
      dp/inc/cdp_txrx_cmn_struct.h
  2. 6 1
      dp/wifi3.0/dp_internal.h
  3. 70 1
      dp/wifi3.0/dp_main.c
  4. 17 6
      dp/wifi3.0/dp_peer.c

+ 4 - 0
dp/inc/cdp_txrx_cmn_struct.h

@@ -33,6 +33,7 @@
 #include "htc_api.h"
 #include "qdf_types.h"
 #include "qdf_nbuf.h"
+#include "qdf_atomic.h"
 #ifndef CONFIG_WIN
 #include <cdp_txrx_mob_def.h>
 #endif /* CONFIG_WIN */
@@ -836,6 +837,8 @@ struct cdp_rx_stats {
 	uint32_t non_amsdu_cnt;
 	/* Number of MSDUs part of AMSDU*/
 	uint32_t amsdu_cnt;
+	/* Number of bar received */
+	uint32_t bar_recv_cnt;
 };
 
 /* Tx ingress Stats */
@@ -1003,6 +1006,7 @@ struct cdp_pdev_stats {
 	struct cdp_hist_tx_comp tx_comp_histogram;
 	/* Number of Rx ring descriptors reaped per interrupt */
 	struct cdp_hist_rx_ind rx_ind_histogram;
+	qdf_atomic_t cmd_complete;
 };
 
 /**

+ 6 - 1
dp/wifi3.0/dp_internal.h

@@ -287,6 +287,10 @@ extern QDF_STATUS dp_reo_send_cmd(struct dp_soc *soc,
 extern void dp_reo_cmdlist_destroy(struct dp_soc *soc);
 extern void dp_reo_status_ring_handler(struct dp_soc *soc);
 void dp_aggregate_vdev_stats(struct dp_vdev *vdev);
+void dp_rx_tid_stats_cb(struct dp_soc *soc, void *cb_ctxt,
+	union hal_reo_status *reo_status);
+void dp_rx_bar_stats_cb(struct dp_soc *soc, void *cb_ctxt,
+		union hal_reo_status *reo_status);
 uint16_t dp_tx_me_send_convert_ucast(struct cdp_vdev *vdev_handle,
 		qdf_nbuf_t nbuf, uint8_t newmac[][DP_MAC_ADDR_LEN],
 		uint8_t new_mac_cnt);
@@ -298,7 +302,8 @@ QDF_STATUS dp_h2t_ext_stats_msg_send(struct dp_pdev *pdev,
 		uint32_t config_param_1, uint32_t config_param_2,
 		uint32_t config_param_3);
 void dp_htt_stats_print_tag(uint8_t tag_type, uint32_t *tag_buf);
-int dp_peer_rxtid_stats(struct dp_peer *peer);
+void dp_peer_rxtid_stats(struct dp_peer *peer, void (*callback_fn),
+		void *cb_ctxt);
 void dp_set_pn_check_wifi3(struct cdp_vdev *vdev_handle,
 	struct cdp_peer *peer_handle, enum cdp_sec_type sec_type,
 	 uint32_t *rx_pn);

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

@@ -3745,6 +3745,69 @@ void dp_peer_set_mesh_rx_filter(struct cdp_vdev *vdev_hdl, uint32_t val)
 }
 #endif
 
+/*
+ * dp_aggregate_pdev_ctrl_frames_stats()- function to agreegate peer stats
+ * Current scope is bar recieved count
+ *
+ * @pdev_handle: DP_PDEV handle
+ *
+ * Return: void
+ */
+#define STATS_PROC_TIMEOUT        (HZ/10)
+
+static void
+dp_aggregate_pdev_ctrl_frames_stats(struct dp_pdev *pdev)
+{
+	struct dp_vdev *vdev;
+	struct dp_peer *peer;
+	uint32_t waitcnt;
+
+	TAILQ_FOREACH(vdev, &pdev->vdev_list, vdev_list_elem) {
+		TAILQ_FOREACH(peer, &vdev->peer_list, peer_list_elem) {
+			if (!peer) {
+				QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
+					FL("DP Invalid Peer refernce"));
+				return;
+			}
+			waitcnt = 0;
+			dp_peer_rxtid_stats(peer, dp_rx_bar_stats_cb, pdev);
+			while (!(qdf_atomic_read(&(pdev->stats.cmd_complete)))
+				&& waitcnt < 10) {
+				schedule_timeout_interruptible(
+						STATS_PROC_TIMEOUT);
+				waitcnt++;
+			}
+			qdf_atomic_set(&(pdev->stats.cmd_complete), 0);
+		}
+	}
+}
+
+/**
+ * dp_rx_bar_stats_cb(): BAR received stats callback
+ * @soc: SOC handle
+ * @cb_ctxt: Call back context
+ * @reo_status: Reo status
+ *
+ * return: void
+ */
+void dp_rx_bar_stats_cb(struct dp_soc *soc, void *cb_ctxt,
+	union hal_reo_status *reo_status)
+{
+	struct dp_pdev *pdev = (struct dp_pdev *)cb_ctxt;
+	struct hal_reo_queue_status *queue_status = &(reo_status->queue_status);
+
+	if (queue_status->header.status != HAL_REO_CMD_SUCCESS) {
+		DP_TRACE_STATS(FATAL, "REO stats failure %d \n",
+			queue_status->header.status);
+		qdf_atomic_set(&(pdev->stats.cmd_complete), 1);
+		return;
+	}
+
+	pdev->stats.rx.bar_recv_cnt += queue_status->bar_rcvd_cnt;
+	qdf_atomic_set(&(pdev->stats.cmd_complete), 1);
+
+}
+
 /**
  * dp_aggregate_vdev_stats(): Consolidate stats at VDEV level
  * @vdev: DP VDEV handle
@@ -4104,6 +4167,12 @@ dp_print_pdev_rx_stats(struct dp_pdev *pdev)
 			pdev->stats.replenish.rxdma_err);
 	DP_PRINT_STATS("	Desc Alloc Failed: = %d",
 			pdev->stats.err.desc_alloc_fail);
+
+	/* Get bar_recv_cnt */
+	dp_aggregate_pdev_ctrl_frames_stats(pdev);
+	DP_PRINT_STATS("BAR Received Count: = %d",
+			pdev->stats.rx.bar_recv_cnt);
+
 }
 
 /**
@@ -4690,7 +4759,7 @@ dp_get_host_peer_stats(struct cdp_pdev *pdev_handle, char *mac_addr)
 	}
 
 	dp_print_peer_stats(peer);
-	dp_peer_rxtid_stats(peer);
+	dp_peer_rxtid_stats(peer, dp_rx_tid_stats_cb, NULL);
 	return;
 }
 

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

@@ -625,7 +625,7 @@ int dp_peer_find_attach(struct dp_soc *soc)
 	return 0; /* success */
 }
 
-static void dp_rx_tid_stats_cb(struct dp_soc *soc, void *cb_ctxt,
+void dp_rx_tid_stats_cb(struct dp_soc *soc, void *cb_ctxt,
 	union hal_reo_status *reo_status)
 {
 	struct dp_rx_tid *rx_tid = (struct dp_rx_tid *)cb_ctxt;
@@ -1991,15 +1991,21 @@ uint8_t dp_get_peer_mac_addr_frm_id(struct cdp_soc_t *soc_handle,
 /**
  * dp_peer_rxtid_stats: Retried Rx TID (REO queue) stats from HW
  * @peer: DP peer handle
+ * @dp_stats_cmd_cb: REO command callback function
+ * @cb_ctxt: Callback context
  *
- * Return: 0 on success, error code on failure
+ * Return: none
  */
-int dp_peer_rxtid_stats(struct dp_peer *peer)
+void dp_peer_rxtid_stats(struct dp_peer *peer, void (*dp_stats_cmd_cb),
+			void *cb_ctxt)
 {
 	struct dp_soc *soc = peer->vdev->pdev->soc;
 	struct hal_reo_cmd_params params;
 	int i;
 
+	if (!dp_stats_cmd_cb)
+		return;
+
 	qdf_mem_zero(&params, sizeof(params));
 	for (i = 0; i < DP_MAX_TIDS; i++) {
 		struct dp_rx_tid *rx_tid = &peer->rx_tid[i];
@@ -2009,8 +2015,14 @@ int dp_peer_rxtid_stats(struct dp_peer *peer)
 				rx_tid->hw_qdesc_paddr & 0xffffffff;
 			params.std.addr_hi =
 				(uint64_t)(rx_tid->hw_qdesc_paddr) >> 32;
-			dp_reo_send_cmd(soc, CMD_GET_QUEUE_STATS, &params,
-				dp_rx_tid_stats_cb, rx_tid);
+
+			if (cb_ctxt) {
+				dp_reo_send_cmd(soc, CMD_GET_QUEUE_STATS,
+					&params, dp_stats_cmd_cb, cb_ctxt);
+			} else {
+				dp_reo_send_cmd(soc, CMD_GET_QUEUE_STATS,
+					&params, dp_stats_cmd_cb, rx_tid);
+			}
 
 			/* Flush REO descriptor from HW cache to update stats
 			 * in descriptor memory. This is to help debugging */
@@ -2024,5 +2036,4 @@ int dp_peer_rxtid_stats(struct dp_peer *peer)
 				NULL);
 		}
 	}
-	return 0;
 }