debug.h 15 KB

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