diff --git a/dp/wifi3.0/dp_main.c b/dp/wifi3.0/dp_main.c index 4f4a22cd2e..ef2c452616 100644 --- a/dp/wifi3.0/dp_main.c +++ b/dp/wifi3.0/dp_main.c @@ -11333,7 +11333,7 @@ static void dp_cfr_filter(struct cdp_soc_t *soc_hdl, soc->rxdma_mon_status_ring[mac_id] .hal_srng, RXDMA_MONITOR_STATUS, - RX_DATA_BUFFER_SIZE, + RX_MON_STATUS_BUF_SIZE, &htt_tlv_filter); } } diff --git a/dp/wifi3.0/dp_mon_filter.c b/dp/wifi3.0/dp_mon_filter.c index 22c2ed91a4..0aa389c24b 100644 --- a/dp/wifi3.0/dp_mon_filter.c +++ b/dp/wifi3.0/dp_mon_filter.c @@ -156,7 +156,7 @@ dp_mon_ht2_rx_ring_cfg(struct dp_soc *soc, hal_ring_hdl = soc->rxdma_mon_status_ring[lmac_id].hal_srng; hal_ring_type = RXDMA_MONITOR_STATUS; - ring_buf_size = RX_DATA_BUFFER_SIZE; + ring_buf_size = RX_MON_STATUS_BUF_SIZE; break; case DP_MON_FILTER_SRNG_TYPE_RXDMA_MON_BUF: diff --git a/dp/wifi3.0/dp_rx.c b/dp/wifi3.0/dp_rx.c index 38990afac4..ed1784f45c 100644 --- a/dp/wifi3.0/dp_rx.c +++ b/dp/wifi3.0/dp_rx.c @@ -3225,66 +3225,6 @@ dp_rx_pdev_buffers_free(struct dp_pdev *pdev) dp_rx_buffer_pool_deinit(soc, mac_for_pdev); } -/* - * dp_rx_nbuf_prepare() - prepare RX nbuf - * @soc: core txrx main context - * @pdev: core txrx pdev context - * - * This function alloc & map nbuf for RX dma usage, retry it if failed - * until retry times reaches max threshold or succeeded. - * - * Return: qdf_nbuf_t pointer if succeeded, NULL if failed. - */ -qdf_nbuf_t -dp_rx_nbuf_prepare(struct dp_soc *soc, struct dp_pdev *pdev) -{ - uint8_t *buf; - int32_t nbuf_retry_count; - QDF_STATUS ret; - qdf_nbuf_t nbuf = NULL; - - for (nbuf_retry_count = 0; nbuf_retry_count < - QDF_NBUF_ALLOC_MAP_RETRY_THRESHOLD; - nbuf_retry_count++) { - /* Allocate a new skb */ - nbuf = qdf_nbuf_alloc(soc->osdev, - RX_DATA_BUFFER_SIZE, - RX_BUFFER_RESERVATION, - RX_DATA_BUFFER_ALIGNMENT, - FALSE); - - if (!nbuf) { - DP_STATS_INC(pdev, - replenish.nbuf_alloc_fail, 1); - continue; - } - - buf = qdf_nbuf_data(nbuf); - - memset(buf, 0, RX_DATA_BUFFER_SIZE); - - ret = qdf_nbuf_map_nbytes_single(soc->osdev, nbuf, - QDF_DMA_FROM_DEVICE, - RX_DATA_BUFFER_SIZE); - - /* nbuf map failed */ - if (qdf_unlikely(QDF_IS_STATUS_ERROR(ret))) { - qdf_nbuf_free(nbuf); - DP_STATS_INC(pdev, replenish.map_err, 1); - continue; - } - /* qdf_nbuf alloc and map succeeded */ - break; - } - - /* qdf_nbuf still alloc or map failed */ - if (qdf_unlikely(nbuf_retry_count >= - QDF_NBUF_ALLOC_MAP_RETRY_THRESHOLD)) - return NULL; - - return nbuf; -} - #ifdef DP_RX_SPECIAL_FRAME_NEED bool dp_rx_deliver_special_frame(struct dp_soc *soc, struct dp_peer *peer, qdf_nbuf_t nbuf, uint32_t frame_mask, diff --git a/dp/wifi3.0/dp_rx.h b/dp/wifi3.0/dp_rx.h index b596ec425c..ffa449c596 100644 --- a/dp/wifi3.0/dp_rx.h +++ b/dp/wifi3.0/dp_rx.h @@ -1256,9 +1256,6 @@ QDF_STATUS dp_rx_filter_mesh_packets(struct dp_vdev *vdev, qdf_nbuf_t nbuf, int dp_wds_rx_policy_check(uint8_t *rx_tlv_hdr, struct dp_vdev *vdev, struct dp_peer *peer); -qdf_nbuf_t -dp_rx_nbuf_prepare(struct dp_soc *soc, struct dp_pdev *pdev); - /* * dp_rx_dump_info_and_assert() - dump RX Ring info and Rx Desc info * diff --git a/dp/wifi3.0/dp_rx_mon_status.c b/dp/wifi3.0/dp_rx_mon_status.c index d712f2eeff..35afe16ad2 100644 --- a/dp/wifi3.0/dp_rx_mon_status.c +++ b/dp/wifi3.0/dp_rx_mon_status.c @@ -1640,7 +1640,7 @@ dp_rx_mon_status_process_tlv(struct dp_soc *soc, struct dp_intr *int_ctx, rx_tlv = hal_rx_status_get_next_tlv(rx_tlv); if ((rx_tlv - rx_tlv_start) >= - RX_DATA_BUFFER_SIZE) + RX_MON_STATUS_BUF_SIZE) break; } while ((tlv_status == HAL_TLV_STATUS_PPDU_NOT_DONE) || @@ -1732,6 +1732,63 @@ dp_rx_mon_status_process_tlv(struct dp_soc *soc, struct dp_intr *int_ctx, return; } +/* + * dp_rx_nbuf_prepare() - prepare RX nbuf + * @soc: core txrx main context + * @pdev: core txrx pdev context + * + * This function alloc & map nbuf for RX dma usage, retry it if failed + * until retry times reaches max threshold or succeeded. + * + * Return: qdf_nbuf_t pointer if succeeded, NULL if failed. + */ +static inline qdf_nbuf_t +dp_rx_nbuf_prepare(struct dp_soc *soc, struct dp_pdev *pdev) +{ + uint8_t *buf; + int32_t nbuf_retry_count; + QDF_STATUS ret; + qdf_nbuf_t nbuf = NULL; + + for (nbuf_retry_count = 0; nbuf_retry_count < + QDF_NBUF_ALLOC_MAP_RETRY_THRESHOLD; + nbuf_retry_count++) { + /* Allocate a new skb using alloc_skb */ + nbuf = qdf_nbuf_alloc_no_recycler(RX_MON_STATUS_BUF_SIZE, + RX_BUFFER_RESERVATION, + RX_DATA_BUFFER_ALIGNMENT); + + if (!nbuf) { + DP_STATS_INC(pdev, replenish.nbuf_alloc_fail, 1); + continue; + } + + buf = qdf_nbuf_data(nbuf); + + memset(buf, 0, RX_MON_STATUS_BUF_SIZE); + + ret = qdf_nbuf_map_nbytes_single(soc->osdev, nbuf, + QDF_DMA_FROM_DEVICE, + RX_MON_STATUS_BUF_SIZE); + + /* nbuf map failed */ + if (qdf_unlikely(QDF_IS_STATUS_ERROR(ret))) { + qdf_nbuf_free(nbuf); + DP_STATS_INC(pdev, replenish.map_err, 1); + continue; + } + /* qdf_nbuf alloc and map succeeded */ + break; + } + + /* qdf_nbuf still alloc or map failed */ + if (qdf_unlikely(nbuf_retry_count >= + QDF_NBUF_ALLOC_MAP_RETRY_THRESHOLD)) + return NULL; + + return nbuf; +} + /* * dp_rx_mon_status_srng_process() - Process monitor status ring * post the status ring buffer to Rx status Queue for later @@ -1844,7 +1901,8 @@ dp_rx_mon_status_srng_process(struct dp_soc *soc, struct dp_intr *int_ctx, */ break; } - qdf_nbuf_set_pktlen(status_nbuf, RX_DATA_BUFFER_SIZE); + qdf_nbuf_set_pktlen(status_nbuf, + RX_MON_STATUS_BUF_SIZE); qdf_nbuf_unmap_nbytes_single(soc->osdev, status_nbuf, QDF_DMA_FROM_DEVICE, @@ -2027,7 +2085,7 @@ dp_rx_pdev_mon_status_desc_pool_init(struct dp_pdev *pdev, uint32_t mac_id) pdev_id, num_entries); rx_desc_pool->owner = HAL_RX_BUF_RBM_SW3_BM; - rx_desc_pool->buf_size = RX_DATA_BUFFER_SIZE; + rx_desc_pool->buf_size = RX_MON_STATUS_BUF_SIZE; rx_desc_pool->buf_alignment = RX_DATA_BUFFER_ALIGNMENT; /* Disable frag processing flag */ dp_rx_enable_mon_dest_frag(rx_desc_pool, false); diff --git a/hal/wifi3.0/hal_rx.h b/hal/wifi3.0/hal_rx.h index f8486134ac..09c7286ecf 100644 --- a/hal/wifi3.0/hal_rx.h +++ b/hal/wifi3.0/hal_rx.h @@ -40,6 +40,14 @@ #define RX_MONITOR_BUFFER_SIZE 2048 #endif +/* MONITOR STATUS BUFFER SIZE = 1536 data bytes, buffer allocation of 2k bytes + * including skb shared info and buffer alignment. + */ +#define RX_MON_STATUS_BASE_BUF_SIZE 2048 +#define RX_MON_STATUS_BUF_ALIGN 128 +#define RX_MON_STATUS_BUF_SIZE (RX_MON_STATUS_BASE_BUF_SIZE - \ + RX_MON_STATUS_BUF_ALIGN - QDF_SHINFO_SIZE) + /* HAL_RX_NON_QOS_TID = NON_QOS_TID which is 16 */ #define HAL_RX_NON_QOS_TID 16