752-19-v6.7-net-ethernet-mtk_wed-debugfs-add-WED-3.0-debugfs-ent.patch 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432
  1. From: Sujuan Chen <[email protected]>
  2. Date: Mon, 18 Sep 2023 12:29:18 +0200
  3. Subject: [PATCH] net: ethernet: mtk_wed: debugfs: add WED 3.0 debugfs entries
  4. Introduce WED3.0 debugfs entries useful for debugging.
  5. Co-developed-by: Lorenzo Bianconi <[email protected]>
  6. Signed-off-by: Lorenzo Bianconi <[email protected]>
  7. Signed-off-by: Sujuan Chen <[email protected]>
  8. Signed-off-by: Paolo Abeni <[email protected]>
  9. ---
  10. --- a/drivers/net/ethernet/mediatek/mtk_wed_debugfs.c
  11. +++ b/drivers/net/ethernet/mediatek/mtk_wed_debugfs.c
  12. @@ -11,6 +11,7 @@ struct reg_dump {
  13. u16 offset;
  14. u8 type;
  15. u8 base;
  16. + u32 mask;
  17. };
  18. enum {
  19. @@ -25,6 +26,8 @@ enum {
  20. #define DUMP_STR(_str) { _str, 0, DUMP_TYPE_STRING }
  21. #define DUMP_REG(_reg, ...) { #_reg, MTK_##_reg, __VA_ARGS__ }
  22. +#define DUMP_REG_MASK(_reg, _mask) \
  23. + { #_mask, MTK_##_reg, DUMP_TYPE_WED, 0, MTK_##_mask }
  24. #define DUMP_RING(_prefix, _base, ...) \
  25. { _prefix " BASE", _base, __VA_ARGS__ }, \
  26. { _prefix " CNT", _base + 0x4, __VA_ARGS__ }, \
  27. @@ -32,6 +35,7 @@ enum {
  28. { _prefix " DIDX", _base + 0xc, __VA_ARGS__ }
  29. #define DUMP_WED(_reg) DUMP_REG(_reg, DUMP_TYPE_WED)
  30. +#define DUMP_WED_MASK(_reg, _mask) DUMP_REG_MASK(_reg, _mask)
  31. #define DUMP_WED_RING(_base) DUMP_RING(#_base, MTK_##_base, DUMP_TYPE_WED)
  32. #define DUMP_WDMA(_reg) DUMP_REG(_reg, DUMP_TYPE_WDMA)
  33. @@ -212,12 +216,58 @@ wed_rxinfo_show(struct seq_file *s, void
  34. DUMP_WED(WED_RTQM_Q2B_MIB),
  35. DUMP_WED(WED_RTQM_PFDBK_MIB),
  36. };
  37. + static const struct reg_dump regs_wed_v3[] = {
  38. + DUMP_STR("WED RX RRO DATA"),
  39. + DUMP_WED_RING(WED_RRO_RX_D_RX(0)),
  40. + DUMP_WED_RING(WED_RRO_RX_D_RX(1)),
  41. +
  42. + DUMP_STR("WED RX MSDU PAGE"),
  43. + DUMP_WED_RING(WED_RRO_MSDU_PG_CTRL0(0)),
  44. + DUMP_WED_RING(WED_RRO_MSDU_PG_CTRL0(1)),
  45. + DUMP_WED_RING(WED_RRO_MSDU_PG_CTRL0(2)),
  46. +
  47. + DUMP_STR("WED RX IND CMD"),
  48. + DUMP_WED(WED_IND_CMD_RX_CTRL1),
  49. + DUMP_WED_MASK(WED_IND_CMD_RX_CTRL2, WED_IND_CMD_MAX_CNT),
  50. + DUMP_WED_MASK(WED_IND_CMD_RX_CTRL0, WED_IND_CMD_PROC_IDX),
  51. + DUMP_WED_MASK(RRO_IND_CMD_SIGNATURE, RRO_IND_CMD_DMA_IDX),
  52. + DUMP_WED_MASK(WED_IND_CMD_RX_CTRL0, WED_IND_CMD_MAGIC_CNT),
  53. + DUMP_WED_MASK(RRO_IND_CMD_SIGNATURE, RRO_IND_CMD_MAGIC_CNT),
  54. + DUMP_WED_MASK(WED_IND_CMD_RX_CTRL0,
  55. + WED_IND_CMD_PREFETCH_FREE_CNT),
  56. + DUMP_WED_MASK(WED_RRO_CFG1, WED_RRO_CFG1_PARTICL_SE_ID),
  57. +
  58. + DUMP_STR("WED ADDR ELEM"),
  59. + DUMP_WED(WED_ADDR_ELEM_CFG0),
  60. + DUMP_WED_MASK(WED_ADDR_ELEM_CFG1,
  61. + WED_ADDR_ELEM_PREFETCH_FREE_CNT),
  62. +
  63. + DUMP_STR("WED Route QM"),
  64. + DUMP_WED(WED_RTQM_ENQ_I2Q_DMAD_CNT),
  65. + DUMP_WED(WED_RTQM_ENQ_I2N_DMAD_CNT),
  66. + DUMP_WED(WED_RTQM_ENQ_I2Q_PKT_CNT),
  67. + DUMP_WED(WED_RTQM_ENQ_I2N_PKT_CNT),
  68. + DUMP_WED(WED_RTQM_ENQ_USED_ENTRY_CNT),
  69. + DUMP_WED(WED_RTQM_ENQ_ERR_CNT),
  70. +
  71. + DUMP_WED(WED_RTQM_DEQ_DMAD_CNT),
  72. + DUMP_WED(WED_RTQM_DEQ_Q2I_DMAD_CNT),
  73. + DUMP_WED(WED_RTQM_DEQ_PKT_CNT),
  74. + DUMP_WED(WED_RTQM_DEQ_Q2I_PKT_CNT),
  75. + DUMP_WED(WED_RTQM_DEQ_USED_PFDBK_CNT),
  76. + DUMP_WED(WED_RTQM_DEQ_ERR_CNT),
  77. + };
  78. struct mtk_wed_hw *hw = s->private;
  79. struct mtk_wed_device *dev = hw->wed_dev;
  80. if (dev) {
  81. dump_wed_regs(s, dev, regs_common, ARRAY_SIZE(regs_common));
  82. - dump_wed_regs(s, dev, regs_wed_v2, ARRAY_SIZE(regs_wed_v2));
  83. + if (mtk_wed_is_v2(hw))
  84. + dump_wed_regs(s, dev,
  85. + regs_wed_v2, ARRAY_SIZE(regs_wed_v2));
  86. + else
  87. + dump_wed_regs(s, dev,
  88. + regs_wed_v3, ARRAY_SIZE(regs_wed_v3));
  89. }
  90. return 0;
  91. @@ -225,6 +275,314 @@ wed_rxinfo_show(struct seq_file *s, void
  92. DEFINE_SHOW_ATTRIBUTE(wed_rxinfo);
  93. static int
  94. +wed_amsdu_show(struct seq_file *s, void *data)
  95. +{
  96. + static const struct reg_dump regs[] = {
  97. + DUMP_STR("WED AMDSU INFO"),
  98. + DUMP_WED(WED_MON_AMSDU_FIFO_DMAD),
  99. +
  100. + DUMP_STR("WED AMDSU ENG0 INFO"),
  101. + DUMP_WED(WED_MON_AMSDU_ENG_DMAD(0)),
  102. + DUMP_WED(WED_MON_AMSDU_ENG_QFPL(0)),
  103. + DUMP_WED(WED_MON_AMSDU_ENG_QENI(0)),
  104. + DUMP_WED(WED_MON_AMSDU_ENG_QENO(0)),
  105. + DUMP_WED(WED_MON_AMSDU_ENG_MERG(0)),
  106. + DUMP_WED_MASK(WED_MON_AMSDU_ENG_CNT8(0),
  107. + WED_AMSDU_ENG_MAX_PL_CNT),
  108. + DUMP_WED_MASK(WED_MON_AMSDU_ENG_CNT8(0),
  109. + WED_AMSDU_ENG_MAX_QGPP_CNT),
  110. + DUMP_WED_MASK(WED_MON_AMSDU_ENG_CNT9(0),
  111. + WED_AMSDU_ENG_CUR_ENTRY),
  112. + DUMP_WED_MASK(WED_MON_AMSDU_ENG_CNT9(0),
  113. + WED_AMSDU_ENG_MAX_BUF_MERGED),
  114. + DUMP_WED_MASK(WED_MON_AMSDU_ENG_CNT9(0),
  115. + WED_AMSDU_ENG_MAX_MSDU_MERGED),
  116. +
  117. + DUMP_STR("WED AMDSU ENG1 INFO"),
  118. + DUMP_WED(WED_MON_AMSDU_ENG_DMAD(1)),
  119. + DUMP_WED(WED_MON_AMSDU_ENG_QFPL(1)),
  120. + DUMP_WED(WED_MON_AMSDU_ENG_QENI(1)),
  121. + DUMP_WED(WED_MON_AMSDU_ENG_QENO(1)),
  122. + DUMP_WED(WED_MON_AMSDU_ENG_MERG(1)),
  123. + DUMP_WED_MASK(WED_MON_AMSDU_ENG_CNT8(1),
  124. + WED_AMSDU_ENG_MAX_PL_CNT),
  125. + DUMP_WED_MASK(WED_MON_AMSDU_ENG_CNT8(1),
  126. + WED_AMSDU_ENG_MAX_QGPP_CNT),
  127. + DUMP_WED_MASK(WED_MON_AMSDU_ENG_CNT9(1),
  128. + WED_AMSDU_ENG_CUR_ENTRY),
  129. + DUMP_WED_MASK(WED_MON_AMSDU_ENG_CNT9(2),
  130. + WED_AMSDU_ENG_MAX_BUF_MERGED),
  131. + DUMP_WED_MASK(WED_MON_AMSDU_ENG_CNT9(2),
  132. + WED_AMSDU_ENG_MAX_MSDU_MERGED),
  133. +
  134. + DUMP_STR("WED AMDSU ENG2 INFO"),
  135. + DUMP_WED(WED_MON_AMSDU_ENG_DMAD(2)),
  136. + DUMP_WED(WED_MON_AMSDU_ENG_QFPL(2)),
  137. + DUMP_WED(WED_MON_AMSDU_ENG_QENI(2)),
  138. + DUMP_WED(WED_MON_AMSDU_ENG_QENO(2)),
  139. + DUMP_WED(WED_MON_AMSDU_ENG_MERG(2)),
  140. + DUMP_WED_MASK(WED_MON_AMSDU_ENG_CNT8(2),
  141. + WED_AMSDU_ENG_MAX_PL_CNT),
  142. + DUMP_WED_MASK(WED_MON_AMSDU_ENG_CNT8(2),
  143. + WED_AMSDU_ENG_MAX_QGPP_CNT),
  144. + DUMP_WED_MASK(WED_MON_AMSDU_ENG_CNT9(2),
  145. + WED_AMSDU_ENG_CUR_ENTRY),
  146. + DUMP_WED_MASK(WED_MON_AMSDU_ENG_CNT9(2),
  147. + WED_AMSDU_ENG_MAX_BUF_MERGED),
  148. + DUMP_WED_MASK(WED_MON_AMSDU_ENG_CNT9(2),
  149. + WED_AMSDU_ENG_MAX_MSDU_MERGED),
  150. +
  151. + DUMP_STR("WED AMDSU ENG3 INFO"),
  152. + DUMP_WED(WED_MON_AMSDU_ENG_DMAD(3)),
  153. + DUMP_WED(WED_MON_AMSDU_ENG_QFPL(3)),
  154. + DUMP_WED(WED_MON_AMSDU_ENG_QENI(3)),
  155. + DUMP_WED(WED_MON_AMSDU_ENG_QENO(3)),
  156. + DUMP_WED(WED_MON_AMSDU_ENG_MERG(3)),
  157. + DUMP_WED_MASK(WED_MON_AMSDU_ENG_CNT8(3),
  158. + WED_AMSDU_ENG_MAX_PL_CNT),
  159. + DUMP_WED_MASK(WED_MON_AMSDU_ENG_CNT8(3),
  160. + WED_AMSDU_ENG_MAX_QGPP_CNT),
  161. + DUMP_WED_MASK(WED_MON_AMSDU_ENG_CNT9(3),
  162. + WED_AMSDU_ENG_CUR_ENTRY),
  163. + DUMP_WED_MASK(WED_MON_AMSDU_ENG_CNT9(3),
  164. + WED_AMSDU_ENG_MAX_BUF_MERGED),
  165. + DUMP_WED_MASK(WED_MON_AMSDU_ENG_CNT9(3),
  166. + WED_AMSDU_ENG_MAX_MSDU_MERGED),
  167. +
  168. + DUMP_STR("WED AMDSU ENG4 INFO"),
  169. + DUMP_WED(WED_MON_AMSDU_ENG_DMAD(4)),
  170. + DUMP_WED(WED_MON_AMSDU_ENG_QFPL(4)),
  171. + DUMP_WED(WED_MON_AMSDU_ENG_QENI(4)),
  172. + DUMP_WED(WED_MON_AMSDU_ENG_QENO(4)),
  173. + DUMP_WED(WED_MON_AMSDU_ENG_MERG(4)),
  174. + DUMP_WED_MASK(WED_MON_AMSDU_ENG_CNT8(4),
  175. + WED_AMSDU_ENG_MAX_PL_CNT),
  176. + DUMP_WED_MASK(WED_MON_AMSDU_ENG_CNT8(4),
  177. + WED_AMSDU_ENG_MAX_QGPP_CNT),
  178. + DUMP_WED_MASK(WED_MON_AMSDU_ENG_CNT9(4),
  179. + WED_AMSDU_ENG_CUR_ENTRY),
  180. + DUMP_WED_MASK(WED_MON_AMSDU_ENG_CNT9(4),
  181. + WED_AMSDU_ENG_MAX_BUF_MERGED),
  182. + DUMP_WED_MASK(WED_MON_AMSDU_ENG_CNT9(4),
  183. + WED_AMSDU_ENG_MAX_MSDU_MERGED),
  184. +
  185. + DUMP_STR("WED AMDSU ENG5 INFO"),
  186. + DUMP_WED(WED_MON_AMSDU_ENG_DMAD(5)),
  187. + DUMP_WED(WED_MON_AMSDU_ENG_QFPL(5)),
  188. + DUMP_WED(WED_MON_AMSDU_ENG_QENI(5)),
  189. + DUMP_WED(WED_MON_AMSDU_ENG_QENO(5)),
  190. + DUMP_WED(WED_MON_AMSDU_ENG_MERG(5)),
  191. + DUMP_WED_MASK(WED_MON_AMSDU_ENG_CNT8(5),
  192. + WED_AMSDU_ENG_MAX_PL_CNT),
  193. + DUMP_WED_MASK(WED_MON_AMSDU_ENG_CNT8(5),
  194. + WED_AMSDU_ENG_MAX_QGPP_CNT),
  195. + DUMP_WED_MASK(WED_MON_AMSDU_ENG_CNT9(5),
  196. + WED_AMSDU_ENG_CUR_ENTRY),
  197. + DUMP_WED_MASK(WED_MON_AMSDU_ENG_CNT9(5),
  198. + WED_AMSDU_ENG_MAX_BUF_MERGED),
  199. + DUMP_WED_MASK(WED_MON_AMSDU_ENG_CNT9(5),
  200. + WED_AMSDU_ENG_MAX_MSDU_MERGED),
  201. +
  202. + DUMP_STR("WED AMDSU ENG6 INFO"),
  203. + DUMP_WED(WED_MON_AMSDU_ENG_DMAD(6)),
  204. + DUMP_WED(WED_MON_AMSDU_ENG_QFPL(6)),
  205. + DUMP_WED(WED_MON_AMSDU_ENG_QENI(6)),
  206. + DUMP_WED(WED_MON_AMSDU_ENG_QENO(6)),
  207. + DUMP_WED(WED_MON_AMSDU_ENG_MERG(6)),
  208. + DUMP_WED_MASK(WED_MON_AMSDU_ENG_CNT8(6),
  209. + WED_AMSDU_ENG_MAX_PL_CNT),
  210. + DUMP_WED_MASK(WED_MON_AMSDU_ENG_CNT8(6),
  211. + WED_AMSDU_ENG_MAX_QGPP_CNT),
  212. + DUMP_WED_MASK(WED_MON_AMSDU_ENG_CNT9(6),
  213. + WED_AMSDU_ENG_CUR_ENTRY),
  214. + DUMP_WED_MASK(WED_MON_AMSDU_ENG_CNT9(6),
  215. + WED_AMSDU_ENG_MAX_BUF_MERGED),
  216. + DUMP_WED_MASK(WED_MON_AMSDU_ENG_CNT9(6),
  217. + WED_AMSDU_ENG_MAX_MSDU_MERGED),
  218. +
  219. + DUMP_STR("WED AMDSU ENG7 INFO"),
  220. + DUMP_WED(WED_MON_AMSDU_ENG_DMAD(7)),
  221. + DUMP_WED(WED_MON_AMSDU_ENG_QFPL(7)),
  222. + DUMP_WED(WED_MON_AMSDU_ENG_QENI(7)),
  223. + DUMP_WED(WED_MON_AMSDU_ENG_QENO(7)),
  224. + DUMP_WED(WED_MON_AMSDU_ENG_MERG(7)),
  225. + DUMP_WED_MASK(WED_MON_AMSDU_ENG_CNT8(7),
  226. + WED_AMSDU_ENG_MAX_PL_CNT),
  227. + DUMP_WED_MASK(WED_MON_AMSDU_ENG_CNT8(7),
  228. + WED_AMSDU_ENG_MAX_QGPP_CNT),
  229. + DUMP_WED_MASK(WED_MON_AMSDU_ENG_CNT9(7),
  230. + WED_AMSDU_ENG_CUR_ENTRY),
  231. + DUMP_WED_MASK(WED_MON_AMSDU_ENG_CNT9(7),
  232. + WED_AMSDU_ENG_MAX_BUF_MERGED),
  233. + DUMP_WED_MASK(WED_MON_AMSDU_ENG_CNT9(4),
  234. + WED_AMSDU_ENG_MAX_MSDU_MERGED),
  235. +
  236. + DUMP_STR("WED AMDSU ENG8 INFO"),
  237. + DUMP_WED(WED_MON_AMSDU_ENG_DMAD(8)),
  238. + DUMP_WED(WED_MON_AMSDU_ENG_QFPL(8)),
  239. + DUMP_WED(WED_MON_AMSDU_ENG_QENI(8)),
  240. + DUMP_WED(WED_MON_AMSDU_ENG_QENO(8)),
  241. + DUMP_WED(WED_MON_AMSDU_ENG_MERG(8)),
  242. + DUMP_WED_MASK(WED_MON_AMSDU_ENG_CNT8(8),
  243. + WED_AMSDU_ENG_MAX_PL_CNT),
  244. + DUMP_WED_MASK(WED_MON_AMSDU_ENG_CNT8(8),
  245. + WED_AMSDU_ENG_MAX_QGPP_CNT),
  246. + DUMP_WED_MASK(WED_MON_AMSDU_ENG_CNT9(8),
  247. + WED_AMSDU_ENG_CUR_ENTRY),
  248. + DUMP_WED_MASK(WED_MON_AMSDU_ENG_CNT9(8),
  249. + WED_AMSDU_ENG_MAX_BUF_MERGED),
  250. + DUMP_WED_MASK(WED_MON_AMSDU_ENG_CNT9(8),
  251. + WED_AMSDU_ENG_MAX_MSDU_MERGED),
  252. +
  253. + DUMP_STR("WED QMEM INFO"),
  254. + DUMP_WED_MASK(WED_MON_AMSDU_QMEM_CNT(0), WED_AMSDU_QMEM_FQ_CNT),
  255. + DUMP_WED_MASK(WED_MON_AMSDU_QMEM_CNT(0), WED_AMSDU_QMEM_SP_QCNT),
  256. + DUMP_WED_MASK(WED_MON_AMSDU_QMEM_CNT(1), WED_AMSDU_QMEM_TID0_QCNT),
  257. + DUMP_WED_MASK(WED_MON_AMSDU_QMEM_CNT(1), WED_AMSDU_QMEM_TID1_QCNT),
  258. + DUMP_WED_MASK(WED_MON_AMSDU_QMEM_CNT(2), WED_AMSDU_QMEM_TID2_QCNT),
  259. + DUMP_WED_MASK(WED_MON_AMSDU_QMEM_CNT(2), WED_AMSDU_QMEM_TID3_QCNT),
  260. + DUMP_WED_MASK(WED_MON_AMSDU_QMEM_CNT(3), WED_AMSDU_QMEM_TID4_QCNT),
  261. + DUMP_WED_MASK(WED_MON_AMSDU_QMEM_CNT(3), WED_AMSDU_QMEM_TID5_QCNT),
  262. + DUMP_WED_MASK(WED_MON_AMSDU_QMEM_CNT(4), WED_AMSDU_QMEM_TID6_QCNT),
  263. + DUMP_WED_MASK(WED_MON_AMSDU_QMEM_CNT(4), WED_AMSDU_QMEM_TID7_QCNT),
  264. +
  265. + DUMP_STR("WED QMEM HEAD INFO"),
  266. + DUMP_WED_MASK(WED_MON_AMSDU_QMEM_PTR(0), WED_AMSDU_QMEM_FQ_HEAD),
  267. + DUMP_WED_MASK(WED_MON_AMSDU_QMEM_PTR(0), WED_AMSDU_QMEM_SP_QHEAD),
  268. + DUMP_WED_MASK(WED_MON_AMSDU_QMEM_PTR(1), WED_AMSDU_QMEM_TID0_QHEAD),
  269. + DUMP_WED_MASK(WED_MON_AMSDU_QMEM_PTR(1), WED_AMSDU_QMEM_TID1_QHEAD),
  270. + DUMP_WED_MASK(WED_MON_AMSDU_QMEM_PTR(2), WED_AMSDU_QMEM_TID2_QHEAD),
  271. + DUMP_WED_MASK(WED_MON_AMSDU_QMEM_PTR(2), WED_AMSDU_QMEM_TID3_QHEAD),
  272. + DUMP_WED_MASK(WED_MON_AMSDU_QMEM_PTR(3), WED_AMSDU_QMEM_TID4_QHEAD),
  273. + DUMP_WED_MASK(WED_MON_AMSDU_QMEM_PTR(3), WED_AMSDU_QMEM_TID5_QHEAD),
  274. + DUMP_WED_MASK(WED_MON_AMSDU_QMEM_PTR(4), WED_AMSDU_QMEM_TID6_QHEAD),
  275. + DUMP_WED_MASK(WED_MON_AMSDU_QMEM_PTR(4), WED_AMSDU_QMEM_TID7_QHEAD),
  276. +
  277. + DUMP_STR("WED QMEM TAIL INFO"),
  278. + DUMP_WED_MASK(WED_MON_AMSDU_QMEM_PTR(5), WED_AMSDU_QMEM_FQ_TAIL),
  279. + DUMP_WED_MASK(WED_MON_AMSDU_QMEM_PTR(5), WED_AMSDU_QMEM_SP_QTAIL),
  280. + DUMP_WED_MASK(WED_MON_AMSDU_QMEM_PTR(6), WED_AMSDU_QMEM_TID0_QTAIL),
  281. + DUMP_WED_MASK(WED_MON_AMSDU_QMEM_PTR(6), WED_AMSDU_QMEM_TID1_QTAIL),
  282. + DUMP_WED_MASK(WED_MON_AMSDU_QMEM_PTR(7), WED_AMSDU_QMEM_TID2_QTAIL),
  283. + DUMP_WED_MASK(WED_MON_AMSDU_QMEM_PTR(7), WED_AMSDU_QMEM_TID3_QTAIL),
  284. + DUMP_WED_MASK(WED_MON_AMSDU_QMEM_PTR(8), WED_AMSDU_QMEM_TID4_QTAIL),
  285. + DUMP_WED_MASK(WED_MON_AMSDU_QMEM_PTR(8), WED_AMSDU_QMEM_TID5_QTAIL),
  286. + DUMP_WED_MASK(WED_MON_AMSDU_QMEM_PTR(9), WED_AMSDU_QMEM_TID6_QTAIL),
  287. + DUMP_WED_MASK(WED_MON_AMSDU_QMEM_PTR(9), WED_AMSDU_QMEM_TID7_QTAIL),
  288. +
  289. + DUMP_STR("WED HIFTXD MSDU INFO"),
  290. + DUMP_WED(WED_MON_AMSDU_HIFTXD_FETCH_MSDU(1)),
  291. + DUMP_WED(WED_MON_AMSDU_HIFTXD_FETCH_MSDU(2)),
  292. + DUMP_WED(WED_MON_AMSDU_HIFTXD_FETCH_MSDU(3)),
  293. + DUMP_WED(WED_MON_AMSDU_HIFTXD_FETCH_MSDU(4)),
  294. + DUMP_WED(WED_MON_AMSDU_HIFTXD_FETCH_MSDU(5)),
  295. + DUMP_WED(WED_MON_AMSDU_HIFTXD_FETCH_MSDU(6)),
  296. + DUMP_WED(WED_MON_AMSDU_HIFTXD_FETCH_MSDU(7)),
  297. + DUMP_WED(WED_MON_AMSDU_HIFTXD_FETCH_MSDU(8)),
  298. + DUMP_WED(WED_MON_AMSDU_HIFTXD_FETCH_MSDU(9)),
  299. + DUMP_WED(WED_MON_AMSDU_HIFTXD_FETCH_MSDU(10)),
  300. + DUMP_WED(WED_MON_AMSDU_HIFTXD_FETCH_MSDU(11)),
  301. + DUMP_WED(WED_MON_AMSDU_HIFTXD_FETCH_MSDU(12)),
  302. + DUMP_WED(WED_MON_AMSDU_HIFTXD_FETCH_MSDU(13)),
  303. + };
  304. + struct mtk_wed_hw *hw = s->private;
  305. + struct mtk_wed_device *dev = hw->wed_dev;
  306. +
  307. + if (dev)
  308. + dump_wed_regs(s, dev, regs, ARRAY_SIZE(regs));
  309. +
  310. + return 0;
  311. +}
  312. +DEFINE_SHOW_ATTRIBUTE(wed_amsdu);
  313. +
  314. +static int
  315. +wed_rtqm_show(struct seq_file *s, void *data)
  316. +{
  317. + static const struct reg_dump regs[] = {
  318. + DUMP_STR("WED Route QM IGRS0(N2H + Recycle)"),
  319. + DUMP_WED(WED_RTQM_IGRS0_I2HW_DMAD_CNT),
  320. + DUMP_WED(WED_RTQM_IGRS0_I2H_DMAD_CNT(0)),
  321. + DUMP_WED(WED_RTQM_IGRS0_I2H_DMAD_CNT(1)),
  322. + DUMP_WED(WED_RTQM_IGRS0_I2HW_PKT_CNT),
  323. + DUMP_WED(WED_RTQM_IGRS0_I2H_PKT_CNT(0)),
  324. + DUMP_WED(WED_RTQM_IGRS0_I2H_PKT_CNT(0)),
  325. + DUMP_WED(WED_RTQM_IGRS0_FDROP_CNT),
  326. +
  327. + DUMP_STR("WED Route QM IGRS1(Legacy)"),
  328. + DUMP_WED(WED_RTQM_IGRS1_I2HW_DMAD_CNT),
  329. + DUMP_WED(WED_RTQM_IGRS1_I2H_DMAD_CNT(0)),
  330. + DUMP_WED(WED_RTQM_IGRS1_I2H_DMAD_CNT(1)),
  331. + DUMP_WED(WED_RTQM_IGRS1_I2HW_PKT_CNT),
  332. + DUMP_WED(WED_RTQM_IGRS1_I2H_PKT_CNT(0)),
  333. + DUMP_WED(WED_RTQM_IGRS1_I2H_PKT_CNT(1)),
  334. + DUMP_WED(WED_RTQM_IGRS1_FDROP_CNT),
  335. +
  336. + DUMP_STR("WED Route QM IGRS2(RRO3.0)"),
  337. + DUMP_WED(WED_RTQM_IGRS2_I2HW_DMAD_CNT),
  338. + DUMP_WED(WED_RTQM_IGRS2_I2H_DMAD_CNT(0)),
  339. + DUMP_WED(WED_RTQM_IGRS2_I2H_DMAD_CNT(1)),
  340. + DUMP_WED(WED_RTQM_IGRS2_I2HW_PKT_CNT),
  341. + DUMP_WED(WED_RTQM_IGRS2_I2H_PKT_CNT(0)),
  342. + DUMP_WED(WED_RTQM_IGRS2_I2H_PKT_CNT(1)),
  343. + DUMP_WED(WED_RTQM_IGRS2_FDROP_CNT),
  344. +
  345. + DUMP_STR("WED Route QM IGRS3(DEBUG)"),
  346. + DUMP_WED(WED_RTQM_IGRS2_I2HW_DMAD_CNT),
  347. + DUMP_WED(WED_RTQM_IGRS3_I2H_DMAD_CNT(0)),
  348. + DUMP_WED(WED_RTQM_IGRS3_I2H_DMAD_CNT(1)),
  349. + DUMP_WED(WED_RTQM_IGRS3_I2HW_PKT_CNT),
  350. + DUMP_WED(WED_RTQM_IGRS3_I2H_PKT_CNT(0)),
  351. + DUMP_WED(WED_RTQM_IGRS3_I2H_PKT_CNT(1)),
  352. + DUMP_WED(WED_RTQM_IGRS3_FDROP_CNT),
  353. + };
  354. + struct mtk_wed_hw *hw = s->private;
  355. + struct mtk_wed_device *dev = hw->wed_dev;
  356. +
  357. + if (dev)
  358. + dump_wed_regs(s, dev, regs, ARRAY_SIZE(regs));
  359. +
  360. + return 0;
  361. +}
  362. +DEFINE_SHOW_ATTRIBUTE(wed_rtqm);
  363. +
  364. +static int
  365. +wed_rro_show(struct seq_file *s, void *data)
  366. +{
  367. + static const struct reg_dump regs[] = {
  368. + DUMP_STR("RRO/IND CMD CNT"),
  369. + DUMP_WED(WED_RX_IND_CMD_CNT(1)),
  370. + DUMP_WED(WED_RX_IND_CMD_CNT(2)),
  371. + DUMP_WED(WED_RX_IND_CMD_CNT(3)),
  372. + DUMP_WED(WED_RX_IND_CMD_CNT(4)),
  373. + DUMP_WED(WED_RX_IND_CMD_CNT(5)),
  374. + DUMP_WED(WED_RX_IND_CMD_CNT(6)),
  375. + DUMP_WED(WED_RX_IND_CMD_CNT(7)),
  376. + DUMP_WED(WED_RX_IND_CMD_CNT(8)),
  377. + DUMP_WED_MASK(WED_RX_IND_CMD_CNT(9),
  378. + WED_IND_CMD_MAGIC_CNT_FAIL_CNT),
  379. +
  380. + DUMP_WED(WED_RX_ADDR_ELEM_CNT(0)),
  381. + DUMP_WED_MASK(WED_RX_ADDR_ELEM_CNT(1),
  382. + WED_ADDR_ELEM_SIG_FAIL_CNT),
  383. + DUMP_WED(WED_RX_MSDU_PG_CNT(1)),
  384. + DUMP_WED(WED_RX_MSDU_PG_CNT(2)),
  385. + DUMP_WED(WED_RX_MSDU_PG_CNT(3)),
  386. + DUMP_WED(WED_RX_MSDU_PG_CNT(4)),
  387. + DUMP_WED(WED_RX_MSDU_PG_CNT(5)),
  388. + DUMP_WED_MASK(WED_RX_PN_CHK_CNT,
  389. + WED_PN_CHK_FAIL_CNT),
  390. + };
  391. + struct mtk_wed_hw *hw = s->private;
  392. + struct mtk_wed_device *dev = hw->wed_dev;
  393. +
  394. + if (dev)
  395. + dump_wed_regs(s, dev, regs, ARRAY_SIZE(regs));
  396. +
  397. + return 0;
  398. +}
  399. +DEFINE_SHOW_ATTRIBUTE(wed_rro);
  400. +
  401. +static int
  402. mtk_wed_reg_set(void *data, u64 val)
  403. {
  404. struct mtk_wed_hw *hw = data;
  405. @@ -264,7 +622,16 @@ void mtk_wed_hw_add_debugfs(struct mtk_w
  406. debugfs_create_u32("regidx", 0600, dir, &hw->debugfs_reg);
  407. debugfs_create_file_unsafe("regval", 0600, dir, hw, &fops_regval);
  408. debugfs_create_file_unsafe("txinfo", 0400, dir, hw, &wed_txinfo_fops);
  409. - if (!mtk_wed_is_v1(hw))
  410. + if (!mtk_wed_is_v1(hw)) {
  411. debugfs_create_file_unsafe("rxinfo", 0400, dir, hw,
  412. &wed_rxinfo_fops);
  413. + if (mtk_wed_is_v3_or_greater(hw)) {
  414. + debugfs_create_file_unsafe("amsdu", 0400, dir, hw,
  415. + &wed_amsdu_fops);
  416. + debugfs_create_file_unsafe("rtqm", 0400, dir, hw,
  417. + &wed_rtqm_fops);
  418. + debugfs_create_file_unsafe("rro", 0400, dir, hw,
  419. + &wed_rro_fops);
  420. + }
  421. + }
  422. }