xref: /OK3568_Linux_fs/external/rkwifibt/drivers/bcmdhd/dhd_pktlog.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun  * DHD debugability packet logging header file
3*4882a593Smuzhiyun  *
4*4882a593Smuzhiyun  * Copyright (C) 2020, Broadcom.
5*4882a593Smuzhiyun  *
6*4882a593Smuzhiyun  *      Unless you and Broadcom execute a separate written software license
7*4882a593Smuzhiyun  * agreement governing use of this software, this software is licensed to you
8*4882a593Smuzhiyun  * under the terms of the GNU General Public License version 2 (the "GPL"),
9*4882a593Smuzhiyun  * available at http://www.broadcom.com/licenses/GPLv2.php, with the
10*4882a593Smuzhiyun  * following added to such license:
11*4882a593Smuzhiyun  *
12*4882a593Smuzhiyun  *      As a special exception, the copyright holders of this software give you
13*4882a593Smuzhiyun  * permission to link this software with independent modules, and to copy and
14*4882a593Smuzhiyun  * distribute the resulting executable under terms of your choice, provided that
15*4882a593Smuzhiyun  * you also meet, for each linked independent module, the terms and conditions of
16*4882a593Smuzhiyun  * the license of that module.  An independent module is a module which is not
17*4882a593Smuzhiyun  * derived from this software.  The special exception does not apply to any
18*4882a593Smuzhiyun  * modifications of the software.
19*4882a593Smuzhiyun  *
20*4882a593Smuzhiyun  *
21*4882a593Smuzhiyun  * <<Broadcom-WL-IPTag/Open:>>
22*4882a593Smuzhiyun  *
23*4882a593Smuzhiyun  * $Id$
24*4882a593Smuzhiyun  */
25*4882a593Smuzhiyun 
26*4882a593Smuzhiyun #ifndef __DHD_PKTLOG_H_
27*4882a593Smuzhiyun #define __DHD_PKTLOG_H_
28*4882a593Smuzhiyun 
29*4882a593Smuzhiyun #include <dhd_debug.h>
30*4882a593Smuzhiyun #include <dhd.h>
31*4882a593Smuzhiyun #include <asm/atomic.h>
32*4882a593Smuzhiyun #ifdef DHD_COMPACT_PKT_LOG
33*4882a593Smuzhiyun #include <linux/rbtree.h>
34*4882a593Smuzhiyun #endif	/* DHD_COMPACT_PKT_LOG */
35*4882a593Smuzhiyun 
36*4882a593Smuzhiyun #ifdef DHD_PKT_LOGGING
37*4882a593Smuzhiyun #define DHD_PKT_LOG(args)	DHD_INFO(args)
38*4882a593Smuzhiyun #define DEFAULT_MULTIPLE_PKTLOG_BUF	1
39*4882a593Smuzhiyun #ifndef CUSTOM_MULTIPLE_PKTLOG_BUF
40*4882a593Smuzhiyun #define CUSTOM_MULTIPLE_PKTLOG_BUF	DEFAULT_MULTIPLE_PKTLOG_BUF
41*4882a593Smuzhiyun #endif /* CUSTOM_MULTIPLE_PKTLOG_BUF */
42*4882a593Smuzhiyun #define MIN_PKTLOG_LEN			(32 * 10 * 2 * CUSTOM_MULTIPLE_PKTLOG_BUF)
43*4882a593Smuzhiyun #define MAX_PKTLOG_LEN			(32 * 10 * 2 * 10)
44*4882a593Smuzhiyun #define MAX_DHD_PKTLOG_FILTER_LEN	14
45*4882a593Smuzhiyun #define MAX_MASK_PATTERN_FILTER_LEN	64
46*4882a593Smuzhiyun #define PKTLOG_TXPKT_CASE		0x0001
47*4882a593Smuzhiyun #define PKTLOG_TXSTATUS_CASE		0x0002
48*4882a593Smuzhiyun #define PKTLOG_RXPKT_CASE		0x0004
49*4882a593Smuzhiyun /* MAX_FILTER_PATTERN_LEN is buf len to print bitmask/pattern with string */
50*4882a593Smuzhiyun #define MAX_FILTER_PATTERN_LEN \
51*4882a593Smuzhiyun 	((MAX_MASK_PATTERN_FILTER_LEN * HD_BYTE_SIZE) + HD_PREFIX_SIZE + 1) * 2
52*4882a593Smuzhiyun #define PKTLOG_DUMP_BUF_SIZE		(64 * 1024)
53*4882a593Smuzhiyun 
54*4882a593Smuzhiyun typedef struct dhd_dbg_pktlog_info {
55*4882a593Smuzhiyun 	frame_type payload_type;
56*4882a593Smuzhiyun 	size_t pkt_len;
57*4882a593Smuzhiyun 	uint32 driver_ts_sec;
58*4882a593Smuzhiyun 	uint32 driver_ts_usec;
59*4882a593Smuzhiyun 	uint32 firmware_ts;
60*4882a593Smuzhiyun 	uint32 pkt_hash;
61*4882a593Smuzhiyun 	bool direction;
62*4882a593Smuzhiyun 	void *pkt;
63*4882a593Smuzhiyun } dhd_dbg_pktlog_info_t;
64*4882a593Smuzhiyun 
65*4882a593Smuzhiyun typedef struct dhd_pktlog_ring_info
66*4882a593Smuzhiyun {
67*4882a593Smuzhiyun 	dll_t p_info;			/* list pointer */
68*4882a593Smuzhiyun 	union {
69*4882a593Smuzhiyun 		wifi_tx_packet_fate tx_fate;
70*4882a593Smuzhiyun 		wifi_rx_packet_fate rx_fate;
71*4882a593Smuzhiyun 		uint32 fate;
72*4882a593Smuzhiyun 	};
73*4882a593Smuzhiyun 	dhd_dbg_pktlog_info_t info;
74*4882a593Smuzhiyun } dhd_pktlog_ring_info_t;
75*4882a593Smuzhiyun 
76*4882a593Smuzhiyun typedef struct dhd_pktlog_ring
77*4882a593Smuzhiyun {
78*4882a593Smuzhiyun 	dll_t ring_info_head;		/* ring_info list */
79*4882a593Smuzhiyun 	dll_t ring_info_free;		/* ring_info free list */
80*4882a593Smuzhiyun 	osl_atomic_t start;
81*4882a593Smuzhiyun 	uint32 pktlog_minmize;
82*4882a593Smuzhiyun 	uint32 pktlog_len;		/* size of pkts */
83*4882a593Smuzhiyun 	uint32 pktcount;
84*4882a593Smuzhiyun 	spinlock_t *pktlog_ring_lock;
85*4882a593Smuzhiyun 	dhd_pub_t *dhdp;
86*4882a593Smuzhiyun 	dhd_pktlog_ring_info_t *ring_info_mem; /* ring_info mem pointer */
87*4882a593Smuzhiyun } dhd_pktlog_ring_t;
88*4882a593Smuzhiyun 
89*4882a593Smuzhiyun typedef struct dhd_pktlog_filter_info
90*4882a593Smuzhiyun {
91*4882a593Smuzhiyun 	uint32 id;
92*4882a593Smuzhiyun 	uint32 offset;
93*4882a593Smuzhiyun 	uint32 size_bytes; /* Size of pattern. */
94*4882a593Smuzhiyun 	uint32 enable;
95*4882a593Smuzhiyun 	uint8 mask[MAX_MASK_PATTERN_FILTER_LEN];
96*4882a593Smuzhiyun 	uint8 pattern[MAX_MASK_PATTERN_FILTER_LEN];
97*4882a593Smuzhiyun } dhd_pktlog_filter_info_t;
98*4882a593Smuzhiyun 
99*4882a593Smuzhiyun typedef struct dhd_pktlog_filter
100*4882a593Smuzhiyun {
101*4882a593Smuzhiyun 	dhd_pktlog_filter_info_t *info;
102*4882a593Smuzhiyun 	uint32 list_cnt;
103*4882a593Smuzhiyun 	uint32 enable;
104*4882a593Smuzhiyun } dhd_pktlog_filter_t;
105*4882a593Smuzhiyun 
106*4882a593Smuzhiyun typedef struct dhd_pktlog
107*4882a593Smuzhiyun {
108*4882a593Smuzhiyun 	struct dhd_pktlog_ring *pktlog_ring;
109*4882a593Smuzhiyun 	struct dhd_pktlog_filter *pktlog_filter;
110*4882a593Smuzhiyun 	osl_atomic_t pktlog_status;
111*4882a593Smuzhiyun 	dhd_pub_t *dhdp;
112*4882a593Smuzhiyun #ifdef DHD_COMPACT_PKT_LOG
113*4882a593Smuzhiyun 	struct rb_root cpkt_log_tt_rbt;
114*4882a593Smuzhiyun #endif  /* DHD_COMPACT_PKT_LOG */
115*4882a593Smuzhiyun } dhd_pktlog_t;
116*4882a593Smuzhiyun 
117*4882a593Smuzhiyun typedef struct dhd_pktlog_pcap_hdr
118*4882a593Smuzhiyun {
119*4882a593Smuzhiyun 	uint32 magic_number;
120*4882a593Smuzhiyun 	uint16 version_major;
121*4882a593Smuzhiyun 	uint16 version_minor;
122*4882a593Smuzhiyun 	uint16 thiszone;
123*4882a593Smuzhiyun 	uint32 sigfigs;
124*4882a593Smuzhiyun 	uint32 snaplen;
125*4882a593Smuzhiyun 	uint32 network;
126*4882a593Smuzhiyun } dhd_pktlog_pcap_hdr_t;
127*4882a593Smuzhiyun 
128*4882a593Smuzhiyun #define PKTLOG_PCAP_MAGIC_NUM 0xa1b2c3d4
129*4882a593Smuzhiyun #define PKTLOG_PCAP_MAJOR_VER 0x02
130*4882a593Smuzhiyun #define PKTLOG_PCAP_MINOR_VER 0x04
131*4882a593Smuzhiyun #define PKTLOG_PCAP_SNAP_LEN 0x40000
132*4882a593Smuzhiyun #define PKTLOG_PCAP_NETWORK_TYPE 147
133*4882a593Smuzhiyun 
134*4882a593Smuzhiyun extern int dhd_os_attach_pktlog(dhd_pub_t *dhdp);
135*4882a593Smuzhiyun extern int dhd_os_detach_pktlog(dhd_pub_t *dhdp);
136*4882a593Smuzhiyun extern dhd_pktlog_ring_t* dhd_pktlog_ring_init(dhd_pub_t *dhdp, int size);
137*4882a593Smuzhiyun extern int dhd_pktlog_ring_deinit(dhd_pub_t *dhdp, dhd_pktlog_ring_t *ring);
138*4882a593Smuzhiyun extern int dhd_pktlog_ring_set_nextpos(dhd_pktlog_ring_t *ringbuf);
139*4882a593Smuzhiyun extern int dhd_pktlog_ring_get_nextbuf(dhd_pktlog_ring_t *ringbuf, void **data);
140*4882a593Smuzhiyun extern int dhd_pktlog_ring_set_prevpos(dhd_pktlog_ring_t *ringbuf);
141*4882a593Smuzhiyun extern int dhd_pktlog_ring_get_prevbuf(dhd_pktlog_ring_t *ringbuf, void **data);
142*4882a593Smuzhiyun extern int dhd_pktlog_ring_get_writebuf(dhd_pktlog_ring_t *ringbuf, void **data);
143*4882a593Smuzhiyun extern int dhd_pktlog_ring_add_pkts(dhd_pub_t *dhdp, void *pkt, void *pktdata, uint32 pktid,
144*4882a593Smuzhiyun 		uint32 direction);
145*4882a593Smuzhiyun extern int dhd_pktlog_ring_tx_status(dhd_pub_t *dhdp, void *pkt, void *pktdata, uint32 pktid,
146*4882a593Smuzhiyun 		uint16 status);
147*4882a593Smuzhiyun extern dhd_pktlog_ring_t* dhd_pktlog_ring_change_size(dhd_pktlog_ring_t *ringbuf, int size);
148*4882a593Smuzhiyun extern void dhd_pktlog_filter_pull_forward(dhd_pktlog_filter_t *filter,
149*4882a593Smuzhiyun 		uint32 del_filter_id, uint32 list_cnt);
150*4882a593Smuzhiyun 
151*4882a593Smuzhiyun #define PKT_RX 0
152*4882a593Smuzhiyun #define PKT_TX 1
153*4882a593Smuzhiyun #define PKT_WAKERX 2
154*4882a593Smuzhiyun #define DHD_INVALID_PKTID (0U)
155*4882a593Smuzhiyun #define PKTLOG_TRANS_TX 0x01
156*4882a593Smuzhiyun #define PKTLOG_TRANS_RX 0x02
157*4882a593Smuzhiyun #define PKTLOG_TRANS_TXS 0x04
158*4882a593Smuzhiyun 
159*4882a593Smuzhiyun #define PKTLOG_SET_IN_TX(dhdp) \
160*4882a593Smuzhiyun { \
161*4882a593Smuzhiyun 	do { \
162*4882a593Smuzhiyun 		OSL_ATOMIC_OR((dhdp)->osh, &(dhdp)->pktlog->pktlog_status, PKTLOG_TRANS_TX); \
163*4882a593Smuzhiyun 	} while (0); \
164*4882a593Smuzhiyun }
165*4882a593Smuzhiyun 
166*4882a593Smuzhiyun #define PKTLOG_SET_IN_RX(dhdp) \
167*4882a593Smuzhiyun { \
168*4882a593Smuzhiyun 	do { \
169*4882a593Smuzhiyun 		OSL_ATOMIC_OR((dhdp)->osh, &(dhdp)->pktlog->pktlog_status, PKTLOG_TRANS_RX); \
170*4882a593Smuzhiyun 	} while (0); \
171*4882a593Smuzhiyun }
172*4882a593Smuzhiyun 
173*4882a593Smuzhiyun #define PKTLOG_SET_IN_TXS(dhdp) \
174*4882a593Smuzhiyun { \
175*4882a593Smuzhiyun 	do { \
176*4882a593Smuzhiyun 		OSL_ATOMIC_OR((dhdp)->osh, &(dhdp)->pktlog->pktlog_status, PKTLOG_TRANS_TXS); \
177*4882a593Smuzhiyun 	} while (0); \
178*4882a593Smuzhiyun }
179*4882a593Smuzhiyun 
180*4882a593Smuzhiyun #define PKTLOG_CLEAR_IN_TX(dhdp) \
181*4882a593Smuzhiyun { \
182*4882a593Smuzhiyun 	do { \
183*4882a593Smuzhiyun 		OSL_ATOMIC_AND((dhdp)->osh, &(dhdp)->pktlog->pktlog_status, ~PKTLOG_TRANS_TX); \
184*4882a593Smuzhiyun 	} while (0); \
185*4882a593Smuzhiyun }
186*4882a593Smuzhiyun 
187*4882a593Smuzhiyun #define PKTLOG_CLEAR_IN_RX(dhdp) \
188*4882a593Smuzhiyun { \
189*4882a593Smuzhiyun 	do { \
190*4882a593Smuzhiyun 		OSL_ATOMIC_AND((dhdp)->osh, &(dhdp)->pktlog->pktlog_status, ~PKTLOG_TRANS_RX); \
191*4882a593Smuzhiyun 	} while (0); \
192*4882a593Smuzhiyun }
193*4882a593Smuzhiyun 
194*4882a593Smuzhiyun #define PKTLOG_CLEAR_IN_TXS(dhdp) \
195*4882a593Smuzhiyun { \
196*4882a593Smuzhiyun 	do { \
197*4882a593Smuzhiyun 		OSL_ATOMIC_AND((dhdp)->osh, &(dhdp)->pktlog->pktlog_status, ~PKTLOG_TRANS_TXS); \
198*4882a593Smuzhiyun 	} while (0); \
199*4882a593Smuzhiyun }
200*4882a593Smuzhiyun 
201*4882a593Smuzhiyun #define DHD_PKTLOG_TX(dhdp, pkt, pktdata, pktid) \
202*4882a593Smuzhiyun { \
203*4882a593Smuzhiyun 	do { \
204*4882a593Smuzhiyun 		if ((dhdp) && (dhdp)->pktlog && (pkt)) { \
205*4882a593Smuzhiyun 			PKTLOG_SET_IN_TX(dhdp); \
206*4882a593Smuzhiyun 			if ((dhdp)->pktlog->pktlog_ring && \
207*4882a593Smuzhiyun 				OSL_ATOMIC_READ((dhdp)->osh, \
208*4882a593Smuzhiyun 					(&(dhdp)->pktlog->pktlog_ring->start))) { \
209*4882a593Smuzhiyun 				dhd_pktlog_ring_add_pkts(dhdp, pkt, pktdata, pktid, PKT_TX); \
210*4882a593Smuzhiyun 			} \
211*4882a593Smuzhiyun 			PKTLOG_CLEAR_IN_TX(dhdp); \
212*4882a593Smuzhiyun 		} \
213*4882a593Smuzhiyun 	} while (0); \
214*4882a593Smuzhiyun }
215*4882a593Smuzhiyun 
216*4882a593Smuzhiyun #define DHD_PKTLOG_TXS(dhdp, pkt, pktdata, pktid, status) \
217*4882a593Smuzhiyun { \
218*4882a593Smuzhiyun 	do { \
219*4882a593Smuzhiyun 		if ((dhdp) && (dhdp)->pktlog && (pkt)) { \
220*4882a593Smuzhiyun 			PKTLOG_SET_IN_TXS(dhdp); \
221*4882a593Smuzhiyun 			if ((dhdp)->pktlog->pktlog_ring && \
222*4882a593Smuzhiyun 				OSL_ATOMIC_READ((dhdp)->osh, \
223*4882a593Smuzhiyun 					(&(dhdp)->pktlog->pktlog_ring->start))) { \
224*4882a593Smuzhiyun 				dhd_pktlog_ring_tx_status(dhdp, pkt, pktdata, pktid, status); \
225*4882a593Smuzhiyun 			} \
226*4882a593Smuzhiyun 			PKTLOG_CLEAR_IN_TXS(dhdp); \
227*4882a593Smuzhiyun 		} \
228*4882a593Smuzhiyun 	} while (0); \
229*4882a593Smuzhiyun }
230*4882a593Smuzhiyun 
231*4882a593Smuzhiyun #define DHD_PKTLOG_RX(dhdp, pkt, pktdata) \
232*4882a593Smuzhiyun { \
233*4882a593Smuzhiyun 	do { \
234*4882a593Smuzhiyun 		if ((dhdp) && (dhdp)->pktlog && (pkt)) { \
235*4882a593Smuzhiyun 			PKTLOG_SET_IN_RX(dhdp); \
236*4882a593Smuzhiyun 			if (ntoh16((pkt)->protocol) != ETHER_TYPE_BRCM) { \
237*4882a593Smuzhiyun 				if ((dhdp)->pktlog->pktlog_ring && \
238*4882a593Smuzhiyun 					OSL_ATOMIC_READ((dhdp)->osh, \
239*4882a593Smuzhiyun 						(&(dhdp)->pktlog->pktlog_ring->start))) { \
240*4882a593Smuzhiyun 					dhd_pktlog_ring_add_pkts(dhdp, pkt, pktdata, \
241*4882a593Smuzhiyun 						DHD_INVALID_PKTID, PKT_RX); \
242*4882a593Smuzhiyun 				} \
243*4882a593Smuzhiyun 			} \
244*4882a593Smuzhiyun 			PKTLOG_CLEAR_IN_RX(dhdp); \
245*4882a593Smuzhiyun 		} \
246*4882a593Smuzhiyun 	} while (0); \
247*4882a593Smuzhiyun }
248*4882a593Smuzhiyun 
249*4882a593Smuzhiyun #define DHD_PKTLOG_WAKERX(dhdp, pkt, pktdata) \
250*4882a593Smuzhiyun { \
251*4882a593Smuzhiyun 	do { \
252*4882a593Smuzhiyun 		if ((dhdp) && (dhdp)->pktlog && (pkt)) { \
253*4882a593Smuzhiyun 			PKTLOG_SET_IN_RX(dhdp); \
254*4882a593Smuzhiyun 			if (ntoh16((pkt)->protocol) != ETHER_TYPE_BRCM) { \
255*4882a593Smuzhiyun 				if ((dhdp)->pktlog->pktlog_ring && \
256*4882a593Smuzhiyun 					OSL_ATOMIC_READ((dhdp)->osh, \
257*4882a593Smuzhiyun 						(&(dhdp)->pktlog->pktlog_ring->start))) { \
258*4882a593Smuzhiyun 					dhd_pktlog_ring_add_pkts(dhdp, pkt, pktdata, \
259*4882a593Smuzhiyun 						DHD_INVALID_PKTID, PKT_WAKERX); \
260*4882a593Smuzhiyun 				} \
261*4882a593Smuzhiyun 			} \
262*4882a593Smuzhiyun 			PKTLOG_CLEAR_IN_RX(dhdp); \
263*4882a593Smuzhiyun 		} \
264*4882a593Smuzhiyun 	} while (0); \
265*4882a593Smuzhiyun }
266*4882a593Smuzhiyun 
267*4882a593Smuzhiyun extern dhd_pktlog_filter_t* dhd_pktlog_filter_init(int size);
268*4882a593Smuzhiyun extern int dhd_pktlog_filter_deinit(dhd_pktlog_filter_t *filter);
269*4882a593Smuzhiyun extern int dhd_pktlog_filter_add(dhd_pktlog_filter_t *filter, char *arg);
270*4882a593Smuzhiyun extern int dhd_pktlog_filter_del(dhd_pktlog_filter_t *filter, char *arg);
271*4882a593Smuzhiyun extern int dhd_pktlog_filter_enable(dhd_pktlog_filter_t *filter, uint32 pktlog_case, uint32 enable);
272*4882a593Smuzhiyun extern int dhd_pktlog_filter_pattern_enable(dhd_pktlog_filter_t *filter, char *arg, uint32 enable);
273*4882a593Smuzhiyun extern int dhd_pktlog_filter_info(dhd_pktlog_filter_t *filter);
274*4882a593Smuzhiyun extern bool dhd_pktlog_filter_matched(dhd_pktlog_filter_t *filter, char *data, uint32 pktlog_case);
275*4882a593Smuzhiyun extern bool dhd_pktlog_filter_existed(dhd_pktlog_filter_t *filter, char *arg, uint32 *id);
276*4882a593Smuzhiyun 
277*4882a593Smuzhiyun #define DHD_PKTLOG_FILTER_ADD(pattern, filter_pattern, dhdp)	\
278*4882a593Smuzhiyun {	\
279*4882a593Smuzhiyun 	do {	\
280*4882a593Smuzhiyun 		if ((strlen(pattern) + 1) < sizeof(filter_pattern)) {	\
281*4882a593Smuzhiyun 			strncpy(filter_pattern, pattern, sizeof(filter_pattern));	\
282*4882a593Smuzhiyun 			dhd_pktlog_filter_add(dhdp->pktlog->pktlog_filter, filter_pattern);	\
283*4882a593Smuzhiyun 		}	\
284*4882a593Smuzhiyun 	} while (0);	\
285*4882a593Smuzhiyun }
286*4882a593Smuzhiyun 
287*4882a593Smuzhiyun #define DHD_PKTLOG_DUMP_PATH	DHD_COMMON_DUMP_PATH
288*4882a593Smuzhiyun extern int dhd_pktlog_debug_dump(dhd_pub_t *dhdp);
289*4882a593Smuzhiyun extern void dhd_pktlog_dump(void *handle, void *event_info, u8 event);
290*4882a593Smuzhiyun extern void dhd_schedule_pktlog_dump(dhd_pub_t *dhdp);
291*4882a593Smuzhiyun extern int dhd_pktlog_dump_write_memory(dhd_pub_t *dhdp, const void *user_buf, uint32 size);
292*4882a593Smuzhiyun extern int dhd_pktlog_dump_write_file(dhd_pub_t *dhdp);
293*4882a593Smuzhiyun 
294*4882a593Smuzhiyun #define DHD_PKTLOG_FATE_INFO_STR_LEN 256
295*4882a593Smuzhiyun #define DHD_PKTLOG_FATE_INFO_FORMAT	"BRCM_Packet_Fate"
296*4882a593Smuzhiyun #define DHD_PKTLOG_DUMP_TYPE "pktlog_dump"
297*4882a593Smuzhiyun #define DHD_PKTLOG_DEBUG_DUMP_TYPE "pktlog_debug_dump"
298*4882a593Smuzhiyun 
299*4882a593Smuzhiyun extern void dhd_pktlog_get_filename(dhd_pub_t *dhdp, char *dump_path, int len);
300*4882a593Smuzhiyun extern uint32 dhd_pktlog_get_item_length(dhd_pktlog_ring_info_t *report_ptr);
301*4882a593Smuzhiyun extern uint32 dhd_pktlog_get_dump_length(dhd_pub_t *dhdp);
302*4882a593Smuzhiyun extern uint32 __dhd_dbg_pkt_hash(uintptr_t pkt, uint32 pktid);
303*4882a593Smuzhiyun 
304*4882a593Smuzhiyun #ifdef DHD_COMPACT_PKT_LOG
305*4882a593Smuzhiyun #define CPKT_LOG_BIT_SIZE		22
306*4882a593Smuzhiyun #define CPKT_LOG_MAX_NUM		80
307*4882a593Smuzhiyun extern int dhd_cpkt_log_proc(dhd_pub_t *dhdp, char *buf, int buf_len,
308*4882a593Smuzhiyun         int bit_offset, int req_pkt_num);
309*4882a593Smuzhiyun #endif  /* DHD_COMPACT_PKT_LOG */
310*4882a593Smuzhiyun #endif /* DHD_PKT_LOGGING */
311*4882a593Smuzhiyun #endif /* __DHD_PKTLOG_H_ */
312