diff --git a/core/cds/src/cds_sched.c b/core/cds/src/cds_sched.c index fb0104d548d8..6787b5b73d8a 100644 --- a/core/cds/src/cds_sched.c +++ b/core/cds/src/cds_sched.c @@ -133,9 +133,9 @@ static int cds_sched_find_attach_cpu(p_cds_sched_context pSchedContext, int i; #endif - QDF_TRACE(QDF_MODULE_ID_QDF, QDF_TRACE_LEVEL_INFO_LOW, - "%s: num possible cpu %d", - __func__, num_possible_cpus()); + QDF_TRACE(QDF_MODULE_ID_QDF, QDF_TRACE_LEVEL_DEBUG, + "%s: num possible cpu %d", + __func__, num_possible_cpus()); online_perf_cpu = qdf_mem_malloc( num_possible_cpus() * sizeof(unsigned long)); @@ -240,11 +240,11 @@ static int cds_sched_find_attach_cpu(p_cds_sched_context pSchedContext, #endif /* WLAN_OPEN_SOURCE */ } - QDF_TRACE(QDF_MODULE_ID_QDF, QDF_TRACE_LEVEL_INFO_LOW, - "%s: NUM PERF CORE %d, HIGH TPUTR REQ %d, RX THRE CPU %lu", - __func__, perf_core_count, - (int)pSchedContext->high_throughput_required, - pSchedContext->rx_thread_cpu); + QDF_TRACE(QDF_MODULE_ID_QDF, QDF_TRACE_LEVEL_DEBUG, + "%s: NUM PERF CORE %d, HIGH TPUTR REQ %d, RX THRE CPU %lu", + __func__, perf_core_count, + (int)pSchedContext->high_throughput_required, + pSchedContext->rx_thread_cpu); success: qdf_mem_free(online_perf_cpu); diff --git a/core/dp/ol/inc/ol_txrx_dbg.h b/core/dp/ol/inc/ol_txrx_dbg.h index 62e71a4b3fe7..a002549dbb9d 100644 --- a/core/dp/ol/inc/ol_txrx_dbg.h +++ b/core/dp/ol/inc/ol_txrx_dbg.h @@ -73,8 +73,15 @@ void ol_txrx_peer_display(ol_txrx_peer_handle peer, int indent); /*--- txrx stats display debug functions ---*/ - -void ol_txrx_stats_display(ol_txrx_pdev_handle pdev); +/** + * ol_txrx_stats_display() - display tx rx stats + * @pdev: pdev handle + * @level: verbosity level for logs + * + * Return: none + */ +void ol_txrx_stats_display(ol_txrx_pdev_handle pdev, + enum qdf_stats_verbosity_level level); void ol_txrx_stats_clear(ol_txrx_pdev_handle pdev); diff --git a/core/dp/ol/inc/ol_txrx_stats.h b/core/dp/ol/inc/ol_txrx_stats.h index 90d539b7458e..7bda7ca44db2 100644 --- a/core/dp/ol/inc/ol_txrx_stats.h +++ b/core/dp/ol/inc/ol_txrx_stats.h @@ -86,6 +86,9 @@ struct ol_txrx_stats_tx_dropped { * couldn't get an ack for */ struct ol_txrx_stats_elem no_ack; + + /* MSDU which were dropped for other reasons */ + struct ol_txrx_stats_elem others; }; struct ol_txrx_tso_histogram { diff --git a/core/dp/txrx/ol_txrx.c b/core/dp/txrx/ol_txrx.c index 8df55a6d8e5d..e604e395c416 100644 --- a/core/dp/txrx/ol_txrx.c +++ b/core/dp/txrx/ol_txrx.c @@ -1064,43 +1064,43 @@ static void ol_txrx_stats_display_tso(ol_txrx_pdev_handle pdev) int msdu_idx; int seg_idx; - QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_DEBUG, - "TSO Statistics:"); - QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_DEBUG, - "TSO pkts %lld, bytes %lld\n", - pdev->stats.pub.tx.tso.tso_pkts.pkts, - pdev->stats.pub.tx.tso.tso_pkts.bytes); + QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_INFO_LOW, + "TSO Statistics:"); + QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_INFO_LOW, + "TSO pkts %lld, bytes %lld\n", + pdev->stats.pub.tx.tso.tso_pkts.pkts, + pdev->stats.pub.tx.tso.tso_pkts.bytes); - QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_DEBUG, - "TSO Histogram for numbers of segments:\n" - "Single segment %d\n" - " 2-5 segments %d\n" - " 6-10 segments %d\n" - "11-15 segments %d\n" - "16-20 segments %d\n" - " 20+ segments %d\n", - pdev->stats.pub.tx.tso.tso_hist.pkts_1, - pdev->stats.pub.tx.tso.tso_hist.pkts_2_5, - pdev->stats.pub.tx.tso.tso_hist.pkts_6_10, - pdev->stats.pub.tx.tso.tso_hist.pkts_11_15, - pdev->stats.pub.tx.tso.tso_hist.pkts_16_20, - pdev->stats.pub.tx.tso.tso_hist.pkts_20_plus); + QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_INFO_LOW, + "TSO Histogram for numbers of segments:\n" + "Single segment %d\n" + " 2-5 segments %d\n" + " 6-10 segments %d\n" + "11-15 segments %d\n" + "16-20 segments %d\n" + " 20+ segments %d\n", + pdev->stats.pub.tx.tso.tso_hist.pkts_1, + pdev->stats.pub.tx.tso.tso_hist.pkts_2_5, + pdev->stats.pub.tx.tso.tso_hist.pkts_6_10, + pdev->stats.pub.tx.tso.tso_hist.pkts_11_15, + pdev->stats.pub.tx.tso.tso_hist.pkts_16_20, + pdev->stats.pub.tx.tso.tso_hist.pkts_20_plus); - QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_DEBUG, - "TSO History Buffer: Total size %d, current_index %d", - NUM_MAX_TSO_MSDUS, - TXRX_STATS_TSO_MSDU_IDX(pdev)); + QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_INFO_LOW, + "TSO History Buffer: Total size %d, current_index %d", + NUM_MAX_TSO_MSDUS, + TXRX_STATS_TSO_MSDU_IDX(pdev)); for (msdu_idx = 0; msdu_idx < NUM_MAX_TSO_MSDUS; msdu_idx++) { if (TXRX_STATS_TSO_MSDU_TOTAL_LEN(pdev, msdu_idx) == 0) continue; - QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_DEBUG, - "jumbo pkt idx: %d num segs %d gso_len %d total_len %d nr_frags %d", - msdu_idx, - TXRX_STATS_TSO_MSDU_NUM_SEG(pdev, msdu_idx), - TXRX_STATS_TSO_MSDU_GSO_SIZE(pdev, msdu_idx), - TXRX_STATS_TSO_MSDU_TOTAL_LEN(pdev, msdu_idx), - TXRX_STATS_TSO_MSDU_NR_FRAGS(pdev, msdu_idx)); + QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_INFO_LOW, + "jumbo pkt idx: %d num segs %d gso_len %d total_len %d nr_frags %d", + msdu_idx, + TXRX_STATS_TSO_MSDU_NUM_SEG(pdev, msdu_idx), + TXRX_STATS_TSO_MSDU_GSO_SIZE(pdev, msdu_idx), + TXRX_STATS_TSO_MSDU_TOTAL_LEN(pdev, msdu_idx), + TXRX_STATS_TSO_MSDU_NR_FRAGS(pdev, msdu_idx)); for (seg_idx = 0; ((seg_idx < TXRX_STATS_TSO_MSDU_NUM_SEG(pdev, @@ -1109,22 +1109,22 @@ static void ol_txrx_stats_display_tso(ol_txrx_pdev_handle pdev) struct qdf_tso_seg_t tso_seg = TXRX_STATS_TSO_SEG(pdev, msdu_idx, seg_idx); - QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_DEBUG, - "seg idx: %d", seg_idx); - QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_DEBUG, - "tso_enable: %d", - tso_seg.tso_flags.tso_enable); - QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_DEBUG, - "fin %d syn %d rst %d psh %d ack %d urg %d ece %d cwr %d ns %d", - tso_seg.tso_flags.fin, tso_seg.tso_flags.syn, - tso_seg.tso_flags.rst, tso_seg.tso_flags.psh, - tso_seg.tso_flags.ack, tso_seg.tso_flags.urg, - tso_seg.tso_flags.ece, tso_seg.tso_flags.cwr, - tso_seg.tso_flags.ns); - QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_DEBUG, - "tcp_seq_num: 0x%x ip_id: %d", - tso_seg.tso_flags.tcp_seq_num, - tso_seg.tso_flags.ip_id); + QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_INFO_LOW, + "seg idx: %d", seg_idx); + QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_INFO_LOW, + "tso_enable: %d", + tso_seg.tso_flags.tso_enable); + QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_INFO_LOW, + "fin %d syn %d rst %d psh %d ack %d urg %d ece %d cwr %d ns %d", + tso_seg.tso_flags.fin, tso_seg.tso_flags.syn, + tso_seg.tso_flags.rst, tso_seg.tso_flags.psh, + tso_seg.tso_flags.ack, tso_seg.tso_flags.urg, + tso_seg.tso_flags.ece, tso_seg.tso_flags.cwr, + tso_seg.tso_flags.ns); + QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_INFO_LOW, + "tcp_seq_num: 0x%x ip_id: %d", + tso_seg.tso_flags.tcp_seq_num, + tso_seg.tso_flags.ip_id); } } } @@ -4152,7 +4152,8 @@ int ol_txrx_debug(ol_txrx_vdev_handle vdev, int debug_specs) #endif } if (debug_specs & TXRX_DBG_MASK_STATS) - ol_txrx_stats_display(vdev->pdev); + ol_txrx_stats_display(vdev->pdev, + QDF_STATS_VERBOSITY_LEVEL_HIGH); if (debug_specs & TXRX_DBG_MASK_PROT_ANALYZE) { #if defined(ENABLE_TXRX_PROT_ANALYZE) ol_txrx_prot_ans_display(vdev->pdev); @@ -4287,13 +4288,13 @@ ol_txrx_stats(uint8_t vdev_id, char *buffer, unsigned int buf_len) */ static void ol_txrx_disp_peer_cached_bufq_stats(struct ol_txrx_peer_t *peer) { - QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR, - "cached_bufq: curr %d drops %d hwm %d whatifs %d thresh %d", - peer->bufq_info.curr, - peer->bufq_info.dropped, - peer->bufq_info.high_water_mark, - peer->bufq_info.qdepth_no_thresh, - peer->bufq_info.thresh); + QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_INFO_LOW, + "cached_bufq: curr %d drops %d hwm %d whatifs %d thresh %d", + peer->bufq_info.curr, + peer->bufq_info.dropped, + peer->bufq_info.high_water_mark, + peer->bufq_info.qdepth_no_thresh, + peer->bufq_info.thresh); } /** @@ -4329,28 +4330,59 @@ static void ol_txrx_disp_peer_stats(ol_txrx_pdev_handle pdev) static void ol_txrx_disp_peer_stats(ol_txrx_pdev_handle pdev) { QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR, - "peer stats not supported w/o QCA_SUPPORT_TXRX_LOCAL_PEER_ID"); + "peer stats not supported w/o QCA_SUPPORT_TXRX_LOCAL_PEER_ID"); } #endif -void ol_txrx_stats_display(ol_txrx_pdev_handle pdev) +void ol_txrx_stats_display(ol_txrx_pdev_handle pdev, + enum qdf_stats_verbosity_level level) { - QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR, + u64 tx_dropped = + pdev->stats.pub.tx.dropped.download_fail.pkts + + pdev->stats.pub.tx.dropped.target_discard.pkts + + pdev->stats.pub.tx.dropped.no_ack.pkts + + pdev->stats.pub.tx.dropped.others.pkts; + + if (level == QDF_STATS_VERBOSITY_LEVEL_LOW) { + QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_INFO_LOW, + "STATS |%u %u|TX: %lld tso %lld ok %lld drops(%u-%lld %u-%lld %u-%lld ?-%lld hR-%lld)|RX: %lld drops(E %lld PI %lld ME %lld) fwd(S %d F %d SF %d)|", + pdev->tx_desc.num_free, + pdev->tx_desc.pool_size, + pdev->stats.pub.tx.from_stack.pkts, + pdev->stats.pub.tx.tso.tso_pkts.pkts, + pdev->stats.pub.tx.delivered.pkts, + htt_tx_status_download_fail, + pdev->stats.pub.tx.dropped.download_fail.pkts, + htt_tx_status_discard, + pdev->stats.pub.tx.dropped.target_discard.pkts, + htt_tx_status_no_ack, + pdev->stats.pub.tx.dropped.no_ack.pkts, + pdev->stats.pub.tx.dropped.others.pkts, + pdev->stats.pub.tx.dropped.host_reject.pkts, + pdev->stats.pub.rx.delivered.pkts, + pdev->stats.pub.rx.dropped_err.pkts, + pdev->stats.pub.rx.dropped_peer_invalid.pkts, + pdev->stats.pub.rx.dropped_mic_err.pkts, + pdev->stats.pub.rx.intra_bss_fwd.packets_stack, + pdev->stats.pub.rx.intra_bss_fwd.packets_fwd, + pdev->stats.pub.rx.intra_bss_fwd.packets_stack_n_fwd); + return; + } + + QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_INFO_LOW, "TX PATH Statistics:"); - QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR, + QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_INFO_LOW, "sent %lld msdus (%lld B), host rejected %lld (%lld B), dropped %lld (%lld B)", pdev->stats.pub.tx.from_stack.pkts, pdev->stats.pub.tx.from_stack.bytes, pdev->stats.pub.tx.dropped.host_reject.pkts, pdev->stats.pub.tx.dropped.host_reject.bytes, - pdev->stats.pub.tx.dropped.download_fail.pkts - + pdev->stats.pub.tx.dropped.target_discard.pkts - + pdev->stats.pub.tx.dropped.no_ack.pkts, + tx_dropped, pdev->stats.pub.tx.dropped.download_fail.bytes + pdev->stats.pub.tx.dropped.target_discard.bytes + pdev->stats.pub.tx.dropped.no_ack.bytes); - QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR, - "successfully delivered: %lld (%lld B), download fail: %lld (%lld B), target discard: %lld (%lld B), no ack: %lld (%lld B)", + QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_INFO_LOW, + "successfully delivered: %lld (%lld B), download fail: %lld (%lld B), target discard: %lld (%lld B), no ack: %lld (%lld B) others: %lld (%lld B)", pdev->stats.pub.tx.delivered.pkts, pdev->stats.pub.tx.delivered.bytes, pdev->stats.pub.tx.dropped.download_fail.pkts, @@ -4358,8 +4390,10 @@ void ol_txrx_stats_display(ol_txrx_pdev_handle pdev) pdev->stats.pub.tx.dropped.target_discard.pkts, pdev->stats.pub.tx.dropped.target_discard.bytes, pdev->stats.pub.tx.dropped.no_ack.pkts, - pdev->stats.pub.tx.dropped.no_ack.bytes); - QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR, + pdev->stats.pub.tx.dropped.no_ack.bytes, + pdev->stats.pub.tx.dropped.others.pkts, + pdev->stats.pub.tx.dropped.others.bytes); + QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_INFO_LOW, "Tx completions per HTT message:\n" "Single Packet %d\n" " 2-10 Packets %d\n" @@ -4378,9 +4412,9 @@ void ol_txrx_stats_display(ol_txrx_pdev_handle pdev) pdev->stats.pub.tx.comp_histogram.pkts_51_60, pdev->stats.pub.tx.comp_histogram.pkts_61_plus); - QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR, + QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_INFO_LOW, "RX PATH Statistics:"); - QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR, + QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_INFO_LOW, "%lld ppdus, %lld mpdus, %lld msdus, %lld bytes\n" "dropped: err %lld (%lld B), peer_invalid %lld (%lld B), mic_err %lld (%lld B)\n" "msdus with frag_ind: %d msdus with offload_ind: %d", @@ -4397,13 +4431,13 @@ void ol_txrx_stats_display(ol_txrx_pdev_handle pdev) pdev->stats.pub.rx.msdus_with_frag_ind, pdev->stats.pub.rx.msdus_with_offload_ind); - QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR, + QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_INFO_LOW, " fwd to stack %d, fwd to fw %d, fwd to stack & fw %d\n", pdev->stats.pub.rx.intra_bss_fwd.packets_stack, pdev->stats.pub.rx.intra_bss_fwd.packets_fwd, pdev->stats.pub.rx.intra_bss_fwd.packets_stack_n_fwd); - QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR, + QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_INFO_LOW, "Rx packets per HTT message:\n" "Single Packet %d\n" " 2-10 Packets %d\n" @@ -4661,7 +4695,9 @@ ol_txrx_ll_set_tx_pause_q_depth(uint8_t vdev_id, int pause_q_depth) * * Return: status */ -static QDF_STATUS ol_txrx_display_stats(void *soc, uint16_t value) +static QDF_STATUS +ol_txrx_display_stats(void *soc, uint16_t value, + enum qdf_stats_verbosity_level verb_level) { ol_txrx_pdev_handle pdev; QDF_STATUS status = QDF_STATUS_SUCCESS; @@ -4675,7 +4711,7 @@ static QDF_STATUS ol_txrx_display_stats(void *soc, uint16_t value) switch (value) { case CDP_TXRX_PATH_STATS: - ol_txrx_stats_display(pdev); + ol_txrx_stats_display(pdev, verb_level); break; case CDP_TXRX_TSO_STATS: ol_txrx_stats_display_tso(pdev); diff --git a/core/dp/txrx/ol_txrx_internal.h b/core/dp/txrx/ol_txrx_internal.h index d5e75b9861e8..059e9cdcb404 100644 --- a/core/dp/txrx/ol_txrx_internal.h +++ b/core/dp/txrx/ol_txrx_internal.h @@ -269,6 +269,10 @@ ol_rx_mpdu_list_next(struct ol_txrx_pdev_t *pdev, pub.tx.dropped.download_fail.bytes, _b_cntrs);\ break; \ default: \ + TXRX_STATS_ADD(_pdev, \ + pub.tx.dropped.others.pkts, _p_cntrs); \ + TXRX_STATS_ADD(_pdev, \ + pub.tx.dropped.others.bytes, _b_cntrs); \ break; \ } \ TXRX_STATS_UPDATE_TX_COMP_HISTOGRAM(_pdev, _p_cntrs); \ diff --git a/core/hdd/inc/wlan_hdd_cfg.h b/core/hdd/inc/wlan_hdd_cfg.h index 19f1ec682dfa..87459004f6ac 100644 --- a/core/hdd/inc/wlan_hdd_cfg.h +++ b/core/hdd/inc/wlan_hdd_cfg.h @@ -8154,6 +8154,25 @@ enum hdd_link_speed_rpt_type { #define CFG_TCP_TX_HIGH_TPUT_THRESHOLD_MIN (0) #define CFG_TCP_TX_HIGH_TPUT_THRESHOLD_MAX (16000) +/* + * + * periodic_stats_display_time - time(seconds) after which stats will be printed + * @Min: 0 + * @Max: 256 + * @Default: 10 + * + * This values specifies the recurring time period after which stats will be + * printed in wlan driver logs. + * + * Usage: Internal / External + * + * + */ +#define CFG_PERIODIC_STATS_DISPLAY_TIME_NAME "periodic_stats_display_time" +#define CFG_PERIODIC_STATS_DISPLAY_TIME_DEFAULT (10) +#define CFG_PERIODIC_STATS_DISPLAY_TIME_MIN (0) +#define CFG_PERIODIC_STATS_DISPLAY_TIME_MAX (256) + #endif /* MSM_PLATFORM */ #ifdef WLAN_FEATURE_11W @@ -14064,6 +14083,7 @@ struct hdd_config { uint32_t tcpDelackThresholdLow; uint32_t tcp_tx_high_tput_thres; uint32_t tcp_delack_timer_count; + u8 periodic_stats_disp_time; #endif /* MSM_PLATFORM */ /* FW debug log parameters */ diff --git a/core/hdd/inc/wlan_hdd_main.h b/core/hdd/inc/wlan_hdd_main.h index 7c34d7e757ea..ea8c7aa454fd 100644 --- a/core/hdd/inc/wlan_hdd_main.h +++ b/core/hdd/inc/wlan_hdd_main.h @@ -897,8 +897,8 @@ struct hdd_multicast_addr_list { * @unpause_count - unpause counter */ struct hdd_netif_queue_stats { - uint16_t pause_count; - uint16_t unpause_count; + u32 pause_count; + u32 unpause_count; qdf_time_t total_pause_time; }; @@ -2233,7 +2233,9 @@ int hdd_wlan_dump_stats(struct hdd_adapter *adapter, int value); void wlan_hdd_deinit_tx_rx_histogram(struct hdd_context *hdd_ctx); void wlan_hdd_display_tx_rx_histogram(struct hdd_context *hdd_ctx); void wlan_hdd_clear_tx_rx_histogram(struct hdd_context *hdd_ctx); -void wlan_hdd_display_netif_queue_history(struct hdd_context *hdd_ctx); +void +wlan_hdd_display_netif_queue_history(struct hdd_context *hdd_ctx, + enum qdf_stats_verbosity_level verb_lvl); void wlan_hdd_clear_netif_queue_history(struct hdd_context *hdd_ctx); const char *hdd_get_fwpath(void); void hdd_indicate_mgmt_frame(tSirSmeMgmtFrameInd *frame_ind); diff --git a/core/hdd/src/wlan_hdd_cfg.c b/core/hdd/src/wlan_hdd_cfg.c index 96bbd5580e85..3c3cf49d6884 100644 --- a/core/hdd/src/wlan_hdd_cfg.c +++ b/core/hdd/src/wlan_hdd_cfg.c @@ -3251,6 +3251,12 @@ struct reg_table_entry g_registry_table[] = { CFG_TCP_TX_HIGH_TPUT_THRESHOLD_DEFAULT, CFG_TCP_TX_HIGH_TPUT_THRESHOLD_MIN, CFG_TCP_TX_HIGH_TPUT_THRESHOLD_MAX), + REG_VARIABLE(CFG_PERIODIC_STATS_DISPLAY_TIME_NAME, WLAN_PARAM_Integer, + struct hdd_config, periodic_stats_disp_time, + VAR_FLAGS_OPTIONAL | VAR_FLAGS_RANGE_CHECK_ASSUME_DEFAULT, + CFG_PERIODIC_STATS_DISPLAY_TIME_DEFAULT, + CFG_PERIODIC_STATS_DISPLAY_TIME_MIN, + CFG_PERIODIC_STATS_DISPLAY_TIME_MAX), #endif REG_VARIABLE(CFG_ENABLE_FW_LOG_TYPE, WLAN_PARAM_Integer, @@ -6594,7 +6600,9 @@ void hdd_cfg_print(struct hdd_context *hdd_ctx) hdd_debug("Name = [%s] Value = [%u] ", CFG_TCP_TX_HIGH_TPUT_THRESHOLD_NAME, hdd_ctx->config->tcp_tx_high_tput_thres); - + hdd_debug("Name = [%s] Value = [%u] ", + CFG_PERIODIC_STATS_DISPLAY_TIME_NAME, + hdd_ctx->config->periodic_stats_disp_time); #endif hdd_debug("Name = [gIgnoreCAC] Value = [%u] ", diff --git a/core/hdd/src/wlan_hdd_main.c b/core/hdd/src/wlan_hdd_main.c index fd2f1fc607c9..0930be17258e 100644 --- a/core/hdd/src/wlan_hdd_main.c +++ b/core/hdd/src/wlan_hdd_main.c @@ -59,6 +59,7 @@ #include "qdf_trace.h" #include #include +#include #include #include @@ -6411,6 +6412,53 @@ static int hdd_wiphy_init(struct hdd_context *hdd_ctx) return ret_val; } +#ifdef MSM_PLATFORM +/** + * hdd_display_periodic_stats() - Function to display periodic stats + * @hdd_ctx - handle to hdd context + * @bool data_in_interval - true, if data detected in bw time interval + * + * The periodicity is determined by hdd_ctx->config->periodic_stats_disp_time. + * Stats show up in wlan driver logs. + * + * Returns: None + */ +static inline +void hdd_display_periodic_stats(struct hdd_context *hdd_ctx, + bool data_in_interval) +{ + static u32 counter; + static bool data_in_time_period; + ol_txrx_pdev_handle pdev; + + if (hdd_ctx->config->periodic_stats_disp_time == 0) + return; + + pdev = cds_get_context(QDF_MODULE_ID_TXRX); + if (!pdev) { + hdd_err("pdev is NULL"); + return; + } + + counter++; + if (data_in_interval) + data_in_time_period = data_in_interval; + + if (counter * hdd_ctx->config->busBandwidthComputeInterval >= + hdd_ctx->config->periodic_stats_disp_time * 1000) { + if (data_in_time_period) { + cdp_display_stats(cds_get_context(QDF_MODULE_ID_SOC), + CDP_TXRX_PATH_STATS, + QDF_STATS_VERBOSITY_LEVEL_LOW); + wlan_hdd_display_netif_queue_history + (hdd_ctx, QDF_STATS_VERBOSITY_LEVEL_LOW); + qdf_dp_trace_dump_stats(); + } + counter = 0; + data_in_time_period = false; + } +} + /** * hdd_pld_request_bus_bandwidth() - Function to control bus bandwidth * @hdd_ctx - handle to hdd context @@ -6422,12 +6470,12 @@ static int hdd_wiphy_init(struct hdd_context *hdd_ctx) * * Returns: None */ -#ifdef MSM_PLATFORM + static void hdd_pld_request_bus_bandwidth(struct hdd_context *hdd_ctx, const uint64_t tx_packets, const uint64_t rx_packets) { - uint64_t total = tx_packets + rx_packets; + u64 total_pkts = tx_packets + rx_packets; uint64_t temp_rx = 0; uint64_t temp_tx = 0; enum pld_bus_width_type next_vote_level = PLD_BUS_WIDTH_NONE; @@ -6439,11 +6487,11 @@ static void hdd_pld_request_bus_bandwidth(struct hdd_context *hdd_ctx, bool rx_level_change = false; bool tx_level_change = false; - if (total > hdd_ctx->config->busBandwidthHighThreshold) + if (total_pkts > hdd_ctx->config->busBandwidthHighThreshold) next_vote_level = PLD_BUS_WIDTH_HIGH; - else if (total > hdd_ctx->config->busBandwidthMediumThreshold) + else if (total_pkts > hdd_ctx->config->busBandwidthMediumThreshold) next_vote_level = PLD_BUS_WIDTH_MEDIUM; - else if (total > hdd_ctx->config->busBandwidthLowThreshold) + else if (total_pkts > hdd_ctx->config->busBandwidthLowThreshold) next_vote_level = PLD_BUS_WIDTH_LOW; else next_vote_level = PLD_BUS_WIDTH_NONE; @@ -6540,7 +6588,6 @@ static void hdd_pld_request_bus_bandwidth(struct hdd_context *hdd_ctx, } index = hdd_ctx->hdd_txrx_hist_idx; - if (vote_level_change || tx_level_change || rx_level_change) { hdd_ctx->hdd_txrx_hist[index].next_tx_level = next_tx_level; hdd_ctx->hdd_txrx_hist[index].next_rx_level = next_rx_level; @@ -6551,6 +6598,8 @@ static void hdd_pld_request_bus_bandwidth(struct hdd_context *hdd_ctx, hdd_ctx->hdd_txrx_hist_idx++; hdd_ctx->hdd_txrx_hist_idx &= NUM_TX_RX_HISTOGRAM_MASK; } + + hdd_display_periodic_stats(hdd_ctx, (total_pkts > 0) ? true : false); } #define HDD_BW_GET_DIFF(_x, _y) (unsigned long)((ULONG_MAX - (_y)) + (_x) + 1) @@ -6852,13 +6901,100 @@ void wlan_hdd_clear_tx_rx_histogram(struct hdd_context *hdd_ctx) (sizeof(struct hdd_tx_rx_histogram) * NUM_TX_RX_HISTOGRAM)); } +/* length of the netif queue log needed per adapter */ +#define ADAP_NETIFQ_LOG_LEN ((20 * WLAN_REASON_TYPE_MAX) + 50) + +/** + * + * hdd_display_netif_queue_history_compact() - display compact netifq history + * @hdd_ctx: hdd context + * + * Return: none + */ +static void +hdd_display_netif_queue_history_compact(struct hdd_context *hdd_ctx) +{ + int adapter_num = 0; + int i; + int bytes_written; + u32 tbytes; + qdf_time_t total, pause, unpause, curr_time, delta; + QDF_STATUS status; + char temp_str[20 * WLAN_REASON_TYPE_MAX]; + char comb_log_str[(ADAP_NETIFQ_LOG_LEN * MAX_NUMBER_OF_ADAPTERS) + 1]; + struct hdd_adapter *adapter = NULL; + hdd_adapter_list_node_t *adapter_node = NULL, *next = NULL; + + bytes_written = 0; + qdf_mem_set(comb_log_str, 0, sizeof(comb_log_str)); + status = hdd_get_front_adapter(hdd_ctx, &adapter_node); + while (NULL != adapter_node && QDF_STATUS_SUCCESS == status) { + adapter = adapter_node->adapter; + + curr_time = qdf_system_ticks(); + total = curr_time - adapter->start_time; + delta = curr_time - adapter->last_time; + + if (adapter->pause_map) { + pause = adapter->total_pause_time + delta; + unpause = adapter->total_unpause_time; + } else { + unpause = adapter->total_unpause_time + delta; + pause = adapter->total_pause_time; + } + + tbytes = 0; + qdf_mem_set(temp_str, 0, sizeof(temp_str)); + for (i = WLAN_CONTROL_PATH; i < WLAN_REASON_TYPE_MAX; i++) { + if (adapter->queue_oper_stats[i].pause_count == 0) + continue; + tbytes += + snprintf( + &temp_str[tbytes], + (tbytes >= sizeof(temp_str) ? + 0 : sizeof(temp_str) - tbytes), + "%d(%d,%d) ", + i, + adapter->queue_oper_stats[i]. + pause_count, + adapter->queue_oper_stats[i]. + unpause_count); + } + if (tbytes >= sizeof(temp_str)) + hdd_warn("log truncated"); + + bytes_written += snprintf(&comb_log_str[bytes_written], + bytes_written >= sizeof(comb_log_str) ? 0 : + sizeof(comb_log_str) - bytes_written, + "[%d %d] (%d) %u/%ums %s|", + adapter->session_id, adapter->device_mode, + adapter->pause_map, + qdf_system_ticks_to_msecs(pause), + qdf_system_ticks_to_msecs(total), + temp_str); + + status = hdd_get_next_adapter(hdd_ctx, adapter_node, &next); + adapter_node = next; + adapter_num++; + } + + /* using QDF_TRACE to avoid printing function name */ + QDF_TRACE(QDF_MODULE_ID_HDD, QDF_TRACE_LEVEL_INFO_LOW, + "STATS |%s", comb_log_str); + + if (bytes_written >= sizeof(comb_log_str)) + hdd_warn("log string truncated"); +} + /** * wlan_hdd_display_netif_queue_history() - display netif queue history * @hdd_ctx: hdd context * * Return: none */ -void wlan_hdd_display_netif_queue_history(struct hdd_context *hdd_ctx) +void +wlan_hdd_display_netif_queue_history(struct hdd_context *hdd_ctx, + enum qdf_stats_verbosity_level verb_lvl) { struct hdd_adapter *adapter = NULL; @@ -6867,6 +7003,11 @@ void wlan_hdd_display_netif_queue_history(struct hdd_context *hdd_ctx) int i; qdf_time_t total, pause, unpause, curr_time, delta; + if (verb_lvl == QDF_STATS_VERBOSITY_LEVEL_LOW) { + hdd_display_netif_queue_history_compact(hdd_ctx); + return; + } + status = hdd_get_front_adapter(hdd_ctx, &adapter_node); while (NULL != adapter_node && QDF_STATUS_SUCCESS == status) { adapter = adapter_node->adapter; @@ -6932,8 +7073,6 @@ void wlan_hdd_display_netif_queue_history(struct hdd_context *hdd_ctx) status = hdd_get_next_adapter(hdd_ctx, adapter_node, &next); adapter_node = next; } - - } /** diff --git a/core/hdd/src/wlan_hdd_softap_tx_rx.c b/core/hdd/src/wlan_hdd_softap_tx_rx.c index 94eaef66810e..82f35f34e9b1 100644 --- a/core/hdd/src/wlan_hdd_softap_tx_rx.c +++ b/core/hdd/src/wlan_hdd_softap_tx_rx.c @@ -549,7 +549,8 @@ static void __hdd_softap_tx_timeout(struct net_device *dev) i, netif_tx_queue_stopped(txq), txq->trans_start); } - wlan_hdd_display_netif_queue_history(hdd_ctx); + wlan_hdd_display_netif_queue_history(hdd_ctx, + QDF_STATS_VERBOSITY_LEVEL_HIGH); cdp_dump_flow_pool_info(cds_get_context(QDF_MODULE_ID_SOC)); QDF_TRACE(QDF_MODULE_ID_HDD_DATA, QDF_TRACE_LEVEL_DEBUG, "carrier state: %d", netif_carrier_ok(dev)); diff --git a/core/hdd/src/wlan_hdd_tx_rx.c b/core/hdd/src/wlan_hdd_tx_rx.c index a74788c6bdf8..0ef7078bbef8 100644 --- a/core/hdd/src/wlan_hdd_tx_rx.c +++ b/core/hdd/src/wlan_hdd_tx_rx.c @@ -897,7 +897,8 @@ static void __hdd_tx_timeout(struct net_device *dev) QDF_TRACE(QDF_MODULE_ID_HDD_DATA, QDF_TRACE_LEVEL_DEBUG, "carrier state: %d", netif_carrier_ok(dev)); hdd_ctx = WLAN_HDD_GET_CTX(adapter); - wlan_hdd_display_netif_queue_history(hdd_ctx); + wlan_hdd_display_netif_queue_history(hdd_ctx, + QDF_STATS_VERBOSITY_LEVEL_HIGH); cdp_dump_flow_pool_info(cds_get_context(QDF_MODULE_ID_SOC)); ++adapter->hdd_stats.tx_rx_stats.tx_timeout_cnt; diff --git a/core/hdd/src/wlan_hdd_wext.c b/core/hdd/src/wlan_hdd_wext.c index 9acd32721b30..3ff4f3012580 100644 --- a/core/hdd/src/wlan_hdd_wext.c +++ b/core/hdd/src/wlan_hdd_wext.c @@ -3229,7 +3229,9 @@ int hdd_wlan_dump_stats(struct hdd_adapter *adapter, int value) wlan_hdd_display_tx_rx_histogram(hdd_ctx); break; case CDP_HDD_NETIF_OPER_HISTORY: - wlan_hdd_display_netif_queue_history(hdd_ctx); + wlan_hdd_display_netif_queue_history + (hdd_ctx, + QDF_STATS_VERBOSITY_LEVEL_HIGH); break; case CDP_HIF_STATS: hdd_display_hif_stats(); @@ -3248,7 +3250,8 @@ int hdd_wlan_dump_stats(struct hdd_adapter *adapter, int value) break; default: status = cdp_display_stats(cds_get_context(QDF_MODULE_ID_SOC), - value); + value, + QDF_STATS_VERBOSITY_LEVEL_HIGH); if (status == QDF_STATUS_E_INVAL) { hdd_display_stats_help(); ret = EINVAL; diff --git a/core/wma/src/wma_data.c b/core/wma/src/wma_data.c index 884c57eee94e..e315e626a95d 100644 --- a/core/wma/src/wma_data.c +++ b/core/wma/src/wma_data.c @@ -2804,7 +2804,8 @@ QDF_STATUS wma_tx_packet(void *wma_context, void *tx_frame, uint16_t frmLen, * WMA_TX_FRAME_COMPLETE_TIMEOUT (1 sec) */ /* display scheduler stats */ - return cdp_display_stats(soc, CDP_SCHEDULER_STATS); + return cdp_display_stats(soc, CDP_SCHEDULER_STATS, + QDF_STATS_VERBOSITY_LEVEL_HIGH); } }