From de3c3a0c1173809d3cef82bf7c82c799fca90bfc Mon Sep 17 00:00:00 2001 From: Karunakar Dasineni Date: Fri, 23 Feb 2018 22:11:01 -0800 Subject: [PATCH] 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 --- dp/wifi3.0/dp_rx_mon_dest.c | 57 ++++++++++++++++++++++++------------- 1 file changed, 37 insertions(+), 20 deletions(-) diff --git a/dp/wifi3.0/dp_rx_mon_dest.c b/dp/wifi3.0/dp_rx_mon_dest.c index 26fbd421e585..3b9a07dfa59d 100644 --- a/dp/wifi3.0/dp_rx_mon_dest.c +++ b/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); + QDF_TRACE_LEVEL_DEBUG, + "[%s] msdu_ppdu_id=%x\n", + __func__, msdu_ppdu_id); - if ((*ppdu_id < msdu_ppdu_id) && (*ppdu_id > - last_ppdu_id)) { - *ppdu_id = msdu_ppdu_id; - return rx_bufs_used; + 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))