xref: /linux/drivers/usb/dwc3/debug.h (revision e5c86679d5e864947a52fb31e45a425dea3e7fa9)
1 /**
2  * debug.h - DesignWare USB3 DRD Controller Debug Header
3  *
4  * Copyright (C) 2010-2011 Texas Instruments Incorporated - http://www.ti.com
5  *
6  * Authors: Felipe Balbi <balbi@ti.com>,
7  *	    Sebastian Andrzej Siewior <bigeasy@linutronix.de>
8  *
9  * This program is free software: you can redistribute it and/or modify
10  * it under the terms of the GNU General Public License version 2  of
11  * the License as published by the Free Software Foundation.
12  *
13  * This program is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16  * GNU General Public License for more details.
17  */
18 
19 #ifndef __DWC3_DEBUG_H
20 #define __DWC3_DEBUG_H
21 
22 #include "core.h"
23 
24 /**
25  * dwc3_gadget_ep_cmd_string - returns endpoint command string
26  * @cmd: command code
27  */
28 static inline const char *
29 dwc3_gadget_ep_cmd_string(u8 cmd)
30 {
31 	switch (cmd) {
32 	case DWC3_DEPCMD_DEPSTARTCFG:
33 		return "Start New Configuration";
34 	case DWC3_DEPCMD_ENDTRANSFER:
35 		return "End Transfer";
36 	case DWC3_DEPCMD_UPDATETRANSFER:
37 		return "Update Transfer";
38 	case DWC3_DEPCMD_STARTTRANSFER:
39 		return "Start Transfer";
40 	case DWC3_DEPCMD_CLEARSTALL:
41 		return "Clear Stall";
42 	case DWC3_DEPCMD_SETSTALL:
43 		return "Set Stall";
44 	case DWC3_DEPCMD_GETEPSTATE:
45 		return "Get Endpoint State";
46 	case DWC3_DEPCMD_SETTRANSFRESOURCE:
47 		return "Set Endpoint Transfer Resource";
48 	case DWC3_DEPCMD_SETEPCONFIG:
49 		return "Set Endpoint Configuration";
50 	default:
51 		return "UNKNOWN command";
52 	}
53 }
54 
55 /**
56  * dwc3_gadget_generic_cmd_string - returns generic command string
57  * @cmd: command code
58  */
59 static inline const char *
60 dwc3_gadget_generic_cmd_string(u8 cmd)
61 {
62 	switch (cmd) {
63 	case DWC3_DGCMD_SET_LMP:
64 		return "Set LMP";
65 	case DWC3_DGCMD_SET_PERIODIC_PAR:
66 		return "Set Periodic Parameters";
67 	case DWC3_DGCMD_XMIT_FUNCTION:
68 		return "Transmit Function Wake Device Notification";
69 	case DWC3_DGCMD_SET_SCRATCHPAD_ADDR_LO:
70 		return "Set Scratchpad Buffer Array Address Lo";
71 	case DWC3_DGCMD_SET_SCRATCHPAD_ADDR_HI:
72 		return "Set Scratchpad Buffer Array Address Hi";
73 	case DWC3_DGCMD_SELECTED_FIFO_FLUSH:
74 		return "Selected FIFO Flush";
75 	case DWC3_DGCMD_ALL_FIFO_FLUSH:
76 		return "All FIFO Flush";
77 	case DWC3_DGCMD_SET_ENDPOINT_NRDY:
78 		return "Set Endpoint NRDY";
79 	case DWC3_DGCMD_RUN_SOC_BUS_LOOPBACK:
80 		return "Run SoC Bus Loopback Test";
81 	default:
82 		return "UNKNOWN";
83 	}
84 }
85 
86 /**
87  * dwc3_gadget_link_string - returns link name
88  * @link_state: link state code
89  */
90 static inline const char *
91 dwc3_gadget_link_string(enum dwc3_link_state link_state)
92 {
93 	switch (link_state) {
94 	case DWC3_LINK_STATE_U0:
95 		return "U0";
96 	case DWC3_LINK_STATE_U1:
97 		return "U1";
98 	case DWC3_LINK_STATE_U2:
99 		return "U2";
100 	case DWC3_LINK_STATE_U3:
101 		return "U3";
102 	case DWC3_LINK_STATE_SS_DIS:
103 		return "SS.Disabled";
104 	case DWC3_LINK_STATE_RX_DET:
105 		return "RX.Detect";
106 	case DWC3_LINK_STATE_SS_INACT:
107 		return "SS.Inactive";
108 	case DWC3_LINK_STATE_POLL:
109 		return "Polling";
110 	case DWC3_LINK_STATE_RECOV:
111 		return "Recovery";
112 	case DWC3_LINK_STATE_HRESET:
113 		return "Hot Reset";
114 	case DWC3_LINK_STATE_CMPLY:
115 		return "Compliance";
116 	case DWC3_LINK_STATE_LPBK:
117 		return "Loopback";
118 	case DWC3_LINK_STATE_RESET:
119 		return "Reset";
120 	case DWC3_LINK_STATE_RESUME:
121 		return "Resume";
122 	default:
123 		return "UNKNOWN link state\n";
124 	}
125 }
126 
127 static inline const char *dwc3_ep0_state_string(enum dwc3_ep0_state state)
128 {
129 	switch (state) {
130 	case EP0_UNCONNECTED:
131 		return "Unconnected";
132 	case EP0_SETUP_PHASE:
133 		return "Setup Phase";
134 	case EP0_DATA_PHASE:
135 		return "Data Phase";
136 	case EP0_STATUS_PHASE:
137 		return "Status Phase";
138 	default:
139 		return "UNKNOWN";
140 	}
141 }
142 
143 /**
144  * dwc3_gadget_event_string - returns event name
145  * @event: the event code
146  */
147 static inline const char *
148 dwc3_gadget_event_string(const struct dwc3_event_devt *event)
149 {
150 	static char str[256];
151 	enum dwc3_link_state state = event->event_info & DWC3_LINK_STATE_MASK;
152 
153 	switch (event->type) {
154 	case DWC3_DEVICE_EVENT_DISCONNECT:
155 		sprintf(str, "Disconnect: [%s]",
156 				dwc3_gadget_link_string(state));
157 		break;
158 	case DWC3_DEVICE_EVENT_RESET:
159 		sprintf(str, "Reset [%s]", dwc3_gadget_link_string(state));
160 		break;
161 	case DWC3_DEVICE_EVENT_CONNECT_DONE:
162 		sprintf(str, "Connection Done [%s]",
163 				dwc3_gadget_link_string(state));
164 		break;
165 	case DWC3_DEVICE_EVENT_LINK_STATUS_CHANGE:
166 		sprintf(str, "Link Change [%s]",
167 				dwc3_gadget_link_string(state));
168 		break;
169 	case DWC3_DEVICE_EVENT_WAKEUP:
170 		sprintf(str, "WakeUp [%s]", dwc3_gadget_link_string(state));
171 		break;
172 	case DWC3_DEVICE_EVENT_EOPF:
173 		sprintf(str, "End-Of-Frame [%s]",
174 				dwc3_gadget_link_string(state));
175 		break;
176 	case DWC3_DEVICE_EVENT_SOF:
177 		sprintf(str, "Start-Of-Frame [%s]",
178 				dwc3_gadget_link_string(state));
179 		break;
180 	case DWC3_DEVICE_EVENT_ERRATIC_ERROR:
181 		sprintf(str, "Erratic Error [%s]",
182 				dwc3_gadget_link_string(state));
183 		break;
184 	case DWC3_DEVICE_EVENT_CMD_CMPL:
185 		sprintf(str, "Command Complete [%s]",
186 				dwc3_gadget_link_string(state));
187 		break;
188 	case DWC3_DEVICE_EVENT_OVERFLOW:
189 		sprintf(str, "Overflow [%s]", dwc3_gadget_link_string(state));
190 		break;
191 	default:
192 		sprintf(str, "UNKNOWN");
193 	}
194 
195 	return str;
196 }
197 
198 /**
199  * dwc3_ep_event_string - returns event name
200  * @event: then event code
201  */
202 static inline const char *
203 dwc3_ep_event_string(const struct dwc3_event_depevt *event, u32 ep0state)
204 {
205 	u8 epnum = event->endpoint_number;
206 	static char str[256];
207 	size_t len;
208 	int status;
209 	int ret;
210 
211 	ret = sprintf(str, "ep%d%s: ", epnum >> 1,
212 			(epnum & 1) ? "in" : "out");
213 	if (ret < 0)
214 		return "UNKNOWN";
215 
216 	switch (event->endpoint_event) {
217 	case DWC3_DEPEVT_XFERCOMPLETE:
218 		strcat(str, "Transfer Complete");
219 		len = strlen(str);
220 
221 		if (epnum <= 1)
222 			sprintf(str + len, " [%s]", dwc3_ep0_state_string(ep0state));
223 		break;
224 	case DWC3_DEPEVT_XFERINPROGRESS:
225 		strcat(str, "Transfer In-Progress");
226 		break;
227 	case DWC3_DEPEVT_XFERNOTREADY:
228 		strcat(str, "Transfer Not Ready");
229 		status = event->status & DEPEVT_STATUS_TRANSFER_ACTIVE;
230 		strcat(str, status ? " (Active)" : " (Not Active)");
231 
232 		/* Control Endpoints */
233 		if (epnum <= 1) {
234 			int phase = DEPEVT_STATUS_CONTROL_PHASE(event->status);
235 
236 			switch (phase) {
237 			case DEPEVT_STATUS_CONTROL_DATA:
238 				strcat(str, " [Data Phase]");
239 				break;
240 			case DEPEVT_STATUS_CONTROL_STATUS:
241 				strcat(str, " [Status Phase]");
242 			}
243 		}
244 		break;
245 	case DWC3_DEPEVT_RXTXFIFOEVT:
246 		strcat(str, "FIFO");
247 		break;
248 	case DWC3_DEPEVT_STREAMEVT:
249 		status = event->status;
250 
251 		switch (status) {
252 		case DEPEVT_STREAMEVT_FOUND:
253 			sprintf(str + ret, " Stream %d Found",
254 					event->parameters);
255 			break;
256 		case DEPEVT_STREAMEVT_NOTFOUND:
257 		default:
258 			strcat(str, " Stream Not Found");
259 			break;
260 		}
261 
262 		break;
263 	case DWC3_DEPEVT_EPCMDCMPLT:
264 		strcat(str, "Endpoint Command Complete");
265 		break;
266 	default:
267 		sprintf(str, "UNKNOWN");
268 	}
269 
270 	return str;
271 }
272 
273 /**
274  * dwc3_gadget_event_type_string - return event name
275  * @event: the event code
276  */
277 static inline const char *dwc3_gadget_event_type_string(u8 event)
278 {
279 	switch (event) {
280 	case DWC3_DEVICE_EVENT_DISCONNECT:
281 		return "Disconnect";
282 	case DWC3_DEVICE_EVENT_RESET:
283 		return "Reset";
284 	case DWC3_DEVICE_EVENT_CONNECT_DONE:
285 		return "Connect Done";
286 	case DWC3_DEVICE_EVENT_LINK_STATUS_CHANGE:
287 		return "Link Status Change";
288 	case DWC3_DEVICE_EVENT_WAKEUP:
289 		return "Wake-Up";
290 	case DWC3_DEVICE_EVENT_HIBER_REQ:
291 		return "Hibernation";
292 	case DWC3_DEVICE_EVENT_EOPF:
293 		return "End of Periodic Frame";
294 	case DWC3_DEVICE_EVENT_SOF:
295 		return "Start of Frame";
296 	case DWC3_DEVICE_EVENT_ERRATIC_ERROR:
297 		return "Erratic Error";
298 	case DWC3_DEVICE_EVENT_CMD_CMPL:
299 		return "Command Complete";
300 	case DWC3_DEVICE_EVENT_OVERFLOW:
301 		return "Overflow";
302 	default:
303 		return "UNKNOWN";
304 	}
305 }
306 
307 static inline const char *dwc3_decode_event(u32 event, u32 ep0state)
308 {
309 	const union dwc3_event evt = (union dwc3_event) event;
310 
311 	if (evt.type.is_devspec)
312 		return dwc3_gadget_event_string(&evt.devt);
313 	else
314 		return dwc3_ep_event_string(&evt.depevt, ep0state);
315 }
316 
317 static inline const char *dwc3_ep_cmd_status_string(int status)
318 {
319 	switch (status) {
320 	case -ETIMEDOUT:
321 		return "Timed Out";
322 	case 0:
323 		return "Successful";
324 	case DEPEVT_TRANSFER_NO_RESOURCE:
325 		return "No Resource";
326 	case DEPEVT_TRANSFER_BUS_EXPIRY:
327 		return "Bus Expiry";
328 	default:
329 		return "UNKNOWN";
330 	}
331 }
332 
333 static inline const char *dwc3_gadget_generic_cmd_status_string(int status)
334 {
335 	switch (status) {
336 	case -ETIMEDOUT:
337 		return "Timed Out";
338 	case 0:
339 		return "Successful";
340 	case 1:
341 		return "Error";
342 	default:
343 		return "UNKNOWN";
344 	}
345 }
346 
347 
348 #ifdef CONFIG_DEBUG_FS
349 extern void dwc3_debugfs_init(struct dwc3 *);
350 extern void dwc3_debugfs_exit(struct dwc3 *);
351 #else
352 static inline void dwc3_debugfs_init(struct dwc3 *d)
353 {  }
354 static inline void dwc3_debugfs_exit(struct dwc3 *d)
355 {  }
356 #endif
357 #endif /* __DWC3_DEBUG_H */
358