diff --git a/dp/wifi3.0/be/dp_be_rx.c b/dp/wifi3.0/be/dp_be_rx.c index da62bc408a..ceb0ba3deb 100644 --- a/dp/wifi3.0/be/dp_be_rx.c +++ b/dp/wifi3.0/be/dp_be_rx.c @@ -759,15 +759,6 @@ done: dp_rx_update_flow_tag(soc, vdev, nbuf, rx_tlv_hdr, true); - if (qdf_likely(vdev->rx_decap_type == - htt_cmn_pkt_type_ethernet) && - qdf_likely(!vdev->mesh_vdev)) { - dp_rx_wds_learn(soc, vdev, - rx_tlv_hdr, - txrx_peer, - nbuf); - } - if (qdf_unlikely(vdev->mesh_vdev)) { if (dp_rx_filter_mesh_packets(vdev, nbuf, rx_tlv_hdr) @@ -787,6 +778,15 @@ done: } } + if (qdf_likely(vdev->rx_decap_type == + htt_cmn_pkt_type_ethernet) && + qdf_likely(!vdev->mesh_vdev)) { + dp_rx_wds_learn(soc, vdev, + rx_tlv_hdr, + txrx_peer, + nbuf); + } + dp_rx_msdu_stats_update(soc, nbuf, rx_tlv_hdr, txrx_peer, reo_ring_num, tid_stats, link_id); @@ -1905,12 +1905,9 @@ dp_rx_wbm_err_reap_desc_be(struct dp_intr *int_ctx, struct dp_soc *soc, * info when we do the actual nbuf processing */ wbm_err_info.pool_id = rx_desc->pool_id; - hal_rx_priv_info_set_in_tlv(soc->hal_soc, - qdf_nbuf_data(nbuf), - (uint8_t *)&wbm_err_info, - sizeof(wbm_err_info)); - dp_rx_err_tlv_invalidate(soc, nbuf); + dp_rx_set_err_info(soc, nbuf, wbm_err_info); + rx_bufs_reaped[rx_desc->chip_id][rx_desc->pool_id]++; if (qdf_nbuf_is_rx_chfrag_cont(nbuf) || process_sg_buf) { @@ -1967,12 +1964,12 @@ done: rx_desc_pool = &replenish_soc->rx_desc_buf[mac_id]; - dp_rx_buffers_replenish(replenish_soc, mac_id, + dp_rx_buffers_replenish_simple(replenish_soc, mac_id, dp_rxdma_srng, rx_desc_pool, rx_bufs_reaped[chip_id][mac_id], &head[chip_id][mac_id], - &tail[chip_id][mac_id], false); + &tail[chip_id][mac_id]); *rx_bufs_used += rx_bufs_reaped[chip_id][mac_id]; } } diff --git a/dp/wifi3.0/dp_main.c b/dp/wifi3.0/dp_main.c index a82fa2f741..bc2b9f6210 100644 --- a/dp/wifi3.0/dp_main.c +++ b/dp/wifi3.0/dp_main.c @@ -1329,13 +1329,8 @@ void dp_pdev_update_fast_rx_flag(struct dp_soc *soc, struct dp_pdev *pdev) struct dp_vdev *vdev = NULL; uint8_t rx_fast_flag = true; - if (wlan_cfg_is_rx_flow_tag_enabled(soc->wlan_cfg_ctx)) { - rx_fast_flag = false; - goto update_flag; - } - /* Check if protocol tagging enable */ - if (pdev->is_rx_protocol_tagging_enabled) { + if (pdev->is_rx_protocol_tagging_enabled && !pdev->enhanced_stats_en) { rx_fast_flag = false; goto update_flag; } @@ -1359,12 +1354,6 @@ void dp_pdev_update_fast_rx_flag(struct dp_soc *soc, struct dp_pdev *pdev) rx_fast_flag = false; break; } - - /* Check if any VDEV has WDS ext enabled */ - if (dp_vdev_is_wds_ext_enabled(vdev)) { - rx_fast_flag = false; - break; - } } qdf_spin_unlock_bh(&pdev->vdev_list_lock); diff --git a/dp/wifi3.0/dp_rx.h b/dp/wifi3.0/dp_rx.h index c38cea13d7..c703ff3979 100644 --- a/dp/wifi3.0/dp_rx.h +++ b/dp/wifi3.0/dp_rx.h @@ -2505,6 +2505,20 @@ void dp_audio_smmu_unmap(qdf_device_t qdf_dev, qdf_dma_addr_t iova, #endif #if defined(QCA_DP_RX_NBUF_NO_MAP_UNMAP) && !defined(BUILD_X86) +static inline +void dp_rx_set_err_info(struct dp_soc *soc, qdf_nbuf_t nbuf, + struct hal_wbm_err_desc_info wbm_err_info) +{ + QDF_NBUF_CB_RX_ERR_CODES(nbuf) = *((uint32_t *)&wbm_err_info); +} + +static inline +struct hal_wbm_err_desc_info dp_rx_get_err_info(struct dp_soc *soc, + qdf_nbuf_t nbuf) +{ + return *(struct hal_wbm_err_desc_info *)&QDF_NBUF_CB_RX_ERR_CODES(nbuf); +} + static inline QDF_STATUS dp_pdev_rx_buffers_attach_simple(struct dp_soc *soc, uint32_t mac_id, struct dp_srng *rxdma_srng, @@ -2577,22 +2591,9 @@ qdf_dma_addr_t dp_rx_nbuf_sync_no_dsb(struct dp_soc *dp_soc, if (unlikely(!nbuf->fast_recycled)) { qdf_nbuf_dma_inv_range_no_dsb((void *)nbuf->data, (void *)(nbuf->data + buf_size)); - } else { - /* - * In case of fast_recycled is set we can avoid invalidating - * the complete buffer as it would have been invalidated - * by tx driver before giving to recycler. - * - * But we need to still invalidate rx_pkt_tlv_size as this - * area will not be invalidated in TX path - */ - DP_STATS_INC(dp_soc, rx.fast_recycled, 1); - qdf_nbuf_dma_inv_range_no_dsb((void *)nbuf->data, - (void *)(nbuf->data + - dp_soc->rx_pkt_tlv_size + - L3_HEADER_PAD)); } + DP_STATS_INC(dp_soc, rx.fast_recycled, 1); nbuf->fast_recycled = 0; return (qdf_dma_addr_t)qdf_mem_virt_to_phys(nbuf->data); @@ -2672,6 +2673,29 @@ void dp_rx_nbuf_free(qdf_nbuf_t nbuf) qdf_nbuf_free_simple(nbuf); } #else +static inline +void dp_rx_set_err_info(struct dp_soc *soc, qdf_nbuf_t nbuf, + struct hal_wbm_err_desc_info wbm_err_info) +{ + hal_rx_priv_info_set_in_tlv(soc->hal_soc, + qdf_nbuf_data(nbuf), + (uint8_t *)&wbm_err_info, + sizeof(wbm_err_info)); +} + +static inline +struct hal_wbm_err_desc_info dp_rx_get_err_info(struct dp_soc *soc, + qdf_nbuf_t nbuf) +{ + struct hal_wbm_err_desc_info wbm_err_info = { 0 }; + + hal_rx_priv_info_get_from_tlv(soc->hal_soc, qdf_nbuf_data(nbuf), + (uint8_t *)&wbm_err_info, + sizeof(struct hal_wbm_err_desc_info)); + + return wbm_err_info; +} + static inline QDF_STATUS dp_pdev_rx_buffers_attach_simple(struct dp_soc *soc, uint32_t mac_id, struct dp_srng *rxdma_srng, diff --git a/dp/wifi3.0/dp_rx_err.c b/dp/wifi3.0/dp_rx_err.c index 9c19c2e141..e34dba0e34 100644 --- a/dp/wifi3.0/dp_rx_err.c +++ b/dp/wifi3.0/dp_rx_err.c @@ -2372,10 +2372,7 @@ dp_rx_wbm_err_process(struct dp_intr *int_ctx, struct dp_soc *soc, * retrieve the wbm desc info from nbuf TLV, so we can * handle error cases appropriately */ - hal_rx_priv_info_get_from_tlv(soc->hal_soc, rx_tlv_hdr, - (uint8_t *)&wbm_err_info, - sizeof(wbm_err_info)); - + wbm_err_info = dp_rx_get_err_info(soc, nbuf); peer_meta_data = hal_rx_tlv_peer_meta_data_get(soc->hal_soc, rx_tlv_hdr); peer_id = dp_rx_peer_metadata_peer_id_get(soc, peer_meta_data); diff --git a/dp/wifi3.0/li/dp_li_rx.c b/dp/wifi3.0/li/dp_li_rx.c index f16e793e29..1253844761 100644 --- a/dp/wifi3.0/li/dp_li_rx.c +++ b/dp/wifi3.0/li/dp_li_rx.c @@ -1244,12 +1244,8 @@ dp_rx_wbm_err_reap_desc_li(struct dp_intr *int_ctx, struct dp_soc *soc, * info when we do the actual nbuf processing */ wbm_err_info.pool_id = rx_desc->pool_id; - hal_rx_priv_info_set_in_tlv(soc->hal_soc, - qdf_nbuf_data(nbuf), - (uint8_t *)&wbm_err_info, - sizeof(wbm_err_info)); + dp_rx_set_err_info(soc, nbuf, wbm_err_info); - dp_rx_err_tlv_invalidate(soc, nbuf); rx_bufs_reaped[rx_desc->chip_id][rx_desc->pool_id]++; if (qdf_nbuf_is_rx_chfrag_cont(nbuf) || process_sg_buf) { @@ -1306,12 +1302,12 @@ done: rx_desc_pool = &replenish_soc->rx_desc_buf[mac_id]; - dp_rx_buffers_replenish(replenish_soc, mac_id, + dp_rx_buffers_replenish_simple(replenish_soc, mac_id, dp_rxdma_srng, rx_desc_pool, rx_bufs_reaped[chip_id][mac_id], &head[chip_id][mac_id], - &tail[chip_id][mac_id], false); + &tail[chip_id][mac_id]); *rx_bufs_used += rx_bufs_reaped[chip_id][mac_id]; } } diff --git a/qdf/linux/src/i_qdf_nbuf_w.h b/qdf/linux/src/i_qdf_nbuf_w.h index 7854b4ab89..b8602d5451 100644 --- a/qdf/linux/src/i_qdf_nbuf_w.h +++ b/qdf/linux/src/i_qdf_nbuf_w.h @@ -411,6 +411,10 @@ QDF_COMPILE_TIME_ASSERT(qdf_nbuf_cb_size, (((struct qdf_nbuf_cb *) \ ((skb)->cb))->u.rx.hw_info.desc_info.msdu_desc_info) +#define QDF_NBUF_CB_RX_ERR_CODES(skb) \ + (((struct qdf_nbuf_cb *) \ + ((skb)->cb))->u.rx.hw_info.desc_info.rx_error_codes) + #define QDF_NBUF_CB_RX_MPDU_DESC_INFO(skb) \ (((struct qdf_nbuf_cb *) \ ((skb)->cb))->u.rx.hw_info.desc_info.mpdu_desc_info)