cdnsp-debug.h 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584
  1. /* SPDX-License-Identifier: GPL-2.0 */
  2. /*
  3. * Cadence CDNSP DRD Driver.
  4. *
  5. * Copyright (C) 2020 Cadence.
  6. *
  7. * Author: Pawel Laszczak <pawell@cadence.com>
  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. default:
  133. return "UNKNOWN";
  134. }
  135. }
  136. static inline const char *cdnsp_ring_type_string(enum cdnsp_ring_type type)
  137. {
  138. switch (type) {
  139. case TYPE_CTRL:
  140. return "CTRL";
  141. case TYPE_ISOC:
  142. return "ISOC";
  143. case TYPE_BULK:
  144. return "BULK";
  145. case TYPE_INTR:
  146. return "INTR";
  147. case TYPE_STREAM:
  148. return "STREAM";
  149. case TYPE_COMMAND:
  150. return "CMD";
  151. case TYPE_EVENT:
  152. return "EVENT";
  153. }
  154. return "UNKNOWN";
  155. }
  156. static inline char *cdnsp_slot_state_string(u32 state)
  157. {
  158. switch (state) {
  159. case SLOT_STATE_ENABLED:
  160. return "enabled/disabled";
  161. case SLOT_STATE_DEFAULT:
  162. return "default";
  163. case SLOT_STATE_ADDRESSED:
  164. return "addressed";
  165. case SLOT_STATE_CONFIGURED:
  166. return "configured";
  167. default:
  168. return "reserved";
  169. }
  170. }
  171. static inline const char *cdnsp_decode_trb(char *str, size_t size, u32 field0,
  172. u32 field1, u32 field2, u32 field3)
  173. {
  174. int ep_id = TRB_TO_EP_INDEX(field3) - 1;
  175. int type = TRB_FIELD_TO_TYPE(field3);
  176. unsigned int ep_num;
  177. int ret;
  178. u32 temp;
  179. ep_num = DIV_ROUND_UP(ep_id, 2);
  180. switch (type) {
  181. case TRB_LINK:
  182. ret = scnprintf(str, size,
  183. "LINK %08x%08x intr %ld type '%s' flags %c:%c:%c:%c",
  184. field1, field0, GET_INTR_TARGET(field2),
  185. cdnsp_trb_type_string(type),
  186. field3 & TRB_IOC ? 'I' : 'i',
  187. field3 & TRB_CHAIN ? 'C' : 'c',
  188. field3 & TRB_TC ? 'T' : 't',
  189. field3 & TRB_CYCLE ? 'C' : 'c');
  190. break;
  191. case TRB_TRANSFER:
  192. case TRB_COMPLETION:
  193. case TRB_PORT_STATUS:
  194. case TRB_HC_EVENT:
  195. ret = scnprintf(str, size,
  196. "ep%d%s(%d) type '%s' TRB %08x%08x status '%s'"
  197. " len %ld slot %ld flags %c:%c",
  198. ep_num, ep_id % 2 ? "out" : "in",
  199. TRB_TO_EP_INDEX(field3),
  200. cdnsp_trb_type_string(type), field1, field0,
  201. cdnsp_trb_comp_code_string(GET_COMP_CODE(field2)),
  202. EVENT_TRB_LEN(field2), TRB_TO_SLOT_ID(field3),
  203. field3 & EVENT_DATA ? 'E' : 'e',
  204. field3 & TRB_CYCLE ? 'C' : 'c');
  205. break;
  206. case TRB_MFINDEX_WRAP:
  207. ret = scnprintf(str, size, "%s: flags %c",
  208. cdnsp_trb_type_string(type),
  209. field3 & TRB_CYCLE ? 'C' : 'c');
  210. break;
  211. case TRB_SETUP:
  212. ret = scnprintf(str, size,
  213. "type '%s' bRequestType %02x bRequest %02x "
  214. "wValue %02x%02x wIndex %02x%02x wLength %d "
  215. "length %ld TD size %ld intr %ld Setup ID %ld "
  216. "flags %c:%c:%c",
  217. cdnsp_trb_type_string(type),
  218. field0 & 0xff,
  219. (field0 & 0xff00) >> 8,
  220. (field0 & 0xff000000) >> 24,
  221. (field0 & 0xff0000) >> 16,
  222. (field1 & 0xff00) >> 8,
  223. field1 & 0xff,
  224. (field1 & 0xff000000) >> 16 |
  225. (field1 & 0xff0000) >> 16,
  226. TRB_LEN(field2), GET_TD_SIZE(field2),
  227. GET_INTR_TARGET(field2),
  228. TRB_SETUPID_TO_TYPE(field3),
  229. field3 & TRB_IDT ? 'D' : 'd',
  230. field3 & TRB_IOC ? 'I' : 'i',
  231. field3 & TRB_CYCLE ? 'C' : 'c');
  232. break;
  233. case TRB_DATA:
  234. ret = scnprintf(str, size,
  235. "type '%s' Buffer %08x%08x length %ld TD size %ld "
  236. "intr %ld flags %c:%c:%c:%c:%c:%c:%c",
  237. cdnsp_trb_type_string(type),
  238. field1, field0, TRB_LEN(field2),
  239. GET_TD_SIZE(field2),
  240. GET_INTR_TARGET(field2),
  241. field3 & TRB_IDT ? 'D' : 'i',
  242. field3 & TRB_IOC ? 'I' : 'i',
  243. field3 & TRB_CHAIN ? 'C' : 'c',
  244. field3 & TRB_NO_SNOOP ? 'S' : 's',
  245. field3 & TRB_ISP ? 'I' : 'i',
  246. field3 & TRB_ENT ? 'E' : 'e',
  247. field3 & TRB_CYCLE ? 'C' : 'c');
  248. break;
  249. case TRB_STATUS:
  250. ret = scnprintf(str, size,
  251. "Buffer %08x%08x length %ld TD size %ld intr"
  252. "%ld type '%s' flags %c:%c:%c:%c",
  253. field1, field0, TRB_LEN(field2),
  254. GET_TD_SIZE(field2),
  255. GET_INTR_TARGET(field2),
  256. cdnsp_trb_type_string(type),
  257. field3 & TRB_IOC ? 'I' : 'i',
  258. field3 & TRB_CHAIN ? 'C' : 'c',
  259. field3 & TRB_ENT ? 'E' : 'e',
  260. field3 & TRB_CYCLE ? 'C' : 'c');
  261. break;
  262. case TRB_NORMAL:
  263. case TRB_ISOC:
  264. case TRB_EVENT_DATA:
  265. case TRB_TR_NOOP:
  266. ret = scnprintf(str, size,
  267. "type '%s' Buffer %08x%08x length %ld "
  268. "TD size %ld intr %ld "
  269. "flags %c:%c:%c:%c:%c:%c:%c:%c:%c",
  270. cdnsp_trb_type_string(type),
  271. field1, field0, TRB_LEN(field2),
  272. GET_TD_SIZE(field2),
  273. GET_INTR_TARGET(field2),
  274. field3 & TRB_BEI ? 'B' : 'b',
  275. field3 & TRB_IDT ? 'T' : 't',
  276. field3 & TRB_IOC ? 'I' : 'i',
  277. field3 & TRB_CHAIN ? 'C' : 'c',
  278. field3 & TRB_NO_SNOOP ? 'S' : 's',
  279. field3 & TRB_ISP ? 'I' : 'i',
  280. field3 & TRB_ENT ? 'E' : 'e',
  281. field3 & TRB_CYCLE ? 'C' : 'c',
  282. !(field3 & TRB_EVENT_INVALIDATE) ? 'V' : 'v');
  283. break;
  284. case TRB_CMD_NOOP:
  285. case TRB_ENABLE_SLOT:
  286. ret = scnprintf(str, size, "%s: flags %c",
  287. cdnsp_trb_type_string(type),
  288. field3 & TRB_CYCLE ? 'C' : 'c');
  289. break;
  290. case TRB_DISABLE_SLOT:
  291. ret = scnprintf(str, size, "%s: slot %ld flags %c",
  292. cdnsp_trb_type_string(type),
  293. TRB_TO_SLOT_ID(field3),
  294. field3 & TRB_CYCLE ? 'C' : 'c');
  295. break;
  296. case TRB_ADDR_DEV:
  297. ret = scnprintf(str, size,
  298. "%s: ctx %08x%08x slot %ld flags %c:%c",
  299. cdnsp_trb_type_string(type), field1, field0,
  300. TRB_TO_SLOT_ID(field3),
  301. field3 & TRB_BSR ? 'B' : 'b',
  302. field3 & TRB_CYCLE ? 'C' : 'c');
  303. break;
  304. case TRB_CONFIG_EP:
  305. ret = scnprintf(str, size,
  306. "%s: ctx %08x%08x slot %ld flags %c:%c",
  307. cdnsp_trb_type_string(type), field1, field0,
  308. TRB_TO_SLOT_ID(field3),
  309. field3 & TRB_DC ? 'D' : 'd',
  310. field3 & TRB_CYCLE ? 'C' : 'c');
  311. break;
  312. case TRB_EVAL_CONTEXT:
  313. ret = scnprintf(str, size,
  314. "%s: ctx %08x%08x slot %ld flags %c",
  315. cdnsp_trb_type_string(type), field1, field0,
  316. TRB_TO_SLOT_ID(field3),
  317. field3 & TRB_CYCLE ? 'C' : 'c');
  318. break;
  319. case TRB_RESET_EP:
  320. case TRB_HALT_ENDPOINT:
  321. ret = scnprintf(str, size,
  322. "%s: ep%d%s(%d) ctx %08x%08x slot %ld flags %c %c",
  323. cdnsp_trb_type_string(type),
  324. ep_num, ep_id % 2 ? "out" : "in",
  325. TRB_TO_EP_INDEX(field3), field1, field0,
  326. TRB_TO_SLOT_ID(field3),
  327. field3 & TRB_CYCLE ? 'C' : 'c',
  328. field3 & TRB_ESP ? 'P' : 'p');
  329. break;
  330. case TRB_STOP_RING:
  331. ret = scnprintf(str, size,
  332. "%s: ep%d%s(%d) slot %ld sp %d flags %c",
  333. cdnsp_trb_type_string(type),
  334. ep_num, ep_id % 2 ? "out" : "in",
  335. TRB_TO_EP_INDEX(field3),
  336. TRB_TO_SLOT_ID(field3),
  337. TRB_TO_SUSPEND_PORT(field3),
  338. field3 & TRB_CYCLE ? 'C' : 'c');
  339. break;
  340. case TRB_SET_DEQ:
  341. ret = scnprintf(str, size,
  342. "%s: ep%d%s(%d) deq %08x%08x stream %ld slot %ld flags %c",
  343. cdnsp_trb_type_string(type),
  344. ep_num, ep_id % 2 ? "out" : "in",
  345. TRB_TO_EP_INDEX(field3), field1, field0,
  346. TRB_TO_STREAM_ID(field2),
  347. TRB_TO_SLOT_ID(field3),
  348. field3 & TRB_CYCLE ? 'C' : 'c');
  349. break;
  350. case TRB_RESET_DEV:
  351. ret = scnprintf(str, size, "%s: slot %ld flags %c",
  352. cdnsp_trb_type_string(type),
  353. TRB_TO_SLOT_ID(field3),
  354. field3 & TRB_CYCLE ? 'C' : 'c');
  355. break;
  356. case TRB_ENDPOINT_NRDY:
  357. temp = TRB_TO_HOST_STREAM(field2);
  358. ret = scnprintf(str, size,
  359. "%s: ep%d%s(%d) H_SID %x%s%s D_SID %lx flags %c:%c",
  360. cdnsp_trb_type_string(type),
  361. ep_num, ep_id % 2 ? "out" : "in",
  362. TRB_TO_EP_INDEX(field3), temp,
  363. temp == STREAM_PRIME_ACK ? "(PRIME)" : "",
  364. temp == STREAM_REJECTED ? "(REJECTED)" : "",
  365. TRB_TO_DEV_STREAM(field0),
  366. field3 & TRB_STAT ? 'S' : 's',
  367. field3 & TRB_CYCLE ? 'C' : 'c');
  368. break;
  369. default:
  370. ret = scnprintf(str, size,
  371. "type '%s' -> raw %08x %08x %08x %08x",
  372. cdnsp_trb_type_string(type),
  373. field0, field1, field2, field3);
  374. }
  375. if (ret == size - 1)
  376. pr_info("CDNSP: buffer may be truncated.\n");
  377. return str;
  378. }
  379. static inline const char *cdnsp_decode_slot_context(u32 info, u32 info2,
  380. u32 int_target, u32 state)
  381. {
  382. static char str[1024];
  383. int ret = 0;
  384. u32 speed;
  385. char *s;
  386. speed = info & DEV_SPEED;
  387. switch (speed) {
  388. case SLOT_SPEED_FS:
  389. s = "full-speed";
  390. break;
  391. case SLOT_SPEED_HS:
  392. s = "high-speed";
  393. break;
  394. case SLOT_SPEED_SS:
  395. s = "super-speed";
  396. break;
  397. case SLOT_SPEED_SSP:
  398. s = "super-speed plus";
  399. break;
  400. default:
  401. s = "UNKNOWN speed";
  402. }
  403. ret = sprintf(str, "%s Ctx Entries %d",
  404. s, (info & LAST_CTX_MASK) >> 27);
  405. ret += sprintf(str + ret, " [Intr %ld] Addr %ld State %s",
  406. GET_INTR_TARGET(int_target), state & DEV_ADDR_MASK,
  407. cdnsp_slot_state_string(GET_SLOT_STATE(state)));
  408. return str;
  409. }
  410. static inline const char *cdnsp_portsc_link_state_string(u32 portsc)
  411. {
  412. switch (portsc & PORT_PLS_MASK) {
  413. case XDEV_U0:
  414. return "U0";
  415. case XDEV_U1:
  416. return "U1";
  417. case XDEV_U2:
  418. return "U2";
  419. case XDEV_U3:
  420. return "U3";
  421. case XDEV_DISABLED:
  422. return "Disabled";
  423. case XDEV_RXDETECT:
  424. return "RxDetect";
  425. case XDEV_INACTIVE:
  426. return "Inactive";
  427. case XDEV_POLLING:
  428. return "Polling";
  429. case XDEV_RECOVERY:
  430. return "Recovery";
  431. case XDEV_HOT_RESET:
  432. return "Hot Reset";
  433. case XDEV_COMP_MODE:
  434. return "Compliance mode";
  435. case XDEV_TEST_MODE:
  436. return "Test mode";
  437. case XDEV_RESUME:
  438. return "Resume";
  439. default:
  440. break;
  441. }
  442. return "Unknown";
  443. }
  444. static inline const char *cdnsp_decode_portsc(char *str, size_t size,
  445. u32 portsc)
  446. {
  447. int ret;
  448. ret = scnprintf(str, size, "%s %s %s Link:%s PortSpeed:%d ",
  449. portsc & PORT_POWER ? "Powered" : "Powered-off",
  450. portsc & PORT_CONNECT ? "Connected" : "Not-connected",
  451. portsc & PORT_PED ? "Enabled" : "Disabled",
  452. cdnsp_portsc_link_state_string(portsc),
  453. DEV_PORT_SPEED(portsc));
  454. if (portsc & PORT_RESET)
  455. ret += scnprintf(str + ret, size - ret, "In-Reset ");
  456. ret += scnprintf(str + ret, size - ret, "Change: ");
  457. if (portsc & PORT_CSC)
  458. ret += scnprintf(str + ret, size - ret, "CSC ");
  459. if (portsc & PORT_WRC)
  460. ret += scnprintf(str + ret, size - ret, "WRC ");
  461. if (portsc & PORT_RC)
  462. ret += scnprintf(str + ret, size - ret, "PRC ");
  463. if (portsc & PORT_PLC)
  464. ret += scnprintf(str + ret, size - ret, "PLC ");
  465. if (portsc & PORT_CEC)
  466. ret += scnprintf(str + ret, size - ret, "CEC ");
  467. ret += scnprintf(str + ret, size - ret, "Wake: ");
  468. if (portsc & PORT_WKCONN_E)
  469. ret += scnprintf(str + ret, size - ret, "WCE ");
  470. if (portsc & PORT_WKDISC_E)
  471. ret += scnprintf(str + ret, size - ret, "WDE ");
  472. return str;
  473. }
  474. static inline const char *cdnsp_ep_state_string(u8 state)
  475. {
  476. switch (state) {
  477. case EP_STATE_DISABLED:
  478. return "disabled";
  479. case EP_STATE_RUNNING:
  480. return "running";
  481. case EP_STATE_HALTED:
  482. return "halted";
  483. case EP_STATE_STOPPED:
  484. return "stopped";
  485. case EP_STATE_ERROR:
  486. return "error";
  487. default:
  488. return "INVALID";
  489. }
  490. }
  491. static inline const char *cdnsp_ep_type_string(u8 type)
  492. {
  493. switch (type) {
  494. case ISOC_OUT_EP:
  495. return "Isoc OUT";
  496. case BULK_OUT_EP:
  497. return "Bulk OUT";
  498. case INT_OUT_EP:
  499. return "Int OUT";
  500. case CTRL_EP:
  501. return "Ctrl";
  502. case ISOC_IN_EP:
  503. return "Isoc IN";
  504. case BULK_IN_EP:
  505. return "Bulk IN";
  506. case INT_IN_EP:
  507. return "Int IN";
  508. default:
  509. return "INVALID";
  510. }
  511. }
  512. static inline const char *cdnsp_decode_ep_context(char *str, size_t size,
  513. u32 info, u32 info2,
  514. u64 deq, u32 tx_info)
  515. {
  516. u8 max_pstr, ep_state, interval, ep_type, burst, cerr, mult;
  517. bool lsa, hid;
  518. u16 maxp, avg;
  519. u32 esit;
  520. int ret;
  521. esit = CTX_TO_MAX_ESIT_PAYLOAD_HI(info) << 16 |
  522. CTX_TO_MAX_ESIT_PAYLOAD_LO(tx_info);
  523. ep_state = info & EP_STATE_MASK;
  524. max_pstr = CTX_TO_EP_MAXPSTREAMS(info);
  525. interval = CTX_TO_EP_INTERVAL(info);
  526. mult = CTX_TO_EP_MULT(info) + 1;
  527. lsa = !!(info & EP_HAS_LSA);
  528. cerr = (info2 & (3 << 1)) >> 1;
  529. ep_type = CTX_TO_EP_TYPE(info2);
  530. hid = !!(info2 & (1 << 7));
  531. burst = CTX_TO_MAX_BURST(info2);
  532. maxp = MAX_PACKET_DECODED(info2);
  533. avg = EP_AVG_TRB_LENGTH(tx_info);
  534. ret = scnprintf(str, size, "State %s mult %d max P. Streams %d %s",
  535. cdnsp_ep_state_string(ep_state), mult,
  536. max_pstr, lsa ? "LSA " : "");
  537. ret += scnprintf(str + ret, size - ret,
  538. "interval %d us max ESIT payload %d CErr %d ",
  539. (1 << interval) * 125, esit, cerr);
  540. ret += scnprintf(str + ret, size - ret,
  541. "Type %s %sburst %d maxp %d deq %016llx ",
  542. cdnsp_ep_type_string(ep_type), hid ? "HID" : "",
  543. burst, maxp, deq);
  544. ret += scnprintf(str + ret, size - ret, "avg trb len %d", avg);
  545. return str;
  546. }
  547. #endif /*__LINUX_CDNSP_DEBUG*/