qcacmn: Handle the nbuf sanity failure gracefully

Th nbuf sanity can fail in case when HW posts the
same buffer twice. This case can be handled gracefully
by just skipping the processing of the corresponding rx
descriptor.

Change-Id: I471bb9f364a51937e85249996e427f15872bda97
CRs-Fixed: 2738558
This commit is contained in:
Rakesh Pillai
2020-07-23 00:13:13 +05:30
committed by snandini
parent e344f80463
commit d7a0b3f14c
4 changed files with 28 additions and 8 deletions

View File

@@ -287,6 +287,7 @@ QDF_STATUS __dp_rx_buffers_replenish(struct dp_soc *dp_soc, uint32_t mac_id,
qdf_assert_always((*desc_list)->rx_desc.in_use == 0);
(*desc_list)->rx_desc.in_use = 1;
(*desc_list)->rx_desc.in_err_state = 0;
dp_rx_desc_update_dbg_info(&(*desc_list)->rx_desc,
func_name, RX_DESC_REPLENISHED);
dp_verbose_debug("rx_netbuf=%pK, buf=%pK, paddr=0x%llx, cookie=%d",
@@ -1721,21 +1722,25 @@ int dp_wds_rx_policy_check(uint8_t *rx_tlv_hdr,
* Return: NONE
*/
static inline
void dp_rx_desc_nbuf_sanity_check(hal_ring_desc_t ring_desc,
struct dp_rx_desc *rx_desc)
QDF_STATUS dp_rx_desc_nbuf_sanity_check(hal_ring_desc_t ring_desc,
struct dp_rx_desc *rx_desc)
{
struct hal_buf_info hbi;
hal_rx_reo_buf_paddr_get(ring_desc, &hbi);
/* Sanity check for possible buffer paddr corruption */
qdf_assert_always((&hbi)->paddr ==
qdf_nbuf_get_frag_paddr(rx_desc->nbuf, 0));
if ((&hbi)->paddr ==
qdf_nbuf_get_frag_paddr(rx_desc->nbuf, 0))
return QDF_STATUS_SUCCESS;
return QDF_STATUS_E_FAILURE;
}
#else
static inline
void dp_rx_desc_nbuf_sanity_check(hal_ring_desc_t ring_desc,
struct dp_rx_desc *rx_desc)
QDF_STATUS dp_rx_desc_nbuf_sanity_check(hal_ring_desc_t ring_desc,
struct dp_rx_desc *rx_desc)
{
return QDF_STATUS_SUCCESS;
}
#endif
@@ -2120,7 +2125,13 @@ more_data:
continue;
}
dp_rx_desc_nbuf_sanity_check(ring_desc, rx_desc);
status = dp_rx_desc_nbuf_sanity_check(ring_desc, rx_desc);
if (qdf_unlikely(QDF_IS_STATUS_ERROR(status))) {
DP_STATS_INC(soc, rx.err.nbuf_sanity_fail, 1);
rx_desc->in_err_state = 1;
hal_srng_dst_get_next(hal_soc, hal_ring_hdl);
continue;
}
if (qdf_unlikely(!dp_rx_desc_check_magic(rx_desc))) {
dp_err("Invalid rx_desc cookie=%d", rx_buf_cookie);