cdnsp-debug.h 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586
  1. /* SPDX-License-Identifier: GPL-2.0 */
  2. /*
  3. * Cadence CDNSP DRD Driver.
  4. *
  5. * Copyright (C) 2020 Cadence.
  6. *
  7. * Author: Pawel Laszczak <[email protected]>
  8. *
  9. */
  10. #ifndef __LINUX_CDNSP_DEBUG
  11. #define __LINUX_CDNSP_DEBUG
  12. static inline const char *cdnsp_trb_comp_code_string(u8 status)
  13. {
  14. switch (status) {
  15. case COMP_INVALID:
  16. return "Invalid";
  17. case COMP_SUCCESS:
  18. return "Success";
  19. case COMP_DATA_BUFFER_ERROR:
  20. return "Data Buffer Error";
  21. case COMP_BABBLE_DETECTED_ERROR:
  22. return "Babble Detected";
  23. case COMP_TRB_ERROR:
  24. return "TRB Error";
  25. case COMP_RESOURCE_ERROR:
  26. return "Resource Error";
  27. case COMP_NO_SLOTS_AVAILABLE_ERROR:
  28. return "No Slots Available Error";
  29. case COMP_INVALID_STREAM_TYPE_ERROR:
  30. return "Invalid Stream Type Error";
  31. case COMP_SLOT_NOT_ENABLED_ERROR:
  32. return "Slot Not Enabled Error";
  33. case COMP_ENDPOINT_NOT_ENABLED_ERROR:
  34. return "Endpoint Not Enabled Error";
  35. case COMP_SHORT_PACKET:
  36. return "Short Packet";
  37. case COMP_RING_UNDERRUN:
  38. return "Ring Underrun";
  39. case COMP_RING_OVERRUN:
  40. return "Ring Overrun";
  41. case COMP_VF_EVENT_RING_FULL_ERROR:
  42. return "VF Event Ring Full Error";
  43. case COMP_PARAMETER_ERROR:
  44. return "Parameter Error";
  45. case COMP_CONTEXT_STATE_ERROR:
  46. return "Context State Error";
  47. case COMP_EVENT_RING_FULL_ERROR:
  48. return "Event Ring Full Error";
  49. case COMP_INCOMPATIBLE_DEVICE_ERROR:
  50. return "Incompatible Device Error";
  51. case COMP_MISSED_SERVICE_ERROR:
  52. return "Missed Service Error";
  53. case COMP_COMMAND_RING_STOPPED:
  54. return "Command Ring Stopped";
  55. case COMP_COMMAND_ABORTED:
  56. return "Command Aborted";
  57. case COMP_STOPPED:
  58. return "Stopped";
  59. case COMP_STOPPED_LENGTH_INVALID:
  60. return "Stopped - Length Invalid";
  61. case COMP_STOPPED_SHORT_PACKET:
  62. return "Stopped - Short Packet";
  63. case COMP_MAX_EXIT_LATENCY_TOO_LARGE_ERROR:
  64. return "Max Exit Latency Too Large Error";
  65. case COMP_ISOCH_BUFFER_OVERRUN:
  66. return "Isoch Buffer Overrun";
  67. case COMP_EVENT_LOST_ERROR:
  68. return "Event Lost Error";
  69. case COMP_UNDEFINED_ERROR:
  70. return "Undefined Error";
  71. case COMP_INVALID_STREAM_ID_ERROR:
  72. return "Invalid Stream ID Error";
  73. default:
  74. return "Unknown!!";
  75. }
  76. }
  77. static inline const char *cdnsp_trb_type_string(u8 type)
  78. {
  79. switch (type) {
  80. case TRB_NORMAL:
  81. return "Normal";
  82. case TRB_SETUP:
  83. return "Setup Stage";
  84. case TRB_DATA:
  85. return "Data Stage";
  86. case TRB_STATUS:
  87. return "Status Stage";
  88. case TRB_ISOC:
  89. return "Isoch";
  90. case TRB_LINK:
  91. return "Link";
  92. case TRB_EVENT_DATA:
  93. return "Event Data";
  94. case TRB_TR_NOOP:
  95. return "No-Op";
  96. case TRB_ENABLE_SLOT:
  97. return "Enable Slot Command";
  98. case TRB_DISABLE_SLOT:
  99. return "Disable Slot Command";
  100. case TRB_ADDR_DEV:
  101. return "Address Device Command";
  102. case TRB_CONFIG_EP:
  103. return "Configure Endpoint Command";
  104. case TRB_EVAL_CONTEXT:
  105. return "Evaluate Context Command";
  106. case TRB_RESET_EP:
  107. return "Reset Endpoint Command";
  108. case TRB_STOP_RING:
  109. return "Stop Ring Command";
  110. case TRB_SET_DEQ:
  111. return "Set TR Dequeue Pointer Command";
  112. case TRB_RESET_DEV:
  113. return "Reset Device Command";
  114. case TRB_FORCE_HEADER:
  115. return "Force Header Command";
  116. case TRB_CMD_NOOP:
  117. return "No-Op Command";
  118. case TRB_TRANSFER:
  119. return "Transfer Event";
  120. case TRB_COMPLETION:
  121. return "Command Completion Event";
  122. case TRB_PORT_STATUS:
  123. return "Port Status Change Event";
  124. case TRB_HC_EVENT:
  125. return "Device Controller Event";
  126. case TRB_MFINDEX_WRAP:
  127. return "MFINDEX Wrap Event";
  128. case TRB_ENDPOINT_NRDY:
  129. return "Endpoint Not ready";
  130. case TRB_HALT_ENDPOINT:
  131. return "Halt Endpoint";
  132. case TRB_FLUSH_ENDPOINT:
  133. return "FLush Endpoint";
  134. default:
  135. return "UNKNOWN";
  136. }
  137. }
  138. static inline const char *cdnsp_ring_type_string(enum cdnsp_ring_type type)
  139. {
  140. switch (type) {
  141. case TYPE_CTRL:
  142. return "CTRL";
  143. case TYPE_ISOC:
  144. return "ISOC";
  145. case TYPE_BULK:
  146. return "BULK";
  147. case TYPE_INTR:
  148. return "INTR";
  149. case TYPE_STREAM:
  150. return "STREAM";
  151. case TYPE_COMMAND:
  152. return "CMD";
  153. case TYPE_EVENT:
  154. return "EVENT";
  155. }
  156. return "UNKNOWN";
  157. }
  158. static inline char *cdnsp_slot_state_string(u32 state)
  159. {
  160. switch (state) {
  161. case SLOT_STATE_ENABLED:
  162. return "enabled/disabled";
  163. case SLOT_STATE_DEFAULT:
  164. return "default";
  165. case SLOT_STATE_ADDRESSED:
  166. return "addressed";
  167. case SLOT_STATE_CONFIGURED:
  168. return "configured";
  169. default:
  170. return "reserved";
  171. }
  172. }
  173. static inline const char *cdnsp_decode_trb(char *str, size_t size, u32 field0,
  174. u32 field1, u32 field2, u32 field3)
  175. {
  176. int ep_id = TRB_TO_EP_INDEX(field3) - 1;
  177. int type = TRB_FIELD_TO_TYPE(field3);
  178. unsigned int ep_num;
  179. int ret;
  180. u32 temp;
  181. ep_num = DIV_ROUND_UP(ep_id, 2);
  182. switch (type) {
  183. case TRB_LINK:
  184. ret = snprintf(str, size,
  185. "LINK %08x%08x intr %ld type '%s' flags %c:%c:%c:%c",
  186. field1, field0, GET_INTR_TARGET(field2),
  187. cdnsp_trb_type_string(type),
  188. field3 & TRB_IOC ? 'I' : 'i',
  189. field3 & TRB_CHAIN ? 'C' : 'c',
  190. field3 & TRB_TC ? 'T' : 't',
  191. field3 & TRB_CYCLE ? 'C' : 'c');
  192. break;
  193. case TRB_TRANSFER:
  194. case TRB_COMPLETION:
  195. case TRB_PORT_STATUS:
  196. case TRB_HC_EVENT:
  197. ret = snprintf(str, size,
  198. "ep%d%s(%d) type '%s' TRB %08x%08x status '%s'"
  199. " len %ld slot %ld flags %c:%c",
  200. ep_num, ep_id % 2 ? "out" : "in",
  201. TRB_TO_EP_INDEX(field3),
  202. cdnsp_trb_type_string(type), field1, field0,
  203. cdnsp_trb_comp_code_string(GET_COMP_CODE(field2)),
  204. EVENT_TRB_LEN(field2), TRB_TO_SLOT_ID(field3),
  205. field3 & EVENT_DATA ? 'E' : 'e',
  206. field3 & TRB_CYCLE ? 'C' : 'c');
  207. break;
  208. case TRB_MFINDEX_WRAP:
  209. ret = snprintf(str, size, "%s: flags %c",
  210. cdnsp_trb_type_string(type),
  211. field3 & TRB_CYCLE ? 'C' : 'c');
  212. break;
  213. case TRB_SETUP:
  214. ret = snprintf(str, size,
  215. "type '%s' bRequestType %02x bRequest %02x "
  216. "wValue %02x%02x wIndex %02x%02x wLength %d "
  217. "length %ld TD size %ld intr %ld Setup ID %ld "
  218. "flags %c:%c:%c",
  219. cdnsp_trb_type_string(type),
  220. field0 & 0xff,
  221. (field0 & 0xff00) >> 8,
  222. (field0 & 0xff000000) >> 24,
  223. (field0 & 0xff0000) >> 16,
  224. (field1 & 0xff00) >> 8,
  225. field1 & 0xff,
  226. (field1 & 0xff000000) >> 16 |
  227. (field1 & 0xff0000) >> 16,
  228. TRB_LEN(field2), GET_TD_SIZE(field2),
  229. GET_INTR_TARGET(field2),
  230. TRB_SETUPID_TO_TYPE(field3),
  231. field3 & TRB_IDT ? 'D' : 'd',
  232. field3 & TRB_IOC ? 'I' : 'i',
  233. field3 & TRB_CYCLE ? 'C' : 'c');
  234. break;
  235. case TRB_DATA:
  236. ret = snprintf(str, size,
  237. "type '%s' Buffer %08x%08x length %ld TD size %ld "
  238. "intr %ld flags %c:%c:%c:%c:%c:%c:%c",
  239. cdnsp_trb_type_string(type),
  240. field1, field0, TRB_LEN(field2),
  241. GET_TD_SIZE(field2),
  242. GET_INTR_TARGET(field2),
  243. field3 & TRB_IDT ? 'D' : 'i',
  244. field3 & TRB_IOC ? 'I' : 'i',
  245. field3 & TRB_CHAIN ? 'C' : 'c',
  246. field3 & TRB_NO_SNOOP ? 'S' : 's',
  247. field3 & TRB_ISP ? 'I' : 'i',
  248. field3 & TRB_ENT ? 'E' : 'e',
  249. field3 & TRB_CYCLE ? 'C' : 'c');
  250. break;
  251. case TRB_STATUS:
  252. ret = snprintf(str, size,
  253. "Buffer %08x%08x length %ld TD size %ld intr"
  254. "%ld type '%s' flags %c:%c:%c:%c",
  255. field1, field0, TRB_LEN(field2),
  256. GET_TD_SIZE(field2),
  257. GET_INTR_TARGET(field2),
  258. cdnsp_trb_type_string(type),
  259. field3 & TRB_IOC ? 'I' : 'i',
  260. field3 & TRB_CHAIN ? 'C' : 'c',
  261. field3 & TRB_ENT ? 'E' : 'e',
  262. field3 & TRB_CYCLE ? 'C' : 'c');
  263. break;
  264. case TRB_NORMAL:
  265. case TRB_ISOC:
  266. case TRB_EVENT_DATA:
  267. case TRB_TR_NOOP:
  268. ret = snprintf(str, size,
  269. "type '%s' Buffer %08x%08x length %ld "
  270. "TD size %ld intr %ld "
  271. "flags %c:%c:%c:%c:%c:%c:%c:%c:%c",
  272. cdnsp_trb_type_string(type),
  273. field1, field0, TRB_LEN(field2),
  274. GET_TD_SIZE(field2),
  275. GET_INTR_TARGET(field2),
  276. field3 & TRB_BEI ? 'B' : 'b',
  277. field3 & TRB_IDT ? 'T' : 't',
  278. field3 & TRB_IOC ? 'I' : 'i',
  279. field3 & TRB_CHAIN ? 'C' : 'c',
  280. field3 & TRB_NO_SNOOP ? 'S' : 's',
  281. field3 & TRB_ISP ? 'I' : 'i',
  282. field3 & TRB_ENT ? 'E' : 'e',
  283. field3 & TRB_CYCLE ? 'C' : 'c',
  284. !(field3 & TRB_EVENT_INVALIDATE) ? 'V' : 'v');
  285. break;
  286. case TRB_CMD_NOOP:
  287. case TRB_ENABLE_SLOT:
  288. ret = snprintf(str, size, "%s: flags %c",
  289. cdnsp_trb_type_string(type),
  290. field3 & TRB_CYCLE ? 'C' : 'c');
  291. break;
  292. case TRB_DISABLE_SLOT:
  293. ret = snprintf(str, size, "%s: slot %ld flags %c",
  294. cdnsp_trb_type_string(type),
  295. TRB_TO_SLOT_ID(field3),
  296. field3 & TRB_CYCLE ? 'C' : 'c');
  297. break;
  298. case TRB_ADDR_DEV:
  299. ret = snprintf(str, size,
  300. "%s: ctx %08x%08x slot %ld flags %c:%c",
  301. cdnsp_trb_type_string(type), field1, field0,
  302. TRB_TO_SLOT_ID(field3),
  303. field3 & TRB_BSR ? 'B' : 'b',
  304. field3 & TRB_CYCLE ? 'C' : 'c');
  305. break;
  306. case TRB_CONFIG_EP:
  307. ret = snprintf(str, size,
  308. "%s: ctx %08x%08x slot %ld flags %c:%c",
  309. cdnsp_trb_type_string(type), field1, field0,
  310. TRB_TO_SLOT_ID(field3),
  311. field3 & TRB_DC ? 'D' : 'd',
  312. field3 & TRB_CYCLE ? 'C' : 'c');
  313. break;
  314. case TRB_EVAL_CONTEXT:
  315. ret = snprintf(str, size,
  316. "%s: ctx %08x%08x slot %ld flags %c",
  317. cdnsp_trb_type_string(type), field1, field0,
  318. TRB_TO_SLOT_ID(field3),
  319. field3 & TRB_CYCLE ? 'C' : 'c');
  320. break;
  321. case TRB_RESET_EP:
  322. case TRB_HALT_ENDPOINT:
  323. case TRB_FLUSH_ENDPOINT:
  324. ret = snprintf(str, size,
  325. "%s: ep%d%s(%d) ctx %08x%08x slot %ld flags %c",
  326. cdnsp_trb_type_string(type),
  327. ep_num, ep_id % 2 ? "out" : "in",
  328. TRB_TO_EP_INDEX(field3), field1, field0,
  329. TRB_TO_SLOT_ID(field3),
  330. field3 & TRB_CYCLE ? 'C' : 'c');
  331. break;
  332. case TRB_STOP_RING:
  333. ret = snprintf(str, size,
  334. "%s: ep%d%s(%d) slot %ld sp %d flags %c",
  335. cdnsp_trb_type_string(type),
  336. ep_num, ep_id % 2 ? "out" : "in",
  337. TRB_TO_EP_INDEX(field3),
  338. TRB_TO_SLOT_ID(field3),
  339. TRB_TO_SUSPEND_PORT(field3),
  340. field3 & TRB_CYCLE ? 'C' : 'c');
  341. break;
  342. case TRB_SET_DEQ:
  343. ret = snprintf(str, size,
  344. "%s: ep%d%s(%d) deq %08x%08x stream %ld slot %ld flags %c",
  345. cdnsp_trb_type_string(type),
  346. ep_num, ep_id % 2 ? "out" : "in",
  347. TRB_TO_EP_INDEX(field3), field1, field0,
  348. TRB_TO_STREAM_ID(field2),
  349. TRB_TO_SLOT_ID(field3),
  350. field3 & TRB_CYCLE ? 'C' : 'c');
  351. break;
  352. case TRB_RESET_DEV:
  353. ret = snprintf(str, size, "%s: slot %ld flags %c",
  354. cdnsp_trb_type_string(type),
  355. TRB_TO_SLOT_ID(field3),
  356. field3 & TRB_CYCLE ? 'C' : 'c');
  357. break;
  358. case TRB_ENDPOINT_NRDY:
  359. temp = TRB_TO_HOST_STREAM(field2);
  360. ret = snprintf(str, size,
  361. "%s: ep%d%s(%d) H_SID %x%s%s D_SID %lx flags %c:%c",
  362. cdnsp_trb_type_string(type),
  363. ep_num, ep_id % 2 ? "out" : "in",
  364. TRB_TO_EP_INDEX(field3), temp,
  365. temp == STREAM_PRIME_ACK ? "(PRIME)" : "",
  366. temp == STREAM_REJECTED ? "(REJECTED)" : "",
  367. TRB_TO_DEV_STREAM(field0),
  368. field3 & TRB_STAT ? 'S' : 's',
  369. field3 & TRB_CYCLE ? 'C' : 'c');
  370. break;
  371. default:
  372. ret = snprintf(str, size,
  373. "type '%s' -> raw %08x %08x %08x %08x",
  374. cdnsp_trb_type_string(type),
  375. field0, field1, field2, field3);
  376. }
  377. if (ret >= size)
  378. pr_info("CDNSP: buffer overflowed.\n");
  379. return str;
  380. }
  381. static inline const char *cdnsp_decode_slot_context(u32 info, u32 info2,
  382. u32 int_target, u32 state)
  383. {
  384. static char str[1024];
  385. int ret = 0;
  386. u32 speed;
  387. char *s;
  388. speed = info & DEV_SPEED;
  389. switch (speed) {
  390. case SLOT_SPEED_FS:
  391. s = "full-speed";
  392. break;
  393. case SLOT_SPEED_HS:
  394. s = "high-speed";
  395. break;
  396. case SLOT_SPEED_SS:
  397. s = "super-speed";
  398. break;
  399. case SLOT_SPEED_SSP:
  400. s = "super-speed plus";
  401. break;
  402. default:
  403. s = "UNKNOWN speed";
  404. }
  405. ret = sprintf(str, "%s Ctx Entries %d",
  406. s, (info & LAST_CTX_MASK) >> 27);
  407. ret += sprintf(str + ret, " [Intr %ld] Addr %ld State %s",
  408. GET_INTR_TARGET(int_target), state & DEV_ADDR_MASK,
  409. cdnsp_slot_state_string(GET_SLOT_STATE(state)));
  410. return str;
  411. }
  412. static inline const char *cdnsp_portsc_link_state_string(u32 portsc)
  413. {
  414. switch (portsc & PORT_PLS_MASK) {
  415. case XDEV_U0:
  416. return "U0";
  417. case XDEV_U1:
  418. return "U1";
  419. case XDEV_U2:
  420. return "U2";
  421. case XDEV_U3:
  422. return "U3";
  423. case XDEV_DISABLED:
  424. return "Disabled";
  425. case XDEV_RXDETECT:
  426. return "RxDetect";
  427. case XDEV_INACTIVE:
  428. return "Inactive";
  429. case XDEV_POLLING:
  430. return "Polling";
  431. case XDEV_RECOVERY:
  432. return "Recovery";
  433. case XDEV_HOT_RESET:
  434. return "Hot Reset";
  435. case XDEV_COMP_MODE:
  436. return "Compliance mode";
  437. case XDEV_TEST_MODE:
  438. return "Test mode";
  439. case XDEV_RESUME:
  440. return "Resume";
  441. default:
  442. break;
  443. }
  444. return "Unknown";
  445. }
  446. static inline const char *cdnsp_decode_portsc(char *str, size_t size,
  447. u32 portsc)
  448. {
  449. int ret;
  450. ret = snprintf(str, size, "%s %s %s Link:%s PortSpeed:%d ",
  451. portsc & PORT_POWER ? "Powered" : "Powered-off",
  452. portsc & PORT_CONNECT ? "Connected" : "Not-connected",
  453. portsc & PORT_PED ? "Enabled" : "Disabled",
  454. cdnsp_portsc_link_state_string(portsc),
  455. DEV_PORT_SPEED(portsc));
  456. if (portsc & PORT_RESET)
  457. ret += snprintf(str + ret, size - ret, "In-Reset ");
  458. ret += snprintf(str + ret, size - ret, "Change: ");
  459. if (portsc & PORT_CSC)
  460. ret += snprintf(str + ret, size - ret, "CSC ");
  461. if (portsc & PORT_WRC)
  462. ret += snprintf(str + ret, size - ret, "WRC ");
  463. if (portsc & PORT_RC)
  464. ret += snprintf(str + ret, size - ret, "PRC ");
  465. if (portsc & PORT_PLC)
  466. ret += snprintf(str + ret, size - ret, "PLC ");
  467. if (portsc & PORT_CEC)
  468. ret += snprintf(str + ret, size - ret, "CEC ");
  469. ret += snprintf(str + ret, size - ret, "Wake: ");
  470. if (portsc & PORT_WKCONN_E)
  471. ret += snprintf(str + ret, size - ret, "WCE ");
  472. if (portsc & PORT_WKDISC_E)
  473. ret += snprintf(str + ret, size - ret, "WDE ");
  474. return str;
  475. }
  476. static inline const char *cdnsp_ep_state_string(u8 state)
  477. {
  478. switch (state) {
  479. case EP_STATE_DISABLED:
  480. return "disabled";
  481. case EP_STATE_RUNNING:
  482. return "running";
  483. case EP_STATE_HALTED:
  484. return "halted";
  485. case EP_STATE_STOPPED:
  486. return "stopped";
  487. case EP_STATE_ERROR:
  488. return "error";
  489. default:
  490. return "INVALID";
  491. }
  492. }
  493. static inline const char *cdnsp_ep_type_string(u8 type)
  494. {
  495. switch (type) {
  496. case ISOC_OUT_EP:
  497. return "Isoc OUT";
  498. case BULK_OUT_EP:
  499. return "Bulk OUT";
  500. case INT_OUT_EP:
  501. return "Int OUT";
  502. case CTRL_EP:
  503. return "Ctrl";
  504. case ISOC_IN_EP:
  505. return "Isoc IN";
  506. case BULK_IN_EP:
  507. return "Bulk IN";
  508. case INT_IN_EP:
  509. return "Int IN";
  510. default:
  511. return "INVALID";
  512. }
  513. }
  514. static inline const char *cdnsp_decode_ep_context(char *str, size_t size,
  515. u32 info, u32 info2,
  516. u64 deq, u32 tx_info)
  517. {
  518. u8 max_pstr, ep_state, interval, ep_type, burst, cerr, mult;
  519. bool lsa, hid;
  520. u16 maxp, avg;
  521. u32 esit;
  522. int ret;
  523. esit = CTX_TO_MAX_ESIT_PAYLOAD_HI(info) << 16 |
  524. CTX_TO_MAX_ESIT_PAYLOAD_LO(tx_info);
  525. ep_state = info & EP_STATE_MASK;
  526. max_pstr = CTX_TO_EP_MAXPSTREAMS(info);
  527. interval = CTX_TO_EP_INTERVAL(info);
  528. mult = CTX_TO_EP_MULT(info) + 1;
  529. lsa = !!(info & EP_HAS_LSA);
  530. cerr = (info2 & (3 << 1)) >> 1;
  531. ep_type = CTX_TO_EP_TYPE(info2);
  532. hid = !!(info2 & (1 << 7));
  533. burst = CTX_TO_MAX_BURST(info2);
  534. maxp = MAX_PACKET_DECODED(info2);
  535. avg = EP_AVG_TRB_LENGTH(tx_info);
  536. ret = snprintf(str, size, "State %s mult %d max P. Streams %d %s",
  537. cdnsp_ep_state_string(ep_state), mult,
  538. max_pstr, lsa ? "LSA " : "");
  539. ret += snprintf(str + ret, size - ret,
  540. "interval %d us max ESIT payload %d CErr %d ",
  541. (1 << interval) * 125, esit, cerr);
  542. ret += snprintf(str + ret, size - ret,
  543. "Type %s %sburst %d maxp %d deq %016llx ",
  544. cdnsp_ep_type_string(ep_type), hid ? "HID" : "",
  545. burst, maxp, deq);
  546. ret += snprintf(str + ret, size - ret, "avg trb len %d", avg);
  547. return str;
  548. }
  549. #endif /*__LINUX_CDNSP_DEBUG*/