xref: /wlan-driver/qca-wifi-host-cmn/utils/logging/src/wlan_roam_debug.c (revision 5113495b16420b49004c444715d2daae2066e7dc)
1*5113495bSYour Name /*
2*5113495bSYour Name  * Copyright (c) 2013-2018, 2020-2021 The Linux Foundation. All rights reserved.
3*5113495bSYour Name  * Copyright (c) 2021 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 /*
21*5113495bSYour Name  * DOC: Roaming debug log operations routines and global data
22*5113495bSYour Name  */
23*5113495bSYour Name 
24*5113495bSYour Name #include <qdf_types.h>
25*5113495bSYour Name #include <qdf_atomic.h>
26*5113495bSYour Name #include <qdf_mem.h>
27*5113495bSYour Name #include <qdf_time.h>
28*5113495bSYour Name #include <qdf_trace.h>
29*5113495bSYour Name #include <qdf_module.h>
30*5113495bSYour Name #include <wlan_cmn.h>
31*5113495bSYour Name #include "wlan_roam_debug.h"
32*5113495bSYour Name 
33*5113495bSYour Name #ifdef FEATURE_ROAM_DEBUG
34*5113495bSYour Name static void wlan_roam_rec_print(struct wlan_roam_debug_rec *dbg_rec,
35*5113495bSYour Name 				uint32_t idx, uint32_t delta,
36*5113495bSYour Name 				bool to_kernel);
37*5113495bSYour Name 
38*5113495bSYour Name static void wlan_conn_rec_print(struct wlan_roam_debug_rec *dbg_rec,
39*5113495bSYour Name 				uint32_t idx, uint32_t delta,
40*5113495bSYour Name 				bool to_kernel);
41*5113495bSYour Name 
42*5113495bSYour Name #ifdef WLAN_LOGGING_BUFFERS_DYNAMICALLY
43*5113495bSYour Name static struct wlan_roam_debug_info *global_wlan_roam_debug_table;
44*5113495bSYour Name 
45*5113495bSYour Name /**
46*5113495bSYour Name  * wlan_roam_debug_init() - Allocate log buffer dynamically
47*5113495bSYour Name  *
48*5113495bSYour Name  * Return: none
49*5113495bSYour Name  */
wlan_roam_debug_init(void)50*5113495bSYour Name void wlan_roam_debug_init(void)
51*5113495bSYour Name {
52*5113495bSYour Name 	uint8_t i;
53*5113495bSYour Name 	global_wlan_roam_debug_table = qdf_mem_valloc(
54*5113495bSYour Name 				sizeof(struct wlan_roam_debug_info) * REC_MAX);
55*5113495bSYour Name 
56*5113495bSYour Name 	QDF_BUG(global_wlan_roam_debug_table);
57*5113495bSYour Name 
58*5113495bSYour Name 	if (global_wlan_roam_debug_table) {
59*5113495bSYour Name 		for (i = 0; i < REC_MAX; i++) {
60*5113495bSYour Name 			qdf_atomic_init(&global_wlan_roam_debug_table[i].index);
61*5113495bSYour Name 			global_wlan_roam_debug_table[i].num_max_rec =
62*5113495bSYour Name 						WLAN_ROAM_DEBUG_MAX_REC;
63*5113495bSYour Name 			if (i == REC_ROAM)
64*5113495bSYour Name 				global_wlan_roam_debug_table[i].rec_print =
65*5113495bSYour Name 					wlan_roam_rec_print;
66*5113495bSYour Name 			else
67*5113495bSYour Name 				global_wlan_roam_debug_table[i].rec_print =
68*5113495bSYour Name 					wlan_conn_rec_print;
69*5113495bSYour Name 		}
70*5113495bSYour Name 	}
71*5113495bSYour Name }
72*5113495bSYour Name 
73*5113495bSYour Name qdf_export_symbol(wlan_roam_debug_init);
74*5113495bSYour Name 
wlan_roam_debug_get_table(wlan_rec_type type)75*5113495bSYour Name static inline struct wlan_roam_debug_info *wlan_roam_debug_get_table(
76*5113495bSYour Name 	wlan_rec_type type)
77*5113495bSYour Name {
78*5113495bSYour Name 	if (type >= REC_MAX)
79*5113495bSYour Name 		return NULL;
80*5113495bSYour Name 	return &global_wlan_roam_debug_table[type];
81*5113495bSYour Name }
82*5113495bSYour Name 
83*5113495bSYour Name /**
84*5113495bSYour Name  * wlan_roam_debug_deinit() - Free log buffer allocated dynamically
85*5113495bSYour Name  *
86*5113495bSYour Name  * Return: none
87*5113495bSYour Name  */
wlan_roam_debug_deinit(void)88*5113495bSYour Name void wlan_roam_debug_deinit(void)
89*5113495bSYour Name {
90*5113495bSYour Name 	qdf_mem_vfree(global_wlan_roam_debug_table);
91*5113495bSYour Name 	global_wlan_roam_debug_table = NULL;
92*5113495bSYour Name }
93*5113495bSYour Name 
94*5113495bSYour Name qdf_export_symbol(wlan_roam_debug_deinit);
95*5113495bSYour Name #else /* WLAN_LOGGING_BUFFERS_DYNAMICALLY */
96*5113495bSYour Name /*
97*5113495bSYour Name  * wlan roam debug log is stored in this global structure. It can be accessed
98*5113495bSYour Name  * without requiring any psoc or vdev context. It will be accessible in
99*5113495bSYour Name  * the crash dump without having to dereference complex stack traces.
100*5113495bSYour Name  */
101*5113495bSYour Name static struct wlan_roam_debug_info global_wlan_roam_debug_table[REC_MAX] = {
102*5113495bSYour Name 	[REC_ROAM] = {{ 0 },
103*5113495bSYour Name 		      .num_max_rec = WLAN_ROAM_DEBUG_MAX_REC,
104*5113495bSYour Name 		      .rec_print = wlan_roam_rec_print},
105*5113495bSYour Name 	[REC_CONN] = {{ 0 },
106*5113495bSYour Name 		      .num_max_rec = WLAN_ROAM_DEBUG_MAX_REC,
107*5113495bSYour Name 		      .rec_print = wlan_conn_rec_print},
108*5113495bSYour Name };
109*5113495bSYour Name 
wlan_roam_debug_get_table(wlan_rec_type type)110*5113495bSYour Name static inline struct wlan_roam_debug_info *wlan_roam_debug_get_table(
111*5113495bSYour Name 	wlan_rec_type type)
112*5113495bSYour Name {
113*5113495bSYour Name 	if (type >= REC_MAX)
114*5113495bSYour Name 		return NULL;
115*5113495bSYour Name 	return &global_wlan_roam_debug_table[type];
116*5113495bSYour Name }
117*5113495bSYour Name #endif /* WLAN_LOGGING_BUFFERS_DYNAMICALLY */
118*5113495bSYour Name 
119*5113495bSYour Name /**
120*5113495bSYour Name  * wlan_roam_next_debug_log_index() - atomically increment and wrap around index
121*5113495bSYour Name  * @index: address of index to increment
122*5113495bSYour Name  * @size: wrap around this value
123*5113495bSYour Name  *
124*5113495bSYour Name  * Return: new value of index
125*5113495bSYour Name  */
wlan_roam_next_debug_log_index(qdf_atomic_t * index,int size)126*5113495bSYour Name static int wlan_roam_next_debug_log_index(qdf_atomic_t *index, int size)
127*5113495bSYour Name {
128*5113495bSYour Name 	int i = qdf_atomic_inc_return(index);
129*5113495bSYour Name 
130*5113495bSYour Name 	if (i == WLAN_ROAM_DEBUG_MAX_REC)
131*5113495bSYour Name 		qdf_atomic_sub(WLAN_ROAM_DEBUG_MAX_REC, index);
132*5113495bSYour Name 	while (i >= size)
133*5113495bSYour Name 		i -= WLAN_ROAM_DEBUG_MAX_REC;
134*5113495bSYour Name 
135*5113495bSYour Name 	return i;
136*5113495bSYour Name }
137*5113495bSYour Name 
138*5113495bSYour Name /**
139*5113495bSYour Name  * wlan_roam_debug_log() - Add a debug log entry to wlan roam debug records
140*5113495bSYour Name  * @vdev_id: vdev identifier
141*5113495bSYour Name  * @op: operation identifier
142*5113495bSYour Name  * @peer_id: peer id
143*5113495bSYour Name  * @mac_addr: mac address of peer, can be NULL
144*5113495bSYour Name  * @peer_obj: peer object address, can be NULL
145*5113495bSYour Name  * @arg1: extra argument #1
146*5113495bSYour Name  * @arg2: extra argument #2
147*5113495bSYour Name  *
148*5113495bSYour Name  * Return: none
149*5113495bSYour Name  */
wlan_roam_debug_log(uint8_t vdev_id,uint8_t op,uint16_t peer_id,void * mac_addr,void * peer_obj,uint32_t arg1,uint32_t arg2)150*5113495bSYour Name void wlan_roam_debug_log(uint8_t vdev_id, uint8_t op,
151*5113495bSYour Name 			uint16_t peer_id, void *mac_addr,
152*5113495bSYour Name 			void *peer_obj, uint32_t arg1, uint32_t arg2)
153*5113495bSYour Name {
154*5113495bSYour Name 	wlan_rec_debug_log(REC_ROAM, vdev_id, op, peer_id, mac_addr,
155*5113495bSYour Name 			   peer_obj, arg1, arg2);
156*5113495bSYour Name }
157*5113495bSYour Name 
158*5113495bSYour Name qdf_export_symbol(wlan_roam_debug_log);
159*5113495bSYour Name 
wlan_rec_debug_log(wlan_rec_type rec_type,uint8_t vdev_id,uint8_t op,uint16_t peer_id,const void * mac_addr,void * peer_obj,uint32_t arg1,uint32_t arg2)160*5113495bSYour Name void wlan_rec_debug_log(wlan_rec_type rec_type, uint8_t vdev_id, uint8_t op,
161*5113495bSYour Name 			uint16_t peer_id, const void *mac_addr,
162*5113495bSYour Name 			void *peer_obj, uint32_t arg1, uint32_t arg2)
163*5113495bSYour Name {
164*5113495bSYour Name 	uint32_t i;
165*5113495bSYour Name 	struct wlan_roam_debug_info *dbg_tbl;
166*5113495bSYour Name 	struct wlan_roam_debug_rec *rec;
167*5113495bSYour Name 
168*5113495bSYour Name 	dbg_tbl = wlan_roam_debug_get_table(rec_type);
169*5113495bSYour Name 	if (!dbg_tbl)
170*5113495bSYour Name 		return;
171*5113495bSYour Name 
172*5113495bSYour Name 	i = wlan_roam_next_debug_log_index(
173*5113495bSYour Name 				    &dbg_tbl->index,
174*5113495bSYour Name 				    WLAN_ROAM_DEBUG_MAX_REC);
175*5113495bSYour Name 	rec = &dbg_tbl->rec[i];
176*5113495bSYour Name 	rec->time = qdf_get_log_timestamp();
177*5113495bSYour Name 	rec->operation = op;
178*5113495bSYour Name 	rec->vdev_id = vdev_id;
179*5113495bSYour Name 	rec->peer_id = peer_id;
180*5113495bSYour Name 	if (mac_addr)
181*5113495bSYour Name 		qdf_mem_copy(rec->mac_addr.bytes, mac_addr,
182*5113495bSYour Name 			     QDF_MAC_ADDR_SIZE);
183*5113495bSYour Name 	else
184*5113495bSYour Name 		qdf_mem_zero(rec->mac_addr.bytes,
185*5113495bSYour Name 			     QDF_MAC_ADDR_SIZE);
186*5113495bSYour Name 	rec->peer_obj = peer_obj;
187*5113495bSYour Name 	rec->arg1 = arg1;
188*5113495bSYour Name 	rec->arg2 = arg2;
189*5113495bSYour Name }
190*5113495bSYour Name 
191*5113495bSYour Name qdf_export_symbol(wlan_rec_debug_log);
192*5113495bSYour Name 
193*5113495bSYour Name /**
194*5113495bSYour Name  * wlan_roam_debug_string() - convert operation value to printable string
195*5113495bSYour Name  * @op: operation identifier
196*5113495bSYour Name  *
197*5113495bSYour Name  * Return: printable string for the operation
198*5113495bSYour Name  */
wlan_roam_debug_string(uint32_t op)199*5113495bSYour Name static char *wlan_roam_debug_string(uint32_t op)
200*5113495bSYour Name {
201*5113495bSYour Name 	switch (op) {
202*5113495bSYour Name 	case DEBUG_PEER_CREATE_SEND:
203*5113495bSYour Name 		return "peer create send";
204*5113495bSYour Name 	case DEBUG_PEER_CREATE_RESP:
205*5113495bSYour Name 		return "peer create resp_event";
206*5113495bSYour Name 	case DEBUG_PEER_DELETE_SEND:
207*5113495bSYour Name 		return "peer delete send";
208*5113495bSYour Name 	case DEBUG_PEER_DELETE_RESP:
209*5113495bSYour Name 		return "peer delete resp_event";
210*5113495bSYour Name 	case DEBUG_PEER_MAP_EVENT:
211*5113495bSYour Name 		return "peer map event";
212*5113495bSYour Name 	case DEBUG_PEER_UNMAP_EVENT:
213*5113495bSYour Name 		return "peer unmap event";
214*5113495bSYour Name 	case DEBUG_PEER_UNREF_DELETE:
215*5113495bSYour Name 		return "peer unref delete";
216*5113495bSYour Name 	case DEBUG_DELETING_PEER_OBJ:
217*5113495bSYour Name 		return "peer obj deleted";
218*5113495bSYour Name 	case DEBUG_ROAM_SYNCH_IND:
219*5113495bSYour Name 		return "roam synch ind event";
220*5113495bSYour Name 	case DEBUG_ROAM_SYNCH_CNF:
221*5113495bSYour Name 		return "roam sync conf sent";
222*5113495bSYour Name 	case DEBUG_ROAM_SYNCH_FAIL:
223*5113495bSYour Name 		return "roam sync fail event";
224*5113495bSYour Name 	case DEBUG_ROAM_EVENT:
225*5113495bSYour Name 		return "roam event";
226*5113495bSYour Name 	case DEBUG_WOW_ROAM_EVENT:
227*5113495bSYour Name 		return "wow wakeup roam event";
228*5113495bSYour Name 	case DEBUG_BUS_SUSPEND:
229*5113495bSYour Name 		return "host suspend";
230*5113495bSYour Name 	case DEBUG_BUS_RESUME:
231*5113495bSYour Name 		return "host wakeup";
232*5113495bSYour Name 	case DEBUG_WOW_REASON:
233*5113495bSYour Name 		return "wow wakeup reason";
234*5113495bSYour Name 	case DEBUG_CONN_CONNECTING:
235*5113495bSYour Name 		return "conn";
236*5113495bSYour Name 	case DEBUG_CONN_ASSOCIATION:
237*5113495bSYour Name 		return "assoc";
238*5113495bSYour Name 	case DEBUG_CONN_CONNECT_RESULT:
239*5113495bSYour Name 		return "cnrlt";
240*5113495bSYour Name 	case DEBUG_CONN_ROAMING:
241*5113495bSYour Name 		return "roaming";
242*5113495bSYour Name 	case DEBUG_CONN_ROAMED:
243*5113495bSYour Name 		return "roamed";
244*5113495bSYour Name 	case DEBUG_CONN_ROAMED_IND:
245*5113495bSYour Name 		return "rmind";
246*5113495bSYour Name 	case DEBUG_CONN_DISCONNECT:
247*5113495bSYour Name 		return "disc";
248*5113495bSYour Name 	case DEBUG_CONN_DISCONNECT_HANDLER:
249*5113495bSYour Name 		return "dishdr";
250*5113495bSYour Name 	case DEBUG_CONN_DISCONNECT_IND:
251*5113495bSYour Name 		return "disind";
252*5113495bSYour Name 	case DEBUG_CONN_RSO:
253*5113495bSYour Name 		return "rso";
254*5113495bSYour Name 	default:
255*5113495bSYour Name 		return "unknown";
256*5113495bSYour Name 	}
257*5113495bSYour Name }
258*5113495bSYour Name 
wlan_roam_rec_print(struct wlan_roam_debug_rec * dbg_rec,uint32_t idx,uint32_t delta,bool to_kernel)259*5113495bSYour Name void wlan_roam_rec_print(struct wlan_roam_debug_rec *dbg_rec,
260*5113495bSYour Name 			 uint32_t idx, uint32_t delta,
261*5113495bSYour Name 			 bool to_kernel)
262*5113495bSYour Name {
263*5113495bSYour Name 	roam_debug("index = %5d timestamp = 0x%016llx delta ms = %-12u",
264*5113495bSYour Name 		   idx, dbg_rec->time, delta);
265*5113495bSYour Name 	roam_debug("info = %-24s vdev_id = %-3d mac addr = "QDF_MAC_ADDR_FMT,
266*5113495bSYour Name 		   wlan_roam_debug_string(dbg_rec->operation),
267*5113495bSYour Name 		   (int8_t)dbg_rec->vdev_id,
268*5113495bSYour Name 		   QDF_MAC_ADDR_REF(dbg_rec->mac_addr.bytes));
269*5113495bSYour Name 	roam_debug("peer obj = 0x%pK peer_id = %-4d", dbg_rec->peer_obj,
270*5113495bSYour Name 		   (int8_t)dbg_rec->peer_id);
271*5113495bSYour Name 	roam_debug("arg1 = 0x%-8x arg2 = 0x%-8x", dbg_rec->arg1,
272*5113495bSYour Name 		   dbg_rec->arg2);
273*5113495bSYour Name }
274*5113495bSYour Name 
wlan_conn_rec_print(struct wlan_roam_debug_rec * dbg_rec,uint32_t idx,uint32_t delta,bool to_kernel)275*5113495bSYour Name void wlan_conn_rec_print(struct wlan_roam_debug_rec *dbg_rec,
276*5113495bSYour Name 			 uint32_t idx, uint32_t delta,
277*5113495bSYour Name 			 bool to_kernel)
278*5113495bSYour Name {
279*5113495bSYour Name 	if (to_kernel) {
280*5113495bSYour Name 		roam_info("i %d ti 0x%08llx ms %u vdv %d %s a1 0x%x a2 0x%x "QDF_MAC_ADDR_FMT,
281*5113495bSYour Name 			  idx, dbg_rec->time, delta, (int8_t)dbg_rec->vdev_id,
282*5113495bSYour Name 			  wlan_roam_debug_string(dbg_rec->operation),
283*5113495bSYour Name 			  dbg_rec->arg1, dbg_rec->arg2,
284*5113495bSYour Name 			  QDF_MAC_ADDR_REF(dbg_rec->mac_addr.bytes));
285*5113495bSYour Name 	} else {
286*5113495bSYour Name 		roam_debug("i %d ti 0x%08llx ms %u vdv %d %s a1 0x%x a2 0x%x "QDF_MAC_ADDR_FMT,
287*5113495bSYour Name 			   idx, dbg_rec->time, delta, (int8_t)dbg_rec->vdev_id,
288*5113495bSYour Name 			   wlan_roam_debug_string(dbg_rec->operation),
289*5113495bSYour Name 			   dbg_rec->arg1, dbg_rec->arg2,
290*5113495bSYour Name 			   QDF_MAC_ADDR_REF(dbg_rec->mac_addr.bytes));
291*5113495bSYour Name 	}
292*5113495bSYour Name }
293*5113495bSYour Name 
294*5113495bSYour Name /**
295*5113495bSYour Name  * wlan_rec_debug_dump_table() - Print the wlan roam debug log records
296*5113495bSYour Name  * print all the valid debug records in the order of timestamp
297*5113495bSYour Name  *
298*5113495bSYour Name  * Return: none
299*5113495bSYour Name  */
wlan_rec_debug_dump_table(wlan_rec_type rec_type,uint32_t count,bool to_kernel)300*5113495bSYour Name void wlan_rec_debug_dump_table(wlan_rec_type rec_type, uint32_t count,
301*5113495bSYour Name 			       bool to_kernel)
302*5113495bSYour Name {
303*5113495bSYour Name 	uint32_t i;
304*5113495bSYour Name 	int32_t current_index;
305*5113495bSYour Name 	struct wlan_roam_debug_info *dbg_tbl;
306*5113495bSYour Name 	struct wlan_roam_debug_rec *dbg_rec;
307*5113495bSYour Name 	uint64_t startt = 0;
308*5113495bSYour Name 	uint32_t delta;
309*5113495bSYour Name 
310*5113495bSYour Name #define DEBUG_CLOCK_TICKS_PER_MSEC 19200
311*5113495bSYour Name 	if (count > WLAN_ROAM_DEBUG_MAX_REC)
312*5113495bSYour Name 		count = WLAN_ROAM_DEBUG_MAX_REC;
313*5113495bSYour Name 	dbg_tbl = wlan_roam_debug_get_table(rec_type);
314*5113495bSYour Name 	if (!dbg_tbl)
315*5113495bSYour Name 		return;
316*5113495bSYour Name 
317*5113495bSYour Name 	current_index = qdf_atomic_read(&dbg_tbl->index);
318*5113495bSYour Name 	if (current_index < 0) {
319*5113495bSYour Name 		roam_debug("No records to dump");
320*5113495bSYour Name 		return;
321*5113495bSYour Name 	}
322*5113495bSYour Name 	roam_debug("dump %d rec type %d idx %d", count, rec_type,
323*5113495bSYour Name 		   current_index);
324*5113495bSYour Name 
325*5113495bSYour Name 	i = (current_index + WLAN_ROAM_DEBUG_MAX_REC - count) %
326*5113495bSYour Name 		WLAN_ROAM_DEBUG_MAX_REC;
327*5113495bSYour Name 	do {
328*5113495bSYour Name 		/* wrap around */
329*5113495bSYour Name 		i = (i + 1) % WLAN_ROAM_DEBUG_MAX_REC;
330*5113495bSYour Name 		dbg_rec = &dbg_tbl->rec[i];
331*5113495bSYour Name 		/* skip unused entry */
332*5113495bSYour Name 		if (dbg_rec->time == 0)
333*5113495bSYour Name 			continue;
334*5113495bSYour Name 		if (count == 0)
335*5113495bSYour Name 			break;
336*5113495bSYour Name 		count--;
337*5113495bSYour Name 
338*5113495bSYour Name 		if (startt == 0)
339*5113495bSYour Name 			startt = dbg_rec->time;
340*5113495bSYour Name 		/*
341*5113495bSYour Name 		 * Divide by 19200 == right shift 8 bits, then divide by 75
342*5113495bSYour Name 		 * 32 bit computation keeps both 32 and 64 bit compilers happy.
343*5113495bSYour Name 		 * The value will roll over after approx. 33554 seconds.
344*5113495bSYour Name 		 */
345*5113495bSYour Name 		delta = (uint32_t) (((dbg_rec->time - startt) >> 8) &
346*5113495bSYour Name 				    0xffffffff);
347*5113495bSYour Name 		delta = delta / (DEBUG_CLOCK_TICKS_PER_MSEC >> 8);
348*5113495bSYour Name 
349*5113495bSYour Name 		if (dbg_tbl->rec_print)
350*5113495bSYour Name 			dbg_tbl->rec_print(dbg_rec, i, delta, to_kernel);
351*5113495bSYour Name 	} while (i != current_index);
352*5113495bSYour Name }
353*5113495bSYour Name 
354*5113495bSYour Name qdf_export_symbol(wlan_rec_debug_dump_table);
355*5113495bSYour Name 
356*5113495bSYour Name /**
357*5113495bSYour Name  * wlan_roam_debug_dump_table() - Print the wlan roam debug log records
358*5113495bSYour Name  * print all the valid debug records in the order of timestamp
359*5113495bSYour Name  *
360*5113495bSYour Name  * Return: none
361*5113495bSYour Name  */
wlan_roam_debug_dump_table(void)362*5113495bSYour Name void wlan_roam_debug_dump_table(void)
363*5113495bSYour Name {
364*5113495bSYour Name 	wlan_rec_debug_dump_table(REC_ROAM, WLAN_ROAM_DEBUG_MAX_REC, false);
365*5113495bSYour Name }
366*5113495bSYour Name qdf_export_symbol(wlan_roam_debug_dump_table);
367*5113495bSYour Name 
368*5113495bSYour Name #endif /* FEATURE_ROAM_DEBUG */
369