]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/blame - drivers/usb/dwc3/debug.h
usb: gadget: fsl_udc_core: fix ep valid checks
[mirror_ubuntu-bionic-kernel.git] / drivers / usb / dwc3 / debug.h
CommitLineData
5fd54ace 1// SPDX-License-Identifier: GPL-2.0
72246da4
FB
2/**
3 * debug.h - DesignWare USB3 DRD Controller Debug Header
4 *
5 * Copyright (C) 2010-2011 Texas Instruments Incorporated - http://www.ti.com
72246da4
FB
6 *
7 * Authors: Felipe Balbi <balbi@ti.com>,
8 * Sebastian Andrzej Siewior <bigeasy@linutronix.de>
72246da4
FB
9 */
10
80977dc9
FB
11#ifndef __DWC3_DEBUG_H
12#define __DWC3_DEBUG_H
13
72246da4
FB
14#include "core.h"
15
80977dc9
FB
16/**
17 * dwc3_gadget_ep_cmd_string - returns endpoint command string
18 * @cmd: command code
19 */
20static inline const char *
21dwc3_gadget_ep_cmd_string(u8 cmd)
22{
23 switch (cmd) {
24 case DWC3_DEPCMD_DEPSTARTCFG:
25 return "Start New Configuration";
26 case DWC3_DEPCMD_ENDTRANSFER:
27 return "End Transfer";
28 case DWC3_DEPCMD_UPDATETRANSFER:
29 return "Update Transfer";
30 case DWC3_DEPCMD_STARTTRANSFER:
31 return "Start Transfer";
32 case DWC3_DEPCMD_CLEARSTALL:
33 return "Clear Stall";
34 case DWC3_DEPCMD_SETSTALL:
35 return "Set Stall";
36 case DWC3_DEPCMD_GETEPSTATE:
37 return "Get Endpoint State";
38 case DWC3_DEPCMD_SETTRANSFRESOURCE:
39 return "Set Endpoint Transfer Resource";
40 case DWC3_DEPCMD_SETEPCONFIG:
41 return "Set Endpoint Configuration";
42 default:
43 return "UNKNOWN command";
44 }
45}
46
47/**
48 * dwc3_gadget_generic_cmd_string - returns generic command string
49 * @cmd: command code
50 */
51static inline const char *
52dwc3_gadget_generic_cmd_string(u8 cmd)
53{
54 switch (cmd) {
55 case DWC3_DGCMD_SET_LMP:
56 return "Set LMP";
57 case DWC3_DGCMD_SET_PERIODIC_PAR:
58 return "Set Periodic Parameters";
59 case DWC3_DGCMD_XMIT_FUNCTION:
60 return "Transmit Function Wake Device Notification";
61 case DWC3_DGCMD_SET_SCRATCHPAD_ADDR_LO:
62 return "Set Scratchpad Buffer Array Address Lo";
63 case DWC3_DGCMD_SET_SCRATCHPAD_ADDR_HI:
64 return "Set Scratchpad Buffer Array Address Hi";
65 case DWC3_DGCMD_SELECTED_FIFO_FLUSH:
66 return "Selected FIFO Flush";
67 case DWC3_DGCMD_ALL_FIFO_FLUSH:
68 return "All FIFO Flush";
69 case DWC3_DGCMD_SET_ENDPOINT_NRDY:
70 return "Set Endpoint NRDY";
71 case DWC3_DGCMD_RUN_SOC_BUS_LOOPBACK:
72 return "Run SoC Bus Loopback Test";
73 default:
74 return "UNKNOWN";
75 }
76}
77
78/**
79 * dwc3_gadget_link_string - returns link name
80 * @link_state: link state code
81 */
82static inline const char *
83dwc3_gadget_link_string(enum dwc3_link_state link_state)
84{
85 switch (link_state) {
86 case DWC3_LINK_STATE_U0:
87 return "U0";
88 case DWC3_LINK_STATE_U1:
89 return "U1";
90 case DWC3_LINK_STATE_U2:
91 return "U2";
92 case DWC3_LINK_STATE_U3:
93 return "U3";
94 case DWC3_LINK_STATE_SS_DIS:
95 return "SS.Disabled";
96 case DWC3_LINK_STATE_RX_DET:
97 return "RX.Detect";
98 case DWC3_LINK_STATE_SS_INACT:
99 return "SS.Inactive";
100 case DWC3_LINK_STATE_POLL:
101 return "Polling";
102 case DWC3_LINK_STATE_RECOV:
103 return "Recovery";
104 case DWC3_LINK_STATE_HRESET:
105 return "Hot Reset";
106 case DWC3_LINK_STATE_CMPLY:
107 return "Compliance";
108 case DWC3_LINK_STATE_LPBK:
109 return "Loopback";
110 case DWC3_LINK_STATE_RESET:
111 return "Reset";
112 case DWC3_LINK_STATE_RESUME:
113 return "Resume";
114 default:
115 return "UNKNOWN link state\n";
116 }
117}
118
b5c7ed5c
FB
119/**
120 * dwc3_trb_type_string - returns TRB type as a string
121 * @type: the type of the TRB
122 */
123static inline const char *dwc3_trb_type_string(unsigned int type)
124{
125 switch (type) {
126 case DWC3_TRBCTL_NORMAL:
127 return "normal";
128 case DWC3_TRBCTL_CONTROL_SETUP:
129 return "setup";
130 case DWC3_TRBCTL_CONTROL_STATUS2:
131 return "status2";
132 case DWC3_TRBCTL_CONTROL_STATUS3:
133 return "status3";
134 case DWC3_TRBCTL_CONTROL_DATA:
135 return "data";
136 case DWC3_TRBCTL_ISOCHRONOUS_FIRST:
137 return "isoc-first";
138 case DWC3_TRBCTL_ISOCHRONOUS:
139 return "isoc";
140 case DWC3_TRBCTL_LINK_TRB:
141 return "link";
142 default:
143 return "UNKNOWN";
144 }
145}
146
cdd72ac2
FB
147static inline const char *dwc3_ep0_state_string(enum dwc3_ep0_state state)
148{
149 switch (state) {
150 case EP0_UNCONNECTED:
151 return "Unconnected";
152 case EP0_SETUP_PHASE:
153 return "Setup Phase";
154 case EP0_DATA_PHASE:
155 return "Data Phase";
156 case EP0_STATUS_PHASE:
157 return "Status Phase";
158 default:
159 return "UNKNOWN";
160 }
161}
162
80977dc9
FB
163/**
164 * dwc3_gadget_event_string - returns event name
165 * @event: the event code
166 */
f75cacc4 167static inline const char *
3587f36a 168dwc3_gadget_event_string(char *str, const struct dwc3_event_devt *event)
80977dc9 169{
f75cacc4
FB
170 enum dwc3_link_state state = event->event_info & DWC3_LINK_STATE_MASK;
171
172 switch (event->type) {
80977dc9 173 case DWC3_DEVICE_EVENT_DISCONNECT:
f75cacc4
FB
174 sprintf(str, "Disconnect: [%s]",
175 dwc3_gadget_link_string(state));
176 break;
80977dc9 177 case DWC3_DEVICE_EVENT_RESET:
f75cacc4
FB
178 sprintf(str, "Reset [%s]", dwc3_gadget_link_string(state));
179 break;
80977dc9 180 case DWC3_DEVICE_EVENT_CONNECT_DONE:
f75cacc4
FB
181 sprintf(str, "Connection Done [%s]",
182 dwc3_gadget_link_string(state));
183 break;
80977dc9 184 case DWC3_DEVICE_EVENT_LINK_STATUS_CHANGE:
f75cacc4
FB
185 sprintf(str, "Link Change [%s]",
186 dwc3_gadget_link_string(state));
187 break;
80977dc9 188 case DWC3_DEVICE_EVENT_WAKEUP:
f75cacc4
FB
189 sprintf(str, "WakeUp [%s]", dwc3_gadget_link_string(state));
190 break;
80977dc9 191 case DWC3_DEVICE_EVENT_EOPF:
f75cacc4
FB
192 sprintf(str, "End-Of-Frame [%s]",
193 dwc3_gadget_link_string(state));
194 break;
80977dc9 195 case DWC3_DEVICE_EVENT_SOF:
f75cacc4
FB
196 sprintf(str, "Start-Of-Frame [%s]",
197 dwc3_gadget_link_string(state));
198 break;
80977dc9 199 case DWC3_DEVICE_EVENT_ERRATIC_ERROR:
f75cacc4
FB
200 sprintf(str, "Erratic Error [%s]",
201 dwc3_gadget_link_string(state));
202 break;
80977dc9 203 case DWC3_DEVICE_EVENT_CMD_CMPL:
f75cacc4
FB
204 sprintf(str, "Command Complete [%s]",
205 dwc3_gadget_link_string(state));
206 break;
80977dc9 207 case DWC3_DEVICE_EVENT_OVERFLOW:
f75cacc4
FB
208 sprintf(str, "Overflow [%s]", dwc3_gadget_link_string(state));
209 break;
210 default:
211 sprintf(str, "UNKNOWN");
80977dc9
FB
212 }
213
f75cacc4 214 return str;
80977dc9
FB
215}
216
af32423a
FB
217static inline void dwc3_decode_get_status(__u8 t, __u16 i, __u16 l, char *str)
218{
219 switch (t & USB_RECIP_MASK) {
220 case USB_RECIP_INTERFACE:
221 sprintf(str, "Get Interface Status(Intf = %d, Length = %d)",
222 i, l);
223 break;
224 case USB_RECIP_ENDPOINT:
225 sprintf(str, "Get Endpoint Status(ep%d%s)",
226 i & ~USB_DIR_IN,
227 i & USB_DIR_IN ? "in" : "out");
228 break;
229 }
230}
231
232static inline void dwc3_decode_set_clear_feature(__u8 t, __u8 b, __u16 v,
233 __u16 i, char *str)
234{
235 switch (t & USB_RECIP_MASK) {
236 case USB_RECIP_DEVICE:
237 sprintf(str, "%s Device Feature(%s%s)",
238 b == USB_REQ_CLEAR_FEATURE ? "Clear" : "Set",
239 ({char *s;
240 switch (v) {
241 case USB_DEVICE_SELF_POWERED:
242 s = "Self Powered";
243 break;
244 case USB_DEVICE_REMOTE_WAKEUP:
245 s = "Remote Wakeup";
246 break;
247 case USB_DEVICE_TEST_MODE:
248 s = "Test Mode";
249 break;
250 default:
251 s = "UNKNOWN";
252 } s; }),
253 v == USB_DEVICE_TEST_MODE ?
254 ({ char *s;
255 switch (i) {
256 case TEST_J:
257 s = ": TEST_J";
258 break;
259 case TEST_K:
260 s = ": TEST_K";
261 break;
262 case TEST_SE0_NAK:
263 s = ": TEST_SE0_NAK";
264 break;
265 case TEST_PACKET:
266 s = ": TEST_PACKET";
267 break;
268 case TEST_FORCE_EN:
269 s = ": TEST_FORCE_EN";
270 break;
271 default:
272 s = ": UNKNOWN";
273 } s; }) : "");
274 break;
275 case USB_RECIP_INTERFACE:
276 sprintf(str, "%s Interface Feature(%s)",
277 b == USB_REQ_CLEAR_FEATURE ? "Clear" : "Set",
278 v == USB_INTRF_FUNC_SUSPEND ?
279 "Function Suspend" : "UNKNOWN");
280 break;
281 case USB_RECIP_ENDPOINT:
282 sprintf(str, "%s Endpoint Feature(%s ep%d%s)",
283 b == USB_REQ_CLEAR_FEATURE ? "Clear" : "Set",
284 v == USB_ENDPOINT_HALT ? "Halt" : "UNKNOWN",
285 i & ~USB_DIR_IN,
286 i & USB_DIR_IN ? "in" : "out");
287 break;
288 }
289}
290
291static inline void dwc3_decode_set_address(__u16 v, char *str)
292{
293 sprintf(str, "Set Address(Addr = %02x)", v);
294}
295
296static inline void dwc3_decode_get_set_descriptor(__u8 t, __u8 b, __u16 v,
297 __u16 i, __u16 l, char *str)
298{
299 sprintf(str, "%s %s Descriptor(Index = %d, Length = %d)",
300 b == USB_REQ_GET_DESCRIPTOR ? "Get" : "Set",
301 ({ char *s;
302 switch (v >> 8) {
303 case USB_DT_DEVICE:
304 s = "Device";
305 break;
306 case USB_DT_CONFIG:
307 s = "Configuration";
308 break;
309 case USB_DT_STRING:
310 s = "String";
311 break;
312 case USB_DT_INTERFACE:
313 s = "Interface";
314 break;
315 case USB_DT_ENDPOINT:
316 s = "Endpoint";
317 break;
318 case USB_DT_DEVICE_QUALIFIER:
319 s = "Device Qualifier";
320 break;
321 case USB_DT_OTHER_SPEED_CONFIG:
322 s = "Other Speed Config";
323 break;
324 case USB_DT_INTERFACE_POWER:
325 s = "Interface Power";
326 break;
327 case USB_DT_OTG:
328 s = "OTG";
329 break;
330 case USB_DT_DEBUG:
331 s = "Debug";
332 break;
333 case USB_DT_INTERFACE_ASSOCIATION:
334 s = "Interface Association";
335 break;
336 case USB_DT_BOS:
337 s = "BOS";
338 break;
339 case USB_DT_DEVICE_CAPABILITY:
340 s = "Device Capability";
341 break;
342 case USB_DT_PIPE_USAGE:
343 s = "Pipe Usage";
344 break;
345 case USB_DT_SS_ENDPOINT_COMP:
346 s = "SS Endpoint Companion";
347 break;
348 case USB_DT_SSP_ISOC_ENDPOINT_COMP:
349 s = "SSP Isochronous Endpoint Companion";
350 break;
351 default:
352 s = "UNKNOWN";
353 break;
354 } s; }), v & 0xff, l);
355}
356
357
358static inline void dwc3_decode_get_configuration(__u16 l, char *str)
359{
360 sprintf(str, "Get Configuration(Length = %d)", l);
361}
362
363static inline void dwc3_decode_set_configuration(__u8 v, char *str)
364{
365 sprintf(str, "Set Configuration(Config = %d)", v);
366}
367
368static inline void dwc3_decode_get_intf(__u16 i, __u16 l, char *str)
369{
370 sprintf(str, "Get Interface(Intf = %d, Length = %d)", i, l);
371}
372
373static inline void dwc3_decode_set_intf(__u8 v, __u16 i, char *str)
374{
375 sprintf(str, "Set Interface(Intf = %d, Alt.Setting = %d)", i, v);
376}
377
378static inline void dwc3_decode_synch_frame(__u16 i, __u16 l, char *str)
379{
380 sprintf(str, "Synch Frame(Endpoint = %d, Length = %d)", i, l);
381}
382
383static inline void dwc3_decode_set_sel(__u16 l, char *str)
384{
385 sprintf(str, "Set SEL(Length = %d)", l);
386}
387
388static inline void dwc3_decode_set_isoch_delay(__u8 v, char *str)
389{
390 sprintf(str, "Set Isochronous Delay(Delay = %d ns)", v);
391}
392
393/**
394 * dwc3_decode_ctrl - returns a string represetion of ctrl request
395 */
396static inline const char *dwc3_decode_ctrl(char *str, __u8 bRequestType,
397 __u8 bRequest, __u16 wValue, __u16 wIndex, __u16 wLength)
398{
399 switch (bRequest) {
400 case USB_REQ_GET_STATUS:
401 dwc3_decode_get_status(bRequestType, wIndex, wLength, str);
402 break;
403 case USB_REQ_CLEAR_FEATURE:
404 case USB_REQ_SET_FEATURE:
405 dwc3_decode_set_clear_feature(bRequestType, bRequest, wValue,
406 wIndex, str);
407 break;
408 case USB_REQ_SET_ADDRESS:
409 dwc3_decode_set_address(wValue, str);
410 break;
411 case USB_REQ_GET_DESCRIPTOR:
412 case USB_REQ_SET_DESCRIPTOR:
413 dwc3_decode_get_set_descriptor(bRequestType, bRequest, wValue,
414 wIndex, wLength, str);
415 break;
416 case USB_REQ_GET_CONFIGURATION:
417 dwc3_decode_get_configuration(wLength, str);
418 break;
419 case USB_REQ_SET_CONFIGURATION:
420 dwc3_decode_set_configuration(wValue, str);
421 break;
422 case USB_REQ_GET_INTERFACE:
423 dwc3_decode_get_intf(wIndex, wLength, str);
424 break;
425 case USB_REQ_SET_INTERFACE:
426 dwc3_decode_set_intf(wValue, wIndex, str);
427 break;
428 case USB_REQ_SYNCH_FRAME:
429 dwc3_decode_synch_frame(wIndex, wLength, str);
430 break;
431 case USB_REQ_SET_SEL:
432 dwc3_decode_set_sel(wLength, str);
433 break;
434 case USB_REQ_SET_ISOCH_DELAY:
435 dwc3_decode_set_isoch_delay(wValue, str);
436 break;
437 default:
438 sprintf(str, "%02x %02x %02x %02x %02x %02x %02x %02x",
439 bRequestType, bRequest,
440 cpu_to_le16(wValue) & 0xff,
441 cpu_to_le16(wValue) >> 8,
442 cpu_to_le16(wIndex) & 0xff,
443 cpu_to_le16(wIndex) >> 8,
444 cpu_to_le16(wLength) & 0xff,
445 cpu_to_le16(wLength) >> 8);
446 }
447
448 return str;
449}
450
80977dc9
FB
451/**
452 * dwc3_ep_event_string - returns event name
453 * @event: then event code
454 */
f75cacc4 455static inline const char *
3587f36a
FB
456dwc3_ep_event_string(char *str, const struct dwc3_event_depevt *event,
457 u32 ep0state)
80977dc9 458{
f75cacc4 459 u8 epnum = event->endpoint_number;
43c96be1 460 size_t len;
f75cacc4
FB
461 int status;
462 int ret;
463
464 ret = sprintf(str, "ep%d%s: ", epnum >> 1,
696fe69d 465 (epnum & 1) ? "in" : "out");
f75cacc4
FB
466 if (ret < 0)
467 return "UNKNOWN";
468
469 switch (event->endpoint_event) {
80977dc9 470 case DWC3_DEPEVT_XFERCOMPLETE:
f75cacc4 471 strcat(str, "Transfer Complete");
43c96be1
FB
472 len = strlen(str);
473
474 if (epnum <= 1)
475 sprintf(str + len, " [%s]", dwc3_ep0_state_string(ep0state));
f75cacc4 476 break;
80977dc9 477 case DWC3_DEPEVT_XFERINPROGRESS:
f75cacc4
FB
478 strcat(str, "Transfer In-Progress");
479 break;
80977dc9 480 case DWC3_DEPEVT_XFERNOTREADY:
f75cacc4
FB
481 strcat(str, "Transfer Not Ready");
482 status = event->status & DEPEVT_STATUS_TRANSFER_ACTIVE;
483 strcat(str, status ? " (Active)" : " (Not Active)");
45a2af2f
FB
484
485 /* Control Endpoints */
486 if (epnum <= 1) {
487 int phase = DEPEVT_STATUS_CONTROL_PHASE(event->status);
488
489 switch (phase) {
490 case DEPEVT_STATUS_CONTROL_DATA:
491 strcat(str, " [Data Phase]");
492 break;
493 case DEPEVT_STATUS_CONTROL_STATUS:
494 strcat(str, " [Status Phase]");
495 }
496 }
f75cacc4 497 break;
80977dc9 498 case DWC3_DEPEVT_RXTXFIFOEVT:
f75cacc4
FB
499 strcat(str, "FIFO");
500 break;
80977dc9 501 case DWC3_DEPEVT_STREAMEVT:
f75cacc4
FB
502 status = event->status;
503
504 switch (status) {
505 case DEPEVT_STREAMEVT_FOUND:
506 sprintf(str + ret, " Stream %d Found",
507 event->parameters);
508 break;
509 case DEPEVT_STREAMEVT_NOTFOUND:
510 default:
511 strcat(str, " Stream Not Found");
512 break;
513 }
514
515 break;
80977dc9 516 case DWC3_DEPEVT_EPCMDCMPLT:
f75cacc4
FB
517 strcat(str, "Endpoint Command Complete");
518 break;
519 default:
520 sprintf(str, "UNKNOWN");
80977dc9
FB
521 }
522
f75cacc4 523 return str;
80977dc9
FB
524}
525
e996061b
FB
526/**
527 * dwc3_gadget_event_type_string - return event name
528 * @event: the event code
529 */
530static inline const char *dwc3_gadget_event_type_string(u8 event)
531{
532 switch (event) {
533 case DWC3_DEVICE_EVENT_DISCONNECT:
534 return "Disconnect";
535 case DWC3_DEVICE_EVENT_RESET:
536 return "Reset";
537 case DWC3_DEVICE_EVENT_CONNECT_DONE:
538 return "Connect Done";
539 case DWC3_DEVICE_EVENT_LINK_STATUS_CHANGE:
540 return "Link Status Change";
541 case DWC3_DEVICE_EVENT_WAKEUP:
542 return "Wake-Up";
543 case DWC3_DEVICE_EVENT_HIBER_REQ:
544 return "Hibernation";
545 case DWC3_DEVICE_EVENT_EOPF:
546 return "End of Periodic Frame";
547 case DWC3_DEVICE_EVENT_SOF:
548 return "Start of Frame";
549 case DWC3_DEVICE_EVENT_ERRATIC_ERROR:
550 return "Erratic Error";
551 case DWC3_DEVICE_EVENT_CMD_CMPL:
552 return "Command Complete";
553 case DWC3_DEVICE_EVENT_OVERFLOW:
554 return "Overflow";
555 default:
556 return "UNKNOWN";
557 }
558}
559
3587f36a 560static inline const char *dwc3_decode_event(char *str, u32 event, u32 ep0state)
f75cacc4
FB
561{
562 const union dwc3_event evt = (union dwc3_event) event;
563
564 if (evt.type.is_devspec)
3587f36a 565 return dwc3_gadget_event_string(str, &evt.devt);
f75cacc4 566 else
3587f36a 567 return dwc3_ep_event_string(str, &evt.depevt, ep0state);
f75cacc4
FB
568}
569
0933df15
FB
570static inline const char *dwc3_ep_cmd_status_string(int status)
571{
572 switch (status) {
573 case -ETIMEDOUT:
574 return "Timed Out";
575 case 0:
576 return "Successful";
577 case DEPEVT_TRANSFER_NO_RESOURCE:
578 return "No Resource";
579 case DEPEVT_TRANSFER_BUS_EXPIRY:
580 return "Bus Expiry";
581 default:
582 return "UNKNOWN";
583 }
584}
585
71f7e702
FB
586static inline const char *dwc3_gadget_generic_cmd_status_string(int status)
587{
588 switch (status) {
589 case -ETIMEDOUT:
590 return "Timed Out";
591 case 0:
592 return "Successful";
593 case 1:
594 return "Error";
595 default:
596 return "UNKNOWN";
597 }
598}
599
57b14da5 600
72246da4 601#ifdef CONFIG_DEBUG_FS
4e9f3118 602extern void dwc3_debugfs_init(struct dwc3 *);
72246da4
FB
603extern void dwc3_debugfs_exit(struct dwc3 *);
604#else
4e9f3118
DC
605static inline void dwc3_debugfs_init(struct dwc3 *d)
606{ }
72246da4
FB
607static inline void dwc3_debugfs_exit(struct dwc3 *d)
608{ }
609#endif
80977dc9 610#endif /* __DWC3_DEBUG_H */