From 60c0c089cdbcaa99ffd56fff525763ba3b9fb8e7 Mon Sep 17 00:00:00 2001 From: Prakash Manjunathappa Date: Thu, 8 Sep 2022 23:55:11 -0700 Subject: [PATCH] qcacmn: Free the raw mode mpdus in REO error ring Raw mode mpdus in REO end up resulting in NULL_QUEUE_DESCRIPTOR error. Raw mode mpdus are not expected in REO, free them without further processing. Change-Id: Ica920caecf90a1107ce17836051e1019c9dfc994 CRs-Fixed: 3282836 --- dp/inc/cdp_txrx_stats_struct.h | 1 + dp/wifi3.0/dp_rx.c | 6 ------ dp/wifi3.0/dp_rx_err.c | 11 +++++++++++ dp/wifi3.0/dp_stats.c | 7 +++++++ dp/wifi3.0/dp_types.h | 2 ++ hal/wifi3.0/kiwi/hal_kiwi.c | 33 +++++++++++++++++++++++++++++++-- 6 files changed, 52 insertions(+), 8 deletions(-) diff --git a/dp/inc/cdp_txrx_stats_struct.h b/dp/inc/cdp_txrx_stats_struct.h index 4b740a6162..bcbcf3b5fa 100644 --- a/dp/inc/cdp_txrx_stats_struct.h +++ b/dp/inc/cdp_txrx_stats_struct.h @@ -2650,6 +2650,7 @@ struct cdp_soc_stats { uint32_t rx_hw_err_msdu_buf_rcved; uint32_t rx_hw_err_msdu_buf_invalid_cookie; uint32_t rx_hw_err_oor_drop; + uint32_t rx_hw_err_raw_mpdu_drop; uint32_t rx_hw_err_oor_to_stack; uint32_t rx_hw_err_oor_sg_count; uint32_t msdu_count_mismatch; diff --git a/dp/wifi3.0/dp_rx.c b/dp/wifi3.0/dp_rx.c index 0bc94166d7..f285cfa028 100644 --- a/dp/wifi3.0/dp_rx.c +++ b/dp/wifi3.0/dp_rx.c @@ -1505,12 +1505,6 @@ out: if (soc->cdp_soc.ol_ops->rx_invalid_peer) soc->cdp_soc.ol_ops->rx_invalid_peer(vdev->vdev_id, wh); free: - /* reset the head and tail pointers */ - pdev = dp_get_pdev_for_lmac_id(soc, mac_id); - if (pdev) { - pdev->invalid_peer_head_msdu = NULL; - pdev->invalid_peer_tail_msdu = NULL; - } /* Drop and free packet */ curr_nbuf = mpdu; diff --git a/dp/wifi3.0/dp_rx_err.c b/dp/wifi3.0/dp_rx_err.c index e34a683487..9da91993c4 100644 --- a/dp/wifi3.0/dp_rx_err.c +++ b/dp/wifi3.0/dp_rx_err.c @@ -1557,6 +1557,17 @@ more_msdu_link_desc: goto process_next_msdu; } + hal_rx_tlv_populate_mpdu_desc_info(soc->hal_soc, + qdf_nbuf_data(head_nbuf), + mpdu_desc_info); + if (qdf_unlikely(mpdu_desc_info->mpdu_flags & + HAL_MPDU_F_RAW_AMPDU)) { + dp_err_rl("RAW ampdu in REO error not expected"); + DP_STATS_INC(soc, rx.err.reo_err_raw_mpdu_drop, 1); + qdf_nbuf_list_free(head_nbuf); + goto process_next_msdu; + } + rx_tlv_hdr_first = qdf_nbuf_data(head_nbuf); rx_tlv_hdr_last = qdf_nbuf_data(tail_nbuf); diff --git a/dp/wifi3.0/dp_stats.c b/dp/wifi3.0/dp_stats.c index 2f0b324c01..2a0fc49b60 100644 --- a/dp/wifi3.0/dp_stats.c +++ b/dp/wifi3.0/dp_stats.c @@ -7262,6 +7262,8 @@ void dp_txrx_path_stats(struct dp_soc *soc) pdev->soc->stats.rx.err.reo_err_oor_to_stack); DP_PRINT_STATS("REO err oor msdu drop: %u", pdev->soc->stats.rx.err.reo_err_oor_drop); + DP_PRINT_STATS("REO err raw mpdu drop: %u", + pdev->soc->stats.rx.err.reo_err_raw_mpdu_drop); DP_PRINT_STATS("Rx err msdu rejected: %d", soc->stats.rx.err.rejected); DP_PRINT_STATS("Rx raw frame dropped: %d", @@ -7928,6 +7930,9 @@ dp_print_soc_rx_stats(struct dp_soc *soc) DP_PRINT_STATS("REO err oor msdu drop: %d", soc->stats.rx.err.reo_err_oor_drop); + DP_PRINT_STATS("REO err raw ampdu drop: %d", + soc->stats.rx.err.reo_err_raw_mpdu_drop); + DP_PRINT_STATS("Rx err msdu rejected: %d", soc->stats.rx.err.rejected); @@ -8910,6 +8915,8 @@ QDF_STATUS dp_txrx_get_soc_stats(struct cdp_soc_t *soc_hdl, soc->stats.rx.err.reo_err_msdu_buf_invalid_cookie; soc_stats->rx.err.rx_hw_err_oor_drop = soc->stats.rx.err.reo_err_oor_drop; + soc_stats->rx.err.rx_hw_err_raw_mpdu_drop = + soc->stats.rx.err.reo_err_raw_mpdu_drop; soc_stats->rx.err.rx_hw_err_oor_to_stack = soc->stats.rx.err.reo_err_oor_to_stack; soc_stats->rx.err.rx_hw_err_oor_sg_count = diff --git a/dp/wifi3.0/dp_types.h b/dp/wifi3.0/dp_types.h index bc3cc46caa..cd0c9c9b64 100644 --- a/dp/wifi3.0/dp_types.h +++ b/dp/wifi3.0/dp_types.h @@ -1217,6 +1217,8 @@ struct dp_soc_stats { uint32_t reo_err_oor_to_stack; /* REO OOR scattered msdu count */ uint32_t reo_err_oor_sg_count; + /* REO ERR RAW mpdu drops */ + uint32_t reo_err_raw_mpdu_drop; /* RX msdu rejected count on delivery to vdev stack_fn*/ uint32_t rejected; /* Incorrect msdu count in MPDU desc info */ diff --git a/hal/wifi3.0/kiwi/hal_kiwi.c b/hal/wifi3.0/kiwi/hal_kiwi.c index 5ad8d0fe2f..e0f7344121 100644 --- a/hal/wifi3.0/kiwi/hal_kiwi.c +++ b/hal/wifi3.0/kiwi/hal_kiwi.c @@ -1109,6 +1109,36 @@ static void hal_rx_dump_pkt_tlvs_kiwi(hal_soc_handle_t hal_soc_hdl, hal_rx_dump_pkt_hdr_tlv_kiwi(pkt_tlvs, dbg_level); } +/** + * hal_rx_get_mpdu_flags_from_tlv() - Populate the local mpdu_flags elements + * from the rx tlvs + * @mpdu_info: buf address to rx_mpdu_info + * + * Return: mpdu_flags. + */ +static inline uint32_t +hal_rx_get_mpdu_flags_from_tlv(struct rx_mpdu_info *mpdu_info) +{ + uint32_t mpdu_flags = 0; + + if (mpdu_info->fragment_flag) + mpdu_flags |= HAL_MPDU_F_FRAGMENT; + + if (mpdu_info->mpdu_retry) + mpdu_flags |= HAL_MPDU_F_RETRY_BIT; + + if (mpdu_info->ampdu_flag) + mpdu_flags |= HAL_MPDU_F_AMPDU_FLAG; + + if (mpdu_info->raw_mpdu) + mpdu_flags |= HAL_MPDU_F_RAW_AMPDU; + + if (mpdu_info->mpdu_qos_control_valid) + mpdu_flags |= HAL_MPDU_F_QOS_CONTROL_VALID; + + return mpdu_flags; +} + /** * hal_rx_tlv_populate_mpdu_desc_info_kiwi() - Populate the local mpdu_desc_info * elements from the rx tlvs @@ -1130,8 +1160,7 @@ hal_rx_tlv_populate_mpdu_desc_info_kiwi(uint8_t *buf, struct rx_mpdu_info *mpdu_info = &mpdu_start->rx_mpdu_info_details; mpdu_desc_info->mpdu_seq = mpdu_info->mpdu_sequence_number; - mpdu_desc_info->mpdu_flags = hal_rx_get_mpdu_flags((uint32_t *) - mpdu_info); + mpdu_desc_info->mpdu_flags = hal_rx_get_mpdu_flags_from_tlv(mpdu_info); mpdu_desc_info->peer_meta_data = mpdu_info->peer_meta_data; mpdu_desc_info->bar_frame = mpdu_info->bar_frame; }