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
This commit is contained in:
Jinwei Chen
2020-07-28 15:03:10 +08:00
committed by snandini
parent e7e30c3ce1
commit d555d146a4
5 changed files with 61 additions and 0 deletions

View File

@@ -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 */

View File

@@ -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)) {

View File

@@ -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,
&current_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 */

View File

@@ -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);

View File

@@ -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