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
This commit is contained in:
Prakash Manjunathappa
2022-09-08 23:55:11 -07:00
committed by Madan Koyyalamudi
parent 499b2deb3b
commit 60c0c089cd
6 changed files with 52 additions and 8 deletions

View File

@@ -2650,6 +2650,7 @@ struct cdp_soc_stats {
uint32_t rx_hw_err_msdu_buf_rcved; uint32_t rx_hw_err_msdu_buf_rcved;
uint32_t rx_hw_err_msdu_buf_invalid_cookie; uint32_t rx_hw_err_msdu_buf_invalid_cookie;
uint32_t rx_hw_err_oor_drop; 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_to_stack;
uint32_t rx_hw_err_oor_sg_count; uint32_t rx_hw_err_oor_sg_count;
uint32_t msdu_count_mismatch; uint32_t msdu_count_mismatch;

View File

@@ -1505,12 +1505,6 @@ out:
if (soc->cdp_soc.ol_ops->rx_invalid_peer) if (soc->cdp_soc.ol_ops->rx_invalid_peer)
soc->cdp_soc.ol_ops->rx_invalid_peer(vdev->vdev_id, wh); soc->cdp_soc.ol_ops->rx_invalid_peer(vdev->vdev_id, wh);
free: 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 */ /* Drop and free packet */
curr_nbuf = mpdu; curr_nbuf = mpdu;

View File

@@ -1557,6 +1557,17 @@ more_msdu_link_desc:
goto process_next_msdu; 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_first = qdf_nbuf_data(head_nbuf);
rx_tlv_hdr_last = qdf_nbuf_data(tail_nbuf); rx_tlv_hdr_last = qdf_nbuf_data(tail_nbuf);

View File

@@ -7262,6 +7262,8 @@ void dp_txrx_path_stats(struct dp_soc *soc)
pdev->soc->stats.rx.err.reo_err_oor_to_stack); pdev->soc->stats.rx.err.reo_err_oor_to_stack);
DP_PRINT_STATS("REO err oor msdu drop: %u", DP_PRINT_STATS("REO err oor msdu drop: %u",
pdev->soc->stats.rx.err.reo_err_oor_drop); 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", DP_PRINT_STATS("Rx err msdu rejected: %d",
soc->stats.rx.err.rejected); soc->stats.rx.err.rejected);
DP_PRINT_STATS("Rx raw frame dropped: %d", 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", DP_PRINT_STATS("REO err oor msdu drop: %d",
soc->stats.rx.err.reo_err_oor_drop); 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", DP_PRINT_STATS("Rx err msdu rejected: %d",
soc->stats.rx.err.rejected); 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.reo_err_msdu_buf_invalid_cookie;
soc_stats->rx.err.rx_hw_err_oor_drop = soc_stats->rx.err.rx_hw_err_oor_drop =
soc->stats.rx.err.reo_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.rx_hw_err_oor_to_stack =
soc->stats.rx.err.reo_err_oor_to_stack; soc->stats.rx.err.reo_err_oor_to_stack;
soc_stats->rx.err.rx_hw_err_oor_sg_count = soc_stats->rx.err.rx_hw_err_oor_sg_count =

View File

@@ -1217,6 +1217,8 @@ struct dp_soc_stats {
uint32_t reo_err_oor_to_stack; uint32_t reo_err_oor_to_stack;
/* REO OOR scattered msdu count */ /* REO OOR scattered msdu count */
uint32_t reo_err_oor_sg_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*/ /* RX msdu rejected count on delivery to vdev stack_fn*/
uint32_t rejected; uint32_t rejected;
/* Incorrect msdu count in MPDU desc info */ /* Incorrect msdu count in MPDU desc info */

View File

@@ -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_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 * hal_rx_tlv_populate_mpdu_desc_info_kiwi() - Populate the local mpdu_desc_info
* elements from the rx tlvs * 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; 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_seq = mpdu_info->mpdu_sequence_number;
mpdu_desc_info->mpdu_flags = hal_rx_get_mpdu_flags((uint32_t *) mpdu_desc_info->mpdu_flags = hal_rx_get_mpdu_flags_from_tlv(mpdu_info);
mpdu_info);
mpdu_desc_info->peer_meta_data = mpdu_info->peer_meta_data; mpdu_desc_info->peer_meta_data = mpdu_info->peer_meta_data;
mpdu_desc_info->bar_frame = mpdu_info->bar_frame; mpdu_desc_info->bar_frame = mpdu_info->bar_frame;
} }