diff --git a/dp/wifi3.0/be/dp_be.c b/dp/wifi3.0/be/dp_be.c index 34425b022c..2b8de4125c 100644 --- a/dp/wifi3.0/be/dp_be.c +++ b/dp/wifi3.0/be/dp_be.c @@ -2869,8 +2869,6 @@ void dp_initialize_arch_ops_be(struct dp_arch_ops *arch_ops) arch_ops->dp_rxdma_ring_sel_cfg = dp_rxdma_ring_sel_cfg_be; arch_ops->dp_rx_peer_metadata_peer_id_get = dp_rx_peer_metadata_peer_id_get_be; - arch_ops->dp_rx_peer_mdata_link_id_get = - dp_rx_peer_mdata_link_id_get_be; arch_ops->soc_cfg_attach = dp_soc_cfg_attach_be; arch_ops->tx_implicit_rbm_set = dp_tx_implicit_rbm_set_be; arch_ops->txrx_set_vdev_param = dp_txrx_set_vdev_param_be; diff --git a/dp/wifi3.0/be/dp_be_rx.c b/dp/wifi3.0/be/dp_be_rx.c index 14c1ad617f..9f55540d5b 100644 --- a/dp/wifi3.0/be/dp_be_rx.c +++ b/dp/wifi3.0/be/dp_be_rx.c @@ -1790,21 +1790,18 @@ dp_rx_wbm_err_reap_desc_be(struct dp_intr *int_ctx, struct dp_soc *soc, union dp_rx_desc_list_elem_t *tail[WLAN_MAX_MLO_CHIPS][MAX_PDEV_CNT] = { { NULL } }; uint32_t rx_bufs_reaped[WLAN_MAX_MLO_CHIPS][MAX_PDEV_CNT] = { { 0 } }; - uint8_t buf_type; uint8_t mac_id; struct dp_srng *dp_rxdma_srng; struct rx_desc_pool *rx_desc_pool; qdf_nbuf_t nbuf_head = NULL; qdf_nbuf_t nbuf_tail = NULL; qdf_nbuf_t nbuf; - struct hal_wbm_err_desc_info wbm_err_info = { 0 }; uint8_t msdu_continuation = 0; bool process_sg_buf = false; - uint32_t wbm_err_src; QDF_STATUS status; struct dp_soc *replenish_soc; uint8_t chip_id; - struct hal_rx_mpdu_desc_info mpdu_desc_info = { 0 }; + union hal_wbm_err_info_u wbm_err = { 0 }; qdf_assert(soc && hal_ring_hdl); hal_soc = soc->hal_soc; @@ -1823,32 +1820,22 @@ dp_rx_wbm_err_reap_desc_be(struct dp_intr *int_ctx, struct dp_soc *soc, while (qdf_likely(quota)) { ring_desc = hal_srng_dst_get_next(hal_soc, hal_ring_hdl); + if (qdf_unlikely(!ring_desc)) break; - /* XXX */ - buf_type = HAL_RX_WBM_BUF_TYPE_GET(ring_desc); - - /* - * For WBM ring, expect only MSDU buffers - */ - qdf_assert_always(buf_type == HAL_RX_WBM_BUF_TYPE_REL_BUF); - - wbm_err_src = hal_rx_wbm_err_src_get(hal_soc, ring_desc); - qdf_assert((wbm_err_src == HAL_RX_WBM_ERR_SRC_RXDMA) || - (wbm_err_src == HAL_RX_WBM_ERR_SRC_REO)); - - if (soc->arch_ops.dp_wbm_get_rx_desc_from_hal_desc(soc, - ring_desc, - &rx_desc)) { - dp_rx_err_err("get rx desc from hal_desc failed"); + /* Get SW Desc from HAL desc */ + if (dp_wbm_get_rx_desc_from_hal_desc_be(soc, + ring_desc, + &rx_desc)) { + dp_rx_err_err("get rx sw desc from hal_desc failed"); continue; } qdf_assert_always(rx_desc); if (!dp_rx_desc_check_magic(rx_desc)) { - dp_rx_err_err("%pk: Invalid rx_desc %pk", + dp_rx_err_err("%pK: Invalid rx_desc %pK", soc, rx_desc); continue; } @@ -1867,15 +1854,12 @@ dp_rx_wbm_err_reap_desc_be(struct dp_intr *int_ctx, struct dp_soc *soc, continue; } - hal_rx_wbm_err_info_get(ring_desc, &wbm_err_info, hal_soc); - nbuf = rx_desc->nbuf; - status = dp_rx_wbm_desc_nbuf_sanity_check(soc, hal_ring_hdl, ring_desc, rx_desc); if (qdf_unlikely(QDF_IS_STATUS_ERROR(status))) { DP_STATS_INC(soc, rx.err.nbuf_sanity_fail, 1); - dp_info_rl("Rx error Nbuf %pk sanity check failure!", - nbuf); + dp_info_rl("Rx error Nbuf %pK sanity check failure!", + rx_desc->nbuf); rx_desc->in_err_state = 1; rx_desc->unmapped = 1; rx_bufs_reaped[rx_desc->chip_id][rx_desc->pool_id]++; @@ -1887,12 +1871,30 @@ dp_rx_wbm_err_reap_desc_be(struct dp_intr *int_ctx, struct dp_soc *soc, continue; } - /* Get MPDU DESC info */ - hal_rx_mpdu_desc_info_get(hal_soc, ring_desc, &mpdu_desc_info); + nbuf = rx_desc->nbuf; - if (qdf_likely(mpdu_desc_info.mpdu_flags & - HAL_MPDU_F_QOS_CONTROL_VALID)) - qdf_nbuf_set_tid_val(rx_desc->nbuf, mpdu_desc_info.tid); + /* + * Read wbm err info , MSDU info , MPDU info , peer meta data, + * from desc. Save all the info in nbuf CB/TLV. + * We will need this info when we do the actual nbuf processing + */ + wbm_err.info = dp_rx_wbm_err_copy_desc_info_in_nbuf( + soc, + ring_desc, + nbuf, + rx_desc->pool_id); + /* + * For WBM ring, expect only MSDU buffers + */ + qdf_assert_always(wbm_err.info_bit.buffer_or_desc_type == + HAL_RX_WBM_BUF_TYPE_REL_BUF); + /* + * Errors are handled only if the source is RXDMA or REO + */ + qdf_assert((wbm_err.info_bit.wbm_err_src == + HAL_RX_WBM_ERR_SRC_RXDMA) || + (wbm_err.info_bit.wbm_err_src == + HAL_RX_WBM_ERR_SRC_REO)); rx_desc_pool = &soc->rx_desc_buf[rx_desc->pool_id]; dp_ipa_rx_buf_smmu_mapping_lock(soc); @@ -1902,11 +1904,12 @@ dp_rx_wbm_err_reap_desc_be(struct dp_intr *int_ctx, struct dp_soc *soc, if (qdf_unlikely( soc->wbm_release_desc_rx_sg_support && - dp_rx_is_sg_formation_required(&wbm_err_info))) { + dp_rx_is_sg_formation_required(&wbm_err.info_bit))) { /* SG is detected from continuation bit */ msdu_continuation = - hal_rx_wbm_err_msdu_continuation_get(hal_soc, - ring_desc); + dp_rx_wbm_err_msdu_continuation_get(soc, + ring_desc, + nbuf); if (msdu_continuation && !(soc->wbm_sg_param.wbm_is_first_msdu_in_sg)) { /* Update length from first buffer in SG */ @@ -1933,14 +1936,6 @@ dp_rx_wbm_err_reap_desc_be(struct dp_intr *int_ctx, struct dp_soc *soc, } } - /* - * save the wbm desc info in nbuf TLV. We will need this - * info when we do the actual nbuf processing - */ - wbm_err_info.pool_id = rx_desc->pool_id; - - 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) { diff --git a/dp/wifi3.0/be/dp_be_rx.h b/dp/wifi3.0/be/dp_be_rx.h index f1a6fa48b9..1d9613c58a 100644 --- a/dp/wifi3.0/be/dp_be_rx.h +++ b/dp/wifi3.0/be/dp_be_rx.h @@ -659,13 +659,6 @@ dp_rx_set_msdu_hw_link_id(qdf_nbuf_t nbuf, uint32_t peer_mdata) QDF_NBUF_CB_RX_LOGICAL_LINK_ID(nbuf) = logical_link_id; } -static inline uint8_t -dp_rx_get_stats_arr_idx_from_link_id(qdf_nbuf_t nbuf, - struct dp_txrx_peer *txrx_peer) -{ - return QDF_NBUF_CB_RX_LOGICAL_LINK_ID(nbuf); -} - static inline uint16_t dp_rx_get_peer_id_be(qdf_nbuf_t nbuf) { @@ -768,42 +761,21 @@ static inline uint8_t hal_rx_get_l3_pad_bytes_be(qdf_nbuf_t nbuf, { return HAL_RX_TLV_L3_HEADER_PADDING_GET(rx_tlv_hdr); } -#else + static inline uint8_t -dp_rx_peer_mdata_link_id_get_be(uint32_t peer_metadata) +dp_rx_wbm_err_msdu_continuation_get(struct dp_soc *soc, + hal_ring_desc_t ring_desc, + qdf_nbuf_t nbuf) { - uint8_t link_id = 0; - - link_id = (HTT_RX_PEER_META_DATA_V1A_LOGICAL_LINK_ID_GET(peer_metadata) - + 1); - if (link_id > DP_MAX_MLO_LINKS) - link_id = 0; - - return link_id; + return hal_rx_wbm_err_msdu_continuation_get(soc->hal_soc, + ring_desc); } - +#else static inline void dp_rx_set_msdu_hw_link_id(qdf_nbuf_t nbuf, uint32_t peer_mdata) { } -static inline uint8_t -dp_rx_get_stats_arr_idx_from_link_id(qdf_nbuf_t nbuf, - struct dp_txrx_peer *txrx_peer) -{ - uint8_t link_id = 0; - - link_id = (QDF_NBUF_CB_RX_HW_LINK_ID(nbuf) + 1); - if (link_id > DP_MAX_MLO_LINKS) { - link_id = 0; - DP_PEER_PER_PKT_STATS_INC(txrx_peer, - rx.inval_link_id_pkt_cnt, - 1, link_id); - } - - return link_id; -} - static inline uint16_t dp_rx_get_peer_id_be(qdf_nbuf_t nbuf) { @@ -852,5 +824,51 @@ static inline uint8_t hal_rx_get_l3_pad_bytes_be(qdf_nbuf_t nbuf, { return QDF_NBUF_CB_RX_L3_PAD_MSB(nbuf) ? 2 : 0; } -#endif + +static inline uint8_t +dp_rx_wbm_err_msdu_continuation_get(struct dp_soc *soc, + hal_ring_desc_t ring_desc, + qdf_nbuf_t nbuf) +{ + return qdf_nbuf_is_rx_chfrag_cont(nbuf); +} +#endif /* CONFIG_NBUF_AP_PLATFORM */ + +/** + * dp_rx_wbm_err_copy_desc_info_in_nbuf(): API to copy WBM dest ring + * descriptor information in nbuf CB/TLV + * + * @soc: pointer to Soc structure + * @ring_desc: wbm dest ring descriptor + * @nbuf: nbuf to save descriptor information + * @pool_id: pool id part of wbm error info + * + * Return: wbm error information details + */ +static inline uint32_t +dp_rx_wbm_err_copy_desc_info_in_nbuf(struct dp_soc *soc, + hal_ring_desc_t ring_desc, + qdf_nbuf_t nbuf, + uint8_t pool_id) +{ + uint32_t mpdu_desc_info = 0; + uint32_t msdu_desc_info = 0; + uint32_t peer_mdata = 0; + union hal_wbm_err_info_u wbm_err = { 0 }; + + /* get WBM mpdu & msdu desc info */ + hal_rx_wbm_err_mpdu_msdu_info_get_be(ring_desc, + &wbm_err.info, + &mpdu_desc_info, + &msdu_desc_info, + &peer_mdata); + + wbm_err.info_bit.pool_id = pool_id; + dp_rx_set_mpdu_msdu_desc_info_in_nbuf(nbuf, + mpdu_desc_info, + peer_mdata, + msdu_desc_info); + dp_rx_set_wbm_err_info_in_nbuf(soc, nbuf, wbm_err); + return wbm_err.info; +} #endif diff --git a/dp/wifi3.0/dp_rx.h b/dp/wifi3.0/dp_rx.h index 36cc286c42..60ab9a2a90 100644 --- a/dp/wifi3.0/dp_rx.h +++ b/dp/wifi3.0/dp_rx.h @@ -2419,12 +2419,6 @@ dp_rx_peer_metadata_peer_id_get(struct dp_soc *soc, uint32_t peer_metadata) peer_metadata); } -static inline uint8_t -dp_rx_peer_mdata_link_id_get(struct dp_soc *soc, uint32_t peer_metadata) -{ - return soc->arch_ops.dp_rx_peer_mdata_link_id_get(peer_metadata); -} - /** * dp_rx_desc_pool_init_generic() - Generic Rx descriptors initialization * @soc: SOC handle @@ -2501,20 +2495,6 @@ 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, @@ -2669,29 +2649,6 @@ 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, @@ -3088,6 +3045,19 @@ dp_rx_deliver_to_osif_stack(struct dp_soc *soc, qdf_nbuf_t tail, bool is_eapol); +/** + * dp_rx_set_wbm_err_info_in_nbuf() - function to set wbm err info in nbuf + * @soc: DP soc + * @nbuf: skb list head + * @wbm_err: wbm error info details + * + * Return: None + */ +void +dp_rx_set_wbm_err_info_in_nbuf(struct dp_soc *soc, + qdf_nbuf_t nbuf, + union hal_wbm_err_info_u wbm_err); + #ifndef WLAN_SOFTUMAC_SUPPORT /* WLAN_SOFTUMAC_SUPPORT */ /** * dp_rx_dump_info_and_assert() - dump RX Ring info and Rx Desc info @@ -3525,4 +3495,30 @@ dp_rx_get_rx_bm_id(struct dp_soc *soc) } #endif /* WLAN_SOFTUMAC_SUPPORT */ +#ifndef CONFIG_NBUF_AP_PLATFORM +static inline uint8_t +dp_rx_get_stats_arr_idx_from_link_id(qdf_nbuf_t nbuf, + struct dp_txrx_peer *txrx_peer) +{ + return 0; +} +#else +static inline uint8_t +dp_rx_get_stats_arr_idx_from_link_id(qdf_nbuf_t nbuf, + struct dp_txrx_peer *txrx_peer) +{ + uint8_t link_id = 0; + + link_id = (QDF_NBUF_CB_RX_HW_LINK_ID(nbuf) + 1); + if (link_id > DP_MAX_MLO_LINKS) { + link_id = 0; + DP_PEER_PER_PKT_STATS_INC(txrx_peer, + rx.inval_link_id_pkt_cnt, + 1, link_id); + } + + return link_id; +} +#endif /* CONFIG_NBUF_AP_PLATFORM */ + #endif /* _DP_RX_H */ diff --git a/dp/wifi3.0/dp_rx_err.c b/dp/wifi3.0/dp_rx_err.c index 010fe457aa..c727c64477 100644 --- a/dp/wifi3.0/dp_rx_err.c +++ b/dp/wifi3.0/dp_rx_err.c @@ -2357,6 +2357,69 @@ void dp_rx_err_tlv_invalidate(struct dp_soc *soc, } #endif +#ifndef CONFIG_NBUF_AP_PLATFORM +static inline uint16_t +dp_rx_get_peer_id(struct dp_soc *soc, + uint8_t *rx_tlv_hdr, + qdf_nbuf_t nbuf) +{ + uint32_t peer_mdata = 0; + + peer_mdata = hal_rx_tlv_peer_meta_data_get(soc->hal_soc, + rx_tlv_hdr); + return dp_rx_peer_metadata_peer_id_get(soc, peer_mdata); +} + +static inline void +dp_rx_get_wbm_err_info_from_nbuf(struct dp_soc *soc, + qdf_nbuf_t nbuf, + uint8_t *rx_tlv_hdr, + union hal_wbm_err_info_u *wbm_err) +{ + hal_rx_priv_info_get_from_tlv(soc->hal_soc, rx_tlv_hdr, + (uint8_t *)&wbm_err->info, + sizeof(union hal_wbm_err_info_u)); +} + +void +dp_rx_set_wbm_err_info_in_nbuf(struct dp_soc *soc, + qdf_nbuf_t nbuf, + union hal_wbm_err_info_u wbm_err) +{ + hal_rx_priv_info_set_in_tlv(soc->hal_soc, + qdf_nbuf_data(nbuf), + (uint8_t *)&wbm_err.info, + sizeof(union hal_wbm_err_info_u)); +} +#else +static inline uint16_t +dp_rx_get_peer_id(struct dp_soc *soc, + uint8_t *rx_tlv_hdr, + qdf_nbuf_t nbuf) +{ + uint32_t peer_mdata = QDF_NBUF_CB_RX_MPDU_DESC_INFO_2(nbuf); + + return dp_rx_peer_metadata_peer_id_get(soc, peer_mdata); +} + +static inline void +dp_rx_get_wbm_err_info_from_nbuf(struct dp_soc *soc, + qdf_nbuf_t nbuf, + uint8_t *rx_tlv_hdr, + union hal_wbm_err_info_u *wbm_err) +{ + wbm_err->info = QDF_NBUF_CB_RX_ERROR_CODE_INFO(nbuf); +} + +void +dp_rx_set_wbm_err_info_in_nbuf(struct dp_soc *soc, + qdf_nbuf_t nbuf, + union hal_wbm_err_info_u wbm_err) +{ + QDF_NBUF_CB_RX_ERROR_CODE_INFO(nbuf) = wbm_err.info; +} +#endif /* CONFIG_NBUF_AP_PLATFORM */ + uint32_t dp_rx_wbm_err_process(struct dp_intr *int_ctx, struct dp_soc *soc, hal_ring_handle_t hal_ring_hdl, uint32_t quota) @@ -2368,7 +2431,7 @@ dp_rx_wbm_err_process(struct dp_intr *int_ctx, struct dp_soc *soc, bool is_tkip_mic_err; qdf_nbuf_t nbuf_head = NULL; qdf_nbuf_t nbuf, next; - struct hal_wbm_err_desc_info wbm_err_info = { 0 }; + union hal_wbm_err_info_u wbm_err = { 0 }; uint8_t pool_id; uint8_t tid = 0; uint8_t link_id = 0; @@ -2392,18 +2455,20 @@ dp_rx_wbm_err_process(struct dp_intr *int_ctx, struct dp_soc *soc, uint16_t peer_id; uint8_t err_code; uint8_t *tlv_hdr; - uint32_t peer_meta_data; dp_txrx_ref_handle txrx_ref_handle = NULL; rx_tlv_hdr = qdf_nbuf_data(nbuf); /* - * retrieve the wbm desc info from nbuf TLV, so we can + * retrieve the wbm desc info from nbuf CB/TLV, so we can * handle error cases appropriately */ - 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); + dp_rx_get_wbm_err_info_from_nbuf(soc, nbuf, + rx_tlv_hdr, + &wbm_err); + + peer_id = dp_rx_get_peer_id(soc, + rx_tlv_hdr, + nbuf); txrx_peer = dp_tgt_txrx_peer_get_ref_by_id(soc, peer_id, &txrx_ref_handle, DP_MOD_ID_RX_ERR); @@ -2412,11 +2477,11 @@ dp_rx_wbm_err_process(struct dp_intr *int_ctx, struct dp_soc *soc, dp_info_rl("peer is null peer_id %u err_src %u, " "REO: push_rsn %u err_code %u, " "RXDMA: push_rsn %u err_code %u", - peer_id, wbm_err_info.wbm_err_src, - wbm_err_info.reo_psh_rsn, - wbm_err_info.reo_err_code, - wbm_err_info.rxdma_psh_rsn, - wbm_err_info.rxdma_err_code); + peer_id, wbm_err.info_bit.wbm_err_src, + wbm_err.info_bit.reo_psh_rsn, + wbm_err.info_bit.reo_err_code, + wbm_err.info_bit.rxdma_psh_rsn, + wbm_err.info_bit.rxdma_err_code); /* Set queue_mapping in nbuf to 0 */ dp_set_rx_queue(nbuf, 0); @@ -2442,43 +2507,37 @@ dp_rx_wbm_err_process(struct dp_intr *int_ctx, struct dp_soc *soc, continue; } - pool_id = wbm_err_info.pool_id; + pool_id = wbm_err.info_bit.pool_id; dp_pdev = dp_get_pdev_for_lmac_id(soc, pool_id); if (dp_pdev && dp_pdev->link_peer_stats && txrx_peer && txrx_peer->is_mld_peer) { - link_id = dp_rx_peer_mdata_link_id_get( - soc, - peer_meta_data); - if (!link_id) { - DP_PEER_PER_PKT_STATS_INC( - txrx_peer, - rx.inval_link_id_pkt_cnt, - 1, link_id); - } + link_id = dp_rx_get_stats_arr_idx_from_link_id( + nbuf, + txrx_peer); } else { link_id = 0; } - if (wbm_err_info.wbm_err_src == HAL_RX_WBM_ERR_SRC_REO) { - if (wbm_err_info.reo_psh_rsn + if (wbm_err.info_bit.wbm_err_src == HAL_RX_WBM_ERR_SRC_REO) { + if (wbm_err.info_bit.reo_psh_rsn == HAL_RX_WBM_REO_PSH_RSN_ERROR) { DP_STATS_INC(soc, rx.err.reo_error - [wbm_err_info.reo_err_code], 1); + [wbm_err.info_bit.reo_err_code], 1); /* increment @pdev level */ if (dp_pdev) DP_STATS_INC(dp_pdev, err.reo_error, 1); - switch (wbm_err_info.reo_err_code) { + switch (wbm_err.info_bit.reo_err_code) { /* * Handling for packets which have NULL REO * queue descriptor */ case HAL_REO_ERR_QUEUE_DESC_ADDR_0: - pool_id = wbm_err_info.pool_id; + pool_id = wbm_err.info_bit.pool_id; soc->arch_ops.dp_rx_null_q_desc_handle( soc, nbuf, rx_tlv_hdr, @@ -2496,7 +2555,7 @@ dp_rx_wbm_err_process(struct dp_intr *int_ctx, struct dp_soc *soc, 1, link_id); - pool_id = wbm_err_info.pool_id; + pool_id = wbm_err.info_bit.pool_id; if (hal_rx_msdu_end_first_msdu_get(soc->hal_soc, rx_tlv_hdr)) { @@ -2553,10 +2612,11 @@ dp_rx_wbm_err_process(struct dp_intr *int_ctx, struct dp_soc *soc, default: dp_info_rl("Got pkt with REO ERROR: %d", - wbm_err_info.reo_err_code); + wbm_err.info_bit. + reo_err_code); dp_rx_nbuf_free(nbuf); } - } else if (wbm_err_info.reo_psh_rsn + } else if (wbm_err.info_bit.reo_psh_rsn == HAL_RX_WBM_REO_PSH_RSN_ROUTE) { dp_rx_err_route_hdl(soc, nbuf, txrx_peer, rx_tlv_hdr, @@ -2565,23 +2625,23 @@ dp_rx_wbm_err_process(struct dp_intr *int_ctx, struct dp_soc *soc, } else { /* should not enter here */ dp_rx_err_alert("invalid reo push reason %u", - wbm_err_info.reo_psh_rsn); + wbm_err.info_bit.reo_psh_rsn); dp_rx_nbuf_free(nbuf); qdf_assert_always(0); } - } else if (wbm_err_info.wbm_err_src == + } else if (wbm_err.info_bit.wbm_err_src == HAL_RX_WBM_ERR_SRC_RXDMA) { - if (wbm_err_info.rxdma_psh_rsn + if (wbm_err.info_bit.rxdma_psh_rsn == HAL_RX_WBM_RXDMA_PSH_RSN_ERROR) { DP_STATS_INC(soc, rx.err.rxdma_error - [wbm_err_info.rxdma_err_code], 1); + [wbm_err.info_bit.rxdma_err_code], 1); /* increment @pdev level */ if (dp_pdev) DP_STATS_INC(dp_pdev, err.rxdma_error, 1); - switch (wbm_err_info.rxdma_err_code) { + switch (wbm_err.info_bit.rxdma_err_code) { case HAL_RXDMA_ERR_UNENCRYPTED: case HAL_RXDMA_ERR_WIFI_PARSE: @@ -2591,11 +2651,12 @@ dp_rx_wbm_err_process(struct dp_intr *int_ctx, struct dp_soc *soc, 1, link_id); - pool_id = wbm_err_info.pool_id; + pool_id = wbm_err.info_bit.pool_id; dp_rx_process_rxdma_err(soc, nbuf, rx_tlv_hdr, txrx_peer, - wbm_err_info. + wbm_err. + info_bit. rxdma_err_code, pool_id, link_id); @@ -2643,8 +2704,8 @@ dp_rx_wbm_err_process(struct dp_intr *int_ctx, struct dp_soc *soc, break; } - pool_id = wbm_err_info.pool_id; - err_code = wbm_err_info.rxdma_err_code; + pool_id = wbm_err.info_bit.pool_id; + err_code = wbm_err.info_bit.rxdma_err_code; tlv_hdr = rx_tlv_hdr; dp_rx_process_rxdma_err(soc, nbuf, tlv_hdr, NULL, @@ -2661,8 +2722,8 @@ dp_rx_wbm_err_process(struct dp_intr *int_ctx, struct dp_soc *soc, dp_rx_nbuf_free(nbuf); break; case HAL_RXDMA_UNAUTHORIZED_WDS: - pool_id = wbm_err_info.pool_id; - err_code = wbm_err_info.rxdma_err_code; + pool_id = wbm_err.info_bit.pool_id; + err_code = wbm_err.info_bit.rxdma_err_code; tlv_hdr = rx_tlv_hdr; dp_rx_process_rxdma_err(soc, nbuf, tlv_hdr, @@ -2674,24 +2735,24 @@ dp_rx_wbm_err_process(struct dp_intr *int_ctx, struct dp_soc *soc, default: dp_rx_nbuf_free(nbuf); dp_err_rl("RXDMA error %d", - wbm_err_info.rxdma_err_code); + wbm_err.info_bit.rxdma_err_code); } - } else if (wbm_err_info.rxdma_psh_rsn + } else if (wbm_err.info_bit.rxdma_psh_rsn == HAL_RX_WBM_RXDMA_PSH_RSN_ROUTE) { dp_rx_err_route_hdl(soc, nbuf, txrx_peer, rx_tlv_hdr, HAL_RX_WBM_ERR_SRC_RXDMA, link_id); - } else if (wbm_err_info.rxdma_psh_rsn + } else if (wbm_err.info_bit.rxdma_psh_rsn == HAL_RX_WBM_RXDMA_PSH_RSN_FLUSH) { dp_rx_err_err("rxdma push reason %u", - wbm_err_info.rxdma_psh_rsn); + wbm_err.info_bit.rxdma_psh_rsn); DP_STATS_INC(soc, rx.err.rx_flush_count, 1); dp_rx_nbuf_free(nbuf); } else { /* should not enter here */ dp_rx_err_alert("invalid rxdma push reason %u", - wbm_err_info.rxdma_psh_rsn); + wbm_err.info_bit.rxdma_psh_rsn); dp_rx_nbuf_free(nbuf); qdf_assert_always(0); } diff --git a/dp/wifi3.0/dp_types.h b/dp/wifi3.0/dp_types.h index 4cd71ce388..b787c74e44 100644 --- a/dp/wifi3.0/dp_types.h +++ b/dp/wifi3.0/dp_types.h @@ -2212,7 +2212,6 @@ enum dp_context_type { * @dp_service_near_full_srngs: Handler for servicing the near full IRQ * @tx_implicit_rbm_set: * @dp_rx_peer_metadata_peer_id_get: - * @dp_rx_peer_mdata_link_id_get: Handle to get link id * @dp_rx_chain_msdus: * @txrx_set_vdev_param: target specific ops while setting vdev params * @txrx_get_vdev_mcast_param: target specific ops for getting vdev @@ -2378,7 +2377,6 @@ struct dp_arch_ops { uint8_t bm_id); uint16_t (*dp_rx_peer_metadata_peer_id_get)(struct dp_soc *soc, uint32_t peer_metadata); - uint8_t (*dp_rx_peer_mdata_link_id_get)(uint32_t peer_metadata); bool (*dp_rx_chain_msdus)(struct dp_soc *soc, qdf_nbuf_t nbuf, uint8_t *rx_tlv_hdr, uint8_t mac_id); /* Control Arch Ops */ diff --git a/dp/wifi3.0/li/dp_li.c b/dp/wifi3.0/li/dp_li.c index 7b8ad1c06a..2232b3f8c1 100644 --- a/dp/wifi3.0/li/dp_li.c +++ b/dp/wifi3.0/li/dp_li.c @@ -700,8 +700,6 @@ void dp_initialize_arch_ops_li(struct dp_arch_ops *arch_ops) arch_ops->dp_rxdma_ring_sel_cfg = dp_rxdma_ring_sel_cfg_li; arch_ops->dp_rx_peer_metadata_peer_id_get = dp_rx_peer_metadata_peer_id_get_li; - arch_ops->dp_rx_peer_mdata_link_id_get = - dp_rx_peer_mdata_link_id_get_li; arch_ops->soc_cfg_attach = dp_soc_cfg_attach_li; arch_ops->tx_implicit_rbm_set = dp_tx_implicit_rbm_set_li; arch_ops->txrx_set_vdev_param = dp_txrx_set_vdev_param_li; diff --git a/dp/wifi3.0/li/dp_li_rx.c b/dp/wifi3.0/li/dp_li_rx.c index f3199ca403..bfd97bb7c5 100644 --- a/dp/wifi3.0/li/dp_li_rx.c +++ b/dp/wifi3.0/li/dp_li_rx.c @@ -1091,11 +1091,9 @@ dp_rx_wbm_err_reap_desc_li(struct dp_intr *int_ctx, struct dp_soc *soc, hal_ring_desc_t ring_desc; hal_soc_handle_t hal_soc; struct dp_rx_desc *rx_desc; - union dp_rx_desc_list_elem_t - *head[WLAN_MAX_MLO_CHIPS][MAX_PDEV_CNT] = { { NULL } }; - union dp_rx_desc_list_elem_t - *tail[WLAN_MAX_MLO_CHIPS][MAX_PDEV_CNT] = { { NULL } }; - uint32_t rx_bufs_reaped[WLAN_MAX_MLO_CHIPS][MAX_PDEV_CNT] = { { 0 } }; + union dp_rx_desc_list_elem_t *head[MAX_PDEV_CNT] = { NULL }; + union dp_rx_desc_list_elem_t *tail[MAX_PDEV_CNT] = { NULL }; + uint32_t rx_bufs_reaped[MAX_PDEV_CNT] = { 0 }; uint8_t buf_type; uint8_t mac_id; struct dp_srng *dp_rxdma_srng; @@ -1103,14 +1101,16 @@ dp_rx_wbm_err_reap_desc_li(struct dp_intr *int_ctx, struct dp_soc *soc, qdf_nbuf_t nbuf_head = NULL; qdf_nbuf_t nbuf_tail = NULL; qdf_nbuf_t nbuf; - struct hal_wbm_err_desc_info wbm_err_info = { 0 }; + union hal_wbm_err_info_u wbm_err_info = { 0 }; uint8_t msdu_continuation = 0; bool process_sg_buf = false; uint32_t wbm_err_src; QDF_STATUS status; struct dp_soc *replenish_soc; - uint8_t chip_id; + uint8_t chip_id = 0; struct hal_rx_mpdu_desc_info mpdu_desc_info = { 0 }; + uint8_t *rx_tlv_hdr; + uint32_t peer_mdata; qdf_assert(soc && hal_ring_hdl); hal_soc = soc->hal_soc; @@ -1173,7 +1173,8 @@ dp_rx_wbm_err_reap_desc_li(struct dp_intr *int_ctx, struct dp_soc *soc, continue; } - hal_rx_wbm_err_info_get(ring_desc, &wbm_err_info, hal_soc); + hal_rx_wbm_err_info_get(ring_desc, &wbm_err_info.info_bit, + hal_soc); nbuf = rx_desc->nbuf; status = dp_rx_wbm_desc_nbuf_sanity_check(soc, hal_ring_hdl, @@ -1184,15 +1185,22 @@ dp_rx_wbm_err_reap_desc_li(struct dp_intr *int_ctx, struct dp_soc *soc, nbuf); rx_desc->in_err_state = 1; rx_desc->unmapped = 1; - rx_bufs_reaped[rx_desc->chip_id][rx_desc->pool_id]++; + rx_bufs_reaped[rx_desc->pool_id]++; dp_rx_add_to_free_desc_list( - &head[rx_desc->chip_id][rx_desc->pool_id], - &tail[rx_desc->chip_id][rx_desc->pool_id], + &head[rx_desc->pool_id], + &tail[rx_desc->pool_id], rx_desc); continue; } + /* Update peer_id in nbuf cb */ + rx_tlv_hdr = qdf_nbuf_data(nbuf); + peer_mdata = hal_rx_tlv_peer_meta_data_get(soc->hal_soc, + rx_tlv_hdr); + QDF_NBUF_CB_RX_PEER_ID(rx_desc->nbuf) = + dp_rx_peer_metadata_peer_id_get(soc, peer_mdata); + /* Get MPDU DESC info */ hal_rx_mpdu_desc_info_get(hal_soc, ring_desc, &mpdu_desc_info); @@ -1207,8 +1215,8 @@ dp_rx_wbm_err_reap_desc_li(struct dp_intr *int_ctx, struct dp_soc *soc, dp_ipa_rx_buf_smmu_mapping_unlock(soc); if (qdf_unlikely( - soc->wbm_release_desc_rx_sg_support && - dp_rx_is_sg_formation_required(&wbm_err_info))) { + soc->wbm_release_desc_rx_sg_support && + dp_rx_is_sg_formation_required(&wbm_err_info.info_bit))) { /* SG is detected from continuation bit */ msdu_continuation = hal_rx_wbm_err_msdu_continuation_get(hal_soc, @@ -1240,13 +1248,13 @@ dp_rx_wbm_err_reap_desc_li(struct dp_intr *int_ctx, struct dp_soc *soc, } /* - * save the wbm desc info in nbuf TLV. We will need this + * save the wbm desc info in nbuf CB/TLV. We will need this * info when we do the actual nbuf processing */ - wbm_err_info.pool_id = rx_desc->pool_id; - dp_rx_set_err_info(soc, nbuf, wbm_err_info); + wbm_err_info.info_bit.pool_id = rx_desc->pool_id; + dp_rx_set_wbm_err_info_in_nbuf(soc, nbuf, wbm_err_info); - rx_bufs_reaped[rx_desc->chip_id][rx_desc->pool_id]++; + rx_bufs_reaped[rx_desc->pool_id]++; if (qdf_nbuf_is_rx_chfrag_cont(nbuf) || process_sg_buf) { DP_RX_LIST_APPEND(soc->wbm_sg_param.wbm_sg_nbuf_head, @@ -1271,8 +1279,8 @@ dp_rx_wbm_err_reap_desc_li(struct dp_intr *int_ctx, struct dp_soc *soc, } dp_rx_add_to_free_desc_list - (&head[rx_desc->chip_id][rx_desc->pool_id], - &tail[rx_desc->chip_id][rx_desc->pool_id], rx_desc); + (&head[rx_desc->pool_id], + &tail[rx_desc->pool_id], rx_desc); /* * if continuation bit is set then we have MSDU spread @@ -1285,32 +1293,30 @@ dp_rx_wbm_err_reap_desc_li(struct dp_intr *int_ctx, struct dp_soc *soc, done: dp_srng_access_end(int_ctx, soc, hal_ring_hdl); - for (chip_id = 0; chip_id < WLAN_MAX_MLO_CHIPS; chip_id++) { - for (mac_id = 0; mac_id < MAX_PDEV_CNT; mac_id++) { - /* - * continue with next mac_id if no pkts were reaped - * from that pool - */ - if (!rx_bufs_reaped[chip_id][mac_id]) - continue; + for (mac_id = 0; mac_id < MAX_PDEV_CNT; mac_id++) { + /* + * continue with next mac_id if no pkts were reaped + * from that pool + */ + if (!rx_bufs_reaped[mac_id]) + continue; - replenish_soc = - soc->arch_ops.dp_rx_replenish_soc_get(soc, chip_id); + replenish_soc = + soc->arch_ops.dp_rx_replenish_soc_get(soc, chip_id); - dp_rxdma_srng = - &replenish_soc->rx_refill_buf_ring[mac_id]; + dp_rxdma_srng = + &replenish_soc->rx_refill_buf_ring[mac_id]; - rx_desc_pool = &replenish_soc->rx_desc_buf[mac_id]; + rx_desc_pool = &replenish_soc->rx_desc_buf[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]); - *rx_bufs_used += rx_bufs_reaped[chip_id][mac_id]; - } + dp_rx_buffers_replenish_simple( + replenish_soc, mac_id, + dp_rxdma_srng, + rx_desc_pool, + rx_bufs_reaped[mac_id], + &head[mac_id], + &tail[mac_id]); + *rx_bufs_used += rx_bufs_reaped[mac_id]; } return nbuf_head; } diff --git a/dp/wifi3.0/li/dp_li_rx.h b/dp/wifi3.0/li/dp_li_rx.h index 2cb1340b07..b7d1f0f3b0 100644 --- a/dp/wifi3.0/li/dp_li_rx.h +++ b/dp/wifi3.0/li/dp_li_rx.h @@ -150,12 +150,6 @@ dp_rx_peer_metadata_peer_id_get_li(struct dp_soc *soc, uint32_t peer_metadata) return metadata->peer_id; } -static inline uint8_t -dp_rx_peer_mdata_link_id_get_li(uint32_t peer_metadata) -{ - return 0; -} - bool dp_rx_intrabss_handle_nawds_li(struct dp_soc *soc, struct dp_txrx_peer *ta_peer, qdf_nbuf_t nbuf_copy, diff --git a/hal/wifi3.0/be/hal_be_rx.h b/hal/wifi3.0/be/hal_be_rx.h index ccf942f51d..afd50b47fb 100644 --- a/hal/wifi3.0/be/hal_be_rx.h +++ b/hal/wifi3.0/be/hal_be_rx.h @@ -570,4 +570,34 @@ hal_rx_get_mpdu_msdu_desc_info_be(void *desc_addr, *msdu_info = *(uint32_t *)(&reo_dst_ring->rx_msdu_desc_info_details); } +/** + * hal_rx_wbm_err_mpdu_msdu_info_get_be() - Copies wbm, msdu, mpdu info + * from HAL desc + * @desc_addr: WBM2SW Rx Error ring descriptor addr + * @wbm_err_info: Holds WBM Error info from HAL Rx descriptor + * @mpdu_info: Holds MPDU descriptor info from HAL Rx descriptor + * @msdu_info: Holds MSDU descriptor info from HAL Rx descriptor + * @peer_meta_data: Holds Peer Meta data from HAL Rx descriptor + * + * This function copies the WBM error information, MSDU desc info, + * MPDU Desc info and peer meta data from HAL RX Desc. + * + * Return: void + */ +static inline void +hal_rx_wbm_err_mpdu_msdu_info_get_be(void *desc_addr, + uint32_t *wbm_err_info, + uint32_t *mpdu_info, + uint32_t *msdu_info, + uint32_t *peer_meta_data) +{ + struct wbm2sw_completion_ring_rx *wbm_rx_err_ring; + + wbm_rx_err_ring = (struct wbm2sw_completion_ring_rx *)desc_addr; + *msdu_info = *(uint32_t *)&wbm_rx_err_ring->rx_msdu_desc_info_details; + *mpdu_info = *(uint32_t *)&wbm_rx_err_ring->rx_mpdu_desc_info_details; + *peer_meta_data = + *((uint32_t *)&wbm_rx_err_ring->rx_mpdu_desc_info_details + 1); + *wbm_err_info = *((uint32_t *)wbm_rx_err_ring + 2); +} #endif /* _HAL_BE_RX_H_ */ diff --git a/hal/wifi3.0/hal_rx.h b/hal/wifi3.0/hal_rx.h index 00ad215342..d409a0d3df 100644 --- a/hal/wifi3.0/hal_rx.h +++ b/hal/wifi3.0/hal_rx.h @@ -86,26 +86,62 @@ enum { /** * struct hal_wbm_err_desc_info - structure to hold wbm error codes and reasons * - * @reo_psh_rsn: REO push reason - * @reo_err_code: REO Error code - * @rxdma_psh_rsn: RXDMA push reason - * @rxdma_err_code: RXDMA Error code - * @reserved_1: Reserved bits - * @wbm_err_src: WBM error source - * @pool_id: pool ID, indicates which rxdma pool - * @msdu_continued: Is the MSDU continued - * @reserved_2: Reserved bits + * The fields of this structure is aligned to HAL Rx WBM2SW Ring desc, + * inorder to efficiently copy the data from desc to struct. + * Do not change the sequence of the fields. + * + * @wbm_err_src: Module which initiated the buffer release + * @bm_action: BM action + * @buffer_or_desc_type: Type of Buffer or Desc released + * @return_buffer_manager: Buffer address Info for debug + * @pool_id: pool ID, indicates which rxdma pool + * @cache_id: cache Id + * @cookie_conversion_status: cookie conversion status + * @rxdma_psh_rsn: RXDMA push reason + * @rxdma_err_code: RXDMA Error code + * @reo_psh_rsn: REO push reason + * @reo_err_code: REO Error code + * @wbm_internal_error: WBM Internal error */ struct hal_wbm_err_desc_info { - uint16_t reo_psh_rsn:2, - reo_err_code:5, - rxdma_psh_rsn:2, - rxdma_err_code:5, - reserved_1:2; - uint8_t wbm_err_src:3, - pool_id:2, - msdu_continued:1, - reserved_2:2; +#ifndef WIFI_BIT_ORDER_BIG_ENDIAN + uint32_t wbm_err_src : 3, + bm_action : 3, + buffer_or_desc_type : 3, + return_buffer_manager : 4, + pool_id : 2, + cache_id : 1, + cookie_conversion_status : 1, + rxdma_psh_rsn : 2, + rxdma_err_code : 5, + reo_psh_rsn : 2, + reo_err_code : 5, + wbm_internal_error : 1; +#else + uint32_t wbm_internal_error : 1, + reo_err_code : 5, + reo_psh_rsn : 2, + rxdma_err_code : 5, + rxdma_psh_rsn : 2, + cookie_conversion_status : 1, + cache_id : 1, + pool_id : 2, + return_buffer_manager : 4, + buffer_or_desc_type : 3, + bm_action : 3, + wbm_err_src : 3; +#endif +}; + +/** + * union hal_wbm_err_info_u - Union to hold wbm error information + * @info_bit: hal_wbm_err_desc_info: structure to hold wbm error info bit fields + * @info: variable to hold wbm error info + * + */ +union hal_wbm_err_info_u { + struct hal_wbm_err_desc_info info_bit; + uint32_t info; }; /** diff --git a/qdf/linux/src/i_qdf_nbuf_w.h b/qdf/linux/src/i_qdf_nbuf_w.h index 04888899a9..3d30dc85e6 100644 --- a/qdf/linux/src/i_qdf_nbuf_w.h +++ b/qdf/linux/src/i_qdf_nbuf_w.h @@ -410,10 +410,6 @@ 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) @@ -426,6 +422,10 @@ QDF_COMPILE_TIME_ASSERT(qdf_nbuf_cb_size, (((struct qdf_nbuf_cb *) \ ((skb)->cb))->u.rx.hw_info.desc_info.mpdu_desc_info[1]) +#define QDF_NBUF_CB_RX_ERROR_CODE_INFO(skb) \ + (((struct qdf_nbuf_cb *) \ + ((skb)->cb))->u.rx.hw_info.desc_info.rx_error_codes) + #define QDF_NBUF_CB_RX_PEER_ID(skb) \ (((struct qdf_nbuf_cb *) \ ((skb)->cb))->u.rx.hw_info.desc_tlv_members.peer_id)