debug.c 76 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701
  1. // SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
  2. /* Copyright(c) 2019-2020 Realtek Corporation
  3. */
  4. #include <linux/vmalloc.h>
  5. #include "coex.h"
  6. #include "debug.h"
  7. #include "fw.h"
  8. #include "mac.h"
  9. #include "ps.h"
  10. #include "reg.h"
  11. #include "sar.h"
  12. #ifdef CONFIG_RTW89_DEBUGMSG
  13. unsigned int rtw89_debug_mask;
  14. EXPORT_SYMBOL(rtw89_debug_mask);
  15. module_param_named(debug_mask, rtw89_debug_mask, uint, 0644);
  16. MODULE_PARM_DESC(debug_mask, "Debugging mask");
  17. #endif
  18. #ifdef CONFIG_RTW89_DEBUGFS
  19. struct rtw89_debugfs_priv {
  20. struct rtw89_dev *rtwdev;
  21. int (*cb_read)(struct seq_file *m, void *v);
  22. ssize_t (*cb_write)(struct file *filp, const char __user *buffer,
  23. size_t count, loff_t *loff);
  24. union {
  25. u32 cb_data;
  26. struct {
  27. u32 addr;
  28. u8 len;
  29. } read_reg;
  30. struct {
  31. u32 addr;
  32. u32 mask;
  33. u8 path;
  34. } read_rf;
  35. struct {
  36. u8 ss_dbg:1;
  37. u8 dle_dbg:1;
  38. u8 dmac_dbg:1;
  39. u8 cmac_dbg:1;
  40. u8 dbg_port:1;
  41. } dbgpkg_en;
  42. struct {
  43. u32 start;
  44. u32 len;
  45. u8 sel;
  46. } mac_mem;
  47. };
  48. };
  49. static int rtw89_debugfs_single_show(struct seq_file *m, void *v)
  50. {
  51. struct rtw89_debugfs_priv *debugfs_priv = m->private;
  52. return debugfs_priv->cb_read(m, v);
  53. }
  54. static ssize_t rtw89_debugfs_single_write(struct file *filp,
  55. const char __user *buffer,
  56. size_t count, loff_t *loff)
  57. {
  58. struct rtw89_debugfs_priv *debugfs_priv = filp->private_data;
  59. return debugfs_priv->cb_write(filp, buffer, count, loff);
  60. }
  61. static ssize_t rtw89_debugfs_seq_file_write(struct file *filp,
  62. const char __user *buffer,
  63. size_t count, loff_t *loff)
  64. {
  65. struct seq_file *seqpriv = (struct seq_file *)filp->private_data;
  66. struct rtw89_debugfs_priv *debugfs_priv = seqpriv->private;
  67. return debugfs_priv->cb_write(filp, buffer, count, loff);
  68. }
  69. static int rtw89_debugfs_single_open(struct inode *inode, struct file *filp)
  70. {
  71. return single_open(filp, rtw89_debugfs_single_show, inode->i_private);
  72. }
  73. static int rtw89_debugfs_close(struct inode *inode, struct file *filp)
  74. {
  75. return 0;
  76. }
  77. static const struct file_operations file_ops_single_r = {
  78. .owner = THIS_MODULE,
  79. .open = rtw89_debugfs_single_open,
  80. .read = seq_read,
  81. .llseek = seq_lseek,
  82. .release = single_release,
  83. };
  84. static const struct file_operations file_ops_common_rw = {
  85. .owner = THIS_MODULE,
  86. .open = rtw89_debugfs_single_open,
  87. .release = single_release,
  88. .read = seq_read,
  89. .llseek = seq_lseek,
  90. .write = rtw89_debugfs_seq_file_write,
  91. };
  92. static const struct file_operations file_ops_single_w = {
  93. .owner = THIS_MODULE,
  94. .write = rtw89_debugfs_single_write,
  95. .open = simple_open,
  96. .release = rtw89_debugfs_close,
  97. };
  98. static ssize_t
  99. rtw89_debug_priv_read_reg_select(struct file *filp,
  100. const char __user *user_buf,
  101. size_t count, loff_t *loff)
  102. {
  103. struct seq_file *m = (struct seq_file *)filp->private_data;
  104. struct rtw89_debugfs_priv *debugfs_priv = m->private;
  105. struct rtw89_dev *rtwdev = debugfs_priv->rtwdev;
  106. char buf[32];
  107. size_t buf_size;
  108. u32 addr, len;
  109. int num;
  110. buf_size = min(count, sizeof(buf) - 1);
  111. if (copy_from_user(buf, user_buf, buf_size))
  112. return -EFAULT;
  113. buf[buf_size] = '\0';
  114. num = sscanf(buf, "%x %x", &addr, &len);
  115. if (num != 2) {
  116. rtw89_info(rtwdev, "invalid format: <addr> <len>\n");
  117. return -EINVAL;
  118. }
  119. debugfs_priv->read_reg.addr = addr;
  120. debugfs_priv->read_reg.len = len;
  121. rtw89_info(rtwdev, "select read %d bytes from 0x%08x\n", len, addr);
  122. return count;
  123. }
  124. static int rtw89_debug_priv_read_reg_get(struct seq_file *m, void *v)
  125. {
  126. struct rtw89_debugfs_priv *debugfs_priv = m->private;
  127. struct rtw89_dev *rtwdev = debugfs_priv->rtwdev;
  128. u32 addr, data;
  129. u8 len;
  130. len = debugfs_priv->read_reg.len;
  131. addr = debugfs_priv->read_reg.addr;
  132. switch (len) {
  133. case 1:
  134. data = rtw89_read8(rtwdev, addr);
  135. break;
  136. case 2:
  137. data = rtw89_read16(rtwdev, addr);
  138. break;
  139. case 4:
  140. data = rtw89_read32(rtwdev, addr);
  141. break;
  142. default:
  143. rtw89_info(rtwdev, "invalid read reg len %d\n", len);
  144. return -EINVAL;
  145. }
  146. seq_printf(m, "get %d bytes at 0x%08x=0x%08x\n", len, addr, data);
  147. return 0;
  148. }
  149. static ssize_t rtw89_debug_priv_write_reg_set(struct file *filp,
  150. const char __user *user_buf,
  151. size_t count, loff_t *loff)
  152. {
  153. struct rtw89_debugfs_priv *debugfs_priv = filp->private_data;
  154. struct rtw89_dev *rtwdev = debugfs_priv->rtwdev;
  155. char buf[32];
  156. size_t buf_size;
  157. u32 addr, val, len;
  158. int num;
  159. buf_size = min(count, sizeof(buf) - 1);
  160. if (copy_from_user(buf, user_buf, buf_size))
  161. return -EFAULT;
  162. buf[buf_size] = '\0';
  163. num = sscanf(buf, "%x %x %x", &addr, &val, &len);
  164. if (num != 3) {
  165. rtw89_info(rtwdev, "invalid format: <addr> <val> <len>\n");
  166. return -EINVAL;
  167. }
  168. switch (len) {
  169. case 1:
  170. rtw89_info(rtwdev, "reg write8 0x%08x: 0x%02x\n", addr, val);
  171. rtw89_write8(rtwdev, addr, (u8)val);
  172. break;
  173. case 2:
  174. rtw89_info(rtwdev, "reg write16 0x%08x: 0x%04x\n", addr, val);
  175. rtw89_write16(rtwdev, addr, (u16)val);
  176. break;
  177. case 4:
  178. rtw89_info(rtwdev, "reg write32 0x%08x: 0x%08x\n", addr, val);
  179. rtw89_write32(rtwdev, addr, (u32)val);
  180. break;
  181. default:
  182. rtw89_info(rtwdev, "invalid read write len %d\n", len);
  183. break;
  184. }
  185. return count;
  186. }
  187. static ssize_t
  188. rtw89_debug_priv_read_rf_select(struct file *filp,
  189. const char __user *user_buf,
  190. size_t count, loff_t *loff)
  191. {
  192. struct seq_file *m = (struct seq_file *)filp->private_data;
  193. struct rtw89_debugfs_priv *debugfs_priv = m->private;
  194. struct rtw89_dev *rtwdev = debugfs_priv->rtwdev;
  195. char buf[32];
  196. size_t buf_size;
  197. u32 addr, mask;
  198. u8 path;
  199. int num;
  200. buf_size = min(count, sizeof(buf) - 1);
  201. if (copy_from_user(buf, user_buf, buf_size))
  202. return -EFAULT;
  203. buf[buf_size] = '\0';
  204. num = sscanf(buf, "%hhd %x %x", &path, &addr, &mask);
  205. if (num != 3) {
  206. rtw89_info(rtwdev, "invalid format: <path> <addr> <mask>\n");
  207. return -EINVAL;
  208. }
  209. if (path >= rtwdev->chip->rf_path_num) {
  210. rtw89_info(rtwdev, "wrong rf path\n");
  211. return -EINVAL;
  212. }
  213. debugfs_priv->read_rf.addr = addr;
  214. debugfs_priv->read_rf.mask = mask;
  215. debugfs_priv->read_rf.path = path;
  216. rtw89_info(rtwdev, "select read rf path %d from 0x%08x\n", path, addr);
  217. return count;
  218. }
  219. static int rtw89_debug_priv_read_rf_get(struct seq_file *m, void *v)
  220. {
  221. struct rtw89_debugfs_priv *debugfs_priv = m->private;
  222. struct rtw89_dev *rtwdev = debugfs_priv->rtwdev;
  223. u32 addr, data, mask;
  224. u8 path;
  225. addr = debugfs_priv->read_rf.addr;
  226. mask = debugfs_priv->read_rf.mask;
  227. path = debugfs_priv->read_rf.path;
  228. data = rtw89_read_rf(rtwdev, path, addr, mask);
  229. seq_printf(m, "path %d, rf register 0x%08x=0x%08x\n", path, addr, data);
  230. return 0;
  231. }
  232. static ssize_t rtw89_debug_priv_write_rf_set(struct file *filp,
  233. const char __user *user_buf,
  234. size_t count, loff_t *loff)
  235. {
  236. struct rtw89_debugfs_priv *debugfs_priv = filp->private_data;
  237. struct rtw89_dev *rtwdev = debugfs_priv->rtwdev;
  238. char buf[32];
  239. size_t buf_size;
  240. u32 addr, val, mask;
  241. u8 path;
  242. int num;
  243. buf_size = min(count, sizeof(buf) - 1);
  244. if (copy_from_user(buf, user_buf, buf_size))
  245. return -EFAULT;
  246. buf[buf_size] = '\0';
  247. num = sscanf(buf, "%hhd %x %x %x", &path, &addr, &mask, &val);
  248. if (num != 4) {
  249. rtw89_info(rtwdev, "invalid format: <path> <addr> <mask> <val>\n");
  250. return -EINVAL;
  251. }
  252. if (path >= rtwdev->chip->rf_path_num) {
  253. rtw89_info(rtwdev, "wrong rf path\n");
  254. return -EINVAL;
  255. }
  256. rtw89_info(rtwdev, "path %d, rf register write 0x%08x=0x%08x (mask = 0x%08x)\n",
  257. path, addr, val, mask);
  258. rtw89_write_rf(rtwdev, path, addr, mask, val);
  259. return count;
  260. }
  261. static int rtw89_debug_priv_rf_reg_dump_get(struct seq_file *m, void *v)
  262. {
  263. struct rtw89_debugfs_priv *debugfs_priv = m->private;
  264. struct rtw89_dev *rtwdev = debugfs_priv->rtwdev;
  265. const struct rtw89_chip_info *chip = rtwdev->chip;
  266. u32 addr, offset, data;
  267. u8 path;
  268. for (path = 0; path < chip->rf_path_num; path++) {
  269. seq_printf(m, "RF path %d:\n\n", path);
  270. for (addr = 0; addr < 0x100; addr += 4) {
  271. seq_printf(m, "0x%08x: ", addr);
  272. for (offset = 0; offset < 4; offset++) {
  273. data = rtw89_read_rf(rtwdev, path,
  274. addr + offset, RFREG_MASK);
  275. seq_printf(m, "0x%05x ", data);
  276. }
  277. seq_puts(m, "\n");
  278. }
  279. seq_puts(m, "\n");
  280. }
  281. return 0;
  282. }
  283. struct txpwr_ent {
  284. const char *txt;
  285. u8 len;
  286. };
  287. struct txpwr_map {
  288. const struct txpwr_ent *ent;
  289. u8 size;
  290. u32 addr_from;
  291. u32 addr_to;
  292. };
  293. #define __GEN_TXPWR_ENT2(_t, _e0, _e1) \
  294. { .len = 2, .txt = _t "\t- " _e0 " " _e1 }
  295. #define __GEN_TXPWR_ENT4(_t, _e0, _e1, _e2, _e3) \
  296. { .len = 4, .txt = _t "\t- " _e0 " " _e1 " " _e2 " " _e3 }
  297. #define __GEN_TXPWR_ENT8(_t, _e0, _e1, _e2, _e3, _e4, _e5, _e6, _e7) \
  298. { .len = 8, .txt = _t "\t- " \
  299. _e0 " " _e1 " " _e2 " " _e3 " " \
  300. _e4 " " _e5 " " _e6 " " _e7 }
  301. static const struct txpwr_ent __txpwr_ent_byr[] = {
  302. __GEN_TXPWR_ENT4("CCK ", "1M ", "2M ", "5.5M ", "11M "),
  303. __GEN_TXPWR_ENT4("LEGACY ", "6M ", "9M ", "12M ", "18M "),
  304. __GEN_TXPWR_ENT4("LEGACY ", "24M ", "36M ", "48M ", "54M "),
  305. /* 1NSS */
  306. __GEN_TXPWR_ENT4("MCS_1NSS ", "MCS0 ", "MCS1 ", "MCS2 ", "MCS3 "),
  307. __GEN_TXPWR_ENT4("MCS_1NSS ", "MCS4 ", "MCS5 ", "MCS6 ", "MCS7 "),
  308. __GEN_TXPWR_ENT4("MCS_1NSS ", "MCS8 ", "MCS9 ", "MCS10", "MCS11"),
  309. __GEN_TXPWR_ENT4("HEDCM_1NSS", "MCS0 ", "MCS1 ", "MCS3 ", "MCS4 "),
  310. /* 2NSS */
  311. __GEN_TXPWR_ENT4("MCS_2NSS ", "MCS0 ", "MCS1 ", "MCS2 ", "MCS3 "),
  312. __GEN_TXPWR_ENT4("MCS_2NSS ", "MCS4 ", "MCS5 ", "MCS6 ", "MCS7 "),
  313. __GEN_TXPWR_ENT4("MCS_2NSS ", "MCS8 ", "MCS9 ", "MCS10", "MCS11"),
  314. __GEN_TXPWR_ENT4("HEDCM_2NSS", "MCS0 ", "MCS1 ", "MCS3 ", "MCS4 "),
  315. };
  316. static_assert((ARRAY_SIZE(__txpwr_ent_byr) * 4) ==
  317. (R_AX_PWR_BY_RATE_MAX - R_AX_PWR_BY_RATE + 4));
  318. static const struct txpwr_map __txpwr_map_byr = {
  319. .ent = __txpwr_ent_byr,
  320. .size = ARRAY_SIZE(__txpwr_ent_byr),
  321. .addr_from = R_AX_PWR_BY_RATE,
  322. .addr_to = R_AX_PWR_BY_RATE_MAX,
  323. };
  324. static const struct txpwr_ent __txpwr_ent_lmt[] = {
  325. /* 1TX */
  326. __GEN_TXPWR_ENT2("CCK_1TX_20M ", "NON_BF", "BF"),
  327. __GEN_TXPWR_ENT2("CCK_1TX_40M ", "NON_BF", "BF"),
  328. __GEN_TXPWR_ENT2("OFDM_1TX ", "NON_BF", "BF"),
  329. __GEN_TXPWR_ENT2("MCS_1TX_20M_0 ", "NON_BF", "BF"),
  330. __GEN_TXPWR_ENT2("MCS_1TX_20M_1 ", "NON_BF", "BF"),
  331. __GEN_TXPWR_ENT2("MCS_1TX_20M_2 ", "NON_BF", "BF"),
  332. __GEN_TXPWR_ENT2("MCS_1TX_20M_3 ", "NON_BF", "BF"),
  333. __GEN_TXPWR_ENT2("MCS_1TX_20M_4 ", "NON_BF", "BF"),
  334. __GEN_TXPWR_ENT2("MCS_1TX_20M_5 ", "NON_BF", "BF"),
  335. __GEN_TXPWR_ENT2("MCS_1TX_20M_6 ", "NON_BF", "BF"),
  336. __GEN_TXPWR_ENT2("MCS_1TX_20M_7 ", "NON_BF", "BF"),
  337. __GEN_TXPWR_ENT2("MCS_1TX_40M_0 ", "NON_BF", "BF"),
  338. __GEN_TXPWR_ENT2("MCS_1TX_40M_1 ", "NON_BF", "BF"),
  339. __GEN_TXPWR_ENT2("MCS_1TX_40M_2 ", "NON_BF", "BF"),
  340. __GEN_TXPWR_ENT2("MCS_1TX_40M_3 ", "NON_BF", "BF"),
  341. __GEN_TXPWR_ENT2("MCS_1TX_80M_0 ", "NON_BF", "BF"),
  342. __GEN_TXPWR_ENT2("MCS_1TX_80M_1 ", "NON_BF", "BF"),
  343. __GEN_TXPWR_ENT2("MCS_1TX_160M ", "NON_BF", "BF"),
  344. __GEN_TXPWR_ENT2("MCS_1TX_40M_0p5", "NON_BF", "BF"),
  345. __GEN_TXPWR_ENT2("MCS_1TX_40M_2p5", "NON_BF", "BF"),
  346. /* 2TX */
  347. __GEN_TXPWR_ENT2("CCK_2TX_20M ", "NON_BF", "BF"),
  348. __GEN_TXPWR_ENT2("CCK_2TX_40M ", "NON_BF", "BF"),
  349. __GEN_TXPWR_ENT2("OFDM_2TX ", "NON_BF", "BF"),
  350. __GEN_TXPWR_ENT2("MCS_2TX_20M_0 ", "NON_BF", "BF"),
  351. __GEN_TXPWR_ENT2("MCS_2TX_20M_1 ", "NON_BF", "BF"),
  352. __GEN_TXPWR_ENT2("MCS_2TX_20M_2 ", "NON_BF", "BF"),
  353. __GEN_TXPWR_ENT2("MCS_2TX_20M_3 ", "NON_BF", "BF"),
  354. __GEN_TXPWR_ENT2("MCS_2TX_20M_4 ", "NON_BF", "BF"),
  355. __GEN_TXPWR_ENT2("MCS_2TX_20M_5 ", "NON_BF", "BF"),
  356. __GEN_TXPWR_ENT2("MCS_2TX_20M_6 ", "NON_BF", "BF"),
  357. __GEN_TXPWR_ENT2("MCS_2TX_20M_7 ", "NON_BF", "BF"),
  358. __GEN_TXPWR_ENT2("MCS_2TX_40M_0 ", "NON_BF", "BF"),
  359. __GEN_TXPWR_ENT2("MCS_2TX_40M_1 ", "NON_BF", "BF"),
  360. __GEN_TXPWR_ENT2("MCS_2TX_40M_2 ", "NON_BF", "BF"),
  361. __GEN_TXPWR_ENT2("MCS_2TX_40M_3 ", "NON_BF", "BF"),
  362. __GEN_TXPWR_ENT2("MCS_2TX_80M_0 ", "NON_BF", "BF"),
  363. __GEN_TXPWR_ENT2("MCS_2TX_80M_1 ", "NON_BF", "BF"),
  364. __GEN_TXPWR_ENT2("MCS_2TX_160M ", "NON_BF", "BF"),
  365. __GEN_TXPWR_ENT2("MCS_2TX_40M_0p5", "NON_BF", "BF"),
  366. __GEN_TXPWR_ENT2("MCS_2TX_40M_2p5", "NON_BF", "BF"),
  367. };
  368. static_assert((ARRAY_SIZE(__txpwr_ent_lmt) * 2) ==
  369. (R_AX_PWR_LMT_MAX - R_AX_PWR_LMT + 4));
  370. static const struct txpwr_map __txpwr_map_lmt = {
  371. .ent = __txpwr_ent_lmt,
  372. .size = ARRAY_SIZE(__txpwr_ent_lmt),
  373. .addr_from = R_AX_PWR_LMT,
  374. .addr_to = R_AX_PWR_LMT_MAX,
  375. };
  376. static const struct txpwr_ent __txpwr_ent_lmt_ru[] = {
  377. /* 1TX */
  378. __GEN_TXPWR_ENT8("1TX", "RU26__0", "RU26__1", "RU26__2", "RU26__3",
  379. "RU26__4", "RU26__5", "RU26__6", "RU26__7"),
  380. __GEN_TXPWR_ENT8("1TX", "RU52__0", "RU52__1", "RU52__2", "RU52__3",
  381. "RU52__4", "RU52__5", "RU52__6", "RU52__7"),
  382. __GEN_TXPWR_ENT8("1TX", "RU106_0", "RU106_1", "RU106_2", "RU106_3",
  383. "RU106_4", "RU106_5", "RU106_6", "RU106_7"),
  384. /* 2TX */
  385. __GEN_TXPWR_ENT8("2TX", "RU26__0", "RU26__1", "RU26__2", "RU26__3",
  386. "RU26__4", "RU26__5", "RU26__6", "RU26__7"),
  387. __GEN_TXPWR_ENT8("2TX", "RU52__0", "RU52__1", "RU52__2", "RU52__3",
  388. "RU52__4", "RU52__5", "RU52__6", "RU52__7"),
  389. __GEN_TXPWR_ENT8("2TX", "RU106_0", "RU106_1", "RU106_2", "RU106_3",
  390. "RU106_4", "RU106_5", "RU106_6", "RU106_7"),
  391. };
  392. static_assert((ARRAY_SIZE(__txpwr_ent_lmt_ru) * 8) ==
  393. (R_AX_PWR_RU_LMT_MAX - R_AX_PWR_RU_LMT + 4));
  394. static const struct txpwr_map __txpwr_map_lmt_ru = {
  395. .ent = __txpwr_ent_lmt_ru,
  396. .size = ARRAY_SIZE(__txpwr_ent_lmt_ru),
  397. .addr_from = R_AX_PWR_RU_LMT,
  398. .addr_to = R_AX_PWR_RU_LMT_MAX,
  399. };
  400. static u8 __print_txpwr_ent(struct seq_file *m, const struct txpwr_ent *ent,
  401. const u8 *buf, const u8 cur)
  402. {
  403. char *fmt;
  404. switch (ent->len) {
  405. case 2:
  406. fmt = "%s\t| %3d, %3d,\tdBm\n";
  407. seq_printf(m, fmt, ent->txt, buf[cur], buf[cur + 1]);
  408. return 2;
  409. case 4:
  410. fmt = "%s\t| %3d, %3d, %3d, %3d,\tdBm\n";
  411. seq_printf(m, fmt, ent->txt, buf[cur], buf[cur + 1],
  412. buf[cur + 2], buf[cur + 3]);
  413. return 4;
  414. case 8:
  415. fmt = "%s\t| %3d, %3d, %3d, %3d, %3d, %3d, %3d, %3d,\tdBm\n";
  416. seq_printf(m, fmt, ent->txt, buf[cur], buf[cur + 1],
  417. buf[cur + 2], buf[cur + 3], buf[cur + 4],
  418. buf[cur + 5], buf[cur + 6], buf[cur + 7]);
  419. return 8;
  420. default:
  421. return 0;
  422. }
  423. }
  424. static int __print_txpwr_map(struct seq_file *m, struct rtw89_dev *rtwdev,
  425. const struct txpwr_map *map)
  426. {
  427. u8 fct = rtwdev->chip->txpwr_factor_mac;
  428. u8 *buf, cur, i;
  429. u32 val, addr;
  430. int ret;
  431. buf = vzalloc(map->addr_to - map->addr_from + 4);
  432. if (!buf)
  433. return -ENOMEM;
  434. for (addr = map->addr_from; addr <= map->addr_to; addr += 4) {
  435. ret = rtw89_mac_txpwr_read32(rtwdev, RTW89_PHY_0, addr, &val);
  436. if (ret)
  437. val = MASKDWORD;
  438. cur = addr - map->addr_from;
  439. for (i = 0; i < 4; i++, val >>= 8)
  440. buf[cur + i] = FIELD_GET(MASKBYTE0, val) >> fct;
  441. }
  442. for (cur = 0, i = 0; i < map->size; i++)
  443. cur += __print_txpwr_ent(m, &map->ent[i], buf, cur);
  444. vfree(buf);
  445. return 0;
  446. }
  447. #define case_REGD(_regd) \
  448. case RTW89_ ## _regd: \
  449. seq_puts(m, #_regd "\n"); \
  450. break
  451. static void __print_regd(struct seq_file *m, struct rtw89_dev *rtwdev)
  452. {
  453. const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0);
  454. u8 band = chan->band_type;
  455. u8 regd = rtw89_regd_get(rtwdev, band);
  456. switch (regd) {
  457. default:
  458. seq_printf(m, "UNKNOWN: %d\n", regd);
  459. break;
  460. case_REGD(WW);
  461. case_REGD(ETSI);
  462. case_REGD(FCC);
  463. case_REGD(MKK);
  464. case_REGD(NA);
  465. case_REGD(IC);
  466. case_REGD(KCC);
  467. case_REGD(NCC);
  468. case_REGD(CHILE);
  469. case_REGD(ACMA);
  470. case_REGD(MEXICO);
  471. case_REGD(UKRAINE);
  472. case_REGD(CN);
  473. }
  474. }
  475. #undef case_REGD
  476. static int rtw89_debug_priv_txpwr_table_get(struct seq_file *m, void *v)
  477. {
  478. struct rtw89_debugfs_priv *debugfs_priv = m->private;
  479. struct rtw89_dev *rtwdev = debugfs_priv->rtwdev;
  480. int ret = 0;
  481. mutex_lock(&rtwdev->mutex);
  482. rtw89_leave_ps_mode(rtwdev);
  483. seq_puts(m, "[Regulatory] ");
  484. __print_regd(m, rtwdev);
  485. seq_puts(m, "[SAR]\n");
  486. rtw89_print_sar(m, rtwdev);
  487. seq_puts(m, "\n[TX power byrate]\n");
  488. ret = __print_txpwr_map(m, rtwdev, &__txpwr_map_byr);
  489. if (ret)
  490. goto err;
  491. seq_puts(m, "\n[TX power limit]\n");
  492. ret = __print_txpwr_map(m, rtwdev, &__txpwr_map_lmt);
  493. if (ret)
  494. goto err;
  495. seq_puts(m, "\n[TX power limit_ru]\n");
  496. ret = __print_txpwr_map(m, rtwdev, &__txpwr_map_lmt_ru);
  497. if (ret)
  498. goto err;
  499. err:
  500. mutex_unlock(&rtwdev->mutex);
  501. return ret;
  502. }
  503. static ssize_t
  504. rtw89_debug_priv_mac_reg_dump_select(struct file *filp,
  505. const char __user *user_buf,
  506. size_t count, loff_t *loff)
  507. {
  508. struct seq_file *m = (struct seq_file *)filp->private_data;
  509. struct rtw89_debugfs_priv *debugfs_priv = m->private;
  510. struct rtw89_dev *rtwdev = debugfs_priv->rtwdev;
  511. const struct rtw89_chip_info *chip = rtwdev->chip;
  512. char buf[32];
  513. size_t buf_size;
  514. int sel;
  515. int ret;
  516. buf_size = min(count, sizeof(buf) - 1);
  517. if (copy_from_user(buf, user_buf, buf_size))
  518. return -EFAULT;
  519. buf[buf_size] = '\0';
  520. ret = kstrtoint(buf, 0, &sel);
  521. if (ret)
  522. return ret;
  523. if (sel < RTW89_DBG_SEL_MAC_00 || sel > RTW89_DBG_SEL_RFC) {
  524. rtw89_info(rtwdev, "invalid args: %d\n", sel);
  525. return -EINVAL;
  526. }
  527. if (sel == RTW89_DBG_SEL_MAC_30 && chip->chip_id != RTL8852C) {
  528. rtw89_info(rtwdev, "sel %d is address hole on chip %d\n", sel,
  529. chip->chip_id);
  530. return -EINVAL;
  531. }
  532. debugfs_priv->cb_data = sel;
  533. rtw89_info(rtwdev, "select mac page dump %d\n", debugfs_priv->cb_data);
  534. return count;
  535. }
  536. #define RTW89_MAC_PAGE_SIZE 0x100
  537. static int rtw89_debug_priv_mac_reg_dump_get(struct seq_file *m, void *v)
  538. {
  539. struct rtw89_debugfs_priv *debugfs_priv = m->private;
  540. struct rtw89_dev *rtwdev = debugfs_priv->rtwdev;
  541. enum rtw89_debug_mac_reg_sel reg_sel = debugfs_priv->cb_data;
  542. u32 start, end;
  543. u32 i, j, k, page;
  544. u32 val;
  545. switch (reg_sel) {
  546. case RTW89_DBG_SEL_MAC_00:
  547. seq_puts(m, "Debug selected MAC page 0x00\n");
  548. start = 0x000;
  549. end = 0x014;
  550. break;
  551. case RTW89_DBG_SEL_MAC_30:
  552. seq_puts(m, "Debug selected MAC page 0x30\n");
  553. start = 0x030;
  554. end = 0x033;
  555. break;
  556. case RTW89_DBG_SEL_MAC_40:
  557. seq_puts(m, "Debug selected MAC page 0x40\n");
  558. start = 0x040;
  559. end = 0x07f;
  560. break;
  561. case RTW89_DBG_SEL_MAC_80:
  562. seq_puts(m, "Debug selected MAC page 0x80\n");
  563. start = 0x080;
  564. end = 0x09f;
  565. break;
  566. case RTW89_DBG_SEL_MAC_C0:
  567. seq_puts(m, "Debug selected MAC page 0xc0\n");
  568. start = 0x0c0;
  569. end = 0x0df;
  570. break;
  571. case RTW89_DBG_SEL_MAC_E0:
  572. seq_puts(m, "Debug selected MAC page 0xe0\n");
  573. start = 0x0e0;
  574. end = 0x0ff;
  575. break;
  576. case RTW89_DBG_SEL_BB:
  577. seq_puts(m, "Debug selected BB register\n");
  578. start = 0x100;
  579. end = 0x17f;
  580. break;
  581. case RTW89_DBG_SEL_IQK:
  582. seq_puts(m, "Debug selected IQK register\n");
  583. start = 0x180;
  584. end = 0x1bf;
  585. break;
  586. case RTW89_DBG_SEL_RFC:
  587. seq_puts(m, "Debug selected RFC register\n");
  588. start = 0x1c0;
  589. end = 0x1ff;
  590. break;
  591. default:
  592. seq_puts(m, "Selected invalid register page\n");
  593. return -EINVAL;
  594. }
  595. for (i = start; i <= end; i++) {
  596. page = i << 8;
  597. for (j = page; j < page + RTW89_MAC_PAGE_SIZE; j += 16) {
  598. seq_printf(m, "%08xh : ", 0x18600000 + j);
  599. for (k = 0; k < 4; k++) {
  600. val = rtw89_read32(rtwdev, j + (k << 2));
  601. seq_printf(m, "%08x ", val);
  602. }
  603. seq_puts(m, "\n");
  604. }
  605. }
  606. return 0;
  607. }
  608. static ssize_t
  609. rtw89_debug_priv_mac_mem_dump_select(struct file *filp,
  610. const char __user *user_buf,
  611. size_t count, loff_t *loff)
  612. {
  613. struct seq_file *m = (struct seq_file *)filp->private_data;
  614. struct rtw89_debugfs_priv *debugfs_priv = m->private;
  615. struct rtw89_dev *rtwdev = debugfs_priv->rtwdev;
  616. char buf[32];
  617. size_t buf_size;
  618. u32 sel, start_addr, len;
  619. int num;
  620. buf_size = min(count, sizeof(buf) - 1);
  621. if (copy_from_user(buf, user_buf, buf_size))
  622. return -EFAULT;
  623. buf[buf_size] = '\0';
  624. num = sscanf(buf, "%x %x %x", &sel, &start_addr, &len);
  625. if (num != 3) {
  626. rtw89_info(rtwdev, "invalid format: <sel> <start> <len>\n");
  627. return -EINVAL;
  628. }
  629. debugfs_priv->mac_mem.sel = sel;
  630. debugfs_priv->mac_mem.start = start_addr;
  631. debugfs_priv->mac_mem.len = len;
  632. rtw89_info(rtwdev, "select mem %d start %d len %d\n",
  633. sel, start_addr, len);
  634. return count;
  635. }
  636. static void rtw89_debug_dump_mac_mem(struct seq_file *m,
  637. struct rtw89_dev *rtwdev,
  638. u8 sel, u32 start_addr, u32 len)
  639. {
  640. u32 base_addr, start_page, residue;
  641. u32 i, j, p, pages;
  642. u32 dump_len, remain;
  643. u32 val;
  644. remain = len;
  645. pages = len / MAC_MEM_DUMP_PAGE_SIZE + 1;
  646. start_page = start_addr / MAC_MEM_DUMP_PAGE_SIZE;
  647. residue = start_addr % MAC_MEM_DUMP_PAGE_SIZE;
  648. base_addr = rtw89_mac_mem_base_addrs[sel];
  649. base_addr += start_page * MAC_MEM_DUMP_PAGE_SIZE;
  650. for (p = 0; p < pages; p++) {
  651. dump_len = min_t(u32, remain, MAC_MEM_DUMP_PAGE_SIZE);
  652. rtw89_write32(rtwdev, R_AX_FILTER_MODEL_ADDR, base_addr);
  653. for (i = R_AX_INDIR_ACCESS_ENTRY + residue;
  654. i < R_AX_INDIR_ACCESS_ENTRY + dump_len;) {
  655. seq_printf(m, "%08xh:", i);
  656. for (j = 0;
  657. j < 4 && i < R_AX_INDIR_ACCESS_ENTRY + dump_len;
  658. j++, i += 4) {
  659. val = rtw89_read32(rtwdev, i);
  660. seq_printf(m, " %08x", val);
  661. remain -= 4;
  662. }
  663. seq_puts(m, "\n");
  664. }
  665. base_addr += MAC_MEM_DUMP_PAGE_SIZE;
  666. }
  667. }
  668. static int
  669. rtw89_debug_priv_mac_mem_dump_get(struct seq_file *m, void *v)
  670. {
  671. struct rtw89_debugfs_priv *debugfs_priv = m->private;
  672. struct rtw89_dev *rtwdev = debugfs_priv->rtwdev;
  673. mutex_lock(&rtwdev->mutex);
  674. rtw89_leave_ps_mode(rtwdev);
  675. rtw89_debug_dump_mac_mem(m, rtwdev,
  676. debugfs_priv->mac_mem.sel,
  677. debugfs_priv->mac_mem.start,
  678. debugfs_priv->mac_mem.len);
  679. mutex_unlock(&rtwdev->mutex);
  680. return 0;
  681. }
  682. static ssize_t
  683. rtw89_debug_priv_mac_dbg_port_dump_select(struct file *filp,
  684. const char __user *user_buf,
  685. size_t count, loff_t *loff)
  686. {
  687. struct seq_file *m = (struct seq_file *)filp->private_data;
  688. struct rtw89_debugfs_priv *debugfs_priv = m->private;
  689. struct rtw89_dev *rtwdev = debugfs_priv->rtwdev;
  690. char buf[32];
  691. size_t buf_size;
  692. int sel, set;
  693. int num;
  694. bool enable;
  695. buf_size = min(count, sizeof(buf) - 1);
  696. if (copy_from_user(buf, user_buf, buf_size))
  697. return -EFAULT;
  698. buf[buf_size] = '\0';
  699. num = sscanf(buf, "%d %d", &sel, &set);
  700. if (num != 2) {
  701. rtw89_info(rtwdev, "invalid format: <sel> <set>\n");
  702. return -EINVAL;
  703. }
  704. enable = set != 0;
  705. switch (sel) {
  706. case 0:
  707. debugfs_priv->dbgpkg_en.ss_dbg = enable;
  708. break;
  709. case 1:
  710. debugfs_priv->dbgpkg_en.dle_dbg = enable;
  711. break;
  712. case 2:
  713. debugfs_priv->dbgpkg_en.dmac_dbg = enable;
  714. break;
  715. case 3:
  716. debugfs_priv->dbgpkg_en.cmac_dbg = enable;
  717. break;
  718. case 4:
  719. debugfs_priv->dbgpkg_en.dbg_port = enable;
  720. break;
  721. default:
  722. rtw89_info(rtwdev, "invalid args: sel %d set %d\n", sel, set);
  723. return -EINVAL;
  724. }
  725. rtw89_info(rtwdev, "%s debug port dump %d\n",
  726. enable ? "Enable" : "Disable", sel);
  727. return count;
  728. }
  729. static int rtw89_debug_mac_dump_ss_dbg(struct rtw89_dev *rtwdev,
  730. struct seq_file *m)
  731. {
  732. return 0;
  733. }
  734. static int rtw89_debug_mac_dump_dle_dbg(struct rtw89_dev *rtwdev,
  735. struct seq_file *m)
  736. {
  737. #define DLE_DFI_DUMP(__type, __target, __sel) \
  738. ({ \
  739. u32 __ctrl; \
  740. u32 __reg_ctrl = R_AX_##__type##_DBG_FUN_INTF_CTL; \
  741. u32 __reg_data = R_AX_##__type##_DBG_FUN_INTF_DATA; \
  742. u32 __data, __val32; \
  743. int __ret; \
  744. \
  745. __ctrl = FIELD_PREP(B_AX_##__type##_DFI_TRGSEL_MASK, \
  746. DLE_DFI_TYPE_##__target) | \
  747. FIELD_PREP(B_AX_##__type##_DFI_ADDR_MASK, __sel) | \
  748. B_AX_WDE_DFI_ACTIVE; \
  749. rtw89_write32(rtwdev, __reg_ctrl, __ctrl); \
  750. __ret = read_poll_timeout(rtw89_read32, __val32, \
  751. !(__val32 & B_AX_##__type##_DFI_ACTIVE), \
  752. 1000, 50000, false, \
  753. rtwdev, __reg_ctrl); \
  754. if (__ret) { \
  755. rtw89_err(rtwdev, "failed to dump DLE %s %s %d\n", \
  756. #__type, #__target, __sel); \
  757. return __ret; \
  758. } \
  759. \
  760. __data = rtw89_read32(rtwdev, __reg_data); \
  761. __data; \
  762. })
  763. #define DLE_DFI_FREE_PAGE_DUMP(__m, __type) \
  764. ({ \
  765. u32 __freepg, __pubpg; \
  766. u32 __freepg_head, __freepg_tail, __pubpg_num; \
  767. \
  768. __freepg = DLE_DFI_DUMP(__type, FREEPG, 0); \
  769. __pubpg = DLE_DFI_DUMP(__type, FREEPG, 1); \
  770. __freepg_head = FIELD_GET(B_AX_DLE_FREE_HEADPG, __freepg); \
  771. __freepg_tail = FIELD_GET(B_AX_DLE_FREE_TAILPG, __freepg); \
  772. __pubpg_num = FIELD_GET(B_AX_DLE_PUB_PGNUM, __pubpg); \
  773. seq_printf(__m, "[%s] freepg head: %d\n", \
  774. #__type, __freepg_head); \
  775. seq_printf(__m, "[%s] freepg tail: %d\n", \
  776. #__type, __freepg_tail); \
  777. seq_printf(__m, "[%s] pubpg num : %d\n", \
  778. #__type, __pubpg_num); \
  779. })
  780. #define case_QUOTA(__m, __type, __id) \
  781. case __type##_QTAID_##__id: \
  782. val32 = DLE_DFI_DUMP(__type, QUOTA, __type##_QTAID_##__id); \
  783. rsv_pgnum = FIELD_GET(B_AX_DLE_RSV_PGNUM, val32); \
  784. use_pgnum = FIELD_GET(B_AX_DLE_USE_PGNUM, val32); \
  785. seq_printf(__m, "[%s][%s] rsv_pgnum: %d\n", \
  786. #__type, #__id, rsv_pgnum); \
  787. seq_printf(__m, "[%s][%s] use_pgnum: %d\n", \
  788. #__type, #__id, use_pgnum); \
  789. break
  790. u32 quota_id;
  791. u32 val32;
  792. u16 rsv_pgnum, use_pgnum;
  793. int ret;
  794. ret = rtw89_mac_check_mac_en(rtwdev, 0, RTW89_DMAC_SEL);
  795. if (ret) {
  796. seq_puts(m, "[DLE] : DMAC not enabled\n");
  797. return ret;
  798. }
  799. DLE_DFI_FREE_PAGE_DUMP(m, WDE);
  800. DLE_DFI_FREE_PAGE_DUMP(m, PLE);
  801. for (quota_id = 0; quota_id <= WDE_QTAID_CPUIO; quota_id++) {
  802. switch (quota_id) {
  803. case_QUOTA(m, WDE, HOST_IF);
  804. case_QUOTA(m, WDE, WLAN_CPU);
  805. case_QUOTA(m, WDE, DATA_CPU);
  806. case_QUOTA(m, WDE, PKTIN);
  807. case_QUOTA(m, WDE, CPUIO);
  808. }
  809. }
  810. for (quota_id = 0; quota_id <= PLE_QTAID_CPUIO; quota_id++) {
  811. switch (quota_id) {
  812. case_QUOTA(m, PLE, B0_TXPL);
  813. case_QUOTA(m, PLE, B1_TXPL);
  814. case_QUOTA(m, PLE, C2H);
  815. case_QUOTA(m, PLE, H2C);
  816. case_QUOTA(m, PLE, WLAN_CPU);
  817. case_QUOTA(m, PLE, MPDU);
  818. case_QUOTA(m, PLE, CMAC0_RX);
  819. case_QUOTA(m, PLE, CMAC1_RX);
  820. case_QUOTA(m, PLE, CMAC1_BBRPT);
  821. case_QUOTA(m, PLE, WDRLS);
  822. case_QUOTA(m, PLE, CPUIO);
  823. }
  824. }
  825. return 0;
  826. #undef case_QUOTA
  827. #undef DLE_DFI_DUMP
  828. #undef DLE_DFI_FREE_PAGE_DUMP
  829. }
  830. static int rtw89_debug_mac_dump_dmac_dbg(struct rtw89_dev *rtwdev,
  831. struct seq_file *m)
  832. {
  833. int ret;
  834. ret = rtw89_mac_check_mac_en(rtwdev, 0, RTW89_DMAC_SEL);
  835. if (ret) {
  836. seq_puts(m, "[DMAC] : DMAC not enabled\n");
  837. return ret;
  838. }
  839. seq_printf(m, "R_AX_DMAC_ERR_ISR=0x%08x\n",
  840. rtw89_read32(rtwdev, R_AX_DMAC_ERR_ISR));
  841. seq_printf(m, "[0]R_AX_WDRLS_ERR_ISR=0x%08x\n",
  842. rtw89_read32(rtwdev, R_AX_WDRLS_ERR_ISR));
  843. seq_printf(m, "[1]R_AX_SEC_ERR_IMR_ISR=0x%08x\n",
  844. rtw89_read32(rtwdev, R_AX_SEC_ERR_IMR_ISR));
  845. seq_printf(m, "[2.1]R_AX_MPDU_TX_ERR_ISR=0x%08x\n",
  846. rtw89_read32(rtwdev, R_AX_MPDU_TX_ERR_ISR));
  847. seq_printf(m, "[2.2]R_AX_MPDU_RX_ERR_ISR=0x%08x\n",
  848. rtw89_read32(rtwdev, R_AX_MPDU_RX_ERR_ISR));
  849. seq_printf(m, "[3]R_AX_STA_SCHEDULER_ERR_ISR=0x%08x\n",
  850. rtw89_read32(rtwdev, R_AX_STA_SCHEDULER_ERR_ISR));
  851. seq_printf(m, "[4]R_AX_WDE_ERR_ISR=0x%08x\n",
  852. rtw89_read32(rtwdev, R_AX_WDE_ERR_ISR));
  853. seq_printf(m, "[5.1]R_AX_TXPKTCTL_ERR_IMR_ISR=0x%08x\n",
  854. rtw89_read32(rtwdev, R_AX_TXPKTCTL_ERR_IMR_ISR));
  855. seq_printf(m, "[5.2]R_AX_TXPKTCTL_ERR_IMR_ISR_B1=0x%08x\n",
  856. rtw89_read32(rtwdev, R_AX_TXPKTCTL_ERR_IMR_ISR_B1));
  857. seq_printf(m, "[6]R_AX_PLE_ERR_FLAG_ISR=0x%08x\n",
  858. rtw89_read32(rtwdev, R_AX_PLE_ERR_FLAG_ISR));
  859. seq_printf(m, "[7]R_AX_PKTIN_ERR_ISR=0x%08x\n",
  860. rtw89_read32(rtwdev, R_AX_PKTIN_ERR_ISR));
  861. seq_printf(m, "[8.1]R_AX_OTHER_DISPATCHER_ERR_ISR=0x%08x\n",
  862. rtw89_read32(rtwdev, R_AX_OTHER_DISPATCHER_ERR_ISR));
  863. seq_printf(m, "[8.2]R_AX_HOST_DISPATCHER_ERR_ISR=0x%08x\n",
  864. rtw89_read32(rtwdev, R_AX_HOST_DISPATCHER_ERR_ISR));
  865. seq_printf(m, "[8.3]R_AX_CPU_DISPATCHER_ERR_ISR=0x%08x\n",
  866. rtw89_read32(rtwdev, R_AX_CPU_DISPATCHER_ERR_ISR));
  867. seq_printf(m, "[10]R_AX_CPUIO_ERR_ISR=0x%08x\n",
  868. rtw89_read32(rtwdev, R_AX_CPUIO_ERR_ISR));
  869. seq_printf(m, "[11.1]R_AX_BBRPT_COM_ERR_IMR_ISR=0x%08x\n",
  870. rtw89_read32(rtwdev, R_AX_BBRPT_COM_ERR_IMR_ISR));
  871. seq_printf(m, "[11.2]R_AX_BBRPT_CHINFO_ERR_IMR_ISR=0x%08x\n",
  872. rtw89_read32(rtwdev, R_AX_BBRPT_CHINFO_ERR_IMR_ISR));
  873. seq_printf(m, "[11.3]R_AX_BBRPT_DFS_ERR_IMR_ISR=0x%08x\n",
  874. rtw89_read32(rtwdev, R_AX_BBRPT_DFS_ERR_IMR_ISR));
  875. seq_printf(m, "[11.4]R_AX_LA_ERRFLAG=0x%08x\n",
  876. rtw89_read32(rtwdev, R_AX_LA_ERRFLAG));
  877. return 0;
  878. }
  879. static int rtw89_debug_mac_dump_cmac_dbg(struct rtw89_dev *rtwdev,
  880. struct seq_file *m)
  881. {
  882. int ret;
  883. ret = rtw89_mac_check_mac_en(rtwdev, 0, RTW89_CMAC_SEL);
  884. if (ret) {
  885. seq_puts(m, "[CMAC] : CMAC 0 not enabled\n");
  886. return ret;
  887. }
  888. seq_printf(m, "R_AX_CMAC_ERR_ISR=0x%08x\n",
  889. rtw89_read32(rtwdev, R_AX_CMAC_ERR_ISR));
  890. seq_printf(m, "[0]R_AX_SCHEDULE_ERR_ISR=0x%08x\n",
  891. rtw89_read32(rtwdev, R_AX_SCHEDULE_ERR_ISR));
  892. seq_printf(m, "[1]R_AX_PTCL_ISR0=0x%08x\n",
  893. rtw89_read32(rtwdev, R_AX_PTCL_ISR0));
  894. seq_printf(m, "[3]R_AX_DLE_CTRL=0x%08x\n",
  895. rtw89_read32(rtwdev, R_AX_DLE_CTRL));
  896. seq_printf(m, "[4]R_AX_PHYINFO_ERR_ISR=0x%08x\n",
  897. rtw89_read32(rtwdev, R_AX_PHYINFO_ERR_ISR));
  898. seq_printf(m, "[5]R_AX_TXPWR_ISR=0x%08x\n",
  899. rtw89_read32(rtwdev, R_AX_TXPWR_ISR));
  900. seq_printf(m, "[6]R_AX_RMAC_ERR_ISR=0x%08x\n",
  901. rtw89_read32(rtwdev, R_AX_RMAC_ERR_ISR));
  902. seq_printf(m, "[7]R_AX_TMAC_ERR_IMR_ISR=0x%08x\n",
  903. rtw89_read32(rtwdev, R_AX_TMAC_ERR_IMR_ISR));
  904. ret = rtw89_mac_check_mac_en(rtwdev, 1, RTW89_CMAC_SEL);
  905. if (ret) {
  906. seq_puts(m, "[CMAC] : CMAC 1 not enabled\n");
  907. return ret;
  908. }
  909. seq_printf(m, "R_AX_CMAC_ERR_ISR_C1=0x%08x\n",
  910. rtw89_read32(rtwdev, R_AX_CMAC_ERR_ISR_C1));
  911. seq_printf(m, "[0]R_AX_SCHEDULE_ERR_ISR_C1=0x%08x\n",
  912. rtw89_read32(rtwdev, R_AX_SCHEDULE_ERR_ISR_C1));
  913. seq_printf(m, "[1]R_AX_PTCL_ISR0_C1=0x%08x\n",
  914. rtw89_read32(rtwdev, R_AX_PTCL_ISR0_C1));
  915. seq_printf(m, "[3]R_AX_DLE_CTRL_C1=0x%08x\n",
  916. rtw89_read32(rtwdev, R_AX_DLE_CTRL_C1));
  917. seq_printf(m, "[4]R_AX_PHYINFO_ERR_ISR_C1=0x%02x\n",
  918. rtw89_read32(rtwdev, R_AX_PHYINFO_ERR_ISR_C1));
  919. seq_printf(m, "[5]R_AX_TXPWR_ISR_C1=0x%08x\n",
  920. rtw89_read32(rtwdev, R_AX_TXPWR_ISR_C1));
  921. seq_printf(m, "[6]R_AX_RMAC_ERR_ISR_C1=0x%08x\n",
  922. rtw89_read32(rtwdev, R_AX_RMAC_ERR_ISR_C1));
  923. seq_printf(m, "[7]R_AX_TMAC_ERR_IMR_ISR_C1=0x%08x\n",
  924. rtw89_read32(rtwdev, R_AX_TMAC_ERR_IMR_ISR_C1));
  925. return 0;
  926. }
  927. static const struct rtw89_mac_dbg_port_info dbg_port_ptcl_c0 = {
  928. .sel_addr = R_AX_PTCL_DBG,
  929. .sel_byte = 1,
  930. .sel_msk = B_AX_PTCL_DBG_SEL_MASK,
  931. .srt = 0x00,
  932. .end = 0x3F,
  933. .rd_addr = R_AX_PTCL_DBG_INFO,
  934. .rd_byte = 4,
  935. .rd_msk = B_AX_PTCL_DBG_INFO_MASK
  936. };
  937. static const struct rtw89_mac_dbg_port_info dbg_port_ptcl_c1 = {
  938. .sel_addr = R_AX_PTCL_DBG_C1,
  939. .sel_byte = 1,
  940. .sel_msk = B_AX_PTCL_DBG_SEL_MASK,
  941. .srt = 0x00,
  942. .end = 0x3F,
  943. .rd_addr = R_AX_PTCL_DBG_INFO_C1,
  944. .rd_byte = 4,
  945. .rd_msk = B_AX_PTCL_DBG_INFO_MASK
  946. };
  947. static const struct rtw89_mac_dbg_port_info dbg_port_sch_c0 = {
  948. .sel_addr = R_AX_SCH_DBG_SEL,
  949. .sel_byte = 1,
  950. .sel_msk = B_AX_SCH_DBG_SEL_MASK,
  951. .srt = 0x00,
  952. .end = 0x2F,
  953. .rd_addr = R_AX_SCH_DBG,
  954. .rd_byte = 4,
  955. .rd_msk = B_AX_SCHEDULER_DBG_MASK
  956. };
  957. static const struct rtw89_mac_dbg_port_info dbg_port_sch_c1 = {
  958. .sel_addr = R_AX_SCH_DBG_SEL_C1,
  959. .sel_byte = 1,
  960. .sel_msk = B_AX_SCH_DBG_SEL_MASK,
  961. .srt = 0x00,
  962. .end = 0x2F,
  963. .rd_addr = R_AX_SCH_DBG_C1,
  964. .rd_byte = 4,
  965. .rd_msk = B_AX_SCHEDULER_DBG_MASK
  966. };
  967. static const struct rtw89_mac_dbg_port_info dbg_port_tmac_c0 = {
  968. .sel_addr = R_AX_MACTX_DBG_SEL_CNT,
  969. .sel_byte = 1,
  970. .sel_msk = B_AX_DBGSEL_MACTX_MASK,
  971. .srt = 0x00,
  972. .end = 0x19,
  973. .rd_addr = R_AX_DBG_PORT_SEL,
  974. .rd_byte = 4,
  975. .rd_msk = B_AX_DEBUG_ST_MASK
  976. };
  977. static const struct rtw89_mac_dbg_port_info dbg_port_tmac_c1 = {
  978. .sel_addr = R_AX_MACTX_DBG_SEL_CNT_C1,
  979. .sel_byte = 1,
  980. .sel_msk = B_AX_DBGSEL_MACTX_MASK,
  981. .srt = 0x00,
  982. .end = 0x19,
  983. .rd_addr = R_AX_DBG_PORT_SEL,
  984. .rd_byte = 4,
  985. .rd_msk = B_AX_DEBUG_ST_MASK
  986. };
  987. static const struct rtw89_mac_dbg_port_info dbg_port_rmac_c0 = {
  988. .sel_addr = R_AX_RX_DEBUG_SELECT,
  989. .sel_byte = 1,
  990. .sel_msk = B_AX_DEBUG_SEL_MASK,
  991. .srt = 0x00,
  992. .end = 0x58,
  993. .rd_addr = R_AX_DBG_PORT_SEL,
  994. .rd_byte = 4,
  995. .rd_msk = B_AX_DEBUG_ST_MASK
  996. };
  997. static const struct rtw89_mac_dbg_port_info dbg_port_rmac_c1 = {
  998. .sel_addr = R_AX_RX_DEBUG_SELECT_C1,
  999. .sel_byte = 1,
  1000. .sel_msk = B_AX_DEBUG_SEL_MASK,
  1001. .srt = 0x00,
  1002. .end = 0x58,
  1003. .rd_addr = R_AX_DBG_PORT_SEL,
  1004. .rd_byte = 4,
  1005. .rd_msk = B_AX_DEBUG_ST_MASK
  1006. };
  1007. static const struct rtw89_mac_dbg_port_info dbg_port_rmacst_c0 = {
  1008. .sel_addr = R_AX_RX_STATE_MONITOR,
  1009. .sel_byte = 1,
  1010. .sel_msk = B_AX_STATE_SEL_MASK,
  1011. .srt = 0x00,
  1012. .end = 0x17,
  1013. .rd_addr = R_AX_RX_STATE_MONITOR,
  1014. .rd_byte = 4,
  1015. .rd_msk = B_AX_RX_STATE_MONITOR_MASK
  1016. };
  1017. static const struct rtw89_mac_dbg_port_info dbg_port_rmacst_c1 = {
  1018. .sel_addr = R_AX_RX_STATE_MONITOR_C1,
  1019. .sel_byte = 1,
  1020. .sel_msk = B_AX_STATE_SEL_MASK,
  1021. .srt = 0x00,
  1022. .end = 0x17,
  1023. .rd_addr = R_AX_RX_STATE_MONITOR_C1,
  1024. .rd_byte = 4,
  1025. .rd_msk = B_AX_RX_STATE_MONITOR_MASK
  1026. };
  1027. static const struct rtw89_mac_dbg_port_info dbg_port_rmac_plcp_c0 = {
  1028. .sel_addr = R_AX_RMAC_PLCP_MON,
  1029. .sel_byte = 4,
  1030. .sel_msk = B_AX_PCLP_MON_SEL_MASK,
  1031. .srt = 0x0,
  1032. .end = 0xF,
  1033. .rd_addr = R_AX_RMAC_PLCP_MON,
  1034. .rd_byte = 4,
  1035. .rd_msk = B_AX_RMAC_PLCP_MON_MASK
  1036. };
  1037. static const struct rtw89_mac_dbg_port_info dbg_port_rmac_plcp_c1 = {
  1038. .sel_addr = R_AX_RMAC_PLCP_MON_C1,
  1039. .sel_byte = 4,
  1040. .sel_msk = B_AX_PCLP_MON_SEL_MASK,
  1041. .srt = 0x0,
  1042. .end = 0xF,
  1043. .rd_addr = R_AX_RMAC_PLCP_MON_C1,
  1044. .rd_byte = 4,
  1045. .rd_msk = B_AX_RMAC_PLCP_MON_MASK
  1046. };
  1047. static const struct rtw89_mac_dbg_port_info dbg_port_trxptcl_c0 = {
  1048. .sel_addr = R_AX_DBGSEL_TRXPTCL,
  1049. .sel_byte = 1,
  1050. .sel_msk = B_AX_DBGSEL_TRXPTCL_MASK,
  1051. .srt = 0x08,
  1052. .end = 0x10,
  1053. .rd_addr = R_AX_DBG_PORT_SEL,
  1054. .rd_byte = 4,
  1055. .rd_msk = B_AX_DEBUG_ST_MASK
  1056. };
  1057. static const struct rtw89_mac_dbg_port_info dbg_port_trxptcl_c1 = {
  1058. .sel_addr = R_AX_DBGSEL_TRXPTCL_C1,
  1059. .sel_byte = 1,
  1060. .sel_msk = B_AX_DBGSEL_TRXPTCL_MASK,
  1061. .srt = 0x08,
  1062. .end = 0x10,
  1063. .rd_addr = R_AX_DBG_PORT_SEL,
  1064. .rd_byte = 4,
  1065. .rd_msk = B_AX_DEBUG_ST_MASK
  1066. };
  1067. static const struct rtw89_mac_dbg_port_info dbg_port_tx_infol_c0 = {
  1068. .sel_addr = R_AX_WMAC_TX_CTRL_DEBUG,
  1069. .sel_byte = 1,
  1070. .sel_msk = B_AX_TX_CTRL_DEBUG_SEL_MASK,
  1071. .srt = 0x00,
  1072. .end = 0x07,
  1073. .rd_addr = R_AX_WMAC_TX_INFO0_DEBUG,
  1074. .rd_byte = 4,
  1075. .rd_msk = B_AX_TX_CTRL_INFO_P0_MASK
  1076. };
  1077. static const struct rtw89_mac_dbg_port_info dbg_port_tx_infoh_c0 = {
  1078. .sel_addr = R_AX_WMAC_TX_CTRL_DEBUG,
  1079. .sel_byte = 1,
  1080. .sel_msk = B_AX_TX_CTRL_DEBUG_SEL_MASK,
  1081. .srt = 0x00,
  1082. .end = 0x07,
  1083. .rd_addr = R_AX_WMAC_TX_INFO1_DEBUG,
  1084. .rd_byte = 4,
  1085. .rd_msk = B_AX_TX_CTRL_INFO_P1_MASK
  1086. };
  1087. static const struct rtw89_mac_dbg_port_info dbg_port_tx_infol_c1 = {
  1088. .sel_addr = R_AX_WMAC_TX_CTRL_DEBUG_C1,
  1089. .sel_byte = 1,
  1090. .sel_msk = B_AX_TX_CTRL_DEBUG_SEL_MASK,
  1091. .srt = 0x00,
  1092. .end = 0x07,
  1093. .rd_addr = R_AX_WMAC_TX_INFO0_DEBUG_C1,
  1094. .rd_byte = 4,
  1095. .rd_msk = B_AX_TX_CTRL_INFO_P0_MASK
  1096. };
  1097. static const struct rtw89_mac_dbg_port_info dbg_port_tx_infoh_c1 = {
  1098. .sel_addr = R_AX_WMAC_TX_CTRL_DEBUG_C1,
  1099. .sel_byte = 1,
  1100. .sel_msk = B_AX_TX_CTRL_DEBUG_SEL_MASK,
  1101. .srt = 0x00,
  1102. .end = 0x07,
  1103. .rd_addr = R_AX_WMAC_TX_INFO1_DEBUG_C1,
  1104. .rd_byte = 4,
  1105. .rd_msk = B_AX_TX_CTRL_INFO_P1_MASK
  1106. };
  1107. static const struct rtw89_mac_dbg_port_info dbg_port_txtf_infol_c0 = {
  1108. .sel_addr = R_AX_WMAC_TX_TF_INFO_0,
  1109. .sel_byte = 1,
  1110. .sel_msk = B_AX_WMAC_TX_TF_INFO_SEL_MASK,
  1111. .srt = 0x00,
  1112. .end = 0x04,
  1113. .rd_addr = R_AX_WMAC_TX_TF_INFO_1,
  1114. .rd_byte = 4,
  1115. .rd_msk = B_AX_WMAC_TX_TF_INFO_P0_MASK
  1116. };
  1117. static const struct rtw89_mac_dbg_port_info dbg_port_txtf_infoh_c0 = {
  1118. .sel_addr = R_AX_WMAC_TX_TF_INFO_0,
  1119. .sel_byte = 1,
  1120. .sel_msk = B_AX_WMAC_TX_TF_INFO_SEL_MASK,
  1121. .srt = 0x00,
  1122. .end = 0x04,
  1123. .rd_addr = R_AX_WMAC_TX_TF_INFO_2,
  1124. .rd_byte = 4,
  1125. .rd_msk = B_AX_WMAC_TX_TF_INFO_P1_MASK
  1126. };
  1127. static const struct rtw89_mac_dbg_port_info dbg_port_txtf_infol_c1 = {
  1128. .sel_addr = R_AX_WMAC_TX_TF_INFO_0_C1,
  1129. .sel_byte = 1,
  1130. .sel_msk = B_AX_WMAC_TX_TF_INFO_SEL_MASK,
  1131. .srt = 0x00,
  1132. .end = 0x04,
  1133. .rd_addr = R_AX_WMAC_TX_TF_INFO_1_C1,
  1134. .rd_byte = 4,
  1135. .rd_msk = B_AX_WMAC_TX_TF_INFO_P0_MASK
  1136. };
  1137. static const struct rtw89_mac_dbg_port_info dbg_port_txtf_infoh_c1 = {
  1138. .sel_addr = R_AX_WMAC_TX_TF_INFO_0_C1,
  1139. .sel_byte = 1,
  1140. .sel_msk = B_AX_WMAC_TX_TF_INFO_SEL_MASK,
  1141. .srt = 0x00,
  1142. .end = 0x04,
  1143. .rd_addr = R_AX_WMAC_TX_TF_INFO_2_C1,
  1144. .rd_byte = 4,
  1145. .rd_msk = B_AX_WMAC_TX_TF_INFO_P1_MASK
  1146. };
  1147. static const struct rtw89_mac_dbg_port_info dbg_port_wde_bufmgn_freepg = {
  1148. .sel_addr = R_AX_WDE_DBG_FUN_INTF_CTL,
  1149. .sel_byte = 4,
  1150. .sel_msk = B_AX_WDE_DFI_DATA_MASK,
  1151. .srt = 0x80000000,
  1152. .end = 0x80000001,
  1153. .rd_addr = R_AX_WDE_DBG_FUN_INTF_DATA,
  1154. .rd_byte = 4,
  1155. .rd_msk = B_AX_WDE_DFI_DATA_MASK
  1156. };
  1157. static const struct rtw89_mac_dbg_port_info dbg_port_wde_bufmgn_quota = {
  1158. .sel_addr = R_AX_WDE_DBG_FUN_INTF_CTL,
  1159. .sel_byte = 4,
  1160. .sel_msk = B_AX_WDE_DFI_DATA_MASK,
  1161. .srt = 0x80010000,
  1162. .end = 0x80010004,
  1163. .rd_addr = R_AX_WDE_DBG_FUN_INTF_DATA,
  1164. .rd_byte = 4,
  1165. .rd_msk = B_AX_WDE_DFI_DATA_MASK
  1166. };
  1167. static const struct rtw89_mac_dbg_port_info dbg_port_wde_bufmgn_pagellt = {
  1168. .sel_addr = R_AX_WDE_DBG_FUN_INTF_CTL,
  1169. .sel_byte = 4,
  1170. .sel_msk = B_AX_WDE_DFI_DATA_MASK,
  1171. .srt = 0x80020000,
  1172. .end = 0x80020FFF,
  1173. .rd_addr = R_AX_WDE_DBG_FUN_INTF_DATA,
  1174. .rd_byte = 4,
  1175. .rd_msk = B_AX_WDE_DFI_DATA_MASK
  1176. };
  1177. static const struct rtw89_mac_dbg_port_info dbg_port_wde_bufmgn_pktinfo = {
  1178. .sel_addr = R_AX_WDE_DBG_FUN_INTF_CTL,
  1179. .sel_byte = 4,
  1180. .sel_msk = B_AX_WDE_DFI_DATA_MASK,
  1181. .srt = 0x80030000,
  1182. .end = 0x80030FFF,
  1183. .rd_addr = R_AX_WDE_DBG_FUN_INTF_DATA,
  1184. .rd_byte = 4,
  1185. .rd_msk = B_AX_WDE_DFI_DATA_MASK
  1186. };
  1187. static const struct rtw89_mac_dbg_port_info dbg_port_wde_quemgn_prepkt = {
  1188. .sel_addr = R_AX_WDE_DBG_FUN_INTF_CTL,
  1189. .sel_byte = 4,
  1190. .sel_msk = B_AX_WDE_DFI_DATA_MASK,
  1191. .srt = 0x80040000,
  1192. .end = 0x80040FFF,
  1193. .rd_addr = R_AX_WDE_DBG_FUN_INTF_DATA,
  1194. .rd_byte = 4,
  1195. .rd_msk = B_AX_WDE_DFI_DATA_MASK
  1196. };
  1197. static const struct rtw89_mac_dbg_port_info dbg_port_wde_quemgn_nxtpkt = {
  1198. .sel_addr = R_AX_WDE_DBG_FUN_INTF_CTL,
  1199. .sel_byte = 4,
  1200. .sel_msk = B_AX_WDE_DFI_DATA_MASK,
  1201. .srt = 0x80050000,
  1202. .end = 0x80050FFF,
  1203. .rd_addr = R_AX_WDE_DBG_FUN_INTF_DATA,
  1204. .rd_byte = 4,
  1205. .rd_msk = B_AX_WDE_DFI_DATA_MASK
  1206. };
  1207. static const struct rtw89_mac_dbg_port_info dbg_port_wde_quemgn_qlnktbl = {
  1208. .sel_addr = R_AX_WDE_DBG_FUN_INTF_CTL,
  1209. .sel_byte = 4,
  1210. .sel_msk = B_AX_WDE_DFI_DATA_MASK,
  1211. .srt = 0x80060000,
  1212. .end = 0x80060453,
  1213. .rd_addr = R_AX_WDE_DBG_FUN_INTF_DATA,
  1214. .rd_byte = 4,
  1215. .rd_msk = B_AX_WDE_DFI_DATA_MASK
  1216. };
  1217. static const struct rtw89_mac_dbg_port_info dbg_port_wde_quemgn_qempty = {
  1218. .sel_addr = R_AX_WDE_DBG_FUN_INTF_CTL,
  1219. .sel_byte = 4,
  1220. .sel_msk = B_AX_WDE_DFI_DATA_MASK,
  1221. .srt = 0x80070000,
  1222. .end = 0x80070011,
  1223. .rd_addr = R_AX_WDE_DBG_FUN_INTF_DATA,
  1224. .rd_byte = 4,
  1225. .rd_msk = B_AX_WDE_DFI_DATA_MASK
  1226. };
  1227. static const struct rtw89_mac_dbg_port_info dbg_port_ple_bufmgn_freepg = {
  1228. .sel_addr = R_AX_PLE_DBG_FUN_INTF_CTL,
  1229. .sel_byte = 4,
  1230. .sel_msk = B_AX_PLE_DFI_DATA_MASK,
  1231. .srt = 0x80000000,
  1232. .end = 0x80000001,
  1233. .rd_addr = R_AX_PLE_DBG_FUN_INTF_DATA,
  1234. .rd_byte = 4,
  1235. .rd_msk = B_AX_PLE_DFI_DATA_MASK
  1236. };
  1237. static const struct rtw89_mac_dbg_port_info dbg_port_ple_bufmgn_quota = {
  1238. .sel_addr = R_AX_PLE_DBG_FUN_INTF_CTL,
  1239. .sel_byte = 4,
  1240. .sel_msk = B_AX_PLE_DFI_DATA_MASK,
  1241. .srt = 0x80010000,
  1242. .end = 0x8001000A,
  1243. .rd_addr = R_AX_PLE_DBG_FUN_INTF_DATA,
  1244. .rd_byte = 4,
  1245. .rd_msk = B_AX_PLE_DFI_DATA_MASK
  1246. };
  1247. static const struct rtw89_mac_dbg_port_info dbg_port_ple_bufmgn_pagellt = {
  1248. .sel_addr = R_AX_PLE_DBG_FUN_INTF_CTL,
  1249. .sel_byte = 4,
  1250. .sel_msk = B_AX_PLE_DFI_DATA_MASK,
  1251. .srt = 0x80020000,
  1252. .end = 0x80020DBF,
  1253. .rd_addr = R_AX_PLE_DBG_FUN_INTF_DATA,
  1254. .rd_byte = 4,
  1255. .rd_msk = B_AX_PLE_DFI_DATA_MASK
  1256. };
  1257. static const struct rtw89_mac_dbg_port_info dbg_port_ple_bufmgn_pktinfo = {
  1258. .sel_addr = R_AX_PLE_DBG_FUN_INTF_CTL,
  1259. .sel_byte = 4,
  1260. .sel_msk = B_AX_PLE_DFI_DATA_MASK,
  1261. .srt = 0x80030000,
  1262. .end = 0x80030DBF,
  1263. .rd_addr = R_AX_PLE_DBG_FUN_INTF_DATA,
  1264. .rd_byte = 4,
  1265. .rd_msk = B_AX_PLE_DFI_DATA_MASK
  1266. };
  1267. static const struct rtw89_mac_dbg_port_info dbg_port_ple_quemgn_prepkt = {
  1268. .sel_addr = R_AX_PLE_DBG_FUN_INTF_CTL,
  1269. .sel_byte = 4,
  1270. .sel_msk = B_AX_PLE_DFI_DATA_MASK,
  1271. .srt = 0x80040000,
  1272. .end = 0x80040DBF,
  1273. .rd_addr = R_AX_PLE_DBG_FUN_INTF_DATA,
  1274. .rd_byte = 4,
  1275. .rd_msk = B_AX_PLE_DFI_DATA_MASK
  1276. };
  1277. static const struct rtw89_mac_dbg_port_info dbg_port_ple_quemgn_nxtpkt = {
  1278. .sel_addr = R_AX_PLE_DBG_FUN_INTF_CTL,
  1279. .sel_byte = 4,
  1280. .sel_msk = B_AX_PLE_DFI_DATA_MASK,
  1281. .srt = 0x80050000,
  1282. .end = 0x80050DBF,
  1283. .rd_addr = R_AX_PLE_DBG_FUN_INTF_DATA,
  1284. .rd_byte = 4,
  1285. .rd_msk = B_AX_PLE_DFI_DATA_MASK
  1286. };
  1287. static const struct rtw89_mac_dbg_port_info dbg_port_ple_quemgn_qlnktbl = {
  1288. .sel_addr = R_AX_PLE_DBG_FUN_INTF_CTL,
  1289. .sel_byte = 4,
  1290. .sel_msk = B_AX_PLE_DFI_DATA_MASK,
  1291. .srt = 0x80060000,
  1292. .end = 0x80060041,
  1293. .rd_addr = R_AX_PLE_DBG_FUN_INTF_DATA,
  1294. .rd_byte = 4,
  1295. .rd_msk = B_AX_PLE_DFI_DATA_MASK
  1296. };
  1297. static const struct rtw89_mac_dbg_port_info dbg_port_ple_quemgn_qempty = {
  1298. .sel_addr = R_AX_PLE_DBG_FUN_INTF_CTL,
  1299. .sel_byte = 4,
  1300. .sel_msk = B_AX_PLE_DFI_DATA_MASK,
  1301. .srt = 0x80070000,
  1302. .end = 0x80070001,
  1303. .rd_addr = R_AX_PLE_DBG_FUN_INTF_DATA,
  1304. .rd_byte = 4,
  1305. .rd_msk = B_AX_PLE_DFI_DATA_MASK
  1306. };
  1307. static const struct rtw89_mac_dbg_port_info dbg_port_pktinfo = {
  1308. .sel_addr = R_AX_DBG_FUN_INTF_CTL,
  1309. .sel_byte = 4,
  1310. .sel_msk = B_AX_DFI_DATA_MASK,
  1311. .srt = 0x80000000,
  1312. .end = 0x8000017f,
  1313. .rd_addr = R_AX_DBG_FUN_INTF_DATA,
  1314. .rd_byte = 4,
  1315. .rd_msk = B_AX_DFI_DATA_MASK
  1316. };
  1317. static const struct rtw89_mac_dbg_port_info dbg_port_pcie_txdma = {
  1318. .sel_addr = R_AX_PCIE_DBG_CTRL,
  1319. .sel_byte = 2,
  1320. .sel_msk = B_AX_DBG_SEL_MASK,
  1321. .srt = 0x00,
  1322. .end = 0x03,
  1323. .rd_addr = R_AX_DBG_PORT_SEL,
  1324. .rd_byte = 4,
  1325. .rd_msk = B_AX_DEBUG_ST_MASK
  1326. };
  1327. static const struct rtw89_mac_dbg_port_info dbg_port_pcie_rxdma = {
  1328. .sel_addr = R_AX_PCIE_DBG_CTRL,
  1329. .sel_byte = 2,
  1330. .sel_msk = B_AX_DBG_SEL_MASK,
  1331. .srt = 0x00,
  1332. .end = 0x04,
  1333. .rd_addr = R_AX_DBG_PORT_SEL,
  1334. .rd_byte = 4,
  1335. .rd_msk = B_AX_DEBUG_ST_MASK
  1336. };
  1337. static const struct rtw89_mac_dbg_port_info dbg_port_pcie_cvt = {
  1338. .sel_addr = R_AX_PCIE_DBG_CTRL,
  1339. .sel_byte = 2,
  1340. .sel_msk = B_AX_DBG_SEL_MASK,
  1341. .srt = 0x00,
  1342. .end = 0x01,
  1343. .rd_addr = R_AX_DBG_PORT_SEL,
  1344. .rd_byte = 4,
  1345. .rd_msk = B_AX_DEBUG_ST_MASK
  1346. };
  1347. static const struct rtw89_mac_dbg_port_info dbg_port_pcie_cxpl = {
  1348. .sel_addr = R_AX_PCIE_DBG_CTRL,
  1349. .sel_byte = 2,
  1350. .sel_msk = B_AX_DBG_SEL_MASK,
  1351. .srt = 0x00,
  1352. .end = 0x05,
  1353. .rd_addr = R_AX_DBG_PORT_SEL,
  1354. .rd_byte = 4,
  1355. .rd_msk = B_AX_DEBUG_ST_MASK
  1356. };
  1357. static const struct rtw89_mac_dbg_port_info dbg_port_pcie_io = {
  1358. .sel_addr = R_AX_PCIE_DBG_CTRL,
  1359. .sel_byte = 2,
  1360. .sel_msk = B_AX_DBG_SEL_MASK,
  1361. .srt = 0x00,
  1362. .end = 0x05,
  1363. .rd_addr = R_AX_DBG_PORT_SEL,
  1364. .rd_byte = 4,
  1365. .rd_msk = B_AX_DEBUG_ST_MASK
  1366. };
  1367. static const struct rtw89_mac_dbg_port_info dbg_port_pcie_misc = {
  1368. .sel_addr = R_AX_PCIE_DBG_CTRL,
  1369. .sel_byte = 2,
  1370. .sel_msk = B_AX_DBG_SEL_MASK,
  1371. .srt = 0x00,
  1372. .end = 0x06,
  1373. .rd_addr = R_AX_DBG_PORT_SEL,
  1374. .rd_byte = 4,
  1375. .rd_msk = B_AX_DEBUG_ST_MASK
  1376. };
  1377. static const struct rtw89_mac_dbg_port_info dbg_port_pcie_misc2 = {
  1378. .sel_addr = R_AX_DBG_CTRL,
  1379. .sel_byte = 1,
  1380. .sel_msk = B_AX_DBG_SEL0,
  1381. .srt = 0x34,
  1382. .end = 0x3C,
  1383. .rd_addr = R_AX_DBG_PORT_SEL,
  1384. .rd_byte = 4,
  1385. .rd_msk = B_AX_DEBUG_ST_MASK
  1386. };
  1387. static const struct rtw89_mac_dbg_port_info *
  1388. rtw89_debug_mac_dbg_port_sel(struct seq_file *m,
  1389. struct rtw89_dev *rtwdev, u32 sel)
  1390. {
  1391. const struct rtw89_mac_dbg_port_info *info;
  1392. u32 val32;
  1393. u16 val16;
  1394. u8 val8;
  1395. switch (sel) {
  1396. case RTW89_DBG_PORT_SEL_PTCL_C0:
  1397. info = &dbg_port_ptcl_c0;
  1398. val16 = rtw89_read16(rtwdev, R_AX_PTCL_DBG);
  1399. val16 |= B_AX_PTCL_DBG_EN;
  1400. rtw89_write16(rtwdev, R_AX_PTCL_DBG, val16);
  1401. seq_puts(m, "Enable PTCL C0 dbgport.\n");
  1402. break;
  1403. case RTW89_DBG_PORT_SEL_PTCL_C1:
  1404. info = &dbg_port_ptcl_c1;
  1405. val16 = rtw89_read16(rtwdev, R_AX_PTCL_DBG_C1);
  1406. val16 |= B_AX_PTCL_DBG_EN;
  1407. rtw89_write16(rtwdev, R_AX_PTCL_DBG_C1, val16);
  1408. seq_puts(m, "Enable PTCL C1 dbgport.\n");
  1409. break;
  1410. case RTW89_DBG_PORT_SEL_SCH_C0:
  1411. info = &dbg_port_sch_c0;
  1412. val32 = rtw89_read32(rtwdev, R_AX_SCH_DBG_SEL);
  1413. val32 |= B_AX_SCH_DBG_EN;
  1414. rtw89_write32(rtwdev, R_AX_SCH_DBG_SEL, val32);
  1415. seq_puts(m, "Enable SCH C0 dbgport.\n");
  1416. break;
  1417. case RTW89_DBG_PORT_SEL_SCH_C1:
  1418. info = &dbg_port_sch_c1;
  1419. val32 = rtw89_read32(rtwdev, R_AX_SCH_DBG_SEL_C1);
  1420. val32 |= B_AX_SCH_DBG_EN;
  1421. rtw89_write32(rtwdev, R_AX_SCH_DBG_SEL_C1, val32);
  1422. seq_puts(m, "Enable SCH C1 dbgport.\n");
  1423. break;
  1424. case RTW89_DBG_PORT_SEL_TMAC_C0:
  1425. info = &dbg_port_tmac_c0;
  1426. val32 = rtw89_read32(rtwdev, R_AX_DBGSEL_TRXPTCL);
  1427. val32 = u32_replace_bits(val32, TRXPTRL_DBG_SEL_TMAC,
  1428. B_AX_DBGSEL_TRXPTCL_MASK);
  1429. rtw89_write32(rtwdev, R_AX_DBGSEL_TRXPTCL, val32);
  1430. val32 = rtw89_read32(rtwdev, R_AX_DBG_CTRL);
  1431. val32 = u32_replace_bits(val32, TMAC_DBG_SEL_C0, B_AX_DBG_SEL0);
  1432. val32 = u32_replace_bits(val32, TMAC_DBG_SEL_C0, B_AX_DBG_SEL1);
  1433. rtw89_write32(rtwdev, R_AX_DBG_CTRL, val32);
  1434. val32 = rtw89_read32(rtwdev, R_AX_SYS_STATUS1);
  1435. val32 = u32_replace_bits(val32, MAC_DBG_SEL, B_AX_SEL_0XC0_MASK);
  1436. rtw89_write32(rtwdev, R_AX_SYS_STATUS1, val32);
  1437. seq_puts(m, "Enable TMAC C0 dbgport.\n");
  1438. break;
  1439. case RTW89_DBG_PORT_SEL_TMAC_C1:
  1440. info = &dbg_port_tmac_c1;
  1441. val32 = rtw89_read32(rtwdev, R_AX_DBGSEL_TRXPTCL_C1);
  1442. val32 = u32_replace_bits(val32, TRXPTRL_DBG_SEL_TMAC,
  1443. B_AX_DBGSEL_TRXPTCL_MASK);
  1444. rtw89_write32(rtwdev, R_AX_DBGSEL_TRXPTCL_C1, val32);
  1445. val32 = rtw89_read32(rtwdev, R_AX_DBG_CTRL);
  1446. val32 = u32_replace_bits(val32, TMAC_DBG_SEL_C1, B_AX_DBG_SEL0);
  1447. val32 = u32_replace_bits(val32, TMAC_DBG_SEL_C1, B_AX_DBG_SEL1);
  1448. rtw89_write32(rtwdev, R_AX_DBG_CTRL, val32);
  1449. val32 = rtw89_read32(rtwdev, R_AX_SYS_STATUS1);
  1450. val32 = u32_replace_bits(val32, MAC_DBG_SEL, B_AX_SEL_0XC0_MASK);
  1451. rtw89_write32(rtwdev, R_AX_SYS_STATUS1, val32);
  1452. seq_puts(m, "Enable TMAC C1 dbgport.\n");
  1453. break;
  1454. case RTW89_DBG_PORT_SEL_RMAC_C0:
  1455. info = &dbg_port_rmac_c0;
  1456. val32 = rtw89_read32(rtwdev, R_AX_DBGSEL_TRXPTCL);
  1457. val32 = u32_replace_bits(val32, TRXPTRL_DBG_SEL_RMAC,
  1458. B_AX_DBGSEL_TRXPTCL_MASK);
  1459. rtw89_write32(rtwdev, R_AX_DBGSEL_TRXPTCL, val32);
  1460. val32 = rtw89_read32(rtwdev, R_AX_DBG_CTRL);
  1461. val32 = u32_replace_bits(val32, RMAC_DBG_SEL_C0, B_AX_DBG_SEL0);
  1462. val32 = u32_replace_bits(val32, RMAC_DBG_SEL_C0, B_AX_DBG_SEL1);
  1463. rtw89_write32(rtwdev, R_AX_DBG_CTRL, val32);
  1464. val32 = rtw89_read32(rtwdev, R_AX_SYS_STATUS1);
  1465. val32 = u32_replace_bits(val32, MAC_DBG_SEL, B_AX_SEL_0XC0_MASK);
  1466. rtw89_write32(rtwdev, R_AX_SYS_STATUS1, val32);
  1467. val8 = rtw89_read8(rtwdev, R_AX_DBGSEL_TRXPTCL);
  1468. val8 = u8_replace_bits(val8, RMAC_CMAC_DBG_SEL,
  1469. B_AX_DBGSEL_TRXPTCL_MASK);
  1470. rtw89_write8(rtwdev, R_AX_DBGSEL_TRXPTCL, val8);
  1471. seq_puts(m, "Enable RMAC C0 dbgport.\n");
  1472. break;
  1473. case RTW89_DBG_PORT_SEL_RMAC_C1:
  1474. info = &dbg_port_rmac_c1;
  1475. val32 = rtw89_read32(rtwdev, R_AX_DBGSEL_TRXPTCL_C1);
  1476. val32 = u32_replace_bits(val32, TRXPTRL_DBG_SEL_RMAC,
  1477. B_AX_DBGSEL_TRXPTCL_MASK);
  1478. rtw89_write32(rtwdev, R_AX_DBGSEL_TRXPTCL_C1, val32);
  1479. val32 = rtw89_read32(rtwdev, R_AX_DBG_CTRL);
  1480. val32 = u32_replace_bits(val32, RMAC_DBG_SEL_C1, B_AX_DBG_SEL0);
  1481. val32 = u32_replace_bits(val32, RMAC_DBG_SEL_C1, B_AX_DBG_SEL1);
  1482. rtw89_write32(rtwdev, R_AX_DBG_CTRL, val32);
  1483. val32 = rtw89_read32(rtwdev, R_AX_SYS_STATUS1);
  1484. val32 = u32_replace_bits(val32, MAC_DBG_SEL, B_AX_SEL_0XC0_MASK);
  1485. rtw89_write32(rtwdev, R_AX_SYS_STATUS1, val32);
  1486. val8 = rtw89_read8(rtwdev, R_AX_DBGSEL_TRXPTCL_C1);
  1487. val8 = u8_replace_bits(val8, RMAC_CMAC_DBG_SEL,
  1488. B_AX_DBGSEL_TRXPTCL_MASK);
  1489. rtw89_write8(rtwdev, R_AX_DBGSEL_TRXPTCL_C1, val8);
  1490. seq_puts(m, "Enable RMAC C1 dbgport.\n");
  1491. break;
  1492. case RTW89_DBG_PORT_SEL_RMACST_C0:
  1493. info = &dbg_port_rmacst_c0;
  1494. seq_puts(m, "Enable RMAC state C0 dbgport.\n");
  1495. break;
  1496. case RTW89_DBG_PORT_SEL_RMACST_C1:
  1497. info = &dbg_port_rmacst_c1;
  1498. seq_puts(m, "Enable RMAC state C1 dbgport.\n");
  1499. break;
  1500. case RTW89_DBG_PORT_SEL_RMAC_PLCP_C0:
  1501. info = &dbg_port_rmac_plcp_c0;
  1502. seq_puts(m, "Enable RMAC PLCP C0 dbgport.\n");
  1503. break;
  1504. case RTW89_DBG_PORT_SEL_RMAC_PLCP_C1:
  1505. info = &dbg_port_rmac_plcp_c1;
  1506. seq_puts(m, "Enable RMAC PLCP C1 dbgport.\n");
  1507. break;
  1508. case RTW89_DBG_PORT_SEL_TRXPTCL_C0:
  1509. info = &dbg_port_trxptcl_c0;
  1510. val32 = rtw89_read32(rtwdev, R_AX_DBG_CTRL);
  1511. val32 = u32_replace_bits(val32, TRXPTCL_DBG_SEL_C0, B_AX_DBG_SEL0);
  1512. val32 = u32_replace_bits(val32, TRXPTCL_DBG_SEL_C0, B_AX_DBG_SEL1);
  1513. rtw89_write32(rtwdev, R_AX_DBG_CTRL, val32);
  1514. val32 = rtw89_read32(rtwdev, R_AX_SYS_STATUS1);
  1515. val32 = u32_replace_bits(val32, MAC_DBG_SEL, B_AX_SEL_0XC0_MASK);
  1516. rtw89_write32(rtwdev, R_AX_SYS_STATUS1, val32);
  1517. seq_puts(m, "Enable TRXPTCL C0 dbgport.\n");
  1518. break;
  1519. case RTW89_DBG_PORT_SEL_TRXPTCL_C1:
  1520. info = &dbg_port_trxptcl_c1;
  1521. val32 = rtw89_read32(rtwdev, R_AX_DBG_CTRL);
  1522. val32 = u32_replace_bits(val32, TRXPTCL_DBG_SEL_C1, B_AX_DBG_SEL0);
  1523. val32 = u32_replace_bits(val32, TRXPTCL_DBG_SEL_C1, B_AX_DBG_SEL1);
  1524. rtw89_write32(rtwdev, R_AX_DBG_CTRL, val32);
  1525. val32 = rtw89_read32(rtwdev, R_AX_SYS_STATUS1);
  1526. val32 = u32_replace_bits(val32, MAC_DBG_SEL, B_AX_SEL_0XC0_MASK);
  1527. rtw89_write32(rtwdev, R_AX_SYS_STATUS1, val32);
  1528. seq_puts(m, "Enable TRXPTCL C1 dbgport.\n");
  1529. break;
  1530. case RTW89_DBG_PORT_SEL_TX_INFOL_C0:
  1531. info = &dbg_port_tx_infol_c0;
  1532. val32 = rtw89_read32(rtwdev, R_AX_TCR1);
  1533. val32 |= B_AX_TCR_FORCE_READ_TXDFIFO;
  1534. rtw89_write32(rtwdev, R_AX_TCR1, val32);
  1535. seq_puts(m, "Enable tx infol dump.\n");
  1536. break;
  1537. case RTW89_DBG_PORT_SEL_TX_INFOH_C0:
  1538. info = &dbg_port_tx_infoh_c0;
  1539. val32 = rtw89_read32(rtwdev, R_AX_TCR1);
  1540. val32 |= B_AX_TCR_FORCE_READ_TXDFIFO;
  1541. rtw89_write32(rtwdev, R_AX_TCR1, val32);
  1542. seq_puts(m, "Enable tx infoh dump.\n");
  1543. break;
  1544. case RTW89_DBG_PORT_SEL_TX_INFOL_C1:
  1545. info = &dbg_port_tx_infol_c1;
  1546. val32 = rtw89_read32(rtwdev, R_AX_TCR1_C1);
  1547. val32 |= B_AX_TCR_FORCE_READ_TXDFIFO;
  1548. rtw89_write32(rtwdev, R_AX_TCR1_C1, val32);
  1549. seq_puts(m, "Enable tx infol dump.\n");
  1550. break;
  1551. case RTW89_DBG_PORT_SEL_TX_INFOH_C1:
  1552. info = &dbg_port_tx_infoh_c1;
  1553. val32 = rtw89_read32(rtwdev, R_AX_TCR1_C1);
  1554. val32 |= B_AX_TCR_FORCE_READ_TXDFIFO;
  1555. rtw89_write32(rtwdev, R_AX_TCR1_C1, val32);
  1556. seq_puts(m, "Enable tx infoh dump.\n");
  1557. break;
  1558. case RTW89_DBG_PORT_SEL_TXTF_INFOL_C0:
  1559. info = &dbg_port_txtf_infol_c0;
  1560. val32 = rtw89_read32(rtwdev, R_AX_TCR1);
  1561. val32 |= B_AX_TCR_FORCE_READ_TXDFIFO;
  1562. rtw89_write32(rtwdev, R_AX_TCR1, val32);
  1563. seq_puts(m, "Enable tx tf infol dump.\n");
  1564. break;
  1565. case RTW89_DBG_PORT_SEL_TXTF_INFOH_C0:
  1566. info = &dbg_port_txtf_infoh_c0;
  1567. val32 = rtw89_read32(rtwdev, R_AX_TCR1);
  1568. val32 |= B_AX_TCR_FORCE_READ_TXDFIFO;
  1569. rtw89_write32(rtwdev, R_AX_TCR1, val32);
  1570. seq_puts(m, "Enable tx tf infoh dump.\n");
  1571. break;
  1572. case RTW89_DBG_PORT_SEL_TXTF_INFOL_C1:
  1573. info = &dbg_port_txtf_infol_c1;
  1574. val32 = rtw89_read32(rtwdev, R_AX_TCR1_C1);
  1575. val32 |= B_AX_TCR_FORCE_READ_TXDFIFO;
  1576. rtw89_write32(rtwdev, R_AX_TCR1_C1, val32);
  1577. seq_puts(m, "Enable tx tf infol dump.\n");
  1578. break;
  1579. case RTW89_DBG_PORT_SEL_TXTF_INFOH_C1:
  1580. info = &dbg_port_txtf_infoh_c1;
  1581. val32 = rtw89_read32(rtwdev, R_AX_TCR1_C1);
  1582. val32 |= B_AX_TCR_FORCE_READ_TXDFIFO;
  1583. rtw89_write32(rtwdev, R_AX_TCR1_C1, val32);
  1584. seq_puts(m, "Enable tx tf infoh dump.\n");
  1585. break;
  1586. case RTW89_DBG_PORT_SEL_WDE_BUFMGN_FREEPG:
  1587. info = &dbg_port_wde_bufmgn_freepg;
  1588. seq_puts(m, "Enable wde bufmgn freepg dump.\n");
  1589. break;
  1590. case RTW89_DBG_PORT_SEL_WDE_BUFMGN_QUOTA:
  1591. info = &dbg_port_wde_bufmgn_quota;
  1592. seq_puts(m, "Enable wde bufmgn quota dump.\n");
  1593. break;
  1594. case RTW89_DBG_PORT_SEL_WDE_BUFMGN_PAGELLT:
  1595. info = &dbg_port_wde_bufmgn_pagellt;
  1596. seq_puts(m, "Enable wde bufmgn pagellt dump.\n");
  1597. break;
  1598. case RTW89_DBG_PORT_SEL_WDE_BUFMGN_PKTINFO:
  1599. info = &dbg_port_wde_bufmgn_pktinfo;
  1600. seq_puts(m, "Enable wde bufmgn pktinfo dump.\n");
  1601. break;
  1602. case RTW89_DBG_PORT_SEL_WDE_QUEMGN_PREPKT:
  1603. info = &dbg_port_wde_quemgn_prepkt;
  1604. seq_puts(m, "Enable wde quemgn prepkt dump.\n");
  1605. break;
  1606. case RTW89_DBG_PORT_SEL_WDE_QUEMGN_NXTPKT:
  1607. info = &dbg_port_wde_quemgn_nxtpkt;
  1608. seq_puts(m, "Enable wde quemgn nxtpkt dump.\n");
  1609. break;
  1610. case RTW89_DBG_PORT_SEL_WDE_QUEMGN_QLNKTBL:
  1611. info = &dbg_port_wde_quemgn_qlnktbl;
  1612. seq_puts(m, "Enable wde quemgn qlnktbl dump.\n");
  1613. break;
  1614. case RTW89_DBG_PORT_SEL_WDE_QUEMGN_QEMPTY:
  1615. info = &dbg_port_wde_quemgn_qempty;
  1616. seq_puts(m, "Enable wde quemgn qempty dump.\n");
  1617. break;
  1618. case RTW89_DBG_PORT_SEL_PLE_BUFMGN_FREEPG:
  1619. info = &dbg_port_ple_bufmgn_freepg;
  1620. seq_puts(m, "Enable ple bufmgn freepg dump.\n");
  1621. break;
  1622. case RTW89_DBG_PORT_SEL_PLE_BUFMGN_QUOTA:
  1623. info = &dbg_port_ple_bufmgn_quota;
  1624. seq_puts(m, "Enable ple bufmgn quota dump.\n");
  1625. break;
  1626. case RTW89_DBG_PORT_SEL_PLE_BUFMGN_PAGELLT:
  1627. info = &dbg_port_ple_bufmgn_pagellt;
  1628. seq_puts(m, "Enable ple bufmgn pagellt dump.\n");
  1629. break;
  1630. case RTW89_DBG_PORT_SEL_PLE_BUFMGN_PKTINFO:
  1631. info = &dbg_port_ple_bufmgn_pktinfo;
  1632. seq_puts(m, "Enable ple bufmgn pktinfo dump.\n");
  1633. break;
  1634. case RTW89_DBG_PORT_SEL_PLE_QUEMGN_PREPKT:
  1635. info = &dbg_port_ple_quemgn_prepkt;
  1636. seq_puts(m, "Enable ple quemgn prepkt dump.\n");
  1637. break;
  1638. case RTW89_DBG_PORT_SEL_PLE_QUEMGN_NXTPKT:
  1639. info = &dbg_port_ple_quemgn_nxtpkt;
  1640. seq_puts(m, "Enable ple quemgn nxtpkt dump.\n");
  1641. break;
  1642. case RTW89_DBG_PORT_SEL_PLE_QUEMGN_QLNKTBL:
  1643. info = &dbg_port_ple_quemgn_qlnktbl;
  1644. seq_puts(m, "Enable ple quemgn qlnktbl dump.\n");
  1645. break;
  1646. case RTW89_DBG_PORT_SEL_PLE_QUEMGN_QEMPTY:
  1647. info = &dbg_port_ple_quemgn_qempty;
  1648. seq_puts(m, "Enable ple quemgn qempty dump.\n");
  1649. break;
  1650. case RTW89_DBG_PORT_SEL_PKTINFO:
  1651. info = &dbg_port_pktinfo;
  1652. seq_puts(m, "Enable pktinfo dump.\n");
  1653. break;
  1654. case RTW89_DBG_PORT_SEL_PCIE_TXDMA:
  1655. info = &dbg_port_pcie_txdma;
  1656. val32 = rtw89_read32(rtwdev, R_AX_DBG_CTRL);
  1657. val32 = u32_replace_bits(val32, PCIE_TXDMA_DBG_SEL, B_AX_DBG_SEL0);
  1658. val32 = u32_replace_bits(val32, PCIE_TXDMA_DBG_SEL, B_AX_DBG_SEL1);
  1659. rtw89_write32(rtwdev, R_AX_DBG_CTRL, val32);
  1660. seq_puts(m, "Enable pcie txdma dump.\n");
  1661. break;
  1662. case RTW89_DBG_PORT_SEL_PCIE_RXDMA:
  1663. info = &dbg_port_pcie_rxdma;
  1664. val32 = rtw89_read32(rtwdev, R_AX_DBG_CTRL);
  1665. val32 = u32_replace_bits(val32, PCIE_RXDMA_DBG_SEL, B_AX_DBG_SEL0);
  1666. val32 = u32_replace_bits(val32, PCIE_RXDMA_DBG_SEL, B_AX_DBG_SEL1);
  1667. rtw89_write32(rtwdev, R_AX_DBG_CTRL, val32);
  1668. seq_puts(m, "Enable pcie rxdma dump.\n");
  1669. break;
  1670. case RTW89_DBG_PORT_SEL_PCIE_CVT:
  1671. info = &dbg_port_pcie_cvt;
  1672. val32 = rtw89_read32(rtwdev, R_AX_DBG_CTRL);
  1673. val32 = u32_replace_bits(val32, PCIE_CVT_DBG_SEL, B_AX_DBG_SEL0);
  1674. val32 = u32_replace_bits(val32, PCIE_CVT_DBG_SEL, B_AX_DBG_SEL1);
  1675. rtw89_write32(rtwdev, R_AX_DBG_CTRL, val32);
  1676. seq_puts(m, "Enable pcie cvt dump.\n");
  1677. break;
  1678. case RTW89_DBG_PORT_SEL_PCIE_CXPL:
  1679. info = &dbg_port_pcie_cxpl;
  1680. val32 = rtw89_read32(rtwdev, R_AX_DBG_CTRL);
  1681. val32 = u32_replace_bits(val32, PCIE_CXPL_DBG_SEL, B_AX_DBG_SEL0);
  1682. val32 = u32_replace_bits(val32, PCIE_CXPL_DBG_SEL, B_AX_DBG_SEL1);
  1683. rtw89_write32(rtwdev, R_AX_DBG_CTRL, val32);
  1684. seq_puts(m, "Enable pcie cxpl dump.\n");
  1685. break;
  1686. case RTW89_DBG_PORT_SEL_PCIE_IO:
  1687. info = &dbg_port_pcie_io;
  1688. val32 = rtw89_read32(rtwdev, R_AX_DBG_CTRL);
  1689. val32 = u32_replace_bits(val32, PCIE_IO_DBG_SEL, B_AX_DBG_SEL0);
  1690. val32 = u32_replace_bits(val32, PCIE_IO_DBG_SEL, B_AX_DBG_SEL1);
  1691. rtw89_write32(rtwdev, R_AX_DBG_CTRL, val32);
  1692. seq_puts(m, "Enable pcie io dump.\n");
  1693. break;
  1694. case RTW89_DBG_PORT_SEL_PCIE_MISC:
  1695. info = &dbg_port_pcie_misc;
  1696. val32 = rtw89_read32(rtwdev, R_AX_DBG_CTRL);
  1697. val32 = u32_replace_bits(val32, PCIE_MISC_DBG_SEL, B_AX_DBG_SEL0);
  1698. val32 = u32_replace_bits(val32, PCIE_MISC_DBG_SEL, B_AX_DBG_SEL1);
  1699. rtw89_write32(rtwdev, R_AX_DBG_CTRL, val32);
  1700. seq_puts(m, "Enable pcie misc dump.\n");
  1701. break;
  1702. case RTW89_DBG_PORT_SEL_PCIE_MISC2:
  1703. info = &dbg_port_pcie_misc2;
  1704. val16 = rtw89_read16(rtwdev, R_AX_PCIE_DBG_CTRL);
  1705. val16 = u16_replace_bits(val16, PCIE_MISC2_DBG_SEL,
  1706. B_AX_DBG_SEL_MASK);
  1707. rtw89_write16(rtwdev, R_AX_PCIE_DBG_CTRL, val16);
  1708. seq_puts(m, "Enable pcie misc2 dump.\n");
  1709. break;
  1710. default:
  1711. seq_puts(m, "Dbg port select err\n");
  1712. return NULL;
  1713. }
  1714. return info;
  1715. }
  1716. static bool is_dbg_port_valid(struct rtw89_dev *rtwdev, u32 sel)
  1717. {
  1718. if (rtwdev->hci.type != RTW89_HCI_TYPE_PCIE &&
  1719. sel >= RTW89_DBG_PORT_SEL_PCIE_TXDMA &&
  1720. sel <= RTW89_DBG_PORT_SEL_PCIE_MISC2)
  1721. return false;
  1722. if (rtwdev->chip->chip_id == RTL8852B &&
  1723. sel >= RTW89_DBG_PORT_SEL_PTCL_C1 &&
  1724. sel <= RTW89_DBG_PORT_SEL_TXTF_INFOH_C1)
  1725. return false;
  1726. if (rtw89_mac_check_mac_en(rtwdev, 0, RTW89_DMAC_SEL) &&
  1727. sel >= RTW89_DBG_PORT_SEL_WDE_BUFMGN_FREEPG &&
  1728. sel <= RTW89_DBG_PORT_SEL_PKTINFO)
  1729. return false;
  1730. if (rtw89_mac_check_mac_en(rtwdev, 0, RTW89_CMAC_SEL) &&
  1731. sel >= RTW89_DBG_PORT_SEL_PTCL_C0 &&
  1732. sel <= RTW89_DBG_PORT_SEL_TXTF_INFOH_C0)
  1733. return false;
  1734. if (rtw89_mac_check_mac_en(rtwdev, 1, RTW89_CMAC_SEL) &&
  1735. sel >= RTW89_DBG_PORT_SEL_PTCL_C1 &&
  1736. sel <= RTW89_DBG_PORT_SEL_TXTF_INFOH_C1)
  1737. return false;
  1738. return true;
  1739. }
  1740. static int rtw89_debug_mac_dbg_port_dump(struct rtw89_dev *rtwdev,
  1741. struct seq_file *m, u32 sel)
  1742. {
  1743. const struct rtw89_mac_dbg_port_info *info;
  1744. u8 val8;
  1745. u16 val16;
  1746. u32 val32;
  1747. u32 i;
  1748. info = rtw89_debug_mac_dbg_port_sel(m, rtwdev, sel);
  1749. if (!info) {
  1750. rtw89_err(rtwdev, "failed to select debug port %d\n", sel);
  1751. return -EINVAL;
  1752. }
  1753. #define case_DBG_SEL(__sel) \
  1754. case RTW89_DBG_PORT_SEL_##__sel: \
  1755. seq_puts(m, "Dump debug port " #__sel ":\n"); \
  1756. break
  1757. switch (sel) {
  1758. case_DBG_SEL(PTCL_C0);
  1759. case_DBG_SEL(PTCL_C1);
  1760. case_DBG_SEL(SCH_C0);
  1761. case_DBG_SEL(SCH_C1);
  1762. case_DBG_SEL(TMAC_C0);
  1763. case_DBG_SEL(TMAC_C1);
  1764. case_DBG_SEL(RMAC_C0);
  1765. case_DBG_SEL(RMAC_C1);
  1766. case_DBG_SEL(RMACST_C0);
  1767. case_DBG_SEL(RMACST_C1);
  1768. case_DBG_SEL(TRXPTCL_C0);
  1769. case_DBG_SEL(TRXPTCL_C1);
  1770. case_DBG_SEL(TX_INFOL_C0);
  1771. case_DBG_SEL(TX_INFOH_C0);
  1772. case_DBG_SEL(TX_INFOL_C1);
  1773. case_DBG_SEL(TX_INFOH_C1);
  1774. case_DBG_SEL(TXTF_INFOL_C0);
  1775. case_DBG_SEL(TXTF_INFOH_C0);
  1776. case_DBG_SEL(TXTF_INFOL_C1);
  1777. case_DBG_SEL(TXTF_INFOH_C1);
  1778. case_DBG_SEL(WDE_BUFMGN_FREEPG);
  1779. case_DBG_SEL(WDE_BUFMGN_QUOTA);
  1780. case_DBG_SEL(WDE_BUFMGN_PAGELLT);
  1781. case_DBG_SEL(WDE_BUFMGN_PKTINFO);
  1782. case_DBG_SEL(WDE_QUEMGN_PREPKT);
  1783. case_DBG_SEL(WDE_QUEMGN_NXTPKT);
  1784. case_DBG_SEL(WDE_QUEMGN_QLNKTBL);
  1785. case_DBG_SEL(WDE_QUEMGN_QEMPTY);
  1786. case_DBG_SEL(PLE_BUFMGN_FREEPG);
  1787. case_DBG_SEL(PLE_BUFMGN_QUOTA);
  1788. case_DBG_SEL(PLE_BUFMGN_PAGELLT);
  1789. case_DBG_SEL(PLE_BUFMGN_PKTINFO);
  1790. case_DBG_SEL(PLE_QUEMGN_PREPKT);
  1791. case_DBG_SEL(PLE_QUEMGN_NXTPKT);
  1792. case_DBG_SEL(PLE_QUEMGN_QLNKTBL);
  1793. case_DBG_SEL(PLE_QUEMGN_QEMPTY);
  1794. case_DBG_SEL(PKTINFO);
  1795. case_DBG_SEL(PCIE_TXDMA);
  1796. case_DBG_SEL(PCIE_RXDMA);
  1797. case_DBG_SEL(PCIE_CVT);
  1798. case_DBG_SEL(PCIE_CXPL);
  1799. case_DBG_SEL(PCIE_IO);
  1800. case_DBG_SEL(PCIE_MISC);
  1801. case_DBG_SEL(PCIE_MISC2);
  1802. }
  1803. #undef case_DBG_SEL
  1804. seq_printf(m, "Sel addr = 0x%X\n", info->sel_addr);
  1805. seq_printf(m, "Read addr = 0x%X\n", info->rd_addr);
  1806. for (i = info->srt; i <= info->end; i++) {
  1807. switch (info->sel_byte) {
  1808. case 1:
  1809. default:
  1810. rtw89_write8_mask(rtwdev, info->sel_addr,
  1811. info->sel_msk, i);
  1812. seq_printf(m, "0x%02X: ", i);
  1813. break;
  1814. case 2:
  1815. rtw89_write16_mask(rtwdev, info->sel_addr,
  1816. info->sel_msk, i);
  1817. seq_printf(m, "0x%04X: ", i);
  1818. break;
  1819. case 4:
  1820. rtw89_write32_mask(rtwdev, info->sel_addr,
  1821. info->sel_msk, i);
  1822. seq_printf(m, "0x%04X: ", i);
  1823. break;
  1824. }
  1825. udelay(10);
  1826. switch (info->rd_byte) {
  1827. case 1:
  1828. default:
  1829. val8 = rtw89_read8_mask(rtwdev,
  1830. info->rd_addr, info->rd_msk);
  1831. seq_printf(m, "0x%02X\n", val8);
  1832. break;
  1833. case 2:
  1834. val16 = rtw89_read16_mask(rtwdev,
  1835. info->rd_addr, info->rd_msk);
  1836. seq_printf(m, "0x%04X\n", val16);
  1837. break;
  1838. case 4:
  1839. val32 = rtw89_read32_mask(rtwdev,
  1840. info->rd_addr, info->rd_msk);
  1841. seq_printf(m, "0x%08X\n", val32);
  1842. break;
  1843. }
  1844. }
  1845. return 0;
  1846. }
  1847. static int rtw89_debug_mac_dump_dbg_port(struct rtw89_dev *rtwdev,
  1848. struct seq_file *m)
  1849. {
  1850. u32 sel;
  1851. int ret = 0;
  1852. for (sel = RTW89_DBG_PORT_SEL_PTCL_C0;
  1853. sel < RTW89_DBG_PORT_SEL_LAST; sel++) {
  1854. if (!is_dbg_port_valid(rtwdev, sel))
  1855. continue;
  1856. ret = rtw89_debug_mac_dbg_port_dump(rtwdev, m, sel);
  1857. if (ret) {
  1858. rtw89_err(rtwdev,
  1859. "failed to dump debug port %d\n", sel);
  1860. break;
  1861. }
  1862. }
  1863. return ret;
  1864. }
  1865. static int
  1866. rtw89_debug_priv_mac_dbg_port_dump_get(struct seq_file *m, void *v)
  1867. {
  1868. struct rtw89_debugfs_priv *debugfs_priv = m->private;
  1869. struct rtw89_dev *rtwdev = debugfs_priv->rtwdev;
  1870. if (debugfs_priv->dbgpkg_en.ss_dbg)
  1871. rtw89_debug_mac_dump_ss_dbg(rtwdev, m);
  1872. if (debugfs_priv->dbgpkg_en.dle_dbg)
  1873. rtw89_debug_mac_dump_dle_dbg(rtwdev, m);
  1874. if (debugfs_priv->dbgpkg_en.dmac_dbg)
  1875. rtw89_debug_mac_dump_dmac_dbg(rtwdev, m);
  1876. if (debugfs_priv->dbgpkg_en.cmac_dbg)
  1877. rtw89_debug_mac_dump_cmac_dbg(rtwdev, m);
  1878. if (debugfs_priv->dbgpkg_en.dbg_port)
  1879. rtw89_debug_mac_dump_dbg_port(rtwdev, m);
  1880. return 0;
  1881. };
  1882. static u8 *rtw89_hex2bin_user(struct rtw89_dev *rtwdev,
  1883. const char __user *user_buf, size_t count)
  1884. {
  1885. char *buf;
  1886. u8 *bin;
  1887. int num;
  1888. int err = 0;
  1889. buf = memdup_user(user_buf, count);
  1890. if (IS_ERR(buf))
  1891. return buf;
  1892. num = count / 2;
  1893. bin = kmalloc(num, GFP_KERNEL);
  1894. if (!bin) {
  1895. err = -EFAULT;
  1896. goto out;
  1897. }
  1898. if (hex2bin(bin, buf, num)) {
  1899. rtw89_info(rtwdev, "valid format: H1H2H3...\n");
  1900. kfree(bin);
  1901. err = -EINVAL;
  1902. }
  1903. out:
  1904. kfree(buf);
  1905. return err ? ERR_PTR(err) : bin;
  1906. }
  1907. static ssize_t rtw89_debug_priv_send_h2c_set(struct file *filp,
  1908. const char __user *user_buf,
  1909. size_t count, loff_t *loff)
  1910. {
  1911. struct rtw89_debugfs_priv *debugfs_priv = filp->private_data;
  1912. struct rtw89_dev *rtwdev = debugfs_priv->rtwdev;
  1913. u8 *h2c;
  1914. int ret;
  1915. u16 h2c_len = count / 2;
  1916. h2c = rtw89_hex2bin_user(rtwdev, user_buf, count);
  1917. if (IS_ERR(h2c))
  1918. return -EFAULT;
  1919. ret = rtw89_fw_h2c_raw(rtwdev, h2c, h2c_len);
  1920. kfree(h2c);
  1921. return ret ? ret : count;
  1922. }
  1923. static int
  1924. rtw89_debug_priv_early_h2c_get(struct seq_file *m, void *v)
  1925. {
  1926. struct rtw89_debugfs_priv *debugfs_priv = m->private;
  1927. struct rtw89_dev *rtwdev = debugfs_priv->rtwdev;
  1928. struct rtw89_early_h2c *early_h2c;
  1929. int seq = 0;
  1930. mutex_lock(&rtwdev->mutex);
  1931. list_for_each_entry(early_h2c, &rtwdev->early_h2c_list, list)
  1932. seq_printf(m, "%d: %*ph\n", ++seq, early_h2c->h2c_len, early_h2c->h2c);
  1933. mutex_unlock(&rtwdev->mutex);
  1934. return 0;
  1935. }
  1936. static ssize_t
  1937. rtw89_debug_priv_early_h2c_set(struct file *filp, const char __user *user_buf,
  1938. size_t count, loff_t *loff)
  1939. {
  1940. struct seq_file *m = (struct seq_file *)filp->private_data;
  1941. struct rtw89_debugfs_priv *debugfs_priv = m->private;
  1942. struct rtw89_dev *rtwdev = debugfs_priv->rtwdev;
  1943. struct rtw89_early_h2c *early_h2c;
  1944. u8 *h2c;
  1945. u16 h2c_len = count / 2;
  1946. h2c = rtw89_hex2bin_user(rtwdev, user_buf, count);
  1947. if (IS_ERR(h2c))
  1948. return -EFAULT;
  1949. if (h2c_len >= 2 && h2c[0] == 0x00 && h2c[1] == 0x00) {
  1950. kfree(h2c);
  1951. rtw89_fw_free_all_early_h2c(rtwdev);
  1952. goto out;
  1953. }
  1954. early_h2c = kmalloc(sizeof(*early_h2c), GFP_KERNEL);
  1955. if (!early_h2c) {
  1956. kfree(h2c);
  1957. return -EFAULT;
  1958. }
  1959. early_h2c->h2c = h2c;
  1960. early_h2c->h2c_len = h2c_len;
  1961. mutex_lock(&rtwdev->mutex);
  1962. list_add_tail(&early_h2c->list, &rtwdev->early_h2c_list);
  1963. mutex_unlock(&rtwdev->mutex);
  1964. out:
  1965. return count;
  1966. }
  1967. static int rtw89_dbg_trigger_ctrl_error(struct rtw89_dev *rtwdev)
  1968. {
  1969. struct rtw89_cpuio_ctrl ctrl_para = {0};
  1970. u16 pkt_id;
  1971. rtw89_leave_ps_mode(rtwdev);
  1972. pkt_id = rtw89_mac_dle_buf_req(rtwdev, 0x20, true);
  1973. switch (pkt_id) {
  1974. case 0xffff:
  1975. return -ETIMEDOUT;
  1976. case 0xfff:
  1977. return -ENOMEM;
  1978. default:
  1979. break;
  1980. }
  1981. /* intentionally, enqueue two pkt, but has only one pkt id */
  1982. ctrl_para.cmd_type = CPUIO_OP_CMD_ENQ_TO_HEAD;
  1983. ctrl_para.start_pktid = pkt_id;
  1984. ctrl_para.end_pktid = pkt_id;
  1985. ctrl_para.pkt_num = 1; /* start from 0 */
  1986. ctrl_para.dst_pid = WDE_DLE_PORT_ID_WDRLS;
  1987. ctrl_para.dst_qid = WDE_DLE_QUEID_NO_REPORT;
  1988. if (rtw89_mac_set_cpuio(rtwdev, &ctrl_para, true))
  1989. return -EFAULT;
  1990. return 0;
  1991. }
  1992. static int
  1993. rtw89_debug_priv_fw_crash_get(struct seq_file *m, void *v)
  1994. {
  1995. struct rtw89_debugfs_priv *debugfs_priv = m->private;
  1996. struct rtw89_dev *rtwdev = debugfs_priv->rtwdev;
  1997. seq_printf(m, "%d\n",
  1998. test_bit(RTW89_FLAG_CRASH_SIMULATING, rtwdev->flags));
  1999. return 0;
  2000. }
  2001. enum rtw89_dbg_crash_simulation_type {
  2002. RTW89_DBG_SIM_CPU_EXCEPTION = 1,
  2003. RTW89_DBG_SIM_CTRL_ERROR = 2,
  2004. };
  2005. static ssize_t
  2006. rtw89_debug_priv_fw_crash_set(struct file *filp, const char __user *user_buf,
  2007. size_t count, loff_t *loff)
  2008. {
  2009. struct seq_file *m = (struct seq_file *)filp->private_data;
  2010. struct rtw89_debugfs_priv *debugfs_priv = m->private;
  2011. struct rtw89_dev *rtwdev = debugfs_priv->rtwdev;
  2012. int (*sim)(struct rtw89_dev *rtwdev);
  2013. u8 crash_type;
  2014. int ret;
  2015. ret = kstrtou8_from_user(user_buf, count, 0, &crash_type);
  2016. if (ret)
  2017. return -EINVAL;
  2018. switch (crash_type) {
  2019. case RTW89_DBG_SIM_CPU_EXCEPTION:
  2020. if (!RTW89_CHK_FW_FEATURE(CRASH_TRIGGER, &rtwdev->fw))
  2021. return -EOPNOTSUPP;
  2022. sim = rtw89_fw_h2c_trigger_cpu_exception;
  2023. break;
  2024. case RTW89_DBG_SIM_CTRL_ERROR:
  2025. sim = rtw89_dbg_trigger_ctrl_error;
  2026. break;
  2027. default:
  2028. return -EINVAL;
  2029. }
  2030. mutex_lock(&rtwdev->mutex);
  2031. set_bit(RTW89_FLAG_CRASH_SIMULATING, rtwdev->flags);
  2032. ret = sim(rtwdev);
  2033. mutex_unlock(&rtwdev->mutex);
  2034. if (ret)
  2035. return ret;
  2036. return count;
  2037. }
  2038. static int rtw89_debug_priv_btc_info_get(struct seq_file *m, void *v)
  2039. {
  2040. struct rtw89_debugfs_priv *debugfs_priv = m->private;
  2041. struct rtw89_dev *rtwdev = debugfs_priv->rtwdev;
  2042. rtw89_btc_dump_info(rtwdev, m);
  2043. return 0;
  2044. }
  2045. static ssize_t rtw89_debug_priv_btc_manual_set(struct file *filp,
  2046. const char __user *user_buf,
  2047. size_t count, loff_t *loff)
  2048. {
  2049. struct rtw89_debugfs_priv *debugfs_priv = filp->private_data;
  2050. struct rtw89_dev *rtwdev = debugfs_priv->rtwdev;
  2051. struct rtw89_btc *btc = &rtwdev->btc;
  2052. bool btc_manual;
  2053. int ret;
  2054. ret = kstrtobool_from_user(user_buf, count, &btc_manual);
  2055. if (ret)
  2056. return ret;
  2057. btc->ctrl.manual = btc_manual;
  2058. return count;
  2059. }
  2060. static ssize_t rtw89_debug_fw_log_btc_manual_set(struct file *filp,
  2061. const char __user *user_buf,
  2062. size_t count, loff_t *loff)
  2063. {
  2064. struct rtw89_debugfs_priv *debugfs_priv = filp->private_data;
  2065. struct rtw89_dev *rtwdev = debugfs_priv->rtwdev;
  2066. struct rtw89_fw_info *fw_info = &rtwdev->fw;
  2067. bool fw_log_manual;
  2068. if (kstrtobool_from_user(user_buf, count, &fw_log_manual))
  2069. goto out;
  2070. mutex_lock(&rtwdev->mutex);
  2071. fw_info->fw_log_enable = fw_log_manual;
  2072. rtw89_fw_h2c_fw_log(rtwdev, fw_log_manual);
  2073. mutex_unlock(&rtwdev->mutex);
  2074. out:
  2075. return count;
  2076. }
  2077. static void rtw89_sta_info_get_iter(void *data, struct ieee80211_sta *sta)
  2078. {
  2079. static const char * const he_gi_str[] = {
  2080. [NL80211_RATE_INFO_HE_GI_0_8] = "0.8",
  2081. [NL80211_RATE_INFO_HE_GI_1_6] = "1.6",
  2082. [NL80211_RATE_INFO_HE_GI_3_2] = "3.2",
  2083. };
  2084. struct rtw89_sta *rtwsta = (struct rtw89_sta *)sta->drv_priv;
  2085. struct rate_info *rate = &rtwsta->ra_report.txrate;
  2086. struct ieee80211_rx_status *status = &rtwsta->rx_status;
  2087. struct seq_file *m = (struct seq_file *)data;
  2088. struct rtw89_dev *rtwdev = rtwsta->rtwdev;
  2089. struct rtw89_hal *hal = &rtwdev->hal;
  2090. u8 rssi;
  2091. int i;
  2092. seq_printf(m, "TX rate [%d]: ", rtwsta->mac_id);
  2093. if (rate->flags & RATE_INFO_FLAGS_MCS)
  2094. seq_printf(m, "HT MCS-%d%s", rate->mcs,
  2095. rate->flags & RATE_INFO_FLAGS_SHORT_GI ? " SGI" : "");
  2096. else if (rate->flags & RATE_INFO_FLAGS_VHT_MCS)
  2097. seq_printf(m, "VHT %dSS MCS-%d%s", rate->nss, rate->mcs,
  2098. rate->flags & RATE_INFO_FLAGS_SHORT_GI ? " SGI" : "");
  2099. else if (rate->flags & RATE_INFO_FLAGS_HE_MCS)
  2100. seq_printf(m, "HE %dSS MCS-%d GI:%s", rate->nss, rate->mcs,
  2101. rate->he_gi <= NL80211_RATE_INFO_HE_GI_3_2 ?
  2102. he_gi_str[rate->he_gi] : "N/A");
  2103. else
  2104. seq_printf(m, "Legacy %d", rate->legacy);
  2105. seq_printf(m, "%s", rtwsta->ra_report.might_fallback_legacy ? " FB_G" : "");
  2106. seq_printf(m, "\t(hw_rate=0x%x)", rtwsta->ra_report.hw_rate);
  2107. seq_printf(m, "\t==> agg_wait=%d (%d)\n", rtwsta->max_agg_wait,
  2108. sta->deflink.agg.max_rc_amsdu_len);
  2109. seq_printf(m, "RX rate [%d]: ", rtwsta->mac_id);
  2110. switch (status->encoding) {
  2111. case RX_ENC_LEGACY:
  2112. seq_printf(m, "Legacy %d", status->rate_idx +
  2113. (status->band != NL80211_BAND_2GHZ ? 4 : 0));
  2114. break;
  2115. case RX_ENC_HT:
  2116. seq_printf(m, "HT MCS-%d%s", status->rate_idx,
  2117. status->enc_flags & RX_ENC_FLAG_SHORT_GI ? " SGI" : "");
  2118. break;
  2119. case RX_ENC_VHT:
  2120. seq_printf(m, "VHT %dSS MCS-%d%s", status->nss, status->rate_idx,
  2121. status->enc_flags & RX_ENC_FLAG_SHORT_GI ? " SGI" : "");
  2122. break;
  2123. case RX_ENC_HE:
  2124. seq_printf(m, "HE %dSS MCS-%d GI:%s", status->nss, status->rate_idx,
  2125. status->he_gi <= NL80211_RATE_INFO_HE_GI_3_2 ?
  2126. he_gi_str[rate->he_gi] : "N/A");
  2127. break;
  2128. }
  2129. seq_printf(m, "\t(hw_rate=0x%x)\n", rtwsta->rx_hw_rate);
  2130. rssi = ewma_rssi_read(&rtwsta->avg_rssi);
  2131. seq_printf(m, "RSSI: %d dBm (raw=%d, prev=%d) [",
  2132. RTW89_RSSI_RAW_TO_DBM(rssi), rssi, rtwsta->prev_rssi);
  2133. for (i = 0; i < rtwdev->chip->rf_path_num; i++) {
  2134. rssi = ewma_rssi_read(&rtwsta->rssi[i]);
  2135. seq_printf(m, "%d%s%s", RTW89_RSSI_RAW_TO_DBM(rssi),
  2136. hal->tx_path_diversity && (hal->antenna_tx & BIT(i)) ? "*" : "",
  2137. i + 1 == rtwdev->chip->rf_path_num ? "" : ", ");
  2138. }
  2139. seq_puts(m, "]\n");
  2140. }
  2141. static void
  2142. rtw89_debug_append_rx_rate(struct seq_file *m, struct rtw89_pkt_stat *pkt_stat,
  2143. enum rtw89_hw_rate first_rate, int len)
  2144. {
  2145. int i;
  2146. for (i = 0; i < len; i++)
  2147. seq_printf(m, "%s%u", i == 0 ? "" : ", ",
  2148. pkt_stat->rx_rate_cnt[first_rate + i]);
  2149. }
  2150. static const struct rtw89_rx_rate_cnt_info {
  2151. enum rtw89_hw_rate first_rate;
  2152. int len;
  2153. int ext;
  2154. const char *rate_mode;
  2155. } rtw89_rx_rate_cnt_infos[] = {
  2156. {RTW89_HW_RATE_CCK1, 4, 0, "Legacy:"},
  2157. {RTW89_HW_RATE_OFDM6, 8, 0, "OFDM:"},
  2158. {RTW89_HW_RATE_MCS0, 8, 0, "HT 0:"},
  2159. {RTW89_HW_RATE_MCS8, 8, 0, "HT 1:"},
  2160. {RTW89_HW_RATE_VHT_NSS1_MCS0, 10, 2, "VHT 1SS:"},
  2161. {RTW89_HW_RATE_VHT_NSS2_MCS0, 10, 2, "VHT 2SS:"},
  2162. {RTW89_HW_RATE_HE_NSS1_MCS0, 12, 0, "HE 1SS:"},
  2163. {RTW89_HW_RATE_HE_NSS2_MCS0, 12, 0, "HE 2ss:"},
  2164. };
  2165. static int rtw89_debug_priv_phy_info_get(struct seq_file *m, void *v)
  2166. {
  2167. struct rtw89_debugfs_priv *debugfs_priv = m->private;
  2168. struct rtw89_dev *rtwdev = debugfs_priv->rtwdev;
  2169. struct rtw89_traffic_stats *stats = &rtwdev->stats;
  2170. struct rtw89_pkt_stat *pkt_stat = &rtwdev->phystat.last_pkt_stat;
  2171. const struct rtw89_rx_rate_cnt_info *info;
  2172. int i;
  2173. seq_printf(m, "TP TX: %u [%u] Mbps (lv: %d), RX: %u [%u] Mbps (lv: %d)\n",
  2174. stats->tx_throughput, stats->tx_throughput_raw, stats->tx_tfc_lv,
  2175. stats->rx_throughput, stats->rx_throughput_raw, stats->rx_tfc_lv);
  2176. seq_printf(m, "Beacon: %u, TF: %u\n", pkt_stat->beacon_nr,
  2177. stats->rx_tf_periodic);
  2178. seq_printf(m, "Avg packet length: TX=%u, RX=%u\n", stats->tx_avg_len,
  2179. stats->rx_avg_len);
  2180. seq_puts(m, "RX count:\n");
  2181. for (i = 0; i < ARRAY_SIZE(rtw89_rx_rate_cnt_infos); i++) {
  2182. info = &rtw89_rx_rate_cnt_infos[i];
  2183. seq_printf(m, "%10s [", info->rate_mode);
  2184. rtw89_debug_append_rx_rate(m, pkt_stat,
  2185. info->first_rate, info->len);
  2186. if (info->ext) {
  2187. seq_puts(m, "][");
  2188. rtw89_debug_append_rx_rate(m, pkt_stat,
  2189. info->first_rate + info->len, info->ext);
  2190. }
  2191. seq_puts(m, "]\n");
  2192. }
  2193. ieee80211_iterate_stations_atomic(rtwdev->hw, rtw89_sta_info_get_iter, m);
  2194. return 0;
  2195. }
  2196. static void rtw89_dump_addr_cam(struct seq_file *m,
  2197. struct rtw89_addr_cam_entry *addr_cam)
  2198. {
  2199. struct rtw89_sec_cam_entry *sec_entry;
  2200. int i;
  2201. seq_printf(m, "\taddr_cam_idx=%u\n", addr_cam->addr_cam_idx);
  2202. seq_printf(m, "\t-> bssid_cam_idx=%u\n", addr_cam->bssid_cam_idx);
  2203. seq_printf(m, "\tsec_cam_bitmap=%*ph\n", (int)sizeof(addr_cam->sec_cam_map),
  2204. addr_cam->sec_cam_map);
  2205. for (i = 0; i < RTW89_SEC_CAM_IN_ADDR_CAM; i++) {
  2206. sec_entry = addr_cam->sec_entries[i];
  2207. if (!sec_entry)
  2208. continue;
  2209. seq_printf(m, "\tsec[%d]: sec_cam_idx %u", i, sec_entry->sec_cam_idx);
  2210. if (sec_entry->ext_key)
  2211. seq_printf(m, ", %u", sec_entry->sec_cam_idx + 1);
  2212. seq_puts(m, "\n");
  2213. }
  2214. }
  2215. static
  2216. void rtw89_vif_ids_get_iter(void *data, u8 *mac, struct ieee80211_vif *vif)
  2217. {
  2218. struct rtw89_vif *rtwvif = (struct rtw89_vif *)vif->drv_priv;
  2219. struct seq_file *m = (struct seq_file *)data;
  2220. struct rtw89_bssid_cam_entry *bssid_cam = &rtwvif->bssid_cam;
  2221. seq_printf(m, "VIF [%d] %pM\n", rtwvif->mac_id, rtwvif->mac_addr);
  2222. seq_printf(m, "\tbssid_cam_idx=%u\n", bssid_cam->bssid_cam_idx);
  2223. rtw89_dump_addr_cam(m, &rtwvif->addr_cam);
  2224. }
  2225. static void rtw89_dump_ba_cam(struct seq_file *m, struct rtw89_sta *rtwsta)
  2226. {
  2227. struct rtw89_vif *rtwvif = rtwsta->rtwvif;
  2228. struct rtw89_dev *rtwdev = rtwvif->rtwdev;
  2229. struct rtw89_ba_cam_entry *entry;
  2230. bool first = true;
  2231. list_for_each_entry(entry, &rtwsta->ba_cam_list, list) {
  2232. if (first) {
  2233. seq_puts(m, "\tba_cam ");
  2234. first = false;
  2235. } else {
  2236. seq_puts(m, ", ");
  2237. }
  2238. seq_printf(m, "tid[%u]=%d", entry->tid,
  2239. (int)(entry - rtwdev->cam_info.ba_cam_entry));
  2240. }
  2241. seq_puts(m, "\n");
  2242. }
  2243. static void rtw89_sta_ids_get_iter(void *data, struct ieee80211_sta *sta)
  2244. {
  2245. struct rtw89_sta *rtwsta = (struct rtw89_sta *)sta->drv_priv;
  2246. struct seq_file *m = (struct seq_file *)data;
  2247. seq_printf(m, "STA [%d] %pM %s\n", rtwsta->mac_id, sta->addr,
  2248. sta->tdls ? "(TDLS)" : "");
  2249. rtw89_dump_addr_cam(m, &rtwsta->addr_cam);
  2250. rtw89_dump_ba_cam(m, rtwsta);
  2251. }
  2252. static int rtw89_debug_priv_stations_get(struct seq_file *m, void *v)
  2253. {
  2254. struct rtw89_debugfs_priv *debugfs_priv = m->private;
  2255. struct rtw89_dev *rtwdev = debugfs_priv->rtwdev;
  2256. struct rtw89_cam_info *cam_info = &rtwdev->cam_info;
  2257. mutex_lock(&rtwdev->mutex);
  2258. seq_puts(m, "map:\n");
  2259. seq_printf(m, "\tmac_id: %*ph\n", (int)sizeof(rtwdev->mac_id_map),
  2260. rtwdev->mac_id_map);
  2261. seq_printf(m, "\taddr_cam: %*ph\n", (int)sizeof(cam_info->addr_cam_map),
  2262. cam_info->addr_cam_map);
  2263. seq_printf(m, "\tbssid_cam: %*ph\n", (int)sizeof(cam_info->bssid_cam_map),
  2264. cam_info->bssid_cam_map);
  2265. seq_printf(m, "\tsec_cam: %*ph\n", (int)sizeof(cam_info->sec_cam_map),
  2266. cam_info->sec_cam_map);
  2267. seq_printf(m, "\tba_cam: %*ph\n", (int)sizeof(cam_info->ba_cam_map),
  2268. cam_info->ba_cam_map);
  2269. ieee80211_iterate_active_interfaces_atomic(rtwdev->hw,
  2270. IEEE80211_IFACE_ITER_NORMAL, rtw89_vif_ids_get_iter, m);
  2271. ieee80211_iterate_stations_atomic(rtwdev->hw, rtw89_sta_ids_get_iter, m);
  2272. mutex_unlock(&rtwdev->mutex);
  2273. return 0;
  2274. }
  2275. static struct rtw89_debugfs_priv rtw89_debug_priv_read_reg = {
  2276. .cb_read = rtw89_debug_priv_read_reg_get,
  2277. .cb_write = rtw89_debug_priv_read_reg_select,
  2278. };
  2279. static struct rtw89_debugfs_priv rtw89_debug_priv_write_reg = {
  2280. .cb_write = rtw89_debug_priv_write_reg_set,
  2281. };
  2282. static struct rtw89_debugfs_priv rtw89_debug_priv_read_rf = {
  2283. .cb_read = rtw89_debug_priv_read_rf_get,
  2284. .cb_write = rtw89_debug_priv_read_rf_select,
  2285. };
  2286. static struct rtw89_debugfs_priv rtw89_debug_priv_write_rf = {
  2287. .cb_write = rtw89_debug_priv_write_rf_set,
  2288. };
  2289. static struct rtw89_debugfs_priv rtw89_debug_priv_rf_reg_dump = {
  2290. .cb_read = rtw89_debug_priv_rf_reg_dump_get,
  2291. };
  2292. static struct rtw89_debugfs_priv rtw89_debug_priv_txpwr_table = {
  2293. .cb_read = rtw89_debug_priv_txpwr_table_get,
  2294. };
  2295. static struct rtw89_debugfs_priv rtw89_debug_priv_mac_reg_dump = {
  2296. .cb_read = rtw89_debug_priv_mac_reg_dump_get,
  2297. .cb_write = rtw89_debug_priv_mac_reg_dump_select,
  2298. };
  2299. static struct rtw89_debugfs_priv rtw89_debug_priv_mac_mem_dump = {
  2300. .cb_read = rtw89_debug_priv_mac_mem_dump_get,
  2301. .cb_write = rtw89_debug_priv_mac_mem_dump_select,
  2302. };
  2303. static struct rtw89_debugfs_priv rtw89_debug_priv_mac_dbg_port_dump = {
  2304. .cb_read = rtw89_debug_priv_mac_dbg_port_dump_get,
  2305. .cb_write = rtw89_debug_priv_mac_dbg_port_dump_select,
  2306. };
  2307. static struct rtw89_debugfs_priv rtw89_debug_priv_send_h2c = {
  2308. .cb_write = rtw89_debug_priv_send_h2c_set,
  2309. };
  2310. static struct rtw89_debugfs_priv rtw89_debug_priv_early_h2c = {
  2311. .cb_read = rtw89_debug_priv_early_h2c_get,
  2312. .cb_write = rtw89_debug_priv_early_h2c_set,
  2313. };
  2314. static struct rtw89_debugfs_priv rtw89_debug_priv_fw_crash = {
  2315. .cb_read = rtw89_debug_priv_fw_crash_get,
  2316. .cb_write = rtw89_debug_priv_fw_crash_set,
  2317. };
  2318. static struct rtw89_debugfs_priv rtw89_debug_priv_btc_info = {
  2319. .cb_read = rtw89_debug_priv_btc_info_get,
  2320. };
  2321. static struct rtw89_debugfs_priv rtw89_debug_priv_btc_manual = {
  2322. .cb_write = rtw89_debug_priv_btc_manual_set,
  2323. };
  2324. static struct rtw89_debugfs_priv rtw89_debug_priv_fw_log_manual = {
  2325. .cb_write = rtw89_debug_fw_log_btc_manual_set,
  2326. };
  2327. static struct rtw89_debugfs_priv rtw89_debug_priv_phy_info = {
  2328. .cb_read = rtw89_debug_priv_phy_info_get,
  2329. };
  2330. static struct rtw89_debugfs_priv rtw89_debug_priv_stations = {
  2331. .cb_read = rtw89_debug_priv_stations_get,
  2332. };
  2333. #define rtw89_debugfs_add(name, mode, fopname, parent) \
  2334. do { \
  2335. rtw89_debug_priv_ ##name.rtwdev = rtwdev; \
  2336. if (!debugfs_create_file(#name, mode, \
  2337. parent, &rtw89_debug_priv_ ##name, \
  2338. &file_ops_ ##fopname)) \
  2339. pr_debug("Unable to initialize debugfs:%s\n", #name); \
  2340. } while (0)
  2341. #define rtw89_debugfs_add_w(name) \
  2342. rtw89_debugfs_add(name, S_IFREG | 0222, single_w, debugfs_topdir)
  2343. #define rtw89_debugfs_add_rw(name) \
  2344. rtw89_debugfs_add(name, S_IFREG | 0666, common_rw, debugfs_topdir)
  2345. #define rtw89_debugfs_add_r(name) \
  2346. rtw89_debugfs_add(name, S_IFREG | 0444, single_r, debugfs_topdir)
  2347. void rtw89_debugfs_init(struct rtw89_dev *rtwdev)
  2348. {
  2349. struct dentry *debugfs_topdir;
  2350. debugfs_topdir = debugfs_create_dir("rtw89",
  2351. rtwdev->hw->wiphy->debugfsdir);
  2352. rtw89_debugfs_add_rw(read_reg);
  2353. rtw89_debugfs_add_w(write_reg);
  2354. rtw89_debugfs_add_rw(read_rf);
  2355. rtw89_debugfs_add_w(write_rf);
  2356. rtw89_debugfs_add_r(rf_reg_dump);
  2357. rtw89_debugfs_add_r(txpwr_table);
  2358. rtw89_debugfs_add_rw(mac_reg_dump);
  2359. rtw89_debugfs_add_rw(mac_mem_dump);
  2360. rtw89_debugfs_add_rw(mac_dbg_port_dump);
  2361. rtw89_debugfs_add_w(send_h2c);
  2362. rtw89_debugfs_add_rw(early_h2c);
  2363. rtw89_debugfs_add_rw(fw_crash);
  2364. rtw89_debugfs_add_r(btc_info);
  2365. rtw89_debugfs_add_w(btc_manual);
  2366. rtw89_debugfs_add_w(fw_log_manual);
  2367. rtw89_debugfs_add_r(phy_info);
  2368. rtw89_debugfs_add_r(stations);
  2369. }
  2370. #endif
  2371. #ifdef CONFIG_RTW89_DEBUGMSG
  2372. void __rtw89_debug(struct rtw89_dev *rtwdev,
  2373. enum rtw89_debug_mask mask,
  2374. const char *fmt, ...)
  2375. {
  2376. struct va_format vaf = {
  2377. .fmt = fmt,
  2378. };
  2379. va_list args;
  2380. va_start(args, fmt);
  2381. vaf.va = &args;
  2382. if (rtw89_debug_mask & mask)
  2383. dev_printk(KERN_DEBUG, rtwdev->dev, "%pV", &vaf);
  2384. va_end(args);
  2385. }
  2386. EXPORT_SYMBOL(__rtw89_debug);
  2387. #endif