Browse Source

qcacmn: add duplicate link desc check when refill

Same back to back link descriptor address/cookie is observed in
WBM idle link desc ring.
add duplicate link desc check when host
refill link descriptor to WBM through SW2WBM release ring,
also REO reinject ring.

Change-Id: Iaf9defd87670776fa9488d7f650efa3c08fefa60
CRs-Fixed: 2739879
Jinwei Chen 5 năm trước cách đây
mục cha
commit
d555d146a4
5 tập tin đã thay đổi với 61 bổ sung0 xóa
  1. 14 0
      dp/wifi3.0/dp_rx.h
  2. 7 0
      dp/wifi3.0/dp_rx_defrag.c
  3. 26 0
      dp/wifi3.0/dp_rx_err.c
  4. 2 0
      dp/wifi3.0/dp_stats.c
  5. 12 0
      dp/wifi3.0/dp_types.h

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

@@ -1446,4 +1446,18 @@ static inline void dp_rx_wbm_sg_list_deinit(struct dp_soc *soc)
 #define DP_RX_PROCESS_NBUF(soc, head, tail, ebuf_head, ebuf_tail, rx_desc) \
 	DP_RX_LIST_APPEND(head, tail, rx_desc->nbuf)
 #endif /* WLAN_FEATURE_RX_PREALLOC_BUFFER_POOL */
+
+/*
+ * dp_rx_link_desc_refill_duplicate_check() - check if link desc duplicate
+					      to refill
+ * @soc: DP SOC handle
+ * @buf_info: the last link desc buf info
+ * @ring_buf_info: current buf address pointor including link desc
+ *
+ * return: none.
+ */
+void dp_rx_link_desc_refill_duplicate_check(
+				struct dp_soc *soc,
+				struct hal_buf_info *buf_info,
+				hal_buff_addrinfo_t ring_buf_info);
 #endif /* _DP_RX_H */

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

@@ -1071,6 +1071,13 @@ static QDF_STATUS dp_rx_defrag_reo_reinject(struct dp_peer *peer,
 						peer->rx_tid[tid].array;
 	qdf_nbuf_t nbuf_head;
 	struct rx_desc_pool *rx_desc_pool = NULL;
+	void *buf_addr_info = HAL_RX_REO_BUF_ADDR_INFO_GET(dst_ring_desc);
+
+	/* do duplicate link desc address check */
+	dp_rx_link_desc_refill_duplicate_check(
+				soc,
+				&soc->last_op_info.reo_reinject_link_desc,
+				buf_addr_info);
 
 	nbuf_head = dp_ipa_handle_rx_reo_reinject(soc, head);
 	if (qdf_unlikely(!nbuf_head)) {

+ 26 - 0
dp/wifi3.0/dp_rx_err.c

@@ -156,6 +156,26 @@ static inline bool dp_rx_mcast_echo_check(struct dp_soc *soc,
 	return false;
 }
 
+void dp_rx_link_desc_refill_duplicate_check(
+				struct dp_soc *soc,
+				struct hal_buf_info *buf_info,
+				hal_buff_addrinfo_t ring_buf_info)
+{
+	struct hal_buf_info current_link_desc_buf_info = { 0 };
+
+	/* do duplicate link desc address check */
+	hal_rx_buffer_addr_info_get_paddr(ring_buf_info,
+					  &current_link_desc_buf_info);
+	if (qdf_unlikely(current_link_desc_buf_info.paddr ==
+			 buf_info->paddr)) {
+		dp_info_rl("duplicate link desc addr: %llu, cookie: 0x%x",
+			   current_link_desc_buf_info.paddr,
+			   current_link_desc_buf_info.sw_cookie);
+		DP_STATS_INC(soc, rx.err.dup_refill_link_desc, 1);
+	}
+	*buf_info = current_link_desc_buf_info;
+}
+
 /**
  * dp_rx_link_desc_return_by_addr - Return a MPDU link descriptor to
  *					(WBM) by address
@@ -182,6 +202,12 @@ dp_rx_link_desc_return_by_addr(struct dp_soc *soc,
 		return status;
 	}
 
+	/* do duplicate link desc address check */
+	dp_rx_link_desc_refill_duplicate_check(
+				soc,
+				&soc->last_op_info.wbm_rel_link_desc,
+				link_desc_addr);
+
 	if (qdf_unlikely(hal_srng_access_start(hal_soc, wbm_rel_srng))) {
 
 		/* TODO */

+ 2 - 0
dp/wifi3.0/dp_stats.c

@@ -6057,6 +6057,8 @@ void dp_txrx_path_stats(struct dp_soc *soc)
 			       pdev->soc->stats.rx.err.invalid_link_cookie);
 		DP_PRINT_STATS("Rx nbuf sanity fails: %d",
 			       pdev->soc->stats.rx.err.nbuf_sanity_fail);
+		DP_PRINT_STATS("Rx refill duplicate link desc: %d",
+			       pdev->soc->stats.rx.err.dup_refill_link_desc);
 
 		DP_PRINT_STATS("Reo Statistics");
 		DP_PRINT_STATS("near_full: %u ", soc->stats.rx.near_full);

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

@@ -859,6 +859,8 @@ struct dp_soc_stats {
 			uint32_t invalid_link_cookie;
 			/* Nbuf sanity failure */
 			uint32_t nbuf_sanity_fail;
+			/* Duplicate link desc refilled */
+			uint32_t dup_refill_link_desc;
 		} err;
 
 		/* packet count per core - per ring */
@@ -1030,6 +1032,14 @@ struct dp_rx_reinject_history {
 	struct dp_buf_info_record entry[DP_RX_REINJECT_HIST_MAX];
 };
 
+/* structure to record recent operation related variable */
+struct dp_last_op_info {
+	/* last link desc buf info through WBM release ring */
+	struct hal_buf_info wbm_rel_link_desc;
+	/* last link desc buf info through REO reinject ring */
+	struct hal_buf_info reo_reinject_link_desc;
+};
+
 /* SOC level structure for data path */
 struct dp_soc {
 	/**
@@ -1432,6 +1442,8 @@ struct dp_soc {
 
 	/* RX buffer params */
 	struct rx_buff_pool rx_buff_pool[MAX_PDEV_CNT];
+	/* Save recent operation related variable */
+	struct dp_last_op_info last_op_info;
 };
 
 #ifdef IPA_OFFLOAD