diff --git a/dp/wifi3.0/dp_rx_err.c b/dp/wifi3.0/dp_rx_err.c index 0ce78bd62165..a987f320c185 100644 --- a/dp/wifi3.0/dp_rx_err.c +++ b/dp/wifi3.0/dp_rx_err.c @@ -31,6 +31,9 @@ #include /* LLC_SNAP_HDR_LEN */ #include "qdf_net_types.h" +/* Max buffer in invalid peer SG list*/ +#define DP_MAX_INVALID_BUFFERS 10 + /** * dp_rx_mcast_echo_check() - check if the mcast pkt is a loop * back on same vap or a different vap. @@ -436,7 +439,16 @@ dp_rx_chain_msdus(struct dp_soc *soc, qdf_nbuf_t nbuf, uint8_t *rx_tlv_hdr, */ struct dp_pdev *dp_pdev = soc->pdev_list[mac_id]; - if (!dp_pdev->first_nbuf) { + /* if invalid peer SG list has max values free the buffers in list + * and treat current buffer as start of list + * + * current logic to detect the last buffer from attn_tlv is not reliable + * in OFDMA UL scenario hence add max buffers check to avoid list pile + * up + */ + if (!dp_pdev->first_nbuf || + QDF_NBUF_CB_RX_NUM_ELEMENTS_IN_LIST + (dp_pdev->invalid_peer_head_msdu) >= DP_MAX_INVALID_BUFFERS) { qdf_nbuf_set_rx_chfrag_start(nbuf, 1); dp_pdev->ppdu_id = HAL_RX_HW_DESC_GET_PPDUID_GET(rx_tlv_hdr); dp_pdev->first_nbuf = true;