diff --git a/dp/wifi3.0/dp_rx.c b/dp/wifi3.0/dp_rx.c index a2627051a9..6768363e94 100644 --- a/dp/wifi3.0/dp_rx.c +++ b/dp/wifi3.0/dp_rx.c @@ -420,8 +420,8 @@ __dp_rx_buffers_no_map_replenish(struct dp_soc *soc, uint32_t mac_id, next = (*desc_list)->next; qdf_prefetch(next); rxdma_ring_entry = (struct dp_buffer_addr_info *) - hal_srng_src_get_next(soc->hal_soc, rxdma_srng); - if (!rxdma_ring_entry) + hal_srng_src_peek(soc->hal_soc, rxdma_srng); + if (qdf_unlikely(!rxdma_ring_entry)) break; nbuf = dp_rx_nbuf_alloc(soc, rx_desc_pool); @@ -449,6 +449,7 @@ __dp_rx_buffers_no_map_replenish(struct dp_soc *soc, uint32_t mac_id, rx_desc_pool->owner); *desc_list = next; + hal_srng_src_get_next(soc->hal_soc, rxdma_srng); } qdf_dsb(); hal_srng_access_end(soc->hal_soc, rxdma_srng); diff --git a/hal/wifi3.0/hal_api.h b/hal/wifi3.0/hal_api.h index f19aeed320..1cda41320e 100644 --- a/hal/wifi3.0/hal_api.h +++ b/hal/wifi3.0/hal_api.h @@ -1975,6 +1975,29 @@ void *hal_srng_src_get_next_consumed(void *hal_soc, } #endif /* CLEAR_SW2TCL_CONSUMED_DESC */ +/** + * hal_srng_src_peek - get the HP of the SRC ring + * @hal_soc: Opaque HAL SOC handle + * @hal_ring_hdl: Source ring pointer + * + * get the head pointer in the src ring but do not increment it + */ +static inline +void *hal_srng_src_peek(void *hal_soc, hal_ring_handle_t hal_ring_hdl) +{ + struct hal_srng *srng = (struct hal_srng *)hal_ring_hdl; + uint32_t *desc; + uint32_t next_hp = (srng->u.src_ring.hp + srng->entry_size) % + srng->ring_size; + + if (next_hp != srng->u.src_ring.cached_tp) { + desc = &(srng->ring_base_vaddr[srng->u.src_ring.hp]); + return (void *)desc; + } + + return NULL; +} + /** * hal_srng_src_get_next - Get next entry from a source ring and move cached tail pointer *