Browse Source

qcacmn: Enabled asserts in Rx error path

Enable qdf_assert on rx error path to detect corruption issues.
Also add a magic word in rx_desc and compare on rx indications
to detect any corruption issues early in the path

Change-Id: I4df1220f19c891928f9687f40de6f2118b530db2
CRs-Fixed: 2004658
Pamidipati, Vijay 7 years ago
parent
commit
5379474f69
4 changed files with 55 additions and 22 deletions
  1. 14 1
      dp/wifi3.0/dp_rx.c
  2. 5 0
      dp/wifi3.0/dp_rx.h
  3. 36 17
      dp/wifi3.0/dp_rx_err.c
  4. 0 4
      dp/wifi3.0/hal_rx.h

+ 14 - 1
dp/wifi3.0/dp_rx.c

@@ -29,6 +29,19 @@
 #include "dp_internal.h"
 #include "dp_rx_mon.h"
 
+#ifdef RX_DESC_DEBUG_CHECK
+static inline void dp_rx_desc_prep(struct dp_rx_desc *rx_desc, qdf_nbuf_t nbuf)
+{
+	rx_desc->magic = DP_RX_DESC_MAGIC;
+	rx_desc->nbuf = nbuf;
+}
+#else
+static inline void dp_rx_desc_prep(struct dp_rx_desc *rx_desc, qdf_nbuf_t nbuf)
+{
+	rx_desc->nbuf = nbuf;
+}
+#endif
+
 /*
  * dp_rx_buffers_replenish() - replenish rxdma ring with rx nbufs
  *			       called during dp rx initialization
@@ -160,7 +173,7 @@ QDF_STATUS dp_rx_buffers_replenish(struct dp_soc *dp_soc, uint32_t mac_id,
 
 		next = (*desc_list)->next;
 
-		(*desc_list)->rx_desc.nbuf = rx_netbuf;
+		dp_rx_desc_prep(&((*desc_list)->rx_desc), rx_netbuf);
 
 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_DEBUG,
 				"rx_netbuf=%p, buf=%p, paddr=0x%llx, cookie=%d\n",

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

@@ -45,6 +45,8 @@
 	(((_peer_metadata) & DP_PEER_METADATA_VDEV_ID_MASK)	\
 			>> DP_PEER_METADATA_VDEV_ID_SHIFT)
 
+#define DP_RX_DESC_MAGIC 0xdec0de
+
 /**
  * struct dp_rx_desc
  *
@@ -65,6 +67,9 @@ struct dp_rx_desc {
 	uint8_t *rx_buf_start;
 	uint32_t cookie;
 	uint8_t	 pool_id;
+#ifdef RX_DESC_DEBUG_CHECK
+	uint32_t magic;
+#endif
 };
 
 #define RX_DESC_COOKIE_INDEX_SHIFT		0

+ 36 - 17
dp/wifi3.0/dp_rx_err.c

@@ -31,6 +31,22 @@
 #include "dp_rx_defrag.h"
 #include <enet.h>	/* LLC_SNAP_HDR_LEN */
 
+#ifdef RX_DESC_DEBUG_CHECK
+static inline bool dp_rx_desc_check_magic(struct dp_rx_desc *rx_desc)
+{
+	if (qdf_unlikely(rx_desc->magic != DP_RX_DESC_MAGIC)) {
+		return false;
+	}
+	rx_desc->magic = 0;
+	return true;
+}
+#else
+static inline bool dp_rx_desc_check_magic(struct dp_rx_desc *rx_desc)
+{
+	return true;
+}
+#endif
+
 /**
  * dp_rx_msdus_drop() - Drops all MSDU's per MPDU
  *
@@ -46,10 +62,10 @@
  * Return: uint32_t: No. of elements processed
  */
 static uint32_t dp_rx_msdus_drop(struct dp_soc *soc, void *ring_desc,
-		 struct hal_rx_mpdu_desc_info *mpdu_desc_info,
-		 union dp_rx_desc_list_elem_t **head,
-		 union dp_rx_desc_list_elem_t **tail,
-		 uint32_t quota)
+		struct hal_rx_mpdu_desc_info *mpdu_desc_info,
+		union dp_rx_desc_list_elem_t **head,
+		union dp_rx_desc_list_elem_t **tail,
+		uint32_t quota)
 {
 	uint32_t rx_bufs_used = 0;
 	void *link_desc_va;
@@ -72,6 +88,13 @@ static uint32_t dp_rx_msdus_drop(struct dp_soc *soc, void *ring_desc,
 
 		qdf_assert(rx_desc);
 
+		if (!dp_rx_desc_check_magic(rx_desc)) {
+			QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
+					FL("Invalid rx_desc cookie=%d"),
+					msdu_list.sw_cookie[i]);
+			return rx_bufs_used;
+		}
+
 		rx_bufs_used++;
 
 		/* Just free the buffers */
@@ -653,12 +676,20 @@ dp_rx_wbm_err_process(struct dp_soc *soc, void *hal_ring, uint32_t quota)
 		rx_desc = dp_rx_cookie_2_va_rxdma_buf(soc, rx_buf_cookie);
 		qdf_assert(rx_desc);
 
+		if (!dp_rx_desc_check_magic(rx_desc)) {
+			QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
+					FL("Invalid rx_desc cookie=%d"),
+					rx_buf_cookie);
+			continue;
+		}
+
 		/* XXX */
 		buf_type = HAL_RX_WBM_BUF_TYPE_GET(ring_desc);
+
 		/*
 		 * For WBM ring, expect only MSDU buffers
 		 */
-		qdf_assert(buf_type == HAL_RX_WBM_BUF_TYPE_REL_BUF);
+		qdf_assert_always(buf_type == HAL_RX_WBM_BUF_TYPE_REL_BUF);
 
 		if (wbm_err_src == HAL_RX_WBM_ERR_SRC_REO) {
 
@@ -726,18 +757,6 @@ dp_rx_wbm_err_process(struct dp_soc *soc, void *hal_ring, uint32_t quota)
 			}
 		} else {
 			/* Should not come here */
-			rx_buf_cookie = HAL_RX_WBM_BUF_COOKIE_GET(ring_desc);
-			rx_desc = dp_rx_cookie_2_va_rxdma_buf(soc, rx_buf_cookie);
-
-			qdf_assert(rx_desc);
-
-			qdf_nbuf_unmap_single(soc->osdev, rx_desc->nbuf,
-						QDF_DMA_BIDIRECTIONAL);
-
-			rx_desc->rx_buf_start = qdf_nbuf_data(rx_desc->nbuf);
-			hal_rx_dump_pkt_tlvs(rx_desc->rx_buf_start,
-							QDF_TRACE_LEVEL_INFO);
-
 			qdf_assert(0);
 		}
 

+ 0 - 4
dp/wifi3.0/hal_rx.h

@@ -1957,10 +1957,6 @@ enum hal_rx_wbm_rxdma_push_reason {
 	HAL_RX_BUF_COOKIE_GET(&((struct wbm_release_ring *) \
 	wbm_desc)->released_buff_or_desc_addr_info)
 
-#define HAL_RX_WBM_BUF_COOKIE_GET(wbm_desc) \
-	HAL_RX_BUF_COOKIE_GET(&((struct wbm_release_ring *) \
-	wbm_desc)->released_buff_or_desc_addr_info)
-
 /**
  * hal_rx_dump_rx_attention_tlv: dump RX attention TLV in structured
  *				 humman readable format.