From d555d146a472660824a074087024a3564538cd40 Mon Sep 17 00:00:00 2001 From: Jinwei Chen Date: Tue, 28 Jul 2020 15:03:10 +0800 Subject: [PATCH] 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 --- dp/wifi3.0/dp_rx.h | 14 ++++++++++++++ dp/wifi3.0/dp_rx_defrag.c | 7 +++++++ dp/wifi3.0/dp_rx_err.c | 26 ++++++++++++++++++++++++++ dp/wifi3.0/dp_stats.c | 2 ++ dp/wifi3.0/dp_types.h | 12 ++++++++++++ 5 files changed, 61 insertions(+) diff --git a/dp/wifi3.0/dp_rx.h b/dp/wifi3.0/dp_rx.h index a089edf0bf..ecf3a9df97 100644 --- a/dp/wifi3.0/dp_rx.h +++ b/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 */ diff --git a/dp/wifi3.0/dp_rx_defrag.c b/dp/wifi3.0/dp_rx_defrag.c index 9de7599f5b..1a3c83b95b 100644 --- a/dp/wifi3.0/dp_rx_defrag.c +++ b/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)) { diff --git a/dp/wifi3.0/dp_rx_err.c b/dp/wifi3.0/dp_rx_err.c index 5a6edc3d4e..3ec41dc3d9 100644 --- a/dp/wifi3.0/dp_rx_err.c +++ b/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, + ¤t_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 */ diff --git a/dp/wifi3.0/dp_stats.c b/dp/wifi3.0/dp_stats.c index 54554a9fb9..f4171022b2 100644 --- a/dp/wifi3.0/dp_stats.c +++ b/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); diff --git a/dp/wifi3.0/dp_types.h b/dp/wifi3.0/dp_types.h index f1ad638234..4d1d67960f 100644 --- a/dp/wifi3.0/dp_types.h +++ b/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