diff --git a/dp/wifi3.0/be/dp_be_rx.c b/dp/wifi3.0/be/dp_be_rx.c index 5aa6fb8810..23e588deb9 100644 --- a/dp/wifi3.0/be/dp_be_rx.c +++ b/dp/wifi3.0/be/dp_be_rx.c @@ -592,6 +592,8 @@ 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 diff --git a/dp/wifi3.0/dp_internal.h b/dp/wifi3.0/dp_internal.h index 5675d2f4c4..758f2c9008 100644 --- a/dp/wifi3.0/dp_internal.h +++ b/dp/wifi3.0/dp_internal.h @@ -3647,4 +3647,68 @@ QDF_STATUS dp_get_peer_telemetry_stats(struct cdp_soc_t *soc_hdl, uint8_t *addr, struct cdp_peer_telemetry_stats *stats); #endif /* WLAN_TELEMETRY_STATS_SUPPORT */ + +#ifdef CONNECTIVITY_PKTLOG +/* + * dp_tx_send_pktlog() - send tx packet log + * @soc: soc handle + * @pdev: pdev handle + * @nbuf: nbuf + * @status: status of tx packet + * + * This function is used to send tx packet for logging + * + * Return: None + * + */ +static inline +void dp_tx_send_pktlog(struct dp_soc *soc, struct dp_pdev *pdev, + qdf_nbuf_t nbuf, enum qdf_dp_tx_rx_status status) +{ + ol_txrx_pktdump_cb packetdump_cb = pdev->dp_tx_packetdump_cb; + + if (qdf_unlikely(packetdump_cb)) { + packetdump_cb((ol_txrx_soc_handle)soc, pdev->pdev_id, + QDF_NBUF_CB_TX_VDEV_CTX(nbuf), + nbuf, status, QDF_TX_DATA_PKT); + } +} + +/* + * dp_rx_send_pktlog() - send rx packet log + * @soc: soc handle + * @pdev: pdev handle + * @nbuf: nbuf + * @status: status of rx packet + * + * This function is used to send rx packet for logging + * + * Return: None + * + */ +static inline +void dp_rx_send_pktlog(struct dp_soc *soc, struct dp_pdev *pdev, + qdf_nbuf_t nbuf, enum qdf_dp_tx_rx_status status) +{ + ol_txrx_pktdump_cb packetdump_cb = pdev->dp_rx_packetdump_cb; + + if (qdf_unlikely(packetdump_cb)) { + packetdump_cb((ol_txrx_soc_handle)soc, pdev->pdev_id, + QDF_NBUF_CB_RX_VDEV_ID(nbuf), + nbuf, status, QDF_RX_DATA_PKT); + } +} +#else +static inline +void dp_tx_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_send_pktlog(struct dp_soc *soc, struct dp_pdev *pdev, + qdf_nbuf_t nbuf, enum qdf_dp_tx_rx_status status) +{ +} +#endif #endif /* #ifndef _DP_INTERNAL_H_ */ diff --git a/dp/wifi3.0/dp_main.c b/dp/wifi3.0/dp_main.c index 36e199256b..565899d25e 100644 --- a/dp/wifi3.0/dp_main.c +++ b/dp/wifi3.0/dp_main.c @@ -13445,6 +13445,72 @@ static int dp_set_peer_txq_flush_config(struct cdp_soc_t *soc_hdl, } #endif +#ifdef CONNECTIVITY_PKTLOG +/** + * dp_register_packetdump_callback() - registers + * tx data packet, tx mgmt. packet and rx data packet + * dump callback handler. + * + * @soc_hdl: Datapath soc handle + * @pdev_id: id of data path pdev handle + * @dp_tx_packetdump_cb: tx packetdump cb + * @dp_rx_packetdump_cb: rx packetdump cb + * + * This function is used to register tx data pkt, tx mgmt. + * pkt and rx data pkt dump callback + * + * Return: None + * + */ +static inline +void dp_register_packetdump_callback(struct cdp_soc_t *soc_hdl, uint8_t pdev_id, + ol_txrx_pktdump_cb dp_tx_packetdump_cb, + ol_txrx_pktdump_cb dp_rx_packetdump_cb) +{ + struct dp_soc *soc = cdp_soc_t_to_dp_soc(soc_hdl); + struct dp_pdev *pdev; + + pdev = dp_get_pdev_from_soc_pdev_id_wifi3(soc, pdev_id); + if (!pdev) { + dp_err("pdev is NULL!"); + return; + } + + pdev->dp_tx_packetdump_cb = dp_tx_packetdump_cb; + pdev->dp_rx_packetdump_cb = dp_rx_packetdump_cb; +} + +/** + * dp_deregister_packetdump_callback() - deregidters + * tx data packet, tx mgmt. packet and rx data packet + * dump callback handler + * @soc_hdl: Datapath soc handle + * @pdev_id: id of data path pdev handle + * + * This function is used to deregidter tx data pkt., + * tx mgmt. pkt and rx data pkt. dump callback + * + * Return: None + * + */ +static inline +void dp_deregister_packetdump_callback(struct cdp_soc_t *soc_hdl, + uint8_t pdev_id) +{ + struct dp_soc *soc = cdp_soc_t_to_dp_soc(soc_hdl); + struct dp_pdev *pdev; + + pdev = dp_get_pdev_from_soc_pdev_id_wifi3(soc, pdev_id); + if (!pdev) { + dp_err("pdev is NULL!"); + return; + } + + pdev->dp_tx_packetdump_cb = NULL; + pdev->dp_rx_packetdump_cb = NULL; +} +#endif + #ifdef DP_PEER_EXTENDED_API static struct cdp_misc_ops dp_ops_misc = { #ifdef FEATURE_WLAN_TDLS @@ -13481,6 +13547,10 @@ static struct cdp_misc_ops dp_ops_misc = { #ifdef WLAN_FEATURE_PEER_TXQ_FLUSH_CONF .set_peer_txq_flush_config = dp_set_peer_txq_flush_config, #endif +#ifdef CONNECTIVITY_PKTLOG + .register_pktdump_cb = dp_register_packetdump_callback, + .unregister_pktdump_cb = dp_deregister_packetdump_callback, +#endif }; #endif diff --git a/dp/wifi3.0/dp_rx_defrag.c b/dp/wifi3.0/dp_rx_defrag.c index da55ffd84f..d69913be53 100644 --- a/dp/wifi3.0/dp_rx_defrag.c +++ b/dp/wifi3.0/dp_rx_defrag.c @@ -2044,6 +2044,7 @@ 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 1af31b8a85..db8a28d4b3 100644 --- a/dp/wifi3.0/dp_rx_err.c +++ b/dp/wifi3.0/dp_rx_err.c @@ -370,6 +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); + /* Just free the buffers */ dp_rx_buffer_pool_nbuf_free(soc, rx_desc->nbuf, *mac_id); @@ -862,6 +865,7 @@ 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_link_desc_return(soc, ring_desc, HAL_BM_ACTION_PUT_IN_IDLE_LIST); dp_rx_buffer_pool_nbuf_free(soc, rx_desc->nbuf, @@ -1539,6 +1543,7 @@ 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/dp_tx.c b/dp/wifi3.0/dp_tx.c index b46040288a..43a0a9a63d 100644 --- a/dp/wifi3.0/dp_tx.c +++ b/dp/wifi3.0/dp_tx.c @@ -4792,6 +4792,7 @@ void dp_tx_comp_process_tx_status(struct dp_soc *soc, dp_tx_update_peer_delay_stats(txrx_peer, tx_desc, ts->tid, ring_id); dp_tx_update_peer_sawf_stats(soc, vdev, txrx_peer, tx_desc, ts, ts->tid); + dp_tx_send_pktlog(soc, vdev->pdev, nbuf, dp_status); #ifdef QCA_SUPPORT_RDK_STATS if (soc->peerstats_enabled) diff --git a/dp/wifi3.0/dp_types.h b/dp/wifi3.0/dp_types.h index c8a4572e32..50134c8c90 100644 --- a/dp/wifi3.0/dp_types.h +++ b/dp/wifi3.0/dp_types.h @@ -2930,6 +2930,11 @@ struct dp_pdev { #ifdef WLAN_FEATURE_MARK_FIRST_WAKEUP_PACKET uint8_t is_first_wakeup_packet; #endif +#ifdef CONNECTIVITY_PKTLOG + /* packetdump callback functions */ + ol_txrx_pktdump_cb dp_tx_packetdump_cb; + ol_txrx_pktdump_cb dp_rx_packetdump_cb; +#endif }; struct dp_peer; diff --git a/dp/wifi3.0/li/dp_li_rx.c b/dp/wifi3.0/li/dp_li_rx.c index c7b925705d..1c4706956d 100644 --- a/dp/wifi3.0/li/dp_li_rx.c +++ b/dp/wifi3.0/li/dp_li_rx.c @@ -658,6 +658,8 @@ 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