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