 2c4cbe6e5a
			
		
	
	
	2c4cbe6e5a
	
	
	
		
			
			When we're debugging hard-to-reproduce and time-sensitive use cases, printk() poses too much overhead. That's when the kernel's tracing infrastructure comes into play. This patch implements a few initial tracepoints for the dwc3 driver. More traces can be added as necessary in order to ease the task of debugging dwc3. Reviewed-by: Paul Zimmerman <paulz@synopsys.com> Signed-off-by: Felipe Balbi <balbi@ti.com>
		
			
				
	
	
		
			228 lines
		
	
	
	
		
			5.8 KiB
			
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			228 lines
		
	
	
	
		
			5.8 KiB
			
		
	
	
	
		
			C
		
	
	
	
	
	
| /**
 | |
|  * debug.h - DesignWare USB3 DRD Controller Debug Header
 | |
|  *
 | |
|  * Copyright (C) 2010-2011 Texas Instruments Incorporated - http://www.ti.com
 | |
|  *
 | |
|  * Authors: Felipe Balbi <balbi@ti.com>,
 | |
|  *	    Sebastian Andrzej Siewior <bigeasy@linutronix.de>
 | |
|  *
 | |
|  * This program is free software: you can redistribute it and/or modify
 | |
|  * it under the terms of the GNU General Public License version 2  of
 | |
|  * the License as published by the Free Software Foundation.
 | |
|  *
 | |
|  * This program is distributed in the hope that it will be useful,
 | |
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | |
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | |
|  * GNU General Public License for more details.
 | |
|  */
 | |
| 
 | |
| #ifndef __DWC3_DEBUG_H
 | |
| #define __DWC3_DEBUG_H
 | |
| 
 | |
| #include "core.h"
 | |
| 
 | |
| /**
 | |
|  * dwc3_gadget_ep_cmd_string - returns endpoint command string
 | |
|  * @cmd: command code
 | |
|  */
 | |
| static inline const char *
 | |
| dwc3_gadget_ep_cmd_string(u8 cmd)
 | |
| {
 | |
| 	switch (cmd) {
 | |
| 	case DWC3_DEPCMD_DEPSTARTCFG:
 | |
| 		return "Start New Configuration";
 | |
| 	case DWC3_DEPCMD_ENDTRANSFER:
 | |
| 		return "End Transfer";
 | |
| 	case DWC3_DEPCMD_UPDATETRANSFER:
 | |
| 		return "Update Transfer";
 | |
| 	case DWC3_DEPCMD_STARTTRANSFER:
 | |
| 		return "Start Transfer";
 | |
| 	case DWC3_DEPCMD_CLEARSTALL:
 | |
| 		return "Clear Stall";
 | |
| 	case DWC3_DEPCMD_SETSTALL:
 | |
| 		return "Set Stall";
 | |
| 	case DWC3_DEPCMD_GETEPSTATE:
 | |
| 		return "Get Endpoint State";
 | |
| 	case DWC3_DEPCMD_SETTRANSFRESOURCE:
 | |
| 		return "Set Endpoint Transfer Resource";
 | |
| 	case DWC3_DEPCMD_SETEPCONFIG:
 | |
| 		return "Set Endpoint Configuration";
 | |
| 	default:
 | |
| 		return "UNKNOWN command";
 | |
| 	}
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * dwc3_gadget_generic_cmd_string - returns generic command string
 | |
|  * @cmd: command code
 | |
|  */
 | |
| static inline const char *
 | |
| dwc3_gadget_generic_cmd_string(u8 cmd)
 | |
| {
 | |
| 	switch (cmd) {
 | |
| 	case DWC3_DGCMD_SET_LMP:
 | |
| 		return "Set LMP";
 | |
| 	case DWC3_DGCMD_SET_PERIODIC_PAR:
 | |
| 		return "Set Periodic Parameters";
 | |
| 	case DWC3_DGCMD_XMIT_FUNCTION:
 | |
| 		return "Transmit Function Wake Device Notification";
 | |
| 	case DWC3_DGCMD_SET_SCRATCHPAD_ADDR_LO:
 | |
| 		return "Set Scratchpad Buffer Array Address Lo";
 | |
| 	case DWC3_DGCMD_SET_SCRATCHPAD_ADDR_HI:
 | |
| 		return "Set Scratchpad Buffer Array Address Hi";
 | |
| 	case DWC3_DGCMD_SELECTED_FIFO_FLUSH:
 | |
| 		return "Selected FIFO Flush";
 | |
| 	case DWC3_DGCMD_ALL_FIFO_FLUSH:
 | |
| 		return "All FIFO Flush";
 | |
| 	case DWC3_DGCMD_SET_ENDPOINT_NRDY:
 | |
| 		return "Set Endpoint NRDY";
 | |
| 	case DWC3_DGCMD_RUN_SOC_BUS_LOOPBACK:
 | |
| 		return "Run SoC Bus Loopback Test";
 | |
| 	default:
 | |
| 		return "UNKNOWN";
 | |
| 	}
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * dwc3_gadget_link_string - returns link name
 | |
|  * @link_state: link state code
 | |
|  */
 | |
| static inline const char *
 | |
| dwc3_gadget_link_string(enum dwc3_link_state link_state)
 | |
| {
 | |
| 	switch (link_state) {
 | |
| 	case DWC3_LINK_STATE_U0:
 | |
| 		return "U0";
 | |
| 	case DWC3_LINK_STATE_U1:
 | |
| 		return "U1";
 | |
| 	case DWC3_LINK_STATE_U2:
 | |
| 		return "U2";
 | |
| 	case DWC3_LINK_STATE_U3:
 | |
| 		return "U3";
 | |
| 	case DWC3_LINK_STATE_SS_DIS:
 | |
| 		return "SS.Disabled";
 | |
| 	case DWC3_LINK_STATE_RX_DET:
 | |
| 		return "RX.Detect";
 | |
| 	case DWC3_LINK_STATE_SS_INACT:
 | |
| 		return "SS.Inactive";
 | |
| 	case DWC3_LINK_STATE_POLL:
 | |
| 		return "Polling";
 | |
| 	case DWC3_LINK_STATE_RECOV:
 | |
| 		return "Recovery";
 | |
| 	case DWC3_LINK_STATE_HRESET:
 | |
| 		return "Hot Reset";
 | |
| 	case DWC3_LINK_STATE_CMPLY:
 | |
| 		return "Compliance";
 | |
| 	case DWC3_LINK_STATE_LPBK:
 | |
| 		return "Loopback";
 | |
| 	case DWC3_LINK_STATE_RESET:
 | |
| 		return "Reset";
 | |
| 	case DWC3_LINK_STATE_RESUME:
 | |
| 		return "Resume";
 | |
| 	default:
 | |
| 		return "UNKNOWN link state\n";
 | |
| 	}
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * dwc3_gadget_event_string - returns event name
 | |
|  * @event: the event code
 | |
|  */
 | |
| static inline const char *dwc3_gadget_event_string(u8 event)
 | |
| {
 | |
| 	switch (event) {
 | |
| 	case DWC3_DEVICE_EVENT_DISCONNECT:
 | |
| 		return "Disconnect";
 | |
| 	case DWC3_DEVICE_EVENT_RESET:
 | |
| 		return "Reset";
 | |
| 	case DWC3_DEVICE_EVENT_CONNECT_DONE:
 | |
| 		return "Connection Done";
 | |
| 	case DWC3_DEVICE_EVENT_LINK_STATUS_CHANGE:
 | |
| 		return "Link Status Change";
 | |
| 	case DWC3_DEVICE_EVENT_WAKEUP:
 | |
| 		return "WakeUp";
 | |
| 	case DWC3_DEVICE_EVENT_EOPF:
 | |
| 		return "End-Of-Frame";
 | |
| 	case DWC3_DEVICE_EVENT_SOF:
 | |
| 		return "Start-Of-Frame";
 | |
| 	case DWC3_DEVICE_EVENT_ERRATIC_ERROR:
 | |
| 		return "Erratic Error";
 | |
| 	case DWC3_DEVICE_EVENT_CMD_CMPL:
 | |
| 		return "Command Complete";
 | |
| 	case DWC3_DEVICE_EVENT_OVERFLOW:
 | |
| 		return "Overflow";
 | |
| 	}
 | |
| 
 | |
| 	return "UNKNOWN";
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * dwc3_ep_event_string - returns event name
 | |
|  * @event: then event code
 | |
|  */
 | |
| static inline const char *dwc3_ep_event_string(u8 event)
 | |
| {
 | |
| 	switch (event) {
 | |
| 	case DWC3_DEPEVT_XFERCOMPLETE:
 | |
| 		return "Transfer Complete";
 | |
| 	case DWC3_DEPEVT_XFERINPROGRESS:
 | |
| 		return "Transfer In-Progress";
 | |
| 	case DWC3_DEPEVT_XFERNOTREADY:
 | |
| 		return "Transfer Not Ready";
 | |
| 	case DWC3_DEPEVT_RXTXFIFOEVT:
 | |
| 		return "FIFO";
 | |
| 	case DWC3_DEPEVT_STREAMEVT:
 | |
| 		return "Stream";
 | |
| 	case DWC3_DEPEVT_EPCMDCMPLT:
 | |
| 		return "Endpoint Command Complete";
 | |
| 	}
 | |
| 
 | |
| 	return "UNKNOWN";
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * dwc3_gadget_event_type_string - return event name
 | |
|  * @event: the event code
 | |
|  */
 | |
| static inline const char *dwc3_gadget_event_type_string(u8 event)
 | |
| {
 | |
| 	switch (event) {
 | |
| 	case DWC3_DEVICE_EVENT_DISCONNECT:
 | |
| 		return "Disconnect";
 | |
| 	case DWC3_DEVICE_EVENT_RESET:
 | |
| 		return "Reset";
 | |
| 	case DWC3_DEVICE_EVENT_CONNECT_DONE:
 | |
| 		return "Connect Done";
 | |
| 	case DWC3_DEVICE_EVENT_LINK_STATUS_CHANGE:
 | |
| 		return "Link Status Change";
 | |
| 	case DWC3_DEVICE_EVENT_WAKEUP:
 | |
| 		return "Wake-Up";
 | |
| 	case DWC3_DEVICE_EVENT_HIBER_REQ:
 | |
| 		return "Hibernation";
 | |
| 	case DWC3_DEVICE_EVENT_EOPF:
 | |
| 		return "End of Periodic Frame";
 | |
| 	case DWC3_DEVICE_EVENT_SOF:
 | |
| 		return "Start of Frame";
 | |
| 	case DWC3_DEVICE_EVENT_ERRATIC_ERROR:
 | |
| 		return "Erratic Error";
 | |
| 	case DWC3_DEVICE_EVENT_CMD_CMPL:
 | |
| 		return "Command Complete";
 | |
| 	case DWC3_DEVICE_EVENT_OVERFLOW:
 | |
| 		return "Overflow";
 | |
| 	default:
 | |
| 		return "UNKNOWN";
 | |
| 	}
 | |
| }
 | |
| 
 | |
| void dwc3_trace(void (*trace)(struct va_format *), const char *fmt, ...);
 | |
| 
 | |
| #ifdef CONFIG_DEBUG_FS
 | |
| extern int dwc3_debugfs_init(struct dwc3 *);
 | |
| extern void dwc3_debugfs_exit(struct dwc3 *);
 | |
| #else
 | |
| static inline int dwc3_debugfs_init(struct dwc3 *d)
 | |
| {  return 0;  }
 | |
| static inline void dwc3_debugfs_exit(struct dwc3 *d)
 | |
| {  }
 | |
| #endif
 | |
| #endif /* __DWC3_DEBUG_H */
 |