xref: /openbmc/linux/drivers/usb/dwc3/debug.h (revision 1ac731c529cd4d6adbce134754b51ff7d822b145)
1b33f69f5SNishad Kamdar /* SPDX-License-Identifier: GPL-2.0 */
227088e00SAditya Srivastava /*
372246da4SFelipe Balbi  * debug.h - DesignWare USB3 DRD Controller Debug Header
472246da4SFelipe Balbi  *
510623b87SAlexander A. Klimov  * Copyright (C) 2010-2011 Texas Instruments Incorporated - https://www.ti.com
672246da4SFelipe Balbi  *
772246da4SFelipe Balbi  * Authors: Felipe Balbi <balbi@ti.com>,
872246da4SFelipe Balbi  *	    Sebastian Andrzej Siewior <bigeasy@linutronix.de>
972246da4SFelipe Balbi  */
1072246da4SFelipe Balbi 
1180977dc9SFelipe Balbi #ifndef __DWC3_DEBUG_H
1280977dc9SFelipe Balbi #define __DWC3_DEBUG_H
1380977dc9SFelipe Balbi 
1472246da4SFelipe Balbi #include "core.h"
1572246da4SFelipe Balbi 
1680977dc9SFelipe Balbi /**
1780977dc9SFelipe Balbi  * dwc3_gadget_ep_cmd_string - returns endpoint command string
1880977dc9SFelipe Balbi  * @cmd: command code
1980977dc9SFelipe Balbi  */
2080977dc9SFelipe Balbi static inline const char *
dwc3_gadget_ep_cmd_string(u8 cmd)2180977dc9SFelipe Balbi dwc3_gadget_ep_cmd_string(u8 cmd)
2280977dc9SFelipe Balbi {
2380977dc9SFelipe Balbi 	switch (cmd) {
2480977dc9SFelipe Balbi 	case DWC3_DEPCMD_DEPSTARTCFG:
2580977dc9SFelipe Balbi 		return "Start New Configuration";
2680977dc9SFelipe Balbi 	case DWC3_DEPCMD_ENDTRANSFER:
2780977dc9SFelipe Balbi 		return "End Transfer";
2880977dc9SFelipe Balbi 	case DWC3_DEPCMD_UPDATETRANSFER:
2980977dc9SFelipe Balbi 		return "Update Transfer";
3080977dc9SFelipe Balbi 	case DWC3_DEPCMD_STARTTRANSFER:
3180977dc9SFelipe Balbi 		return "Start Transfer";
3280977dc9SFelipe Balbi 	case DWC3_DEPCMD_CLEARSTALL:
3380977dc9SFelipe Balbi 		return "Clear Stall";
3480977dc9SFelipe Balbi 	case DWC3_DEPCMD_SETSTALL:
3580977dc9SFelipe Balbi 		return "Set Stall";
3680977dc9SFelipe Balbi 	case DWC3_DEPCMD_GETEPSTATE:
3780977dc9SFelipe Balbi 		return "Get Endpoint State";
3880977dc9SFelipe Balbi 	case DWC3_DEPCMD_SETTRANSFRESOURCE:
3980977dc9SFelipe Balbi 		return "Set Endpoint Transfer Resource";
4080977dc9SFelipe Balbi 	case DWC3_DEPCMD_SETEPCONFIG:
4180977dc9SFelipe Balbi 		return "Set Endpoint Configuration";
4280977dc9SFelipe Balbi 	default:
4380977dc9SFelipe Balbi 		return "UNKNOWN command";
4480977dc9SFelipe Balbi 	}
4580977dc9SFelipe Balbi }
4680977dc9SFelipe Balbi 
4780977dc9SFelipe Balbi /**
4880977dc9SFelipe Balbi  * dwc3_gadget_generic_cmd_string - returns generic command string
4980977dc9SFelipe Balbi  * @cmd: command code
5080977dc9SFelipe Balbi  */
5180977dc9SFelipe Balbi static inline const char *
dwc3_gadget_generic_cmd_string(u8 cmd)5280977dc9SFelipe Balbi dwc3_gadget_generic_cmd_string(u8 cmd)
5380977dc9SFelipe Balbi {
5480977dc9SFelipe Balbi 	switch (cmd) {
5580977dc9SFelipe Balbi 	case DWC3_DGCMD_SET_LMP:
5680977dc9SFelipe Balbi 		return "Set LMP";
5780977dc9SFelipe Balbi 	case DWC3_DGCMD_SET_PERIODIC_PAR:
5880977dc9SFelipe Balbi 		return "Set Periodic Parameters";
5980977dc9SFelipe Balbi 	case DWC3_DGCMD_XMIT_FUNCTION:
6080977dc9SFelipe Balbi 		return "Transmit Function Wake Device Notification";
6180977dc9SFelipe Balbi 	case DWC3_DGCMD_SET_SCRATCHPAD_ADDR_LO:
6280977dc9SFelipe Balbi 		return "Set Scratchpad Buffer Array Address Lo";
6380977dc9SFelipe Balbi 	case DWC3_DGCMD_SET_SCRATCHPAD_ADDR_HI:
6480977dc9SFelipe Balbi 		return "Set Scratchpad Buffer Array Address Hi";
6580977dc9SFelipe Balbi 	case DWC3_DGCMD_SELECTED_FIFO_FLUSH:
6680977dc9SFelipe Balbi 		return "Selected FIFO Flush";
6780977dc9SFelipe Balbi 	case DWC3_DGCMD_ALL_FIFO_FLUSH:
6880977dc9SFelipe Balbi 		return "All FIFO Flush";
6980977dc9SFelipe Balbi 	case DWC3_DGCMD_SET_ENDPOINT_NRDY:
7080977dc9SFelipe Balbi 		return "Set Endpoint NRDY";
71140ca4cfSThinh Nguyen 	case DWC3_DGCMD_SET_ENDPOINT_PRIME:
72140ca4cfSThinh Nguyen 		return "Set Endpoint Prime";
7380977dc9SFelipe Balbi 	case DWC3_DGCMD_RUN_SOC_BUS_LOOPBACK:
7480977dc9SFelipe Balbi 		return "Run SoC Bus Loopback Test";
75*92c08a84SElson Roy Serrao 	case DWC3_DGCMD_DEV_NOTIFICATION:
76*92c08a84SElson Roy Serrao 		return "Device Notification";
7780977dc9SFelipe Balbi 	default:
7880977dc9SFelipe Balbi 		return "UNKNOWN";
7980977dc9SFelipe Balbi 	}
8080977dc9SFelipe Balbi }
8180977dc9SFelipe Balbi 
8280977dc9SFelipe Balbi /**
8380977dc9SFelipe Balbi  * dwc3_gadget_link_string - returns link name
8480977dc9SFelipe Balbi  * @link_state: link state code
8580977dc9SFelipe Balbi  */
8680977dc9SFelipe Balbi static inline const char *
dwc3_gadget_link_string(enum dwc3_link_state link_state)8780977dc9SFelipe Balbi dwc3_gadget_link_string(enum dwc3_link_state link_state)
8880977dc9SFelipe Balbi {
8980977dc9SFelipe Balbi 	switch (link_state) {
9080977dc9SFelipe Balbi 	case DWC3_LINK_STATE_U0:
9180977dc9SFelipe Balbi 		return "U0";
9280977dc9SFelipe Balbi 	case DWC3_LINK_STATE_U1:
9380977dc9SFelipe Balbi 		return "U1";
9480977dc9SFelipe Balbi 	case DWC3_LINK_STATE_U2:
9580977dc9SFelipe Balbi 		return "U2";
9680977dc9SFelipe Balbi 	case DWC3_LINK_STATE_U3:
9780977dc9SFelipe Balbi 		return "U3";
9880977dc9SFelipe Balbi 	case DWC3_LINK_STATE_SS_DIS:
9980977dc9SFelipe Balbi 		return "SS.Disabled";
10080977dc9SFelipe Balbi 	case DWC3_LINK_STATE_RX_DET:
10180977dc9SFelipe Balbi 		return "RX.Detect";
10280977dc9SFelipe Balbi 	case DWC3_LINK_STATE_SS_INACT:
10380977dc9SFelipe Balbi 		return "SS.Inactive";
10480977dc9SFelipe Balbi 	case DWC3_LINK_STATE_POLL:
10580977dc9SFelipe Balbi 		return "Polling";
10680977dc9SFelipe Balbi 	case DWC3_LINK_STATE_RECOV:
10780977dc9SFelipe Balbi 		return "Recovery";
10880977dc9SFelipe Balbi 	case DWC3_LINK_STATE_HRESET:
10980977dc9SFelipe Balbi 		return "Hot Reset";
11080977dc9SFelipe Balbi 	case DWC3_LINK_STATE_CMPLY:
11180977dc9SFelipe Balbi 		return "Compliance";
11280977dc9SFelipe Balbi 	case DWC3_LINK_STATE_LPBK:
11380977dc9SFelipe Balbi 		return "Loopback";
11480977dc9SFelipe Balbi 	case DWC3_LINK_STATE_RESET:
11580977dc9SFelipe Balbi 		return "Reset";
11680977dc9SFelipe Balbi 	case DWC3_LINK_STATE_RESUME:
11780977dc9SFelipe Balbi 		return "Resume";
11880977dc9SFelipe Balbi 	default:
119038761ceSThinh Nguyen 		return "UNKNOWN link state";
12080977dc9SFelipe Balbi 	}
12180977dc9SFelipe Balbi }
12280977dc9SFelipe Balbi 
123b5c7ed5cSFelipe Balbi /**
1240d36dedeSThinh Nguyen  * dwc3_gadget_hs_link_string - returns highspeed and below link name
1250d36dedeSThinh Nguyen  * @link_state: link state code
1260d36dedeSThinh Nguyen  */
1270d36dedeSThinh Nguyen static inline const char *
dwc3_gadget_hs_link_string(enum dwc3_link_state link_state)1280d36dedeSThinh Nguyen dwc3_gadget_hs_link_string(enum dwc3_link_state link_state)
1290d36dedeSThinh Nguyen {
1300d36dedeSThinh Nguyen 	switch (link_state) {
1310d36dedeSThinh Nguyen 	case DWC3_LINK_STATE_U0:
1320d36dedeSThinh Nguyen 		return "On";
1330d36dedeSThinh Nguyen 	case DWC3_LINK_STATE_U2:
1340d36dedeSThinh Nguyen 		return "Sleep";
1350d36dedeSThinh Nguyen 	case DWC3_LINK_STATE_U3:
1360d36dedeSThinh Nguyen 		return "Suspend";
1370d36dedeSThinh Nguyen 	case DWC3_LINK_STATE_SS_DIS:
1380d36dedeSThinh Nguyen 		return "Disconnected";
1390d36dedeSThinh Nguyen 	case DWC3_LINK_STATE_RX_DET:
1400d36dedeSThinh Nguyen 		return "Early Suspend";
1410d36dedeSThinh Nguyen 	case DWC3_LINK_STATE_RECOV:
1420d36dedeSThinh Nguyen 		return "Recovery";
1430d36dedeSThinh Nguyen 	case DWC3_LINK_STATE_RESET:
1440d36dedeSThinh Nguyen 		return "Reset";
1450d36dedeSThinh Nguyen 	case DWC3_LINK_STATE_RESUME:
1460d36dedeSThinh Nguyen 		return "Resume";
1470d36dedeSThinh Nguyen 	default:
148038761ceSThinh Nguyen 		return "UNKNOWN link state";
1490d36dedeSThinh Nguyen 	}
1500d36dedeSThinh Nguyen }
1510d36dedeSThinh Nguyen 
1520d36dedeSThinh Nguyen /**
153b5c7ed5cSFelipe Balbi  * dwc3_trb_type_string - returns TRB type as a string
154b5c7ed5cSFelipe Balbi  * @type: the type of the TRB
155b5c7ed5cSFelipe Balbi  */
dwc3_trb_type_string(unsigned int type)156b5c7ed5cSFelipe Balbi static inline const char *dwc3_trb_type_string(unsigned int type)
157b5c7ed5cSFelipe Balbi {
158b5c7ed5cSFelipe Balbi 	switch (type) {
159b5c7ed5cSFelipe Balbi 	case DWC3_TRBCTL_NORMAL:
160b5c7ed5cSFelipe Balbi 		return "normal";
161b5c7ed5cSFelipe Balbi 	case DWC3_TRBCTL_CONTROL_SETUP:
162b5c7ed5cSFelipe Balbi 		return "setup";
163b5c7ed5cSFelipe Balbi 	case DWC3_TRBCTL_CONTROL_STATUS2:
164b5c7ed5cSFelipe Balbi 		return "status2";
165b5c7ed5cSFelipe Balbi 	case DWC3_TRBCTL_CONTROL_STATUS3:
166b5c7ed5cSFelipe Balbi 		return "status3";
167b5c7ed5cSFelipe Balbi 	case DWC3_TRBCTL_CONTROL_DATA:
168b5c7ed5cSFelipe Balbi 		return "data";
169b5c7ed5cSFelipe Balbi 	case DWC3_TRBCTL_ISOCHRONOUS_FIRST:
170b5c7ed5cSFelipe Balbi 		return "isoc-first";
171b5c7ed5cSFelipe Balbi 	case DWC3_TRBCTL_ISOCHRONOUS:
172b5c7ed5cSFelipe Balbi 		return "isoc";
173b5c7ed5cSFelipe Balbi 	case DWC3_TRBCTL_LINK_TRB:
174b5c7ed5cSFelipe Balbi 		return "link";
175b5c7ed5cSFelipe Balbi 	default:
176b5c7ed5cSFelipe Balbi 		return "UNKNOWN";
177b5c7ed5cSFelipe Balbi 	}
178b5c7ed5cSFelipe Balbi }
179b5c7ed5cSFelipe Balbi 
dwc3_ep0_state_string(enum dwc3_ep0_state state)180cdd72ac2SFelipe Balbi static inline const char *dwc3_ep0_state_string(enum dwc3_ep0_state state)
181cdd72ac2SFelipe Balbi {
182cdd72ac2SFelipe Balbi 	switch (state) {
183cdd72ac2SFelipe Balbi 	case EP0_UNCONNECTED:
184cdd72ac2SFelipe Balbi 		return "Unconnected";
185cdd72ac2SFelipe Balbi 	case EP0_SETUP_PHASE:
186cdd72ac2SFelipe Balbi 		return "Setup Phase";
187cdd72ac2SFelipe Balbi 	case EP0_DATA_PHASE:
188cdd72ac2SFelipe Balbi 		return "Data Phase";
189cdd72ac2SFelipe Balbi 	case EP0_STATUS_PHASE:
190cdd72ac2SFelipe Balbi 		return "Status Phase";
191cdd72ac2SFelipe Balbi 	default:
192cdd72ac2SFelipe Balbi 		return "UNKNOWN";
193cdd72ac2SFelipe Balbi 	}
194cdd72ac2SFelipe Balbi }
195cdd72ac2SFelipe Balbi 
19680977dc9SFelipe Balbi /**
19780977dc9SFelipe Balbi  * dwc3_gadget_event_string - returns event name
19880977dc9SFelipe Balbi  * @event: the event code
19980977dc9SFelipe Balbi  */
dwc3_gadget_event_string(char * str,size_t size,const struct dwc3_event_devt * event)2007790b355SFelipe Balbi static inline const char *dwc3_gadget_event_string(char *str, size_t size,
2017790b355SFelipe Balbi 		const struct dwc3_event_devt *event)
20280977dc9SFelipe Balbi {
203f75cacc4SFelipe Balbi 	enum dwc3_link_state state = event->event_info & DWC3_LINK_STATE_MASK;
204f75cacc4SFelipe Balbi 
205f75cacc4SFelipe Balbi 	switch (event->type) {
20680977dc9SFelipe Balbi 	case DWC3_DEVICE_EVENT_DISCONNECT:
2077790b355SFelipe Balbi 		snprintf(str, size, "Disconnect: [%s]",
208f75cacc4SFelipe Balbi 				dwc3_gadget_link_string(state));
209f75cacc4SFelipe Balbi 		break;
21080977dc9SFelipe Balbi 	case DWC3_DEVICE_EVENT_RESET:
2117790b355SFelipe Balbi 		snprintf(str, size, "Reset [%s]",
2127790b355SFelipe Balbi 				dwc3_gadget_link_string(state));
213f75cacc4SFelipe Balbi 		break;
21480977dc9SFelipe Balbi 	case DWC3_DEVICE_EVENT_CONNECT_DONE:
2157790b355SFelipe Balbi 		snprintf(str, size, "Connection Done [%s]",
216f75cacc4SFelipe Balbi 				dwc3_gadget_link_string(state));
217f75cacc4SFelipe Balbi 		break;
21880977dc9SFelipe Balbi 	case DWC3_DEVICE_EVENT_LINK_STATUS_CHANGE:
2197790b355SFelipe Balbi 		snprintf(str, size, "Link Change [%s]",
220f75cacc4SFelipe Balbi 				dwc3_gadget_link_string(state));
221f75cacc4SFelipe Balbi 		break;
22280977dc9SFelipe Balbi 	case DWC3_DEVICE_EVENT_WAKEUP:
2237790b355SFelipe Balbi 		snprintf(str, size, "WakeUp [%s]",
2247790b355SFelipe Balbi 				dwc3_gadget_link_string(state));
225f75cacc4SFelipe Balbi 		break;
2266f26ebb7SJack Pham 	case DWC3_DEVICE_EVENT_SUSPEND:
2276f26ebb7SJack Pham 		snprintf(str, size, "Suspend [%s]",
228f75cacc4SFelipe Balbi 				dwc3_gadget_link_string(state));
229f75cacc4SFelipe Balbi 		break;
23080977dc9SFelipe Balbi 	case DWC3_DEVICE_EVENT_SOF:
2317790b355SFelipe Balbi 		snprintf(str, size, "Start-Of-Frame [%s]",
232f75cacc4SFelipe Balbi 				dwc3_gadget_link_string(state));
233f75cacc4SFelipe Balbi 		break;
23480977dc9SFelipe Balbi 	case DWC3_DEVICE_EVENT_ERRATIC_ERROR:
2357790b355SFelipe Balbi 		snprintf(str, size, "Erratic Error [%s]",
236f75cacc4SFelipe Balbi 				dwc3_gadget_link_string(state));
237f75cacc4SFelipe Balbi 		break;
23880977dc9SFelipe Balbi 	case DWC3_DEVICE_EVENT_CMD_CMPL:
2397790b355SFelipe Balbi 		snprintf(str, size, "Command Complete [%s]",
240f75cacc4SFelipe Balbi 				dwc3_gadget_link_string(state));
241f75cacc4SFelipe Balbi 		break;
24280977dc9SFelipe Balbi 	case DWC3_DEVICE_EVENT_OVERFLOW:
2437790b355SFelipe Balbi 		snprintf(str, size, "Overflow [%s]",
2447790b355SFelipe Balbi 				dwc3_gadget_link_string(state));
245f75cacc4SFelipe Balbi 		break;
246f75cacc4SFelipe Balbi 	default:
2477790b355SFelipe Balbi 		snprintf(str, size, "UNKNOWN");
24880977dc9SFelipe Balbi 	}
24980977dc9SFelipe Balbi 
250f75cacc4SFelipe Balbi 	return str;
25180977dc9SFelipe Balbi }
25280977dc9SFelipe Balbi 
25380977dc9SFelipe Balbi /**
25480977dc9SFelipe Balbi  * dwc3_ep_event_string - returns event name
25580977dc9SFelipe Balbi  * @event: then event code
25680977dc9SFelipe Balbi  */
dwc3_ep_event_string(char * str,size_t size,const struct dwc3_event_depevt * event,u32 ep0state)2577790b355SFelipe Balbi static inline const char *dwc3_ep_event_string(char *str, size_t size,
2587790b355SFelipe Balbi 		const struct dwc3_event_depevt *event, u32 ep0state)
25980977dc9SFelipe Balbi {
260f75cacc4SFelipe Balbi 	u8 epnum = event->endpoint_number;
26143c96be1SFelipe Balbi 	size_t len;
262f75cacc4SFelipe Balbi 	int status;
263f75cacc4SFelipe Balbi 
264b32196e3SColin Ian King 	len = scnprintf(str, size, "ep%d%s: ", epnum >> 1,
265696fe69dSFelipe Balbi 			(epnum & 1) ? "in" : "out");
266f75cacc4SFelipe Balbi 
267b27972b5SFelipe Balbi 	status = event->status;
268b27972b5SFelipe Balbi 
269f75cacc4SFelipe Balbi 	switch (event->endpoint_event) {
27080977dc9SFelipe Balbi 	case DWC3_DEPEVT_XFERCOMPLETE:
271b32196e3SColin Ian King 		len += scnprintf(str + len, size - len,
272b32196e3SColin Ian King 				"Transfer Complete (%c%c%c)",
273b27972b5SFelipe Balbi 				status & DEPEVT_STATUS_SHORT ? 'S' : 's',
274b27972b5SFelipe Balbi 				status & DEPEVT_STATUS_IOC ? 'I' : 'i',
275b27972b5SFelipe Balbi 				status & DEPEVT_STATUS_LST ? 'L' : 'l');
276b27972b5SFelipe Balbi 
27743c96be1SFelipe Balbi 		if (epnum <= 1)
278b32196e3SColin Ian King 			scnprintf(str + len, size - len, " [%s]",
2797790b355SFelipe Balbi 					dwc3_ep0_state_string(ep0state));
280f75cacc4SFelipe Balbi 		break;
28180977dc9SFelipe Balbi 	case DWC3_DEPEVT_XFERINPROGRESS:
282b32196e3SColin Ian King 		scnprintf(str + len, size - len,
28337a136aaSMichael Grzeschik 				"Transfer In Progress [%08x] (%c%c%c)",
284e1d542f7SFelipe Balbi 				event->parameters,
285b27972b5SFelipe Balbi 				status & DEPEVT_STATUS_SHORT ? 'S' : 's',
286b27972b5SFelipe Balbi 				status & DEPEVT_STATUS_IOC ? 'I' : 'i',
287b27972b5SFelipe Balbi 				status & DEPEVT_STATUS_LST ? 'M' : 'm');
288f75cacc4SFelipe Balbi 		break;
28980977dc9SFelipe Balbi 	case DWC3_DEPEVT_XFERNOTREADY:
290b32196e3SColin Ian King 		len += scnprintf(str + len, size - len,
29137a136aaSMichael Grzeschik 				"Transfer Not Ready [%08x]%s",
292e1d542f7SFelipe Balbi 				event->parameters,
293e1d542f7SFelipe Balbi 				status & DEPEVT_STATUS_TRANSFER_ACTIVE ?
294b27972b5SFelipe Balbi 				" (Active)" : " (Not Active)");
29545a2af2fSFelipe Balbi 
29645a2af2fSFelipe Balbi 		/* Control Endpoints */
29745a2af2fSFelipe Balbi 		if (epnum <= 1) {
29845a2af2fSFelipe Balbi 			int phase = DEPEVT_STATUS_CONTROL_PHASE(event->status);
29945a2af2fSFelipe Balbi 
30045a2af2fSFelipe Balbi 			switch (phase) {
30145a2af2fSFelipe Balbi 			case DEPEVT_STATUS_CONTROL_DATA:
302b32196e3SColin Ian King 				scnprintf(str + len, size - len,
3031381a511SFelipe Balbi 						" [Data Phase]");
30445a2af2fSFelipe Balbi 				break;
30545a2af2fSFelipe Balbi 			case DEPEVT_STATUS_CONTROL_STATUS:
306b32196e3SColin Ian King 				scnprintf(str + len, size - len,
3071381a511SFelipe Balbi 						" [Status Phase]");
30845a2af2fSFelipe Balbi 			}
30945a2af2fSFelipe Balbi 		}
310f75cacc4SFelipe Balbi 		break;
31180977dc9SFelipe Balbi 	case DWC3_DEPEVT_RXTXFIFOEVT:
312b32196e3SColin Ian King 		scnprintf(str + len, size - len, "FIFO");
313f75cacc4SFelipe Balbi 		break;
31480977dc9SFelipe Balbi 	case DWC3_DEPEVT_STREAMEVT:
315f75cacc4SFelipe Balbi 		status = event->status;
316f75cacc4SFelipe Balbi 
317f75cacc4SFelipe Balbi 		switch (status) {
318f75cacc4SFelipe Balbi 		case DEPEVT_STREAMEVT_FOUND:
319b32196e3SColin Ian King 			scnprintf(str + len, size - len, " Stream %d Found",
320f75cacc4SFelipe Balbi 					event->parameters);
321f75cacc4SFelipe Balbi 			break;
322f75cacc4SFelipe Balbi 		case DEPEVT_STREAMEVT_NOTFOUND:
323f75cacc4SFelipe Balbi 		default:
324b32196e3SColin Ian King 			scnprintf(str + len, size - len, " Stream Not Found");
325f75cacc4SFelipe Balbi 			break;
32680977dc9SFelipe Balbi 		}
32780977dc9SFelipe Balbi 
328f75cacc4SFelipe Balbi 		break;
329f75cacc4SFelipe Balbi 	case DWC3_DEPEVT_EPCMDCMPLT:
330b32196e3SColin Ian King 		scnprintf(str + len, size - len, "Endpoint Command Complete");
331f75cacc4SFelipe Balbi 		break;
332f75cacc4SFelipe Balbi 	default:
333b32196e3SColin Ian King 		scnprintf(str + len, size - len, "UNKNOWN");
334f75cacc4SFelipe Balbi 	}
335f75cacc4SFelipe Balbi 
336f75cacc4SFelipe Balbi 	return str;
33780977dc9SFelipe Balbi }
33880977dc9SFelipe Balbi 
339e996061bSFelipe Balbi /**
340e996061bSFelipe Balbi  * dwc3_gadget_event_type_string - return event name
341e996061bSFelipe Balbi  * @event: the event code
342e996061bSFelipe Balbi  */
dwc3_gadget_event_type_string(u8 event)343e996061bSFelipe Balbi static inline const char *dwc3_gadget_event_type_string(u8 event)
344e996061bSFelipe Balbi {
345e996061bSFelipe Balbi 	switch (event) {
346e996061bSFelipe Balbi 	case DWC3_DEVICE_EVENT_DISCONNECT:
347e996061bSFelipe Balbi 		return "Disconnect";
348e996061bSFelipe Balbi 	case DWC3_DEVICE_EVENT_RESET:
349e996061bSFelipe Balbi 		return "Reset";
350e996061bSFelipe Balbi 	case DWC3_DEVICE_EVENT_CONNECT_DONE:
351e996061bSFelipe Balbi 		return "Connect Done";
352e996061bSFelipe Balbi 	case DWC3_DEVICE_EVENT_LINK_STATUS_CHANGE:
353e996061bSFelipe Balbi 		return "Link Status Change";
354e996061bSFelipe Balbi 	case DWC3_DEVICE_EVENT_WAKEUP:
355e996061bSFelipe Balbi 		return "Wake-Up";
356e996061bSFelipe Balbi 	case DWC3_DEVICE_EVENT_HIBER_REQ:
357e996061bSFelipe Balbi 		return "Hibernation";
3586f26ebb7SJack Pham 	case DWC3_DEVICE_EVENT_SUSPEND:
3596f26ebb7SJack Pham 		return "Suspend";
360e996061bSFelipe Balbi 	case DWC3_DEVICE_EVENT_SOF:
361e996061bSFelipe Balbi 		return "Start of Frame";
362e996061bSFelipe Balbi 	case DWC3_DEVICE_EVENT_ERRATIC_ERROR:
363e996061bSFelipe Balbi 		return "Erratic Error";
364e996061bSFelipe Balbi 	case DWC3_DEVICE_EVENT_CMD_CMPL:
365e996061bSFelipe Balbi 		return "Command Complete";
366e996061bSFelipe Balbi 	case DWC3_DEVICE_EVENT_OVERFLOW:
367e996061bSFelipe Balbi 		return "Overflow";
368e996061bSFelipe Balbi 	default:
369e996061bSFelipe Balbi 		return "UNKNOWN";
370e996061bSFelipe Balbi 	}
371e996061bSFelipe Balbi }
372e996061bSFelipe Balbi 
dwc3_decode_event(char * str,size_t size,u32 event,u32 ep0state)3737790b355SFelipe Balbi static inline const char *dwc3_decode_event(char *str, size_t size, u32 event,
3747790b355SFelipe Balbi 		u32 ep0state)
375f75cacc4SFelipe Balbi {
37627c7ab0fSFelipe Balbi 	union dwc3_event evt;
37727c7ab0fSFelipe Balbi 
37827c7ab0fSFelipe Balbi 	memcpy(&evt, &event, sizeof(event));
379f75cacc4SFelipe Balbi 
380f75cacc4SFelipe Balbi 	if (evt.type.is_devspec)
3817790b355SFelipe Balbi 		return dwc3_gadget_event_string(str, size, &evt.devt);
382f75cacc4SFelipe Balbi 	else
3837790b355SFelipe Balbi 		return dwc3_ep_event_string(str, size, &evt.depevt, ep0state);
384f75cacc4SFelipe Balbi }
385f75cacc4SFelipe Balbi 
dwc3_ep_cmd_status_string(int status)3860933df15SFelipe Balbi static inline const char *dwc3_ep_cmd_status_string(int status)
3870933df15SFelipe Balbi {
3880933df15SFelipe Balbi 	switch (status) {
3890933df15SFelipe Balbi 	case -ETIMEDOUT:
3900933df15SFelipe Balbi 		return "Timed Out";
3910933df15SFelipe Balbi 	case 0:
3920933df15SFelipe Balbi 		return "Successful";
3930933df15SFelipe Balbi 	case DEPEVT_TRANSFER_NO_RESOURCE:
3940933df15SFelipe Balbi 		return "No Resource";
3950933df15SFelipe Balbi 	case DEPEVT_TRANSFER_BUS_EXPIRY:
3960933df15SFelipe Balbi 		return "Bus Expiry";
3970933df15SFelipe Balbi 	default:
3980933df15SFelipe Balbi 		return "UNKNOWN";
3990933df15SFelipe Balbi 	}
4000933df15SFelipe Balbi }
4010933df15SFelipe Balbi 
dwc3_gadget_generic_cmd_status_string(int status)40271f7e702SFelipe Balbi static inline const char *dwc3_gadget_generic_cmd_status_string(int status)
40371f7e702SFelipe Balbi {
40471f7e702SFelipe Balbi 	switch (status) {
40571f7e702SFelipe Balbi 	case -ETIMEDOUT:
40671f7e702SFelipe Balbi 		return "Timed Out";
40771f7e702SFelipe Balbi 	case 0:
40871f7e702SFelipe Balbi 		return "Successful";
40971f7e702SFelipe Balbi 	case 1:
41071f7e702SFelipe Balbi 		return "Error";
41171f7e702SFelipe Balbi 	default:
41271f7e702SFelipe Balbi 		return "UNKNOWN";
41371f7e702SFelipe Balbi 	}
41471f7e702SFelipe Balbi }
41571f7e702SFelipe Balbi 
41657b14da5SFelipe Balbi 
41772246da4SFelipe Balbi #ifdef CONFIG_DEBUG_FS
4188d396bb0SJack Pham extern void dwc3_debugfs_create_endpoint_dir(struct dwc3_ep *dep);
419be308d68SGreg Kroah-Hartman extern void dwc3_debugfs_remove_endpoint_dir(struct dwc3_ep *dep);
420035cbca1SFelipe Balbi extern void dwc3_debugfs_init(struct dwc3 *d);
421035cbca1SFelipe Balbi extern void dwc3_debugfs_exit(struct dwc3 *d);
42272246da4SFelipe Balbi #else
dwc3_debugfs_create_endpoint_dir(struct dwc3_ep * dep)4238d396bb0SJack Pham static inline void dwc3_debugfs_create_endpoint_dir(struct dwc3_ep *dep)
4248d396bb0SJack Pham {  }
dwc3_debugfs_remove_endpoint_dir(struct dwc3_ep * dep)425be308d68SGreg Kroah-Hartman static inline void dwc3_debugfs_remove_endpoint_dir(struct dwc3_ep *dep)
426be308d68SGreg Kroah-Hartman {  }
dwc3_debugfs_init(struct dwc3 * d)4274e9f3118SDu, Changbin static inline void dwc3_debugfs_init(struct dwc3 *d)
4284e9f3118SDu, Changbin {  }
dwc3_debugfs_exit(struct dwc3 * d)42972246da4SFelipe Balbi static inline void dwc3_debugfs_exit(struct dwc3 *d)
43072246da4SFelipe Balbi {  }
43172246da4SFelipe Balbi #endif
43280977dc9SFelipe Balbi #endif /* __DWC3_DEBUG_H */
433