debug.c 34 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293
  1. // SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
  2. /* Copyright(c) 2018-2019 Realtek Corporation
  3. */
  4. #include <linux/debugfs.h>
  5. #include <linux/seq_file.h>
  6. #include "main.h"
  7. #include "coex.h"
  8. #include "sec.h"
  9. #include "fw.h"
  10. #include "debug.h"
  11. #include "phy.h"
  12. #include "reg.h"
  13. #include "ps.h"
  14. #include "regd.h"
  15. #ifdef CONFIG_RTW88_DEBUGFS
  16. struct rtw_debugfs_priv {
  17. struct rtw_dev *rtwdev;
  18. int (*cb_read)(struct seq_file *m, void *v);
  19. ssize_t (*cb_write)(struct file *filp, const char __user *buffer,
  20. size_t count, loff_t *loff);
  21. union {
  22. u32 cb_data;
  23. u8 *buf;
  24. struct {
  25. u32 page_offset;
  26. u32 page_num;
  27. } rsvd_page;
  28. struct {
  29. u8 rf_path;
  30. u32 rf_addr;
  31. u32 rf_mask;
  32. };
  33. struct {
  34. u32 addr;
  35. u32 len;
  36. } read_reg;
  37. struct {
  38. u8 bit;
  39. } dm_cap;
  40. };
  41. };
  42. static const char * const rtw_dm_cap_strs[] = {
  43. [RTW_DM_CAP_NA] = "NA",
  44. [RTW_DM_CAP_TXGAPK] = "TXGAPK",
  45. };
  46. static int rtw_debugfs_single_show(struct seq_file *m, void *v)
  47. {
  48. struct rtw_debugfs_priv *debugfs_priv = m->private;
  49. return debugfs_priv->cb_read(m, v);
  50. }
  51. static ssize_t rtw_debugfs_common_write(struct file *filp,
  52. const char __user *buffer,
  53. size_t count, loff_t *loff)
  54. {
  55. struct rtw_debugfs_priv *debugfs_priv = filp->private_data;
  56. return debugfs_priv->cb_write(filp, buffer, count, loff);
  57. }
  58. static ssize_t rtw_debugfs_single_write(struct file *filp,
  59. const char __user *buffer,
  60. size_t count, loff_t *loff)
  61. {
  62. struct seq_file *seqpriv = (struct seq_file *)filp->private_data;
  63. struct rtw_debugfs_priv *debugfs_priv = seqpriv->private;
  64. return debugfs_priv->cb_write(filp, buffer, count, loff);
  65. }
  66. static int rtw_debugfs_single_open_rw(struct inode *inode, struct file *filp)
  67. {
  68. return single_open(filp, rtw_debugfs_single_show, inode->i_private);
  69. }
  70. static int rtw_debugfs_close(struct inode *inode, struct file *filp)
  71. {
  72. return 0;
  73. }
  74. static const struct file_operations file_ops_single_r = {
  75. .owner = THIS_MODULE,
  76. .open = rtw_debugfs_single_open_rw,
  77. .read = seq_read,
  78. .llseek = seq_lseek,
  79. .release = single_release,
  80. };
  81. static const struct file_operations file_ops_single_rw = {
  82. .owner = THIS_MODULE,
  83. .open = rtw_debugfs_single_open_rw,
  84. .release = single_release,
  85. .read = seq_read,
  86. .llseek = seq_lseek,
  87. .write = rtw_debugfs_single_write,
  88. };
  89. static const struct file_operations file_ops_common_write = {
  90. .owner = THIS_MODULE,
  91. .write = rtw_debugfs_common_write,
  92. .open = simple_open,
  93. .release = rtw_debugfs_close,
  94. };
  95. static int rtw_debugfs_get_read_reg(struct seq_file *m, void *v)
  96. {
  97. struct rtw_debugfs_priv *debugfs_priv = m->private;
  98. struct rtw_dev *rtwdev = debugfs_priv->rtwdev;
  99. u32 val, len, addr;
  100. len = debugfs_priv->read_reg.len;
  101. addr = debugfs_priv->read_reg.addr;
  102. switch (len) {
  103. case 1:
  104. val = rtw_read8(rtwdev, addr);
  105. seq_printf(m, "reg 0x%03x: 0x%02x\n", addr, val);
  106. break;
  107. case 2:
  108. val = rtw_read16(rtwdev, addr);
  109. seq_printf(m, "reg 0x%03x: 0x%04x\n", addr, val);
  110. break;
  111. case 4:
  112. val = rtw_read32(rtwdev, addr);
  113. seq_printf(m, "reg 0x%03x: 0x%08x\n", addr, val);
  114. break;
  115. }
  116. return 0;
  117. }
  118. static int rtw_debugfs_get_rf_read(struct seq_file *m, void *v)
  119. {
  120. struct rtw_debugfs_priv *debugfs_priv = m->private;
  121. struct rtw_dev *rtwdev = debugfs_priv->rtwdev;
  122. u32 val, addr, mask;
  123. u8 path;
  124. path = debugfs_priv->rf_path;
  125. addr = debugfs_priv->rf_addr;
  126. mask = debugfs_priv->rf_mask;
  127. val = rtw_read_rf(rtwdev, path, addr, mask);
  128. seq_printf(m, "rf_read path:%d addr:0x%08x mask:0x%08x val=0x%08x\n",
  129. path, addr, mask, val);
  130. return 0;
  131. }
  132. static int rtw_debugfs_get_fix_rate(struct seq_file *m, void *v)
  133. {
  134. struct rtw_debugfs_priv *debugfs_priv = m->private;
  135. struct rtw_dev *rtwdev = debugfs_priv->rtwdev;
  136. struct rtw_dm_info *dm_info = &rtwdev->dm_info;
  137. u8 fix_rate = dm_info->fix_rate;
  138. if (fix_rate >= DESC_RATE_MAX) {
  139. seq_printf(m, "Fix rate disabled, fix_rate = %u\n", fix_rate);
  140. return 0;
  141. }
  142. seq_printf(m, "Data frames fixed at desc rate %u\n", fix_rate);
  143. return 0;
  144. }
  145. static int rtw_debugfs_copy_from_user(char tmp[], int size,
  146. const char __user *buffer, size_t count,
  147. int num)
  148. {
  149. int tmp_len;
  150. memset(tmp, 0, size);
  151. if (count < num)
  152. return -EFAULT;
  153. tmp_len = (count > size - 1 ? size - 1 : count);
  154. if (!buffer || copy_from_user(tmp, buffer, tmp_len))
  155. return count;
  156. tmp[tmp_len] = '\0';
  157. return 0;
  158. }
  159. static ssize_t rtw_debugfs_set_read_reg(struct file *filp,
  160. const char __user *buffer,
  161. size_t count, loff_t *loff)
  162. {
  163. struct seq_file *seqpriv = (struct seq_file *)filp->private_data;
  164. struct rtw_debugfs_priv *debugfs_priv = seqpriv->private;
  165. struct rtw_dev *rtwdev = debugfs_priv->rtwdev;
  166. char tmp[32 + 1];
  167. u32 addr, len;
  168. int num;
  169. rtw_debugfs_copy_from_user(tmp, sizeof(tmp), buffer, count, 2);
  170. num = sscanf(tmp, "%x %x", &addr, &len);
  171. if (num != 2)
  172. return count;
  173. if (len != 1 && len != 2 && len != 4) {
  174. rtw_warn(rtwdev, "read reg setting wrong len\n");
  175. return -EINVAL;
  176. }
  177. debugfs_priv->read_reg.addr = addr;
  178. debugfs_priv->read_reg.len = len;
  179. return count;
  180. }
  181. static int rtw_debugfs_get_dump_cam(struct seq_file *m, void *v)
  182. {
  183. struct rtw_debugfs_priv *debugfs_priv = m->private;
  184. struct rtw_dev *rtwdev = debugfs_priv->rtwdev;
  185. u32 val, command;
  186. u32 hw_key_idx = debugfs_priv->cb_data << RTW_SEC_CAM_ENTRY_SHIFT;
  187. u32 read_cmd = RTW_SEC_CMD_POLLING;
  188. int i;
  189. seq_printf(m, "cam entry%d\n", debugfs_priv->cb_data);
  190. seq_puts(m, "0x0 0x1 0x2 0x3 ");
  191. seq_puts(m, "0x4 0x5\n");
  192. mutex_lock(&rtwdev->mutex);
  193. for (i = 0; i <= 5; i++) {
  194. command = read_cmd | (hw_key_idx + i);
  195. rtw_write32(rtwdev, RTW_SEC_CMD_REG, command);
  196. val = rtw_read32(rtwdev, RTW_SEC_READ_REG);
  197. seq_printf(m, "%8.8x", val);
  198. if (i < 2)
  199. seq_puts(m, " ");
  200. }
  201. seq_puts(m, "\n");
  202. mutex_unlock(&rtwdev->mutex);
  203. return 0;
  204. }
  205. static int rtw_debugfs_get_rsvd_page(struct seq_file *m, void *v)
  206. {
  207. struct rtw_debugfs_priv *debugfs_priv = m->private;
  208. struct rtw_dev *rtwdev = debugfs_priv->rtwdev;
  209. u8 page_size = rtwdev->chip->page_size;
  210. u32 buf_size = debugfs_priv->rsvd_page.page_num * page_size;
  211. u32 offset = debugfs_priv->rsvd_page.page_offset * page_size;
  212. u8 *buf;
  213. int i;
  214. int ret;
  215. buf = vzalloc(buf_size);
  216. if (!buf)
  217. return -ENOMEM;
  218. ret = rtw_fw_dump_fifo(rtwdev, RTW_FW_FIFO_SEL_RSVD_PAGE, offset,
  219. buf_size, (u32 *)buf);
  220. if (ret) {
  221. rtw_err(rtwdev, "failed to dump rsvd page\n");
  222. vfree(buf);
  223. return ret;
  224. }
  225. for (i = 0 ; i < buf_size ; i += 8) {
  226. if (i % page_size == 0)
  227. seq_printf(m, "PAGE %d\n", (i + offset) / page_size);
  228. seq_printf(m, "%8ph\n", buf + i);
  229. }
  230. vfree(buf);
  231. return 0;
  232. }
  233. static ssize_t rtw_debugfs_set_rsvd_page(struct file *filp,
  234. const char __user *buffer,
  235. size_t count, loff_t *loff)
  236. {
  237. struct seq_file *seqpriv = (struct seq_file *)filp->private_data;
  238. struct rtw_debugfs_priv *debugfs_priv = seqpriv->private;
  239. struct rtw_dev *rtwdev = debugfs_priv->rtwdev;
  240. char tmp[32 + 1];
  241. u32 offset, page_num;
  242. int num;
  243. rtw_debugfs_copy_from_user(tmp, sizeof(tmp), buffer, count, 2);
  244. num = sscanf(tmp, "%d %d", &offset, &page_num);
  245. if (num != 2) {
  246. rtw_warn(rtwdev, "invalid arguments\n");
  247. return -EINVAL;
  248. }
  249. debugfs_priv->rsvd_page.page_offset = offset;
  250. debugfs_priv->rsvd_page.page_num = page_num;
  251. return count;
  252. }
  253. static ssize_t rtw_debugfs_set_single_input(struct file *filp,
  254. const char __user *buffer,
  255. size_t count, loff_t *loff)
  256. {
  257. struct seq_file *seqpriv = (struct seq_file *)filp->private_data;
  258. struct rtw_debugfs_priv *debugfs_priv = seqpriv->private;
  259. struct rtw_dev *rtwdev = debugfs_priv->rtwdev;
  260. char tmp[32 + 1];
  261. u32 input;
  262. int num;
  263. rtw_debugfs_copy_from_user(tmp, sizeof(tmp), buffer, count, 1);
  264. num = kstrtoint(tmp, 0, &input);
  265. if (num) {
  266. rtw_warn(rtwdev, "kstrtoint failed\n");
  267. return num;
  268. }
  269. debugfs_priv->cb_data = input;
  270. return count;
  271. }
  272. static ssize_t rtw_debugfs_set_write_reg(struct file *filp,
  273. const char __user *buffer,
  274. size_t count, loff_t *loff)
  275. {
  276. struct rtw_debugfs_priv *debugfs_priv = filp->private_data;
  277. struct rtw_dev *rtwdev = debugfs_priv->rtwdev;
  278. char tmp[32 + 1];
  279. u32 addr, val, len;
  280. int num;
  281. rtw_debugfs_copy_from_user(tmp, sizeof(tmp), buffer, count, 3);
  282. /* write BB/MAC register */
  283. num = sscanf(tmp, "%x %x %x", &addr, &val, &len);
  284. if (num != 3)
  285. return count;
  286. switch (len) {
  287. case 1:
  288. rtw_dbg(rtwdev, RTW_DBG_DEBUGFS,
  289. "reg write8 0x%03x: 0x%08x\n", addr, val);
  290. rtw_write8(rtwdev, addr, (u8)val);
  291. break;
  292. case 2:
  293. rtw_dbg(rtwdev, RTW_DBG_DEBUGFS,
  294. "reg write16 0x%03x: 0x%08x\n", addr, val);
  295. rtw_write16(rtwdev, addr, (u16)val);
  296. break;
  297. case 4:
  298. rtw_dbg(rtwdev, RTW_DBG_DEBUGFS,
  299. "reg write32 0x%03x: 0x%08x\n", addr, val);
  300. rtw_write32(rtwdev, addr, (u32)val);
  301. break;
  302. default:
  303. rtw_dbg(rtwdev, RTW_DBG_DEBUGFS,
  304. "error write length = %d\n", len);
  305. break;
  306. }
  307. return count;
  308. }
  309. static ssize_t rtw_debugfs_set_h2c(struct file *filp,
  310. const char __user *buffer,
  311. size_t count, loff_t *loff)
  312. {
  313. struct rtw_debugfs_priv *debugfs_priv = filp->private_data;
  314. struct rtw_dev *rtwdev = debugfs_priv->rtwdev;
  315. char tmp[32 + 1];
  316. u8 param[8];
  317. int num;
  318. rtw_debugfs_copy_from_user(tmp, sizeof(tmp), buffer, count, 3);
  319. num = sscanf(tmp, "%hhx,%hhx,%hhx,%hhx,%hhx,%hhx,%hhx,%hhx",
  320. &param[0], &param[1], &param[2], &param[3],
  321. &param[4], &param[5], &param[6], &param[7]);
  322. if (num != 8) {
  323. rtw_warn(rtwdev, "invalid H2C command format for debug\n");
  324. return -EINVAL;
  325. }
  326. rtw_fw_h2c_cmd_dbg(rtwdev, param);
  327. return count;
  328. }
  329. static ssize_t rtw_debugfs_set_rf_write(struct file *filp,
  330. const char __user *buffer,
  331. size_t count, loff_t *loff)
  332. {
  333. struct rtw_debugfs_priv *debugfs_priv = filp->private_data;
  334. struct rtw_dev *rtwdev = debugfs_priv->rtwdev;
  335. char tmp[32 + 1];
  336. u32 path, addr, mask, val;
  337. int num;
  338. rtw_debugfs_copy_from_user(tmp, sizeof(tmp), buffer, count, 4);
  339. num = sscanf(tmp, "%x %x %x %x", &path, &addr, &mask, &val);
  340. if (num != 4) {
  341. rtw_warn(rtwdev, "invalid args, [path] [addr] [mask] [val]\n");
  342. return count;
  343. }
  344. rtw_write_rf(rtwdev, path, addr, mask, val);
  345. rtw_dbg(rtwdev, RTW_DBG_DEBUGFS,
  346. "write_rf path:%d addr:0x%08x mask:0x%08x, val:0x%08x\n",
  347. path, addr, mask, val);
  348. return count;
  349. }
  350. static ssize_t rtw_debugfs_set_rf_read(struct file *filp,
  351. const char __user *buffer,
  352. size_t count, loff_t *loff)
  353. {
  354. struct seq_file *seqpriv = (struct seq_file *)filp->private_data;
  355. struct rtw_debugfs_priv *debugfs_priv = seqpriv->private;
  356. struct rtw_dev *rtwdev = debugfs_priv->rtwdev;
  357. char tmp[32 + 1];
  358. u32 path, addr, mask;
  359. int num;
  360. rtw_debugfs_copy_from_user(tmp, sizeof(tmp), buffer, count, 3);
  361. num = sscanf(tmp, "%x %x %x", &path, &addr, &mask);
  362. if (num != 3) {
  363. rtw_warn(rtwdev, "invalid args, [path] [addr] [mask] [val]\n");
  364. return count;
  365. }
  366. debugfs_priv->rf_path = path;
  367. debugfs_priv->rf_addr = addr;
  368. debugfs_priv->rf_mask = mask;
  369. return count;
  370. }
  371. static ssize_t rtw_debugfs_set_fix_rate(struct file *filp,
  372. const char __user *buffer,
  373. size_t count, loff_t *loff)
  374. {
  375. struct seq_file *seqpriv = (struct seq_file *)filp->private_data;
  376. struct rtw_debugfs_priv *debugfs_priv = seqpriv->private;
  377. struct rtw_dev *rtwdev = debugfs_priv->rtwdev;
  378. struct rtw_dm_info *dm_info = &rtwdev->dm_info;
  379. u8 fix_rate;
  380. char tmp[32 + 1];
  381. int ret;
  382. rtw_debugfs_copy_from_user(tmp, sizeof(tmp), buffer, count, 1);
  383. ret = kstrtou8(tmp, 0, &fix_rate);
  384. if (ret) {
  385. rtw_warn(rtwdev, "invalid args, [rate]\n");
  386. return ret;
  387. }
  388. dm_info->fix_rate = fix_rate;
  389. return count;
  390. }
  391. static int rtw_debug_get_mac_page(struct seq_file *m, void *v)
  392. {
  393. struct rtw_debugfs_priv *debugfs_priv = m->private;
  394. struct rtw_dev *rtwdev = debugfs_priv->rtwdev;
  395. u32 page = debugfs_priv->cb_data;
  396. int i, n;
  397. int max = 0xff;
  398. rtw_read32(rtwdev, debugfs_priv->cb_data);
  399. for (n = 0; n <= max; ) {
  400. seq_printf(m, "\n%8.8x ", n + page);
  401. for (i = 0; i < 4 && n <= max; i++, n += 4)
  402. seq_printf(m, "%8.8x ",
  403. rtw_read32(rtwdev, (page | n)));
  404. }
  405. seq_puts(m, "\n");
  406. return 0;
  407. }
  408. static int rtw_debug_get_bb_page(struct seq_file *m, void *v)
  409. {
  410. struct rtw_debugfs_priv *debugfs_priv = m->private;
  411. struct rtw_dev *rtwdev = debugfs_priv->rtwdev;
  412. u32 page = debugfs_priv->cb_data;
  413. int i, n;
  414. int max = 0xff;
  415. rtw_read32(rtwdev, debugfs_priv->cb_data);
  416. for (n = 0; n <= max; ) {
  417. seq_printf(m, "\n%8.8x ", n + page);
  418. for (i = 0; i < 4 && n <= max; i++, n += 4)
  419. seq_printf(m, "%8.8x ",
  420. rtw_read32(rtwdev, (page | n)));
  421. }
  422. seq_puts(m, "\n");
  423. return 0;
  424. }
  425. static int rtw_debug_get_rf_dump(struct seq_file *m, void *v)
  426. {
  427. struct rtw_debugfs_priv *debugfs_priv = m->private;
  428. struct rtw_dev *rtwdev = debugfs_priv->rtwdev;
  429. u32 addr, offset, data;
  430. u8 path;
  431. for (path = 0; path < rtwdev->hal.rf_path_num; path++) {
  432. seq_printf(m, "RF path:%d\n", path);
  433. for (addr = 0; addr < 0x100; addr += 4) {
  434. seq_printf(m, "%8.8x ", addr);
  435. for (offset = 0; offset < 4; offset++) {
  436. data = rtw_read_rf(rtwdev, path, addr + offset,
  437. 0xffffffff);
  438. seq_printf(m, "%8.8x ", data);
  439. }
  440. seq_puts(m, "\n");
  441. }
  442. seq_puts(m, "\n");
  443. }
  444. return 0;
  445. }
  446. static void rtw_print_cck_rate_txt(struct seq_file *m, u8 rate)
  447. {
  448. static const char * const
  449. cck_rate[] = {"1M", "2M", "5.5M", "11M"};
  450. u8 idx = rate - DESC_RATE1M;
  451. seq_printf(m, " CCK_%-5s", cck_rate[idx]);
  452. }
  453. static void rtw_print_ofdm_rate_txt(struct seq_file *m, u8 rate)
  454. {
  455. static const char * const
  456. ofdm_rate[] = {"6M", "9M", "12M", "18M", "24M", "36M", "48M", "54M"};
  457. u8 idx = rate - DESC_RATE6M;
  458. seq_printf(m, " OFDM_%-4s", ofdm_rate[idx]);
  459. }
  460. static void rtw_print_ht_rate_txt(struct seq_file *m, u8 rate)
  461. {
  462. u8 mcs_n = rate - DESC_RATEMCS0;
  463. seq_printf(m, " MCS%-6u", mcs_n);
  464. }
  465. static void rtw_print_vht_rate_txt(struct seq_file *m, u8 rate)
  466. {
  467. u8 idx = rate - DESC_RATEVHT1SS_MCS0;
  468. u8 n_ss, mcs_n;
  469. /* n spatial stream */
  470. n_ss = 1 + idx / 10;
  471. /* MCS n */
  472. mcs_n = idx % 10;
  473. seq_printf(m, " VHT%uSMCS%u", n_ss, mcs_n);
  474. }
  475. static void rtw_print_rate(struct seq_file *m, u8 rate)
  476. {
  477. switch (rate) {
  478. case DESC_RATE1M...DESC_RATE11M:
  479. rtw_print_cck_rate_txt(m, rate);
  480. break;
  481. case DESC_RATE6M...DESC_RATE54M:
  482. rtw_print_ofdm_rate_txt(m, rate);
  483. break;
  484. case DESC_RATEMCS0...DESC_RATEMCS15:
  485. rtw_print_ht_rate_txt(m, rate);
  486. break;
  487. case DESC_RATEVHT1SS_MCS0...DESC_RATEVHT2SS_MCS9:
  488. rtw_print_vht_rate_txt(m, rate);
  489. break;
  490. default:
  491. seq_printf(m, " Unknown rate=0x%x\n", rate);
  492. break;
  493. }
  494. }
  495. #define case_REGD(src) \
  496. case RTW_REGD_##src: return #src
  497. static const char *rtw_get_regd_string(u8 regd)
  498. {
  499. switch (regd) {
  500. case_REGD(FCC);
  501. case_REGD(MKK);
  502. case_REGD(ETSI);
  503. case_REGD(IC);
  504. case_REGD(KCC);
  505. case_REGD(ACMA);
  506. case_REGD(CHILE);
  507. case_REGD(UKRAINE);
  508. case_REGD(MEXICO);
  509. case_REGD(CN);
  510. case_REGD(WW);
  511. default:
  512. return "Unknown";
  513. }
  514. }
  515. static int rtw_debugfs_get_tx_pwr_tbl(struct seq_file *m, void *v)
  516. {
  517. struct rtw_debugfs_priv *debugfs_priv = m->private;
  518. struct rtw_dev *rtwdev = debugfs_priv->rtwdev;
  519. struct rtw_hal *hal = &rtwdev->hal;
  520. u8 path, rate, bw, ch, regd;
  521. struct rtw_power_params pwr_param = {0};
  522. mutex_lock(&rtwdev->mutex);
  523. bw = hal->current_band_width;
  524. ch = hal->current_channel;
  525. regd = rtw_regd_get(rtwdev);
  526. seq_printf(m, "channel: %u\n", ch);
  527. seq_printf(m, "bandwidth: %u\n", bw);
  528. seq_printf(m, "regulatory: %s\n", rtw_get_regd_string(regd));
  529. seq_printf(m, "%-4s %-10s %-9s %-9s (%-4s %-4s %-4s) %-4s\n",
  530. "path", "rate", "pwr", "base", "byr", "lmt", "sar", "rem");
  531. mutex_lock(&hal->tx_power_mutex);
  532. for (path = RF_PATH_A; path <= RF_PATH_B; path++) {
  533. /* there is no CCK rates used in 5G */
  534. if (hal->current_band_type == RTW_BAND_5G)
  535. rate = DESC_RATE6M;
  536. else
  537. rate = DESC_RATE1M;
  538. /* now, not support vht 3ss and vht 4ss*/
  539. for (; rate <= DESC_RATEVHT2SS_MCS9; rate++) {
  540. /* now, not support ht 3ss and ht 4ss*/
  541. if (rate > DESC_RATEMCS15 &&
  542. rate < DESC_RATEVHT1SS_MCS0)
  543. continue;
  544. rtw_get_tx_power_params(rtwdev, path, rate, bw,
  545. ch, regd, &pwr_param);
  546. seq_printf(m, "%4c ", path + 'A');
  547. rtw_print_rate(m, rate);
  548. seq_printf(m, " %3u(0x%02x) %4u %4d (%4d %4d %4d) %4d\n",
  549. hal->tx_pwr_tbl[path][rate],
  550. hal->tx_pwr_tbl[path][rate],
  551. pwr_param.pwr_base,
  552. min3(pwr_param.pwr_offset,
  553. pwr_param.pwr_limit,
  554. pwr_param.pwr_sar),
  555. pwr_param.pwr_offset, pwr_param.pwr_limit,
  556. pwr_param.pwr_sar,
  557. pwr_param.pwr_remnant);
  558. }
  559. }
  560. mutex_unlock(&hal->tx_power_mutex);
  561. mutex_unlock(&rtwdev->mutex);
  562. return 0;
  563. }
  564. void rtw_debugfs_get_simple_phy_info(struct seq_file *m)
  565. {
  566. struct rtw_debugfs_priv *debugfs_priv = m->private;
  567. struct rtw_dev *rtwdev = debugfs_priv->rtwdev;
  568. struct rtw_hal *hal = &rtwdev->hal;
  569. struct rtw_dm_info *dm_info = &rtwdev->dm_info;
  570. struct rtw_traffic_stats *stats = &rtwdev->stats;
  571. seq_printf(m, "%-40s = %ddBm/ %d\n", "RSSI/ STA Channel",
  572. dm_info->rssi[RF_PATH_A] - 100, hal->current_channel);
  573. seq_printf(m, "TP {Tx, Rx} = {%u, %u}Mbps\n",
  574. stats->tx_throughput, stats->rx_throughput);
  575. seq_puts(m, "[Tx Rate] = ");
  576. rtw_print_rate(m, dm_info->tx_rate);
  577. seq_printf(m, "(0x%x)\n", dm_info->tx_rate);
  578. seq_puts(m, "[Rx Rate] = ");
  579. rtw_print_rate(m, dm_info->curr_rx_rate);
  580. seq_printf(m, "(0x%x)\n", dm_info->curr_rx_rate);
  581. }
  582. static int rtw_debugfs_get_phy_info(struct seq_file *m, void *v)
  583. {
  584. struct rtw_debugfs_priv *debugfs_priv = m->private;
  585. struct rtw_dev *rtwdev = debugfs_priv->rtwdev;
  586. struct rtw_dm_info *dm_info = &rtwdev->dm_info;
  587. struct rtw_traffic_stats *stats = &rtwdev->stats;
  588. struct rtw_pkt_count *last_cnt = &dm_info->last_pkt_count;
  589. struct rtw_efuse *efuse = &rtwdev->efuse;
  590. struct ewma_evm *ewma_evm = dm_info->ewma_evm;
  591. struct ewma_snr *ewma_snr = dm_info->ewma_snr;
  592. u8 ss, rate_id;
  593. seq_puts(m, "==========[Common Info]========\n");
  594. seq_printf(m, "Is link = %c\n", rtw_is_assoc(rtwdev) ? 'Y' : 'N');
  595. seq_printf(m, "Current CH(fc) = %u\n", rtwdev->hal.current_channel);
  596. seq_printf(m, "Current BW = %u\n", rtwdev->hal.current_band_width);
  597. seq_printf(m, "Current IGI = 0x%x\n", dm_info->igi_history[0]);
  598. seq_printf(m, "TP {Tx, Rx} = {%u, %u}Mbps\n",
  599. stats->tx_throughput, stats->rx_throughput);
  600. seq_printf(m, "1SS for TX and RX = %c\n\n", rtwdev->hal.txrx_1ss ?
  601. 'Y' : 'N');
  602. seq_puts(m, "==========[Tx Phy Info]========\n");
  603. seq_puts(m, "[Tx Rate] = ");
  604. rtw_print_rate(m, dm_info->tx_rate);
  605. seq_printf(m, "(0x%x)\n\n", dm_info->tx_rate);
  606. seq_puts(m, "==========[Rx Phy Info]========\n");
  607. seq_printf(m, "[Rx Beacon Count] = %u\n", last_cnt->num_bcn_pkt);
  608. seq_puts(m, "[Rx Rate] = ");
  609. rtw_print_rate(m, dm_info->curr_rx_rate);
  610. seq_printf(m, "(0x%x)\n", dm_info->curr_rx_rate);
  611. seq_puts(m, "[Rx Rate Count]:\n");
  612. seq_printf(m, " * CCK = {%u, %u, %u, %u}\n",
  613. last_cnt->num_qry_pkt[DESC_RATE1M],
  614. last_cnt->num_qry_pkt[DESC_RATE2M],
  615. last_cnt->num_qry_pkt[DESC_RATE5_5M],
  616. last_cnt->num_qry_pkt[DESC_RATE11M]);
  617. seq_printf(m, " * OFDM = {%u, %u, %u, %u, %u, %u, %u, %u}\n",
  618. last_cnt->num_qry_pkt[DESC_RATE6M],
  619. last_cnt->num_qry_pkt[DESC_RATE9M],
  620. last_cnt->num_qry_pkt[DESC_RATE12M],
  621. last_cnt->num_qry_pkt[DESC_RATE18M],
  622. last_cnt->num_qry_pkt[DESC_RATE24M],
  623. last_cnt->num_qry_pkt[DESC_RATE36M],
  624. last_cnt->num_qry_pkt[DESC_RATE48M],
  625. last_cnt->num_qry_pkt[DESC_RATE54M]);
  626. for (ss = 0; ss < efuse->hw_cap.nss; ss++) {
  627. rate_id = DESC_RATEMCS0 + ss * 8;
  628. seq_printf(m, " * HT_MCS[%u:%u] = {%u, %u, %u, %u, %u, %u, %u, %u}\n",
  629. ss * 8, ss * 8 + 7,
  630. last_cnt->num_qry_pkt[rate_id],
  631. last_cnt->num_qry_pkt[rate_id + 1],
  632. last_cnt->num_qry_pkt[rate_id + 2],
  633. last_cnt->num_qry_pkt[rate_id + 3],
  634. last_cnt->num_qry_pkt[rate_id + 4],
  635. last_cnt->num_qry_pkt[rate_id + 5],
  636. last_cnt->num_qry_pkt[rate_id + 6],
  637. last_cnt->num_qry_pkt[rate_id + 7]);
  638. }
  639. for (ss = 0; ss < efuse->hw_cap.nss; ss++) {
  640. rate_id = DESC_RATEVHT1SS_MCS0 + ss * 10;
  641. seq_printf(m, " * VHT_MCS-%uss MCS[0:9] = {%u, %u, %u, %u, %u, %u, %u, %u, %u, %u}\n",
  642. ss + 1,
  643. last_cnt->num_qry_pkt[rate_id],
  644. last_cnt->num_qry_pkt[rate_id + 1],
  645. last_cnt->num_qry_pkt[rate_id + 2],
  646. last_cnt->num_qry_pkt[rate_id + 3],
  647. last_cnt->num_qry_pkt[rate_id + 4],
  648. last_cnt->num_qry_pkt[rate_id + 5],
  649. last_cnt->num_qry_pkt[rate_id + 6],
  650. last_cnt->num_qry_pkt[rate_id + 7],
  651. last_cnt->num_qry_pkt[rate_id + 8],
  652. last_cnt->num_qry_pkt[rate_id + 9]);
  653. }
  654. seq_printf(m, "[RSSI(dBm)] = {%d, %d}\n",
  655. dm_info->rssi[RF_PATH_A] - 100,
  656. dm_info->rssi[RF_PATH_B] - 100);
  657. seq_printf(m, "[Rx EVM(dB)] = {-%d, -%d}\n",
  658. dm_info->rx_evm_dbm[RF_PATH_A],
  659. dm_info->rx_evm_dbm[RF_PATH_B]);
  660. seq_printf(m, "[Rx SNR] = {%d, %d}\n",
  661. dm_info->rx_snr[RF_PATH_A],
  662. dm_info->rx_snr[RF_PATH_B]);
  663. seq_printf(m, "[CFO_tail(KHz)] = {%d, %d}\n",
  664. dm_info->cfo_tail[RF_PATH_A],
  665. dm_info->cfo_tail[RF_PATH_B]);
  666. if (dm_info->curr_rx_rate >= DESC_RATE11M) {
  667. seq_puts(m, "[Rx Average Status]:\n");
  668. seq_printf(m, " * OFDM, EVM: {-%d}, SNR: {%d}\n",
  669. (u8)ewma_evm_read(&ewma_evm[RTW_EVM_OFDM]),
  670. (u8)ewma_snr_read(&ewma_snr[RTW_SNR_OFDM_A]));
  671. seq_printf(m, " * 1SS, EVM: {-%d}, SNR: {%d}\n",
  672. (u8)ewma_evm_read(&ewma_evm[RTW_EVM_1SS]),
  673. (u8)ewma_snr_read(&ewma_snr[RTW_SNR_1SS_A]));
  674. seq_printf(m, " * 2SS, EVM: {-%d, -%d}, SNR: {%d, %d}\n",
  675. (u8)ewma_evm_read(&ewma_evm[RTW_EVM_2SS_A]),
  676. (u8)ewma_evm_read(&ewma_evm[RTW_EVM_2SS_B]),
  677. (u8)ewma_snr_read(&ewma_snr[RTW_SNR_2SS_A]),
  678. (u8)ewma_snr_read(&ewma_snr[RTW_SNR_2SS_B]));
  679. }
  680. seq_puts(m, "[Rx Counter]:\n");
  681. seq_printf(m, " * CCA (CCK, OFDM, Total) = (%u, %u, %u)\n",
  682. dm_info->cck_cca_cnt,
  683. dm_info->ofdm_cca_cnt,
  684. dm_info->total_cca_cnt);
  685. seq_printf(m, " * False Alarm (CCK, OFDM, Total) = (%u, %u, %u)\n",
  686. dm_info->cck_fa_cnt,
  687. dm_info->ofdm_fa_cnt,
  688. dm_info->total_fa_cnt);
  689. seq_printf(m, " * CCK cnt (ok, err) = (%u, %u)\n",
  690. dm_info->cck_ok_cnt, dm_info->cck_err_cnt);
  691. seq_printf(m, " * OFDM cnt (ok, err) = (%u, %u)\n",
  692. dm_info->ofdm_ok_cnt, dm_info->ofdm_err_cnt);
  693. seq_printf(m, " * HT cnt (ok, err) = (%u, %u)\n",
  694. dm_info->ht_ok_cnt, dm_info->ht_err_cnt);
  695. seq_printf(m, " * VHT cnt (ok, err) = (%u, %u)\n",
  696. dm_info->vht_ok_cnt, dm_info->vht_err_cnt);
  697. return 0;
  698. }
  699. static int rtw_debugfs_get_coex_info(struct seq_file *m, void *v)
  700. {
  701. struct rtw_debugfs_priv *debugfs_priv = m->private;
  702. struct rtw_dev *rtwdev = debugfs_priv->rtwdev;
  703. rtw_coex_display_coex_info(rtwdev, m);
  704. return 0;
  705. }
  706. static ssize_t rtw_debugfs_set_coex_enable(struct file *filp,
  707. const char __user *buffer,
  708. size_t count, loff_t *loff)
  709. {
  710. struct seq_file *seqpriv = (struct seq_file *)filp->private_data;
  711. struct rtw_debugfs_priv *debugfs_priv = seqpriv->private;
  712. struct rtw_dev *rtwdev = debugfs_priv->rtwdev;
  713. struct rtw_coex *coex = &rtwdev->coex;
  714. char tmp[32 + 1];
  715. bool enable;
  716. int ret;
  717. rtw_debugfs_copy_from_user(tmp, sizeof(tmp), buffer, count, 1);
  718. ret = kstrtobool(tmp, &enable);
  719. if (ret) {
  720. rtw_warn(rtwdev, "invalid arguments\n");
  721. return ret;
  722. }
  723. mutex_lock(&rtwdev->mutex);
  724. coex->manual_control = !enable;
  725. mutex_unlock(&rtwdev->mutex);
  726. return count;
  727. }
  728. static int rtw_debugfs_get_coex_enable(struct seq_file *m, void *v)
  729. {
  730. struct rtw_debugfs_priv *debugfs_priv = m->private;
  731. struct rtw_dev *rtwdev = debugfs_priv->rtwdev;
  732. struct rtw_coex *coex = &rtwdev->coex;
  733. seq_printf(m, "coex mechanism %s\n",
  734. coex->manual_control ? "disabled" : "enabled");
  735. return 0;
  736. }
  737. static ssize_t rtw_debugfs_set_edcca_enable(struct file *filp,
  738. const char __user *buffer,
  739. size_t count, loff_t *loff)
  740. {
  741. struct seq_file *seqpriv = (struct seq_file *)filp->private_data;
  742. struct rtw_debugfs_priv *debugfs_priv = seqpriv->private;
  743. struct rtw_dev *rtwdev = debugfs_priv->rtwdev;
  744. bool input;
  745. int err;
  746. err = kstrtobool_from_user(buffer, count, &input);
  747. if (err)
  748. return err;
  749. rtw_edcca_enabled = input;
  750. rtw_phy_adaptivity_set_mode(rtwdev);
  751. return count;
  752. }
  753. static int rtw_debugfs_get_edcca_enable(struct seq_file *m, void *v)
  754. {
  755. struct rtw_debugfs_priv *debugfs_priv = m->private;
  756. struct rtw_dev *rtwdev = debugfs_priv->rtwdev;
  757. struct rtw_dm_info *dm_info = &rtwdev->dm_info;
  758. seq_printf(m, "EDCCA %s: EDCCA mode %d\n",
  759. rtw_edcca_enabled ? "enabled" : "disabled",
  760. dm_info->edcca_mode);
  761. return 0;
  762. }
  763. static ssize_t rtw_debugfs_set_fw_crash(struct file *filp,
  764. const char __user *buffer,
  765. size_t count, loff_t *loff)
  766. {
  767. struct seq_file *seqpriv = (struct seq_file *)filp->private_data;
  768. struct rtw_debugfs_priv *debugfs_priv = seqpriv->private;
  769. struct rtw_dev *rtwdev = debugfs_priv->rtwdev;
  770. char tmp[32 + 1];
  771. bool input;
  772. int ret;
  773. rtw_debugfs_copy_from_user(tmp, sizeof(tmp), buffer, count, 1);
  774. ret = kstrtobool(tmp, &input);
  775. if (ret)
  776. return -EINVAL;
  777. if (!input)
  778. return -EINVAL;
  779. if (test_bit(RTW_FLAG_RESTARTING, rtwdev->flags))
  780. return -EINPROGRESS;
  781. mutex_lock(&rtwdev->mutex);
  782. rtw_leave_lps_deep(rtwdev);
  783. set_bit(RTW_FLAG_RESTART_TRIGGERING, rtwdev->flags);
  784. rtw_write8(rtwdev, REG_HRCV_MSG, 1);
  785. mutex_unlock(&rtwdev->mutex);
  786. return count;
  787. }
  788. static int rtw_debugfs_get_fw_crash(struct seq_file *m, void *v)
  789. {
  790. struct rtw_debugfs_priv *debugfs_priv = m->private;
  791. struct rtw_dev *rtwdev = debugfs_priv->rtwdev;
  792. seq_printf(m, "%d\n",
  793. test_bit(RTW_FLAG_RESTART_TRIGGERING, rtwdev->flags) ||
  794. test_bit(RTW_FLAG_RESTARTING, rtwdev->flags));
  795. return 0;
  796. }
  797. static ssize_t rtw_debugfs_set_force_lowest_basic_rate(struct file *filp,
  798. const char __user *buffer,
  799. size_t count, loff_t *loff)
  800. {
  801. struct seq_file *seqpriv = (struct seq_file *)filp->private_data;
  802. struct rtw_debugfs_priv *debugfs_priv = seqpriv->private;
  803. struct rtw_dev *rtwdev = debugfs_priv->rtwdev;
  804. bool input;
  805. int err;
  806. err = kstrtobool_from_user(buffer, count, &input);
  807. if (err)
  808. return err;
  809. if (input)
  810. set_bit(RTW_FLAG_FORCE_LOWEST_RATE, rtwdev->flags);
  811. else
  812. clear_bit(RTW_FLAG_FORCE_LOWEST_RATE, rtwdev->flags);
  813. return count;
  814. }
  815. static int rtw_debugfs_get_force_lowest_basic_rate(struct seq_file *m, void *v)
  816. {
  817. struct rtw_debugfs_priv *debugfs_priv = m->private;
  818. struct rtw_dev *rtwdev = debugfs_priv->rtwdev;
  819. seq_printf(m, "force lowest basic rate: %d\n",
  820. test_bit(RTW_FLAG_FORCE_LOWEST_RATE, rtwdev->flags));
  821. return 0;
  822. }
  823. static ssize_t rtw_debugfs_set_dm_cap(struct file *filp,
  824. const char __user *buffer,
  825. size_t count, loff_t *loff)
  826. {
  827. struct seq_file *seqpriv = (struct seq_file *)filp->private_data;
  828. struct rtw_debugfs_priv *debugfs_priv = seqpriv->private;
  829. struct rtw_dev *rtwdev = debugfs_priv->rtwdev;
  830. struct rtw_dm_info *dm_info = &rtwdev->dm_info;
  831. int bit;
  832. bool en;
  833. if (kstrtoint_from_user(buffer, count, 10, &bit))
  834. return -EINVAL;
  835. en = bit > 0;
  836. bit = abs(bit);
  837. if (bit >= RTW_DM_CAP_NUM) {
  838. rtw_warn(rtwdev, "unknown DM CAP %d\n", bit);
  839. return -EINVAL;
  840. }
  841. if (en)
  842. dm_info->dm_flags &= ~BIT(bit);
  843. else
  844. dm_info->dm_flags |= BIT(bit);
  845. debugfs_priv->dm_cap.bit = bit;
  846. return count;
  847. }
  848. static void dump_gapk_status(struct rtw_dev *rtwdev, struct seq_file *m)
  849. {
  850. struct rtw_dm_info *dm_info = &rtwdev->dm_info;
  851. struct rtw_gapk_info *txgapk = &rtwdev->dm_info.gapk;
  852. int i, path;
  853. u32 val;
  854. seq_printf(m, "\n(%2d) %c%s\n\n", RTW_DM_CAP_TXGAPK,
  855. dm_info->dm_flags & BIT(RTW_DM_CAP_TXGAPK) ? '-' : '+',
  856. rtw_dm_cap_strs[RTW_DM_CAP_TXGAPK]);
  857. for (path = 0; path < rtwdev->hal.rf_path_num; path++) {
  858. val = rtw_read_rf(rtwdev, path, RF_GAINTX, RFREG_MASK);
  859. seq_printf(m, "path %d:\n0x%x = 0x%x\n", path, RF_GAINTX, val);
  860. for (i = 0; i < RF_HW_OFFSET_NUM; i++)
  861. seq_printf(m, "[TXGAPK] offset %d %d\n",
  862. txgapk->rf3f_fs[path][i], i);
  863. seq_puts(m, "\n");
  864. }
  865. }
  866. static int rtw_debugfs_get_dm_cap(struct seq_file *m, void *v)
  867. {
  868. struct rtw_debugfs_priv *debugfs_priv = m->private;
  869. struct rtw_dev *rtwdev = debugfs_priv->rtwdev;
  870. struct rtw_dm_info *dm_info = &rtwdev->dm_info;
  871. int i;
  872. switch (debugfs_priv->dm_cap.bit) {
  873. case RTW_DM_CAP_TXGAPK:
  874. dump_gapk_status(rtwdev, m);
  875. break;
  876. default:
  877. for (i = 1; i < RTW_DM_CAP_NUM; i++) {
  878. seq_printf(m, "(%2d) %c%s\n", i,
  879. dm_info->dm_flags & BIT(i) ? '-' : '+',
  880. rtw_dm_cap_strs[i]);
  881. }
  882. break;
  883. }
  884. debugfs_priv->dm_cap.bit = RTW_DM_CAP_NA;
  885. return 0;
  886. }
  887. #define rtw_debug_impl_mac(page, addr) \
  888. static struct rtw_debugfs_priv rtw_debug_priv_mac_ ##page = { \
  889. .cb_read = rtw_debug_get_mac_page, \
  890. .cb_data = addr, \
  891. }
  892. rtw_debug_impl_mac(0, 0x0000);
  893. rtw_debug_impl_mac(1, 0x0100);
  894. rtw_debug_impl_mac(2, 0x0200);
  895. rtw_debug_impl_mac(3, 0x0300);
  896. rtw_debug_impl_mac(4, 0x0400);
  897. rtw_debug_impl_mac(5, 0x0500);
  898. rtw_debug_impl_mac(6, 0x0600);
  899. rtw_debug_impl_mac(7, 0x0700);
  900. rtw_debug_impl_mac(10, 0x1000);
  901. rtw_debug_impl_mac(11, 0x1100);
  902. rtw_debug_impl_mac(12, 0x1200);
  903. rtw_debug_impl_mac(13, 0x1300);
  904. rtw_debug_impl_mac(14, 0x1400);
  905. rtw_debug_impl_mac(15, 0x1500);
  906. rtw_debug_impl_mac(16, 0x1600);
  907. rtw_debug_impl_mac(17, 0x1700);
  908. #define rtw_debug_impl_bb(page, addr) \
  909. static struct rtw_debugfs_priv rtw_debug_priv_bb_ ##page = { \
  910. .cb_read = rtw_debug_get_bb_page, \
  911. .cb_data = addr, \
  912. }
  913. rtw_debug_impl_bb(8, 0x0800);
  914. rtw_debug_impl_bb(9, 0x0900);
  915. rtw_debug_impl_bb(a, 0x0a00);
  916. rtw_debug_impl_bb(b, 0x0b00);
  917. rtw_debug_impl_bb(c, 0x0c00);
  918. rtw_debug_impl_bb(d, 0x0d00);
  919. rtw_debug_impl_bb(e, 0x0e00);
  920. rtw_debug_impl_bb(f, 0x0f00);
  921. rtw_debug_impl_bb(18, 0x1800);
  922. rtw_debug_impl_bb(19, 0x1900);
  923. rtw_debug_impl_bb(1a, 0x1a00);
  924. rtw_debug_impl_bb(1b, 0x1b00);
  925. rtw_debug_impl_bb(1c, 0x1c00);
  926. rtw_debug_impl_bb(1d, 0x1d00);
  927. rtw_debug_impl_bb(1e, 0x1e00);
  928. rtw_debug_impl_bb(1f, 0x1f00);
  929. rtw_debug_impl_bb(2c, 0x2c00);
  930. rtw_debug_impl_bb(2d, 0x2d00);
  931. rtw_debug_impl_bb(40, 0x4000);
  932. rtw_debug_impl_bb(41, 0x4100);
  933. static struct rtw_debugfs_priv rtw_debug_priv_rf_dump = {
  934. .cb_read = rtw_debug_get_rf_dump,
  935. };
  936. static struct rtw_debugfs_priv rtw_debug_priv_tx_pwr_tbl = {
  937. .cb_read = rtw_debugfs_get_tx_pwr_tbl,
  938. };
  939. static struct rtw_debugfs_priv rtw_debug_priv_write_reg = {
  940. .cb_write = rtw_debugfs_set_write_reg,
  941. };
  942. static struct rtw_debugfs_priv rtw_debug_priv_h2c = {
  943. .cb_write = rtw_debugfs_set_h2c,
  944. };
  945. static struct rtw_debugfs_priv rtw_debug_priv_rf_write = {
  946. .cb_write = rtw_debugfs_set_rf_write,
  947. };
  948. static struct rtw_debugfs_priv rtw_debug_priv_rf_read = {
  949. .cb_write = rtw_debugfs_set_rf_read,
  950. .cb_read = rtw_debugfs_get_rf_read,
  951. };
  952. static struct rtw_debugfs_priv rtw_debug_priv_read_reg = {
  953. .cb_write = rtw_debugfs_set_read_reg,
  954. .cb_read = rtw_debugfs_get_read_reg,
  955. };
  956. static struct rtw_debugfs_priv rtw_debug_priv_fix_rate = {
  957. .cb_write = rtw_debugfs_set_fix_rate,
  958. .cb_read = rtw_debugfs_get_fix_rate,
  959. };
  960. static struct rtw_debugfs_priv rtw_debug_priv_dump_cam = {
  961. .cb_write = rtw_debugfs_set_single_input,
  962. .cb_read = rtw_debugfs_get_dump_cam,
  963. };
  964. static struct rtw_debugfs_priv rtw_debug_priv_rsvd_page = {
  965. .cb_write = rtw_debugfs_set_rsvd_page,
  966. .cb_read = rtw_debugfs_get_rsvd_page,
  967. };
  968. static struct rtw_debugfs_priv rtw_debug_priv_phy_info = {
  969. .cb_read = rtw_debugfs_get_phy_info,
  970. };
  971. static struct rtw_debugfs_priv rtw_debug_priv_coex_enable = {
  972. .cb_write = rtw_debugfs_set_coex_enable,
  973. .cb_read = rtw_debugfs_get_coex_enable,
  974. };
  975. static struct rtw_debugfs_priv rtw_debug_priv_coex_info = {
  976. .cb_read = rtw_debugfs_get_coex_info,
  977. };
  978. static struct rtw_debugfs_priv rtw_debug_priv_edcca_enable = {
  979. .cb_write = rtw_debugfs_set_edcca_enable,
  980. .cb_read = rtw_debugfs_get_edcca_enable,
  981. };
  982. static struct rtw_debugfs_priv rtw_debug_priv_fw_crash = {
  983. .cb_write = rtw_debugfs_set_fw_crash,
  984. .cb_read = rtw_debugfs_get_fw_crash,
  985. };
  986. static struct rtw_debugfs_priv rtw_debug_priv_force_lowest_basic_rate = {
  987. .cb_write = rtw_debugfs_set_force_lowest_basic_rate,
  988. .cb_read = rtw_debugfs_get_force_lowest_basic_rate,
  989. };
  990. static struct rtw_debugfs_priv rtw_debug_priv_dm_cap = {
  991. .cb_write = rtw_debugfs_set_dm_cap,
  992. .cb_read = rtw_debugfs_get_dm_cap,
  993. };
  994. #define rtw_debugfs_add_core(name, mode, fopname, parent) \
  995. do { \
  996. rtw_debug_priv_ ##name.rtwdev = rtwdev; \
  997. if (IS_ERR(debugfs_create_file(#name, mode, \
  998. parent, &rtw_debug_priv_ ##name,\
  999. &file_ops_ ##fopname))) \
  1000. pr_debug("Unable to initialize debugfs:%s\n", \
  1001. #name); \
  1002. } while (0)
  1003. #define rtw_debugfs_add_w(name) \
  1004. rtw_debugfs_add_core(name, S_IFREG | 0222, common_write, debugfs_topdir)
  1005. #define rtw_debugfs_add_rw(name) \
  1006. rtw_debugfs_add_core(name, S_IFREG | 0666, single_rw, debugfs_topdir)
  1007. #define rtw_debugfs_add_r(name) \
  1008. rtw_debugfs_add_core(name, S_IFREG | 0444, single_r, debugfs_topdir)
  1009. void rtw_debugfs_init(struct rtw_dev *rtwdev)
  1010. {
  1011. struct dentry *debugfs_topdir;
  1012. debugfs_topdir = debugfs_create_dir("rtw88",
  1013. rtwdev->hw->wiphy->debugfsdir);
  1014. rtw_debugfs_add_w(write_reg);
  1015. rtw_debugfs_add_rw(read_reg);
  1016. rtw_debugfs_add_w(rf_write);
  1017. rtw_debugfs_add_rw(rf_read);
  1018. rtw_debugfs_add_rw(fix_rate);
  1019. rtw_debugfs_add_rw(dump_cam);
  1020. rtw_debugfs_add_rw(rsvd_page);
  1021. rtw_debugfs_add_r(phy_info);
  1022. rtw_debugfs_add_r(coex_info);
  1023. rtw_debugfs_add_rw(coex_enable);
  1024. rtw_debugfs_add_w(h2c);
  1025. rtw_debugfs_add_r(mac_0);
  1026. rtw_debugfs_add_r(mac_1);
  1027. rtw_debugfs_add_r(mac_2);
  1028. rtw_debugfs_add_r(mac_3);
  1029. rtw_debugfs_add_r(mac_4);
  1030. rtw_debugfs_add_r(mac_5);
  1031. rtw_debugfs_add_r(mac_6);
  1032. rtw_debugfs_add_r(mac_7);
  1033. rtw_debugfs_add_r(bb_8);
  1034. rtw_debugfs_add_r(bb_9);
  1035. rtw_debugfs_add_r(bb_a);
  1036. rtw_debugfs_add_r(bb_b);
  1037. rtw_debugfs_add_r(bb_c);
  1038. rtw_debugfs_add_r(bb_d);
  1039. rtw_debugfs_add_r(bb_e);
  1040. rtw_debugfs_add_r(bb_f);
  1041. rtw_debugfs_add_r(mac_10);
  1042. rtw_debugfs_add_r(mac_11);
  1043. rtw_debugfs_add_r(mac_12);
  1044. rtw_debugfs_add_r(mac_13);
  1045. rtw_debugfs_add_r(mac_14);
  1046. rtw_debugfs_add_r(mac_15);
  1047. rtw_debugfs_add_r(mac_16);
  1048. rtw_debugfs_add_r(mac_17);
  1049. rtw_debugfs_add_r(bb_18);
  1050. rtw_debugfs_add_r(bb_19);
  1051. rtw_debugfs_add_r(bb_1a);
  1052. rtw_debugfs_add_r(bb_1b);
  1053. rtw_debugfs_add_r(bb_1c);
  1054. rtw_debugfs_add_r(bb_1d);
  1055. rtw_debugfs_add_r(bb_1e);
  1056. rtw_debugfs_add_r(bb_1f);
  1057. if (rtwdev->chip->id == RTW_CHIP_TYPE_8822C) {
  1058. rtw_debugfs_add_r(bb_2c);
  1059. rtw_debugfs_add_r(bb_2d);
  1060. rtw_debugfs_add_r(bb_40);
  1061. rtw_debugfs_add_r(bb_41);
  1062. }
  1063. rtw_debugfs_add_r(rf_dump);
  1064. rtw_debugfs_add_r(tx_pwr_tbl);
  1065. rtw_debugfs_add_rw(edcca_enable);
  1066. rtw_debugfs_add_rw(fw_crash);
  1067. rtw_debugfs_add_rw(force_lowest_basic_rate);
  1068. rtw_debugfs_add_rw(dm_cap);
  1069. }
  1070. #endif /* CONFIG_RTW88_DEBUGFS */
  1071. #ifdef CONFIG_RTW88_DEBUG
  1072. void __rtw_dbg(struct rtw_dev *rtwdev, enum rtw_debug_mask mask,
  1073. const char *fmt, ...)
  1074. {
  1075. struct va_format vaf = {
  1076. .fmt = fmt,
  1077. };
  1078. va_list args;
  1079. va_start(args, fmt);
  1080. vaf.va = &args;
  1081. if (rtw_debug_mask & mask)
  1082. dev_printk(KERN_DEBUG, rtwdev->dev, "%pV", &vaf);
  1083. va_end(args);
  1084. }
  1085. EXPORT_SYMBOL(__rtw_dbg);
  1086. #endif /* CONFIG_RTW88_DEBUG */