phydm_auto_dbg.c 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671
  1. /******************************************************************************
  2. *
  3. * Copyright(c) 2007 - 2017 Realtek Corporation.
  4. *
  5. * This program is free software; you can redistribute it and/or modify it
  6. * under the terms of version 2 of the GNU General Public License as
  7. * published by the Free Software Foundation.
  8. *
  9. * This program is distributed in the hope that it will be useful, but WITHOUT
  10. * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  11. * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  12. * more details.
  13. *
  14. * The full GNU General Public License is included in this distribution in the
  15. * file called LICENSE.
  16. *
  17. * Contact Information:
  18. * wlanfae <wlanfae@realtek.com>
  19. * Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park,
  20. * Hsinchu 300, Taiwan.
  21. *
  22. * Larry Finger <Larry.Finger@lwfinger.net>
  23. *
  24. *****************************************************************************/
  25. /*************************************************************
  26. * include files
  27. ************************************************************/
  28. #include "mp_precomp.h"
  29. #include "phydm_precomp.h"
  30. #ifdef PHYDM_AUTO_DEGBUG
  31. void phydm_check_hang_reset(
  32. void *dm_void)
  33. {
  34. struct dm_struct *dm = (struct dm_struct *)dm_void;
  35. struct phydm_auto_dbg_struct *atd_t = &dm->auto_dbg_table;
  36. atd_t->dbg_step = 0;
  37. atd_t->auto_dbg_type = AUTO_DBG_STOP;
  38. phydm_pause_dm_watchdog(dm, PHYDM_RESUME);
  39. dm->debug_components &= (~ODM_COMP_API);
  40. }
  41. void phydm_check_hang_init(
  42. void *dm_void)
  43. {
  44. struct dm_struct *dm = (struct dm_struct *)dm_void;
  45. struct phydm_auto_dbg_struct *atd_t = &dm->auto_dbg_table;
  46. atd_t->dbg_step = 0;
  47. atd_t->auto_dbg_type = AUTO_DBG_STOP;
  48. phydm_pause_dm_watchdog(dm, PHYDM_RESUME);
  49. }
  50. #if (ODM_IC_11N_SERIES_SUPPORT == 1)
  51. void phydm_auto_check_hang_engine_n(
  52. void *dm_void)
  53. {
  54. struct dm_struct *dm = (struct dm_struct *)dm_void;
  55. struct phydm_auto_dbg_struct *atd_t = &dm->auto_dbg_table;
  56. struct n_dbgport_803 dbgport_803 = {0};
  57. u32 value32_tmp = 0, value32_tmp_2 = 0;
  58. u8 i;
  59. u32 curr_dbg_port_val[DBGPORT_CHK_NUM];
  60. u16 curr_ofdm_t_cnt;
  61. u16 curr_ofdm_r_cnt;
  62. u16 curr_cck_t_cnt;
  63. u16 curr_cck_r_cnt;
  64. u16 curr_ofdm_crc_error_cnt;
  65. u16 curr_cck_crc_error_cnt;
  66. u16 diff_ofdm_t_cnt;
  67. u16 diff_ofdm_r_cnt;
  68. u16 diff_cck_t_cnt;
  69. u16 diff_cck_r_cnt;
  70. u16 diff_ofdm_crc_error_cnt;
  71. u16 diff_cck_crc_error_cnt;
  72. u8 rf_mode;
  73. if (atd_t->auto_dbg_type == AUTO_DBG_STOP)
  74. return;
  75. if (dm->support_ic_type & ODM_IC_11AC_SERIES) {
  76. phydm_check_hang_reset(dm);
  77. return;
  78. }
  79. if (atd_t->dbg_step == 0) {
  80. pr_debug("dbg_step=0\n\n");
  81. /*Reset all packet counter*/
  82. odm_set_bb_reg(dm, R_0xf14, BIT(16), 1);
  83. odm_set_bb_reg(dm, R_0xf14, BIT(16), 0);
  84. } else if (atd_t->dbg_step == 1) {
  85. pr_debug("dbg_step=1\n\n");
  86. /*Check packet counter Register*/
  87. atd_t->ofdm_t_cnt = (u16)odm_get_bb_reg(dm, R_0x9cc, MASKHWORD);
  88. atd_t->ofdm_r_cnt = (u16)odm_get_bb_reg(dm, R_0xf94, MASKLWORD);
  89. atd_t->ofdm_crc_error_cnt = (u16)odm_get_bb_reg(dm, R_0xf94,
  90. MASKHWORD);
  91. atd_t->cck_t_cnt = (u16)odm_get_bb_reg(dm, R_0x9d0, MASKHWORD);
  92. atd_t->cck_r_cnt = (u16)odm_get_bb_reg(dm, R_0xfa0, MASKHWORD);
  93. atd_t->cck_crc_error_cnt = (u16)odm_get_bb_reg(dm, R_0xf84,
  94. 0x3fff);
  95. /*Check Debug Port*/
  96. for (i = 0; i < DBGPORT_CHK_NUM; i++) {
  97. if (phydm_set_bb_dbg_port(dm, DBGPORT_PRI_3,
  98. (u32)atd_t->dbg_port_table[i])
  99. ) {
  100. atd_t->dbg_port_val[i] =
  101. phydm_get_bb_dbg_port_val(dm);
  102. phydm_release_bb_dbg_port(dm);
  103. }
  104. }
  105. } else if (atd_t->dbg_step == 2) {
  106. pr_debug("dbg_step=2\n\n");
  107. /*Check packet counter Register*/
  108. curr_ofdm_t_cnt = (u16)odm_get_bb_reg(dm, R_0x9cc, MASKHWORD);
  109. curr_ofdm_r_cnt = (u16)odm_get_bb_reg(dm, R_0xf94, MASKLWORD);
  110. curr_ofdm_crc_error_cnt = (u16)odm_get_bb_reg(dm, R_0xf94,
  111. MASKHWORD);
  112. curr_cck_t_cnt = (u16)odm_get_bb_reg(dm, R_0x9d0, MASKHWORD);
  113. curr_cck_r_cnt = (u16)odm_get_bb_reg(dm, R_0xfa0, MASKHWORD);
  114. curr_cck_crc_error_cnt = (u16)odm_get_bb_reg(dm, R_0xf84,
  115. 0x3fff);
  116. /*Check Debug Port*/
  117. for (i = 0; i < DBGPORT_CHK_NUM; i++) {
  118. if (phydm_set_bb_dbg_port(dm, DBGPORT_PRI_3,
  119. (u32)atd_t->dbg_port_table[i])
  120. ) {
  121. curr_dbg_port_val[i] =
  122. phydm_get_bb_dbg_port_val(dm);
  123. phydm_release_bb_dbg_port(dm);
  124. }
  125. }
  126. /*=== Make check hang decision ===============================*/
  127. pr_debug("Check Hang Decision\n\n");
  128. /* ----- Check RF Register -----------------------------------*/
  129. for (i = 0; i < dm->num_rf_path; i++) {
  130. rf_mode = (u8)odm_get_rf_reg(dm, i, RF_0x0, 0xf0000);
  131. pr_debug("RF0x0[%d] = 0x%x\n", i, rf_mode);
  132. if (rf_mode > 3) {
  133. pr_debug("Incorrect RF mode\n");
  134. pr_debug("ReasonCode:RHN-1\n");
  135. }
  136. }
  137. value32_tmp = odm_get_rf_reg(dm, 0, RF_0xb0, 0xf0000);
  138. if (dm->support_ic_type == ODM_RTL8188E) {
  139. if (value32_tmp != 0xff8c8) {
  140. pr_debug("ReasonCode:RHN-3\n");
  141. }
  142. }
  143. /* ----- Check BB Register ----------------------------------*/
  144. /*BB mode table*/
  145. value32_tmp = odm_get_bb_reg(dm, R_0x824, 0xe);
  146. value32_tmp_2 = odm_get_bb_reg(dm, R_0x82c, 0xe);
  147. pr_debug("BB TX mode table {A, B}= {%d, %d}\n",
  148. value32_tmp, value32_tmp_2);
  149. if (value32_tmp > 3 || value32_tmp_2 > 3) {
  150. pr_debug("ReasonCode:RHN-2\n");
  151. }
  152. value32_tmp = odm_get_bb_reg(dm, R_0x824, 0x700000);
  153. value32_tmp_2 = odm_get_bb_reg(dm, R_0x82c, 0x700000);
  154. pr_debug("BB RX mode table {A, B}= {%d, %d}\n", value32_tmp,
  155. value32_tmp_2);
  156. if (value32_tmp > 3 || value32_tmp_2 > 3) {
  157. pr_debug("ReasonCode:RHN-2\n");
  158. }
  159. /*BB HW Block*/
  160. value32_tmp = odm_get_bb_reg(dm, R_0x800, MASKDWORD);
  161. if (!(value32_tmp & BIT(24))) {
  162. pr_debug("Reg0x800[24] = 0, CCK BLK is disabled\n");
  163. pr_debug("ReasonCode: THN-3\n");
  164. }
  165. if (!(value32_tmp & BIT(25))) {
  166. pr_debug("Reg0x800[24] = 0, OFDM BLK is disabled\n");
  167. pr_debug("ReasonCode:THN-3\n");
  168. }
  169. /*BB Continue TX*/
  170. value32_tmp = odm_get_bb_reg(dm, R_0xd00, 0x70000000);
  171. pr_debug("Continue TX=%d\n", value32_tmp);
  172. if (value32_tmp != 0) {
  173. pr_debug("ReasonCode: THN-4\n");
  174. }
  175. /* ----- Check Packet Counter --------------------------------*/
  176. diff_ofdm_t_cnt = curr_ofdm_t_cnt - atd_t->ofdm_t_cnt;
  177. diff_ofdm_r_cnt = curr_ofdm_r_cnt - atd_t->ofdm_r_cnt;
  178. diff_ofdm_crc_error_cnt = curr_ofdm_crc_error_cnt -
  179. atd_t->ofdm_crc_error_cnt;
  180. diff_cck_t_cnt = curr_cck_t_cnt - atd_t->cck_t_cnt;
  181. diff_cck_r_cnt = curr_cck_r_cnt - atd_t->cck_r_cnt;
  182. diff_cck_crc_error_cnt = curr_cck_crc_error_cnt -
  183. atd_t->cck_crc_error_cnt;
  184. pr_debug("OFDM[t=0~1] {TX, RX, CRC_error} = {%d, %d, %d}\n",
  185. atd_t->ofdm_t_cnt, atd_t->ofdm_r_cnt,
  186. atd_t->ofdm_crc_error_cnt);
  187. pr_debug("OFDM[t=1~2] {TX, RX, CRC_error} = {%d, %d, %d}\n",
  188. curr_ofdm_t_cnt, curr_ofdm_r_cnt,
  189. curr_ofdm_crc_error_cnt);
  190. pr_debug("OFDM_diff {TX, RX, CRC_error} = {%d, %d, %d}\n",
  191. diff_ofdm_t_cnt, diff_ofdm_r_cnt,
  192. diff_ofdm_crc_error_cnt);
  193. pr_debug("CCK[t=0~1] {TX, RX, CRC_error} = {%d, %d, %d}\n",
  194. atd_t->cck_t_cnt, atd_t->cck_r_cnt,
  195. atd_t->cck_crc_error_cnt);
  196. pr_debug("CCK[t=1~2] {TX, RX, CRC_error} = {%d, %d, %d}\n",
  197. curr_cck_t_cnt, curr_cck_r_cnt,
  198. curr_cck_crc_error_cnt);
  199. pr_debug("CCK_diff {TX, RX, CRC_error} = {%d, %d, %d}\n",
  200. diff_cck_t_cnt, diff_cck_r_cnt,
  201. diff_cck_crc_error_cnt);
  202. /* ----- Check Dbg Port --------------------------------*/
  203. for (i = 0; i < DBGPORT_CHK_NUM; i++) {
  204. pr_debug("Dbg_port=((0x%x))\n",
  205. atd_t->dbg_port_table[i]);
  206. pr_debug("Val{pre, curr}={0x%x, 0x%x}\n",
  207. atd_t->dbg_port_val[i], curr_dbg_port_val[i]);
  208. if (atd_t->dbg_port_table[i] == 0) {
  209. if (atd_t->dbg_port_val[i] ==
  210. curr_dbg_port_val[i]) {
  211. pr_debug("BB state hang\n");
  212. pr_debug("ReasonCode:\n");
  213. }
  214. } else if (atd_t->dbg_port_table[i] == 0x803) {
  215. if (atd_t->dbg_port_val[i] ==
  216. curr_dbg_port_val[i]) {
  217. /* dbgport_803 = */
  218. /* (struct n_dbgport_803 ) */
  219. /* (atd_t->dbg_port_val[i]); */
  220. odm_move_memory(dm, &dbgport_803,
  221. &atd_t->dbg_port_val[i],
  222. sizeof(struct n_dbgport_803));
  223. pr_debug("RSTB{BB, GLB, OFDM}={%d, %d,%d}\n",
  224. dbgport_803.bb_rst_b,
  225. dbgport_803.glb_rst_b,
  226. dbgport_803.ofdm_rst_b);
  227. pr_debug("{ofdm_tx_en, cck_tx_en, phy_tx_on}={%d, %d, %d}\n",
  228. dbgport_803.ofdm_tx_en,
  229. dbgport_803.cck_tx_en,
  230. dbgport_803.phy_tx_on);
  231. pr_debug("CCA_PP{OFDM, CCK}={%d, %d}\n",
  232. dbgport_803.ofdm_cca_pp,
  233. dbgport_803.cck_cca_pp);
  234. if (dbgport_803.phy_tx_on)
  235. pr_debug("Maybe TX Hang\n");
  236. else if (dbgport_803.ofdm_cca_pp ||
  237. dbgport_803.cck_cca_pp)
  238. pr_debug("Maybe RX Hang\n");
  239. }
  240. } else if (atd_t->dbg_port_table[i] == 0x208) {
  241. if ((atd_t->dbg_port_val[i] & BIT(30)) &&
  242. (curr_dbg_port_val[i] & BIT(30))) {
  243. pr_debug("EDCCA Pause TX\n");
  244. pr_debug("ReasonCode: THN-2\n");
  245. }
  246. } else if (atd_t->dbg_port_table[i] == 0xab0) {
  247. /* atd_t->dbg_port_val[i] & 0xffffff == 0 */
  248. /* curr_dbg_port_val[i] & 0xffffff == 0 */
  249. if (((atd_t->dbg_port_val[i] &
  250. MASK24BITS) == 0) ||
  251. ((curr_dbg_port_val[i] &
  252. MASK24BITS) == 0)) {
  253. pr_debug("Wrong L-SIG formate\n");
  254. pr_debug("ReasonCode: THN-1\n");
  255. }
  256. }
  257. }
  258. phydm_check_hang_reset(dm);
  259. }
  260. atd_t->dbg_step++;
  261. }
  262. void phydm_bb_auto_check_hang_start_n(
  263. void *dm_void,
  264. u32 *_used,
  265. char *output,
  266. u32 *_out_len)
  267. {
  268. u32 value32 = 0;
  269. struct dm_struct *dm = (struct dm_struct *)dm_void;
  270. struct phydm_auto_dbg_struct *atd_t = &dm->auto_dbg_table;
  271. u32 used = *_used;
  272. u32 out_len = *_out_len;
  273. if (dm->support_ic_type & ODM_IC_11AC_SERIES)
  274. return;
  275. PDM_SNPF(out_len, used, output + used, out_len - used,
  276. "PHYDM auto check hang (N-series) is started, Please check the system log\n");
  277. dm->debug_components |= ODM_COMP_API;
  278. atd_t->auto_dbg_type = AUTO_DBG_CHECK_HANG;
  279. atd_t->dbg_step = 0;
  280. phydm_pause_dm_watchdog(dm, PHYDM_PAUSE);
  281. *_used = used;
  282. *_out_len = out_len;
  283. }
  284. void phydm_bb_rx_hang_info_n(
  285. void *dm_void,
  286. u32 *_used,
  287. char *output,
  288. u32 *_out_len)
  289. {
  290. u32 value32 = 0;
  291. struct dm_struct *dm = (struct dm_struct *)dm_void;
  292. u32 used = *_used;
  293. u32 out_len = *_out_len;
  294. if (dm->support_ic_type & ODM_IC_11AC_SERIES)
  295. return;
  296. PDM_SNPF(out_len, used, output + used, out_len - used,
  297. "not support now\n");
  298. *_used = used;
  299. *_out_len = out_len;
  300. }
  301. #endif
  302. #if (ODM_IC_11AC_SERIES_SUPPORT == 1)
  303. void phydm_bb_rx_hang_info_ac(
  304. void *dm_void,
  305. u32 *_used,
  306. char *output,
  307. u32 *_out_len)
  308. {
  309. u32 value32 = 0;
  310. struct dm_struct *dm = (struct dm_struct *)dm_void;
  311. u32 used = *_used;
  312. u32 out_len = *_out_len;
  313. if (dm->support_ic_type & ODM_IC_11N_SERIES)
  314. return;
  315. value32 = odm_get_bb_reg(dm, R_0xf80, MASKDWORD);
  316. PDM_SNPF(out_len, used, output + used, out_len - used,
  317. "\r\n %-35s = 0x%x", "rptreg of sc/bw/ht/...", value32);
  318. if (dm->support_ic_type & ODM_RTL8822B)
  319. odm_set_bb_reg(dm, R_0x198c, BIT(2) | BIT(1) | BIT(0), 7);
  320. /* dbg_port = basic state machine */
  321. {
  322. odm_set_bb_reg(dm, ODM_REG_DBG_RPT_11AC, MASKDWORD, 0x000);
  323. value32 = odm_get_bb_reg(dm, ODM_REG_DBG_RPT_11AC, MASKDWORD);
  324. PDM_SNPF(out_len, used, output + used, out_len - used,
  325. "\r\n %-35s = 0x%x", "0x8fc", value32);
  326. value32 = odm_get_bb_reg(dm, ODM_REG_RPT_11AC, MASKDWORD);
  327. PDM_SNPF(out_len, used, output + used, out_len - used,
  328. "\r\n %-35s = 0x%x", "basic state machine", value32);
  329. }
  330. /* dbg_port = state machine */
  331. {
  332. odm_set_bb_reg(dm, ODM_REG_DBG_RPT_11AC, MASKDWORD, 0x007);
  333. value32 = odm_get_bb_reg(dm, ODM_REG_DBG_RPT_11AC, MASKDWORD);
  334. PDM_SNPF(out_len, used, output + used, out_len - used,
  335. "\r\n %-35s = 0x%x", "0x8fc", value32);
  336. value32 = odm_get_bb_reg(dm, ODM_REG_RPT_11AC, MASKDWORD);
  337. PDM_SNPF(out_len, used, output + used, out_len - used,
  338. "\r\n %-35s = 0x%x", "state machine", value32);
  339. }
  340. /* dbg_port = CCA-related*/
  341. {
  342. odm_set_bb_reg(dm, ODM_REG_DBG_RPT_11AC, MASKDWORD, 0x204);
  343. value32 = odm_get_bb_reg(dm, ODM_REG_DBG_RPT_11AC, MASKDWORD);
  344. PDM_SNPF(out_len, used, output + used, out_len - used,
  345. "\r\n %-35s = 0x%x", "0x8fc", value32);
  346. value32 = odm_get_bb_reg(dm, ODM_REG_RPT_11AC, MASKDWORD);
  347. PDM_SNPF(out_len, used, output + used, out_len - used,
  348. "\r\n %-35s = 0x%x", "CCA-related", value32);
  349. }
  350. /* dbg_port = edcca/rxd*/
  351. {
  352. odm_set_bb_reg(dm, ODM_REG_DBG_RPT_11AC, MASKDWORD, 0x278);
  353. value32 = odm_get_bb_reg(dm, ODM_REG_DBG_RPT_11AC, MASKDWORD);
  354. PDM_SNPF(out_len, used, output + used, out_len - used,
  355. "\r\n %-35s = 0x%x", "0x8fc", value32);
  356. value32 = odm_get_bb_reg(dm, ODM_REG_RPT_11AC, MASKDWORD);
  357. PDM_SNPF(out_len, used, output + used, out_len - used,
  358. "\r\n %-35s = 0x%x", "edcca/rxd", value32);
  359. }
  360. /* dbg_port = rx_state/mux_state/ADC_MASK_OFDM*/
  361. {
  362. odm_set_bb_reg(dm, ODM_REG_DBG_RPT_11AC, MASKDWORD, 0x290);
  363. value32 = odm_get_bb_reg(dm, ODM_REG_DBG_RPT_11AC, MASKDWORD);
  364. PDM_SNPF(out_len, used, output + used, out_len - used,
  365. "\r\n %-35s = 0x%x", "0x8fc", value32);
  366. value32 = odm_get_bb_reg(dm, ODM_REG_RPT_11AC, MASKDWORD);
  367. PDM_SNPF(out_len, used, output + used, out_len - used,
  368. "\r\n %-35s = 0x%x",
  369. "rx_state/mux_state/ADC_MASK_OFDM", value32);
  370. }
  371. /* dbg_port = bf-related*/
  372. {
  373. odm_set_bb_reg(dm, ODM_REG_DBG_RPT_11AC, MASKDWORD, 0x2B2);
  374. value32 = odm_get_bb_reg(dm, ODM_REG_DBG_RPT_11AC, MASKDWORD);
  375. PDM_SNPF(out_len, used, output + used, out_len - used,
  376. "\r\n %-35s = 0x%x", "0x8fc", value32);
  377. value32 = odm_get_bb_reg(dm, ODM_REG_RPT_11AC, MASKDWORD);
  378. PDM_SNPF(out_len, used, output + used, out_len - used,
  379. "\r\n %-35s = 0x%x", "bf-related", value32);
  380. }
  381. /* dbg_port = bf-related*/
  382. {
  383. odm_set_bb_reg(dm, ODM_REG_DBG_RPT_11AC, MASKDWORD, 0x2B8);
  384. value32 = odm_get_bb_reg(dm, ODM_REG_DBG_RPT_11AC, MASKDWORD);
  385. PDM_SNPF(out_len, used, output + used, out_len - used,
  386. "\r\n %-35s = 0x%x", "0x8fc", value32);
  387. value32 = odm_get_bb_reg(dm, ODM_REG_RPT_11AC, MASKDWORD);
  388. PDM_SNPF(out_len, used, output + used, out_len - used,
  389. "\r\n %-35s = 0x%x", "bf-related", value32);
  390. }
  391. /* dbg_port = txon/rxd*/
  392. {
  393. odm_set_bb_reg(dm, ODM_REG_DBG_RPT_11AC, MASKDWORD, 0xA03);
  394. value32 = odm_get_bb_reg(dm, ODM_REG_DBG_RPT_11AC, MASKDWORD);
  395. PDM_SNPF(out_len, used, output + used, out_len - used,
  396. "\r\n %-35s = 0x%x", "0x8fc", value32);
  397. value32 = odm_get_bb_reg(dm, ODM_REG_RPT_11AC, MASKDWORD);
  398. PDM_SNPF(out_len, used, output + used, out_len - used,
  399. "\r\n %-35s = 0x%x", "txon/rxd", value32);
  400. }
  401. /* dbg_port = l_rate/l_length*/
  402. {
  403. odm_set_bb_reg(dm, ODM_REG_DBG_RPT_11AC, MASKDWORD, 0xA0B);
  404. value32 = odm_get_bb_reg(dm, ODM_REG_DBG_RPT_11AC, MASKDWORD);
  405. PDM_SNPF(out_len, used, output + used, out_len - used,
  406. "\r\n %-35s = 0x%x", "0x8fc", value32);
  407. value32 = odm_get_bb_reg(dm, ODM_REG_RPT_11AC, MASKDWORD);
  408. PDM_SNPF(out_len, used, output + used, out_len - used,
  409. "\r\n %-35s = 0x%x", "l_rate/l_length", value32);
  410. }
  411. /* dbg_port = rxd/rxd_hit*/
  412. {
  413. odm_set_bb_reg(dm, ODM_REG_DBG_RPT_11AC, MASKDWORD, 0xA0D);
  414. value32 = odm_get_bb_reg(dm, ODM_REG_DBG_RPT_11AC, MASKDWORD);
  415. PDM_SNPF(out_len, used, output + used, out_len - used,
  416. "\r\n %-35s = 0x%x", "0x8fc", value32);
  417. value32 = odm_get_bb_reg(dm, ODM_REG_RPT_11AC, MASKDWORD);
  418. PDM_SNPF(out_len, used, output + used, out_len - used,
  419. "\r\n %-35s = 0x%x", "rxd/rxd_hit", value32);
  420. }
  421. /* dbg_port = dis_cca*/
  422. {
  423. odm_set_bb_reg(dm, ODM_REG_DBG_RPT_11AC, MASKDWORD, 0xAA0);
  424. value32 = odm_get_bb_reg(dm, ODM_REG_DBG_RPT_11AC, MASKDWORD);
  425. PDM_SNPF(out_len, used, output + used, out_len - used,
  426. "\r\n %-35s = 0x%x", "0x8fc", value32);
  427. value32 = odm_get_bb_reg(dm, ODM_REG_RPT_11AC, MASKDWORD);
  428. PDM_SNPF(out_len, used, output + used, out_len - used,
  429. "\r\n %-35s = 0x%x", "dis_cca", value32);
  430. }
  431. /* dbg_port = tx*/
  432. {
  433. odm_set_bb_reg(dm, ODM_REG_DBG_RPT_11AC, MASKDWORD, 0xAB0);
  434. value32 = odm_get_bb_reg(dm, ODM_REG_DBG_RPT_11AC, MASKDWORD);
  435. PDM_SNPF(out_len, used, output + used, out_len - used,
  436. "\r\n %-35s = 0x%x", "0x8fc", value32);
  437. value32 = odm_get_bb_reg(dm, ODM_REG_RPT_11AC, MASKDWORD);
  438. PDM_SNPF(out_len, used, output + used, out_len - used,
  439. "\r\n %-35s = 0x%x", "tx", value32);
  440. }
  441. /* dbg_port = rx plcp*/
  442. {
  443. odm_set_bb_reg(dm, ODM_REG_DBG_RPT_11AC, MASKDWORD, 0xAD0);
  444. value32 = odm_get_bb_reg(dm, ODM_REG_DBG_RPT_11AC, MASKDWORD);
  445. PDM_SNPF(out_len, used, output + used, out_len - used,
  446. "\r\n %-35s = 0x%x", "0x8fc", value32);
  447. value32 = odm_get_bb_reg(dm, ODM_REG_RPT_11AC, MASKDWORD);
  448. PDM_SNPF(out_len, used, output + used, out_len - used,
  449. "\r\n %-35s = 0x%x", "rx plcp", value32);
  450. odm_set_bb_reg(dm, ODM_REG_DBG_RPT_11AC, MASKDWORD, 0xAD1);
  451. value32 = odm_get_bb_reg(dm, ODM_REG_DBG_RPT_11AC, MASKDWORD);
  452. PDM_SNPF(out_len, used, output + used, out_len - used,
  453. "\r\n %-35s = 0x%x", "0x8fc", value32);
  454. value32 = odm_get_bb_reg(dm, ODM_REG_RPT_11AC, MASKDWORD);
  455. PDM_SNPF(out_len, used, output + used, out_len - used,
  456. "\r\n %-35s = 0x%x", "rx plcp", value32);
  457. odm_set_bb_reg(dm, ODM_REG_DBG_RPT_11AC, MASKDWORD, 0xAD2);
  458. value32 = odm_get_bb_reg(dm, ODM_REG_DBG_RPT_11AC, MASKDWORD);
  459. PDM_SNPF(out_len, used, output + used, out_len - used,
  460. "\r\n %-35s = 0x%x", "0x8fc", value32);
  461. value32 = odm_get_bb_reg(dm, ODM_REG_RPT_11AC, MASKDWORD);
  462. PDM_SNPF(out_len, used, output + used, out_len - used,
  463. "\r\n %-35s = 0x%x", "rx plcp", value32);
  464. odm_set_bb_reg(dm, ODM_REG_DBG_RPT_11AC, MASKDWORD, 0xAD3);
  465. value32 = odm_get_bb_reg(dm, ODM_REG_DBG_RPT_11AC, MASKDWORD);
  466. PDM_SNPF(out_len, used, output + used, out_len - used,
  467. "\r\n %-35s = 0x%x", "0x8fc", value32);
  468. value32 = odm_get_bb_reg(dm, ODM_REG_RPT_11AC, MASKDWORD);
  469. PDM_SNPF(out_len, used, output + used, out_len - used,
  470. "\r\n %-35s = 0x%x", "rx plcp", value32);
  471. }
  472. *_used = used;
  473. *_out_len = out_len;
  474. }
  475. #endif
  476. void phydm_auto_dbg_console(
  477. void *dm_void,
  478. char input[][16],
  479. u32 *_used,
  480. char *output,
  481. u32 *_out_len)
  482. {
  483. struct dm_struct *dm = (struct dm_struct *)dm_void;
  484. char help[] = "-h";
  485. u32 var1[10] = {0};
  486. u32 used = *_used;
  487. u32 out_len = *_out_len;
  488. PHYDM_SSCANF(input[1], DCMD_DECIMAL, &var1[0]);
  489. if ((strcmp(input[1], help) == 0)) {
  490. PDM_SNPF(out_len, used, output + used, out_len - used,
  491. "Show dbg port: {1} {1}\n");
  492. PDM_SNPF(out_len, used, output + used, out_len - used,
  493. "Auto check hang: {1} {2}\n");
  494. return;
  495. } else if (var1[0] == 1) {
  496. PHYDM_SSCANF(input[2], DCMD_DECIMAL, &var1[1]);
  497. if (var1[1] == 1) {
  498. if (dm->support_ic_type & ODM_IC_11AC_SERIES) {
  499. #if (ODM_IC_11AC_SERIES_SUPPORT == 1)
  500. phydm_bb_rx_hang_info_ac(dm, &used, output,
  501. &out_len);
  502. #else
  503. PDM_SNPF(out_len, used, output + used,
  504. out_len - used, "Not support\n");
  505. #endif
  506. } else {
  507. #if (ODM_IC_11N_SERIES_SUPPORT == 1)
  508. phydm_bb_rx_hang_info_n(dm, &used, output,
  509. &out_len);
  510. #else
  511. PDM_SNPF(out_len, used, output + used,
  512. out_len - used, "Not support\n");
  513. #endif
  514. }
  515. } else if (var1[1] == 2) {
  516. if (dm->support_ic_type & ODM_IC_11AC_SERIES) {
  517. PDM_SNPF(out_len, used, output + used,
  518. out_len - used, "Not support\n");
  519. } else {
  520. #if (ODM_IC_11N_SERIES_SUPPORT == 1)
  521. phydm_bb_auto_check_hang_start_n(dm, &used,
  522. output,
  523. &out_len);
  524. #else
  525. PDM_SNPF(out_len, used, output + used,
  526. out_len - used, "Not support\n");
  527. #endif
  528. }
  529. }
  530. }
  531. *_used = used;
  532. *_out_len = out_len;
  533. }
  534. void phydm_auto_dbg_engine(void *dm_void)
  535. {
  536. u32 value32 = 0;
  537. struct dm_struct *dm = (struct dm_struct *)dm_void;
  538. struct phydm_auto_dbg_struct *atd_t = &dm->auto_dbg_table;
  539. if (atd_t->auto_dbg_type == AUTO_DBG_STOP)
  540. return;
  541. pr_debug("%s ======>\n", __func__);
  542. if (atd_t->auto_dbg_type == AUTO_DBG_CHECK_HANG) {
  543. if (dm->support_ic_type & ODM_IC_11AC_SERIES) {
  544. pr_debug("Not Support\n");
  545. } else {
  546. #if (ODM_IC_11N_SERIES_SUPPORT == 1)
  547. phydm_auto_check_hang_engine_n(dm);
  548. #else
  549. pr_debug("Not Support\n");
  550. #endif
  551. }
  552. } else if (atd_t->auto_dbg_type == AUTO_DBG_CHECK_RA) {
  553. pr_debug("Not Support\n");
  554. }
  555. }
  556. void phydm_auto_dbg_engine_init(void *dm_void)
  557. {
  558. struct dm_struct *dm = (struct dm_struct *)dm_void;
  559. struct phydm_auto_dbg_struct *atd_t = &dm->auto_dbg_table;
  560. u16 dbg_port_table[DBGPORT_CHK_NUM] = {0x0, 0x803, 0x208, 0xab0,
  561. 0xab1, 0xab2};
  562. PHYDM_DBG(dm, ODM_COMP_API, "%s ======>n", __func__);
  563. odm_move_memory(dm, &atd_t->dbg_port_table[0],
  564. &dbg_port_table[0], (DBGPORT_CHK_NUM * 2));
  565. phydm_check_hang_init(dm);
  566. }
  567. #endif