diff --git a/dp/wifi3.0/dp_rx.c b/dp/wifi3.0/dp_rx.c index 8df54658920d..d16d6c33b7a7 100644 --- a/dp/wifi3.0/dp_rx.c +++ b/dp/wifi3.0/dp_rx.c @@ -1964,27 +1964,12 @@ more_data: dp_rx_desc_nbuf_sanity_check(ring_desc, rx_desc); - /* TODO */ - /* - * Need a separate API for unmapping based on - * phyiscal address - */ - qdf_nbuf_unmap_single(soc->osdev, rx_desc->nbuf, - QDF_DMA_FROM_DEVICE); - rx_desc->unmapped = 1; - - core_id = smp_processor_id(); - DP_STATS_INC(soc, rx.ring_packets[core_id][ring_id], 1); - /* Get MPDU DESC info */ hal_rx_mpdu_desc_info_get(ring_desc, &mpdu_desc_info); /* Get MSDU DESC info */ hal_rx_msdu_desc_info_get(ring_desc, &msdu_desc_info); - if (mpdu_desc_info.mpdu_flags & HAL_MPDU_F_RETRY_BIT) - qdf_nbuf_set_rx_retry_flag(rx_desc->nbuf, 1); - if (qdf_unlikely(msdu_desc_info.msdu_flags & HAL_MSDU_F_MSDU_CONTINUATION)) { /* previous msdu has end bit set, so current one is @@ -2015,6 +2000,20 @@ more_data: } + /* + * move unmap after scattered msdu waiting break logic + * in case double skb unmap happened. + */ + qdf_nbuf_unmap_single(soc->osdev, rx_desc->nbuf, + QDF_DMA_FROM_DEVICE); + rx_desc->unmapped = 1; + + core_id = smp_processor_id(); + DP_STATS_INC(soc, rx.ring_packets[core_id][ring_id], 1); + + if (mpdu_desc_info.mpdu_flags & HAL_MPDU_F_RETRY_BIT) + qdf_nbuf_set_rx_retry_flag(rx_desc->nbuf, 1); + if (qdf_unlikely(mpdu_desc_info.mpdu_flags & HAL_MPDU_F_RAW_AMPDU)) qdf_nbuf_set_raw_frame(rx_desc->nbuf, 1); @@ -2081,7 +2080,12 @@ more_data: rx_desc); num_rx_bufs_reaped++; - if (dp_rx_reap_loop_pkt_limit_hit(soc, num_rx_bufs_reaped)) + /* + * only if complete msdu is received for scatter case, + * then allow break. + */ + if (is_prev_msdu_last && + dp_rx_reap_loop_pkt_limit_hit(soc, num_rx_bufs_reaped)) break; } done: