From a405eb741b3dd512983f68a8dfe19ba49795536f Mon Sep 17 00:00:00 2001 From: Venkata Sharath Chandra Manchala Date: Mon, 6 Mar 2017 14:35:00 -0800 Subject: [PATCH] qcacmn: Add dump stats feature for Lithium Add support for dump statistics in Lithium. Statistics include: 1. Tx path packet flow 2. Tx Histogram stats per interrupt 3. Rx path packet flow 4. Rx Histogram stats per interrupt Change-Id: I7f399b717a9fb29a3d6ab672b669c6e323f61e27 CRs-Fixed: 2023386 --- dp/inc/cdp_txrx_cmn.h | 13 +++ dp/inc/cdp_txrx_cmn_struct.h | 45 +++++++++ dp/inc/cdp_txrx_mob_def.h | 16 ---- dp/inc/cdp_txrx_ops.h | 4 +- dp/inc/cdp_txrx_stats.h | 8 -- dp/wifi3.0/dp_internal.h | 96 +++++++++++++++++++ dp/wifi3.0/dp_main.c | 179 ++++++++++++++++++++++++++++++++++- dp/wifi3.0/dp_rx.c | 7 ++ dp/wifi3.0/dp_rx_err.c | 12 ++- dp/wifi3.0/dp_tx.c | 4 + 10 files changed, 356 insertions(+), 28 deletions(-) diff --git a/dp/inc/cdp_txrx_cmn.h b/dp/inc/cdp_txrx_cmn.h index 3bf51695d3d3..75bdabc60104 100644 --- a/dp/inc/cdp_txrx_cmn.h +++ b/dp/inc/cdp_txrx_cmn.h @@ -474,4 +474,17 @@ int cdp_txrx_stats(ol_txrx_soc_handle soc, struct cdp_vdev *vdev, return 0; } +/** + * cdp_display_stats(): function to map to dump stats + * @soc: soc handle + * @value: statistics option + */ +static inline QDF_STATUS +cdp_display_stats(ol_txrx_soc_handle soc, uint16_t value) +{ + if (soc->ops->cmn_drv_ops->display_stats) + return soc->ops->cmn_drv_ops->display_stats(soc, value); + + return 0; +} #endif /* _CDP_TXRX_CMN_H_ */ diff --git a/dp/inc/cdp_txrx_cmn_struct.h b/dp/inc/cdp_txrx_cmn_struct.h index 72d67fb6f2c6..e54e7aca57c4 100644 --- a/dp/inc/cdp_txrx_cmn_struct.h +++ b/dp/inc/cdp_txrx_cmn_struct.h @@ -51,6 +51,22 @@ #define SUPPORTED_BW 4 #define SUPPORTED_RECEPTION_TYPES 4 +/* Options for Dump Statistics */ +#define CDP_HDD_STATS 0 +#define CDP_TXRX_PATH_STATS 1 +#define CDP_TXRX_HIST_STATS 2 +#define CDP_TXRX_TSO_STATS 3 +#define CDP_HDD_NETIF_OPER_HISTORY 4 +#define CDP_DUMP_TX_FLOW_POOL_INFO 5 +#define CDP_TXRX_DESC_STATS 6 +#define CDP_HIF_STATS 7 +#define CDP_LRO_STATS 8 +#define CDP_NAPI_STATS 9 +#define CDP_SCHEDULER_STATS 21 +#define CDP_TX_QUEUE_STATS 22 +#define CDP_BUNDLE_STATS 23 +#define CDP_CREDIT_STATS 24 + /* WME stream classes */ #define WME_AC_BE 0 /* best effort */ #define WME_AC_BK 1 /* background */ @@ -701,6 +717,31 @@ struct cdp_peer_stats { struct cdp_rx_stats rx; }; +/* Tx completions per interrupt */ +struct cdp_hist_tx_comp { + uint32_t pkts_1; + uint32_t pkts_2_20; + uint32_t pkts_21_40; + uint32_t pkts_41_60; + uint32_t pkts_61_80; + uint32_t pkts_81_100; + uint32_t pkts_101_200; + uint32_t pkts_201_plus; +}; + +/* Rx ring descriptors reaped per interrupt */ +struct cdp_hist_rx_ind { + uint32_t pkts_1; + uint32_t pkts_2_20; + uint32_t pkts_21_40; + uint32_t pkts_41_60; + uint32_t pkts_61_80; + uint32_t pkts_81_100; + uint32_t pkts_101_200; + uint32_t pkts_201_plus; +}; + + struct cdp_pdev_stats { /* packets dropped on rx */ struct { @@ -724,5 +765,9 @@ struct cdp_pdev_stats { struct cdp_tx_stats tx; /* CDP Rx Stats */ struct cdp_rx_stats rx; + /* Number of Tx completions per interrupt */ + struct cdp_hist_tx_comp tx_comp_histogram; + /* Number of Rx ring descriptors reaped per interrupt */ + struct cdp_hist_rx_ind rx_ind_histogram; }; #endif diff --git a/dp/inc/cdp_txrx_mob_def.h b/dp/inc/cdp_txrx_mob_def.h index 03b189423841..3d6ef1a81ec4 100644 --- a/dp/inc/cdp_txrx_mob_def.h +++ b/dp/inc/cdp_txrx_mob_def.h @@ -29,22 +29,6 @@ #define OL_TXQ_PAUSE_REASON_VDEV_STOP (1 << 3) #define OL_TXQ_PAUSE_REASON_THERMAL_MITIGATION (1 << 4) -/* command options for dumpStats*/ -#define WLAN_HDD_STATS 0 -#define WLAN_TXRX_STATS 1 -#define WLAN_TXRX_HIST_STATS 2 -#define WLAN_TXRX_TSO_STATS 3 -#define WLAN_HDD_NETIF_OPER_HISTORY 4 -#define WLAN_DUMP_TX_FLOW_POOL_INFO 5 -#define WLAN_TXRX_DESC_STATS 6 -#define WLAN_HIF_STATS 7 -#define WLAN_LRO_STATS 8 -#define WLAN_NAPI_STATS 9 -#define WLAN_SCHEDULER_STATS 21 -#define WLAN_TX_QUEUE_STATS 22 -#define WLAN_BUNDLE_STATS 23 -#define WLAN_CREDIT_STATS 24 - #define OL_TXRX_INVALID_NUM_PEERS (-1) #define OL_TXRX_MAC_ADDR_LEN 6 diff --git a/dp/inc/cdp_txrx_ops.h b/dp/inc/cdp_txrx_ops.h index 72005694da42..2eaf5ad36401 100644 --- a/dp/inc/cdp_txrx_ops.h +++ b/dp/inc/cdp_txrx_ops.h @@ -199,6 +199,8 @@ struct cdp_cmn_ops { A_STATUS(*txrx_stats)(struct cdp_vdev *vdev, struct ol_txrx_stats_req *req, enum cdp_stats stats); + + QDF_STATUS (*display_stats)(void *psoc, uint16_t value); }; struct cdp_ctrl_ops { @@ -849,12 +851,10 @@ struct cdp_throttle_ops { /** * struct cdp_ocb_ops - mcl ocb ops - * @display_stats: * @clear_stats: * @stats: */ struct cdp_mob_stats_ops { - QDF_STATUS (*display_stats)(uint16_t bitmap); void (*clear_stats)(uint16_t bitmap); int (*stats)(uint8_t vdev_id, char *buffer, unsigned buf_len); }; diff --git a/dp/inc/cdp_txrx_stats.h b/dp/inc/cdp_txrx_stats.h index 40e271236bc2..9b3860076fbb 100644 --- a/dp/inc/cdp_txrx_stats.h +++ b/dp/inc/cdp_txrx_stats.h @@ -33,14 +33,6 @@ #define _CDP_TXRX_STATS_H_ #include -static inline QDF_STATUS -cdp_display_stats(ol_txrx_soc_handle soc, uint16_t bitmap) -{ - if (soc->ops->mob_stats_ops->display_stats) - return soc->ops->mob_stats_ops->display_stats(bitmap); - return QDF_STATUS_SUCCESS; -} - static inline void cdp_clear_stats(ol_txrx_soc_handle soc, uint16_t bitmap) { diff --git a/dp/wifi3.0/dp_internal.h b/dp/wifi3.0/dp_internal.h index 56bac8322a84..c9b9f19fb342 100644 --- a/dp/wifi3.0/dp_internal.h +++ b/dp/wifi3.0/dp_internal.h @@ -108,6 +108,96 @@ while (0) DP_STATS_AGGR(_handle_a, _handle_b, _field.num); \ DP_STATS_AGGR(_handle_a, _handle_b, _field.bytes);\ } + + +#define DP_HIST_INIT() \ + uint32_t num_of_packets[MAX_PDEV_CNT] = {0}; + +#define DP_HIST_PACKET_COUNT_INC(_pdev_id) \ +{ \ + ++num_of_packets[_pdev_id]; \ +} + +#define DP_TX_HISTOGRAM_UPDATE(_pdev, _p_cntrs) \ + do { \ + if (_p_cntrs == 1) { \ + DP_STATS_INC(_pdev, \ + tx_comp_histogram.pkts_1, 1); \ + } else if (_p_cntrs > 1 && _p_cntrs <= 20) { \ + DP_STATS_INC(_pdev, \ + tx_comp_histogram.pkts_2_20, 1); \ + } else if (_p_cntrs > 20 && _p_cntrs <= 40) { \ + DP_STATS_INC(_pdev, \ + tx_comp_histogram.pkts_21_40, 1); \ + } else if (_p_cntrs > 40 && _p_cntrs <= 60) { \ + DP_STATS_INC(_pdev, \ + tx_comp_histogram.pkts_41_60, 1); \ + } else if (_p_cntrs > 60 && _p_cntrs <= 80) { \ + DP_STATS_INC(_pdev, \ + tx_comp_histogram.pkts_61_80, 1); \ + } else if (_p_cntrs > 80 && _p_cntrs <= 100) { \ + DP_STATS_INC(_pdev, \ + tx_comp_histogram.pkts_81_100, 1); \ + } else if (_p_cntrs > 100 && _p_cntrs <= 200) { \ + DP_STATS_INC(_pdev, \ + tx_comp_histogram.pkts_101_200, 1); \ + } else if (_p_cntrs > 200) { \ + DP_STATS_INC(_pdev, \ + tx_comp_histogram.pkts_201_plus, 1); \ + } \ + } while (0) + +#define DP_RX_HISTOGRAM_UPDATE(_pdev, _p_cntrs) \ + do { \ + if (_p_cntrs == 1) { \ + DP_STATS_INC(_pdev, \ + rx_ind_histogram.pkts_1, 1); \ + } else if (_p_cntrs > 1 && _p_cntrs <= 20) { \ + DP_STATS_INC(_pdev, \ + rx_ind_histogram.pkts_2_20, 1); \ + } else if (_p_cntrs > 20 && _p_cntrs <= 40) { \ + DP_STATS_INC(_pdev, \ + rx_ind_histogram.pkts_21_40, 1); \ + } else if (_p_cntrs > 40 && _p_cntrs <= 60) { \ + DP_STATS_INC(_pdev, \ + rx_ind_histogram.pkts_41_60, 1); \ + } else if (_p_cntrs > 60 && _p_cntrs <= 80) { \ + DP_STATS_INC(_pdev, \ + rx_ind_histogram.pkts_61_80, 1); \ + } else if (_p_cntrs > 80 && _p_cntrs <= 100) { \ + DP_STATS_INC(_pdev, \ + rx_ind_histogram.pkts_81_100, 1); \ + } else if (_p_cntrs > 100 && _p_cntrs <= 200) { \ + DP_STATS_INC(_pdev, \ + rx_ind_histogram.pkts_101_200, 1); \ + } else if (_p_cntrs > 200) { \ + DP_STATS_INC(_pdev, \ + rx_ind_histogram.pkts_201_plus, 1); \ + } \ + } while (0) + +#define DP_TX_HIST_STATS_PER_PDEV() \ + do { \ + uint8_t hist_stats = 0; \ + for (hist_stats = 0; hist_stats < soc->pdev_count; \ + hist_stats++) { \ + DP_TX_HISTOGRAM_UPDATE(soc->pdev_list[hist_stats], \ + num_of_packets[hist_stats]); \ + } \ + } while (0) + + +#define DP_RX_HIST_STATS_PER_PDEV() \ + do { \ + uint8_t hist_stats = 0; \ + for (hist_stats = 0; hist_stats < soc->pdev_count; \ + hist_stats++) { \ + DP_RX_HISTOGRAM_UPDATE(soc->pdev_list[hist_stats], \ + num_of_packets[hist_stats]); \ + } \ + } while (0) + + #else #define DP_STATS_INC(_handle, _field, _delta) #define DP_STATS_INCC(_handle, _field, _delta, _cond) @@ -117,6 +207,12 @@ while (0) #define DP_STATS_INCC_PKT(_handle, _field, _count, _bytes) #define DP_STATS_AGGR(_handle_a, _handle_b, _field) #define DP_STATS_AGGR_PKT(_handle_a, _handle_b, _field) +#define DP_HIST_INIT() +#define DP_HIST_PACKET_COUNT_INC(_pdev_id) +#define DP_TX_HISTOGRAM_UPDATE(_pdev, _p_cntrs) +#define DP_RX_HISTOGRAM_UPDATE(_pdev, _p_cntrs) +#define DP_RX_HIST_STATS_PER_PDEV() +#define DP_TX_HIST_STATS_PER_PDEV() #endif diff --git a/dp/wifi3.0/dp_main.c b/dp/wifi3.0/dp_main.c index 8e08a5f8d775..a94bcbbc9825 100644 --- a/dp/wifi3.0/dp_main.c +++ b/dp/wifi3.0/dp_main.c @@ -1134,6 +1134,7 @@ static struct cdp_pdev *dp_pdev_attach_wifi3(struct cdp_soc_t *txrx_soc, pdev->osif_pdev = ctrl_pdev; pdev->pdev_id = pdev_id; soc->pdev_list[pdev_id] = pdev; + soc->pdev_count++; TAILQ_INIT(&pdev->vdev_list); pdev->vdev_count = 0; @@ -1325,7 +1326,7 @@ static void dp_pdev_detach_wifi3(struct cdp_pdev *txrx_pdev, int force) RXDMA_MONITOR_DESC, 0); soc->pdev_list[pdev->pdev_id] = NULL; - + soc->pdev_count--; qdf_mem_free(pdev); } @@ -3094,6 +3095,180 @@ static int dp_txrx_stats(struct cdp_vdev *vdev, return 0; } +/* + * dp_txrx_path_stats() - Function to display dump stats + * @soc - soc handle + * + * return: none + */ +static void dp_txrx_path_stats(struct dp_soc *soc) +{ + uint8_t error_code; + uint8_t loop_pdev; + struct dp_pdev *pdev; + + for (loop_pdev = 0; loop_pdev < soc->pdev_count; loop_pdev++) { + + pdev = soc->pdev_list[loop_pdev]; + dp_aggregate_pdev_stats(pdev); + QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR, + "Tx path Statistics:"); + + DP_TRACE(NONE, "from stack: %u msdus (%u bytes)", + pdev->stats.tx_i.rcvd.num, + pdev->stats.tx_i.rcvd.bytes); + DP_TRACE(NONE, "processed from host: %u msdus (%u bytes)", + pdev->stats.tx_i.processed.num, + pdev->stats.tx_i.processed.bytes); + DP_TRACE(NONE, "successfully transmitted: %u msdus (%u bytes)", + pdev->stats.tx.tx_success.num, + pdev->stats.tx.tx_success.bytes); + + DP_TRACE(NONE, "Dropped in host:"); + DP_TRACE(NONE, "Total packets dropped: %u,", + pdev->stats.tx_i.dropped.dropped_pkt.num); + DP_TRACE(NONE, "Descriptor not available: %u", + pdev->stats.tx_i.dropped.desc_na); + DP_TRACE(NONE, "Ring full: %u", + pdev->stats.tx_i.dropped.ring_full); + DP_TRACE(NONE, "Enqueue fail: %u", + pdev->stats.tx_i.dropped.enqueue_fail); + DP_TRACE(NONE, "DMA Error: %u", + pdev->stats.tx_i.dropped.dma_error); + + DP_TRACE(NONE, "Dropped in hardware:"); + DP_TRACE(NONE, "total packets dropped: %u", + pdev->stats.tx.tx_failed); + DP_TRACE(NONE, "mpdu age out: %u", + pdev->stats.tx.dropped.mpdu_age_out); + DP_TRACE(NONE, "firmware discard reason1: %u", + pdev->stats.tx.dropped.fw_discard_reason1); + DP_TRACE(NONE, "firmware discard reason2: %u", + pdev->stats.tx.dropped.fw_discard_reason2); + DP_TRACE(NONE, "firmware discard reason3: %u", + pdev->stats.tx.dropped.fw_discard_reason3); + DP_TRACE(NONE, "peer_invalid: %u", + pdev->soc->stats.tx.tx_invalid_peer.num); + + + DP_TRACE(NONE, "Tx packets sent per interrupt:"); + DP_TRACE(NONE, "Single Packet: %u", + pdev->stats.tx_comp_histogram.pkts_1); + DP_TRACE(NONE, "2-20 Packets: %u", + pdev->stats.tx_comp_histogram.pkts_2_20); + DP_TRACE(NONE, "21-40 Packets: %u", + pdev->stats.tx_comp_histogram.pkts_21_40); + DP_TRACE(NONE, "41-60 Packets: %u", + pdev->stats.tx_comp_histogram.pkts_41_60); + DP_TRACE(NONE, "61-80 Packets: %u", + pdev->stats.tx_comp_histogram.pkts_61_80); + DP_TRACE(NONE, "81-100 Packets: %u", + pdev->stats.tx_comp_histogram.pkts_81_100); + DP_TRACE(NONE, "101-200 Packets: %u", + pdev->stats.tx_comp_histogram.pkts_101_200); + DP_TRACE(NONE, " 201+ Packets: %u", + pdev->stats.tx_comp_histogram.pkts_201_plus); + + DP_TRACE(NONE, "Rx path statistics"); + + DP_TRACE(NONE, "delivered %u msdus ( %u bytes),", + pdev->stats.rx.to_stack.num, + pdev->stats.rx.to_stack.bytes); + DP_TRACE(NONE, "received on reo %u msdus ( %u bytes),", + pdev->stats.rx.rcvd_reo.num, + pdev->stats.rx.rcvd_reo.bytes); + DP_TRACE(NONE, "intra-bss packets %u msdus ( %u bytes),", + pdev->stats.rx.intra_bss.num, + pdev->stats.rx.intra_bss.bytes); + DP_TRACE(NONE, "raw packets %u msdus ( %u bytes),", + pdev->stats.rx.raw.num, + pdev->stats.rx.raw.bytes); + DP_TRACE(NONE, "dropped: error %u msdus", + pdev->stats.rx.err.mic_err); + DP_TRACE(NONE, "peer invalid %u", + pdev->soc->stats.rx.err.rx_invalid_peer.num); + + DP_TRACE(NONE, "Reo Statistics"); + DP_TRACE(NONE, "rbm error: %u msdus", + pdev->soc->stats.rx.err.invalid_rbm); + DP_TRACE(NONE, "hal ring access fail: %u msdus", + pdev->soc->stats.rx.err.hal_ring_access_fail); + + DP_TRACE(NONE, "Reo errors"); + + for (error_code = 0; error_code < REO_ERROR_TYPE_MAX; + error_code++) { + DP_TRACE(NONE, "Reo error number (%u): %u msdus", + error_code, + pdev->soc->stats.rx.err.reo_error[error_code]); + } + + for (error_code = 0; error_code < MAX_RXDMA_ERRORS; + error_code++) { + DP_TRACE(NONE, "Rxdma error number (%u): %u msdus", + error_code, + pdev->soc->stats.rx.err + .rxdma_error[error_code]); + } + + DP_TRACE(NONE, "Rx packets reaped per interrupt:"); + DP_TRACE(NONE, "Single Packet: %u", + pdev->stats.rx_ind_histogram.pkts_1); + DP_TRACE(NONE, "2-20 Packets: %u", + pdev->stats.rx_ind_histogram.pkts_2_20); + DP_TRACE(NONE, "21-40 Packets: %u", + pdev->stats.rx_ind_histogram.pkts_21_40); + DP_TRACE(NONE, "41-60 Packets: %u", + pdev->stats.rx_ind_histogram.pkts_41_60); + DP_TRACE(NONE, "61-80 Packets: %u", + pdev->stats.rx_ind_histogram.pkts_61_80); + DP_TRACE(NONE, "81-100 Packets: %u", + pdev->stats.rx_ind_histogram.pkts_81_100); + DP_TRACE(NONE, "101-200 Packets: %u", + pdev->stats.rx_ind_histogram.pkts_101_200); + DP_TRACE(NONE, " 201+ Packets: %u", + pdev->stats.rx_ind_histogram.pkts_201_plus); + } +} + +/* + * dp_txrx_dump_stats() - Dump statistics + * @value - Statistics option + */ +static QDF_STATUS dp_txrx_dump_stats(void *psoc, uint16_t value) +{ + struct dp_soc *soc = + (struct dp_soc *)psoc; + QDF_STATUS status = QDF_STATUS_SUCCESS; + + if (!soc) { + QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR, + "%s: soc is NULL", __func__); + return QDF_STATUS_E_INVAL; + } + + switch (value) { + case CDP_TXRX_PATH_STATS: + dp_txrx_path_stats(soc); + break; + case CDP_TXRX_TSO_STATS: + /* TODO: NOT IMPLEMENTED */ + break; + case CDP_DUMP_TX_FLOW_POOL_INFO: + /* TODO: NOT IMPLEMENTED */ + break; + case CDP_TXRX_DESC_STATS: + /* TODO: NOT IMPLEMENTED */ + break; + default: + status = QDF_STATUS_E_INVAL; + break; + } + + return status; + +} + static struct cdp_cmn_ops dp_ops_cmn = { .txrx_soc_attach_target = dp_soc_attach_target_wifi3, .txrx_vdev_attach = dp_vdev_attach_wifi3, @@ -3119,6 +3294,7 @@ static struct cdp_cmn_ops dp_ops_cmn = { .set_pdev_dscp_tid_map = dp_set_pdev_dscp_tid_map_wifi3, .txrx_stats = dp_txrx_stats, .txrx_set_monitor_mode = dp_vdev_set_monitor_mode, + .display_stats = dp_txrx_dump_stats, /* TODO: Add other functions */ }; @@ -3230,6 +3406,7 @@ static struct cdp_throttle_ops dp_ops_throttle = { }; static struct cdp_mob_stats_ops dp_ops_mob_stats = { + /* WIFI 3.0 DP NOT IMPLEMENTED YET */ }; static struct cdp_cfg_ops dp_ops_cfg = { diff --git a/dp/wifi3.0/dp_rx.c b/dp/wifi3.0/dp_rx.c index 172caf5fcb3d..4122e7e60e60 100644 --- a/dp/wifi3.0/dp_rx.c +++ b/dp/wifi3.0/dp_rx.c @@ -611,6 +611,7 @@ dp_rx_process(struct dp_soc *soc, void *hal_ring, uint32_t quota) struct dp_srng *dp_rxdma_srng; struct rx_desc_pool *rx_desc_pool; + DP_HIST_INIT(); /* Debug -- Remove later */ qdf_assert(soc && hal_ring); @@ -625,6 +626,7 @@ dp_rx_process(struct dp_soc *soc, void *hal_ring, uint32_t quota) * Need API to convert from hal_ring pointer to * Ring Type / Ring Id combo */ + DP_STATS_INC(soc, rx.err.hal_ring_access_fail, 1); QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR, FL("HAL RING Access Failed -- %p"), hal_ring); hal_srng_access_end(hal_soc, hal_ring); @@ -709,6 +711,7 @@ dp_rx_process(struct dp_soc *soc, void *hal_ring, uint32_t quota) ampdu_flag = (mpdu_desc_info.mpdu_flags & HAL_MPDU_F_AMPDU_FLAG); + DP_STATS_INCC(peer, rx.ampdu_cnt, 1, ampdu_flag); DP_STATS_INCC(peer, rx.non_ampdu_cnt, 1, !(ampdu_flag)); @@ -723,6 +726,7 @@ dp_rx_process(struct dp_soc *soc, void *hal_ring, uint32_t quota) DP_STATS_INCC(peer, rx.amsdu_cnt, 1, !(amsdu_flag)); + DP_HIST_PACKET_COUNT_INC(vdev->pdev->pdev_id); qdf_nbuf_queue_add(&vdev->rxq, rx_desc->nbuf); fail: dp_rx_add_to_free_desc_list(&head[rx_desc->pool_id], @@ -732,6 +736,9 @@ fail: done: hal_srng_access_end(hal_soc, hal_ring); + /* Update histogram statistics by looping through pdev's */ + DP_RX_HIST_STATS_PER_PDEV(); + for (mac_id = 0; mac_id < MAX_PDEV_CNT; mac_id++) { /* * continue with next mac_id if no pkts were reaped diff --git a/dp/wifi3.0/dp_rx_err.c b/dp/wifi3.0/dp_rx_err.c index 22b5adb748e6..d94ec8f5a3ac 100644 --- a/dp/wifi3.0/dp_rx_err.c +++ b/dp/wifi3.0/dp_rx_err.c @@ -464,6 +464,7 @@ dp_rx_err_process(struct dp_soc *soc, void *hal_ring, uint32_t quota) * Need API to convert from hal_ring pointer to * Ring Type / Ring Id combo */ + DP_STATS_INC(soc, rx.err.hal_ring_access_fail, 1); QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR, FL("HAL RING Access Failed -- %p"), hal_ring); goto done; @@ -485,7 +486,6 @@ dp_rx_err_process(struct dp_soc *soc, void *hal_ring, uint32_t quota) if (qdf_unlikely(rbm != HAL_RX_BUF_RBM_SW3_BM)) { /* TODO */ /* Call appropriate handler */ - DP_STATS_INC(soc, rx.err.invalid_rbm, 1); QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR, FL("Invalid RBM %d"), rbm); @@ -505,6 +505,8 @@ dp_rx_err_process(struct dp_soc *soc, void *hal_ring, uint32_t quota) if (mpdu_desc_info.mpdu_flags & HAL_MPDU_F_FRAGMENT) { /* TODO */ + DP_STATS_INC(soc, + rx.err.reo_error[HAL_MPDU_F_FRAGMENT], 1); rx_bufs_used += dp_rx_frag_handle(soc, ring_desc, &mpdu_desc_info, &head, &tail, quota); @@ -513,6 +515,10 @@ dp_rx_err_process(struct dp_soc *soc, void *hal_ring, uint32_t quota) if (hal_rx_reo_is_pn_error(ring_desc)) { /* TOD0 */ + DP_STATS_INC(soc, + rx.err. + reo_error[HAL_REO_ERR_PN_CHECK_FAILED], + 1); rx_bufs_used += dp_rx_pn_error_handle(soc, ring_desc, &mpdu_desc_info, &head, &tail, quota); @@ -521,6 +527,10 @@ dp_rx_err_process(struct dp_soc *soc, void *hal_ring, uint32_t quota) if (hal_rx_reo_is_2k_jump(ring_desc)) { /* TOD0 */ + DP_STATS_INC(soc, + rx.err. + reo_error[HAL_REO_ERR_REGULAR_FRAME_2K_JUMP], + 1); rx_bufs_used += dp_rx_2k_jump_handle(soc, ring_desc, &mpdu_desc_info, &head, &tail, quota); diff --git a/dp/wifi3.0/dp_tx.c b/dp/wifi3.0/dp_tx.c index 70c66a9ad5d2..ec2c9abf1549 100644 --- a/dp/wifi3.0/dp_tx.c +++ b/dp/wifi3.0/dp_tx.c @@ -1743,6 +1743,7 @@ static void dp_tx_comp_process_desc(struct dp_soc *soc, uint32_t length; struct dp_peer *peer; + DP_HIST_INIT(); desc = comp_head; while (desc) { @@ -1786,10 +1787,13 @@ static void dp_tx_comp_process_desc(struct dp_soc *soc, DP_TX_FREE_DMA_TO_DEVICE(soc, desc->vdev, desc->nbuf); } + DP_HIST_PACKET_COUNT_INC(desc->pdev->pdev_id); + DP_TRACE(NONE, "pdev_id: %u", desc->pdev->pdev_id); next = desc->next; dp_tx_desc_release(desc, desc->pool_id); desc = next; } + DP_TX_HIST_STATS_PER_PDEV(); } /**