From 75394d6c8f75fc0423318d4df37f83ebb4e263a3 Mon Sep 17 00:00:00 2001 From: "Padma, Santhosh Kumar" Date: Thu, 11 Aug 2016 16:33:03 +0530 Subject: [PATCH] qcacmn: Dump driver information qcacld-2.0 to qcacmn propagation Dump state information of HDD, SME, PE and WMA layers into a buffer. Contents of this buffer will be copied into user space using proc entry /proc/debugdriver/ driverdump. Change-Id: Ifbb102e440d7df20defa1a397964cb9b55082bf9 CRs-Fixed: 955357 --- qdf/inc/qdf_trace.h | 6 ++++ qdf/linux/src/i_qdf_trace.h | 1 + qdf/linux/src/qdf_trace.c | 65 +++++++++++++++++++++++++++++++++++++ 3 files changed, 72 insertions(+) diff --git a/qdf/inc/qdf_trace.h b/qdf/inc/qdf_trace.h index b80cfa9b4d8f..f113e558c29a 100644 --- a/qdf/inc/qdf_trace.h +++ b/qdf/inc/qdf_trace.h @@ -364,6 +364,12 @@ void qdf_trace_set_level(QDF_MODULE_ID module, QDF_TRACE_LEVEL level); bool qdf_trace_get_level(QDF_MODULE_ID module, QDF_TRACE_LEVEL level); typedef void (*tp_qdf_trace_cb)(void *p_mac, tp_qdf_trace_record, uint16_t); +typedef void (*tp_qdf_state_info_cb) (char **buf, uint16_t *size); +void qdf_register_debugcb_init(void); +void qdf_register_debug_callback(QDF_MODULE_ID module_id, + tp_qdf_state_info_cb qdf_state_infocb); +QDF_STATUS qdf_state_info_dump_all(char *buf, uint16_t size, + uint16_t *driver_dump_size); void qdf_trace(uint8_t module, uint8_t code, uint16_t session, uint32_t data); void qdf_trace_register(QDF_MODULE_ID, tp_qdf_trace_cb); QDF_STATUS qdf_trace_spin_lock_init(void); diff --git a/qdf/linux/src/i_qdf_trace.h b/qdf/linux/src/i_qdf_trace.h index dd3709b30f41..6cd100cbe060 100644 --- a/qdf/linux/src/i_qdf_trace.h +++ b/qdf/linux/src/i_qdf_trace.h @@ -75,6 +75,7 @@ #endif /* CONFIG_MCL */ #define QDF_ENABLE_TRACING +#define qdf_scnprintf scnprintf #ifdef QDF_ENABLE_TRACING diff --git a/qdf/linux/src/qdf_trace.c b/qdf/linux/src/qdf_trace.c index e1d2bbefd2c9..4da323b541b3 100644 --- a/qdf/linux/src/qdf_trace.c +++ b/qdf/linux/src/qdf_trace.c @@ -101,6 +101,7 @@ static t_qdf_trace_data g_qdf_trace_data; */ static tp_qdf_trace_cb qdf_trace_cb_table[QDF_MODULE_ID_MAX]; static tp_qdf_trace_cb qdf_trace_restore_cb_table[QDF_MODULE_ID_MAX]; +static tp_qdf_state_info_cb qdf_state_info_table[QDF_MODULE_ID_MAX]; #ifdef FEATURE_DP_TRACE /* Static and Global variables */ @@ -715,6 +716,70 @@ void qdf_trace_dump_all(void *p_mac, uint8_t code, uint8_t session, } EXPORT_SYMBOL(qdf_trace_dump_all); +/** + * qdf_register_debugcb_init() - initializes debug callbacks + * to NULL + * + * Return: None + */ +void qdf_register_debugcb_init(void) +{ + uint8_t i; + + for (i = 0; i < QDF_MODULE_ID_MAX; i++) + qdf_state_info_table[i] = NULL; +} +EXPORT_SYMBOL(qdf_register_debugcb_init); + +/** + * qdf_register_debug_callback() - stores callback handlers to print + * state information + * @module_id: module id of layer + * @qdf_state_infocb: callback to be registered + * + * This function is used to store callback handlers to print + * state information + * + * Return: None + */ +void qdf_register_debug_callback(QDF_MODULE_ID module_id, + tp_qdf_state_info_cb qdf_state_infocb) +{ + qdf_state_info_table[module_id] = qdf_state_infocb; +} +EXPORT_SYMBOL(qdf_register_debug_callback); + +/** + * qdf_state_info_dump_all() - it invokes callback of layer which registered + * its callback to print its state information. + * @buf: buffer pointer to be passed + * @size: size of buffer to be filled + * @driver_dump_size: actual size of buffer used + * + * Return: QDF_STATUS_SUCCESS on success + */ +QDF_STATUS qdf_state_info_dump_all(char *buf, uint16_t size, + uint16_t *driver_dump_size) +{ + uint8_t module, ret = QDF_STATUS_SUCCESS; + uint16_t buf_len = size; + char *buf_ptr = buf; + + for (module = 0; module < QDF_MODULE_ID_MAX; module++) { + if (NULL != qdf_state_info_table[module]) { + qdf_state_info_table[module](&buf_ptr, &buf_len); + if (!buf_len) { + ret = QDF_STATUS_E_NOMEM; + break; + } + } + } + + *driver_dump_size = size - buf_len; + return ret; +} +EXPORT_SYMBOL(qdf_state_info_dump_all); + #ifdef FEATURE_DP_TRACE /** * qdf_dp_trace_init() - enables the DP trace