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