blob: b0252a9e4af70b5ef134f6d6f28c0c6cf35f019d [file] [log] [blame]
Chouhan, Anurag57763182016-03-03 18:57:27 +05301/*
Bala Venkatesh61f47a62018-12-28 12:31:02 +05302 * Copyright (c) 2014-2019 The Linux Foundation. All rights reserved.
Chouhan, Anurag57763182016-03-03 18:57:27 +05303 *
Chouhan, Anurag57763182016-03-03 18:57:27 +05304 * Permission to use, copy, modify, and/or distribute this software for
5 * any purpose with or without fee is hereby granted, provided that the
6 * above copyright notice and this permission notice appear in all
7 * copies.
8 *
9 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
10 * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
11 * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
12 * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
13 * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
14 * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
15 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
16 * PERFORMANCE OF THIS SOFTWARE.
17 */
18
Chouhan, Anurag57763182016-03-03 18:57:27 +053019/**
20 * DOC: qdf_trace
21 * QCA driver framework (QDF) trace APIs
22 * Trace, logging, and debugging definitions and APIs
23 */
24
25/* Include Files */
Dustin Brown2cd4bfb2018-02-26 13:00:20 -080026#include "qdf_str.h"
Chouhan, Anurag57763182016-03-03 18:57:27 +053027#include <qdf_trace.h>
Manikandan Mohana18b8642018-03-01 16:17:23 -080028#include <qdf_module.h>
Sathish Kumar59113a42017-01-04 12:02:24 +053029
Sathish Kumarfc93b2d2017-01-10 12:19:19 +053030/* macro to map qdf trace levels into the bitmask */
31#define QDF_TRACE_LEVEL_TO_MODULE_BITMASK(_level) ((1 << (_level)))
32
Adil Saeed Musthafabcf62ed2017-02-20 16:22:39 -080033#include <wlan_logging_sock_svc.h>
Adil Saeed Musthafa2ef27872017-05-02 16:40:45 -070034#include <qdf_module.h>
Adil Saeed Musthafa33188072017-03-13 12:13:47 -070035static int qdf_pidx = -1;
Adil Saeed Musthafa12205b52018-08-07 09:39:20 -070036static bool qdf_log_dump_at_kernel_enable = true;
37qdf_declare_param(qdf_log_dump_at_kernel_enable, bool);
38
39/* This value of 0 will disable the timer by default. */
40static uint32_t qdf_log_flush_timer_period;
41qdf_declare_param(qdf_log_flush_timer_period, uint);
Sathish Kumar59113a42017-01-04 12:02:24 +053042
Chouhan, Anurag57763182016-03-03 18:57:27 +053043#include "qdf_time.h"
Sreelakshmi Konamkie2e31352016-10-27 15:00:57 +053044#include "qdf_mc_timer.h"
Sathish Kumarfebd4b72017-01-10 12:19:19 +053045
46/* Global qdf print id */
Sathish Kumarfebd4b72017-01-10 12:19:19 +053047
Chouhan, Anurag57763182016-03-03 18:57:27 +053048/* Preprocessor definitions and constants */
49
Chouhan, Anurag57763182016-03-03 18:57:27 +053050enum qdf_timestamp_unit qdf_log_timestamp_type = QDF_LOG_TIMESTAMP_UNIT;
51
Mohit Khanna04252802017-08-27 09:43:43 -070052#define DP_TRACE_META_DATA_STRLEN 50
53
Rachit Kankane9cc217a2018-01-19 15:15:14 +053054#ifdef TRACE_RECORD
Chouhan, Anurag57763182016-03-03 18:57:27 +053055/* Static and Global variables */
56static spinlock_t ltrace_lock;
Chouhan, Anurag57763182016-03-03 18:57:27 +053057/* global qdf trace data */
58static t_qdf_trace_data g_qdf_trace_data;
59/*
60 * all the call back functions for dumping MTRACE messages from ring buffer
61 * are stored in qdf_trace_cb_table,these callbacks are initialized during init
62 * only so, we will make a copy of these call back functions and maintain in to
63 * qdf_trace_restore_cb_table. Incase if we make modifications to
64 * qdf_trace_cb_table, we can certainly retrieve all the call back functions
65 * back from Restore Table
66 */
67static tp_qdf_trace_cb qdf_trace_cb_table[QDF_MODULE_ID_MAX];
68static tp_qdf_trace_cb qdf_trace_restore_cb_table[QDF_MODULE_ID_MAX];
Rachit Kankane371fce22018-06-26 19:20:05 +053069
70#ifdef WLAN_LOGGING_BUFFERS_DYNAMICALLY
71static qdf_trace_record_t *g_qdf_trace_tbl;
72#else
73static qdf_trace_record_t g_qdf_trace_tbl[MAX_QDF_TRACE_RECORDS];
74#endif
75
Rachit Kankane9cc217a2018-01-19 15:15:14 +053076#endif
Wen Gonga5dfb6d2018-04-26 16:35:19 +080077
78#ifdef WLAN_FEATURE_MEMDUMP_ENABLE
Padma, Santhosh Kumar75394d62016-08-11 16:33:03 +053079static tp_qdf_state_info_cb qdf_state_info_table[QDF_MODULE_ID_MAX];
Wen Gonga5dfb6d2018-04-26 16:35:19 +080080#endif
Chouhan, Anurag57763182016-03-03 18:57:27 +053081
Nandha Kishore Easwarane43583f2017-05-15 21:01:13 +053082#ifdef CONFIG_DP_TRACE
Chouhan, Anurag57763182016-03-03 18:57:27 +053083/* Static and Global variables */
Rachit Kankaneb3ba7692018-06-27 18:42:34 +053084#ifdef WLAN_LOGGING_BUFFERS_DYNAMICALLY
85static struct qdf_dp_trace_record_s *g_qdf_dp_trace_tbl;
86#else
Chouhan, Anurag57763182016-03-03 18:57:27 +053087static struct qdf_dp_trace_record_s
88 g_qdf_dp_trace_tbl[MAX_QDF_DP_TRACE_RECORDS];
Rachit Kankaneb3ba7692018-06-27 18:42:34 +053089#endif
90static spinlock_t l_dp_trace_lock;
Chouhan, Anurag57763182016-03-03 18:57:27 +053091
92/*
93 * all the options to configure/control DP trace are
94 * defined in this structure
95 */
96static struct s_qdf_dp_trace_data g_qdf_dp_trace_data;
97/*
98 * all the call back functions for dumping DPTRACE messages from ring buffer
99 * are stored in qdf_dp_trace_cb_table, callbacks are initialized during init
100 */
Mohit Khanna7750a172017-05-15 15:53:33 -0700101static tp_qdf_dp_trace_cb qdf_dp_trace_cb_table[QDF_DP_TRACE_MAX + 1];
Nirav Shahae6a0b32016-04-26 11:44:42 +0530102#endif
Sathish Kumarfebd4b72017-01-10 12:19:19 +0530103
Chouhan, Anurag57763182016-03-03 18:57:27 +0530104/**
Chouhan, Anurag57763182016-03-03 18:57:27 +0530105 * qdf_snprintf() - wrapper function to snprintf
106 * @str_buffer: string Buffer
107 * @size: defines the size of the data record
108 * @str_format: Format string in which the message to be logged. This format
109 * string contains printf-like replacement parameters, which follow
110 * this parameter in the variable argument list.
111 *
112 * Return: None
113 */
114void qdf_snprintf(char *str_buffer, unsigned int size, char *str_format, ...)
115{
Dundi Ravitejaddf45012018-09-28 18:17:14 +0530116 snprintf(str_buffer, size, str_format);
Chouhan, Anurag57763182016-03-03 18:57:27 +0530117}
Manikandan Mohana18b8642018-03-01 16:17:23 -0800118qdf_export_symbol(qdf_snprintf);
Chouhan, Anurag57763182016-03-03 18:57:27 +0530119
120#ifdef QDF_ENABLE_TRACING
121
122/**
123 * qdf_trace_msg() - externally called trace function
124 * @module: Module identifier a member of the QDF_MODULE_ID
125 * enumeration that identifies the module issuing the trace message.
126 * @level: Trace level a member of the QDF_TRACE_LEVEL enumeration
127 * indicating the severity of the condition causing the trace message
128 * to be issued. More severe conditions are more likely to be logged.
129 * @str_format: Format string in which the message to be logged. This format
130 * string contains printf-like replacement parameters, which follow
131 * this parameter in the variable argument list.
132 *
133 * Checks the level of severity and accordingly prints the trace messages
134 *
135 * Return: None
136 */
137void qdf_trace_msg(QDF_MODULE_ID module, QDF_TRACE_LEVEL level,
Dustin Brown9c62f7d2019-02-19 16:31:37 -0800138 const char *str_format, ...)
Chouhan, Anurag57763182016-03-03 18:57:27 +0530139{
Sathish Kumarfebd4b72017-01-10 12:19:19 +0530140 va_list val;
Chouhan, Anurag57763182016-03-03 18:57:27 +0530141
Sathish Kumarfebd4b72017-01-10 12:19:19 +0530142 va_start(val, str_format);
143 qdf_trace_msg_cmn(qdf_pidx, module, level, str_format, val);
144 va_end(val);
Chouhan, Anurag57763182016-03-03 18:57:27 +0530145}
Manikandan Mohana18b8642018-03-01 16:17:23 -0800146qdf_export_symbol(qdf_trace_msg);
Chouhan, Anurag57763182016-03-03 18:57:27 +0530147
Dustin Brown013400c2017-11-16 13:29:24 -0800148void qdf_vtrace_msg(QDF_MODULE_ID module, QDF_TRACE_LEVEL level,
Dustin Brown9c62f7d2019-02-19 16:31:37 -0800149 const char *str_format, va_list val)
Dustin Brown013400c2017-11-16 13:29:24 -0800150{
151 qdf_trace_msg_cmn(qdf_pidx, module, level, str_format, val);
152}
Manikandan Mohana18b8642018-03-01 16:17:23 -0800153qdf_export_symbol(qdf_vtrace_msg);
Dustin Brown013400c2017-11-16 13:29:24 -0800154
Chouhan, Anurag57763182016-03-03 18:57:27 +0530155#define ROW_SIZE 16
156/* Buffer size = data bytes(2 hex chars plus space) + NULL */
Mohit Khanna04252802017-08-27 09:43:43 -0700157#define BUFFER_SIZE ((QDF_DP_TRACE_RECORD_SIZE * 3) + 1)
Chouhan, Anurag57763182016-03-03 18:57:27 +0530158
Himanshu Batrabcb10e62019-06-17 18:19:18 +0530159static void __qdf_trace_hex_dump(QDF_MODULE_ID module, QDF_TRACE_LEVEL level,
160 void *data, int buf_len, bool print_ascii)
Chouhan, Anurag57763182016-03-03 18:57:27 +0530161{
162 const u8 *ptr = data;
Adil Saeed Musthafafe366632017-08-14 13:09:20 -0700163 int i = 0;
Chouhan, Anurag57763182016-03-03 18:57:27 +0530164
Dustin Brownd7cfa492017-05-11 14:21:06 -0700165 if (!qdf_print_is_verbose_enabled(qdf_pidx, module, level))
Chouhan, Anurag57763182016-03-03 18:57:27 +0530166 return;
167
Adil Saeed Musthafafe366632017-08-14 13:09:20 -0700168 while (buf_len > 0) {
Dundi Ravitejadd1d8ba2018-05-15 14:16:21 +0530169 unsigned char linebuf[BUFFER_SIZE] = {0};
Dustin Brownd7cfa492017-05-11 14:21:06 -0700170 int linelen = min(buf_len, ROW_SIZE);
171
172 buf_len -= ROW_SIZE;
Chouhan, Anurag57763182016-03-03 18:57:27 +0530173
Adil Saeed Musthafafe366632017-08-14 13:09:20 -0700174 hex_dump_to_buffer(ptr, linelen, ROW_SIZE, 1,
Himanshu Batrabcb10e62019-06-17 18:19:18 +0530175 linebuf, sizeof(linebuf), print_ascii);
Chouhan, Anurag57763182016-03-03 18:57:27 +0530176
177 qdf_trace_msg(module, level, "%.8x: %s", i, linebuf);
Adil Saeed Musthafafe366632017-08-14 13:09:20 -0700178 ptr += ROW_SIZE;
179 i += ROW_SIZE;
Chouhan, Anurag57763182016-03-03 18:57:27 +0530180 }
181}
Himanshu Batrabcb10e62019-06-17 18:19:18 +0530182
183void qdf_trace_hex_dump(QDF_MODULE_ID module, QDF_TRACE_LEVEL level,
184 void *data, int buf_len)
185{
186 __qdf_trace_hex_dump(module, level, data, buf_len, false);
187}
188
Manikandan Mohana18b8642018-03-01 16:17:23 -0800189qdf_export_symbol(qdf_trace_hex_dump);
Chouhan, Anurag57763182016-03-03 18:57:27 +0530190
Himanshu Batrabcb10e62019-06-17 18:19:18 +0530191void qdf_trace_hex_ascii_dump(QDF_MODULE_ID module, QDF_TRACE_LEVEL level,
192 void *data, int buf_len)
193{
194 __qdf_trace_hex_dump(module, level, data, buf_len, true);
195}
196
197qdf_export_symbol(qdf_trace_hex_ascii_dump);
198
Chouhan, Anurag57763182016-03-03 18:57:27 +0530199#endif
200
Rachit Kankane9cc217a2018-01-19 15:15:14 +0530201#ifdef TRACE_RECORD
Rachit Kankane371fce22018-06-26 19:20:05 +0530202
203#ifdef WLAN_LOGGING_BUFFERS_DYNAMICALLY
204static inline QDF_STATUS allocate_g_qdf_trace_tbl_buffer(void)
205{
206 g_qdf_trace_tbl = vzalloc(MAX_QDF_TRACE_RECORDS *
207 sizeof(*g_qdf_trace_tbl));
208 QDF_BUG(g_qdf_trace_tbl);
209 return g_qdf_trace_tbl ? QDF_STATUS_SUCCESS : QDF_STATUS_E_NOMEM;
210}
211
212static inline void free_g_qdf_trace_tbl_buffer(void)
213{
214 vfree(g_qdf_trace_tbl);
215 g_qdf_trace_tbl = NULL;
216}
217#else
218static inline QDF_STATUS allocate_g_qdf_trace_tbl_buffer(void)
219{
220 return QDF_STATUS_SUCCESS;
221}
222
223static inline void free_g_qdf_trace_tbl_buffer(void)
224{ }
225#endif
Chouhan, Anurag57763182016-03-03 18:57:27 +0530226/**
227 * qdf_trace_enable() - Enable MTRACE for specific modules
228 * @bitmask_of_module_id: Bitmask according to enum of the modules.
229 * 32[dec] = 0010 0000 [bin] <enum of HDD is 5>
230 * 64[dec] = 0100 0000 [bin] <enum of SME is 6>
231 * 128[dec] = 1000 0000 [bin] <enum of PE is 7>
232 * @enable: can be true or false true implies enabling MTRACE false implies
233 * disabling MTRACE.
234 *
235 * Enable MTRACE for specific modules whose bits are set in bitmask and enable
236 * is true. if enable is false it disables MTRACE for that module. set the
237 * bitmask according to enum value of the modules.
238 * This functions will be called when you issue ioctl as mentioned following
239 * [iwpriv wlan0 setdumplog <value> <enable>].
240 * <value> - Decimal number, i.e. 64 decimal value shows only SME module,
241 * 128 decimal value shows only PE module, 192 decimal value shows PE and SME.
242 *
243 * Return: None
244 */
245void qdf_trace_enable(uint32_t bitmask_of_module_id, uint8_t enable)
246{
247 int i;
Srinivas Girigowda43977f72017-04-03 09:17:46 -0700248
Chouhan, Anurag57763182016-03-03 18:57:27 +0530249 if (bitmask_of_module_id) {
250 for (i = 0; i < QDF_MODULE_ID_MAX; i++) {
251 if (((bitmask_of_module_id >> i) & 1)) {
252 if (enable) {
253 if (NULL !=
254 qdf_trace_restore_cb_table[i]) {
255 qdf_trace_cb_table[i] =
256 qdf_trace_restore_cb_table[i];
257 }
258 } else {
259 qdf_trace_restore_cb_table[i] =
260 qdf_trace_cb_table[i];
261 qdf_trace_cb_table[i] = NULL;
262 }
263 }
264 }
265 } else {
266 if (enable) {
267 for (i = 0; i < QDF_MODULE_ID_MAX; i++) {
Jeff Johnson28312292019-03-18 09:49:07 -0700268 if (qdf_trace_restore_cb_table[i]) {
Chouhan, Anurag57763182016-03-03 18:57:27 +0530269 qdf_trace_cb_table[i] =
270 qdf_trace_restore_cb_table[i];
271 }
272 }
273 } else {
274 for (i = 0; i < QDF_MODULE_ID_MAX; i++) {
275 qdf_trace_restore_cb_table[i] =
276 qdf_trace_cb_table[i];
277 qdf_trace_cb_table[i] = NULL;
278 }
279 }
280 }
281}
Manikandan Mohana18b8642018-03-01 16:17:23 -0800282qdf_export_symbol(qdf_trace_enable);
Chouhan, Anurag57763182016-03-03 18:57:27 +0530283
284/**
285 * qdf_trace_init() - initializes qdf trace structures and variables
286 *
287 * Called immediately after cds_preopen, so that we can start recording HDD
288 * events ASAP.
289 *
290 * Return: None
291 */
292void qdf_trace_init(void)
293{
294 uint8_t i;
Srinivas Girigowda43977f72017-04-03 09:17:46 -0700295
Rachit Kankane371fce22018-06-26 19:20:05 +0530296 if (allocate_g_qdf_trace_tbl_buffer() != QDF_STATUS_SUCCESS)
297 return;
Chouhan, Anurag57763182016-03-03 18:57:27 +0530298 g_qdf_trace_data.head = INVALID_QDF_TRACE_ADDR;
299 g_qdf_trace_data.tail = INVALID_QDF_TRACE_ADDR;
300 g_qdf_trace_data.num = 0;
301 g_qdf_trace_data.enable = true;
302 g_qdf_trace_data.dump_count = DEFAULT_QDF_TRACE_DUMP_COUNT;
303 g_qdf_trace_data.num_since_last_dump = 0;
304
305 for (i = 0; i < QDF_MODULE_ID_MAX; i++) {
306 qdf_trace_cb_table[i] = NULL;
307 qdf_trace_restore_cb_table[i] = NULL;
308 }
309}
Manikandan Mohana18b8642018-03-01 16:17:23 -0800310qdf_export_symbol(qdf_trace_init);
Chouhan, Anurag57763182016-03-03 18:57:27 +0530311
312/**
Rachit Kankane371fce22018-06-26 19:20:05 +0530313 * qdf_trace_deinit() - frees memory allocated dynamically
314 *
315 * Called from cds_deinit, so that we can free the memory and resets
316 * the variables
317 *
318 * Return: None
319 */
320void qdf_trace_deinit(void)
321{
322 g_qdf_trace_data.enable = false;
323 g_qdf_trace_data.num = 0;
324 g_qdf_trace_data.head = INVALID_QDF_TRACE_ADDR;
325 g_qdf_trace_data.tail = INVALID_QDF_TRACE_ADDR;
326
327 free_g_qdf_trace_tbl_buffer();
328}
329
330qdf_export_symbol(qdf_trace_deinit);
331
332/**
Chouhan, Anurag57763182016-03-03 18:57:27 +0530333 * qdf_trace() - puts the messages in to ring-buffer
334 * @module: Enum of module, basically module id.
Ashish Kumar Dhanotiya27bcaf82018-06-26 16:57:40 +0530335 * @code: Code to be recorded
Chouhan, Anurag57763182016-03-03 18:57:27 +0530336 * @session: Session ID of the log
337 * @data: Actual message contents
338 *
339 * This function will be called from each module who wants record the messages
340 * in circular queue. Before calling this functions make sure you have
341 * registered your module with qdf through qdf_trace_register function.
342 *
343 * Return: None
344 */
345void qdf_trace(uint8_t module, uint8_t code, uint16_t session, uint32_t data)
346{
347 tp_qdf_trace_record rec = NULL;
348 unsigned long flags;
Sreelakshmi Konamkie2e31352016-10-27 15:00:57 +0530349 char time[18];
Chouhan, Anurag57763182016-03-03 18:57:27 +0530350
351 if (!g_qdf_trace_data.enable)
352 return;
353
354 /* if module is not registered, don't record for that module */
Jeff Johnson28312292019-03-18 09:49:07 -0700355 if (!qdf_trace_cb_table[module])
Chouhan, Anurag57763182016-03-03 18:57:27 +0530356 return;
357
Sreelakshmi Konamkie2e31352016-10-27 15:00:57 +0530358 qdf_get_time_of_the_day_in_hr_min_sec_usec(time, sizeof(time));
Chouhan, Anurag57763182016-03-03 18:57:27 +0530359 /* Aquire the lock so that only one thread at a time can fill the ring
360 * buffer
361 */
362 spin_lock_irqsave(&ltrace_lock, flags);
363
364 g_qdf_trace_data.num++;
365
366 if (g_qdf_trace_data.num > MAX_QDF_TRACE_RECORDS)
367 g_qdf_trace_data.num = MAX_QDF_TRACE_RECORDS;
368
369 if (INVALID_QDF_TRACE_ADDR == g_qdf_trace_data.head) {
370 /* first record */
371 g_qdf_trace_data.head = 0;
372 g_qdf_trace_data.tail = 0;
373 } else {
374 /* queue is not empty */
375 uint32_t tail = g_qdf_trace_data.tail + 1;
376
377 if (MAX_QDF_TRACE_RECORDS == tail)
378 tail = 0;
379
380 if (g_qdf_trace_data.head == tail) {
381 /* full */
382 if (MAX_QDF_TRACE_RECORDS == ++g_qdf_trace_data.head)
383 g_qdf_trace_data.head = 0;
384 }
385 g_qdf_trace_data.tail = tail;
386 }
387
388 rec = &g_qdf_trace_tbl[g_qdf_trace_data.tail];
389 rec->code = code;
390 rec->session = session;
391 rec->data = data;
Sreelakshmi Konamkie2e31352016-10-27 15:00:57 +0530392 rec->qtime = qdf_get_log_timestamp();
393 scnprintf(rec->time, sizeof(rec->time), "%s", time);
Chouhan, Anurag57763182016-03-03 18:57:27 +0530394 rec->module = module;
395 rec->pid = (in_interrupt() ? 0 : current->pid);
396 g_qdf_trace_data.num_since_last_dump++;
397 spin_unlock_irqrestore(&ltrace_lock, flags);
398}
Manikandan Mohana18b8642018-03-01 16:17:23 -0800399qdf_export_symbol(qdf_trace);
Chouhan, Anurag57763182016-03-03 18:57:27 +0530400
Ashish Kumar Dhanotiya27bcaf82018-06-26 16:57:40 +0530401#ifdef ENABLE_MTRACE_LOG
402void qdf_mtrace_log(QDF_MODULE_ID src_module, QDF_MODULE_ID dst_module,
403 uint16_t message_id, uint8_t vdev_id)
404{
405 uint32_t trace_log, payload;
406 static uint16_t counter;
407
408 trace_log = (src_module << 23) | (dst_module << 15) | message_id;
409 payload = (vdev_id << 16) | counter++;
410
411 QDF_TRACE(src_module, QDF_TRACE_LEVEL_TRACE, "%x %x",
412 trace_log, payload);
413}
414
415qdf_export_symbol(qdf_mtrace_log);
416#endif
417
418void qdf_mtrace(QDF_MODULE_ID src_module, QDF_MODULE_ID dst_module,
419 uint16_t message_id, uint8_t vdev_id, uint32_t data)
420{
421 qdf_trace(src_module, message_id, vdev_id, data);
422 qdf_mtrace_log(src_module, dst_module, message_id, vdev_id);
423}
424
425qdf_export_symbol(qdf_mtrace);
426
Chouhan, Anurag57763182016-03-03 18:57:27 +0530427/**
428 * qdf_trace_spin_lock_init() - initializes the lock variable before use
429 *
430 * This function will be called from cds_alloc_global_context, we will have lock
431 * available to use ASAP
432 *
433 * Return: None
434 */
435QDF_STATUS qdf_trace_spin_lock_init(void)
436{
437 spin_lock_init(&ltrace_lock);
438
439 return QDF_STATUS_SUCCESS;
440}
Manikandan Mohana18b8642018-03-01 16:17:23 -0800441qdf_export_symbol(qdf_trace_spin_lock_init);
Chouhan, Anurag57763182016-03-03 18:57:27 +0530442
443/**
444 * qdf_trace_register() - registers the call back functions
445 * @module_iD: enum value of module
446 * @qdf_trace_callback: call back functions to display the messages in
447 * particular format.
448 *
449 * Registers the call back functions to display the messages in particular
450 * format mentioned in these call back functions. This functions should be
451 * called by interested module in their init part as we will be ready to
452 * register as soon as modules are up.
453 *
454 * Return: None
455 */
Jeff Johnson5a0302c2018-05-19 09:40:57 -0700456void qdf_trace_register(QDF_MODULE_ID module_id,
Chouhan, Anurag57763182016-03-03 18:57:27 +0530457 tp_qdf_trace_cb qdf_trace_callback)
458{
Jeff Johnson5a0302c2018-05-19 09:40:57 -0700459 qdf_trace_cb_table[module_id] = qdf_trace_callback;
Chouhan, Anurag57763182016-03-03 18:57:27 +0530460}
Manikandan Mohana18b8642018-03-01 16:17:23 -0800461qdf_export_symbol(qdf_trace_register);
Chouhan, Anurag57763182016-03-03 18:57:27 +0530462
463/**
464 * qdf_trace_dump_all() - Dump data from ring buffer via call back functions
465 * registered with QDF
466 * @p_mac: Context of particular module
467 * @code: Reason code
468 * @session: Session id of log
469 * @count: Number of lines to dump starting from tail to head
470 *
471 * This function will be called up on issueing ioctl call as mentioned following
472 * [iwpriv wlan0 dumplog 0 0 <n> <bitmask_of_module>]
473 *
474 * <n> - number lines to dump starting from tail to head.
475 *
476 * <bitmask_of_module> - if anybody wants to know how many messages were
477 * recorded for particular module/s mentioned by setbit in bitmask from last
478 * <n> messages. It is optional, if you don't provide then it will dump
479 * everything from buffer.
480 *
481 * Return: None
482 */
483void qdf_trace_dump_all(void *p_mac, uint8_t code, uint8_t session,
Nandha Kishore Easwarane43583f2017-05-15 21:01:13 +0530484 uint32_t count, uint32_t bitmask_of_module)
Chouhan, Anurag57763182016-03-03 18:57:27 +0530485{
486 qdf_trace_record_t p_record;
487 int32_t i, tail;
488
489 if (!g_qdf_trace_data.enable) {
490 QDF_TRACE(QDF_MODULE_ID_SYS,
491 QDF_TRACE_LEVEL_ERROR, "Tracing Disabled");
492 return;
493 }
494
495 QDF_TRACE(QDF_MODULE_ID_SYS, QDF_TRACE_LEVEL_INFO,
Mohit Khanna7750a172017-05-15 15:53:33 -0700496 "DPT: Total Records: %d, Head: %d, Tail: %d",
Chouhan, Anurag57763182016-03-03 18:57:27 +0530497 g_qdf_trace_data.num, g_qdf_trace_data.head,
498 g_qdf_trace_data.tail);
499
500 /* aquire the lock so that only one thread at a time can read
501 * the ring buffer
502 */
503 spin_lock(&ltrace_lock);
504
505 if (g_qdf_trace_data.head != INVALID_QDF_TRACE_ADDR) {
506 i = g_qdf_trace_data.head;
507 tail = g_qdf_trace_data.tail;
508
509 if (count) {
510 if (count > g_qdf_trace_data.num)
511 count = g_qdf_trace_data.num;
512 if (tail >= (count - 1))
513 i = tail - count + 1;
514 else if (count != MAX_QDF_TRACE_RECORDS)
515 i = MAX_QDF_TRACE_RECORDS - ((count - 1) -
516 tail);
517 }
518
519 p_record = g_qdf_trace_tbl[i];
520 /* right now we are not using num_since_last_dump member but
521 * in future we might re-visit and use this member to track
522 * how many latest messages got added while we were dumping
523 * from ring buffer
524 */
525 g_qdf_trace_data.num_since_last_dump = 0;
526 spin_unlock(&ltrace_lock);
527 for (;; ) {
528 if ((code == 0 || (code == p_record.code)) &&
Jeff Johnson28312292019-03-18 09:49:07 -0700529 (qdf_trace_cb_table[p_record.module])) {
Chouhan, Anurag57763182016-03-03 18:57:27 +0530530 if (0 == bitmask_of_module) {
531 qdf_trace_cb_table[p_record.
532 module] (p_mac,
533 &p_record,
534 (uint16_t)
535 i);
536 } else {
537 if (bitmask_of_module &
538 (1 << p_record.module)) {
539 qdf_trace_cb_table[p_record.
540 module]
541 (p_mac, &p_record,
542 (uint16_t) i);
543 }
544 }
545 }
546
547 if (i == tail)
548 break;
549 i += 1;
550
551 spin_lock(&ltrace_lock);
552 if (MAX_QDF_TRACE_RECORDS == i) {
553 i = 0;
554 p_record = g_qdf_trace_tbl[0];
555 } else {
556 p_record = g_qdf_trace_tbl[i];
557 }
558 spin_unlock(&ltrace_lock);
559 }
560 } else {
561 spin_unlock(&ltrace_lock);
562 }
563}
Manikandan Mohana18b8642018-03-01 16:17:23 -0800564qdf_export_symbol(qdf_trace_dump_all);
Rachit Kankane9cc217a2018-01-19 15:15:14 +0530565#endif
Chouhan, Anurag57763182016-03-03 18:57:27 +0530566
Wen Gonga5dfb6d2018-04-26 16:35:19 +0800567#ifdef WLAN_FEATURE_MEMDUMP_ENABLE
Padma, Santhosh Kumar75394d62016-08-11 16:33:03 +0530568/**
569 * qdf_register_debugcb_init() - initializes debug callbacks
570 * to NULL
571 *
572 * Return: None
573 */
574void qdf_register_debugcb_init(void)
575{
576 uint8_t i;
577
578 for (i = 0; i < QDF_MODULE_ID_MAX; i++)
579 qdf_state_info_table[i] = NULL;
580}
Manikandan Mohana18b8642018-03-01 16:17:23 -0800581qdf_export_symbol(qdf_register_debugcb_init);
Padma, Santhosh Kumar75394d62016-08-11 16:33:03 +0530582
583/**
584 * qdf_register_debug_callback() - stores callback handlers to print
585 * state information
586 * @module_id: module id of layer
587 * @qdf_state_infocb: callback to be registered
588 *
589 * This function is used to store callback handlers to print
590 * state information
591 *
592 * Return: None
593 */
594void qdf_register_debug_callback(QDF_MODULE_ID module_id,
595 tp_qdf_state_info_cb qdf_state_infocb)
596{
597 qdf_state_info_table[module_id] = qdf_state_infocb;
598}
Manikandan Mohana18b8642018-03-01 16:17:23 -0800599qdf_export_symbol(qdf_register_debug_callback);
Padma, Santhosh Kumar75394d62016-08-11 16:33:03 +0530600
601/**
602 * qdf_state_info_dump_all() - it invokes callback of layer which registered
603 * its callback to print its state information.
604 * @buf: buffer pointer to be passed
605 * @size: size of buffer to be filled
606 * @driver_dump_size: actual size of buffer used
607 *
608 * Return: QDF_STATUS_SUCCESS on success
609 */
610QDF_STATUS qdf_state_info_dump_all(char *buf, uint16_t size,
611 uint16_t *driver_dump_size)
612{
613 uint8_t module, ret = QDF_STATUS_SUCCESS;
614 uint16_t buf_len = size;
615 char *buf_ptr = buf;
616
617 for (module = 0; module < QDF_MODULE_ID_MAX; module++) {
Jeff Johnson28312292019-03-18 09:49:07 -0700618 if (qdf_state_info_table[module]) {
Padma, Santhosh Kumar75394d62016-08-11 16:33:03 +0530619 qdf_state_info_table[module](&buf_ptr, &buf_len);
620 if (!buf_len) {
621 ret = QDF_STATUS_E_NOMEM;
622 break;
623 }
624 }
625 }
626
627 *driver_dump_size = size - buf_len;
628 return ret;
629}
Manikandan Mohana18b8642018-03-01 16:17:23 -0800630qdf_export_symbol(qdf_state_info_dump_all);
Wen Gonga5dfb6d2018-04-26 16:35:19 +0800631#endif
Padma, Santhosh Kumar75394d62016-08-11 16:33:03 +0530632
Nandha Kishore Easwarane43583f2017-05-15 21:01:13 +0530633#ifdef CONFIG_DP_TRACE
Rachit Kankaneb3ba7692018-06-27 18:42:34 +0530634
635#ifdef WLAN_LOGGING_BUFFERS_DYNAMICALLY
636static inline QDF_STATUS allocate_g_qdf_dp_trace_tbl_buffer(void)
637{
638 g_qdf_dp_trace_tbl = vzalloc(MAX_QDF_DP_TRACE_RECORDS *
639 sizeof(*g_qdf_dp_trace_tbl));
640 QDF_BUG(g_qdf_dp_trace_tbl);
641 return g_qdf_dp_trace_tbl ? QDF_STATUS_SUCCESS : QDF_STATUS_E_NOMEM;
642}
643
644static inline void free_g_qdf_dp_trace_tbl_buffer(void)
645{
646 vfree(g_qdf_dp_trace_tbl);
647 g_qdf_dp_trace_tbl = NULL;
648}
649#else
650static inline QDF_STATUS allocate_g_qdf_dp_trace_tbl_buffer(void)
651{
652 return QDF_STATUS_SUCCESS;
653}
654
655static inline void free_g_qdf_dp_trace_tbl_buffer(void)
656{ }
657#endif
658
Mohit Khanna04252802017-08-27 09:43:43 -0700659#define QDF_DP_TRACE_PREPEND_STR_SIZE 100
Rakshith Suresh Patkare105ac12018-12-06 20:40:49 +0530660/*
661 * one dp trace record can't be greater than 300 bytes.
662 * Max Size will be QDF_DP_TRACE_PREPEND_STR_SIZE(100) + BUFFER_SIZE(121).
663 * Always make sure to change this QDF_DP_TRACE_MAX_RECORD_SIZE
664 * value accordingly whenever above two mentioned MACRO value changes.
665 */
666#define QDF_DP_TRACE_MAX_RECORD_SIZE 300
667
Houston Hoffman125423f2016-09-27 23:39:17 -0700668static void qdf_dp_unused(struct qdf_dp_trace_record_s *record,
Mohit Khanna04252802017-08-27 09:43:43 -0700669 uint16_t index, uint8_t pdev_id, uint8_t info)
Houston Hoffman125423f2016-09-27 23:39:17 -0700670{
671 qdf_print("%s: QDF_DP_TRACE_MAX event should not be generated",
672 __func__);
673}
674
Chouhan, Anurag57763182016-03-03 18:57:27 +0530675/**
676 * qdf_dp_trace_init() - enables the DP trace
Mohit Khanna7750a172017-05-15 15:53:33 -0700677 * @live_mode_config: live mode configuration
678 * @thresh: high throughput threshold for disabling live mode
679 * @thresh_time_limit: max time to wait before deciding if thresh is crossed
680 * @verbosity: dptrace verbosity level
681 * @proto_bitmap: bitmap to enable/disable specific protocols
Chouhan, Anurag57763182016-03-03 18:57:27 +0530682 *
Mohit Khanna7750a172017-05-15 15:53:33 -0700683 * Called during driver load to init dptrace
684 *
685 * A brief note on the 'thresh' param -
686 * Total # of packets received in a bandwidth timer interval beyond which
687 * DP Trace logging for data packets (including ICMP) will be disabled.
688 * In memory logging will still continue for these packets. Other packets for
689 * which proto.bitmap is set will continue to be recorded in logs and in memory.
690
Chouhan, Anurag57763182016-03-03 18:57:27 +0530691 * Return: None
692 */
Mohit Khanna7750a172017-05-15 15:53:33 -0700693void qdf_dp_trace_init(bool live_mode_config, uint8_t thresh,
694 uint16_t time_limit, uint8_t verbosity,
Nirav Shah8f44a7e2019-11-05 08:38:47 +0530695 uint32_t proto_bitmap)
Chouhan, Anurag57763182016-03-03 18:57:27 +0530696{
697 uint8_t i;
698
Rachit Kankaneb3ba7692018-06-27 18:42:34 +0530699 if (allocate_g_qdf_dp_trace_tbl_buffer() != QDF_STATUS_SUCCESS) {
700 QDF_TRACE_ERROR(QDF_MODULE_ID_QDF,
701 "Failed!!! DP Trace buffer allocation");
702 return;
703 }
Chouhan, Anurag57763182016-03-03 18:57:27 +0530704 qdf_dp_trace_spin_lock_init();
Zhu Jianminaf3420a2017-06-12 17:55:43 +0800705 qdf_dp_trace_clear_buffer();
Mohit Khanna7750a172017-05-15 15:53:33 -0700706 g_qdf_dp_trace_data.enable = true;
707 g_qdf_dp_trace_data.no_of_record = 1;
708
709 g_qdf_dp_trace_data.live_mode_config = live_mode_config;
710 g_qdf_dp_trace_data.live_mode = live_mode_config;
711 g_qdf_dp_trace_data.high_tput_thresh = thresh;
712 g_qdf_dp_trace_data.thresh_time_limit = time_limit;
713 g_qdf_dp_trace_data.proto_bitmap = proto_bitmap;
714 g_qdf_dp_trace_data.verbosity = verbosity;
Manjunathappa Prakashcf4286b2018-06-05 20:46:20 -0700715 g_qdf_dp_trace_data.ini_conf_verbosity = verbosity;
Chouhan, Anurag57763182016-03-03 18:57:27 +0530716
Houston Hoffman125423f2016-09-27 23:39:17 -0700717 for (i = 0; i < ARRAY_SIZE(qdf_dp_trace_cb_table); i++)
Chouhan, Anurag57763182016-03-03 18:57:27 +0530718 qdf_dp_trace_cb_table[i] = qdf_dp_display_record;
Nirav Shaheaa20d82016-04-25 18:01:05 +0530719
Mohit Khanna04252802017-08-27 09:43:43 -0700720 qdf_dp_trace_cb_table[QDF_DP_TRACE_HDD_TX_PACKET_RECORD] =
721 qdf_dp_trace_cb_table[QDF_DP_TRACE_HDD_RX_PACKET_RECORD] =
722 qdf_dp_trace_cb_table[QDF_DP_TRACE_TX_PACKET_RECORD] =
723 qdf_dp_trace_cb_table[QDF_DP_TRACE_RX_PACKET_RECORD] =
724 qdf_dp_trace_cb_table[QDF_DP_TRACE_DROP_PACKET_RECORD] =
Mohit Khanna163c3172018-06-27 01:34:02 -0700725 qdf_dp_trace_cb_table[QDF_DP_TRACE_LI_DP_TX_PACKET_RECORD] =
726 qdf_dp_trace_cb_table[QDF_DP_TRACE_LI_DP_RX_PACKET_RECORD] =
Mohit Khanna04252802017-08-27 09:43:43 -0700727 qdf_dp_display_data_pkt_record;
728
Nirav Shaheaa20d82016-04-25 18:01:05 +0530729 qdf_dp_trace_cb_table[QDF_DP_TRACE_TXRX_PACKET_PTR_RECORD] =
730 qdf_dp_trace_cb_table[QDF_DP_TRACE_TXRX_FAST_PACKET_PTR_RECORD] =
731 qdf_dp_trace_cb_table[QDF_DP_TRACE_FREE_PACKET_PTR_RECORD] =
Mohit Khanna163c3172018-06-27 01:34:02 -0700732 qdf_dp_trace_cb_table[QDF_DP_TRACE_LI_DP_FREE_PACKET_PTR_RECORD] =
Nirav Shaheaa20d82016-04-25 18:01:05 +0530733 qdf_dp_display_ptr_record;
734 qdf_dp_trace_cb_table[QDF_DP_TRACE_EAPOL_PACKET_RECORD] =
735 qdf_dp_trace_cb_table[QDF_DP_TRACE_DHCP_PACKET_RECORD] =
736 qdf_dp_trace_cb_table[QDF_DP_TRACE_ARP_PACKET_RECORD] =
Zhu Jianminaf3420a2017-06-12 17:55:43 +0800737 qdf_dp_trace_cb_table[QDF_DP_TRACE_ICMP_PACKET_RECORD] =
Poddar, Siddarthbf4231b2017-07-10 16:27:01 +0530738 qdf_dp_trace_cb_table[QDF_DP_TRACE_ICMPv6_PACKET_RECORD] =
Saket Jhad8d9d992019-09-30 17:27:51 -0700739 qdf_dp_display_proto_pkt;
Nirav Shah31d694b2016-05-03 20:18:22 +0530740 qdf_dp_trace_cb_table[QDF_DP_TRACE_MGMT_PACKET_RECORD] =
741 qdf_dp_display_mgmt_pkt;
Nirav Shah8f44a7e2019-11-05 08:38:47 +0530742 qdf_dp_trace_cb_table[QDF_DP_TRACE_TX_CREDIT_RECORD] =
743 qdf_dp_display_credit_record;
Himanshu Agarwalc0b71452016-09-20 15:10:55 +0530744 qdf_dp_trace_cb_table[QDF_DP_TRACE_EVENT_RECORD] =
745 qdf_dp_display_event_record;
Nirav Shaheaa20d82016-04-25 18:01:05 +0530746
Houston Hoffman125423f2016-09-27 23:39:17 -0700747 qdf_dp_trace_cb_table[QDF_DP_TRACE_MAX] = qdf_dp_unused;
Chouhan, Anurag57763182016-03-03 18:57:27 +0530748}
Manikandan Mohana18b8642018-03-01 16:17:23 -0800749qdf_export_symbol(qdf_dp_trace_init);
Chouhan, Anurag57763182016-03-03 18:57:27 +0530750
Rachit Kankaneb3ba7692018-06-27 18:42:34 +0530751void qdf_dp_trace_deinit(void)
752{
753 if (!g_qdf_dp_trace_data.enable)
754 return;
755 spin_lock_bh(&l_dp_trace_lock);
756 g_qdf_dp_trace_data.enable = false;
757 g_qdf_dp_trace_data.no_of_record = 0;
Rachit Kankanedfd97f32018-07-05 18:10:36 +0530758 spin_unlock_bh(&l_dp_trace_lock);
Rachit Kankaneb3ba7692018-06-27 18:42:34 +0530759
760 free_g_qdf_dp_trace_tbl_buffer();
Rachit Kankaneb3ba7692018-06-27 18:42:34 +0530761}
Chouhan, Anurag57763182016-03-03 18:57:27 +0530762/**
763 * qdf_dp_trace_set_value() - Configure the value to control DP trace
764 * @proto_bitmap: defines the protocol to be tracked
765 * @no_of_records: defines the nth packet which is traced
766 * @verbosity: defines the verbosity level
767 *
768 * Return: None
769 */
Nirav Shah8f44a7e2019-11-05 08:38:47 +0530770void qdf_dp_trace_set_value(uint32_t proto_bitmap, uint8_t no_of_record,
Chouhan, Anurag57763182016-03-03 18:57:27 +0530771 uint8_t verbosity)
772{
773 g_qdf_dp_trace_data.proto_bitmap = proto_bitmap;
774 g_qdf_dp_trace_data.no_of_record = no_of_record;
775 g_qdf_dp_trace_data.verbosity = verbosity;
Manjunathappa Prakashcf4286b2018-06-05 20:46:20 -0700776 g_qdf_dp_trace_data.dynamic_verbosity_modify = true;
Chouhan, Anurag57763182016-03-03 18:57:27 +0530777}
Manikandan Mohana18b8642018-03-01 16:17:23 -0800778qdf_export_symbol(qdf_dp_trace_set_value);
Chouhan, Anurag57763182016-03-03 18:57:27 +0530779
780/**
Nandha Kishore Easwarane43583f2017-05-15 21:01:13 +0530781 * qdf_dp_trace_set_verbosity() - set verbosity value
782 *
783 * @val: Value to set
784 *
785 * Return: Null
786 */
787void qdf_dp_trace_set_verbosity(uint32_t val)
788{
789 g_qdf_dp_trace_data.verbosity = val;
790}
Manikandan Mohana18b8642018-03-01 16:17:23 -0800791qdf_export_symbol(qdf_dp_trace_set_verbosity);
Nandha Kishore Easwarane43583f2017-05-15 21:01:13 +0530792
793/**
794 * qdf_dp_get_verbosity) - get verbosity value
795 *
796 * Return: int
797 */
798uint8_t qdf_dp_get_verbosity(void)
799{
800 return g_qdf_dp_trace_data.verbosity;
801}
Manikandan Mohana18b8642018-03-01 16:17:23 -0800802qdf_export_symbol(qdf_dp_get_verbosity);
Nandha Kishore Easwarane43583f2017-05-15 21:01:13 +0530803
804/**
805 * qdf_dp_set_proto_bitmap() - set dp trace proto bitmap
806 *
807 * @val : unsigned bitmap to set
808 *
809 * Return: proto bitmap
810 */
811void qdf_dp_set_proto_bitmap(uint32_t val)
812{
813 g_qdf_dp_trace_data.proto_bitmap = val;
814}
Manikandan Mohana18b8642018-03-01 16:17:23 -0800815qdf_export_symbol(qdf_dp_set_proto_bitmap);
Nandha Kishore Easwarane43583f2017-05-15 21:01:13 +0530816
817/**
818 * qdf_dp_set_no_of_record() - set dp trace no_of_record
819 *
820 * @val : unsigned no_of_record to set
821 *
822 * Return: null
823 */
824void qdf_dp_set_no_of_record(uint32_t val)
825{
826 g_qdf_dp_trace_data.no_of_record = val;
827}
Manikandan Mohana18b8642018-03-01 16:17:23 -0800828qdf_export_symbol(qdf_dp_set_no_of_record);
Nandha Kishore Easwarane43583f2017-05-15 21:01:13 +0530829
830/**
831 * qdf_dp_get_no_of_record() - get dp trace no_of_record
832 *
833 * Return: number of records
834 */
835uint8_t qdf_dp_get_no_of_record(void)
836{
837 return g_qdf_dp_trace_data.no_of_record;
838}
Manikandan Mohana18b8642018-03-01 16:17:23 -0800839qdf_export_symbol(qdf_dp_get_no_of_record);
Nandha Kishore Easwarane43583f2017-05-15 21:01:13 +0530840
841
842/**
Mohit Khanna163c3172018-06-27 01:34:02 -0700843 * qdf_dp_trace_verbosity_check() - check whether verbosity level is enabled
Chouhan, Anurag57763182016-03-03 18:57:27 +0530844 * @code: defines the event
845 *
Nirav Shaheaa20d82016-04-25 18:01:05 +0530846 * In High verbosity all codes are logged.
847 * For Med/Low and Default case code which has
848 * less value than corresponding verbosity codes
849 * are logged.
850 *
Chouhan, Anurag57763182016-03-03 18:57:27 +0530851 * Return: true or false depends on whether tracing enabled
852 */
Mohit Khanna163c3172018-06-27 01:34:02 -0700853static bool qdf_dp_trace_verbosity_check(enum QDF_DP_TRACE_ID code)
Chouhan, Anurag57763182016-03-03 18:57:27 +0530854{
Nirav Shaheaa20d82016-04-25 18:01:05 +0530855 switch (g_qdf_dp_trace_data.verbosity) {
856 case QDF_DP_TRACE_VERBOSITY_HIGH:
Chouhan, Anurag57763182016-03-03 18:57:27 +0530857 return true;
Nirav Shaheaa20d82016-04-25 18:01:05 +0530858 case QDF_DP_TRACE_VERBOSITY_MEDIUM:
859 if (code <= QDF_DP_TRACE_MED_VERBOSITY)
860 return true;
861 return false;
862 case QDF_DP_TRACE_VERBOSITY_LOW:
863 if (code <= QDF_DP_TRACE_LOW_VERBOSITY)
864 return true;
865 return false;
Manjunathappa Prakashcf4286b2018-06-05 20:46:20 -0700866 case QDF_DP_TRACE_VERBOSITY_ULTRA_LOW:
867 if (code <= QDF_DP_TRACE_ULTRA_LOW_VERBOSITY)
868 return true;
869 return false;
Mohit Khanna7750a172017-05-15 15:53:33 -0700870 case QDF_DP_TRACE_VERBOSITY_BASE:
871 if (code <= QDF_DP_TRACE_BASE_VERBOSITY)
Nirav Shaheaa20d82016-04-25 18:01:05 +0530872 return true;
873 return false;
874 default:
875 return false;
876 }
Chouhan, Anurag57763182016-03-03 18:57:27 +0530877}
Chouhan, Anurag57763182016-03-03 18:57:27 +0530878
879/**
Nirav Shaheaa20d82016-04-25 18:01:05 +0530880 * qdf_dp_get_proto_bitmap() - get dp trace proto bitmap
881 *
882 * Return: proto bitmap
883 */
Nirav Shah8f44a7e2019-11-05 08:38:47 +0530884uint32_t qdf_dp_get_proto_bitmap(void)
Nirav Shaheaa20d82016-04-25 18:01:05 +0530885{
886 if (g_qdf_dp_trace_data.enable)
887 return g_qdf_dp_trace_data.proto_bitmap;
888 else
889 return 0;
890}
891
892/**
Chouhan, Anurag57763182016-03-03 18:57:27 +0530893 * qdf_dp_trace_set_track() - Marks whether the packet needs to be traced
894 * @nbuf: defines the netbuf
Nirav Shah29beae02016-04-26 22:58:54 +0530895 * @dir: direction
Chouhan, Anurag57763182016-03-03 18:57:27 +0530896 *
897 * Return: None
898 */
Nirav Shah29beae02016-04-26 22:58:54 +0530899void qdf_dp_trace_set_track(qdf_nbuf_t nbuf, enum qdf_proto_dir dir)
Chouhan, Anurag57763182016-03-03 18:57:27 +0530900{
Nirav Shah29beae02016-04-26 22:58:54 +0530901 uint32_t count = 0;
902
Mohit Khanna7750a172017-05-15 15:53:33 -0700903 if (!g_qdf_dp_trace_data.enable)
904 return;
905
Chouhan, Anurag57763182016-03-03 18:57:27 +0530906 spin_lock_bh(&l_dp_trace_lock);
Nirav Shah29beae02016-04-26 22:58:54 +0530907 if (QDF_TX == dir)
908 count = ++g_qdf_dp_trace_data.tx_count;
909 else if (QDF_RX == dir)
910 count = ++g_qdf_dp_trace_data.rx_count;
911
Chouhan, Anurag57763182016-03-03 18:57:27 +0530912 if ((g_qdf_dp_trace_data.no_of_record != 0) &&
Nirav Shah29beae02016-04-26 22:58:54 +0530913 (count % g_qdf_dp_trace_data.no_of_record == 0)) {
914 if (QDF_TX == dir)
915 QDF_NBUF_CB_TX_DP_TRACE(nbuf) = 1;
916 else if (QDF_RX == dir)
917 QDF_NBUF_CB_RX_DP_TRACE(nbuf) = 1;
Chouhan, Anurag57763182016-03-03 18:57:27 +0530918 }
919 spin_unlock_bh(&l_dp_trace_lock);
Chouhan, Anurag57763182016-03-03 18:57:27 +0530920}
Manikandan Mohana18b8642018-03-01 16:17:23 -0800921qdf_export_symbol(qdf_dp_trace_set_track);
Nandha Kishore Easwaran403b0852017-07-14 17:27:53 +0530922
Mohit Khanna04252802017-08-27 09:43:43 -0700923/* Number of bytes to be grouped together while printing DP-Trace data */
924#define QDF_DUMP_DP_GROUP_SIZE 6
Houston Hoffmanbba5ca62016-11-12 14:24:58 -0800925
Chouhan, Anurag57763182016-03-03 18:57:27 +0530926/**
Mohit Khanna04252802017-08-27 09:43:43 -0700927 * dump_dp_hex_trace() - Display the data in buffer
928 * @prepend_str: string to prepend the hexdump with.
929 * @inbuf: buffer which contains data to be displayed
930 * @inbuf_len: defines the size of the data to be displayed
Chouhan, Anurag57763182016-03-03 18:57:27 +0530931 *
932 * Return: None
933 */
Mohit Khanna04252802017-08-27 09:43:43 -0700934static void
935dump_dp_hex_trace(char *prepend_str, uint8_t *inbuf, uint8_t inbuf_len)
Chouhan, Anurag57763182016-03-03 18:57:27 +0530936{
Mohit Khanna04252802017-08-27 09:43:43 -0700937 unsigned char outbuf[BUFFER_SIZE];
938 const uint8_t *inbuf_ptr = inbuf;
939 char *outbuf_ptr = outbuf;
940 int outbytes_written = 0;
Nirav Shaheaa20d82016-04-25 18:01:05 +0530941
hangtian67ebc3d2019-01-16 17:36:51 +0800942 qdf_mem_zero(outbuf, sizeof(outbuf));
Mohit Khanna04252802017-08-27 09:43:43 -0700943 do {
944 outbytes_written += scnprintf(outbuf_ptr,
945 BUFFER_SIZE - outbytes_written,
946 "%02x", *inbuf_ptr);
947 outbuf_ptr = outbuf + outbytes_written;
Nirav Shaheaa20d82016-04-25 18:01:05 +0530948
Mohit Khanna04252802017-08-27 09:43:43 -0700949 if ((inbuf_ptr - inbuf) &&
950 (inbuf_ptr - inbuf + 1) % QDF_DUMP_DP_GROUP_SIZE == 0) {
951 outbytes_written += scnprintf(outbuf_ptr,
952 BUFFER_SIZE - outbytes_written,
953 " ");
954 outbuf_ptr = outbuf + outbytes_written;
955 }
956 inbuf_ptr++;
957 } while (inbuf_ptr < (inbuf + inbuf_len));
958 DPTRACE_PRINT("%s %s", prepend_str, outbuf);
Chouhan, Anurag57763182016-03-03 18:57:27 +0530959}
Chouhan, Anurag57763182016-03-03 18:57:27 +0530960
961/**
Nirav Shaheaa20d82016-04-25 18:01:05 +0530962 * qdf_dp_code_to_string() - convert dptrace code to string
963 * @code: dptrace code
Chouhan, Anurag57763182016-03-03 18:57:27 +0530964 *
Nirav Shaheaa20d82016-04-25 18:01:05 +0530965 * Return: string version of code
Chouhan, Anurag57763182016-03-03 18:57:27 +0530966 */
Jeff Johnson4729b6f2016-10-07 13:02:43 -0700967static
Nirav Shaheaa20d82016-04-25 18:01:05 +0530968const char *qdf_dp_code_to_string(enum QDF_DP_TRACE_ID code)
Chouhan, Anurag57763182016-03-03 18:57:27 +0530969{
Nirav Shaheaa20d82016-04-25 18:01:05 +0530970 switch (code) {
971 case QDF_DP_TRACE_DROP_PACKET_RECORD:
972 return "DROP:";
973 case QDF_DP_TRACE_EAPOL_PACKET_RECORD:
974 return "EAPOL:";
975 case QDF_DP_TRACE_DHCP_PACKET_RECORD:
976 return "DHCP:";
977 case QDF_DP_TRACE_ARP_PACKET_RECORD:
978 return "ARP:";
Zhu Jianminaf3420a2017-06-12 17:55:43 +0800979 case QDF_DP_TRACE_ICMP_PACKET_RECORD:
980 return "ICMP:";
Poddar, Siddarthbf4231b2017-07-10 16:27:01 +0530981 case QDF_DP_TRACE_ICMPv6_PACKET_RECORD:
982 return "ICMPv6:";
Nirav Shah31d694b2016-05-03 20:18:22 +0530983 case QDF_DP_TRACE_MGMT_PACKET_RECORD:
984 return "MGMT:";
Nirav Shah8f44a7e2019-11-05 08:38:47 +0530985 case QDF_DP_TRACE_TX_CREDIT_RECORD:
986 return "CREDIT:";
Himanshu Agarwalc0b71452016-09-20 15:10:55 +0530987 case QDF_DP_TRACE_EVENT_RECORD:
988 return "EVENT:";
Nirav Shah29beae02016-04-26 22:58:54 +0530989 case QDF_DP_TRACE_HDD_TX_PACKET_PTR_RECORD:
990 return "HDD: TX: PTR:";
Nandha Kishore Easwarane43583f2017-05-15 21:01:13 +0530991 case QDF_DP_TRACE_LI_DP_TX_PACKET_PTR_RECORD:
992 return "LI_DP: TX: PTR:";
Nirav Shah29beae02016-04-26 22:58:54 +0530993 case QDF_DP_TRACE_HDD_TX_PACKET_RECORD:
994 return "HDD: TX: DATA:";
Nandha Kishore Easwarane43583f2017-05-15 21:01:13 +0530995 case QDF_DP_TRACE_LI_DP_TX_PACKET_RECORD:
Mohit Khanna04252802017-08-27 09:43:43 -0700996 case QDF_DP_TRACE_TX_PACKET_RECORD:
997 return "TX:";
Nirav Shaheaa20d82016-04-25 18:01:05 +0530998 case QDF_DP_TRACE_CE_PACKET_PTR_RECORD:
Nirav Shah29beae02016-04-26 22:58:54 +0530999 return "CE: TX: PTR:";
Nirav Shaheaa20d82016-04-25 18:01:05 +05301000 case QDF_DP_TRACE_CE_FAST_PACKET_PTR_RECORD:
Nirav Shah29beae02016-04-26 22:58:54 +05301001 return "CE: TX: FAST: PTR:";
Yun Parkc60a22b2017-08-15 12:04:11 -07001002 case QDF_DP_TRACE_CE_FAST_PACKET_ERR_RECORD:
1003 return "CE: TX: FAST: ERR:";
Mohit Khanna163c3172018-06-27 01:34:02 -07001004 case QDF_DP_TRACE_LI_DP_FREE_PACKET_PTR_RECORD:
Nirav Shaheaa20d82016-04-25 18:01:05 +05301005 case QDF_DP_TRACE_FREE_PACKET_PTR_RECORD:
Nirav Shah29beae02016-04-26 22:58:54 +05301006 return "FREE: TX: PTR:";
1007 case QDF_DP_TRACE_RX_HTT_PACKET_PTR_RECORD:
1008 return "HTT: RX: PTR:";
1009 case QDF_DP_TRACE_RX_OFFLOAD_HTT_PACKET_PTR_RECORD:
1010 return "HTT: RX: OF: PTR:";
1011 case QDF_DP_TRACE_RX_HDD_PACKET_PTR_RECORD:
1012 return "HDD: RX: PTR:";
Nandha Kishore Easwarane43583f2017-05-15 21:01:13 +05301013 case QDF_DP_TRACE_RX_LI_DP_PACKET_PTR_RECORD:
1014 return "LI_DP: RX: PTR:";
Himanshu Agarwalf30a9e92017-01-31 12:57:48 +05301015 case QDF_DP_TRACE_HDD_RX_PACKET_RECORD:
1016 return "HDD: RX: DATA:";
Nandha Kishore Easwarane43583f2017-05-15 21:01:13 +05301017 case QDF_DP_TRACE_LI_DP_NULL_RX_PACKET_RECORD:
1018 return "LI_DP_NULL: RX: DATA:";
Mohit Khanna163c3172018-06-27 01:34:02 -07001019 case QDF_DP_TRACE_LI_DP_RX_PACKET_RECORD:
Mohit Khanna04252802017-08-27 09:43:43 -07001020 case QDF_DP_TRACE_RX_PACKET_RECORD:
1021 return "RX:";
Nirav Shaheaa20d82016-04-25 18:01:05 +05301022 case QDF_DP_TRACE_TXRX_QUEUE_PACKET_PTR_RECORD:
Nirav Shah29beae02016-04-26 22:58:54 +05301023 return "TXRX: TX: Q: PTR:";
Nirav Shaheaa20d82016-04-25 18:01:05 +05301024 case QDF_DP_TRACE_TXRX_PACKET_PTR_RECORD:
Nirav Shah29beae02016-04-26 22:58:54 +05301025 return "TXRX: TX: PTR:";
Nirav Shaheaa20d82016-04-25 18:01:05 +05301026 case QDF_DP_TRACE_TXRX_FAST_PACKET_PTR_RECORD:
Nirav Shah29beae02016-04-26 22:58:54 +05301027 return "TXRX: TX: FAST: PTR:";
Nirav Shaheaa20d82016-04-25 18:01:05 +05301028 case QDF_DP_TRACE_HTT_PACKET_PTR_RECORD:
Nirav Shah29beae02016-04-26 22:58:54 +05301029 return "HTT: TX: PTR:";
Nirav Shaheaa20d82016-04-25 18:01:05 +05301030 case QDF_DP_TRACE_HTC_PACKET_PTR_RECORD:
Nirav Shah29beae02016-04-26 22:58:54 +05301031 return "HTC: TX: PTR:";
Nirav Shaheaa20d82016-04-25 18:01:05 +05301032 case QDF_DP_TRACE_HIF_PACKET_PTR_RECORD:
Nirav Shah29beae02016-04-26 22:58:54 +05301033 return "HIF: TX: PTR:";
1034 case QDF_DP_TRACE_RX_TXRX_PACKET_PTR_RECORD:
1035 return "TXRX: RX: PTR:";
Nirav Shaheaa20d82016-04-25 18:01:05 +05301036 case QDF_DP_TRACE_HDD_TX_TIMEOUT:
Nirav Shah29beae02016-04-26 22:58:54 +05301037 return "HDD: STA: TO:";
Nirav Shaheaa20d82016-04-25 18:01:05 +05301038 case QDF_DP_TRACE_HDD_SOFTAP_TX_TIMEOUT:
Nirav Shah29beae02016-04-26 22:58:54 +05301039 return "HDD: SAP: TO:";
Chouhan, Anurag57763182016-03-03 18:57:27 +05301040 default:
Nirav Shaheaa20d82016-04-25 18:01:05 +05301041 return "Invalid";
Chouhan, Anurag57763182016-03-03 18:57:27 +05301042 }
Chouhan, Anurag57763182016-03-03 18:57:27 +05301043}
Chouhan, Anurag57763182016-03-03 18:57:27 +05301044
1045/**
Nirav Shaheaa20d82016-04-25 18:01:05 +05301046 * qdf_dp_dir_to_str() - convert direction to string
1047 * @dir: direction
Chouhan, Anurag57763182016-03-03 18:57:27 +05301048 *
Nirav Shaheaa20d82016-04-25 18:01:05 +05301049 * Return: string version of direction
Chouhan, Anurag57763182016-03-03 18:57:27 +05301050 */
Jeff Johnson4729b6f2016-10-07 13:02:43 -07001051static const char *qdf_dp_dir_to_str(enum qdf_proto_dir dir)
Chouhan, Anurag57763182016-03-03 18:57:27 +05301052{
Nirav Shaheaa20d82016-04-25 18:01:05 +05301053 switch (dir) {
1054 case QDF_TX:
Nirav Shah29beae02016-04-26 22:58:54 +05301055 return " --> ";
Nirav Shaheaa20d82016-04-25 18:01:05 +05301056 case QDF_RX:
Nirav Shah29beae02016-04-26 22:58:54 +05301057 return " <-- ";
Nirav Shaheaa20d82016-04-25 18:01:05 +05301058 default:
1059 return "invalid";
1060 }
1061}
Chouhan, Anurag57763182016-03-03 18:57:27 +05301062
Nirav Shah8f44a7e2019-11-05 08:38:47 +05301063static const char *qdf_dp_credit_source_to_str(
1064 enum QDF_CREDIT_UPDATE_SOURCE source)
1065{
1066 switch (source) {
1067 case QDF_TX_SCHED:
1068 return "TX SCHED";
1069 case QDF_TX_COMP:
1070 return "TX COMP";
1071 case QDF_TX_CREDIT_UPDATE:
1072 return "CREDIT UP";
1073 case QDF_TX_HTT_MSG:
1074 return "HTT TX MSG";
1075 case QDF_HTT_ATTACH:
1076 return "HTT ATTACH";
1077 default:
1078 return "invalid";
1079 }
1080}
1081
1082static const char *qdf_dp_operation_to_str(enum QDF_CREDIT_OPERATION op)
1083{
1084 switch (op) {
1085 case QDF_CREDIT_INC:
1086 return "+";
1087 case QDF_CREDIT_DEC:
1088 return "-";
1089 case QDF_CREDIT_ABS:
1090 return "ABS";
1091 default:
1092 return "invalid";
1093 }
1094}
1095
Nirav Shaheaa20d82016-04-25 18:01:05 +05301096/**
1097 * qdf_dp_type_to_str() - convert packet type to string
1098 * @type: type
1099 *
1100 * Return: string version of packet type
1101 */
Jeff Johnson4729b6f2016-10-07 13:02:43 -07001102static const char *qdf_dp_type_to_str(enum qdf_proto_type type)
Nirav Shaheaa20d82016-04-25 18:01:05 +05301103{
1104 switch (type) {
1105 case QDF_PROTO_TYPE_DHCP:
1106 return "DHCP";
1107 case QDF_PROTO_TYPE_EAPOL:
1108 return "EAPOL";
1109 case QDF_PROTO_TYPE_ARP:
1110 return "ARP";
Zhu Jianminaf3420a2017-06-12 17:55:43 +08001111 case QDF_PROTO_TYPE_ICMP:
1112 return "ICMP";
Poddar, Siddarthbf4231b2017-07-10 16:27:01 +05301113 case QDF_PROTO_TYPE_ICMPv6:
1114 return "ICMPv6";
Nirav Shah31d694b2016-05-03 20:18:22 +05301115 case QDF_PROTO_TYPE_MGMT:
1116 return "MGMT";
Himanshu Agarwalc0b71452016-09-20 15:10:55 +05301117 case QDF_PROTO_TYPE_EVENT:
1118 return "EVENT";
Nirav Shaheaa20d82016-04-25 18:01:05 +05301119 default:
1120 return "invalid";
1121 }
1122}
Nirav Shaheaa20d82016-04-25 18:01:05 +05301123
1124/**
1125 * qdf_dp_subtype_to_str() - convert packet subtype to string
1126 * @type: type
1127 *
1128 * Return: string version of packet subtype
1129 */
Jeff Johnson4729b6f2016-10-07 13:02:43 -07001130static const char *qdf_dp_subtype_to_str(enum qdf_proto_subtype subtype)
Nirav Shaheaa20d82016-04-25 18:01:05 +05301131{
1132 switch (subtype) {
1133 case QDF_PROTO_EAPOL_M1:
1134 return "M1";
1135 case QDF_PROTO_EAPOL_M2:
1136 return "M2";
1137 case QDF_PROTO_EAPOL_M3:
1138 return "M3";
1139 case QDF_PROTO_EAPOL_M4:
1140 return "M4";
1141 case QDF_PROTO_DHCP_DISCOVER:
Mohit Khanna7750a172017-05-15 15:53:33 -07001142 return "DISC";
Nirav Shaheaa20d82016-04-25 18:01:05 +05301143 case QDF_PROTO_DHCP_REQUEST:
Mohit Khanna7750a172017-05-15 15:53:33 -07001144 return "REQ";
Nirav Shaheaa20d82016-04-25 18:01:05 +05301145 case QDF_PROTO_DHCP_OFFER:
Mohit Khanna7750a172017-05-15 15:53:33 -07001146 return "OFF";
Nirav Shaheaa20d82016-04-25 18:01:05 +05301147 case QDF_PROTO_DHCP_ACK:
1148 return "ACK";
1149 case QDF_PROTO_DHCP_NACK:
1150 return "NACK";
1151 case QDF_PROTO_DHCP_RELEASE:
Mohit Khanna7750a172017-05-15 15:53:33 -07001152 return "REL";
Nirav Shaheaa20d82016-04-25 18:01:05 +05301153 case QDF_PROTO_DHCP_INFORM:
1154 return "INFORM";
1155 case QDF_PROTO_DHCP_DECLINE:
Mohit Khanna7750a172017-05-15 15:53:33 -07001156 return "DECL";
Nirav Shahcede2892016-05-19 12:41:15 +05301157 case QDF_PROTO_ARP_REQ:
Zhu Jianminaf3420a2017-06-12 17:55:43 +08001158 case QDF_PROTO_ICMP_REQ:
Poddar, Siddarthbf4231b2017-07-10 16:27:01 +05301159 case QDF_PROTO_ICMPV6_REQ:
Mohit Khanna7750a172017-05-15 15:53:33 -07001160 return "REQ";
Nirav Shahcede2892016-05-19 12:41:15 +05301161 case QDF_PROTO_ARP_RES:
Zhu Jianminaf3420a2017-06-12 17:55:43 +08001162 case QDF_PROTO_ICMP_RES:
Poddar, Siddarthbf4231b2017-07-10 16:27:01 +05301163 case QDF_PROTO_ICMPV6_RES:
Mohit Khanna7750a172017-05-15 15:53:33 -07001164 return "RSP";
Poddar, Siddarthbf4231b2017-07-10 16:27:01 +05301165 case QDF_PROTO_ICMPV6_RS:
1166 return "RS";
1167 case QDF_PROTO_ICMPV6_RA:
1168 return "RA";
1169 case QDF_PROTO_ICMPV6_NS:
1170 return "NS";
1171 case QDF_PROTO_ICMPV6_NA:
1172 return "NA";
Nirav Shah31d694b2016-05-03 20:18:22 +05301173 case QDF_PROTO_MGMT_ASSOC:
1174 return "ASSOC";
1175 case QDF_PROTO_MGMT_DISASSOC:
1176 return "DISASSOC";
1177 case QDF_PROTO_MGMT_AUTH:
1178 return "AUTH";
1179 case QDF_PROTO_MGMT_DEAUTH:
1180 return "DEAUTH";
Himanshu Agarwalc0b71452016-09-20 15:10:55 +05301181 case QDF_ROAM_SYNCH:
1182 return "ROAM SYNCH";
1183 case QDF_ROAM_COMPLETE:
Mohit Khanna7750a172017-05-15 15:53:33 -07001184 return "ROAM COMP";
Himanshu Agarwalc0b71452016-09-20 15:10:55 +05301185 case QDF_ROAM_EVENTID:
1186 return "ROAM EVENTID";
Nirav Shaheaa20d82016-04-25 18:01:05 +05301187 default:
1188 return "invalid";
1189 }
1190}
Nirav Shaheaa20d82016-04-25 18:01:05 +05301191
1192/**
Mohit Khanna163c3172018-06-27 01:34:02 -07001193 * qdf_dp_enable_check() - check if dptrace, TX/RX tracing is enabled
Nirav Shaheaa20d82016-04-25 18:01:05 +05301194 * @nbuf: nbuf
1195 * @code: dptrace code
Mohit Khanna163c3172018-06-27 01:34:02 -07001196 * @dir: TX or RX direction
Nirav Shaheaa20d82016-04-25 18:01:05 +05301197 *
1198 * Return: true/false
1199 */
Jeff Johnson4729b6f2016-10-07 13:02:43 -07001200static bool qdf_dp_enable_check(qdf_nbuf_t nbuf, enum QDF_DP_TRACE_ID code,
1201 enum qdf_proto_dir dir)
Nirav Shaheaa20d82016-04-25 18:01:05 +05301202{
Chouhan, Anurag57763182016-03-03 18:57:27 +05301203 /* Return when Dp trace is not enabled */
1204 if (!g_qdf_dp_trace_data.enable)
Nirav Shaheaa20d82016-04-25 18:01:05 +05301205 return false;
Chouhan, Anurag57763182016-03-03 18:57:27 +05301206
Mohit Khanna163c3172018-06-27 01:34:02 -07001207 if (qdf_dp_trace_verbosity_check(code) == false)
Nirav Shaheaa20d82016-04-25 18:01:05 +05301208 return false;
Chouhan, Anurag57763182016-03-03 18:57:27 +05301209
Manjunathappa Prakashed42ca32018-10-17 20:24:21 -07001210 if (nbuf && (dir == QDF_TX && ((QDF_NBUF_CB_TX_DP_TRACE(nbuf) == 0) ||
1211 (QDF_NBUF_CB_TX_PACKET_TRACK(nbuf) !=
1212 QDF_NBUF_TX_PKT_DATA_TRACK))))
Mohit Khanna163c3172018-06-27 01:34:02 -07001213 return false;
1214
Manjunathappa Prakashed42ca32018-10-17 20:24:21 -07001215 if (nbuf && (dir == QDF_RX && (QDF_NBUF_CB_RX_DP_TRACE(nbuf) == 0)))
Mohit Khanna163c3172018-06-27 01:34:02 -07001216 return false;
1217
Manjunathappa Prakashed42ca32018-10-17 20:24:21 -07001218 /*
1219 * Special packets called with NULL nbuf and this API is expected to
1220 * return true
1221 */
Nirav Shaheaa20d82016-04-25 18:01:05 +05301222 return true;
1223}
Chouhan, Anurag57763182016-03-03 18:57:27 +05301224
Nirav Shaheaa20d82016-04-25 18:01:05 +05301225/**
Mohit Khanna04252802017-08-27 09:43:43 -07001226 * qdf_dp_trace_fill_meta_str() - fill up a common meta string
1227 * @prepend_str: pointer to string
1228 * @size: size of prepend_str
1229 * @rec_index: index of record
1230 * @info: info related to the record
1231 * @record: pointer to the record
1232 *
1233 * Return: ret value from scnprintf
1234 */
1235static inline
1236int qdf_dp_trace_fill_meta_str(char *prepend_str, int size,
1237 int rec_index, uint8_t info,
1238 struct qdf_dp_trace_record_s *record)
1239{
1240 char buffer[20];
1241 int ret = 0;
1242 bool live = info & QDF_DP_TRACE_RECORD_INFO_LIVE ? true : false;
1243 bool throttled = info & QDF_DP_TRACE_RECORD_INFO_THROTTLED ?
1244 true : false;
1245
1246 scnprintf(buffer, sizeof(buffer), "%llu", record->time);
1247 ret = scnprintf(prepend_str, size,
1248 "%s DPT: %04d:%02d%s %s",
1249 throttled ? "*" : "",
1250 rec_index,
1251 record->pdev_id,
1252 live ? "" : buffer,
1253 qdf_dp_code_to_string(record->code));
1254
1255 return ret;
1256}
1257
1258/**
1259 * qdf_dp_fill_record_data() - fill meta data and data into the record
1260 * @rec: pointer to record data
1261 * @data: pointer to data
1262 * @data_size: size of the data
1263 * @meta_data: pointer to metadata
1264 * @metadata_size: size of metadata
1265 *
1266 * Should be called from within a spin_lock for the qdf record.
1267 * Fills up rec->data with |metadata|data|
Nirav Shaheaa20d82016-04-25 18:01:05 +05301268 *
1269 * Return: none
1270 */
Mohit Khanna04252802017-08-27 09:43:43 -07001271static void qdf_dp_fill_record_data
1272 (struct qdf_dp_trace_record_s *rec,
1273 uint8_t *data, uint8_t data_size,
1274 uint8_t *meta_data, uint8_t metadata_size)
1275{
1276 int32_t available = QDF_DP_TRACE_RECORD_SIZE;
1277 uint8_t *rec_data = rec->data;
1278 uint8_t data_to_copy = 0;
1279
hangtian67ebc3d2019-01-16 17:36:51 +08001280 qdf_mem_zero(rec_data, QDF_DP_TRACE_RECORD_SIZE);
Mohit Khanna04252802017-08-27 09:43:43 -07001281
1282 /* copy meta data */
1283 if (meta_data) {
1284 if (metadata_size > available) {
1285 QDF_TRACE_WARN(QDF_MODULE_ID_QDF,
1286 "%s: meta data does not fit into the record",
1287 __func__);
1288 goto end;
1289 }
1290 qdf_mem_copy(rec_data, meta_data, metadata_size);
1291 available = available - metadata_size;
1292 } else {
1293 metadata_size = 0;
1294 }
1295
1296 /* copy data */
1297 if (data && (data_size > 0) && (available > 0)) {
1298 data_to_copy = data_size;
1299 if (data_size > available)
1300 data_to_copy = available;
1301 qdf_mem_copy(&rec_data[metadata_size], data, data_to_copy);
1302 }
1303end:
1304 rec->size = data_to_copy;
1305}
1306
1307/**
1308 * qdf_dp_add_record() - add dp trace record
1309 * @code: dptrace code
1310 * @pdev_id: pdev_id
1311 * @print: true to print it in kmsg
1312 * @data: data pointer
1313 * @data_size: size of data to be copied
1314 * @meta_data: meta data to be prepended to data
1315 * @metadata_size: sizeof meta data
1316 * @print: whether to print record
1317 *
1318 * Return: none
1319 */
1320static void qdf_dp_add_record(enum QDF_DP_TRACE_ID code, uint8_t pdev_id,
1321 uint8_t *data, uint8_t data_size,
1322 uint8_t *meta_data, uint8_t metadata_size,
1323 bool print)
1324
Nirav Shaheaa20d82016-04-25 18:01:05 +05301325{
1326 struct qdf_dp_trace_record_s *rec = NULL;
Nirav Shah29beae02016-04-26 22:58:54 +05301327 int index;
Mohit Khanna04252802017-08-27 09:43:43 -07001328 bool print_this_record = false;
1329 u8 info = 0;
1330
1331 if (code >= QDF_DP_TRACE_MAX) {
1332 QDF_TRACE_ERROR(QDF_MODULE_ID_QDF,
1333 "invalid record code %u, max code %u",
1334 code, QDF_DP_TRACE_MAX);
1335 return;
1336 }
Srinivas Girigowda43977f72017-04-03 09:17:46 -07001337
Chouhan, Anurag57763182016-03-03 18:57:27 +05301338 spin_lock_bh(&l_dp_trace_lock);
1339
Manjunathappa Prakashcf4286b2018-06-05 20:46:20 -07001340 if (print || g_qdf_dp_trace_data.force_live_mode) {
1341 print_this_record = true;
1342 } else if (g_qdf_dp_trace_data.live_mode == 1) {
1343 print_this_record = true;
1344 g_qdf_dp_trace_data.print_pkt_cnt++;
1345 if (g_qdf_dp_trace_data.print_pkt_cnt >
1346 g_qdf_dp_trace_data.high_tput_thresh) {
1347 g_qdf_dp_trace_data.live_mode = 0;
1348 g_qdf_dp_trace_data.verbosity =
Mohit Khanna163c3172018-06-27 01:34:02 -07001349 QDF_DP_TRACE_VERBOSITY_ULTRA_LOW;
Manjunathappa Prakashcf4286b2018-06-05 20:46:20 -07001350 info |= QDF_DP_TRACE_RECORD_INFO_THROTTLED;
1351 }
1352 }
1353
Chouhan, Anurag57763182016-03-03 18:57:27 +05301354 g_qdf_dp_trace_data.num++;
1355
1356 if (g_qdf_dp_trace_data.num > MAX_QDF_DP_TRACE_RECORDS)
1357 g_qdf_dp_trace_data.num = MAX_QDF_DP_TRACE_RECORDS;
1358
1359 if (INVALID_QDF_DP_TRACE_ADDR == g_qdf_dp_trace_data.head) {
1360 /* first record */
1361 g_qdf_dp_trace_data.head = 0;
1362 g_qdf_dp_trace_data.tail = 0;
1363 } else {
1364 /* queue is not empty */
1365 g_qdf_dp_trace_data.tail++;
1366
1367 if (MAX_QDF_DP_TRACE_RECORDS == g_qdf_dp_trace_data.tail)
1368 g_qdf_dp_trace_data.tail = 0;
1369
1370 if (g_qdf_dp_trace_data.head == g_qdf_dp_trace_data.tail) {
1371 /* full */
1372 if (MAX_QDF_DP_TRACE_RECORDS ==
1373 ++g_qdf_dp_trace_data.head)
1374 g_qdf_dp_trace_data.head = 0;
1375 }
1376 }
1377
1378 rec = &g_qdf_dp_trace_tbl[g_qdf_dp_trace_data.tail];
Nirav Shah29beae02016-04-26 22:58:54 +05301379 index = g_qdf_dp_trace_data.tail;
Chouhan, Anurag57763182016-03-03 18:57:27 +05301380 rec->code = code;
Nandha Kishore Easwarane43583f2017-05-15 21:01:13 +05301381 rec->pdev_id = pdev_id;
Chouhan, Anurag57763182016-03-03 18:57:27 +05301382 rec->size = 0;
Mohit Khanna04252802017-08-27 09:43:43 -07001383 qdf_dp_fill_record_data(rec, data, data_size,
1384 meta_data, metadata_size);
1385 rec->time = qdf_get_log_timestamp();
Chouhan, Anurag57763182016-03-03 18:57:27 +05301386 rec->pid = (in_interrupt() ? 0 : current->pid);
Mohit Khanna7750a172017-05-15 15:53:33 -07001387
1388 if (rec->code >= QDF_DP_TRACE_MAX) {
Mohit Khanna04252802017-08-27 09:43:43 -07001389 QDF_TRACE_ERROR(QDF_MODULE_ID_QDF,
1390 "invalid record code %u, max code %u",
1391 rec->code, QDF_DP_TRACE_MAX);
Mohit Khanna7750a172017-05-15 15:53:33 -07001392 return;
1393 }
1394
Mohit Khanna04252802017-08-27 09:43:43 -07001395 spin_unlock_bh(&l_dp_trace_lock);
Mohit Khanna7750a172017-05-15 15:53:33 -07001396
Mohit Khanna04252802017-08-27 09:43:43 -07001397 info |= QDF_DP_TRACE_RECORD_INFO_LIVE;
1398 if (print_this_record)
Mohit Khanna7750a172017-05-15 15:53:33 -07001399 qdf_dp_trace_cb_table[rec->code] (rec, index,
Mohit Khanna04252802017-08-27 09:43:43 -07001400 QDF_TRACE_DEFAULT_PDEV_ID, info);
Nirav Shaheaa20d82016-04-25 18:01:05 +05301401}
Nirav Shaheaa20d82016-04-25 18:01:05 +05301402
Nirav Shaheaa20d82016-04-25 18:01:05 +05301403
1404/**
Poddar, Siddarthbf4231b2017-07-10 16:27:01 +05301405 * qdf_log_icmpv6_pkt() - log ICMPv6 packet
Jeff Johnson5b92ee02019-01-15 14:40:56 -08001406 * @vdev_id: ID of the vdev
Poddar, Siddarthbf4231b2017-07-10 16:27:01 +05301407 * @skb: skb pointer
1408 * @dir: direction
Jeff Johnson5b92ee02019-01-15 14:40:56 -08001409 * @pdev_id: ID of the pdev
Poddar, Siddarthbf4231b2017-07-10 16:27:01 +05301410 *
1411 * Return: true/false
1412 */
Jeff Johnson5b92ee02019-01-15 14:40:56 -08001413static bool qdf_log_icmpv6_pkt(uint8_t vdev_id, struct sk_buff *skb,
1414 enum qdf_proto_dir dir, uint8_t pdev_id)
Poddar, Siddarthbf4231b2017-07-10 16:27:01 +05301415{
1416 enum qdf_proto_subtype subtype;
1417
1418 if ((qdf_dp_get_proto_bitmap() & QDF_NBUF_PKT_TRAC_TYPE_ICMPv6) &&
1419 ((dir == QDF_TX && QDF_NBUF_CB_PACKET_TYPE_ICMPv6 ==
1420 QDF_NBUF_CB_GET_PACKET_TYPE(skb)) ||
1421 (dir == QDF_RX && qdf_nbuf_is_icmpv6_pkt(skb) == true))) {
1422
1423 subtype = qdf_nbuf_get_icmpv6_subtype(skb);
Mohit Khanna163c3172018-06-27 01:34:02 -07001424
1425 QDF_NBUF_CB_DP_TRACE_PRINT(skb) = false;
Poddar, Siddarthbf4231b2017-07-10 16:27:01 +05301426 if (dir == QDF_TX)
1427 QDF_NBUF_CB_TX_DP_TRACE(skb) = 1;
1428 else if (dir == QDF_RX)
1429 QDF_NBUF_CB_RX_DP_TRACE(skb) = 1;
1430
Mohit Khanna163c3172018-06-27 01:34:02 -07001431 DPTRACE(qdf_dp_trace_proto_pkt(
1432 QDF_DP_TRACE_ICMPv6_PACKET_RECORD,
Jeff Johnson5b92ee02019-01-15 14:40:56 -08001433 vdev_id, (skb->data + QDF_NBUF_SRC_MAC_OFFSET),
Mohit Khanna163c3172018-06-27 01:34:02 -07001434 (skb->data + QDF_NBUF_DEST_MAC_OFFSET),
1435 QDF_PROTO_TYPE_ICMPv6, subtype, dir, pdev_id, false));
Poddar, Siddarthbf4231b2017-07-10 16:27:01 +05301436
1437 switch (subtype) {
1438 case QDF_PROTO_ICMPV6_REQ:
1439 g_qdf_dp_trace_data.icmpv6_req++;
1440 break;
1441 case QDF_PROTO_ICMPV6_RES:
1442 g_qdf_dp_trace_data.icmpv6_resp++;
1443 break;
1444 case QDF_PROTO_ICMPV6_RS:
1445 g_qdf_dp_trace_data.icmpv6_rs++;
1446 break;
1447 case QDF_PROTO_ICMPV6_RA:
1448 g_qdf_dp_trace_data.icmpv6_ra++;
1449 break;
1450 case QDF_PROTO_ICMPV6_NS:
1451 g_qdf_dp_trace_data.icmpv6_ns++;
1452 break;
1453 case QDF_PROTO_ICMPV6_NA:
1454 g_qdf_dp_trace_data.icmpv6_na++;
1455 break;
1456 default:
1457 break;
1458 }
1459 return true;
1460 }
1461
1462 return false;
1463}
1464
1465/**
Mohit Khanna7750a172017-05-15 15:53:33 -07001466 * qdf_log_icmp_pkt() - log ICMP packet
Jeff Johnson5b92ee02019-01-15 14:40:56 -08001467 * @vdev_id: ID of the vdev
Mohit Khanna7750a172017-05-15 15:53:33 -07001468 * @skb: skb pointer
1469 * @dir: direction
Jeff Johnson5b92ee02019-01-15 14:40:56 -08001470 * @pdev_id: ID of the pdev
Mohit Khanna7750a172017-05-15 15:53:33 -07001471 *
1472 * Return: true/false
1473 */
Jeff Johnson5b92ee02019-01-15 14:40:56 -08001474static bool qdf_log_icmp_pkt(uint8_t vdev_id, struct sk_buff *skb,
1475 enum qdf_proto_dir dir, uint8_t pdev_id)
Mohit Khanna7750a172017-05-15 15:53:33 -07001476{
1477 enum qdf_proto_subtype proto_subtype;
1478
1479 if ((qdf_dp_get_proto_bitmap() & QDF_NBUF_PKT_TRAC_TYPE_ICMP) &&
1480 (qdf_nbuf_is_icmp_pkt(skb) == true)) {
1481
Mohit Khanna163c3172018-06-27 01:34:02 -07001482 QDF_NBUF_CB_DP_TRACE_PRINT(skb) = false;
Mohit Khanna7750a172017-05-15 15:53:33 -07001483 proto_subtype = qdf_nbuf_get_icmp_subtype(skb);
Mohit Khanna163c3172018-06-27 01:34:02 -07001484
Mohit Khanna7750a172017-05-15 15:53:33 -07001485 if (QDF_TX == dir)
1486 QDF_NBUF_CB_TX_DP_TRACE(skb) = 1;
1487 else if (QDF_RX == dir)
1488 QDF_NBUF_CB_RX_DP_TRACE(skb) = 1;
1489
Mohit Khanna163c3172018-06-27 01:34:02 -07001490 DPTRACE(qdf_dp_trace_proto_pkt(QDF_DP_TRACE_ICMP_PACKET_RECORD,
Jeff Johnson5b92ee02019-01-15 14:40:56 -08001491 vdev_id,
Mohit Khanna163c3172018-06-27 01:34:02 -07001492 skb->data +
1493 QDF_NBUF_SRC_MAC_OFFSET,
1494 skb->data +
1495 QDF_NBUF_DEST_MAC_OFFSET,
1496 QDF_PROTO_TYPE_ICMP,
1497 proto_subtype, dir, pdev_id,
1498 false));
Mohit Khanna7750a172017-05-15 15:53:33 -07001499
1500 if (proto_subtype == QDF_PROTO_ICMP_REQ)
1501 g_qdf_dp_trace_data.icmp_req++;
1502 else
1503 g_qdf_dp_trace_data.icmp_resp++;
1504
1505 return true;
1506 }
1507 return false;
1508}
1509
1510/**
Nirav Shaheaa20d82016-04-25 18:01:05 +05301511 * qdf_log_eapol_pkt() - log EAPOL packet
Jeff Johnson5b92ee02019-01-15 14:40:56 -08001512 * @vdev_id: ID of the vdev
Nirav Shaheaa20d82016-04-25 18:01:05 +05301513 * @skb: skb pointer
Nirav Shah29beae02016-04-26 22:58:54 +05301514 * @dir: direction
Jeff Johnson5b92ee02019-01-15 14:40:56 -08001515 * @pdev_id: ID of the pdev
Nirav Shaheaa20d82016-04-25 18:01:05 +05301516 *
1517 * Return: true/false
1518 */
Jeff Johnson5b92ee02019-01-15 14:40:56 -08001519static bool qdf_log_eapol_pkt(uint8_t vdev_id, struct sk_buff *skb,
Nandha Kishore Easwarane43583f2017-05-15 21:01:13 +05301520 enum qdf_proto_dir dir, uint8_t pdev_id)
Nirav Shaheaa20d82016-04-25 18:01:05 +05301521{
Nirav Shaheaa20d82016-04-25 18:01:05 +05301522 enum qdf_proto_subtype subtype;
1523
1524 if ((qdf_dp_get_proto_bitmap() & QDF_NBUF_PKT_TRAC_TYPE_EAPOL) &&
Nirav Shah9c3b3fe2016-07-20 16:05:06 +05301525 ((dir == QDF_TX && QDF_NBUF_CB_PACKET_TYPE_EAPOL ==
1526 QDF_NBUF_CB_GET_PACKET_TYPE(skb)) ||
1527 (dir == QDF_RX && qdf_nbuf_is_ipv4_eapol_pkt(skb) == true))) {
Nirav Shaheaa20d82016-04-25 18:01:05 +05301528
Himanshu Agarwalfcd64e92016-07-20 17:45:58 +05301529 subtype = qdf_nbuf_get_eapol_subtype(skb);
Mohit Khanna163c3172018-06-27 01:34:02 -07001530 QDF_NBUF_CB_DP_TRACE_PRINT(skb) = true;
Nirav Shah29beae02016-04-26 22:58:54 +05301531 if (QDF_TX == dir)
1532 QDF_NBUF_CB_TX_DP_TRACE(skb) = 1;
1533 else if (QDF_RX == dir)
1534 QDF_NBUF_CB_RX_DP_TRACE(skb) = 1;
Himanshu Agarwal3f549622016-10-27 15:16:25 +05301535
Mohit Khanna163c3172018-06-27 01:34:02 -07001536 DPTRACE(qdf_dp_trace_proto_pkt(QDF_DP_TRACE_EAPOL_PACKET_RECORD,
Jeff Johnson5b92ee02019-01-15 14:40:56 -08001537 vdev_id,
Mohit Khanna163c3172018-06-27 01:34:02 -07001538 skb->data +
1539 QDF_NBUF_SRC_MAC_OFFSET,
1540 skb->data +
1541 QDF_NBUF_DEST_MAC_OFFSET,
1542 QDF_PROTO_TYPE_EAPOL, subtype,
1543 dir, pdev_id, true));
1544
Mohit Khanna90d7ebd2017-09-12 21:54:21 -07001545 switch (subtype) {
1546 case QDF_PROTO_EAPOL_M1:
1547 g_qdf_dp_trace_data.eapol_m1++;
1548 break;
1549 case QDF_PROTO_EAPOL_M2:
1550 g_qdf_dp_trace_data.eapol_m2++;
1551 break;
1552 case QDF_PROTO_EAPOL_M3:
1553 g_qdf_dp_trace_data.eapol_m3++;
1554 break;
1555 case QDF_PROTO_EAPOL_M4:
1556 g_qdf_dp_trace_data.eapol_m4++;
1557 break;
1558 default:
1559 g_qdf_dp_trace_data.eapol_others++;
1560 break;
1561 }
Nirav Shaheaa20d82016-04-25 18:01:05 +05301562 return true;
1563 }
1564 return false;
1565}
Nirav Shaheaa20d82016-04-25 18:01:05 +05301566
1567/**
1568 * qdf_log_dhcp_pkt() - log DHCP packet
Jeff Johnson5b92ee02019-01-15 14:40:56 -08001569 * @vdev_id: ID of the vdev
Nirav Shaheaa20d82016-04-25 18:01:05 +05301570 * @skb: skb pointer
Nirav Shah29beae02016-04-26 22:58:54 +05301571 * @dir: direction
Jeff Johnson5b92ee02019-01-15 14:40:56 -08001572 * @pdev_id: ID of the pdev
Nirav Shaheaa20d82016-04-25 18:01:05 +05301573 *
1574 * Return: true/false
1575 */
Jeff Johnson5b92ee02019-01-15 14:40:56 -08001576static bool qdf_log_dhcp_pkt(uint8_t vdev_id, struct sk_buff *skb,
Nandha Kishore Easwarane43583f2017-05-15 21:01:13 +05301577 enum qdf_proto_dir dir, uint8_t pdev_id)
Nirav Shaheaa20d82016-04-25 18:01:05 +05301578{
1579 enum qdf_proto_subtype subtype = QDF_PROTO_INVALID;
1580
1581 if ((qdf_dp_get_proto_bitmap() & QDF_NBUF_PKT_TRAC_TYPE_DHCP) &&
Nirav Shah9c3b3fe2016-07-20 16:05:06 +05301582 ((dir == QDF_TX && QDF_NBUF_CB_PACKET_TYPE_DHCP ==
1583 QDF_NBUF_CB_GET_PACKET_TYPE(skb)) ||
1584 (dir == QDF_RX && qdf_nbuf_is_ipv4_dhcp_pkt(skb) == true))) {
Nirav Shaheaa20d82016-04-25 18:01:05 +05301585
Himanshu Agarwalfcd64e92016-07-20 17:45:58 +05301586 subtype = qdf_nbuf_get_dhcp_subtype(skb);
Mohit Khanna163c3172018-06-27 01:34:02 -07001587 QDF_NBUF_CB_DP_TRACE_PRINT(skb) = true;
Nirav Shah29beae02016-04-26 22:58:54 +05301588 if (QDF_TX == dir)
1589 QDF_NBUF_CB_TX_DP_TRACE(skb) = 1;
1590 else if (QDF_RX == dir)
1591 QDF_NBUF_CB_RX_DP_TRACE(skb) = 1;
Himanshu Agarwal3f549622016-10-27 15:16:25 +05301592
Mohit Khanna163c3172018-06-27 01:34:02 -07001593 DPTRACE(qdf_dp_trace_proto_pkt(QDF_DP_TRACE_DHCP_PACKET_RECORD,
Jeff Johnson5b92ee02019-01-15 14:40:56 -08001594 vdev_id,
Mohit Khanna163c3172018-06-27 01:34:02 -07001595 skb->data +
1596 QDF_NBUF_SRC_MAC_OFFSET,
1597 skb->data +
1598 QDF_NBUF_DEST_MAC_OFFSET,
1599 QDF_PROTO_TYPE_DHCP, subtype,
1600 dir, pdev_id, true));
1601
Mohit Khanna90d7ebd2017-09-12 21:54:21 -07001602 switch (subtype) {
1603 case QDF_PROTO_DHCP_DISCOVER:
1604 g_qdf_dp_trace_data.dhcp_disc++;
1605 break;
1606 case QDF_PROTO_DHCP_OFFER:
1607 g_qdf_dp_trace_data.dhcp_off++;
1608 break;
1609 case QDF_PROTO_DHCP_REQUEST:
1610 g_qdf_dp_trace_data.dhcp_req++;
1611 break;
1612 case QDF_PROTO_DHCP_ACK:
1613 g_qdf_dp_trace_data.dhcp_ack++;
1614 break;
1615 case QDF_PROTO_DHCP_NACK:
1616 g_qdf_dp_trace_data.dhcp_nack++;
1617 break;
1618 default:
1619 g_qdf_dp_trace_data.eapol_others++;
1620 break;
1621 }
1622
Nirav Shaheaa20d82016-04-25 18:01:05 +05301623 return true;
1624 }
1625 return false;
1626}
Nirav Shaheaa20d82016-04-25 18:01:05 +05301627
1628/**
1629 * qdf_log_arp_pkt() - log ARP packet
Jeff Johnson5b92ee02019-01-15 14:40:56 -08001630 * @vdev_id: ID of the vdev
Nirav Shaheaa20d82016-04-25 18:01:05 +05301631 * @skb: skb pointer
Nirav Shah29beae02016-04-26 22:58:54 +05301632 * @dir: direction
Jeff Johnson5b92ee02019-01-15 14:40:56 -08001633 * @pdev_id: ID of the pdev
Nirav Shaheaa20d82016-04-25 18:01:05 +05301634 *
1635 * Return: true/false
1636 */
Jeff Johnson5b92ee02019-01-15 14:40:56 -08001637static bool qdf_log_arp_pkt(uint8_t vdev_id, struct sk_buff *skb,
Nandha Kishore Easwarane43583f2017-05-15 21:01:13 +05301638 enum qdf_proto_dir dir, uint8_t pdev_id)
Nirav Shaheaa20d82016-04-25 18:01:05 +05301639{
Nirav Shahcede2892016-05-19 12:41:15 +05301640 enum qdf_proto_subtype proto_subtype;
1641
Nirav Shaheaa20d82016-04-25 18:01:05 +05301642 if ((qdf_dp_get_proto_bitmap() & QDF_NBUF_PKT_TRAC_TYPE_ARP) &&
Nirav Shah9c3b3fe2016-07-20 16:05:06 +05301643 ((dir == QDF_TX && QDF_NBUF_CB_PACKET_TYPE_ARP ==
1644 QDF_NBUF_CB_GET_PACKET_TYPE(skb)) ||
1645 (dir == QDF_RX && qdf_nbuf_is_ipv4_arp_pkt(skb) == true))) {
Nirav Shahcede2892016-05-19 12:41:15 +05301646
Himanshu Agarwalfcd64e92016-07-20 17:45:58 +05301647 proto_subtype = qdf_nbuf_get_arp_subtype(skb);
Mohit Khanna163c3172018-06-27 01:34:02 -07001648 QDF_NBUF_CB_DP_TRACE_PRINT(skb) = true;
Nirav Shah29beae02016-04-26 22:58:54 +05301649 if (QDF_TX == dir)
1650 QDF_NBUF_CB_TX_DP_TRACE(skb) = 1;
1651 else if (QDF_RX == dir)
1652 QDF_NBUF_CB_RX_DP_TRACE(skb) = 1;
Himanshu Agarwal3f549622016-10-27 15:16:25 +05301653
Mohit Khanna163c3172018-06-27 01:34:02 -07001654 DPTRACE(qdf_dp_trace_proto_pkt(QDF_DP_TRACE_ARP_PACKET_RECORD,
Jeff Johnson5b92ee02019-01-15 14:40:56 -08001655 vdev_id,
Mohit Khanna163c3172018-06-27 01:34:02 -07001656 skb->data +
1657 QDF_NBUF_SRC_MAC_OFFSET,
1658 skb->data +
1659 QDF_NBUF_DEST_MAC_OFFSET,
1660 QDF_PROTO_TYPE_ARP,
1661 proto_subtype, dir, pdev_id,
1662 true));
Mohit Khanna7750a172017-05-15 15:53:33 -07001663
1664 if (QDF_PROTO_ARP_REQ == proto_subtype)
1665 g_qdf_dp_trace_data.arp_req++;
1666 else
1667 g_qdf_dp_trace_data.arp_resp++;
1668
Nirav Shaheaa20d82016-04-25 18:01:05 +05301669 return true;
1670 }
1671 return false;
1672}
Nirav Shaheaa20d82016-04-25 18:01:05 +05301673
Zhu Jianminaf3420a2017-06-12 17:55:43 +08001674
Jeff Johnson5b92ee02019-01-15 14:40:56 -08001675bool qdf_dp_trace_log_pkt(uint8_t vdev_id, struct sk_buff *skb,
Nandha Kishore Easwarane43583f2017-05-15 21:01:13 +05301676 enum qdf_proto_dir dir, uint8_t pdev_id)
Nirav Shaheaa20d82016-04-25 18:01:05 +05301677{
Zhu Jianminaf3420a2017-06-12 17:55:43 +08001678 if (!qdf_dp_get_proto_bitmap())
Mohit Khanna7750a172017-05-15 15:53:33 -07001679 return false;
Jeff Johnson5b92ee02019-01-15 14:40:56 -08001680 if (qdf_log_arp_pkt(vdev_id, skb, dir, pdev_id))
Mohit Khanna7750a172017-05-15 15:53:33 -07001681 return true;
Jeff Johnson5b92ee02019-01-15 14:40:56 -08001682 if (qdf_log_dhcp_pkt(vdev_id, skb, dir, pdev_id))
Mohit Khanna7750a172017-05-15 15:53:33 -07001683 return true;
Jeff Johnson5b92ee02019-01-15 14:40:56 -08001684 if (qdf_log_eapol_pkt(vdev_id, skb, dir, pdev_id))
Mohit Khanna7750a172017-05-15 15:53:33 -07001685 return true;
Jeff Johnson5b92ee02019-01-15 14:40:56 -08001686 if (qdf_log_icmp_pkt(vdev_id, skb, dir, pdev_id))
Mohit Khanna7750a172017-05-15 15:53:33 -07001687 return true;
Jeff Johnson5b92ee02019-01-15 14:40:56 -08001688 if (qdf_log_icmpv6_pkt(vdev_id, skb, dir, pdev_id))
Poddar, Siddarthbf4231b2017-07-10 16:27:01 +05301689 return true;
Mohit Khanna7750a172017-05-15 15:53:33 -07001690 return false;
Nirav Shaheaa20d82016-04-25 18:01:05 +05301691}
Manikandan Mohana18b8642018-03-01 16:17:23 -08001692qdf_export_symbol(qdf_dp_trace_log_pkt);
Nirav Shaheaa20d82016-04-25 18:01:05 +05301693
Nirav Shah31d694b2016-05-03 20:18:22 +05301694void qdf_dp_display_mgmt_pkt(struct qdf_dp_trace_record_s *record,
Mohit Khanna04252802017-08-27 09:43:43 -07001695 uint16_t index, uint8_t pdev_id, uint8_t info)
Nirav Shah31d694b2016-05-03 20:18:22 +05301696{
Mohit Khanna04252802017-08-27 09:43:43 -07001697 int loc;
1698 char prepend_str[QDF_DP_TRACE_PREPEND_STR_SIZE];
Nirav Shah31d694b2016-05-03 20:18:22 +05301699 struct qdf_dp_trace_mgmt_buf *buf =
1700 (struct qdf_dp_trace_mgmt_buf *)record->data;
1701
hangtian67ebc3d2019-01-16 17:36:51 +08001702 qdf_mem_zero(prepend_str, sizeof(prepend_str));
Mohit Khanna04252802017-08-27 09:43:43 -07001703 loc = qdf_dp_trace_fill_meta_str(prepend_str, sizeof(prepend_str),
1704 index, info, record);
1705
1706 DPTRACE_PRINT("%s [%d] [%s %s]",
1707 prepend_str,
1708 buf->vdev_id,
1709 qdf_dp_type_to_str(buf->type),
1710 qdf_dp_subtype_to_str(buf->subtype));
Nirav Shah31d694b2016-05-03 20:18:22 +05301711}
Manikandan Mohana18b8642018-03-01 16:17:23 -08001712qdf_export_symbol(qdf_dp_display_mgmt_pkt);
Nirav Shah31d694b2016-05-03 20:18:22 +05301713
Mohit Khanna04252802017-08-27 09:43:43 -07001714
Nirav Shah31d694b2016-05-03 20:18:22 +05301715void qdf_dp_trace_mgmt_pkt(enum QDF_DP_TRACE_ID code, uint8_t vdev_id,
Nandha Kishore Easwarane43583f2017-05-15 21:01:13 +05301716 uint8_t pdev_id, enum qdf_proto_type type,
1717 enum qdf_proto_subtype subtype)
Nirav Shah31d694b2016-05-03 20:18:22 +05301718{
1719 struct qdf_dp_trace_mgmt_buf buf;
1720 int buf_size = sizeof(struct qdf_dp_trace_mgmt_buf);
1721
1722 if (qdf_dp_enable_check(NULL, code, QDF_NA) == false)
1723 return;
1724
1725 if (buf_size > QDF_DP_TRACE_RECORD_SIZE)
1726 QDF_BUG(0);
1727
1728 buf.type = type;
1729 buf.subtype = subtype;
1730 buf.vdev_id = vdev_id;
Mohit Khanna04252802017-08-27 09:43:43 -07001731 qdf_dp_add_record(code, pdev_id, (uint8_t *)&buf, buf_size,
1732 NULL, 0, true);
Nirav Shah31d694b2016-05-03 20:18:22 +05301733}
Manikandan Mohana18b8642018-03-01 16:17:23 -08001734qdf_export_symbol(qdf_dp_trace_mgmt_pkt);
Nirav Shah31d694b2016-05-03 20:18:22 +05301735
Nirav Shah8f44a7e2019-11-05 08:38:47 +05301736static void
1737qdf_dpt_display_credit_record_debugfs(qdf_debugfs_file_t file,
1738 struct qdf_dp_trace_record_s *record,
1739 uint32_t index)
1740{
1741 int loc;
1742 char prepend_str[QDF_DP_TRACE_PREPEND_STR_SIZE];
1743 struct qdf_dp_trace_credit_record *buf =
1744 (struct qdf_dp_trace_credit_record *)record->data;
1745
1746 loc = qdf_dp_trace_fill_meta_str(prepend_str, sizeof(prepend_str),
1747 index, 0, record);
1748 if (buf->operation == QDF_OP_NA)
1749 qdf_debugfs_printf(file, "%s [%s] [T: %d G0: %d G1: %d]\n",
1750 prepend_str,
1751 qdf_dp_credit_source_to_str(buf->source),
1752 buf->total_credits, buf->g0_credit,
1753 buf->g1_credit);
1754 else
1755 qdf_debugfs_printf(file,
1756 "%s [%s] [T: %d G0: %d G1: %d] [%s %d]\n",
1757 prepend_str,
1758 qdf_dp_credit_source_to_str(buf->source),
1759 buf->total_credits, buf->g0_credit,
1760 buf->g1_credit,
1761 qdf_dp_operation_to_str(buf->operation),
1762 buf->delta);
1763}
1764
1765void qdf_dp_display_credit_record(struct qdf_dp_trace_record_s *record,
1766 uint16_t index, uint8_t pdev_id, uint8_t info)
1767{
1768 int loc;
1769 char prepend_str[QDF_DP_TRACE_PREPEND_STR_SIZE];
1770 struct qdf_dp_trace_credit_record *buf =
1771 (struct qdf_dp_trace_credit_record *)record->data;
1772
1773 loc = qdf_dp_trace_fill_meta_str(prepend_str, sizeof(prepend_str),
1774 index, info, record);
1775 if (buf->operation == QDF_OP_NA)
1776 DPTRACE_PRINT("%s [%s] [T: %d G0: %d G1: %d]",
1777 prepend_str,
1778 qdf_dp_credit_source_to_str(buf->source),
1779 buf->total_credits, buf->g0_credit,
1780 buf->g1_credit);
1781 else
1782 DPTRACE_PRINT("%s [%s] [T: %d G0: %d G1: %d] [%s %d]",
1783 prepend_str,
1784 qdf_dp_credit_source_to_str(buf->source),
1785 buf->total_credits, buf->g0_credit,
1786 buf->g1_credit,
1787 qdf_dp_operation_to_str(buf->operation),
1788 buf->delta);
1789}
1790
1791void qdf_dp_trace_credit_record(enum QDF_CREDIT_UPDATE_SOURCE source,
1792 enum QDF_CREDIT_OPERATION operation,
1793 int delta, int total_credits,
1794 int g0_credit, int g1_credit)
1795{
1796 struct qdf_dp_trace_credit_record buf;
1797 int buf_size = sizeof(struct qdf_dp_trace_credit_record);
1798 enum QDF_DP_TRACE_ID code = QDF_DP_TRACE_TX_CREDIT_RECORD;
1799
1800 if (qdf_dp_enable_check(NULL, code, QDF_NA) == false)
1801 return;
1802
1803 if (!(qdf_dp_get_proto_bitmap() & QDF_HL_CREDIT_TRACKING))
1804 return;
1805
1806 if (buf_size > QDF_DP_TRACE_RECORD_SIZE)
1807 QDF_BUG(0);
1808
1809 buf.source = source;
1810 buf.operation = operation;
1811 buf.delta = delta;
1812 buf.total_credits = total_credits;
1813 buf.g0_credit = g0_credit;
1814 buf.g1_credit = g1_credit;
1815
1816 qdf_dp_add_record(code, QDF_TRACE_DEFAULT_PDEV_ID, (uint8_t *)&buf,
1817 buf_size, NULL, 0, false);
1818}
1819qdf_export_symbol(qdf_dp_trace_credit_record);
1820
Himanshu Agarwalc0b71452016-09-20 15:10:55 +05301821void qdf_dp_display_event_record(struct qdf_dp_trace_record_s *record,
Mohit Khanna04252802017-08-27 09:43:43 -07001822 uint16_t index, uint8_t pdev_id, uint8_t info)
Himanshu Agarwalc0b71452016-09-20 15:10:55 +05301823{
Mohit Khanna04252802017-08-27 09:43:43 -07001824 char prepend_str[QDF_DP_TRACE_PREPEND_STR_SIZE];
Himanshu Agarwalc0b71452016-09-20 15:10:55 +05301825 struct qdf_dp_trace_event_buf *buf =
1826 (struct qdf_dp_trace_event_buf *)record->data;
1827
hangtian67ebc3d2019-01-16 17:36:51 +08001828 qdf_mem_zero(prepend_str, sizeof(prepend_str));
Mohit Khanna04252802017-08-27 09:43:43 -07001829 qdf_dp_trace_fill_meta_str(prepend_str, sizeof(prepend_str),
1830 index, info, record);
1831
1832 DPTRACE_PRINT("%s [%d] [%s %s]",
1833 prepend_str,
1834 buf->vdev_id,
1835 qdf_dp_type_to_str(buf->type),
1836 qdf_dp_subtype_to_str(buf->subtype));
Himanshu Agarwalc0b71452016-09-20 15:10:55 +05301837}
Manikandan Mohana18b8642018-03-01 16:17:23 -08001838qdf_export_symbol(qdf_dp_display_event_record);
Himanshu Agarwalc0b71452016-09-20 15:10:55 +05301839
1840/**
1841 * qdf_dp_trace_record_event() - record events
1842 * @code: dptrace code
1843 * @vdev_id: vdev id
Nandha Kishore Easwarane43583f2017-05-15 21:01:13 +05301844 * @pdev_id: pdev_id
Himanshu Agarwalc0b71452016-09-20 15:10:55 +05301845 * @type: proto type
1846 * @subtype: proto subtype
1847 *
1848 * Return: none
1849 */
1850void qdf_dp_trace_record_event(enum QDF_DP_TRACE_ID code, uint8_t vdev_id,
Nandha Kishore Easwarane43583f2017-05-15 21:01:13 +05301851 uint8_t pdev_id, enum qdf_proto_type type,
1852 enum qdf_proto_subtype subtype)
Himanshu Agarwalc0b71452016-09-20 15:10:55 +05301853{
1854 struct qdf_dp_trace_event_buf buf;
1855 int buf_size = sizeof(struct qdf_dp_trace_event_buf);
1856
1857 if (qdf_dp_enable_check(NULL, code, QDF_NA) == false)
1858 return;
1859
1860 if (buf_size > QDF_DP_TRACE_RECORD_SIZE)
1861 QDF_BUG(0);
1862
1863 buf.type = type;
1864 buf.subtype = subtype;
1865 buf.vdev_id = vdev_id;
Mohit Khanna04252802017-08-27 09:43:43 -07001866 qdf_dp_add_record(code, pdev_id,
1867 (uint8_t *)&buf, buf_size, NULL, 0, true);
Himanshu Agarwalc0b71452016-09-20 15:10:55 +05301868}
Manikandan Mohana18b8642018-03-01 16:17:23 -08001869qdf_export_symbol(qdf_dp_trace_record_event);
Nirav Shah31d694b2016-05-03 20:18:22 +05301870
Mohit Khanna04252802017-08-27 09:43:43 -07001871
Saket Jhad8d9d992019-09-30 17:27:51 -07001872void qdf_dp_display_proto_pkt(struct qdf_dp_trace_record_s *record,
1873 uint16_t index, uint8_t pdev_id, uint8_t info)
Nirav Shaheaa20d82016-04-25 18:01:05 +05301874{
Mohit Khanna04252802017-08-27 09:43:43 -07001875 int loc;
1876 char prepend_str[QDF_DP_TRACE_PREPEND_STR_SIZE];
Nirav Shaheaa20d82016-04-25 18:01:05 +05301877 struct qdf_dp_trace_proto_buf *buf =
1878 (struct qdf_dp_trace_proto_buf *)record->data;
1879
hangtian67ebc3d2019-01-16 17:36:51 +08001880 qdf_mem_zero(prepend_str, sizeof(prepend_str));
Mohit Khanna04252802017-08-27 09:43:43 -07001881 loc = qdf_dp_trace_fill_meta_str(prepend_str, sizeof(prepend_str),
1882 index, info, record);
1883 DPTRACE_PRINT("%s [%d] [%s] SA: "
Mohit Khanna163c3172018-06-27 01:34:02 -07001884 QDF_MAC_ADDR_STR " %s DA: "
1885 QDF_MAC_ADDR_STR,
1886 prepend_str,
1887 buf->vdev_id,
1888 qdf_dp_subtype_to_str(buf->subtype),
1889 QDF_MAC_ADDR_ARRAY(buf->sa.bytes),
1890 qdf_dp_dir_to_str(buf->dir),
1891 QDF_MAC_ADDR_ARRAY(buf->da.bytes));
Nirav Shaheaa20d82016-04-25 18:01:05 +05301892}
Saket Jhad8d9d992019-09-30 17:27:51 -07001893qdf_export_symbol(qdf_dp_display_proto_pkt);
Nirav Shaheaa20d82016-04-25 18:01:05 +05301894
Nirav Shaheaa20d82016-04-25 18:01:05 +05301895void qdf_dp_trace_proto_pkt(enum QDF_DP_TRACE_ID code, uint8_t vdev_id,
1896 uint8_t *sa, uint8_t *da, enum qdf_proto_type type,
Nandha Kishore Easwarane43583f2017-05-15 21:01:13 +05301897 enum qdf_proto_subtype subtype, enum qdf_proto_dir dir,
Mohit Khanna7750a172017-05-15 15:53:33 -07001898 uint8_t pdev_id, bool print)
Nirav Shaheaa20d82016-04-25 18:01:05 +05301899{
1900 struct qdf_dp_trace_proto_buf buf;
1901 int buf_size = sizeof(struct qdf_dp_trace_ptr_buf);
1902
Nirav Shah29beae02016-04-26 22:58:54 +05301903 if (qdf_dp_enable_check(NULL, code, dir) == false)
Nirav Shaheaa20d82016-04-25 18:01:05 +05301904 return;
1905
1906 if (buf_size > QDF_DP_TRACE_RECORD_SIZE)
1907 QDF_BUG(0);
1908
1909 memcpy(&buf.sa, sa, QDF_NET_ETH_LEN);
1910 memcpy(&buf.da, da, QDF_NET_ETH_LEN);
1911 buf.dir = dir;
1912 buf.type = type;
1913 buf.subtype = subtype;
1914 buf.vdev_id = vdev_id;
Mohit Khanna04252802017-08-27 09:43:43 -07001915 qdf_dp_add_record(code, pdev_id,
1916 (uint8_t *)&buf, buf_size, NULL, 0, print);
Nirav Shaheaa20d82016-04-25 18:01:05 +05301917}
Manikandan Mohana18b8642018-03-01 16:17:23 -08001918qdf_export_symbol(qdf_dp_trace_proto_pkt);
Nirav Shaheaa20d82016-04-25 18:01:05 +05301919
Nirav Shaheaa20d82016-04-25 18:01:05 +05301920void qdf_dp_display_ptr_record(struct qdf_dp_trace_record_s *record,
Mohit Khanna04252802017-08-27 09:43:43 -07001921 uint16_t index, uint8_t pdev_id, uint8_t info)
Nirav Shaheaa20d82016-04-25 18:01:05 +05301922{
Mohit Khanna04252802017-08-27 09:43:43 -07001923 int loc;
1924 char prepend_str[QDF_DP_TRACE_PREPEND_STR_SIZE];
Nirav Shaheaa20d82016-04-25 18:01:05 +05301925 struct qdf_dp_trace_ptr_buf *buf =
1926 (struct qdf_dp_trace_ptr_buf *)record->data;
Amar Singhal413f3e22018-09-12 15:51:35 -07001927 bool is_free_pkt_ptr_record = false;
Mohit Khanna163c3172018-06-27 01:34:02 -07001928
1929 if ((record->code == QDF_DP_TRACE_FREE_PACKET_PTR_RECORD) ||
1930 (record->code == QDF_DP_TRACE_LI_DP_FREE_PACKET_PTR_RECORD))
1931 is_free_pkt_ptr_record = true;
Nirav Shaheaa20d82016-04-25 18:01:05 +05301932
hangtian67ebc3d2019-01-16 17:36:51 +08001933 qdf_mem_zero(prepend_str, sizeof(prepend_str));
Mohit Khanna04252802017-08-27 09:43:43 -07001934 loc = qdf_dp_trace_fill_meta_str(prepend_str, sizeof(prepend_str),
1935 index, info, record);
Mohit Khanna7750a172017-05-15 15:53:33 -07001936
Mohit Khanna04252802017-08-27 09:43:43 -07001937 if (loc < sizeof(prepend_str))
1938 scnprintf(&prepend_str[loc], sizeof(prepend_str) - loc,
1939 "[msdu id %d %s %d]",
1940 buf->msdu_id,
Mohit Khanna163c3172018-06-27 01:34:02 -07001941 is_free_pkt_ptr_record ? "status" : "vdev_id",
Mohit Khanna04252802017-08-27 09:43:43 -07001942 buf->status);
1943
1944 if (info & QDF_DP_TRACE_RECORD_INFO_LIVE) {
Mohit Khanna7750a172017-05-15 15:53:33 -07001945 /* In live mode donot dump the contents of the cookie */
Mohit Khanna04252802017-08-27 09:43:43 -07001946 DPTRACE_PRINT("%s", prepend_str);
Mohit Khanna7750a172017-05-15 15:53:33 -07001947 } else {
1948 dump_dp_hex_trace(prepend_str, (uint8_t *)&buf->cookie,
1949 sizeof(buf->cookie));
1950 }
Nirav Shaheaa20d82016-04-25 18:01:05 +05301951}
Manikandan Mohana18b8642018-03-01 16:17:23 -08001952qdf_export_symbol(qdf_dp_display_ptr_record);
Nirav Shaheaa20d82016-04-25 18:01:05 +05301953
1954/**
1955 * qdf_dp_trace_ptr() - record dptrace
1956 * @code: dptrace code
Nandha Kishore Easwarane43583f2017-05-15 21:01:13 +05301957 * @pdev_id: pdev_id
Nirav Shaheaa20d82016-04-25 18:01:05 +05301958 * @data: data
1959 * @size: size of data
1960 * @msdu_id: msdu_id
1961 * @status: return status
1962 *
1963 * Return: none
1964 */
1965void qdf_dp_trace_ptr(qdf_nbuf_t nbuf, enum QDF_DP_TRACE_ID code,
Nandha Kishore Easwarane43583f2017-05-15 21:01:13 +05301966 uint8_t pdev_id, uint8_t *data, uint8_t size,
1967 uint16_t msdu_id, uint16_t status)
Nirav Shaheaa20d82016-04-25 18:01:05 +05301968{
1969 struct qdf_dp_trace_ptr_buf buf;
1970 int buf_size = sizeof(struct qdf_dp_trace_ptr_buf);
1971
Nirav Shah29beae02016-04-26 22:58:54 +05301972 if (qdf_dp_enable_check(nbuf, code, QDF_TX) == false)
Nirav Shaheaa20d82016-04-25 18:01:05 +05301973 return;
1974
1975 if (buf_size > QDF_DP_TRACE_RECORD_SIZE)
1976 QDF_BUG(0);
1977
1978 qdf_mem_copy(&buf.cookie, data, size);
1979 buf.msdu_id = msdu_id;
1980 buf.status = status;
Mohit Khanna04252802017-08-27 09:43:43 -07001981 qdf_dp_add_record(code, pdev_id, (uint8_t *)&buf, buf_size, NULL, 0,
1982 QDF_NBUF_CB_DP_TRACE_PRINT(nbuf));
Nirav Shaheaa20d82016-04-25 18:01:05 +05301983}
Manikandan Mohana18b8642018-03-01 16:17:23 -08001984qdf_export_symbol(qdf_dp_trace_ptr);
Nirav Shaheaa20d82016-04-25 18:01:05 +05301985
Mohit Khanna04252802017-08-27 09:43:43 -07001986void qdf_dp_trace_data_pkt(qdf_nbuf_t nbuf, uint8_t pdev_id,
1987 enum QDF_DP_TRACE_ID code, uint16_t msdu_id,
1988 enum qdf_proto_dir dir)
Mohit Khanna7750a172017-05-15 15:53:33 -07001989{
Mohit Khanna04252802017-08-27 09:43:43 -07001990 struct qdf_dp_trace_data_buf buf;
Mohit Khanna7750a172017-05-15 15:53:33 -07001991
Mohit Khanna04252802017-08-27 09:43:43 -07001992 buf.msdu_id = msdu_id;
1993 if (!qdf_dp_enable_check(nbuf, code, dir))
Mohit Khanna7750a172017-05-15 15:53:33 -07001994 return;
1995
Mohit Khanna04252802017-08-27 09:43:43 -07001996 qdf_dp_add_record(code, pdev_id,
Amar Singhalf98d9262018-05-18 16:09:47 -07001997 nbuf ? qdf_nbuf_data(nbuf) : NULL,
1998 nbuf ? nbuf->len - nbuf->data_len : 0,
Mohit Khanna04252802017-08-27 09:43:43 -07001999 (uint8_t *)&buf, sizeof(struct qdf_dp_trace_data_buf),
2000 (nbuf) ? QDF_NBUF_CB_DP_TRACE_PRINT(nbuf) : false);
2001}
Mohit Khanna7750a172017-05-15 15:53:33 -07002002
Mohit Khanna04252802017-08-27 09:43:43 -07002003qdf_export_symbol(qdf_dp_trace_data_pkt);
2004
2005void qdf_dp_display_record(struct qdf_dp_trace_record_s *record,
2006 uint16_t index, uint8_t pdev_id, uint8_t info)
2007{
2008 int loc;
2009 char prepend_str[QDF_DP_TRACE_PREPEND_STR_SIZE];
2010
2011 if (!(pdev_id == QDF_TRACE_DEFAULT_PDEV_ID ||
2012 pdev_id == record->pdev_id))
2013 return;
2014
hangtian67ebc3d2019-01-16 17:36:51 +08002015 qdf_mem_zero(prepend_str, sizeof(prepend_str));
Mohit Khanna04252802017-08-27 09:43:43 -07002016 loc = qdf_dp_trace_fill_meta_str(prepend_str, sizeof(prepend_str),
2017 index, info, record);
2018
2019 switch (record->code) {
Mohit Khanna7750a172017-05-15 15:53:33 -07002020 case QDF_DP_TRACE_HDD_TX_TIMEOUT:
2021 DPTRACE_PRINT(" %s: HDD TX Timeout", prepend_str);
2022 break;
2023 case QDF_DP_TRACE_HDD_SOFTAP_TX_TIMEOUT:
2024 DPTRACE_PRINT(" %s: HDD SoftAP TX Timeout", prepend_str);
2025 break;
Yun Parkc60a22b2017-08-15 12:04:11 -07002026 case QDF_DP_TRACE_CE_FAST_PACKET_ERR_RECORD:
2027 DPTRACE_PRINT(" %s: CE Fast Packet Error", prepend_str);
2028 break;
Mohit Khanna7750a172017-05-15 15:53:33 -07002029 case QDF_DP_TRACE_LI_DP_NULL_RX_PACKET_RECORD:
2030 default:
Mohit Khanna04252802017-08-27 09:43:43 -07002031 dump_dp_hex_trace(prepend_str, record->data, record->size);
Mohit Khanna7750a172017-05-15 15:53:33 -07002032 break;
2033 };
Nirav Shaheaa20d82016-04-25 18:01:05 +05302034}
Manikandan Mohana18b8642018-03-01 16:17:23 -08002035qdf_export_symbol(qdf_dp_display_record);
Nirav Shaheaa20d82016-04-25 18:01:05 +05302036
Mohit Khanna04252802017-08-27 09:43:43 -07002037void
2038qdf_dp_display_data_pkt_record(struct qdf_dp_trace_record_s *record,
2039 uint16_t rec_index, uint8_t pdev_id,
2040 uint8_t info)
2041{
2042 int loc;
2043 char prepend_str[DP_TRACE_META_DATA_STRLEN + 10];
2044 struct qdf_dp_trace_data_buf *buf =
2045 (struct qdf_dp_trace_data_buf *)record->data;
2046
hangtian67ebc3d2019-01-16 17:36:51 +08002047 qdf_mem_zero(prepend_str, sizeof(prepend_str));
Mohit Khanna04252802017-08-27 09:43:43 -07002048
2049 loc = qdf_dp_trace_fill_meta_str(prepend_str, sizeof(prepend_str),
2050 rec_index, info, record);
2051 if (loc < sizeof(prepend_str))
2052 loc += snprintf(&prepend_str[loc], sizeof(prepend_str) - loc,
2053 "[%d]", buf->msdu_id);
2054 dump_dp_hex_trace(prepend_str,
2055 &record->data[sizeof(struct qdf_dp_trace_data_buf)],
2056 record->size);
2057}
Nirav Shaheaa20d82016-04-25 18:01:05 +05302058
2059/**
2060 * qdf_dp_trace() - Stores the data in buffer
2061 * @nbuf : defines the netbuf
2062 * @code : defines the event
Nandha Kishore Easwarane43583f2017-05-15 21:01:13 +05302063 * @pdev_id: pdev_id
Nirav Shaheaa20d82016-04-25 18:01:05 +05302064 * @data : defines the data to be stored
2065 * @size : defines the size of the data record
2066 *
2067 * Return: None
2068 */
Nandha Kishore Easwarane43583f2017-05-15 21:01:13 +05302069void qdf_dp_trace(qdf_nbuf_t nbuf, enum QDF_DP_TRACE_ID code, uint8_t pdev_id,
2070 uint8_t *data, uint8_t size, enum qdf_proto_dir dir)
Nirav Shaheaa20d82016-04-25 18:01:05 +05302071{
Nirav Shah29beae02016-04-26 22:58:54 +05302072
2073 if (qdf_dp_enable_check(nbuf, code, dir) == false)
Nirav Shaheaa20d82016-04-25 18:01:05 +05302074 return;
2075
Zhang Qian3c724252018-05-21 11:24:04 +08002076 qdf_dp_add_record(code, pdev_id, nbuf ? qdf_nbuf_data(nbuf) : NULL,
2077 size, NULL, 0,
Mohit Khanna04252802017-08-27 09:43:43 -07002078 (nbuf) ? QDF_NBUF_CB_DP_TRACE_PRINT(nbuf) : false);
Chouhan, Anurag57763182016-03-03 18:57:27 +05302079}
Manikandan Mohana18b8642018-03-01 16:17:23 -08002080qdf_export_symbol(qdf_dp_trace);
Chouhan, Anurag57763182016-03-03 18:57:27 +05302081
2082/**
2083 * qdf_dp_trace_spin_lock_init() - initializes the lock variable before use
2084 * This function will be called from cds_alloc_global_context, we will have lock
2085 * available to use ASAP
2086 *
2087 * Return: None
2088 */
2089void qdf_dp_trace_spin_lock_init(void)
2090{
2091 spin_lock_init(&l_dp_trace_lock);
Chouhan, Anurag57763182016-03-03 18:57:27 +05302092}
Manikandan Mohana18b8642018-03-01 16:17:23 -08002093qdf_export_symbol(qdf_dp_trace_spin_lock_init);
Chouhan, Anurag57763182016-03-03 18:57:27 +05302094
2095/**
Mohit Khanna7750a172017-05-15 15:53:33 -07002096 * qdf_dp_trace_disable_live_mode - disable live mode for dptrace
2097 *
2098 * Return: none
2099 */
2100void qdf_dp_trace_disable_live_mode(void)
2101{
Mohit Khanna04252802017-08-27 09:43:43 -07002102 g_qdf_dp_trace_data.force_live_mode = 0;
Mohit Khanna7750a172017-05-15 15:53:33 -07002103}
Manikandan Mohana18b8642018-03-01 16:17:23 -08002104qdf_export_symbol(qdf_dp_trace_disable_live_mode);
Mohit Khanna7750a172017-05-15 15:53:33 -07002105
2106/**
Nirav Shah29beae02016-04-26 22:58:54 +05302107 * qdf_dp_trace_enable_live_mode() - enable live mode for dptrace
2108 *
2109 * Return: none
2110 */
2111void qdf_dp_trace_enable_live_mode(void)
2112{
Mohit Khanna04252802017-08-27 09:43:43 -07002113 g_qdf_dp_trace_data.force_live_mode = 1;
Nirav Shah29beae02016-04-26 22:58:54 +05302114}
Manikandan Mohana18b8642018-03-01 16:17:23 -08002115qdf_export_symbol(qdf_dp_trace_enable_live_mode);
Nirav Shah29beae02016-04-26 22:58:54 +05302116
Nirav Shah29beae02016-04-26 22:58:54 +05302117/**
Nirav Shahcede2892016-05-19 12:41:15 +05302118 * qdf_dp_trace_clear_buffer() - clear dp trace buffer
2119 *
2120 * Return: none
2121 */
2122void qdf_dp_trace_clear_buffer(void)
2123{
2124 g_qdf_dp_trace_data.head = INVALID_QDF_DP_TRACE_ADDR;
2125 g_qdf_dp_trace_data.tail = INVALID_QDF_DP_TRACE_ADDR;
2126 g_qdf_dp_trace_data.num = 0;
Rakshith Suresh Patkare105ac12018-12-06 20:40:49 +05302127 g_qdf_dp_trace_data.dump_counter = 0;
2128 g_qdf_dp_trace_data.num_records_to_dump = MAX_QDF_DP_TRACE_RECORDS;
Rachit Kankaneb3ba7692018-06-27 18:42:34 +05302129 if (g_qdf_dp_trace_data.enable)
2130 memset(g_qdf_dp_trace_tbl, 0,
2131 MAX_QDF_DP_TRACE_RECORDS *
2132 sizeof(struct qdf_dp_trace_record_s));
Nirav Shahcede2892016-05-19 12:41:15 +05302133}
Manikandan Mohana18b8642018-03-01 16:17:23 -08002134qdf_export_symbol(qdf_dp_trace_clear_buffer);
Nirav Shahcede2892016-05-19 12:41:15 +05302135
Mohit Khanna90d7ebd2017-09-12 21:54:21 -07002136void qdf_dp_trace_dump_stats(void)
2137{
Mohit Khanna163c3172018-06-27 01:34:02 -07002138 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)",
2139 g_qdf_dp_trace_data.tx_count,
2140 g_qdf_dp_trace_data.rx_count,
Mohit Khanna90d7ebd2017-09-12 21:54:21 -07002141 g_qdf_dp_trace_data.icmp_req,
2142 g_qdf_dp_trace_data.icmp_resp,
2143 g_qdf_dp_trace_data.arp_req,
2144 g_qdf_dp_trace_data.arp_resp,
2145 g_qdf_dp_trace_data.icmpv6_req,
2146 g_qdf_dp_trace_data.icmpv6_resp,
2147 g_qdf_dp_trace_data.icmpv6_ns,
2148 g_qdf_dp_trace_data.icmpv6_na,
2149 g_qdf_dp_trace_data.icmpv6_rs,
2150 g_qdf_dp_trace_data.icmpv6_ra,
2151 g_qdf_dp_trace_data.dhcp_disc,
2152 g_qdf_dp_trace_data.dhcp_off,
2153 g_qdf_dp_trace_data.dhcp_req,
2154 g_qdf_dp_trace_data.dhcp_ack,
2155 g_qdf_dp_trace_data.dhcp_nack,
2156 g_qdf_dp_trace_data.dhcp_others,
2157 g_qdf_dp_trace_data.eapol_m1,
2158 g_qdf_dp_trace_data.eapol_m2,
2159 g_qdf_dp_trace_data.eapol_m3,
2160 g_qdf_dp_trace_data.eapol_m4,
2161 g_qdf_dp_trace_data.eapol_others);
2162}
Rakshith Suresh Patkardcd07332018-04-20 12:52:08 +05302163qdf_export_symbol(qdf_dp_trace_dump_stats);
2164
2165/**
2166 * qdf_dpt_dump_hex_trace_debugfs() - read data in file
2167 * @file: file to read
2168 * @str: string to prepend the hexdump with.
2169 * @buf: buffer which contains data to be written
2170 * @buf_len: defines the size of the data to be written
2171 *
2172 * Return: None
2173 */
2174static void qdf_dpt_dump_hex_trace_debugfs(qdf_debugfs_file_t file,
2175 char *str, uint8_t *buf, uint8_t buf_len)
2176{
2177 unsigned char linebuf[BUFFER_SIZE];
2178 const u8 *ptr = buf;
2179 int i, linelen, remaining = buf_len;
2180
2181 /* Dump the bytes in the last line */
2182 for (i = 0; i < buf_len; i += ROW_SIZE) {
2183 linelen = min(remaining, ROW_SIZE);
2184 remaining -= ROW_SIZE;
2185
2186 hex_dump_to_buffer(ptr + i, linelen, ROW_SIZE, 1,
2187 linebuf, sizeof(linebuf), false);
2188
Rakshith Suresh Patkare105ac12018-12-06 20:40:49 +05302189 qdf_debugfs_printf(file, "%s %s\n", str, linebuf);
Rakshith Suresh Patkardcd07332018-04-20 12:52:08 +05302190 }
2191}
2192
2193/**
2194 * qdf_dpt_display_proto_pkt_debugfs() - display proto packet
2195 * @file: file to read
2196 * @record: dptrace record
2197 * @index: index
2198 *
2199 * Return: none
2200 */
2201static void qdf_dpt_display_proto_pkt_debugfs(qdf_debugfs_file_t file,
2202 struct qdf_dp_trace_record_s *record,
2203 uint32_t index)
2204{
Mohit Khanna04252802017-08-27 09:43:43 -07002205 int loc;
2206 char prepend_str[QDF_DP_TRACE_PREPEND_STR_SIZE];
Rakshith Suresh Patkardcd07332018-04-20 12:52:08 +05302207 struct qdf_dp_trace_proto_buf *buf =
Mohit Khanna04252802017-08-27 09:43:43 -07002208 (struct qdf_dp_trace_proto_buf *)record->data;
Rakshith Suresh Patkardcd07332018-04-20 12:52:08 +05302209
Mohit Khanna04252802017-08-27 09:43:43 -07002210 loc = qdf_dp_trace_fill_meta_str(prepend_str, sizeof(prepend_str),
2211 index, 0, record);
2212 qdf_debugfs_printf(file, "%s [%d] [%s] SA: "
Rakshith Suresh Patkardcd07332018-04-20 12:52:08 +05302213 QDF_MAC_ADDR_STR " %s DA: "
2214 QDF_MAC_ADDR_STR,
Mohit Khanna04252802017-08-27 09:43:43 -07002215 prepend_str,
2216 buf->vdev_id,
Rakshith Suresh Patkardcd07332018-04-20 12:52:08 +05302217 qdf_dp_subtype_to_str(buf->subtype),
2218 QDF_MAC_ADDR_ARRAY(buf->sa.bytes),
2219 qdf_dp_dir_to_str(buf->dir),
2220 QDF_MAC_ADDR_ARRAY(buf->da.bytes));
2221 qdf_debugfs_printf(file, "\n");
2222}
2223
2224/**
2225 * qdf_dpt_display_mgmt_pkt_debugfs() - display mgmt packet
2226 * @file: file to read
2227 * @record: dptrace record
2228 * @index: index
2229 *
2230 * Return: none
2231 */
2232static void qdf_dpt_display_mgmt_pkt_debugfs(qdf_debugfs_file_t file,
2233 struct qdf_dp_trace_record_s *record,
2234 uint32_t index)
2235{
Mohit Khanna04252802017-08-27 09:43:43 -07002236
2237 int loc;
2238 char prepend_str[QDF_DP_TRACE_PREPEND_STR_SIZE];
Rakshith Suresh Patkardcd07332018-04-20 12:52:08 +05302239 struct qdf_dp_trace_mgmt_buf *buf =
2240 (struct qdf_dp_trace_mgmt_buf *)record->data;
2241
Mohit Khanna04252802017-08-27 09:43:43 -07002242 loc = qdf_dp_trace_fill_meta_str(prepend_str, sizeof(prepend_str),
2243 index, 0, record);
2244
2245 qdf_debugfs_printf(file, "%s [%d] [%s %s]\n",
2246 prepend_str,
2247 buf->vdev_id,
Rakshith Suresh Patkardcd07332018-04-20 12:52:08 +05302248 qdf_dp_type_to_str(buf->type),
2249 qdf_dp_subtype_to_str(buf->subtype));
2250}
2251
2252/**
2253 * qdf_dpt_display_event_record_debugfs() - display event records
2254 * @file: file to read
2255 * @record: dptrace record
2256 * @index: index
2257 *
2258 * Return: none
2259 */
2260static void qdf_dpt_display_event_record_debugfs(qdf_debugfs_file_t file,
2261 struct qdf_dp_trace_record_s *record,
2262 uint32_t index)
2263{
Mohit Khanna04252802017-08-27 09:43:43 -07002264 char prepend_str[QDF_DP_TRACE_PREPEND_STR_SIZE];
Rakshith Suresh Patkardcd07332018-04-20 12:52:08 +05302265 struct qdf_dp_trace_event_buf *buf =
2266 (struct qdf_dp_trace_event_buf *)record->data;
2267
Mohit Khanna04252802017-08-27 09:43:43 -07002268 qdf_dp_trace_fill_meta_str(prepend_str, sizeof(prepend_str),
2269 index, 0, record);
2270 qdf_debugfs_printf(file, "%s [%d] [%s %s]\n",
2271 prepend_str,
2272 buf->vdev_id,
Rakshith Suresh Patkardcd07332018-04-20 12:52:08 +05302273 qdf_dp_type_to_str(buf->type),
2274 qdf_dp_subtype_to_str(buf->subtype));
2275}
2276
2277/**
2278 * qdf_dpt_display_ptr_record_debugfs() - display record ptr
2279 * @file: file to read
2280 * @record: dptrace record
2281 * @index: index
2282 *
2283 * Return: none
2284 */
2285static void qdf_dpt_display_ptr_record_debugfs(qdf_debugfs_file_t file,
2286 struct qdf_dp_trace_record_s *record,
2287 uint32_t index)
2288{
Mohit Khanna04252802017-08-27 09:43:43 -07002289 char prepend_str[QDF_DP_TRACE_PREPEND_STR_SIZE];
2290 int loc;
2291 struct qdf_dp_trace_ptr_buf *buf =
2292 (struct qdf_dp_trace_ptr_buf *)record->data;
2293 loc = qdf_dp_trace_fill_meta_str(prepend_str, sizeof(prepend_str),
2294 index, 0, record);
Rakshith Suresh Patkardcd07332018-04-20 12:52:08 +05302295
Mohit Khanna04252802017-08-27 09:43:43 -07002296 if (loc < sizeof(prepend_str))
2297 scnprintf(&prepend_str[loc], sizeof(prepend_str) - loc,
2298 "[msdu id %d %s %d]",
2299 buf->msdu_id,
2300 (record->code ==
2301 QDF_DP_TRACE_FREE_PACKET_PTR_RECORD) ?
2302 "status" : "vdev_id",
2303 buf->status);
Rakshith Suresh Patkardcd07332018-04-20 12:52:08 +05302304
Rakshith Suresh Patkardcd07332018-04-20 12:52:08 +05302305 qdf_dpt_dump_hex_trace_debugfs(file, prepend_str,
2306 (uint8_t *)&buf->cookie,
2307 sizeof(buf->cookie));
2308}
2309
2310/**
2311 * qdf_dpt_display_ptr_record_debugfs() - display record
2312 * @file: file to read
2313 * @record: dptrace record
2314 * @index: index
2315 *
2316 * Return: none
2317 */
2318static void qdf_dpt_display_record_debugfs(qdf_debugfs_file_t file,
2319 struct qdf_dp_trace_record_s *record,
2320 uint32_t index)
2321{
Mohit Khanna04252802017-08-27 09:43:43 -07002322 int loc;
2323 char prepend_str[QDF_DP_TRACE_PREPEND_STR_SIZE];
jitiphilcfb14522018-05-15 13:28:44 +05302324 struct qdf_dp_trace_data_buf *buf =
2325 (struct qdf_dp_trace_data_buf *)record->data;
Rakshith Suresh Patkardcd07332018-04-20 12:52:08 +05302326
Mohit Khanna04252802017-08-27 09:43:43 -07002327 loc = qdf_dp_trace_fill_meta_str(prepend_str, sizeof(prepend_str),
2328 index, 0, record);
jitiphilcfb14522018-05-15 13:28:44 +05302329 if (loc < sizeof(prepend_str))
2330 loc += snprintf(&prepend_str[loc], sizeof(prepend_str) - loc,
2331 "[%d]", buf->msdu_id);
Rakshith Suresh Patkardcd07332018-04-20 12:52:08 +05302332 qdf_dpt_dump_hex_trace_debugfs(file, prepend_str,
2333 record->data, record->size);
2334}
2335
2336uint32_t qdf_dpt_get_curr_pos_debugfs(qdf_debugfs_file_t file,
2337 enum qdf_dpt_debugfs_state state)
2338{
2339 uint32_t i = 0;
2340 uint32_t tail;
2341 uint32_t count = g_qdf_dp_trace_data.num;
2342
2343 if (!g_qdf_dp_trace_data.enable) {
2344 QDF_TRACE(QDF_MODULE_ID_QDF, QDF_TRACE_LEVEL_DEBUG,
2345 "%s: Tracing Disabled", __func__);
2346 return QDF_STATUS_E_EMPTY;
2347 }
2348
2349 if (!count) {
2350 QDF_TRACE(QDF_MODULE_ID_QDF, QDF_TRACE_LEVEL_DEBUG,
2351 "%s: no packets", __func__);
2352 return QDF_STATUS_E_EMPTY;
2353 }
2354
2355 if (state == QDF_DPT_DEBUGFS_STATE_SHOW_IN_PROGRESS)
2356 return g_qdf_dp_trace_data.curr_pos;
2357
2358 qdf_debugfs_printf(file,
Rakshith Suresh Patkare105ac12018-12-06 20:40:49 +05302359 "DPT: config - bitmap 0x%x verb %u #rec %u rec_requested %u live_config %u thresh %u time_limit %u\n",
Rakshith Suresh Patkardcd07332018-04-20 12:52:08 +05302360 g_qdf_dp_trace_data.proto_bitmap,
2361 g_qdf_dp_trace_data.verbosity,
2362 g_qdf_dp_trace_data.no_of_record,
Rakshith Suresh Patkare105ac12018-12-06 20:40:49 +05302363 g_qdf_dp_trace_data.num_records_to_dump,
Rakshith Suresh Patkardcd07332018-04-20 12:52:08 +05302364 g_qdf_dp_trace_data.live_mode_config,
2365 g_qdf_dp_trace_data.high_tput_thresh,
2366 g_qdf_dp_trace_data.thresh_time_limit);
2367
2368 qdf_debugfs_printf(file,
2369 "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",
2370 g_qdf_dp_trace_data.icmp_req,
2371 g_qdf_dp_trace_data.icmp_resp,
2372 g_qdf_dp_trace_data.arp_req,
2373 g_qdf_dp_trace_data.arp_resp,
2374 g_qdf_dp_trace_data.icmpv6_req,
2375 g_qdf_dp_trace_data.icmpv6_resp,
2376 g_qdf_dp_trace_data.icmpv6_ns,
2377 g_qdf_dp_trace_data.icmpv6_na,
2378 g_qdf_dp_trace_data.icmpv6_rs,
2379 g_qdf_dp_trace_data.icmpv6_ra,
2380 g_qdf_dp_trace_data.dhcp_disc,
2381 g_qdf_dp_trace_data.dhcp_off,
2382 g_qdf_dp_trace_data.dhcp_req,
2383 g_qdf_dp_trace_data.dhcp_ack,
2384 g_qdf_dp_trace_data.dhcp_nack,
2385 g_qdf_dp_trace_data.dhcp_others,
2386 g_qdf_dp_trace_data.eapol_m1,
2387 g_qdf_dp_trace_data.eapol_m2,
2388 g_qdf_dp_trace_data.eapol_m3,
2389 g_qdf_dp_trace_data.eapol_m4,
2390 g_qdf_dp_trace_data.eapol_others);
2391
2392 qdf_debugfs_printf(file,
2393 "DPT: Total Records: %d, Head: %d, Tail: %d\n",
2394 g_qdf_dp_trace_data.num, g_qdf_dp_trace_data.head,
2395 g_qdf_dp_trace_data.tail);
2396
2397 spin_lock_bh(&l_dp_trace_lock);
2398 if (g_qdf_dp_trace_data.head != INVALID_QDF_DP_TRACE_ADDR) {
2399 i = g_qdf_dp_trace_data.head;
2400 tail = g_qdf_dp_trace_data.tail;
2401
2402 if (count > g_qdf_dp_trace_data.num)
2403 count = g_qdf_dp_trace_data.num;
2404
2405 if (tail >= (count - 1))
2406 i = tail - count + 1;
2407 else if (count != MAX_QDF_DP_TRACE_RECORDS)
2408 i = MAX_QDF_DP_TRACE_RECORDS - ((count - 1) -
2409 tail);
2410 g_qdf_dp_trace_data.curr_pos = 0;
2411 g_qdf_dp_trace_data.saved_tail = tail;
2412 }
2413 spin_unlock_bh(&l_dp_trace_lock);
Rakshith Suresh Patkare105ac12018-12-06 20:40:49 +05302414
2415 return g_qdf_dp_trace_data.saved_tail;
Rakshith Suresh Patkardcd07332018-04-20 12:52:08 +05302416}
2417qdf_export_symbol(qdf_dpt_get_curr_pos_debugfs);
2418
2419QDF_STATUS qdf_dpt_dump_stats_debugfs(qdf_debugfs_file_t file,
2420 uint32_t curr_pos)
2421{
2422 struct qdf_dp_trace_record_s p_record;
2423 uint32_t i = curr_pos;
Rakshith Suresh Patkare105ac12018-12-06 20:40:49 +05302424 uint16_t num_records_to_dump = g_qdf_dp_trace_data.num_records_to_dump;
Rakshith Suresh Patkardcd07332018-04-20 12:52:08 +05302425
Rakshith Suresh Patkare105ac12018-12-06 20:40:49 +05302426 if (!g_qdf_dp_trace_data.enable) {
2427 QDF_TRACE(QDF_MODULE_ID_QDF, QDF_TRACE_LEVEL_ERROR,
2428 "%s: Tracing Disabled", __func__);
2429 return QDF_STATUS_E_FAILURE;
2430 }
2431
2432 if (num_records_to_dump > g_qdf_dp_trace_data.num)
2433 num_records_to_dump = g_qdf_dp_trace_data.num;
2434
2435 /*
2436 * Max dp trace record size should always be less than
2437 * QDF_DP_TRACE_PREPEND_STR_SIZE(100) + BUFFER_SIZE(121).
2438 */
2439 if (WARN_ON(QDF_DP_TRACE_MAX_RECORD_SIZE <
2440 QDF_DP_TRACE_PREPEND_STR_SIZE + BUFFER_SIZE))
Rachit Kankaneb3ba7692018-06-27 18:42:34 +05302441 return QDF_STATUS_E_FAILURE;
2442
Rakshith Suresh Patkardcd07332018-04-20 12:52:08 +05302443 spin_lock_bh(&l_dp_trace_lock);
Rakshith Suresh Patkardcd07332018-04-20 12:52:08 +05302444 p_record = g_qdf_dp_trace_tbl[i];
2445 spin_unlock_bh(&l_dp_trace_lock);
Rakshith Suresh Patkare105ac12018-12-06 20:40:49 +05302446
Rakshith Suresh Patkardcd07332018-04-20 12:52:08 +05302447 for (;; ) {
Rakshith Suresh Patkare105ac12018-12-06 20:40:49 +05302448 /*
2449 * Initially we get file as 1 page size, and
2450 * if remaining size in file is less than one record max size,
2451 * then return so that it gets an extra page.
2452 */
2453 if ((file->size - file->count) < QDF_DP_TRACE_MAX_RECORD_SIZE) {
Rakshith Suresh Patkardcd07332018-04-20 12:52:08 +05302454 spin_lock_bh(&l_dp_trace_lock);
2455 g_qdf_dp_trace_data.curr_pos = i;
2456 spin_unlock_bh(&l_dp_trace_lock);
2457 return QDF_STATUS_E_FAILURE;
2458 }
2459
2460 switch (p_record.code) {
2461 case QDF_DP_TRACE_TXRX_PACKET_PTR_RECORD:
2462 case QDF_DP_TRACE_TXRX_FAST_PACKET_PTR_RECORD:
2463 case QDF_DP_TRACE_FREE_PACKET_PTR_RECORD:
2464 qdf_dpt_display_ptr_record_debugfs(file, &p_record, i);
2465 break;
2466
2467 case QDF_DP_TRACE_EAPOL_PACKET_RECORD:
2468 case QDF_DP_TRACE_DHCP_PACKET_RECORD:
2469 case QDF_DP_TRACE_ARP_PACKET_RECORD:
2470 case QDF_DP_TRACE_ICMP_PACKET_RECORD:
2471 case QDF_DP_TRACE_ICMPv6_PACKET_RECORD:
2472 qdf_dpt_display_proto_pkt_debugfs(file, &p_record, i);
2473 break;
2474
Nirav Shah8f44a7e2019-11-05 08:38:47 +05302475 case QDF_DP_TRACE_TX_CREDIT_RECORD:
2476 qdf_dpt_display_credit_record_debugfs(file, &p_record,
2477 i);
2478 break;
2479
Rakshith Suresh Patkardcd07332018-04-20 12:52:08 +05302480 case QDF_DP_TRACE_MGMT_PACKET_RECORD:
2481 qdf_dpt_display_mgmt_pkt_debugfs(file, &p_record, i);
2482 break;
2483
2484 case QDF_DP_TRACE_EVENT_RECORD:
2485 qdf_dpt_display_event_record_debugfs(file, &p_record,
2486 i);
2487 break;
2488
2489 case QDF_DP_TRACE_HDD_TX_TIMEOUT:
2490 qdf_debugfs_printf(file, "DPT: %04d: %s %s\n",
2491 i, p_record.time,
2492 qdf_dp_code_to_string(p_record.code));
2493 qdf_debugfs_printf(file, "%s: HDD TX Timeout\n");
2494 break;
2495
2496 case QDF_DP_TRACE_HDD_SOFTAP_TX_TIMEOUT:
2497 qdf_debugfs_printf(file, "%04d: %s %s\n",
2498 i, p_record.time,
2499 qdf_dp_code_to_string(p_record.code));
2500 qdf_debugfs_printf(file,
2501 "%s: HDD SoftAP TX Timeout\n");
2502 break;
2503
2504 case QDF_DP_TRACE_CE_FAST_PACKET_ERR_RECORD:
2505 qdf_debugfs_printf(file, "DPT: %04d: %s %s\n",
2506 i, p_record.time,
2507 qdf_dp_code_to_string(p_record.code));
2508 qdf_debugfs_printf(file,
2509 "%s: CE Fast Packet Error\n");
2510 break;
2511
2512 case QDF_DP_TRACE_MAX:
2513 qdf_debugfs_printf(file,
2514 "%s: QDF_DP_TRACE_MAX event should not be generated\n",
2515 __func__);
2516 break;
2517
2518 case QDF_DP_TRACE_HDD_TX_PACKET_RECORD:
2519 case QDF_DP_TRACE_HDD_RX_PACKET_RECORD:
Mohit Khanna04252802017-08-27 09:43:43 -07002520 case QDF_DP_TRACE_TX_PACKET_RECORD:
2521 case QDF_DP_TRACE_RX_PACKET_RECORD:
Mohit Khanna163c3172018-06-27 01:34:02 -07002522 case QDF_DP_TRACE_LI_DP_TX_PACKET_RECORD:
2523 case QDF_DP_TRACE_LI_DP_RX_PACKET_RECORD:
2524
Rakshith Suresh Patkardcd07332018-04-20 12:52:08 +05302525 default:
2526 qdf_dpt_display_record_debugfs(file, &p_record, i);
2527 break;
2528 }
2529
Rakshith Suresh Patkare105ac12018-12-06 20:40:49 +05302530 if (++g_qdf_dp_trace_data.dump_counter == num_records_to_dump)
Rakshith Suresh Patkardcd07332018-04-20 12:52:08 +05302531 break;
Rakshith Suresh Patkardcd07332018-04-20 12:52:08 +05302532
2533 spin_lock_bh(&l_dp_trace_lock);
Rakshith Suresh Patkare105ac12018-12-06 20:40:49 +05302534 if (i == 0)
2535 i = MAX_QDF_DP_TRACE_RECORDS;
Rakshith Suresh Patkardcd07332018-04-20 12:52:08 +05302536
Rakshith Suresh Patkare105ac12018-12-06 20:40:49 +05302537 i -= 1;
Rakshith Suresh Patkardcd07332018-04-20 12:52:08 +05302538 p_record = g_qdf_dp_trace_tbl[i];
2539 spin_unlock_bh(&l_dp_trace_lock);
2540 }
Rakshith Suresh Patkare105ac12018-12-06 20:40:49 +05302541
2542 g_qdf_dp_trace_data.dump_counter = 0;
2543
Rakshith Suresh Patkardcd07332018-04-20 12:52:08 +05302544 return QDF_STATUS_SUCCESS;
2545}
2546qdf_export_symbol(qdf_dpt_dump_stats_debugfs);
2547
2548/**
2549 * qdf_dpt_set_value_debugfs() - Configure the value to control DP trace
2550 * @proto_bitmap: defines the protocol to be tracked
2551 * @no_of_records: defines the nth packet which is traced
2552 * @verbosity: defines the verbosity level
2553 *
2554 * Return: None
2555 */
2556void qdf_dpt_set_value_debugfs(uint8_t proto_bitmap, uint8_t no_of_record,
Rakshith Suresh Patkare105ac12018-12-06 20:40:49 +05302557 uint8_t verbosity, uint16_t num_records_to_dump)
Rakshith Suresh Patkardcd07332018-04-20 12:52:08 +05302558{
Rakshith Suresh Patkare105ac12018-12-06 20:40:49 +05302559 if (g_qdf_dp_trace_data.enable) {
2560 g_qdf_dp_trace_data.proto_bitmap = proto_bitmap;
2561 g_qdf_dp_trace_data.no_of_record = no_of_record;
2562 g_qdf_dp_trace_data.verbosity = verbosity;
2563 g_qdf_dp_trace_data.num_records_to_dump = num_records_to_dump;
2564 }
Rakshith Suresh Patkardcd07332018-04-20 12:52:08 +05302565}
2566qdf_export_symbol(qdf_dpt_set_value_debugfs);
2567
Mohit Khanna90d7ebd2017-09-12 21:54:21 -07002568
Nirav Shahcede2892016-05-19 12:41:15 +05302569/**
Chouhan, Anurag57763182016-03-03 18:57:27 +05302570 * qdf_dp_trace_dump_all() - Dump data from ring buffer via call back functions
2571 * registered with QDF
Chouhan, Anurag57763182016-03-03 18:57:27 +05302572 * @count: Number of lines to dump starting from tail to head
Nandha Kishore Easwarane43583f2017-05-15 21:01:13 +05302573 * @pdev_id: pdev_id
Chouhan, Anurag57763182016-03-03 18:57:27 +05302574 *
2575 * Return: None
2576 */
Nandha Kishore Easwarane43583f2017-05-15 21:01:13 +05302577void qdf_dp_trace_dump_all(uint32_t count, uint8_t pdev_id)
Chouhan, Anurag57763182016-03-03 18:57:27 +05302578{
2579 struct qdf_dp_trace_record_s p_record;
2580 int32_t i, tail;
2581
2582 if (!g_qdf_dp_trace_data.enable) {
Himanshu Agarwal26cfe7e2017-05-08 15:01:07 +05302583 DPTRACE_PRINT("Tracing Disabled");
Chouhan, Anurag57763182016-03-03 18:57:27 +05302584 return;
2585 }
2586
Mohit Khanna7750a172017-05-15 15:53:33 -07002587 DPTRACE_PRINT(
2588 "DPT: config - bitmap 0x%x verb %u #rec %u live_config %u thresh %u time_limit %u",
2589 g_qdf_dp_trace_data.proto_bitmap,
2590 g_qdf_dp_trace_data.verbosity,
2591 g_qdf_dp_trace_data.no_of_record,
2592 g_qdf_dp_trace_data.live_mode_config,
2593 g_qdf_dp_trace_data.high_tput_thresh,
2594 g_qdf_dp_trace_data.thresh_time_limit);
2595
Mohit Khanna90d7ebd2017-09-12 21:54:21 -07002596 qdf_dp_trace_dump_stats();
Mohit Khanna7750a172017-05-15 15:53:33 -07002597
2598 DPTRACE_PRINT("DPT: Total Records: %d, Head: %d, Tail: %d",
Himanshu Agarwal26cfe7e2017-05-08 15:01:07 +05302599 g_qdf_dp_trace_data.num, g_qdf_dp_trace_data.head,
2600 g_qdf_dp_trace_data.tail);
Chouhan, Anurag57763182016-03-03 18:57:27 +05302601
2602 /* aquire the lock so that only one thread at a time can read
2603 * the ring buffer
2604 */
2605 spin_lock_bh(&l_dp_trace_lock);
2606
2607 if (g_qdf_dp_trace_data.head != INVALID_QDF_DP_TRACE_ADDR) {
2608 i = g_qdf_dp_trace_data.head;
2609 tail = g_qdf_dp_trace_data.tail;
2610
2611 if (count) {
2612 if (count > g_qdf_dp_trace_data.num)
2613 count = g_qdf_dp_trace_data.num;
2614 if (tail >= (count - 1))
2615 i = tail - count + 1;
2616 else if (count != MAX_QDF_DP_TRACE_RECORDS)
2617 i = MAX_QDF_DP_TRACE_RECORDS - ((count - 1) -
2618 tail);
2619 }
2620
2621 p_record = g_qdf_dp_trace_tbl[i];
2622 spin_unlock_bh(&l_dp_trace_lock);
2623 for (;; ) {
Mohit Khanna7750a172017-05-15 15:53:33 -07002624 qdf_dp_trace_cb_table[p_record.code](&p_record,
2625 (uint16_t)i, pdev_id, false);
Chouhan, Anurag57763182016-03-03 18:57:27 +05302626 if (i == tail)
2627 break;
2628 i += 1;
2629
2630 spin_lock_bh(&l_dp_trace_lock);
2631 if (MAX_QDF_DP_TRACE_RECORDS == i)
2632 i = 0;
2633
2634 p_record = g_qdf_dp_trace_tbl[i];
2635 spin_unlock_bh(&l_dp_trace_lock);
2636 }
2637 } else {
2638 spin_unlock_bh(&l_dp_trace_lock);
2639 }
2640}
Manikandan Mohana18b8642018-03-01 16:17:23 -08002641qdf_export_symbol(qdf_dp_trace_dump_all);
Sathish Kumarfc93b2d2017-01-10 12:19:19 +05302642
Nirav Shah91069022018-04-19 17:25:10 +05302643/**
2644 * qdf_dp_trace_throttle_live_mode() - Throttle DP Trace live mode
2645 * @high_bw_request: whether this is a high BW req or not
2646 *
2647 * The function tries to prevent excessive logging into the live buffer by
2648 * having an upper limit on number of packets that can be logged per second.
2649 *
2650 * The intention is to allow occasional pings and data packets and really low
2651 * throughput levels while suppressing bursts and higher throughput levels so
2652 * that we donot hog the live buffer.
2653 *
2654 * If the number of packets printed in a particular second exceeds the thresh,
2655 * disable printing in the next second.
2656 *
2657 * Return: None
2658 */
2659void qdf_dp_trace_throttle_live_mode(bool high_bw_request)
2660{
2661 static int bw_interval_counter;
2662
2663 if (g_qdf_dp_trace_data.enable == false ||
2664 g_qdf_dp_trace_data.live_mode_config == false)
2665 return;
2666
2667 if (high_bw_request) {
2668 g_qdf_dp_trace_data.live_mode = 0;
2669 bw_interval_counter = 0;
2670 return;
2671 }
2672
2673 bw_interval_counter++;
2674
2675 if (0 == (bw_interval_counter %
2676 g_qdf_dp_trace_data.thresh_time_limit)) {
2677
2678 spin_lock_bh(&l_dp_trace_lock);
2679 if (g_qdf_dp_trace_data.print_pkt_cnt <=
2680 g_qdf_dp_trace_data.high_tput_thresh)
2681 g_qdf_dp_trace_data.live_mode = 1;
2682
2683 g_qdf_dp_trace_data.print_pkt_cnt = 0;
2684 spin_unlock_bh(&l_dp_trace_lock);
2685 }
Nirav Shah91069022018-04-19 17:25:10 +05302686}
2687qdf_export_symbol(qdf_dp_trace_throttle_live_mode);
Manjunathappa Prakashcf4286b2018-06-05 20:46:20 -07002688
2689void qdf_dp_trace_apply_tput_policy(bool is_data_traffic)
2690{
Mohit Khanna163c3172018-06-27 01:34:02 -07002691 if (g_qdf_dp_trace_data.dynamic_verbosity_modify) {
2692 goto check_live_mode;
Manjunathappa Prakashcf4286b2018-06-05 20:46:20 -07002693 return;
Mohit Khanna163c3172018-06-27 01:34:02 -07002694 }
Manjunathappa Prakashcf4286b2018-06-05 20:46:20 -07002695
2696 if (is_data_traffic) {
2697 g_qdf_dp_trace_data.verbosity =
Mohit Khanna163c3172018-06-27 01:34:02 -07002698 QDF_DP_TRACE_VERBOSITY_ULTRA_LOW;
Manjunathappa Prakashcf4286b2018-06-05 20:46:20 -07002699 } else {
2700 g_qdf_dp_trace_data.verbosity =
2701 g_qdf_dp_trace_data.ini_conf_verbosity;
Manjunathappa Prakashcf4286b2018-06-05 20:46:20 -07002702 }
Mohit Khanna163c3172018-06-27 01:34:02 -07002703check_live_mode:
2704 qdf_dp_trace_throttle_live_mode(is_data_traffic);
Manjunathappa Prakashcf4286b2018-06-05 20:46:20 -07002705}
Nirav Shahae6a0b32016-04-26 11:44:42 +05302706#endif
Sathish Kumar59113a42017-01-04 12:02:24 +05302707
Sathish Kumarfc93b2d2017-01-10 12:19:19 +05302708struct qdf_print_ctrl print_ctrl_obj[MAX_PRINT_CONFIG_SUPPORTED];
2709
2710struct category_name_info g_qdf_category_name[MAX_SUPPORTED_CATEGORY] = {
2711 [QDF_MODULE_ID_TDLS] = {"tdls"},
2712 [QDF_MODULE_ID_ACS] = {"ACS"},
2713 [QDF_MODULE_ID_SCAN_SM] = {"scan state machine"},
2714 [QDF_MODULE_ID_SCANENTRY] = {"scan entry"},
2715 [QDF_MODULE_ID_WDS] = {"WDS"},
2716 [QDF_MODULE_ID_ACTION] = {"action"},
2717 [QDF_MODULE_ID_ROAM] = {"STA roaming"},
2718 [QDF_MODULE_ID_INACT] = {"inactivity"},
2719 [QDF_MODULE_ID_DOTH] = {"11h"},
2720 [QDF_MODULE_ID_IQUE] = {"IQUE"},
2721 [QDF_MODULE_ID_WME] = {"WME"},
2722 [QDF_MODULE_ID_ACL] = {"ACL"},
2723 [QDF_MODULE_ID_WPA] = {"WPA/RSN"},
2724 [QDF_MODULE_ID_RADKEYS] = {"dump 802.1x keys"},
2725 [QDF_MODULE_ID_RADDUMP] = {"dump radius packet"},
2726 [QDF_MODULE_ID_RADIUS] = {"802.1x radius client"},
2727 [QDF_MODULE_ID_DOT1XSM] = {"802.1x state machine"},
2728 [QDF_MODULE_ID_DOT1X] = {"802.1x authenticator"},
2729 [QDF_MODULE_ID_POWER] = {"power save"},
2730 [QDF_MODULE_ID_STATE] = {"state"},
2731 [QDF_MODULE_ID_OUTPUT] = {"output"},
2732 [QDF_MODULE_ID_SCAN] = {"scan"},
2733 [QDF_MODULE_ID_AUTH] = {"authentication"},
2734 [QDF_MODULE_ID_ASSOC] = {"association"},
2735 [QDF_MODULE_ID_NODE] = {"node"},
2736 [QDF_MODULE_ID_ELEMID] = {"element ID"},
2737 [QDF_MODULE_ID_XRATE] = {"rate"},
2738 [QDF_MODULE_ID_INPUT] = {"input"},
2739 [QDF_MODULE_ID_CRYPTO] = {"crypto"},
2740 [QDF_MODULE_ID_DUMPPKTS] = {"dump packet"},
2741 [QDF_MODULE_ID_DEBUG] = {"debug"},
2742 [QDF_MODULE_ID_MLME] = {"mlme"},
2743 [QDF_MODULE_ID_RRM] = {"rrm"},
2744 [QDF_MODULE_ID_WNM] = {"wnm"},
2745 [QDF_MODULE_ID_P2P_PROT] = {"p2p_prot"},
2746 [QDF_MODULE_ID_PROXYARP] = {"proxyarp"},
2747 [QDF_MODULE_ID_L2TIF] = {"l2tif"},
2748 [QDF_MODULE_ID_WIFIPOS] = {"wifipos"},
2749 [QDF_MODULE_ID_WRAP] = {"wrap"},
2750 [QDF_MODULE_ID_DFS] = {"dfs"},
2751 [QDF_MODULE_ID_ATF] = {"atf"},
2752 [QDF_MODULE_ID_SPLITMAC] = {"splitmac"},
2753 [QDF_MODULE_ID_IOCTL] = {"ioctl"},
2754 [QDF_MODULE_ID_NAC] = {"nac"},
2755 [QDF_MODULE_ID_MESH] = {"mesh"},
2756 [QDF_MODULE_ID_MBO] = {"mbo"},
2757 [QDF_MODULE_ID_EXTIOCTL_CHANSWITCH] = {"extchanswitch"},
2758 [QDF_MODULE_ID_EXTIOCTL_CHANSSCAN] = {"extchanscan"},
2759 [QDF_MODULE_ID_TLSHIM] = {"tlshim"},
2760 [QDF_MODULE_ID_WMI] = {"WMI"},
2761 [QDF_MODULE_ID_HTT] = {"HTT"},
2762 [QDF_MODULE_ID_HDD] = {"HDD"},
2763 [QDF_MODULE_ID_SME] = {"SME"},
2764 [QDF_MODULE_ID_PE] = {"PE"},
2765 [QDF_MODULE_ID_WMA] = {"WMA"},
2766 [QDF_MODULE_ID_SYS] = {"SYS"},
2767 [QDF_MODULE_ID_QDF] = {"QDF"},
2768 [QDF_MODULE_ID_SAP] = {"SAP"},
2769 [QDF_MODULE_ID_HDD_SOFTAP] = {"HDD_SAP"},
2770 [QDF_MODULE_ID_HDD_DATA] = {"DATA"},
2771 [QDF_MODULE_ID_HDD_SAP_DATA] = {"SAP_DATA"},
2772 [QDF_MODULE_ID_HIF] = {"HIF"},
2773 [QDF_MODULE_ID_HTC] = {"HTC"},
2774 [QDF_MODULE_ID_TXRX] = {"TXRX"},
2775 [QDF_MODULE_ID_QDF_DEVICE] = {"QDF_DEV"},
2776 [QDF_MODULE_ID_CFG] = {"CFG"},
2777 [QDF_MODULE_ID_BMI] = {"BMI"},
2778 [QDF_MODULE_ID_EPPING] = {"EPPING"},
2779 [QDF_MODULE_ID_QVIT] = {"QVIT"},
Ashish Kumar Dhanotiyad199fcb2017-02-06 20:53:04 +05302780 [QDF_MODULE_ID_DP] = {"DP"},
Venkata Sharath Chandra Manchala443b9b42018-10-10 12:04:54 -07002781 [QDF_MODULE_ID_HAL] = {"HAL"},
Ashish Kumar Dhanotiyad199fcb2017-02-06 20:53:04 +05302782 [QDF_MODULE_ID_SOC] = {"SOC"},
2783 [QDF_MODULE_ID_OS_IF] = {"OSIF"},
2784 [QDF_MODULE_ID_TARGET_IF] = {"TIF"},
2785 [QDF_MODULE_ID_SCHEDULER] = {"SCH"},
2786 [QDF_MODULE_ID_MGMT_TXRX] = {"MGMT_TXRX"},
Mukul Sharmad8fd1442017-02-03 11:27:17 +05302787 [QDF_MODULE_ID_PMO] = {"PMO"},
Tushnim Bhattacharyyae4449d32017-03-17 11:01:49 -07002788 [QDF_MODULE_ID_POLICY_MGR] = {"POLICY_MGR"},
Aditya Sathish1c42c272018-07-20 14:52:05 +05302789 [QDF_MODULE_ID_SA_API] = {"SA_API"},
Naveen Rawat51542732017-03-21 15:09:34 -07002790 [QDF_MODULE_ID_NAN] = {"NAN"},
Edayilliam Jayadev642201f2017-04-05 14:29:18 +05302791 [QDF_MODULE_ID_SPECTRAL] = {"SPECTRAL"},
Wu Gao849fd2c2017-03-23 10:14:39 +08002792 [QDF_MODULE_ID_P2P] = {"P2P"},
Kiran Venkatappa34536742017-04-04 00:09:10 +05302793 [QDF_MODULE_ID_OFFCHAN_TXRX] = {"OFFCHAN"},
Kiran Kumar Lokerea8436342017-04-24 00:56:03 -07002794 [QDF_MODULE_ID_REGULATORY] = {"REGULATORY"},
Vivek2c86b212017-06-05 00:02:11 +05302795 [QDF_MODULE_ID_OBJ_MGR] = {"OBJMGR"},
Varun Reddy Yeturu25764252017-08-10 13:53:01 -07002796 [QDF_MODULE_ID_SERIALIZATION] = {"SER"},
Aniruddha Paulb2f7ab62017-10-09 14:40:04 +05302797 [QDF_MODULE_ID_NSS] = {"NSS"},
Deepak Dhamdhere7e0b8ba2017-07-03 00:33:26 -07002798 [QDF_MODULE_ID_ROAM_DEBUG] = {"roam debug"},
Sathish Kumara9a42eb2017-11-17 17:26:39 +05302799 [QDF_MODULE_ID_DIRECT_BUF_RX] = {"DIRECT_BUF_RX"},
Nachiket Kukade88ae8532017-12-15 12:36:58 +05302800 [QDF_MODULE_ID_DISA] = {"disa"},
Himanshu Agarwalb3c81ac2018-01-10 14:21:53 +05302801 [QDF_MODULE_ID_GREEN_AP] = {"GREEN_AP"},
Santosh Anbud5fdfac2018-01-03 22:33:58 +05302802 [QDF_MODULE_ID_EXTAP] = {"EXTAP"},
Subrat Mishrabf125872017-09-27 14:41:20 +05302803 [QDF_MODULE_ID_FD] = {"FILS discovery"},
Akshay Kosigi81394132018-01-18 11:41:13 +05302804 [QDF_MODULE_ID_FTM] = {"FTM"},
Zhang Qian82377ce2018-01-04 12:15:29 +08002805 [QDF_MODULE_ID_OCB] = {"OCB"},
Dustin Brown61cabef2018-02-22 15:51:31 -08002806 [QDF_MODULE_ID_CONFIG] = {"CONFIG"},
Sravan Kumar Kairam376e5f12018-03-07 15:56:21 +05302807 [QDF_MODULE_ID_IPA] = {"IPA"},
Naga6d06baa2018-02-21 15:17:55 +05302808 [QDF_MODULE_ID_CP_STATS] = {"CP_STATS"},
Rajeev Kumar Sirasanagandla66970852017-09-18 16:47:52 +05302809 [QDF_MODULE_ID_ACTION_OUI] = {"action_oui"},
Ashish Kumar Dhanotiya14e22492018-06-24 17:13:39 +05302810 [QDF_MODULE_ID_TARGET] = {"TARGET"},
Manoj Ekboteb8de9372018-06-06 16:52:39 -07002811 [QDF_MODULE_ID_MBSSIE] = {"MBSSIE"},
Sourav Mohapatra474c6142018-08-29 15:23:26 +05302812 [QDF_MODULE_ID_FWOL] = {"fwol"},
Santosh Anbucdf38132019-01-14 17:12:54 +05302813 [QDF_MODULE_ID_SM_ENGINE] = {"SM_ENG"},
Srinivas Pitlabe8dac42018-06-14 16:05:03 +05302814 [QDF_MODULE_ID_CMN_MLME] = {"CMN_MLME"},
Gyanranjan Hazarika2c545812018-10-04 12:11:46 -07002815 [QDF_MODULE_ID_BSSCOLOR] = {"BSSCOLOR"},
Abhiram Jogadenuc5281452019-02-14 16:21:09 +05302816 [QDF_MODULE_ID_CFR] = {"CFR"},
nobeljdebe2b32019-04-23 11:18:47 -07002817 [QDF_MODULE_ID_TX_CAPTURE] = {"TX_CAPTURE_ENHANCE"},
Paul Zhang5ea0a912019-05-14 11:33:31 +08002818 [QDF_MODULE_ID_INTEROP_ISSUES_AP] = {"INTEROP_ISSUES_AP"},
gaurank kathpalia9f525cb2019-05-28 18:21:18 +05302819 [QDF_MODULE_ID_BLACKLIST_MGR] = {"blm"},
Uraj Sasan37b2c4d2019-06-13 18:21:24 +05302820 [QDF_MODULE_ID_QLD] = {"QLD"},
Gyanranjan Hazarika8e0ae992019-06-05 00:43:38 -07002821 [QDF_MODULE_ID_DYNAMIC_MODE_CHG] = {"Dynamic Mode Change"},
Yu Wange7f177a2019-12-18 08:59:49 +08002822 [QDF_MODULE_ID_COEX] = {"COEX"},
Sathish Kumarfc93b2d2017-01-10 12:19:19 +05302823 [QDF_MODULE_ID_ANY] = {"ANY"},
2824};
Manikandan Mohana18b8642018-03-01 16:17:23 -08002825qdf_export_symbol(g_qdf_category_name);
Sathish Kumarfc93b2d2017-01-10 12:19:19 +05302826
Dustin Brownd7cfa492017-05-11 14:21:06 -07002827/**
2828 * qdf_trace_display() - Display trace
2829 *
2830 * Return: None
2831 */
2832void qdf_trace_display(void)
2833{
2834 QDF_MODULE_ID module_id;
2835
2836 pr_err(" 1)FATAL 2)ERROR 3)WARN 4)INFO 5)INFO_H 6)INFO_M 7)INFO_L 8)DEBUG\n");
2837 for (module_id = 0; module_id < QDF_MODULE_ID_MAX; ++module_id) {
2838 pr_err("%2d)%s %s %s %s %s %s %s %s %s\n",
2839 (int)module_id,
2840 g_qdf_category_name[module_id].category_name_str,
2841 qdf_print_is_verbose_enabled(qdf_pidx, module_id,
2842 QDF_TRACE_LEVEL_FATAL) ? "X" : " ",
2843 qdf_print_is_verbose_enabled(qdf_pidx, module_id,
2844 QDF_TRACE_LEVEL_ERROR) ? "X" : " ",
2845 qdf_print_is_verbose_enabled(qdf_pidx, module_id,
2846 QDF_TRACE_LEVEL_WARN) ? "X" : " ",
2847 qdf_print_is_verbose_enabled(qdf_pidx, module_id,
2848 QDF_TRACE_LEVEL_INFO) ? "X" : " ",
2849 qdf_print_is_verbose_enabled(qdf_pidx, module_id,
2850 QDF_TRACE_LEVEL_INFO_HIGH) ? "X" : " ",
2851 qdf_print_is_verbose_enabled(qdf_pidx, module_id,
2852 QDF_TRACE_LEVEL_INFO_MED) ? "X" : " ",
2853 qdf_print_is_verbose_enabled(qdf_pidx, module_id,
2854 QDF_TRACE_LEVEL_INFO_LOW) ? "X" : " ",
2855 qdf_print_is_verbose_enabled(qdf_pidx, module_id,
2856 QDF_TRACE_LEVEL_DEBUG) ? "X" : " ");
2857 }
2858}
Manikandan Mohana18b8642018-03-01 16:17:23 -08002859qdf_export_symbol(qdf_trace_display);
Adil Saeed Musthafa2ef27872017-05-02 16:40:45 -07002860
Ashish Kumar Dhanotiyaaffc4852019-03-01 20:40:22 +05302861#ifdef QDF_TRACE_PRINT_ENABLE
Adil Saeed Musthafa33188072017-03-13 12:13:47 -07002862static inline void print_to_console(char *str_buffer)
2863{
2864 pr_err("%s\n", str_buffer);
2865}
Ashish Kumar Dhanotiyaaffc4852019-03-01 20:40:22 +05302866#else
2867
2868#define print_to_console(str)
Adil Saeed Musthafa33188072017-03-13 12:13:47 -07002869#endif
2870
Manikandan Mohaneb61d7e2018-03-05 16:23:21 -08002871#ifdef MULTI_IF_NAME
2872static const char *qdf_trace_wlan_modname(void)
2873{
2874 return MULTI_IF_NAME;
2875}
2876#else
2877static const char *qdf_trace_wlan_modname(void)
2878{
2879 return "wlan";
2880}
2881#endif
2882
Sathish Kumarfc93b2d2017-01-10 12:19:19 +05302883void qdf_trace_msg_cmn(unsigned int idx,
2884 QDF_MODULE_ID category,
2885 QDF_TRACE_LEVEL verbose,
2886 const char *str_format, va_list val)
2887{
2888 char str_buffer[QDF_TRACE_BUFFER_SIZE];
2889 int n;
2890
2891 /* Check if index passed is valid */
2892 if (idx < 0 || idx >= MAX_PRINT_CONFIG_SUPPORTED) {
2893 pr_info("%s: Invalid index - %d\n", __func__, idx);
2894 return;
2895 }
2896
2897 /* Check if print control object is in use */
2898 if (!print_ctrl_obj[idx].in_use) {
2899 pr_info("%s: Invalid print control object\n", __func__);
2900 return;
2901 }
2902
2903 /* Check if category passed is valid */
2904 if (category < 0 || category >= MAX_SUPPORTED_CATEGORY) {
2905 pr_info("%s: Invalid category: %d\n", __func__, category);
2906 return;
2907 }
2908
2909 /* Check if verbose mask is valid */
2910 if (verbose < 0 || verbose >= QDF_TRACE_LEVEL_MAX) {
2911 pr_info("%s: Invalid verbose level %d\n", __func__, verbose);
2912 return;
2913 }
2914
2915 /*
2916 * Print the trace message when the desired verbose level is set in
2917 * the desired category for the print control object
2918 */
2919 if (print_ctrl_obj[idx].cat_info[category].category_verbose_mask &
2920 QDF_TRACE_LEVEL_TO_MODULE_BITMASK(verbose)) {
Jeff Johnson49dd1d92018-04-28 12:06:59 -07002921 static const char * const VERBOSE_STR[] = {
2922 [QDF_TRACE_LEVEL_NONE] = "",
2923 [QDF_TRACE_LEVEL_FATAL] = "F",
2924 [QDF_TRACE_LEVEL_ERROR] = "E",
2925 [QDF_TRACE_LEVEL_WARN] = "W",
2926 [QDF_TRACE_LEVEL_INFO] = "I",
2927 [QDF_TRACE_LEVEL_INFO_HIGH] = "IH",
2928 [QDF_TRACE_LEVEL_INFO_MED] = "IM",
2929 [QDF_TRACE_LEVEL_INFO_LOW] = "IL",
2930 [QDF_TRACE_LEVEL_DEBUG] = "D",
Ashish Kumar Dhanotiya9d0ed252018-06-24 18:01:58 +05302931 [QDF_TRACE_LEVEL_TRACE] = "T",
Jeff Johnson49dd1d92018-04-28 12:06:59 -07002932 [QDF_TRACE_LEVEL_ALL] = "" };
Sathish Kumarfc93b2d2017-01-10 12:19:19 +05302933
2934 /* print the prefix string into the string buffer... */
2935 n = scnprintf(str_buffer, QDF_TRACE_BUFFER_SIZE,
Ashish Kumar Dhanotiya9d0ed252018-06-24 18:01:58 +05302936 "%s: [%d:%s:%s] ", qdf_trace_wlan_modname(),
Sathish Kumarfc93b2d2017-01-10 12:19:19 +05302937 in_interrupt() ? 0 : current->pid,
2938 VERBOSE_STR[verbose],
2939 g_qdf_category_name[category].category_name_str);
2940
2941 /* print the formatted log message after the prefix string */
2942 vscnprintf(str_buffer + n, QDF_TRACE_BUFFER_SIZE - n,
2943 str_format, val);
2944#if defined(WLAN_LOGGING_SOCK_SVC_ENABLE)
2945 wlan_log_to_user(verbose, (char *)str_buffer,
2946 strlen(str_buffer));
Adil Saeed Musthafa12205b52018-08-07 09:39:20 -07002947 if (qdf_likely(qdf_log_dump_at_kernel_enable))
2948 print_to_console(str_buffer);
Sathish Kumarfc93b2d2017-01-10 12:19:19 +05302949#else
2950 pr_err("%s\n", str_buffer);
2951#endif
Sathish Kumarfc93b2d2017-01-10 12:19:19 +05302952 }
2953}
Manikandan Mohana18b8642018-03-01 16:17:23 -08002954qdf_export_symbol(qdf_trace_msg_cmn);
Sathish Kumarfc93b2d2017-01-10 12:19:19 +05302955
2956QDF_STATUS qdf_print_setup(void)
2957{
2958 int i;
2959
2960 /* Loop through all print ctrl objects */
2961 for (i = 0; i < MAX_PRINT_CONFIG_SUPPORTED; i++) {
2962 if (qdf_print_ctrl_cleanup(i))
2963 return QDF_STATUS_E_FAILURE;
2964 }
2965 return QDF_STATUS_SUCCESS;
2966}
Manikandan Mohana18b8642018-03-01 16:17:23 -08002967qdf_export_symbol(qdf_print_setup);
Sathish Kumarfc93b2d2017-01-10 12:19:19 +05302968
2969QDF_STATUS qdf_print_ctrl_cleanup(unsigned int idx)
2970{
2971 int i = 0;
2972
2973 if (idx < 0 || idx >= MAX_PRINT_CONFIG_SUPPORTED) {
2974 pr_info("%s: Invalid index - %d\n", __func__, idx);
2975 return QDF_STATUS_E_FAILURE;
2976 }
2977
2978 /* Clean up the print control object corresponding to that index
2979 * If success, callee to change print control index to -1
2980 */
2981
2982 for (i = 0; i < MAX_SUPPORTED_CATEGORY; i++) {
2983 print_ctrl_obj[idx].cat_info[i].category_verbose_mask =
2984 QDF_TRACE_LEVEL_NONE;
2985 }
2986 print_ctrl_obj[idx].custom_print = NULL;
2987 print_ctrl_obj[idx].custom_ctxt = NULL;
2988 qdf_print_clean_node_flag(idx);
2989 print_ctrl_obj[idx].in_use = false;
2990
Sathish Kumarfc93b2d2017-01-10 12:19:19 +05302991 return QDF_STATUS_SUCCESS;
2992}
Manikandan Mohana18b8642018-03-01 16:17:23 -08002993qdf_export_symbol(qdf_print_ctrl_cleanup);
Sathish Kumarfc93b2d2017-01-10 12:19:19 +05302994
2995int qdf_print_ctrl_register(const struct category_info *cinfo,
2996 void *custom_print_handler,
2997 void *custom_ctx,
2998 const char *pctrl_name)
2999{
3000 int idx = -1;
3001 int i = 0;
3002
3003 for (i = 0; i < MAX_PRINT_CONFIG_SUPPORTED; i++) {
3004 if (!print_ctrl_obj[i].in_use) {
3005 idx = i;
3006 break;
3007 }
3008 }
3009
3010 /* Callee to handle idx -1 appropriately */
3011 if (idx == -1) {
3012 pr_info("%s: Allocation failed! No print control object free\n",
3013 __func__);
3014 return idx;
3015 }
3016
3017 print_ctrl_obj[idx].in_use = true;
3018
3019 /*
3020 * In case callee does not pass category info,
3021 * custom print handler, custom context and print control name,
3022 * we do not set any value here. Clean up for the print control
3023 * getting allocated would have taken care of initializing
3024 * default values.
3025 *
3026 * We need to only set in_use to 1 in such a case
3027 */
3028
3029 if (pctrl_name) {
3030 qdf_str_lcopy(print_ctrl_obj[idx].name, pctrl_name,
Dustin Brown26e61b52018-02-26 12:28:31 -08003031 sizeof(print_ctrl_obj[idx].name));
Sathish Kumarfc93b2d2017-01-10 12:19:19 +05303032 }
3033
3034 if (custom_print_handler)
3035 print_ctrl_obj[idx].custom_print = custom_print_handler;
3036
3037 if (custom_ctx)
3038 print_ctrl_obj[idx].custom_ctxt = custom_ctx;
3039
3040 if (cinfo) {
3041 for (i = 0; i < MAX_SUPPORTED_CATEGORY; i++) {
3042 if (cinfo[i].category_verbose_mask ==
3043 QDF_TRACE_LEVEL_ALL) {
3044 print_ctrl_obj[idx].cat_info[i]
3045 .category_verbose_mask = 0xFFFF;
Sathish Kumar470c6202017-05-10 19:56:48 +05303046 } else if ((cinfo[i].category_verbose_mask ==
3047 QDF_TRACE_LEVEL_NONE) ||
3048 (cinfo[i].category_verbose_mask ==
3049 QDF_TRACE_LEVEL_TO_MODULE_BITMASK(
3050 QDF_TRACE_LEVEL_NONE))) {
3051 print_ctrl_obj[idx].cat_info[i]
3052 .category_verbose_mask = 0;
Sathish Kumarfc93b2d2017-01-10 12:19:19 +05303053 } else {
3054 print_ctrl_obj[idx].cat_info[i]
3055 .category_verbose_mask =
3056 cinfo[i].category_verbose_mask;
3057 }
3058 }
3059 }
3060
3061 pr_info("%s: Allocated print control object %d\n",
3062 __func__, idx);
3063 return idx;
3064}
Manikandan Mohana18b8642018-03-01 16:17:23 -08003065qdf_export_symbol(qdf_print_ctrl_register);
Sathish Kumarfc93b2d2017-01-10 12:19:19 +05303066
Ashish Kumar Dhanotiyaf38970b2019-04-29 12:23:55 +05303067#ifdef QDF_TRACE_PRINT_ENABLE
Adil Saeed Musthafa33188072017-03-13 12:13:47 -07003068void qdf_shared_print_ctrl_cleanup(void)
3069{
3070 qdf_print_ctrl_cleanup(qdf_pidx);
3071}
Manikandan Mohana18b8642018-03-01 16:17:23 -08003072qdf_export_symbol(qdf_shared_print_ctrl_cleanup);
Adil Saeed Musthafa33188072017-03-13 12:13:47 -07003073
Adil Saeed Musthafa2ef27872017-05-02 16:40:45 -07003074/*
3075 * Set this to invalid value to differentiate with user-provided
3076 * value.
3077 */
Adil Saeed Musthafa03e2ac22017-05-19 16:55:23 -07003078int qdf_dbg_mask = 0;
Manikandan Mohana18b8642018-03-01 16:17:23 -08003079qdf_export_symbol(qdf_dbg_mask);
Adil Saeed Musthafa2ef27872017-05-02 16:40:45 -07003080qdf_declare_param(qdf_dbg_mask, int);
3081
3082/*
3083 * QDF can be passed parameters which indicate the
3084 * debug level for each module.
3085 * an array of string values are passed, each string hold the following form
3086 *
3087 * <module name string>=<integer debug level value>
3088 *
3089 * The array qdf_dbg_arr will hold these module-string=value strings
3090 * The variable qdf_dbg_arr_cnt will have the count of how many such
3091 * string values were passed.
3092 */
3093static char *qdf_dbg_arr[QDF_MODULE_ID_MAX];
3094static int qdf_dbg_arr_cnt;
3095qdf_declare_param_array(qdf_dbg_arr, charp, &qdf_dbg_arr_cnt);
3096
3097static uint16_t set_cumulative_verbose_mask(QDF_TRACE_LEVEL max_level)
3098{
3099 uint16_t category_verbose_mask = 0;
3100 QDF_TRACE_LEVEL level;
3101
3102 for (level = QDF_TRACE_LEVEL_FATAL; level <= max_level; level++) {
3103 category_verbose_mask |=
3104 QDF_TRACE_LEVEL_TO_MODULE_BITMASK(level);
3105 }
3106 return category_verbose_mask;
3107}
3108
3109static QDF_MODULE_ID find_qdf_module_from_string(char *str)
3110{
3111 QDF_MODULE_ID mod_id;
3112
3113 for (mod_id = 0; mod_id < QDF_MODULE_ID_MAX; mod_id++) {
3114 if (strcasecmp(str,
3115 g_qdf_category_name[mod_id].category_name_str)
3116 == 0) {
3117 break;
3118 }
3119 }
3120 return mod_id;
3121}
3122
3123static void process_qdf_dbg_arr_param(struct category_info *cinfo,
3124 int array_index)
3125{
3126 char *mod_val_str, *mod_str, *val_str;
3127 unsigned long dbg_level;
3128 QDF_MODULE_ID mod_id;
3129
3130 mod_val_str = qdf_dbg_arr[array_index];
3131 mod_str = strsep(&mod_val_str, "=");
3132 val_str = mod_val_str;
Jeff Johnson28312292019-03-18 09:49:07 -07003133 if (!val_str) {
Adil Saeed Musthafa2ef27872017-05-02 16:40:45 -07003134 pr_info("qdf_dbg_arr: %s not in the <mod>=<val> form\n",
3135 mod_str);
3136 return;
3137 }
3138
3139 mod_id = find_qdf_module_from_string(mod_str);
3140 if (mod_id >= QDF_MODULE_ID_MAX) {
3141 pr_info("ERROR!!Module name %s not in the list of modules\n",
3142 mod_str);
3143 return;
3144 }
3145
3146 if (kstrtol(val_str, 10, &dbg_level) < 0) {
3147 pr_info("ERROR!!Invalid debug level for module: %s\n",
3148 mod_str);
3149 return;
3150 }
3151
3152 if (dbg_level >= QDF_TRACE_LEVEL_MAX) {
3153 pr_info("ERROR!!Debug level for %s too high", mod_str);
3154 pr_info("max: %d given %lu\n", QDF_TRACE_LEVEL_MAX,
3155 dbg_level);
3156 return;
3157 }
3158
3159 pr_info("User passed setting module %s(%d) to level %lu\n",
3160 mod_str,
3161 mod_id,
3162 dbg_level);
3163 cinfo[mod_id].category_verbose_mask =
3164 set_cumulative_verbose_mask((QDF_TRACE_LEVEL)dbg_level);
3165}
3166
3167static void set_default_trace_levels(struct category_info *cinfo)
3168{
3169 int i;
3170 static QDF_TRACE_LEVEL module_trace_default_level[QDF_MODULE_ID_MAX] = {
Sathish Kumaradeb66e2017-05-18 11:29:05 +05303171 [QDF_MODULE_ID_TDLS] = QDF_TRACE_LEVEL_NONE,
3172 [QDF_MODULE_ID_ACS] = QDF_TRACE_LEVEL_NONE,
3173 [QDF_MODULE_ID_SCAN_SM] = QDF_TRACE_LEVEL_NONE,
3174 [QDF_MODULE_ID_SCANENTRY] = QDF_TRACE_LEVEL_NONE,
3175 [QDF_MODULE_ID_WDS] = QDF_TRACE_LEVEL_NONE,
3176 [QDF_MODULE_ID_ACTION] = QDF_TRACE_LEVEL_NONE,
3177 [QDF_MODULE_ID_ROAM] = QDF_TRACE_LEVEL_NONE,
3178 [QDF_MODULE_ID_INACT] = QDF_TRACE_LEVEL_NONE,
3179 [QDF_MODULE_ID_DOTH] = QDF_TRACE_LEVEL_NONE,
3180 [QDF_MODULE_ID_IQUE] = QDF_TRACE_LEVEL_NONE,
3181 [QDF_MODULE_ID_WME] = QDF_TRACE_LEVEL_NONE,
3182 [QDF_MODULE_ID_ACL] = QDF_TRACE_LEVEL_NONE,
3183 [QDF_MODULE_ID_WPA] = QDF_TRACE_LEVEL_NONE,
3184 [QDF_MODULE_ID_RADKEYS] = QDF_TRACE_LEVEL_NONE,
3185 [QDF_MODULE_ID_RADDUMP] = QDF_TRACE_LEVEL_NONE,
3186 [QDF_MODULE_ID_RADIUS] = QDF_TRACE_LEVEL_NONE,
3187 [QDF_MODULE_ID_DOT1XSM] = QDF_TRACE_LEVEL_NONE,
3188 [QDF_MODULE_ID_DOT1X] = QDF_TRACE_LEVEL_NONE,
3189 [QDF_MODULE_ID_POWER] = QDF_TRACE_LEVEL_NONE,
3190 [QDF_MODULE_ID_STATE] = QDF_TRACE_LEVEL_NONE,
3191 [QDF_MODULE_ID_OUTPUT] = QDF_TRACE_LEVEL_NONE,
Akshay Kosigi41da2472018-04-12 15:31:44 +05303192 [QDF_MODULE_ID_SCAN] = QDF_TRACE_LEVEL_ERROR,
Sathish Kumaradeb66e2017-05-18 11:29:05 +05303193 [QDF_MODULE_ID_AUTH] = QDF_TRACE_LEVEL_NONE,
3194 [QDF_MODULE_ID_ASSOC] = QDF_TRACE_LEVEL_NONE,
3195 [QDF_MODULE_ID_NODE] = QDF_TRACE_LEVEL_NONE,
3196 [QDF_MODULE_ID_ELEMID] = QDF_TRACE_LEVEL_NONE,
3197 [QDF_MODULE_ID_XRATE] = QDF_TRACE_LEVEL_NONE,
3198 [QDF_MODULE_ID_INPUT] = QDF_TRACE_LEVEL_NONE,
3199 [QDF_MODULE_ID_CRYPTO] = QDF_TRACE_LEVEL_NONE,
3200 [QDF_MODULE_ID_DUMPPKTS] = QDF_TRACE_LEVEL_NONE,
3201 [QDF_MODULE_ID_DEBUG] = QDF_TRACE_LEVEL_NONE,
Santosh Anbu6e2fed82018-11-30 15:26:30 +05303202 [QDF_MODULE_ID_MLME] = QDF_TRACE_LEVEL_ERROR,
Sathish Kumaradeb66e2017-05-18 11:29:05 +05303203 [QDF_MODULE_ID_RRM] = QDF_TRACE_LEVEL_NONE,
3204 [QDF_MODULE_ID_WNM] = QDF_TRACE_LEVEL_NONE,
3205 [QDF_MODULE_ID_P2P_PROT] = QDF_TRACE_LEVEL_NONE,
3206 [QDF_MODULE_ID_PROXYARP] = QDF_TRACE_LEVEL_NONE,
3207 [QDF_MODULE_ID_L2TIF] = QDF_TRACE_LEVEL_NONE,
3208 [QDF_MODULE_ID_WIFIPOS] = QDF_TRACE_LEVEL_NONE,
3209 [QDF_MODULE_ID_WRAP] = QDF_TRACE_LEVEL_NONE,
3210 [QDF_MODULE_ID_DFS] = QDF_TRACE_LEVEL_NONE,
Subrat Mishra2a06b232018-03-08 12:55:58 +05303211 [QDF_MODULE_ID_ATF] = QDF_TRACE_LEVEL_ERROR,
Sathish Kumaradeb66e2017-05-18 11:29:05 +05303212 [QDF_MODULE_ID_SPLITMAC] = QDF_TRACE_LEVEL_NONE,
3213 [QDF_MODULE_ID_IOCTL] = QDF_TRACE_LEVEL_NONE,
3214 [QDF_MODULE_ID_NAC] = QDF_TRACE_LEVEL_NONE,
3215 [QDF_MODULE_ID_MESH] = QDF_TRACE_LEVEL_NONE,
3216 [QDF_MODULE_ID_MBO] = QDF_TRACE_LEVEL_NONE,
3217 [QDF_MODULE_ID_EXTIOCTL_CHANSWITCH] = QDF_TRACE_LEVEL_NONE,
3218 [QDF_MODULE_ID_EXTIOCTL_CHANSSCAN] = QDF_TRACE_LEVEL_NONE,
3219 [QDF_MODULE_ID_TLSHIM] = QDF_TRACE_LEVEL_NONE,
Surya Prakash27fba322019-01-31 14:16:27 +05303220 [QDF_MODULE_ID_WMI] = QDF_TRACE_LEVEL_ERROR,
Sathish Kumaradeb66e2017-05-18 11:29:05 +05303221 [QDF_MODULE_ID_HTT] = QDF_TRACE_LEVEL_NONE,
3222 [QDF_MODULE_ID_HDD] = QDF_TRACE_LEVEL_NONE,
3223 [QDF_MODULE_ID_SME] = QDF_TRACE_LEVEL_NONE,
3224 [QDF_MODULE_ID_PE] = QDF_TRACE_LEVEL_NONE,
3225 [QDF_MODULE_ID_WMA] = QDF_TRACE_LEVEL_NONE,
3226 [QDF_MODULE_ID_SYS] = QDF_TRACE_LEVEL_NONE,
Shiva Krishna Pittalab1554312018-04-02 17:23:42 +05303227 [QDF_MODULE_ID_QDF] = QDF_TRACE_LEVEL_ERROR,
Sathish Kumaradeb66e2017-05-18 11:29:05 +05303228 [QDF_MODULE_ID_SAP] = QDF_TRACE_LEVEL_NONE,
3229 [QDF_MODULE_ID_HDD_SOFTAP] = QDF_TRACE_LEVEL_NONE,
3230 [QDF_MODULE_ID_HDD_DATA] = QDF_TRACE_LEVEL_NONE,
3231 [QDF_MODULE_ID_HDD_SAP_DATA] = QDF_TRACE_LEVEL_NONE,
Santosh Anbuefe6c5a2018-03-14 15:30:36 +05303232 [QDF_MODULE_ID_HIF] = QDF_TRACE_LEVEL_ERROR,
Sathish Kumaradeb66e2017-05-18 11:29:05 +05303233 [QDF_MODULE_ID_HTC] = QDF_TRACE_LEVEL_NONE,
3234 [QDF_MODULE_ID_TXRX] = QDF_TRACE_LEVEL_NONE,
3235 [QDF_MODULE_ID_QDF_DEVICE] = QDF_TRACE_LEVEL_NONE,
3236 [QDF_MODULE_ID_CFG] = QDF_TRACE_LEVEL_NONE,
3237 [QDF_MODULE_ID_BMI] = QDF_TRACE_LEVEL_NONE,
3238 [QDF_MODULE_ID_EPPING] = QDF_TRACE_LEVEL_NONE,
3239 [QDF_MODULE_ID_QVIT] = QDF_TRACE_LEVEL_NONE,
Adil Saeed Musthafa03e2ac22017-05-19 16:55:23 -07003240 [QDF_MODULE_ID_DP] = QDF_TRACE_LEVEL_FATAL,
Venkata Sharath Chandra Manchala443b9b42018-10-10 12:04:54 -07003241 [QDF_MODULE_ID_HAL] = QDF_TRACE_LEVEL_NONE,
Sathish Kumaradeb66e2017-05-18 11:29:05 +05303242 [QDF_MODULE_ID_SOC] = QDF_TRACE_LEVEL_NONE,
3243 [QDF_MODULE_ID_OS_IF] = QDF_TRACE_LEVEL_NONE,
Srinivas Pitlac4bdc7a2018-01-08 16:53:37 +05303244 [QDF_MODULE_ID_TARGET_IF] = QDF_TRACE_LEVEL_INFO,
Sathish Kumaradeb66e2017-05-18 11:29:05 +05303245 [QDF_MODULE_ID_SCHEDULER] = QDF_TRACE_LEVEL_NONE,
3246 [QDF_MODULE_ID_MGMT_TXRX] = QDF_TRACE_LEVEL_NONE,
Vivekd34b7d02019-01-25 13:55:29 +05303247 [QDF_MODULE_ID_SERIALIZATION] = QDF_TRACE_LEVEL_ERROR,
Akshay Kosigiabdf9af2018-03-01 00:07:36 +05303248 [QDF_MODULE_ID_PMO] = QDF_TRACE_LEVEL_NONE,
3249 [QDF_MODULE_ID_P2P] = QDF_TRACE_LEVEL_NONE,
3250 [QDF_MODULE_ID_POLICY_MGR] = QDF_TRACE_LEVEL_NONE,
3251 [QDF_MODULE_ID_CONFIG] = QDF_TRACE_LEVEL_ERROR,
3252 [QDF_MODULE_ID_REGULATORY] = QDF_TRACE_LEVEL_NONE,
3253 [QDF_MODULE_ID_SA_API] = QDF_TRACE_LEVEL_NONE,
3254 [QDF_MODULE_ID_NAN] = QDF_TRACE_LEVEL_NONE,
3255 [QDF_MODULE_ID_OFFCHAN_TXRX] = QDF_TRACE_LEVEL_NONE,
3256 [QDF_MODULE_ID_SON] = QDF_TRACE_LEVEL_NONE,
Shiva Krishna Pittala13452332019-01-21 14:51:17 +05303257 [QDF_MODULE_ID_SPECTRAL] = QDF_TRACE_LEVEL_ERROR,
Akshay Kosigi41da2472018-04-12 15:31:44 +05303258 [QDF_MODULE_ID_OBJ_MGR] = QDF_TRACE_LEVEL_FATAL,
Aniruddha Paulb2f7ab62017-10-09 14:40:04 +05303259 [QDF_MODULE_ID_NSS] = QDF_TRACE_LEVEL_ERROR,
Deepak Dhamdhere7e0b8ba2017-07-03 00:33:26 -07003260 [QDF_MODULE_ID_ROAM_DEBUG] = QDF_TRACE_LEVEL_ERROR,
Akshay Kosigiabdf9af2018-03-01 00:07:36 +05303261 [QDF_MODULE_ID_CDP] = QDF_TRACE_LEVEL_NONE,
Sathish Kumara9a42eb2017-11-17 17:26:39 +05303262 [QDF_MODULE_ID_DIRECT_BUF_RX] = QDF_TRACE_LEVEL_ERROR,
Akshay Kosigiabdf9af2018-03-01 00:07:36 +05303263 [QDF_MODULE_ID_DISA] = QDF_TRACE_LEVEL_NONE,
Himanshu Agarwalb3c81ac2018-01-10 14:21:53 +05303264 [QDF_MODULE_ID_GREEN_AP] = QDF_TRACE_LEVEL_ERROR,
Akshay Kosigiabdf9af2018-03-01 00:07:36 +05303265 [QDF_MODULE_ID_FTM] = QDF_TRACE_LEVEL_ERROR,
Santosh Anbud5fdfac2018-01-03 22:33:58 +05303266 [QDF_MODULE_ID_EXTAP] = QDF_TRACE_LEVEL_NONE,
Subrat Mishrabf125872017-09-27 14:41:20 +05303267 [QDF_MODULE_ID_FD] = QDF_TRACE_LEVEL_ERROR,
Zhang Qian82377ce2018-01-04 12:15:29 +08003268 [QDF_MODULE_ID_OCB] = QDF_TRACE_LEVEL_ERROR,
Akshay Kosigi41da2472018-04-12 15:31:44 +05303269 [QDF_MODULE_ID_IPA] = QDF_TRACE_LEVEL_NONE,
Rajeev Kumar Sirasanagandla66970852017-09-18 16:47:52 +05303270 [QDF_MODULE_ID_ACTION_OUI] = QDF_TRACE_LEVEL_NONE,
Naga6d06baa2018-02-21 15:17:55 +05303271 [QDF_MODULE_ID_CP_STATS] = QDF_TRACE_LEVEL_ERROR,
Manoj Ekboteb8de9372018-06-06 16:52:39 -07003272 [QDF_MODULE_ID_MBSSIE] = QDF_TRACE_LEVEL_INFO,
Sourav Mohapatra474c6142018-08-29 15:23:26 +05303273 [QDF_MODULE_ID_FWOL] = QDF_TRACE_LEVEL_NONE,
Srinivas Pitla8d19efa2019-02-22 15:55:05 +05303274 [QDF_MODULE_ID_SM_ENGINE] = QDF_TRACE_LEVEL_ERROR,
Srinivas Pitlabe8dac42018-06-14 16:05:03 +05303275 [QDF_MODULE_ID_CMN_MLME] = QDF_TRACE_LEVEL_INFO,
Gyanranjan Hazarika2c545812018-10-04 12:11:46 -07003276 [QDF_MODULE_ID_BSSCOLOR] = QDF_TRACE_LEVEL_ERROR,
Abhiram Jogadenuc5281452019-02-14 16:21:09 +05303277 [QDF_MODULE_ID_CFR] = QDF_TRACE_LEVEL_ERROR,
nobeljdebe2b32019-04-23 11:18:47 -07003278 [QDF_MODULE_ID_TX_CAPTURE] = QDF_TRACE_LEVEL_NONE,
Paul Zhang5ea0a912019-05-14 11:33:31 +08003279 [QDF_MODULE_ID_INTEROP_ISSUES_AP] = QDF_TRACE_LEVEL_NONE,
gaurank kathpalia9f525cb2019-05-28 18:21:18 +05303280 [QDF_MODULE_ID_BLACKLIST_MGR] = QDF_TRACE_LEVEL_NONE,
Uraj Sasan37b2c4d2019-06-13 18:21:24 +05303281 [QDF_MODULE_ID_QLD] = QDF_TRACE_LEVEL_ERROR,
Gyanranjan Hazarika8e0ae992019-06-05 00:43:38 -07003282 [QDF_MODULE_ID_DYNAMIC_MODE_CHG] = QDF_TRACE_LEVEL_INFO,
Yu Wange7f177a2019-12-18 08:59:49 +08003283 [QDF_MODULE_ID_COEX] = QDF_TRACE_LEVEL_ERROR,
Aditya Sathish1c42c272018-07-20 14:52:05 +05303284 [QDF_MODULE_ID_ANY] = QDF_TRACE_LEVEL_INFO,
Adil Saeed Musthafa2ef27872017-05-02 16:40:45 -07003285 };
3286
3287 for (i = 0; i < MAX_SUPPORTED_CATEGORY; i++) {
3288 cinfo[i].category_verbose_mask = set_cumulative_verbose_mask(
3289 module_trace_default_level[i]);
3290 }
3291}
3292
Adil Saeed Musthafa33188072017-03-13 12:13:47 -07003293void qdf_shared_print_ctrl_init(void)
3294{
3295 int i;
Shiva Krishna Pittalab1554312018-04-02 17:23:42 +05303296 struct category_info cinfo[MAX_SUPPORTED_CATEGORY];
Adil Saeed Musthafa2ef27872017-05-02 16:40:45 -07003297
3298 set_default_trace_levels(cinfo);
3299
3300 /*
3301 * User specified across-module single debug level
3302 */
Adil Saeed Musthafa03e2ac22017-05-19 16:55:23 -07003303 if ((qdf_dbg_mask > 0) && (qdf_dbg_mask <= QDF_TRACE_LEVEL_MAX)) {
Adil Saeed Musthafa2ef27872017-05-02 16:40:45 -07003304 pr_info("User specified module debug level of %d\n",
3305 qdf_dbg_mask);
3306 for (i = 0; i < MAX_SUPPORTED_CATEGORY; i++) {
3307 cinfo[i].category_verbose_mask =
3308 set_cumulative_verbose_mask(qdf_dbg_mask);
Adil Saeed Musthafa33188072017-03-13 12:13:47 -07003309 }
Adil Saeed Musthafa2ef27872017-05-02 16:40:45 -07003310 } else {
3311 pr_info("qdf_dbg_mask value is invalid\n");
3312 pr_info("Using the default module debug levels instead\n");
3313 }
3314
3315 /*
3316 * Module ID-Level specified as array during module load
3317 */
3318 for (i = 0; i < qdf_dbg_arr_cnt; i++) {
3319 process_qdf_dbg_arr_param(cinfo, i);
Adil Saeed Musthafa33188072017-03-13 12:13:47 -07003320 }
3321 qdf_pidx = qdf_print_ctrl_register(cinfo, NULL, NULL,
3322 "LOG_SHARED_OBJ");
Adil Saeed Musthafa33188072017-03-13 12:13:47 -07003323}
Manikandan Mohana18b8642018-03-01 16:17:23 -08003324qdf_export_symbol(qdf_shared_print_ctrl_init);
Adil Saeed Musthafa33188072017-03-13 12:13:47 -07003325#endif
3326
Sathish Kumarfc93b2d2017-01-10 12:19:19 +05303327QDF_STATUS qdf_print_set_category_verbose(unsigned int idx,
3328 QDF_MODULE_ID category,
3329 QDF_TRACE_LEVEL verbose,
3330 bool is_set)
3331{
3332 /* Check if index passed is valid */
3333 if (idx < 0 || idx >= MAX_PRINT_CONFIG_SUPPORTED) {
Rajeev Kumar18032782018-10-31 13:14:40 -07003334 pr_err("%s: Invalid index - %d\n", __func__, idx);
Sathish Kumarfc93b2d2017-01-10 12:19:19 +05303335 return QDF_STATUS_E_FAILURE;
3336 }
3337
3338 /* Check if print control object is in use */
3339 if (!print_ctrl_obj[idx].in_use) {
Rajeev Kumar18032782018-10-31 13:14:40 -07003340 pr_err("%s: Invalid print control object\n", __func__);
Sathish Kumarfc93b2d2017-01-10 12:19:19 +05303341 return QDF_STATUS_E_FAILURE;
3342 }
3343
3344 /* Check if category passed is valid */
3345 if (category < 0 || category >= MAX_SUPPORTED_CATEGORY) {
Rajeev Kumar18032782018-10-31 13:14:40 -07003346 pr_err("%s: Invalid category: %d\n", __func__, category);
Sathish Kumarfc93b2d2017-01-10 12:19:19 +05303347 return QDF_STATUS_E_FAILURE;
3348 }
3349
3350 /* Check if verbose mask is valid */
3351 if (verbose < 0 || verbose >= QDF_TRACE_LEVEL_MAX) {
Rajeev Kumar18032782018-10-31 13:14:40 -07003352 pr_err("%s: Invalid verbose level %d\n", __func__, verbose);
Sathish Kumarfc93b2d2017-01-10 12:19:19 +05303353 return QDF_STATUS_E_FAILURE;
3354 }
3355
3356 if (verbose == QDF_TRACE_LEVEL_ALL) {
3357 print_ctrl_obj[idx].cat_info[category].category_verbose_mask =
3358 0xFFFF;
3359 return QDF_STATUS_SUCCESS;
3360 }
3361
3362 if (verbose == QDF_TRACE_LEVEL_NONE) {
3363 print_ctrl_obj[idx].cat_info[category].category_verbose_mask =
3364 QDF_TRACE_LEVEL_NONE;
3365 return QDF_STATUS_SUCCESS;
3366 }
3367
3368 if (!is_set) {
3369 if (print_ctrl_obj[idx].cat_info[category].category_verbose_mask
3370 & QDF_TRACE_LEVEL_TO_MODULE_BITMASK(verbose)) {
3371 print_ctrl_obj[idx].cat_info[category]
3372 .category_verbose_mask &=
3373 ~QDF_TRACE_LEVEL_TO_MODULE_BITMASK(verbose);
3374 }
3375 } else {
3376 print_ctrl_obj[idx].cat_info[category].category_verbose_mask |=
3377 QDF_TRACE_LEVEL_TO_MODULE_BITMASK(verbose);
3378 }
3379
Rajeev Kumar18032782018-10-31 13:14:40 -07003380 pr_debug("%s: Print control object %d, Category %d, Verbose level %d\n",
Sathish Kumarfc93b2d2017-01-10 12:19:19 +05303381 __func__,
3382 idx,
3383 category,
3384 print_ctrl_obj[idx].cat_info[category].category_verbose_mask);
3385
3386 return QDF_STATUS_SUCCESS;
3387}
Manikandan Mohana18b8642018-03-01 16:17:23 -08003388qdf_export_symbol(qdf_print_set_category_verbose);
Sathish Kumarfc93b2d2017-01-10 12:19:19 +05303389
Adil Saeed Musthafa12205b52018-08-07 09:39:20 -07003390void qdf_log_dump_at_kernel_level(bool enable)
3391{
3392 if (qdf_log_dump_at_kernel_enable == enable) {
3393 QDF_TRACE_INFO(QDF_MODULE_ID_QDF,
3394 "qdf_log_dump_at_kernel_enable is already %d\n",
3395 enable);
3396 }
3397 qdf_log_dump_at_kernel_enable = enable;
3398}
3399
3400qdf_export_symbol(qdf_log_dump_at_kernel_level);
3401
Sathish Kumarfc93b2d2017-01-10 12:19:19 +05303402bool qdf_print_is_category_enabled(unsigned int idx, QDF_MODULE_ID category)
3403{
3404 QDF_TRACE_LEVEL verbose_mask;
3405
3406 /* Check if index passed is valid */
3407 if (idx < 0 || idx >= MAX_PRINT_CONFIG_SUPPORTED) {
3408 pr_info("%s: Invalid index - %d\n", __func__, idx);
3409 return false;
3410 }
3411
3412 /* Check if print control object is in use */
3413 if (!print_ctrl_obj[idx].in_use) {
3414 pr_info("%s: Invalid print control object\n", __func__);
3415 return false;
3416 }
3417
3418 /* Check if category passed is valid */
3419 if (category < 0 || category >= MAX_SUPPORTED_CATEGORY) {
3420 pr_info("%s: Invalid category: %d\n", __func__, category);
3421 return false;
3422 }
3423
3424 verbose_mask =
3425 print_ctrl_obj[idx].cat_info[category].category_verbose_mask;
3426
3427 if (verbose_mask == QDF_TRACE_LEVEL_NONE)
3428 return false;
3429 else
3430 return true;
3431}
Manikandan Mohana18b8642018-03-01 16:17:23 -08003432qdf_export_symbol(qdf_print_is_category_enabled);
Sathish Kumarfc93b2d2017-01-10 12:19:19 +05303433
3434bool qdf_print_is_verbose_enabled(unsigned int idx, QDF_MODULE_ID category,
3435 QDF_TRACE_LEVEL verbose)
3436{
3437 bool verbose_enabled = false;
3438
3439 /* Check if index passed is valid */
3440 if (idx < 0 || idx >= MAX_PRINT_CONFIG_SUPPORTED) {
3441 pr_info("%s: Invalid index - %d\n", __func__, idx);
3442 return verbose_enabled;
3443 }
3444
3445 /* Check if print control object is in use */
3446 if (!print_ctrl_obj[idx].in_use) {
3447 pr_info("%s: Invalid print control object\n", __func__);
3448 return verbose_enabled;
3449 }
3450
3451 /* Check if category passed is valid */
3452 if (category < 0 || category >= MAX_SUPPORTED_CATEGORY) {
3453 pr_info("%s: Invalid category: %d\n", __func__, category);
3454 return verbose_enabled;
3455 }
3456
3457 if ((verbose == QDF_TRACE_LEVEL_NONE) ||
3458 (verbose >= QDF_TRACE_LEVEL_MAX)) {
3459 verbose_enabled = false;
3460 } else if (verbose == QDF_TRACE_LEVEL_ALL) {
3461 if (print_ctrl_obj[idx].cat_info[category]
3462 .category_verbose_mask == 0xFFFF)
3463 verbose_enabled = true;
3464 } else {
3465 verbose_enabled =
3466 (print_ctrl_obj[idx].cat_info[category].category_verbose_mask &
3467 QDF_TRACE_LEVEL_TO_MODULE_BITMASK(verbose)) ? true : false;
3468 }
3469
3470 return verbose_enabled;
3471}
Manikandan Mohana18b8642018-03-01 16:17:23 -08003472qdf_export_symbol(qdf_print_is_verbose_enabled);
Sathish Kumarfc93b2d2017-01-10 12:19:19 +05303473
3474#ifdef DBG_LVL_MAC_FILTERING
3475
3476QDF_STATUS qdf_print_set_node_flag(unsigned int idx, uint8_t enable)
3477{
3478 /* Check if index passed is valid */
3479 if (idx < 0 || idx >= MAX_PRINT_CONFIG_SUPPORTED) {
3480 pr_info("%s: Invalid index - %d\n", __func__, idx);
3481 return QDF_STATUS_E_FAILURE;
3482 }
3483
3484 /* Check if print control object is in use */
3485 if (!print_ctrl_obj[idx].in_use) {
3486 pr_info("%s: Invalid print control object\n", __func__);
3487 return QDF_STATUS_E_FAILURE;
3488 }
3489
3490 if (enable > 1) {
3491 pr_info("%s: Incorrect input: Use 1 or 0 to enable or disable\n",
3492 __func__);
3493 return QDF_STATUS_E_FAILURE;
3494 }
3495
3496 print_ctrl_obj[idx].dbglvlmac_on = enable;
3497 pr_info("%s: DbgLVLmac feature %s\n",
3498 __func__,
3499 ((enable) ? "enabled" : "disabled"));
3500
3501 return QDF_STATUS_SUCCESS;
3502}
Manikandan Mohana18b8642018-03-01 16:17:23 -08003503qdf_export_symbol(qdf_print_set_node_flag);
Sathish Kumarfc93b2d2017-01-10 12:19:19 +05303504
3505bool qdf_print_get_node_flag(unsigned int idx)
3506{
3507 bool node_flag = false;
3508
3509 /* Check if index passed is valid */
3510 if (idx < 0 || idx >= MAX_PRINT_CONFIG_SUPPORTED) {
3511 pr_info("%s: Invalid index - %d\n", __func__, idx);
3512 return node_flag;
3513 }
3514
3515 /* Check if print control object is in use */
3516 if (!print_ctrl_obj[idx].in_use) {
3517 pr_info("%s: Invalid print control object\n", __func__);
3518 return node_flag;
3519 }
3520
3521 if (print_ctrl_obj[idx].dbglvlmac_on)
3522 node_flag = true;
3523
3524 return node_flag;
3525}
Manikandan Mohana18b8642018-03-01 16:17:23 -08003526qdf_export_symbol(qdf_print_get_node_flag);
Sathish Kumarfc93b2d2017-01-10 12:19:19 +05303527
3528void qdf_print_clean_node_flag(unsigned int idx)
3529{
3530 /* Disable dbglvlmac_on during cleanup */
3531 print_ctrl_obj[idx].dbglvlmac_on = 0;
3532}
3533
3534#else
3535
3536void qdf_print_clean_node_flag(unsigned int idx)
3537{
3538 /* No operation in case of no support for DBG_LVL_MAC_FILTERING */
3539 return;
3540}
3541#endif
3542
Sathish Kumar59113a42017-01-04 12:02:24 +05303543void QDF_PRINT_INFO(unsigned int idx, QDF_MODULE_ID module,
3544 QDF_TRACE_LEVEL level,
3545 char *str_format, ...)
3546{
3547 va_list args;
3548
3549 /* Generic wrapper API will compile qdf_vprint in order to
3550 * log the message. Once QDF converged debug framework is in
3551 * place, this will be changed to adapt to the framework, compiling
3552 * call to converged tracing API
3553 */
3554 va_start(args, str_format);
3555 qdf_vprint(str_format, args);
3556 va_end(args);
3557}
Manikandan Mohana18b8642018-03-01 16:17:23 -08003558qdf_export_symbol(QDF_PRINT_INFO);
Adil Saeed Musthafabcf62ed2017-02-20 16:22:39 -08003559
3560#ifdef WLAN_LOGGING_SOCK_SVC_ENABLE
3561void qdf_logging_init(void)
3562{
3563 wlan_logging_sock_init_svc();
Hangtian Zhu24dab772019-09-11 17:53:40 +08003564 nl_srv_init(NULL, WLAN_NLINK_PROTO_FAMILY);
Adil Saeed Musthafa12205b52018-08-07 09:39:20 -07003565 wlan_logging_set_flush_timer(qdf_log_flush_timer_period);
Adil Saeed Musthafabcf62ed2017-02-20 16:22:39 -08003566}
3567
3568void qdf_logging_exit(void)
3569{
3570 nl_srv_exit();
Adil Saeed Musthafabcf62ed2017-02-20 16:22:39 -08003571 wlan_logging_sock_deinit_svc();
3572}
Adil Saeed Musthafa12205b52018-08-07 09:39:20 -07003573
3574int qdf_logging_set_flush_timer(uint32_t milliseconds)
3575{
3576 if (wlan_logging_set_flush_timer(milliseconds) == 0)
3577 return QDF_STATUS_SUCCESS;
3578 else
3579 return QDF_STATUS_E_FAILURE;
3580}
3581
3582void qdf_logging_flush_logs(void)
3583{
3584 wlan_flush_host_logs_for_fatal();
3585}
3586
Adil Saeed Musthafabcf62ed2017-02-20 16:22:39 -08003587#else
3588void qdf_logging_init(void)
3589{
Hangtian Zhu24dab772019-09-11 17:53:40 +08003590 nl_srv_init(NULL, WLAN_NLINK_PROTO_FAMILY);
Adil Saeed Musthafabcf62ed2017-02-20 16:22:39 -08003591}
3592
3593void qdf_logging_exit(void)
3594{
Sathish Kumar18617b82018-06-20 17:57:24 +05303595 nl_srv_exit();
Adil Saeed Musthafabcf62ed2017-02-20 16:22:39 -08003596}
Adil Saeed Musthafa12205b52018-08-07 09:39:20 -07003597
3598int qdf_logging_set_flush_timer(uint32_t milliseconds)
3599{
3600 return QDF_STATUS_E_FAILURE;
3601}
3602
3603void qdf_logging_flush_logs(void)
3604{
3605}
Adil Saeed Musthafabcf62ed2017-02-20 16:22:39 -08003606#endif
3607
Adil Saeed Musthafa12205b52018-08-07 09:39:20 -07003608qdf_export_symbol(qdf_logging_set_flush_timer);
3609qdf_export_symbol(qdf_logging_flush_logs);
3610
Dustin Browne226ceb2017-04-21 13:22:14 -07003611#ifdef CONFIG_KALLSYMS
3612inline int qdf_sprint_symbol(char *buffer, void *addr)
3613{
3614 return sprint_symbol(buffer, (unsigned long)addr);
3615}
3616#else
3617int qdf_sprint_symbol(char *buffer, void *addr)
3618{
3619 if (!buffer)
3620 return 0;
3621
3622 buffer[0] = '\0';
3623 return 1;
3624}
3625#endif
Manikandan Mohana18b8642018-03-01 16:17:23 -08003626qdf_export_symbol(qdf_sprint_symbol);
Sathish Kumar470c6202017-05-10 19:56:48 +05303627
3628void qdf_set_pidx(int pidx)
3629{
3630 qdf_pidx = pidx;
3631}
Manikandan Mohana18b8642018-03-01 16:17:23 -08003632qdf_export_symbol(qdf_set_pidx);
Sathish Kumar470c6202017-05-10 19:56:48 +05303633
3634int qdf_get_pidx(void)
3635{
3636 return qdf_pidx;
3637}
Manikandan Mohana18b8642018-03-01 16:17:23 -08003638qdf_export_symbol(qdf_get_pidx);
Dustin Brown1723d452018-03-07 17:22:34 -08003639
3640#ifdef PANIC_ON_BUG
3641#ifdef CONFIG_SLUB_DEBUG
Dustin Brownce28cb12018-06-27 14:27:34 -07003642void __qdf_bug(void)
Dustin Brown1723d452018-03-07 17:22:34 -08003643{
3644 BUG();
3645}
Dustin Brownce28cb12018-06-27 14:27:34 -07003646qdf_export_symbol(__qdf_bug);
Dustin Brown1723d452018-03-07 17:22:34 -08003647#endif /* CONFIG_SLUB_DEBUG */
3648#endif /* PANIC_ON_BUG */
3649