diff --git a/dp/inc/cdp_txrx_stats_struct.h b/dp/inc/cdp_txrx_stats_struct.h index c3e9b8181f..4458f88eaa 100644 --- a/dp/inc/cdp_txrx_stats_struct.h +++ b/dp/inc/cdp_txrx_stats_struct.h @@ -1914,6 +1914,7 @@ struct cdp_tx_ingress_stats { uint32_t drop_ingress; uint32_t invalid_peer_id_in_exc_path; uint32_t tx_mcast_drop; + uint32_t fw2wbm_tx_drop; } dropped; /* Mesh packets info */ diff --git a/dp/wifi3.0/be/dp_be_tx.c b/dp/wifi3.0/be/dp_be_tx.c index 38ed6e4fae..bcfcb93ab6 100644 --- a/dp/wifi3.0/be/dp_be_tx.c +++ b/dp/wifi3.0/be/dp_be_tx.c @@ -954,6 +954,34 @@ QDF_STATUS dp_sawf_tx_enqueue_fail_peer_stats(struct dp_soc *soc, #endif #ifdef WLAN_SUPPORT_PPEDS + +/* + * dp_ppeds_stats() - Accounting fw2wbm_tx_drop drops in Tx path + * @soc: Handle to DP Soc structure + * @peer_id: Peer ID in the descriptor + * + * Return: NONE + */ + +static inline +void dp_ppeds_stats(struct dp_soc *soc, uint16_t peer_id) +{ + struct dp_vdev *vdev = NULL; + struct dp_txrx_peer *txrx_peer = NULL; + dp_txrx_ref_handle txrx_ref_handle = NULL; + + DP_STATS_INC(soc, tx.fw2wbm_tx_drop, 1); + txrx_peer = dp_txrx_peer_get_ref_by_id(soc, + peer_id, + &txrx_ref_handle, + DP_MOD_ID_TX_COMP); + if (txrx_peer) { + vdev = txrx_peer->vdev; + DP_STATS_INC(vdev, tx_i.dropped.fw2wbm_tx_drop, 1); + dp_txrx_peer_unref_delete(txrx_ref_handle, DP_MOD_ID_TX_COMP); + } +} + /** * dp_ppeds_tx_comp_handler()- Handle tx completions for ppe2tcl ring * @soc: Handle to DP Soc structure @@ -965,7 +993,7 @@ int dp_ppeds_tx_comp_handler(struct dp_soc_be *be_soc, uint32_t quota) { uint32_t num_avail_for_reap = 0; void *tx_comp_hal_desc; - uint8_t buf_src; + uint8_t buf_src, status = 0; uint32_t count = 0; struct dp_tx_desc_s *tx_desc = NULL; struct dp_tx_desc_s *head_desc = NULL; @@ -1026,6 +1054,10 @@ int dp_ppeds_tx_comp_handler(struct dp_soc_be *be_soc, uint32_t quota) tx_desc->buffer_src = buf_src; if (qdf_unlikely(buf_src == HAL_TX_COMP_RELEASE_SOURCE_FW)) { + status = hal_tx_comp_get_tx_status(tx_comp_hal_desc); + if (status != HTT_TX_FW2WBM_TX_STATUS_OK) + dp_ppeds_stats(soc, tx_desc->peer_id); + qdf_nbuf_free(tx_desc->nbuf); dp_ppeds_tx_desc_free(soc, tx_desc); } else { diff --git a/dp/wifi3.0/be/dp_be_tx.h b/dp/wifi3.0/be/dp_be_tx.h index e26fc86134..8434e54564 100644 --- a/dp/wifi3.0/be/dp_be_tx.h +++ b/dp/wifi3.0/be/dp_be_tx.h @@ -227,6 +227,18 @@ void dp_tx_desc_pool_deinit_be(struct dp_soc *soc, * Return: Number of tx completions processed */ int dp_ppeds_tx_comp_handler(struct dp_soc_be *be_soc, uint32_t quota); + +/* + * dp_ppeds_stats() - Accounting fw2wbm_tx_drop drops in Tx path + * @soc: Handle to DP Soc structure + * @peer_id: Peer ID in the descriptor + * + * Return: NONE + */ + +static inline +void dp_ppeds_stats(struct dp_soc *soc, uint16_t peer_id); + #endif #ifdef WLAN_FEATURE_11BE_MLO /** diff --git a/dp/wifi3.0/dp_stats.c b/dp/wifi3.0/dp_stats.c index a3c0bf827c..8b2882ac49 100644 --- a/dp/wifi3.0/dp_stats.c +++ b/dp/wifi3.0/dp_stats.c @@ -7476,6 +7476,8 @@ dp_print_pdev_tx_stats(struct dp_pdev *pdev) pdev->stats.tx_i.dropped.invalid_peer_id_in_exc_path); DP_PRINT_STATS(" Tx Mcast Drop = %u", pdev->stats.tx_i.dropped.tx_mcast_drop); + DP_PRINT_STATS(" PPE-DS FW2WBM Tx Drop = %u", + pdev->stats.tx_i.dropped.fw2wbm_tx_drop); DP_PRINT_STATS("Tx failed = %u", pdev->stats.tx.tx_failed); DP_PRINT_STATS(" FW removed Pkts = %u", @@ -7726,6 +7728,9 @@ void dp_print_tx_ppeds_stats(struct dp_soc *soc) { if (soc->arch_ops.dp_tx_ppeds_inuse_desc) soc->arch_ops.dp_tx_ppeds_inuse_desc(soc); + + DP_PRINT_STATS("PPE-DS Tx desc fw2wbm_tx_drop %u", + soc->stats.tx.fw2wbm_tx_drop); } #else void dp_print_tx_ppeds_stats(struct dp_soc *soc) @@ -8838,7 +8843,8 @@ void dp_update_vdev_ingress_stats(struct dp_vdev *tgtobj) tgtobj->stats.tx_i.dropped.drop_ingress + tgtobj->stats.tx_i.dropped.headroom_insufficient + tgtobj->stats.tx_i.dropped.invalid_peer_id_in_exc_path + - tgtobj->stats.tx_i.dropped.tx_mcast_drop; + tgtobj->stats.tx_i.dropped.tx_mcast_drop + + tgtobj->stats.tx_i.dropped.fw2wbm_tx_drop; } void dp_update_vdev_rate_stats(struct cdp_vdev_stats *tgtobj, @@ -8891,6 +8897,7 @@ void dp_update_pdev_ingress_stats(struct dp_pdev *tgtobj, DP_STATS_AGGR(tgtobj, srcobj, tx_i.dropped.headroom_insufficient); DP_STATS_AGGR(tgtobj, srcobj, tx_i.dropped.invalid_peer_id_in_exc_path); DP_STATS_AGGR(tgtobj, srcobj, tx_i.dropped.tx_mcast_drop); + DP_STATS_AGGR(tgtobj, srcobj, tx_i.dropped.fw2wbm_tx_drop); DP_STATS_AGGR(tgtobj, srcobj, tx_i.cce_classified); DP_STATS_AGGR(tgtobj, srcobj, tx_i.cce_classified_raw); DP_STATS_AGGR_PKT(tgtobj, srcobj, tx_i.sniffer_rcvd); diff --git a/dp/wifi3.0/dp_types.h b/dp/wifi3.0/dp_types.h index 01631a84a8..ab71bfd10f 100644 --- a/dp/wifi3.0/dp_types.h +++ b/dp/wifi3.0/dp_types.h @@ -1196,6 +1196,8 @@ struct dp_soc_stats { uint32_t tx_comp_force_freed; /* Tx completion ring near full */ uint32_t near_full; + /* Tx drops with buffer src as HAL_TX_COMP_RELEASE_SOURCE_FW */ + uint32_t fw2wbm_tx_drop; } tx; /* SOC level RX stats */