xref: /openbmc/linux/drivers/usb/dwc3/debug.h (revision 2d96b44f)
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 /**
128  * dwc3_gadget_event_string - returns event name
129  * @event: the event code
130  */
131 static inline const char *
132 dwc3_gadget_event_string(const struct dwc3_event_devt *event)
133 {
134 	static char str[256];
135 	enum dwc3_link_state state = event->event_info & DWC3_LINK_STATE_MASK;
136 
137 	switch (event->type) {
138 	case DWC3_DEVICE_EVENT_DISCONNECT:
139 		sprintf(str, "Disconnect: [%s]",
140 				dwc3_gadget_link_string(state));
141 		break;
142 	case DWC3_DEVICE_EVENT_RESET:
143 		sprintf(str, "Reset [%s]", dwc3_gadget_link_string(state));
144 		break;
145 	case DWC3_DEVICE_EVENT_CONNECT_DONE:
146 		sprintf(str, "Connection Done [%s]",
147 				dwc3_gadget_link_string(state));
148 		break;
149 	case DWC3_DEVICE_EVENT_LINK_STATUS_CHANGE:
150 		sprintf(str, "Link Change [%s]",
151 				dwc3_gadget_link_string(state));
152 		break;
153 	case DWC3_DEVICE_EVENT_WAKEUP:
154 		sprintf(str, "WakeUp [%s]", dwc3_gadget_link_string(state));
155 		break;
156 	case DWC3_DEVICE_EVENT_EOPF:
157 		sprintf(str, "End-Of-Frame [%s]",
158 				dwc3_gadget_link_string(state));
159 		break;
160 	case DWC3_DEVICE_EVENT_SOF:
161 		sprintf(str, "Start-Of-Frame [%s]",
162 				dwc3_gadget_link_string(state));
163 		break;
164 	case DWC3_DEVICE_EVENT_ERRATIC_ERROR:
165 		sprintf(str, "Erratic Error [%s]",
166 				dwc3_gadget_link_string(state));
167 		break;
168 	case DWC3_DEVICE_EVENT_CMD_CMPL:
169 		sprintf(str, "Command Complete [%s]",
170 				dwc3_gadget_link_string(state));
171 		break;
172 	case DWC3_DEVICE_EVENT_OVERFLOW:
173 		sprintf(str, "Overflow [%s]", dwc3_gadget_link_string(state));
174 		break;
175 	default:
176 		sprintf(str, "UNKNOWN");
177 	}
178 
179 	return str;
180 }
181 
182 /**
183  * dwc3_ep_event_string - returns event name
184  * @event: then event code
185  */
186 static inline const char *
187 dwc3_ep_event_string(const struct dwc3_event_depevt *event)
188 {
189 	u8 epnum = event->endpoint_number;
190 	static char str[256];
191 	int status;
192 	int ret;
193 
194 	ret = sprintf(str, "ep%d%s: ", epnum >> 1,
195 			(epnum & 1) ? "in" : "out");
196 	if (ret < 0)
197 		return "UNKNOWN";
198 
199 	switch (event->endpoint_event) {
200 	case DWC3_DEPEVT_XFERCOMPLETE:
201 		strcat(str, "Transfer Complete");
202 		break;
203 	case DWC3_DEPEVT_XFERINPROGRESS:
204 		strcat(str, "Transfer In-Progress");
205 		break;
206 	case DWC3_DEPEVT_XFERNOTREADY:
207 		strcat(str, "Transfer Not Ready");
208 		status = event->status & DEPEVT_STATUS_TRANSFER_ACTIVE;
209 		strcat(str, status ? " (Active)" : " (Not Active)");
210 		break;
211 	case DWC3_DEPEVT_RXTXFIFOEVT:
212 		strcat(str, "FIFO");
213 		break;
214 	case DWC3_DEPEVT_STREAMEVT:
215 		status = event->status;
216 
217 		switch (status) {
218 		case DEPEVT_STREAMEVT_FOUND:
219 			sprintf(str + ret, " Stream %d Found",
220 					event->parameters);
221 			break;
222 		case DEPEVT_STREAMEVT_NOTFOUND:
223 		default:
224 			strcat(str, " Stream Not Found");
225 			break;
226 		}
227 
228 		break;
229 	case DWC3_DEPEVT_EPCMDCMPLT:
230 		strcat(str, "Endpoint Command Complete");
231 		break;
232 	default:
233 		sprintf(str, "UNKNOWN");
234 	}
235 
236 	return str;
237 }
238 
239 /**
240  * dwc3_gadget_event_type_string - return event name
241  * @event: the event code
242  */
243 static inline const char *dwc3_gadget_event_type_string(u8 event)
244 {
245 	switch (event) {
246 	case DWC3_DEVICE_EVENT_DISCONNECT:
247 		return "Disconnect";
248 	case DWC3_DEVICE_EVENT_RESET:
249 		return "Reset";
250 	case DWC3_DEVICE_EVENT_CONNECT_DONE:
251 		return "Connect Done";
252 	case DWC3_DEVICE_EVENT_LINK_STATUS_CHANGE:
253 		return "Link Status Change";
254 	case DWC3_DEVICE_EVENT_WAKEUP:
255 		return "Wake-Up";
256 	case DWC3_DEVICE_EVENT_HIBER_REQ:
257 		return "Hibernation";
258 	case DWC3_DEVICE_EVENT_EOPF:
259 		return "End of Periodic Frame";
260 	case DWC3_DEVICE_EVENT_SOF:
261 		return "Start of Frame";
262 	case DWC3_DEVICE_EVENT_ERRATIC_ERROR:
263 		return "Erratic Error";
264 	case DWC3_DEVICE_EVENT_CMD_CMPL:
265 		return "Command Complete";
266 	case DWC3_DEVICE_EVENT_OVERFLOW:
267 		return "Overflow";
268 	default:
269 		return "UNKNOWN";
270 	}
271 }
272 
273 static inline const char *dwc3_decode_event(u32 event)
274 {
275 	const union dwc3_event evt = (union dwc3_event) event;
276 
277 	if (evt.type.is_devspec)
278 		return dwc3_gadget_event_string(&evt.devt);
279 	else
280 		return dwc3_ep_event_string(&evt.depevt);
281 }
282 
283 static inline const char *dwc3_ep_cmd_status_string(int status)
284 {
285 	switch (status) {
286 	case -ETIMEDOUT:
287 		return "Timed Out";
288 	case 0:
289 		return "Successful";
290 	case DEPEVT_TRANSFER_NO_RESOURCE:
291 		return "No Resource";
292 	case DEPEVT_TRANSFER_BUS_EXPIRY:
293 		return "Bus Expiry";
294 	default:
295 		return "UNKNOWN";
296 	}
297 }
298 
299 static inline const char *dwc3_gadget_generic_cmd_status_string(int status)
300 {
301 	switch (status) {
302 	case -ETIMEDOUT:
303 		return "Timed Out";
304 	case 0:
305 		return "Successful";
306 	case 1:
307 		return "Error";
308 	default:
309 		return "UNKNOWN";
310 	}
311 }
312 
313 void dwc3_trace(void (*trace)(struct va_format *), const char *fmt, ...);
314 
315 #ifdef CONFIG_DEBUG_FS
316 extern void dwc3_debugfs_init(struct dwc3 *);
317 extern void dwc3_debugfs_exit(struct dwc3 *);
318 #else
319 static inline void dwc3_debugfs_init(struct dwc3 *d)
320 {  }
321 static inline void dwc3_debugfs_exit(struct dwc3 *d)
322 {  }
323 #endif
324 #endif /* __DWC3_DEBUG_H */
325