diff options
author | Rakshith Suresh Patkar <rpatkar@codeaurora.org> | 2018-12-06 20:40:49 +0530 |
---|---|---|
committer | Sunil Ravi <sunilravi@google.com> | 2019-01-18 23:57:22 +0000 |
commit | 6239528ae5c81f54a7883b7c254ac2daaec1e9c1 (patch) | |
tree | 1e6290eaf95a612b8da2e537334d776e69aef05f | |
parent | 8d5c0f4046d0d738e02a12337c250b2bf96110ef (diff) | |
download | qca-wfi-host-cmn-6239528ae5c81f54a7883b7c254ac2daaec1e9c1.tar.gz |
qcacmn: Add support to dump last n dpt stat records
Add support to dump only last n dpt records of debug fs
dump_set_dpt_logs file.
Change-Id: Ic6418803d53cc2abbfc200f62df2a24c3bc55d54
CRs-Fixed: 2362523
Bug: 118484169
Bug: 123035928
Signed-off-by: Srinivas Girigowda <quic_sgirigow@quicinc.com>
-rw-r--r-- | qdf/inc/qdf_trace.h | 16 | ||||
-rw-r--r-- | qdf/linux/src/qdf_trace.c | 76 |
2 files changed, 70 insertions, 22 deletions
diff --git a/qdf/inc/qdf_trace.h b/qdf/inc/qdf_trace.h index 520329cf3..8df908ff6 100644 --- a/qdf/inc/qdf_trace.h +++ b/qdf/inc/qdf_trace.h @@ -370,6 +370,8 @@ struct qdf_dp_trace_record_s { * @num: Current index * @proto_bitmap: defines which protocol to be traced * @no_of_record: defines every nth packet to be traced + * @num_records_to_dump: defines number of records to be dumped + * @dump_counter: counter to track number of records dumped * @verbosity : defines verbosity level * @ini_conf_verbosity: Configured verbosity from INI * @enable: enable/disable DP trace @@ -413,6 +415,8 @@ struct s_qdf_dp_trace_data { uint32_t num; uint8_t proto_bitmap; uint8_t no_of_record; + uint16_t num_records_to_dump; + uint16_t dump_counter; uint8_t verbosity; uint8_t ini_conf_verbosity; bool enable; @@ -651,14 +655,16 @@ QDF_STATUS qdf_dpt_dump_stats_debugfs(qdf_debugfs_file_t file, uint32_t curr_pos); /** - * qdf_dpt_set_value_debugfs() - dump DP Trace stats to debugfs file - * @file: debugfs file to read - * @curr_pos: curr position to start read + * qdf_dpt_set_value_debugfs() - set value of DP Trace debugfs params + * @proto_bitmap: defines which protocol to be traced + * @no_of_record: defines every nth packet to be traced + * @verbosity : defines verbosity level + * @num_records_to_dump: defines number of records to be dumped * * Return: none */ void qdf_dpt_set_value_debugfs(uint8_t proto_bitmap, uint8_t no_of_record, - uint8_t verbosity); + uint8_t verbosity, uint16_t num_records_to_dump); /** @@ -860,7 +866,7 @@ QDF_STATUS qdf_dpt_dump_stats_debugfs(qdf_debugfs_file_t file, static inline void qdf_dpt_set_value_debugfs(uint8_t proto_bitmap, uint8_t no_of_record, - uint8_t verbosity) + uint8_t verbosity, uint16_t num_records_to_dump) { } diff --git a/qdf/linux/src/qdf_trace.c b/qdf/linux/src/qdf_trace.c index 002b1ac9a..370fd5e98 100644 --- a/qdf/linux/src/qdf_trace.c +++ b/qdf/linux/src/qdf_trace.c @@ -760,6 +760,14 @@ qdf_export_symbol(qdf_state_info_dump_all); #ifdef CONFIG_DP_TRACE #define QDF_DP_TRACE_PREPEND_STR_SIZE 100 +/* + * one dp trace record can't be greater than 300 bytes. + * Max Size will be QDF_DP_TRACE_PREPEND_STR_SIZE(100) + BUFFER_SIZE(121). + * Always make sure to change this QDF_DP_TRACE_MAX_RECORD_SIZE + * value accordingly whenever above two mentioned MACRO value changes. + */ +#define QDF_DP_TRACE_MAX_RECORD_SIZE 300 + static void qdf_dp_unused(struct qdf_dp_trace_record_s *record, uint16_t index, uint8_t pdev_id, uint8_t info) { @@ -2094,8 +2102,13 @@ void qdf_dp_trace_clear_buffer(void) g_qdf_dp_trace_data.head = INVALID_QDF_DP_TRACE_ADDR; g_qdf_dp_trace_data.tail = INVALID_QDF_DP_TRACE_ADDR; g_qdf_dp_trace_data.num = 0; - memset(g_qdf_dp_trace_tbl, 0, - MAX_QDF_DP_TRACE_RECORDS * sizeof(struct qdf_dp_trace_record_s)); + g_qdf_dp_trace_data.dump_counter = 0; + g_qdf_dp_trace_data.num_records_to_dump = MAX_QDF_DP_TRACE_RECORDS; + + if (g_qdf_dp_trace_data.enable) + memset(g_qdf_dp_trace_tbl, 0, + MAX_QDF_DP_TRACE_RECORDS * + sizeof(struct qdf_dp_trace_record_s)); } qdf_export_symbol(qdf_dp_trace_clear_buffer); @@ -2152,8 +2165,7 @@ static void qdf_dpt_dump_hex_trace_debugfs(qdf_debugfs_file_t file, hex_dump_to_buffer(ptr + i, linelen, ROW_SIZE, 1, linebuf, sizeof(linebuf), false); - qdf_debugfs_printf(file, "DPT: %s %s\n", - str, linebuf); + qdf_debugfs_printf(file, "%s %s\n", str, linebuf); } } @@ -2323,10 +2335,11 @@ uint32_t qdf_dpt_get_curr_pos_debugfs(qdf_debugfs_file_t file, return g_qdf_dp_trace_data.curr_pos; qdf_debugfs_printf(file, - "DPT: config - bitmap 0x%x verb %u #rec %u live_config %u thresh %u time_limit %u\n", + "DPT: config - bitmap 0x%x verb %u #rec %u rec_requested %u live_config %u thresh %u time_limit %u\n", g_qdf_dp_trace_data.proto_bitmap, g_qdf_dp_trace_data.verbosity, g_qdf_dp_trace_data.no_of_record, + g_qdf_dp_trace_data.num_records_to_dump, g_qdf_dp_trace_data.live_mode_config, g_qdf_dp_trace_data.high_tput_thresh, g_qdf_dp_trace_data.thresh_time_limit); @@ -2377,7 +2390,8 @@ uint32_t qdf_dpt_get_curr_pos_debugfs(qdf_debugfs_file_t file, g_qdf_dp_trace_data.saved_tail = tail; } spin_unlock_bh(&l_dp_trace_lock); - return i; + + return g_qdf_dp_trace_data.saved_tail; } qdf_export_symbol(qdf_dpt_get_curr_pos_debugfs); @@ -2386,14 +2400,36 @@ QDF_STATUS qdf_dpt_dump_stats_debugfs(qdf_debugfs_file_t file, { struct qdf_dp_trace_record_s p_record; uint32_t i = curr_pos; - uint32_t tail = g_qdf_dp_trace_data.saved_tail; + uint16_t num_records_to_dump = g_qdf_dp_trace_data.num_records_to_dump; - spin_lock_bh(&l_dp_trace_lock); + if (!g_qdf_dp_trace_data.enable) { + QDF_TRACE(QDF_MODULE_ID_QDF, QDF_TRACE_LEVEL_ERROR, + "%s: Tracing Disabled", __func__); + return QDF_STATUS_E_FAILURE; + } + if (num_records_to_dump > g_qdf_dp_trace_data.num) + num_records_to_dump = g_qdf_dp_trace_data.num; + + /* + * Max dp trace record size should always be less than + * QDF_DP_TRACE_PREPEND_STR_SIZE(100) + BUFFER_SIZE(121). + */ + if (WARN_ON(QDF_DP_TRACE_MAX_RECORD_SIZE < + QDF_DP_TRACE_PREPEND_STR_SIZE + BUFFER_SIZE)) + return QDF_STATUS_E_FAILURE; + + spin_lock_bh(&l_dp_trace_lock); p_record = g_qdf_dp_trace_tbl[i]; spin_unlock_bh(&l_dp_trace_lock); + for (;; ) { - if ((file->size - file->count) < 100) { + /* + * Initially we get file as 1 page size, and + * if remaining size in file is less than one record max size, + * then return so that it gets an extra page. + */ + if ((file->size - file->count) < QDF_DP_TRACE_MAX_RECORD_SIZE) { spin_lock_bh(&l_dp_trace_lock); g_qdf_dp_trace_data.curr_pos = i; spin_unlock_bh(&l_dp_trace_lock); @@ -2465,17 +2501,20 @@ QDF_STATUS qdf_dpt_dump_stats_debugfs(qdf_debugfs_file_t file, break; } - if (i == tail) + if (++g_qdf_dp_trace_data.dump_counter == num_records_to_dump) break; - i += 1; spin_lock_bh(&l_dp_trace_lock); - if (i == MAX_QDF_DP_TRACE_RECORDS) - i = 0; + if (i == 0) + i = MAX_QDF_DP_TRACE_RECORDS; + i -= 1; p_record = g_qdf_dp_trace_tbl[i]; spin_unlock_bh(&l_dp_trace_lock); } + + g_qdf_dp_trace_data.dump_counter = 0; + return QDF_STATUS_SUCCESS; } qdf_export_symbol(qdf_dpt_dump_stats_debugfs); @@ -2489,11 +2528,14 @@ qdf_export_symbol(qdf_dpt_dump_stats_debugfs); * Return: None */ void qdf_dpt_set_value_debugfs(uint8_t proto_bitmap, uint8_t no_of_record, - uint8_t verbosity) + uint8_t verbosity, uint16_t num_records_to_dump) { - g_qdf_dp_trace_data.proto_bitmap = proto_bitmap; - g_qdf_dp_trace_data.no_of_record = no_of_record; - g_qdf_dp_trace_data.verbosity = verbosity; + if (g_qdf_dp_trace_data.enable) { + g_qdf_dp_trace_data.proto_bitmap = proto_bitmap; + g_qdf_dp_trace_data.no_of_record = no_of_record; + g_qdf_dp_trace_data.verbosity = verbosity; + g_qdf_dp_trace_data.num_records_to_dump = num_records_to_dump; + } } qdf_export_symbol(qdf_dpt_set_value_debugfs); |