Path: blob/master/ALFA-W1F1/RTL8814AU/hal/phydm/phydm_auto_dbg.c
1307 views
/******************************************************************************1*2* Copyright(c) 2007 - 2017 Realtek Corporation.3*4* This program is free software; you can redistribute it and/or modify it5* under the terms of version 2 of the GNU General Public License as6* published by the Free Software Foundation.7*8* This program is distributed in the hope that it will be useful, but WITHOUT9* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or10* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for11* more details.12*13* The full GNU General Public License is included in this distribution in the14* file called LICENSE.15*16* Contact Information:17* wlanfae <[email protected]>18* Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park,19* Hsinchu 300, Taiwan.20*21* Larry Finger <[email protected]>22*23*****************************************************************************/2425/*************************************************************26* include files27************************************************************/2829#include "mp_precomp.h"30#include "phydm_precomp.h"3132#ifdef PHYDM_AUTO_DEGBUG3334void phydm_check_hang_reset(35void *dm_void)36{37struct dm_struct *dm = (struct dm_struct *)dm_void;38struct phydm_auto_dbg_struct *atd_t = &dm->auto_dbg_table;3940atd_t->dbg_step = 0;41atd_t->auto_dbg_type = AUTO_DBG_STOP;42phydm_pause_dm_watchdog(dm, PHYDM_RESUME);43dm->debug_components &= (~ODM_COMP_API);44}4546void phydm_check_hang_init(47void *dm_void)48{49struct dm_struct *dm = (struct dm_struct *)dm_void;50struct phydm_auto_dbg_struct *atd_t = &dm->auto_dbg_table;5152atd_t->dbg_step = 0;53atd_t->auto_dbg_type = AUTO_DBG_STOP;54phydm_pause_dm_watchdog(dm, PHYDM_RESUME);55}5657#if (ODM_IC_11N_SERIES_SUPPORT == 1)58void phydm_auto_check_hang_engine_n(59void *dm_void)60{61struct dm_struct *dm = (struct dm_struct *)dm_void;62struct phydm_auto_dbg_struct *atd_t = &dm->auto_dbg_table;63struct n_dbgport_803 dbgport_803 = {0};64u32 value32_tmp = 0, value32_tmp_2 = 0;65u8 i;66u32 curr_dbg_port_val[DBGPORT_CHK_NUM] = {0, 0, 0, 0, 0, 0};67u16 curr_ofdm_t_cnt;68u16 curr_ofdm_r_cnt;69u16 curr_cck_t_cnt;70u16 curr_cck_r_cnt;71u16 curr_ofdm_crc_error_cnt;72u16 curr_cck_crc_error_cnt;73u16 diff_ofdm_t_cnt;74u16 diff_ofdm_r_cnt;75u16 diff_cck_t_cnt;76u16 diff_cck_r_cnt;77u16 diff_ofdm_crc_error_cnt;78u16 diff_cck_crc_error_cnt;79u8 rf_mode;8081if (atd_t->auto_dbg_type == AUTO_DBG_STOP)82return;8384if (dm->support_ic_type & ODM_IC_11AC_SERIES) {85phydm_check_hang_reset(dm);86return;87}8889if (atd_t->dbg_step == 0) {90pr_debug("dbg_step=0\n\n");9192/*Reset all packet counter*/93odm_set_bb_reg(dm, R_0xf14, BIT(16), 1);94odm_set_bb_reg(dm, R_0xf14, BIT(16), 0);9596} else if (atd_t->dbg_step == 1) {97pr_debug("dbg_step=1\n\n");9899/*Check packet counter Register*/100atd_t->ofdm_t_cnt = (u16)odm_get_bb_reg(dm, R_0x9cc, MASKHWORD);101atd_t->ofdm_r_cnt = (u16)odm_get_bb_reg(dm, R_0xf94, MASKLWORD);102atd_t->ofdm_crc_error_cnt = (u16)odm_get_bb_reg(dm, R_0xf94,103MASKHWORD);104105atd_t->cck_t_cnt = (u16)odm_get_bb_reg(dm, R_0x9d0, MASKHWORD);106atd_t->cck_r_cnt = (u16)odm_get_bb_reg(dm, R_0xfa0, MASKHWORD);107atd_t->cck_crc_error_cnt = (u16)odm_get_bb_reg(dm, R_0xf84,1080x3fff);109110/*Check Debug Port*/111for (i = 0; i < DBGPORT_CHK_NUM; i++) {112if (phydm_set_bb_dbg_port(dm, DBGPORT_PRI_3,113(u32)atd_t->dbg_port_table[i])114) {115atd_t->dbg_port_val[i] =116phydm_get_bb_dbg_port_val(dm);117phydm_release_bb_dbg_port(dm);118}119}120121} else if (atd_t->dbg_step == 2) {122pr_debug("dbg_step=2\n\n");123124/*Check packet counter Register*/125curr_ofdm_t_cnt = (u16)odm_get_bb_reg(dm, R_0x9cc, MASKHWORD);126curr_ofdm_r_cnt = (u16)odm_get_bb_reg(dm, R_0xf94, MASKLWORD);127curr_ofdm_crc_error_cnt = (u16)odm_get_bb_reg(dm, R_0xf94,128MASKHWORD);129130curr_cck_t_cnt = (u16)odm_get_bb_reg(dm, R_0x9d0, MASKHWORD);131curr_cck_r_cnt = (u16)odm_get_bb_reg(dm, R_0xfa0, MASKHWORD);132curr_cck_crc_error_cnt = (u16)odm_get_bb_reg(dm, R_0xf84,1330x3fff);134135/*Check Debug Port*/136for (i = 0; i < DBGPORT_CHK_NUM; i++) {137if (phydm_set_bb_dbg_port(dm, DBGPORT_PRI_3,138(u32)atd_t->dbg_port_table[i])139) {140curr_dbg_port_val[i] =141phydm_get_bb_dbg_port_val(dm);142phydm_release_bb_dbg_port(dm);143}144}145146/*=== Make check hang decision ===============================*/147pr_debug("Check Hang Decision\n\n");148149/* ----- Check RF Register -----------------------------------*/150for (i = 0; i < dm->num_rf_path; i++) {151rf_mode = (u8)odm_get_rf_reg(dm, i, RF_0x0, 0xf0000);152pr_debug("RF0x0[%d] = 0x%x\n", i, rf_mode);153if (rf_mode > 3) {154pr_debug("Incorrect RF mode\n");155pr_debug("ReasonCode:RHN-1\n");156}157}158value32_tmp = odm_get_rf_reg(dm, 0, RF_0xb0, 0xf0000);159if (dm->support_ic_type == ODM_RTL8188E) {160if (value32_tmp != 0xff8c8) {161pr_debug("ReasonCode:RHN-3\n");162}163}164/* ----- Check BB Register ----------------------------------*/165/*BB mode table*/166value32_tmp = odm_get_bb_reg(dm, R_0x824, 0xe);167value32_tmp_2 = odm_get_bb_reg(dm, R_0x82c, 0xe);168pr_debug("BB TX mode table {A, B}= {%d, %d}\n",169value32_tmp, value32_tmp_2);170171if (value32_tmp > 3 || value32_tmp_2 > 3) {172pr_debug("ReasonCode:RHN-2\n");173}174175value32_tmp = odm_get_bb_reg(dm, R_0x824, 0x700000);176value32_tmp_2 = odm_get_bb_reg(dm, R_0x82c, 0x700000);177pr_debug("BB RX mode table {A, B}= {%d, %d}\n", value32_tmp,178value32_tmp_2);179180if (value32_tmp > 3 || value32_tmp_2 > 3) {181pr_debug("ReasonCode:RHN-2\n");182}183184/*BB HW Block*/185value32_tmp = odm_get_bb_reg(dm, R_0x800, MASKDWORD);186187if (!(value32_tmp & BIT(24))) {188pr_debug("Reg0x800[24] = 0, CCK BLK is disabled\n");189pr_debug("ReasonCode: THN-3\n");190}191192if (!(value32_tmp & BIT(25))) {193pr_debug("Reg0x800[24] = 0, OFDM BLK is disabled\n");194pr_debug("ReasonCode:THN-3\n");195}196197/*BB Continue TX*/198value32_tmp = odm_get_bb_reg(dm, R_0xd00, 0x70000000);199pr_debug("Continue TX=%d\n", value32_tmp);200if (value32_tmp != 0) {201pr_debug("ReasonCode: THN-4\n");202}203204/* ----- Check Packet Counter --------------------------------*/205diff_ofdm_t_cnt = curr_ofdm_t_cnt - atd_t->ofdm_t_cnt;206diff_ofdm_r_cnt = curr_ofdm_r_cnt - atd_t->ofdm_r_cnt;207diff_ofdm_crc_error_cnt = curr_ofdm_crc_error_cnt -208atd_t->ofdm_crc_error_cnt;209210diff_cck_t_cnt = curr_cck_t_cnt - atd_t->cck_t_cnt;211diff_cck_r_cnt = curr_cck_r_cnt - atd_t->cck_r_cnt;212diff_cck_crc_error_cnt = curr_cck_crc_error_cnt -213atd_t->cck_crc_error_cnt;214215pr_debug("OFDM[t=0~1] {TX, RX, CRC_error} = {%d, %d, %d}\n",216atd_t->ofdm_t_cnt, atd_t->ofdm_r_cnt,217atd_t->ofdm_crc_error_cnt);218pr_debug("OFDM[t=1~2] {TX, RX, CRC_error} = {%d, %d, %d}\n",219curr_ofdm_t_cnt, curr_ofdm_r_cnt,220curr_ofdm_crc_error_cnt);221pr_debug("OFDM_diff {TX, RX, CRC_error} = {%d, %d, %d}\n",222diff_ofdm_t_cnt, diff_ofdm_r_cnt,223diff_ofdm_crc_error_cnt);224225pr_debug("CCK[t=0~1] {TX, RX, CRC_error} = {%d, %d, %d}\n",226atd_t->cck_t_cnt, atd_t->cck_r_cnt,227atd_t->cck_crc_error_cnt);228pr_debug("CCK[t=1~2] {TX, RX, CRC_error} = {%d, %d, %d}\n",229curr_cck_t_cnt, curr_cck_r_cnt,230curr_cck_crc_error_cnt);231pr_debug("CCK_diff {TX, RX, CRC_error} = {%d, %d, %d}\n",232diff_cck_t_cnt, diff_cck_r_cnt,233diff_cck_crc_error_cnt);234235/* ----- Check Dbg Port --------------------------------*/236237for (i = 0; i < DBGPORT_CHK_NUM; i++) {238pr_debug("Dbg_port=((0x%x))\n",239atd_t->dbg_port_table[i]);240pr_debug("Val{pre, curr}={0x%x, 0x%x}\n",241atd_t->dbg_port_val[i], curr_dbg_port_val[i]);242243if (atd_t->dbg_port_table[i] == 0) {244if (atd_t->dbg_port_val[i] ==245curr_dbg_port_val[i]) {246pr_debug("BB state hang\n");247pr_debug("ReasonCode:\n");248}249250} else if (atd_t->dbg_port_table[i] == 0x803) {251if (atd_t->dbg_port_val[i] ==252curr_dbg_port_val[i]) {253/* dbgport_803 = */254/* (struct n_dbgport_803 ) */255/* (atd_t->dbg_port_val[i]); */256odm_move_memory(dm, &dbgport_803,257&atd_t->dbg_port_val[i],258sizeof(struct n_dbgport_803));259pr_debug("RSTB{BB, GLB, OFDM}={%d, %d,%d}\n",260dbgport_803.bb_rst_b,261dbgport_803.glb_rst_b,262dbgport_803.ofdm_rst_b);263pr_debug("{ofdm_tx_en, cck_tx_en, phy_tx_on}={%d, %d, %d}\n",264dbgport_803.ofdm_tx_en,265dbgport_803.cck_tx_en,266dbgport_803.phy_tx_on);267pr_debug("CCA_PP{OFDM, CCK}={%d, %d}\n",268dbgport_803.ofdm_cca_pp,269dbgport_803.cck_cca_pp);270271if (dbgport_803.phy_tx_on)272pr_debug("Maybe TX Hang\n");273else if (dbgport_803.ofdm_cca_pp ||274dbgport_803.cck_cca_pp)275pr_debug("Maybe RX Hang\n");276}277278} else if (atd_t->dbg_port_table[i] == 0x208) {279if ((atd_t->dbg_port_val[i] & BIT(30)) &&280(curr_dbg_port_val[i] & BIT(30))) {281pr_debug("EDCCA Pause TX\n");282pr_debug("ReasonCode: THN-2\n");283}284285} else if (atd_t->dbg_port_table[i] == 0xab0) {286/* atd_t->dbg_port_val[i] & 0xffffff == 0 */287/* curr_dbg_port_val[i] & 0xffffff == 0 */288if (((atd_t->dbg_port_val[i] &289MASK24BITS) == 0) ||290((curr_dbg_port_val[i] &291MASK24BITS) == 0)) {292pr_debug("Wrong L-SIG formate\n");293pr_debug("ReasonCode: THN-1\n");294}295}296}297298phydm_check_hang_reset(dm);299}300301atd_t->dbg_step++;302}303304void phydm_bb_auto_check_hang_start_n(305void *dm_void,306u32 *_used,307char *output,308u32 *_out_len)309{310u32 value32 = 0;311struct dm_struct *dm = (struct dm_struct *)dm_void;312struct phydm_auto_dbg_struct *atd_t = &dm->auto_dbg_table;313u32 used = *_used;314u32 out_len = *_out_len;315316if (dm->support_ic_type & ODM_IC_11AC_SERIES)317return;318319PDM_SNPF(out_len, used, output + used, out_len - used,320"PHYDM auto check hang (N-series) is started, Please check the system log\n");321322dm->debug_components |= ODM_COMP_API;323atd_t->auto_dbg_type = AUTO_DBG_CHECK_HANG;324atd_t->dbg_step = 0;325326phydm_pause_dm_watchdog(dm, PHYDM_PAUSE);327328*_used = used;329*_out_len = out_len;330}331332void phydm_dbg_port_dump_n(void *dm_void, u32 *_used, char *output,333u32 *_out_len)334{335u32 value32 = 0;336struct dm_struct *dm = (struct dm_struct *)dm_void;337u32 used = *_used;338u32 out_len = *_out_len;339340if (dm->support_ic_type & ODM_IC_11AC_SERIES)341return;342343PDM_SNPF(out_len, used, output + used, out_len - used,344"not support now\n");345346*_used = used;347*_out_len = out_len;348}349350#endif351352#if (ODM_IC_11AC_SERIES_SUPPORT == 1)353void phydm_dbg_port_dump_ac(void *dm_void, u32 *_used, char *output,354u32 *_out_len)355{356u32 value32 = 0;357struct dm_struct *dm = (struct dm_struct *)dm_void;358u32 used = *_used;359u32 out_len = *_out_len;360361if (dm->support_ic_type & ODM_IC_11N_SERIES)362return;363364value32 = odm_get_bb_reg(dm, R_0xf80, MASKDWORD);365PDM_SNPF(out_len, used, output + used, out_len - used,366"\r\n %-35s = 0x%x", "rptreg of sc/bw/ht/...", value32);367368if (dm->support_ic_type & ODM_RTL8822B)369odm_set_bb_reg(dm, R_0x198c, BIT(2) | BIT(1) | BIT(0), 7);370371/* dbg_port = basic state machine */372{373odm_set_bb_reg(dm, ODM_REG_DBG_RPT_11AC, MASKDWORD, 0x000);374value32 = odm_get_bb_reg(dm, ODM_REG_DBG_RPT_11AC, MASKDWORD);375PDM_SNPF(out_len, used, output + used, out_len - used,376"\r\n %-35s = 0x%x", "0x8fc", value32);377378value32 = odm_get_bb_reg(dm, ODM_REG_RPT_11AC, MASKDWORD);379PDM_SNPF(out_len, used, output + used, out_len - used,380"\r\n %-35s = 0x%x", "basic state machine", value32);381}382383/* dbg_port = state machine */384{385odm_set_bb_reg(dm, ODM_REG_DBG_RPT_11AC, MASKDWORD, 0x007);386value32 = odm_get_bb_reg(dm, ODM_REG_DBG_RPT_11AC, MASKDWORD);387PDM_SNPF(out_len, used, output + used, out_len - used,388"\r\n %-35s = 0x%x", "0x8fc", value32);389390value32 = odm_get_bb_reg(dm, ODM_REG_RPT_11AC, MASKDWORD);391PDM_SNPF(out_len, used, output + used, out_len - used,392"\r\n %-35s = 0x%x", "state machine", value32);393}394395/* dbg_port = CCA-related*/396{397odm_set_bb_reg(dm, ODM_REG_DBG_RPT_11AC, MASKDWORD, 0x204);398value32 = odm_get_bb_reg(dm, ODM_REG_DBG_RPT_11AC, MASKDWORD);399PDM_SNPF(out_len, used, output + used, out_len - used,400"\r\n %-35s = 0x%x", "0x8fc", value32);401402value32 = odm_get_bb_reg(dm, ODM_REG_RPT_11AC, MASKDWORD);403PDM_SNPF(out_len, used, output + used, out_len - used,404"\r\n %-35s = 0x%x", "CCA-related", value32);405}406407/* dbg_port = edcca/rxd*/408{409odm_set_bb_reg(dm, ODM_REG_DBG_RPT_11AC, MASKDWORD, 0x278);410value32 = odm_get_bb_reg(dm, ODM_REG_DBG_RPT_11AC, MASKDWORD);411PDM_SNPF(out_len, used, output + used, out_len - used,412"\r\n %-35s = 0x%x", "0x8fc", value32);413414value32 = odm_get_bb_reg(dm, ODM_REG_RPT_11AC, MASKDWORD);415PDM_SNPF(out_len, used, output + used, out_len - used,416"\r\n %-35s = 0x%x", "edcca/rxd", value32);417}418419/* dbg_port = rx_state/mux_state/ADC_MASK_OFDM*/420{421odm_set_bb_reg(dm, ODM_REG_DBG_RPT_11AC, MASKDWORD, 0x290);422value32 = odm_get_bb_reg(dm, ODM_REG_DBG_RPT_11AC, MASKDWORD);423PDM_SNPF(out_len, used, output + used, out_len - used,424"\r\n %-35s = 0x%x", "0x8fc", value32);425426value32 = odm_get_bb_reg(dm, ODM_REG_RPT_11AC, MASKDWORD);427PDM_SNPF(out_len, used, output + used, out_len - used,428"\r\n %-35s = 0x%x",429"rx_state/mux_state/ADC_MASK_OFDM", value32);430}431432/* dbg_port = bf-related*/433{434odm_set_bb_reg(dm, ODM_REG_DBG_RPT_11AC, MASKDWORD, 0x2B2);435value32 = odm_get_bb_reg(dm, ODM_REG_DBG_RPT_11AC, MASKDWORD);436PDM_SNPF(out_len, used, output + used, out_len - used,437"\r\n %-35s = 0x%x", "0x8fc", value32);438439value32 = odm_get_bb_reg(dm, ODM_REG_RPT_11AC, MASKDWORD);440PDM_SNPF(out_len, used, output + used, out_len - used,441"\r\n %-35s = 0x%x", "bf-related", value32);442}443444/* dbg_port = bf-related*/445{446odm_set_bb_reg(dm, ODM_REG_DBG_RPT_11AC, MASKDWORD, 0x2B8);447value32 = odm_get_bb_reg(dm, ODM_REG_DBG_RPT_11AC, MASKDWORD);448PDM_SNPF(out_len, used, output + used, out_len - used,449"\r\n %-35s = 0x%x", "0x8fc", value32);450451value32 = odm_get_bb_reg(dm, ODM_REG_RPT_11AC, MASKDWORD);452PDM_SNPF(out_len, used, output + used, out_len - used,453"\r\n %-35s = 0x%x", "bf-related", value32);454}455456/* dbg_port = txon/rxd*/457{458odm_set_bb_reg(dm, ODM_REG_DBG_RPT_11AC, MASKDWORD, 0xA03);459value32 = odm_get_bb_reg(dm, ODM_REG_DBG_RPT_11AC, MASKDWORD);460PDM_SNPF(out_len, used, output + used, out_len - used,461"\r\n %-35s = 0x%x", "0x8fc", value32);462463value32 = odm_get_bb_reg(dm, ODM_REG_RPT_11AC, MASKDWORD);464PDM_SNPF(out_len, used, output + used, out_len - used,465"\r\n %-35s = 0x%x", "txon/rxd", value32);466}467468/* dbg_port = l_rate/l_length*/469{470odm_set_bb_reg(dm, ODM_REG_DBG_RPT_11AC, MASKDWORD, 0xA0B);471value32 = odm_get_bb_reg(dm, ODM_REG_DBG_RPT_11AC, MASKDWORD);472PDM_SNPF(out_len, used, output + used, out_len - used,473"\r\n %-35s = 0x%x", "0x8fc", value32);474475value32 = odm_get_bb_reg(dm, ODM_REG_RPT_11AC, MASKDWORD);476PDM_SNPF(out_len, used, output + used, out_len - used,477"\r\n %-35s = 0x%x", "l_rate/l_length", value32);478}479480/* dbg_port = rxd/rxd_hit*/481{482odm_set_bb_reg(dm, ODM_REG_DBG_RPT_11AC, MASKDWORD, 0xA0D);483value32 = odm_get_bb_reg(dm, ODM_REG_DBG_RPT_11AC, MASKDWORD);484PDM_SNPF(out_len, used, output + used, out_len - used,485"\r\n %-35s = 0x%x", "0x8fc", value32);486487value32 = odm_get_bb_reg(dm, ODM_REG_RPT_11AC, MASKDWORD);488PDM_SNPF(out_len, used, output + used, out_len - used,489"\r\n %-35s = 0x%x", "rxd/rxd_hit", value32);490}491492/* dbg_port = dis_cca*/493{494odm_set_bb_reg(dm, ODM_REG_DBG_RPT_11AC, MASKDWORD, 0xAA0);495value32 = odm_get_bb_reg(dm, ODM_REG_DBG_RPT_11AC, MASKDWORD);496PDM_SNPF(out_len, used, output + used, out_len - used,497"\r\n %-35s = 0x%x", "0x8fc", value32);498499value32 = odm_get_bb_reg(dm, ODM_REG_RPT_11AC, MASKDWORD);500PDM_SNPF(out_len, used, output + used, out_len - used,501"\r\n %-35s = 0x%x", "dis_cca", value32);502}503504/* dbg_port = tx*/505{506odm_set_bb_reg(dm, ODM_REG_DBG_RPT_11AC, MASKDWORD, 0xAB0);507value32 = odm_get_bb_reg(dm, ODM_REG_DBG_RPT_11AC, MASKDWORD);508PDM_SNPF(out_len, used, output + used, out_len - used,509"\r\n %-35s = 0x%x", "0x8fc", value32);510511value32 = odm_get_bb_reg(dm, ODM_REG_RPT_11AC, MASKDWORD);512PDM_SNPF(out_len, used, output + used, out_len - used,513"\r\n %-35s = 0x%x", "tx", value32);514}515516/* dbg_port = rx plcp*/517{518odm_set_bb_reg(dm, ODM_REG_DBG_RPT_11AC, MASKDWORD, 0xAD0);519value32 = odm_get_bb_reg(dm, ODM_REG_DBG_RPT_11AC, MASKDWORD);520PDM_SNPF(out_len, used, output + used, out_len - used,521"\r\n %-35s = 0x%x", "0x8fc", value32);522523value32 = odm_get_bb_reg(dm, ODM_REG_RPT_11AC, MASKDWORD);524PDM_SNPF(out_len, used, output + used, out_len - used,525"\r\n %-35s = 0x%x", "rx plcp", value32);526527odm_set_bb_reg(dm, ODM_REG_DBG_RPT_11AC, MASKDWORD, 0xAD1);528value32 = odm_get_bb_reg(dm, ODM_REG_DBG_RPT_11AC, MASKDWORD);529PDM_SNPF(out_len, used, output + used, out_len - used,530"\r\n %-35s = 0x%x", "0x8fc", value32);531532value32 = odm_get_bb_reg(dm, ODM_REG_RPT_11AC, MASKDWORD);533PDM_SNPF(out_len, used, output + used, out_len - used,534"\r\n %-35s = 0x%x", "rx plcp", value32);535536odm_set_bb_reg(dm, ODM_REG_DBG_RPT_11AC, MASKDWORD, 0xAD2);537value32 = odm_get_bb_reg(dm, ODM_REG_DBG_RPT_11AC, MASKDWORD);538PDM_SNPF(out_len, used, output + used, out_len - used,539"\r\n %-35s = 0x%x", "0x8fc", value32);540541value32 = odm_get_bb_reg(dm, ODM_REG_RPT_11AC, MASKDWORD);542PDM_SNPF(out_len, used, output + used, out_len - used,543"\r\n %-35s = 0x%x", "rx plcp", value32);544545odm_set_bb_reg(dm, ODM_REG_DBG_RPT_11AC, MASKDWORD, 0xAD3);546value32 = odm_get_bb_reg(dm, ODM_REG_DBG_RPT_11AC, MASKDWORD);547PDM_SNPF(out_len, used, output + used, out_len - used,548"\r\n %-35s = 0x%x", "0x8fc", value32);549550value32 = odm_get_bb_reg(dm, ODM_REG_RPT_11AC, MASKDWORD);551PDM_SNPF(out_len, used, output + used, out_len - used,552"\r\n %-35s = 0x%x", "rx plcp", value32);553}554*_used = used;555*_out_len = out_len;556}557#endif558559#ifdef PHYDM_IC_JGR3_SERIES_SUPPORT560void phydm_dbg_port_dump_jgr3(void *dm_void, u32 *_used, char *output,561u32 *_out_len)562{563struct dm_struct *dm = (struct dm_struct *)dm_void;564u32 used = *_used;565u32 out_len = *_out_len;566/*u32 dbg_port_idx_all[3] = {0x000, 0x001, 0x002};*/567u32 val = 0;568u32 dbg_port_idx = 0;569u32 i = 0;570571if (!(dm->support_ic_type & ODM_IC_JGR3_SERIES))572return;573574PDM_VAST_SNPF(out_len, used, output + used, out_len - used,575"%-17s = %s\n", "DbgPort index", "Value");576577#if 0578/*0x000/0x001/0x002*/579for (i = 0; i < 3; i++) {580dbg_port_idx = dbg_port_idx_all[i];581if (phydm_set_bb_dbg_port(dm, DBGPORT_PRI_3, dbg_port_idx)) {582val = phydm_get_bb_dbg_port_val(dm);583PDM_SNPF(out_len, used, output + used, out_len - used,584"0x%-15x = 0x%x\n", dbg_port_idx, val);585phydm_release_bb_dbg_port(dm);586}587}588#endif589for (dbg_port_idx = 0x0; dbg_port_idx <= 0xfff; dbg_port_idx++) {590if (phydm_set_bb_dbg_port(dm, DBGPORT_PRI_3, dbg_port_idx)) {591val = phydm_get_bb_dbg_port_val(dm);592PDM_VAST_SNPF(out_len, used, output + used,593out_len - used,594"0x%-15x = 0x%x\n", dbg_port_idx, val);595phydm_release_bb_dbg_port(dm);596}597}598*_used = used;599*_out_len = out_len;600}601#endif602603void phydm_dbg_port_dump(void *dm_void, u32 *_used, char *output, u32 *_out_len)604{605struct dm_struct *dm = (struct dm_struct *)dm_void;606u32 used = *_used;607u32 out_len = *_out_len;608609PDM_VAST_SNPF(out_len, used, output + used, out_len - used,610"------ BB debug port start ------\n");611612switch (dm->ic_ip_series) {613#ifdef PHYDM_IC_JGR3_SERIES_SUPPORT614case PHYDM_IC_JGR3:615phydm_dbg_port_dump_jgr3(dm, &used, output, &out_len);616break;617#endif618619#if (ODM_IC_11AC_SERIES_SUPPORT == 1)620case PHYDM_IC_AC:621phydm_dbg_port_dump_ac(dm, &used, output, &out_len);622break;623#endif624625#if (ODM_IC_11N_SERIES_SUPPORT == 1)626case PHYDM_IC_N:627phydm_dbg_port_dump_n(dm, &used, output, &out_len);628break;629#endif630631default:632break;633}634*_used = used;635*_out_len = out_len;636}637638void phydm_auto_dbg_console(639void *dm_void,640char input[][16],641u32 *_used,642char *output,643u32 *_out_len)644{645struct dm_struct *dm = (struct dm_struct *)dm_void;646char help[] = "-h";647u32 var1[10] = {0};648u32 used = *_used;649u32 out_len = *_out_len;650651PHYDM_SSCANF(input[1], DCMD_DECIMAL, &var1[0]);652653if ((strcmp(input[1], help) == 0)) {654PDM_SNPF(out_len, used, output + used, out_len - used,655"hang: {1} {1:Show DbgPort, 2:Auto check hang}\n");656return;657} else if (var1[0] == 1) {658PHYDM_SSCANF(input[2], DCMD_DECIMAL, &var1[1]);659if (var1[1] == 1) {660phydm_dbg_port_dump(dm, &used, output, &out_len);661} else if (var1[1] == 2) {662if (dm->support_ic_type & ODM_IC_11AC_SERIES) {663PDM_SNPF(out_len, used, output + used,664out_len - used, "Not support\n");665} else {666#if (ODM_IC_11N_SERIES_SUPPORT == 1)667phydm_bb_auto_check_hang_start_n(dm, &used,668output,669&out_len);670#else671PDM_SNPF(out_len, used, output + used,672out_len - used, "Not support\n");673#endif674}675}676}677678*_used = used;679*_out_len = out_len;680}681682void phydm_auto_dbg_engine(void *dm_void)683{684u32 value32 = 0;685686struct dm_struct *dm = (struct dm_struct *)dm_void;687struct phydm_auto_dbg_struct *atd_t = &dm->auto_dbg_table;688689if (atd_t->auto_dbg_type == AUTO_DBG_STOP)690return;691692pr_debug("%s ======>\n", __func__);693694if (atd_t->auto_dbg_type == AUTO_DBG_CHECK_HANG) {695if (dm->support_ic_type & ODM_IC_11AC_SERIES) {696pr_debug("Not Support\n");697} else {698#if (ODM_IC_11N_SERIES_SUPPORT == 1)699phydm_auto_check_hang_engine_n(dm);700#else701pr_debug("Not Support\n");702#endif703}704705} else if (atd_t->auto_dbg_type == AUTO_DBG_CHECK_RA) {706pr_debug("Not Support\n");707}708}709710void phydm_auto_dbg_engine_init(void *dm_void)711{712struct dm_struct *dm = (struct dm_struct *)dm_void;713struct phydm_auto_dbg_struct *atd_t = &dm->auto_dbg_table;714u16 dbg_port_table[DBGPORT_CHK_NUM] = {0x0, 0x803, 0x208, 0xab0,7150xab1, 0xab2};716717PHYDM_DBG(dm, ODM_COMP_API, "%s ======>\n", __func__);718719odm_move_memory(dm, &atd_t->dbg_port_table[0],720&dbg_port_table[0], (DBGPORT_CHK_NUM * 2));721722phydm_check_hang_init(dm);723}724#endif725726727