xref: /wlan-driver/qca-wifi-host-cmn/umac/cmn_services/serialization/src/wlan_serialization_debug.c (revision 5113495b16420b49004c444715d2daae2066e7dc)
1*5113495bSYour Name /*
2*5113495bSYour Name  * Copyright (c) 2018-2020 The Linux Foundation. All rights reserved.
3*5113495bSYour Name  * Copyright (c) 2022 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  * DOC: wlan_serialization_debug.c
21*5113495bSYour Name  * This file defines the debug functions for serialization component.
22*5113495bSYour Name  */
23*5113495bSYour Name 
24*5113495bSYour Name #include <wlan_objmgr_vdev_obj.h>
25*5113495bSYour Name #include <wlan_objmgr_pdev_obj.h>
26*5113495bSYour Name #include <wlan_utility.h>
27*5113495bSYour Name #include "wlan_serialization_utils_i.h"
28*5113495bSYour Name #include "wlan_serialization_main_i.h"
29*5113495bSYour Name #include "wlan_serialization_queue_i.h"
30*5113495bSYour Name #include "wlan_serialization_debug_i.h"
31*5113495bSYour Name 
32*5113495bSYour Name #ifdef WLAN_SER_DEBUG
33*5113495bSYour Name const char *ser_reason_string[SER_QUEUE_ACTION_MAX] = {
34*5113495bSYour Name 	"REQUEST",
35*5113495bSYour Name 	"REMOVE",
36*5113495bSYour Name 	"CANCEL",
37*5113495bSYour Name 	"TIMEOUT",
38*5113495bSYour Name 	"ACTIVATION_FAILED",
39*5113495bSYour Name 	"PENDING_TO_ACTIVE",
40*5113495bSYour Name };
41*5113495bSYour Name 
wlan_ser_print_queues(qdf_list_t * queue,enum wlan_serialization_node node_type,bool is_active_queue)42*5113495bSYour Name static void wlan_ser_print_queues(
43*5113495bSYour Name 		qdf_list_t *queue,
44*5113495bSYour Name 		enum wlan_serialization_node node_type,
45*5113495bSYour Name 		bool is_active_queue)
46*5113495bSYour Name {
47*5113495bSYour Name 	struct wlan_serialization_command_list *cmd_list = NULL;
48*5113495bSYour Name 	uint32_t queuelen;
49*5113495bSYour Name 	QDF_STATUS status = QDF_STATUS_E_FAILURE;
50*5113495bSYour Name 	qdf_list_node_t *nnode = NULL;
51*5113495bSYour Name 	bool is_pdev_queue = false;
52*5113495bSYour Name 
53*5113495bSYour Name 	if (node_type == WLAN_SER_PDEV_NODE)
54*5113495bSYour Name 		is_pdev_queue = true;
55*5113495bSYour Name 
56*5113495bSYour Name 	ser_err_no_fl(WLAN_SER_LINE);
57*5113495bSYour Name 	ser_err_no_fl("%s %s Queue", (is_pdev_queue) ? "PDEV" : "VDEV",
58*5113495bSYour Name 		      (is_active_queue ? "Active" : "Pending"));
59*5113495bSYour Name 
60*5113495bSYour Name 	ser_err_no_fl(WLAN_SER_LINE);
61*5113495bSYour Name 	ser_err_no_fl("|CMD_TYPE|CMD_ID|VDEV_ID|BLOCKING|PRIORITY|");
62*5113495bSYour Name 	ser_err_no_fl(WLAN_SER_LINE);
63*5113495bSYour Name 
64*5113495bSYour Name 	queuelen = wlan_serialization_list_size(queue);
65*5113495bSYour Name 	while (queuelen--) {
66*5113495bSYour Name 		status = wlan_serialization_get_cmd_from_queue(queue, &nnode);
67*5113495bSYour Name 		if (status != QDF_STATUS_SUCCESS)
68*5113495bSYour Name 			break;
69*5113495bSYour Name 
70*5113495bSYour Name 	if (node_type == WLAN_SER_PDEV_NODE)
71*5113495bSYour Name 		cmd_list = qdf_container_of(
72*5113495bSYour Name 				nnode,
73*5113495bSYour Name 				struct wlan_serialization_command_list,
74*5113495bSYour Name 				pdev_node);
75*5113495bSYour Name 	else
76*5113495bSYour Name 		cmd_list = qdf_container_of(
77*5113495bSYour Name 				nnode,
78*5113495bSYour Name 				struct wlan_serialization_command_list,
79*5113495bSYour Name 				vdev_node);
80*5113495bSYour Name 
81*5113495bSYour Name 	ser_err_no_fl("|%8u|%6u|%6u|%8u|%8u|",
82*5113495bSYour Name 		      cmd_list->cmd.cmd_type,
83*5113495bSYour Name 		cmd_list->cmd.cmd_id,
84*5113495bSYour Name 		wlan_vdev_get_id(cmd_list->cmd.vdev),
85*5113495bSYour Name 		cmd_list->cmd.is_blocking,
86*5113495bSYour Name 		cmd_list->cmd.is_high_priority);
87*5113495bSYour Name 	}
88*5113495bSYour Name }
89*5113495bSYour Name 
wlan_ser_print_pdev_queue(struct wlan_serialization_pdev_queue * ser_pdev_q_obj,enum wlan_serialization_node node_type)90*5113495bSYour Name static void wlan_ser_print_pdev_queue(
91*5113495bSYour Name 		struct wlan_serialization_pdev_queue *ser_pdev_q_obj,
92*5113495bSYour Name 		enum wlan_serialization_node node_type)
93*5113495bSYour Name {
94*5113495bSYour Name 	/*Dump the active queue*/
95*5113495bSYour Name 	wlan_ser_print_queues(&ser_pdev_q_obj->active_list,
96*5113495bSYour Name 			      node_type, true);
97*5113495bSYour Name 
98*5113495bSYour Name 	/*Dump the pending queue*/
99*5113495bSYour Name 	wlan_ser_print_queues(&ser_pdev_q_obj->pending_list,
100*5113495bSYour Name 			      node_type, false);
101*5113495bSYour Name }
102*5113495bSYour Name 
wlan_ser_print_vdev_queue(struct wlan_serialization_vdev_queue * ser_vdev_q_obj,enum wlan_serialization_node node_type)103*5113495bSYour Name static void wlan_ser_print_vdev_queue(
104*5113495bSYour Name 		struct wlan_serialization_vdev_queue *ser_vdev_q_obj,
105*5113495bSYour Name 		enum wlan_serialization_node node_type)
106*5113495bSYour Name {
107*5113495bSYour Name 	/*Dump the active queue*/
108*5113495bSYour Name 	wlan_ser_print_queues(&ser_vdev_q_obj->active_list,
109*5113495bSYour Name 			      node_type, true);
110*5113495bSYour Name 
111*5113495bSYour Name 	/*Dump the pending queue*/
112*5113495bSYour Name 	wlan_ser_print_queues(&ser_vdev_q_obj->pending_list,
113*5113495bSYour Name 			      node_type, false);
114*5113495bSYour Name }
115*5113495bSYour Name 
wlan_ser_print_all_history(struct wlan_serialization_pdev_queue * pdev_queue,bool for_vdev_queue,uint32_t vdev_id)116*5113495bSYour Name static void wlan_ser_print_all_history(
117*5113495bSYour Name 		struct wlan_serialization_pdev_queue *pdev_queue,
118*5113495bSYour Name 		bool for_vdev_queue,
119*5113495bSYour Name 		uint32_t vdev_id)
120*5113495bSYour Name {
121*5113495bSYour Name 	uint8_t idx;
122*5113495bSYour Name 	uint8_t data_idx;
123*5113495bSYour Name 	struct ser_history *history_info;
124*5113495bSYour Name 	struct ser_data *data;
125*5113495bSYour Name 
126*5113495bSYour Name 	history_info = &pdev_queue->history;
127*5113495bSYour Name 
128*5113495bSYour Name 	ser_err_no_fl(WLAN_SER_LINE WLAN_SER_LINE);
129*5113495bSYour Name 	ser_err_no_fl("Queue Commands History");
130*5113495bSYour Name 	ser_err_no_fl(WLAN_SER_LINE WLAN_SER_LINE);
131*5113495bSYour Name 	ser_err_no_fl(WLAN_SER_HISTORY_HEADER);
132*5113495bSYour Name 	ser_err_no_fl(WLAN_SER_LINE WLAN_SER_LINE);
133*5113495bSYour Name 
134*5113495bSYour Name 	for (idx = 0; idx < SER_MAX_HISTORY_CMDS; idx++) {
135*5113495bSYour Name 		data_idx = (history_info->index + idx) % SER_MAX_HISTORY_CMDS;
136*5113495bSYour Name 
137*5113495bSYour Name 		data = &history_info->data[data_idx];
138*5113495bSYour Name 
139*5113495bSYour Name 		if (data->ser_reason >= SER_QUEUE_ACTION_MAX) {
140*5113495bSYour Name 			ser_debug("Invalid Serialization Reason");
141*5113495bSYour Name 			continue;
142*5113495bSYour Name 		}
143*5113495bSYour Name 
144*5113495bSYour Name 		if (!data->data_updated)
145*5113495bSYour Name 			continue;
146*5113495bSYour Name 
147*5113495bSYour Name 		if (for_vdev_queue) {
148*5113495bSYour Name 			if (vdev_id != data->vdev_id)
149*5113495bSYour Name 				continue;
150*5113495bSYour Name 		}
151*5113495bSYour Name 		ser_err_no_fl(
152*5113495bSYour Name 			"|0x%016llx|%8d|%6d|%7d|%8d|%8d|%6s|%7s|%17s|",
153*5113495bSYour Name 			data->time,
154*5113495bSYour Name 			data->cmd_type,
155*5113495bSYour Name 			data->cmd_id,
156*5113495bSYour Name 			data->vdev_id,
157*5113495bSYour Name 			data->is_blocking,
158*5113495bSYour Name 			data->is_high_priority,
159*5113495bSYour Name 			data->add_remove ? "ADD" : "REMOVE",
160*5113495bSYour Name 			data->active_pending ? "ACTIVE" : "PENDING",
161*5113495bSYour Name 			ser_reason_string[data->ser_reason]);
162*5113495bSYour Name 	}
163*5113495bSYour Name }
164*5113495bSYour Name 
wlan_ser_print_history(struct wlan_objmgr_vdev * vdev,uint8_t val,uint32_t sub_val)165*5113495bSYour Name QDF_STATUS wlan_ser_print_history(
166*5113495bSYour Name 		struct wlan_objmgr_vdev *vdev, uint8_t val,
167*5113495bSYour Name 		uint32_t sub_val)
168*5113495bSYour Name {
169*5113495bSYour Name 	struct wlan_ser_pdev_obj *ser_pdev;
170*5113495bSYour Name 	struct wlan_ser_vdev_obj *ser_vdev;
171*5113495bSYour Name 	struct wlan_serialization_pdev_queue *pdev_q;
172*5113495bSYour Name 	struct wlan_serialization_vdev_queue *vdev_q;
173*5113495bSYour Name 	bool for_vdev_queue = false;
174*5113495bSYour Name 	uint32_t vdev_id = WLAN_INVALID_VDEV_ID;
175*5113495bSYour Name 
176*5113495bSYour Name 	ser_pdev = wlan_serialization_get_pdev_obj(
177*5113495bSYour Name 			wlan_vdev_get_pdev(vdev));
178*5113495bSYour Name 
179*5113495bSYour Name 	ser_vdev = wlan_serialization_get_vdev_obj(vdev);
180*5113495bSYour Name 
181*5113495bSYour Name 	switch (val) {
182*5113495bSYour Name 	/*
183*5113495bSYour Name 	 * Print scan pdev queues
184*5113495bSYour Name 	 */
185*5113495bSYour Name 	case SER_PDEV_QUEUE_COMP_SCAN:
186*5113495bSYour Name 		ser_err_no_fl("Serialization SCAN Queues(LIVE)");
187*5113495bSYour Name 		pdev_q = &ser_pdev->pdev_q[SER_PDEV_QUEUE_COMP_SCAN];
188*5113495bSYour Name 		wlan_ser_print_pdev_queue(pdev_q, WLAN_SER_PDEV_NODE);
189*5113495bSYour Name 		break;
190*5113495bSYour Name 	/*
191*5113495bSYour Name 	 * Print non scan queues
192*5113495bSYour Name 	 */
193*5113495bSYour Name 	case SER_PDEV_QUEUE_COMP_NON_SCAN:
194*5113495bSYour Name 		pdev_q = &ser_pdev->pdev_q[SER_PDEV_QUEUE_COMP_NON_SCAN];
195*5113495bSYour Name 		ser_err_no_fl("Serialization NON SCAN Queues(LIVE)");
196*5113495bSYour Name 		switch (sub_val) {
197*5113495bSYour Name 		/*
198*5113495bSYour Name 		 * Print non scan pdev queues
199*5113495bSYour Name 		 */
200*5113495bSYour Name 		case SER_PDEV_QUEUE_TYPE:
201*5113495bSYour Name 			wlan_ser_print_pdev_queue(pdev_q, WLAN_SER_PDEV_NODE);
202*5113495bSYour Name 			break;
203*5113495bSYour Name 		/*
204*5113495bSYour Name 		 * Print non scan pdev queues
205*5113495bSYour Name 		 */
206*5113495bSYour Name 		case SER_VDEV_QUEUE_TYPE:
207*5113495bSYour Name 			vdev_q =
208*5113495bSYour Name 			    &ser_vdev->vdev_q[SER_VDEV_QUEUE_COMP_NON_SCAN];
209*5113495bSYour Name 			for_vdev_queue = true;
210*5113495bSYour Name 			vdev_id = wlan_vdev_get_id(vdev);
211*5113495bSYour Name 			wlan_ser_print_vdev_queue(vdev_q, WLAN_SER_VDEV_NODE);
212*5113495bSYour Name 			break;
213*5113495bSYour Name 		default:
214*5113495bSYour Name 			ser_err("Invalid parameter for queue type(pdev/vdev)");
215*5113495bSYour Name 		}
216*5113495bSYour Name 		break;
217*5113495bSYour Name 	default:
218*5113495bSYour Name 		ser_err("Invalid parameter for queue type(scan/non_scan");
219*5113495bSYour Name 		goto error;
220*5113495bSYour Name 	}
221*5113495bSYour Name 
222*5113495bSYour Name 	wlan_ser_print_all_history(pdev_q, for_vdev_queue, vdev_id);
223*5113495bSYour Name error:
224*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
225*5113495bSYour Name }
226*5113495bSYour Name 
227*5113495bSYour Name qdf_export_symbol(wlan_ser_print_history);
228*5113495bSYour Name 
wlan_ser_update_cmd_history(struct wlan_serialization_pdev_queue * pdev_queue,struct wlan_serialization_command * cmd,enum ser_queue_reason ser_reason,bool add_remove,bool active_queue)229*5113495bSYour Name void wlan_ser_update_cmd_history(
230*5113495bSYour Name 		struct wlan_serialization_pdev_queue *pdev_queue,
231*5113495bSYour Name 		struct wlan_serialization_command *cmd,
232*5113495bSYour Name 		enum ser_queue_reason ser_reason,
233*5113495bSYour Name 		bool add_remove,
234*5113495bSYour Name 		bool active_queue)
235*5113495bSYour Name {
236*5113495bSYour Name 	struct ser_data *ser_data_info;
237*5113495bSYour Name 	struct ser_history *ser_history_info;
238*5113495bSYour Name 
239*5113495bSYour Name 	ser_history_info = &pdev_queue->history;
240*5113495bSYour Name 	ser_history_info->index %= SER_MAX_HISTORY_CMDS;
241*5113495bSYour Name 
242*5113495bSYour Name 	ser_data_info = &ser_history_info->data[ser_history_info->index];
243*5113495bSYour Name 
244*5113495bSYour Name 	ser_data_info->cmd_type = cmd->cmd_type;
245*5113495bSYour Name 	ser_data_info->cmd_id = cmd->cmd_id;
246*5113495bSYour Name 	ser_data_info->is_blocking = cmd->is_blocking;
247*5113495bSYour Name 	ser_data_info->is_high_priority = cmd->is_high_priority;
248*5113495bSYour Name 	ser_data_info->add_remove = add_remove;
249*5113495bSYour Name 	ser_data_info->active_pending = active_queue;
250*5113495bSYour Name 	ser_data_info->ser_reason = ser_reason;
251*5113495bSYour Name 	ser_data_info->vdev_id = wlan_vdev_get_id(cmd->vdev);
252*5113495bSYour Name 	ser_data_info->data_updated = true;
253*5113495bSYour Name 	ser_data_info->time = qdf_get_log_timestamp();
254*5113495bSYour Name 
255*5113495bSYour Name 	ser_history_info->index++;
256*5113495bSYour Name }
257*5113495bSYour Name #endif
258