xref: /wlan-driver/qca-wifi-host-cmn/qdf/linux/src/qdf_trace.c (revision 5113495b16420b49004c444715d2daae2066e7dc)
1*5113495bSYour Name /*
2*5113495bSYour Name  * Copyright (c) 2014-2021 The Linux Foundation. All rights reserved.
3*5113495bSYour Name  * Copyright (c) 2021-2024 Qualcomm Innovation Center, Inc. All rights reserved.
4*5113495bSYour Name  *
5*5113495bSYour Name  * Permission to use, copy, modify, and/or distribute this software for
6*5113495bSYour Name  * any purpose with or without fee is hereby granted, provided that the
7*5113495bSYour Name  * above copyright notice and this permission notice appear in all
8*5113495bSYour Name  * copies.
9*5113495bSYour Name  *
10*5113495bSYour Name  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
11*5113495bSYour Name  * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
12*5113495bSYour Name  * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
13*5113495bSYour Name  * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
14*5113495bSYour Name  * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
15*5113495bSYour Name  * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
16*5113495bSYour Name  * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
17*5113495bSYour Name  * PERFORMANCE OF THIS SOFTWARE.
18*5113495bSYour Name  */
19*5113495bSYour Name 
20*5113495bSYour Name /**
21*5113495bSYour Name  *  DOC:  qdf_trace
22*5113495bSYour Name  *  QCA driver framework (QDF) trace APIs
23*5113495bSYour Name  *  Trace, logging, and debugging definitions and APIs
24*5113495bSYour Name  */
25*5113495bSYour Name 
26*5113495bSYour Name /* Include Files */
27*5113495bSYour Name #include "qdf_str.h"
28*5113495bSYour Name #include <qdf_trace.h>
29*5113495bSYour Name #include <qdf_parse.h>
30*5113495bSYour Name #include <qdf_module.h>
31*5113495bSYour Name #include <qdf_util.h>
32*5113495bSYour Name #include <qdf_mem.h>
33*5113495bSYour Name #include <qdf_list.h>
34*5113495bSYour Name 
35*5113495bSYour Name /* macro to map qdf trace levels into the bitmask */
36*5113495bSYour Name #define QDF_TRACE_LEVEL_TO_MODULE_BITMASK(_level) ((1 << (_level)))
37*5113495bSYour Name 
38*5113495bSYour Name #include <wlan_logging_sock_svc.h>
39*5113495bSYour Name #include <qdf_module.h>
40*5113495bSYour Name static int qdf_pidx = -1;
41*5113495bSYour Name static bool qdf_log_dump_at_kernel_enable = true;
42*5113495bSYour Name qdf_declare_param(qdf_log_dump_at_kernel_enable, bool);
43*5113495bSYour Name 
44*5113495bSYour Name /* This value of 0 will disable the timer by default. */
45*5113495bSYour Name static uint32_t qdf_log_flush_timer_period;
46*5113495bSYour Name qdf_declare_param(qdf_log_flush_timer_period, uint);
47*5113495bSYour Name 
48*5113495bSYour Name #include "qdf_time.h"
49*5113495bSYour Name #include "qdf_mc_timer.h"
50*5113495bSYour Name #include <host_diag_core_log.h>
51*5113495bSYour Name 
52*5113495bSYour Name #ifdef CONNECTIVITY_DIAG_EVENT
53*5113495bSYour Name #include <wlan_connectivity_logging.h>
54*5113495bSYour Name #include "i_host_diag_core_event.h"
55*5113495bSYour Name #endif
56*5113495bSYour Name 
57*5113495bSYour Name #ifdef WLAN_CHIPSET_STATS
58*5113495bSYour Name #include "wlan_cp_stats_chipset_stats.h"
59*5113495bSYour Name #endif
60*5113495bSYour Name /* Global qdf print id */
61*5113495bSYour Name 
62*5113495bSYour Name /* Preprocessor definitions and constants */
63*5113495bSYour Name 
64*5113495bSYour Name enum qdf_timestamp_unit qdf_log_timestamp_type = QDF_LOG_TIMESTAMP_UNIT;
65*5113495bSYour Name 
66*5113495bSYour Name #define DP_TRACE_META_DATA_STRLEN 50
67*5113495bSYour Name 
68*5113495bSYour Name #ifdef TRACE_RECORD
69*5113495bSYour Name /* Static and Global variables */
70*5113495bSYour Name static spinlock_t ltrace_lock;
71*5113495bSYour Name /* global qdf trace data */
72*5113495bSYour Name static t_qdf_trace_data g_qdf_trace_data;
73*5113495bSYour Name /*
74*5113495bSYour Name  * all the call back functions for dumping MTRACE messages from ring buffer
75*5113495bSYour Name  * are stored in qdf_trace_cb_table,these callbacks are initialized during init
76*5113495bSYour Name  * only so, we will make a copy of these call back functions and maintain in to
77*5113495bSYour Name  * qdf_trace_restore_cb_table. Incase if we make modifications to
78*5113495bSYour Name  * qdf_trace_cb_table, we can certainly retrieve all the call back functions
79*5113495bSYour Name  * back from Restore Table
80*5113495bSYour Name  */
81*5113495bSYour Name static tp_qdf_trace_cb qdf_trace_cb_table[QDF_MODULE_ID_MAX];
82*5113495bSYour Name static tp_qdf_trace_cb qdf_trace_restore_cb_table[QDF_MODULE_ID_MAX];
83*5113495bSYour Name 
84*5113495bSYour Name #ifdef WLAN_LOGGING_BUFFERS_DYNAMICALLY
85*5113495bSYour Name static qdf_trace_record_t *g_qdf_trace_tbl;
86*5113495bSYour Name #else
87*5113495bSYour Name static qdf_trace_record_t g_qdf_trace_tbl[MAX_QDF_TRACE_RECORDS];
88*5113495bSYour Name #endif
89*5113495bSYour Name 
90*5113495bSYour Name #endif
91*5113495bSYour Name 
92*5113495bSYour Name #ifdef WLAN_FEATURE_MEMDUMP_ENABLE
93*5113495bSYour Name static tp_qdf_state_info_cb qdf_state_info_table[QDF_MODULE_ID_MAX];
94*5113495bSYour Name #endif
95*5113495bSYour Name 
96*5113495bSYour Name #ifdef CONFIG_DP_TRACE
97*5113495bSYour Name /* Static and Global variables */
98*5113495bSYour Name #ifdef WLAN_LOGGING_BUFFERS_DYNAMICALLY
99*5113495bSYour Name static struct qdf_dp_trace_record_s *g_qdf_dp_trace_tbl;
100*5113495bSYour Name #else
101*5113495bSYour Name static struct qdf_dp_trace_record_s
102*5113495bSYour Name 			g_qdf_dp_trace_tbl[MAX_QDF_DP_TRACE_RECORDS];
103*5113495bSYour Name #endif
104*5113495bSYour Name static spinlock_t l_dp_trace_lock;
105*5113495bSYour Name 
106*5113495bSYour Name /*
107*5113495bSYour Name  * all the options to configure/control DP trace are
108*5113495bSYour Name  * defined in this structure
109*5113495bSYour Name  */
110*5113495bSYour Name static struct s_qdf_dp_trace_data g_qdf_dp_trace_data;
111*5113495bSYour Name /*
112*5113495bSYour Name  * all the call back functions for dumping DPTRACE messages from ring buffer
113*5113495bSYour Name  * are stored in qdf_dp_trace_cb_table, callbacks are initialized during init
114*5113495bSYour Name  */
115*5113495bSYour Name static tp_qdf_dp_trace_cb qdf_dp_trace_cb_table[QDF_DP_TRACE_MAX + 1];
116*5113495bSYour Name #endif
117*5113495bSYour Name 
118*5113495bSYour Name #ifdef QCA_WIFI_MODULE_PARAMS_FROM_INI
119*5113495bSYour Name #define QDF_PARAM_STR_LENGTH 40
120*5113495bSYour Name 
121*5113495bSYour Name enum qdf_num_module_param {
122*5113495bSYour Name 	MEM_DEBUG_DISABLED,
123*5113495bSYour Name 	QDF_DBG_MASK,
124*5113495bSYour Name 	PREALLOC_DISABLED,
125*5113495bSYour Name 	QDF_LOG_DUMP_AT_KERNEL_ENABLE,
126*5113495bSYour Name 	QDF_DBG_ARR,
127*5113495bSYour Name 	QDF_LOG_FLUSH_TIMER_PERIOD,
128*5113495bSYour Name 	QDF_PARAM_MAX,
129*5113495bSYour Name };
130*5113495bSYour Name 
131*5113495bSYour Name static char qdf_module_param[QDF_PARAM_MAX][QDF_PARAM_STR_LENGTH] = {
132*5113495bSYour Name 	"mem_debug_disabled",
133*5113495bSYour Name 	"qdf_dbg_mask",
134*5113495bSYour Name 	"prealloc_disabled",
135*5113495bSYour Name 	"qdf_log_dump_at_kernel_enable",
136*5113495bSYour Name 	"qdf_dbg_arr",
137*5113495bSYour Name 	"qdf_log_flush_timer_period",
138*5113495bSYour Name };
139*5113495bSYour Name #endif
140*5113495bSYour Name 
qdf_snprintf(char * str_buffer,unsigned int size,char * str_format,...)141*5113495bSYour Name int qdf_snprintf(char *str_buffer, unsigned int size, char *str_format, ...)
142*5113495bSYour Name {
143*5113495bSYour Name 	va_list args;
144*5113495bSYour Name 	int i;
145*5113495bSYour Name 
146*5113495bSYour Name 	va_start(args, str_format);
147*5113495bSYour Name 	i = vsnprintf(str_buffer, size, str_format, args);
148*5113495bSYour Name 	va_end(args);
149*5113495bSYour Name 
150*5113495bSYour Name 	return i;
151*5113495bSYour Name }
152*5113495bSYour Name qdf_export_symbol(qdf_snprintf);
153*5113495bSYour Name 
154*5113495bSYour Name #ifdef QDF_ENABLE_TRACING
155*5113495bSYour Name 
qdf_trace_msg(QDF_MODULE_ID module,QDF_TRACE_LEVEL level,const char * str_format,...)156*5113495bSYour Name void qdf_trace_msg(QDF_MODULE_ID module, QDF_TRACE_LEVEL level,
157*5113495bSYour Name 		   const char *str_format, ...)
158*5113495bSYour Name {
159*5113495bSYour Name 	va_list val;
160*5113495bSYour Name 
161*5113495bSYour Name 	va_start(val, str_format);
162*5113495bSYour Name 	qdf_trace_msg_cmn(qdf_pidx, module, level, str_format, val);
163*5113495bSYour Name 	va_end(val);
164*5113495bSYour Name }
165*5113495bSYour Name qdf_export_symbol(qdf_trace_msg);
166*5113495bSYour Name 
qdf_vtrace_msg(QDF_MODULE_ID module,QDF_TRACE_LEVEL level,const char * str_format,va_list val)167*5113495bSYour Name void qdf_vtrace_msg(QDF_MODULE_ID module, QDF_TRACE_LEVEL level,
168*5113495bSYour Name 		    const char *str_format, va_list val)
169*5113495bSYour Name {
170*5113495bSYour Name 	qdf_trace_msg_cmn(qdf_pidx, module, level, str_format, val);
171*5113495bSYour Name }
172*5113495bSYour Name qdf_export_symbol(qdf_vtrace_msg);
173*5113495bSYour Name 
174*5113495bSYour Name #define ROW_SIZE 16
175*5113495bSYour Name /* Buffer size = data bytes(2 hex chars plus space) + NULL */
176*5113495bSYour Name #define BUFFER_SIZE ((QDF_DP_TRACE_RECORD_SIZE * 3) + 1)
177*5113495bSYour Name 
__qdf_trace_hex_dump(QDF_MODULE_ID module,QDF_TRACE_LEVEL level,void * data,int buf_len,bool print_ascii)178*5113495bSYour Name static void __qdf_trace_hex_dump(QDF_MODULE_ID module, QDF_TRACE_LEVEL level,
179*5113495bSYour Name 				 void *data, int buf_len, bool print_ascii)
180*5113495bSYour Name {
181*5113495bSYour Name 	const u8 *ptr = data;
182*5113495bSYour Name 	int i = 0;
183*5113495bSYour Name 
184*5113495bSYour Name 	if (!qdf_print_is_verbose_enabled(qdf_pidx, module, level))
185*5113495bSYour Name 		return;
186*5113495bSYour Name 
187*5113495bSYour Name 	while (buf_len > 0) {
188*5113495bSYour Name 		unsigned char linebuf[BUFFER_SIZE] = {0};
189*5113495bSYour Name 		int linelen = min(buf_len, ROW_SIZE);
190*5113495bSYour Name 
191*5113495bSYour Name 		buf_len -= ROW_SIZE;
192*5113495bSYour Name 
193*5113495bSYour Name 		hex_dump_to_buffer(ptr, linelen, ROW_SIZE, 1,
194*5113495bSYour Name 				   linebuf, sizeof(linebuf), print_ascii);
195*5113495bSYour Name 
196*5113495bSYour Name 		qdf_trace_msg(module, level, "%.8x: %s", i, linebuf);
197*5113495bSYour Name 		ptr += ROW_SIZE;
198*5113495bSYour Name 		i += ROW_SIZE;
199*5113495bSYour Name 	}
200*5113495bSYour Name }
201*5113495bSYour Name 
qdf_trace_hex_dump(QDF_MODULE_ID module,QDF_TRACE_LEVEL level,void * data,int buf_len)202*5113495bSYour Name void qdf_trace_hex_dump(QDF_MODULE_ID module, QDF_TRACE_LEVEL level,
203*5113495bSYour Name 			void *data, int buf_len)
204*5113495bSYour Name {
205*5113495bSYour Name 	__qdf_trace_hex_dump(module, level, data, buf_len, false);
206*5113495bSYour Name }
207*5113495bSYour Name 
208*5113495bSYour Name qdf_export_symbol(qdf_trace_hex_dump);
209*5113495bSYour Name 
qdf_trace_hex_ascii_dump(QDF_MODULE_ID module,QDF_TRACE_LEVEL level,void * data,int buf_len)210*5113495bSYour Name void qdf_trace_hex_ascii_dump(QDF_MODULE_ID module, QDF_TRACE_LEVEL level,
211*5113495bSYour Name 			      void *data, int buf_len)
212*5113495bSYour Name {
213*5113495bSYour Name 	__qdf_trace_hex_dump(module, level, data, buf_len, true);
214*5113495bSYour Name }
215*5113495bSYour Name 
216*5113495bSYour Name qdf_export_symbol(qdf_trace_hex_ascii_dump);
217*5113495bSYour Name 
218*5113495bSYour Name #endif
219*5113495bSYour Name 
220*5113495bSYour Name #ifdef TRACE_RECORD
221*5113495bSYour Name 
222*5113495bSYour Name #ifdef WLAN_LOGGING_BUFFERS_DYNAMICALLY
allocate_g_qdf_trace_tbl_buffer(void)223*5113495bSYour Name static inline QDF_STATUS allocate_g_qdf_trace_tbl_buffer(void)
224*5113495bSYour Name {
225*5113495bSYour Name 	g_qdf_trace_tbl = qdf_mem_valloc(MAX_QDF_TRACE_RECORDS *
226*5113495bSYour Name 					 sizeof(*g_qdf_trace_tbl));
227*5113495bSYour Name 	QDF_BUG(g_qdf_trace_tbl);
228*5113495bSYour Name 	return g_qdf_trace_tbl ? QDF_STATUS_SUCCESS : QDF_STATUS_E_NOMEM;
229*5113495bSYour Name }
230*5113495bSYour Name 
free_g_qdf_trace_tbl_buffer(void)231*5113495bSYour Name static inline void free_g_qdf_trace_tbl_buffer(void)
232*5113495bSYour Name {
233*5113495bSYour Name 	qdf_mem_vfree(g_qdf_trace_tbl);
234*5113495bSYour Name 	g_qdf_trace_tbl = NULL;
235*5113495bSYour Name }
236*5113495bSYour Name #else
allocate_g_qdf_trace_tbl_buffer(void)237*5113495bSYour Name static inline QDF_STATUS allocate_g_qdf_trace_tbl_buffer(void)
238*5113495bSYour Name {
239*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
240*5113495bSYour Name }
241*5113495bSYour Name 
free_g_qdf_trace_tbl_buffer(void)242*5113495bSYour Name static inline void free_g_qdf_trace_tbl_buffer(void)
243*5113495bSYour Name { }
244*5113495bSYour Name #endif
qdf_trace_enable(uint32_t bitmask_of_module_id,uint8_t enable)245*5113495bSYour Name void qdf_trace_enable(uint32_t bitmask_of_module_id, uint8_t enable)
246*5113495bSYour Name {
247*5113495bSYour Name 	int i;
248*5113495bSYour Name 
249*5113495bSYour Name 	if (bitmask_of_module_id) {
250*5113495bSYour Name 		for (i = 0; i < QDF_MODULE_ID_MAX; i++) {
251*5113495bSYour Name 			if (((bitmask_of_module_id >> i) & 1)) {
252*5113495bSYour Name 				if (enable) {
253*5113495bSYour Name 					if (NULL !=
254*5113495bSYour Name 					    qdf_trace_restore_cb_table[i]) {
255*5113495bSYour Name 						qdf_trace_cb_table[i] =
256*5113495bSYour Name 						qdf_trace_restore_cb_table[i];
257*5113495bSYour Name 					}
258*5113495bSYour Name 				} else {
259*5113495bSYour Name 					qdf_trace_restore_cb_table[i] =
260*5113495bSYour Name 						qdf_trace_cb_table[i];
261*5113495bSYour Name 					qdf_trace_cb_table[i] = NULL;
262*5113495bSYour Name 				}
263*5113495bSYour Name 			}
264*5113495bSYour Name 		}
265*5113495bSYour Name 	} else {
266*5113495bSYour Name 		if (enable) {
267*5113495bSYour Name 			for (i = 0; i < QDF_MODULE_ID_MAX; i++) {
268*5113495bSYour Name 				if (qdf_trace_restore_cb_table[i]) {
269*5113495bSYour Name 					qdf_trace_cb_table[i] =
270*5113495bSYour Name 						qdf_trace_restore_cb_table[i];
271*5113495bSYour Name 				}
272*5113495bSYour Name 			}
273*5113495bSYour Name 		} else {
274*5113495bSYour Name 			for (i = 0; i < QDF_MODULE_ID_MAX; i++) {
275*5113495bSYour Name 				qdf_trace_restore_cb_table[i] =
276*5113495bSYour Name 					qdf_trace_cb_table[i];
277*5113495bSYour Name 				qdf_trace_cb_table[i] = NULL;
278*5113495bSYour Name 			}
279*5113495bSYour Name 		}
280*5113495bSYour Name 	}
281*5113495bSYour Name }
282*5113495bSYour Name qdf_export_symbol(qdf_trace_enable);
283*5113495bSYour Name 
qdf_trace_init(void)284*5113495bSYour Name void qdf_trace_init(void)
285*5113495bSYour Name {
286*5113495bSYour Name 	uint8_t i;
287*5113495bSYour Name 
288*5113495bSYour Name 	if (allocate_g_qdf_trace_tbl_buffer() != QDF_STATUS_SUCCESS)
289*5113495bSYour Name 		return;
290*5113495bSYour Name 	g_qdf_trace_data.head = INVALID_QDF_TRACE_ADDR;
291*5113495bSYour Name 	g_qdf_trace_data.tail = INVALID_QDF_TRACE_ADDR;
292*5113495bSYour Name 	g_qdf_trace_data.num = 0;
293*5113495bSYour Name 	g_qdf_trace_data.enable = true;
294*5113495bSYour Name 	g_qdf_trace_data.dump_count = DEFAULT_QDF_TRACE_DUMP_COUNT;
295*5113495bSYour Name 	g_qdf_trace_data.num_since_last_dump = 0;
296*5113495bSYour Name 
297*5113495bSYour Name 	for (i = 0; i < QDF_MODULE_ID_MAX; i++) {
298*5113495bSYour Name 		qdf_trace_cb_table[i] = NULL;
299*5113495bSYour Name 		qdf_trace_restore_cb_table[i] = NULL;
300*5113495bSYour Name 	}
301*5113495bSYour Name }
302*5113495bSYour Name qdf_export_symbol(qdf_trace_init);
303*5113495bSYour Name 
qdf_trace_deinit(void)304*5113495bSYour Name void qdf_trace_deinit(void)
305*5113495bSYour Name {
306*5113495bSYour Name 	g_qdf_trace_data.enable = false;
307*5113495bSYour Name 	g_qdf_trace_data.num = 0;
308*5113495bSYour Name 	g_qdf_trace_data.head = INVALID_QDF_TRACE_ADDR;
309*5113495bSYour Name 	g_qdf_trace_data.tail = INVALID_QDF_TRACE_ADDR;
310*5113495bSYour Name 
311*5113495bSYour Name 	free_g_qdf_trace_tbl_buffer();
312*5113495bSYour Name }
313*5113495bSYour Name 
314*5113495bSYour Name qdf_export_symbol(qdf_trace_deinit);
315*5113495bSYour Name 
qdf_trace(uint8_t module,uint16_t code,uint16_t session,uint32_t data)316*5113495bSYour Name void qdf_trace(uint8_t module, uint16_t code, uint16_t session, uint32_t data)
317*5113495bSYour Name {
318*5113495bSYour Name 	tp_qdf_trace_record rec = NULL;
319*5113495bSYour Name 	unsigned long flags;
320*5113495bSYour Name 	char time[18];
321*5113495bSYour Name 
322*5113495bSYour Name 	if (!g_qdf_trace_data.enable)
323*5113495bSYour Name 		return;
324*5113495bSYour Name 
325*5113495bSYour Name 	/* if module is not registered, don't record for that module */
326*5113495bSYour Name 	if (!qdf_trace_cb_table[module])
327*5113495bSYour Name 		return;
328*5113495bSYour Name 
329*5113495bSYour Name 	qdf_get_time_of_the_day_in_hr_min_sec_usec(time, sizeof(time));
330*5113495bSYour Name 	/* Acquire the lock so that only one thread at a time can fill the ring
331*5113495bSYour Name 	 * buffer
332*5113495bSYour Name 	 */
333*5113495bSYour Name 	spin_lock_irqsave(&ltrace_lock, flags);
334*5113495bSYour Name 
335*5113495bSYour Name 	g_qdf_trace_data.num++;
336*5113495bSYour Name 
337*5113495bSYour Name 	if (g_qdf_trace_data.num > MAX_QDF_TRACE_RECORDS)
338*5113495bSYour Name 		g_qdf_trace_data.num = MAX_QDF_TRACE_RECORDS;
339*5113495bSYour Name 
340*5113495bSYour Name 	if (INVALID_QDF_TRACE_ADDR == g_qdf_trace_data.head) {
341*5113495bSYour Name 		/* first record */
342*5113495bSYour Name 		g_qdf_trace_data.head = 0;
343*5113495bSYour Name 		g_qdf_trace_data.tail = 0;
344*5113495bSYour Name 	} else {
345*5113495bSYour Name 		/* queue is not empty */
346*5113495bSYour Name 		uint32_t tail = g_qdf_trace_data.tail + 1;
347*5113495bSYour Name 
348*5113495bSYour Name 		if (MAX_QDF_TRACE_RECORDS == tail)
349*5113495bSYour Name 			tail = 0;
350*5113495bSYour Name 
351*5113495bSYour Name 		if (g_qdf_trace_data.head == tail) {
352*5113495bSYour Name 			/* full */
353*5113495bSYour Name 			if (MAX_QDF_TRACE_RECORDS == ++g_qdf_trace_data.head)
354*5113495bSYour Name 				g_qdf_trace_data.head = 0;
355*5113495bSYour Name 		}
356*5113495bSYour Name 		g_qdf_trace_data.tail = tail;
357*5113495bSYour Name 	}
358*5113495bSYour Name 
359*5113495bSYour Name 	rec = &g_qdf_trace_tbl[g_qdf_trace_data.tail];
360*5113495bSYour Name 	rec->code = code;
361*5113495bSYour Name 	rec->session = session;
362*5113495bSYour Name 	rec->data = data;
363*5113495bSYour Name 	rec->qtime = qdf_get_log_timestamp();
364*5113495bSYour Name 	scnprintf(rec->time, sizeof(rec->time), "%s", time);
365*5113495bSYour Name 	rec->module = module;
366*5113495bSYour Name 	rec->pid = (in_interrupt() ? 0 : current->pid);
367*5113495bSYour Name 	g_qdf_trace_data.num_since_last_dump++;
368*5113495bSYour Name 	spin_unlock_irqrestore(&ltrace_lock, flags);
369*5113495bSYour Name }
370*5113495bSYour Name qdf_export_symbol(qdf_trace);
371*5113495bSYour Name 
372*5113495bSYour Name #ifdef ENABLE_MTRACE_LOG
qdf_mtrace_log(QDF_MODULE_ID src_module,QDF_MODULE_ID dst_module,uint16_t message_id,uint8_t vdev_id)373*5113495bSYour Name void qdf_mtrace_log(QDF_MODULE_ID src_module, QDF_MODULE_ID dst_module,
374*5113495bSYour Name 		    uint16_t message_id, uint8_t vdev_id)
375*5113495bSYour Name {
376*5113495bSYour Name 	uint32_t trace_log, payload;
377*5113495bSYour Name 	static uint16_t counter;
378*5113495bSYour Name 
379*5113495bSYour Name 	trace_log = (src_module << 23) | (dst_module << 15) | message_id;
380*5113495bSYour Name 	payload = (vdev_id << 16) | counter++;
381*5113495bSYour Name 
382*5113495bSYour Name 	QDF_TRACE(src_module, QDF_TRACE_LEVEL_TRACE, "%x %x",
383*5113495bSYour Name 		  trace_log, payload);
384*5113495bSYour Name }
385*5113495bSYour Name 
386*5113495bSYour Name qdf_export_symbol(qdf_mtrace_log);
387*5113495bSYour Name #endif
388*5113495bSYour Name 
qdf_mtrace(QDF_MODULE_ID src_module,QDF_MODULE_ID dst_module,uint16_t message_id,uint8_t vdev_id,uint32_t data)389*5113495bSYour Name void qdf_mtrace(QDF_MODULE_ID src_module, QDF_MODULE_ID dst_module,
390*5113495bSYour Name 		uint16_t message_id, uint8_t vdev_id, uint32_t data)
391*5113495bSYour Name {
392*5113495bSYour Name 	qdf_trace(src_module, message_id, vdev_id, data);
393*5113495bSYour Name 	qdf_mtrace_log(src_module, dst_module, message_id, vdev_id);
394*5113495bSYour Name }
395*5113495bSYour Name 
396*5113495bSYour Name qdf_export_symbol(qdf_mtrace);
397*5113495bSYour Name 
qdf_trace_spin_lock_init(void)398*5113495bSYour Name QDF_STATUS qdf_trace_spin_lock_init(void)
399*5113495bSYour Name {
400*5113495bSYour Name 	spin_lock_init(&ltrace_lock);
401*5113495bSYour Name 
402*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
403*5113495bSYour Name }
404*5113495bSYour Name qdf_export_symbol(qdf_trace_spin_lock_init);
405*5113495bSYour Name 
qdf_trace_register(QDF_MODULE_ID module_id,tp_qdf_trace_cb qdf_trace_callback)406*5113495bSYour Name void qdf_trace_register(QDF_MODULE_ID module_id,
407*5113495bSYour Name 			tp_qdf_trace_cb qdf_trace_callback)
408*5113495bSYour Name {
409*5113495bSYour Name 	qdf_trace_cb_table[module_id] = qdf_trace_callback;
410*5113495bSYour Name }
411*5113495bSYour Name qdf_export_symbol(qdf_trace_register);
412*5113495bSYour Name 
qdf_trace_dump_all(void * p_mac,uint8_t code,uint8_t session,uint32_t count,uint32_t bitmask_of_module)413*5113495bSYour Name void qdf_trace_dump_all(void *p_mac, uint8_t code, uint8_t session,
414*5113495bSYour Name 	uint32_t count, uint32_t bitmask_of_module)
415*5113495bSYour Name {
416*5113495bSYour Name 	qdf_trace_record_t p_record;
417*5113495bSYour Name 	int32_t i, tail;
418*5113495bSYour Name 
419*5113495bSYour Name 	if (!g_qdf_trace_data.enable) {
420*5113495bSYour Name 		QDF_TRACE(QDF_MODULE_ID_SYS,
421*5113495bSYour Name 			  QDF_TRACE_LEVEL_ERROR, "Tracing Disabled");
422*5113495bSYour Name 		return;
423*5113495bSYour Name 	}
424*5113495bSYour Name 
425*5113495bSYour Name 	QDF_TRACE(QDF_MODULE_ID_SYS, QDF_TRACE_LEVEL_INFO,
426*5113495bSYour Name 		  "DPT: Total Records: %d, Head: %d, Tail: %d",
427*5113495bSYour Name 		  g_qdf_trace_data.num, g_qdf_trace_data.head,
428*5113495bSYour Name 		  g_qdf_trace_data.tail);
429*5113495bSYour Name 
430*5113495bSYour Name 	/* acquire the lock so that only one thread at a time can read
431*5113495bSYour Name 	 * the ring buffer
432*5113495bSYour Name 	 */
433*5113495bSYour Name 	spin_lock(&ltrace_lock);
434*5113495bSYour Name 
435*5113495bSYour Name 	if (g_qdf_trace_data.head != INVALID_QDF_TRACE_ADDR) {
436*5113495bSYour Name 		i = g_qdf_trace_data.head;
437*5113495bSYour Name 		tail = g_qdf_trace_data.tail;
438*5113495bSYour Name 
439*5113495bSYour Name 		if (count) {
440*5113495bSYour Name 			if (count > g_qdf_trace_data.num)
441*5113495bSYour Name 				count = g_qdf_trace_data.num;
442*5113495bSYour Name 			if (tail >= (count - 1))
443*5113495bSYour Name 				i = tail - count + 1;
444*5113495bSYour Name 			else if (count != MAX_QDF_TRACE_RECORDS)
445*5113495bSYour Name 				i = MAX_QDF_TRACE_RECORDS - ((count - 1) -
446*5113495bSYour Name 							     tail);
447*5113495bSYour Name 		}
448*5113495bSYour Name 
449*5113495bSYour Name 		p_record = g_qdf_trace_tbl[i];
450*5113495bSYour Name 		/* right now we are not using num_since_last_dump member but
451*5113495bSYour Name 		 * in future we might re-visit and use this member to track
452*5113495bSYour Name 		 * how many latest messages got added while we were dumping
453*5113495bSYour Name 		 * from ring buffer
454*5113495bSYour Name 		 */
455*5113495bSYour Name 		g_qdf_trace_data.num_since_last_dump = 0;
456*5113495bSYour Name 		spin_unlock(&ltrace_lock);
457*5113495bSYour Name 		for (;; ) {
458*5113495bSYour Name 			if ((code == 0 || (code == p_record.code)) &&
459*5113495bSYour Name 			    (qdf_trace_cb_table[p_record.module])) {
460*5113495bSYour Name 				if (0 == bitmask_of_module) {
461*5113495bSYour Name 					qdf_trace_cb_table[p_record.
462*5113495bSYour Name 							   module] (p_mac,
463*5113495bSYour Name 								    &p_record,
464*5113495bSYour Name 								    (uint16_t)
465*5113495bSYour Name 								    i);
466*5113495bSYour Name 				} else {
467*5113495bSYour Name 					if (bitmask_of_module &
468*5113495bSYour Name 					    (1 << p_record.module)) {
469*5113495bSYour Name 						qdf_trace_cb_table[p_record.
470*5113495bSYour Name 								   module]
471*5113495bSYour Name 							(p_mac, &p_record,
472*5113495bSYour Name 							(uint16_t) i);
473*5113495bSYour Name 					}
474*5113495bSYour Name 				}
475*5113495bSYour Name 			}
476*5113495bSYour Name 
477*5113495bSYour Name 			if (i == tail)
478*5113495bSYour Name 				break;
479*5113495bSYour Name 			i += 1;
480*5113495bSYour Name 
481*5113495bSYour Name 			spin_lock(&ltrace_lock);
482*5113495bSYour Name 			if (MAX_QDF_TRACE_RECORDS == i) {
483*5113495bSYour Name 				i = 0;
484*5113495bSYour Name 				p_record = g_qdf_trace_tbl[0];
485*5113495bSYour Name 			} else {
486*5113495bSYour Name 				p_record = g_qdf_trace_tbl[i];
487*5113495bSYour Name 			}
488*5113495bSYour Name 			spin_unlock(&ltrace_lock);
489*5113495bSYour Name 		}
490*5113495bSYour Name 	} else {
491*5113495bSYour Name 		spin_unlock(&ltrace_lock);
492*5113495bSYour Name 	}
493*5113495bSYour Name }
494*5113495bSYour Name qdf_export_symbol(qdf_trace_dump_all);
495*5113495bSYour Name #endif
496*5113495bSYour Name 
497*5113495bSYour Name #ifdef WLAN_FEATURE_MEMDUMP_ENABLE
qdf_register_debugcb_init(void)498*5113495bSYour Name void qdf_register_debugcb_init(void)
499*5113495bSYour Name {
500*5113495bSYour Name 	uint8_t i;
501*5113495bSYour Name 
502*5113495bSYour Name 	for (i = 0; i < QDF_MODULE_ID_MAX; i++)
503*5113495bSYour Name 		qdf_state_info_table[i] = NULL;
504*5113495bSYour Name }
505*5113495bSYour Name qdf_export_symbol(qdf_register_debugcb_init);
506*5113495bSYour Name 
qdf_register_debug_callback(QDF_MODULE_ID module_id,tp_qdf_state_info_cb qdf_state_infocb)507*5113495bSYour Name void qdf_register_debug_callback(QDF_MODULE_ID module_id,
508*5113495bSYour Name 					tp_qdf_state_info_cb qdf_state_infocb)
509*5113495bSYour Name {
510*5113495bSYour Name 	qdf_state_info_table[module_id] = qdf_state_infocb;
511*5113495bSYour Name }
512*5113495bSYour Name qdf_export_symbol(qdf_register_debug_callback);
513*5113495bSYour Name 
qdf_state_info_dump_all(char * buf,uint16_t size,uint16_t * driver_dump_size)514*5113495bSYour Name QDF_STATUS qdf_state_info_dump_all(char *buf, uint16_t size,
515*5113495bSYour Name 				   uint16_t *driver_dump_size)
516*5113495bSYour Name {
517*5113495bSYour Name 	uint8_t module, ret = QDF_STATUS_SUCCESS;
518*5113495bSYour Name 	uint16_t buf_len = size;
519*5113495bSYour Name 	char *buf_ptr = buf;
520*5113495bSYour Name 
521*5113495bSYour Name 	for (module = 0; module < QDF_MODULE_ID_MAX; module++) {
522*5113495bSYour Name 		if (qdf_state_info_table[module]) {
523*5113495bSYour Name 			qdf_state_info_table[module](&buf_ptr, &buf_len);
524*5113495bSYour Name 			if (!buf_len) {
525*5113495bSYour Name 				ret = QDF_STATUS_E_NOMEM;
526*5113495bSYour Name 				break;
527*5113495bSYour Name 			}
528*5113495bSYour Name 		}
529*5113495bSYour Name 	}
530*5113495bSYour Name 
531*5113495bSYour Name 	*driver_dump_size = size - buf_len;
532*5113495bSYour Name 	return ret;
533*5113495bSYour Name }
534*5113495bSYour Name qdf_export_symbol(qdf_state_info_dump_all);
535*5113495bSYour Name #endif
536*5113495bSYour Name 
537*5113495bSYour Name #ifdef CONFIG_DP_TRACE
538*5113495bSYour Name 
539*5113495bSYour Name #ifdef WLAN_LOGGING_BUFFERS_DYNAMICALLY
allocate_g_qdf_dp_trace_tbl_buffer(void)540*5113495bSYour Name static inline QDF_STATUS allocate_g_qdf_dp_trace_tbl_buffer(void)
541*5113495bSYour Name {
542*5113495bSYour Name 	g_qdf_dp_trace_tbl = qdf_mem_valloc(MAX_QDF_DP_TRACE_RECORDS *
543*5113495bSYour Name 					    sizeof(*g_qdf_dp_trace_tbl));
544*5113495bSYour Name 	QDF_BUG(g_qdf_dp_trace_tbl);
545*5113495bSYour Name 	return g_qdf_dp_trace_tbl ? QDF_STATUS_SUCCESS : QDF_STATUS_E_NOMEM;
546*5113495bSYour Name }
547*5113495bSYour Name 
free_g_qdf_dp_trace_tbl_buffer(void)548*5113495bSYour Name static inline void free_g_qdf_dp_trace_tbl_buffer(void)
549*5113495bSYour Name {
550*5113495bSYour Name 	qdf_mem_vfree(g_qdf_dp_trace_tbl);
551*5113495bSYour Name 	g_qdf_dp_trace_tbl = NULL;
552*5113495bSYour Name }
553*5113495bSYour Name #else
allocate_g_qdf_dp_trace_tbl_buffer(void)554*5113495bSYour Name static inline QDF_STATUS allocate_g_qdf_dp_trace_tbl_buffer(void)
555*5113495bSYour Name {
556*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
557*5113495bSYour Name }
558*5113495bSYour Name 
free_g_qdf_dp_trace_tbl_buffer(void)559*5113495bSYour Name static inline void free_g_qdf_dp_trace_tbl_buffer(void)
560*5113495bSYour Name { }
561*5113495bSYour Name #endif
562*5113495bSYour Name 
563*5113495bSYour Name #define QDF_DP_TRACE_PREPEND_STR_SIZE 100
564*5113495bSYour Name /*
565*5113495bSYour Name  * one dp trace record can't be greater than 300 bytes.
566*5113495bSYour Name  * Max Size will be QDF_DP_TRACE_PREPEND_STR_SIZE(100) + BUFFER_SIZE(121).
567*5113495bSYour Name  * Always make sure to change this QDF_DP_TRACE_MAX_RECORD_SIZE
568*5113495bSYour Name  * value accordingly whenever above two mentioned MACRO value changes.
569*5113495bSYour Name  */
570*5113495bSYour Name #define QDF_DP_TRACE_MAX_RECORD_SIZE 300
571*5113495bSYour Name 
qdf_dp_unused(struct qdf_dp_trace_record_s * record,uint16_t index,uint8_t pdev_id,uint8_t info)572*5113495bSYour Name static void qdf_dp_unused(struct qdf_dp_trace_record_s *record,
573*5113495bSYour Name 			  uint16_t index, uint8_t pdev_id, uint8_t info)
574*5113495bSYour Name {
575*5113495bSYour Name 	qdf_print("%s: QDF_DP_TRACE_MAX event should not be generated",
576*5113495bSYour Name 		  __func__);
577*5113495bSYour Name }
578*5113495bSYour Name 
qdf_dp_trace_init(bool live_mode_config,uint8_t thresh,uint16_t time_limit,uint8_t verbosity,uint32_t proto_bitmap)579*5113495bSYour Name void qdf_dp_trace_init(bool live_mode_config, uint8_t thresh,
580*5113495bSYour Name 				uint16_t time_limit, uint8_t verbosity,
581*5113495bSYour Name 				uint32_t proto_bitmap)
582*5113495bSYour Name {
583*5113495bSYour Name 	uint8_t i;
584*5113495bSYour Name 
585*5113495bSYour Name 	if (allocate_g_qdf_dp_trace_tbl_buffer() != QDF_STATUS_SUCCESS) {
586*5113495bSYour Name 		QDF_TRACE_ERROR(QDF_MODULE_ID_QDF,
587*5113495bSYour Name 				"Failed!!! DP Trace buffer allocation");
588*5113495bSYour Name 		return;
589*5113495bSYour Name 	}
590*5113495bSYour Name 	qdf_dp_trace_spin_lock_init();
591*5113495bSYour Name 	qdf_dp_trace_clear_buffer();
592*5113495bSYour Name 	g_qdf_dp_trace_data.enable = true;
593*5113495bSYour Name 	g_qdf_dp_trace_data.no_of_record = 1;
594*5113495bSYour Name 
595*5113495bSYour Name 	g_qdf_dp_trace_data.live_mode_config = live_mode_config;
596*5113495bSYour Name 	g_qdf_dp_trace_data.live_mode = live_mode_config;
597*5113495bSYour Name 	g_qdf_dp_trace_data.high_tput_thresh = thresh;
598*5113495bSYour Name 	g_qdf_dp_trace_data.thresh_time_limit = time_limit;
599*5113495bSYour Name 	g_qdf_dp_trace_data.proto_bitmap = proto_bitmap;
600*5113495bSYour Name 	g_qdf_dp_trace_data.verbosity = verbosity;
601*5113495bSYour Name 	g_qdf_dp_trace_data.ini_conf_verbosity = verbosity;
602*5113495bSYour Name 
603*5113495bSYour Name 	for (i = 0; i < ARRAY_SIZE(qdf_dp_trace_cb_table); i++)
604*5113495bSYour Name 		qdf_dp_trace_cb_table[i] = qdf_dp_display_record;
605*5113495bSYour Name 
606*5113495bSYour Name 	qdf_dp_trace_cb_table[QDF_DP_TRACE_HDD_TX_PACKET_RECORD] =
607*5113495bSYour Name 		qdf_dp_trace_cb_table[QDF_DP_TRACE_HDD_RX_PACKET_RECORD] =
608*5113495bSYour Name 		qdf_dp_trace_cb_table[QDF_DP_TRACE_TX_PACKET_RECORD] =
609*5113495bSYour Name 		qdf_dp_trace_cb_table[QDF_DP_TRACE_RX_PACKET_RECORD] =
610*5113495bSYour Name 		qdf_dp_trace_cb_table[QDF_DP_TRACE_DROP_PACKET_RECORD] =
611*5113495bSYour Name 		qdf_dp_trace_cb_table[QDF_DP_TRACE_LI_DP_TX_PACKET_RECORD] =
612*5113495bSYour Name 		qdf_dp_trace_cb_table[QDF_DP_TRACE_LI_DP_RX_PACKET_RECORD] =
613*5113495bSYour Name 		qdf_dp_display_data_pkt_record;
614*5113495bSYour Name 
615*5113495bSYour Name 	qdf_dp_trace_cb_table[QDF_DP_TRACE_TXRX_PACKET_PTR_RECORD] =
616*5113495bSYour Name 	qdf_dp_trace_cb_table[QDF_DP_TRACE_TXRX_FAST_PACKET_PTR_RECORD] =
617*5113495bSYour Name 	qdf_dp_trace_cb_table[QDF_DP_TRACE_FREE_PACKET_PTR_RECORD] =
618*5113495bSYour Name 	qdf_dp_trace_cb_table[QDF_DP_TRACE_LI_DP_FREE_PACKET_PTR_RECORD] =
619*5113495bSYour Name 						qdf_dp_display_ptr_record;
620*5113495bSYour Name 	qdf_dp_trace_cb_table[QDF_DP_TRACE_EAPOL_PACKET_RECORD] =
621*5113495bSYour Name 	qdf_dp_trace_cb_table[QDF_DP_TRACE_DHCP_PACKET_RECORD] =
622*5113495bSYour Name 	qdf_dp_trace_cb_table[QDF_DP_TRACE_ARP_PACKET_RECORD] =
623*5113495bSYour Name 	qdf_dp_trace_cb_table[QDF_DP_TRACE_ICMP_PACKET_RECORD] =
624*5113495bSYour Name 	qdf_dp_trace_cb_table[QDF_DP_TRACE_ICMPv6_PACKET_RECORD] =
625*5113495bSYour Name 						qdf_dp_display_proto_pkt;
626*5113495bSYour Name 	qdf_dp_trace_cb_table[QDF_DP_TRACE_MGMT_PACKET_RECORD] =
627*5113495bSYour Name 					qdf_dp_display_mgmt_pkt;
628*5113495bSYour Name 	qdf_dp_trace_cb_table[QDF_DP_TRACE_TX_CREDIT_RECORD] =
629*5113495bSYour Name 					qdf_dp_display_credit_record;
630*5113495bSYour Name 	qdf_dp_trace_cb_table[QDF_DP_TRACE_EVENT_RECORD] =
631*5113495bSYour Name 					qdf_dp_display_event_record;
632*5113495bSYour Name 
633*5113495bSYour Name 	qdf_dp_trace_cb_table[QDF_DP_TRACE_MAX] = qdf_dp_unused;
634*5113495bSYour Name }
635*5113495bSYour Name qdf_export_symbol(qdf_dp_trace_init);
636*5113495bSYour Name 
qdf_dp_trace_deinit(void)637*5113495bSYour Name void qdf_dp_trace_deinit(void)
638*5113495bSYour Name {
639*5113495bSYour Name 	if (!g_qdf_dp_trace_data.enable)
640*5113495bSYour Name 		return;
641*5113495bSYour Name 	spin_lock_bh(&l_dp_trace_lock);
642*5113495bSYour Name 	g_qdf_dp_trace_data.enable = false;
643*5113495bSYour Name 	g_qdf_dp_trace_data.no_of_record = 0;
644*5113495bSYour Name 	spin_unlock_bh(&l_dp_trace_lock);
645*5113495bSYour Name 
646*5113495bSYour Name 	free_g_qdf_dp_trace_tbl_buffer();
647*5113495bSYour Name }
648*5113495bSYour Name 
qdf_dp_trace_set_value(uint32_t proto_bitmap,uint8_t no_of_record,uint8_t verbosity)649*5113495bSYour Name void qdf_dp_trace_set_value(uint32_t proto_bitmap, uint8_t no_of_record,
650*5113495bSYour Name 			    uint8_t verbosity)
651*5113495bSYour Name {
652*5113495bSYour Name 	g_qdf_dp_trace_data.proto_bitmap = proto_bitmap;
653*5113495bSYour Name 	g_qdf_dp_trace_data.no_of_record = no_of_record;
654*5113495bSYour Name 	g_qdf_dp_trace_data.verbosity    = verbosity;
655*5113495bSYour Name 	g_qdf_dp_trace_data.dynamic_verbosity_modify = true;
656*5113495bSYour Name }
657*5113495bSYour Name qdf_export_symbol(qdf_dp_trace_set_value);
658*5113495bSYour Name 
qdf_dp_trace_set_verbosity(uint32_t val)659*5113495bSYour Name void qdf_dp_trace_set_verbosity(uint32_t val)
660*5113495bSYour Name {
661*5113495bSYour Name 	g_qdf_dp_trace_data.verbosity = val;
662*5113495bSYour Name }
663*5113495bSYour Name qdf_export_symbol(qdf_dp_trace_set_verbosity);
664*5113495bSYour Name 
665*5113495bSYour Name /**
666*5113495bSYour Name  * qdf_dp_get_verbosity() - get verbosity value
667*5113495bSYour Name  *
668*5113495bSYour Name  * Return: int
669*5113495bSYour Name  */
qdf_dp_get_verbosity(void)670*5113495bSYour Name uint8_t qdf_dp_get_verbosity(void)
671*5113495bSYour Name {
672*5113495bSYour Name 	return g_qdf_dp_trace_data.verbosity;
673*5113495bSYour Name }
674*5113495bSYour Name qdf_export_symbol(qdf_dp_get_verbosity);
675*5113495bSYour Name 
qdf_dp_set_proto_bitmap(uint32_t val)676*5113495bSYour Name void qdf_dp_set_proto_bitmap(uint32_t val)
677*5113495bSYour Name {
678*5113495bSYour Name 	g_qdf_dp_trace_data.proto_bitmap = val;
679*5113495bSYour Name }
680*5113495bSYour Name qdf_export_symbol(qdf_dp_set_proto_bitmap);
681*5113495bSYour Name 
qdf_dp_set_proto_event_bitmap(uint32_t value)682*5113495bSYour Name void qdf_dp_set_proto_event_bitmap(uint32_t value)
683*5113495bSYour Name {
684*5113495bSYour Name 	g_qdf_dp_trace_data.proto_event_bitmap = value;
685*5113495bSYour Name }
686*5113495bSYour Name 
687*5113495bSYour Name qdf_export_symbol(qdf_dp_set_proto_event_bitmap);
688*5113495bSYour Name 
qdf_dp_get_proto_event_bitmap(void)689*5113495bSYour Name static uint32_t qdf_dp_get_proto_event_bitmap(void)
690*5113495bSYour Name {
691*5113495bSYour Name 	return g_qdf_dp_trace_data.proto_event_bitmap;
692*5113495bSYour Name }
693*5113495bSYour Name 
qdf_dp_set_no_of_record(uint32_t val)694*5113495bSYour Name void qdf_dp_set_no_of_record(uint32_t val)
695*5113495bSYour Name {
696*5113495bSYour Name 	g_qdf_dp_trace_data.no_of_record = val;
697*5113495bSYour Name }
698*5113495bSYour Name qdf_export_symbol(qdf_dp_set_no_of_record);
699*5113495bSYour Name 
qdf_dp_get_no_of_record(void)700*5113495bSYour Name uint8_t qdf_dp_get_no_of_record(void)
701*5113495bSYour Name {
702*5113495bSYour Name 	return g_qdf_dp_trace_data.no_of_record;
703*5113495bSYour Name }
704*5113495bSYour Name qdf_export_symbol(qdf_dp_get_no_of_record);
705*5113495bSYour Name 
706*5113495bSYour Name 
707*5113495bSYour Name /**
708*5113495bSYour Name  * qdf_dp_trace_verbosity_check() - check whether verbosity level is enabled
709*5113495bSYour Name  * @code: defines the event
710*5113495bSYour Name  *
711*5113495bSYour Name  * In High verbosity all codes are logged.
712*5113495bSYour Name  * For Med/Low and Default case code which has
713*5113495bSYour Name  * less value than corresponding verbosity codes
714*5113495bSYour Name  * are logged.
715*5113495bSYour Name  *
716*5113495bSYour Name  * Return: true or false depends on whether tracing enabled
717*5113495bSYour Name  */
qdf_dp_trace_verbosity_check(enum QDF_DP_TRACE_ID code)718*5113495bSYour Name static bool qdf_dp_trace_verbosity_check(enum QDF_DP_TRACE_ID code)
719*5113495bSYour Name {
720*5113495bSYour Name 	switch (g_qdf_dp_trace_data.verbosity) {
721*5113495bSYour Name 	case QDF_DP_TRACE_VERBOSITY_HIGH:
722*5113495bSYour Name 		return true;
723*5113495bSYour Name 	case QDF_DP_TRACE_VERBOSITY_MEDIUM:
724*5113495bSYour Name 		if (code <= QDF_DP_TRACE_MED_VERBOSITY)
725*5113495bSYour Name 			return true;
726*5113495bSYour Name 		return false;
727*5113495bSYour Name 	case QDF_DP_TRACE_VERBOSITY_LOW:
728*5113495bSYour Name 		if (code <= QDF_DP_TRACE_LOW_VERBOSITY)
729*5113495bSYour Name 			return true;
730*5113495bSYour Name 		return false;
731*5113495bSYour Name 	case QDF_DP_TRACE_VERBOSITY_ULTRA_LOW:
732*5113495bSYour Name 		if (code <= QDF_DP_TRACE_ULTRA_LOW_VERBOSITY)
733*5113495bSYour Name 			return true;
734*5113495bSYour Name 		return false;
735*5113495bSYour Name 	case QDF_DP_TRACE_VERBOSITY_BASE:
736*5113495bSYour Name 		if (code <= QDF_DP_TRACE_BASE_VERBOSITY)
737*5113495bSYour Name 			return true;
738*5113495bSYour Name 		return false;
739*5113495bSYour Name 	default:
740*5113495bSYour Name 		return false;
741*5113495bSYour Name 	}
742*5113495bSYour Name }
743*5113495bSYour Name 
qdf_dp_get_proto_bitmap(void)744*5113495bSYour Name uint32_t qdf_dp_get_proto_bitmap(void)
745*5113495bSYour Name {
746*5113495bSYour Name 	if (g_qdf_dp_trace_data.enable)
747*5113495bSYour Name 		return g_qdf_dp_trace_data.proto_bitmap;
748*5113495bSYour Name 	else
749*5113495bSYour Name 		return 0;
750*5113495bSYour Name }
751*5113495bSYour Name 
qdf_dp_trace_set_track(qdf_nbuf_t nbuf,enum qdf_proto_dir dir)752*5113495bSYour Name void qdf_dp_trace_set_track(qdf_nbuf_t nbuf, enum qdf_proto_dir dir)
753*5113495bSYour Name {
754*5113495bSYour Name 	uint32_t count = 0;
755*5113495bSYour Name 
756*5113495bSYour Name 	if (!g_qdf_dp_trace_data.enable)
757*5113495bSYour Name 		return;
758*5113495bSYour Name 
759*5113495bSYour Name 	spin_lock_bh(&l_dp_trace_lock);
760*5113495bSYour Name 	if (QDF_TX == dir)
761*5113495bSYour Name 		count = ++g_qdf_dp_trace_data.tx_count;
762*5113495bSYour Name 	else if (QDF_RX == dir)
763*5113495bSYour Name 		count = ++g_qdf_dp_trace_data.rx_count;
764*5113495bSYour Name 
765*5113495bSYour Name 	if ((g_qdf_dp_trace_data.no_of_record != 0) &&
766*5113495bSYour Name 		(count % g_qdf_dp_trace_data.no_of_record == 0)) {
767*5113495bSYour Name 		if (QDF_TX == dir)
768*5113495bSYour Name 			QDF_NBUF_CB_TX_DP_TRACE(nbuf) = 1;
769*5113495bSYour Name 		else if (QDF_RX == dir)
770*5113495bSYour Name 			QDF_NBUF_CB_RX_DP_TRACE(nbuf) = 1;
771*5113495bSYour Name 	}
772*5113495bSYour Name 	spin_unlock_bh(&l_dp_trace_lock);
773*5113495bSYour Name }
774*5113495bSYour Name qdf_export_symbol(qdf_dp_trace_set_track);
775*5113495bSYour Name 
776*5113495bSYour Name /* Number of bytes to be grouped together while printing DP-Trace data */
777*5113495bSYour Name #define QDF_DUMP_DP_GROUP_SIZE 6
778*5113495bSYour Name 
779*5113495bSYour Name /**
780*5113495bSYour Name  * dump_dp_hex_trace() - Display the data in buffer
781*5113495bSYour Name  * @prepend_str:     string to prepend the hexdump with.
782*5113495bSYour Name  * @inbuf:     buffer which contains data to be displayed
783*5113495bSYour Name  * @inbuf_len: defines the size of the data to be displayed
784*5113495bSYour Name  *
785*5113495bSYour Name  * Return: None
786*5113495bSYour Name  */
787*5113495bSYour Name static void
dump_dp_hex_trace(char * prepend_str,uint8_t * inbuf,uint8_t inbuf_len)788*5113495bSYour Name dump_dp_hex_trace(char *prepend_str, uint8_t *inbuf, uint8_t inbuf_len)
789*5113495bSYour Name {
790*5113495bSYour Name 	unsigned char outbuf[BUFFER_SIZE];
791*5113495bSYour Name 	const uint8_t *inbuf_ptr = inbuf;
792*5113495bSYour Name 	char *outbuf_ptr = outbuf;
793*5113495bSYour Name 	int outbytes_written = 0;
794*5113495bSYour Name 
795*5113495bSYour Name 	qdf_mem_zero(outbuf, sizeof(outbuf));
796*5113495bSYour Name 	do {
797*5113495bSYour Name 		outbytes_written += scnprintf(outbuf_ptr,
798*5113495bSYour Name 					BUFFER_SIZE - outbytes_written,
799*5113495bSYour Name 					"%02x", *inbuf_ptr);
800*5113495bSYour Name 		outbuf_ptr = outbuf + outbytes_written;
801*5113495bSYour Name 
802*5113495bSYour Name 		if ((inbuf_ptr - inbuf) &&
803*5113495bSYour Name 		    (inbuf_ptr - inbuf + 1) % QDF_DUMP_DP_GROUP_SIZE == 0) {
804*5113495bSYour Name 			outbytes_written += scnprintf(outbuf_ptr,
805*5113495bSYour Name 						BUFFER_SIZE - outbytes_written,
806*5113495bSYour Name 						" ");
807*5113495bSYour Name 			outbuf_ptr = outbuf + outbytes_written;
808*5113495bSYour Name 		}
809*5113495bSYour Name 		inbuf_ptr++;
810*5113495bSYour Name 	} while (inbuf_ptr < (inbuf + inbuf_len));
811*5113495bSYour Name 	DPTRACE_PRINT("%s %s", prepend_str, outbuf);
812*5113495bSYour Name }
813*5113495bSYour Name 
814*5113495bSYour Name /**
815*5113495bSYour Name  * qdf_dp_code_to_string() - convert dptrace code to string
816*5113495bSYour Name  * @code: dptrace code
817*5113495bSYour Name  *
818*5113495bSYour Name  * Return: string version of code
819*5113495bSYour Name  */
820*5113495bSYour Name static
qdf_dp_code_to_string(enum QDF_DP_TRACE_ID code)821*5113495bSYour Name const char *qdf_dp_code_to_string(enum QDF_DP_TRACE_ID code)
822*5113495bSYour Name {
823*5113495bSYour Name 	switch (code) {
824*5113495bSYour Name 	case QDF_DP_TRACE_DROP_PACKET_RECORD:
825*5113495bSYour Name 		return "DROP:";
826*5113495bSYour Name 	case QDF_DP_TRACE_EAPOL_PACKET_RECORD:
827*5113495bSYour Name 		return "EAPOL:";
828*5113495bSYour Name 	case QDF_DP_TRACE_DHCP_PACKET_RECORD:
829*5113495bSYour Name 		return "DHCP:";
830*5113495bSYour Name 	case QDF_DP_TRACE_ARP_PACKET_RECORD:
831*5113495bSYour Name 		return "ARP:";
832*5113495bSYour Name 	case QDF_DP_TRACE_ICMP_PACKET_RECORD:
833*5113495bSYour Name 		return "ICMP:";
834*5113495bSYour Name 	case QDF_DP_TRACE_ICMPv6_PACKET_RECORD:
835*5113495bSYour Name 		return "ICMPv6:";
836*5113495bSYour Name 	case QDF_DP_TRACE_MGMT_PACKET_RECORD:
837*5113495bSYour Name 		return "MGMT:";
838*5113495bSYour Name 	case QDF_DP_TRACE_TX_CREDIT_RECORD:
839*5113495bSYour Name 		return "CREDIT:";
840*5113495bSYour Name 	case QDF_DP_TRACE_EVENT_RECORD:
841*5113495bSYour Name 		return "EVENT:";
842*5113495bSYour Name 	case QDF_DP_TRACE_HDD_TX_PACKET_PTR_RECORD:
843*5113495bSYour Name 		return "HDD: TX: PTR:";
844*5113495bSYour Name 	case QDF_DP_TRACE_LI_DP_TX_PACKET_PTR_RECORD:
845*5113495bSYour Name 		return "LI_DP: TX: PTR:";
846*5113495bSYour Name 	case QDF_DP_TRACE_HDD_TX_PACKET_RECORD:
847*5113495bSYour Name 		return "HDD: TX: DATA:";
848*5113495bSYour Name 	case QDF_DP_TRACE_LI_DP_TX_PACKET_RECORD:
849*5113495bSYour Name 	case QDF_DP_TRACE_TX_PACKET_RECORD:
850*5113495bSYour Name 		return "TX:";
851*5113495bSYour Name 	case QDF_DP_TRACE_CE_PACKET_PTR_RECORD:
852*5113495bSYour Name 		return "CE: TX: PTR:";
853*5113495bSYour Name 	case QDF_DP_TRACE_CE_FAST_PACKET_PTR_RECORD:
854*5113495bSYour Name 		return "CE: TX: FAST: PTR:";
855*5113495bSYour Name 	case QDF_DP_TRACE_CE_FAST_PACKET_ERR_RECORD:
856*5113495bSYour Name 		return "CE: TX: FAST: ERR:";
857*5113495bSYour Name 	case QDF_DP_TRACE_LI_DP_FREE_PACKET_PTR_RECORD:
858*5113495bSYour Name 	case QDF_DP_TRACE_FREE_PACKET_PTR_RECORD:
859*5113495bSYour Name 		return "FREE: TX: PTR:";
860*5113495bSYour Name 	case QDF_DP_TRACE_RX_HTT_PACKET_PTR_RECORD:
861*5113495bSYour Name 		return "HTT: RX: PTR:";
862*5113495bSYour Name 	case QDF_DP_TRACE_RX_OFFLOAD_HTT_PACKET_PTR_RECORD:
863*5113495bSYour Name 		return "HTT: RX: OF: PTR:";
864*5113495bSYour Name 	case QDF_DP_TRACE_RX_HDD_PACKET_PTR_RECORD:
865*5113495bSYour Name 		return "HDD: RX: PTR:";
866*5113495bSYour Name 	case QDF_DP_TRACE_RX_LI_DP_PACKET_PTR_RECORD:
867*5113495bSYour Name 		return "LI_DP: RX: PTR:";
868*5113495bSYour Name 	case QDF_DP_TRACE_HDD_RX_PACKET_RECORD:
869*5113495bSYour Name 		return "HDD: RX: DATA:";
870*5113495bSYour Name 	case QDF_DP_TRACE_LI_DP_NULL_RX_PACKET_RECORD:
871*5113495bSYour Name 		return "LI_DP_NULL: RX: DATA:";
872*5113495bSYour Name 	case QDF_DP_TRACE_LI_DP_RX_PACKET_RECORD:
873*5113495bSYour Name 	case QDF_DP_TRACE_RX_PACKET_RECORD:
874*5113495bSYour Name 		return "RX:";
875*5113495bSYour Name 	case QDF_DP_TRACE_TXRX_QUEUE_PACKET_PTR_RECORD:
876*5113495bSYour Name 		return "TXRX: TX: Q: PTR:";
877*5113495bSYour Name 	case QDF_DP_TRACE_TXRX_PACKET_PTR_RECORD:
878*5113495bSYour Name 		return "TXRX: TX: PTR:";
879*5113495bSYour Name 	case QDF_DP_TRACE_TXRX_FAST_PACKET_PTR_RECORD:
880*5113495bSYour Name 		return "TXRX: TX: FAST: PTR:";
881*5113495bSYour Name 	case QDF_DP_TRACE_HTT_PACKET_PTR_RECORD:
882*5113495bSYour Name 		return "HTT: TX: PTR:";
883*5113495bSYour Name 	case QDF_DP_TRACE_HTC_PACKET_PTR_RECORD:
884*5113495bSYour Name 		return "HTC: TX: PTR:";
885*5113495bSYour Name 	case QDF_DP_TRACE_HIF_PACKET_PTR_RECORD:
886*5113495bSYour Name 		return "HIF: TX: PTR:";
887*5113495bSYour Name 	case QDF_DP_TRACE_RX_TXRX_PACKET_PTR_RECORD:
888*5113495bSYour Name 		return "TXRX: RX: PTR:";
889*5113495bSYour Name 	case QDF_DP_TRACE_HDD_TX_TIMEOUT:
890*5113495bSYour Name 		return "HDD: STA: TO:";
891*5113495bSYour Name 	case QDF_DP_TRACE_HDD_SOFTAP_TX_TIMEOUT:
892*5113495bSYour Name 		return "HDD: SAP: TO:";
893*5113495bSYour Name 	default:
894*5113495bSYour Name 		return "Invalid";
895*5113495bSYour Name 	}
896*5113495bSYour Name }
897*5113495bSYour Name 
898*5113495bSYour Name /**
899*5113495bSYour Name  * qdf_dp_dir_to_str() - convert direction to string
900*5113495bSYour Name  * @dir: direction
901*5113495bSYour Name  *
902*5113495bSYour Name  * Return: string version of direction
903*5113495bSYour Name  */
qdf_dp_dir_to_str(enum qdf_proto_dir dir)904*5113495bSYour Name static const char *qdf_dp_dir_to_str(enum qdf_proto_dir dir)
905*5113495bSYour Name {
906*5113495bSYour Name 	switch (dir) {
907*5113495bSYour Name 	case QDF_TX:
908*5113495bSYour Name 		return " --> ";
909*5113495bSYour Name 	case QDF_RX:
910*5113495bSYour Name 		return " <-- ";
911*5113495bSYour Name 	default:
912*5113495bSYour Name 		return "invalid";
913*5113495bSYour Name 	}
914*5113495bSYour Name }
915*5113495bSYour Name 
qdf_dp_credit_source_to_str(enum QDF_CREDIT_UPDATE_SOURCE source)916*5113495bSYour Name static const char *qdf_dp_credit_source_to_str(
917*5113495bSYour Name 		enum QDF_CREDIT_UPDATE_SOURCE source)
918*5113495bSYour Name {
919*5113495bSYour Name 	switch (source) {
920*5113495bSYour Name 	case QDF_TX_SCHED:
921*5113495bSYour Name 		return "TX SCHED";
922*5113495bSYour Name 	case QDF_TX_COMP:
923*5113495bSYour Name 		return "TX COMP";
924*5113495bSYour Name 	case QDF_TX_CREDIT_UPDATE:
925*5113495bSYour Name 		return "CREDIT UP";
926*5113495bSYour Name 	case QDF_TX_HTT_MSG:
927*5113495bSYour Name 		return "HTT TX MSG";
928*5113495bSYour Name 	case QDF_HTT_ATTACH:
929*5113495bSYour Name 		return "HTT ATTACH";
930*5113495bSYour Name 	default:
931*5113495bSYour Name 		return "invalid";
932*5113495bSYour Name 	}
933*5113495bSYour Name }
934*5113495bSYour Name 
qdf_dp_operation_to_str(enum QDF_CREDIT_OPERATION op)935*5113495bSYour Name static const char *qdf_dp_operation_to_str(enum QDF_CREDIT_OPERATION op)
936*5113495bSYour Name {
937*5113495bSYour Name 	switch (op) {
938*5113495bSYour Name 	case QDF_CREDIT_INC:
939*5113495bSYour Name 		return "+";
940*5113495bSYour Name 	case QDF_CREDIT_DEC:
941*5113495bSYour Name 		return "-";
942*5113495bSYour Name 	case QDF_CREDIT_ABS:
943*5113495bSYour Name 		return "ABS";
944*5113495bSYour Name 	default:
945*5113495bSYour Name 		return "invalid";
946*5113495bSYour Name 	}
947*5113495bSYour Name }
948*5113495bSYour Name 
949*5113495bSYour Name /**
950*5113495bSYour Name  * qdf_dp_type_to_str() - convert packet type to string
951*5113495bSYour Name  * @type: type
952*5113495bSYour Name  *
953*5113495bSYour Name  * Return: string version of packet type
954*5113495bSYour Name  */
qdf_dp_type_to_str(enum qdf_proto_type type)955*5113495bSYour Name static const char *qdf_dp_type_to_str(enum qdf_proto_type type)
956*5113495bSYour Name {
957*5113495bSYour Name 	switch (type) {
958*5113495bSYour Name 	case QDF_PROTO_TYPE_DHCP:
959*5113495bSYour Name 		return "DHCP";
960*5113495bSYour Name 	case QDF_PROTO_TYPE_EAPOL:
961*5113495bSYour Name 		return "EAPOL";
962*5113495bSYour Name 	case QDF_PROTO_TYPE_ARP:
963*5113495bSYour Name 		return "ARP";
964*5113495bSYour Name 	case QDF_PROTO_TYPE_ICMP:
965*5113495bSYour Name 		return "ICMP";
966*5113495bSYour Name 	case QDF_PROTO_TYPE_ICMPv6:
967*5113495bSYour Name 		return "ICMPv6";
968*5113495bSYour Name 	case QDF_PROTO_TYPE_MGMT:
969*5113495bSYour Name 		return "MGMT";
970*5113495bSYour Name 	case QDF_PROTO_TYPE_EVENT:
971*5113495bSYour Name 		return "EVENT";
972*5113495bSYour Name 	default:
973*5113495bSYour Name 		return "invalid";
974*5113495bSYour Name 	}
975*5113495bSYour Name }
976*5113495bSYour Name 
977*5113495bSYour Name /**
978*5113495bSYour Name  * qdf_dp_subtype_to_str() - convert packet subtype to string
979*5113495bSYour Name  * @subtype: subtype
980*5113495bSYour Name  *
981*5113495bSYour Name  * Return: string version of packet subtype
982*5113495bSYour Name  */
qdf_dp_subtype_to_str(enum qdf_proto_subtype subtype)983*5113495bSYour Name static const char *qdf_dp_subtype_to_str(enum qdf_proto_subtype subtype)
984*5113495bSYour Name {
985*5113495bSYour Name 	switch (subtype) {
986*5113495bSYour Name 	case QDF_PROTO_EAPOL_M1:
987*5113495bSYour Name 		return "M1";
988*5113495bSYour Name 	case QDF_PROTO_EAPOL_M2:
989*5113495bSYour Name 		return "M2";
990*5113495bSYour Name 	case QDF_PROTO_EAPOL_M3:
991*5113495bSYour Name 		return "M3";
992*5113495bSYour Name 	case QDF_PROTO_EAPOL_M4:
993*5113495bSYour Name 		return "M4";
994*5113495bSYour Name 	case QDF_PROTO_DHCP_DISCOVER:
995*5113495bSYour Name 		return "DISC";
996*5113495bSYour Name 	case QDF_PROTO_DHCP_REQUEST:
997*5113495bSYour Name 		return "REQ";
998*5113495bSYour Name 	case QDF_PROTO_DHCP_OFFER:
999*5113495bSYour Name 		return "OFF";
1000*5113495bSYour Name 	case QDF_PROTO_DHCP_ACK:
1001*5113495bSYour Name 		return "ACK";
1002*5113495bSYour Name 	case QDF_PROTO_DHCP_NACK:
1003*5113495bSYour Name 		return "NACK";
1004*5113495bSYour Name 	case QDF_PROTO_DHCP_RELEASE:
1005*5113495bSYour Name 		return "REL";
1006*5113495bSYour Name 	case QDF_PROTO_DHCP_INFORM:
1007*5113495bSYour Name 		return "INFORM";
1008*5113495bSYour Name 	case QDF_PROTO_DHCP_DECLINE:
1009*5113495bSYour Name 		return "DECL";
1010*5113495bSYour Name 	case QDF_PROTO_ARP_REQ:
1011*5113495bSYour Name 	case QDF_PROTO_ICMP_REQ:
1012*5113495bSYour Name 	case QDF_PROTO_ICMPV6_REQ:
1013*5113495bSYour Name 		return "REQ";
1014*5113495bSYour Name 	case QDF_PROTO_ARP_RES:
1015*5113495bSYour Name 	case QDF_PROTO_ICMP_RES:
1016*5113495bSYour Name 	case QDF_PROTO_ICMPV6_RES:
1017*5113495bSYour Name 		return "RSP";
1018*5113495bSYour Name 	case QDF_PROTO_ICMPV6_RS:
1019*5113495bSYour Name 		return "RS";
1020*5113495bSYour Name 	case QDF_PROTO_ICMPV6_RA:
1021*5113495bSYour Name 		return "RA";
1022*5113495bSYour Name 	case QDF_PROTO_ICMPV6_NS:
1023*5113495bSYour Name 		return "NS";
1024*5113495bSYour Name 	case QDF_PROTO_ICMPV6_NA:
1025*5113495bSYour Name 		return "NA";
1026*5113495bSYour Name 	case QDF_PROTO_MGMT_ASSOC:
1027*5113495bSYour Name 		return "ASSOC";
1028*5113495bSYour Name 	case QDF_PROTO_MGMT_DISASSOC:
1029*5113495bSYour Name 		return "DISASSOC";
1030*5113495bSYour Name 	case QDF_PROTO_MGMT_AUTH:
1031*5113495bSYour Name 		return "AUTH";
1032*5113495bSYour Name 	case QDF_PROTO_MGMT_DEAUTH:
1033*5113495bSYour Name 		return "DEAUTH";
1034*5113495bSYour Name 	case QDF_ROAM_SYNCH:
1035*5113495bSYour Name 		return "ROAM SYNCH";
1036*5113495bSYour Name 	case QDF_ROAM_COMPLETE:
1037*5113495bSYour Name 		return "ROAM COMP";
1038*5113495bSYour Name 	case QDF_ROAM_EVENTID:
1039*5113495bSYour Name 		return "ROAM EVENTID";
1040*5113495bSYour Name 	case QDF_PROTO_EAP_REQUEST:
1041*5113495bSYour Name 		return "EAP REQ";
1042*5113495bSYour Name 	case QDF_PROTO_EAP_RESPONSE:
1043*5113495bSYour Name 		return "EAP RSP";
1044*5113495bSYour Name 	case QDF_PROTO_EAP_SUCCESS:
1045*5113495bSYour Name 		return "EAP SUC";
1046*5113495bSYour Name 	case QDF_PROTO_EAP_FAILURE:
1047*5113495bSYour Name 		return "EAP FAIL";
1048*5113495bSYour Name 	case QDF_PROTO_EAP_INITIATE:
1049*5113495bSYour Name 		return "EAP INIT";
1050*5113495bSYour Name 	case QDF_PROTO_EAP_FINISH:
1051*5113495bSYour Name 		return "EAP FINISH";
1052*5113495bSYour Name 	case QDF_PROTO_EAPOL_START:
1053*5113495bSYour Name 		return "START";
1054*5113495bSYour Name 	case QDF_PROTO_EAPOL_LOGOFF:
1055*5113495bSYour Name 		return "LOGOFF";
1056*5113495bSYour Name 	case QDF_PROTO_EAPOL_ASF:
1057*5113495bSYour Name 		return "ASF";
1058*5113495bSYour Name 	case QDF_PROTO_EAP_REQ_ID:
1059*5113495bSYour Name 		return "EAP REQ ID";
1060*5113495bSYour Name 	case QDF_PROTO_EAP_RSP_ID:
1061*5113495bSYour Name 		return "EAP RSP ID";
1062*5113495bSYour Name 	case QDF_PROTO_EAP_M1:
1063*5113495bSYour Name 		return "EAP M1";
1064*5113495bSYour Name 	case QDF_PROTO_EAP_M2:
1065*5113495bSYour Name 		return "EAP M2";
1066*5113495bSYour Name 	case QDF_PROTO_EAP_M3:
1067*5113495bSYour Name 		return "EAP M3";
1068*5113495bSYour Name 	case QDF_PROTO_EAP_M4:
1069*5113495bSYour Name 		return "EAP M4";
1070*5113495bSYour Name 	case QDF_PROTO_EAP_M5:
1071*5113495bSYour Name 		return "EAP M5";
1072*5113495bSYour Name 	case QDF_PROTO_EAP_M6:
1073*5113495bSYour Name 		return "EAP M6";
1074*5113495bSYour Name 	case QDF_PROTO_EAP_M7:
1075*5113495bSYour Name 		return "EAP M7";
1076*5113495bSYour Name 	case QDF_PROTO_EAP_M8:
1077*5113495bSYour Name 		return "EAP M8";
1078*5113495bSYour Name 	case QDF_PROTO_EAP_WSC_START:
1079*5113495bSYour Name 		return "EAP WSC START";
1080*5113495bSYour Name 	case QDF_PROTO_EAP_WSC_DONE:
1081*5113495bSYour Name 		return "EAP WSC DONE";
1082*5113495bSYour Name 	case QDF_PROTO_EAP_WSC_ACK:
1083*5113495bSYour Name 		return "EAP WSC ACK";
1084*5113495bSYour Name 	case QDF_PROTO_EAP_WSC_NACK:
1085*5113495bSYour Name 		return "EAP WSC NACK";
1086*5113495bSYour Name 	case QDF_PROTO_EAP_WSC_FRAG_ACK:
1087*5113495bSYour Name 		return "EAP WSC FRAG ACK";
1088*5113495bSYour Name 	default:
1089*5113495bSYour Name 		return "invalid";
1090*5113495bSYour Name 	}
1091*5113495bSYour Name }
1092*5113495bSYour Name 
1093*5113495bSYour Name /**
1094*5113495bSYour Name  * qdf_dp_enable_check() - check if dptrace, TX/RX tracing is enabled
1095*5113495bSYour Name  * @nbuf: nbuf
1096*5113495bSYour Name  * @code: dptrace code
1097*5113495bSYour Name  * @dir: TX or RX direction
1098*5113495bSYour Name  *
1099*5113495bSYour Name  * Return: true/false
1100*5113495bSYour Name  */
qdf_dp_enable_check(qdf_nbuf_t nbuf,enum QDF_DP_TRACE_ID code,enum qdf_proto_dir dir)1101*5113495bSYour Name static bool qdf_dp_enable_check(qdf_nbuf_t nbuf, enum QDF_DP_TRACE_ID code,
1102*5113495bSYour Name 				enum qdf_proto_dir dir)
1103*5113495bSYour Name {
1104*5113495bSYour Name 	/* Return when Dp trace is not enabled */
1105*5113495bSYour Name 	if (!g_qdf_dp_trace_data.enable)
1106*5113495bSYour Name 		return false;
1107*5113495bSYour Name 
1108*5113495bSYour Name 	if (qdf_dp_trace_verbosity_check(code) == false)
1109*5113495bSYour Name 		return false;
1110*5113495bSYour Name 
1111*5113495bSYour Name 	if (nbuf && (dir == QDF_TX && ((QDF_NBUF_CB_TX_DP_TRACE(nbuf) == 0) ||
1112*5113495bSYour Name 				       (QDF_NBUF_CB_TX_PACKET_TRACK(nbuf) !=
1113*5113495bSYour Name 					QDF_NBUF_TX_PKT_DATA_TRACK))))
1114*5113495bSYour Name 		return false;
1115*5113495bSYour Name 
1116*5113495bSYour Name 	if (nbuf && (dir == QDF_RX && (QDF_NBUF_CB_RX_DP_TRACE(nbuf) == 0)))
1117*5113495bSYour Name 		return false;
1118*5113495bSYour Name 
1119*5113495bSYour Name 	/*
1120*5113495bSYour Name 	 * Special packets called with NULL nbuf and this API is expected to
1121*5113495bSYour Name 	 * return true
1122*5113495bSYour Name 	 */
1123*5113495bSYour Name 	return true;
1124*5113495bSYour Name }
1125*5113495bSYour Name 
1126*5113495bSYour Name /**
1127*5113495bSYour Name  * qdf_dp_trace_fill_meta_str() - fill up a common meta string
1128*5113495bSYour Name  * @prepend_str: pointer to string
1129*5113495bSYour Name  * @size: size of prepend_str
1130*5113495bSYour Name  * @rec_index: index of record
1131*5113495bSYour Name  * @info: info related to the record
1132*5113495bSYour Name  * @record: pointer to the record
1133*5113495bSYour Name  *
1134*5113495bSYour Name  * Return: ret value from scnprintf
1135*5113495bSYour Name  */
1136*5113495bSYour Name static inline
qdf_dp_trace_fill_meta_str(char * prepend_str,int size,int rec_index,uint8_t info,struct qdf_dp_trace_record_s * record)1137*5113495bSYour Name int qdf_dp_trace_fill_meta_str(char *prepend_str, int size,
1138*5113495bSYour Name 			       int rec_index, uint8_t info,
1139*5113495bSYour Name 			       struct qdf_dp_trace_record_s *record)
1140*5113495bSYour Name {
1141*5113495bSYour Name 	char buffer[20];
1142*5113495bSYour Name 	int ret = 0;
1143*5113495bSYour Name 	bool live = info & QDF_DP_TRACE_RECORD_INFO_LIVE ? true : false;
1144*5113495bSYour Name 	bool throttled = info & QDF_DP_TRACE_RECORD_INFO_THROTTLED ?
1145*5113495bSYour Name 								true : false;
1146*5113495bSYour Name 
1147*5113495bSYour Name 	scnprintf(buffer, sizeof(buffer), "%llu", record->time);
1148*5113495bSYour Name 	ret = scnprintf(prepend_str, size,
1149*5113495bSYour Name 			"%s DPT: %04d:%02d%s %s",
1150*5113495bSYour Name 			throttled ? "*" : "",
1151*5113495bSYour Name 			rec_index,
1152*5113495bSYour Name 			record->pdev_id,
1153*5113495bSYour Name 			live ? "" : buffer,
1154*5113495bSYour Name 			qdf_dp_code_to_string(record->code));
1155*5113495bSYour Name 
1156*5113495bSYour Name 	return ret;
1157*5113495bSYour Name }
1158*5113495bSYour Name 
1159*5113495bSYour Name /**
1160*5113495bSYour Name  * qdf_dp_fill_record_data() - fill meta data and data into the record
1161*5113495bSYour Name  * @rec: pointer to record data
1162*5113495bSYour Name  * @data: pointer to data
1163*5113495bSYour Name  * @data_size: size of the data
1164*5113495bSYour Name  * @meta_data: pointer to metadata
1165*5113495bSYour Name  * @metadata_size: size of metadata
1166*5113495bSYour Name  *
1167*5113495bSYour Name  * Should be called from within a spin_lock for the qdf record.
1168*5113495bSYour Name  * Fills up rec->data with |metadata|data|
1169*5113495bSYour Name  *
1170*5113495bSYour Name  * Return: none
1171*5113495bSYour Name  */
qdf_dp_fill_record_data(struct qdf_dp_trace_record_s * rec,uint8_t * data,uint8_t data_size,uint8_t * meta_data,uint8_t metadata_size)1172*5113495bSYour Name static void qdf_dp_fill_record_data
1173*5113495bSYour Name 	(struct qdf_dp_trace_record_s *rec,
1174*5113495bSYour Name 	uint8_t *data, uint8_t data_size,
1175*5113495bSYour Name 	uint8_t *meta_data, uint8_t metadata_size)
1176*5113495bSYour Name {
1177*5113495bSYour Name 	int32_t available = QDF_DP_TRACE_RECORD_SIZE;
1178*5113495bSYour Name 	uint8_t *rec_data = rec->data;
1179*5113495bSYour Name 	uint8_t data_to_copy = 0;
1180*5113495bSYour Name 
1181*5113495bSYour Name 	qdf_mem_zero(rec_data, QDF_DP_TRACE_RECORD_SIZE);
1182*5113495bSYour Name 
1183*5113495bSYour Name 	/* copy meta data */
1184*5113495bSYour Name 	if (meta_data) {
1185*5113495bSYour Name 		if (metadata_size > available) {
1186*5113495bSYour Name 			QDF_TRACE_WARN(QDF_MODULE_ID_QDF,
1187*5113495bSYour Name 				       "%s: meta data does not fit into the record",
1188*5113495bSYour Name 				       __func__);
1189*5113495bSYour Name 			goto end;
1190*5113495bSYour Name 		}
1191*5113495bSYour Name 		qdf_mem_copy(rec_data, meta_data, metadata_size);
1192*5113495bSYour Name 		available = available - metadata_size;
1193*5113495bSYour Name 	} else {
1194*5113495bSYour Name 		metadata_size = 0;
1195*5113495bSYour Name 	}
1196*5113495bSYour Name 
1197*5113495bSYour Name 	/* copy data */
1198*5113495bSYour Name 	if (data && (data_size > 0) && (available > 0)) {
1199*5113495bSYour Name 		data_to_copy = data_size;
1200*5113495bSYour Name 		if (data_size > available)
1201*5113495bSYour Name 			data_to_copy = available;
1202*5113495bSYour Name 		qdf_mem_copy(&rec_data[metadata_size], data, data_to_copy);
1203*5113495bSYour Name 	}
1204*5113495bSYour Name end:
1205*5113495bSYour Name 	rec->size = data_to_copy;
1206*5113495bSYour Name }
1207*5113495bSYour Name 
1208*5113495bSYour Name /**
1209*5113495bSYour Name  * qdf_dp_add_record() - add dp trace record
1210*5113495bSYour Name  * @code: dptrace code
1211*5113495bSYour Name  * @pdev_id: pdev_id
1212*5113495bSYour Name  * @print: true to print it in kmsg
1213*5113495bSYour Name  * @data: data pointer
1214*5113495bSYour Name  * @data_size: size of data to be copied
1215*5113495bSYour Name  * @meta_data: meta data to be prepended to data
1216*5113495bSYour Name  * @metadata_size: sizeof meta data
1217*5113495bSYour Name  * @print: whether to print record
1218*5113495bSYour Name  *
1219*5113495bSYour Name  * Return: none
1220*5113495bSYour Name  */
qdf_dp_add_record(enum QDF_DP_TRACE_ID code,uint8_t pdev_id,uint8_t * data,uint8_t data_size,uint8_t * meta_data,uint8_t metadata_size,bool print)1221*5113495bSYour Name static void qdf_dp_add_record(enum QDF_DP_TRACE_ID code, uint8_t pdev_id,
1222*5113495bSYour Name 			      uint8_t *data, uint8_t data_size,
1223*5113495bSYour Name 			      uint8_t *meta_data, uint8_t metadata_size,
1224*5113495bSYour Name 			      bool print)
1225*5113495bSYour Name 
1226*5113495bSYour Name {
1227*5113495bSYour Name 	struct qdf_dp_trace_record_s *rec = NULL;
1228*5113495bSYour Name 	int index;
1229*5113495bSYour Name 	bool print_this_record = false;
1230*5113495bSYour Name 	u8 info = 0;
1231*5113495bSYour Name 
1232*5113495bSYour Name 	if (code >= QDF_DP_TRACE_MAX) {
1233*5113495bSYour Name 		QDF_TRACE_ERROR(QDF_MODULE_ID_QDF,
1234*5113495bSYour Name 				"invalid record code %u, max code %u",
1235*5113495bSYour Name 				code, QDF_DP_TRACE_MAX);
1236*5113495bSYour Name 		return;
1237*5113495bSYour Name 	}
1238*5113495bSYour Name 
1239*5113495bSYour Name 	spin_lock_bh(&l_dp_trace_lock);
1240*5113495bSYour Name 
1241*5113495bSYour Name 	if (print || g_qdf_dp_trace_data.force_live_mode) {
1242*5113495bSYour Name 		print_this_record = true;
1243*5113495bSYour Name 	} else if (g_qdf_dp_trace_data.live_mode == 1) {
1244*5113495bSYour Name 		print_this_record = true;
1245*5113495bSYour Name 		g_qdf_dp_trace_data.print_pkt_cnt++;
1246*5113495bSYour Name 		if (g_qdf_dp_trace_data.print_pkt_cnt >
1247*5113495bSYour Name 				g_qdf_dp_trace_data.high_tput_thresh) {
1248*5113495bSYour Name 			g_qdf_dp_trace_data.live_mode = 0;
1249*5113495bSYour Name 			g_qdf_dp_trace_data.verbosity =
1250*5113495bSYour Name 					QDF_DP_TRACE_VERBOSITY_ULTRA_LOW;
1251*5113495bSYour Name 			info |= QDF_DP_TRACE_RECORD_INFO_THROTTLED;
1252*5113495bSYour Name 		}
1253*5113495bSYour Name 	}
1254*5113495bSYour Name 
1255*5113495bSYour Name 	g_qdf_dp_trace_data.num++;
1256*5113495bSYour Name 
1257*5113495bSYour Name 	if (g_qdf_dp_trace_data.num > MAX_QDF_DP_TRACE_RECORDS)
1258*5113495bSYour Name 		g_qdf_dp_trace_data.num = MAX_QDF_DP_TRACE_RECORDS;
1259*5113495bSYour Name 
1260*5113495bSYour Name 	if (INVALID_QDF_DP_TRACE_ADDR == g_qdf_dp_trace_data.head) {
1261*5113495bSYour Name 		/* first record */
1262*5113495bSYour Name 		g_qdf_dp_trace_data.head = 0;
1263*5113495bSYour Name 		g_qdf_dp_trace_data.tail = 0;
1264*5113495bSYour Name 	} else {
1265*5113495bSYour Name 		/* queue is not empty */
1266*5113495bSYour Name 		g_qdf_dp_trace_data.tail++;
1267*5113495bSYour Name 
1268*5113495bSYour Name 		if (MAX_QDF_DP_TRACE_RECORDS == g_qdf_dp_trace_data.tail)
1269*5113495bSYour Name 			g_qdf_dp_trace_data.tail = 0;
1270*5113495bSYour Name 
1271*5113495bSYour Name 		if (g_qdf_dp_trace_data.head == g_qdf_dp_trace_data.tail) {
1272*5113495bSYour Name 			/* full */
1273*5113495bSYour Name 			if (MAX_QDF_DP_TRACE_RECORDS ==
1274*5113495bSYour Name 				++g_qdf_dp_trace_data.head)
1275*5113495bSYour Name 				g_qdf_dp_trace_data.head = 0;
1276*5113495bSYour Name 		}
1277*5113495bSYour Name 	}
1278*5113495bSYour Name 
1279*5113495bSYour Name 	rec = &g_qdf_dp_trace_tbl[g_qdf_dp_trace_data.tail];
1280*5113495bSYour Name 	index = g_qdf_dp_trace_data.tail;
1281*5113495bSYour Name 	rec->code = code;
1282*5113495bSYour Name 	rec->pdev_id = pdev_id;
1283*5113495bSYour Name 	rec->size = 0;
1284*5113495bSYour Name 	qdf_dp_fill_record_data(rec, data, data_size,
1285*5113495bSYour Name 				meta_data, metadata_size);
1286*5113495bSYour Name 	rec->time = qdf_get_log_timestamp();
1287*5113495bSYour Name 	rec->pid = (in_interrupt() ? 0 : current->pid);
1288*5113495bSYour Name 
1289*5113495bSYour Name 	if (rec->code >= QDF_DP_TRACE_MAX) {
1290*5113495bSYour Name 		QDF_TRACE_ERROR(QDF_MODULE_ID_QDF,
1291*5113495bSYour Name 				"invalid record code %u, max code %u",
1292*5113495bSYour Name 				rec->code, QDF_DP_TRACE_MAX);
1293*5113495bSYour Name 		return;
1294*5113495bSYour Name 	}
1295*5113495bSYour Name 
1296*5113495bSYour Name 	spin_unlock_bh(&l_dp_trace_lock);
1297*5113495bSYour Name 
1298*5113495bSYour Name 	info |= QDF_DP_TRACE_RECORD_INFO_LIVE;
1299*5113495bSYour Name 	if (print_this_record)
1300*5113495bSYour Name 		qdf_dp_trace_cb_table[rec->code] (rec, index,
1301*5113495bSYour Name 					QDF_TRACE_DEFAULT_PDEV_ID, info);
1302*5113495bSYour Name }
1303*5113495bSYour Name 
1304*5113495bSYour Name /**
1305*5113495bSYour Name  * qdf_get_rate_limit_by_type() - Get the rate limit by pkt type
1306*5113495bSYour Name  * @type: packet type
1307*5113495bSYour Name  *
1308*5113495bSYour Name  * Return: Rate limit value for a particular packet type
1309*5113495bSYour Name  */
1310*5113495bSYour Name static inline
qdf_get_rate_limit_by_type(uint8_t type)1311*5113495bSYour Name uint8_t qdf_get_rate_limit_by_type(uint8_t type)
1312*5113495bSYour Name {
1313*5113495bSYour Name 	switch (type) {
1314*5113495bSYour Name 	case QDF_PROTO_TYPE_DHCP:
1315*5113495bSYour Name 		return QDF_MAX_DHCP_PKTS_PER_SEC;
1316*5113495bSYour Name 	case QDF_PROTO_TYPE_EAPOL:
1317*5113495bSYour Name 		return QDF_MAX_EAPOL_PKTS_PER_SEC;
1318*5113495bSYour Name 	case QDF_PROTO_TYPE_ARP:
1319*5113495bSYour Name 		return QDF_MAX_ARP_PKTS_PER_SEC;
1320*5113495bSYour Name 	case QDF_PROTO_TYPE_DNS:
1321*5113495bSYour Name 		return QDF_MAX_DNS_PKTS_PER_SEC;
1322*5113495bSYour Name 	default:
1323*5113495bSYour Name 		return QDF_MAX_OTHER_PKTS_PER_SEC;
1324*5113495bSYour Name 	}
1325*5113495bSYour Name }
1326*5113495bSYour Name 
1327*5113495bSYour Name /**
1328*5113495bSYour Name  * qdf_get_pkt_type_string() - Get the string based on pkt type
1329*5113495bSYour Name  * @type: packet type
1330*5113495bSYour Name  * @subtype: packet subtype
1331*5113495bSYour Name  *
1332*5113495bSYour Name  * Return: String based on pkt type
1333*5113495bSYour Name  */
1334*5113495bSYour Name static
qdf_get_pkt_type_string(uint8_t type,uint8_t subtype)1335*5113495bSYour Name uint8_t *qdf_get_pkt_type_string(uint8_t type, uint8_t subtype)
1336*5113495bSYour Name {
1337*5113495bSYour Name 	switch (subtype) {
1338*5113495bSYour Name 	case QDF_PROTO_EAPOL_M1:
1339*5113495bSYour Name 		return "EAPOL-1";
1340*5113495bSYour Name 	case QDF_PROTO_EAPOL_M2:
1341*5113495bSYour Name 		return "EAPOL-2";
1342*5113495bSYour Name 	case QDF_PROTO_EAPOL_M3:
1343*5113495bSYour Name 		return "EAPOL-3";
1344*5113495bSYour Name 	case QDF_PROTO_EAPOL_M4:
1345*5113495bSYour Name 		return "EAPOL-4";
1346*5113495bSYour Name 	case QDF_PROTO_DHCP_DISCOVER:
1347*5113495bSYour Name 		return "DHCP-D";
1348*5113495bSYour Name 	case QDF_PROTO_DHCP_REQUEST:
1349*5113495bSYour Name 		return "DHCP-R";
1350*5113495bSYour Name 	case QDF_PROTO_DHCP_OFFER:
1351*5113495bSYour Name 		return "DHCP-O";
1352*5113495bSYour Name 	case QDF_PROTO_DHCP_ACK:
1353*5113495bSYour Name 		return "DHCP-A";
1354*5113495bSYour Name 	case QDF_PROTO_DHCP_NACK:
1355*5113495bSYour Name 		return "DHCP-NA";
1356*5113495bSYour Name 	case QDF_PROTO_DHCP_RELEASE:
1357*5113495bSYour Name 		return "DHCP-REL";
1358*5113495bSYour Name 	case QDF_PROTO_DHCP_INFORM:
1359*5113495bSYour Name 		return "DHCP-IN";
1360*5113495bSYour Name 	case QDF_PROTO_DHCP_DECLINE:
1361*5113495bSYour Name 		return "DHCP-DEC";
1362*5113495bSYour Name 	case QDF_PROTO_ARP_REQ:
1363*5113495bSYour Name 		return "ARP-RQ";
1364*5113495bSYour Name 	case QDF_PROTO_ARP_RES:
1365*5113495bSYour Name 		return "ARP-RS";
1366*5113495bSYour Name 	case QDF_PROTO_DNS_QUERY:
1367*5113495bSYour Name 		return "DNS_Q";
1368*5113495bSYour Name 	case QDF_PROTO_DNS_RES:
1369*5113495bSYour Name 		return "DNS_RS";
1370*5113495bSYour Name 	case QDF_PROTO_EAP_REQUEST:
1371*5113495bSYour Name 		return "EAP_REQ";
1372*5113495bSYour Name 	case QDF_PROTO_EAP_RESPONSE:
1373*5113495bSYour Name 		return "EAP-RSP";
1374*5113495bSYour Name 	case QDF_PROTO_EAP_SUCCESS:
1375*5113495bSYour Name 		return "EAP-SUCCESS";
1376*5113495bSYour Name 	case QDF_PROTO_EAP_FAILURE:
1377*5113495bSYour Name 		return "EAP-FAIL";
1378*5113495bSYour Name 	case QDF_PROTO_EAP_INITIATE:
1379*5113495bSYour Name 		return "EAP-INIT";
1380*5113495bSYour Name 	case QDF_PROTO_EAP_FINISH:
1381*5113495bSYour Name 		return "EAP-FINISH";
1382*5113495bSYour Name 	case QDF_PROTO_EAPOL_START:
1383*5113495bSYour Name 		return "EAPOL-START";
1384*5113495bSYour Name 	case QDF_PROTO_EAPOL_LOGOFF:
1385*5113495bSYour Name 		return "EAPOL-LOGOFF";
1386*5113495bSYour Name 	case QDF_PROTO_EAPOL_ASF:
1387*5113495bSYour Name 		return "EAPOL-ASF";
1388*5113495bSYour Name 	case QDF_PROTO_EAP_REQ_ID:
1389*5113495bSYour Name 		return "EAP-REQ-ID";
1390*5113495bSYour Name 	case QDF_PROTO_EAP_RSP_ID:
1391*5113495bSYour Name 		return "EAP-RSP-ID";
1392*5113495bSYour Name 	case QDF_PROTO_EAP_M1:
1393*5113495bSYour Name 		return "EAP-M1";
1394*5113495bSYour Name 	case QDF_PROTO_EAP_M2:
1395*5113495bSYour Name 		return "EAP-M2";
1396*5113495bSYour Name 	case QDF_PROTO_EAP_M3:
1397*5113495bSYour Name 		return "EAP-M3";
1398*5113495bSYour Name 	case QDF_PROTO_EAP_M4:
1399*5113495bSYour Name 		return "EAP-M4";
1400*5113495bSYour Name 	case QDF_PROTO_EAP_M5:
1401*5113495bSYour Name 		return "EAP-M5";
1402*5113495bSYour Name 	case QDF_PROTO_EAP_M6:
1403*5113495bSYour Name 		return "EAP-M6";
1404*5113495bSYour Name 	case QDF_PROTO_EAP_M7:
1405*5113495bSYour Name 		return "EAP-M7";
1406*5113495bSYour Name 	case QDF_PROTO_EAP_M8:
1407*5113495bSYour Name 		return "EAP-M8";
1408*5113495bSYour Name 	case QDF_PROTO_EAP_WSC_START:
1409*5113495bSYour Name 		return "EAP-WSC-START";
1410*5113495bSYour Name 	case QDF_PROTO_EAP_WSC_DONE:
1411*5113495bSYour Name 		return "EAP-WSC-DONE";
1412*5113495bSYour Name 	case QDF_PROTO_EAP_WSC_ACK:
1413*5113495bSYour Name 		return "EAP-WSC-ACK";
1414*5113495bSYour Name 	case QDF_PROTO_EAP_WSC_NACK:
1415*5113495bSYour Name 		return "EAP-WSC-NACK";
1416*5113495bSYour Name 	case QDF_PROTO_EAP_WSC_FRAG_ACK:
1417*5113495bSYour Name 		return "EAP-WSC-FRAG-ACK";
1418*5113495bSYour Name 	default:
1419*5113495bSYour Name 		switch (type) {
1420*5113495bSYour Name 		case QDF_PROTO_TYPE_EAPOL:
1421*5113495bSYour Name 			return "EAP";
1422*5113495bSYour Name 		case QDF_PROTO_TYPE_DHCP:
1423*5113495bSYour Name 			return "DHCP";
1424*5113495bSYour Name 		case QDF_PROTO_TYPE_ARP:
1425*5113495bSYour Name 			return "ARP";
1426*5113495bSYour Name 		case QDF_PROTO_TYPE_DNS:
1427*5113495bSYour Name 			return "DNS";
1428*5113495bSYour Name 		default:
1429*5113495bSYour Name 			return "UNKNOWN";
1430*5113495bSYour Name 		}
1431*5113495bSYour Name 	}
1432*5113495bSYour Name }
1433*5113495bSYour Name 
1434*5113495bSYour Name /**
1435*5113495bSYour Name  * qdf_get_pkt_status_string() - Get the string based on pkt status
1436*5113495bSYour Name  * @status: packet status
1437*5113495bSYour Name  *
1438*5113495bSYour Name  * Return: String based on pkt status
1439*5113495bSYour Name  */
1440*5113495bSYour Name static
qdf_get_pkt_status_string(uint8_t status)1441*5113495bSYour Name uint8_t *qdf_get_pkt_status_string(uint8_t status)
1442*5113495bSYour Name {
1443*5113495bSYour Name 	switch (status) {
1444*5113495bSYour Name 	case QDF_TX_RX_STATUS_INVALID:
1445*5113495bSYour Name 		return "inv";
1446*5113495bSYour Name 	case QDF_TX_RX_STATUS_OK:
1447*5113495bSYour Name 		return "succ";
1448*5113495bSYour Name 	case QDF_TX_RX_STATUS_FW_DISCARD:
1449*5113495bSYour Name 		return "disc";
1450*5113495bSYour Name 	case QDF_TX_RX_STATUS_NO_ACK:
1451*5113495bSYour Name 		return "nack";
1452*5113495bSYour Name 	case QDF_TX_RX_STATUS_DROP:
1453*5113495bSYour Name 		return "drop";
1454*5113495bSYour Name 	default:
1455*5113495bSYour Name 		return "unknown";
1456*5113495bSYour Name 	}
1457*5113495bSYour Name }
1458*5113495bSYour Name 
qdf_dp_log_proto_pkt_info(uint8_t * sa,uint8_t * da,uint8_t type,uint8_t subtype,uint8_t dir,uint16_t msdu_id,uint8_t status)1459*5113495bSYour Name void qdf_dp_log_proto_pkt_info(uint8_t *sa, uint8_t *da, uint8_t type,
1460*5113495bSYour Name 			       uint8_t subtype, uint8_t dir, uint16_t msdu_id,
1461*5113495bSYour Name 			       uint8_t status)
1462*5113495bSYour Name {
1463*5113495bSYour Name 	uint8_t pkt_rate_limit;
1464*5113495bSYour Name 	static ulong last_ticks_tx[QDF_PROTO_SUBTYPE_MAX] = {0};
1465*5113495bSYour Name 	static ulong last_ticks_rx[QDF_PROTO_SUBTYPE_MAX] = {0};
1466*5113495bSYour Name 	ulong curr_ticks = jiffies;
1467*5113495bSYour Name 
1468*5113495bSYour Name 	pkt_rate_limit = qdf_get_rate_limit_by_type(type);
1469*5113495bSYour Name 
1470*5113495bSYour Name 	if ((dir == QDF_TX &&
1471*5113495bSYour Name 	     !time_after(curr_ticks,
1472*5113495bSYour Name 			 last_ticks_tx[subtype] + HZ / pkt_rate_limit)) ||
1473*5113495bSYour Name 	    (dir == QDF_RX &&
1474*5113495bSYour Name 	     !time_after(curr_ticks,
1475*5113495bSYour Name 			 last_ticks_rx[subtype] + HZ / pkt_rate_limit)))
1476*5113495bSYour Name 		return;
1477*5113495bSYour Name 
1478*5113495bSYour Name 	if (dir == QDF_TX)
1479*5113495bSYour Name 		last_ticks_tx[subtype] = curr_ticks;
1480*5113495bSYour Name 	else
1481*5113495bSYour Name 		last_ticks_rx[subtype] = curr_ticks;
1482*5113495bSYour Name 
1483*5113495bSYour Name 	if (status == QDF_TX_RX_STATUS_INVALID)
1484*5113495bSYour Name 		qdf_nofl_info("%s %s: SA:" QDF_MAC_ADDR_FMT " DA:" QDF_MAC_ADDR_FMT,
1485*5113495bSYour Name 			      qdf_get_pkt_type_string(type, subtype),
1486*5113495bSYour Name 			      dir ? "RX" : "TX", QDF_MAC_ADDR_REF(sa),
1487*5113495bSYour Name 			      QDF_MAC_ADDR_REF(da));
1488*5113495bSYour Name 	else
1489*5113495bSYour Name 		qdf_nofl_info("%s %s: SA:" QDF_MAC_ADDR_FMT " DA:" QDF_MAC_ADDR_FMT " msdu_id:%d status: %s",
1490*5113495bSYour Name 			      qdf_get_pkt_type_string(type, subtype),
1491*5113495bSYour Name 			      dir ? "RX" : "TX", QDF_MAC_ADDR_REF(sa),
1492*5113495bSYour Name 			      QDF_MAC_ADDR_REF(da), msdu_id,
1493*5113495bSYour Name 			      qdf_get_pkt_status_string(status));
1494*5113495bSYour Name }
1495*5113495bSYour Name 
1496*5113495bSYour Name qdf_export_symbol(qdf_dp_log_proto_pkt_info);
1497*5113495bSYour Name 
1498*5113495bSYour Name /**
1499*5113495bSYour Name  * qdf_log_icmpv6_pkt() - log ICMPv6 packet
1500*5113495bSYour Name  * @vdev_id: ID of the vdev
1501*5113495bSYour Name  * @skb: skb pointer
1502*5113495bSYour Name  * @dir: direction
1503*5113495bSYour Name  * @pdev_id: ID of the pdev
1504*5113495bSYour Name  *
1505*5113495bSYour Name  * Return: true/false
1506*5113495bSYour Name  */
qdf_log_icmpv6_pkt(uint8_t vdev_id,struct sk_buff * skb,enum qdf_proto_dir dir,uint8_t pdev_id)1507*5113495bSYour Name static bool qdf_log_icmpv6_pkt(uint8_t vdev_id, struct sk_buff *skb,
1508*5113495bSYour Name 			       enum qdf_proto_dir dir, uint8_t pdev_id)
1509*5113495bSYour Name {
1510*5113495bSYour Name 	enum qdf_proto_subtype subtype;
1511*5113495bSYour Name 	struct qdf_dp_trace_proto_cmn cmn_info;
1512*5113495bSYour Name 
1513*5113495bSYour Name 	if ((qdf_dp_get_proto_bitmap() & QDF_NBUF_PKT_TRAC_TYPE_ICMPv6) &&
1514*5113495bSYour Name 		((dir == QDF_TX && QDF_NBUF_CB_PACKET_TYPE_ICMPv6 ==
1515*5113495bSYour Name 			QDF_NBUF_CB_GET_PACKET_TYPE(skb)) ||
1516*5113495bSYour Name 		 (dir == QDF_RX && qdf_nbuf_is_icmpv6_pkt(skb) == true))) {
1517*5113495bSYour Name 
1518*5113495bSYour Name 		subtype = qdf_nbuf_get_icmpv6_subtype(skb);
1519*5113495bSYour Name 
1520*5113495bSYour Name 		QDF_NBUF_CB_DP_TRACE_PRINT(skb) = false;
1521*5113495bSYour Name 		if (dir == QDF_TX)
1522*5113495bSYour Name 			QDF_NBUF_CB_TX_DP_TRACE(skb) = 1;
1523*5113495bSYour Name 		else if (dir == QDF_RX)
1524*5113495bSYour Name 			QDF_NBUF_CB_RX_DP_TRACE(skb) = 1;
1525*5113495bSYour Name 
1526*5113495bSYour Name 		cmn_info.vdev_id = vdev_id;
1527*5113495bSYour Name 		cmn_info.type = QDF_PROTO_TYPE_ICMPv6;
1528*5113495bSYour Name 		cmn_info.subtype = subtype;
1529*5113495bSYour Name 		cmn_info.proto_priv_data = 0;
1530*5113495bSYour Name 		cmn_info.mpdu_seq = qdf_nbuf_get_mpdu_seq_num(skb);
1531*5113495bSYour Name 		DPTRACE(qdf_dp_trace_proto_pkt(
1532*5113495bSYour Name 			QDF_DP_TRACE_ICMPv6_PACKET_RECORD,
1533*5113495bSYour Name 			(skb->data + QDF_NBUF_SRC_MAC_OFFSET),
1534*5113495bSYour Name 			(skb->data + QDF_NBUF_DEST_MAC_OFFSET),
1535*5113495bSYour Name 			dir, pdev_id, false, &cmn_info));
1536*5113495bSYour Name 
1537*5113495bSYour Name 		switch (subtype) {
1538*5113495bSYour Name 		case QDF_PROTO_ICMPV6_REQ:
1539*5113495bSYour Name 			g_qdf_dp_trace_data.icmpv6_req++;
1540*5113495bSYour Name 			break;
1541*5113495bSYour Name 		case QDF_PROTO_ICMPV6_RES:
1542*5113495bSYour Name 			g_qdf_dp_trace_data.icmpv6_resp++;
1543*5113495bSYour Name 			break;
1544*5113495bSYour Name 		case QDF_PROTO_ICMPV6_RS:
1545*5113495bSYour Name 			g_qdf_dp_trace_data.icmpv6_rs++;
1546*5113495bSYour Name 			break;
1547*5113495bSYour Name 		case QDF_PROTO_ICMPV6_RA:
1548*5113495bSYour Name 			g_qdf_dp_trace_data.icmpv6_ra++;
1549*5113495bSYour Name 			break;
1550*5113495bSYour Name 		case QDF_PROTO_ICMPV6_NS:
1551*5113495bSYour Name 			g_qdf_dp_trace_data.icmpv6_ns++;
1552*5113495bSYour Name 			break;
1553*5113495bSYour Name 		case QDF_PROTO_ICMPV6_NA:
1554*5113495bSYour Name 			g_qdf_dp_trace_data.icmpv6_na++;
1555*5113495bSYour Name 			break;
1556*5113495bSYour Name 		default:
1557*5113495bSYour Name 			break;
1558*5113495bSYour Name 		}
1559*5113495bSYour Name 		return true;
1560*5113495bSYour Name 	}
1561*5113495bSYour Name 
1562*5113495bSYour Name 	return false;
1563*5113495bSYour Name }
1564*5113495bSYour Name 
1565*5113495bSYour Name /**
1566*5113495bSYour Name  * qdf_log_icmp_pkt() - log ICMP packet
1567*5113495bSYour Name  * @vdev_id: ID of the vdev
1568*5113495bSYour Name  * @skb: skb pointer
1569*5113495bSYour Name  * @dir: direction
1570*5113495bSYour Name  * @pdev_id: ID of the pdev
1571*5113495bSYour Name  *
1572*5113495bSYour Name  * Return: true/false
1573*5113495bSYour Name  */
qdf_log_icmp_pkt(uint8_t vdev_id,struct sk_buff * skb,enum qdf_proto_dir dir,uint8_t pdev_id)1574*5113495bSYour Name static bool qdf_log_icmp_pkt(uint8_t vdev_id, struct sk_buff *skb,
1575*5113495bSYour Name 			     enum qdf_proto_dir dir, uint8_t pdev_id)
1576*5113495bSYour Name {
1577*5113495bSYour Name 	uint8_t *data = NULL;
1578*5113495bSYour Name 	uint16_t seq_num = 0;
1579*5113495bSYour Name 	uint16_t icmp_id = 0;
1580*5113495bSYour Name 	struct qdf_dp_trace_proto_cmn cmn_info;
1581*5113495bSYour Name 
1582*5113495bSYour Name 	if ((qdf_dp_get_proto_bitmap() & QDF_NBUF_PKT_TRAC_TYPE_ICMP) &&
1583*5113495bSYour Name 	    (qdf_nbuf_is_icmp_pkt(skb) == true)) {
1584*5113495bSYour Name 
1585*5113495bSYour Name 		QDF_NBUF_CB_DP_TRACE_PRINT(skb) = false;
1586*5113495bSYour Name 		cmn_info.subtype = qdf_nbuf_get_icmp_subtype(skb);
1587*5113495bSYour Name 
1588*5113495bSYour Name 		data = qdf_nbuf_data(skb);
1589*5113495bSYour Name 		icmp_id = qdf_cpu_to_be16(*(uint16_t *)(data + ICMP_ID_OFFSET));
1590*5113495bSYour Name 		seq_num = qdf_cpu_to_be16(*(uint16_t *)(data + ICMP_SEQ_NUM_OFFSET));
1591*5113495bSYour Name 
1592*5113495bSYour Name 		cmn_info.proto_priv_data = ((uint32_t)icmp_id) << 16;
1593*5113495bSYour Name 		cmn_info.proto_priv_data |= (uint32_t)seq_num;
1594*5113495bSYour Name 		cmn_info.type = QDF_PROTO_TYPE_ICMP;
1595*5113495bSYour Name 		cmn_info.vdev_id = vdev_id;
1596*5113495bSYour Name 		cmn_info.mpdu_seq = qdf_nbuf_get_mpdu_seq_num(skb);
1597*5113495bSYour Name 
1598*5113495bSYour Name 		if (QDF_TX == dir)
1599*5113495bSYour Name 			QDF_NBUF_CB_TX_DP_TRACE(skb) = 1;
1600*5113495bSYour Name 		else if (QDF_RX == dir)
1601*5113495bSYour Name 			QDF_NBUF_CB_RX_DP_TRACE(skb) = 1;
1602*5113495bSYour Name 
1603*5113495bSYour Name 		DPTRACE(qdf_dp_trace_proto_pkt(QDF_DP_TRACE_ICMP_PACKET_RECORD,
1604*5113495bSYour Name 					       skb->data +
1605*5113495bSYour Name 					       QDF_NBUF_SRC_MAC_OFFSET,
1606*5113495bSYour Name 					       skb->data +
1607*5113495bSYour Name 					       QDF_NBUF_DEST_MAC_OFFSET,
1608*5113495bSYour Name 					       dir, pdev_id,
1609*5113495bSYour Name 					       false, &cmn_info));
1610*5113495bSYour Name 
1611*5113495bSYour Name 		if (cmn_info.subtype == QDF_PROTO_ICMP_REQ)
1612*5113495bSYour Name 			g_qdf_dp_trace_data.icmp_req++;
1613*5113495bSYour Name 		else
1614*5113495bSYour Name 			g_qdf_dp_trace_data.icmp_resp++;
1615*5113495bSYour Name 
1616*5113495bSYour Name 		return true;
1617*5113495bSYour Name 	}
1618*5113495bSYour Name 	return false;
1619*5113495bSYour Name }
1620*5113495bSYour Name 
1621*5113495bSYour Name #ifdef WLAN_CHIPSET_STATS
1622*5113495bSYour Name static void
qdf_log_pkt_cstats(uint8_t * sa,uint8_t * da,enum qdf_proto_type pkt_type,enum qdf_proto_subtype subtype,enum qdf_proto_dir dir,enum qdf_dp_tx_rx_status status,uint8_t vdev_id,enum QDF_OPMODE op_mode)1623*5113495bSYour Name qdf_log_pkt_cstats(uint8_t *sa, uint8_t *da, enum qdf_proto_type pkt_type,
1624*5113495bSYour Name 		   enum qdf_proto_subtype subtype, enum qdf_proto_dir dir,
1625*5113495bSYour Name 		   enum qdf_dp_tx_rx_status status, uint8_t vdev_id,
1626*5113495bSYour Name 		   enum QDF_OPMODE op_mode)
1627*5113495bSYour Name {
1628*5113495bSYour Name 	wlan_cp_stats_cstats_pkt_log(sa, da, pkt_type, subtype, dir,
1629*5113495bSYour Name 				     status, vdev_id, op_mode);
1630*5113495bSYour Name }
1631*5113495bSYour Name #else
1632*5113495bSYour Name static void
qdf_log_pkt_cstats(uint8_t * sa,uint8_t * da,enum qdf_proto_type pkt_type,enum qdf_proto_subtype subtype,enum qdf_proto_dir dir,enum qdf_dp_tx_rx_status status,uint8_t vdev_id,enum QDF_OPMODE op_mode)1633*5113495bSYour Name qdf_log_pkt_cstats(uint8_t *sa, uint8_t *da, enum qdf_proto_type pkt_type,
1634*5113495bSYour Name 		   enum qdf_proto_subtype subtype, enum qdf_proto_dir dir,
1635*5113495bSYour Name 		   enum qdf_dp_tx_rx_status status, uint8_t vdev_id,
1636*5113495bSYour Name 		   enum QDF_OPMODE op_mode)
1637*5113495bSYour Name {
1638*5113495bSYour Name }
1639*5113495bSYour Name #endif
1640*5113495bSYour Name 
1641*5113495bSYour Name #ifdef CONNECTIVITY_DIAG_EVENT
wlan_get_diag_tx_status(enum qdf_dp_tx_rx_status tx_status)1642*5113495bSYour Name enum diag_tx_status wlan_get_diag_tx_status(enum qdf_dp_tx_rx_status tx_status)
1643*5113495bSYour Name {
1644*5113495bSYour Name 	switch (tx_status) {
1645*5113495bSYour Name 	case DIAG_TX_RX_STATUS_FW_DISCARD:
1646*5113495bSYour Name 	case DIAG_TX_RX_STATUS_INVALID:
1647*5113495bSYour Name 	case DIAG_TX_RX_STATUS_DROP:
1648*5113495bSYour Name 	case DIAG_TX_RX_STATUS_DOWNLOAD_SUCC:
1649*5113495bSYour Name 	case DIAG_TX_RX_STATUS_DEFAULT:
1650*5113495bSYour Name 	default:
1651*5113495bSYour Name 		return DIAG_TX_STATUS_FAIL;
1652*5113495bSYour Name 	case DIAG_TX_RX_STATUS_NO_ACK:
1653*5113495bSYour Name 		return DIAG_TX_STATUS_NO_ACK;
1654*5113495bSYour Name 	case DIAG_TX_RX_STATUS_OK:
1655*5113495bSYour Name 		return DIAG_TX_STATUS_ACK;
1656*5113495bSYour Name 	}
1657*5113495bSYour Name 
1658*5113495bSYour Name 	return DIAG_TX_STATUS_FAIL;
1659*5113495bSYour Name }
1660*5113495bSYour Name 
1661*5113495bSYour Name /**
1662*5113495bSYour Name  * qdf_subtype_to_wlan_main_tag() - Convert qdf subtype to wlan main tag
1663*5113495bSYour Name  * @subtype: EAPoL key subtype
1664*5113495bSYour Name  *
1665*5113495bSYour Name  * Return: Wlan main tag subtype
1666*5113495bSYour Name  */
qdf_subtype_to_wlan_main_tag(enum qdf_proto_subtype subtype)1667*5113495bSYour Name static int qdf_subtype_to_wlan_main_tag(enum qdf_proto_subtype subtype)
1668*5113495bSYour Name {
1669*5113495bSYour Name 	switch (subtype) {
1670*5113495bSYour Name 	case QDF_PROTO_DHCP_DISCOVER:
1671*5113495bSYour Name 		return WLAN_CONN_DIAG_DHCP_DISC_EVENT;
1672*5113495bSYour Name 	case QDF_PROTO_DHCP_REQUEST:
1673*5113495bSYour Name 		return WLAN_CONN_DIAG_DHCP_REQUEST_EVENT;
1674*5113495bSYour Name 	case QDF_PROTO_DHCP_OFFER:
1675*5113495bSYour Name 		return WLAN_CONN_DIAG_DHCP_OFFER_EVENT;
1676*5113495bSYour Name 	case QDF_PROTO_DHCP_ACK:
1677*5113495bSYour Name 		return WLAN_CONN_DIAG_DHCP_ACK_EVENT;
1678*5113495bSYour Name 	case QDF_PROTO_DHCP_NACK:
1679*5113495bSYour Name 		return WLAN_CONN_DIAG_DHCP_NACK_EVENT;
1680*5113495bSYour Name 	case QDF_PROTO_EAPOL_M1:
1681*5113495bSYour Name 		return WLAN_CONN_DIAG_EAPOL_M1_EVENT;
1682*5113495bSYour Name 	case QDF_PROTO_EAPOL_M2:
1683*5113495bSYour Name 		return WLAN_CONN_DIAG_EAPOL_M2_EVENT;
1684*5113495bSYour Name 	case QDF_PROTO_EAPOL_M3:
1685*5113495bSYour Name 		return WLAN_CONN_DIAG_EAPOL_M3_EVENT;
1686*5113495bSYour Name 	case QDF_PROTO_EAPOL_M4:
1687*5113495bSYour Name 		return WLAN_CONN_DIAG_EAPOL_M4_EVENT;
1688*5113495bSYour Name 	case QDF_PROTO_EAP_REQUEST:
1689*5113495bSYour Name 		return WLAN_CONN_DIAG_EAP_REQ_EVENT;
1690*5113495bSYour Name 	case QDF_PROTO_EAP_RESPONSE:
1691*5113495bSYour Name 		return WLAN_CONN_DIAG_EAP_RESP_EVENT;
1692*5113495bSYour Name 	case QDF_PROTO_EAP_SUCCESS:
1693*5113495bSYour Name 		return WLAN_CONN_DIAG_EAP_SUCC_EVENT;
1694*5113495bSYour Name 	case QDF_PROTO_EAP_FAILURE:
1695*5113495bSYour Name 		return WLAN_CONN_DIAG_EAP_FAIL_EVENT;
1696*5113495bSYour Name 	case QDF_PROTO_EAPOL_START:
1697*5113495bSYour Name 		return WLAN_CONN_DIAG_EAP_START_EVENT;
1698*5113495bSYour Name 	default:
1699*5113495bSYour Name 		return WLAN_CONN_DIAG_MAX;
1700*5113495bSYour Name 	}
1701*5113495bSYour Name }
1702*5113495bSYour Name 
1703*5113495bSYour Name /**
1704*5113495bSYour Name  * qdf_get_wlan_eap_code() - Get EAP code
1705*5113495bSYour Name  * @data: skb data pointer
1706*5113495bSYour Name  *
1707*5113495bSYour Name  * Return: EAP code value
1708*5113495bSYour Name  */
qdf_get_wlan_eap_code(uint8_t * data)1709*5113495bSYour Name static int qdf_get_wlan_eap_code(uint8_t *data)
1710*5113495bSYour Name {
1711*5113495bSYour Name 	uint8_t code = *(data + EAP_CODE_OFFSET);
1712*5113495bSYour Name 
1713*5113495bSYour Name 	switch (code) {
1714*5113495bSYour Name 	case QDF_EAP_REQUEST:
1715*5113495bSYour Name 		return WLAN_CONN_DIAG_EAP_REQ_EVENT;
1716*5113495bSYour Name 	case QDF_EAP_RESPONSE:
1717*5113495bSYour Name 		return WLAN_CONN_DIAG_EAP_RESP_EVENT;
1718*5113495bSYour Name 	case QDF_EAP_SUCCESS:
1719*5113495bSYour Name 		return WLAN_CONN_DIAG_EAP_SUCC_EVENT;
1720*5113495bSYour Name 	case QDF_EAP_FAILURE:
1721*5113495bSYour Name 		return WLAN_CONN_DIAG_EAP_FAIL_EVENT;
1722*5113495bSYour Name 	default:
1723*5113495bSYour Name 		return WLAN_CONN_DIAG_MAX;
1724*5113495bSYour Name 	}
1725*5113495bSYour Name }
1726*5113495bSYour Name 
1727*5113495bSYour Name /**
1728*5113495bSYour Name  * qdf_eapol_get_key_type() - Get EAPOL key type
1729*5113495bSYour Name  * @data: skb data pointer
1730*5113495bSYour Name  * @subtype: EAPoL key subtype
1731*5113495bSYour Name  *
1732*5113495bSYour Name  * Return: EAPOL key type
1733*5113495bSYour Name  */
1734*5113495bSYour Name static
qdf_eapol_get_key_type(uint8_t * data,enum qdf_proto_subtype subtype)1735*5113495bSYour Name uint8_t qdf_eapol_get_key_type(uint8_t *data, enum qdf_proto_subtype subtype)
1736*5113495bSYour Name {
1737*5113495bSYour Name 	uint16_t key_info = *(uint16_t *)(data + EAPOL_KEY_INFO_OFFSET);
1738*5113495bSYour Name 
1739*5113495bSYour Name 	/* If key type is PTK, key type will be set in EAPOL Key info */
1740*5113495bSYour Name 	if (key_info & EAPOL_KEY_TYPE_MASK)
1741*5113495bSYour Name 		return qdf_subtype_to_wlan_main_tag(subtype);
1742*5113495bSYour Name 	else if (key_info & EAPOL_KEY_ENCRYPTED_MASK)
1743*5113495bSYour Name 		return WLAN_CONN_DIAG_GTK_M1_EVENT;
1744*5113495bSYour Name 	else
1745*5113495bSYour Name 		return WLAN_CONN_DIAG_GTK_M2_EVENT;
1746*5113495bSYour Name }
1747*5113495bSYour Name 
1748*5113495bSYour Name /**
1749*5113495bSYour Name  * qdf_skip_wlan_connectivity_log() - Check if connectivity log need to skip
1750*5113495bSYour Name  * @type: Protocol type
1751*5113495bSYour Name  * @subtype: Protocol subtype
1752*5113495bSYour Name  * @dir: Rx or Tx
1753*5113495bSYour Name  * @op_mode: Vdev Operation mode
1754*5113495bSYour Name  *
1755*5113495bSYour Name  * Return: true or false
1756*5113495bSYour Name  */
1757*5113495bSYour Name static inline
qdf_skip_wlan_connectivity_log(enum qdf_proto_type type,enum qdf_proto_subtype subtype,enum qdf_proto_dir dir,enum QDF_OPMODE op_mode)1758*5113495bSYour Name bool qdf_skip_wlan_connectivity_log(enum qdf_proto_type type,
1759*5113495bSYour Name 				    enum qdf_proto_subtype subtype,
1760*5113495bSYour Name 				    enum qdf_proto_dir dir,
1761*5113495bSYour Name 				    enum QDF_OPMODE op_mode)
1762*5113495bSYour Name {
1763*5113495bSYour Name 	if (op_mode != QDF_STA_MODE)
1764*5113495bSYour Name 		return true;
1765*5113495bSYour Name 
1766*5113495bSYour Name 	if (dir == QDF_RX && type == QDF_PROTO_TYPE_DHCP &&
1767*5113495bSYour Name 	    (subtype == QDF_PROTO_DHCP_DISCOVER ||
1768*5113495bSYour Name 	     subtype == QDF_PROTO_DHCP_REQUEST))
1769*5113495bSYour Name 		return true;
1770*5113495bSYour Name 	return false;
1771*5113495bSYour Name }
1772*5113495bSYour Name 
1773*5113495bSYour Name /**
1774*5113495bSYour Name  * qdf_fill_wlan_connectivity_log() - Fill and queue protocol packet to logging
1775*5113495bSYour Name  * the logging queue
1776*5113495bSYour Name  * @type: Protocol type
1777*5113495bSYour Name  * @subtype: Protocol subtype
1778*5113495bSYour Name  * @dir: Rx or Tx
1779*5113495bSYour Name  * @qdf_tx_status: Tx completion status
1780*5113495bSYour Name  * @op_mode: Vdev Operation mode
1781*5113495bSYour Name  * @vdev_id: DP vdev ID
1782*5113495bSYour Name  * @data: skb data pointer
1783*5113495bSYour Name  * @band: band
1784*5113495bSYour Name  *
1785*5113495bSYour Name  * Return: None
1786*5113495bSYour Name  */
1787*5113495bSYour Name static
qdf_fill_wlan_connectivity_log(enum qdf_proto_type type,enum qdf_proto_subtype subtype,enum qdf_proto_dir dir,enum qdf_dp_tx_rx_status qdf_tx_status,enum QDF_OPMODE op_mode,uint8_t vdev_id,uint8_t * data,uint8_t band)1788*5113495bSYour Name void qdf_fill_wlan_connectivity_log(enum qdf_proto_type type,
1789*5113495bSYour Name 				    enum qdf_proto_subtype subtype,
1790*5113495bSYour Name 				    enum qdf_proto_dir dir,
1791*5113495bSYour Name 				    enum qdf_dp_tx_rx_status qdf_tx_status,
1792*5113495bSYour Name 				    enum QDF_OPMODE op_mode,
1793*5113495bSYour Name 				    uint8_t vdev_id, uint8_t *data,
1794*5113495bSYour Name 				    uint8_t band)
1795*5113495bSYour Name {
1796*5113495bSYour Name 	uint8_t pkt_type;
1797*5113495bSYour Name 
1798*5113495bSYour Name 	WLAN_HOST_DIAG_EVENT_DEF(wlan_diag_event, struct wlan_diag_packet_info);
1799*5113495bSYour Name 
1800*5113495bSYour Name 	if (qdf_skip_wlan_connectivity_log(type, subtype, dir, op_mode))
1801*5113495bSYour Name 		return;
1802*5113495bSYour Name 
1803*5113495bSYour Name 	qdf_mem_zero(&wlan_diag_event, sizeof(wlan_diag_event));
1804*5113495bSYour Name 
1805*5113495bSYour Name 	wlan_diag_event.diag_cmn.timestamp_us =
1806*5113495bSYour Name 					qdf_get_time_of_the_day_ms() * 1000;
1807*5113495bSYour Name 	wlan_diag_event.diag_cmn.ktime_us = qdf_ktime_to_us(qdf_ktime_get());
1808*5113495bSYour Name 	wlan_diag_event.diag_cmn.vdev_id = vdev_id;
1809*5113495bSYour Name 
1810*5113495bSYour Name 	wlan_diag_event.version = DIAG_MGMT_VERSION_V2;
1811*5113495bSYour Name 
1812*5113495bSYour Name 	if (type == QDF_PROTO_TYPE_DHCP) {
1813*5113495bSYour Name 		wlan_diag_event.subtype =
1814*5113495bSYour Name 					qdf_subtype_to_wlan_main_tag(subtype);
1815*5113495bSYour Name 	} else if (type == QDF_PROTO_TYPE_EAPOL) {
1816*5113495bSYour Name 		pkt_type = *(data + EAPOL_PACKET_TYPE_OFFSET);
1817*5113495bSYour Name 		if (pkt_type == EAPOL_PACKET_TYPE_EAP) {
1818*5113495bSYour Name 			wlan_diag_event.subtype =
1819*5113495bSYour Name 						qdf_get_wlan_eap_code(data);
1820*5113495bSYour Name 			wlan_diag_event.eap_type =
1821*5113495bSYour Name 						*(data + EAP_TYPE_OFFSET);
1822*5113495bSYour Name 			wlan_diag_event.eap_len =
1823*5113495bSYour Name 			   qdf_ntohs(*(uint16_t *)(data + EAP_LENGTH_OFFSET));
1824*5113495bSYour Name 		} else if (pkt_type == EAPOL_PACKET_TYPE_KEY) {
1825*5113495bSYour Name 			wlan_diag_event.subtype =
1826*5113495bSYour Name 					qdf_eapol_get_key_type(data, subtype);
1827*5113495bSYour Name 		} else if (pkt_type == EAPOL_PACKET_TYPE_START) {
1828*5113495bSYour Name 			wlan_diag_event.subtype =
1829*5113495bSYour Name 					WLAN_CONN_DIAG_EAP_START_EVENT;
1830*5113495bSYour Name 			wlan_diag_event.eap_len =
1831*5113495bSYour Name 			    qdf_ntohs(*(uint16_t *)(data + EAPOL_PKT_LEN_OFFSET));
1832*5113495bSYour Name 		} else {
1833*5113495bSYour Name 			return;
1834*5113495bSYour Name 		}
1835*5113495bSYour Name 	} else {
1836*5113495bSYour Name 		return;
1837*5113495bSYour Name 	}
1838*5113495bSYour Name 
1839*5113495bSYour Name 	wlan_diag_event.supported_links = band;
1840*5113495bSYour Name 
1841*5113495bSYour Name 	/*Tx completion status needs to be logged*/
1842*5113495bSYour Name 	if (dir == QDF_TX) {
1843*5113495bSYour Name 		wlan_diag_event.is_tx = 1;
1844*5113495bSYour Name 		wlan_diag_event.tx_status =
1845*5113495bSYour Name 					wlan_get_diag_tx_status(qdf_tx_status);
1846*5113495bSYour Name 	}
1847*5113495bSYour Name 
1848*5113495bSYour Name 	WLAN_HOST_DIAG_EVENT_REPORT(&wlan_diag_event, EVENT_WLAN_CONN_DP);
1849*5113495bSYour Name }
1850*5113495bSYour Name 
1851*5113495bSYour Name #else
1852*5113495bSYour Name static inline
qdf_fill_wlan_connectivity_log(enum qdf_proto_type type,enum qdf_proto_subtype subtype,enum qdf_proto_dir dir,enum qdf_dp_tx_rx_status qdf_tx_status,enum QDF_OPMODE op_mode,uint8_t vdev_id,uint8_t * data,uint8_t band)1853*5113495bSYour Name void qdf_fill_wlan_connectivity_log(enum qdf_proto_type type,
1854*5113495bSYour Name 				    enum qdf_proto_subtype subtype,
1855*5113495bSYour Name 				    enum qdf_proto_dir dir,
1856*5113495bSYour Name 				    enum qdf_dp_tx_rx_status qdf_tx_status,
1857*5113495bSYour Name 				    enum QDF_OPMODE op_mode,
1858*5113495bSYour Name 				    uint8_t vdev_id, uint8_t *data,
1859*5113495bSYour Name 				    uint8_t band)
1860*5113495bSYour Name {
1861*5113495bSYour Name }
1862*5113495bSYour Name #endif
1863*5113495bSYour Name 
1864*5113495bSYour Name /**
1865*5113495bSYour Name  * qdf_log_eapol_pkt() - log EAPOL packet
1866*5113495bSYour Name  * @vdev_id: ID of the vdev
1867*5113495bSYour Name  * @skb: skb pointer
1868*5113495bSYour Name  * @dir: direction
1869*5113495bSYour Name  * @pdev_id: ID of the pdev
1870*5113495bSYour Name  * @op_mode: Vdev Operation mode
1871*5113495bSYour Name  *
1872*5113495bSYour Name  * Return: true/false
1873*5113495bSYour Name  */
qdf_log_eapol_pkt(uint8_t vdev_id,struct sk_buff * skb,enum qdf_proto_dir dir,uint8_t pdev_id,enum QDF_OPMODE op_mode)1874*5113495bSYour Name static bool qdf_log_eapol_pkt(uint8_t vdev_id, struct sk_buff *skb,
1875*5113495bSYour Name 			      enum qdf_proto_dir dir, uint8_t pdev_id,
1876*5113495bSYour Name 				  enum QDF_OPMODE op_mode)
1877*5113495bSYour Name {
1878*5113495bSYour Name 	enum qdf_proto_subtype subtype;
1879*5113495bSYour Name 	uint32_t dp_eap_trace;
1880*5113495bSYour Name 	uint32_t dp_eap_event;
1881*5113495bSYour Name 	struct qdf_dp_trace_proto_cmn cmn_info;
1882*5113495bSYour Name 
1883*5113495bSYour Name 	dp_eap_trace = qdf_dp_get_proto_bitmap() & QDF_NBUF_PKT_TRAC_TYPE_EAPOL;
1884*5113495bSYour Name 	dp_eap_event = qdf_dp_get_proto_event_bitmap() &
1885*5113495bSYour Name 				QDF_NBUF_PKT_TRAC_TYPE_EAPOL;
1886*5113495bSYour Name 
1887*5113495bSYour Name 	if (!dp_eap_trace && !dp_eap_event)
1888*5113495bSYour Name 		return false;
1889*5113495bSYour Name 
1890*5113495bSYour Name 	if (!((dir == QDF_TX && QDF_NBUF_CB_PACKET_TYPE_EAPOL ==
1891*5113495bSYour Name 	       QDF_NBUF_CB_GET_PACKET_TYPE(skb)) ||
1892*5113495bSYour Name 	      (dir == QDF_RX && qdf_nbuf_is_ipv4_eapol_pkt(skb) == true)))
1893*5113495bSYour Name 		return false;
1894*5113495bSYour Name 
1895*5113495bSYour Name 	subtype = qdf_nbuf_get_eapol_subtype(skb);
1896*5113495bSYour Name 
1897*5113495bSYour Name 	if (dp_eap_event && dir == QDF_RX) {
1898*5113495bSYour Name 		qdf_dp_log_proto_pkt_info(skb->data + QDF_NBUF_SRC_MAC_OFFSET,
1899*5113495bSYour Name 					  skb->data + QDF_NBUF_DEST_MAC_OFFSET,
1900*5113495bSYour Name 					  QDF_PROTO_TYPE_EAPOL, subtype, dir,
1901*5113495bSYour Name 					  QDF_TRACE_DEFAULT_MSDU_ID,
1902*5113495bSYour Name 					  QDF_TX_RX_STATUS_INVALID);
1903*5113495bSYour Name 		qdf_fill_wlan_connectivity_log(QDF_PROTO_TYPE_EAPOL, subtype,
1904*5113495bSYour Name 					       QDF_RX, 0, op_mode,
1905*5113495bSYour Name 					       vdev_id, skb->data,
1906*5113495bSYour Name 					       qdf_nbuf_rx_get_band(skb));
1907*5113495bSYour Name 		qdf_log_pkt_cstats(skb->data + QDF_NBUF_SRC_MAC_OFFSET,
1908*5113495bSYour Name 				   skb->data + QDF_NBUF_DEST_MAC_OFFSET,
1909*5113495bSYour Name 				   QDF_PROTO_TYPE_EAPOL, subtype, dir,
1910*5113495bSYour Name 				   QDF_TX_RX_STATUS_INVALID, vdev_id, op_mode);
1911*5113495bSYour Name 	}
1912*5113495bSYour Name 
1913*5113495bSYour Name 	if (dp_eap_trace) {
1914*5113495bSYour Name 		QDF_NBUF_CB_DP_TRACE_PRINT(skb) = true;
1915*5113495bSYour Name 		if (QDF_TX == dir)
1916*5113495bSYour Name 			QDF_NBUF_CB_TX_DP_TRACE(skb) = 1;
1917*5113495bSYour Name 		else if (QDF_RX == dir)
1918*5113495bSYour Name 			QDF_NBUF_CB_RX_DP_TRACE(skb) = 1;
1919*5113495bSYour Name 
1920*5113495bSYour Name 		cmn_info.vdev_id = vdev_id;
1921*5113495bSYour Name 		cmn_info.type = QDF_PROTO_TYPE_EAPOL;
1922*5113495bSYour Name 		cmn_info.subtype = subtype;
1923*5113495bSYour Name 		cmn_info.proto_priv_data = 0;
1924*5113495bSYour Name 		cmn_info.mpdu_seq = qdf_nbuf_get_mpdu_seq_num(skb);
1925*5113495bSYour Name 		DPTRACE(qdf_dp_trace_proto_pkt(QDF_DP_TRACE_EAPOL_PACKET_RECORD,
1926*5113495bSYour Name 					       skb->data +
1927*5113495bSYour Name 					       QDF_NBUF_SRC_MAC_OFFSET,
1928*5113495bSYour Name 					       skb->data +
1929*5113495bSYour Name 					       QDF_NBUF_DEST_MAC_OFFSET,
1930*5113495bSYour Name 					       dir, pdev_id, true, &cmn_info));
1931*5113495bSYour Name 
1932*5113495bSYour Name 		switch (subtype) {
1933*5113495bSYour Name 		case QDF_PROTO_EAPOL_M1:
1934*5113495bSYour Name 			g_qdf_dp_trace_data.eapol_m1++;
1935*5113495bSYour Name 			break;
1936*5113495bSYour Name 		case QDF_PROTO_EAPOL_M2:
1937*5113495bSYour Name 			g_qdf_dp_trace_data.eapol_m2++;
1938*5113495bSYour Name 			break;
1939*5113495bSYour Name 		case QDF_PROTO_EAPOL_M3:
1940*5113495bSYour Name 			g_qdf_dp_trace_data.eapol_m3++;
1941*5113495bSYour Name 			break;
1942*5113495bSYour Name 		case QDF_PROTO_EAPOL_M4:
1943*5113495bSYour Name 			g_qdf_dp_trace_data.eapol_m4++;
1944*5113495bSYour Name 			break;
1945*5113495bSYour Name 		default:
1946*5113495bSYour Name 			g_qdf_dp_trace_data.eapol_others++;
1947*5113495bSYour Name 			break;
1948*5113495bSYour Name 		}
1949*5113495bSYour Name 	}
1950*5113495bSYour Name 
1951*5113495bSYour Name 	return true;
1952*5113495bSYour Name }
1953*5113495bSYour Name 
1954*5113495bSYour Name /**
1955*5113495bSYour Name  * qdf_log_dhcp_pkt() - log DHCP packet
1956*5113495bSYour Name  * @vdev_id: ID of the vdev
1957*5113495bSYour Name  * @skb: skb pointer
1958*5113495bSYour Name  * @dir: direction
1959*5113495bSYour Name  * @pdev_id: ID of the pdev
1960*5113495bSYour Name  * @op_mode: Vdev Operation mode
1961*5113495bSYour Name  *
1962*5113495bSYour Name  * Return: true/false
1963*5113495bSYour Name  */
qdf_log_dhcp_pkt(uint8_t vdev_id,struct sk_buff * skb,enum qdf_proto_dir dir,uint8_t pdev_id,enum QDF_OPMODE op_mode)1964*5113495bSYour Name static bool qdf_log_dhcp_pkt(uint8_t vdev_id, struct sk_buff *skb,
1965*5113495bSYour Name 			     enum qdf_proto_dir dir, uint8_t pdev_id,
1966*5113495bSYour Name 			     enum QDF_OPMODE op_mode)
1967*5113495bSYour Name {
1968*5113495bSYour Name 	enum qdf_proto_subtype subtype = QDF_PROTO_INVALID;
1969*5113495bSYour Name 	uint32_t dp_dhcp_trace;
1970*5113495bSYour Name 	uint32_t dp_dhcp_event;
1971*5113495bSYour Name 	struct qdf_dp_trace_proto_cmn cmn_info;
1972*5113495bSYour Name 
1973*5113495bSYour Name 	dp_dhcp_trace = qdf_dp_get_proto_bitmap() & QDF_NBUF_PKT_TRAC_TYPE_DHCP;
1974*5113495bSYour Name 	dp_dhcp_event = qdf_dp_get_proto_event_bitmap() &
1975*5113495bSYour Name 				QDF_NBUF_PKT_TRAC_TYPE_DHCP;
1976*5113495bSYour Name 
1977*5113495bSYour Name 	if (!dp_dhcp_trace && !dp_dhcp_event)
1978*5113495bSYour Name 		return false;
1979*5113495bSYour Name 
1980*5113495bSYour Name 	if (!((dir == QDF_TX && QDF_NBUF_CB_PACKET_TYPE_DHCP ==
1981*5113495bSYour Name 	       QDF_NBUF_CB_GET_PACKET_TYPE(skb)) ||
1982*5113495bSYour Name 	      (dir == QDF_RX && qdf_nbuf_is_ipv4_dhcp_pkt(skb) == true)))
1983*5113495bSYour Name 		return false;
1984*5113495bSYour Name 
1985*5113495bSYour Name 	subtype = qdf_nbuf_get_dhcp_subtype(skb);
1986*5113495bSYour Name 
1987*5113495bSYour Name 	if (dp_dhcp_event && dir == QDF_RX) {
1988*5113495bSYour Name 		qdf_dp_log_proto_pkt_info(skb->data + QDF_NBUF_SRC_MAC_OFFSET,
1989*5113495bSYour Name 					  skb->data + QDF_NBUF_DEST_MAC_OFFSET,
1990*5113495bSYour Name 					  QDF_PROTO_TYPE_DHCP, subtype, dir,
1991*5113495bSYour Name 					  QDF_TRACE_DEFAULT_MSDU_ID,
1992*5113495bSYour Name 					  QDF_TX_RX_STATUS_INVALID);
1993*5113495bSYour Name 		qdf_fill_wlan_connectivity_log(QDF_PROTO_TYPE_DHCP, subtype,
1994*5113495bSYour Name 					       QDF_RX, 0, op_mode, vdev_id, 0,
1995*5113495bSYour Name 					       qdf_nbuf_rx_get_band(skb));
1996*5113495bSYour Name 		qdf_log_pkt_cstats(skb->data + QDF_NBUF_SRC_MAC_OFFSET,
1997*5113495bSYour Name 				   skb->data + QDF_NBUF_DEST_MAC_OFFSET,
1998*5113495bSYour Name 				   QDF_PROTO_TYPE_DHCP, subtype, dir,
1999*5113495bSYour Name 				   QDF_TX_RX_STATUS_INVALID, vdev_id, op_mode);
2000*5113495bSYour Name 	}
2001*5113495bSYour Name 
2002*5113495bSYour Name 	if (dp_dhcp_trace) {
2003*5113495bSYour Name 		QDF_NBUF_CB_DP_TRACE_PRINT(skb) = true;
2004*5113495bSYour Name 		if (QDF_TX == dir)
2005*5113495bSYour Name 			QDF_NBUF_CB_TX_DP_TRACE(skb) = 1;
2006*5113495bSYour Name 		else if (QDF_RX == dir)
2007*5113495bSYour Name 			QDF_NBUF_CB_RX_DP_TRACE(skb) = 1;
2008*5113495bSYour Name 
2009*5113495bSYour Name 		cmn_info.vdev_id = vdev_id;
2010*5113495bSYour Name 		cmn_info.type = QDF_PROTO_TYPE_DHCP;
2011*5113495bSYour Name 		cmn_info.subtype = subtype;
2012*5113495bSYour Name 		cmn_info.proto_priv_data = 0;
2013*5113495bSYour Name 		cmn_info.mpdu_seq = qdf_nbuf_get_mpdu_seq_num(skb);
2014*5113495bSYour Name 		DPTRACE(qdf_dp_trace_proto_pkt(QDF_DP_TRACE_DHCP_PACKET_RECORD,
2015*5113495bSYour Name 					       skb->data +
2016*5113495bSYour Name 					       QDF_NBUF_SRC_MAC_OFFSET,
2017*5113495bSYour Name 					       skb->data +
2018*5113495bSYour Name 					       QDF_NBUF_DEST_MAC_OFFSET,
2019*5113495bSYour Name 					       dir, pdev_id, true, &cmn_info));
2020*5113495bSYour Name 
2021*5113495bSYour Name 		switch (subtype) {
2022*5113495bSYour Name 		case QDF_PROTO_DHCP_DISCOVER:
2023*5113495bSYour Name 			g_qdf_dp_trace_data.dhcp_disc++;
2024*5113495bSYour Name 			break;
2025*5113495bSYour Name 		case QDF_PROTO_DHCP_OFFER:
2026*5113495bSYour Name 			g_qdf_dp_trace_data.dhcp_off++;
2027*5113495bSYour Name 			break;
2028*5113495bSYour Name 		case QDF_PROTO_DHCP_REQUEST:
2029*5113495bSYour Name 			g_qdf_dp_trace_data.dhcp_req++;
2030*5113495bSYour Name 			break;
2031*5113495bSYour Name 		case QDF_PROTO_DHCP_ACK:
2032*5113495bSYour Name 			g_qdf_dp_trace_data.dhcp_ack++;
2033*5113495bSYour Name 			break;
2034*5113495bSYour Name 		case QDF_PROTO_DHCP_NACK:
2035*5113495bSYour Name 			g_qdf_dp_trace_data.dhcp_nack++;
2036*5113495bSYour Name 			break;
2037*5113495bSYour Name 		default:
2038*5113495bSYour Name 			g_qdf_dp_trace_data.eapol_others++;
2039*5113495bSYour Name 			break;
2040*5113495bSYour Name 		}
2041*5113495bSYour Name 	}
2042*5113495bSYour Name 
2043*5113495bSYour Name 	return true;
2044*5113495bSYour Name }
2045*5113495bSYour Name 
2046*5113495bSYour Name /**
2047*5113495bSYour Name  * qdf_log_arp_pkt() - log ARP packet
2048*5113495bSYour Name  * @vdev_id: ID of the vdev
2049*5113495bSYour Name  * @skb: skb pointer
2050*5113495bSYour Name  * @dir: direction
2051*5113495bSYour Name  * @pdev_id: ID of the pdev
2052*5113495bSYour Name  *
2053*5113495bSYour Name  * Return: true/false
2054*5113495bSYour Name  */
qdf_log_arp_pkt(uint8_t vdev_id,struct sk_buff * skb,enum qdf_proto_dir dir,uint8_t pdev_id)2055*5113495bSYour Name static bool qdf_log_arp_pkt(uint8_t vdev_id, struct sk_buff *skb,
2056*5113495bSYour Name 			    enum qdf_proto_dir dir, uint8_t pdev_id)
2057*5113495bSYour Name {
2058*5113495bSYour Name 	enum qdf_proto_subtype proto_subtype;
2059*5113495bSYour Name 	struct qdf_dp_trace_proto_cmn cmn_info;
2060*5113495bSYour Name 
2061*5113495bSYour Name 	if ((qdf_dp_get_proto_bitmap() & QDF_NBUF_PKT_TRAC_TYPE_ARP) &&
2062*5113495bSYour Name 		((dir == QDF_TX && QDF_NBUF_CB_PACKET_TYPE_ARP ==
2063*5113495bSYour Name 			QDF_NBUF_CB_GET_PACKET_TYPE(skb)) ||
2064*5113495bSYour Name 		 (dir == QDF_RX && qdf_nbuf_is_ipv4_arp_pkt(skb) == true))) {
2065*5113495bSYour Name 
2066*5113495bSYour Name 		proto_subtype = qdf_nbuf_get_arp_subtype(skb);
2067*5113495bSYour Name 		QDF_NBUF_CB_DP_TRACE_PRINT(skb) = true;
2068*5113495bSYour Name 		if (QDF_TX == dir)
2069*5113495bSYour Name 			QDF_NBUF_CB_TX_DP_TRACE(skb) = 1;
2070*5113495bSYour Name 		else if (QDF_RX == dir)
2071*5113495bSYour Name 			QDF_NBUF_CB_RX_DP_TRACE(skb) = 1;
2072*5113495bSYour Name 
2073*5113495bSYour Name 		cmn_info.vdev_id = vdev_id;
2074*5113495bSYour Name 		cmn_info.type = QDF_PROTO_TYPE_ARP;
2075*5113495bSYour Name 		cmn_info.subtype = proto_subtype;
2076*5113495bSYour Name 		cmn_info.proto_priv_data = 0;
2077*5113495bSYour Name 		cmn_info.mpdu_seq = qdf_nbuf_get_mpdu_seq_num(skb);
2078*5113495bSYour Name 		DPTRACE(qdf_dp_trace_proto_pkt(QDF_DP_TRACE_ARP_PACKET_RECORD,
2079*5113495bSYour Name 					       skb->data +
2080*5113495bSYour Name 					       QDF_NBUF_SRC_MAC_OFFSET,
2081*5113495bSYour Name 					       skb->data +
2082*5113495bSYour Name 					       QDF_NBUF_DEST_MAC_OFFSET,
2083*5113495bSYour Name 					       dir, pdev_id, true,
2084*5113495bSYour Name 					       &cmn_info));
2085*5113495bSYour Name 
2086*5113495bSYour Name 		if (QDF_PROTO_ARP_REQ == proto_subtype)
2087*5113495bSYour Name 			g_qdf_dp_trace_data.arp_req++;
2088*5113495bSYour Name 		else
2089*5113495bSYour Name 			g_qdf_dp_trace_data.arp_resp++;
2090*5113495bSYour Name 
2091*5113495bSYour Name 		return true;
2092*5113495bSYour Name 	}
2093*5113495bSYour Name 	return false;
2094*5113495bSYour Name }
2095*5113495bSYour Name 
2096*5113495bSYour Name 
qdf_dp_trace_log_pkt(uint8_t vdev_id,struct sk_buff * skb,enum qdf_proto_dir dir,uint8_t pdev_id,enum QDF_OPMODE op_mode)2097*5113495bSYour Name bool qdf_dp_trace_log_pkt(uint8_t vdev_id, struct sk_buff *skb,
2098*5113495bSYour Name 			  enum qdf_proto_dir dir, uint8_t pdev_id,
2099*5113495bSYour Name 			  enum QDF_OPMODE op_mode)
2100*5113495bSYour Name {
2101*5113495bSYour Name 	if (!qdf_dp_get_proto_bitmap() && !qdf_dp_get_proto_event_bitmap())
2102*5113495bSYour Name 		return false;
2103*5113495bSYour Name 	if (qdf_log_arp_pkt(vdev_id, skb, dir, pdev_id))
2104*5113495bSYour Name 		return true;
2105*5113495bSYour Name 	if (qdf_log_dhcp_pkt(vdev_id, skb, dir, pdev_id, op_mode))
2106*5113495bSYour Name 		return true;
2107*5113495bSYour Name 	if (qdf_log_eapol_pkt(vdev_id, skb, dir, pdev_id, op_mode))
2108*5113495bSYour Name 		return true;
2109*5113495bSYour Name 	if (qdf_log_icmp_pkt(vdev_id, skb, dir, pdev_id))
2110*5113495bSYour Name 		return true;
2111*5113495bSYour Name 	if (qdf_log_icmpv6_pkt(vdev_id, skb, dir, pdev_id))
2112*5113495bSYour Name 		return true;
2113*5113495bSYour Name 	return false;
2114*5113495bSYour Name }
2115*5113495bSYour Name qdf_export_symbol(qdf_dp_trace_log_pkt);
2116*5113495bSYour Name 
qdf_dp_display_mgmt_pkt(struct qdf_dp_trace_record_s * record,uint16_t index,uint8_t pdev_id,uint8_t info)2117*5113495bSYour Name void qdf_dp_display_mgmt_pkt(struct qdf_dp_trace_record_s *record,
2118*5113495bSYour Name 			      uint16_t index, uint8_t pdev_id, uint8_t info)
2119*5113495bSYour Name {
2120*5113495bSYour Name 	int loc;
2121*5113495bSYour Name 	char prepend_str[QDF_DP_TRACE_PREPEND_STR_SIZE];
2122*5113495bSYour Name 	struct qdf_dp_trace_mgmt_buf *buf =
2123*5113495bSYour Name 		(struct qdf_dp_trace_mgmt_buf *)record->data;
2124*5113495bSYour Name 
2125*5113495bSYour Name 	qdf_mem_zero(prepend_str, sizeof(prepend_str));
2126*5113495bSYour Name 	loc = qdf_dp_trace_fill_meta_str(prepend_str, sizeof(prepend_str),
2127*5113495bSYour Name 					 index, info, record);
2128*5113495bSYour Name 
2129*5113495bSYour Name 	DPTRACE_PRINT("%s [%d] [%s %s]",
2130*5113495bSYour Name 		      prepend_str,
2131*5113495bSYour Name 		      buf->vdev_id,
2132*5113495bSYour Name 		      qdf_dp_type_to_str(buf->type),
2133*5113495bSYour Name 		      qdf_dp_subtype_to_str(buf->subtype));
2134*5113495bSYour Name }
2135*5113495bSYour Name qdf_export_symbol(qdf_dp_display_mgmt_pkt);
2136*5113495bSYour Name 
2137*5113495bSYour Name 
qdf_dp_trace_mgmt_pkt(enum QDF_DP_TRACE_ID code,uint8_t vdev_id,uint8_t pdev_id,enum qdf_proto_type type,enum qdf_proto_subtype subtype)2138*5113495bSYour Name void qdf_dp_trace_mgmt_pkt(enum QDF_DP_TRACE_ID code, uint8_t vdev_id,
2139*5113495bSYour Name 		uint8_t pdev_id, enum qdf_proto_type type,
2140*5113495bSYour Name 		enum qdf_proto_subtype subtype)
2141*5113495bSYour Name {
2142*5113495bSYour Name 	struct qdf_dp_trace_mgmt_buf buf;
2143*5113495bSYour Name 	int buf_size = sizeof(struct qdf_dp_trace_mgmt_buf);
2144*5113495bSYour Name 
2145*5113495bSYour Name 	if (qdf_dp_enable_check(NULL, code, QDF_NA) == false)
2146*5113495bSYour Name 		return;
2147*5113495bSYour Name 
2148*5113495bSYour Name 	if (buf_size > QDF_DP_TRACE_RECORD_SIZE)
2149*5113495bSYour Name 		QDF_BUG(0);
2150*5113495bSYour Name 
2151*5113495bSYour Name 	buf.type = type;
2152*5113495bSYour Name 	buf.subtype = subtype;
2153*5113495bSYour Name 	buf.vdev_id = vdev_id;
2154*5113495bSYour Name 	qdf_dp_add_record(code, pdev_id, (uint8_t *)&buf, buf_size,
2155*5113495bSYour Name 			  NULL, 0, true);
2156*5113495bSYour Name }
2157*5113495bSYour Name qdf_export_symbol(qdf_dp_trace_mgmt_pkt);
2158*5113495bSYour Name 
2159*5113495bSYour Name static void
qdf_dpt_display_credit_record_debugfs(qdf_debugfs_file_t file,struct qdf_dp_trace_record_s * record,uint32_t index)2160*5113495bSYour Name qdf_dpt_display_credit_record_debugfs(qdf_debugfs_file_t file,
2161*5113495bSYour Name 				      struct qdf_dp_trace_record_s *record,
2162*5113495bSYour Name 				      uint32_t index)
2163*5113495bSYour Name {
2164*5113495bSYour Name 	int loc;
2165*5113495bSYour Name 	char prepend_str[QDF_DP_TRACE_PREPEND_STR_SIZE];
2166*5113495bSYour Name 	struct qdf_dp_trace_credit_record *buf =
2167*5113495bSYour Name 		(struct qdf_dp_trace_credit_record *)record->data;
2168*5113495bSYour Name 
2169*5113495bSYour Name 	loc = qdf_dp_trace_fill_meta_str(prepend_str, sizeof(prepend_str),
2170*5113495bSYour Name 					 index, 0, record);
2171*5113495bSYour Name 	if (buf->operation == QDF_OP_NA)
2172*5113495bSYour Name 		qdf_debugfs_printf(file, "%s [%s] [T: %d G0: %d G1: %d]\n",
2173*5113495bSYour Name 				   prepend_str,
2174*5113495bSYour Name 				   qdf_dp_credit_source_to_str(buf->source),
2175*5113495bSYour Name 				   buf->total_credits, buf->g0_credit,
2176*5113495bSYour Name 				   buf->g1_credit);
2177*5113495bSYour Name 	else
2178*5113495bSYour Name 		qdf_debugfs_printf(file,
2179*5113495bSYour Name 				   "%s [%s] [T: %d G0: %d G1: %d] [%s %d]\n",
2180*5113495bSYour Name 				   prepend_str,
2181*5113495bSYour Name 				   qdf_dp_credit_source_to_str(buf->source),
2182*5113495bSYour Name 				   buf->total_credits, buf->g0_credit,
2183*5113495bSYour Name 				   buf->g1_credit,
2184*5113495bSYour Name 				   qdf_dp_operation_to_str(buf->operation),
2185*5113495bSYour Name 				   buf->delta);
2186*5113495bSYour Name }
2187*5113495bSYour Name 
qdf_dp_display_credit_record(struct qdf_dp_trace_record_s * record,uint16_t index,uint8_t pdev_id,uint8_t info)2188*5113495bSYour Name void qdf_dp_display_credit_record(struct qdf_dp_trace_record_s *record,
2189*5113495bSYour Name 				  uint16_t index, uint8_t pdev_id, uint8_t info)
2190*5113495bSYour Name {
2191*5113495bSYour Name 	int loc;
2192*5113495bSYour Name 	char prepend_str[QDF_DP_TRACE_PREPEND_STR_SIZE];
2193*5113495bSYour Name 	struct qdf_dp_trace_credit_record *buf =
2194*5113495bSYour Name 		(struct qdf_dp_trace_credit_record *)record->data;
2195*5113495bSYour Name 
2196*5113495bSYour Name 	loc = qdf_dp_trace_fill_meta_str(prepend_str, sizeof(prepend_str),
2197*5113495bSYour Name 					 index, info, record);
2198*5113495bSYour Name 	if (buf->operation == QDF_OP_NA)
2199*5113495bSYour Name 		DPTRACE_PRINT("%s [%s] [T: %d G0: %d G1: %d]",
2200*5113495bSYour Name 			      prepend_str,
2201*5113495bSYour Name 			      qdf_dp_credit_source_to_str(buf->source),
2202*5113495bSYour Name 			      buf->total_credits, buf->g0_credit,
2203*5113495bSYour Name 			      buf->g1_credit);
2204*5113495bSYour Name 	else
2205*5113495bSYour Name 		DPTRACE_PRINT("%s [%s] [T: %d G0: %d G1: %d] [%s %d]",
2206*5113495bSYour Name 			      prepend_str,
2207*5113495bSYour Name 			      qdf_dp_credit_source_to_str(buf->source),
2208*5113495bSYour Name 			      buf->total_credits, buf->g0_credit,
2209*5113495bSYour Name 			      buf->g1_credit,
2210*5113495bSYour Name 			      qdf_dp_operation_to_str(buf->operation),
2211*5113495bSYour Name 			      buf->delta);
2212*5113495bSYour Name }
2213*5113495bSYour Name 
qdf_dp_trace_credit_record(enum QDF_CREDIT_UPDATE_SOURCE source,enum QDF_CREDIT_OPERATION operation,int delta,int total_credits,int g0_credit,int g1_credit)2214*5113495bSYour Name void qdf_dp_trace_credit_record(enum QDF_CREDIT_UPDATE_SOURCE source,
2215*5113495bSYour Name 				enum QDF_CREDIT_OPERATION operation,
2216*5113495bSYour Name 				int delta, int total_credits,
2217*5113495bSYour Name 				int g0_credit, int g1_credit)
2218*5113495bSYour Name {
2219*5113495bSYour Name 	struct qdf_dp_trace_credit_record buf;
2220*5113495bSYour Name 	int buf_size = sizeof(struct qdf_dp_trace_credit_record);
2221*5113495bSYour Name 	enum QDF_DP_TRACE_ID code = QDF_DP_TRACE_TX_CREDIT_RECORD;
2222*5113495bSYour Name 
2223*5113495bSYour Name 	if (qdf_dp_enable_check(NULL, code, QDF_NA) == false)
2224*5113495bSYour Name 		return;
2225*5113495bSYour Name 
2226*5113495bSYour Name 	if (!(qdf_dp_get_proto_bitmap() & QDF_HL_CREDIT_TRACKING))
2227*5113495bSYour Name 		return;
2228*5113495bSYour Name 
2229*5113495bSYour Name 	if (buf_size > QDF_DP_TRACE_RECORD_SIZE)
2230*5113495bSYour Name 		QDF_BUG(0);
2231*5113495bSYour Name 
2232*5113495bSYour Name 	buf.source = source;
2233*5113495bSYour Name 	buf.operation = operation;
2234*5113495bSYour Name 	buf.delta = delta;
2235*5113495bSYour Name 	buf.total_credits = total_credits;
2236*5113495bSYour Name 	buf.g0_credit = g0_credit;
2237*5113495bSYour Name 	buf.g1_credit = g1_credit;
2238*5113495bSYour Name 
2239*5113495bSYour Name 	qdf_dp_add_record(code, QDF_TRACE_DEFAULT_PDEV_ID, (uint8_t *)&buf,
2240*5113495bSYour Name 			  buf_size, NULL, 0, false);
2241*5113495bSYour Name }
2242*5113495bSYour Name qdf_export_symbol(qdf_dp_trace_credit_record);
2243*5113495bSYour Name 
qdf_dp_display_event_record(struct qdf_dp_trace_record_s * record,uint16_t index,uint8_t pdev_id,uint8_t info)2244*5113495bSYour Name void qdf_dp_display_event_record(struct qdf_dp_trace_record_s *record,
2245*5113495bSYour Name 			      uint16_t index, uint8_t pdev_id, uint8_t info)
2246*5113495bSYour Name {
2247*5113495bSYour Name 	char prepend_str[QDF_DP_TRACE_PREPEND_STR_SIZE];
2248*5113495bSYour Name 	struct qdf_dp_trace_event_buf *buf =
2249*5113495bSYour Name 		(struct qdf_dp_trace_event_buf *)record->data;
2250*5113495bSYour Name 
2251*5113495bSYour Name 	qdf_mem_zero(prepend_str, sizeof(prepend_str));
2252*5113495bSYour Name 	qdf_dp_trace_fill_meta_str(prepend_str, sizeof(prepend_str),
2253*5113495bSYour Name 				   index, info, record);
2254*5113495bSYour Name 
2255*5113495bSYour Name 	DPTRACE_PRINT("%s [%d] [%s %s]",
2256*5113495bSYour Name 		      prepend_str,
2257*5113495bSYour Name 		      buf->vdev_id,
2258*5113495bSYour Name 		      qdf_dp_type_to_str(buf->type),
2259*5113495bSYour Name 		      qdf_dp_subtype_to_str(buf->subtype));
2260*5113495bSYour Name }
2261*5113495bSYour Name qdf_export_symbol(qdf_dp_display_event_record);
2262*5113495bSYour Name 
qdf_dp_trace_record_event(enum QDF_DP_TRACE_ID code,uint8_t vdev_id,uint8_t pdev_id,enum qdf_proto_type type,enum qdf_proto_subtype subtype)2263*5113495bSYour Name void qdf_dp_trace_record_event(enum QDF_DP_TRACE_ID code, uint8_t vdev_id,
2264*5113495bSYour Name 			       uint8_t pdev_id, enum qdf_proto_type type,
2265*5113495bSYour Name 			       enum qdf_proto_subtype subtype)
2266*5113495bSYour Name {
2267*5113495bSYour Name 	struct qdf_dp_trace_event_buf buf;
2268*5113495bSYour Name 	int buf_size = sizeof(struct qdf_dp_trace_event_buf);
2269*5113495bSYour Name 
2270*5113495bSYour Name 	if (qdf_dp_enable_check(NULL, code, QDF_NA) == false)
2271*5113495bSYour Name 		return;
2272*5113495bSYour Name 
2273*5113495bSYour Name 	if (buf_size > QDF_DP_TRACE_RECORD_SIZE)
2274*5113495bSYour Name 		QDF_BUG(0);
2275*5113495bSYour Name 
2276*5113495bSYour Name 	buf.type = type;
2277*5113495bSYour Name 	buf.subtype = subtype;
2278*5113495bSYour Name 	buf.vdev_id = vdev_id;
2279*5113495bSYour Name 	qdf_dp_add_record(code, pdev_id,
2280*5113495bSYour Name 			  (uint8_t *)&buf, buf_size, NULL, 0, true);
2281*5113495bSYour Name }
2282*5113495bSYour Name qdf_export_symbol(qdf_dp_trace_record_event);
2283*5113495bSYour Name 
2284*5113495bSYour Name 
qdf_dp_display_proto_pkt(struct qdf_dp_trace_record_s * record,uint16_t index,uint8_t pdev_id,uint8_t info)2285*5113495bSYour Name void qdf_dp_display_proto_pkt(struct qdf_dp_trace_record_s *record,
2286*5113495bSYour Name 			      uint16_t index, uint8_t pdev_id, uint8_t info)
2287*5113495bSYour Name {
2288*5113495bSYour Name 	int loc;
2289*5113495bSYour Name 	char prepend_str[QDF_DP_TRACE_PREPEND_STR_SIZE];
2290*5113495bSYour Name 	struct qdf_dp_trace_proto_buf *buf =
2291*5113495bSYour Name 		(struct qdf_dp_trace_proto_buf *)record->data;
2292*5113495bSYour Name 
2293*5113495bSYour Name 	qdf_mem_zero(prepend_str, sizeof(prepend_str));
2294*5113495bSYour Name 	loc = qdf_dp_trace_fill_meta_str(prepend_str, sizeof(prepend_str),
2295*5113495bSYour Name 					 index, info, record);
2296*5113495bSYour Name 
2297*5113495bSYour Name 	if (QDF_RX == buf->dir)
2298*5113495bSYour Name 		DPTRACE_PRINT("%s [%d] [%d] [%s] SA: "
2299*5113495bSYour Name 			      QDF_MAC_ADDR_FMT " %s DA:"
2300*5113495bSYour Name 			      QDF_MAC_ADDR_FMT " proto priv data = %08x",
2301*5113495bSYour Name 			      prepend_str,
2302*5113495bSYour Name 			      buf->cmn_info.vdev_id,
2303*5113495bSYour Name 			      buf->cmn_info.mpdu_seq,
2304*5113495bSYour Name 			      qdf_dp_subtype_to_str(buf->cmn_info.subtype),
2305*5113495bSYour Name 			      QDF_MAC_ADDR_REF(buf->sa.bytes),
2306*5113495bSYour Name 			      qdf_dp_dir_to_str(buf->dir),
2307*5113495bSYour Name 			      QDF_MAC_ADDR_REF(buf->da.bytes),
2308*5113495bSYour Name 			      buf->cmn_info.proto_priv_data);
2309*5113495bSYour Name 	else
2310*5113495bSYour Name 		DPTRACE_PRINT("%s [%d] [%s] SA: "
2311*5113495bSYour Name 			      QDF_MAC_ADDR_FMT " %s DA:"
2312*5113495bSYour Name 			      QDF_MAC_ADDR_FMT " proto priv data = %08x",
2313*5113495bSYour Name 			      prepend_str,
2314*5113495bSYour Name 			      buf->cmn_info.vdev_id,
2315*5113495bSYour Name 			      qdf_dp_subtype_to_str(buf->cmn_info.subtype),
2316*5113495bSYour Name 			      QDF_MAC_ADDR_REF(buf->sa.bytes),
2317*5113495bSYour Name 			      qdf_dp_dir_to_str(buf->dir),
2318*5113495bSYour Name 			      QDF_MAC_ADDR_REF(buf->da.bytes),
2319*5113495bSYour Name 			      buf->cmn_info.proto_priv_data);
2320*5113495bSYour Name }
2321*5113495bSYour Name qdf_export_symbol(qdf_dp_display_proto_pkt);
2322*5113495bSYour Name 
qdf_dp_trace_proto_pkt(enum QDF_DP_TRACE_ID code,uint8_t * sa,uint8_t * da,enum qdf_proto_dir dir,uint8_t pdev_id,bool print,struct qdf_dp_trace_proto_cmn * cmn_info)2323*5113495bSYour Name void qdf_dp_trace_proto_pkt(enum QDF_DP_TRACE_ID code,
2324*5113495bSYour Name 			    uint8_t *sa, uint8_t *da,
2325*5113495bSYour Name 			    enum qdf_proto_dir dir,
2326*5113495bSYour Name 			    uint8_t pdev_id, bool print,
2327*5113495bSYour Name 			    struct qdf_dp_trace_proto_cmn *cmn_info)
2328*5113495bSYour Name {
2329*5113495bSYour Name 	struct qdf_dp_trace_proto_buf buf;
2330*5113495bSYour Name 	int buf_size = sizeof(struct qdf_dp_trace_proto_buf);
2331*5113495bSYour Name 
2332*5113495bSYour Name 	if (qdf_dp_enable_check(NULL, code, dir) == false)
2333*5113495bSYour Name 		return;
2334*5113495bSYour Name 
2335*5113495bSYour Name 	if (buf_size > QDF_DP_TRACE_RECORD_SIZE)
2336*5113495bSYour Name 		QDF_BUG(0);
2337*5113495bSYour Name 
2338*5113495bSYour Name 	memcpy(&buf.sa, sa, QDF_NET_ETH_LEN);
2339*5113495bSYour Name 	memcpy(&buf.da, da, QDF_NET_ETH_LEN);
2340*5113495bSYour Name 	memcpy(&buf.cmn_info, cmn_info, sizeof(*cmn_info));
2341*5113495bSYour Name 	buf.dir = dir;
2342*5113495bSYour Name 	qdf_dp_add_record(code, pdev_id,
2343*5113495bSYour Name 			  (uint8_t *)&buf, buf_size, NULL, 0, print);
2344*5113495bSYour Name }
2345*5113495bSYour Name qdf_export_symbol(qdf_dp_trace_proto_pkt);
2346*5113495bSYour Name 
qdf_dp_display_ptr_record(struct qdf_dp_trace_record_s * record,uint16_t index,uint8_t pdev_id,uint8_t info)2347*5113495bSYour Name void qdf_dp_display_ptr_record(struct qdf_dp_trace_record_s *record,
2348*5113495bSYour Name 				uint16_t index, uint8_t pdev_id, uint8_t info)
2349*5113495bSYour Name {
2350*5113495bSYour Name 	int loc;
2351*5113495bSYour Name 	char prepend_str[QDF_DP_TRACE_PREPEND_STR_SIZE];
2352*5113495bSYour Name 	struct qdf_dp_trace_ptr_buf *buf =
2353*5113495bSYour Name 		(struct qdf_dp_trace_ptr_buf *)record->data;
2354*5113495bSYour Name 	bool is_free_pkt_ptr_record = false;
2355*5113495bSYour Name 
2356*5113495bSYour Name 	if ((record->code == QDF_DP_TRACE_FREE_PACKET_PTR_RECORD) ||
2357*5113495bSYour Name 	    (record->code == QDF_DP_TRACE_LI_DP_FREE_PACKET_PTR_RECORD))
2358*5113495bSYour Name 		is_free_pkt_ptr_record = true;
2359*5113495bSYour Name 
2360*5113495bSYour Name 	qdf_mem_zero(prepend_str, sizeof(prepend_str));
2361*5113495bSYour Name 	loc = qdf_dp_trace_fill_meta_str(prepend_str, sizeof(prepend_str),
2362*5113495bSYour Name 					 index, info, record);
2363*5113495bSYour Name 
2364*5113495bSYour Name 	if (loc < sizeof(prepend_str))
2365*5113495bSYour Name 		scnprintf(&prepend_str[loc], sizeof(prepend_str) - loc,
2366*5113495bSYour Name 			  "[msdu id %d %s %d]",
2367*5113495bSYour Name 			  buf->msdu_id,
2368*5113495bSYour Name 			  is_free_pkt_ptr_record ? "status" : "vdev_id",
2369*5113495bSYour Name 			  buf->status);
2370*5113495bSYour Name 
2371*5113495bSYour Name 	if (info & QDF_DP_TRACE_RECORD_INFO_LIVE) {
2372*5113495bSYour Name 		/* In live mode donot dump the contents of the cookie */
2373*5113495bSYour Name 		DPTRACE_PRINT("%s", prepend_str);
2374*5113495bSYour Name 	} else {
2375*5113495bSYour Name 		dump_dp_hex_trace(prepend_str, (uint8_t *)&buf->cookie,
2376*5113495bSYour Name 			sizeof(buf->cookie));
2377*5113495bSYour Name 	}
2378*5113495bSYour Name }
2379*5113495bSYour Name qdf_export_symbol(qdf_dp_display_ptr_record);
2380*5113495bSYour Name 
2381*5113495bSYour Name static
qdf_dp_get_pkt_proto_type(qdf_nbuf_t nbuf)2382*5113495bSYour Name enum qdf_proto_type qdf_dp_get_pkt_proto_type(qdf_nbuf_t nbuf)
2383*5113495bSYour Name {
2384*5113495bSYour Name 	uint8_t pkt_type;
2385*5113495bSYour Name 
2386*5113495bSYour Name 	if (!nbuf)
2387*5113495bSYour Name 		return QDF_PROTO_TYPE_MAX;
2388*5113495bSYour Name 
2389*5113495bSYour Name 	if (qdf_nbuf_data_is_dns_query(nbuf) ||
2390*5113495bSYour Name 	    qdf_nbuf_data_is_dns_response(nbuf))
2391*5113495bSYour Name 		return QDF_PROTO_TYPE_DNS;
2392*5113495bSYour Name 
2393*5113495bSYour Name 	pkt_type = QDF_NBUF_CB_GET_PACKET_TYPE(nbuf);
2394*5113495bSYour Name 
2395*5113495bSYour Name 	switch (pkt_type) {
2396*5113495bSYour Name 	case QDF_NBUF_CB_PACKET_TYPE_EAPOL:
2397*5113495bSYour Name 		return QDF_PROTO_TYPE_EAPOL;
2398*5113495bSYour Name 	case QDF_NBUF_CB_PACKET_TYPE_ARP:
2399*5113495bSYour Name 		return QDF_PROTO_TYPE_ARP;
2400*5113495bSYour Name 	case QDF_NBUF_CB_PACKET_TYPE_DHCP:
2401*5113495bSYour Name 		return QDF_PROTO_TYPE_DHCP;
2402*5113495bSYour Name 	default:
2403*5113495bSYour Name 		return QDF_PROTO_TYPE_MAX;
2404*5113495bSYour Name 	}
2405*5113495bSYour Name }
2406*5113495bSYour Name 
2407*5113495bSYour Name static
qdf_dp_get_pkt_subtype(qdf_nbuf_t nbuf,enum qdf_proto_type pkt_type)2408*5113495bSYour Name enum qdf_proto_subtype qdf_dp_get_pkt_subtype(qdf_nbuf_t nbuf,
2409*5113495bSYour Name 					      enum qdf_proto_type pkt_type)
2410*5113495bSYour Name {
2411*5113495bSYour Name 	switch (pkt_type) {
2412*5113495bSYour Name 	case QDF_PROTO_TYPE_EAPOL:
2413*5113495bSYour Name 		return qdf_nbuf_get_eapol_subtype(nbuf);
2414*5113495bSYour Name 	case QDF_PROTO_TYPE_ARP:
2415*5113495bSYour Name 		return qdf_nbuf_get_arp_subtype(nbuf);
2416*5113495bSYour Name 	case QDF_PROTO_TYPE_DHCP:
2417*5113495bSYour Name 		return qdf_nbuf_get_dhcp_subtype(nbuf);
2418*5113495bSYour Name 	case QDF_PROTO_TYPE_DNS:
2419*5113495bSYour Name 		return (qdf_nbuf_data_is_dns_query(nbuf)) ?
2420*5113495bSYour Name 				QDF_PROTO_DNS_QUERY : QDF_PROTO_DNS_RES;
2421*5113495bSYour Name 	default:
2422*5113495bSYour Name 		return QDF_PROTO_INVALID;
2423*5113495bSYour Name 	}
2424*5113495bSYour Name }
2425*5113495bSYour Name 
2426*5113495bSYour Name static
qdf_dp_proto_log_enable_check(enum qdf_proto_type pkt_type,uint16_t status)2427*5113495bSYour Name bool qdf_dp_proto_log_enable_check(enum qdf_proto_type pkt_type,
2428*5113495bSYour Name 				   uint16_t status)
2429*5113495bSYour Name {
2430*5113495bSYour Name 	if (pkt_type == QDF_PROTO_TYPE_MAX)
2431*5113495bSYour Name 		return false;
2432*5113495bSYour Name 
2433*5113495bSYour Name 	switch (pkt_type) {
2434*5113495bSYour Name 	case QDF_PROTO_TYPE_EAPOL:
2435*5113495bSYour Name 		return qdf_dp_get_proto_event_bitmap() &
2436*5113495bSYour Name 				QDF_NBUF_PKT_TRAC_TYPE_EAPOL;
2437*5113495bSYour Name 	case QDF_PROTO_TYPE_DHCP:
2438*5113495bSYour Name 		return qdf_dp_get_proto_event_bitmap() &
2439*5113495bSYour Name 				QDF_NBUF_PKT_TRAC_TYPE_DHCP;
2440*5113495bSYour Name 	case QDF_PROTO_TYPE_ARP:
2441*5113495bSYour Name 		if (status == QDF_TX_RX_STATUS_OK)
2442*5113495bSYour Name 			return false;
2443*5113495bSYour Name 		else
2444*5113495bSYour Name 			return qdf_dp_get_proto_event_bitmap() &
2445*5113495bSYour Name 					QDF_NBUF_PKT_TRAC_TYPE_ARP;
2446*5113495bSYour Name 	case QDF_PROTO_TYPE_DNS:
2447*5113495bSYour Name 		if (status == QDF_TX_RX_STATUS_OK)
2448*5113495bSYour Name 			return false;
2449*5113495bSYour Name 		else
2450*5113495bSYour Name 			return qdf_dp_get_proto_event_bitmap() &
2451*5113495bSYour Name 					QDF_NBUF_PKT_TRAC_TYPE_DNS;
2452*5113495bSYour Name 	default:
2453*5113495bSYour Name 		return false;
2454*5113495bSYour Name 	}
2455*5113495bSYour Name }
2456*5113495bSYour Name 
qdf_dp_track_noack_check(qdf_nbuf_t nbuf,enum qdf_proto_subtype * subtype)2457*5113495bSYour Name void qdf_dp_track_noack_check(qdf_nbuf_t nbuf, enum qdf_proto_subtype *subtype)
2458*5113495bSYour Name {
2459*5113495bSYour Name 	enum qdf_proto_type pkt_type = qdf_dp_get_pkt_proto_type(nbuf);
2460*5113495bSYour Name 	uint16_t dp_track = 0;
2461*5113495bSYour Name 
2462*5113495bSYour Name 	switch (pkt_type) {
2463*5113495bSYour Name 	case QDF_PROTO_TYPE_EAPOL:
2464*5113495bSYour Name 		dp_track = qdf_dp_get_proto_bitmap() &
2465*5113495bSYour Name 				QDF_NBUF_PKT_TRAC_TYPE_EAPOL;
2466*5113495bSYour Name 		break;
2467*5113495bSYour Name 	case QDF_PROTO_TYPE_DHCP:
2468*5113495bSYour Name 		dp_track = qdf_dp_get_proto_bitmap() &
2469*5113495bSYour Name 				QDF_NBUF_PKT_TRAC_TYPE_DHCP;
2470*5113495bSYour Name 		break;
2471*5113495bSYour Name 	case QDF_PROTO_TYPE_ARP:
2472*5113495bSYour Name 		dp_track = qdf_dp_get_proto_bitmap() &
2473*5113495bSYour Name 					QDF_NBUF_PKT_TRAC_TYPE_ARP;
2474*5113495bSYour Name 		break;
2475*5113495bSYour Name 	case QDF_PROTO_TYPE_DNS:
2476*5113495bSYour Name 		dp_track = qdf_dp_get_proto_bitmap() &
2477*5113495bSYour Name 					QDF_NBUF_PKT_TRAC_TYPE_DNS;
2478*5113495bSYour Name 		break;
2479*5113495bSYour Name 	default:
2480*5113495bSYour Name 		break;
2481*5113495bSYour Name 	}
2482*5113495bSYour Name 
2483*5113495bSYour Name 	if (!dp_track) {
2484*5113495bSYour Name 		*subtype = QDF_PROTO_INVALID;
2485*5113495bSYour Name 		return;
2486*5113495bSYour Name 	}
2487*5113495bSYour Name 
2488*5113495bSYour Name 	*subtype = qdf_dp_get_pkt_subtype(nbuf, pkt_type);
2489*5113495bSYour Name }
2490*5113495bSYour Name qdf_export_symbol(qdf_dp_track_noack_check);
2491*5113495bSYour Name 
qdf_dp_get_status_from_a_status(uint8_t status)2492*5113495bSYour Name enum qdf_dp_tx_rx_status qdf_dp_get_status_from_a_status(uint8_t status)
2493*5113495bSYour Name {
2494*5113495bSYour Name 	if (status == QDF_A_STATUS_ERROR)
2495*5113495bSYour Name 		return QDF_TX_RX_STATUS_INVALID;
2496*5113495bSYour Name 	else if (status == QDF_A_STATUS_OK)
2497*5113495bSYour Name 		return QDF_TX_RX_STATUS_OK;
2498*5113495bSYour Name 	else
2499*5113495bSYour Name 		return QDF_TX_RX_STATUS_MAX;
2500*5113495bSYour Name }
2501*5113495bSYour Name qdf_export_symbol(qdf_dp_get_status_from_a_status);
2502*5113495bSYour Name 
qdf_dp_trace_ptr(qdf_nbuf_t nbuf,enum QDF_DP_TRACE_ID code,uint8_t pdev_id,uint8_t * data,uint8_t size,uint16_t msdu_id,uint16_t buf_arg_status,enum qdf_dp_tx_rx_status qdf_tx_status,enum QDF_OPMODE op_mode)2503*5113495bSYour Name void qdf_dp_trace_ptr(qdf_nbuf_t nbuf, enum QDF_DP_TRACE_ID code,
2504*5113495bSYour Name 		uint8_t pdev_id, uint8_t *data, uint8_t size,
2505*5113495bSYour Name 		uint16_t msdu_id, uint16_t buf_arg_status,
2506*5113495bSYour Name 		enum qdf_dp_tx_rx_status qdf_tx_status,
2507*5113495bSYour Name 		enum QDF_OPMODE op_mode)
2508*5113495bSYour Name {
2509*5113495bSYour Name 	struct qdf_dp_trace_ptr_buf buf;
2510*5113495bSYour Name 	int buf_size = sizeof(struct qdf_dp_trace_ptr_buf);
2511*5113495bSYour Name 	enum qdf_proto_type pkt_type;
2512*5113495bSYour Name 	enum qdf_proto_subtype subtype;
2513*5113495bSYour Name 
2514*5113495bSYour Name 	pkt_type = qdf_dp_get_pkt_proto_type(nbuf);
2515*5113495bSYour Name 	if ((code == QDF_DP_TRACE_FREE_PACKET_PTR_RECORD ||
2516*5113495bSYour Name 	     code == QDF_DP_TRACE_LI_DP_FREE_PACKET_PTR_RECORD) &&
2517*5113495bSYour Name 	    qdf_dp_proto_log_enable_check(pkt_type, qdf_tx_status)) {
2518*5113495bSYour Name 		subtype = qdf_dp_get_pkt_subtype(nbuf, pkt_type);
2519*5113495bSYour Name 		qdf_dp_log_proto_pkt_info(nbuf->data + QDF_NBUF_SRC_MAC_OFFSET,
2520*5113495bSYour Name 					 nbuf->data + QDF_NBUF_DEST_MAC_OFFSET,
2521*5113495bSYour Name 					 pkt_type, subtype,
2522*5113495bSYour Name 					 QDF_TX, msdu_id, qdf_tx_status);
2523*5113495bSYour Name 		qdf_fill_wlan_connectivity_log(pkt_type, subtype,
2524*5113495bSYour Name 					       QDF_TX, qdf_tx_status, op_mode,
2525*5113495bSYour Name 					       QDF_NBUF_CB_TX_VDEV_CTX(nbuf),
2526*5113495bSYour Name 					       nbuf->data,
2527*5113495bSYour Name 					       qdf_nbuf_tx_get_band(nbuf));
2528*5113495bSYour Name 		qdf_log_pkt_cstats(nbuf->data + QDF_NBUF_SRC_MAC_OFFSET,
2529*5113495bSYour Name 				   nbuf->data + QDF_NBUF_DEST_MAC_OFFSET,
2530*5113495bSYour Name 				   pkt_type, subtype, QDF_TX,
2531*5113495bSYour Name 				   qdf_tx_status, QDF_NBUF_CB_TX_VDEV_CTX(nbuf),
2532*5113495bSYour Name 				   op_mode);
2533*5113495bSYour Name 	}
2534*5113495bSYour Name 
2535*5113495bSYour Name 	if (qdf_dp_enable_check(nbuf, code, QDF_TX) == false)
2536*5113495bSYour Name 		return;
2537*5113495bSYour Name 
2538*5113495bSYour Name 	if (buf_size > QDF_DP_TRACE_RECORD_SIZE)
2539*5113495bSYour Name 		QDF_BUG(0);
2540*5113495bSYour Name 
2541*5113495bSYour Name 	qdf_mem_copy(&buf.cookie, data, size);
2542*5113495bSYour Name 	buf.msdu_id = msdu_id;
2543*5113495bSYour Name 	buf.status = buf_arg_status;
2544*5113495bSYour Name 	qdf_dp_add_record(code, pdev_id, (uint8_t *)&buf, buf_size, NULL, 0,
2545*5113495bSYour Name 			  QDF_NBUF_CB_DP_TRACE_PRINT(nbuf));
2546*5113495bSYour Name }
2547*5113495bSYour Name qdf_export_symbol(qdf_dp_trace_ptr);
2548*5113495bSYour Name 
qdf_dp_trace_data_pkt(qdf_nbuf_t nbuf,uint8_t pdev_id,enum QDF_DP_TRACE_ID code,uint16_t msdu_id,enum qdf_proto_dir dir)2549*5113495bSYour Name void qdf_dp_trace_data_pkt(qdf_nbuf_t nbuf, uint8_t pdev_id,
2550*5113495bSYour Name 			   enum QDF_DP_TRACE_ID code, uint16_t msdu_id,
2551*5113495bSYour Name 			   enum qdf_proto_dir dir)
2552*5113495bSYour Name {
2553*5113495bSYour Name 	struct qdf_dp_trace_data_buf buf;
2554*5113495bSYour Name 	enum qdf_proto_type pkt_type;
2555*5113495bSYour Name 
2556*5113495bSYour Name 	pkt_type = qdf_dp_get_pkt_proto_type(nbuf);
2557*5113495bSYour Name 	if (code == QDF_DP_TRACE_DROP_PACKET_RECORD &&
2558*5113495bSYour Name 	    qdf_dp_proto_log_enable_check(pkt_type, QDF_TX_RX_STATUS_DROP))
2559*5113495bSYour Name 		qdf_dp_log_proto_pkt_info(nbuf->data + QDF_NBUF_SRC_MAC_OFFSET,
2560*5113495bSYour Name 					 nbuf->data + QDF_NBUF_DEST_MAC_OFFSET,
2561*5113495bSYour Name 					 pkt_type,
2562*5113495bSYour Name 					 qdf_dp_get_pkt_subtype(nbuf, pkt_type),
2563*5113495bSYour Name 					 QDF_TX, msdu_id,
2564*5113495bSYour Name 					 QDF_TX_RX_STATUS_DROP);
2565*5113495bSYour Name 
2566*5113495bSYour Name 	buf.msdu_id = msdu_id;
2567*5113495bSYour Name 	if (!qdf_dp_enable_check(nbuf, code, dir))
2568*5113495bSYour Name 		return;
2569*5113495bSYour Name 
2570*5113495bSYour Name 	qdf_dp_add_record(code, pdev_id,
2571*5113495bSYour Name 			  nbuf ? qdf_nbuf_data(nbuf) : NULL,
2572*5113495bSYour Name 			  nbuf ? nbuf->len - nbuf->data_len : 0,
2573*5113495bSYour Name 			  (uint8_t *)&buf, sizeof(struct qdf_dp_trace_data_buf),
2574*5113495bSYour Name 			  (nbuf) ? QDF_NBUF_CB_DP_TRACE_PRINT(nbuf) : false);
2575*5113495bSYour Name }
2576*5113495bSYour Name 
2577*5113495bSYour Name qdf_export_symbol(qdf_dp_trace_data_pkt);
2578*5113495bSYour Name 
qdf_dp_display_record(struct qdf_dp_trace_record_s * record,uint16_t index,uint8_t pdev_id,uint8_t info)2579*5113495bSYour Name void qdf_dp_display_record(struct qdf_dp_trace_record_s *record,
2580*5113495bSYour Name 			   uint16_t index, uint8_t pdev_id, uint8_t info)
2581*5113495bSYour Name {
2582*5113495bSYour Name 	int loc;
2583*5113495bSYour Name 	char prepend_str[QDF_DP_TRACE_PREPEND_STR_SIZE];
2584*5113495bSYour Name 
2585*5113495bSYour Name 	if (!(pdev_id == QDF_TRACE_DEFAULT_PDEV_ID ||
2586*5113495bSYour Name 		pdev_id == record->pdev_id))
2587*5113495bSYour Name 		return;
2588*5113495bSYour Name 
2589*5113495bSYour Name 	qdf_mem_zero(prepend_str, sizeof(prepend_str));
2590*5113495bSYour Name 	loc = qdf_dp_trace_fill_meta_str(prepend_str, sizeof(prepend_str),
2591*5113495bSYour Name 					 index, info, record);
2592*5113495bSYour Name 
2593*5113495bSYour Name 	switch (record->code) {
2594*5113495bSYour Name 	case  QDF_DP_TRACE_HDD_TX_TIMEOUT:
2595*5113495bSYour Name 		DPTRACE_PRINT(" %s: HDD TX Timeout", prepend_str);
2596*5113495bSYour Name 		break;
2597*5113495bSYour Name 	case  QDF_DP_TRACE_HDD_SOFTAP_TX_TIMEOUT:
2598*5113495bSYour Name 		DPTRACE_PRINT(" %s: HDD SoftAP TX Timeout", prepend_str);
2599*5113495bSYour Name 		break;
2600*5113495bSYour Name 	case  QDF_DP_TRACE_CE_FAST_PACKET_ERR_RECORD:
2601*5113495bSYour Name 		DPTRACE_PRINT(" %s: CE Fast Packet Error", prepend_str);
2602*5113495bSYour Name 		break;
2603*5113495bSYour Name 	case QDF_DP_TRACE_LI_DP_NULL_RX_PACKET_RECORD:
2604*5113495bSYour Name 	default:
2605*5113495bSYour Name 		dump_dp_hex_trace(prepend_str, record->data, record->size);
2606*5113495bSYour Name 		break;
2607*5113495bSYour Name 	};
2608*5113495bSYour Name }
2609*5113495bSYour Name qdf_export_symbol(qdf_dp_display_record);
2610*5113495bSYour Name 
2611*5113495bSYour Name void
qdf_dp_display_data_pkt_record(struct qdf_dp_trace_record_s * record,uint16_t rec_index,uint8_t pdev_id,uint8_t info)2612*5113495bSYour Name qdf_dp_display_data_pkt_record(struct qdf_dp_trace_record_s *record,
2613*5113495bSYour Name 			       uint16_t rec_index, uint8_t pdev_id,
2614*5113495bSYour Name 			       uint8_t info)
2615*5113495bSYour Name {
2616*5113495bSYour Name 	int loc;
2617*5113495bSYour Name 	char prepend_str[DP_TRACE_META_DATA_STRLEN + 10];
2618*5113495bSYour Name 	struct qdf_dp_trace_data_buf *buf =
2619*5113495bSYour Name 		(struct qdf_dp_trace_data_buf *)record->data;
2620*5113495bSYour Name 
2621*5113495bSYour Name 	qdf_mem_zero(prepend_str, sizeof(prepend_str));
2622*5113495bSYour Name 
2623*5113495bSYour Name 	loc = qdf_dp_trace_fill_meta_str(prepend_str, sizeof(prepend_str),
2624*5113495bSYour Name 					 rec_index, info, record);
2625*5113495bSYour Name 	if (loc < sizeof(prepend_str))
2626*5113495bSYour Name 		loc += snprintf(&prepend_str[loc], sizeof(prepend_str) - loc,
2627*5113495bSYour Name 				"[%d]", buf->msdu_id);
2628*5113495bSYour Name 	dump_dp_hex_trace(prepend_str,
2629*5113495bSYour Name 			  &record->data[sizeof(struct qdf_dp_trace_data_buf)],
2630*5113495bSYour Name 			  record->size);
2631*5113495bSYour Name }
2632*5113495bSYour Name 
qdf_dp_trace(qdf_nbuf_t nbuf,enum QDF_DP_TRACE_ID code,uint8_t pdev_id,uint8_t * data,uint8_t size,enum qdf_proto_dir dir)2633*5113495bSYour Name void qdf_dp_trace(qdf_nbuf_t nbuf, enum QDF_DP_TRACE_ID code, uint8_t pdev_id,
2634*5113495bSYour Name 	uint8_t *data, uint8_t size, enum qdf_proto_dir dir)
2635*5113495bSYour Name {
2636*5113495bSYour Name 
2637*5113495bSYour Name 	if (qdf_dp_enable_check(nbuf, code, dir) == false)
2638*5113495bSYour Name 		return;
2639*5113495bSYour Name 
2640*5113495bSYour Name 	qdf_dp_add_record(code, pdev_id, nbuf ? qdf_nbuf_data(nbuf) : NULL,
2641*5113495bSYour Name 			  size, NULL, 0,
2642*5113495bSYour Name 			  (nbuf) ? QDF_NBUF_CB_DP_TRACE_PRINT(nbuf) : false);
2643*5113495bSYour Name }
2644*5113495bSYour Name qdf_export_symbol(qdf_dp_trace);
2645*5113495bSYour Name 
qdf_dp_trace_spin_lock_init(void)2646*5113495bSYour Name void qdf_dp_trace_spin_lock_init(void)
2647*5113495bSYour Name {
2648*5113495bSYour Name 	spin_lock_init(&l_dp_trace_lock);
2649*5113495bSYour Name }
2650*5113495bSYour Name qdf_export_symbol(qdf_dp_trace_spin_lock_init);
2651*5113495bSYour Name 
qdf_dp_trace_disable_live_mode(void)2652*5113495bSYour Name void qdf_dp_trace_disable_live_mode(void)
2653*5113495bSYour Name {
2654*5113495bSYour Name 	g_qdf_dp_trace_data.force_live_mode = 0;
2655*5113495bSYour Name }
2656*5113495bSYour Name qdf_export_symbol(qdf_dp_trace_disable_live_mode);
2657*5113495bSYour Name 
qdf_dp_trace_enable_live_mode(void)2658*5113495bSYour Name void qdf_dp_trace_enable_live_mode(void)
2659*5113495bSYour Name {
2660*5113495bSYour Name 	g_qdf_dp_trace_data.force_live_mode = 1;
2661*5113495bSYour Name }
2662*5113495bSYour Name qdf_export_symbol(qdf_dp_trace_enable_live_mode);
2663*5113495bSYour Name 
qdf_dp_trace_clear_buffer(void)2664*5113495bSYour Name void qdf_dp_trace_clear_buffer(void)
2665*5113495bSYour Name {
2666*5113495bSYour Name 	g_qdf_dp_trace_data.head = INVALID_QDF_DP_TRACE_ADDR;
2667*5113495bSYour Name 	g_qdf_dp_trace_data.tail = INVALID_QDF_DP_TRACE_ADDR;
2668*5113495bSYour Name 	g_qdf_dp_trace_data.num = 0;
2669*5113495bSYour Name 	g_qdf_dp_trace_data.dump_counter = 0;
2670*5113495bSYour Name 	g_qdf_dp_trace_data.num_records_to_dump = MAX_QDF_DP_TRACE_RECORDS;
2671*5113495bSYour Name 	if (g_qdf_dp_trace_data.enable)
2672*5113495bSYour Name 		memset(g_qdf_dp_trace_tbl, 0,
2673*5113495bSYour Name 		       MAX_QDF_DP_TRACE_RECORDS *
2674*5113495bSYour Name 		       sizeof(struct qdf_dp_trace_record_s));
2675*5113495bSYour Name }
2676*5113495bSYour Name qdf_export_symbol(qdf_dp_trace_clear_buffer);
2677*5113495bSYour Name 
qdf_dp_trace_dump_stats(void)2678*5113495bSYour Name void qdf_dp_trace_dump_stats(void)
2679*5113495bSYour Name {
2680*5113495bSYour Name 		DPTRACE_PRINT("STATS |DPT: tx %u rx %u icmp(%u %u) arp(%u %u) icmpv6(%u %u %u %u %u %u) dhcp(%u %u %u %u %u %u) eapol(%u %u %u %u %u)",
2681*5113495bSYour Name 			      g_qdf_dp_trace_data.tx_count,
2682*5113495bSYour Name 			      g_qdf_dp_trace_data.rx_count,
2683*5113495bSYour Name 			      g_qdf_dp_trace_data.icmp_req,
2684*5113495bSYour Name 			      g_qdf_dp_trace_data.icmp_resp,
2685*5113495bSYour Name 			      g_qdf_dp_trace_data.arp_req,
2686*5113495bSYour Name 			      g_qdf_dp_trace_data.arp_resp,
2687*5113495bSYour Name 			      g_qdf_dp_trace_data.icmpv6_req,
2688*5113495bSYour Name 			      g_qdf_dp_trace_data.icmpv6_resp,
2689*5113495bSYour Name 			      g_qdf_dp_trace_data.icmpv6_ns,
2690*5113495bSYour Name 			      g_qdf_dp_trace_data.icmpv6_na,
2691*5113495bSYour Name 			      g_qdf_dp_trace_data.icmpv6_rs,
2692*5113495bSYour Name 			      g_qdf_dp_trace_data.icmpv6_ra,
2693*5113495bSYour Name 			      g_qdf_dp_trace_data.dhcp_disc,
2694*5113495bSYour Name 			      g_qdf_dp_trace_data.dhcp_off,
2695*5113495bSYour Name 			      g_qdf_dp_trace_data.dhcp_req,
2696*5113495bSYour Name 			      g_qdf_dp_trace_data.dhcp_ack,
2697*5113495bSYour Name 			      g_qdf_dp_trace_data.dhcp_nack,
2698*5113495bSYour Name 			      g_qdf_dp_trace_data.dhcp_others,
2699*5113495bSYour Name 			      g_qdf_dp_trace_data.eapol_m1,
2700*5113495bSYour Name 			      g_qdf_dp_trace_data.eapol_m2,
2701*5113495bSYour Name 			      g_qdf_dp_trace_data.eapol_m3,
2702*5113495bSYour Name 			      g_qdf_dp_trace_data.eapol_m4,
2703*5113495bSYour Name 			      g_qdf_dp_trace_data.eapol_others);
2704*5113495bSYour Name }
2705*5113495bSYour Name qdf_export_symbol(qdf_dp_trace_dump_stats);
2706*5113495bSYour Name 
2707*5113495bSYour Name /**
2708*5113495bSYour Name  * qdf_dpt_dump_hex_trace_debugfs() - read data in file
2709*5113495bSYour Name  * @file: file to read
2710*5113495bSYour Name  * @str: string to prepend the hexdump with.
2711*5113495bSYour Name  * @buf: buffer which contains data to be written
2712*5113495bSYour Name  * @buf_len: defines the size of the data to be written
2713*5113495bSYour Name  *
2714*5113495bSYour Name  * Return: None
2715*5113495bSYour Name  */
qdf_dpt_dump_hex_trace_debugfs(qdf_debugfs_file_t file,char * str,uint8_t * buf,uint8_t buf_len)2716*5113495bSYour Name static void qdf_dpt_dump_hex_trace_debugfs(qdf_debugfs_file_t file,
2717*5113495bSYour Name 				char *str, uint8_t *buf, uint8_t buf_len)
2718*5113495bSYour Name {
2719*5113495bSYour Name 	unsigned char linebuf[BUFFER_SIZE];
2720*5113495bSYour Name 	const u8 *ptr = buf;
2721*5113495bSYour Name 	int i, linelen, remaining = buf_len;
2722*5113495bSYour Name 
2723*5113495bSYour Name 	/* Dump the bytes in the last line */
2724*5113495bSYour Name 	for (i = 0; i < buf_len; i += ROW_SIZE) {
2725*5113495bSYour Name 		linelen = min(remaining, ROW_SIZE);
2726*5113495bSYour Name 		remaining -= ROW_SIZE;
2727*5113495bSYour Name 
2728*5113495bSYour Name 		hex_dump_to_buffer(ptr + i, linelen, ROW_SIZE, 1,
2729*5113495bSYour Name 				linebuf, sizeof(linebuf), false);
2730*5113495bSYour Name 
2731*5113495bSYour Name 		qdf_debugfs_printf(file, "%s %s\n", str, linebuf);
2732*5113495bSYour Name 	}
2733*5113495bSYour Name }
2734*5113495bSYour Name 
2735*5113495bSYour Name /**
2736*5113495bSYour Name  * qdf_dpt_display_proto_pkt_debugfs() - display proto packet
2737*5113495bSYour Name  * @file: file to read
2738*5113495bSYour Name  * @record: dptrace record
2739*5113495bSYour Name  * @index: index
2740*5113495bSYour Name  *
2741*5113495bSYour Name  * Return: none
2742*5113495bSYour Name  */
qdf_dpt_display_proto_pkt_debugfs(qdf_debugfs_file_t file,struct qdf_dp_trace_record_s * record,uint32_t index)2743*5113495bSYour Name static void qdf_dpt_display_proto_pkt_debugfs(qdf_debugfs_file_t file,
2744*5113495bSYour Name 				struct qdf_dp_trace_record_s *record,
2745*5113495bSYour Name 				uint32_t index)
2746*5113495bSYour Name {
2747*5113495bSYour Name 	int loc;
2748*5113495bSYour Name 	char prepend_str[QDF_DP_TRACE_PREPEND_STR_SIZE];
2749*5113495bSYour Name 	struct qdf_dp_trace_proto_buf *buf =
2750*5113495bSYour Name 		(struct qdf_dp_trace_proto_buf *)record->data;
2751*5113495bSYour Name 
2752*5113495bSYour Name 	loc = qdf_dp_trace_fill_meta_str(prepend_str, sizeof(prepend_str),
2753*5113495bSYour Name 					 index, 0, record);
2754*5113495bSYour Name 	qdf_debugfs_printf(file, "%s [%d] [%s] SA: "
2755*5113495bSYour Name 			   QDF_MAC_ADDR_FMT " %s DA: "
2756*5113495bSYour Name 			   QDF_MAC_ADDR_FMT,
2757*5113495bSYour Name 			   prepend_str,
2758*5113495bSYour Name 			   buf->cmn_info.vdev_id,
2759*5113495bSYour Name 			   qdf_dp_subtype_to_str(buf->cmn_info.subtype),
2760*5113495bSYour Name 			   QDF_MAC_ADDR_REF(buf->sa.bytes),
2761*5113495bSYour Name 			   qdf_dp_dir_to_str(buf->dir),
2762*5113495bSYour Name 			   QDF_MAC_ADDR_REF(buf->da.bytes));
2763*5113495bSYour Name 	qdf_debugfs_printf(file, "\n");
2764*5113495bSYour Name }
2765*5113495bSYour Name 
2766*5113495bSYour Name /**
2767*5113495bSYour Name  * qdf_dpt_display_mgmt_pkt_debugfs() - display mgmt packet
2768*5113495bSYour Name  * @file: file to read
2769*5113495bSYour Name  * @record: dptrace record
2770*5113495bSYour Name  * @index: index
2771*5113495bSYour Name  *
2772*5113495bSYour Name  * Return: none
2773*5113495bSYour Name  */
qdf_dpt_display_mgmt_pkt_debugfs(qdf_debugfs_file_t file,struct qdf_dp_trace_record_s * record,uint32_t index)2774*5113495bSYour Name static void qdf_dpt_display_mgmt_pkt_debugfs(qdf_debugfs_file_t file,
2775*5113495bSYour Name 				struct qdf_dp_trace_record_s *record,
2776*5113495bSYour Name 				uint32_t index)
2777*5113495bSYour Name {
2778*5113495bSYour Name 
2779*5113495bSYour Name 	int loc;
2780*5113495bSYour Name 	char prepend_str[QDF_DP_TRACE_PREPEND_STR_SIZE];
2781*5113495bSYour Name 	struct qdf_dp_trace_mgmt_buf *buf =
2782*5113495bSYour Name 		(struct qdf_dp_trace_mgmt_buf *)record->data;
2783*5113495bSYour Name 
2784*5113495bSYour Name 	loc = qdf_dp_trace_fill_meta_str(prepend_str, sizeof(prepend_str),
2785*5113495bSYour Name 					 index, 0, record);
2786*5113495bSYour Name 
2787*5113495bSYour Name 	qdf_debugfs_printf(file, "%s [%d] [%s %s]\n",
2788*5113495bSYour Name 			   prepend_str,
2789*5113495bSYour Name 			   buf->vdev_id,
2790*5113495bSYour Name 			   qdf_dp_type_to_str(buf->type),
2791*5113495bSYour Name 			   qdf_dp_subtype_to_str(buf->subtype));
2792*5113495bSYour Name }
2793*5113495bSYour Name 
2794*5113495bSYour Name /**
2795*5113495bSYour Name  * qdf_dpt_display_event_record_debugfs() - display event records
2796*5113495bSYour Name  * @file: file to read
2797*5113495bSYour Name  * @record: dptrace record
2798*5113495bSYour Name  * @index: index
2799*5113495bSYour Name  *
2800*5113495bSYour Name  * Return: none
2801*5113495bSYour Name  */
qdf_dpt_display_event_record_debugfs(qdf_debugfs_file_t file,struct qdf_dp_trace_record_s * record,uint32_t index)2802*5113495bSYour Name static void qdf_dpt_display_event_record_debugfs(qdf_debugfs_file_t file,
2803*5113495bSYour Name 				struct qdf_dp_trace_record_s *record,
2804*5113495bSYour Name 				uint32_t index)
2805*5113495bSYour Name {
2806*5113495bSYour Name 	char prepend_str[QDF_DP_TRACE_PREPEND_STR_SIZE];
2807*5113495bSYour Name 	struct qdf_dp_trace_event_buf *buf =
2808*5113495bSYour Name 		(struct qdf_dp_trace_event_buf *)record->data;
2809*5113495bSYour Name 
2810*5113495bSYour Name 	qdf_dp_trace_fill_meta_str(prepend_str, sizeof(prepend_str),
2811*5113495bSYour Name 				   index, 0, record);
2812*5113495bSYour Name 	qdf_debugfs_printf(file, "%s [%d] [%s %s]\n",
2813*5113495bSYour Name 			   prepend_str,
2814*5113495bSYour Name 			   buf->vdev_id,
2815*5113495bSYour Name 			   qdf_dp_type_to_str(buf->type),
2816*5113495bSYour Name 			   qdf_dp_subtype_to_str(buf->subtype));
2817*5113495bSYour Name }
2818*5113495bSYour Name 
2819*5113495bSYour Name /**
2820*5113495bSYour Name  * qdf_dpt_display_ptr_record_debugfs() - display record ptr
2821*5113495bSYour Name  * @file: file to read
2822*5113495bSYour Name  * @record: dptrace record
2823*5113495bSYour Name  * @index: index
2824*5113495bSYour Name  *
2825*5113495bSYour Name  * Return: none
2826*5113495bSYour Name  */
qdf_dpt_display_ptr_record_debugfs(qdf_debugfs_file_t file,struct qdf_dp_trace_record_s * record,uint32_t index)2827*5113495bSYour Name static void qdf_dpt_display_ptr_record_debugfs(qdf_debugfs_file_t file,
2828*5113495bSYour Name 				struct qdf_dp_trace_record_s *record,
2829*5113495bSYour Name 				uint32_t index)
2830*5113495bSYour Name {
2831*5113495bSYour Name 	char prepend_str[QDF_DP_TRACE_PREPEND_STR_SIZE];
2832*5113495bSYour Name 	int loc;
2833*5113495bSYour Name 	struct qdf_dp_trace_ptr_buf *buf =
2834*5113495bSYour Name 		(struct qdf_dp_trace_ptr_buf *)record->data;
2835*5113495bSYour Name 	loc = qdf_dp_trace_fill_meta_str(prepend_str, sizeof(prepend_str),
2836*5113495bSYour Name 					 index, 0, record);
2837*5113495bSYour Name 
2838*5113495bSYour Name 	if (loc < sizeof(prepend_str))
2839*5113495bSYour Name 		scnprintf(&prepend_str[loc], sizeof(prepend_str) - loc,
2840*5113495bSYour Name 			  "[msdu id %d %s %d]",
2841*5113495bSYour Name 			  buf->msdu_id,
2842*5113495bSYour Name 			  (record->code ==
2843*5113495bSYour Name 				QDF_DP_TRACE_FREE_PACKET_PTR_RECORD) ?
2844*5113495bSYour Name 			  "status" : "vdev_id",
2845*5113495bSYour Name 			  buf->status);
2846*5113495bSYour Name 
2847*5113495bSYour Name 	qdf_dpt_dump_hex_trace_debugfs(file, prepend_str,
2848*5113495bSYour Name 				       (uint8_t *)&buf->cookie,
2849*5113495bSYour Name 				       sizeof(buf->cookie));
2850*5113495bSYour Name }
2851*5113495bSYour Name 
2852*5113495bSYour Name /**
2853*5113495bSYour Name  * qdf_dpt_display_record_debugfs() - display record
2854*5113495bSYour Name  * @file: file to read
2855*5113495bSYour Name  * @record: dptrace record
2856*5113495bSYour Name  * @index: index
2857*5113495bSYour Name  *
2858*5113495bSYour Name  * Return: none
2859*5113495bSYour Name  */
qdf_dpt_display_record_debugfs(qdf_debugfs_file_t file,struct qdf_dp_trace_record_s * record,uint32_t index)2860*5113495bSYour Name static void qdf_dpt_display_record_debugfs(qdf_debugfs_file_t file,
2861*5113495bSYour Name 				struct qdf_dp_trace_record_s *record,
2862*5113495bSYour Name 				uint32_t index)
2863*5113495bSYour Name {
2864*5113495bSYour Name 	int loc;
2865*5113495bSYour Name 	char prepend_str[QDF_DP_TRACE_PREPEND_STR_SIZE];
2866*5113495bSYour Name 	struct qdf_dp_trace_data_buf *buf =
2867*5113495bSYour Name 		(struct qdf_dp_trace_data_buf *)record->data;
2868*5113495bSYour Name 
2869*5113495bSYour Name 	loc = qdf_dp_trace_fill_meta_str(prepend_str, sizeof(prepend_str),
2870*5113495bSYour Name 					 index, 0, record);
2871*5113495bSYour Name 	if (loc < sizeof(prepend_str))
2872*5113495bSYour Name 		loc += snprintf(&prepend_str[loc], sizeof(prepend_str) - loc,
2873*5113495bSYour Name 				"[%d]", buf->msdu_id);
2874*5113495bSYour Name 	qdf_dpt_dump_hex_trace_debugfs(file, prepend_str,
2875*5113495bSYour Name 				       record->data, record->size);
2876*5113495bSYour Name }
2877*5113495bSYour Name 
qdf_dpt_get_curr_pos_debugfs(qdf_debugfs_file_t file,enum qdf_dpt_debugfs_state state)2878*5113495bSYour Name uint32_t qdf_dpt_get_curr_pos_debugfs(qdf_debugfs_file_t file,
2879*5113495bSYour Name 				      enum qdf_dpt_debugfs_state state)
2880*5113495bSYour Name {
2881*5113495bSYour Name 	uint32_t i = 0;
2882*5113495bSYour Name 	uint32_t tail;
2883*5113495bSYour Name 	uint32_t count = g_qdf_dp_trace_data.num;
2884*5113495bSYour Name 
2885*5113495bSYour Name 	if (!g_qdf_dp_trace_data.enable) {
2886*5113495bSYour Name 		QDF_TRACE(QDF_MODULE_ID_QDF, QDF_TRACE_LEVEL_DEBUG,
2887*5113495bSYour Name 		  "%s: Tracing Disabled", __func__);
2888*5113495bSYour Name 		return QDF_STATUS_E_EMPTY;
2889*5113495bSYour Name 	}
2890*5113495bSYour Name 
2891*5113495bSYour Name 	if (!count) {
2892*5113495bSYour Name 		QDF_TRACE(QDF_MODULE_ID_QDF, QDF_TRACE_LEVEL_DEBUG,
2893*5113495bSYour Name 		  "%s: no packets", __func__);
2894*5113495bSYour Name 		return QDF_STATUS_E_EMPTY;
2895*5113495bSYour Name 	}
2896*5113495bSYour Name 
2897*5113495bSYour Name 	if (state == QDF_DPT_DEBUGFS_STATE_SHOW_IN_PROGRESS)
2898*5113495bSYour Name 		return g_qdf_dp_trace_data.curr_pos;
2899*5113495bSYour Name 
2900*5113495bSYour Name 	qdf_debugfs_printf(file,
2901*5113495bSYour Name 		"DPT: config - bitmap 0x%x verb %u #rec %u rec_requested %u live_config %u thresh %u time_limit %u\n",
2902*5113495bSYour Name 		g_qdf_dp_trace_data.proto_bitmap,
2903*5113495bSYour Name 		g_qdf_dp_trace_data.verbosity,
2904*5113495bSYour Name 		g_qdf_dp_trace_data.no_of_record,
2905*5113495bSYour Name 		g_qdf_dp_trace_data.num_records_to_dump,
2906*5113495bSYour Name 		g_qdf_dp_trace_data.live_mode_config,
2907*5113495bSYour Name 		g_qdf_dp_trace_data.high_tput_thresh,
2908*5113495bSYour Name 		g_qdf_dp_trace_data.thresh_time_limit);
2909*5113495bSYour Name 
2910*5113495bSYour Name 	qdf_debugfs_printf(file,
2911*5113495bSYour Name 		"STATS |DPT: icmp(%u %u) arp(%u %u) icmpv6(%u %u %u %u %u %u) dhcp(%u %u %u %u %u %u) eapol(%u %u %u %u %u)\n",
2912*5113495bSYour Name 		g_qdf_dp_trace_data.icmp_req,
2913*5113495bSYour Name 		g_qdf_dp_trace_data.icmp_resp,
2914*5113495bSYour Name 		g_qdf_dp_trace_data.arp_req,
2915*5113495bSYour Name 		g_qdf_dp_trace_data.arp_resp,
2916*5113495bSYour Name 		g_qdf_dp_trace_data.icmpv6_req,
2917*5113495bSYour Name 		g_qdf_dp_trace_data.icmpv6_resp,
2918*5113495bSYour Name 		g_qdf_dp_trace_data.icmpv6_ns,
2919*5113495bSYour Name 		g_qdf_dp_trace_data.icmpv6_na,
2920*5113495bSYour Name 		g_qdf_dp_trace_data.icmpv6_rs,
2921*5113495bSYour Name 		g_qdf_dp_trace_data.icmpv6_ra,
2922*5113495bSYour Name 		g_qdf_dp_trace_data.dhcp_disc,
2923*5113495bSYour Name 		g_qdf_dp_trace_data.dhcp_off,
2924*5113495bSYour Name 		g_qdf_dp_trace_data.dhcp_req,
2925*5113495bSYour Name 		g_qdf_dp_trace_data.dhcp_ack,
2926*5113495bSYour Name 		g_qdf_dp_trace_data.dhcp_nack,
2927*5113495bSYour Name 		g_qdf_dp_trace_data.dhcp_others,
2928*5113495bSYour Name 		g_qdf_dp_trace_data.eapol_m1,
2929*5113495bSYour Name 		g_qdf_dp_trace_data.eapol_m2,
2930*5113495bSYour Name 		g_qdf_dp_trace_data.eapol_m3,
2931*5113495bSYour Name 		g_qdf_dp_trace_data.eapol_m4,
2932*5113495bSYour Name 		g_qdf_dp_trace_data.eapol_others);
2933*5113495bSYour Name 
2934*5113495bSYour Name 	qdf_debugfs_printf(file,
2935*5113495bSYour Name 		"DPT: Total Records: %d, Head: %d, Tail: %d\n",
2936*5113495bSYour Name 		g_qdf_dp_trace_data.num, g_qdf_dp_trace_data.head,
2937*5113495bSYour Name 		g_qdf_dp_trace_data.tail);
2938*5113495bSYour Name 
2939*5113495bSYour Name 	spin_lock_bh(&l_dp_trace_lock);
2940*5113495bSYour Name 	if (g_qdf_dp_trace_data.head != INVALID_QDF_DP_TRACE_ADDR) {
2941*5113495bSYour Name 		i = g_qdf_dp_trace_data.head;
2942*5113495bSYour Name 		tail = g_qdf_dp_trace_data.tail;
2943*5113495bSYour Name 
2944*5113495bSYour Name 		if (count > g_qdf_dp_trace_data.num)
2945*5113495bSYour Name 			count = g_qdf_dp_trace_data.num;
2946*5113495bSYour Name 
2947*5113495bSYour Name 		if (tail >= (count - 1))
2948*5113495bSYour Name 			i = tail - count + 1;
2949*5113495bSYour Name 		else if (count != MAX_QDF_DP_TRACE_RECORDS)
2950*5113495bSYour Name 			i = MAX_QDF_DP_TRACE_RECORDS - ((count - 1) -
2951*5113495bSYour Name 						     tail);
2952*5113495bSYour Name 		g_qdf_dp_trace_data.curr_pos = 0;
2953*5113495bSYour Name 		g_qdf_dp_trace_data.saved_tail = tail;
2954*5113495bSYour Name 	}
2955*5113495bSYour Name 	spin_unlock_bh(&l_dp_trace_lock);
2956*5113495bSYour Name 
2957*5113495bSYour Name 	return g_qdf_dp_trace_data.saved_tail;
2958*5113495bSYour Name }
2959*5113495bSYour Name qdf_export_symbol(qdf_dpt_get_curr_pos_debugfs);
2960*5113495bSYour Name 
qdf_dpt_dump_stats_debugfs(qdf_debugfs_file_t file,uint32_t curr_pos)2961*5113495bSYour Name QDF_STATUS qdf_dpt_dump_stats_debugfs(qdf_debugfs_file_t file,
2962*5113495bSYour Name 				      uint32_t curr_pos)
2963*5113495bSYour Name {
2964*5113495bSYour Name 	struct qdf_dp_trace_record_s p_record;
2965*5113495bSYour Name 	uint32_t i = curr_pos;
2966*5113495bSYour Name 	uint16_t num_records_to_dump = g_qdf_dp_trace_data.num_records_to_dump;
2967*5113495bSYour Name 
2968*5113495bSYour Name 	if (!g_qdf_dp_trace_data.enable) {
2969*5113495bSYour Name 		QDF_TRACE(QDF_MODULE_ID_QDF, QDF_TRACE_LEVEL_ERROR,
2970*5113495bSYour Name 			  "%s: Tracing Disabled", __func__);
2971*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
2972*5113495bSYour Name 	}
2973*5113495bSYour Name 
2974*5113495bSYour Name 	if (num_records_to_dump > g_qdf_dp_trace_data.num)
2975*5113495bSYour Name 		num_records_to_dump = g_qdf_dp_trace_data.num;
2976*5113495bSYour Name 
2977*5113495bSYour Name 	/*
2978*5113495bSYour Name 	 * Max dp trace record size should always be less than
2979*5113495bSYour Name 	 * QDF_DP_TRACE_PREPEND_STR_SIZE(100) + BUFFER_SIZE(121).
2980*5113495bSYour Name 	 */
2981*5113495bSYour Name 	if (WARN_ON(QDF_DP_TRACE_MAX_RECORD_SIZE <
2982*5113495bSYour Name 				QDF_DP_TRACE_PREPEND_STR_SIZE + BUFFER_SIZE))
2983*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
2984*5113495bSYour Name 
2985*5113495bSYour Name 	spin_lock_bh(&l_dp_trace_lock);
2986*5113495bSYour Name 	p_record = g_qdf_dp_trace_tbl[i];
2987*5113495bSYour Name 	spin_unlock_bh(&l_dp_trace_lock);
2988*5113495bSYour Name 
2989*5113495bSYour Name 	for (;; ) {
2990*5113495bSYour Name 		/*
2991*5113495bSYour Name 		 * Initially we get file as 1 page size, and
2992*5113495bSYour Name 		 * if remaining size in file is less than one record max size,
2993*5113495bSYour Name 		 * then return so that it gets an extra page.
2994*5113495bSYour Name 		 */
2995*5113495bSYour Name 		if ((file->size - file->count) < QDF_DP_TRACE_MAX_RECORD_SIZE) {
2996*5113495bSYour Name 			spin_lock_bh(&l_dp_trace_lock);
2997*5113495bSYour Name 			g_qdf_dp_trace_data.curr_pos = i;
2998*5113495bSYour Name 			spin_unlock_bh(&l_dp_trace_lock);
2999*5113495bSYour Name 			return QDF_STATUS_E_FAILURE;
3000*5113495bSYour Name 		}
3001*5113495bSYour Name 
3002*5113495bSYour Name 		switch (p_record.code) {
3003*5113495bSYour Name 		case QDF_DP_TRACE_TXRX_PACKET_PTR_RECORD:
3004*5113495bSYour Name 		case QDF_DP_TRACE_TXRX_FAST_PACKET_PTR_RECORD:
3005*5113495bSYour Name 		case QDF_DP_TRACE_FREE_PACKET_PTR_RECORD:
3006*5113495bSYour Name 			qdf_dpt_display_ptr_record_debugfs(file, &p_record, i);
3007*5113495bSYour Name 			break;
3008*5113495bSYour Name 
3009*5113495bSYour Name 		case QDF_DP_TRACE_EAPOL_PACKET_RECORD:
3010*5113495bSYour Name 		case QDF_DP_TRACE_DHCP_PACKET_RECORD:
3011*5113495bSYour Name 		case QDF_DP_TRACE_ARP_PACKET_RECORD:
3012*5113495bSYour Name 		case QDF_DP_TRACE_ICMP_PACKET_RECORD:
3013*5113495bSYour Name 		case QDF_DP_TRACE_ICMPv6_PACKET_RECORD:
3014*5113495bSYour Name 			qdf_dpt_display_proto_pkt_debugfs(file, &p_record, i);
3015*5113495bSYour Name 			break;
3016*5113495bSYour Name 
3017*5113495bSYour Name 		case QDF_DP_TRACE_TX_CREDIT_RECORD:
3018*5113495bSYour Name 			qdf_dpt_display_credit_record_debugfs(file, &p_record,
3019*5113495bSYour Name 							      i);
3020*5113495bSYour Name 			break;
3021*5113495bSYour Name 
3022*5113495bSYour Name 		case QDF_DP_TRACE_MGMT_PACKET_RECORD:
3023*5113495bSYour Name 			qdf_dpt_display_mgmt_pkt_debugfs(file, &p_record, i);
3024*5113495bSYour Name 			break;
3025*5113495bSYour Name 
3026*5113495bSYour Name 		case QDF_DP_TRACE_EVENT_RECORD:
3027*5113495bSYour Name 			qdf_dpt_display_event_record_debugfs(file, &p_record,
3028*5113495bSYour Name 							     i);
3029*5113495bSYour Name 			break;
3030*5113495bSYour Name 
3031*5113495bSYour Name 		case QDF_DP_TRACE_HDD_TX_TIMEOUT:
3032*5113495bSYour Name 			qdf_debugfs_printf(
3033*5113495bSYour Name 					file, "DPT: %04d: %llu %s\n",
3034*5113495bSYour Name 					i, p_record.time,
3035*5113495bSYour Name 					qdf_dp_code_to_string(p_record.code));
3036*5113495bSYour Name 			qdf_debugfs_printf(file, "HDD TX Timeout\n");
3037*5113495bSYour Name 			break;
3038*5113495bSYour Name 
3039*5113495bSYour Name 		case QDF_DP_TRACE_HDD_SOFTAP_TX_TIMEOUT:
3040*5113495bSYour Name 			qdf_debugfs_printf(
3041*5113495bSYour Name 					file, "DPT: %04d: %llu %s\n",
3042*5113495bSYour Name 					i, p_record.time,
3043*5113495bSYour Name 					qdf_dp_code_to_string(p_record.code));
3044*5113495bSYour Name 			qdf_debugfs_printf(file, "HDD SoftAP TX Timeout\n");
3045*5113495bSYour Name 			break;
3046*5113495bSYour Name 
3047*5113495bSYour Name 		case QDF_DP_TRACE_CE_FAST_PACKET_ERR_RECORD:
3048*5113495bSYour Name 			qdf_debugfs_printf(
3049*5113495bSYour Name 					file, "DPT: %04d: %llu %s\n",
3050*5113495bSYour Name 					i, p_record.time,
3051*5113495bSYour Name 					qdf_dp_code_to_string(p_record.code));
3052*5113495bSYour Name 			qdf_debugfs_printf(file, "CE Fast Packet Error\n");
3053*5113495bSYour Name 			break;
3054*5113495bSYour Name 
3055*5113495bSYour Name 		case QDF_DP_TRACE_MAX:
3056*5113495bSYour Name 			qdf_debugfs_printf(file,
3057*5113495bSYour Name 				"%s: QDF_DP_TRACE_MAX event should not be generated\n",
3058*5113495bSYour Name 				__func__);
3059*5113495bSYour Name 			break;
3060*5113495bSYour Name 
3061*5113495bSYour Name 		case QDF_DP_TRACE_HDD_TX_PACKET_RECORD:
3062*5113495bSYour Name 		case QDF_DP_TRACE_HDD_RX_PACKET_RECORD:
3063*5113495bSYour Name 		case QDF_DP_TRACE_TX_PACKET_RECORD:
3064*5113495bSYour Name 		case QDF_DP_TRACE_RX_PACKET_RECORD:
3065*5113495bSYour Name 		case QDF_DP_TRACE_LI_DP_TX_PACKET_RECORD:
3066*5113495bSYour Name 		case QDF_DP_TRACE_LI_DP_RX_PACKET_RECORD:
3067*5113495bSYour Name 
3068*5113495bSYour Name 		default:
3069*5113495bSYour Name 			qdf_dpt_display_record_debugfs(file, &p_record, i);
3070*5113495bSYour Name 			break;
3071*5113495bSYour Name 		}
3072*5113495bSYour Name 
3073*5113495bSYour Name 		if (++g_qdf_dp_trace_data.dump_counter == num_records_to_dump)
3074*5113495bSYour Name 			break;
3075*5113495bSYour Name 
3076*5113495bSYour Name 		spin_lock_bh(&l_dp_trace_lock);
3077*5113495bSYour Name 		if (i == 0)
3078*5113495bSYour Name 			i = MAX_QDF_DP_TRACE_RECORDS;
3079*5113495bSYour Name 
3080*5113495bSYour Name 		i -= 1;
3081*5113495bSYour Name 		p_record = g_qdf_dp_trace_tbl[i];
3082*5113495bSYour Name 		spin_unlock_bh(&l_dp_trace_lock);
3083*5113495bSYour Name 	}
3084*5113495bSYour Name 
3085*5113495bSYour Name 	g_qdf_dp_trace_data.dump_counter = 0;
3086*5113495bSYour Name 
3087*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
3088*5113495bSYour Name }
3089*5113495bSYour Name qdf_export_symbol(qdf_dpt_dump_stats_debugfs);
3090*5113495bSYour Name 
qdf_dpt_set_value_debugfs(uint8_t proto_bitmap,uint8_t no_of_record,uint8_t verbosity,uint16_t num_records_to_dump)3091*5113495bSYour Name void qdf_dpt_set_value_debugfs(uint8_t proto_bitmap, uint8_t no_of_record,
3092*5113495bSYour Name 			    uint8_t verbosity, uint16_t num_records_to_dump)
3093*5113495bSYour Name {
3094*5113495bSYour Name 	if (g_qdf_dp_trace_data.enable) {
3095*5113495bSYour Name 		g_qdf_dp_trace_data.proto_bitmap = proto_bitmap;
3096*5113495bSYour Name 		g_qdf_dp_trace_data.no_of_record = no_of_record;
3097*5113495bSYour Name 		g_qdf_dp_trace_data.verbosity    = verbosity;
3098*5113495bSYour Name 		g_qdf_dp_trace_data.num_records_to_dump = num_records_to_dump;
3099*5113495bSYour Name 	}
3100*5113495bSYour Name }
3101*5113495bSYour Name qdf_export_symbol(qdf_dpt_set_value_debugfs);
3102*5113495bSYour Name 
3103*5113495bSYour Name 
qdf_dp_trace_dump_all(uint32_t count,uint8_t pdev_id)3104*5113495bSYour Name void qdf_dp_trace_dump_all(uint32_t count, uint8_t pdev_id)
3105*5113495bSYour Name {
3106*5113495bSYour Name 	struct qdf_dp_trace_record_s p_record;
3107*5113495bSYour Name 	int32_t i, tail;
3108*5113495bSYour Name 
3109*5113495bSYour Name 	if (!g_qdf_dp_trace_data.enable) {
3110*5113495bSYour Name 		DPTRACE_PRINT("Tracing Disabled");
3111*5113495bSYour Name 		return;
3112*5113495bSYour Name 	}
3113*5113495bSYour Name 
3114*5113495bSYour Name 	DPTRACE_PRINT(
3115*5113495bSYour Name 		"DPT: config - bitmap 0x%x verb %u #rec %u live_config %u thresh %u time_limit %u",
3116*5113495bSYour Name 		g_qdf_dp_trace_data.proto_bitmap,
3117*5113495bSYour Name 		g_qdf_dp_trace_data.verbosity,
3118*5113495bSYour Name 		g_qdf_dp_trace_data.no_of_record,
3119*5113495bSYour Name 		g_qdf_dp_trace_data.live_mode_config,
3120*5113495bSYour Name 		g_qdf_dp_trace_data.high_tput_thresh,
3121*5113495bSYour Name 		g_qdf_dp_trace_data.thresh_time_limit);
3122*5113495bSYour Name 
3123*5113495bSYour Name 	qdf_dp_trace_dump_stats();
3124*5113495bSYour Name 
3125*5113495bSYour Name 	DPTRACE_PRINT("DPT: Total Records: %d, Head: %d, Tail: %d",
3126*5113495bSYour Name 		      g_qdf_dp_trace_data.num, g_qdf_dp_trace_data.head,
3127*5113495bSYour Name 		      g_qdf_dp_trace_data.tail);
3128*5113495bSYour Name 
3129*5113495bSYour Name 	/* acquire the lock so that only one thread at a time can read
3130*5113495bSYour Name 	 * the ring buffer
3131*5113495bSYour Name 	 */
3132*5113495bSYour Name 	spin_lock_bh(&l_dp_trace_lock);
3133*5113495bSYour Name 
3134*5113495bSYour Name 	if (g_qdf_dp_trace_data.head != INVALID_QDF_DP_TRACE_ADDR) {
3135*5113495bSYour Name 		i = g_qdf_dp_trace_data.head;
3136*5113495bSYour Name 		tail = g_qdf_dp_trace_data.tail;
3137*5113495bSYour Name 
3138*5113495bSYour Name 		if (count) {
3139*5113495bSYour Name 			if (count > g_qdf_dp_trace_data.num)
3140*5113495bSYour Name 				count = g_qdf_dp_trace_data.num;
3141*5113495bSYour Name 			if (tail >= (count - 1))
3142*5113495bSYour Name 				i = tail - count + 1;
3143*5113495bSYour Name 			else if (count != MAX_QDF_DP_TRACE_RECORDS)
3144*5113495bSYour Name 				i = MAX_QDF_DP_TRACE_RECORDS - ((count - 1) -
3145*5113495bSYour Name 							     tail);
3146*5113495bSYour Name 		}
3147*5113495bSYour Name 
3148*5113495bSYour Name 		p_record = g_qdf_dp_trace_tbl[i];
3149*5113495bSYour Name 		spin_unlock_bh(&l_dp_trace_lock);
3150*5113495bSYour Name 		for (;; ) {
3151*5113495bSYour Name 			qdf_dp_trace_cb_table[p_record.code](&p_record,
3152*5113495bSYour Name 							(uint16_t)i, pdev_id, false);
3153*5113495bSYour Name 			if (i == tail)
3154*5113495bSYour Name 				break;
3155*5113495bSYour Name 			i += 1;
3156*5113495bSYour Name 
3157*5113495bSYour Name 			spin_lock_bh(&l_dp_trace_lock);
3158*5113495bSYour Name 			if (MAX_QDF_DP_TRACE_RECORDS == i)
3159*5113495bSYour Name 				i = 0;
3160*5113495bSYour Name 
3161*5113495bSYour Name 			p_record = g_qdf_dp_trace_tbl[i];
3162*5113495bSYour Name 			spin_unlock_bh(&l_dp_trace_lock);
3163*5113495bSYour Name 		}
3164*5113495bSYour Name 	} else {
3165*5113495bSYour Name 		spin_unlock_bh(&l_dp_trace_lock);
3166*5113495bSYour Name 	}
3167*5113495bSYour Name }
3168*5113495bSYour Name qdf_export_symbol(qdf_dp_trace_dump_all);
3169*5113495bSYour Name 
qdf_dp_trace_throttle_live_mode(bool high_bw_request)3170*5113495bSYour Name void qdf_dp_trace_throttle_live_mode(bool high_bw_request)
3171*5113495bSYour Name {
3172*5113495bSYour Name 	static int bw_interval_counter;
3173*5113495bSYour Name 
3174*5113495bSYour Name 	if (g_qdf_dp_trace_data.enable == false ||
3175*5113495bSYour Name 		g_qdf_dp_trace_data.live_mode_config == false)
3176*5113495bSYour Name 		return;
3177*5113495bSYour Name 
3178*5113495bSYour Name 	if (high_bw_request) {
3179*5113495bSYour Name 		g_qdf_dp_trace_data.live_mode = 0;
3180*5113495bSYour Name 		bw_interval_counter = 0;
3181*5113495bSYour Name 		return;
3182*5113495bSYour Name 	}
3183*5113495bSYour Name 
3184*5113495bSYour Name 	bw_interval_counter++;
3185*5113495bSYour Name 
3186*5113495bSYour Name 	if (0 == (bw_interval_counter %
3187*5113495bSYour Name 			g_qdf_dp_trace_data.thresh_time_limit)) {
3188*5113495bSYour Name 
3189*5113495bSYour Name 		spin_lock_bh(&l_dp_trace_lock);
3190*5113495bSYour Name 			if (g_qdf_dp_trace_data.print_pkt_cnt <=
3191*5113495bSYour Name 				g_qdf_dp_trace_data.high_tput_thresh)
3192*5113495bSYour Name 				g_qdf_dp_trace_data.live_mode = 1;
3193*5113495bSYour Name 
3194*5113495bSYour Name 		g_qdf_dp_trace_data.print_pkt_cnt = 0;
3195*5113495bSYour Name 		spin_unlock_bh(&l_dp_trace_lock);
3196*5113495bSYour Name 	}
3197*5113495bSYour Name }
3198*5113495bSYour Name qdf_export_symbol(qdf_dp_trace_throttle_live_mode);
3199*5113495bSYour Name 
qdf_dp_trace_apply_tput_policy(bool is_data_traffic)3200*5113495bSYour Name void qdf_dp_trace_apply_tput_policy(bool is_data_traffic)
3201*5113495bSYour Name {
3202*5113495bSYour Name 	if (g_qdf_dp_trace_data.dynamic_verbosity_modify) {
3203*5113495bSYour Name 		goto check_live_mode;
3204*5113495bSYour Name 		return;
3205*5113495bSYour Name 	}
3206*5113495bSYour Name 
3207*5113495bSYour Name 	if (is_data_traffic) {
3208*5113495bSYour Name 		g_qdf_dp_trace_data.verbosity =
3209*5113495bSYour Name 					QDF_DP_TRACE_VERBOSITY_ULTRA_LOW;
3210*5113495bSYour Name 	} else {
3211*5113495bSYour Name 		g_qdf_dp_trace_data.verbosity =
3212*5113495bSYour Name 					g_qdf_dp_trace_data.ini_conf_verbosity;
3213*5113495bSYour Name 	}
3214*5113495bSYour Name check_live_mode:
3215*5113495bSYour Name 	qdf_dp_trace_throttle_live_mode(is_data_traffic);
3216*5113495bSYour Name }
3217*5113495bSYour Name #endif
3218*5113495bSYour Name 
3219*5113495bSYour Name struct qdf_print_ctrl print_ctrl_obj[MAX_PRINT_CONFIG_SUPPORTED];
3220*5113495bSYour Name 
3221*5113495bSYour Name struct category_name_info g_qdf_category_name[MAX_SUPPORTED_CATEGORY] = {
3222*5113495bSYour Name 	[QDF_MODULE_ID_TDLS] = {"tdls"},
3223*5113495bSYour Name 	[QDF_MODULE_ID_ACS] = {"ACS"},
3224*5113495bSYour Name 	[QDF_MODULE_ID_SCAN_SM] = {"scan state machine"},
3225*5113495bSYour Name 	[QDF_MODULE_ID_SCANENTRY] = {"scan entry"},
3226*5113495bSYour Name 	[QDF_MODULE_ID_WDS] = {"WDS"},
3227*5113495bSYour Name 	[QDF_MODULE_ID_ACTION] = {"action"},
3228*5113495bSYour Name 	[QDF_MODULE_ID_ROAM] = {"STA roaming"},
3229*5113495bSYour Name 	[QDF_MODULE_ID_INACT] = {"inactivity"},
3230*5113495bSYour Name 	[QDF_MODULE_ID_DOTH] = {"11h"},
3231*5113495bSYour Name 	[QDF_MODULE_ID_IQUE] = {"IQUE"},
3232*5113495bSYour Name 	[QDF_MODULE_ID_WME] = {"WME"},
3233*5113495bSYour Name 	[QDF_MODULE_ID_ACL] = {"ACL"},
3234*5113495bSYour Name 	[QDF_MODULE_ID_WPA] = {"WPA/RSN"},
3235*5113495bSYour Name 	[QDF_MODULE_ID_RADKEYS] = {"dump 802.1x keys"},
3236*5113495bSYour Name 	[QDF_MODULE_ID_RADDUMP] = {"dump radius packet"},
3237*5113495bSYour Name 	[QDF_MODULE_ID_RADIUS] = {"802.1x radius client"},
3238*5113495bSYour Name 	[QDF_MODULE_ID_DOT1XSM] = {"802.1x state machine"},
3239*5113495bSYour Name 	[QDF_MODULE_ID_DOT1X] = {"802.1x authenticator"},
3240*5113495bSYour Name 	[QDF_MODULE_ID_POWER] = {"power save"},
3241*5113495bSYour Name 	[QDF_MODULE_ID_STATE] = {"state"},
3242*5113495bSYour Name 	[QDF_MODULE_ID_OUTPUT] = {"output"},
3243*5113495bSYour Name 	[QDF_MODULE_ID_SCAN] = {"scan"},
3244*5113495bSYour Name 	[QDF_MODULE_ID_AUTH] = {"authentication"},
3245*5113495bSYour Name 	[QDF_MODULE_ID_ASSOC] = {"association"},
3246*5113495bSYour Name 	[QDF_MODULE_ID_NODE] = {"node"},
3247*5113495bSYour Name 	[QDF_MODULE_ID_ELEMID] = {"element ID"},
3248*5113495bSYour Name 	[QDF_MODULE_ID_XRATE] = {"rate"},
3249*5113495bSYour Name 	[QDF_MODULE_ID_INPUT] = {"input"},
3250*5113495bSYour Name 	[QDF_MODULE_ID_CRYPTO] = {"crypto"},
3251*5113495bSYour Name 	[QDF_MODULE_ID_DUMPPKTS] = {"dump packet"},
3252*5113495bSYour Name 	[QDF_MODULE_ID_DEBUG] = {"debug"},
3253*5113495bSYour Name 	[QDF_MODULE_ID_MLME] = {"mlme"},
3254*5113495bSYour Name 	[QDF_MODULE_ID_RRM] = {"rrm"},
3255*5113495bSYour Name 	[QDF_MODULE_ID_WNM] = {"wnm"},
3256*5113495bSYour Name 	[QDF_MODULE_ID_P2P_PROT] = {"p2p_prot"},
3257*5113495bSYour Name 	[QDF_MODULE_ID_PROXYARP] = {"proxyarp"},
3258*5113495bSYour Name 	[QDF_MODULE_ID_L2TIF] = {"l2tif"},
3259*5113495bSYour Name 	[QDF_MODULE_ID_WIFIPOS] = {"wifipos"},
3260*5113495bSYour Name 	[QDF_MODULE_ID_WRAP] = {"wrap"},
3261*5113495bSYour Name 	[QDF_MODULE_ID_DFS] = {"dfs"},
3262*5113495bSYour Name 	[QDF_MODULE_ID_ATF] = {"atf"},
3263*5113495bSYour Name 	[QDF_MODULE_ID_SPLITMAC] = {"splitmac"},
3264*5113495bSYour Name 	[QDF_MODULE_ID_IOCTL] = {"ioctl"},
3265*5113495bSYour Name 	[QDF_MODULE_ID_NAC] = {"nac"},
3266*5113495bSYour Name 	[QDF_MODULE_ID_MESH] = {"mesh"},
3267*5113495bSYour Name 	[QDF_MODULE_ID_MBO] = {"mbo"},
3268*5113495bSYour Name 	[QDF_MODULE_ID_EXTIOCTL_CHANSWITCH] = {"extchanswitch"},
3269*5113495bSYour Name 	[QDF_MODULE_ID_EXTIOCTL_CHANSSCAN] = {"extchanscan"},
3270*5113495bSYour Name 	[QDF_MODULE_ID_TLSHIM] = {"tlshim"},
3271*5113495bSYour Name 	[QDF_MODULE_ID_WMI] = {"WMI"},
3272*5113495bSYour Name 	[QDF_MODULE_ID_HTT] = {"HTT"},
3273*5113495bSYour Name 	[QDF_MODULE_ID_HDD] = {"HDD"},
3274*5113495bSYour Name 	[QDF_MODULE_ID_SME] = {"SME"},
3275*5113495bSYour Name 	[QDF_MODULE_ID_PE] = {"PE"},
3276*5113495bSYour Name 	[QDF_MODULE_ID_WMA] = {"WMA"},
3277*5113495bSYour Name 	[QDF_MODULE_ID_SYS] = {"SYS"},
3278*5113495bSYour Name 	[QDF_MODULE_ID_QDF] = {"QDF"},
3279*5113495bSYour Name 	[QDF_MODULE_ID_SAP] = {"SAP"},
3280*5113495bSYour Name 	[QDF_MODULE_ID_HDD_SOFTAP] = {"HDD_SAP"},
3281*5113495bSYour Name 	[QDF_MODULE_ID_HDD_DATA] = {"DATA"},
3282*5113495bSYour Name 	[QDF_MODULE_ID_HDD_SAP_DATA] = {"SAP_DATA"},
3283*5113495bSYour Name 	[QDF_MODULE_ID_HIF] = {"HIF"},
3284*5113495bSYour Name 	[QDF_MODULE_ID_HTC] = {"HTC"},
3285*5113495bSYour Name 	[QDF_MODULE_ID_TXRX] = {"TXRX"},
3286*5113495bSYour Name 	[QDF_MODULE_ID_QDF_DEVICE] = {"QDF_DEV"},
3287*5113495bSYour Name 	[QDF_MODULE_ID_CFG] = {"CFG"},
3288*5113495bSYour Name 	[QDF_MODULE_ID_BMI] = {"BMI"},
3289*5113495bSYour Name 	[QDF_MODULE_ID_EPPING] = {"EPPING"},
3290*5113495bSYour Name 	[QDF_MODULE_ID_QVIT] = {"QVIT"},
3291*5113495bSYour Name 	[QDF_MODULE_ID_DP] = {"DP"},
3292*5113495bSYour Name 	[QDF_MODULE_ID_HAL] = {"HAL"},
3293*5113495bSYour Name 	[QDF_MODULE_ID_SOC] = {"SOC"},
3294*5113495bSYour Name 	[QDF_MODULE_ID_OS_IF] = {"OSIF"},
3295*5113495bSYour Name 	[QDF_MODULE_ID_TARGET_IF] = {"TIF"},
3296*5113495bSYour Name 	[QDF_MODULE_ID_SCHEDULER] = {"SCH"},
3297*5113495bSYour Name 	[QDF_MODULE_ID_MGMT_TXRX] = {"MGMT_TXRX"},
3298*5113495bSYour Name 	[QDF_MODULE_ID_PMO] = {"PMO"},
3299*5113495bSYour Name 	[QDF_MODULE_ID_POLICY_MGR] = {"POLICY_MGR"},
3300*5113495bSYour Name 	[QDF_MODULE_ID_SA_API] = {"SA_API"},
3301*5113495bSYour Name 	[QDF_MODULE_ID_NAN] = {"NAN"},
3302*5113495bSYour Name 	[QDF_MODULE_ID_SPECTRAL] = {"SPECTRAL"},
3303*5113495bSYour Name 	[QDF_MODULE_ID_P2P] = {"P2P"},
3304*5113495bSYour Name 	[QDF_MODULE_ID_OFFCHAN_TXRX] = {"OFFCHAN"},
3305*5113495bSYour Name 	[QDF_MODULE_ID_REGULATORY] = {"REGULATORY"},
3306*5113495bSYour Name 	[QDF_MODULE_ID_OBJ_MGR] = {"OBJMGR"},
3307*5113495bSYour Name 	[QDF_MODULE_ID_SERIALIZATION] = {"SER"},
3308*5113495bSYour Name 	[QDF_MODULE_ID_NSS] = {"NSS"},
3309*5113495bSYour Name 	[QDF_MODULE_ID_ROAM_DEBUG] = {"roam debug"},
3310*5113495bSYour Name 	[QDF_MODULE_ID_DIRECT_BUF_RX] = {"DIRECT_BUF_RX"},
3311*5113495bSYour Name 	[QDF_MODULE_ID_DISA] = {"disa"},
3312*5113495bSYour Name 	[QDF_MODULE_ID_GREEN_AP] = {"GREEN_AP"},
3313*5113495bSYour Name 	[QDF_MODULE_ID_FD] = {"FILS discovery"},
3314*5113495bSYour Name 	[QDF_MODULE_ID_FTM] = {"FTM"},
3315*5113495bSYour Name 	[QDF_MODULE_ID_OCB] = {"OCB"},
3316*5113495bSYour Name 	[QDF_MODULE_ID_CONFIG] = {"CONFIG"},
3317*5113495bSYour Name 	[QDF_MODULE_ID_IPA] = {"IPA"},
3318*5113495bSYour Name 	[QDF_MODULE_ID_CP_STATS] = {"CP_STATS"},
3319*5113495bSYour Name 	[QDF_MODULE_ID_DCS] = {"DCS"},
3320*5113495bSYour Name 	[QDF_MODULE_ID_ACTION_OUI] = {"action_oui"},
3321*5113495bSYour Name 	[QDF_MODULE_ID_TARGET] = {"TARGET"},
3322*5113495bSYour Name 	[QDF_MODULE_ID_MBSSIE] = {"MBSSIE"},
3323*5113495bSYour Name 	[QDF_MODULE_ID_FWOL] = {"fwol"},
3324*5113495bSYour Name 	[QDF_MODULE_ID_SM_ENGINE] = {"SM_ENG"},
3325*5113495bSYour Name 	[QDF_MODULE_ID_CMN_MLME] = {"CMN_MLME"},
3326*5113495bSYour Name 	[QDF_MODULE_ID_BSSCOLOR] = {"BSSCOLOR"},
3327*5113495bSYour Name 	[QDF_MODULE_ID_CFR] = {"CFR"},
3328*5113495bSYour Name 	[QDF_MODULE_ID_DP_TX_CAPTURE] = {"TX_CAPTURE_ENHANCE"},
3329*5113495bSYour Name 	[QDF_MODULE_ID_INTEROP_ISSUES_AP] = {"INTEROP_ISSUES_AP"},
3330*5113495bSYour Name 	[QDF_MODULE_ID_DENYLIST_MGR] = {"dlm"},
3331*5113495bSYour Name 	[QDF_MODULE_ID_QLD] = {"QLD"},
3332*5113495bSYour Name 	[QDF_MODULE_ID_DYNAMIC_MODE_CHG] = {"Dynamic Mode Change"},
3333*5113495bSYour Name 	[QDF_MODULE_ID_COEX] = {"COEX"},
3334*5113495bSYour Name 	[QDF_MODULE_ID_MON_FILTER] = {"Monitor Filter"},
3335*5113495bSYour Name 	[QDF_MODULE_ID_PKT_CAPTURE] = {"pkt_capture"},
3336*5113495bSYour Name 	[QDF_MODULE_ID_RPTR] = {"RPTR"},
3337*5113495bSYour Name 	[QDF_MODULE_ID_6GHZ] = {"6GHZ"},
3338*5113495bSYour Name 	[QDF_MODULE_ID_IOT_SIM] = {"IOT_SIM"},
3339*5113495bSYour Name 	[QDF_MODULE_ID_MSCS] = {"MSCS"},
3340*5113495bSYour Name 	[QDF_MODULE_ID_GPIO] = {"GPIO_CFG"},
3341*5113495bSYour Name 	[QDF_MODULE_ID_IFMGR] = {"IF_MGR"},
3342*5113495bSYour Name 	[QDF_MODULE_ID_DIAG] = {"DIAG"},
3343*5113495bSYour Name 	[QDF_MODULE_ID_DP_INIT] = {"DP_INIT"},
3344*5113495bSYour Name 	[QDF_MODULE_ID_DP_TX] = {"DP_TX"},
3345*5113495bSYour Name 	[QDF_MODULE_ID_DP_RX] = {"DP_RX"},
3346*5113495bSYour Name 	[QDF_MODULE_ID_DP_STATS] = {"DP_STATS"},
3347*5113495bSYour Name 	[QDF_MODULE_ID_DP_HTT] = {"DP_HTT"},
3348*5113495bSYour Name 	[QDF_MODULE_ID_DP_PEER] = {"DP_PEER"},
3349*5113495bSYour Name 	[QDF_MODULE_ID_DP_RX_ERROR] = {"DP_RX_ERROR"},
3350*5113495bSYour Name 	[QDF_MODULE_ID_DP_HTT_TX_STATS] = {"DP_HTT_TX_STATS"},
3351*5113495bSYour Name 	[QDF_MODULE_ID_DP_RX_MON_STATUS] = {"DP_RX_MON_STATUS"},
3352*5113495bSYour Name 	[QDF_MODULE_ID_DP_RX_MON_DEST] = {"DP_RX_MON_DEST"},
3353*5113495bSYour Name 	[QDF_MODULE_ID_DP_REO] = {"DP_REO"},
3354*5113495bSYour Name 	[QDF_MODULE_ID_DP_TX_COMP] = {"DP_TX_COMP"},
3355*5113495bSYour Name 	[QDF_MODULE_ID_DP_VDEV] = {"DP_VDEV"},
3356*5113495bSYour Name 	[QDF_MODULE_ID_DP_CDP] = {"DP_CDP"},
3357*5113495bSYour Name 	[QDF_MODULE_ID_TSO] = {"TSO"},
3358*5113495bSYour Name 	[QDF_MODULE_ID_ME] = {"ME"},
3359*5113495bSYour Name 	[QDF_MODULE_ID_QWRAP] = {"QWRAP"},
3360*5113495bSYour Name 	[QDF_MODULE_ID_DBDC_REP] = {"DBDC_REP"},
3361*5113495bSYour Name 	[QDF_MODULE_ID_EXT_AP] = {"EXT_AP"},
3362*5113495bSYour Name 	[QDF_MODULE_ID_MLO] = {"MLO_MGR"},
3363*5113495bSYour Name 	[QDF_MODULE_ID_MGMT_RX_REO] = {"MGMT_RX_REO"},
3364*5113495bSYour Name 	[QDF_MODULE_ID_MLOIE] = {"MLOIE"},
3365*5113495bSYour Name 	[QDF_MODULE_ID_MBSS] = {"MBSS"},
3366*5113495bSYour Name 	[QDF_MODULE_ID_MON] = {"MONITOR"},
3367*5113495bSYour Name 	[QDF_MODULE_ID_AFC] = {"AFC"},
3368*5113495bSYour Name 	[QDF_MODULE_ID_TWT] = {"TWT"},
3369*5113495bSYour Name 	[QDF_MODULE_ID_SON] = {"SON"},
3370*5113495bSYour Name 	[QDF_MODULE_ID_WLAN_PRE_CAC] = {"PRE_CAC"},
3371*5113495bSYour Name 	[QDF_MODULE_ID_T2LM] = {"T2LM"},
3372*5113495bSYour Name 	[QDF_MODULE_ID_DP_SAWF] = {"DP_SAWF"},
3373*5113495bSYour Name 	[QDF_MODULE_ID_SCS] = {"SCS"},
3374*5113495bSYour Name 	[QDF_MODULE_ID_DP_UMAC_RESET] = {"UMAC_HW_RESET"},
3375*5113495bSYour Name 	[QDF_MODULE_ID_COAP] = {"COAP"},
3376*5113495bSYour Name 	[QDF_MODULE_ID_FTM_TIME_SYNC] = {"Time Sync"},
3377*5113495bSYour Name 	[QDF_MODULE_ID_WIFI_RADAR] = {"WIFI RADAR"},
3378*5113495bSYour Name 	[QDF_MODULE_ID_CDP] =  {"CDP"},
3379*5113495bSYour Name 	[QDF_MODULE_ID_QMI] = {"QMI"},
3380*5113495bSYour Name 	[QDF_MODULE_ID_SOUNDING] = {"SOUNDING"},
3381*5113495bSYour Name 	[QDF_MODULE_ID_SAWF] = {"SAWF"},
3382*5113495bSYour Name 	[QDF_MODULE_ID_EPCS] = {"EPCS"},
3383*5113495bSYour Name 	[QDF_MODULE_ID_LL_SAP] = {"LL_SAP"},
3384*5113495bSYour Name 	[QDF_MODULE_ID_COHOSTED_BSS] = {"COHOSTED_BSS"},
3385*5113495bSYour Name 	[QDF_MODULE_ID_TELEMETRY_AGENT] = {"TELEMETRY_AGENT"},
3386*5113495bSYour Name 	[QDF_MODULE_ID_RF_PATH_SWITCH] = {"Dynamic RF Path Switch"},
3387*5113495bSYour Name 	[QDF_MODULE_ID_ANY] = {"ANY"},
3388*5113495bSYour Name };
3389*5113495bSYour Name qdf_export_symbol(g_qdf_category_name);
3390*5113495bSYour Name 
qdf_trace_display(void)3391*5113495bSYour Name void qdf_trace_display(void)
3392*5113495bSYour Name {
3393*5113495bSYour Name 	QDF_MODULE_ID module_id;
3394*5113495bSYour Name 
3395*5113495bSYour Name 	pr_err("     1)FATAL  2)ERROR  3)WARN  4)INFO  5)INFO_H  6)INFO_M  7)INFO_L 8)DEBUG\n");
3396*5113495bSYour Name 	for (module_id = 0; module_id < QDF_MODULE_ID_MAX; ++module_id) {
3397*5113495bSYour Name 		pr_err("%2d)%s    %s        %s       %s       %s        %s         %s         %s        %s\n",
3398*5113495bSYour Name 		       (int)module_id,
3399*5113495bSYour Name 		       g_qdf_category_name[module_id].category_name_str,
3400*5113495bSYour Name 		       qdf_print_is_verbose_enabled(qdf_pidx, module_id,
3401*5113495bSYour Name 			       QDF_TRACE_LEVEL_FATAL) ? "X" : " ",
3402*5113495bSYour Name 		       qdf_print_is_verbose_enabled(qdf_pidx, module_id,
3403*5113495bSYour Name 			       QDF_TRACE_LEVEL_ERROR) ? "X" : " ",
3404*5113495bSYour Name 		       qdf_print_is_verbose_enabled(qdf_pidx, module_id,
3405*5113495bSYour Name 			       QDF_TRACE_LEVEL_WARN) ? "X" : " ",
3406*5113495bSYour Name 		       qdf_print_is_verbose_enabled(qdf_pidx, module_id,
3407*5113495bSYour Name 			       QDF_TRACE_LEVEL_INFO) ? "X" : " ",
3408*5113495bSYour Name 		       qdf_print_is_verbose_enabled(qdf_pidx, module_id,
3409*5113495bSYour Name 			       QDF_TRACE_LEVEL_INFO_HIGH) ? "X" : " ",
3410*5113495bSYour Name 		       qdf_print_is_verbose_enabled(qdf_pidx, module_id,
3411*5113495bSYour Name 			       QDF_TRACE_LEVEL_INFO_MED) ? "X" : " ",
3412*5113495bSYour Name 		       qdf_print_is_verbose_enabled(qdf_pidx, module_id,
3413*5113495bSYour Name 			       QDF_TRACE_LEVEL_INFO_LOW) ? "X" : " ",
3414*5113495bSYour Name 		       qdf_print_is_verbose_enabled(qdf_pidx, module_id,
3415*5113495bSYour Name 			       QDF_TRACE_LEVEL_DEBUG) ? "X" : " ");
3416*5113495bSYour Name 	}
3417*5113495bSYour Name }
3418*5113495bSYour Name qdf_export_symbol(qdf_trace_display);
3419*5113495bSYour Name 
3420*5113495bSYour Name #ifdef WLAN_MAX_LOGS_PER_SEC
3421*5113495bSYour Name static qdf_time_t __log_window_end;
3422*5113495bSYour Name static qdf_atomic_t __log_window_count;
3423*5113495bSYour Name uint32_t qdf_rl_print_count = WLAN_MAX_LOGS_PER_SEC;
3424*5113495bSYour Name uint32_t qdf_rl_print_time = 1;
3425*5113495bSYour Name uint32_t qdf_rl_print_suppressed;
3426*5113495bSYour Name 
qdf_detected_excessive_logging(void)3427*5113495bSYour Name bool qdf_detected_excessive_logging(void)
3428*5113495bSYour Name {
3429*5113495bSYour Name 	qdf_time_t now = qdf_system_ticks();
3430*5113495bSYour Name 	bool excessive_prints = false;
3431*5113495bSYour Name 
3432*5113495bSYour Name 	/*
3433*5113495bSYour Name 	 * If 'now' is more recent than the end of the window, reset.
3434*5113495bSYour Name 	 *
3435*5113495bSYour Name 	 * Note: This is not thread safe, and can result in more than one reset.
3436*5113495bSYour Name 	 * For our purposes, this is fine.
3437*5113495bSYour Name 	 */
3438*5113495bSYour Name 	if (!qdf_atomic_read(&__log_window_count)) {
3439*5113495bSYour Name 		__log_window_end = now + (qdf_system_ticks_per_sec * qdf_rl_print_time);
3440*5113495bSYour Name 	} else if (qdf_system_time_after(now, __log_window_end)) {
3441*5113495bSYour Name 		__log_window_end = now + (qdf_system_ticks_per_sec * qdf_rl_print_time);
3442*5113495bSYour Name 		qdf_atomic_set(&__log_window_count, 0);
3443*5113495bSYour Name 	}
3444*5113495bSYour Name 
3445*5113495bSYour Name 	if (qdf_atomic_inc_return(&__log_window_count) > qdf_rl_print_count)
3446*5113495bSYour Name 		excessive_prints = true;
3447*5113495bSYour Name 
3448*5113495bSYour Name 	return excessive_prints;
3449*5113495bSYour Name }
3450*5113495bSYour Name 
qdf_rl_print_count_set(uint32_t rl_print_count)3451*5113495bSYour Name void qdf_rl_print_count_set(uint32_t rl_print_count)
3452*5113495bSYour Name {
3453*5113495bSYour Name 	qdf_rl_print_count = rl_print_count;
3454*5113495bSYour Name }
3455*5113495bSYour Name 
3456*5113495bSYour Name qdf_export_symbol(qdf_rl_print_count_set);
3457*5113495bSYour Name 
qdf_rl_print_time_set(uint32_t rl_print_time)3458*5113495bSYour Name void qdf_rl_print_time_set(uint32_t rl_print_time)
3459*5113495bSYour Name {
3460*5113495bSYour Name 	qdf_rl_print_time = rl_print_time;
3461*5113495bSYour Name }
3462*5113495bSYour Name 
3463*5113495bSYour Name qdf_export_symbol(qdf_rl_print_time_set);
3464*5113495bSYour Name 
qdf_rl_print_suppressed_log(void)3465*5113495bSYour Name void qdf_rl_print_suppressed_log(void)
3466*5113495bSYour Name {
3467*5113495bSYour Name 	if (qdf_rl_print_suppressed) {
3468*5113495bSYour Name 		pr_err("QDF Ratelimiting: %d prints suppressed",
3469*5113495bSYour Name 		       qdf_rl_print_suppressed);
3470*5113495bSYour Name 		qdf_rl_print_suppressed = 0;
3471*5113495bSYour Name 	}
3472*5113495bSYour Name }
3473*5113495bSYour Name 
qdf_rl_print_suppressed_inc(void)3474*5113495bSYour Name void qdf_rl_print_suppressed_inc(void)
3475*5113495bSYour Name {
3476*5113495bSYour Name 	qdf_rl_print_suppressed++;
3477*5113495bSYour Name }
3478*5113495bSYour Name #else
3479*5113495bSYour Name #define qdf_rl_print_suppressed_log()
3480*5113495bSYour Name #define qdf_rl_print_suppressed_inc()
3481*5113495bSYour Name #endif /* WLAN_MAX_LOGS_PER_SEC */
3482*5113495bSYour Name 
3483*5113495bSYour Name #ifdef QDF_TRACE_PRINT_ENABLE
print_to_console(char * str_buffer)3484*5113495bSYour Name static inline void print_to_console(char *str_buffer)
3485*5113495bSYour Name {
3486*5113495bSYour Name 	if (qdf_in_interrupt() && qdf_detected_excessive_logging()) {
3487*5113495bSYour Name 		qdf_rl_print_suppressed_inc();
3488*5113495bSYour Name 		return;
3489*5113495bSYour Name 	}
3490*5113495bSYour Name 	qdf_rl_print_suppressed_log();
3491*5113495bSYour Name 	pr_err("%s\n", str_buffer);
3492*5113495bSYour Name }
3493*5113495bSYour Name #else
3494*5113495bSYour Name 
3495*5113495bSYour Name #define print_to_console(str)
3496*5113495bSYour Name #endif
3497*5113495bSYour Name 
3498*5113495bSYour Name #ifdef MULTI_IF_NAME
qdf_trace_wlan_modname(void)3499*5113495bSYour Name static const char *qdf_trace_wlan_modname(void)
3500*5113495bSYour Name {
3501*5113495bSYour Name 	return MULTI_IF_NAME;
3502*5113495bSYour Name }
3503*5113495bSYour Name #else
qdf_trace_wlan_modname(void)3504*5113495bSYour Name static const char *qdf_trace_wlan_modname(void)
3505*5113495bSYour Name {
3506*5113495bSYour Name 	return "wlan";
3507*5113495bSYour Name }
3508*5113495bSYour Name #endif
3509*5113495bSYour Name 
qdf_trace_msg_cmn(unsigned int idx,QDF_MODULE_ID category,QDF_TRACE_LEVEL verbose,const char * str_format,va_list val)3510*5113495bSYour Name void qdf_trace_msg_cmn(unsigned int idx,
3511*5113495bSYour Name 			QDF_MODULE_ID category,
3512*5113495bSYour Name 			QDF_TRACE_LEVEL verbose,
3513*5113495bSYour Name 			const char *str_format, va_list val)
3514*5113495bSYour Name {
3515*5113495bSYour Name 	char str_buffer[QDF_TRACE_BUFFER_SIZE];
3516*5113495bSYour Name 	int n;
3517*5113495bSYour Name 
3518*5113495bSYour Name 	/* Check if index passed is valid */
3519*5113495bSYour Name 	if (idx < 0 || idx >= MAX_PRINT_CONFIG_SUPPORTED) {
3520*5113495bSYour Name 		pr_info("%s: Invalid index - %d\n", __func__, idx);
3521*5113495bSYour Name 		return;
3522*5113495bSYour Name 	}
3523*5113495bSYour Name 
3524*5113495bSYour Name 	/* Check if print control object is in use */
3525*5113495bSYour Name 	if (!print_ctrl_obj[idx].in_use) {
3526*5113495bSYour Name 		pr_info("%s: Invalid print control object\n", __func__);
3527*5113495bSYour Name 		return;
3528*5113495bSYour Name 	}
3529*5113495bSYour Name 
3530*5113495bSYour Name 	/* Check if category passed is valid */
3531*5113495bSYour Name 	if (category < 0 || category >= MAX_SUPPORTED_CATEGORY) {
3532*5113495bSYour Name 		vscnprintf(str_buffer, QDF_TRACE_BUFFER_SIZE, str_format, val);
3533*5113495bSYour Name 		pr_info("%s: Invalid category: %d, log: %s\n",
3534*5113495bSYour Name 			__func__, category, str_buffer);
3535*5113495bSYour Name 		return;
3536*5113495bSYour Name 	}
3537*5113495bSYour Name 
3538*5113495bSYour Name 	/* Check if verbose mask is valid */
3539*5113495bSYour Name 	if (verbose < 0 || verbose >= QDF_TRACE_LEVEL_MAX) {
3540*5113495bSYour Name 		vscnprintf(str_buffer, QDF_TRACE_BUFFER_SIZE, str_format, val);
3541*5113495bSYour Name 		pr_info("%s: Invalid verbose level %d, log: %s\n",
3542*5113495bSYour Name 			__func__, verbose, str_buffer);
3543*5113495bSYour Name 		return;
3544*5113495bSYour Name 	}
3545*5113495bSYour Name 
3546*5113495bSYour Name 	/*
3547*5113495bSYour Name 	 * Print the trace message when the desired verbose level is set in
3548*5113495bSYour Name 	 * the desired category for the print control object
3549*5113495bSYour Name 	 */
3550*5113495bSYour Name 	if (print_ctrl_obj[idx].cat_info[category].category_verbose_mask &
3551*5113495bSYour Name 	    QDF_TRACE_LEVEL_TO_MODULE_BITMASK(verbose)) {
3552*5113495bSYour Name 		static const char * const VERBOSE_STR[] = {
3553*5113495bSYour Name 			[QDF_TRACE_LEVEL_NONE] = "",
3554*5113495bSYour Name 			[QDF_TRACE_LEVEL_FATAL] = "F",
3555*5113495bSYour Name 			[QDF_TRACE_LEVEL_ERROR] = "E",
3556*5113495bSYour Name 			[QDF_TRACE_LEVEL_WARN] = "W",
3557*5113495bSYour Name 			[QDF_TRACE_LEVEL_INFO] = "I",
3558*5113495bSYour Name 			[QDF_TRACE_LEVEL_INFO_HIGH] = "IH",
3559*5113495bSYour Name 			[QDF_TRACE_LEVEL_INFO_MED] = "IM",
3560*5113495bSYour Name 			[QDF_TRACE_LEVEL_INFO_LOW] = "IL",
3561*5113495bSYour Name 			[QDF_TRACE_LEVEL_DEBUG] = "D",
3562*5113495bSYour Name 			[QDF_TRACE_LEVEL_TRACE] = "T",
3563*5113495bSYour Name 			[QDF_TRACE_LEVEL_ALL] = "" };
3564*5113495bSYour Name 
3565*5113495bSYour Name 		/* print the prefix string into the string buffer... */
3566*5113495bSYour Name 		n = scnprintf(str_buffer, QDF_TRACE_BUFFER_SIZE,
3567*5113495bSYour Name 			     "%s: [%d:%s:%s] ", qdf_trace_wlan_modname(),
3568*5113495bSYour Name 			     in_interrupt() ? 0 : current->pid,
3569*5113495bSYour Name 			     VERBOSE_STR[verbose],
3570*5113495bSYour Name 			     g_qdf_category_name[category].category_name_str);
3571*5113495bSYour Name 
3572*5113495bSYour Name 		/* print the formatted log message after the prefix string */
3573*5113495bSYour Name 		vscnprintf(str_buffer + n, QDF_TRACE_BUFFER_SIZE - n,
3574*5113495bSYour Name 			   str_format, val);
3575*5113495bSYour Name #if defined(WLAN_LOGGING_SOCK_SVC_ENABLE)
3576*5113495bSYour Name 		wlan_log_to_user(verbose, (char *)str_buffer,
3577*5113495bSYour Name 				 strlen(str_buffer));
3578*5113495bSYour Name 		if (qdf_unlikely(qdf_log_dump_at_kernel_enable))
3579*5113495bSYour Name 			print_to_console(str_buffer);
3580*5113495bSYour Name #else
3581*5113495bSYour Name 		pr_err("%s\n", str_buffer);
3582*5113495bSYour Name #endif
3583*5113495bSYour Name 	}
3584*5113495bSYour Name }
3585*5113495bSYour Name qdf_export_symbol(qdf_trace_msg_cmn);
3586*5113495bSYour Name 
qdf_print_setup(void)3587*5113495bSYour Name QDF_STATUS qdf_print_setup(void)
3588*5113495bSYour Name {
3589*5113495bSYour Name 	int i;
3590*5113495bSYour Name 
3591*5113495bSYour Name 	/* Loop through all print ctrl objects */
3592*5113495bSYour Name 	for (i = 0; i < MAX_PRINT_CONFIG_SUPPORTED; i++) {
3593*5113495bSYour Name 		if (qdf_print_ctrl_cleanup(i))
3594*5113495bSYour Name 			return QDF_STATUS_E_FAILURE;
3595*5113495bSYour Name 	}
3596*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
3597*5113495bSYour Name }
3598*5113495bSYour Name qdf_export_symbol(qdf_print_setup);
3599*5113495bSYour Name 
qdf_print_ctrl_cleanup(unsigned int idx)3600*5113495bSYour Name QDF_STATUS qdf_print_ctrl_cleanup(unsigned int idx)
3601*5113495bSYour Name {
3602*5113495bSYour Name 	int i = 0;
3603*5113495bSYour Name 
3604*5113495bSYour Name 	if (idx < 0 || idx >= MAX_PRINT_CONFIG_SUPPORTED) {
3605*5113495bSYour Name 		pr_info("%s: Invalid index - %d\n", __func__, idx);
3606*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
3607*5113495bSYour Name 	}
3608*5113495bSYour Name 
3609*5113495bSYour Name 	/* Clean up the print control object corresponding to that index
3610*5113495bSYour Name 	 * If success, callee to change print control index to -1
3611*5113495bSYour Name 	 */
3612*5113495bSYour Name 
3613*5113495bSYour Name 	for (i = 0; i < MAX_SUPPORTED_CATEGORY; i++) {
3614*5113495bSYour Name 		print_ctrl_obj[idx].cat_info[i].category_verbose_mask =
3615*5113495bSYour Name 							QDF_TRACE_LEVEL_NONE;
3616*5113495bSYour Name 	}
3617*5113495bSYour Name 	print_ctrl_obj[idx].custom_print = NULL;
3618*5113495bSYour Name 	print_ctrl_obj[idx].custom_ctxt = NULL;
3619*5113495bSYour Name 	qdf_print_clean_node_flag(idx);
3620*5113495bSYour Name 	print_ctrl_obj[idx].in_use = false;
3621*5113495bSYour Name 
3622*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
3623*5113495bSYour Name }
3624*5113495bSYour Name qdf_export_symbol(qdf_print_ctrl_cleanup);
3625*5113495bSYour Name 
qdf_print_ctrl_register(const struct category_info * cinfo,void * custom_print_handler,void * custom_ctx,const char * pctrl_name)3626*5113495bSYour Name int qdf_print_ctrl_register(const struct category_info *cinfo,
3627*5113495bSYour Name 			    void *custom_print_handler,
3628*5113495bSYour Name 			    void *custom_ctx,
3629*5113495bSYour Name 			    const char *pctrl_name)
3630*5113495bSYour Name {
3631*5113495bSYour Name 	int idx = -1;
3632*5113495bSYour Name 	int i = 0;
3633*5113495bSYour Name 
3634*5113495bSYour Name 	for (i = 0; i < MAX_PRINT_CONFIG_SUPPORTED; i++) {
3635*5113495bSYour Name 		if (!print_ctrl_obj[i].in_use) {
3636*5113495bSYour Name 			idx = i;
3637*5113495bSYour Name 			break;
3638*5113495bSYour Name 		}
3639*5113495bSYour Name 	}
3640*5113495bSYour Name 
3641*5113495bSYour Name 	/* Callee to handle idx -1 appropriately */
3642*5113495bSYour Name 	if (idx == -1) {
3643*5113495bSYour Name 		pr_info("%s: Allocation failed! No print control object free\n",
3644*5113495bSYour Name 			__func__);
3645*5113495bSYour Name 		return idx;
3646*5113495bSYour Name 	}
3647*5113495bSYour Name 
3648*5113495bSYour Name 	print_ctrl_obj[idx].in_use = true;
3649*5113495bSYour Name 
3650*5113495bSYour Name 	/*
3651*5113495bSYour Name 	 * In case callee does not pass category info,
3652*5113495bSYour Name 	 * custom print handler, custom context and print control name,
3653*5113495bSYour Name 	 * we do not set any value here. Clean up for the print control
3654*5113495bSYour Name 	 * getting allocated would have taken care of initializing
3655*5113495bSYour Name 	 * default values.
3656*5113495bSYour Name 	 *
3657*5113495bSYour Name 	 * We need to only set in_use to 1 in such a case
3658*5113495bSYour Name 	 */
3659*5113495bSYour Name 
3660*5113495bSYour Name 	if (pctrl_name) {
3661*5113495bSYour Name 		qdf_str_lcopy(print_ctrl_obj[idx].name, pctrl_name,
3662*5113495bSYour Name 			      sizeof(print_ctrl_obj[idx].name));
3663*5113495bSYour Name 	}
3664*5113495bSYour Name 
3665*5113495bSYour Name 	if (custom_print_handler)
3666*5113495bSYour Name 		print_ctrl_obj[idx].custom_print = custom_print_handler;
3667*5113495bSYour Name 
3668*5113495bSYour Name 	if (custom_ctx)
3669*5113495bSYour Name 		print_ctrl_obj[idx].custom_ctxt = custom_ctx;
3670*5113495bSYour Name 
3671*5113495bSYour Name 	if (cinfo) {
3672*5113495bSYour Name 		for (i = 0; i < MAX_SUPPORTED_CATEGORY; i++) {
3673*5113495bSYour Name 			if (cinfo[i].category_verbose_mask ==
3674*5113495bSYour Name 			    QDF_TRACE_LEVEL_ALL) {
3675*5113495bSYour Name 				print_ctrl_obj[idx].cat_info[i]
3676*5113495bSYour Name 				.category_verbose_mask = 0xFFFF;
3677*5113495bSYour Name 			} else if ((cinfo[i].category_verbose_mask ==
3678*5113495bSYour Name 				   QDF_TRACE_LEVEL_NONE) ||
3679*5113495bSYour Name 				   (cinfo[i].category_verbose_mask ==
3680*5113495bSYour Name 				   QDF_TRACE_LEVEL_TO_MODULE_BITMASK(
3681*5113495bSYour Name 				   QDF_TRACE_LEVEL_NONE))) {
3682*5113495bSYour Name 				print_ctrl_obj[idx].cat_info[i]
3683*5113495bSYour Name 				.category_verbose_mask = 0;
3684*5113495bSYour Name 			} else {
3685*5113495bSYour Name 				print_ctrl_obj[idx].cat_info[i]
3686*5113495bSYour Name 				.category_verbose_mask =
3687*5113495bSYour Name 				cinfo[i].category_verbose_mask;
3688*5113495bSYour Name 			}
3689*5113495bSYour Name 		}
3690*5113495bSYour Name 	}
3691*5113495bSYour Name 
3692*5113495bSYour Name 	return idx;
3693*5113495bSYour Name }
3694*5113495bSYour Name qdf_export_symbol(qdf_print_ctrl_register);
3695*5113495bSYour Name 
3696*5113495bSYour Name #ifdef QDF_TRACE_PRINT_ENABLE
qdf_shared_print_ctrl_cleanup(void)3697*5113495bSYour Name void qdf_shared_print_ctrl_cleanup(void)
3698*5113495bSYour Name {
3699*5113495bSYour Name 	qdf_print_ctrl_cleanup(qdf_pidx);
3700*5113495bSYour Name }
3701*5113495bSYour Name qdf_export_symbol(qdf_shared_print_ctrl_cleanup);
3702*5113495bSYour Name 
3703*5113495bSYour Name /*
3704*5113495bSYour Name  * Set this to invalid value to differentiate with user-provided
3705*5113495bSYour Name  * value.
3706*5113495bSYour Name  */
3707*5113495bSYour Name int qdf_dbg_mask = QDF_TRACE_LEVEL_MAX;
3708*5113495bSYour Name qdf_export_symbol(qdf_dbg_mask);
3709*5113495bSYour Name qdf_declare_param(qdf_dbg_mask, int);
3710*5113495bSYour Name 
3711*5113495bSYour Name /*
3712*5113495bSYour Name  * QDF can be passed parameters which indicate the
3713*5113495bSYour Name  * debug level for each module.
3714*5113495bSYour Name  * an array of string values are passed, each string hold the following form
3715*5113495bSYour Name  *
3716*5113495bSYour Name  * <module name string>=<integer debug level value>
3717*5113495bSYour Name  *
3718*5113495bSYour Name  * The array qdf_dbg_arr will hold these module-string=value strings
3719*5113495bSYour Name  * The variable qdf_dbg_arr_cnt will have the count of how many such
3720*5113495bSYour Name  * string values were passed.
3721*5113495bSYour Name  */
3722*5113495bSYour Name static char *qdf_dbg_arr[QDF_MODULE_ID_MAX];
3723*5113495bSYour Name static int qdf_dbg_arr_cnt;
3724*5113495bSYour Name qdf_declare_param_array(qdf_dbg_arr, charp, &qdf_dbg_arr_cnt);
3725*5113495bSYour Name 
set_cumulative_verbose_mask(QDF_TRACE_LEVEL max_level)3726*5113495bSYour Name static uint16_t set_cumulative_verbose_mask(QDF_TRACE_LEVEL max_level)
3727*5113495bSYour Name {
3728*5113495bSYour Name 	uint16_t category_verbose_mask = 0;
3729*5113495bSYour Name 	QDF_TRACE_LEVEL level;
3730*5113495bSYour Name 
3731*5113495bSYour Name 	for (level = QDF_TRACE_LEVEL_FATAL; level <= max_level; level++) {
3732*5113495bSYour Name 		category_verbose_mask |=
3733*5113495bSYour Name 			QDF_TRACE_LEVEL_TO_MODULE_BITMASK(level);
3734*5113495bSYour Name 	}
3735*5113495bSYour Name 	return category_verbose_mask;
3736*5113495bSYour Name }
3737*5113495bSYour Name 
find_qdf_module_from_string(char * str)3738*5113495bSYour Name static QDF_MODULE_ID find_qdf_module_from_string(char *str)
3739*5113495bSYour Name {
3740*5113495bSYour Name 	QDF_MODULE_ID mod_id;
3741*5113495bSYour Name 
3742*5113495bSYour Name 	for (mod_id = 0; mod_id < QDF_MODULE_ID_MAX; mod_id++) {
3743*5113495bSYour Name 		if (strcasecmp(str,
3744*5113495bSYour Name 				g_qdf_category_name[mod_id].category_name_str)
3745*5113495bSYour Name 				== 0) {
3746*5113495bSYour Name 			break;
3747*5113495bSYour Name 		}
3748*5113495bSYour Name 	}
3749*5113495bSYour Name 	return mod_id;
3750*5113495bSYour Name }
3751*5113495bSYour Name 
process_qdf_dbg_arr_param(struct category_info * cinfo,int array_index)3752*5113495bSYour Name static void process_qdf_dbg_arr_param(struct category_info *cinfo,
3753*5113495bSYour Name 					int array_index)
3754*5113495bSYour Name {
3755*5113495bSYour Name 	char *mod_val_str, *mod_str, *val_str;
3756*5113495bSYour Name 	unsigned long dbg_level;
3757*5113495bSYour Name 	QDF_MODULE_ID mod_id;
3758*5113495bSYour Name 
3759*5113495bSYour Name 	mod_val_str = qdf_dbg_arr[array_index];
3760*5113495bSYour Name 	mod_str = strsep(&mod_val_str, "=");
3761*5113495bSYour Name 	val_str = mod_val_str;
3762*5113495bSYour Name 	if (!val_str) {
3763*5113495bSYour Name 		pr_info("qdf_dbg_arr: %s not in the <mod>=<val> form\n",
3764*5113495bSYour Name 				mod_str);
3765*5113495bSYour Name 		return;
3766*5113495bSYour Name 	}
3767*5113495bSYour Name 
3768*5113495bSYour Name 	mod_id = find_qdf_module_from_string(mod_str);
3769*5113495bSYour Name 	if (mod_id >= QDF_MODULE_ID_MAX) {
3770*5113495bSYour Name 		pr_info("ERROR!!Module name %s not in the list of modules\n",
3771*5113495bSYour Name 				mod_str);
3772*5113495bSYour Name 		return;
3773*5113495bSYour Name 	}
3774*5113495bSYour Name 
3775*5113495bSYour Name 	if (kstrtol(val_str, 10, &dbg_level) < 0) {
3776*5113495bSYour Name 		pr_info("ERROR!!Invalid debug level for module: %s\n",
3777*5113495bSYour Name 				mod_str);
3778*5113495bSYour Name 		return;
3779*5113495bSYour Name 	}
3780*5113495bSYour Name 
3781*5113495bSYour Name 	if (dbg_level >= QDF_TRACE_LEVEL_MAX) {
3782*5113495bSYour Name 		pr_info("ERROR!!Debug level for %s too high", mod_str);
3783*5113495bSYour Name 		pr_info("max: %d given %lu\n", QDF_TRACE_LEVEL_MAX,
3784*5113495bSYour Name 				dbg_level);
3785*5113495bSYour Name 		return;
3786*5113495bSYour Name 	}
3787*5113495bSYour Name 
3788*5113495bSYour Name 	pr_info("User passed setting module %s(%d) to level %lu\n",
3789*5113495bSYour Name 			mod_str,
3790*5113495bSYour Name 			mod_id,
3791*5113495bSYour Name 			dbg_level);
3792*5113495bSYour Name 	cinfo[mod_id].category_verbose_mask =
3793*5113495bSYour Name 		set_cumulative_verbose_mask((QDF_TRACE_LEVEL)dbg_level);
3794*5113495bSYour Name }
3795*5113495bSYour Name 
set_default_trace_levels(struct category_info * cinfo)3796*5113495bSYour Name static void set_default_trace_levels(struct category_info *cinfo)
3797*5113495bSYour Name {
3798*5113495bSYour Name 	int i;
3799*5113495bSYour Name 	static QDF_TRACE_LEVEL module_trace_default_level[QDF_MODULE_ID_MAX] = {
3800*5113495bSYour Name 		[QDF_MODULE_ID_TDLS] = QDF_TRACE_LEVEL_NONE,
3801*5113495bSYour Name 		[QDF_MODULE_ID_ACS] = QDF_TRACE_LEVEL_NONE,
3802*5113495bSYour Name 		[QDF_MODULE_ID_SCAN_SM] = QDF_TRACE_LEVEL_NONE,
3803*5113495bSYour Name 		[QDF_MODULE_ID_SCANENTRY] = QDF_TRACE_LEVEL_NONE,
3804*5113495bSYour Name 		[QDF_MODULE_ID_WDS] = QDF_TRACE_LEVEL_NONE,
3805*5113495bSYour Name 		[QDF_MODULE_ID_ACTION] = QDF_TRACE_LEVEL_NONE,
3806*5113495bSYour Name 		[QDF_MODULE_ID_ROAM] = QDF_TRACE_LEVEL_NONE,
3807*5113495bSYour Name 		[QDF_MODULE_ID_INACT] = QDF_TRACE_LEVEL_NONE,
3808*5113495bSYour Name 		[QDF_MODULE_ID_DOTH] = QDF_TRACE_LEVEL_NONE,
3809*5113495bSYour Name 		[QDF_MODULE_ID_IQUE] = QDF_TRACE_LEVEL_NONE,
3810*5113495bSYour Name 		[QDF_MODULE_ID_WME] = QDF_TRACE_LEVEL_NONE,
3811*5113495bSYour Name 		[QDF_MODULE_ID_ACL] = QDF_TRACE_LEVEL_NONE,
3812*5113495bSYour Name 		[QDF_MODULE_ID_WPA] = QDF_TRACE_LEVEL_NONE,
3813*5113495bSYour Name 		[QDF_MODULE_ID_RADKEYS] = QDF_TRACE_LEVEL_NONE,
3814*5113495bSYour Name 		[QDF_MODULE_ID_RADDUMP] = QDF_TRACE_LEVEL_NONE,
3815*5113495bSYour Name 		[QDF_MODULE_ID_RADIUS] = QDF_TRACE_LEVEL_NONE,
3816*5113495bSYour Name 		[QDF_MODULE_ID_DOT1XSM] = QDF_TRACE_LEVEL_NONE,
3817*5113495bSYour Name 		[QDF_MODULE_ID_DOT1X] = QDF_TRACE_LEVEL_NONE,
3818*5113495bSYour Name 		[QDF_MODULE_ID_POWER] = QDF_TRACE_LEVEL_NONE,
3819*5113495bSYour Name 		[QDF_MODULE_ID_STATE] = QDF_TRACE_LEVEL_NONE,
3820*5113495bSYour Name 		[QDF_MODULE_ID_OUTPUT] = QDF_TRACE_LEVEL_NONE,
3821*5113495bSYour Name 		[QDF_MODULE_ID_SCAN] = QDF_TRACE_LEVEL_ERROR,
3822*5113495bSYour Name 		[QDF_MODULE_ID_AUTH] = QDF_TRACE_LEVEL_NONE,
3823*5113495bSYour Name 		[QDF_MODULE_ID_ASSOC] = QDF_TRACE_LEVEL_NONE,
3824*5113495bSYour Name 		[QDF_MODULE_ID_NODE] = QDF_TRACE_LEVEL_NONE,
3825*5113495bSYour Name 		[QDF_MODULE_ID_ELEMID] = QDF_TRACE_LEVEL_NONE,
3826*5113495bSYour Name 		[QDF_MODULE_ID_XRATE] = QDF_TRACE_LEVEL_NONE,
3827*5113495bSYour Name 		[QDF_MODULE_ID_INPUT] = QDF_TRACE_LEVEL_NONE,
3828*5113495bSYour Name 		[QDF_MODULE_ID_CRYPTO] = QDF_TRACE_LEVEL_NONE,
3829*5113495bSYour Name 		[QDF_MODULE_ID_DUMPPKTS] = QDF_TRACE_LEVEL_NONE,
3830*5113495bSYour Name 		[QDF_MODULE_ID_DEBUG] = QDF_TRACE_LEVEL_NONE,
3831*5113495bSYour Name 		[QDF_MODULE_ID_MLME] = QDF_TRACE_LEVEL_ERROR,
3832*5113495bSYour Name 		[QDF_MODULE_ID_RRM] = QDF_TRACE_LEVEL_NONE,
3833*5113495bSYour Name 		[QDF_MODULE_ID_WNM] = QDF_TRACE_LEVEL_NONE,
3834*5113495bSYour Name 		[QDF_MODULE_ID_P2P_PROT] = QDF_TRACE_LEVEL_NONE,
3835*5113495bSYour Name 		[QDF_MODULE_ID_PROXYARP] = QDF_TRACE_LEVEL_NONE,
3836*5113495bSYour Name 		[QDF_MODULE_ID_L2TIF] = QDF_TRACE_LEVEL_NONE,
3837*5113495bSYour Name 		[QDF_MODULE_ID_WIFIPOS] = QDF_TRACE_LEVEL_NONE,
3838*5113495bSYour Name 		[QDF_MODULE_ID_WRAP] = QDF_TRACE_LEVEL_NONE,
3839*5113495bSYour Name 		[QDF_MODULE_ID_DFS] = QDF_TRACE_LEVEL_NONE,
3840*5113495bSYour Name 		[QDF_MODULE_ID_ATF] = QDF_TRACE_LEVEL_ERROR,
3841*5113495bSYour Name 		[QDF_MODULE_ID_SPLITMAC] = QDF_TRACE_LEVEL_NONE,
3842*5113495bSYour Name 		[QDF_MODULE_ID_IOCTL] = QDF_TRACE_LEVEL_NONE,
3843*5113495bSYour Name 		[QDF_MODULE_ID_NAC] = QDF_TRACE_LEVEL_NONE,
3844*5113495bSYour Name 		[QDF_MODULE_ID_MESH] = QDF_TRACE_LEVEL_NONE,
3845*5113495bSYour Name 		[QDF_MODULE_ID_MBO] = QDF_TRACE_LEVEL_NONE,
3846*5113495bSYour Name 		[QDF_MODULE_ID_EXTIOCTL_CHANSWITCH] = QDF_TRACE_LEVEL_NONE,
3847*5113495bSYour Name 		[QDF_MODULE_ID_EXTIOCTL_CHANSSCAN] = QDF_TRACE_LEVEL_NONE,
3848*5113495bSYour Name 		[QDF_MODULE_ID_TLSHIM] = QDF_TRACE_LEVEL_NONE,
3849*5113495bSYour Name 		[QDF_MODULE_ID_WMI] = QDF_TRACE_LEVEL_ERROR,
3850*5113495bSYour Name 		[QDF_MODULE_ID_HTT] = QDF_TRACE_LEVEL_NONE,
3851*5113495bSYour Name 		[QDF_MODULE_ID_HDD] = QDF_TRACE_LEVEL_NONE,
3852*5113495bSYour Name 		[QDF_MODULE_ID_SME] = QDF_TRACE_LEVEL_NONE,
3853*5113495bSYour Name 		[QDF_MODULE_ID_PE] = QDF_TRACE_LEVEL_NONE,
3854*5113495bSYour Name 		[QDF_MODULE_ID_WMA] = QDF_TRACE_LEVEL_NONE,
3855*5113495bSYour Name 		[QDF_MODULE_ID_SYS] = QDF_TRACE_LEVEL_NONE,
3856*5113495bSYour Name 		[QDF_MODULE_ID_QDF] = QDF_TRACE_LEVEL_ERROR,
3857*5113495bSYour Name 		[QDF_MODULE_ID_SAP] = QDF_TRACE_LEVEL_NONE,
3858*5113495bSYour Name 		[QDF_MODULE_ID_HDD_SOFTAP] = QDF_TRACE_LEVEL_NONE,
3859*5113495bSYour Name 		[QDF_MODULE_ID_HDD_DATA] = QDF_TRACE_LEVEL_NONE,
3860*5113495bSYour Name 		[QDF_MODULE_ID_HDD_SAP_DATA] = QDF_TRACE_LEVEL_NONE,
3861*5113495bSYour Name 		[QDF_MODULE_ID_HIF] = QDF_TRACE_LEVEL_ERROR,
3862*5113495bSYour Name 		[QDF_MODULE_ID_HTC] = QDF_TRACE_LEVEL_NONE,
3863*5113495bSYour Name 		[QDF_MODULE_ID_TXRX] = QDF_TRACE_LEVEL_NONE,
3864*5113495bSYour Name 		[QDF_MODULE_ID_QDF_DEVICE] = QDF_TRACE_LEVEL_NONE,
3865*5113495bSYour Name 		[QDF_MODULE_ID_CFG] = QDF_TRACE_LEVEL_NONE,
3866*5113495bSYour Name 		[QDF_MODULE_ID_BMI] = QDF_TRACE_LEVEL_NONE,
3867*5113495bSYour Name 		[QDF_MODULE_ID_EPPING] = QDF_TRACE_LEVEL_NONE,
3868*5113495bSYour Name 		[QDF_MODULE_ID_QVIT] = QDF_TRACE_LEVEL_NONE,
3869*5113495bSYour Name 		[QDF_MODULE_ID_DP] = QDF_TRACE_LEVEL_FATAL,
3870*5113495bSYour Name 		[QDF_MODULE_ID_HAL] = QDF_TRACE_LEVEL_NONE,
3871*5113495bSYour Name 		[QDF_MODULE_ID_SOC] = QDF_TRACE_LEVEL_NONE,
3872*5113495bSYour Name 		[QDF_MODULE_ID_OS_IF] = QDF_TRACE_LEVEL_NONE,
3873*5113495bSYour Name 		[QDF_MODULE_ID_TARGET_IF] = QDF_TRACE_LEVEL_INFO,
3874*5113495bSYour Name 		[QDF_MODULE_ID_SCHEDULER] = QDF_TRACE_LEVEL_FATAL,
3875*5113495bSYour Name 		[QDF_MODULE_ID_MGMT_TXRX] = QDF_TRACE_LEVEL_NONE,
3876*5113495bSYour Name 		[QDF_MODULE_ID_SERIALIZATION] = QDF_TRACE_LEVEL_ERROR,
3877*5113495bSYour Name 		[QDF_MODULE_ID_PMO] = QDF_TRACE_LEVEL_NONE,
3878*5113495bSYour Name 		[QDF_MODULE_ID_P2P] = QDF_TRACE_LEVEL_NONE,
3879*5113495bSYour Name 		[QDF_MODULE_ID_POLICY_MGR] = QDF_TRACE_LEVEL_NONE,
3880*5113495bSYour Name 		[QDF_MODULE_ID_CONFIG] = QDF_TRACE_LEVEL_ERROR,
3881*5113495bSYour Name 		[QDF_MODULE_ID_REGULATORY] = QDF_TRACE_LEVEL_NONE,
3882*5113495bSYour Name 		[QDF_MODULE_ID_SA_API] = QDF_TRACE_LEVEL_NONE,
3883*5113495bSYour Name 		[QDF_MODULE_ID_NAN] = QDF_TRACE_LEVEL_NONE,
3884*5113495bSYour Name 		[QDF_MODULE_ID_OFFCHAN_TXRX] = QDF_TRACE_LEVEL_NONE,
3885*5113495bSYour Name 		[QDF_MODULE_ID_SON] = QDF_TRACE_LEVEL_NONE,
3886*5113495bSYour Name 		[QDF_MODULE_ID_SPECTRAL] = QDF_TRACE_LEVEL_ERROR,
3887*5113495bSYour Name 		[QDF_MODULE_ID_OBJ_MGR] = QDF_TRACE_LEVEL_FATAL,
3888*5113495bSYour Name 		[QDF_MODULE_ID_NSS] = QDF_TRACE_LEVEL_ERROR,
3889*5113495bSYour Name 		[QDF_MODULE_ID_ROAM_DEBUG] = QDF_TRACE_LEVEL_ERROR,
3890*5113495bSYour Name 		[QDF_MODULE_ID_CDP] = QDF_TRACE_LEVEL_NONE,
3891*5113495bSYour Name 		[QDF_MODULE_ID_DIRECT_BUF_RX] = QDF_TRACE_LEVEL_ERROR,
3892*5113495bSYour Name 		[QDF_MODULE_ID_DISA] = QDF_TRACE_LEVEL_NONE,
3893*5113495bSYour Name 		[QDF_MODULE_ID_GREEN_AP] = QDF_TRACE_LEVEL_ERROR,
3894*5113495bSYour Name 		[QDF_MODULE_ID_FTM] = QDF_TRACE_LEVEL_ERROR,
3895*5113495bSYour Name 		[QDF_MODULE_ID_FD] = QDF_TRACE_LEVEL_ERROR,
3896*5113495bSYour Name 		[QDF_MODULE_ID_OCB] = QDF_TRACE_LEVEL_ERROR,
3897*5113495bSYour Name 		[QDF_MODULE_ID_IPA] = QDF_TRACE_LEVEL_NONE,
3898*5113495bSYour Name 		[QDF_MODULE_ID_ACTION_OUI] = QDF_TRACE_LEVEL_NONE,
3899*5113495bSYour Name 		[QDF_MODULE_ID_CP_STATS] = QDF_TRACE_LEVEL_ERROR,
3900*5113495bSYour Name 		[QDF_MODULE_ID_DCS] = QDF_TRACE_LEVEL_ERROR,
3901*5113495bSYour Name 		[QDF_MODULE_ID_MBSSIE] = QDF_TRACE_LEVEL_INFO,
3902*5113495bSYour Name 		[QDF_MODULE_ID_FWOL] = QDF_TRACE_LEVEL_NONE,
3903*5113495bSYour Name 		[QDF_MODULE_ID_SM_ENGINE] = QDF_TRACE_LEVEL_ERROR,
3904*5113495bSYour Name 		[QDF_MODULE_ID_CMN_MLME] = QDF_TRACE_LEVEL_INFO,
3905*5113495bSYour Name 		[QDF_MODULE_ID_BSSCOLOR] = QDF_TRACE_LEVEL_ERROR,
3906*5113495bSYour Name 		[QDF_MODULE_ID_CFR] = QDF_TRACE_LEVEL_ERROR,
3907*5113495bSYour Name 		[QDF_MODULE_ID_DP_TX_CAPTURE] = QDF_TRACE_LEVEL_FATAL,
3908*5113495bSYour Name 		[QDF_MODULE_ID_INTEROP_ISSUES_AP] = QDF_TRACE_LEVEL_NONE,
3909*5113495bSYour Name 		[QDF_MODULE_ID_DENYLIST_MGR] = QDF_TRACE_LEVEL_NONE,
3910*5113495bSYour Name 		[QDF_MODULE_ID_QLD] = QDF_TRACE_LEVEL_ERROR,
3911*5113495bSYour Name 		[QDF_MODULE_ID_DYNAMIC_MODE_CHG] = QDF_TRACE_LEVEL_INFO,
3912*5113495bSYour Name 		[QDF_MODULE_ID_COEX] = QDF_TRACE_LEVEL_ERROR,
3913*5113495bSYour Name 		[QDF_MODULE_ID_MON_FILTER] = QDF_TRACE_LEVEL_INFO,
3914*5113495bSYour Name 		[QDF_MODULE_ID_PKT_CAPTURE] = QDF_TRACE_LEVEL_NONE,
3915*5113495bSYour Name 		[QDF_MODULE_ID_RPTR] = QDF_TRACE_LEVEL_INFO,
3916*5113495bSYour Name 		[QDF_MODULE_ID_6GHZ] = QDF_TRACE_LEVEL_ERROR,
3917*5113495bSYour Name 		[QDF_MODULE_ID_IOT_SIM] = QDF_TRACE_LEVEL_ERROR,
3918*5113495bSYour Name 		[QDF_MODULE_ID_MSCS] = QDF_TRACE_LEVEL_INFO,
3919*5113495bSYour Name 		[QDF_MODULE_ID_GPIO] = QDF_TRACE_LEVEL_NONE,
3920*5113495bSYour Name 		[QDF_MODULE_ID_IFMGR] = QDF_TRACE_LEVEL_ERROR,
3921*5113495bSYour Name 		[QDF_MODULE_ID_DIAG] = QDF_TRACE_LEVEL_ERROR,
3922*5113495bSYour Name 		[QDF_MODULE_ID_DP_INIT] = QDF_TRACE_LEVEL_FATAL,
3923*5113495bSYour Name 		[QDF_MODULE_ID_DP_TX] = QDF_TRACE_LEVEL_FATAL,
3924*5113495bSYour Name 		[QDF_MODULE_ID_DP_RX] = QDF_TRACE_LEVEL_FATAL,
3925*5113495bSYour Name 		[QDF_MODULE_ID_DP_STATS] = QDF_TRACE_LEVEL_FATAL,
3926*5113495bSYour Name 		[QDF_MODULE_ID_DP_HTT] = QDF_TRACE_LEVEL_FATAL,
3927*5113495bSYour Name 		[QDF_MODULE_ID_DP_PEER] = QDF_TRACE_LEVEL_FATAL,
3928*5113495bSYour Name 		[QDF_MODULE_ID_DP_RX_ERROR] = QDF_TRACE_LEVEL_FATAL,
3929*5113495bSYour Name 		[QDF_MODULE_ID_DP_HTT_TX_STATS] = QDF_TRACE_LEVEL_FATAL,
3930*5113495bSYour Name 		[QDF_MODULE_ID_DP_RX_MON_STATUS] = QDF_TRACE_LEVEL_FATAL,
3931*5113495bSYour Name 		[QDF_MODULE_ID_DP_RX_MON_DEST] = QDF_TRACE_LEVEL_FATAL,
3932*5113495bSYour Name 		[QDF_MODULE_ID_DP_REO] = QDF_TRACE_LEVEL_FATAL,
3933*5113495bSYour Name 		[QDF_MODULE_ID_DP_TX_COMP] = QDF_TRACE_LEVEL_FATAL,
3934*5113495bSYour Name 		[QDF_MODULE_ID_DP_VDEV] = QDF_TRACE_LEVEL_FATAL,
3935*5113495bSYour Name 		[QDF_MODULE_ID_DP_CDP] = QDF_TRACE_LEVEL_FATAL,
3936*5113495bSYour Name 		[QDF_MODULE_ID_TSO] = QDF_TRACE_LEVEL_FATAL,
3937*5113495bSYour Name 		[QDF_MODULE_ID_ME] = QDF_TRACE_LEVEL_INFO,
3938*5113495bSYour Name 		[QDF_MODULE_ID_QWRAP] = QDF_TRACE_LEVEL_FATAL,
3939*5113495bSYour Name 		[QDF_MODULE_ID_DBDC_REP] = QDF_TRACE_LEVEL_FATAL,
3940*5113495bSYour Name 		[QDF_MODULE_ID_EXT_AP] = QDF_TRACE_LEVEL_NONE,
3941*5113495bSYour Name 		[QDF_MODULE_ID_MLO] = QDF_TRACE_LEVEL_INFO,
3942*5113495bSYour Name 		[QDF_MODULE_ID_MLOIE] = QDF_TRACE_LEVEL_INFO,
3943*5113495bSYour Name 		[QDF_MODULE_ID_MBSS] = QDF_TRACE_LEVEL_ERROR,
3944*5113495bSYour Name 		[QDF_MODULE_ID_MON] = QDF_TRACE_LEVEL_ERROR,
3945*5113495bSYour Name 		[QDF_MODULE_ID_MGMT_RX_REO] = QDF_TRACE_LEVEL_WARN,
3946*5113495bSYour Name 		[QDF_MODULE_ID_TWT] = QDF_TRACE_LEVEL_ERROR,
3947*5113495bSYour Name 		[QDF_MODULE_ID_WLAN_PRE_CAC] = QDF_TRACE_LEVEL_ERROR,
3948*5113495bSYour Name 		[QDF_MODULE_ID_T2LM] = QDF_TRACE_LEVEL_ERROR,
3949*5113495bSYour Name 		[QDF_MODULE_ID_DP_SAWF] = QDF_TRACE_LEVEL_ERROR,
3950*5113495bSYour Name 		[QDF_MODULE_ID_SCS] = QDF_TRACE_LEVEL_ERROR,
3951*5113495bSYour Name 		[QDF_MODULE_ID_DP_UMAC_RESET] = QDF_TRACE_LEVEL_ERROR,
3952*5113495bSYour Name 		[QDF_MODULE_ID_COAP] = QDF_TRACE_LEVEL_ERROR,
3953*5113495bSYour Name 		[QDF_MODULE_ID_FTM_TIME_SYNC] = QDF_TRACE_LEVEL_NONE,
3954*5113495bSYour Name 		[QDF_MODULE_ID_AFC] = QDF_TRACE_LEVEL_NONE,
3955*5113495bSYour Name 		[QDF_MODULE_ID_WIFI_RADAR] = QDF_TRACE_LEVEL_NONE,
3956*5113495bSYour Name 		[QDF_MODULE_ID_TARGET] = QDF_TRACE_LEVEL_NONE,
3957*5113495bSYour Name 		[QDF_MODULE_ID_QMI] = QDF_TRACE_LEVEL_ERROR,
3958*5113495bSYour Name 		[QDF_MODULE_ID_SOUNDING] = QDF_TRACE_LEVEL_ERROR,
3959*5113495bSYour Name 		[QDF_MODULE_ID_SAWF] = QDF_TRACE_LEVEL_INFO,
3960*5113495bSYour Name 		[QDF_MODULE_ID_EPCS] = QDF_TRACE_LEVEL_INFO,
3961*5113495bSYour Name 		[QDF_MODULE_ID_LL_SAP] = QDF_TRACE_LEVEL_NONE,
3962*5113495bSYour Name 		[QDF_MODULE_ID_COHOSTED_BSS] = QDF_TRACE_LEVEL_INFO,
3963*5113495bSYour Name 		[QDF_MODULE_ID_TELEMETRY_AGENT] = QDF_TRACE_LEVEL_ERROR,
3964*5113495bSYour Name 		[QDF_MODULE_ID_RF_PATH_SWITCH] = QDF_TRACE_LEVEL_INFO,
3965*5113495bSYour Name 		[QDF_MODULE_ID_ANY] = QDF_TRACE_LEVEL_INFO,
3966*5113495bSYour Name 	};
3967*5113495bSYour Name 
3968*5113495bSYour Name 	for (i = 0; i < MAX_SUPPORTED_CATEGORY; i++) {
3969*5113495bSYour Name 		cinfo[i].category_verbose_mask = set_cumulative_verbose_mask(
3970*5113495bSYour Name 				module_trace_default_level[i]);
3971*5113495bSYour Name 	}
3972*5113495bSYour Name }
3973*5113495bSYour Name 
qdf_shared_print_ctrl_init(void)3974*5113495bSYour Name void qdf_shared_print_ctrl_init(void)
3975*5113495bSYour Name {
3976*5113495bSYour Name 	int i;
3977*5113495bSYour Name 	struct category_info cinfo[MAX_SUPPORTED_CATEGORY];
3978*5113495bSYour Name 
3979*5113495bSYour Name 	set_default_trace_levels(cinfo);
3980*5113495bSYour Name 
3981*5113495bSYour Name 	/*
3982*5113495bSYour Name 	 * User specified across-module single debug level
3983*5113495bSYour Name 	 */
3984*5113495bSYour Name 	if ((qdf_dbg_mask >= 0) && (qdf_dbg_mask < QDF_TRACE_LEVEL_MAX)) {
3985*5113495bSYour Name 		pr_info("User specified module debug level of %d\n",
3986*5113495bSYour Name 			qdf_dbg_mask);
3987*5113495bSYour Name 		for (i = 0; i < MAX_SUPPORTED_CATEGORY; i++) {
3988*5113495bSYour Name 			cinfo[i].category_verbose_mask =
3989*5113495bSYour Name 			set_cumulative_verbose_mask(qdf_dbg_mask);
3990*5113495bSYour Name 		}
3991*5113495bSYour Name 	} else if (qdf_dbg_mask != QDF_TRACE_LEVEL_MAX) {
3992*5113495bSYour Name 		pr_info("qdf_dbg_mask value is invalid\n");
3993*5113495bSYour Name 		pr_info("Using the default module debug levels instead\n");
3994*5113495bSYour Name 	}
3995*5113495bSYour Name 
3996*5113495bSYour Name 	/*
3997*5113495bSYour Name 	 * Module ID-Level specified as array during module load
3998*5113495bSYour Name 	 */
3999*5113495bSYour Name 	for (i = 0; i < qdf_dbg_arr_cnt; i++) {
4000*5113495bSYour Name 		process_qdf_dbg_arr_param(cinfo, i);
4001*5113495bSYour Name 	}
4002*5113495bSYour Name 	qdf_pidx = qdf_print_ctrl_register(cinfo, NULL, NULL,
4003*5113495bSYour Name 			"LOG_SHARED_OBJ");
4004*5113495bSYour Name }
4005*5113495bSYour Name qdf_export_symbol(qdf_shared_print_ctrl_init);
4006*5113495bSYour Name #endif
4007*5113495bSYour Name 
4008*5113495bSYour Name #ifdef QCA_WIFI_MODULE_PARAMS_FROM_INI
qdf_module_param_handler(void * context,const char * str_param,const char * str)4009*5113495bSYour Name QDF_STATUS qdf_module_param_handler(void *context, const char *str_param,
4010*5113495bSYour Name 				    const char *str)
4011*5113495bSYour Name {
4012*5113495bSYour Name 	QDF_STATUS status = QDF_STATUS_E_FAILURE;
4013*5113495bSYour Name 	uint16_t param = 0;
4014*5113495bSYour Name 	uint32_t flush_tmr_prd;
4015*5113495bSYour Name 	bool dump_flag;
4016*5113495bSYour Name 
4017*5113495bSYour Name 	while (param < QDF_PARAM_MAX) {
4018*5113495bSYour Name 		if (qdf_str_eq(qdf_module_param[param], str_param)) {
4019*5113495bSYour Name 			switch (param) {
4020*5113495bSYour Name 			case MEM_DEBUG_DISABLED:
4021*5113495bSYour Name 				status = qdf_mem_debug_disabled_config_set(str);
4022*5113495bSYour Name 				break;
4023*5113495bSYour Name 			case QDF_DBG_MASK:
4024*5113495bSYour Name 				status = qdf_int32_parse(str, &qdf_dbg_mask);
4025*5113495bSYour Name 				break;
4026*5113495bSYour Name 			case PREALLOC_DISABLED:
4027*5113495bSYour Name 				status = qdf_prealloc_disabled_config_set(str);
4028*5113495bSYour Name 				break;
4029*5113495bSYour Name 			case QDF_LOG_DUMP_AT_KERNEL_ENABLE:
4030*5113495bSYour Name 				status = qdf_bool_parse(str, &dump_flag);
4031*5113495bSYour Name 				qdf_log_dump_at_kernel_enable = dump_flag;
4032*5113495bSYour Name 				break;
4033*5113495bSYour Name 			case QDF_DBG_ARR:
4034*5113495bSYour Name 				qdf_dbg_arr[0] = (char *)str;
4035*5113495bSYour Name 				status = QDF_STATUS_SUCCESS;
4036*5113495bSYour Name 				break;
4037*5113495bSYour Name 			case QDF_LOG_FLUSH_TIMER_PERIOD:
4038*5113495bSYour Name 				status = qdf_uint32_parse(str, &flush_tmr_prd);
4039*5113495bSYour Name 				qdf_log_flush_timer_period = flush_tmr_prd;
4040*5113495bSYour Name 				break;
4041*5113495bSYour Name 			default:
4042*5113495bSYour Name 				break;
4043*5113495bSYour Name 			}
4044*5113495bSYour Name 			return status;
4045*5113495bSYour Name 		}
4046*5113495bSYour Name 		param++;
4047*5113495bSYour Name 	}
4048*5113495bSYour Name 
4049*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
4050*5113495bSYour Name }
4051*5113495bSYour Name 
qdf_initialize_module_param_from_ini(void)4052*5113495bSYour Name void qdf_initialize_module_param_from_ini(void)
4053*5113495bSYour Name {
4054*5113495bSYour Name 	QDF_STATUS status;
4055*5113495bSYour Name 	char *path = QDF_WIFI_MODULE_PARAMS_FILE;
4056*5113495bSYour Name 
4057*5113495bSYour Name 	status = qdf_ini_parse(path, NULL, qdf_module_param_handler, NULL);
4058*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status)) {
4059*5113495bSYour Name 		QDF_TRACE_ERROR(QDF_MODULE_ID_QDF,
4060*5113495bSYour Name 				"Failed to parse *.ini file @ %s; status:%d",
4061*5113495bSYour Name 				path, status);
4062*5113495bSYour Name 		return;
4063*5113495bSYour Name 	}
4064*5113495bSYour Name }
4065*5113495bSYour Name #endif
4066*5113495bSYour Name 
qdf_print_set_category_verbose(unsigned int idx,QDF_MODULE_ID category,QDF_TRACE_LEVEL verbose,bool is_set)4067*5113495bSYour Name QDF_STATUS qdf_print_set_category_verbose(unsigned int idx,
4068*5113495bSYour Name 						QDF_MODULE_ID category,
4069*5113495bSYour Name 						QDF_TRACE_LEVEL verbose,
4070*5113495bSYour Name 						bool is_set)
4071*5113495bSYour Name {
4072*5113495bSYour Name 	/* Check if index passed is valid */
4073*5113495bSYour Name 	if (idx < 0 || idx >= MAX_PRINT_CONFIG_SUPPORTED) {
4074*5113495bSYour Name 		pr_err("%s: Invalid index - %d\n", __func__, idx);
4075*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
4076*5113495bSYour Name 	}
4077*5113495bSYour Name 
4078*5113495bSYour Name 	/* Check if print control object is in use */
4079*5113495bSYour Name 	if (!print_ctrl_obj[idx].in_use) {
4080*5113495bSYour Name 		pr_err("%s: Invalid print control object\n", __func__);
4081*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
4082*5113495bSYour Name 	}
4083*5113495bSYour Name 
4084*5113495bSYour Name 	/* Check if category passed is valid */
4085*5113495bSYour Name 	if (category < 0 || category >= MAX_SUPPORTED_CATEGORY) {
4086*5113495bSYour Name 		pr_err("%s: Invalid category: %d\n", __func__, category);
4087*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
4088*5113495bSYour Name 	}
4089*5113495bSYour Name 
4090*5113495bSYour Name 	/* Check if verbose mask is valid */
4091*5113495bSYour Name 	if (verbose < 0 || verbose >= QDF_TRACE_LEVEL_MAX) {
4092*5113495bSYour Name 		pr_err("%s: Invalid verbose level %d\n", __func__, verbose);
4093*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
4094*5113495bSYour Name 	}
4095*5113495bSYour Name 
4096*5113495bSYour Name 	if (verbose == QDF_TRACE_LEVEL_ALL) {
4097*5113495bSYour Name 		print_ctrl_obj[idx].cat_info[category].category_verbose_mask =
4098*5113495bSYour Name 				0xFFFF;
4099*5113495bSYour Name 		return QDF_STATUS_SUCCESS;
4100*5113495bSYour Name 	}
4101*5113495bSYour Name 
4102*5113495bSYour Name 	if (verbose == QDF_TRACE_LEVEL_NONE) {
4103*5113495bSYour Name 		print_ctrl_obj[idx].cat_info[category].category_verbose_mask =
4104*5113495bSYour Name 				QDF_TRACE_LEVEL_NONE;
4105*5113495bSYour Name 		return QDF_STATUS_SUCCESS;
4106*5113495bSYour Name 	}
4107*5113495bSYour Name 
4108*5113495bSYour Name 	if (!is_set) {
4109*5113495bSYour Name 		if (print_ctrl_obj[idx].cat_info[category].category_verbose_mask
4110*5113495bSYour Name 		    & QDF_TRACE_LEVEL_TO_MODULE_BITMASK(verbose)) {
4111*5113495bSYour Name 			print_ctrl_obj[idx].cat_info[category]
4112*5113495bSYour Name 				.category_verbose_mask &=
4113*5113495bSYour Name 				~QDF_TRACE_LEVEL_TO_MODULE_BITMASK(verbose);
4114*5113495bSYour Name 		}
4115*5113495bSYour Name 	} else {
4116*5113495bSYour Name 		print_ctrl_obj[idx].cat_info[category].category_verbose_mask |=
4117*5113495bSYour Name 				QDF_TRACE_LEVEL_TO_MODULE_BITMASK(verbose);
4118*5113495bSYour Name 	}
4119*5113495bSYour Name 
4120*5113495bSYour Name 	pr_debug("%s: Print control object %d, Category %d, Verbose level %d\n",
4121*5113495bSYour Name 		__func__,
4122*5113495bSYour Name 		idx,
4123*5113495bSYour Name 		category,
4124*5113495bSYour Name 		print_ctrl_obj[idx].cat_info[category].category_verbose_mask);
4125*5113495bSYour Name 
4126*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
4127*5113495bSYour Name }
4128*5113495bSYour Name qdf_export_symbol(qdf_print_set_category_verbose);
4129*5113495bSYour Name 
qdf_log_dump_at_kernel_level(bool enable)4130*5113495bSYour Name void qdf_log_dump_at_kernel_level(bool enable)
4131*5113495bSYour Name {
4132*5113495bSYour Name 	if (qdf_log_dump_at_kernel_enable == enable) {
4133*5113495bSYour Name 		QDF_TRACE_INFO(QDF_MODULE_ID_QDF,
4134*5113495bSYour Name 			       "qdf_log_dump_at_kernel_enable is already %d\n",
4135*5113495bSYour Name 			       enable);
4136*5113495bSYour Name 	}
4137*5113495bSYour Name 	qdf_log_dump_at_kernel_enable = enable;
4138*5113495bSYour Name }
4139*5113495bSYour Name 
4140*5113495bSYour Name qdf_export_symbol(qdf_log_dump_at_kernel_level);
4141*5113495bSYour Name 
qdf_print_get_category_verbose(unsigned int idx,QDF_MODULE_ID category)4142*5113495bSYour Name QDF_TRACE_LEVEL qdf_print_get_category_verbose(unsigned int idx,
4143*5113495bSYour Name 					       QDF_MODULE_ID category)
4144*5113495bSYour Name {
4145*5113495bSYour Name 	/* Check if index passed is valid */
4146*5113495bSYour Name 	if (idx < 0 || idx >= MAX_PRINT_CONFIG_SUPPORTED) {
4147*5113495bSYour Name 		pr_info("%s: Invalid index - %d\n", __func__, idx);
4148*5113495bSYour Name 		return false;
4149*5113495bSYour Name 	}
4150*5113495bSYour Name 
4151*5113495bSYour Name 	/* Check if print control object is in use */
4152*5113495bSYour Name 	if (!print_ctrl_obj[idx].in_use) {
4153*5113495bSYour Name 		pr_info("%s: Invalid print control object\n", __func__);
4154*5113495bSYour Name 		return false;
4155*5113495bSYour Name 	}
4156*5113495bSYour Name 
4157*5113495bSYour Name 	/* Check if category passed is valid */
4158*5113495bSYour Name 	if (category < 0 || category >= MAX_SUPPORTED_CATEGORY) {
4159*5113495bSYour Name 		pr_info("%s: Invalid category: %d\n", __func__, category);
4160*5113495bSYour Name 		return false;
4161*5113495bSYour Name 	}
4162*5113495bSYour Name 
4163*5113495bSYour Name 	return print_ctrl_obj[idx].cat_info[category].category_verbose_mask;
4164*5113495bSYour Name }
4165*5113495bSYour Name 
4166*5113495bSYour Name qdf_export_symbol(qdf_print_get_category_verbose);
4167*5113495bSYour Name 
qdf_print_is_category_enabled(unsigned int idx,QDF_MODULE_ID category)4168*5113495bSYour Name bool qdf_print_is_category_enabled(unsigned int idx, QDF_MODULE_ID category)
4169*5113495bSYour Name {
4170*5113495bSYour Name 	QDF_TRACE_LEVEL verbose_mask;
4171*5113495bSYour Name 
4172*5113495bSYour Name 	verbose_mask = qdf_print_get_category_verbose(idx, category);
4173*5113495bSYour Name 
4174*5113495bSYour Name 	if (verbose_mask == QDF_TRACE_LEVEL_NONE)
4175*5113495bSYour Name 		return false;
4176*5113495bSYour Name 	else
4177*5113495bSYour Name 		return true;
4178*5113495bSYour Name }
4179*5113495bSYour Name 
4180*5113495bSYour Name qdf_export_symbol(qdf_print_is_category_enabled);
4181*5113495bSYour Name 
qdf_print_is_verbose_enabled(unsigned int idx,QDF_MODULE_ID category,QDF_TRACE_LEVEL verbose)4182*5113495bSYour Name bool qdf_print_is_verbose_enabled(unsigned int idx, QDF_MODULE_ID category,
4183*5113495bSYour Name 				  QDF_TRACE_LEVEL verbose)
4184*5113495bSYour Name {
4185*5113495bSYour Name 	bool verbose_enabled = false;
4186*5113495bSYour Name 
4187*5113495bSYour Name 	/* Check if index passed is valid */
4188*5113495bSYour Name 	if (idx < 0 || idx >= MAX_PRINT_CONFIG_SUPPORTED) {
4189*5113495bSYour Name 		pr_info("%s: Invalid index - %d\n", __func__, idx);
4190*5113495bSYour Name 		return verbose_enabled;
4191*5113495bSYour Name 	}
4192*5113495bSYour Name 
4193*5113495bSYour Name 	/* Check if print control object is in use */
4194*5113495bSYour Name 	if (!print_ctrl_obj[idx].in_use) {
4195*5113495bSYour Name 		pr_info("%s: Invalid print control object\n", __func__);
4196*5113495bSYour Name 		return verbose_enabled;
4197*5113495bSYour Name 	}
4198*5113495bSYour Name 
4199*5113495bSYour Name 	/* Check if category passed is valid */
4200*5113495bSYour Name 	if (category < 0 || category >= MAX_SUPPORTED_CATEGORY) {
4201*5113495bSYour Name 		pr_info("%s: Invalid category: %d\n", __func__, category);
4202*5113495bSYour Name 		return verbose_enabled;
4203*5113495bSYour Name 	}
4204*5113495bSYour Name 
4205*5113495bSYour Name 	if ((verbose == QDF_TRACE_LEVEL_NONE) ||
4206*5113495bSYour Name 	    (verbose >= QDF_TRACE_LEVEL_MAX)) {
4207*5113495bSYour Name 		verbose_enabled = false;
4208*5113495bSYour Name 	} else if (verbose == QDF_TRACE_LEVEL_ALL) {
4209*5113495bSYour Name 		if (print_ctrl_obj[idx].cat_info[category]
4210*5113495bSYour Name 					.category_verbose_mask == 0xFFFF)
4211*5113495bSYour Name 			verbose_enabled = true;
4212*5113495bSYour Name 	} else {
4213*5113495bSYour Name 		verbose_enabled =
4214*5113495bSYour Name 		(print_ctrl_obj[idx].cat_info[category].category_verbose_mask &
4215*5113495bSYour Name 		 QDF_TRACE_LEVEL_TO_MODULE_BITMASK(verbose)) ? true : false;
4216*5113495bSYour Name 	}
4217*5113495bSYour Name 
4218*5113495bSYour Name 	return verbose_enabled;
4219*5113495bSYour Name }
4220*5113495bSYour Name qdf_export_symbol(qdf_print_is_verbose_enabled);
4221*5113495bSYour Name 
4222*5113495bSYour Name #ifdef DBG_LVL_MAC_FILTERING
4223*5113495bSYour Name 
qdf_print_set_node_flag(unsigned int idx,uint8_t enable)4224*5113495bSYour Name QDF_STATUS qdf_print_set_node_flag(unsigned int idx, uint8_t enable)
4225*5113495bSYour Name {
4226*5113495bSYour Name 	/* Check if index passed is valid */
4227*5113495bSYour Name 	if (idx < 0 || idx >= MAX_PRINT_CONFIG_SUPPORTED) {
4228*5113495bSYour Name 		pr_info("%s: Invalid index - %d\n", __func__, idx);
4229*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
4230*5113495bSYour Name 	}
4231*5113495bSYour Name 
4232*5113495bSYour Name 	/* Check if print control object is in use */
4233*5113495bSYour Name 	if (!print_ctrl_obj[idx].in_use) {
4234*5113495bSYour Name 		pr_info("%s: Invalid print control object\n", __func__);
4235*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
4236*5113495bSYour Name 	}
4237*5113495bSYour Name 
4238*5113495bSYour Name 	if (enable > 1) {
4239*5113495bSYour Name 		pr_info("%s: Incorrect input: Use 1 or 0 to enable or disable\n",
4240*5113495bSYour Name 			__func__);
4241*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
4242*5113495bSYour Name 	}
4243*5113495bSYour Name 
4244*5113495bSYour Name 	print_ctrl_obj[idx].dbglvlmac_on = enable;
4245*5113495bSYour Name 	pr_info("%s: DbgLVLmac feature %s\n",
4246*5113495bSYour Name 		__func__,
4247*5113495bSYour Name 		((enable) ? "enabled" : "disabled"));
4248*5113495bSYour Name 
4249*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
4250*5113495bSYour Name }
4251*5113495bSYour Name qdf_export_symbol(qdf_print_set_node_flag);
4252*5113495bSYour Name 
qdf_print_get_node_flag(unsigned int idx)4253*5113495bSYour Name bool qdf_print_get_node_flag(unsigned int idx)
4254*5113495bSYour Name {
4255*5113495bSYour Name 	bool node_flag = false;
4256*5113495bSYour Name 
4257*5113495bSYour Name 	/* Check if index passed is valid */
4258*5113495bSYour Name 	if (idx < 0 || idx >= MAX_PRINT_CONFIG_SUPPORTED) {
4259*5113495bSYour Name 		pr_info("%s: Invalid index - %d\n", __func__, idx);
4260*5113495bSYour Name 		return node_flag;
4261*5113495bSYour Name 	}
4262*5113495bSYour Name 
4263*5113495bSYour Name 	/* Check if print control object is in use */
4264*5113495bSYour Name 	if (!print_ctrl_obj[idx].in_use) {
4265*5113495bSYour Name 		pr_info("%s: Invalid print control object\n", __func__);
4266*5113495bSYour Name 		return node_flag;
4267*5113495bSYour Name 	}
4268*5113495bSYour Name 
4269*5113495bSYour Name 	if (print_ctrl_obj[idx].dbglvlmac_on)
4270*5113495bSYour Name 		node_flag = true;
4271*5113495bSYour Name 
4272*5113495bSYour Name 	return node_flag;
4273*5113495bSYour Name }
4274*5113495bSYour Name qdf_export_symbol(qdf_print_get_node_flag);
4275*5113495bSYour Name 
qdf_print_clean_node_flag(unsigned int idx)4276*5113495bSYour Name void qdf_print_clean_node_flag(unsigned int idx)
4277*5113495bSYour Name {
4278*5113495bSYour Name 	/* Disable dbglvlmac_on during cleanup */
4279*5113495bSYour Name 	print_ctrl_obj[idx].dbglvlmac_on = 0;
4280*5113495bSYour Name }
4281*5113495bSYour Name 
4282*5113495bSYour Name #else
4283*5113495bSYour Name 
qdf_print_clean_node_flag(unsigned int idx)4284*5113495bSYour Name void qdf_print_clean_node_flag(unsigned int idx)
4285*5113495bSYour Name {
4286*5113495bSYour Name 	/* No operation in case of no support for DBG_LVL_MAC_FILTERING */
4287*5113495bSYour Name 	return;
4288*5113495bSYour Name }
4289*5113495bSYour Name #endif
4290*5113495bSYour Name 
QDF_PRINT_INFO(unsigned int idx,QDF_MODULE_ID module,QDF_TRACE_LEVEL level,char * str_format,...)4291*5113495bSYour Name void QDF_PRINT_INFO(unsigned int idx, QDF_MODULE_ID module,
4292*5113495bSYour Name 		    QDF_TRACE_LEVEL level,
4293*5113495bSYour Name 		    char *str_format, ...)
4294*5113495bSYour Name {
4295*5113495bSYour Name 	va_list args;
4296*5113495bSYour Name 
4297*5113495bSYour Name 	/* Generic wrapper API will compile qdf_vprint in order to
4298*5113495bSYour Name 	 * log the message. Once QDF converged debug framework is in
4299*5113495bSYour Name 	 * place, this will be changed to adapt to the framework, compiling
4300*5113495bSYour Name 	 * call to converged tracing API
4301*5113495bSYour Name 	 */
4302*5113495bSYour Name 	va_start(args, str_format);
4303*5113495bSYour Name 	qdf_vprint(str_format, args);
4304*5113495bSYour Name 	va_end(args);
4305*5113495bSYour Name }
4306*5113495bSYour Name qdf_export_symbol(QDF_PRINT_INFO);
4307*5113495bSYour Name 
4308*5113495bSYour Name #ifdef WLAN_LOGGING_SOCK_SVC_ENABLE
qdf_logging_init(void)4309*5113495bSYour Name void qdf_logging_init(void)
4310*5113495bSYour Name {
4311*5113495bSYour Name 	wlan_logging_sock_init_svc();
4312*5113495bSYour Name 	nl_srv_init(NULL, WLAN_NLINK_PROTO_FAMILY);
4313*5113495bSYour Name 	wlan_logging_notifier_init(qdf_log_dump_at_kernel_enable);
4314*5113495bSYour Name 	wlan_logging_set_flush_timer(qdf_log_flush_timer_period);
4315*5113495bSYour Name }
4316*5113495bSYour Name 
qdf_logging_exit(void)4317*5113495bSYour Name void qdf_logging_exit(void)
4318*5113495bSYour Name {
4319*5113495bSYour Name 	wlan_logging_notifier_deinit(qdf_log_dump_at_kernel_enable);
4320*5113495bSYour Name 	nl_srv_exit();
4321*5113495bSYour Name 	wlan_logging_sock_deinit_svc();
4322*5113495bSYour Name }
4323*5113495bSYour Name 
qdf_logging_set_flush_timer(uint32_t milliseconds)4324*5113495bSYour Name int qdf_logging_set_flush_timer(uint32_t milliseconds)
4325*5113495bSYour Name {
4326*5113495bSYour Name 	if (wlan_logging_set_flush_timer(milliseconds) == 0)
4327*5113495bSYour Name 		return QDF_STATUS_SUCCESS;
4328*5113495bSYour Name 	else
4329*5113495bSYour Name 		return QDF_STATUS_E_FAILURE;
4330*5113495bSYour Name }
4331*5113495bSYour Name 
qdf_logging_flush_logs(void)4332*5113495bSYour Name void qdf_logging_flush_logs(void)
4333*5113495bSYour Name {
4334*5113495bSYour Name 	wlan_flush_host_logs_for_fatal();
4335*5113495bSYour Name }
4336*5113495bSYour Name 
4337*5113495bSYour Name #else
qdf_logging_init(void)4338*5113495bSYour Name void qdf_logging_init(void)
4339*5113495bSYour Name {
4340*5113495bSYour Name 	nl_srv_init(NULL, WLAN_NLINK_PROTO_FAMILY);
4341*5113495bSYour Name }
4342*5113495bSYour Name 
qdf_logging_exit(void)4343*5113495bSYour Name void qdf_logging_exit(void)
4344*5113495bSYour Name {
4345*5113495bSYour Name 	nl_srv_exit();
4346*5113495bSYour Name }
4347*5113495bSYour Name 
qdf_logging_set_flush_timer(uint32_t milliseconds)4348*5113495bSYour Name int qdf_logging_set_flush_timer(uint32_t milliseconds)
4349*5113495bSYour Name {
4350*5113495bSYour Name 	return QDF_STATUS_E_FAILURE;
4351*5113495bSYour Name }
4352*5113495bSYour Name 
qdf_logging_flush_logs(void)4353*5113495bSYour Name void qdf_logging_flush_logs(void)
4354*5113495bSYour Name {
4355*5113495bSYour Name }
4356*5113495bSYour Name #endif
4357*5113495bSYour Name 
4358*5113495bSYour Name qdf_export_symbol(qdf_logging_set_flush_timer);
4359*5113495bSYour Name qdf_export_symbol(qdf_logging_flush_logs);
4360*5113495bSYour Name 
4361*5113495bSYour Name #ifdef CONFIG_KALLSYMS
qdf_sprint_symbol(char * buffer,void * addr)4362*5113495bSYour Name inline int qdf_sprint_symbol(char *buffer, void *addr)
4363*5113495bSYour Name {
4364*5113495bSYour Name 	return sprint_symbol(buffer, (unsigned long)addr);
4365*5113495bSYour Name }
4366*5113495bSYour Name #else
qdf_sprint_symbol(char * buffer,void * addr)4367*5113495bSYour Name int qdf_sprint_symbol(char *buffer, void *addr)
4368*5113495bSYour Name {
4369*5113495bSYour Name 	if (!buffer)
4370*5113495bSYour Name 		return 0;
4371*5113495bSYour Name 
4372*5113495bSYour Name 	buffer[0] = '\0';
4373*5113495bSYour Name 	return 1;
4374*5113495bSYour Name }
4375*5113495bSYour Name #endif
4376*5113495bSYour Name qdf_export_symbol(qdf_sprint_symbol);
4377*5113495bSYour Name 
qdf_set_pidx(int pidx)4378*5113495bSYour Name void qdf_set_pidx(int pidx)
4379*5113495bSYour Name {
4380*5113495bSYour Name 	qdf_pidx = pidx;
4381*5113495bSYour Name }
4382*5113495bSYour Name qdf_export_symbol(qdf_set_pidx);
4383*5113495bSYour Name 
qdf_get_pidx(void)4384*5113495bSYour Name int qdf_get_pidx(void)
4385*5113495bSYour Name {
4386*5113495bSYour Name 	return qdf_pidx;
4387*5113495bSYour Name }
4388*5113495bSYour Name qdf_export_symbol(qdf_get_pidx);
4389*5113495bSYour Name 
4390*5113495bSYour Name #ifdef PANIC_ON_BUG
4391*5113495bSYour Name #ifdef CONFIG_SLUB_DEBUG
__qdf_bug(void)4392*5113495bSYour Name void __qdf_bug(void)
4393*5113495bSYour Name {
4394*5113495bSYour Name 	BUG();
4395*5113495bSYour Name }
4396*5113495bSYour Name qdf_export_symbol(__qdf_bug);
4397*5113495bSYour Name #endif /* CONFIG_SLUB_DEBUG */
4398*5113495bSYour Name #endif /* PANIC_ON_BUG */
4399*5113495bSYour Name 
4400*5113495bSYour Name #ifdef WLAN_QCOM_VA_MINIDUMP
4401*5113495bSYour Name static bool qdf_va_md_initialized;
4402*5113495bSYour Name static qdf_list_t qdf_va_md_list;
4403*5113495bSYour Name static qdf_spinlock_t qdf_va_md_list_lock;
4404*5113495bSYour Name #define QDF_MINIDUMP_LIST_SIZE 128
4405*5113495bSYour Name 
4406*5113495bSYour Name struct qdf_va_md_entry {
4407*5113495bSYour Name 	qdf_list_node_t node;
4408*5113495bSYour Name 	struct va_md_entry data;
4409*5113495bSYour Name };
4410*5113495bSYour Name 
qdf_va_md_notif_handler(struct notifier_block * this,unsigned long event,void * ptr)4411*5113495bSYour Name static int qdf_va_md_notif_handler(struct notifier_block *this,
4412*5113495bSYour Name 				   unsigned long event, void *ptr)
4413*5113495bSYour Name {
4414*5113495bSYour Name 	struct qdf_va_md_entry *entry;
4415*5113495bSYour Name 	struct qdf_va_md_entry *next;
4416*5113495bSYour Name 
4417*5113495bSYour Name 	qdf_spin_lock_irqsave(&qdf_va_md_list_lock);
4418*5113495bSYour Name 	qdf_list_for_each_del(&qdf_va_md_list, entry, next, node) {
4419*5113495bSYour Name 		qcom_va_md_add_region(&entry->data);
4420*5113495bSYour Name 	}
4421*5113495bSYour Name 
4422*5113495bSYour Name 	qdf_spin_unlock_irqrestore(&qdf_va_md_list_lock);
4423*5113495bSYour Name 	return NOTIFY_OK;
4424*5113495bSYour Name }
4425*5113495bSYour Name 
4426*5113495bSYour Name static struct notifier_block qdf_va_md_notif_blk = {
4427*5113495bSYour Name 	.notifier_call = qdf_va_md_notif_handler,
4428*5113495bSYour Name 	.priority = INT_MAX,
4429*5113495bSYour Name };
4430*5113495bSYour Name 
__qdf_minidump_init(void)4431*5113495bSYour Name void __qdf_minidump_init(void)
4432*5113495bSYour Name {
4433*5113495bSYour Name 	int ret;
4434*5113495bSYour Name 
4435*5113495bSYour Name 	if (qdf_va_md_initialized)
4436*5113495bSYour Name 		return;
4437*5113495bSYour Name 
4438*5113495bSYour Name 	qdf_spinlock_create(&qdf_va_md_list_lock);
4439*5113495bSYour Name 	qdf_list_create(&qdf_va_md_list, QDF_MINIDUMP_LIST_SIZE);
4440*5113495bSYour Name 	ret = qcom_va_md_register(qdf_trace_wlan_modname(),
4441*5113495bSYour Name 				  &qdf_va_md_notif_blk);
4442*5113495bSYour Name 	qdf_va_md_initialized = !ret;
4443*5113495bSYour Name }
4444*5113495bSYour Name 
4445*5113495bSYour Name qdf_export_symbol(__qdf_minidump_init);
4446*5113495bSYour Name 
__qdf_minidump_deinit(void)4447*5113495bSYour Name void __qdf_minidump_deinit(void)
4448*5113495bSYour Name {
4449*5113495bSYour Name 	struct qdf_va_md_entry *entry;
4450*5113495bSYour Name 	struct qdf_va_md_entry *next;
4451*5113495bSYour Name 
4452*5113495bSYour Name 	if (!qdf_va_md_initialized)
4453*5113495bSYour Name 		return;
4454*5113495bSYour Name 
4455*5113495bSYour Name 	qdf_va_md_initialized = false;
4456*5113495bSYour Name 	qcom_va_md_unregister(qdf_trace_wlan_modname(),
4457*5113495bSYour Name 			      &qdf_va_md_notif_blk);
4458*5113495bSYour Name 	qdf_spin_lock_irqsave(&qdf_va_md_list_lock);
4459*5113495bSYour Name 	qdf_list_for_each_del(&qdf_va_md_list, entry, next, node) {
4460*5113495bSYour Name 		qdf_list_remove_node(&qdf_va_md_list, &entry->node);
4461*5113495bSYour Name 		qdf_mem_free(entry);
4462*5113495bSYour Name 	}
4463*5113495bSYour Name 
4464*5113495bSYour Name 	qdf_list_destroy(&qdf_va_md_list);
4465*5113495bSYour Name 	qdf_spin_unlock_irqrestore(&qdf_va_md_list_lock);
4466*5113495bSYour Name 	qdf_spinlock_destroy(&qdf_va_md_list_lock);
4467*5113495bSYour Name }
4468*5113495bSYour Name 
4469*5113495bSYour Name qdf_export_symbol(__qdf_minidump_deinit);
4470*5113495bSYour Name 
__qdf_minidump_log(void * start_addr,size_t size,const char * name)4471*5113495bSYour Name void __qdf_minidump_log(void *start_addr, size_t size, const char *name)
4472*5113495bSYour Name {
4473*5113495bSYour Name 	struct qdf_va_md_entry *entry;
4474*5113495bSYour Name 	QDF_STATUS status;
4475*5113495bSYour Name 
4476*5113495bSYour Name 	if (!qdf_va_md_initialized)
4477*5113495bSYour Name 		return;
4478*5113495bSYour Name 
4479*5113495bSYour Name 	entry = qdf_mem_malloc(sizeof(*entry));
4480*5113495bSYour Name 	if (!entry) {
4481*5113495bSYour Name 		qdf_err("malloc failed for %s: %pK, %zu",
4482*5113495bSYour Name 			name, start_addr, size);
4483*5113495bSYour Name 		return;
4484*5113495bSYour Name 	}
4485*5113495bSYour Name 
4486*5113495bSYour Name 	qdf_str_lcopy(entry->data.owner, name, sizeof(entry->data.owner));
4487*5113495bSYour Name 	entry->data.vaddr = (unsigned long)start_addr;
4488*5113495bSYour Name 	entry->data.size = size;
4489*5113495bSYour Name 
4490*5113495bSYour Name 	qdf_spin_lock_irqsave(&qdf_va_md_list_lock);
4491*5113495bSYour Name 	status = qdf_list_insert_front(&qdf_va_md_list, &entry->node);
4492*5113495bSYour Name 	qdf_spin_unlock_irqrestore(&qdf_va_md_list_lock);
4493*5113495bSYour Name 	if (QDF_IS_STATUS_ERROR(status)) {
4494*5113495bSYour Name 		qdf_err("Failed to insert qdf va md entry, status %d", status);
4495*5113495bSYour Name 		qdf_mem_free(entry);
4496*5113495bSYour Name 	}
4497*5113495bSYour Name }
4498*5113495bSYour Name 
4499*5113495bSYour Name qdf_export_symbol(__qdf_minidump_log);
4500*5113495bSYour Name 
__qdf_minidump_remove(void * addr,size_t size,const char * name)4501*5113495bSYour Name void __qdf_minidump_remove(void *addr, size_t size, const char *name)
4502*5113495bSYour Name {
4503*5113495bSYour Name 	struct qdf_va_md_entry *entry;
4504*5113495bSYour Name 	struct qdf_va_md_entry *next;
4505*5113495bSYour Name 
4506*5113495bSYour Name 	if (!qdf_va_md_initialized)
4507*5113495bSYour Name 		return;
4508*5113495bSYour Name 
4509*5113495bSYour Name 	qdf_spin_lock_irqsave(&qdf_va_md_list_lock);
4510*5113495bSYour Name 	qdf_list_for_each_del(&qdf_va_md_list, entry, next, node) {
4511*5113495bSYour Name 		if (entry->data.vaddr == (unsigned long)addr &&
4512*5113495bSYour Name 		    entry->data.size == size &&
4513*5113495bSYour Name 		    !qdf_str_cmp(entry->data.owner, name)) {
4514*5113495bSYour Name 			qdf_list_remove_node(&qdf_va_md_list, &entry->node);
4515*5113495bSYour Name 			qdf_mem_free(entry);
4516*5113495bSYour Name 			break;
4517*5113495bSYour Name 		}
4518*5113495bSYour Name 	}
4519*5113495bSYour Name 
4520*5113495bSYour Name 	qdf_spin_unlock_irqrestore(&qdf_va_md_list_lock);
4521*5113495bSYour Name }
4522*5113495bSYour Name 
4523*5113495bSYour Name qdf_export_symbol(__qdf_minidump_remove);
4524*5113495bSYour Name #endif
4525