diff --git a/dp/inc/cdp_txrx_stats_struct.h b/dp/inc/cdp_txrx_stats_struct.h index c45e9c6a95..6ff33f0207 100644 --- a/dp/inc/cdp_txrx_stats_struct.h +++ b/dp/inc/cdp_txrx_stats_struct.h @@ -1245,6 +1245,8 @@ struct cdp_tx_ingress_stats { struct { struct cdp_pkt_info dropped_pkt; struct cdp_pkt_info desc_na; + struct cdp_pkt_info desc_na_exc_alloc_fail; + struct cdp_pkt_info desc_na_exc_outstand; struct cdp_pkt_info exc_desc_na; uint32_t ring_full; uint32_t enqueue_fail; diff --git a/dp/wifi3.0/dp_stats.c b/dp/wifi3.0/dp_stats.c index cb08c6fa53..403cb2b59a 100644 --- a/dp/wifi3.0/dp_stats.c +++ b/dp/wifi3.0/dp_stats.c @@ -6164,6 +6164,10 @@ dp_print_pdev_tx_stats(struct dp_pdev *pdev) pdev->stats.tx_i.dropped.desc_na.num); DP_PRINT_STATS(" HW enqueue failed= %d", pdev->stats.tx_i.dropped.enqueue_fail); + DP_PRINT_STATS(" Descriptor alloc fail = %d", + pdev->stats.tx_i.dropped.desc_na_exc_alloc_fail.num); + DP_PRINT_STATS(" Tx outstanding too many = %d", + pdev->stats.tx_i.dropped.desc_na_exc_outstand.num); DP_PRINT_STATS(" Pkt dropped in vdev-id check= %d", pdev->stats.tx_i.dropped.fail_per_pkt_vdev_id_check); DP_PRINT_STATS(" Resources Full = %d", diff --git a/dp/wifi3.0/dp_tx.c b/dp/wifi3.0/dp_tx.c index df270c2ad7..216ee7639c 100644 --- a/dp/wifi3.0/dp_tx.c +++ b/dp/wifi3.0/dp_tx.c @@ -128,6 +128,7 @@ dp_tx_limit_check(struct dp_vdev *vdev) pdev->num_tx_allowed) { dp_tx_info("queued packets are more than max tx, drop the frame"); DP_STATS_INC(vdev, tx_i.dropped.desc_na.num, 1); + DP_STATS_INC(vdev, tx_i.dropped.desc_na_exc_outstand.num, 1); return true; } return false; @@ -870,8 +871,10 @@ struct dp_tx_desc_s *dp_tx_prepare_desc_single(struct dp_vdev *vdev, /* Allocate software Tx descriptor */ tx_desc = dp_tx_desc_alloc(soc, desc_pool_id); + if (qdf_unlikely(!tx_desc)) { DP_STATS_INC(vdev, tx_i.dropped.desc_na.num, 1); + DP_STATS_INC(vdev, tx_i.dropped.desc_na_exc_alloc_fail.num, 1); return NULL; }