debug.h 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619
  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_trb_type_string - returns TRB type as a string
  115. * @type: the type of the TRB
  116. */
  117. static inline const char *dwc3_trb_type_string(unsigned int type)
  118. {
  119. switch (type) {
  120. case DWC3_TRBCTL_NORMAL:
  121. return "normal";
  122. case DWC3_TRBCTL_CONTROL_SETUP:
  123. return "setup";
  124. case DWC3_TRBCTL_CONTROL_STATUS2:
  125. return "status2";
  126. case DWC3_TRBCTL_CONTROL_STATUS3:
  127. return "status3";
  128. case DWC3_TRBCTL_CONTROL_DATA:
  129. return "data";
  130. case DWC3_TRBCTL_ISOCHRONOUS_FIRST:
  131. return "isoc-first";
  132. case DWC3_TRBCTL_ISOCHRONOUS:
  133. return "isoc";
  134. case DWC3_TRBCTL_LINK_TRB:
  135. return "link";
  136. default:
  137. return "UNKNOWN";
  138. }
  139. }
  140. static inline const char *dwc3_ep0_state_string(enum dwc3_ep0_state state)
  141. {
  142. switch (state) {
  143. case EP0_UNCONNECTED:
  144. return "Unconnected";
  145. case EP0_SETUP_PHASE:
  146. return "Setup Phase";
  147. case EP0_DATA_PHASE:
  148. return "Data Phase";
  149. case EP0_STATUS_PHASE:
  150. return "Status Phase";
  151. default:
  152. return "UNKNOWN";
  153. }
  154. }
  155. /**
  156. * dwc3_gadget_event_string - returns event name
  157. * @event: the event code
  158. */
  159. static inline const char *
  160. dwc3_gadget_event_string(char *str, const struct dwc3_event_devt *event)
  161. {
  162. enum dwc3_link_state state = event->event_info & DWC3_LINK_STATE_MASK;
  163. switch (event->type) {
  164. case DWC3_DEVICE_EVENT_DISCONNECT:
  165. sprintf(str, "Disconnect: [%s]",
  166. dwc3_gadget_link_string(state));
  167. break;
  168. case DWC3_DEVICE_EVENT_RESET:
  169. sprintf(str, "Reset [%s]", dwc3_gadget_link_string(state));
  170. break;
  171. case DWC3_DEVICE_EVENT_CONNECT_DONE:
  172. sprintf(str, "Connection Done [%s]",
  173. dwc3_gadget_link_string(state));
  174. break;
  175. case DWC3_DEVICE_EVENT_LINK_STATUS_CHANGE:
  176. sprintf(str, "Link Change [%s]",
  177. dwc3_gadget_link_string(state));
  178. break;
  179. case DWC3_DEVICE_EVENT_WAKEUP:
  180. sprintf(str, "WakeUp [%s]", dwc3_gadget_link_string(state));
  181. break;
  182. case DWC3_DEVICE_EVENT_EOPF:
  183. sprintf(str, "End-Of-Frame [%s]",
  184. dwc3_gadget_link_string(state));
  185. break;
  186. case DWC3_DEVICE_EVENT_SOF:
  187. sprintf(str, "Start-Of-Frame [%s]",
  188. dwc3_gadget_link_string(state));
  189. break;
  190. case DWC3_DEVICE_EVENT_ERRATIC_ERROR:
  191. sprintf(str, "Erratic Error [%s]",
  192. dwc3_gadget_link_string(state));
  193. break;
  194. case DWC3_DEVICE_EVENT_CMD_CMPL:
  195. sprintf(str, "Command Complete [%s]",
  196. dwc3_gadget_link_string(state));
  197. break;
  198. case DWC3_DEVICE_EVENT_OVERFLOW:
  199. sprintf(str, "Overflow [%s]", dwc3_gadget_link_string(state));
  200. break;
  201. default:
  202. sprintf(str, "UNKNOWN");
  203. }
  204. return str;
  205. }
  206. static inline void dwc3_decode_get_status(__u8 t, __u16 i, __u16 l, char *str)
  207. {
  208. switch (t & USB_RECIP_MASK) {
  209. case USB_RECIP_INTERFACE:
  210. sprintf(str, "Get Interface Status(Intf = %d, Length = %d)",
  211. i, l);
  212. break;
  213. case USB_RECIP_ENDPOINT:
  214. sprintf(str, "Get Endpoint Status(ep%d%s)",
  215. i & ~USB_DIR_IN,
  216. i & USB_DIR_IN ? "in" : "out");
  217. break;
  218. }
  219. }
  220. static inline void dwc3_decode_set_clear_feature(__u8 t, __u8 b, __u16 v,
  221. __u16 i, char *str)
  222. {
  223. switch (t & USB_RECIP_MASK) {
  224. case USB_RECIP_DEVICE:
  225. sprintf(str, "%s Device Feature(%s%s)",
  226. b == USB_REQ_CLEAR_FEATURE ? "Clear" : "Set",
  227. ({char *s;
  228. switch (v) {
  229. case USB_DEVICE_SELF_POWERED:
  230. s = "Self Powered";
  231. break;
  232. case USB_DEVICE_REMOTE_WAKEUP:
  233. s = "Remote Wakeup";
  234. break;
  235. case USB_DEVICE_TEST_MODE:
  236. s = "Test Mode";
  237. break;
  238. case USB_DEVICE_U1_ENABLE:
  239. s = "U1 Enable";
  240. break;
  241. case USB_DEVICE_U2_ENABLE:
  242. s = "U2 Enable";
  243. break;
  244. case USB_DEVICE_LTM_ENABLE:
  245. s = "LTM Enable";
  246. break;
  247. default:
  248. s = "UNKNOWN";
  249. } s; }),
  250. v == USB_DEVICE_TEST_MODE ?
  251. ({ char *s;
  252. switch (i) {
  253. case TEST_J:
  254. s = ": TEST_J";
  255. break;
  256. case TEST_K:
  257. s = ": TEST_K";
  258. break;
  259. case TEST_SE0_NAK:
  260. s = ": TEST_SE0_NAK";
  261. break;
  262. case TEST_PACKET:
  263. s = ": TEST_PACKET";
  264. break;
  265. case TEST_FORCE_EN:
  266. s = ": TEST_FORCE_EN";
  267. break;
  268. default:
  269. s = ": UNKNOWN";
  270. } s; }) : "");
  271. break;
  272. case USB_RECIP_INTERFACE:
  273. sprintf(str, "%s Interface Feature(%s)",
  274. b == USB_REQ_CLEAR_FEATURE ? "Clear" : "Set",
  275. v == USB_INTRF_FUNC_SUSPEND ?
  276. "Function Suspend" : "UNKNOWN");
  277. break;
  278. case USB_RECIP_ENDPOINT:
  279. sprintf(str, "%s Endpoint Feature(%s ep%d%s)",
  280. b == USB_REQ_CLEAR_FEATURE ? "Clear" : "Set",
  281. v == USB_ENDPOINT_HALT ? "Halt" : "UNKNOWN",
  282. i & ~USB_DIR_IN,
  283. i & USB_DIR_IN ? "in" : "out");
  284. break;
  285. }
  286. }
  287. static inline void dwc3_decode_set_address(__u16 v, char *str)
  288. {
  289. sprintf(str, "Set Address(Addr = %02x)", v);
  290. }
  291. static inline void dwc3_decode_get_set_descriptor(__u8 t, __u8 b, __u16 v,
  292. __u16 i, __u16 l, char *str)
  293. {
  294. sprintf(str, "%s %s Descriptor(Index = %d, Length = %d)",
  295. b == USB_REQ_GET_DESCRIPTOR ? "Get" : "Set",
  296. ({ char *s;
  297. switch (v >> 8) {
  298. case USB_DT_DEVICE:
  299. s = "Device";
  300. break;
  301. case USB_DT_CONFIG:
  302. s = "Configuration";
  303. break;
  304. case USB_DT_STRING:
  305. s = "String";
  306. break;
  307. case USB_DT_INTERFACE:
  308. s = "Interface";
  309. break;
  310. case USB_DT_ENDPOINT:
  311. s = "Endpoint";
  312. break;
  313. case USB_DT_DEVICE_QUALIFIER:
  314. s = "Device Qualifier";
  315. break;
  316. case USB_DT_OTHER_SPEED_CONFIG:
  317. s = "Other Speed Config";
  318. break;
  319. case USB_DT_INTERFACE_POWER:
  320. s = "Interface Power";
  321. break;
  322. case USB_DT_OTG:
  323. s = "OTG";
  324. break;
  325. case USB_DT_DEBUG:
  326. s = "Debug";
  327. break;
  328. case USB_DT_INTERFACE_ASSOCIATION:
  329. s = "Interface Association";
  330. break;
  331. case USB_DT_BOS:
  332. s = "BOS";
  333. break;
  334. case USB_DT_DEVICE_CAPABILITY:
  335. s = "Device Capability";
  336. break;
  337. case USB_DT_PIPE_USAGE:
  338. s = "Pipe Usage";
  339. break;
  340. case USB_DT_SS_ENDPOINT_COMP:
  341. s = "SS Endpoint Companion";
  342. break;
  343. case USB_DT_SSP_ISOC_ENDPOINT_COMP:
  344. s = "SSP Isochronous Endpoint Companion";
  345. break;
  346. default:
  347. s = "UNKNOWN";
  348. break;
  349. } s; }), v & 0xff, l);
  350. }
  351. static inline void dwc3_decode_get_configuration(__u16 l, char *str)
  352. {
  353. sprintf(str, "Get Configuration(Length = %d)", l);
  354. }
  355. static inline void dwc3_decode_set_configuration(__u8 v, char *str)
  356. {
  357. sprintf(str, "Set Configuration(Config = %d)", v);
  358. }
  359. static inline void dwc3_decode_get_intf(__u16 i, __u16 l, char *str)
  360. {
  361. sprintf(str, "Get Interface(Intf = %d, Length = %d)", i, l);
  362. }
  363. static inline void dwc3_decode_set_intf(__u8 v, __u16 i, char *str)
  364. {
  365. sprintf(str, "Set Interface(Intf = %d, Alt.Setting = %d)", i, v);
  366. }
  367. static inline void dwc3_decode_synch_frame(__u16 i, __u16 l, char *str)
  368. {
  369. sprintf(str, "Synch Frame(Endpoint = %d, Length = %d)", i, l);
  370. }
  371. static inline void dwc3_decode_set_sel(__u16 l, char *str)
  372. {
  373. sprintf(str, "Set SEL(Length = %d)", l);
  374. }
  375. static inline void dwc3_decode_set_isoch_delay(__u8 v, char *str)
  376. {
  377. sprintf(str, "Set Isochronous Delay(Delay = %d ns)", v);
  378. }
  379. /**
  380. * dwc3_decode_ctrl - returns a string represetion of ctrl request
  381. */
  382. static inline const char *dwc3_decode_ctrl(char *str, __u8 bRequestType,
  383. __u8 bRequest, __u16 wValue, __u16 wIndex, __u16 wLength)
  384. {
  385. switch (bRequest) {
  386. case USB_REQ_GET_STATUS:
  387. dwc3_decode_get_status(bRequestType, wIndex, wLength, str);
  388. break;
  389. case USB_REQ_CLEAR_FEATURE:
  390. case USB_REQ_SET_FEATURE:
  391. dwc3_decode_set_clear_feature(bRequestType, bRequest, wValue,
  392. wIndex, str);
  393. break;
  394. case USB_REQ_SET_ADDRESS:
  395. dwc3_decode_set_address(wValue, str);
  396. break;
  397. case USB_REQ_GET_DESCRIPTOR:
  398. case USB_REQ_SET_DESCRIPTOR:
  399. dwc3_decode_get_set_descriptor(bRequestType, bRequest, wValue,
  400. wIndex, wLength, str);
  401. break;
  402. case USB_REQ_GET_CONFIGURATION:
  403. dwc3_decode_get_configuration(wLength, str);
  404. break;
  405. case USB_REQ_SET_CONFIGURATION:
  406. dwc3_decode_set_configuration(wValue, str);
  407. break;
  408. case USB_REQ_GET_INTERFACE:
  409. dwc3_decode_get_intf(wIndex, wLength, str);
  410. break;
  411. case USB_REQ_SET_INTERFACE:
  412. dwc3_decode_set_intf(wValue, wIndex, str);
  413. break;
  414. case USB_REQ_SYNCH_FRAME:
  415. dwc3_decode_synch_frame(wIndex, wLength, str);
  416. break;
  417. case USB_REQ_SET_SEL:
  418. dwc3_decode_set_sel(wLength, str);
  419. break;
  420. case USB_REQ_SET_ISOCH_DELAY:
  421. dwc3_decode_set_isoch_delay(wValue, str);
  422. break;
  423. default:
  424. sprintf(str, "%02x %02x %02x %02x %02x %02x %02x %02x",
  425. bRequestType, bRequest,
  426. cpu_to_le16(wValue) & 0xff,
  427. cpu_to_le16(wValue) >> 8,
  428. cpu_to_le16(wIndex) & 0xff,
  429. cpu_to_le16(wIndex) >> 8,
  430. cpu_to_le16(wLength) & 0xff,
  431. cpu_to_le16(wLength) >> 8);
  432. }
  433. return str;
  434. }
  435. /**
  436. * dwc3_ep_event_string - returns event name
  437. * @event: then event code
  438. */
  439. static inline const char *
  440. dwc3_ep_event_string(char *str, const struct dwc3_event_depevt *event,
  441. u32 ep0state)
  442. {
  443. u8 epnum = event->endpoint_number;
  444. size_t len;
  445. int status;
  446. int ret;
  447. ret = sprintf(str, "ep%d%s: ", epnum >> 1,
  448. (epnum & 1) ? "in" : "out");
  449. if (ret < 0)
  450. return "UNKNOWN";
  451. switch (event->endpoint_event) {
  452. case DWC3_DEPEVT_XFERCOMPLETE:
  453. strcat(str, "Transfer Complete");
  454. len = strlen(str);
  455. if (epnum <= 1)
  456. sprintf(str + len, " [%s]", dwc3_ep0_state_string(ep0state));
  457. break;
  458. case DWC3_DEPEVT_XFERINPROGRESS:
  459. strcat(str, "Transfer In-Progress");
  460. break;
  461. case DWC3_DEPEVT_XFERNOTREADY:
  462. strcat(str, "Transfer Not Ready");
  463. status = event->status & DEPEVT_STATUS_TRANSFER_ACTIVE;
  464. strcat(str, status ? " (Active)" : " (Not Active)");
  465. /* Control Endpoints */
  466. if (epnum <= 1) {
  467. int phase = DEPEVT_STATUS_CONTROL_PHASE(event->status);
  468. switch (phase) {
  469. case DEPEVT_STATUS_CONTROL_DATA:
  470. strcat(str, " [Data Phase]");
  471. break;
  472. case DEPEVT_STATUS_CONTROL_STATUS:
  473. strcat(str, " [Status Phase]");
  474. }
  475. }
  476. break;
  477. case DWC3_DEPEVT_RXTXFIFOEVT:
  478. strcat(str, "FIFO");
  479. break;
  480. case DWC3_DEPEVT_STREAMEVT:
  481. status = event->status;
  482. switch (status) {
  483. case DEPEVT_STREAMEVT_FOUND:
  484. sprintf(str + ret, " Stream %d Found",
  485. event->parameters);
  486. break;
  487. case DEPEVT_STREAMEVT_NOTFOUND:
  488. default:
  489. strcat(str, " Stream Not Found");
  490. break;
  491. }
  492. break;
  493. case DWC3_DEPEVT_EPCMDCMPLT:
  494. strcat(str, "Endpoint Command Complete");
  495. break;
  496. default:
  497. sprintf(str, "UNKNOWN");
  498. }
  499. return str;
  500. }
  501. /**
  502. * dwc3_gadget_event_type_string - return event name
  503. * @event: the event code
  504. */
  505. static inline const char *dwc3_gadget_event_type_string(u8 event)
  506. {
  507. switch (event) {
  508. case DWC3_DEVICE_EVENT_DISCONNECT:
  509. return "Disconnect";
  510. case DWC3_DEVICE_EVENT_RESET:
  511. return "Reset";
  512. case DWC3_DEVICE_EVENT_CONNECT_DONE:
  513. return "Connect Done";
  514. case DWC3_DEVICE_EVENT_LINK_STATUS_CHANGE:
  515. return "Link Status Change";
  516. case DWC3_DEVICE_EVENT_WAKEUP:
  517. return "Wake-Up";
  518. case DWC3_DEVICE_EVENT_HIBER_REQ:
  519. return "Hibernation";
  520. case DWC3_DEVICE_EVENT_EOPF:
  521. return "End of Periodic Frame";
  522. case DWC3_DEVICE_EVENT_SOF:
  523. return "Start of Frame";
  524. case DWC3_DEVICE_EVENT_ERRATIC_ERROR:
  525. return "Erratic Error";
  526. case DWC3_DEVICE_EVENT_CMD_CMPL:
  527. return "Command Complete";
  528. case DWC3_DEVICE_EVENT_OVERFLOW:
  529. return "Overflow";
  530. default:
  531. return "UNKNOWN";
  532. }
  533. }
  534. static inline const char *dwc3_decode_event(char *str, u32 event, u32 ep0state)
  535. {
  536. const union dwc3_event evt = (union dwc3_event) event;
  537. if (evt.type.is_devspec)
  538. return dwc3_gadget_event_string(str, &evt.devt);
  539. else
  540. return dwc3_ep_event_string(str, &evt.depevt, ep0state);
  541. }
  542. static inline const char *dwc3_ep_cmd_status_string(int status)
  543. {
  544. switch (status) {
  545. case -ETIMEDOUT:
  546. return "Timed Out";
  547. case 0:
  548. return "Successful";
  549. case DEPEVT_TRANSFER_NO_RESOURCE:
  550. return "No Resource";
  551. case DEPEVT_TRANSFER_BUS_EXPIRY:
  552. return "Bus Expiry";
  553. default:
  554. return "UNKNOWN";
  555. }
  556. }
  557. static inline const char *dwc3_gadget_generic_cmd_status_string(int status)
  558. {
  559. switch (status) {
  560. case -ETIMEDOUT:
  561. return "Timed Out";
  562. case 0:
  563. return "Successful";
  564. case 1:
  565. return "Error";
  566. default:
  567. return "UNKNOWN";
  568. }
  569. }
  570. #ifdef CONFIG_DEBUG_FS
  571. extern void dwc3_debugfs_init(struct dwc3 *);
  572. extern void dwc3_debugfs_exit(struct dwc3 *);
  573. #else
  574. static inline void dwc3_debugfs_init(struct dwc3 *d)
  575. { }
  576. static inline void dwc3_debugfs_exit(struct dwc3 *d)
  577. { }
  578. #endif
  579. #endif /* __DWC3_DEBUG_H */