diff --git a/dp/inc/cdp_txrx_stats_struct.h b/dp/inc/cdp_txrx_stats_struct.h index 64a12d31fe..06a615a681 100644 --- a/dp/inc/cdp_txrx_stats_struct.h +++ b/dp/inc/cdp_txrx_stats_struct.h @@ -2689,6 +2689,7 @@ struct cdp_peer_telemetry_stats { * @map_err: Mapping failure * @x86_fail: x86 failures * @low_thresh_intrs: low threshold interrupts + * @free_list: RX descriptors moving back to free list * @rx_raw_pkts: Rx Raw Packets * @mesh_mem_alloc: Mesh Rx Stats Alloc fail * @tso_desc_cnt: TSO descriptors @@ -2738,6 +2739,7 @@ struct cdp_pdev_stats { uint32_t map_err; uint32_t x86_fail; uint32_t low_thresh_intrs; + int32_t free_list; } replenish; uint32_t rx_raw_pkts; diff --git a/dp/wifi3.0/dp_rx.c b/dp/wifi3.0/dp_rx.c index 98723bfabd..71d3a44608 100644 --- a/dp/wifi3.0/dp_rx.c +++ b/dp/wifi3.0/dp_rx.c @@ -600,6 +600,9 @@ QDF_STATUS __dp_rx_buffers_replenish(struct dp_soc *dp_soc, uint32_t mac_id, union dp_rx_desc_list_elem_t *next; QDF_STATUS ret; void *rxdma_srng; + union dp_rx_desc_list_elem_t *desc_list_append = NULL; + union dp_rx_desc_list_elem_t *tail_append = NULL; + union dp_rx_desc_list_elem_t *temp_list = NULL; rxdma_srng = dp_rxdma_srng->hal_srng; @@ -633,6 +636,28 @@ QDF_STATUS __dp_rx_buffers_replenish(struct dp_soc *dp_soc, uint32_t mac_id, } else if (num_entries_avail < num_req_buffers) { num_desc_to_free = num_req_buffers - num_entries_avail; num_req_buffers = num_entries_avail; + } else if ((*desc_list) && + dp_rxdma_srng->num_entries - num_entries_avail < + CRITICAL_BUFFER_THRESHOLD) { + /* Append some free descriptors to tail */ + num_alloc_desc = + dp_rx_get_free_desc_list(dp_soc, mac_id, + rx_desc_pool, + CRITICAL_BUFFER_THRESHOLD, + &desc_list_append, + &tail_append); + + if (num_alloc_desc) { + temp_list = *desc_list; + *desc_list = desc_list_append; + tail_append->next = temp_list; + num_req_buffers += num_alloc_desc; + + DP_STATS_DEC(dp_pdev, + replenish.free_list, + num_alloc_desc); + } else + dp_err_rl("%pK: no free rx_descs in freelist", dp_soc); } if (qdf_unlikely(!num_req_buffers)) { @@ -736,6 +761,7 @@ QDF_STATUS __dp_rx_buffers_replenish(struct dp_soc *dp_soc, uint32_t mac_id, * Therefore set replenish.pkts.bytes as 0. */ DP_STATS_INC_PKT(dp_pdev, replenish.pkts, count, 0); + DP_STATS_INC(dp_pdev, replenish.free_list, num_req_buffers - count); free_descs: DP_STATS_INC(dp_pdev, buf_freelist, num_desc_to_free); diff --git a/dp/wifi3.0/dp_rx.h b/dp/wifi3.0/dp_rx.h index 9fa90c5c0d..f8beedbabd 100644 --- a/dp/wifi3.0/dp_rx.h +++ b/dp/wifi3.0/dp_rx.h @@ -1482,6 +1482,7 @@ dp_rx_update_flow_tag(struct dp_soc *soc, struct dp_vdev *vdev, } #endif /* WLAN_SUPPORT_RX_FLOW_TAG */ +#define CRITICAL_BUFFER_THRESHOLD 64 /* * dp_rx_buffers_replenish() - replenish rxdma ring with rx nbufs * called during dp rx initialization