1 /*
2 * Copyright (c) 2014-2021 The Linux Foundation. All rights reserved.
3 * Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved.
4 *
5 * Permission to use, copy, modify, and/or distribute this software for
6 * any purpose with or without fee is hereby granted, provided that the
7 * above copyright notice and this permission notice appear in all
8 * copies.
9 *
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
11 * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
12 * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
13 * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
14 * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
15 * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
16 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
17 * PERFORMANCE OF THIS SOFTWARE.
18 */
19
20 #if !defined(__QDF_TRACE_H)
21 #define __QDF_TRACE_H
22
23 /**
24 * DOC: qdf_trace
25 * QCA driver framework trace APIs
26 * Trace, logging, and debugging definitions and APIs
27 */
28
29 /* Include Files */
30 #include <qdf_types.h> /* For QDF_MODULE_ID... */
31 #include <qdf_status.h>
32 #include <qdf_nbuf.h>
33 #include <i_qdf_types.h>
34 #include <qdf_debugfs.h>
35
36
37 /* Type declarations */
38
39 #ifdef LOG_LINE_NUMBER
40 #define FL(x) "%s: %d: " x, __func__, __LINE__
41 #else
42 #define FL(x) "%s: " x, __func__
43 #endif
44
45 #define QDF_TRACE_BUFFER_SIZE (512)
46
47 /*
48 * Extracts the 8-bit group id from the wmi command id by performing the
49 * reverse operation of WMI_CMD_GRP_START_ID
50 */
51 #define QDF_WMI_MTRACE_GRP_ID(message_id) (((message_id) >> 12) & 0xFF)
52 /*
53 * Number of bits reserved for WMI mtrace command id
54 */
55 #define QDF_WMI_MTRACE_CMD_NUM_BITS 7
56 /*
57 * Extracts the 7-bit group specific command id from the wmi command id
58 */
59 #define QDF_WMI_MTRACE_CMD_ID(message_id) ((message_id) & 0x7F)
60
61 #ifdef QDF_TRACE_PRINT_ENABLE
62 #define QDF_DEFAULT_TRACE_LEVEL (1 << QDF_TRACE_LEVEL_INFO)
63 #endif
64
65 #define QDF_CATEGORY_INFO_U16(val) (((val >> 16) & 0x0000FFFF))
66 #define QDF_TRACE_LEVEL_INFO_L16(val) (val & 0x0000FFFF)
67
68 typedef int (qdf_abstract_print)(void *priv, const char *fmt, ...);
69
70 /*
71 * Log levels
72 */
73 #define QDF_DEBUG_FUNCTRACE 0x01
74 #define QDF_DEBUG_LEVEL0 0x02
75 #define QDF_DEBUG_LEVEL1 0x04
76 #define QDF_DEBUG_LEVEL2 0x08
77 #define QDF_DEBUG_LEVEL3 0x10
78 #define QDF_DEBUG_ERROR 0x20
79 #define QDF_DEBUG_CFG 0x40
80
81 /*
82 * Rate limit based on pkt prototype
83 */
84 #define QDF_MAX_DHCP_PKTS_PER_SEC (20)
85 #define QDF_MAX_EAPOL_PKTS_PER_SEC (50)
86 #define QDF_MAX_ARP_PKTS_PER_SEC (5)
87 #define QDF_MAX_DNS_PKTS_PER_SEC (5)
88 #define QDF_MAX_OTHER_PKTS_PER_SEC (1)
89
90 /* DP Trace Implementation */
91 #ifdef CONFIG_DP_TRACE
92 #define DPTRACE(p) p
93 #define DPTRACE_PRINT(args...) \
94 QDF_TRACE(QDF_MODULE_ID_QDF, QDF_TRACE_LEVEL_DEBUG, args)
95 #else
96 #define DPTRACE(p)
97 #define DPTRACE_PRINT(args...)
98 #endif
99
100 /* By default Data Path module will have all log levels enabled, except debug
101 * log level. Debug level will be left up to the framework or user space modules
102 * to be enabled when issue is detected
103 */
104 #define QDF_DATA_PATH_TRACE_LEVEL \
105 ((1 << QDF_TRACE_LEVEL_FATAL) | (1 << QDF_TRACE_LEVEL_ERROR) | \
106 (1 << QDF_TRACE_LEVEL_WARN) | (1 << QDF_TRACE_LEVEL_INFO) | \
107 (1 << QDF_TRACE_LEVEL_INFO_HIGH) | (1 << QDF_TRACE_LEVEL_INFO_MED) | \
108 (1 << QDF_TRACE_LEVEL_INFO_LOW))
109
110 /* Preprocessor definitions and constants */
111 #define ASSERT_BUFFER_SIZE (512)
112
113 #ifndef MAX_QDF_TRACE_RECORDS
114 #define MAX_QDF_TRACE_RECORDS 4000
115 #endif
116
117 #define QDF_TRACE_DEFAULT_PDEV_ID 0xff
118 #define INVALID_QDF_TRACE_ADDR 0xffffffff
119 #define DEFAULT_QDF_TRACE_DUMP_COUNT 0
120 #define QDF_TRACE_DEFAULT_MSDU_ID 0
121
122 /*
123 * first parameter to iwpriv command - dump_dp_trace
124 * iwpriv wlan0 dump_dp_trace 0 0 -> dump full buffer
125 * iwpriv wlan0 dump_dp_trace 1 0 -> enable live view mode
126 * iwpriv wlan0 dump_dp_trace 2 0 -> clear dp trace buffer
127 * iwpriv wlan0 dump_dp_trace 3 0 -> disable live view mode
128 */
129 #define DUMP_DP_TRACE 0
130 #define ENABLE_DP_TRACE_LIVE_MODE 1
131 #define CLEAR_DP_TRACE_BUFFER 2
132 #define DISABLE_DP_TRACE_LIVE_MODE 3
133
134
135 #ifdef TRACE_RECORD
136
137 #define MTRACE(p) p
138
139 #else
140 #define MTRACE(p) do { } while (0)
141
142 #endif
143 #define NO_SESSION 0xFF
144
145 /**
146 * struct qdf_trace_record_s - keep trace record
147 * @qtime: qtimer ticks
148 * @time: user timestamp
149 * @module: module name
150 * @code: hold record of code
151 * @session: hold record of session
152 * @data: hold data
153 * @pid: hold pid of the process
154 */
155 typedef struct qdf_trace_record_s {
156 uint64_t qtime;
157 char time[18];
158 uint8_t module;
159 uint16_t code;
160 uint16_t session;
161 uint32_t data;
162 uint32_t pid;
163 } qdf_trace_record_t, *tp_qdf_trace_record;
164
165 /**
166 * struct s_qdf_trace_data - MTRACE logs are stored in ring buffer
167 * @head: position of first record
168 * @tail: position of last record
169 * @num: count of total record
170 * @num_since_last_dump: count from last dump
171 * @enable: config for controlling the trace
172 * @dump_count: Dump after number of records reach this number
173 */
174 typedef struct s_qdf_trace_data {
175 uint32_t head;
176 uint32_t tail;
177 uint32_t num;
178 uint16_t num_since_last_dump;
179 uint8_t enable;
180 uint16_t dump_count;
181 } t_qdf_trace_data;
182
183 #ifdef CONNECTIVITY_DIAG_EVENT
184 /**
185 * enum diag_dp_tx_rx_status - TX/RX packet status
186 * @DIAG_TX_RX_STATUS_INVALID: default invalid status
187 * @DIAG_TX_RX_STATUS_OK: successfully sent + acked
188 * @DIAG_TX_RX_STATUS_FW_DISCARD: queued but not sent over air
189 * @DIAG_TX_RX_STATUS_NO_ACK: packet sent but no ack received
190 * @DIAG_TX_RX_STATUS_DROP: packet dropped due to congestion
191 * @DIAG_TX_RX_STATUS_DOWNLOAD_SUCC: packet delivered to target
192 * @DIAG_TX_RX_STATUS_DEFAULT: default status
193 * @DIAG_TX_RX_STATUS_MAX:
194 */
195 enum diag_dp_tx_rx_status {
196 DIAG_TX_RX_STATUS_INVALID,
197 DIAG_TX_RX_STATUS_OK,
198 DIAG_TX_RX_STATUS_FW_DISCARD,
199 DIAG_TX_RX_STATUS_NO_ACK,
200 DIAG_TX_RX_STATUS_DROP,
201 DIAG_TX_RX_STATUS_DOWNLOAD_SUCC,
202 DIAG_TX_RX_STATUS_DEFAULT,
203 DIAG_TX_RX_STATUS_MAX
204 };
205
206 /**
207 * enum diag_tx_status - Used by attribute
208 * @DIAG_TX_STATUS_FAIL: Indicates frame is not sent over the air.
209 * @DIAG_TX_STATUS_NO_ACK: Indicates packet sent but acknowledgment
210 * is not received.
211 * @DIAG_TX_STATUS_ACK: Indicates the frame is successfully sent and
212 * acknowledged.
213 */
214 enum diag_tx_status {
215 DIAG_TX_STATUS_FAIL = 1,
216 DIAG_TX_STATUS_NO_ACK = 2,
217 DIAG_TX_STATUS_ACK = 3
218 };
219
220 /**
221 * wlan_get_diag_tx_status() - Gives the diag logging specific tx status
222 * @tx_status: fw specific TX status
223 *
224 * Returns TX status specified in enum diag_tx_status
225 */
226 enum diag_tx_status wlan_get_diag_tx_status(enum qdf_dp_tx_rx_status tx_status);
227 #endif
228
229 #define CASE_RETURN_STRING(str) case ((str)): return (uint8_t *)(# str);
230
231 #ifndef MAX_QDF_DP_TRACE_RECORDS
232 #define MAX_QDF_DP_TRACE_RECORDS 2000
233 #endif
234
235 #define QDF_DP_TRACE_RECORD_SIZE 66 /* bytes */
236 #define INVALID_QDF_DP_TRACE_ADDR 0xffffffff
237 #define QDF_DP_TRACE_VERBOSITY_HIGH 4
238 #define QDF_DP_TRACE_VERBOSITY_MEDIUM 3
239 #define QDF_DP_TRACE_VERBOSITY_LOW 2
240 #define QDF_DP_TRACE_VERBOSITY_ULTRA_LOW 1
241 #define QDF_DP_TRACE_VERBOSITY_BASE 0
242
243 /**
244 * enum QDF_DP_TRACE_ID - Generic ID to identify various events in data path
245 * @QDF_DP_TRACE_INVALID: invalid
246 * @QDF_DP_TRACE_DROP_PACKET_RECORD: record drop packet
247 * @QDF_DP_TRACE_EAPOL_PACKET_RECORD: record EAPOL packet
248 * @QDF_DP_TRACE_DHCP_PACKET_RECORD: record DHCP packet
249 * @QDF_DP_TRACE_ARP_PACKET_RECORD: record ARP packet
250 * @QDF_DP_TRACE_MGMT_PACKET_RECORD: record MGMT pacekt
251 * @QDF_DP_TRACE_EVENT_RECORD: record events
252 * @QDF_DP_TRACE_BASE_VERBOSITY: below this are part of base verbosity
253 * @QDF_DP_TRACE_ICMP_PACKET_RECORD: record ICMP packet
254 * @QDF_DP_TRACE_ICMPv6_PACKET_RECORD: record ICMPv6 packet
255 * @QDF_DP_TRACE_HDD_TX_TIMEOUT: HDD tx timeout
256 * @QDF_DP_TRACE_HDD_SOFTAP_TX_TIMEOUT: SOFTAP HDD tx timeout
257 * @QDF_DP_TRACE_TX_CREDIT_RECORD: credit update record
258 * @QDF_DP_TRACE_ULTRA_LOW_VERBOSITY: Below this is not logged for >4PPS
259 * @QDF_DP_TRACE_TX_PACKET_RECORD: record 32 bytes of tx pkt at any layer
260 * @QDF_DP_TRACE_RX_PACKET_RECORD: record 32 bytes of rx pkt at any layer
261 * @QDF_DP_TRACE_HDD_TX_PACKET_RECORD: record 32 bytes of tx pkt at HDD
262 * @QDF_DP_TRACE_HDD_RX_PACKET_RECORD: record 32 bytes of rx pkt at HDD
263 * @QDF_DP_TRACE_LI_DP_TX_PACKET_RECORD: record data bytes of tx pkt at LI_DP
264 * @QDF_DP_TRACE_LI_DP_RX_PACKET_RECORD: record data bytes of rx pkt at LI_DP
265 * @QDF_DP_TRACE_LI_DP_FREE_PACKET_PTR_RECORD: tx completion ptr record for
266 * lithium
267 * @QDF_DP_TRACE_FREE_PACKET_PTR_RECORD: tx completion ptr record
268 * @QDF_DP_TRACE_LOW_VERBOSITY: below this are part of low verbosity
269 * @QDF_DP_TRACE_HDD_TX_PACKET_PTR_RECORD: HDD layer ptr record
270 * @QDF_DP_TRACE_TX_PACKET_PTR_RECORD: DP component Tx ptr record
271 * @QDF_DP_TRACE_LI_DP_TX_PACKET_PTR_RECORD: Lithium DP layer ptr record
272 * @QDF_DP_TRACE_RX_PACKET_PTR_RECORD: DP component Rx ptr record
273 * @QDF_DP_TRACE_RX_HDD_PACKET_PTR_RECORD: HDD RX record
274 * @QDF_DP_TRACE_CE_PACKET_PTR_RECORD: CE layer ptr record
275 * @QDF_DP_TRACE_CE_FAST_PACKET_PTR_RECORD: CE fastpath ptr record
276 * @QDF_DP_TRACE_CE_FAST_PACKET_ERR_RECORD: CE fastpath error record
277 * @QDF_DP_TRACE_RX_HTT_PACKET_PTR_RECORD: HTT RX record
278 * @QDF_DP_TRACE_RX_OFFLOAD_HTT_PACKET_PTR_RECORD: HTT RX offload record
279 * @QDF_DP_TRACE_RX_LI_DP_PACKET_PTR_RECORD: Lithium DP RX record
280 * @QDF_DP_TRACE_MED_VERBOSITY: below this are part of med verbosity
281 * @QDF_DP_TRACE_TXRX_QUEUE_PACKET_PTR_RECORD: tx queue ptr record
282 * @QDF_DP_TRACE_TXRX_PACKET_PTR_RECORD: txrx packet ptr record
283 * @QDF_DP_TRACE_TXRX_FAST_PACKET_PTR_RECORD: txrx fast path record
284 * @QDF_DP_TRACE_HTT_PACKET_PTR_RECORD: htt packet ptr record
285 * @QDF_DP_TRACE_HTC_PACKET_PTR_RECORD: htc packet ptr record
286 * @QDF_DP_TRACE_HIF_PACKET_PTR_RECORD: hif packet ptr record
287 * @QDF_DP_TRACE_RX_TXRX_PACKET_PTR_RECORD: txrx packet ptr record
288 * @QDF_DP_TRACE_LI_DP_NULL_RX_PACKET_RECORD:
289 * record data bytes of rx null_queue pkt at LI_DP
290 * @QDF_DP_TRACE_HIGH_VERBOSITY: below this are part of high verbosity
291 * @QDF_DP_TRACE_MAX: Max enumeration
292 */
293
294 enum QDF_DP_TRACE_ID {
295 QDF_DP_TRACE_INVALID,
296 QDF_DP_TRACE_DROP_PACKET_RECORD,
297 QDF_DP_TRACE_EAPOL_PACKET_RECORD,
298 QDF_DP_TRACE_DHCP_PACKET_RECORD,
299 QDF_DP_TRACE_ARP_PACKET_RECORD,
300 QDF_DP_TRACE_MGMT_PACKET_RECORD,
301 QDF_DP_TRACE_EVENT_RECORD,
302 QDF_DP_TRACE_BASE_VERBOSITY,
303 QDF_DP_TRACE_ICMP_PACKET_RECORD,
304 QDF_DP_TRACE_ICMPv6_PACKET_RECORD,
305 QDF_DP_TRACE_HDD_TX_TIMEOUT,
306 QDF_DP_TRACE_HDD_SOFTAP_TX_TIMEOUT,
307 QDF_DP_TRACE_TX_CREDIT_RECORD,
308 QDF_DP_TRACE_ULTRA_LOW_VERBOSITY,
309 QDF_DP_TRACE_TX_PACKET_RECORD,
310 QDF_DP_TRACE_RX_PACKET_RECORD,
311 QDF_DP_TRACE_HDD_TX_PACKET_RECORD,
312 QDF_DP_TRACE_HDD_RX_PACKET_RECORD,
313 QDF_DP_TRACE_LI_DP_TX_PACKET_RECORD,
314 QDF_DP_TRACE_LI_DP_RX_PACKET_RECORD,
315 QDF_DP_TRACE_LI_DP_FREE_PACKET_PTR_RECORD,
316 QDF_DP_TRACE_FREE_PACKET_PTR_RECORD,
317 QDF_DP_TRACE_LOW_VERBOSITY,
318 QDF_DP_TRACE_HDD_TX_PACKET_PTR_RECORD,
319 QDF_DP_TRACE_TX_PACKET_PTR_RECORD,
320 QDF_DP_TRACE_LI_DP_TX_PACKET_PTR_RECORD,
321 QDF_DP_TRACE_RX_PACKET_PTR_RECORD,
322 QDF_DP_TRACE_RX_HDD_PACKET_PTR_RECORD,
323 QDF_DP_TRACE_CE_PACKET_PTR_RECORD,
324 QDF_DP_TRACE_CE_FAST_PACKET_PTR_RECORD,
325 QDF_DP_TRACE_CE_FAST_PACKET_ERR_RECORD,
326 QDF_DP_TRACE_RX_HTT_PACKET_PTR_RECORD,
327 QDF_DP_TRACE_RX_OFFLOAD_HTT_PACKET_PTR_RECORD,
328 QDF_DP_TRACE_RX_LI_DP_PACKET_PTR_RECORD,
329 QDF_DP_TRACE_MED_VERBOSITY,
330 QDF_DP_TRACE_TXRX_QUEUE_PACKET_PTR_RECORD,
331 QDF_DP_TRACE_TXRX_PACKET_PTR_RECORD,
332 QDF_DP_TRACE_TXRX_FAST_PACKET_PTR_RECORD,
333 QDF_DP_TRACE_HTT_PACKET_PTR_RECORD,
334 QDF_DP_TRACE_HTC_PACKET_PTR_RECORD,
335 QDF_DP_TRACE_HIF_PACKET_PTR_RECORD,
336 QDF_DP_TRACE_RX_TXRX_PACKET_PTR_RECORD,
337 QDF_DP_TRACE_LI_DP_NULL_RX_PACKET_RECORD,
338 QDF_DP_TRACE_HIGH_VERBOSITY,
339 QDF_DP_TRACE_MAX
340 };
341
342 /**
343 * enum qdf_proto_dir - direction
344 * @QDF_TX: TX direction
345 * @QDF_RX: RX direction
346 * @QDF_NA: not applicable
347 */
348 enum qdf_proto_dir {
349 QDF_TX,
350 QDF_RX,
351 QDF_NA
352 };
353
354 /**
355 * enum QDF_CREDIT_UPDATE_SOURCE - source of credit record
356 * @QDF_TX_SCHED: Tx scheduler
357 * @QDF_TX_COMP: TX completion
358 * @QDF_TX_CREDIT_UPDATE: credit update indication
359 * @QDF_HTT_ATTACH: HTT attach
360 * @QDF_TX_HTT_MSG: HTT TX message
361 */
362 enum QDF_CREDIT_UPDATE_SOURCE {
363 QDF_TX_SCHED,
364 QDF_TX_COMP,
365 QDF_TX_CREDIT_UPDATE,
366 QDF_HTT_ATTACH,
367 QDF_TX_HTT_MSG
368 };
369
370 /**
371 * enum QDF_CREDIT_OPERATION - operation on credit
372 * @QDF_CREDIT_INC: credit increment
373 * @QDF_CREDIT_DEC: credit decrement
374 * @QDF_CREDIT_ABS: Abosolute credit
375 * @QDF_OP_NA: Not applicable
376 */
377 enum QDF_CREDIT_OPERATION {
378 QDF_CREDIT_INC,
379 QDF_CREDIT_DEC,
380 QDF_CREDIT_ABS,
381 QDF_OP_NA
382 };
383
384 /**
385 * struct qdf_dp_trace_ptr_buf - pointer record buffer
386 * @cookie: cookie value
387 * @msdu_id: msdu_id
388 * @status: completion status
389 */
390 struct qdf_dp_trace_ptr_buf {
391 uint64_t cookie;
392 uint16_t msdu_id;
393 uint16_t status;
394 };
395
396 /**
397 * struct qdf_dp_trace_proto_cmn - common info in proto packet
398 * @vdev_id: vdev id
399 * @type: packet type
400 * @subtype: packet subtype
401 * @proto_priv_data: protocol private data
402 * can be stored in this.
403 * @mpdu_seq: 802.11 MPDU sequence number
404 */
405 struct qdf_dp_trace_proto_cmn {
406 uint8_t vdev_id;
407 uint8_t type;
408 uint8_t subtype;
409 uint32_t proto_priv_data;
410 uint16_t mpdu_seq;
411 };
412
413 /**
414 * struct qdf_dp_trace_proto_buf - proto packet buffer
415 * @sa: source address
416 * @da: destination address
417 * @dir: direction
418 * @cmn_info: common info
419 */
420 struct qdf_dp_trace_proto_buf {
421 struct qdf_mac_addr sa;
422 struct qdf_mac_addr da;
423 uint8_t dir;
424 struct qdf_dp_trace_proto_cmn cmn_info;
425 };
426
427 /**
428 * struct qdf_dp_trace_mgmt_buf - mgmt packet buffer
429 * @vdev_id: vdev id
430 * @type: packet type
431 * @subtype: packet subtype
432 */
433 struct qdf_dp_trace_mgmt_buf {
434 uint8_t vdev_id;
435 uint8_t type;
436 uint8_t subtype;
437 };
438
439 /**
440 * struct qdf_dp_trace_credit_record - tx credit record
441 * @source: credit record source
442 * @operation: credit operation
443 * @delta: delta of credit
444 * @total_credits: total credit
445 * @g0_credit: group 0 credit
446 * @g1_credit: group 1 credit
447 */
448 struct qdf_dp_trace_credit_record {
449 enum QDF_CREDIT_UPDATE_SOURCE source;
450 enum QDF_CREDIT_OPERATION operation;
451 int delta;
452 int total_credits;
453 int g0_credit;
454 int g1_credit;
455 };
456
457 /**
458 * struct qdf_dp_trace_event_buf - event buffer
459 * @vdev_id: vdev id
460 * @type: packet type
461 * @subtype: packet subtype
462 */
463 struct qdf_dp_trace_event_buf {
464 uint8_t vdev_id;
465 uint8_t type;
466 uint8_t subtype;
467 };
468
469 /**
470 * struct qdf_dp_trace_data_buf - nbuf data buffer
471 * @msdu_id: msdu id
472 */
473 struct qdf_dp_trace_data_buf {
474 uint16_t msdu_id;
475 };
476
477 /**
478 * struct qdf_dp_trace_record_s - Describes a record in DP trace
479 * @time: time when it got stored
480 * @code: Describes the particular event
481 * @data: buffer to store data
482 * @size: Length of the valid data stored in this record
483 * @pid: process id which stored the data in this record
484 * @pdev_id: pdev associated with the event
485 */
486 struct qdf_dp_trace_record_s {
487 uint64_t time;
488 uint8_t code;
489 uint8_t data[QDF_DP_TRACE_RECORD_SIZE];
490 uint8_t size;
491 uint32_t pid;
492 uint8_t pdev_id;
493 };
494
495 /**
496 * struct s_qdf_dp_trace_data - Parameters to configure/control DP trace
497 * @head: Position of first record
498 * @tail: Position of last record
499 * @num: Current index
500 * @proto_bitmap: defines which protocol to be traced
501 * @no_of_record: defines every nth packet to be traced
502 * @num_records_to_dump: defines number of records to be dumped
503 * @dump_counter: counter to track number of records dumped
504 * @verbosity: defines verbosity level
505 * @ini_conf_verbosity: Configured verbosity from INI
506 * @enable: enable/disable DP trace
507 * @count: current packet number
508 * @live_mode_config: configuration as received during initialization
509 * @live_mode: current live mode, enabled or disabled, can be throttled based
510 * on throughput
511 * @curr_pos:
512 * @saved_tail:
513 * @force_live_mode: flag to enable live mode all the time for all packets.
514 * This can be set/unset from userspace and overrides other
515 * live mode flags.
516 * @dynamic_verbosity_modify: Dynamic user configured verbosity overrides all
517 * @print_pkt_cnt: count of number of packets printed in live mode
518 * @high_tput_thresh: thresh beyond which live mode is turned off
519 * @thresh_time_limit: max time, in terms of BW timer intervals to wait,
520 * for determining if high_tput_thresh has been crossed. ~1s
521 * @tx_count: tx counter
522 * @rx_count: rx counter
523 * @arp_req: stats for arp reqs
524 * @arp_resp: stats for arp resps
525 * @icmp_req: stats for icmp reqs
526 * @icmp_resp: stats for icmp resps
527 * @dhcp_disc: stats for dhcp discover msgs
528 * @dhcp_req: stats for dhcp req msgs
529 * @dhcp_off: stats for dhcp offer msgs
530 * @dhcp_ack: stats for dhcp ack msgs
531 * @dhcp_nack: stats for dhcp nack msgs
532 * @dhcp_others: stats for other dhcp pkts types
533 * @eapol_m1: stats for eapol m1
534 * @eapol_m2: stats for eapol m2
535 * @eapol_m3: stats for eapol m3
536 * @eapol_m4: stats for eapol m4
537 * @eapol_others: stats for other eapol pkt types
538 * @icmpv6_req: stats for icmpv6 reqs
539 * @icmpv6_resp: stats for icmpv6 resps
540 * @icmpv6_ns: stats for icmpv6 nss
541 * @icmpv6_na: stats for icmpv6 nas
542 * @icmpv6_rs: stats for icmpv6 rss
543 * @icmpv6_ra: stats for icmpv6 ras
544 * @proto_event_bitmap: defines which protocol to be diag logged.
545 * refer QDF_NBUF_PKT_TRAC_TYPE_DNS to QDF_NBUF_PKT_TRAC_TYPE_ARP
546 * for bitmap.
547 */
548 struct s_qdf_dp_trace_data {
549 uint32_t head;
550 uint32_t tail;
551 uint32_t num;
552 uint32_t proto_bitmap;
553 uint8_t no_of_record;
554 uint16_t num_records_to_dump;
555 uint16_t dump_counter;
556 uint8_t verbosity;
557 uint8_t ini_conf_verbosity;
558 bool enable;
559 bool live_mode_config;
560 bool live_mode;
561 uint32_t curr_pos;
562 uint32_t saved_tail;
563 bool force_live_mode;
564 bool dynamic_verbosity_modify;
565 uint8_t print_pkt_cnt;
566 uint8_t high_tput_thresh;
567 uint16_t thresh_time_limit;
568 /* Stats */
569 uint32_t tx_count;
570 uint32_t rx_count;
571 u16 arp_req;
572 u16 arp_resp;
573 u16 dhcp_disc;
574 u16 dhcp_req;
575 u16 dhcp_off;
576 u16 dhcp_ack;
577 u16 dhcp_nack;
578 u16 dhcp_others;
579 u16 eapol_m1;
580 u16 eapol_m2;
581 u16 eapol_m3;
582 u16 eapol_m4;
583 u16 eapol_others;
584 u16 icmp_req;
585 u16 icmp_resp;
586 u16 icmpv6_req;
587 u16 icmpv6_resp;
588 u16 icmpv6_ns;
589 u16 icmpv6_na;
590 u16 icmpv6_rs;
591 u16 icmpv6_ra;
592 uint32_t proto_event_bitmap;
593 };
594
595 /**
596 * enum qdf_dpt_debugfs_state - state to control read to debugfs file
597 * @QDF_DPT_DEBUGFS_STATE_SHOW_STATE_INVALID: invalid state
598 * @QDF_DPT_DEBUGFS_STATE_SHOW_STATE_INIT: initial state
599 * @QDF_DPT_DEBUGFS_STATE_SHOW_IN_PROGRESS: read is in progress
600 * @QDF_DPT_DEBUGFS_STATE_SHOW_COMPLETE: read complete
601 */
602
603 enum qdf_dpt_debugfs_state {
604 QDF_DPT_DEBUGFS_STATE_SHOW_STATE_INVALID,
605 QDF_DPT_DEBUGFS_STATE_SHOW_STATE_INIT,
606 QDF_DPT_DEBUGFS_STATE_SHOW_IN_PROGRESS,
607 QDF_DPT_DEBUGFS_STATE_SHOW_COMPLETE,
608 };
609
610 #define QDF_WIFI_MODULE_PARAMS_FILE "wifi_module_param.ini"
611
612 typedef void (*tp_qdf_trace_cb)(void *p_mac, tp_qdf_trace_record, uint16_t);
613 typedef void (*tp_qdf_state_info_cb) (char **buf, uint16_t *size);
614 #ifdef WLAN_FEATURE_MEMDUMP_ENABLE
615
616 /**
617 * qdf_register_debugcb_init() - initializes debug callbacks
618 * to NULL
619 *
620 * Return: None
621 */
622 void qdf_register_debugcb_init(void);
623
624 /**
625 * qdf_register_debug_callback() - stores callback handlers to print
626 * state information
627 * @module_id: module id of layer
628 * @qdf_state_infocb: callback to be registered
629 *
630 * This function is used to store callback handlers to print
631 * state information
632 *
633 * Return: None
634 */
635 void qdf_register_debug_callback(QDF_MODULE_ID module_id,
636 tp_qdf_state_info_cb qdf_state_infocb);
637
638 /**
639 * qdf_state_info_dump_all() - it invokes callback of layer which registered
640 * its callback to print its state information.
641 * @buf: buffer pointer to be passed
642 * @size: size of buffer to be filled
643 * @driver_dump_size: actual size of buffer used
644 *
645 * Return: QDF_STATUS_SUCCESS on success
646 */
647 QDF_STATUS qdf_state_info_dump_all(char *buf, uint16_t size,
648 uint16_t *driver_dump_size);
649 #else /* WLAN_FEATURE_MEMDUMP_ENABLE */
qdf_register_debugcb_init(void)650 static inline void qdf_register_debugcb_init(void)
651 {
652 }
653 #endif /* WLAN_FEATURE_MEMDUMP_ENABLE */
654
655 #ifdef TRACE_RECORD
656 /**
657 * qdf_trace_register() - registers the call back functions
658 * @module_id: enum value of module
659 * @qdf_trace_callback: call back functions to display the messages in
660 * particular format.
661 *
662 * Registers the call back functions to display the messages in particular
663 * format mentioned in these call back functions. This functions should be
664 * called by interested module in their init part as we will be ready to
665 * register as soon as modules are up.
666 *
667 * Return: None
668 */
669 void qdf_trace_register(QDF_MODULE_ID module_id,
670 tp_qdf_trace_cb qdf_trace_callback);
671
672 /**
673 * qdf_trace_init() - initializes qdf trace structures and variables
674 *
675 * Called immediately after cds_preopen, so that we can start recording HDD
676 * events ASAP.
677 *
678 * Return: None
679 */
680 void qdf_trace_init(void);
681
682 /**
683 * qdf_trace_deinit() - frees memory allocated dynamically
684 *
685 * Called from cds_deinit, so that we can free the memory and resets
686 * the variables
687 *
688 * Return: None
689 */
690 void qdf_trace_deinit(void);
691
692 /**
693 * qdf_trace() - puts the messages in to ring-buffer
694 * @module: Enum of module, basically module id.
695 * @code: Code to be recorded
696 * @session: Session ID of the log
697 * @data: Actual message contents
698 *
699 * This function will be called from each module who wants record the messages
700 * in circular queue. Before calling this functions make sure you have
701 * registered your module with qdf through qdf_trace_register function.
702 *
703 * Return: None
704 */
705 void qdf_trace(uint8_t module, uint16_t code, uint16_t session, uint32_t data);
706
707 /**
708 * qdf_trace_enable() - Enable MTRACE for specific modules
709 * @bitmask_of_module_id: Bitmask according to enum of the modules.
710 * 32[dec] = 0010 0000 [bin] <enum of HDD is 5>
711 * 64[dec] = 0100 0000 [bin] <enum of SME is 6>
712 * 128[dec] = 1000 0000 [bin] <enum of PE is 7>
713 * @enable: can be true or false true implies enabling MTRACE false implies
714 * disabling MTRACE.
715 *
716 * Enable MTRACE for specific modules whose bits are set in bitmask and enable
717 * is true. if enable is false it disables MTRACE for that module. set the
718 * bitmask according to enum value of the modules.
719 * This functions will be called when you issue ioctl as mentioned following
720 * [iwpriv wlan0 setdumplog <value> <enable>].
721 * <value> - Decimal number, i.e. 64 decimal value shows only SME module,
722 * 128 decimal value shows only PE module, 192 decimal value shows PE and SME.
723 *
724 * Return: None
725 */
726 void qdf_trace_enable(uint32_t bitmask_of_module_id, uint8_t enable);
727
728 /**
729 * qdf_trace_dump_all() - Dump data from ring buffer via call back functions
730 * registered with QDF
731 * @p_mac: Context of particular module
732 * @code: Reason code
733 * @session: Session id of log
734 * @count: Number of lines to dump starting from tail to head
735 * @bitmask_of_module: Bitmask according to enum of the modules.
736 *
737 * This function will be called up on issuing ioctl call as mentioned following
738 * [iwpriv wlan0 dumplog 0 0 <n> <bitmask_of_module>]
739 *
740 * <n> - number lines to dump starting from tail to head.
741 *
742 * <bitmask_of_module> - if anybody wants to know how many messages were
743 * recorded for particular module/s mentioned by setbit in bitmask from last
744 * <n> messages. It is optional, if you don't provide then it will dump
745 * everything from buffer.
746 *
747 * Return: None
748 */
749 void qdf_trace_dump_all(void *p_mac, uint8_t code, uint8_t session,
750 uint32_t count, uint32_t bitmask_of_module);
751
752 /**
753 * qdf_trace_spin_lock_init() - initializes the lock variable before use
754 *
755 * This function will be called from cds_alloc_global_context, we will have lock
756 * available to use ASAP
757 *
758 * Return: None
759 */
760 QDF_STATUS qdf_trace_spin_lock_init(void);
761 #else
762 #ifndef QDF_TRACE_PRINT_ENABLE
763 static inline
qdf_trace_init(void)764 void qdf_trace_init(void)
765 {
766 }
767
768 static inline
qdf_trace_deinit(void)769 void qdf_trace_deinit(void)
770 {
771 }
772
773 static inline
qdf_trace_enable(uint32_t bitmask_of_module_id,uint8_t enable)774 void qdf_trace_enable(uint32_t bitmask_of_module_id, uint8_t enable)
775 {
776 }
777
778 static inline
qdf_trace(uint8_t module,uint16_t code,uint16_t session,uint32_t data)779 void qdf_trace(uint8_t module, uint16_t code, uint16_t session, uint32_t data)
780 {
781 }
782
783 static inline
qdf_trace_dump_all(void * p_mac,uint8_t code,uint8_t session,uint32_t count,uint32_t bitmask_of_module)784 void qdf_trace_dump_all(void *p_mac, uint8_t code, uint8_t session,
785 uint32_t count, uint32_t bitmask_of_module)
786 {
787 }
788
789 static inline
qdf_trace_spin_lock_init(void)790 QDF_STATUS qdf_trace_spin_lock_init(void)
791 {
792 return QDF_STATUS_SUCCESS;
793 }
794 #endif
795 #endif
796
797 #ifdef WLAN_MAX_LOGS_PER_SEC
798 /**
799 * qdf_detected_excessive_logging() - Excessive logging detected
800 *
801 * Track logging count using a quasi-tumbling window.
802 * If the max logging count for a given window is exceeded,
803 * return true else fails.
804 *
805 * Return: true/false
806 */
807 bool qdf_detected_excessive_logging(void);
808
809 /**
810 * qdf_rl_print_count_set() - set the ratelimiting print count
811 * @rl_print_count: ratelimiting print count
812 *
813 * Return: none
814 */
815 void qdf_rl_print_count_set(uint32_t rl_print_count);
816
817 /**
818 * qdf_rl_print_time_set() - set the ratelimiting print time
819 * @rl_print_time: ratelimiting print time
820 *
821 * Return: none
822 */
823 void qdf_rl_print_time_set(uint32_t rl_print_time);
824
825 /**
826 * qdf_rl_print_suppressed_log() - print the suppressed logs count
827 *
828 * Return: none
829 */
830 void qdf_rl_print_suppressed_log(void);
831
832 /**
833 * qdf_rl_print_suppressed_inc() - increment the suppressed logs count
834 *
835 * Return: none
836 */
837 void qdf_rl_print_suppressed_inc(void);
838
839 #else /* WLAN_MAX_LOGS_PER_SEC */
qdf_detected_excessive_logging(void)840 static inline bool qdf_detected_excessive_logging(void)
841 {
842 return false;
843 }
qdf_rl_print_count_set(uint32_t rl_print_count)844 static inline void qdf_rl_print_count_set(uint32_t rl_print_count) {}
qdf_rl_print_time_set(uint32_t rl_print_time)845 static inline void qdf_rl_print_time_set(uint32_t rl_print_time) {}
qdf_rl_print_suppressed_log(void)846 static inline void qdf_rl_print_suppressed_log(void) {}
qdf_rl_print_suppressed_inc(void)847 static inline void qdf_rl_print_suppressed_inc(void) {}
848 #endif /* WLAN_MAX_LOGS_PER_SEC */
849
850 #ifdef ENABLE_MTRACE_LOG
851 /**
852 * qdf_mtrace_log() - Logs a message tracepoint to DIAG
853 * Infrastructure.
854 * @src_module: Enum of source module (basically module id)
855 * from where the message with message_id is posted.
856 * @dst_module: Enum of destination module (basically module id)
857 * to which the message with message_id is posted.
858 * @message_id: Id of the message to be posted
859 * @vdev_id: Vdev Id
860 *
861 * This function logs to the DIAG Infrastructure a tracepoint for a
862 * message being sent from a source module to a destination module
863 * with a specific ID for the benefit of a specific vdev.
864 * For non-vdev messages vdev_id will be NO_SESSION
865 * Return: None
866 */
867 void qdf_mtrace_log(QDF_MODULE_ID src_module, QDF_MODULE_ID dst_module,
868 uint16_t message_id, uint8_t vdev_id);
869 #else
870 static inline
qdf_mtrace_log(QDF_MODULE_ID src_module,QDF_MODULE_ID dst_module,uint16_t message_id,uint8_t vdev_id)871 void qdf_mtrace_log(QDF_MODULE_ID src_module, QDF_MODULE_ID dst_module,
872 uint16_t message_id, uint8_t vdev_id)
873 {
874 }
875 #endif
876
877 #ifdef TRACE_RECORD
878 /**
879 * qdf_mtrace() - puts the messages in to ring-buffer
880 * and logs a message tracepoint to DIAG Infrastructure.
881 * @src_module: Enum of source module (basically module id)
882 * from where the message with message_id is posted.
883 * @dst_module: Enum of destination module (basically module id)
884 * to which the message with message_id is posted.
885 * @message_id: Id of the message to be posted
886 * @vdev_id: Vdev Id
887 * @data: Actual message contents
888 *
889 * This function will be called from each module which wants to record the
890 * messages in circular queue. Before calling this function make sure you
891 * have registered your module with qdf through qdf_trace_register function.
892 * In addition of the recording the messages in circular queue this function
893 * will log the message tracepoint to the DIAG infrastructure.
894 * these logs will be later used by post processing script.
895 *
896 * Return: None
897 */
898 void qdf_mtrace(QDF_MODULE_ID src_module, QDF_MODULE_ID dst_module,
899 uint16_t message_id, uint8_t vdev_id, uint32_t data);
900 #else
901 static inline
qdf_mtrace(QDF_MODULE_ID src_module,QDF_MODULE_ID dst_module,uint16_t message_id,uint8_t vdev_id,uint32_t data)902 void qdf_mtrace(QDF_MODULE_ID src_module, QDF_MODULE_ID dst_module,
903 uint16_t message_id, uint8_t vdev_id, uint32_t data)
904 {
905 }
906 #endif
907
908 #ifdef CONFIG_DP_TRACE
909 /**
910 * qdf_dp_set_proto_bitmap() - set dp trace proto bitmap
911 * @val: unsigned bitmap to set
912 *
913 * Return: proto bitmap
914 */
915 void qdf_dp_set_proto_bitmap(uint32_t val);
916
917 /**
918 * qdf_dp_trace_set_verbosity() - set verbosity value
919 * @val: Value to set
920 *
921 * Return: Null
922 */
923 void qdf_dp_trace_set_verbosity(uint32_t val);
924
925 /**
926 * qdf_dp_set_no_of_record() - set dp trace no_of_record
927 * @val: unsigned no_of_record to set
928 *
929 * Return: null
930 */
931 void qdf_dp_set_no_of_record(uint32_t val);
932
933 #define QDF_DP_TRACE_RECORD_INFO_LIVE (0x1)
934 #define QDF_DP_TRACE_RECORD_INFO_THROTTLED (0x1 << 1)
935
936 /**
937 * qdf_dp_trace_log_pkt() - log packet type enabled through iwpriv
938 * @vdev_id: vdev_id
939 * @skb: skb pointer
940 * @dir: direction
941 * @pdev_id: pdev_id
942 * @op_mode: Vdev Operation mode
943 *
944 * Return: true: some protocol was logged, false: no protocol was logged.
945 */
946 bool qdf_dp_trace_log_pkt(uint8_t vdev_id, struct sk_buff *skb,
947 enum qdf_proto_dir dir, uint8_t pdev_id,
948 enum QDF_OPMODE op_mode);
949
950 /**
951 * qdf_dp_trace_init() - enables the DP trace
952 * @live_mode_config: live mode configuration
953 * @thresh: high throughput threshold for disabling live mode
954 * @time_limit: max time to wait before deciding if thresh is crossed
955 * @verbosity: dptrace verbosity level
956 * @proto_bitmap: bitmap to enable/disable specific protocols
957 *
958 * Called during driver load to init dptrace
959 *
960 * A brief note on the 'thresh' param -
961 * Total # of packets received in a bandwidth timer interval beyond which
962 * DP Trace logging for data packets (including ICMP) will be disabled.
963 * In memory logging will still continue for these packets. Other packets for
964 * which proto.bitmap is set will continue to be recorded in logs and in memory.
965 *
966 * Return: None
967 */
968 void qdf_dp_trace_init(bool live_mode_config, uint8_t thresh,
969 uint16_t time_limit, uint8_t verbosity,
970 uint32_t proto_bitmap);
971
972 void qdf_dp_trace_deinit(void);
973
974 /**
975 * qdf_dp_trace_spin_lock_init() - initializes the lock variable before use
976 * This function will be called from cds_alloc_global_context, we will have lock
977 * available to use ASAP
978 *
979 * Return: None
980 */
981 void qdf_dp_trace_spin_lock_init(void);
982
983 /**
984 * qdf_dp_trace_set_value() - Configure the value to control DP trace
985 * @proto_bitmap: defines the protocol to be tracked
986 * @no_of_records: defines the nth packet which is traced
987 * @verbosity: defines the verbosity level
988 *
989 * Return: None
990 */
991 void qdf_dp_trace_set_value(uint32_t proto_bitmap, uint8_t no_of_records,
992 uint8_t verbosity);
993
994 /**
995 * qdf_dp_trace_set_track() - Marks whether the packet needs to be traced
996 * @nbuf: defines the netbuf
997 * @dir: direction
998 *
999 * Return: None
1000 */
1001 void qdf_dp_trace_set_track(qdf_nbuf_t nbuf, enum qdf_proto_dir dir);
1002
1003 /**
1004 * qdf_dp_trace() - Stores the data in buffer
1005 * @nbuf: defines the netbuf
1006 * @code: defines the event
1007 * @pdev_id: pdev_id
1008 * @data: defines the data to be stored
1009 * @size: defines the size of the data record
1010 * @dir: direction
1011 *
1012 * Return: None
1013 */
1014 void qdf_dp_trace(qdf_nbuf_t nbuf, enum QDF_DP_TRACE_ID code, uint8_t pdev_id,
1015 uint8_t *data, uint8_t size, enum qdf_proto_dir dir);
1016
1017 /**
1018 * qdf_dp_trace_dump_all() - Dump data from ring buffer via call back functions
1019 * registered with QDF
1020 * @count: Number of lines to dump starting from tail to head
1021 * @pdev_id: pdev_id
1022 *
1023 * Return: None
1024 */
1025 void qdf_dp_trace_dump_all(uint32_t count, uint8_t pdev_id);
1026
1027 /**
1028 * qdf_dpt_get_curr_pos_debugfs() - get curr position to start read
1029 * @file: debugfs file to read
1030 * @state: state to control read to debugfs file
1031 *
1032 * Return: curr pos
1033 */
1034 uint32_t qdf_dpt_get_curr_pos_debugfs(qdf_debugfs_file_t file,
1035 enum qdf_dpt_debugfs_state state);
1036 /**
1037 * qdf_dpt_dump_stats_debugfs() - dump DP Trace stats to debugfs file
1038 * @file: debugfs file to read
1039 * @curr_pos: curr position to start read
1040 *
1041 * Return: QDF_STATUS
1042 */
1043 QDF_STATUS qdf_dpt_dump_stats_debugfs(qdf_debugfs_file_t file,
1044 uint32_t curr_pos);
1045
1046 /**
1047 * qdf_dpt_set_value_debugfs() - set value of DP Trace debugfs params
1048 * @proto_bitmap: defines which protocol to be traced
1049 * @no_of_record: defines every nth packet to be traced
1050 * @verbosity: defines verbosity level
1051 * @num_records_to_dump: defines number of records to be dumped
1052 *
1053 * Return: none
1054 */
1055 void qdf_dpt_set_value_debugfs(uint8_t proto_bitmap, uint8_t no_of_record,
1056 uint8_t verbosity, uint16_t num_records_to_dump);
1057
1058
1059 /**
1060 * qdf_dp_trace_dump_stats() - dump DP Trace stats
1061 *
1062 * Return: none
1063 */
1064 void qdf_dp_trace_dump_stats(void);
1065 typedef void (*tp_qdf_dp_trace_cb)(struct qdf_dp_trace_record_s*,
1066 uint16_t, uint8_t, uint8_t info);
1067 /**
1068 * qdf_dp_display_record() - Displays a record in DP trace
1069 * @record: pointer to a record in DP trace
1070 * @index: record index
1071 * @pdev_id: pdev id for the mgmt pkt
1072 * @info: info used to display pkt (live mode, throttling)
1073 *
1074 * Return: None
1075 */
1076 void qdf_dp_display_record(struct qdf_dp_trace_record_s *record,
1077 uint16_t index, uint8_t pdev_id,
1078 uint8_t info);
1079
1080 /**
1081 * qdf_dp_display_ptr_record() - display record
1082 * @record: dptrace record
1083 * @rec_index: index
1084 * @pdev_id: pdev id for the mgmt pkt
1085 * @info: info used to display pkt (live mode, throttling)
1086 *
1087 * Return: none
1088 */
1089 void qdf_dp_display_ptr_record(struct qdf_dp_trace_record_s *record,
1090 uint16_t rec_index, uint8_t pdev_id,
1091 uint8_t info);
1092
1093 /**
1094 * qdf_dp_display_proto_pkt() - display proto packet
1095 * @record: dptrace record
1096 * @index: index
1097 * @pdev_id: pdev id for the mgmt pkt
1098 * @info: info used to display pkt (live mode, throttling)
1099 *
1100 * Return: none
1101 */
1102 void qdf_dp_display_proto_pkt(struct qdf_dp_trace_record_s *record,
1103 uint16_t index, uint8_t pdev_id,
1104 uint8_t info);
1105 /**
1106 * qdf_dp_display_data_pkt_record() - Displays a data packet in DP trace
1107 * @record: pointer to a record in DP trace
1108 * @rec_index: record index
1109 * @pdev_id: pdev id
1110 * @info: display info regarding record
1111 *
1112 * Return: None
1113 */
1114 void
1115 qdf_dp_display_data_pkt_record(struct qdf_dp_trace_record_s *record,
1116 uint16_t rec_index, uint8_t pdev_id,
1117 uint8_t info);
1118
1119 /**
1120 * qdf_dp_get_status_from_htt() - Convert htt tx status to qdf dp status
1121 * @status: htt_tx_status which needs to be converted
1122 *
1123 * Return: the status that from qdf_dp_tx_rx_status
1124 */
1125 enum qdf_dp_tx_rx_status qdf_dp_get_status_from_htt(uint8_t status);
1126
1127 /**
1128 * qdf_dp_get_status_from_a_status() - Convert A_STATUS to qdf dp status
1129 * @status: A_STATUS which needs to be converted
1130 *
1131 * Return: the status that from qdf_dp_tx_rx_status
1132 */
1133 enum qdf_dp_tx_rx_status qdf_dp_get_status_from_a_status(uint8_t status);
1134
1135 /**
1136 * qdf_dp_trace_ptr() - record dptrace
1137 * @nbuf: network buffer
1138 * @code: dptrace code
1139 * @pdev_id: pdev_id
1140 * @data: data
1141 * @size: size of data
1142 * @msdu_id: msdu_id
1143 * @buf_arg_status: return status
1144 * @qdf_tx_status: qdf tx rx status
1145 * @op_mode: Vdev Operation mode
1146 *
1147 * Return: none
1148 */
1149 void qdf_dp_trace_ptr(qdf_nbuf_t nbuf, enum QDF_DP_TRACE_ID code,
1150 uint8_t pdev_id, uint8_t *data, uint8_t size,
1151 uint16_t msdu_id, uint16_t buf_arg_status,
1152 enum qdf_dp_tx_rx_status qdf_tx_status,
1153 enum QDF_OPMODE op_mode);
1154
1155 /**
1156 * qdf_dp_trace_throttle_live_mode() - Throttle DP Trace live mode
1157 * @high_bw_request: whether this is a high BW req or not
1158 *
1159 * The function tries to prevent excessive logging into the live buffer by
1160 * having an upper limit on number of packets that can be logged per second.
1161 *
1162 * The intention is to allow occasional pings and data packets and really low
1163 * throughput levels while suppressing bursts and higher throughput levels so
1164 * that we donot hog the live buffer.
1165 *
1166 * If the number of packets printed in a particular second exceeds the thresh,
1167 * disable printing in the next second.
1168 *
1169 * Return: None
1170 */
1171 void qdf_dp_trace_throttle_live_mode(bool high_bw_request);
1172
1173 /**
1174 * qdf_dp_trace_apply_tput_policy() - Change verbosity based on the TPUT
1175 * @is_data_traffic: Is traffic more than low TPUT threashould
1176 *
1177 * Return: None
1178 */
1179 void qdf_dp_trace_apply_tput_policy(bool is_data_traffic);
1180
1181 /**
1182 * qdf_dp_trace_data_pkt() - trace data packet
1183 * @nbuf: nbuf which needs to be traced
1184 * @pdev_id: pdev_id
1185 * @code: QDF_DP_TRACE_ID for the packet (TX or RX)
1186 * @msdu_id: tx desc id for the nbuf (Only applies to TX packets)
1187 * @dir: TX or RX packet direction
1188 *
1189 * Return: None
1190 */
1191 void qdf_dp_trace_data_pkt(qdf_nbuf_t nbuf, uint8_t pdev_id,
1192 enum QDF_DP_TRACE_ID code, uint16_t msdu_id,
1193 enum qdf_proto_dir dir);
1194
1195 /**
1196 * qdf_dp_get_proto_bitmap() - get dp trace proto bitmap
1197 *
1198 * Return: proto bitmap
1199 */
1200 uint32_t qdf_dp_get_proto_bitmap(void);
1201
1202 uint8_t qdf_dp_get_verbosity(void);
1203
1204 /**
1205 * qdf_dp_get_no_of_record() - get dp trace no_of_record
1206 *
1207 * Return: number of records
1208 */
1209 uint8_t qdf_dp_get_no_of_record(void);
1210
1211 /**
1212 * qdf_dp_trace_proto_pkt() - record proto packet
1213 * @code: dptrace code
1214 * @sa: source mac address
1215 * @da: destination mac address
1216 * @dir: direction
1217 * @pdev_id: pdev id
1218 * @print: to print this proto pkt or not
1219 * @cmn_info: common info for proto pkt
1220 *
1221 * Return: none
1222 */
1223 void
1224 qdf_dp_trace_proto_pkt(enum QDF_DP_TRACE_ID code,
1225 uint8_t *sa, uint8_t *da,
1226 enum qdf_proto_dir dir,
1227 uint8_t pdev_id, bool print,
1228 struct qdf_dp_trace_proto_cmn *cmn_info);
1229
1230 /**
1231 * qdf_dp_trace_disable_live_mode() - disable live mode for dptrace
1232 *
1233 * Return: none
1234 */
1235 void qdf_dp_trace_disable_live_mode(void);
1236
1237 /**
1238 * qdf_dp_trace_enable_live_mode() - enable live mode for dptrace
1239 *
1240 * Return: none
1241 */
1242 void qdf_dp_trace_enable_live_mode(void);
1243
1244 /**
1245 * qdf_dp_trace_clear_buffer() - clear dp trace buffer
1246 *
1247 * Return: none
1248 */
1249 void qdf_dp_trace_clear_buffer(void);
1250
1251 /**
1252 * qdf_dp_trace_mgmt_pkt() - record mgmt packet
1253 * @code: dptrace code
1254 * @vdev_id: vdev id
1255 * @pdev_id: pdev_id
1256 * @type: proto type
1257 * @subtype: proto subtype
1258 *
1259 * Return: none
1260 */
1261 void qdf_dp_trace_mgmt_pkt(enum QDF_DP_TRACE_ID code, uint8_t vdev_id,
1262 uint8_t pdev_id, enum qdf_proto_type type,
1263 enum qdf_proto_subtype subtype);
1264
1265 /**
1266 * qdf_dp_trace_credit_record() - record credit update
1267 * @source: source of record
1268 * @operation: credit operation
1269 * @delta: credit delta
1270 * @total_credits: total credit
1271 * @g0_credit: group 0 credit
1272 * @g1_credit: group 1 credit
1273 */
1274 void qdf_dp_trace_credit_record(enum QDF_CREDIT_UPDATE_SOURCE source,
1275 enum QDF_CREDIT_OPERATION operation,
1276 int delta, int total_credits,
1277 int g0_credit, int g1_credit);
1278
1279 /**
1280 * qdf_dp_display_mgmt_pkt() - display proto packet
1281 * @record: dptrace record
1282 * @index: index
1283 * @pdev_id: pdev id for the mgmt pkt
1284 * @info: info used to display pkt (live mode, throttling)
1285 *
1286 * Return: none
1287 */
1288 void qdf_dp_display_mgmt_pkt(struct qdf_dp_trace_record_s *record,
1289 uint16_t index, uint8_t pdev_id, uint8_t info);
1290
1291 /**
1292 * qdf_dp_display_credit_record() - display credit record
1293 * @record: dptrace record
1294 * @index: index
1295 * @pdev_id: pdev id
1296 * @info: metadeta info
1297 */
1298 void qdf_dp_display_credit_record(struct qdf_dp_trace_record_s *record,
1299 uint16_t index, uint8_t pdev_id,
1300 uint8_t info);
1301
1302 /**
1303 * qdf_dp_display_event_record() - display event records
1304 * @record: dptrace record
1305 * @index: index
1306 * @pdev_id: pdev id for the mgmt pkt
1307 * @info: info used to display pkt (live mode, throttling)
1308 *
1309 * Return: none
1310 */
1311 void qdf_dp_display_event_record(struct qdf_dp_trace_record_s *record,
1312 uint16_t index, uint8_t pdev_id, uint8_t info);
1313
1314 /**
1315 * qdf_dp_trace_record_event() - record events
1316 * @code: dptrace code
1317 * @vdev_id: vdev id
1318 * @pdev_id: pdev_id
1319 * @type: proto type
1320 * @subtype: proto subtype
1321 *
1322 * Return: none
1323 */
1324 void qdf_dp_trace_record_event(enum QDF_DP_TRACE_ID code, uint8_t vdev_id,
1325 uint8_t pdev_id, enum qdf_proto_type type,
1326 enum qdf_proto_subtype subtype);
1327
1328 /**
1329 * qdf_dp_set_proto_event_bitmap() - Set the protocol event bitmap
1330 * @value: proto event bitmap value.
1331 *
1332 * QDF_NBUF_PKT_TRAC_TYPE_DNS 0x01
1333 * QDF_NBUF_PKT_TRAC_TYPE_EAPOL 0x02
1334 * QDF_NBUF_PKT_TRAC_TYPE_DHCP 0x04
1335 * QDF_NBUF_PKT_TRAC_TYPE_ARP 0x10
1336 *
1337 * Return: none
1338 */
1339 void qdf_dp_set_proto_event_bitmap(uint32_t value);
1340
1341 /**
1342 * qdf_dp_log_proto_pkt_info() - Send diag log event
1343 * @sa: source MAC address
1344 * @da: destination MAC address
1345 * @type: pkt type
1346 * @subtype: pkt subtype
1347 * @dir: tx or rx
1348 * @msdu_id: msdu id
1349 * @status: status
1350 *
1351 * Return: none
1352 */
1353 void qdf_dp_log_proto_pkt_info(uint8_t *sa, uint8_t *da, uint8_t type,
1354 uint8_t subtype, uint8_t dir, uint16_t msdu_id,
1355 uint8_t status);
1356
1357 /**
1358 * qdf_dp_track_noack_check() - Check if no ack count should be tracked for
1359 * the configured protocol packet types
1360 * @nbuf: nbuf
1361 * @subtype: subtype of packet to be tracked
1362 *
1363 * Return: none
1364 */
1365 void qdf_dp_track_noack_check(qdf_nbuf_t nbuf, enum qdf_proto_subtype *subtype);
1366 #else
1367 static inline
qdf_dp_trace_log_pkt(uint8_t vdev_id,struct sk_buff * skb,enum qdf_proto_dir dir,uint8_t pdev_id,enum QDF_OPMODE op_mode)1368 bool qdf_dp_trace_log_pkt(uint8_t vdev_id, struct sk_buff *skb,
1369 enum qdf_proto_dir dir, uint8_t pdev_id,
1370 enum QDF_OPMODE op_mode)
1371 {
1372 return false;
1373 }
1374 static inline
qdf_dp_trace_init(bool live_mode_config,uint8_t thresh,uint16_t time_limit,uint8_t verbosity,uint32_t proto_bitmap)1375 void qdf_dp_trace_init(bool live_mode_config, uint8_t thresh,
1376 uint16_t time_limit, uint8_t verbosity,
1377 uint32_t proto_bitmap)
1378 {
1379 }
1380
1381 static inline
qdf_dp_trace_deinit(void)1382 void qdf_dp_trace_deinit(void)
1383 {
1384 }
1385
1386 static inline
qdf_dp_trace_set_track(qdf_nbuf_t nbuf,enum qdf_proto_dir dir)1387 void qdf_dp_trace_set_track(qdf_nbuf_t nbuf, enum qdf_proto_dir dir)
1388 {
1389 }
1390 static inline
qdf_dp_trace_set_value(uint32_t proto_bitmap,uint8_t no_of_records,uint8_t verbosity)1391 void qdf_dp_trace_set_value(uint32_t proto_bitmap, uint8_t no_of_records,
1392 uint8_t verbosity)
1393 {
1394 }
1395
1396 static inline
qdf_dp_trace_dump_all(uint32_t count,uint8_t pdev_id)1397 void qdf_dp_trace_dump_all(uint32_t count, uint8_t pdev_id)
1398 {
1399 }
1400
1401 static inline
qdf_dpt_get_curr_pos_debugfs(qdf_debugfs_file_t file,enum qdf_dpt_debugfs_state state)1402 uint32_t qdf_dpt_get_curr_pos_debugfs(qdf_debugfs_file_t file,
1403 enum qdf_dpt_debugfs_state state)
1404 {
1405 return 0;
1406 }
1407
1408 static inline
qdf_dpt_dump_stats_debugfs(qdf_debugfs_file_t file,uint32_t curr_pos)1409 QDF_STATUS qdf_dpt_dump_stats_debugfs(qdf_debugfs_file_t file,
1410 uint32_t curr_pos)
1411 {
1412 return QDF_STATUS_SUCCESS;
1413 }
1414
1415 static inline
qdf_dpt_set_value_debugfs(uint8_t proto_bitmap,uint8_t no_of_record,uint8_t verbosity,uint16_t num_records_to_dump)1416 void qdf_dpt_set_value_debugfs(uint8_t proto_bitmap, uint8_t no_of_record,
1417 uint8_t verbosity, uint16_t num_records_to_dump)
1418 {
1419 }
1420
qdf_dp_trace_dump_stats(void)1421 static inline void qdf_dp_trace_dump_stats(void)
1422 {
1423 }
1424
1425 static inline
qdf_dp_trace_disable_live_mode(void)1426 void qdf_dp_trace_disable_live_mode(void)
1427 {
1428 }
1429
1430 static inline
qdf_dp_trace_enable_live_mode(void)1431 void qdf_dp_trace_enable_live_mode(void)
1432 {
1433 }
1434
1435 static inline
qdf_dp_trace_throttle_live_mode(bool high_bw_request)1436 void qdf_dp_trace_throttle_live_mode(bool high_bw_request)
1437 {
1438 }
1439
1440 static inline
qdf_dp_trace_clear_buffer(void)1441 void qdf_dp_trace_clear_buffer(void)
1442 {
1443 }
1444
1445 static inline
qdf_dp_trace_apply_tput_policy(bool is_data_traffic)1446 void qdf_dp_trace_apply_tput_policy(bool is_data_traffic)
1447 {
1448 }
1449
1450 static inline
qdf_dp_trace_data_pkt(qdf_nbuf_t nbuf,uint8_t pdev_id,enum QDF_DP_TRACE_ID code,uint16_t msdu_id,enum qdf_proto_dir dir)1451 void qdf_dp_trace_data_pkt(qdf_nbuf_t nbuf, uint8_t pdev_id,
1452 enum QDF_DP_TRACE_ID code, uint16_t msdu_id,
1453 enum qdf_proto_dir dir)
1454 {
1455 }
1456
1457 static inline
qdf_dp_log_proto_pkt_info(uint8_t * sa,uint8_t * da,uint8_t type,uint8_t subtype,uint8_t dir,uint16_t msdu_id,uint8_t status)1458 void qdf_dp_log_proto_pkt_info(uint8_t *sa, uint8_t *da, uint8_t type,
1459 uint8_t subtype, uint8_t dir, uint16_t msdu_id,
1460 uint8_t status)
1461 {
1462 }
1463
1464 static inline
qdf_dp_track_noack_check(qdf_nbuf_t nbuf,enum qdf_proto_subtype * subtype)1465 void qdf_dp_track_noack_check(qdf_nbuf_t nbuf, enum qdf_proto_subtype *subtype)
1466 {
1467 }
1468
1469 static inline
qdf_dp_get_status_from_htt(uint8_t status)1470 enum qdf_dp_tx_rx_status qdf_dp_get_status_from_htt(uint8_t status)
1471 {
1472 return QDF_TX_RX_STATUS_OK;
1473 }
1474
1475 static inline
qdf_dp_get_status_from_a_status(uint8_t status)1476 enum qdf_dp_tx_rx_status qdf_dp_get_status_from_a_status(uint8_t status)
1477 {
1478 return QDF_TX_RX_STATUS_OK;
1479 }
1480 #endif
1481
1482 /**
1483 * qdf_trace_display() - Display trace
1484 *
1485 * Return: None
1486 */
1487 void qdf_trace_display(void);
1488
1489 /**
1490 * qdf_snprintf() - wrapper function to snprintf
1491 * @str_buffer: string Buffer
1492 * @size: defines the size of the data record
1493 * @str_format: Format string in which the message to be logged. This format
1494 * string contains printf-like replacement parameters, which follow
1495 * this parameter in the variable argument list.
1496 *
1497 * Return: num of bytes written to buffer
1498 */
1499 int __printf(3, 4) qdf_snprintf(char *str_buffer, unsigned int size,
1500 char *str_format, ...);
1501
1502 #define QDF_SNPRINTF qdf_snprintf
1503
1504 #ifdef TSOSEG_DEBUG
1505
qdf_tso_seg_dbg_bug(char * msg)1506 static inline void qdf_tso_seg_dbg_bug(char *msg)
1507 {
1508 qdf_print("%s", msg);
1509 QDF_BUG(0);
1510 };
1511
1512 /**
1513 * qdf_tso_seg_dbg_init - initialize TSO segment debug structure
1514 * @tsoseg: structure to initialize
1515 *
1516 * TSO segment dbg structures are attached to qdf_tso_seg_elem_t
1517 * structures and are allocated only of TSOSEG_DEBUG is defined.
1518 * When allocated, at the time of the tso_seg_pool initialization,
1519 * which goes with tx_desc initialization (1:1), each structure holds
1520 * a number of (currently 16) history entries, basically describing
1521 * what operation has been performed on this particular tso_seg_elem.
1522 * This history buffer is a circular buffer and the current index is
1523 * held in an atomic variable called cur. It is incremented every
1524 * operation. Each of these operations are added with the function
1525 * qdf_tso_seg_dbg_record.
1526 * For each segment, this initialization function MUST be called PRIOR
1527 * TO any _dbg_record() function calls.
1528 * On free, qdf_tso_seg_elem structure is cleared (using qdf_tso_seg_dbg_zero)
1529 * which clears the tso_desc, BUT DOES NOT CLEAR THE HISTORY element.
1530 *
1531 * Return:
1532 * None
1533 */
1534 static inline
qdf_tso_seg_dbg_init(struct qdf_tso_seg_elem_t * tsoseg)1535 void qdf_tso_seg_dbg_init(struct qdf_tso_seg_elem_t *tsoseg)
1536 {
1537 tsoseg->dbg.txdesc = NULL;
1538 qdf_atomic_init(&tsoseg->dbg.cur); /* history empty */
1539 }
1540
1541 /**
1542 * qdf_tso_seg_dbg_record - add a history entry to TSO debug structure
1543 * @tsoseg: structure to initialize
1544 * @id: operation ID (identifies the caller)
1545 *
1546 * Adds a history entry to the history circular buffer. Each entry
1547 * contains an operation id (caller, as currently each ID is used only
1548 * once in the source, so it directly identifies the src line that invoked
1549 * the recording.
1550 *
1551 * qdf_tso_seg_dbg_record CAN ONLY BE CALLED AFTER the entry is initialized
1552 * by qdf_tso_seg_dbg_init.
1553 *
1554 * The entry to be added is written at the location pointed by the atomic
1555 * variable called cur. Cur is an ever increasing atomic variable. It is
1556 * masked so that only the lower 4 bits are used (16 history entries).
1557 *
1558 * Return:
1559 * int: the entry this record was recorded at
1560 */
1561 static inline
qdf_tso_seg_dbg_record(struct qdf_tso_seg_elem_t * tsoseg,short id)1562 int qdf_tso_seg_dbg_record(struct qdf_tso_seg_elem_t *tsoseg, short id)
1563 {
1564 int rc = -1;
1565 unsigned int c;
1566
1567 qdf_assert(tsoseg);
1568
1569 if (id == TSOSEG_LOC_ALLOC) {
1570 c = qdf_atomic_read(&tsoseg->dbg.cur);
1571 /* dont crash on the very first alloc on the segment */
1572 c &= 0x0f;
1573 /* allow only INIT and FREE ops before ALLOC */
1574 if (tsoseg->dbg.h[c].id >= id)
1575 qdf_tso_seg_dbg_bug("Rogue TSO seg alloc");
1576 }
1577 c = qdf_atomic_inc_return(&tsoseg->dbg.cur);
1578
1579 c &= 0x0f;
1580 tsoseg->dbg.h[c].ts = qdf_get_log_timestamp();
1581 tsoseg->dbg.h[c].id = id;
1582 rc = c;
1583
1584 return rc;
1585 };
1586
1587 static inline void
qdf_tso_seg_dbg_setowner(struct qdf_tso_seg_elem_t * tsoseg,void * owner)1588 qdf_tso_seg_dbg_setowner(struct qdf_tso_seg_elem_t *tsoseg, void *owner)
1589 {
1590 if (tsoseg)
1591 tsoseg->dbg.txdesc = owner;
1592 };
1593
1594 static inline void
qdf_tso_seg_dbg_zero(struct qdf_tso_seg_elem_t * tsoseg)1595 qdf_tso_seg_dbg_zero(struct qdf_tso_seg_elem_t *tsoseg)
1596 {
1597 memset(tsoseg, 0, offsetof(struct qdf_tso_seg_elem_t, dbg));
1598 return;
1599 };
1600
1601 #else
1602 static inline
qdf_tso_seg_dbg_init(struct qdf_tso_seg_elem_t * tsoseg)1603 void qdf_tso_seg_dbg_init(struct qdf_tso_seg_elem_t *tsoseg)
1604 {
1605 };
1606 static inline
qdf_tso_seg_dbg_record(struct qdf_tso_seg_elem_t * tsoseg,short id)1607 int qdf_tso_seg_dbg_record(struct qdf_tso_seg_elem_t *tsoseg, short id)
1608 {
1609 return 0;
1610 };
qdf_tso_seg_dbg_bug(char * msg)1611 static inline void qdf_tso_seg_dbg_bug(char *msg)
1612 {
1613 };
1614 static inline void
qdf_tso_seg_dbg_setowner(struct qdf_tso_seg_elem_t * tsoseg,void * owner)1615 qdf_tso_seg_dbg_setowner(struct qdf_tso_seg_elem_t *tsoseg, void *owner)
1616 {
1617 };
1618 static inline int
qdf_tso_seg_dbg_zero(struct qdf_tso_seg_elem_t * tsoseg)1619 qdf_tso_seg_dbg_zero(struct qdf_tso_seg_elem_t *tsoseg)
1620 {
1621 memset(tsoseg, 0, sizeof(struct qdf_tso_seg_elem_t));
1622 return 0;
1623 };
1624
1625 #endif /* TSOSEG_DEBUG */
1626
1627 /**
1628 * qdf_trace_hex_dump() - externally called hex dump function
1629 * @module: Module identifier a member of the QDF_MODULE_ID enumeration that
1630 * identifies the module issuing the trace message.
1631 * @level: Trace level a member of the QDF_TRACE_LEVEL enumeration indicating
1632 * the severity of the condition causing the trace message to be
1633 * issued. More severe conditions are more likely to be logged.
1634 * @data: The base address of the buffer to be logged.
1635 * @buf_len: The size of the buffer to be logged.
1636 *
1637 * Checks the level of severity and accordingly prints the trace messages
1638 *
1639 * Return: None
1640 */
1641 void qdf_trace_hex_dump(QDF_MODULE_ID module, QDF_TRACE_LEVEL level,
1642 void *data, int buf_len);
1643
1644 /**
1645 * qdf_trace_hex_ascii_dump() - externally called hex and ascii dump function
1646 * @module: Module identifier a member of the QDF_MODULE_ID enumeration that
1647 * identifies the module issuing the trace message.
1648 * @level: Trace level a member of the QDF_TRACE_LEVEL enumeration indicating
1649 * the severity of the condition causing the trace message to be
1650 * issued. More severe conditions are more likely to be logged.
1651 * @data: The base address of the buffer to be logged.
1652 * @buf_len: The size of the buffer to be logged.
1653 *
1654 * Checks the level of severity and accordingly prints the trace messages
1655 *
1656 * Return: None
1657 */
1658 void qdf_trace_hex_ascii_dump(QDF_MODULE_ID module, QDF_TRACE_LEVEL level,
1659 void *data, int buf_len);
1660
1661 #define ERROR_CODE -1
1662 #define QDF_MAX_NAME_SIZE 32
1663 #define MAX_PRINT_CONFIG_SUPPORTED 32
1664
1665 #define MAX_SUPPORTED_CATEGORY QDF_MODULE_ID_MAX
1666
1667 /**
1668 * qdf_set_pidx() - Sets the global qdf_pidx.
1669 * @pidx: Index of print control object assigned to the module
1670 *
1671 */
1672 void qdf_set_pidx(int pidx);
1673
1674 /**
1675 * qdf_get_pidx() - Returns the global qdf_pidx.
1676 *
1677 * Return: Current qdf print index.
1678 */
1679 int qdf_get_pidx(void);
1680 /*
1681 * Shared print control index
1682 * for converged debug framework
1683 */
1684
1685 #define QDF_PRINT_IDX_SHARED -1
1686
1687 /**
1688 * QDF_PRINT_INFO() - Generic wrapper API for logging
1689 * @idx: Index of print control object
1690 * @module: Module identifier. A member of QDF_MODULE_ID enumeration that
1691 * identifies the module issuing the trace message
1692 * @level: Trace level. A member of QDF_TRACE_LEVEL enumeration indicating
1693 * the severity of the condition causing the trace message to be
1694 * issued.
1695 * @str_format: Format string that contains the message to be logged.
1696 *
1697 *
1698 * This wrapper will be used for any generic logging messages. Wrapper will
1699 * compile a call to converged QDF trace message API.
1700 *
1701 * Return: Nothing
1702 *
1703 */
1704 void QDF_PRINT_INFO(unsigned int idx, QDF_MODULE_ID module,
1705 QDF_TRACE_LEVEL level,
1706 char *str_format, ...);
1707
1708 /**
1709 * struct category_info - Category information structure
1710 * @category_verbose_mask: Embeds information about category's verbose level
1711 */
1712 struct category_info {
1713 uint16_t category_verbose_mask;
1714 };
1715
1716 /**
1717 * struct category_name_info - Category name information structure
1718 * @category_name_str: Embeds information about category name
1719 */
1720 struct category_name_info {
1721 unsigned char category_name_str[QDF_MAX_NAME_SIZE];
1722 };
1723
1724 /**
1725 * qdf_trace_msg_cmn() - Converged logging API
1726 * @idx: Index of print control object assigned to the module
1727 * @category: Category identifier. A member of the QDF_MODULE_ID enumeration
1728 * that identifies the category issuing the trace message.
1729 * @verbose: Verbose level. A member of the QDF_TRACE_LEVEL enumeration
1730 * indicating the severity of the condition causing the trace
1731 * message to be issued. More severe conditions are more likely
1732 * to be logged.
1733 * @str_format: Format string. The message to be logged. This format string
1734 * contains printf-like replacement parameters, which follow this
1735 * parameter in the variable argument list.
1736 * @val: Variable argument list part of the log message
1737 *
1738 * Return: nothing
1739 *
1740 */
1741 void qdf_trace_msg_cmn(unsigned int idx,
1742 QDF_MODULE_ID category,
1743 QDF_TRACE_LEVEL verbose,
1744 const char *str_format,
1745 va_list val);
1746
1747 /**
1748 * struct qdf_print_ctrl - QDF Print Control structure
1749 * Statically allocated objects of print control
1750 * structure are declared that will support maximum of
1751 * 32 print control objects. Any module that needs to
1752 * register to the print control framework needs to
1753 * obtain a print control object using
1754 * qdf_print_ctrl_register API. It will have to pass
1755 * pointer to category info structure, name and
1756 * custom print function to be used if required.
1757 * @name: Optional name for the control object
1758 * @cat_info: Array of category_info struct
1759 * @custom_print: Custom print handler
1760 * @custom_ctxt: Custom print context
1761 * @dbglvlmac_on: Flag to enable/disable MAC level filtering
1762 * @in_use: Boolean to indicate if control object is in use
1763 */
1764 struct qdf_print_ctrl {
1765 char name[QDF_MAX_NAME_SIZE];
1766 struct category_info cat_info[MAX_SUPPORTED_CATEGORY];
1767 void (*custom_print)(void *ctxt, const char *fmt, va_list args);
1768 void *custom_ctxt;
1769 #ifdef DBG_LVL_MAC_FILTERING
1770 unsigned char dbglvlmac_on;
1771 #endif
1772 bool in_use;
1773 };
1774
1775 /**
1776 * qdf_print_ctrl_register() - Allocate QDF print control object, assign
1777 * pointer to category info or print control
1778 * structure and return the index to the callee
1779 * @cinfo: Pointer to array of category info structure
1780 * @custom_print_handler: Pointer to custom print handler
1781 * @custom_ctx: Pointer to custom context
1782 * @pctrl_name: Pointer to print control object name
1783 *
1784 * Return: Index of qdf_print_ctrl structure
1785 *
1786 */
1787 int qdf_print_ctrl_register(const struct category_info *cinfo,
1788 void *custom_print_handler,
1789 void *custom_ctx,
1790 const char *pctrl_name);
1791
1792 #ifdef QCA_WIFI_MODULE_PARAMS_FROM_INI
1793 /**
1794 * qdf_initialize_module_param_from_ini() - Update qdf module params
1795 *
1796 * Read the file which has wifi module params, parse and update
1797 * qdf module params.
1798 *
1799 * Return: void
1800 */
1801 void qdf_initialize_module_param_from_ini(void);
1802 #else
1803 static inline
qdf_initialize_module_param_from_ini(void)1804 void qdf_initialize_module_param_from_ini(void)
1805 {
1806 }
1807 #endif
1808
1809 /**
1810 * qdf_shared_print_ctrl_init() - Initialize the shared print ctrl obj with
1811 * all categories set to the default level
1812 *
1813 * Return: void
1814 *
1815 */
1816 void qdf_shared_print_ctrl_init(void);
1817
1818 /**
1819 * qdf_print_setup() - Setup default values to all the print control objects
1820 *
1821 * Register new print control object for the callee
1822 *
1823 * Return: QDF_STATUS_SUCCESS on success and QDF_STATUS_E_FAILURE
1824 * on failure
1825 */
1826 QDF_STATUS qdf_print_setup(void);
1827
1828 /**
1829 * qdf_print_ctrl_cleanup() - Clean up a print control object
1830 * @idx: Index of print control object
1831 *
1832 * Cleanup the print control object for the callee
1833 *
1834 * Return: QDF_STATUS_SUCCESS on success and QDF_STATUS_E_FAILURE on failure
1835 */
1836 QDF_STATUS qdf_print_ctrl_cleanup(unsigned int idx);
1837
1838 /**
1839 * qdf_shared_print_ctrl_cleanup() - Clean up of the shared object
1840 *
1841 * Cleanup the shared print-ctrl-object
1842 *
1843 * Return: void
1844 */
1845 void qdf_shared_print_ctrl_cleanup(void);
1846
1847 /**
1848 * qdf_print_set_category_verbose() - Enable/Disable category for a
1849 * print control object with
1850 * user provided verbose level
1851 * @idx: Index of the print control object assigned to callee
1852 * @category: Category information
1853 * @verbose: Verbose information
1854 * @is_set: Flag indicating if verbose level needs to be enabled or disabled
1855 *
1856 * Return: QDF_STATUS_SUCCESS for success and QDF_STATUS_E_FAILURE for failure
1857 */
1858 QDF_STATUS qdf_print_set_category_verbose(unsigned int idx,
1859 QDF_MODULE_ID category,
1860 QDF_TRACE_LEVEL verbose,
1861 bool is_set);
1862
1863 /**
1864 * qdf_log_dump_at_kernel_level() - Enable/Disable printk call
1865 * @enable: Indicates whether printk is enabled in QDF_TRACE
1866 *
1867 * Return: void
1868 */
1869 void qdf_log_dump_at_kernel_level(bool enable);
1870
1871 /**
1872 * qdf_logging_set_flush_timer() - Set the time period in which host logs
1873 * should be flushed out to user-space
1874 * @milliseconds: milliseconds after which the logs should be flushed out to
1875 * user-space
1876 *
1877 * Return: QDF_STATUS_SUCCESS for success and QDF_STATUS_E_FAILURE for failure
1878 */
1879 int qdf_logging_set_flush_timer(uint32_t milliseconds);
1880
1881 /**
1882 * qdf_logging_flush_logs() - Flush out the logs to user-space one time
1883 *
1884 * Return: void
1885 */
1886 void qdf_logging_flush_logs(void);
1887
1888 /**
1889 * qdf_print_get_category_verbose() - Get category verbose information for the
1890 * print control object
1891 *
1892 * @idx: Index of print control object
1893 * @category: Category information
1894 *
1895 * Return: Verbose value for the particular category
1896 */
1897 QDF_TRACE_LEVEL qdf_print_get_category_verbose(unsigned int idx,
1898 QDF_MODULE_ID category);
1899
1900 /**
1901 * qdf_print_is_category_enabled() - Get category information for the
1902 * print control object
1903 *
1904 * @idx: Index of print control object
1905 * @category: Category information
1906 *
1907 * Return: Verbose enabled(true) or disabled(false) or invalid input (false)
1908 */
1909 bool qdf_print_is_category_enabled(unsigned int idx,
1910 QDF_MODULE_ID category);
1911
1912 /**
1913 * qdf_print_is_verbose_enabled() - Get verbose information of a category for
1914 * the print control object
1915 *
1916 * @idx: Index of print control object
1917 * @category: Category information
1918 * @verbose: Verbose information
1919 *
1920 * Return: Verbose enabled(true) or disabled(false) or invalid input (false)
1921 */
1922 bool qdf_print_is_verbose_enabled(unsigned int idx,
1923 QDF_MODULE_ID category,
1924 QDF_TRACE_LEVEL verbose);
1925
1926 /**
1927 * qdf_print_clean_node_flag() - Clean up node flag for print control object
1928 *
1929 * @idx: Index of print control object
1930 *
1931 * Return: None
1932 */
1933 void qdf_print_clean_node_flag(unsigned int idx);
1934
1935 #ifdef DBG_LVL_MAC_FILTERING
1936
1937 /**
1938 * qdf_print_set_node_flag() - Set flag to enable MAC level filtering
1939 *
1940 * @idx: Index of print control object
1941 * @enable: Enable/Disable bit sent by callee
1942 *
1943 * Return: QDF_STATUS_SUCCESS on Success and QDF_STATUS_E_FAILURE on Failure
1944 */
1945 QDF_STATUS qdf_print_set_node_flag(unsigned int idx,
1946 uint8_t enable);
1947
1948 /**
1949 * qdf_print_get_node_flag() - Get flag that controls MAC level filtering
1950 *
1951 * @idx: Index of print control object
1952 *
1953 * Return: Flag that indicates enable(1) or disable(0) or invalid(-1)
1954 */
1955 bool qdf_print_get_node_flag(unsigned int idx);
1956
1957 #endif
1958
1959 #ifdef QCA_WIFI_MODULE_PARAMS_FROM_INI
1960 /**
1961 * qdf_module_param_handler() - Function to store module params
1962 *
1963 * @context: NULL, unused.
1964 * @key: Name of the module param
1965 * @value: Value of the module param
1966 *
1967 * Handler function to be called from qdf_ini_parse()
1968 * function when a valid parameter is found in a file.
1969 *
1970 * Return: QDF_STATUS_SUCCESS on Success
1971 */
1972 QDF_STATUS qdf_module_param_handler(void *context, const char *key,
1973 const char *value);
1974 #else
1975 static inline
qdf_module_param_handler(void * context,const char * key,const char * value)1976 QDF_STATUS qdf_module_param_handler(void *context, const char *key,
1977 const char *value)
1978 {
1979 return QDF_STATUS_SUCCESS;
1980 }
1981 #endif
1982
1983 /**
1984 * qdf_logging_init() - Initialize msg logging functionality
1985 *
1986 * Return: void
1987 */
1988 void qdf_logging_init(void);
1989
1990 /**
1991 * qdf_logging_exit() - Cleanup msg logging functionality
1992 *
1993 * Return: void
1994 */
1995 void qdf_logging_exit(void);
1996
1997 #define QDF_SYMBOL_LEN __QDF_SYMBOL_LEN
1998
1999 /**
2000 * qdf_sprint_symbol() - prints the name of a symbol into a string buffer
2001 * @buffer: the string buffer to print into
2002 * @addr: address of the symbol to lookup and print
2003 *
2004 * Return: number of characters printed
2005 */
2006 int qdf_sprint_symbol(char *buffer, void *addr);
2007
2008 /**
2009 * qdf_minidump_init() - Initialize minidump functionality
2010 *
2011 *
2012 * Return: void
2013 */
2014 static inline
qdf_minidump_init(void)2015 void qdf_minidump_init(void)
2016 {
2017 __qdf_minidump_init();
2018 }
2019
2020 /**
2021 * qdf_minidump_deinit() - De-initialize minidump functionality
2022 *
2023 *
2024 * Return: void
2025 */
2026 static inline
qdf_minidump_deinit(void)2027 void qdf_minidump_deinit(void)
2028 {
2029 __qdf_minidump_deinit();
2030 }
2031
2032 /**
2033 * qdf_minidump_log() - Log memory address to be included in minidump
2034 * @start_addr: Start address of the memory to be dumped
2035 * @size: Size in bytes
2036 * @name: String to identify this entry
2037 */
2038 static inline
qdf_minidump_log(void * start_addr,const size_t size,const char * name)2039 void qdf_minidump_log(void *start_addr,
2040 const size_t size, const char *name)
2041 {
2042 __qdf_minidump_log(start_addr, size, name);
2043 }
2044
2045 /**
2046 * qdf_minidump_remove() - Remove memory address from minidump
2047 * @start_addr: Start address of the memory previously added
2048 * @size: Size in bytes
2049 * @name: String to identify this entry
2050 */
2051 static inline
qdf_minidump_remove(void * start_addr,const size_t size,const char * name)2052 void qdf_minidump_remove(void *start_addr,
2053 const size_t size, const char *name)
2054 {
2055 __qdf_minidump_remove(start_addr, size, name);
2056 }
2057
2058 #endif /* __QDF_TRACE_H */
2059