diff --git a/dp/wifi3.0/be/dp_be_rx.c b/dp/wifi3.0/be/dp_be_rx.c index eedf2b5fb0..f72aa323ae 100644 --- a/dp/wifi3.0/be/dp_be_rx.c +++ b/dp/wifi3.0/be/dp_be_rx.c @@ -594,8 +594,6 @@ done: tid_stats = &rx_pdev->stats.tid_stats.tid_rx_stats[reo_ring_num][tid]; - dp_rx_send_pktlog(soc, rx_pdev, nbuf, QDF_TX_RX_STATUS_OK); - /* * Check if DMA completed -- msdu_done is the last bit * to be written @@ -686,6 +684,8 @@ done: dp_rx_skip_tlvs(soc, nbuf, msdu_metadata.l3_hdr_pad); } + dp_rx_send_pktlog(soc, rx_pdev, nbuf, QDF_TX_RX_STATUS_OK); + /* * process frame for mulitpass phrase processing */ diff --git a/dp/wifi3.0/dp_internal.h b/dp/wifi3.0/dp_internal.h index ddd16651a4..129979b884 100644 --- a/dp/wifi3.0/dp_internal.h +++ b/dp/wifi3.0/dp_internal.h @@ -3829,6 +3829,65 @@ void dp_rx_send_pktlog(struct dp_soc *soc, struct dp_pdev *pdev, nbuf, status, QDF_RX_DATA_PKT); } } + +/* + * dp_rx_err_send_pktlog() - send rx error packet log + * @soc: soc handle + * @pdev: pdev handle + * @mpdu_desc_info: MPDU descriptor info + * @nbuf: nbuf + * @status: status of rx packet + * @set_pktlen: weither to set packet length + * + * This API should only be called when we have not removed + * Rx TLV from head, and head is pointing to rx_tlv + * + * This function is used to send rx packet from erro path + * for logging for which rx packet tlv is not removed. + * + * Return: None + * + */ +static inline +void dp_rx_err_send_pktlog(struct dp_soc *soc, struct dp_pdev *pdev, + struct hal_rx_mpdu_desc_info *mpdu_desc_info, + qdf_nbuf_t nbuf, enum qdf_dp_tx_rx_status status, + bool set_pktlen) +{ + ol_txrx_pktdump_cb packetdump_cb = pdev->dp_rx_packetdump_cb; + qdf_size_t skip_size; + uint16_t msdu_len, nbuf_len; + uint8_t *rx_tlv_hdr; + struct hal_rx_msdu_metadata msdu_metadata; + + if (qdf_unlikely(packetdump_cb)) { + rx_tlv_hdr = qdf_nbuf_data(nbuf); + nbuf_len = hal_rx_msdu_start_msdu_len_get(soc->hal_soc, + rx_tlv_hdr); + hal_rx_msdu_metadata_get(soc->hal_soc, rx_tlv_hdr, + &msdu_metadata); + + if (mpdu_desc_info->bar_frame || + (mpdu_desc_info->mpdu_flags & HAL_MPDU_F_FRAGMENT)) + skip_size = soc->rx_pkt_tlv_size; + else + skip_size = soc->rx_pkt_tlv_size + + msdu_metadata.l3_hdr_pad; + + if (set_pktlen) { + msdu_len = nbuf_len + skip_size; + qdf_nbuf_set_pktlen(nbuf, qdf_min(msdu_len, + (uint16_t)RX_DATA_BUFFER_SIZE)); + } + + qdf_nbuf_pull_head(nbuf, skip_size); + packetdump_cb((ol_txrx_soc_handle)soc, pdev->pdev_id, + QDF_NBUF_CB_RX_VDEV_ID(nbuf), + nbuf, status, QDF_RX_DATA_PKT); + qdf_nbuf_push_head(nbuf, skip_size); + } +} + #else static inline void dp_tx_send_pktlog(struct dp_soc *soc, struct dp_pdev *pdev, @@ -3842,5 +3901,13 @@ void dp_rx_send_pktlog(struct dp_soc *soc, struct dp_pdev *pdev, qdf_nbuf_t nbuf, enum qdf_dp_tx_rx_status status) { } + +static inline +void dp_rx_err_send_pktlog(struct dp_soc *soc, struct dp_pdev *pdev, + struct hal_rx_mpdu_desc_info *mpdu_desc_info, + qdf_nbuf_t nbuf, enum qdf_dp_tx_rx_status status, + bool set_pktlen) +{ +} #endif #endif /* #ifndef _DP_INTERNAL_H_ */ diff --git a/dp/wifi3.0/dp_rx.c b/dp/wifi3.0/dp_rx.c index 244816b7ea..61ecc212ea 100644 --- a/dp/wifi3.0/dp_rx.c +++ b/dp/wifi3.0/dp_rx.c @@ -3078,6 +3078,11 @@ bool dp_rx_deliver_special_frame(struct dp_soc *soc, dp_rx_set_hdr_pad(nbuf, l2_hdr_offset); qdf_nbuf_pull_head(nbuf, skip_len); + if (txrx_peer->vdev) { + dp_rx_send_pktlog(soc, txrx_peer->vdev->pdev, nbuf, + QDF_TX_RX_STATUS_OK); + } + if (dp_rx_is_special_frame(nbuf, frame_mask)) { dp_info("special frame, mpdu sn 0x%x", hal_rx_get_rx_sequence(soc->hal_soc, rx_tlv_hdr)); diff --git a/dp/wifi3.0/dp_rx_defrag.c b/dp/wifi3.0/dp_rx_defrag.c index 72225c3253..c88acbe821 100644 --- a/dp/wifi3.0/dp_rx_defrag.c +++ b/dp/wifi3.0/dp_rx_defrag.c @@ -1790,6 +1790,9 @@ dp_rx_defrag_store_fragment(struct dp_soc *soc, pdev = txrx_peer->vdev->pdev; rx_tid = &txrx_peer->rx_tid[tid]; + dp_rx_err_send_pktlog(soc, pdev, mpdu_desc_info, frag, + QDF_TX_RX_STATUS_OK, false); + qdf_spin_lock_bh(&rx_tid->defrag_tid_lock); rx_reorder_array_elem = txrx_peer->rx_tid[tid].array; if (!rx_reorder_array_elem) { @@ -2044,7 +2047,6 @@ uint32_t dp_rx_frag_handle(struct dp_soc *soc, hal_ring_desc_t ring_desc, if (rx_desc->unmapped) return rx_bufs_used; - dp_rx_send_pktlog(soc, pdev, msdu, QDF_TX_RX_STATUS_OK); dp_ipa_rx_buf_smmu_mapping_lock(soc); dp_rx_nbuf_unmap_pool(soc, rx_desc_pool, rx_desc->nbuf); rx_desc->unmapped = 1; diff --git a/dp/wifi3.0/dp_rx_err.c b/dp/wifi3.0/dp_rx_err.c index 9b130f61b9..5f2f0235ca 100644 --- a/dp/wifi3.0/dp_rx_err.c +++ b/dp/wifi3.0/dp_rx_err.c @@ -370,9 +370,9 @@ more_msdu_link_desc: if (hal_rx_encryption_info_valid(soc->hal_soc, rx_tlv_hdr)) hal_rx_print_pn(soc->hal_soc, rx_tlv_hdr); - dp_rx_send_pktlog(soc, pdev, rx_desc->nbuf, - QDF_TX_RX_STATUS_DROP); - + dp_rx_err_send_pktlog(soc, pdev, mpdu_desc_info, + rx_desc->nbuf, + QDF_TX_RX_STATUS_DROP, true); /* Just free the buffers */ dp_rx_buffer_pool_nbuf_free(soc, rx_desc->nbuf, *mac_id); @@ -863,7 +863,8 @@ dp_rx_bar_frame_handle(struct dp_soc *soc, _dp_rx_bar_frame_handle(soc, nbuf, mpdu_desc_info, tid, err_status, err_code); - dp_rx_send_pktlog(soc, pdev, nbuf, QDF_TX_RX_STATUS_DROP); + dp_rx_err_send_pktlog(soc, pdev, mpdu_desc_info, nbuf, + QDF_TX_RX_STATUS_DROP, true); dp_rx_link_desc_return(soc, ring_desc, HAL_BM_ACTION_PUT_IN_IDLE_LIST); dp_rx_buffer_pool_nbuf_free(soc, rx_desc->nbuf, @@ -1541,7 +1542,6 @@ more_msdu_link_desc: /* all buffers from a MSDU link belong to same pdev */ pdev = dp_get_pdev_for_lmac_id(soc, rx_desc_pool_id); - dp_rx_send_pktlog(soc, pdev, nbuf, QDF_TX_RX_STATUS_OK); rx_desc_pool = &soc->rx_desc_buf[rx_desc_pool_id]; dp_ipa_rx_buf_smmu_mapping_lock(soc); dp_rx_nbuf_unmap_pool(soc, rx_desc_pool, nbuf); diff --git a/dp/wifi3.0/li/dp_li_rx.c b/dp/wifi3.0/li/dp_li_rx.c index 46feb06243..1ac1811f38 100644 --- a/dp/wifi3.0/li/dp_li_rx.c +++ b/dp/wifi3.0/li/dp_li_rx.c @@ -658,8 +658,6 @@ done: old_tid = tid; } - dp_rx_send_pktlog(soc, rx_pdev, nbuf, QDF_TX_RX_STATUS_OK); - /* * Check if DMA completed -- msdu_done is the last bit * to be written @@ -757,6 +755,8 @@ done: dp_rx_skip_tlvs(soc, nbuf, msdu_metadata.l3_hdr_pad); } + dp_rx_send_pktlog(soc, rx_pdev, nbuf, QDF_TX_RX_STATUS_OK); + /* * process frame for mulitpass phrase processing */