debug.h 16 KB

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