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:
@@ -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) \
|
#define DP_RX_PROCESS_NBUF(soc, head, tail, ebuf_head, ebuf_tail, rx_desc) \
|
||||||
DP_RX_LIST_APPEND(head, tail, rx_desc->nbuf)
|
DP_RX_LIST_APPEND(head, tail, rx_desc->nbuf)
|
||||||
#endif /* WLAN_FEATURE_RX_PREALLOC_BUFFER_POOL */
|
#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 */
|
#endif /* _DP_RX_H */
|
||||||
|
@@ -1071,6 +1071,13 @@ static QDF_STATUS dp_rx_defrag_reo_reinject(struct dp_peer *peer,
|
|||||||
peer->rx_tid[tid].array;
|
peer->rx_tid[tid].array;
|
||||||
qdf_nbuf_t nbuf_head;
|
qdf_nbuf_t nbuf_head;
|
||||||
struct rx_desc_pool *rx_desc_pool = NULL;
|
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);
|
nbuf_head = dp_ipa_handle_rx_reo_reinject(soc, head);
|
||||||
if (qdf_unlikely(!nbuf_head)) {
|
if (qdf_unlikely(!nbuf_head)) {
|
||||||
|
@@ -156,6 +156,26 @@ static inline bool dp_rx_mcast_echo_check(struct dp_soc *soc,
|
|||||||
return false;
|
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
|
* dp_rx_link_desc_return_by_addr - Return a MPDU link descriptor to
|
||||||
* (WBM) by address
|
* (WBM) by address
|
||||||
@@ -182,6 +202,12 @@ dp_rx_link_desc_return_by_addr(struct dp_soc *soc,
|
|||||||
return status;
|
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))) {
|
if (qdf_unlikely(hal_srng_access_start(hal_soc, wbm_rel_srng))) {
|
||||||
|
|
||||||
/* TODO */
|
/* TODO */
|
||||||
|
@@ -6057,6 +6057,8 @@ void dp_txrx_path_stats(struct dp_soc *soc)
|
|||||||
pdev->soc->stats.rx.err.invalid_link_cookie);
|
pdev->soc->stats.rx.err.invalid_link_cookie);
|
||||||
DP_PRINT_STATS("Rx nbuf sanity fails: %d",
|
DP_PRINT_STATS("Rx nbuf sanity fails: %d",
|
||||||
pdev->soc->stats.rx.err.nbuf_sanity_fail);
|
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("Reo Statistics");
|
||||||
DP_PRINT_STATS("near_full: %u ", soc->stats.rx.near_full);
|
DP_PRINT_STATS("near_full: %u ", soc->stats.rx.near_full);
|
||||||
|
@@ -859,6 +859,8 @@ struct dp_soc_stats {
|
|||||||
uint32_t invalid_link_cookie;
|
uint32_t invalid_link_cookie;
|
||||||
/* Nbuf sanity failure */
|
/* Nbuf sanity failure */
|
||||||
uint32_t nbuf_sanity_fail;
|
uint32_t nbuf_sanity_fail;
|
||||||
|
/* Duplicate link desc refilled */
|
||||||
|
uint32_t dup_refill_link_desc;
|
||||||
} err;
|
} err;
|
||||||
|
|
||||||
/* packet count per core - per ring */
|
/* 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];
|
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 */
|
/* SOC level structure for data path */
|
||||||
struct dp_soc {
|
struct dp_soc {
|
||||||
/**
|
/**
|
||||||
@@ -1432,6 +1442,8 @@ struct dp_soc {
|
|||||||
|
|
||||||
/* RX buffer params */
|
/* RX buffer params */
|
||||||
struct rx_buff_pool rx_buff_pool[MAX_PDEV_CNT];
|
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
|
#ifdef IPA_OFFLOAD
|
||||||
|
Reference in New Issue
Block a user