From 8ff658e86f68bc38a9cfa476f5bc79aaaf1c1d97 Mon Sep 17 00:00:00 2001 From: Yeshwanth Sriram Guntuka Date: Thu, 22 Oct 2020 17:34:39 +0530 Subject: [PATCH] qcacmn: Use the appropriate desc pool for mon status ring In dp_mon_status_srng_drop_for_mac, the rx_desc pool used for status ring is dest ring desc pool which is not the appropriate one. Fix is to use the appropriate desc pool for mon status ring. Change-Id: I6f178354789212b375a7a541366bef590a925568 CRs-Fixed: 2800658 --- dp/inc/cdp_txrx_mon_struct.h | 1 + dp/wifi3.0/dp_rx_mon_dest.c | 21 ++++++++++++++++++--- dp/wifi3.0/dp_rx_mon_status.c | 3 +-- 3 files changed, 20 insertions(+), 5 deletions(-) diff --git a/dp/inc/cdp_txrx_mon_struct.h b/dp/inc/cdp_txrx_mon_struct.h index 008dbecb7fab..6eb7e64ca042 100644 --- a/dp/inc/cdp_txrx_mon_struct.h +++ b/dp/inc/cdp_txrx_mon_struct.h @@ -261,5 +261,6 @@ struct cdp_pdev_mon_stats { uint32_t dest_ppdu_drop; uint32_t mon_link_desc_invalid; uint32_t mon_rx_desc_invalid; + uint32_t mon_nbuf_sanity_err; }; #endif diff --git a/dp/wifi3.0/dp_rx_mon_dest.c b/dp/wifi3.0/dp_rx_mon_dest.c index 019d00aa37f8..6d923e9f71df 100644 --- a/dp/wifi3.0/dp_rx_mon_dest.c +++ b/dp/wifi3.0/dp_rx_mon_dest.c @@ -2090,11 +2090,11 @@ dp_mon_dest_srng_drop_for_mac(struct dp_pdev *pdev, uint32_t mac_id) while ((rxdma_dst_ring_desc = hal_srng_dst_peek(hal_soc, mon_dst_srng)) && reap_cnt < MON_DROP_REAP_LIMIT) { - msdu_count = 0; + + hal_rx_reo_ent_buf_paddr_get(rxdma_dst_ring_desc, + &buf_info, &msdu_count); do { - hal_rx_reo_ent_buf_paddr_get(rxdma_dst_ring_desc, - &buf_info, &msdu_count); rx_msdu_link_desc = dp_rx_cookie_2_mon_link_desc(pdev, buf_info, mac_id); @@ -2108,6 +2108,7 @@ dp_mon_dest_srng_drop_for_mac(struct dp_pdev *pdev, uint32_t mac_id) for (i = 0; i < num_msdus; i++) { struct dp_rx_desc *rx_desc; + qdf_dma_addr_t buf_paddr; rx_desc = dp_rx_get_mon_desc(soc, msdu_list.sw_cookie[i]); @@ -2119,6 +2120,16 @@ dp_mon_dest_srng_drop_for_mac(struct dp_pdev *pdev, uint32_t mac_id) } nbuf = DP_RX_MON_GET_NBUF_FROM_DESC(rx_desc); + buf_paddr = + dp_rx_mon_get_paddr_from_desc(rx_desc); + + if (qdf_unlikely(!rx_desc->in_use || !nbuf || + msdu_list.paddr[i] != + buf_paddr)) { + pdev->rx_mon_stats. + mon_nbuf_sanity_err++; + continue; + } rx_bufs_used++; if (!rx_desc->unmapped) { @@ -2130,6 +2141,10 @@ dp_mon_dest_srng_drop_for_mac(struct dp_pdev *pdev, uint32_t mac_id) qdf_nbuf_free(nbuf); dp_rx_add_to_free_desc_list(&head, &tail, rx_desc); + + if (!(msdu_list.msdu_info[i].msdu_flags & + HAL_MSDU_F_MSDU_CONTINUATION)) + msdu_count--; } /* diff --git a/dp/wifi3.0/dp_rx_mon_status.c b/dp/wifi3.0/dp_rx_mon_status.c index 3e9593deb9c1..30c3163526dc 100644 --- a/dp/wifi3.0/dp_rx_mon_status.c +++ b/dp/wifi3.0/dp_rx_mon_status.c @@ -2466,8 +2466,7 @@ dp_mon_status_srng_drop_for_mac(struct dp_pdev *pdev, uint32_t mac_id, struct dp_rx_desc *rx_desc; union dp_rx_desc_list_elem_t *rx_desc_elem; - rx_desc_pool = dp_rx_get_mon_desc_pool(soc, mac_id, - pdev->pdev_id); + rx_desc_pool = &soc->rx_desc_status[mac_id]; qdf_spin_lock_bh(&rx_desc_pool->lock);