瀏覽代碼

qcacmn: Add history for REO queue descriptor events

Add history to log REO queue desc update and free events.

Change-Id: If2992ff1256fad49ea4ea6bd90b6dfe4a63d2bc4
CRs-Fixed: 2926919
Karthik Kantamneni 4 年之前
父節點
當前提交
26086e7971
共有 3 個文件被更改,包括 66 次插入0 次删除
  1. 49 0
      dp/wifi3.0/dp_peer.c
  2. 14 0
      dp/wifi3.0/dp_peer.h
  3. 3 0
      dp/wifi3.0/dp_types.h

+ 49 - 0
dp/wifi3.0/dp_peer.c

@@ -41,6 +41,12 @@
 #include "dp_hist.h"
 #endif
 
+#ifdef REO_QDESC_HISTORY
+#define REO_QDESC_HISTORY_SIZE 512
+uint64_t reo_qdesc_history_idx;
+struct reo_qdesc_event reo_qdesc_history[REO_QDESC_HISTORY_SIZE];
+#endif
+
 #ifdef FEATURE_WDS
 static inline bool
 dp_peer_ast_free_in_unmap_supported(struct dp_soc *soc,
@@ -77,6 +83,42 @@ static void dp_soc_wds_detach(struct dp_soc *soc)
 }
 #endif
 
+#ifdef REO_QDESC_HISTORY
+static inline void
+dp_rx_reo_qdesc_history_add(struct reo_desc_list_node *free_desc,
+			    enum reo_qdesc_event_type type)
+{
+	struct reo_qdesc_event *evt;
+	struct dp_rx_tid *rx_tid = &free_desc->rx_tid;
+	uint32_t idx;
+
+	reo_qdesc_history_idx++;
+	idx = (reo_qdesc_history_idx & (REO_QDESC_HISTORY_SIZE - 1));
+
+	evt = &reo_qdesc_history[idx];
+
+	qdf_mem_copy(evt->peer_mac, free_desc->peer_mac, QDF_MAC_ADDR_SIZE);
+	evt->qdesc_addr = rx_tid->hw_qdesc_paddr;
+	evt->ts = qdf_get_log_timestamp();
+	evt->type = type;
+}
+
+#define DP_RX_REO_QDESC_GET_MAC(freedesc, peer) \
+	qdf_mem_copy(freedesc->peer_mac, peer->mac_addr.raw, QDF_MAC_ADDR_SIZE)
+
+#define DP_RX_REO_QDESC_UPDATE_EVT(free_desc) \
+	dp_rx_reo_qdesc_history_add((free_desc), REO_QDESC_UPDATE_CB)
+
+#define DP_RX_REO_QDESC_FREE_EVT(free_desc) \
+	dp_rx_reo_qdesc_history_add((free_desc), REO_QDESC_FREE)
+#else
+#define DP_RX_REO_QDESC_GET_MAC(freedesc, peer)
+
+#define DP_RX_REO_QDESC_UPDATE_EVT(free_desc)
+
+#define DP_RX_REO_QDESC_FREE_EVT(free_desc)
+#endif
+
 static inline void
 dp_set_ssn_valid_flag(struct hal_reo_cmd_params *params,
 					uint8_t valid)
@@ -2492,6 +2534,9 @@ static void dp_reo_desc_free(struct dp_soc *soc, void *cb_ctxt,
 	dp_peer_info("%pK: %lu hw_qdesc_paddr: %pK, tid:%d", soc,
 		     curr_ts, (void *)(rx_tid->hw_qdesc_paddr),
 		     rx_tid->tid);
+
+	DP_RX_REO_QDESC_FREE_EVT(freedesc);
+
 	qdf_mem_unmap_nbytes_single(soc->osdev,
 		rx_tid->hw_qdesc_paddr,
 		QDF_DMA_BIDIRECTIONAL,
@@ -2831,6 +2876,8 @@ void dp_rx_tid_delete_cb(struct dp_soc *soc, void *cb_ctxt,
 	struct hal_reo_cmd_params params;
 	bool flush_failure = false;
 
+	DP_RX_REO_QDESC_UPDATE_EVT(freedesc);
+
 	if (reo_status->rx_queue_status.header.status == HAL_REO_CMD_DRAIN) {
 		qdf_mem_zero(reo_status, sizeof(*reo_status));
 		reo_status->fl_cache_status.header.status = HAL_REO_CMD_DRAIN;
@@ -2982,6 +3029,8 @@ static int dp_rx_tid_delete_wifi3(struct dp_peer *peer, int tid)
 
 	qdf_mem_zero(&params, sizeof(params));
 
+	DP_RX_REO_QDESC_GET_MAC(freedesc, peer);
+
 	params.std.need_status = 1;
 	params.std.addr_lo = rx_tid->hw_qdesc_paddr & 0xffffffff;
 	params.std.addr_hi = (uint64_t)(rx_tid->hw_qdesc_paddr) >> 32;

+ 14 - 0
dp/wifi3.0/dp_peer.h

@@ -40,6 +40,20 @@
 	__QDF_TRACE_FL(QDF_TRACE_LEVEL_INFO_HIGH, QDF_MODULE_ID_DP_PEER, ## params)
 #define dp_peer_debug(params...) QDF_TRACE_DEBUG(QDF_MODULE_ID_DP_PEER, params)
 
+#ifdef REO_QDESC_HISTORY
+enum reo_qdesc_event_type {
+	REO_QDESC_UPDATE_CB = 0,
+	REO_QDESC_FREE,
+};
+
+struct reo_qdesc_event {
+	qdf_dma_addr_t qdesc_addr;
+	uint64_t ts;
+	enum reo_qdesc_event_type type;
+	uint8_t peer_mac[QDF_MAC_ADDR_SIZE];
+};
+#endif
+
 typedef void dp_peer_iter_func(struct dp_soc *soc, struct dp_peer *peer,
 			       void *arg);
 void dp_peer_unref_delete(struct dp_peer *peer, enum dp_mod_id id);

+ 3 - 0
dp/wifi3.0/dp_types.h

@@ -821,6 +821,9 @@ struct reo_desc_list_node {
 	struct dp_rx_tid rx_tid;
 	bool resend_update_reo_cmd;
 	uint32_t pending_ext_desc_size;
+#ifdef REO_QDESC_HISTORY
+	uint8_t peer_mac[QDF_MAC_ADDR_SIZE];
+#endif
 };
 
 #ifdef WLAN_FEATURE_DP_EVENT_HISTORY