blob: 1a7bdc25f2afa762609e5059d574bb22eabe840a [file] [log] [blame]
Chouhan, Anurag57763182016-03-03 18:57:27 +05301/*
Nachiket Kukade88ae8532017-12-15 12:36:58 +05302 * Copyright (c) 2014-2018 The Linux Foundation. All rights reserved.
Chouhan, Anurag57763182016-03-03 18:57:27 +05303 *
4 * Previously licensed under the ISC license by Qualcomm Atheros, Inc.
5 *
6 *
7 * Permission to use, copy, modify, and/or distribute this software for
8 * any purpose with or without fee is hereby granted, provided that the
9 * above copyright notice and this permission notice appear in all
10 * copies.
11 *
12 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
13 * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
14 * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
15 * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
16 * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
17 * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
18 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
19 * PERFORMANCE OF THIS SOFTWARE.
20 */
21
22/*
23 * This file was originally distributed by Qualcomm Atheros, Inc.
24 * under proprietary terms before Copyright ownership was assigned
25 * to the Linux Foundation.
26 */
27
28/**
29 * DOC: qdf_trace
30 * QCA driver framework (QDF) trace APIs
31 * Trace, logging, and debugging definitions and APIs
32 */
33
34/* Include Files */
35#include <qdf_trace.h>
Sathish Kumar59113a42017-01-04 12:02:24 +053036#include <linux/export.h>
37
Sathish Kumarfc93b2d2017-01-10 12:19:19 +053038/* macro to map qdf trace levels into the bitmask */
39#define QDF_TRACE_LEVEL_TO_MODULE_BITMASK(_level) ((1 << (_level)))
40
Adil Saeed Musthafabcf62ed2017-02-20 16:22:39 -080041#include <wlan_logging_sock_svc.h>
Adil Saeed Musthafa2ef27872017-05-02 16:40:45 -070042#include <qdf_module.h>
Adil Saeed Musthafa33188072017-03-13 12:13:47 -070043static int qdf_pidx = -1;
Sathish Kumar59113a42017-01-04 12:02:24 +053044
Chouhan, Anurag57763182016-03-03 18:57:27 +053045#include "qdf_time.h"
Sreelakshmi Konamkie2e31352016-10-27 15:00:57 +053046#include "qdf_mc_timer.h"
Sathish Kumarfebd4b72017-01-10 12:19:19 +053047
48/* Global qdf print id */
Sathish Kumarfebd4b72017-01-10 12:19:19 +053049
Chouhan, Anurag57763182016-03-03 18:57:27 +053050/* Preprocessor definitions and constants */
51
Chouhan, Anurag57763182016-03-03 18:57:27 +053052enum qdf_timestamp_unit qdf_log_timestamp_type = QDF_LOG_TIMESTAMP_UNIT;
53
Chouhan, Anurag57763182016-03-03 18:57:27 +053054/**
55 * typedef struct module_trace_info - Trace level for a module, as a bitmask.
56 * The bits in this mask are ordered by QDF_TRACE_LEVEL. For example,
57 * each bit represents one of the bits in QDF_TRACE_LEVEL that may be turned
58 * on to have traces at that level logged, i.e. if QDF_TRACE_LEVEL_ERROR is
59 * == 2, then if bit 2 (low order) is turned ON, then ERROR traces will be
60 * printed to the trace log. Note that all bits turned OFF means no traces
61 * @module_trace_level: trace level
62 * @module_name_str: 3 character string name for the module
63 */
64typedef struct {
65 uint16_t module_trace_level;
66 unsigned char module_name_str[4];
67} module_trace_info;
68
Chouhan, Anurag57763182016-03-03 18:57:27 +053069/* Array of static data that contains all of the per module trace
70 * information. This includes the trace level for the module and
71 * the 3 character 'name' of the module for marking the trace logs
72 */
73module_trace_info g_qdf_trace_info[QDF_MODULE_ID_MAX] = {
74 [QDF_MODULE_ID_TLSHIM] = {QDF_DEFAULT_TRACE_LEVEL, "DP"},
75 [QDF_MODULE_ID_WMI] = {QDF_DEFAULT_TRACE_LEVEL, "WMI"},
76 [QDF_MODULE_ID_HDD] = {QDF_DEFAULT_TRACE_LEVEL, "HDD"},
77 [QDF_MODULE_ID_SME] = {QDF_DEFAULT_TRACE_LEVEL, "SME"},
78 [QDF_MODULE_ID_PE] = {QDF_DEFAULT_TRACE_LEVEL, "PE "},
79 [QDF_MODULE_ID_WMA] = {QDF_DEFAULT_TRACE_LEVEL, "WMA"},
80 [QDF_MODULE_ID_SYS] = {QDF_DEFAULT_TRACE_LEVEL, "SYS"},
81 [QDF_MODULE_ID_QDF] = {QDF_DEFAULT_TRACE_LEVEL, "QDF"},
82 [QDF_MODULE_ID_SAP] = {QDF_DEFAULT_TRACE_LEVEL, "SAP"},
83 [QDF_MODULE_ID_HDD_SOFTAP] = {QDF_DEFAULT_TRACE_LEVEL, "HSP"},
84 [QDF_MODULE_ID_HDD_DATA] = {QDF_DEFAULT_TRACE_LEVEL, "HDP"},
85 [QDF_MODULE_ID_HDD_SAP_DATA] = {QDF_DEFAULT_TRACE_LEVEL, "SDP"},
86 [QDF_MODULE_ID_BMI] = {QDF_DEFAULT_TRACE_LEVEL, "BMI"},
87 [QDF_MODULE_ID_HIF] = {QDF_DEFAULT_TRACE_LEVEL, "HIF"},
88 [QDF_MODULE_ID_TXRX] = {QDF_DEFAULT_TRACE_LEVEL, "TRX"},
89 [QDF_MODULE_ID_HTT] = {QDF_DEFAULT_TRACE_LEVEL, "HTT"},
Krunal Sonic4e35922017-02-01 14:59:01 -080090 [QDF_MODULE_ID_SERIALIZATION] = {QDF_DEFAULT_TRACE_LEVEL, "SER"},
Kiran Kumar Lokere43568a92017-03-31 15:50:26 -070091 [QDF_MODULE_ID_REGULATORY] = {QDF_DEFAULT_TRACE_LEVEL, "REG"},
Chouhan, Anurag57763182016-03-03 18:57:27 +053092};
93
94/* Static and Global variables */
95static spinlock_t ltrace_lock;
96
97static qdf_trace_record_t g_qdf_trace_tbl[MAX_QDF_TRACE_RECORDS];
98/* global qdf trace data */
99static t_qdf_trace_data g_qdf_trace_data;
100/*
101 * all the call back functions for dumping MTRACE messages from ring buffer
102 * are stored in qdf_trace_cb_table,these callbacks are initialized during init
103 * only so, we will make a copy of these call back functions and maintain in to
104 * qdf_trace_restore_cb_table. Incase if we make modifications to
105 * qdf_trace_cb_table, we can certainly retrieve all the call back functions
106 * back from Restore Table
107 */
108static tp_qdf_trace_cb qdf_trace_cb_table[QDF_MODULE_ID_MAX];
109static tp_qdf_trace_cb qdf_trace_restore_cb_table[QDF_MODULE_ID_MAX];
Padma, Santhosh Kumar75394d62016-08-11 16:33:03 +0530110static tp_qdf_state_info_cb qdf_state_info_table[QDF_MODULE_ID_MAX];
Chouhan, Anurag57763182016-03-03 18:57:27 +0530111
Nandha Kishore Easwarane43583f2017-05-15 21:01:13 +0530112#ifdef CONFIG_DP_TRACE
Chouhan, Anurag57763182016-03-03 18:57:27 +0530113/* Static and Global variables */
114static spinlock_t l_dp_trace_lock;
115
116static struct qdf_dp_trace_record_s
117 g_qdf_dp_trace_tbl[MAX_QDF_DP_TRACE_RECORDS];
118
119/*
120 * all the options to configure/control DP trace are
121 * defined in this structure
122 */
123static struct s_qdf_dp_trace_data g_qdf_dp_trace_data;
124/*
125 * all the call back functions for dumping DPTRACE messages from ring buffer
126 * are stored in qdf_dp_trace_cb_table, callbacks are initialized during init
127 */
Mohit Khanna7750a172017-05-15 15:53:33 -0700128static tp_qdf_dp_trace_cb qdf_dp_trace_cb_table[QDF_DP_TRACE_MAX + 1];
Nirav Shahae6a0b32016-04-26 11:44:42 +0530129#endif
Sathish Kumarfebd4b72017-01-10 12:19:19 +0530130
Chouhan, Anurag57763182016-03-03 18:57:27 +0530131/**
132 * qdf_trace_set_level() - Set the trace level for a particular module
133 * @module: Module id
134 * @level : trace level
135 *
136 * Trace level is a member of the QDF_TRACE_LEVEL enumeration indicating
137 * the severity of the condition causing the trace message to be issued.
138 * More severe conditions are more likely to be logged.
139 *
140 * This is an external API that allows trace levels to be set for each module.
141 *
142 * Return: None
143 */
144void qdf_trace_set_level(QDF_MODULE_ID module, QDF_TRACE_LEVEL level)
145{
146 /* make sure the caller is passing in a valid LEVEL */
147 if (level >= QDF_TRACE_LEVEL_MAX) {
148 pr_err("%s: Invalid trace level %d passed in!\n", __func__,
149 level);
150 return;
151 }
152
153 /* Treat 'none' differently. NONE means we have to run off all
154 * the bits in the bit mask so none of the traces appear. Anything
155 * other than 'none' means we need to turn ON a bit in the bitmask
156 */
157 if (QDF_TRACE_LEVEL_NONE == level)
158 g_qdf_trace_info[module].module_trace_level =
159 QDF_TRACE_LEVEL_NONE;
160 else
161 /* set the desired bit in the bit mask for the module trace
Srinivas Girigowda43977f72017-04-03 09:17:46 -0700162 * level
163 */
Chouhan, Anurag57763182016-03-03 18:57:27 +0530164 g_qdf_trace_info[module].module_trace_level |=
165 QDF_TRACE_LEVEL_TO_MODULE_BITMASK(level);
166}
167EXPORT_SYMBOL(qdf_trace_set_level);
168
169/**
170 * qdf_trace_set_module_trace_level() - Set module trace level
171 * @module: Module id
172 * @level: Trace level for a module, as a bitmask as per 'module_trace_info'
173 *
174 * Sets the module trace level where the trace level is given as a bit mask
175 *
176 * Return: None
177 */
178void qdf_trace_set_module_trace_level(QDF_MODULE_ID module, uint32_t level)
179{
180 if (module < 0 || module >= QDF_MODULE_ID_MAX) {
181 pr_err("%s: Invalid module id %d passed\n", __func__, module);
182 return;
183 }
184 g_qdf_trace_info[module].module_trace_level = level;
185}
186EXPORT_SYMBOL(qdf_trace_set_module_trace_level);
187
188/**
189 * qdf_trace_set_value() - Set module trace value
190 * @module: Module id
191 * @level: Trace level for a module, as a bitmask as per 'module_trace_info'
192 * @on: set/clear the desired bit in the bit mask
193 *
194 * Return: None
195 */
196void qdf_trace_set_value(QDF_MODULE_ID module, QDF_TRACE_LEVEL level,
197 uint8_t on)
198{
199 /* make sure the caller is passing in a valid LEVEL */
200 if (level < 0 || level >= QDF_TRACE_LEVEL_MAX) {
201 pr_err("%s: Invalid trace level %d passed in!\n", __func__,
202 level);
203 return;
204 }
205
206 /* make sure the caller is passing in a valid module */
207 if (module < 0 || module >= QDF_MODULE_ID_MAX) {
208 pr_err("%s: Invalid module id %d passed in!\n", __func__,
209 module);
210 return;
211 }
212
213 /* Treat 'none' differently. NONE means we have to turn off all
Srinivas Girigowda43977f72017-04-03 09:17:46 -0700214 * the bits in the bit mask so none of the traces appear
215 */
Chouhan, Anurag57763182016-03-03 18:57:27 +0530216 if (QDF_TRACE_LEVEL_NONE == level) {
217 g_qdf_trace_info[module].module_trace_level =
218 QDF_TRACE_LEVEL_NONE;
219 }
220 /* Treat 'All' differently. All means we have to turn on all
Srinivas Girigowda43977f72017-04-03 09:17:46 -0700221 * the bits in the bit mask so all of the traces appear
222 */
Chouhan, Anurag57763182016-03-03 18:57:27 +0530223 else if (QDF_TRACE_LEVEL_ALL == level) {
224 g_qdf_trace_info[module].module_trace_level = 0xFFFF;
225 } else {
226 if (on)
227 /* set the desired bit in the bit mask for the module
Srinivas Girigowda43977f72017-04-03 09:17:46 -0700228 * trace level
229 */
Chouhan, Anurag57763182016-03-03 18:57:27 +0530230 g_qdf_trace_info[module].module_trace_level |=
231 QDF_TRACE_LEVEL_TO_MODULE_BITMASK(level);
232 else
233 /* clear the desired bit in the bit mask for the module
Srinivas Girigowda43977f72017-04-03 09:17:46 -0700234 * trace level
235 */
Chouhan, Anurag57763182016-03-03 18:57:27 +0530236 g_qdf_trace_info[module].module_trace_level &=
237 ~(QDF_TRACE_LEVEL_TO_MODULE_BITMASK(level));
238 }
239}
240EXPORT_SYMBOL(qdf_trace_set_value);
241
242/**
243 * qdf_trace_get_level() - get the trace level
244 * @module: module Id
245 * @level: trace level
246 *
247 * This is an external API that returns a bool value to signify if a
248 * particular trace level is set for the specified module.
249 * A member of the QDF_TRACE_LEVEL enumeration indicating the severity
250 * of the condition causing the trace message to be issued.
251 *
252 * Note that individual trace levels are the only valid values
253 * for this API. QDF_TRACE_LEVEL_NONE and QDF_TRACE_LEVEL_ALL
254 * are not valid input and will return false
255 *
256 * Return:
257 * false - the specified trace level for the specified module is OFF
258 * true - the specified trace level for the specified module is ON
259 */
260bool qdf_trace_get_level(QDF_MODULE_ID module, QDF_TRACE_LEVEL level)
261{
262 bool trace_on = false;
263
264 if ((QDF_TRACE_LEVEL_NONE == level) ||
265 (QDF_TRACE_LEVEL_ALL == level) || (level >= QDF_TRACE_LEVEL_MAX)) {
266 trace_on = false;
267 } else {
268 trace_on = (level & g_qdf_trace_info[module].module_trace_level)
269 ? true : false;
270 }
271
272 return trace_on;
273}
274EXPORT_SYMBOL(qdf_trace_get_level);
275
276/**
277 * qdf_snprintf() - wrapper function to snprintf
278 * @str_buffer: string Buffer
279 * @size: defines the size of the data record
280 * @str_format: Format string in which the message to be logged. This format
281 * string contains printf-like replacement parameters, which follow
282 * this parameter in the variable argument list.
283 *
284 * Return: None
285 */
286void qdf_snprintf(char *str_buffer, unsigned int size, char *str_format, ...)
287{
288 va_list val;
289
290 va_start(val, str_format);
291 snprintf(str_buffer, size, str_format, val);
292 va_end(val);
293}
294EXPORT_SYMBOL(qdf_snprintf);
295
296#ifdef QDF_ENABLE_TRACING
297
298/**
299 * qdf_trace_msg() - externally called trace function
300 * @module: Module identifier a member of the QDF_MODULE_ID
301 * enumeration that identifies the module issuing the trace message.
302 * @level: Trace level a member of the QDF_TRACE_LEVEL enumeration
303 * indicating the severity of the condition causing the trace message
304 * to be issued. More severe conditions are more likely to be logged.
305 * @str_format: Format string in which the message to be logged. This format
306 * string contains printf-like replacement parameters, which follow
307 * this parameter in the variable argument list.
308 *
309 * Checks the level of severity and accordingly prints the trace messages
310 *
311 * Return: None
312 */
313void qdf_trace_msg(QDF_MODULE_ID module, QDF_TRACE_LEVEL level,
314 char *str_format, ...)
315{
Sathish Kumarfebd4b72017-01-10 12:19:19 +0530316 va_list val;
Chouhan, Anurag57763182016-03-03 18:57:27 +0530317
Sathish Kumarfebd4b72017-01-10 12:19:19 +0530318 va_start(val, str_format);
319 qdf_trace_msg_cmn(qdf_pidx, module, level, str_format, val);
320 va_end(val);
Chouhan, Anurag57763182016-03-03 18:57:27 +0530321}
322EXPORT_SYMBOL(qdf_trace_msg);
323
Dustin Brown013400c2017-11-16 13:29:24 -0800324void qdf_vtrace_msg(QDF_MODULE_ID module, QDF_TRACE_LEVEL level,
325 char *str_format, va_list val)
326{
327 qdf_trace_msg_cmn(qdf_pidx, module, level, str_format, val);
328}
329EXPORT_SYMBOL(qdf_vtrace_msg);
330
Chouhan, Anurag57763182016-03-03 18:57:27 +0530331#define ROW_SIZE 16
332/* Buffer size = data bytes(2 hex chars plus space) + NULL */
333#define BUFFER_SIZE ((ROW_SIZE * 3) + 1)
334
335/**
336 * qdf_trace_hex_dump() - externally called hex dump function
337 * @module: Module identifier a member of the QDF_MODULE_ID enumeration that
338 * identifies the module issuing the trace message.
339 * @level: Trace level a member of the QDF_TRACE_LEVEL enumeration indicating
340 * the severity of the condition causing the trace message to be
341 * issued. More severe conditions are more likely to be logged.
342 * @data: The base address of the buffer to be logged.
343 * @buf_len: The size of the buffer to be logged.
344 *
345 * Checks the level of severity and accordingly prints the trace messages
346 *
347 * Return: None
348 */
349void qdf_trace_hex_dump(QDF_MODULE_ID module, QDF_TRACE_LEVEL level,
350 void *data, int buf_len)
351{
352 const u8 *ptr = data;
Adil Saeed Musthafafe366632017-08-14 13:09:20 -0700353 int i = 0;
Chouhan, Anurag57763182016-03-03 18:57:27 +0530354
Dustin Brownd7cfa492017-05-11 14:21:06 -0700355 if (!qdf_print_is_verbose_enabled(qdf_pidx, module, level))
Chouhan, Anurag57763182016-03-03 18:57:27 +0530356 return;
357
Adil Saeed Musthafafe366632017-08-14 13:09:20 -0700358 while (buf_len > 0) {
Dustin Brownd7cfa492017-05-11 14:21:06 -0700359 unsigned char linebuf[BUFFER_SIZE];
360 int linelen = min(buf_len, ROW_SIZE);
361
362 buf_len -= ROW_SIZE;
Chouhan, Anurag57763182016-03-03 18:57:27 +0530363
Adil Saeed Musthafafe366632017-08-14 13:09:20 -0700364 hex_dump_to_buffer(ptr, linelen, ROW_SIZE, 1,
Chouhan, Anurag57763182016-03-03 18:57:27 +0530365 linebuf, sizeof(linebuf), false);
366
367 qdf_trace_msg(module, level, "%.8x: %s", i, linebuf);
Adil Saeed Musthafafe366632017-08-14 13:09:20 -0700368 ptr += ROW_SIZE;
369 i += ROW_SIZE;
Chouhan, Anurag57763182016-03-03 18:57:27 +0530370 }
371}
Nandha Kishore Easwaran7249f0d2017-06-08 15:11:45 +0530372EXPORT_SYMBOL(qdf_trace_hex_dump);
Chouhan, Anurag57763182016-03-03 18:57:27 +0530373
374#endif
375
376/**
377 * qdf_trace_enable() - Enable MTRACE for specific modules
378 * @bitmask_of_module_id: Bitmask according to enum of the modules.
379 * 32[dec] = 0010 0000 [bin] <enum of HDD is 5>
380 * 64[dec] = 0100 0000 [bin] <enum of SME is 6>
381 * 128[dec] = 1000 0000 [bin] <enum of PE is 7>
382 * @enable: can be true or false true implies enabling MTRACE false implies
383 * disabling MTRACE.
384 *
385 * Enable MTRACE for specific modules whose bits are set in bitmask and enable
386 * is true. if enable is false it disables MTRACE for that module. set the
387 * bitmask according to enum value of the modules.
388 * This functions will be called when you issue ioctl as mentioned following
389 * [iwpriv wlan0 setdumplog <value> <enable>].
390 * <value> - Decimal number, i.e. 64 decimal value shows only SME module,
391 * 128 decimal value shows only PE module, 192 decimal value shows PE and SME.
392 *
393 * Return: None
394 */
395void qdf_trace_enable(uint32_t bitmask_of_module_id, uint8_t enable)
396{
397 int i;
Srinivas Girigowda43977f72017-04-03 09:17:46 -0700398
Chouhan, Anurag57763182016-03-03 18:57:27 +0530399 if (bitmask_of_module_id) {
400 for (i = 0; i < QDF_MODULE_ID_MAX; i++) {
401 if (((bitmask_of_module_id >> i) & 1)) {
402 if (enable) {
403 if (NULL !=
404 qdf_trace_restore_cb_table[i]) {
405 qdf_trace_cb_table[i] =
406 qdf_trace_restore_cb_table[i];
407 }
408 } else {
409 qdf_trace_restore_cb_table[i] =
410 qdf_trace_cb_table[i];
411 qdf_trace_cb_table[i] = NULL;
412 }
413 }
414 }
415 } else {
416 if (enable) {
417 for (i = 0; i < QDF_MODULE_ID_MAX; i++) {
418 if (NULL != qdf_trace_restore_cb_table[i]) {
419 qdf_trace_cb_table[i] =
420 qdf_trace_restore_cb_table[i];
421 }
422 }
423 } else {
424 for (i = 0; i < QDF_MODULE_ID_MAX; i++) {
425 qdf_trace_restore_cb_table[i] =
426 qdf_trace_cb_table[i];
427 qdf_trace_cb_table[i] = NULL;
428 }
429 }
430 }
431}
432EXPORT_SYMBOL(qdf_trace_enable);
433
434/**
435 * qdf_trace_init() - initializes qdf trace structures and variables
436 *
437 * Called immediately after cds_preopen, so that we can start recording HDD
438 * events ASAP.
439 *
440 * Return: None
441 */
442void qdf_trace_init(void)
443{
444 uint8_t i;
Srinivas Girigowda43977f72017-04-03 09:17:46 -0700445
Chouhan, Anurag57763182016-03-03 18:57:27 +0530446 g_qdf_trace_data.head = INVALID_QDF_TRACE_ADDR;
447 g_qdf_trace_data.tail = INVALID_QDF_TRACE_ADDR;
448 g_qdf_trace_data.num = 0;
449 g_qdf_trace_data.enable = true;
450 g_qdf_trace_data.dump_count = DEFAULT_QDF_TRACE_DUMP_COUNT;
451 g_qdf_trace_data.num_since_last_dump = 0;
452
453 for (i = 0; i < QDF_MODULE_ID_MAX; i++) {
454 qdf_trace_cb_table[i] = NULL;
455 qdf_trace_restore_cb_table[i] = NULL;
456 }
457}
458EXPORT_SYMBOL(qdf_trace_init);
459
Nandha Kishore Easwarane43583f2017-05-15 21:01:13 +0530460#ifdef CONFIG_MCL
461
Chouhan, Anurag57763182016-03-03 18:57:27 +0530462/**
463 * qdf_trace() - puts the messages in to ring-buffer
464 * @module: Enum of module, basically module id.
465 * @param: Code to be recorded
466 * @session: Session ID of the log
467 * @data: Actual message contents
468 *
469 * This function will be called from each module who wants record the messages
470 * in circular queue. Before calling this functions make sure you have
471 * registered your module with qdf through qdf_trace_register function.
472 *
473 * Return: None
474 */
475void qdf_trace(uint8_t module, uint8_t code, uint16_t session, uint32_t data)
476{
477 tp_qdf_trace_record rec = NULL;
478 unsigned long flags;
Sreelakshmi Konamkie2e31352016-10-27 15:00:57 +0530479 char time[18];
Chouhan, Anurag57763182016-03-03 18:57:27 +0530480
481 if (!g_qdf_trace_data.enable)
482 return;
483
484 /* if module is not registered, don't record for that module */
485 if (NULL == qdf_trace_cb_table[module])
486 return;
487
Sreelakshmi Konamkie2e31352016-10-27 15:00:57 +0530488 qdf_get_time_of_the_day_in_hr_min_sec_usec(time, sizeof(time));
Chouhan, Anurag57763182016-03-03 18:57:27 +0530489 /* Aquire the lock so that only one thread at a time can fill the ring
490 * buffer
491 */
492 spin_lock_irqsave(&ltrace_lock, flags);
493
494 g_qdf_trace_data.num++;
495
496 if (g_qdf_trace_data.num > MAX_QDF_TRACE_RECORDS)
497 g_qdf_trace_data.num = MAX_QDF_TRACE_RECORDS;
498
499 if (INVALID_QDF_TRACE_ADDR == g_qdf_trace_data.head) {
500 /* first record */
501 g_qdf_trace_data.head = 0;
502 g_qdf_trace_data.tail = 0;
503 } else {
504 /* queue is not empty */
505 uint32_t tail = g_qdf_trace_data.tail + 1;
506
507 if (MAX_QDF_TRACE_RECORDS == tail)
508 tail = 0;
509
510 if (g_qdf_trace_data.head == tail) {
511 /* full */
512 if (MAX_QDF_TRACE_RECORDS == ++g_qdf_trace_data.head)
513 g_qdf_trace_data.head = 0;
514 }
515 g_qdf_trace_data.tail = tail;
516 }
517
518 rec = &g_qdf_trace_tbl[g_qdf_trace_data.tail];
519 rec->code = code;
520 rec->session = session;
521 rec->data = data;
Sreelakshmi Konamkie2e31352016-10-27 15:00:57 +0530522 rec->qtime = qdf_get_log_timestamp();
523 scnprintf(rec->time, sizeof(rec->time), "%s", time);
Chouhan, Anurag57763182016-03-03 18:57:27 +0530524 rec->module = module;
525 rec->pid = (in_interrupt() ? 0 : current->pid);
526 g_qdf_trace_data.num_since_last_dump++;
527 spin_unlock_irqrestore(&ltrace_lock, flags);
528}
529EXPORT_SYMBOL(qdf_trace);
530
Nandha Kishore Easwarane43583f2017-05-15 21:01:13 +0530531#endif
532
Chouhan, Anurag57763182016-03-03 18:57:27 +0530533/**
534 * qdf_trace_spin_lock_init() - initializes the lock variable before use
535 *
536 * This function will be called from cds_alloc_global_context, we will have lock
537 * available to use ASAP
538 *
539 * Return: None
540 */
541QDF_STATUS qdf_trace_spin_lock_init(void)
542{
543 spin_lock_init(&ltrace_lock);
544
545 return QDF_STATUS_SUCCESS;
546}
547EXPORT_SYMBOL(qdf_trace_spin_lock_init);
548
549/**
550 * qdf_trace_register() - registers the call back functions
551 * @module_iD: enum value of module
552 * @qdf_trace_callback: call back functions to display the messages in
553 * particular format.
554 *
555 * Registers the call back functions to display the messages in particular
556 * format mentioned in these call back functions. This functions should be
557 * called by interested module in their init part as we will be ready to
558 * register as soon as modules are up.
559 *
560 * Return: None
561 */
562void qdf_trace_register(QDF_MODULE_ID module_iD,
563 tp_qdf_trace_cb qdf_trace_callback)
564{
565 qdf_trace_cb_table[module_iD] = qdf_trace_callback;
566}
567EXPORT_SYMBOL(qdf_trace_register);
568
569/**
570 * qdf_trace_dump_all() - Dump data from ring buffer via call back functions
571 * registered with QDF
572 * @p_mac: Context of particular module
573 * @code: Reason code
574 * @session: Session id of log
575 * @count: Number of lines to dump starting from tail to head
576 *
577 * This function will be called up on issueing ioctl call as mentioned following
578 * [iwpriv wlan0 dumplog 0 0 <n> <bitmask_of_module>]
579 *
580 * <n> - number lines to dump starting from tail to head.
581 *
582 * <bitmask_of_module> - if anybody wants to know how many messages were
583 * recorded for particular module/s mentioned by setbit in bitmask from last
584 * <n> messages. It is optional, if you don't provide then it will dump
585 * everything from buffer.
586 *
587 * Return: None
588 */
589void qdf_trace_dump_all(void *p_mac, uint8_t code, uint8_t session,
Nandha Kishore Easwarane43583f2017-05-15 21:01:13 +0530590 uint32_t count, uint32_t bitmask_of_module)
Chouhan, Anurag57763182016-03-03 18:57:27 +0530591{
592 qdf_trace_record_t p_record;
593 int32_t i, tail;
594
595 if (!g_qdf_trace_data.enable) {
596 QDF_TRACE(QDF_MODULE_ID_SYS,
597 QDF_TRACE_LEVEL_ERROR, "Tracing Disabled");
598 return;
599 }
600
601 QDF_TRACE(QDF_MODULE_ID_SYS, QDF_TRACE_LEVEL_INFO,
Mohit Khanna7750a172017-05-15 15:53:33 -0700602 "DPT: Total Records: %d, Head: %d, Tail: %d",
Chouhan, Anurag57763182016-03-03 18:57:27 +0530603 g_qdf_trace_data.num, g_qdf_trace_data.head,
604 g_qdf_trace_data.tail);
605
606 /* aquire the lock so that only one thread at a time can read
607 * the ring buffer
608 */
609 spin_lock(&ltrace_lock);
610
611 if (g_qdf_trace_data.head != INVALID_QDF_TRACE_ADDR) {
612 i = g_qdf_trace_data.head;
613 tail = g_qdf_trace_data.tail;
614
615 if (count) {
616 if (count > g_qdf_trace_data.num)
617 count = g_qdf_trace_data.num;
618 if (tail >= (count - 1))
619 i = tail - count + 1;
620 else if (count != MAX_QDF_TRACE_RECORDS)
621 i = MAX_QDF_TRACE_RECORDS - ((count - 1) -
622 tail);
623 }
624
625 p_record = g_qdf_trace_tbl[i];
626 /* right now we are not using num_since_last_dump member but
627 * in future we might re-visit and use this member to track
628 * how many latest messages got added while we were dumping
629 * from ring buffer
630 */
631 g_qdf_trace_data.num_since_last_dump = 0;
632 spin_unlock(&ltrace_lock);
633 for (;; ) {
634 if ((code == 0 || (code == p_record.code)) &&
635 (qdf_trace_cb_table[p_record.module] != NULL)) {
636 if (0 == bitmask_of_module) {
637 qdf_trace_cb_table[p_record.
638 module] (p_mac,
639 &p_record,
640 (uint16_t)
641 i);
642 } else {
643 if (bitmask_of_module &
644 (1 << p_record.module)) {
645 qdf_trace_cb_table[p_record.
646 module]
647 (p_mac, &p_record,
648 (uint16_t) i);
649 }
650 }
651 }
652
653 if (i == tail)
654 break;
655 i += 1;
656
657 spin_lock(&ltrace_lock);
658 if (MAX_QDF_TRACE_RECORDS == i) {
659 i = 0;
660 p_record = g_qdf_trace_tbl[0];
661 } else {
662 p_record = g_qdf_trace_tbl[i];
663 }
664 spin_unlock(&ltrace_lock);
665 }
666 } else {
667 spin_unlock(&ltrace_lock);
668 }
669}
670EXPORT_SYMBOL(qdf_trace_dump_all);
671
Padma, Santhosh Kumar75394d62016-08-11 16:33:03 +0530672/**
673 * qdf_register_debugcb_init() - initializes debug callbacks
674 * to NULL
675 *
676 * Return: None
677 */
678void qdf_register_debugcb_init(void)
679{
680 uint8_t i;
681
682 for (i = 0; i < QDF_MODULE_ID_MAX; i++)
683 qdf_state_info_table[i] = NULL;
684}
685EXPORT_SYMBOL(qdf_register_debugcb_init);
686
687/**
688 * qdf_register_debug_callback() - stores callback handlers to print
689 * state information
690 * @module_id: module id of layer
691 * @qdf_state_infocb: callback to be registered
692 *
693 * This function is used to store callback handlers to print
694 * state information
695 *
696 * Return: None
697 */
698void qdf_register_debug_callback(QDF_MODULE_ID module_id,
699 tp_qdf_state_info_cb qdf_state_infocb)
700{
701 qdf_state_info_table[module_id] = qdf_state_infocb;
702}
703EXPORT_SYMBOL(qdf_register_debug_callback);
704
705/**
706 * qdf_state_info_dump_all() - it invokes callback of layer which registered
707 * its callback to print its state information.
708 * @buf: buffer pointer to be passed
709 * @size: size of buffer to be filled
710 * @driver_dump_size: actual size of buffer used
711 *
712 * Return: QDF_STATUS_SUCCESS on success
713 */
714QDF_STATUS qdf_state_info_dump_all(char *buf, uint16_t size,
715 uint16_t *driver_dump_size)
716{
717 uint8_t module, ret = QDF_STATUS_SUCCESS;
718 uint16_t buf_len = size;
719 char *buf_ptr = buf;
720
721 for (module = 0; module < QDF_MODULE_ID_MAX; module++) {
722 if (NULL != qdf_state_info_table[module]) {
723 qdf_state_info_table[module](&buf_ptr, &buf_len);
724 if (!buf_len) {
725 ret = QDF_STATUS_E_NOMEM;
726 break;
727 }
728 }
729 }
730
731 *driver_dump_size = size - buf_len;
732 return ret;
733}
734EXPORT_SYMBOL(qdf_state_info_dump_all);
735
Nandha Kishore Easwarane43583f2017-05-15 21:01:13 +0530736#ifdef CONFIG_DP_TRACE
Houston Hoffman125423f2016-09-27 23:39:17 -0700737static void qdf_dp_unused(struct qdf_dp_trace_record_s *record,
Mohit Khanna7750a172017-05-15 15:53:33 -0700738 uint16_t index, uint8_t pdev_id, bool live)
Houston Hoffman125423f2016-09-27 23:39:17 -0700739{
740 qdf_print("%s: QDF_DP_TRACE_MAX event should not be generated",
741 __func__);
742}
743
Chouhan, Anurag57763182016-03-03 18:57:27 +0530744/**
745 * qdf_dp_trace_init() - enables the DP trace
Mohit Khanna7750a172017-05-15 15:53:33 -0700746 * @live_mode_config: live mode configuration
747 * @thresh: high throughput threshold for disabling live mode
748 * @thresh_time_limit: max time to wait before deciding if thresh is crossed
749 * @verbosity: dptrace verbosity level
750 * @proto_bitmap: bitmap to enable/disable specific protocols
Chouhan, Anurag57763182016-03-03 18:57:27 +0530751 *
Mohit Khanna7750a172017-05-15 15:53:33 -0700752 * Called during driver load to init dptrace
753 *
754 * A brief note on the 'thresh' param -
755 * Total # of packets received in a bandwidth timer interval beyond which
756 * DP Trace logging for data packets (including ICMP) will be disabled.
757 * In memory logging will still continue for these packets. Other packets for
758 * which proto.bitmap is set will continue to be recorded in logs and in memory.
759
Chouhan, Anurag57763182016-03-03 18:57:27 +0530760 * Return: None
761 */
Mohit Khanna7750a172017-05-15 15:53:33 -0700762void qdf_dp_trace_init(bool live_mode_config, uint8_t thresh,
763 uint16_t time_limit, uint8_t verbosity,
764 uint8_t proto_bitmap)
Chouhan, Anurag57763182016-03-03 18:57:27 +0530765{
766 uint8_t i;
767
768 qdf_dp_trace_spin_lock_init();
Zhu Jianminaf3420a2017-06-12 17:55:43 +0800769 qdf_dp_trace_clear_buffer();
Mohit Khanna7750a172017-05-15 15:53:33 -0700770 g_qdf_dp_trace_data.enable = true;
771 g_qdf_dp_trace_data.no_of_record = 1;
772
773 g_qdf_dp_trace_data.live_mode_config = live_mode_config;
774 g_qdf_dp_trace_data.live_mode = live_mode_config;
775 g_qdf_dp_trace_data.high_tput_thresh = thresh;
776 g_qdf_dp_trace_data.thresh_time_limit = time_limit;
777 g_qdf_dp_trace_data.proto_bitmap = proto_bitmap;
778 g_qdf_dp_trace_data.verbosity = verbosity;
Chouhan, Anurag57763182016-03-03 18:57:27 +0530779
Houston Hoffman125423f2016-09-27 23:39:17 -0700780 for (i = 0; i < ARRAY_SIZE(qdf_dp_trace_cb_table); i++)
Chouhan, Anurag57763182016-03-03 18:57:27 +0530781 qdf_dp_trace_cb_table[i] = qdf_dp_display_record;
Nirav Shaheaa20d82016-04-25 18:01:05 +0530782
783 qdf_dp_trace_cb_table[QDF_DP_TRACE_TXRX_PACKET_PTR_RECORD] =
784 qdf_dp_trace_cb_table[QDF_DP_TRACE_TXRX_FAST_PACKET_PTR_RECORD] =
785 qdf_dp_trace_cb_table[QDF_DP_TRACE_FREE_PACKET_PTR_RECORD] =
786 qdf_dp_display_ptr_record;
787 qdf_dp_trace_cb_table[QDF_DP_TRACE_EAPOL_PACKET_RECORD] =
788 qdf_dp_trace_cb_table[QDF_DP_TRACE_DHCP_PACKET_RECORD] =
789 qdf_dp_trace_cb_table[QDF_DP_TRACE_ARP_PACKET_RECORD] =
Zhu Jianminaf3420a2017-06-12 17:55:43 +0800790 qdf_dp_trace_cb_table[QDF_DP_TRACE_ICMP_PACKET_RECORD] =
Poddar, Siddarthbf4231b2017-07-10 16:27:01 +0530791 qdf_dp_trace_cb_table[QDF_DP_TRACE_ICMPv6_PACKET_RECORD] =
Nirav Shaheaa20d82016-04-25 18:01:05 +0530792 qdf_dp_display_proto_pkt;
Nirav Shah31d694b2016-05-03 20:18:22 +0530793 qdf_dp_trace_cb_table[QDF_DP_TRACE_MGMT_PACKET_RECORD] =
794 qdf_dp_display_mgmt_pkt;
Himanshu Agarwalc0b71452016-09-20 15:10:55 +0530795 qdf_dp_trace_cb_table[QDF_DP_TRACE_EVENT_RECORD] =
796 qdf_dp_display_event_record;
Nirav Shaheaa20d82016-04-25 18:01:05 +0530797
Houston Hoffman125423f2016-09-27 23:39:17 -0700798 qdf_dp_trace_cb_table[QDF_DP_TRACE_MAX] = qdf_dp_unused;
Chouhan, Anurag57763182016-03-03 18:57:27 +0530799}
800EXPORT_SYMBOL(qdf_dp_trace_init);
801
802/**
803 * qdf_dp_trace_set_value() - Configure the value to control DP trace
804 * @proto_bitmap: defines the protocol to be tracked
805 * @no_of_records: defines the nth packet which is traced
806 * @verbosity: defines the verbosity level
807 *
808 * Return: None
809 */
810void qdf_dp_trace_set_value(uint8_t proto_bitmap, uint8_t no_of_record,
811 uint8_t verbosity)
812{
813 g_qdf_dp_trace_data.proto_bitmap = proto_bitmap;
814 g_qdf_dp_trace_data.no_of_record = no_of_record;
815 g_qdf_dp_trace_data.verbosity = verbosity;
Chouhan, Anurag57763182016-03-03 18:57:27 +0530816}
817EXPORT_SYMBOL(qdf_dp_trace_set_value);
818
819/**
Nandha Kishore Easwarane43583f2017-05-15 21:01:13 +0530820 * qdf_dp_trace_set_verbosity() - set verbosity value
821 *
822 * @val: Value to set
823 *
824 * Return: Null
825 */
826void qdf_dp_trace_set_verbosity(uint32_t val)
827{
828 g_qdf_dp_trace_data.verbosity = val;
829}
830EXPORT_SYMBOL(qdf_dp_trace_set_verbosity);
831
832/**
833 * qdf_dp_get_verbosity) - get verbosity value
834 *
835 * Return: int
836 */
837uint8_t qdf_dp_get_verbosity(void)
838{
839 return g_qdf_dp_trace_data.verbosity;
840}
841EXPORT_SYMBOL(qdf_dp_get_verbosity);
842
843/**
844 * qdf_dp_set_proto_bitmap() - set dp trace proto bitmap
845 *
846 * @val : unsigned bitmap to set
847 *
848 * Return: proto bitmap
849 */
850void qdf_dp_set_proto_bitmap(uint32_t val)
851{
852 g_qdf_dp_trace_data.proto_bitmap = val;
853}
854EXPORT_SYMBOL(qdf_dp_set_proto_bitmap);
855
856/**
857 * qdf_dp_set_no_of_record() - set dp trace no_of_record
858 *
859 * @val : unsigned no_of_record to set
860 *
861 * Return: null
862 */
863void qdf_dp_set_no_of_record(uint32_t val)
864{
865 g_qdf_dp_trace_data.no_of_record = val;
866}
867EXPORT_SYMBOL(qdf_dp_set_no_of_record);
868
869/**
870 * qdf_dp_get_no_of_record() - get dp trace no_of_record
871 *
872 * Return: number of records
873 */
874uint8_t qdf_dp_get_no_of_record(void)
875{
876 return g_qdf_dp_trace_data.no_of_record;
877}
878EXPORT_SYMBOL(qdf_dp_get_no_of_record);
879
880
881/**
Chouhan, Anurag57763182016-03-03 18:57:27 +0530882 * qdf_dp_trace_enable_track() - enable the tracing for netbuf
883 * @code: defines the event
884 *
Nirav Shaheaa20d82016-04-25 18:01:05 +0530885 * In High verbosity all codes are logged.
886 * For Med/Low and Default case code which has
887 * less value than corresponding verbosity codes
888 * are logged.
889 *
Chouhan, Anurag57763182016-03-03 18:57:27 +0530890 * Return: true or false depends on whether tracing enabled
891 */
892static bool qdf_dp_trace_enable_track(enum QDF_DP_TRACE_ID code)
893{
Nirav Shaheaa20d82016-04-25 18:01:05 +0530894 switch (g_qdf_dp_trace_data.verbosity) {
895 case QDF_DP_TRACE_VERBOSITY_HIGH:
Chouhan, Anurag57763182016-03-03 18:57:27 +0530896 return true;
Nirav Shaheaa20d82016-04-25 18:01:05 +0530897 case QDF_DP_TRACE_VERBOSITY_MEDIUM:
898 if (code <= QDF_DP_TRACE_MED_VERBOSITY)
899 return true;
900 return false;
901 case QDF_DP_TRACE_VERBOSITY_LOW:
902 if (code <= QDF_DP_TRACE_LOW_VERBOSITY)
903 return true;
904 return false;
Mohit Khanna7750a172017-05-15 15:53:33 -0700905 case QDF_DP_TRACE_VERBOSITY_BASE:
906 if (code <= QDF_DP_TRACE_BASE_VERBOSITY)
Nirav Shaheaa20d82016-04-25 18:01:05 +0530907 return true;
908 return false;
909 default:
910 return false;
911 }
Chouhan, Anurag57763182016-03-03 18:57:27 +0530912}
913EXPORT_SYMBOL(qdf_dp_trace_enable_track);
914
915/**
Nirav Shaheaa20d82016-04-25 18:01:05 +0530916 * qdf_dp_get_proto_bitmap() - get dp trace proto bitmap
917 *
918 * Return: proto bitmap
919 */
920uint8_t qdf_dp_get_proto_bitmap(void)
921{
922 if (g_qdf_dp_trace_data.enable)
923 return g_qdf_dp_trace_data.proto_bitmap;
924 else
925 return 0;
926}
927
928/**
Chouhan, Anurag57763182016-03-03 18:57:27 +0530929 * qdf_dp_trace_set_track() - Marks whether the packet needs to be traced
930 * @nbuf: defines the netbuf
Nirav Shah29beae02016-04-26 22:58:54 +0530931 * @dir: direction
Chouhan, Anurag57763182016-03-03 18:57:27 +0530932 *
933 * Return: None
934 */
Nirav Shah29beae02016-04-26 22:58:54 +0530935void qdf_dp_trace_set_track(qdf_nbuf_t nbuf, enum qdf_proto_dir dir)
Chouhan, Anurag57763182016-03-03 18:57:27 +0530936{
Nirav Shah29beae02016-04-26 22:58:54 +0530937 uint32_t count = 0;
938
Mohit Khanna7750a172017-05-15 15:53:33 -0700939 if (!g_qdf_dp_trace_data.enable)
940 return;
941
Chouhan, Anurag57763182016-03-03 18:57:27 +0530942 spin_lock_bh(&l_dp_trace_lock);
Nirav Shah29beae02016-04-26 22:58:54 +0530943 if (QDF_TX == dir)
944 count = ++g_qdf_dp_trace_data.tx_count;
945 else if (QDF_RX == dir)
946 count = ++g_qdf_dp_trace_data.rx_count;
947
Chouhan, Anurag57763182016-03-03 18:57:27 +0530948 if ((g_qdf_dp_trace_data.no_of_record != 0) &&
Nirav Shah29beae02016-04-26 22:58:54 +0530949 (count % g_qdf_dp_trace_data.no_of_record == 0)) {
950 if (QDF_TX == dir)
951 QDF_NBUF_CB_TX_DP_TRACE(nbuf) = 1;
952 else if (QDF_RX == dir)
953 QDF_NBUF_CB_RX_DP_TRACE(nbuf) = 1;
Chouhan, Anurag57763182016-03-03 18:57:27 +0530954 }
955 spin_unlock_bh(&l_dp_trace_lock);
Chouhan, Anurag57763182016-03-03 18:57:27 +0530956}
957EXPORT_SYMBOL(qdf_dp_trace_set_track);
Nandha Kishore Easwaran403b0852017-07-14 17:27:53 +0530958
Houston Hoffmanbba5ca62016-11-12 14:24:58 -0800959#define DPTRACE_PRINT(args...) \
Himanshu Agarwal26cfe7e2017-05-08 15:01:07 +0530960 QDF_TRACE(QDF_MODULE_ID_QDF, QDF_TRACE_LEVEL_DEBUG, ## args)
Houston Hoffmanbba5ca62016-11-12 14:24:58 -0800961
Chouhan, Anurag57763182016-03-03 18:57:27 +0530962/**
963 * dump_hex_trace() - Display the data in buffer
Houston Hoffman8a353932016-11-14 12:58:22 -0800964 * @str: string to prepend the hexdump with.
Chouhan, Anurag57763182016-03-03 18:57:27 +0530965 * @buf: buffer which contains data to be displayed
966 * @buf_len: defines the size of the data to be displayed
967 *
968 * Return: None
969 */
Mohit Khanna7750a172017-05-15 15:53:33 -0700970static void dump_dp_hex_trace(char *str, uint8_t *buf, uint8_t buf_len)
Chouhan, Anurag57763182016-03-03 18:57:27 +0530971{
Nirav Shaheaa20d82016-04-25 18:01:05 +0530972 unsigned char linebuf[BUFFER_SIZE];
973 const u8 *ptr = buf;
974 int i, linelen, remaining = buf_len;
975
Chouhan, Anurag57763182016-03-03 18:57:27 +0530976 /* Dump the bytes in the last line */
Nirav Shaheaa20d82016-04-25 18:01:05 +0530977 for (i = 0; i < buf_len; i += ROW_SIZE) {
978 linelen = min(remaining, ROW_SIZE);
979 remaining -= ROW_SIZE;
980
981 hex_dump_to_buffer(ptr + i, linelen, ROW_SIZE, 1,
982 linebuf, sizeof(linebuf), false);
983
Mohit Khanna7750a172017-05-15 15:53:33 -0700984 DPTRACE_PRINT("DPT: %s %s", str, linebuf);
Nirav Shaheaa20d82016-04-25 18:01:05 +0530985 }
Chouhan, Anurag57763182016-03-03 18:57:27 +0530986}
Chouhan, Anurag57763182016-03-03 18:57:27 +0530987
988/**
Nirav Shaheaa20d82016-04-25 18:01:05 +0530989 * qdf_dp_code_to_string() - convert dptrace code to string
990 * @code: dptrace code
Chouhan, Anurag57763182016-03-03 18:57:27 +0530991 *
Nirav Shaheaa20d82016-04-25 18:01:05 +0530992 * Return: string version of code
Chouhan, Anurag57763182016-03-03 18:57:27 +0530993 */
Jeff Johnson4729b6f2016-10-07 13:02:43 -0700994static
Nirav Shaheaa20d82016-04-25 18:01:05 +0530995const char *qdf_dp_code_to_string(enum QDF_DP_TRACE_ID code)
Chouhan, Anurag57763182016-03-03 18:57:27 +0530996{
Nirav Shaheaa20d82016-04-25 18:01:05 +0530997 switch (code) {
998 case QDF_DP_TRACE_DROP_PACKET_RECORD:
999 return "DROP:";
1000 case QDF_DP_TRACE_EAPOL_PACKET_RECORD:
1001 return "EAPOL:";
1002 case QDF_DP_TRACE_DHCP_PACKET_RECORD:
1003 return "DHCP:";
1004 case QDF_DP_TRACE_ARP_PACKET_RECORD:
1005 return "ARP:";
Zhu Jianminaf3420a2017-06-12 17:55:43 +08001006 case QDF_DP_TRACE_ICMP_PACKET_RECORD:
1007 return "ICMP:";
Poddar, Siddarthbf4231b2017-07-10 16:27:01 +05301008 case QDF_DP_TRACE_ICMPv6_PACKET_RECORD:
1009 return "ICMPv6:";
Nirav Shah31d694b2016-05-03 20:18:22 +05301010 case QDF_DP_TRACE_MGMT_PACKET_RECORD:
1011 return "MGMT:";
Himanshu Agarwalc0b71452016-09-20 15:10:55 +05301012 case QDF_DP_TRACE_EVENT_RECORD:
1013 return "EVENT:";
Nirav Shah29beae02016-04-26 22:58:54 +05301014 case QDF_DP_TRACE_HDD_TX_PACKET_PTR_RECORD:
1015 return "HDD: TX: PTR:";
Nandha Kishore Easwarane43583f2017-05-15 21:01:13 +05301016 case QDF_DP_TRACE_LI_DP_TX_PACKET_PTR_RECORD:
1017 return "LI_DP: TX: PTR:";
Nirav Shah29beae02016-04-26 22:58:54 +05301018 case QDF_DP_TRACE_HDD_TX_PACKET_RECORD:
1019 return "HDD: TX: DATA:";
Nandha Kishore Easwarane43583f2017-05-15 21:01:13 +05301020 case QDF_DP_TRACE_LI_DP_TX_PACKET_RECORD:
1021 return "LI_DP: TX: DATA:";
Nirav Shaheaa20d82016-04-25 18:01:05 +05301022 case QDF_DP_TRACE_CE_PACKET_PTR_RECORD:
Nirav Shah29beae02016-04-26 22:58:54 +05301023 return "CE: TX: PTR:";
Nirav Shaheaa20d82016-04-25 18:01:05 +05301024 case QDF_DP_TRACE_CE_FAST_PACKET_PTR_RECORD:
Nirav Shah29beae02016-04-26 22:58:54 +05301025 return "CE: TX: FAST: PTR:";
Nirav Shaheaa20d82016-04-25 18:01:05 +05301026 case QDF_DP_TRACE_FREE_PACKET_PTR_RECORD:
Nirav Shah29beae02016-04-26 22:58:54 +05301027 return "FREE: TX: PTR:";
1028 case QDF_DP_TRACE_RX_HTT_PACKET_PTR_RECORD:
1029 return "HTT: RX: PTR:";
1030 case QDF_DP_TRACE_RX_OFFLOAD_HTT_PACKET_PTR_RECORD:
1031 return "HTT: RX: OF: PTR:";
1032 case QDF_DP_TRACE_RX_HDD_PACKET_PTR_RECORD:
1033 return "HDD: RX: PTR:";
Nandha Kishore Easwarane43583f2017-05-15 21:01:13 +05301034 case QDF_DP_TRACE_RX_LI_DP_PACKET_PTR_RECORD:
1035 return "LI_DP: RX: PTR:";
Himanshu Agarwalf30a9e92017-01-31 12:57:48 +05301036 case QDF_DP_TRACE_HDD_RX_PACKET_RECORD:
1037 return "HDD: RX: DATA:";
Nandha Kishore Easwarane43583f2017-05-15 21:01:13 +05301038 case QDF_DP_TRACE_LI_DP_RX_PACKET_RECORD:
1039 return "LI_DP: RX: DATA:";
1040 case QDF_DP_TRACE_LI_DP_NULL_RX_PACKET_RECORD:
1041 return "LI_DP_NULL: RX: DATA:";
Nirav Shaheaa20d82016-04-25 18:01:05 +05301042 case QDF_DP_TRACE_TXRX_QUEUE_PACKET_PTR_RECORD:
Nirav Shah29beae02016-04-26 22:58:54 +05301043 return "TXRX: TX: Q: PTR:";
Nirav Shaheaa20d82016-04-25 18:01:05 +05301044 case QDF_DP_TRACE_TXRX_PACKET_PTR_RECORD:
Nirav Shah29beae02016-04-26 22:58:54 +05301045 return "TXRX: TX: PTR:";
Nirav Shaheaa20d82016-04-25 18:01:05 +05301046 case QDF_DP_TRACE_TXRX_FAST_PACKET_PTR_RECORD:
Nirav Shah29beae02016-04-26 22:58:54 +05301047 return "TXRX: TX: FAST: PTR:";
Nirav Shaheaa20d82016-04-25 18:01:05 +05301048 case QDF_DP_TRACE_HTT_PACKET_PTR_RECORD:
Nirav Shah29beae02016-04-26 22:58:54 +05301049 return "HTT: TX: PTR:";
Nirav Shaheaa20d82016-04-25 18:01:05 +05301050 case QDF_DP_TRACE_HTC_PACKET_PTR_RECORD:
Nirav Shah29beae02016-04-26 22:58:54 +05301051 return "HTC: TX: PTR:";
Nirav Shaheaa20d82016-04-25 18:01:05 +05301052 case QDF_DP_TRACE_HIF_PACKET_PTR_RECORD:
Nirav Shah29beae02016-04-26 22:58:54 +05301053 return "HIF: TX: PTR:";
1054 case QDF_DP_TRACE_RX_TXRX_PACKET_PTR_RECORD:
1055 return "TXRX: RX: PTR:";
Nirav Shaheaa20d82016-04-25 18:01:05 +05301056 case QDF_DP_TRACE_HDD_TX_TIMEOUT:
Nirav Shah29beae02016-04-26 22:58:54 +05301057 return "HDD: STA: TO:";
Nirav Shaheaa20d82016-04-25 18:01:05 +05301058 case QDF_DP_TRACE_HDD_SOFTAP_TX_TIMEOUT:
Nirav Shah29beae02016-04-26 22:58:54 +05301059 return "HDD: SAP: TO:";
Chouhan, Anurag57763182016-03-03 18:57:27 +05301060 default:
Nirav Shaheaa20d82016-04-25 18:01:05 +05301061 return "Invalid";
Chouhan, Anurag57763182016-03-03 18:57:27 +05301062 }
Chouhan, Anurag57763182016-03-03 18:57:27 +05301063}
Chouhan, Anurag57763182016-03-03 18:57:27 +05301064
1065/**
Nirav Shaheaa20d82016-04-25 18:01:05 +05301066 * qdf_dp_dir_to_str() - convert direction to string
1067 * @dir: direction
Chouhan, Anurag57763182016-03-03 18:57:27 +05301068 *
Nirav Shaheaa20d82016-04-25 18:01:05 +05301069 * Return: string version of direction
Chouhan, Anurag57763182016-03-03 18:57:27 +05301070 */
Jeff Johnson4729b6f2016-10-07 13:02:43 -07001071static const char *qdf_dp_dir_to_str(enum qdf_proto_dir dir)
Chouhan, Anurag57763182016-03-03 18:57:27 +05301072{
Nirav Shaheaa20d82016-04-25 18:01:05 +05301073 switch (dir) {
1074 case QDF_TX:
Nirav Shah29beae02016-04-26 22:58:54 +05301075 return " --> ";
Nirav Shaheaa20d82016-04-25 18:01:05 +05301076 case QDF_RX:
Nirav Shah29beae02016-04-26 22:58:54 +05301077 return " <-- ";
Nirav Shaheaa20d82016-04-25 18:01:05 +05301078 default:
1079 return "invalid";
1080 }
1081}
Chouhan, Anurag57763182016-03-03 18:57:27 +05301082
Nirav Shaheaa20d82016-04-25 18:01:05 +05301083/**
1084 * qdf_dp_type_to_str() - convert packet type to string
1085 * @type: type
1086 *
1087 * Return: string version of packet type
1088 */
Jeff Johnson4729b6f2016-10-07 13:02:43 -07001089static const char *qdf_dp_type_to_str(enum qdf_proto_type type)
Nirav Shaheaa20d82016-04-25 18:01:05 +05301090{
1091 switch (type) {
1092 case QDF_PROTO_TYPE_DHCP:
1093 return "DHCP";
1094 case QDF_PROTO_TYPE_EAPOL:
1095 return "EAPOL";
1096 case QDF_PROTO_TYPE_ARP:
1097 return "ARP";
Zhu Jianminaf3420a2017-06-12 17:55:43 +08001098 case QDF_PROTO_TYPE_ICMP:
1099 return "ICMP";
Poddar, Siddarthbf4231b2017-07-10 16:27:01 +05301100 case QDF_PROTO_TYPE_ICMPv6:
1101 return "ICMPv6";
Nirav Shah31d694b2016-05-03 20:18:22 +05301102 case QDF_PROTO_TYPE_MGMT:
1103 return "MGMT";
Himanshu Agarwalc0b71452016-09-20 15:10:55 +05301104 case QDF_PROTO_TYPE_EVENT:
1105 return "EVENT";
Nirav Shaheaa20d82016-04-25 18:01:05 +05301106 default:
1107 return "invalid";
1108 }
1109}
Nirav Shaheaa20d82016-04-25 18:01:05 +05301110
1111/**
1112 * qdf_dp_subtype_to_str() - convert packet subtype to string
1113 * @type: type
1114 *
1115 * Return: string version of packet subtype
1116 */
Jeff Johnson4729b6f2016-10-07 13:02:43 -07001117static const char *qdf_dp_subtype_to_str(enum qdf_proto_subtype subtype)
Nirav Shaheaa20d82016-04-25 18:01:05 +05301118{
1119 switch (subtype) {
1120 case QDF_PROTO_EAPOL_M1:
1121 return "M1";
1122 case QDF_PROTO_EAPOL_M2:
1123 return "M2";
1124 case QDF_PROTO_EAPOL_M3:
1125 return "M3";
1126 case QDF_PROTO_EAPOL_M4:
1127 return "M4";
1128 case QDF_PROTO_DHCP_DISCOVER:
Mohit Khanna7750a172017-05-15 15:53:33 -07001129 return "DISC";
Nirav Shaheaa20d82016-04-25 18:01:05 +05301130 case QDF_PROTO_DHCP_REQUEST:
Mohit Khanna7750a172017-05-15 15:53:33 -07001131 return "REQ";
Nirav Shaheaa20d82016-04-25 18:01:05 +05301132 case QDF_PROTO_DHCP_OFFER:
Mohit Khanna7750a172017-05-15 15:53:33 -07001133 return "OFF";
Nirav Shaheaa20d82016-04-25 18:01:05 +05301134 case QDF_PROTO_DHCP_ACK:
1135 return "ACK";
1136 case QDF_PROTO_DHCP_NACK:
1137 return "NACK";
1138 case QDF_PROTO_DHCP_RELEASE:
Mohit Khanna7750a172017-05-15 15:53:33 -07001139 return "REL";
Nirav Shaheaa20d82016-04-25 18:01:05 +05301140 case QDF_PROTO_DHCP_INFORM:
1141 return "INFORM";
1142 case QDF_PROTO_DHCP_DECLINE:
Mohit Khanna7750a172017-05-15 15:53:33 -07001143 return "DECL";
Nirav Shahcede2892016-05-19 12:41:15 +05301144 case QDF_PROTO_ARP_REQ:
Zhu Jianminaf3420a2017-06-12 17:55:43 +08001145 case QDF_PROTO_ICMP_REQ:
Poddar, Siddarthbf4231b2017-07-10 16:27:01 +05301146 case QDF_PROTO_ICMPV6_REQ:
Mohit Khanna7750a172017-05-15 15:53:33 -07001147 return "REQ";
Nirav Shahcede2892016-05-19 12:41:15 +05301148 case QDF_PROTO_ARP_RES:
Zhu Jianminaf3420a2017-06-12 17:55:43 +08001149 case QDF_PROTO_ICMP_RES:
Poddar, Siddarthbf4231b2017-07-10 16:27:01 +05301150 case QDF_PROTO_ICMPV6_RES:
Mohit Khanna7750a172017-05-15 15:53:33 -07001151 return "RSP";
Poddar, Siddarthbf4231b2017-07-10 16:27:01 +05301152 case QDF_PROTO_ICMPV6_RS:
1153 return "RS";
1154 case QDF_PROTO_ICMPV6_RA:
1155 return "RA";
1156 case QDF_PROTO_ICMPV6_NS:
1157 return "NS";
1158 case QDF_PROTO_ICMPV6_NA:
1159 return "NA";
Nirav Shah31d694b2016-05-03 20:18:22 +05301160 case QDF_PROTO_MGMT_ASSOC:
1161 return "ASSOC";
1162 case QDF_PROTO_MGMT_DISASSOC:
1163 return "DISASSOC";
1164 case QDF_PROTO_MGMT_AUTH:
1165 return "AUTH";
1166 case QDF_PROTO_MGMT_DEAUTH:
1167 return "DEAUTH";
Himanshu Agarwalc0b71452016-09-20 15:10:55 +05301168 case QDF_ROAM_SYNCH:
1169 return "ROAM SYNCH";
1170 case QDF_ROAM_COMPLETE:
Mohit Khanna7750a172017-05-15 15:53:33 -07001171 return "ROAM COMP";
Himanshu Agarwalc0b71452016-09-20 15:10:55 +05301172 case QDF_ROAM_EVENTID:
1173 return "ROAM EVENTID";
Nirav Shaheaa20d82016-04-25 18:01:05 +05301174 default:
1175 return "invalid";
1176 }
1177}
Nirav Shaheaa20d82016-04-25 18:01:05 +05301178
1179/**
1180 * qdf_dp_enable_check() - check if dptrace is enable or not
1181 * @nbuf: nbuf
1182 * @code: dptrace code
1183 *
1184 * Return: true/false
1185 */
Jeff Johnson4729b6f2016-10-07 13:02:43 -07001186static bool qdf_dp_enable_check(qdf_nbuf_t nbuf, enum QDF_DP_TRACE_ID code,
1187 enum qdf_proto_dir dir)
Nirav Shaheaa20d82016-04-25 18:01:05 +05301188{
Chouhan, Anurag57763182016-03-03 18:57:27 +05301189 /* Return when Dp trace is not enabled */
1190 if (!g_qdf_dp_trace_data.enable)
Nirav Shaheaa20d82016-04-25 18:01:05 +05301191 return false;
Chouhan, Anurag57763182016-03-03 18:57:27 +05301192
Nirav Shaheaa20d82016-04-25 18:01:05 +05301193 if (qdf_dp_trace_enable_track(code) == false)
1194 return false;
Chouhan, Anurag57763182016-03-03 18:57:27 +05301195
Nirav Shaheaa20d82016-04-25 18:01:05 +05301196 if ((nbuf) && ((QDF_NBUF_CB_TX_PACKET_TRACK(nbuf) !=
1197 QDF_NBUF_TX_PKT_DATA_TRACK) ||
Nirav Shah29beae02016-04-26 22:58:54 +05301198 ((dir == QDF_TX) && (QDF_NBUF_CB_TX_DP_TRACE(nbuf) == 0)) ||
1199 ((dir == QDF_RX) && (QDF_NBUF_CB_RX_DP_TRACE(nbuf) == 0))))
Nirav Shaheaa20d82016-04-25 18:01:05 +05301200 return false;
Chouhan, Anurag57763182016-03-03 18:57:27 +05301201
Nirav Shaheaa20d82016-04-25 18:01:05 +05301202 return true;
1203}
Chouhan, Anurag57763182016-03-03 18:57:27 +05301204
Nirav Shaheaa20d82016-04-25 18:01:05 +05301205/**
1206 * qdf_dp_add_record() - add dp trace record
1207 * @code: dptrace code
1208 * @data: data pointer
1209 * @size: size of buffer
Nandha Kishore Easwarane43583f2017-05-15 21:01:13 +05301210 * @pdev_id: pdev_id
Nirav Shahcede2892016-05-19 12:41:15 +05301211 * @print: true to print it in kmsg
Nirav Shaheaa20d82016-04-25 18:01:05 +05301212 *
1213 * Return: none
1214 */
Nandha Kishore Easwarane43583f2017-05-15 21:01:13 +05301215static void qdf_dp_add_record(enum QDF_DP_TRACE_ID code, uint8_t *data,
1216 uint8_t size, uint8_t pdev_id, bool print)
Nirav Shaheaa20d82016-04-25 18:01:05 +05301217{
1218 struct qdf_dp_trace_record_s *rec = NULL;
Nirav Shah29beae02016-04-26 22:58:54 +05301219 int index;
Srinivas Girigowda43977f72017-04-03 09:17:46 -07001220
Chouhan, Anurag57763182016-03-03 18:57:27 +05301221 spin_lock_bh(&l_dp_trace_lock);
1222
1223 g_qdf_dp_trace_data.num++;
1224
1225 if (g_qdf_dp_trace_data.num > MAX_QDF_DP_TRACE_RECORDS)
1226 g_qdf_dp_trace_data.num = MAX_QDF_DP_TRACE_RECORDS;
1227
1228 if (INVALID_QDF_DP_TRACE_ADDR == g_qdf_dp_trace_data.head) {
1229 /* first record */
1230 g_qdf_dp_trace_data.head = 0;
1231 g_qdf_dp_trace_data.tail = 0;
1232 } else {
1233 /* queue is not empty */
1234 g_qdf_dp_trace_data.tail++;
1235
1236 if (MAX_QDF_DP_TRACE_RECORDS == g_qdf_dp_trace_data.tail)
1237 g_qdf_dp_trace_data.tail = 0;
1238
1239 if (g_qdf_dp_trace_data.head == g_qdf_dp_trace_data.tail) {
1240 /* full */
1241 if (MAX_QDF_DP_TRACE_RECORDS ==
1242 ++g_qdf_dp_trace_data.head)
1243 g_qdf_dp_trace_data.head = 0;
1244 }
1245 }
1246
1247 rec = &g_qdf_dp_trace_tbl[g_qdf_dp_trace_data.tail];
Nirav Shah29beae02016-04-26 22:58:54 +05301248 index = g_qdf_dp_trace_data.tail;
Chouhan, Anurag57763182016-03-03 18:57:27 +05301249 rec->code = code;
Nandha Kishore Easwarane43583f2017-05-15 21:01:13 +05301250 rec->pdev_id = pdev_id;
Chouhan, Anurag57763182016-03-03 18:57:27 +05301251 rec->size = 0;
1252 if (data != NULL && size > 0) {
1253 if (size > QDF_DP_TRACE_RECORD_SIZE)
1254 size = QDF_DP_TRACE_RECORD_SIZE;
1255
1256 rec->size = size;
Nirav Shaheaa20d82016-04-25 18:01:05 +05301257 qdf_mem_copy(rec->data, data, size);
Chouhan, Anurag57763182016-03-03 18:57:27 +05301258 }
Himanshu Agarwalc61fdf62016-12-08 15:28:33 +05301259 qdf_get_time_of_the_day_in_hr_min_sec_usec(rec->time,
1260 sizeof(rec->time));
Chouhan, Anurag57763182016-03-03 18:57:27 +05301261 rec->pid = (in_interrupt() ? 0 : current->pid);
1262 spin_unlock_bh(&l_dp_trace_lock);
Nirav Shaheaa20d82016-04-25 18:01:05 +05301263
Mohit Khanna7750a172017-05-15 15:53:33 -07001264
1265 if (rec->code >= QDF_DP_TRACE_MAX) {
1266 QDF_TRACE(QDF_MODULE_ID_QDF, QDF_TRACE_LEVEL_ERROR,
1267 "invalid record code %u, max code %u", rec->code,
1268 QDF_DP_TRACE_MAX);
1269 return;
1270 }
1271
1272 if (print == true) {
Nandha Kishore Easwarane43583f2017-05-15 21:01:13 +05301273 qdf_dp_trace_cb_table[rec->code] (rec, index,
Mohit Khanna7750a172017-05-15 15:53:33 -07001274 QDF_TRACE_DEFAULT_PDEV_ID, true);
1275 return;
1276 }
1277
1278 if (g_qdf_dp_trace_data.live_mode_config) {
1279 spin_lock_bh(&l_dp_trace_lock);
1280 g_qdf_dp_trace_data.print_pkt_cnt++;
1281 if ((g_qdf_dp_trace_data.live_mode == 1) &&
1282 (g_qdf_dp_trace_data.print_pkt_cnt >
1283 g_qdf_dp_trace_data.high_tput_thresh))
1284 g_qdf_dp_trace_data.live_mode = 0;
1285 spin_unlock_bh(&l_dp_trace_lock);
1286 }
1287
1288 if (g_qdf_dp_trace_data.live_mode == true) {
1289 qdf_dp_trace_cb_table[rec->code] (rec, index,
1290 QDF_TRACE_DEFAULT_PDEV_ID, true);
1291 return;
1292 }
Nirav Shaheaa20d82016-04-25 18:01:05 +05301293}
Nirav Shaheaa20d82016-04-25 18:01:05 +05301294
Nirav Shaheaa20d82016-04-25 18:01:05 +05301295
1296/**
Poddar, Siddarthbf4231b2017-07-10 16:27:01 +05301297 * qdf_log_icmpv6_pkt() - log ICMPv6 packet
1298 * @session_id: vdev_id
1299 * @skb: skb pointer
1300 * @dir: direction
1301 *
1302 * Return: true/false
1303 */
1304static bool qdf_log_icmpv6_pkt(uint8_t session_id, struct sk_buff *skb,
1305 enum qdf_proto_dir dir, uint8_t pdev_id)
1306{
1307 enum qdf_proto_subtype subtype;
1308
1309 if ((qdf_dp_get_proto_bitmap() & QDF_NBUF_PKT_TRAC_TYPE_ICMPv6) &&
1310 ((dir == QDF_TX && QDF_NBUF_CB_PACKET_TYPE_ICMPv6 ==
1311 QDF_NBUF_CB_GET_PACKET_TYPE(skb)) ||
1312 (dir == QDF_RX && qdf_nbuf_is_icmpv6_pkt(skb) == true))) {
1313
1314 subtype = qdf_nbuf_get_icmpv6_subtype(skb);
1315 DPTRACE(qdf_dp_trace_proto_pkt(
1316 QDF_DP_TRACE_ICMPv6_PACKET_RECORD,
1317 session_id, (skb->data + QDF_NBUF_SRC_MAC_OFFSET),
1318 (skb->data + QDF_NBUF_DEST_MAC_OFFSET),
1319 QDF_PROTO_TYPE_ICMPv6, subtype, dir, pdev_id, false));
1320 if (dir == QDF_TX)
1321 QDF_NBUF_CB_TX_DP_TRACE(skb) = 1;
1322 else if (dir == QDF_RX)
1323 QDF_NBUF_CB_RX_DP_TRACE(skb) = 1;
1324
1325 QDF_NBUF_CB_DP_TRACE_PRINT(skb) = false;
1326
1327 switch (subtype) {
1328 case QDF_PROTO_ICMPV6_REQ:
1329 g_qdf_dp_trace_data.icmpv6_req++;
1330 break;
1331 case QDF_PROTO_ICMPV6_RES:
1332 g_qdf_dp_trace_data.icmpv6_resp++;
1333 break;
1334 case QDF_PROTO_ICMPV6_RS:
1335 g_qdf_dp_trace_data.icmpv6_rs++;
1336 break;
1337 case QDF_PROTO_ICMPV6_RA:
1338 g_qdf_dp_trace_data.icmpv6_ra++;
1339 break;
1340 case QDF_PROTO_ICMPV6_NS:
1341 g_qdf_dp_trace_data.icmpv6_ns++;
1342 break;
1343 case QDF_PROTO_ICMPV6_NA:
1344 g_qdf_dp_trace_data.icmpv6_na++;
1345 break;
1346 default:
1347 break;
1348 }
1349 return true;
1350 }
1351
1352 return false;
1353}
1354
1355/**
Mohit Khanna7750a172017-05-15 15:53:33 -07001356 * qdf_log_icmp_pkt() - log ICMP packet
1357 * @session_id: vdev_id
1358 * @skb: skb pointer
1359 * @dir: direction
1360 *
1361 * Return: true/false
1362 */
1363static bool qdf_log_icmp_pkt(uint8_t session_id, struct sk_buff *skb,
1364 enum qdf_proto_dir dir, uint8_t pdev_id)
1365{
1366 enum qdf_proto_subtype proto_subtype;
1367
1368 if ((qdf_dp_get_proto_bitmap() & QDF_NBUF_PKT_TRAC_TYPE_ICMP) &&
1369 (qdf_nbuf_is_icmp_pkt(skb) == true)) {
1370
1371 proto_subtype = qdf_nbuf_get_icmp_subtype(skb);
1372 DPTRACE(qdf_dp_trace_proto_pkt(QDF_DP_TRACE_ICMP_PACKET_RECORD,
1373 session_id, (skb->data + QDF_NBUF_SRC_MAC_OFFSET),
1374 (skb->data + QDF_NBUF_DEST_MAC_OFFSET),
1375 QDF_PROTO_TYPE_ICMP, proto_subtype, dir, pdev_id, false));
1376 if (QDF_TX == dir)
1377 QDF_NBUF_CB_TX_DP_TRACE(skb) = 1;
1378 else if (QDF_RX == dir)
1379 QDF_NBUF_CB_RX_DP_TRACE(skb) = 1;
1380
1381 QDF_NBUF_CB_DP_TRACE_PRINT(skb) = false;
1382
1383 if (proto_subtype == QDF_PROTO_ICMP_REQ)
1384 g_qdf_dp_trace_data.icmp_req++;
1385 else
1386 g_qdf_dp_trace_data.icmp_resp++;
1387
1388 return true;
1389 }
1390 return false;
1391}
1392
1393/**
Nirav Shaheaa20d82016-04-25 18:01:05 +05301394 * qdf_log_eapol_pkt() - log EAPOL packet
1395 * @session_id: vdev_id
1396 * @skb: skb pointer
Nirav Shah29beae02016-04-26 22:58:54 +05301397 * @dir: direction
Nandha Kishore Easwarane43583f2017-05-15 21:01:13 +05301398 * @pdev_id: pdev_id
Nirav Shaheaa20d82016-04-25 18:01:05 +05301399 *
1400 * Return: true/false
1401 */
Jeff Johnson4729b6f2016-10-07 13:02:43 -07001402static bool qdf_log_eapol_pkt(uint8_t session_id, struct sk_buff *skb,
Nandha Kishore Easwarane43583f2017-05-15 21:01:13 +05301403 enum qdf_proto_dir dir, uint8_t pdev_id)
Nirav Shaheaa20d82016-04-25 18:01:05 +05301404{
Nirav Shaheaa20d82016-04-25 18:01:05 +05301405 enum qdf_proto_subtype subtype;
1406
1407 if ((qdf_dp_get_proto_bitmap() & QDF_NBUF_PKT_TRAC_TYPE_EAPOL) &&
Nirav Shah9c3b3fe2016-07-20 16:05:06 +05301408 ((dir == QDF_TX && QDF_NBUF_CB_PACKET_TYPE_EAPOL ==
1409 QDF_NBUF_CB_GET_PACKET_TYPE(skb)) ||
1410 (dir == QDF_RX && qdf_nbuf_is_ipv4_eapol_pkt(skb) == true))) {
Nirav Shaheaa20d82016-04-25 18:01:05 +05301411
Himanshu Agarwalfcd64e92016-07-20 17:45:58 +05301412 subtype = qdf_nbuf_get_eapol_subtype(skb);
Nirav Shaheaa20d82016-04-25 18:01:05 +05301413 DPTRACE(qdf_dp_trace_proto_pkt(QDF_DP_TRACE_EAPOL_PACKET_RECORD,
1414 session_id, (skb->data + QDF_NBUF_SRC_MAC_OFFSET),
1415 (skb->data + QDF_NBUF_DEST_MAC_OFFSET),
Mohit Khanna7750a172017-05-15 15:53:33 -07001416 QDF_PROTO_TYPE_EAPOL, subtype, dir, pdev_id, true));
Nirav Shah29beae02016-04-26 22:58:54 +05301417 if (QDF_TX == dir)
1418 QDF_NBUF_CB_TX_DP_TRACE(skb) = 1;
1419 else if (QDF_RX == dir)
1420 QDF_NBUF_CB_RX_DP_TRACE(skb) = 1;
Himanshu Agarwal3f549622016-10-27 15:16:25 +05301421
Mohit Khanna90d7ebd2017-09-12 21:54:21 -07001422 switch (subtype) {
1423 case QDF_PROTO_EAPOL_M1:
1424 g_qdf_dp_trace_data.eapol_m1++;
1425 break;
1426 case QDF_PROTO_EAPOL_M2:
1427 g_qdf_dp_trace_data.eapol_m2++;
1428 break;
1429 case QDF_PROTO_EAPOL_M3:
1430 g_qdf_dp_trace_data.eapol_m3++;
1431 break;
1432 case QDF_PROTO_EAPOL_M4:
1433 g_qdf_dp_trace_data.eapol_m4++;
1434 break;
1435 default:
1436 g_qdf_dp_trace_data.eapol_others++;
1437 break;
1438 }
Himanshu Agarwal3f549622016-10-27 15:16:25 +05301439 QDF_NBUF_CB_DP_TRACE_PRINT(skb) = true;
Nirav Shaheaa20d82016-04-25 18:01:05 +05301440 return true;
1441 }
1442 return false;
1443}
Nirav Shaheaa20d82016-04-25 18:01:05 +05301444
1445/**
1446 * qdf_log_dhcp_pkt() - log DHCP packet
1447 * @session_id: vdev_id
1448 * @skb: skb pointer
Nirav Shah29beae02016-04-26 22:58:54 +05301449 * @dir: direction
Nandha Kishore Easwarane43583f2017-05-15 21:01:13 +05301450 * @pdev_id: pdev_id
Nirav Shaheaa20d82016-04-25 18:01:05 +05301451 *
1452 * Return: true/false
1453 */
Jeff Johnson4729b6f2016-10-07 13:02:43 -07001454static bool qdf_log_dhcp_pkt(uint8_t session_id, struct sk_buff *skb,
Nandha Kishore Easwarane43583f2017-05-15 21:01:13 +05301455 enum qdf_proto_dir dir, uint8_t pdev_id)
Nirav Shaheaa20d82016-04-25 18:01:05 +05301456{
1457 enum qdf_proto_subtype subtype = QDF_PROTO_INVALID;
1458
1459 if ((qdf_dp_get_proto_bitmap() & QDF_NBUF_PKT_TRAC_TYPE_DHCP) &&
Nirav Shah9c3b3fe2016-07-20 16:05:06 +05301460 ((dir == QDF_TX && QDF_NBUF_CB_PACKET_TYPE_DHCP ==
1461 QDF_NBUF_CB_GET_PACKET_TYPE(skb)) ||
1462 (dir == QDF_RX && qdf_nbuf_is_ipv4_dhcp_pkt(skb) == true))) {
Nirav Shaheaa20d82016-04-25 18:01:05 +05301463
Himanshu Agarwalfcd64e92016-07-20 17:45:58 +05301464 subtype = qdf_nbuf_get_dhcp_subtype(skb);
Nirav Shaheaa20d82016-04-25 18:01:05 +05301465 DPTRACE(qdf_dp_trace_proto_pkt(QDF_DP_TRACE_DHCP_PACKET_RECORD,
1466 session_id, (skb->data + QDF_NBUF_SRC_MAC_OFFSET),
1467 (skb->data + QDF_NBUF_DEST_MAC_OFFSET),
Mohit Khanna7750a172017-05-15 15:53:33 -07001468 QDF_PROTO_TYPE_DHCP, subtype, dir, pdev_id, true));
1469
Nirav Shah29beae02016-04-26 22:58:54 +05301470 if (QDF_TX == dir)
1471 QDF_NBUF_CB_TX_DP_TRACE(skb) = 1;
1472 else if (QDF_RX == dir)
1473 QDF_NBUF_CB_RX_DP_TRACE(skb) = 1;
Himanshu Agarwal3f549622016-10-27 15:16:25 +05301474
1475 QDF_NBUF_CB_DP_TRACE_PRINT(skb) = true;
Mohit Khanna90d7ebd2017-09-12 21:54:21 -07001476 switch (subtype) {
1477 case QDF_PROTO_DHCP_DISCOVER:
1478 g_qdf_dp_trace_data.dhcp_disc++;
1479 break;
1480 case QDF_PROTO_DHCP_OFFER:
1481 g_qdf_dp_trace_data.dhcp_off++;
1482 break;
1483 case QDF_PROTO_DHCP_REQUEST:
1484 g_qdf_dp_trace_data.dhcp_req++;
1485 break;
1486 case QDF_PROTO_DHCP_ACK:
1487 g_qdf_dp_trace_data.dhcp_ack++;
1488 break;
1489 case QDF_PROTO_DHCP_NACK:
1490 g_qdf_dp_trace_data.dhcp_nack++;
1491 break;
1492 default:
1493 g_qdf_dp_trace_data.eapol_others++;
1494 break;
1495 }
1496
Nirav Shaheaa20d82016-04-25 18:01:05 +05301497 return true;
1498 }
1499 return false;
1500}
Nirav Shaheaa20d82016-04-25 18:01:05 +05301501
1502/**
1503 * qdf_log_arp_pkt() - log ARP packet
1504 * @session_id: vdev_id
1505 * @skb: skb pointer
Nirav Shah29beae02016-04-26 22:58:54 +05301506 * @dir: direction
Nandha Kishore Easwarane43583f2017-05-15 21:01:13 +05301507 * @pdev_id: pdev_id
Nirav Shaheaa20d82016-04-25 18:01:05 +05301508 *
1509 * Return: true/false
1510 */
Jeff Johnson4729b6f2016-10-07 13:02:43 -07001511static bool qdf_log_arp_pkt(uint8_t session_id, struct sk_buff *skb,
Nandha Kishore Easwarane43583f2017-05-15 21:01:13 +05301512 enum qdf_proto_dir dir, uint8_t pdev_id)
Nirav Shaheaa20d82016-04-25 18:01:05 +05301513{
Nirav Shahcede2892016-05-19 12:41:15 +05301514 enum qdf_proto_subtype proto_subtype;
1515
Nirav Shaheaa20d82016-04-25 18:01:05 +05301516 if ((qdf_dp_get_proto_bitmap() & QDF_NBUF_PKT_TRAC_TYPE_ARP) &&
Nirav Shah9c3b3fe2016-07-20 16:05:06 +05301517 ((dir == QDF_TX && QDF_NBUF_CB_PACKET_TYPE_ARP ==
1518 QDF_NBUF_CB_GET_PACKET_TYPE(skb)) ||
1519 (dir == QDF_RX && qdf_nbuf_is_ipv4_arp_pkt(skb) == true))) {
Nirav Shahcede2892016-05-19 12:41:15 +05301520
Himanshu Agarwalfcd64e92016-07-20 17:45:58 +05301521 proto_subtype = qdf_nbuf_get_arp_subtype(skb);
Nirav Shaheaa20d82016-04-25 18:01:05 +05301522 DPTRACE(qdf_dp_trace_proto_pkt(QDF_DP_TRACE_ARP_PACKET_RECORD,
1523 session_id, (skb->data + QDF_NBUF_SRC_MAC_OFFSET),
1524 (skb->data + QDF_NBUF_DEST_MAC_OFFSET),
Mohit Khanna7750a172017-05-15 15:53:33 -07001525 QDF_PROTO_TYPE_ARP, proto_subtype, dir, pdev_id, true));
Nirav Shah29beae02016-04-26 22:58:54 +05301526 if (QDF_TX == dir)
1527 QDF_NBUF_CB_TX_DP_TRACE(skb) = 1;
1528 else if (QDF_RX == dir)
1529 QDF_NBUF_CB_RX_DP_TRACE(skb) = 1;
Himanshu Agarwal3f549622016-10-27 15:16:25 +05301530
1531 QDF_NBUF_CB_DP_TRACE_PRINT(skb) = true;
Mohit Khanna7750a172017-05-15 15:53:33 -07001532
1533 if (QDF_PROTO_ARP_REQ == proto_subtype)
1534 g_qdf_dp_trace_data.arp_req++;
1535 else
1536 g_qdf_dp_trace_data.arp_resp++;
1537
Nirav Shaheaa20d82016-04-25 18:01:05 +05301538 return true;
1539 }
1540 return false;
1541}
Nirav Shaheaa20d82016-04-25 18:01:05 +05301542
Zhu Jianminaf3420a2017-06-12 17:55:43 +08001543
1544/**
Nirav Shaheaa20d82016-04-25 18:01:05 +05301545 * qdf_dp_trace_log_pkt() - log packet type enabled through iwpriv
1546 * @session_id: vdev_id
1547 * @skb: skb pointer
Nirav Shah29beae02016-04-26 22:58:54 +05301548 * @dir: direction
Nandha Kishore Easwarane43583f2017-05-15 21:01:13 +05301549 * @pdev_id: pdev_id
Nirav Shaheaa20d82016-04-25 18:01:05 +05301550 *
Mohit Khanna7750a172017-05-15 15:53:33 -07001551 * Return: true: some protocol was logged, false: no protocol was logged.
Nirav Shaheaa20d82016-04-25 18:01:05 +05301552 */
Mohit Khanna7750a172017-05-15 15:53:33 -07001553bool qdf_dp_trace_log_pkt(uint8_t session_id, struct sk_buff *skb,
Nandha Kishore Easwarane43583f2017-05-15 21:01:13 +05301554 enum qdf_proto_dir dir, uint8_t pdev_id)
Nirav Shaheaa20d82016-04-25 18:01:05 +05301555{
Zhu Jianminaf3420a2017-06-12 17:55:43 +08001556 if (!qdf_dp_get_proto_bitmap())
Mohit Khanna7750a172017-05-15 15:53:33 -07001557 return false;
Zhu Jianminaf3420a2017-06-12 17:55:43 +08001558 if (qdf_log_arp_pkt(session_id, skb, dir, pdev_id))
Mohit Khanna7750a172017-05-15 15:53:33 -07001559 return true;
Zhu Jianminaf3420a2017-06-12 17:55:43 +08001560 if (qdf_log_dhcp_pkt(session_id, skb, dir, pdev_id))
Mohit Khanna7750a172017-05-15 15:53:33 -07001561 return true;
Zhu Jianminaf3420a2017-06-12 17:55:43 +08001562 if (qdf_log_eapol_pkt(session_id, skb, dir, pdev_id))
Mohit Khanna7750a172017-05-15 15:53:33 -07001563 return true;
Zhu Jianminaf3420a2017-06-12 17:55:43 +08001564 if (qdf_log_icmp_pkt(session_id, skb, dir, pdev_id))
Mohit Khanna7750a172017-05-15 15:53:33 -07001565 return true;
Poddar, Siddarthbf4231b2017-07-10 16:27:01 +05301566 if (qdf_log_icmpv6_pkt(session_id, skb, dir, pdev_id))
1567 return true;
Mohit Khanna7750a172017-05-15 15:53:33 -07001568 return false;
Nirav Shaheaa20d82016-04-25 18:01:05 +05301569}
1570EXPORT_SYMBOL(qdf_dp_trace_log_pkt);
1571
1572/**
Nirav Shah31d694b2016-05-03 20:18:22 +05301573 * qdf_dp_display_mgmt_pkt() - display proto packet
1574 * @record: dptrace record
1575 * @index: index
Mohit Khanna7750a172017-05-15 15:53:33 -07001576 * @live : live mode or dump mode
Nirav Shah31d694b2016-05-03 20:18:22 +05301577 *
1578 * Return: none
1579 */
1580void qdf_dp_display_mgmt_pkt(struct qdf_dp_trace_record_s *record,
Mohit Khanna7750a172017-05-15 15:53:33 -07001581 uint16_t index, uint8_t pdev_id, bool live)
Nirav Shah31d694b2016-05-03 20:18:22 +05301582{
1583 struct qdf_dp_trace_mgmt_buf *buf =
1584 (struct qdf_dp_trace_mgmt_buf *)record->data;
1585
Mohit Khanna7750a172017-05-15 15:53:33 -07001586 DPTRACE_PRINT("DPT: %04d: %s [%d] [%s %s %s]",
1587 index,
1588 (live == true) ? " " : record->time,
1589 buf->vdev_id,
1590 qdf_dp_code_to_string(record->code),
1591 qdf_dp_type_to_str(buf->type),
Nirav Shah31d694b2016-05-03 20:18:22 +05301592 qdf_dp_subtype_to_str(buf->subtype));
1593}
1594EXPORT_SYMBOL(qdf_dp_display_mgmt_pkt);
1595
1596/**
1597 * qdf_dp_trace_mgmt_pkt() - record mgmt packet
1598 * @code: dptrace code
1599 * @vdev_id: vdev id
Nandha Kishore Easwarane43583f2017-05-15 21:01:13 +05301600 * @pdev_id: pdev_id
Nirav Shah31d694b2016-05-03 20:18:22 +05301601 * @type: proto type
1602 * @subtype: proto subtype
1603 *
1604 * Return: none
1605 */
1606void qdf_dp_trace_mgmt_pkt(enum QDF_DP_TRACE_ID code, uint8_t vdev_id,
Nandha Kishore Easwarane43583f2017-05-15 21:01:13 +05301607 uint8_t pdev_id, enum qdf_proto_type type,
1608 enum qdf_proto_subtype subtype)
Nirav Shah31d694b2016-05-03 20:18:22 +05301609{
1610 struct qdf_dp_trace_mgmt_buf buf;
1611 int buf_size = sizeof(struct qdf_dp_trace_mgmt_buf);
1612
1613 if (qdf_dp_enable_check(NULL, code, QDF_NA) == false)
1614 return;
1615
1616 if (buf_size > QDF_DP_TRACE_RECORD_SIZE)
1617 QDF_BUG(0);
1618
1619 buf.type = type;
1620 buf.subtype = subtype;
1621 buf.vdev_id = vdev_id;
Nandha Kishore Easwarane43583f2017-05-15 21:01:13 +05301622 qdf_dp_add_record(code, (uint8_t *)&buf, buf_size, pdev_id, true);
Nirav Shah31d694b2016-05-03 20:18:22 +05301623}
1624EXPORT_SYMBOL(qdf_dp_trace_mgmt_pkt);
1625
Himanshu Agarwalc0b71452016-09-20 15:10:55 +05301626/**
1627 * qdf_dp_display_event_record() - display event records
1628 * @record: dptrace record
1629 * @index: index
Mohit Khanna7750a172017-05-15 15:53:33 -07001630 * @live : live mode or dump mode
Himanshu Agarwalc0b71452016-09-20 15:10:55 +05301631 *
1632 * Return: none
1633 */
1634void qdf_dp_display_event_record(struct qdf_dp_trace_record_s *record,
Mohit Khanna7750a172017-05-15 15:53:33 -07001635 uint16_t index, uint8_t pdev_id, bool live)
Himanshu Agarwalc0b71452016-09-20 15:10:55 +05301636{
1637 struct qdf_dp_trace_event_buf *buf =
1638 (struct qdf_dp_trace_event_buf *)record->data;
1639
Mohit Khanna7750a172017-05-15 15:53:33 -07001640 DPTRACE_PRINT("DPT: %04d: %s [%d] [%s %s %s]",
1641 index,
1642 (live == true) ? "" : record->time,
1643 buf->vdev_id,
1644 qdf_dp_code_to_string(record->code),
1645 qdf_dp_type_to_str(buf->type),
Himanshu Agarwalc0b71452016-09-20 15:10:55 +05301646 qdf_dp_subtype_to_str(buf->subtype));
1647}
1648EXPORT_SYMBOL(qdf_dp_display_event_record);
1649
1650/**
1651 * qdf_dp_trace_record_event() - record events
1652 * @code: dptrace code
1653 * @vdev_id: vdev id
Nandha Kishore Easwarane43583f2017-05-15 21:01:13 +05301654 * @pdev_id: pdev_id
Himanshu Agarwalc0b71452016-09-20 15:10:55 +05301655 * @type: proto type
1656 * @subtype: proto subtype
1657 *
1658 * Return: none
1659 */
1660void qdf_dp_trace_record_event(enum QDF_DP_TRACE_ID code, uint8_t vdev_id,
Nandha Kishore Easwarane43583f2017-05-15 21:01:13 +05301661 uint8_t pdev_id, enum qdf_proto_type type,
1662 enum qdf_proto_subtype subtype)
Himanshu Agarwalc0b71452016-09-20 15:10:55 +05301663{
1664 struct qdf_dp_trace_event_buf buf;
1665 int buf_size = sizeof(struct qdf_dp_trace_event_buf);
1666
1667 if (qdf_dp_enable_check(NULL, code, QDF_NA) == false)
1668 return;
1669
1670 if (buf_size > QDF_DP_TRACE_RECORD_SIZE)
1671 QDF_BUG(0);
1672
1673 buf.type = type;
1674 buf.subtype = subtype;
1675 buf.vdev_id = vdev_id;
Nandha Kishore Easwarane43583f2017-05-15 21:01:13 +05301676 qdf_dp_add_record(code, (uint8_t *)&buf, buf_size, pdev_id, true);
Himanshu Agarwalc0b71452016-09-20 15:10:55 +05301677}
1678EXPORT_SYMBOL(qdf_dp_trace_record_event);
Nirav Shah31d694b2016-05-03 20:18:22 +05301679
1680/**
Nirav Shaheaa20d82016-04-25 18:01:05 +05301681 * qdf_dp_display_proto_pkt() - display proto packet
1682 * @record: dptrace record
1683 * @index: index
Mohit Khanna7750a172017-05-15 15:53:33 -07001684 * @live : live mode or dump mode
Nirav Shaheaa20d82016-04-25 18:01:05 +05301685 *
1686 * Return: none
1687 */
1688void qdf_dp_display_proto_pkt(struct qdf_dp_trace_record_s *record,
Mohit Khanna7750a172017-05-15 15:53:33 -07001689 uint16_t index, uint8_t pdev_id, bool live)
Nirav Shaheaa20d82016-04-25 18:01:05 +05301690{
1691 struct qdf_dp_trace_proto_buf *buf =
1692 (struct qdf_dp_trace_proto_buf *)record->data;
1693
Dustin Brown490d8182018-01-25 11:46:31 -08001694 DPTRACE_PRINT("DPT: %04d: %s [%d] [%s%s] SA: " QDF_MAC_ADDR_STR
1695 " %s DA: " QDF_MAC_ADDR_STR,
Mohit Khanna7750a172017-05-15 15:53:33 -07001696 index,
1697 (live == true) ? "" : record->time,
1698 buf->vdev_id,
1699 qdf_dp_code_to_string(record->code),
1700 qdf_dp_subtype_to_str(buf->subtype),
1701 QDF_MAC_ADDR_ARRAY(buf->sa.bytes),
1702 qdf_dp_dir_to_str(buf->dir), QDF_MAC_ADDR_ARRAY(buf->da.bytes));
Nirav Shaheaa20d82016-04-25 18:01:05 +05301703}
1704EXPORT_SYMBOL(qdf_dp_display_proto_pkt);
1705
1706/**
1707 * qdf_dp_trace_proto_pkt() - record proto packet
1708 * @code: dptrace code
1709 * @vdev_id: vdev id
1710 * @sa: source mac address
1711 * @da: destination mac address
1712 * @type: proto type
1713 * @subtype: proto subtype
1714 * @dir: direction
Nandha Kishore Easwarane43583f2017-05-15 21:01:13 +05301715 * @pdev_id: pdev id
Mohit Khanna7750a172017-05-15 15:53:33 -07001716 * @print: to print this proto pkt or not
Nirav Shaheaa20d82016-04-25 18:01:05 +05301717 *
1718 * Return: none
1719 */
1720void qdf_dp_trace_proto_pkt(enum QDF_DP_TRACE_ID code, uint8_t vdev_id,
1721 uint8_t *sa, uint8_t *da, enum qdf_proto_type type,
Nandha Kishore Easwarane43583f2017-05-15 21:01:13 +05301722 enum qdf_proto_subtype subtype, enum qdf_proto_dir dir,
Mohit Khanna7750a172017-05-15 15:53:33 -07001723 uint8_t pdev_id, bool print)
Nirav Shaheaa20d82016-04-25 18:01:05 +05301724{
1725 struct qdf_dp_trace_proto_buf buf;
1726 int buf_size = sizeof(struct qdf_dp_trace_ptr_buf);
1727
Nirav Shah29beae02016-04-26 22:58:54 +05301728 if (qdf_dp_enable_check(NULL, code, dir) == false)
Nirav Shaheaa20d82016-04-25 18:01:05 +05301729 return;
1730
1731 if (buf_size > QDF_DP_TRACE_RECORD_SIZE)
1732 QDF_BUG(0);
1733
1734 memcpy(&buf.sa, sa, QDF_NET_ETH_LEN);
1735 memcpy(&buf.da, da, QDF_NET_ETH_LEN);
1736 buf.dir = dir;
1737 buf.type = type;
1738 buf.subtype = subtype;
1739 buf.vdev_id = vdev_id;
Mohit Khanna7750a172017-05-15 15:53:33 -07001740 qdf_dp_add_record(code, (uint8_t *)&buf, buf_size, pdev_id, print);
Nirav Shaheaa20d82016-04-25 18:01:05 +05301741}
1742EXPORT_SYMBOL(qdf_dp_trace_proto_pkt);
1743
1744/**
1745 * qdf_dp_display_ptr_record() - display record
1746 * @record: dptrace record
1747 * @index: index
Mohit Khanna7750a172017-05-15 15:53:33 -07001748 * @live : live mode or dump mode
Nirav Shaheaa20d82016-04-25 18:01:05 +05301749 *
1750 * Return: none
1751 */
1752void qdf_dp_display_ptr_record(struct qdf_dp_trace_record_s *record,
Mohit Khanna7750a172017-05-15 15:53:33 -07001753 uint16_t index, uint8_t pdev_id, bool live)
Nirav Shaheaa20d82016-04-25 18:01:05 +05301754{
Mohit Khanna7750a172017-05-15 15:53:33 -07001755 char prepend_str[100] = {'\0'};
Nirav Shaheaa20d82016-04-25 18:01:05 +05301756 struct qdf_dp_trace_ptr_buf *buf =
1757 (struct qdf_dp_trace_ptr_buf *)record->data;
1758
Mohit Khanna7750a172017-05-15 15:53:33 -07001759 snprintf(prepend_str, sizeof(prepend_str),
1760 "%04d: %s [%s] [msdu id %d %s %d]",
1761 index,
1762 (live == true) ? "" : record->time,
1763 qdf_dp_code_to_string(record->code), buf->msdu_id,
1764 (record->code == QDF_DP_TRACE_FREE_PACKET_PTR_RECORD) ?
1765 "status" : "vdev_id",
1766 buf->status);
1767
1768 if (live == true) {
1769 /* In live mode donot dump the contents of the cookie */
1770 DPTRACE_PRINT("DPT: %s", prepend_str);
1771 } else {
1772 dump_dp_hex_trace(prepend_str, (uint8_t *)&buf->cookie,
1773 sizeof(buf->cookie));
1774 }
Nirav Shaheaa20d82016-04-25 18:01:05 +05301775}
1776EXPORT_SYMBOL(qdf_dp_display_ptr_record);
1777
1778/**
1779 * qdf_dp_trace_ptr() - record dptrace
1780 * @code: dptrace code
Nandha Kishore Easwarane43583f2017-05-15 21:01:13 +05301781 * @pdev_id: pdev_id
Nirav Shaheaa20d82016-04-25 18:01:05 +05301782 * @data: data
1783 * @size: size of data
1784 * @msdu_id: msdu_id
1785 * @status: return status
1786 *
1787 * Return: none
1788 */
1789void qdf_dp_trace_ptr(qdf_nbuf_t nbuf, enum QDF_DP_TRACE_ID code,
Nandha Kishore Easwarane43583f2017-05-15 21:01:13 +05301790 uint8_t pdev_id, uint8_t *data, uint8_t size,
1791 uint16_t msdu_id, uint16_t status)
Nirav Shaheaa20d82016-04-25 18:01:05 +05301792{
1793 struct qdf_dp_trace_ptr_buf buf;
1794 int buf_size = sizeof(struct qdf_dp_trace_ptr_buf);
1795
Nirav Shah29beae02016-04-26 22:58:54 +05301796 if (qdf_dp_enable_check(nbuf, code, QDF_TX) == false)
Nirav Shaheaa20d82016-04-25 18:01:05 +05301797 return;
1798
1799 if (buf_size > QDF_DP_TRACE_RECORD_SIZE)
1800 QDF_BUG(0);
1801
1802 qdf_mem_copy(&buf.cookie, data, size);
1803 buf.msdu_id = msdu_id;
1804 buf.status = status;
Nandha Kishore Easwarane43583f2017-05-15 21:01:13 +05301805 qdf_dp_add_record(code, (uint8_t *)&buf, buf_size, pdev_id,
Himanshu Agarwal3f549622016-10-27 15:16:25 +05301806 QDF_NBUF_CB_DP_TRACE_PRINT(nbuf));
Nirav Shaheaa20d82016-04-25 18:01:05 +05301807}
1808EXPORT_SYMBOL(qdf_dp_trace_ptr);
1809
1810/**
1811 * qdf_dp_display_trace() - Displays a record in DP trace
1812 * @pRecord : pointer to a record in DP trace
1813 * @recIndex : record index
Mohit Khanna7750a172017-05-15 15:53:33 -07001814 * @live : live mode or dump mode
Nirav Shaheaa20d82016-04-25 18:01:05 +05301815 *
1816 * Return: None
1817 */
1818void qdf_dp_display_record(struct qdf_dp_trace_record_s *pRecord,
Mohit Khanna7750a172017-05-15 15:53:33 -07001819 uint16_t recIndex, uint8_t pdev_id, bool live)
Nandha Kishore Easwarane43583f2017-05-15 21:01:13 +05301820
Mohit Khanna7750a172017-05-15 15:53:33 -07001821{
1822 char prepend_str[50] = {'\0'};
1823
1824 if (!(pdev_id == QDF_TRACE_DEFAULT_PDEV_ID ||
1825 pdev_id == pRecord->pdev_id))
1826 return;
1827
1828 snprintf(prepend_str, sizeof(prepend_str),
1829 "%04d PDEV_ID = %02d: %s %s",
1830 recIndex,
1831 pRecord->pdev_id,
1832 (live == true) ? "" : pRecord->time,
1833 qdf_dp_code_to_string(pRecord->code));
1834
1835 switch (pRecord->code) {
1836 case QDF_DP_TRACE_HDD_TX_TIMEOUT:
1837 DPTRACE_PRINT(" %s: HDD TX Timeout", prepend_str);
1838 break;
1839 case QDF_DP_TRACE_HDD_SOFTAP_TX_TIMEOUT:
1840 DPTRACE_PRINT(" %s: HDD SoftAP TX Timeout", prepend_str);
1841 break;
1842 case QDF_DP_TRACE_HDD_TX_PACKET_RECORD:
1843 case QDF_DP_TRACE_HDD_RX_PACKET_RECORD:
1844 case QDF_DP_TRACE_LI_DP_TX_PACKET_RECORD:
1845 case QDF_DP_TRACE_LI_DP_RX_PACKET_RECORD:
1846 case QDF_DP_TRACE_LI_DP_NULL_RX_PACKET_RECORD:
1847 default:
1848 dump_dp_hex_trace(prepend_str, pRecord->data, pRecord->size);
1849 break;
1850 };
Nirav Shaheaa20d82016-04-25 18:01:05 +05301851}
1852EXPORT_SYMBOL(qdf_dp_display_record);
1853
1854
1855/**
1856 * qdf_dp_trace() - Stores the data in buffer
1857 * @nbuf : defines the netbuf
1858 * @code : defines the event
Nandha Kishore Easwarane43583f2017-05-15 21:01:13 +05301859 * @pdev_id: pdev_id
Nirav Shaheaa20d82016-04-25 18:01:05 +05301860 * @data : defines the data to be stored
1861 * @size : defines the size of the data record
1862 *
1863 * Return: None
1864 */
Nandha Kishore Easwarane43583f2017-05-15 21:01:13 +05301865void qdf_dp_trace(qdf_nbuf_t nbuf, enum QDF_DP_TRACE_ID code, uint8_t pdev_id,
1866 uint8_t *data, uint8_t size, enum qdf_proto_dir dir)
Nirav Shaheaa20d82016-04-25 18:01:05 +05301867{
Nirav Shah29beae02016-04-26 22:58:54 +05301868
1869 if (qdf_dp_enable_check(nbuf, code, dir) == false)
Nirav Shaheaa20d82016-04-25 18:01:05 +05301870 return;
1871
Nandha Kishore Easwarane43583f2017-05-15 21:01:13 +05301872 qdf_dp_add_record(code, data, size, pdev_id,
Mohit Khanna6e1de592016-10-31 19:26:08 -07001873 (nbuf != NULL) ? QDF_NBUF_CB_DP_TRACE_PRINT(nbuf) : false);
Chouhan, Anurag57763182016-03-03 18:57:27 +05301874}
1875EXPORT_SYMBOL(qdf_dp_trace);
1876
1877/**
1878 * qdf_dp_trace_spin_lock_init() - initializes the lock variable before use
1879 * This function will be called from cds_alloc_global_context, we will have lock
1880 * available to use ASAP
1881 *
1882 * Return: None
1883 */
1884void qdf_dp_trace_spin_lock_init(void)
1885{
1886 spin_lock_init(&l_dp_trace_lock);
Chouhan, Anurag57763182016-03-03 18:57:27 +05301887}
1888EXPORT_SYMBOL(qdf_dp_trace_spin_lock_init);
1889
1890/**
Mohit Khanna7750a172017-05-15 15:53:33 -07001891 * qdf_dp_trace_disable_live_mode - disable live mode for dptrace
1892 *
1893 * Return: none
1894 */
1895void qdf_dp_trace_disable_live_mode(void)
1896{
1897 g_qdf_dp_trace_data.live_mode = 0;
1898}
1899EXPORT_SYMBOL(qdf_dp_trace_disable_live_mode);
1900
1901/**
Nirav Shah29beae02016-04-26 22:58:54 +05301902 * qdf_dp_trace_enable_live_mode() - enable live mode for dptrace
1903 *
1904 * Return: none
1905 */
1906void qdf_dp_trace_enable_live_mode(void)
1907{
1908 g_qdf_dp_trace_data.live_mode = 1;
Nirav Shah29beae02016-04-26 22:58:54 +05301909}
1910EXPORT_SYMBOL(qdf_dp_trace_enable_live_mode);
1911
Nirav Shah29beae02016-04-26 22:58:54 +05301912/**
Nirav Shahcede2892016-05-19 12:41:15 +05301913 * qdf_dp_trace_clear_buffer() - clear dp trace buffer
1914 *
1915 * Return: none
1916 */
1917void qdf_dp_trace_clear_buffer(void)
1918{
1919 g_qdf_dp_trace_data.head = INVALID_QDF_DP_TRACE_ADDR;
1920 g_qdf_dp_trace_data.tail = INVALID_QDF_DP_TRACE_ADDR;
1921 g_qdf_dp_trace_data.num = 0;
Nirav Shahcede2892016-05-19 12:41:15 +05301922 memset(g_qdf_dp_trace_tbl, 0,
1923 MAX_QDF_DP_TRACE_RECORDS * sizeof(struct qdf_dp_trace_record_s));
1924}
1925EXPORT_SYMBOL(qdf_dp_trace_clear_buffer);
1926
Mohit Khanna90d7ebd2017-09-12 21:54:21 -07001927void qdf_dp_trace_dump_stats(void)
1928{
1929 DPTRACE_PRINT("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)",
1930 g_qdf_dp_trace_data.icmp_req,
1931 g_qdf_dp_trace_data.icmp_resp,
1932 g_qdf_dp_trace_data.arp_req,
1933 g_qdf_dp_trace_data.arp_resp,
1934 g_qdf_dp_trace_data.icmpv6_req,
1935 g_qdf_dp_trace_data.icmpv6_resp,
1936 g_qdf_dp_trace_data.icmpv6_ns,
1937 g_qdf_dp_trace_data.icmpv6_na,
1938 g_qdf_dp_trace_data.icmpv6_rs,
1939 g_qdf_dp_trace_data.icmpv6_ra,
1940 g_qdf_dp_trace_data.dhcp_disc,
1941 g_qdf_dp_trace_data.dhcp_off,
1942 g_qdf_dp_trace_data.dhcp_req,
1943 g_qdf_dp_trace_data.dhcp_ack,
1944 g_qdf_dp_trace_data.dhcp_nack,
1945 g_qdf_dp_trace_data.dhcp_others,
1946 g_qdf_dp_trace_data.eapol_m1,
1947 g_qdf_dp_trace_data.eapol_m2,
1948 g_qdf_dp_trace_data.eapol_m3,
1949 g_qdf_dp_trace_data.eapol_m4,
1950 g_qdf_dp_trace_data.eapol_others);
1951}
1952
Nirav Shahcede2892016-05-19 12:41:15 +05301953/**
Chouhan, Anurag57763182016-03-03 18:57:27 +05301954 * qdf_dp_trace_dump_all() - Dump data from ring buffer via call back functions
1955 * registered with QDF
Chouhan, Anurag57763182016-03-03 18:57:27 +05301956 * @count: Number of lines to dump starting from tail to head
Nandha Kishore Easwarane43583f2017-05-15 21:01:13 +05301957 * @pdev_id: pdev_id
Chouhan, Anurag57763182016-03-03 18:57:27 +05301958 *
1959 * Return: None
1960 */
Nandha Kishore Easwarane43583f2017-05-15 21:01:13 +05301961void qdf_dp_trace_dump_all(uint32_t count, uint8_t pdev_id)
Chouhan, Anurag57763182016-03-03 18:57:27 +05301962{
1963 struct qdf_dp_trace_record_s p_record;
1964 int32_t i, tail;
1965
1966 if (!g_qdf_dp_trace_data.enable) {
Himanshu Agarwal26cfe7e2017-05-08 15:01:07 +05301967 DPTRACE_PRINT("Tracing Disabled");
Chouhan, Anurag57763182016-03-03 18:57:27 +05301968 return;
1969 }
1970
Mohit Khanna7750a172017-05-15 15:53:33 -07001971 DPTRACE_PRINT(
1972 "DPT: config - bitmap 0x%x verb %u #rec %u live_config %u thresh %u time_limit %u",
1973 g_qdf_dp_trace_data.proto_bitmap,
1974 g_qdf_dp_trace_data.verbosity,
1975 g_qdf_dp_trace_data.no_of_record,
1976 g_qdf_dp_trace_data.live_mode_config,
1977 g_qdf_dp_trace_data.high_tput_thresh,
1978 g_qdf_dp_trace_data.thresh_time_limit);
1979
Mohit Khanna90d7ebd2017-09-12 21:54:21 -07001980 qdf_dp_trace_dump_stats();
Mohit Khanna7750a172017-05-15 15:53:33 -07001981
1982 DPTRACE_PRINT("DPT: Total Records: %d, Head: %d, Tail: %d",
Himanshu Agarwal26cfe7e2017-05-08 15:01:07 +05301983 g_qdf_dp_trace_data.num, g_qdf_dp_trace_data.head,
1984 g_qdf_dp_trace_data.tail);
Chouhan, Anurag57763182016-03-03 18:57:27 +05301985
1986 /* aquire the lock so that only one thread at a time can read
1987 * the ring buffer
1988 */
1989 spin_lock_bh(&l_dp_trace_lock);
1990
1991 if (g_qdf_dp_trace_data.head != INVALID_QDF_DP_TRACE_ADDR) {
1992 i = g_qdf_dp_trace_data.head;
1993 tail = g_qdf_dp_trace_data.tail;
1994
1995 if (count) {
1996 if (count > g_qdf_dp_trace_data.num)
1997 count = g_qdf_dp_trace_data.num;
1998 if (tail >= (count - 1))
1999 i = tail - count + 1;
2000 else if (count != MAX_QDF_DP_TRACE_RECORDS)
2001 i = MAX_QDF_DP_TRACE_RECORDS - ((count - 1) -
2002 tail);
2003 }
2004
2005 p_record = g_qdf_dp_trace_tbl[i];
2006 spin_unlock_bh(&l_dp_trace_lock);
2007 for (;; ) {
Mohit Khanna7750a172017-05-15 15:53:33 -07002008 qdf_dp_trace_cb_table[p_record.code](&p_record,
2009 (uint16_t)i, pdev_id, false);
Chouhan, Anurag57763182016-03-03 18:57:27 +05302010 if (i == tail)
2011 break;
2012 i += 1;
2013
2014 spin_lock_bh(&l_dp_trace_lock);
2015 if (MAX_QDF_DP_TRACE_RECORDS == i)
2016 i = 0;
2017
2018 p_record = g_qdf_dp_trace_tbl[i];
2019 spin_unlock_bh(&l_dp_trace_lock);
2020 }
2021 } else {
2022 spin_unlock_bh(&l_dp_trace_lock);
2023 }
2024}
2025EXPORT_SYMBOL(qdf_dp_trace_dump_all);
Sathish Kumarfc93b2d2017-01-10 12:19:19 +05302026
Nirav Shahae6a0b32016-04-26 11:44:42 +05302027#endif
Sathish Kumar59113a42017-01-04 12:02:24 +05302028
Sathish Kumarfc93b2d2017-01-10 12:19:19 +05302029struct qdf_print_ctrl print_ctrl_obj[MAX_PRINT_CONFIG_SUPPORTED];
2030
2031struct category_name_info g_qdf_category_name[MAX_SUPPORTED_CATEGORY] = {
2032 [QDF_MODULE_ID_TDLS] = {"tdls"},
2033 [QDF_MODULE_ID_ACS] = {"ACS"},
2034 [QDF_MODULE_ID_SCAN_SM] = {"scan state machine"},
2035 [QDF_MODULE_ID_SCANENTRY] = {"scan entry"},
2036 [QDF_MODULE_ID_WDS] = {"WDS"},
2037 [QDF_MODULE_ID_ACTION] = {"action"},
2038 [QDF_MODULE_ID_ROAM] = {"STA roaming"},
2039 [QDF_MODULE_ID_INACT] = {"inactivity"},
2040 [QDF_MODULE_ID_DOTH] = {"11h"},
2041 [QDF_MODULE_ID_IQUE] = {"IQUE"},
2042 [QDF_MODULE_ID_WME] = {"WME"},
2043 [QDF_MODULE_ID_ACL] = {"ACL"},
2044 [QDF_MODULE_ID_WPA] = {"WPA/RSN"},
2045 [QDF_MODULE_ID_RADKEYS] = {"dump 802.1x keys"},
2046 [QDF_MODULE_ID_RADDUMP] = {"dump radius packet"},
2047 [QDF_MODULE_ID_RADIUS] = {"802.1x radius client"},
2048 [QDF_MODULE_ID_DOT1XSM] = {"802.1x state machine"},
2049 [QDF_MODULE_ID_DOT1X] = {"802.1x authenticator"},
2050 [QDF_MODULE_ID_POWER] = {"power save"},
2051 [QDF_MODULE_ID_STATE] = {"state"},
2052 [QDF_MODULE_ID_OUTPUT] = {"output"},
2053 [QDF_MODULE_ID_SCAN] = {"scan"},
2054 [QDF_MODULE_ID_AUTH] = {"authentication"},
2055 [QDF_MODULE_ID_ASSOC] = {"association"},
2056 [QDF_MODULE_ID_NODE] = {"node"},
2057 [QDF_MODULE_ID_ELEMID] = {"element ID"},
2058 [QDF_MODULE_ID_XRATE] = {"rate"},
2059 [QDF_MODULE_ID_INPUT] = {"input"},
2060 [QDF_MODULE_ID_CRYPTO] = {"crypto"},
2061 [QDF_MODULE_ID_DUMPPKTS] = {"dump packet"},
2062 [QDF_MODULE_ID_DEBUG] = {"debug"},
2063 [QDF_MODULE_ID_MLME] = {"mlme"},
2064 [QDF_MODULE_ID_RRM] = {"rrm"},
2065 [QDF_MODULE_ID_WNM] = {"wnm"},
2066 [QDF_MODULE_ID_P2P_PROT] = {"p2p_prot"},
2067 [QDF_MODULE_ID_PROXYARP] = {"proxyarp"},
2068 [QDF_MODULE_ID_L2TIF] = {"l2tif"},
2069 [QDF_MODULE_ID_WIFIPOS] = {"wifipos"},
2070 [QDF_MODULE_ID_WRAP] = {"wrap"},
2071 [QDF_MODULE_ID_DFS] = {"dfs"},
2072 [QDF_MODULE_ID_ATF] = {"atf"},
2073 [QDF_MODULE_ID_SPLITMAC] = {"splitmac"},
2074 [QDF_MODULE_ID_IOCTL] = {"ioctl"},
2075 [QDF_MODULE_ID_NAC] = {"nac"},
2076 [QDF_MODULE_ID_MESH] = {"mesh"},
2077 [QDF_MODULE_ID_MBO] = {"mbo"},
2078 [QDF_MODULE_ID_EXTIOCTL_CHANSWITCH] = {"extchanswitch"},
2079 [QDF_MODULE_ID_EXTIOCTL_CHANSSCAN] = {"extchanscan"},
2080 [QDF_MODULE_ID_TLSHIM] = {"tlshim"},
2081 [QDF_MODULE_ID_WMI] = {"WMI"},
2082 [QDF_MODULE_ID_HTT] = {"HTT"},
2083 [QDF_MODULE_ID_HDD] = {"HDD"},
2084 [QDF_MODULE_ID_SME] = {"SME"},
2085 [QDF_MODULE_ID_PE] = {"PE"},
2086 [QDF_MODULE_ID_WMA] = {"WMA"},
2087 [QDF_MODULE_ID_SYS] = {"SYS"},
2088 [QDF_MODULE_ID_QDF] = {"QDF"},
2089 [QDF_MODULE_ID_SAP] = {"SAP"},
2090 [QDF_MODULE_ID_HDD_SOFTAP] = {"HDD_SAP"},
2091 [QDF_MODULE_ID_HDD_DATA] = {"DATA"},
2092 [QDF_MODULE_ID_HDD_SAP_DATA] = {"SAP_DATA"},
2093 [QDF_MODULE_ID_HIF] = {"HIF"},
2094 [QDF_MODULE_ID_HTC] = {"HTC"},
2095 [QDF_MODULE_ID_TXRX] = {"TXRX"},
2096 [QDF_MODULE_ID_QDF_DEVICE] = {"QDF_DEV"},
2097 [QDF_MODULE_ID_CFG] = {"CFG"},
2098 [QDF_MODULE_ID_BMI] = {"BMI"},
2099 [QDF_MODULE_ID_EPPING] = {"EPPING"},
2100 [QDF_MODULE_ID_QVIT] = {"QVIT"},
Ashish Kumar Dhanotiyad199fcb2017-02-06 20:53:04 +05302101 [QDF_MODULE_ID_DP] = {"DP"},
2102 [QDF_MODULE_ID_SOC] = {"SOC"},
2103 [QDF_MODULE_ID_OS_IF] = {"OSIF"},
2104 [QDF_MODULE_ID_TARGET_IF] = {"TIF"},
2105 [QDF_MODULE_ID_SCHEDULER] = {"SCH"},
2106 [QDF_MODULE_ID_MGMT_TXRX] = {"MGMT_TXRX"},
Mukul Sharmad8fd1442017-02-03 11:27:17 +05302107 [QDF_MODULE_ID_PMO] = {"PMO"},
Tushnim Bhattacharyyae4449d32017-03-17 11:01:49 -07002108 [QDF_MODULE_ID_POLICY_MGR] = {"POLICY_MGR"},
Naveen Rawat51542732017-03-21 15:09:34 -07002109 [QDF_MODULE_ID_NAN] = {"NAN"},
Edayilliam Jayadev642201f2017-04-05 14:29:18 +05302110 [QDF_MODULE_ID_SPECTRAL] = {"SPECTRAL"},
Wu Gao849fd2c2017-03-23 10:14:39 +08002111 [QDF_MODULE_ID_P2P] = {"P2P"},
Kiran Venkatappa34536742017-04-04 00:09:10 +05302112 [QDF_MODULE_ID_OFFCHAN_TXRX] = {"OFFCHAN"},
Kiran Kumar Lokerea8436342017-04-24 00:56:03 -07002113 [QDF_MODULE_ID_REGULATORY] = {"REGULATORY"},
Vivek2c86b212017-06-05 00:02:11 +05302114 [QDF_MODULE_ID_OBJ_MGR] = {"OBJMGR"},
Varun Reddy Yeturu25764252017-08-10 13:53:01 -07002115 [QDF_MODULE_ID_SERIALIZATION] = {"SER"},
Aniruddha Paulb2f7ab62017-10-09 14:40:04 +05302116 [QDF_MODULE_ID_NSS] = {"NSS"},
Deepak Dhamdhere7e0b8ba2017-07-03 00:33:26 -07002117 [QDF_MODULE_ID_ROAM_DEBUG] = {"roam debug"},
Sathish Kumara9a42eb2017-11-17 17:26:39 +05302118 [QDF_MODULE_ID_DIRECT_BUF_RX] = {"DIRECT_BUF_RX"},
Nachiket Kukade88ae8532017-12-15 12:36:58 +05302119 [QDF_MODULE_ID_DISA] = {"disa"},
Himanshu Agarwalb3c81ac2018-01-10 14:21:53 +05302120 [QDF_MODULE_ID_GREEN_AP] = {"GREEN_AP"},
Santosh Anbud5fdfac2018-01-03 22:33:58 +05302121 [QDF_MODULE_ID_EXTAP] = {"EXTAP"},
Subrat Mishrabf125872017-09-27 14:41:20 +05302122 [QDF_MODULE_ID_FD] = {"FILS discovery"},
Akshay Kosigi81394132018-01-18 11:41:13 +05302123 [QDF_MODULE_ID_FTM] = {"FTM"},
Zhang Qian82377ce2018-01-04 12:15:29 +08002124 [QDF_MODULE_ID_OCB] = {"OCB"},
Sathish Kumarfc93b2d2017-01-10 12:19:19 +05302125 [QDF_MODULE_ID_ANY] = {"ANY"},
2126};
Sathish Kumar470c6202017-05-10 19:56:48 +05302127EXPORT_SYMBOL(g_qdf_category_name);
Sathish Kumarfc93b2d2017-01-10 12:19:19 +05302128
Dustin Brownd7cfa492017-05-11 14:21:06 -07002129/**
2130 * qdf_trace_display() - Display trace
2131 *
2132 * Return: None
2133 */
2134void qdf_trace_display(void)
2135{
2136 QDF_MODULE_ID module_id;
2137
2138 pr_err(" 1)FATAL 2)ERROR 3)WARN 4)INFO 5)INFO_H 6)INFO_M 7)INFO_L 8)DEBUG\n");
2139 for (module_id = 0; module_id < QDF_MODULE_ID_MAX; ++module_id) {
2140 pr_err("%2d)%s %s %s %s %s %s %s %s %s\n",
2141 (int)module_id,
2142 g_qdf_category_name[module_id].category_name_str,
2143 qdf_print_is_verbose_enabled(qdf_pidx, module_id,
2144 QDF_TRACE_LEVEL_FATAL) ? "X" : " ",
2145 qdf_print_is_verbose_enabled(qdf_pidx, module_id,
2146 QDF_TRACE_LEVEL_ERROR) ? "X" : " ",
2147 qdf_print_is_verbose_enabled(qdf_pidx, module_id,
2148 QDF_TRACE_LEVEL_WARN) ? "X" : " ",
2149 qdf_print_is_verbose_enabled(qdf_pidx, module_id,
2150 QDF_TRACE_LEVEL_INFO) ? "X" : " ",
2151 qdf_print_is_verbose_enabled(qdf_pidx, module_id,
2152 QDF_TRACE_LEVEL_INFO_HIGH) ? "X" : " ",
2153 qdf_print_is_verbose_enabled(qdf_pidx, module_id,
2154 QDF_TRACE_LEVEL_INFO_MED) ? "X" : " ",
2155 qdf_print_is_verbose_enabled(qdf_pidx, module_id,
2156 QDF_TRACE_LEVEL_INFO_LOW) ? "X" : " ",
2157 qdf_print_is_verbose_enabled(qdf_pidx, module_id,
2158 QDF_TRACE_LEVEL_DEBUG) ? "X" : " ");
2159 }
2160}
2161EXPORT_SYMBOL(qdf_trace_display);
Adil Saeed Musthafa2ef27872017-05-02 16:40:45 -07002162
Adil Saeed Musthafa33188072017-03-13 12:13:47 -07002163#ifdef CONFIG_MCL
2164#define print_to_console(str)
2165#else
2166static inline void print_to_console(char *str_buffer)
2167{
2168 pr_err("%s\n", str_buffer);
2169}
2170#endif
2171
Sathish Kumarfc93b2d2017-01-10 12:19:19 +05302172void qdf_trace_msg_cmn(unsigned int idx,
2173 QDF_MODULE_ID category,
2174 QDF_TRACE_LEVEL verbose,
2175 const char *str_format, va_list val)
2176{
2177 char str_buffer[QDF_TRACE_BUFFER_SIZE];
2178 int n;
2179
2180 /* Check if index passed is valid */
2181 if (idx < 0 || idx >= MAX_PRINT_CONFIG_SUPPORTED) {
2182 pr_info("%s: Invalid index - %d\n", __func__, idx);
2183 return;
2184 }
2185
2186 /* Check if print control object is in use */
2187 if (!print_ctrl_obj[idx].in_use) {
2188 pr_info("%s: Invalid print control object\n", __func__);
2189 return;
2190 }
2191
2192 /* Check if category passed is valid */
2193 if (category < 0 || category >= MAX_SUPPORTED_CATEGORY) {
2194 pr_info("%s: Invalid category: %d\n", __func__, category);
2195 return;
2196 }
2197
2198 /* Check if verbose mask is valid */
2199 if (verbose < 0 || verbose >= QDF_TRACE_LEVEL_MAX) {
2200 pr_info("%s: Invalid verbose level %d\n", __func__, verbose);
2201 return;
2202 }
2203
2204 /*
2205 * Print the trace message when the desired verbose level is set in
2206 * the desired category for the print control object
2207 */
2208 if (print_ctrl_obj[idx].cat_info[category].category_verbose_mask &
2209 QDF_TRACE_LEVEL_TO_MODULE_BITMASK(verbose)) {
2210 /*
2211 * The verbose strings are in an array. These are ordered in
2212 * the same order as the verbose levels are defined in the enum
2213 * (see QDF_TRACE_LEVEL) so we can index into this array with
2214 * the level and get the right string. The qdf verbose
2215 * are... Off, Fatal, Error, Warning, Info, Info_high,
2216 * Info_med, Info_low, Debug
2217 */
2218 static const char * const VERBOSE_STR[] = { " ", "F", "E", "W",
2219 "I", "IH", "IM", "IL",
2220 "D" };
2221
2222 /* print the prefix string into the string buffer... */
2223 n = scnprintf(str_buffer, QDF_TRACE_BUFFER_SIZE,
2224 "wlan: [%d:%2s:%s] ",
2225 in_interrupt() ? 0 : current->pid,
2226 VERBOSE_STR[verbose],
2227 g_qdf_category_name[category].category_name_str);
2228
2229 /* print the formatted log message after the prefix string */
2230 vscnprintf(str_buffer + n, QDF_TRACE_BUFFER_SIZE - n,
2231 str_format, val);
2232#if defined(WLAN_LOGGING_SOCK_SVC_ENABLE)
2233 wlan_log_to_user(verbose, (char *)str_buffer,
2234 strlen(str_buffer));
Adil Saeed Musthafa33188072017-03-13 12:13:47 -07002235 print_to_console(str_buffer);
Sathish Kumarfc93b2d2017-01-10 12:19:19 +05302236#else
2237 pr_err("%s\n", str_buffer);
2238#endif
2239 va_end(val);
2240 }
2241}
2242EXPORT_SYMBOL(qdf_trace_msg_cmn);
2243
Mohit Khanna7750a172017-05-15 15:53:33 -07002244/**
2245 * qdf_dp_trace_throttle_live_mode() - Throttle DP Trace live mode
2246 * @high_bw_request: whether this is a high BW req or not
2247 *
2248 * The function tries to prevent excessive logging into the live buffer by
2249 * having an upper limit on number of packets that can be logged per second.
2250 *
2251 * The intention is to allow occasional pings and data packets and really low
2252 * throughput levels while suppressing bursts and higher throughput levels so
2253 * that we donot hog the live buffer.
2254 *
2255 * If the number of packets printed in a particular second exceeds the thresh,
2256 * disable printing in the next second.
2257 *
2258 * Return: None
2259 */
2260void qdf_dp_trace_throttle_live_mode(bool high_bw_request)
2261{
2262 static int bw_interval_counter;
2263
2264 if (g_qdf_dp_trace_data.enable == false ||
2265 g_qdf_dp_trace_data.live_mode_config == false)
2266 return;
2267
2268 if (high_bw_request) {
2269 g_qdf_dp_trace_data.live_mode = 0;
2270 bw_interval_counter = 0;
2271 return;
2272 }
2273
2274 bw_interval_counter++;
2275
2276 if (0 == (bw_interval_counter %
2277 g_qdf_dp_trace_data.thresh_time_limit)) {
2278
2279 spin_lock_bh(&l_dp_trace_lock);
2280 if (g_qdf_dp_trace_data.print_pkt_cnt <=
2281 g_qdf_dp_trace_data.high_tput_thresh)
2282 g_qdf_dp_trace_data.live_mode = 1;
2283
2284 g_qdf_dp_trace_data.print_pkt_cnt = 0;
2285 spin_unlock_bh(&l_dp_trace_lock);
2286 }
2287
2288}
2289EXPORT_SYMBOL(qdf_dp_trace_throttle_live_mode);
2290
Sathish Kumarfc93b2d2017-01-10 12:19:19 +05302291QDF_STATUS qdf_print_setup(void)
2292{
2293 int i;
2294
2295 /* Loop through all print ctrl objects */
2296 for (i = 0; i < MAX_PRINT_CONFIG_SUPPORTED; i++) {
2297 if (qdf_print_ctrl_cleanup(i))
2298 return QDF_STATUS_E_FAILURE;
2299 }
2300 return QDF_STATUS_SUCCESS;
2301}
2302EXPORT_SYMBOL(qdf_print_setup);
2303
2304QDF_STATUS qdf_print_ctrl_cleanup(unsigned int idx)
2305{
2306 int i = 0;
2307
2308 if (idx < 0 || idx >= MAX_PRINT_CONFIG_SUPPORTED) {
2309 pr_info("%s: Invalid index - %d\n", __func__, idx);
2310 return QDF_STATUS_E_FAILURE;
2311 }
2312
2313 /* Clean up the print control object corresponding to that index
2314 * If success, callee to change print control index to -1
2315 */
2316
2317 for (i = 0; i < MAX_SUPPORTED_CATEGORY; i++) {
2318 print_ctrl_obj[idx].cat_info[i].category_verbose_mask =
2319 QDF_TRACE_LEVEL_NONE;
2320 }
2321 print_ctrl_obj[idx].custom_print = NULL;
2322 print_ctrl_obj[idx].custom_ctxt = NULL;
2323 qdf_print_clean_node_flag(idx);
2324 print_ctrl_obj[idx].in_use = false;
2325
2326 pr_info("%s: Print control object %d cleaned up\n", __func__, idx);
2327
2328 return QDF_STATUS_SUCCESS;
2329}
2330EXPORT_SYMBOL(qdf_print_ctrl_cleanup);
2331
2332int qdf_print_ctrl_register(const struct category_info *cinfo,
2333 void *custom_print_handler,
2334 void *custom_ctx,
2335 const char *pctrl_name)
2336{
2337 int idx = -1;
2338 int i = 0;
2339
2340 for (i = 0; i < MAX_PRINT_CONFIG_SUPPORTED; i++) {
2341 if (!print_ctrl_obj[i].in_use) {
2342 idx = i;
2343 break;
2344 }
2345 }
2346
2347 /* Callee to handle idx -1 appropriately */
2348 if (idx == -1) {
2349 pr_info("%s: Allocation failed! No print control object free\n",
2350 __func__);
2351 return idx;
2352 }
2353
2354 print_ctrl_obj[idx].in_use = true;
2355
2356 /*
2357 * In case callee does not pass category info,
2358 * custom print handler, custom context and print control name,
2359 * we do not set any value here. Clean up for the print control
2360 * getting allocated would have taken care of initializing
2361 * default values.
2362 *
2363 * We need to only set in_use to 1 in such a case
2364 */
2365
2366 if (pctrl_name) {
2367 qdf_str_lcopy(print_ctrl_obj[idx].name, pctrl_name,
2368 qdf_str_len(pctrl_name) + 1);
2369 }
2370
2371 if (custom_print_handler)
2372 print_ctrl_obj[idx].custom_print = custom_print_handler;
2373
2374 if (custom_ctx)
2375 print_ctrl_obj[idx].custom_ctxt = custom_ctx;
2376
2377 if (cinfo) {
2378 for (i = 0; i < MAX_SUPPORTED_CATEGORY; i++) {
2379 if (cinfo[i].category_verbose_mask ==
2380 QDF_TRACE_LEVEL_ALL) {
2381 print_ctrl_obj[idx].cat_info[i]
2382 .category_verbose_mask = 0xFFFF;
Sathish Kumar470c6202017-05-10 19:56:48 +05302383 } else if ((cinfo[i].category_verbose_mask ==
2384 QDF_TRACE_LEVEL_NONE) ||
2385 (cinfo[i].category_verbose_mask ==
2386 QDF_TRACE_LEVEL_TO_MODULE_BITMASK(
2387 QDF_TRACE_LEVEL_NONE))) {
2388 print_ctrl_obj[idx].cat_info[i]
2389 .category_verbose_mask = 0;
Sathish Kumarfc93b2d2017-01-10 12:19:19 +05302390 } else {
2391 print_ctrl_obj[idx].cat_info[i]
2392 .category_verbose_mask =
2393 cinfo[i].category_verbose_mask;
2394 }
2395 }
2396 }
2397
2398 pr_info("%s: Allocated print control object %d\n",
2399 __func__, idx);
2400 return idx;
2401}
2402EXPORT_SYMBOL(qdf_print_ctrl_register);
2403
Adil Saeed Musthafa33188072017-03-13 12:13:47 -07002404#ifndef CONFIG_MCL
2405void qdf_shared_print_ctrl_cleanup(void)
2406{
2407 qdf_print_ctrl_cleanup(qdf_pidx);
2408}
2409EXPORT_SYMBOL(qdf_shared_print_ctrl_cleanup);
2410
Adil Saeed Musthafa2ef27872017-05-02 16:40:45 -07002411/*
2412 * Set this to invalid value to differentiate with user-provided
2413 * value.
2414 */
Adil Saeed Musthafa03e2ac22017-05-19 16:55:23 -07002415int qdf_dbg_mask = 0;
Adil Saeed Musthafa2ef27872017-05-02 16:40:45 -07002416EXPORT_SYMBOL(qdf_dbg_mask);
2417qdf_declare_param(qdf_dbg_mask, int);
2418
2419/*
2420 * QDF can be passed parameters which indicate the
2421 * debug level for each module.
2422 * an array of string values are passed, each string hold the following form
2423 *
2424 * <module name string>=<integer debug level value>
2425 *
2426 * The array qdf_dbg_arr will hold these module-string=value strings
2427 * The variable qdf_dbg_arr_cnt will have the count of how many such
2428 * string values were passed.
2429 */
2430static char *qdf_dbg_arr[QDF_MODULE_ID_MAX];
2431static int qdf_dbg_arr_cnt;
2432qdf_declare_param_array(qdf_dbg_arr, charp, &qdf_dbg_arr_cnt);
2433
2434static uint16_t set_cumulative_verbose_mask(QDF_TRACE_LEVEL max_level)
2435{
2436 uint16_t category_verbose_mask = 0;
2437 QDF_TRACE_LEVEL level;
2438
2439 for (level = QDF_TRACE_LEVEL_FATAL; level <= max_level; level++) {
2440 category_verbose_mask |=
2441 QDF_TRACE_LEVEL_TO_MODULE_BITMASK(level);
2442 }
2443 return category_verbose_mask;
2444}
2445
2446static QDF_MODULE_ID find_qdf_module_from_string(char *str)
2447{
2448 QDF_MODULE_ID mod_id;
2449
2450 for (mod_id = 0; mod_id < QDF_MODULE_ID_MAX; mod_id++) {
2451 if (strcasecmp(str,
2452 g_qdf_category_name[mod_id].category_name_str)
2453 == 0) {
2454 break;
2455 }
2456 }
2457 return mod_id;
2458}
2459
2460static void process_qdf_dbg_arr_param(struct category_info *cinfo,
2461 int array_index)
2462{
2463 char *mod_val_str, *mod_str, *val_str;
2464 unsigned long dbg_level;
2465 QDF_MODULE_ID mod_id;
2466
2467 mod_val_str = qdf_dbg_arr[array_index];
2468 mod_str = strsep(&mod_val_str, "=");
2469 val_str = mod_val_str;
2470 if (val_str == NULL) {
2471 pr_info("qdf_dbg_arr: %s not in the <mod>=<val> form\n",
2472 mod_str);
2473 return;
2474 }
2475
2476 mod_id = find_qdf_module_from_string(mod_str);
2477 if (mod_id >= QDF_MODULE_ID_MAX) {
2478 pr_info("ERROR!!Module name %s not in the list of modules\n",
2479 mod_str);
2480 return;
2481 }
2482
2483 if (kstrtol(val_str, 10, &dbg_level) < 0) {
2484 pr_info("ERROR!!Invalid debug level for module: %s\n",
2485 mod_str);
2486 return;
2487 }
2488
2489 if (dbg_level >= QDF_TRACE_LEVEL_MAX) {
2490 pr_info("ERROR!!Debug level for %s too high", mod_str);
2491 pr_info("max: %d given %lu\n", QDF_TRACE_LEVEL_MAX,
2492 dbg_level);
2493 return;
2494 }
2495
2496 pr_info("User passed setting module %s(%d) to level %lu\n",
2497 mod_str,
2498 mod_id,
2499 dbg_level);
2500 cinfo[mod_id].category_verbose_mask =
2501 set_cumulative_verbose_mask((QDF_TRACE_LEVEL)dbg_level);
2502}
2503
2504static void set_default_trace_levels(struct category_info *cinfo)
2505{
2506 int i;
2507 static QDF_TRACE_LEVEL module_trace_default_level[QDF_MODULE_ID_MAX] = {
Sathish Kumaradeb66e2017-05-18 11:29:05 +05302508 [QDF_MODULE_ID_TDLS] = QDF_TRACE_LEVEL_NONE,
2509 [QDF_MODULE_ID_ACS] = QDF_TRACE_LEVEL_NONE,
2510 [QDF_MODULE_ID_SCAN_SM] = QDF_TRACE_LEVEL_NONE,
2511 [QDF_MODULE_ID_SCANENTRY] = QDF_TRACE_LEVEL_NONE,
2512 [QDF_MODULE_ID_WDS] = QDF_TRACE_LEVEL_NONE,
2513 [QDF_MODULE_ID_ACTION] = QDF_TRACE_LEVEL_NONE,
2514 [QDF_MODULE_ID_ROAM] = QDF_TRACE_LEVEL_NONE,
2515 [QDF_MODULE_ID_INACT] = QDF_TRACE_LEVEL_NONE,
2516 [QDF_MODULE_ID_DOTH] = QDF_TRACE_LEVEL_NONE,
2517 [QDF_MODULE_ID_IQUE] = QDF_TRACE_LEVEL_NONE,
2518 [QDF_MODULE_ID_WME] = QDF_TRACE_LEVEL_NONE,
2519 [QDF_MODULE_ID_ACL] = QDF_TRACE_LEVEL_NONE,
2520 [QDF_MODULE_ID_WPA] = QDF_TRACE_LEVEL_NONE,
2521 [QDF_MODULE_ID_RADKEYS] = QDF_TRACE_LEVEL_NONE,
2522 [QDF_MODULE_ID_RADDUMP] = QDF_TRACE_LEVEL_NONE,
2523 [QDF_MODULE_ID_RADIUS] = QDF_TRACE_LEVEL_NONE,
2524 [QDF_MODULE_ID_DOT1XSM] = QDF_TRACE_LEVEL_NONE,
2525 [QDF_MODULE_ID_DOT1X] = QDF_TRACE_LEVEL_NONE,
2526 [QDF_MODULE_ID_POWER] = QDF_TRACE_LEVEL_NONE,
2527 [QDF_MODULE_ID_STATE] = QDF_TRACE_LEVEL_NONE,
2528 [QDF_MODULE_ID_OUTPUT] = QDF_TRACE_LEVEL_NONE,
2529 [QDF_MODULE_ID_SCAN] = QDF_TRACE_LEVEL_NONE,
2530 [QDF_MODULE_ID_AUTH] = QDF_TRACE_LEVEL_NONE,
2531 [QDF_MODULE_ID_ASSOC] = QDF_TRACE_LEVEL_NONE,
2532 [QDF_MODULE_ID_NODE] = QDF_TRACE_LEVEL_NONE,
2533 [QDF_MODULE_ID_ELEMID] = QDF_TRACE_LEVEL_NONE,
2534 [QDF_MODULE_ID_XRATE] = QDF_TRACE_LEVEL_NONE,
2535 [QDF_MODULE_ID_INPUT] = QDF_TRACE_LEVEL_NONE,
2536 [QDF_MODULE_ID_CRYPTO] = QDF_TRACE_LEVEL_NONE,
2537 [QDF_MODULE_ID_DUMPPKTS] = QDF_TRACE_LEVEL_NONE,
2538 [QDF_MODULE_ID_DEBUG] = QDF_TRACE_LEVEL_NONE,
2539 [QDF_MODULE_ID_MLME] = QDF_TRACE_LEVEL_NONE,
2540 [QDF_MODULE_ID_RRM] = QDF_TRACE_LEVEL_NONE,
2541 [QDF_MODULE_ID_WNM] = QDF_TRACE_LEVEL_NONE,
2542 [QDF_MODULE_ID_P2P_PROT] = QDF_TRACE_LEVEL_NONE,
2543 [QDF_MODULE_ID_PROXYARP] = QDF_TRACE_LEVEL_NONE,
2544 [QDF_MODULE_ID_L2TIF] = QDF_TRACE_LEVEL_NONE,
2545 [QDF_MODULE_ID_WIFIPOS] = QDF_TRACE_LEVEL_NONE,
2546 [QDF_MODULE_ID_WRAP] = QDF_TRACE_LEVEL_NONE,
2547 [QDF_MODULE_ID_DFS] = QDF_TRACE_LEVEL_NONE,
2548 [QDF_MODULE_ID_ATF] = QDF_TRACE_LEVEL_NONE,
2549 [QDF_MODULE_ID_SPLITMAC] = QDF_TRACE_LEVEL_NONE,
2550 [QDF_MODULE_ID_IOCTL] = QDF_TRACE_LEVEL_NONE,
2551 [QDF_MODULE_ID_NAC] = QDF_TRACE_LEVEL_NONE,
2552 [QDF_MODULE_ID_MESH] = QDF_TRACE_LEVEL_NONE,
2553 [QDF_MODULE_ID_MBO] = QDF_TRACE_LEVEL_NONE,
2554 [QDF_MODULE_ID_EXTIOCTL_CHANSWITCH] = QDF_TRACE_LEVEL_NONE,
2555 [QDF_MODULE_ID_EXTIOCTL_CHANSSCAN] = QDF_TRACE_LEVEL_NONE,
2556 [QDF_MODULE_ID_TLSHIM] = QDF_TRACE_LEVEL_NONE,
2557 [QDF_MODULE_ID_WMI] = QDF_TRACE_LEVEL_NONE,
2558 [QDF_MODULE_ID_HTT] = QDF_TRACE_LEVEL_NONE,
2559 [QDF_MODULE_ID_HDD] = QDF_TRACE_LEVEL_NONE,
2560 [QDF_MODULE_ID_SME] = QDF_TRACE_LEVEL_NONE,
2561 [QDF_MODULE_ID_PE] = QDF_TRACE_LEVEL_NONE,
2562 [QDF_MODULE_ID_WMA] = QDF_TRACE_LEVEL_NONE,
2563 [QDF_MODULE_ID_SYS] = QDF_TRACE_LEVEL_NONE,
2564 [QDF_MODULE_ID_QDF] = QDF_TRACE_LEVEL_NONE,
2565 [QDF_MODULE_ID_SAP] = QDF_TRACE_LEVEL_NONE,
2566 [QDF_MODULE_ID_HDD_SOFTAP] = QDF_TRACE_LEVEL_NONE,
2567 [QDF_MODULE_ID_HDD_DATA] = QDF_TRACE_LEVEL_NONE,
2568 [QDF_MODULE_ID_HDD_SAP_DATA] = QDF_TRACE_LEVEL_NONE,
2569 [QDF_MODULE_ID_HIF] = QDF_TRACE_LEVEL_NONE,
2570 [QDF_MODULE_ID_HTC] = QDF_TRACE_LEVEL_NONE,
2571 [QDF_MODULE_ID_TXRX] = QDF_TRACE_LEVEL_NONE,
2572 [QDF_MODULE_ID_QDF_DEVICE] = QDF_TRACE_LEVEL_NONE,
2573 [QDF_MODULE_ID_CFG] = QDF_TRACE_LEVEL_NONE,
2574 [QDF_MODULE_ID_BMI] = QDF_TRACE_LEVEL_NONE,
2575 [QDF_MODULE_ID_EPPING] = QDF_TRACE_LEVEL_NONE,
2576 [QDF_MODULE_ID_QVIT] = QDF_TRACE_LEVEL_NONE,
Adil Saeed Musthafa03e2ac22017-05-19 16:55:23 -07002577 [QDF_MODULE_ID_DP] = QDF_TRACE_LEVEL_FATAL,
Sathish Kumaradeb66e2017-05-18 11:29:05 +05302578 [QDF_MODULE_ID_SOC] = QDF_TRACE_LEVEL_NONE,
2579 [QDF_MODULE_ID_OS_IF] = QDF_TRACE_LEVEL_NONE,
Srinivas Pitlac4bdc7a2018-01-08 16:53:37 +05302580 [QDF_MODULE_ID_TARGET_IF] = QDF_TRACE_LEVEL_INFO,
Sathish Kumaradeb66e2017-05-18 11:29:05 +05302581 [QDF_MODULE_ID_SCHEDULER] = QDF_TRACE_LEVEL_NONE,
2582 [QDF_MODULE_ID_MGMT_TXRX] = QDF_TRACE_LEVEL_NONE,
2583 [QDF_MODULE_ID_PMO] = QDF_TRACE_LEVEL_NONE,
2584 [QDF_MODULE_ID_POLICY_MGR] = QDF_TRACE_LEVEL_NONE,
2585 [QDF_MODULE_ID_NAN] = QDF_TRACE_LEVEL_NONE,
2586 [QDF_MODULE_ID_P2P] = QDF_TRACE_LEVEL_NONE,
2587 [QDF_MODULE_ID_OFFCHAN_TXRX] = QDF_TRACE_LEVEL_NONE,
Vivek2c86b212017-06-05 00:02:11 +05302588 [QDF_MODULE_ID_OBJ_MGR] = QDF_TRACE_LEVEL_INFO,
Varun Reddy Yeturu25764252017-08-10 13:53:01 -07002589 [QDF_MODULE_ID_SERIALIZATION] = QDF_TRACE_LEVEL_NONE,
Aniruddha Paulb2f7ab62017-10-09 14:40:04 +05302590 [QDF_MODULE_ID_NSS] = QDF_TRACE_LEVEL_ERROR,
Deepak Dhamdhere7e0b8ba2017-07-03 00:33:26 -07002591 [QDF_MODULE_ID_ROAM_DEBUG] = QDF_TRACE_LEVEL_ERROR,
Sathish Kumara9a42eb2017-11-17 17:26:39 +05302592 [QDF_MODULE_ID_DIRECT_BUF_RX] = QDF_TRACE_LEVEL_ERROR,
Himanshu Agarwalb3c81ac2018-01-10 14:21:53 +05302593 [QDF_MODULE_ID_GREEN_AP] = QDF_TRACE_LEVEL_ERROR,
Santosh Anbud5fdfac2018-01-03 22:33:58 +05302594 [QDF_MODULE_ID_EXTAP] = QDF_TRACE_LEVEL_NONE,
Subrat Mishrabf125872017-09-27 14:41:20 +05302595 [QDF_MODULE_ID_FD] = QDF_TRACE_LEVEL_ERROR,
Akshay Kosigi81394132018-01-18 11:41:13 +05302596 [QDF_MODULE_ID_FTM] = QDF_TRACE_LEVEL_ERROR,
Zhang Qian82377ce2018-01-04 12:15:29 +08002597 [QDF_MODULE_ID_OCB] = QDF_TRACE_LEVEL_ERROR,
Sathish Kumaradeb66e2017-05-18 11:29:05 +05302598 [QDF_MODULE_ID_ANY] = QDF_TRACE_LEVEL_NONE,
Adil Saeed Musthafa2ef27872017-05-02 16:40:45 -07002599 };
2600
2601 for (i = 0; i < MAX_SUPPORTED_CATEGORY; i++) {
2602 cinfo[i].category_verbose_mask = set_cumulative_verbose_mask(
2603 module_trace_default_level[i]);
2604 }
2605}
2606
Adil Saeed Musthafa33188072017-03-13 12:13:47 -07002607void qdf_shared_print_ctrl_init(void)
2608{
2609 int i;
Adil Saeed Musthafa33188072017-03-13 12:13:47 -07002610 struct category_info *cinfo = qdf_mem_malloc((sizeof(*cinfo))*
2611 MAX_SUPPORTED_CATEGORY);
2612 if (cinfo == NULL) {
2613 pr_info("ERROR!! qdf_mem_malloc failed. \
Adil Saeed Musthafa2ef27872017-05-02 16:40:45 -07002614 Shared Print Ctrl object not initialized \
2615 \nQDF_TRACE messages may not be logged/displayed");
Adil Saeed Musthafa33188072017-03-13 12:13:47 -07002616 return;
2617 }
Adil Saeed Musthafa2ef27872017-05-02 16:40:45 -07002618
2619 set_default_trace_levels(cinfo);
2620
2621 /*
2622 * User specified across-module single debug level
2623 */
Adil Saeed Musthafa03e2ac22017-05-19 16:55:23 -07002624 if ((qdf_dbg_mask > 0) && (qdf_dbg_mask <= QDF_TRACE_LEVEL_MAX)) {
Adil Saeed Musthafa2ef27872017-05-02 16:40:45 -07002625 pr_info("User specified module debug level of %d\n",
2626 qdf_dbg_mask);
2627 for (i = 0; i < MAX_SUPPORTED_CATEGORY; i++) {
2628 cinfo[i].category_verbose_mask =
2629 set_cumulative_verbose_mask(qdf_dbg_mask);
Adil Saeed Musthafa33188072017-03-13 12:13:47 -07002630 }
Adil Saeed Musthafa2ef27872017-05-02 16:40:45 -07002631 } else {
2632 pr_info("qdf_dbg_mask value is invalid\n");
2633 pr_info("Using the default module debug levels instead\n");
2634 }
2635
2636 /*
2637 * Module ID-Level specified as array during module load
2638 */
2639 for (i = 0; i < qdf_dbg_arr_cnt; i++) {
2640 process_qdf_dbg_arr_param(cinfo, i);
Adil Saeed Musthafa33188072017-03-13 12:13:47 -07002641 }
2642 qdf_pidx = qdf_print_ctrl_register(cinfo, NULL, NULL,
2643 "LOG_SHARED_OBJ");
2644 qdf_mem_free(cinfo);
2645}
2646EXPORT_SYMBOL(qdf_shared_print_ctrl_init);
2647#endif
2648
Sathish Kumarfc93b2d2017-01-10 12:19:19 +05302649QDF_STATUS qdf_print_set_category_verbose(unsigned int idx,
2650 QDF_MODULE_ID category,
2651 QDF_TRACE_LEVEL verbose,
2652 bool is_set)
2653{
2654 /* Check if index passed is valid */
2655 if (idx < 0 || idx >= MAX_PRINT_CONFIG_SUPPORTED) {
2656 pr_info("%s: Invalid index - %d\n", __func__, idx);
2657 return QDF_STATUS_E_FAILURE;
2658 }
2659
2660 /* Check if print control object is in use */
2661 if (!print_ctrl_obj[idx].in_use) {
2662 pr_info("%s: Invalid print control object\n", __func__);
2663 return QDF_STATUS_E_FAILURE;
2664 }
2665
2666 /* Check if category passed is valid */
2667 if (category < 0 || category >= MAX_SUPPORTED_CATEGORY) {
2668 pr_info("%s: Invalid category: %d\n", __func__, category);
2669 return QDF_STATUS_E_FAILURE;
2670 }
2671
2672 /* Check if verbose mask is valid */
2673 if (verbose < 0 || verbose >= QDF_TRACE_LEVEL_MAX) {
2674 pr_info("%s: Invalid verbose level %d\n", __func__, verbose);
2675 return QDF_STATUS_E_FAILURE;
2676 }
2677
2678 if (verbose == QDF_TRACE_LEVEL_ALL) {
2679 print_ctrl_obj[idx].cat_info[category].category_verbose_mask =
2680 0xFFFF;
2681 return QDF_STATUS_SUCCESS;
2682 }
2683
2684 if (verbose == QDF_TRACE_LEVEL_NONE) {
2685 print_ctrl_obj[idx].cat_info[category].category_verbose_mask =
2686 QDF_TRACE_LEVEL_NONE;
2687 return QDF_STATUS_SUCCESS;
2688 }
2689
2690 if (!is_set) {
2691 if (print_ctrl_obj[idx].cat_info[category].category_verbose_mask
2692 & QDF_TRACE_LEVEL_TO_MODULE_BITMASK(verbose)) {
2693 print_ctrl_obj[idx].cat_info[category]
2694 .category_verbose_mask &=
2695 ~QDF_TRACE_LEVEL_TO_MODULE_BITMASK(verbose);
2696 }
2697 } else {
2698 print_ctrl_obj[idx].cat_info[category].category_verbose_mask |=
2699 QDF_TRACE_LEVEL_TO_MODULE_BITMASK(verbose);
2700 }
2701
2702 pr_info("%s: Print control object %d, Category %d, Verbose level %d\n",
2703 __func__,
2704 idx,
2705 category,
2706 print_ctrl_obj[idx].cat_info[category].category_verbose_mask);
2707
2708 return QDF_STATUS_SUCCESS;
2709}
2710EXPORT_SYMBOL(qdf_print_set_category_verbose);
2711
2712bool qdf_print_is_category_enabled(unsigned int idx, QDF_MODULE_ID category)
2713{
2714 QDF_TRACE_LEVEL verbose_mask;
2715
2716 /* Check if index passed is valid */
2717 if (idx < 0 || idx >= MAX_PRINT_CONFIG_SUPPORTED) {
2718 pr_info("%s: Invalid index - %d\n", __func__, idx);
2719 return false;
2720 }
2721
2722 /* Check if print control object is in use */
2723 if (!print_ctrl_obj[idx].in_use) {
2724 pr_info("%s: Invalid print control object\n", __func__);
2725 return false;
2726 }
2727
2728 /* Check if category passed is valid */
2729 if (category < 0 || category >= MAX_SUPPORTED_CATEGORY) {
2730 pr_info("%s: Invalid category: %d\n", __func__, category);
2731 return false;
2732 }
2733
2734 verbose_mask =
2735 print_ctrl_obj[idx].cat_info[category].category_verbose_mask;
2736
2737 if (verbose_mask == QDF_TRACE_LEVEL_NONE)
2738 return false;
2739 else
2740 return true;
2741}
2742EXPORT_SYMBOL(qdf_print_is_category_enabled);
2743
2744bool qdf_print_is_verbose_enabled(unsigned int idx, QDF_MODULE_ID category,
2745 QDF_TRACE_LEVEL verbose)
2746{
2747 bool verbose_enabled = false;
2748
2749 /* Check if index passed is valid */
2750 if (idx < 0 || idx >= MAX_PRINT_CONFIG_SUPPORTED) {
2751 pr_info("%s: Invalid index - %d\n", __func__, idx);
2752 return verbose_enabled;
2753 }
2754
2755 /* Check if print control object is in use */
2756 if (!print_ctrl_obj[idx].in_use) {
2757 pr_info("%s: Invalid print control object\n", __func__);
2758 return verbose_enabled;
2759 }
2760
2761 /* Check if category passed is valid */
2762 if (category < 0 || category >= MAX_SUPPORTED_CATEGORY) {
2763 pr_info("%s: Invalid category: %d\n", __func__, category);
2764 return verbose_enabled;
2765 }
2766
2767 if ((verbose == QDF_TRACE_LEVEL_NONE) ||
2768 (verbose >= QDF_TRACE_LEVEL_MAX)) {
2769 verbose_enabled = false;
2770 } else if (verbose == QDF_TRACE_LEVEL_ALL) {
2771 if (print_ctrl_obj[idx].cat_info[category]
2772 .category_verbose_mask == 0xFFFF)
2773 verbose_enabled = true;
2774 } else {
2775 verbose_enabled =
2776 (print_ctrl_obj[idx].cat_info[category].category_verbose_mask &
2777 QDF_TRACE_LEVEL_TO_MODULE_BITMASK(verbose)) ? true : false;
2778 }
2779
2780 return verbose_enabled;
2781}
2782EXPORT_SYMBOL(qdf_print_is_verbose_enabled);
2783
2784#ifdef DBG_LVL_MAC_FILTERING
2785
2786QDF_STATUS qdf_print_set_node_flag(unsigned int idx, uint8_t enable)
2787{
2788 /* Check if index passed is valid */
2789 if (idx < 0 || idx >= MAX_PRINT_CONFIG_SUPPORTED) {
2790 pr_info("%s: Invalid index - %d\n", __func__, idx);
2791 return QDF_STATUS_E_FAILURE;
2792 }
2793
2794 /* Check if print control object is in use */
2795 if (!print_ctrl_obj[idx].in_use) {
2796 pr_info("%s: Invalid print control object\n", __func__);
2797 return QDF_STATUS_E_FAILURE;
2798 }
2799
2800 if (enable > 1) {
2801 pr_info("%s: Incorrect input: Use 1 or 0 to enable or disable\n",
2802 __func__);
2803 return QDF_STATUS_E_FAILURE;
2804 }
2805
2806 print_ctrl_obj[idx].dbglvlmac_on = enable;
2807 pr_info("%s: DbgLVLmac feature %s\n",
2808 __func__,
2809 ((enable) ? "enabled" : "disabled"));
2810
2811 return QDF_STATUS_SUCCESS;
2812}
2813EXPORT_SYMBOL(qdf_print_set_node_flag);
2814
2815bool qdf_print_get_node_flag(unsigned int idx)
2816{
2817 bool node_flag = false;
2818
2819 /* Check if index passed is valid */
2820 if (idx < 0 || idx >= MAX_PRINT_CONFIG_SUPPORTED) {
2821 pr_info("%s: Invalid index - %d\n", __func__, idx);
2822 return node_flag;
2823 }
2824
2825 /* Check if print control object is in use */
2826 if (!print_ctrl_obj[idx].in_use) {
2827 pr_info("%s: Invalid print control object\n", __func__);
2828 return node_flag;
2829 }
2830
2831 if (print_ctrl_obj[idx].dbglvlmac_on)
2832 node_flag = true;
2833
2834 return node_flag;
2835}
2836EXPORT_SYMBOL(qdf_print_get_node_flag);
2837
2838void qdf_print_clean_node_flag(unsigned int idx)
2839{
2840 /* Disable dbglvlmac_on during cleanup */
2841 print_ctrl_obj[idx].dbglvlmac_on = 0;
2842}
2843
2844#else
2845
2846void qdf_print_clean_node_flag(unsigned int idx)
2847{
2848 /* No operation in case of no support for DBG_LVL_MAC_FILTERING */
2849 return;
2850}
2851#endif
2852
Sathish Kumar59113a42017-01-04 12:02:24 +05302853void QDF_PRINT_INFO(unsigned int idx, QDF_MODULE_ID module,
2854 QDF_TRACE_LEVEL level,
2855 char *str_format, ...)
2856{
2857 va_list args;
2858
2859 /* Generic wrapper API will compile qdf_vprint in order to
2860 * log the message. Once QDF converged debug framework is in
2861 * place, this will be changed to adapt to the framework, compiling
2862 * call to converged tracing API
2863 */
2864 va_start(args, str_format);
2865 qdf_vprint(str_format, args);
2866 va_end(args);
2867}
2868EXPORT_SYMBOL(QDF_PRINT_INFO);
Adil Saeed Musthafabcf62ed2017-02-20 16:22:39 -08002869
2870#ifdef WLAN_LOGGING_SOCK_SVC_ENABLE
2871void qdf_logging_init(void)
2872{
2873 wlan_logging_sock_init_svc();
Adil Saeed Musthafabcf62ed2017-02-20 16:22:39 -08002874 nl_srv_init(NULL);
2875}
2876
2877void qdf_logging_exit(void)
2878{
2879 nl_srv_exit();
Adil Saeed Musthafabcf62ed2017-02-20 16:22:39 -08002880 wlan_logging_sock_deinit_svc();
2881}
2882#else
2883void qdf_logging_init(void)
2884{
2885}
2886
2887void qdf_logging_exit(void)
2888{
2889}
2890#endif
2891
Dustin Browne226ceb2017-04-21 13:22:14 -07002892#ifdef CONFIG_KALLSYMS
2893inline int qdf_sprint_symbol(char *buffer, void *addr)
2894{
2895 return sprint_symbol(buffer, (unsigned long)addr);
2896}
2897#else
2898int qdf_sprint_symbol(char *buffer, void *addr)
2899{
2900 if (!buffer)
2901 return 0;
2902
2903 buffer[0] = '\0';
2904 return 1;
2905}
2906#endif
Dustin Browndd16c1b2017-04-27 15:34:39 -07002907EXPORT_SYMBOL(qdf_sprint_symbol);
Sathish Kumar470c6202017-05-10 19:56:48 +05302908
2909void qdf_set_pidx(int pidx)
2910{
2911 qdf_pidx = pidx;
2912}
2913EXPORT_SYMBOL(qdf_set_pidx);
2914
2915int qdf_get_pidx(void)
2916{
2917 return qdf_pidx;
2918}
2919EXPORT_SYMBOL(qdf_get_pidx);