浏览代码

qcacmn: Ignore monitor pkt ring TLVs during flush

TLVs in monitor packet buffers might be incomplete during
RXDMA flush, and should not be used to check PPDU IDs against
status ring PPDU IDs. This was causing stall in monitor
destination ring processing.

Change-Id: I99729beb65936477ea42cf5939da2036f36ee303
CRs-Fixed: 2193051
Karunakar Dasineni 7 年之前
父节点
当前提交
de3c3a0c11
共有 1 个文件被更改,包括 38 次插入21 次删除
  1. 38 21
      dp/wifi3.0/dp_rx_mon_dest.c

+ 38 - 21
dp/wifi3.0/dp_rx_mon_dest.c

@@ -144,6 +144,7 @@ dp_rx_mon_mpdu_pop(struct dp_soc *soc, uint32_t mac_id,
 	uint32_t i;
 	uint32_t total_frag_len = 0, frag_len = 0;
 	bool is_frag, is_first_msdu;
+	bool check_ppdu_id = true;
 
 	msdu_len = 0;
 	msdu = 0;
@@ -154,6 +155,13 @@ dp_rx_mon_mpdu_pop(struct dp_soc *soc, uint32_t mac_id,
 	hal_rx_reo_ent_buf_paddr_get(rxdma_dst_ring_desc, &buf_info,
 		&p_last_buf_addr_info, &msdu_cnt);
 
+	if ((hal_rx_reo_ent_rxdma_push_reason_get(rxdma_dst_ring_desc) ==
+		HAL_RX_WBM_RXDMA_PSH_RSN_ERROR) &&
+		qdf_unlikely(hal_rx_reo_ent_rxdma_error_code_get(
+		rxdma_dst_ring_desc) == HAL_RXDMA_ERR_FLUSH_REQUEST)) {
+		check_ppdu_id = false;
+	}
+
 	is_frag = false;
 	is_first_msdu = true;
 
@@ -184,30 +192,39 @@ dp_rx_mon_mpdu_pop(struct dp_soc *soc, uint32_t mac_id,
 
 			rx_desc_tlv = HAL_RX_MON_DEST_GET_DESC(data);
 
-			if (is_first_msdu) {
-				msdu_ppdu_id =
-				HAL_RX_MON_HW_DESC_GET_PPDUID_GET(rx_desc_tlv);
-				is_first_msdu = false;
-			}
-
 			QDF_TRACE(QDF_MODULE_ID_DP,
-					  QDF_TRACE_LEVEL_DEBUG,
-					  "[%s][%d] i=%d, ppdu_id=%x, msdu_ppdu_id=%x last_ppdu_id=%x num msdus = %u",
-					  __func__, __LINE__, i,
-					  *ppdu_id, msdu_ppdu_id, last_ppdu_id,
-					  num_msdus);
+				QDF_TRACE_LEVEL_DEBUG,
+				"[%s] i=%d, ppdu_id=%x, "
+				"last_ppdu_id=%x num_msdus = %u\n",
+				__func__, i, *ppdu_id,
+				last_ppdu_id, num_msdus);
+
+			if (qdf_likely(check_ppdu_id)) {
+				if (is_first_msdu) {
+					msdu_ppdu_id =
+					HAL_RX_MON_HW_DESC_GET_PPDUID_GET(
+						rx_desc_tlv);
+					is_first_msdu = false;
+				}
 
-			if (*ppdu_id > msdu_ppdu_id)
 				QDF_TRACE(QDF_MODULE_ID_DP,
-						  QDF_TRACE_LEVEL_WARN,
-						  "[%s][%d] ppdu_id=%d msdu_ppdu_id=%d",
-						  __func__, __LINE__, *ppdu_id,
-						  msdu_ppdu_id);
-
-			if ((*ppdu_id < msdu_ppdu_id) && (*ppdu_id >
-				last_ppdu_id)) {
-				*ppdu_id = msdu_ppdu_id;
-				return rx_bufs_used;
+					QDF_TRACE_LEVEL_DEBUG,
+					"[%s] msdu_ppdu_id=%x\n",
+					__func__, msdu_ppdu_id);
+
+				if (*ppdu_id > msdu_ppdu_id)
+					QDF_TRACE(QDF_MODULE_ID_DP,
+						QDF_TRACE_LEVEL_WARN,
+						"[%s][%d] ppdu_id=%d "
+						"msdu_ppdu_id=%d\n",
+						__func__, __LINE__, *ppdu_id,
+						msdu_ppdu_id);
+
+				if ((*ppdu_id < msdu_ppdu_id) && (*ppdu_id >
+					last_ppdu_id)) {
+					*ppdu_id = msdu_ppdu_id;
+					return rx_bufs_used;
+				}
 			}
 
 			if (hal_rx_desc_is_first_msdu(rx_desc_tlv))