Path: blob/master/ALFA-W1F1/RTL8814AU/hal/phydm/phydm_debug.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"3132void phydm_init_debug_setting(struct dm_struct *dm)33{34dm->fw_debug_components = 0;35dm->debug_components =3637#if DBG38/*@BB Functions*/39/*@DBG_DIG |*/40/*@DBG_RA_MASK |*/41/*@DBG_DYN_TXPWR |*/42/*@DBG_FA_CNT |*/43/*@DBG_RSSI_MNTR |*/44/*@DBG_CCKPD |*/45/*@DBG_ANT_DIV |*/46/*@DBG_SMT_ANT |*/47/*@DBG_PWR_TRAIN |*/48/*@DBG_RA |*/49/*@DBG_PATH_DIV |*/50/*@DBG_DFS |*/51/*@DBG_DYN_ARFR |*/52/*@DBG_ADPTVTY |*/53/*@DBG_CFO_TRK |*/54/*@DBG_ENV_MNTR |*/55/*@DBG_PRI_CCA |*/56/*@DBG_ADPTV_SOML |*/57/*@DBG_LNA_SAT_CHK |*/58/*@DBG_PHY_STATUS |*/59/*@DBG_TMP |*/60/*@DBG_FW_TRACE |*/61/*@DBG_TXBF |*/62/*@DBG_COMMON_FLOW |*/63/*@ODM_PHY_CONFIG |*/64/*@ODM_COMP_INIT |*/65/*@DBG_CMN |*/66/*@ODM_COMP_API |*/67#endif680;6970dm->fw_buff_is_enpty = true;71dm->pre_c2h_seq = 0;72dm->c2h_cmd_start = 0;73dm->cmn_dbg_msg_cnt = PHYDM_WATCH_DOG_PERIOD;74dm->cmn_dbg_msg_period = PHYDM_WATCH_DOG_PERIOD;75phydm_reset_rx_rate_distribution(dm);76}7778void phydm_bb_dbg_port_header_sel(void *dm_void, u32 header_idx)79{80struct dm_struct *dm = (struct dm_struct *)dm_void;8182if (dm->support_ic_type & ODM_IC_11AC_SERIES) {83odm_set_bb_reg(dm, R_0x8f8, 0x3c00000, header_idx);8485/*@86* header_idx:87* (0:) '{ofdm_dbg[31:0]}'88* (1:) '{cca,crc32_fail,dbg_ofdm[29:0]}'89* (2:) '{vbon,crc32_fail,dbg_ofdm[29:0]}'90* (3:) '{cca,crc32_ok,dbg_ofdm[29:0]}'91* (4:) '{vbon,crc32_ok,dbg_ofdm[29:0]}'92* (5:) '{dbg_iqk_anta}'93* (6:) '{cca,ofdm_crc_ok,dbg_dp_anta[29:0]}'94* (7:) '{dbg_iqk_antb}'95* (8:) '{DBGOUT_RFC_b[31:0]}'96* (9:) '{DBGOUT_RFC_a[31:0]}'97* (a:) '{dbg_ofdm}'98* (b:) '{dbg_cck}'99*/100}101}102103void phydm_bb_dbg_port_clock_en(void *dm_void, u8 enable)104{105struct dm_struct *dm = (struct dm_struct *)dm_void;106u32 reg_value = 0;107108if (dm->support_ic_type & ODM_IC_11AC_2_SERIES) {109/*@enable/disable debug port clock, for power saving*/110reg_value = enable ? 0x7 : 0;111odm_set_bb_reg(dm, R_0x198c, 0x7, reg_value);112}113}114115u32 phydm_get_bb_dbg_port_idx(void *dm_void)116{117struct dm_struct *dm = (struct dm_struct *)dm_void;118u32 val = 0;119120if (dm->support_ic_type & ODM_IC_11AC_SERIES) {121phydm_bb_dbg_port_clock_en(dm, true);122val = odm_get_bb_reg(dm, R_0x8fc, MASKDWORD);123} else if (dm->support_ic_type & ODM_IC_JGR3_SERIES) {124val = odm_get_bb_reg(dm, R_0x1c3c, 0xfff00);125} else { /*@if (dm->support_ic_type & ODM_IC_11N_SERIES)*/126val = odm_get_bb_reg(dm, R_0x908, MASKDWORD);127}128return val;129}130131u8 phydm_set_bb_dbg_port(void *dm_void, u8 curr_dbg_priority, u32 debug_port)132{133struct dm_struct *dm = (struct dm_struct *)dm_void;134u8 dbg_port_result = false;135136if (curr_dbg_priority > dm->pre_dbg_priority) {137if (dm->support_ic_type & ODM_IC_11AC_SERIES) {138phydm_bb_dbg_port_clock_en(dm, true);139140odm_set_bb_reg(dm, R_0x8fc, MASKDWORD, debug_port);141} else if (dm->support_ic_type & ODM_IC_JGR3_SERIES) {142odm_set_bb_reg(dm, R_0x1c3c, 0xfff00, debug_port);143144} else { /*@if (dm->support_ic_type & ODM_IC_11N_SERIES)*/145odm_set_bb_reg(dm, R_0x908, MASKDWORD, debug_port);146}147PHYDM_DBG(dm, ODM_COMP_API,148"DbgPort ((0x%x)) set success, Cur_priority=((%d)), Pre_priority=((%d))\n",149debug_port, curr_dbg_priority, dm->pre_dbg_priority);150dm->pre_dbg_priority = curr_dbg_priority;151dbg_port_result = true;152}153154return dbg_port_result;155}156157void phydm_release_bb_dbg_port(void *dm_void)158{159struct dm_struct *dm = (struct dm_struct *)dm_void;160161phydm_bb_dbg_port_clock_en(dm, false);162phydm_bb_dbg_port_header_sel(dm, 0);163164dm->pre_dbg_priority = DBGPORT_RELEASE;165PHYDM_DBG(dm, ODM_COMP_API, "Release BB dbg_port\n");166}167168u32 phydm_get_bb_dbg_port_val(void *dm_void)169{170struct dm_struct *dm = (struct dm_struct *)dm_void;171u32 dbg_port_value = 0;172173if (dm->support_ic_type & ODM_IC_11AC_SERIES)174dbg_port_value = odm_get_bb_reg(dm, R_0xfa0, MASKDWORD);175else if (dm->support_ic_type & ODM_IC_JGR3_SERIES)176dbg_port_value = odm_get_bb_reg(dm, R_0x2dbc, MASKDWORD);177else /*@if (dm->support_ic_type & ODM_IC_11N_SERIES)*/178dbg_port_value = odm_get_bb_reg(dm, R_0xdf4, MASKDWORD);179180PHYDM_DBG(dm, ODM_COMP_API, "dbg_port_value = 0x%x\n", dbg_port_value);181return dbg_port_value;182}183184#ifdef CONFIG_PHYDM_DEBUG_FUNCTION185#if (ODM_IC_11N_SERIES_SUPPORT)186void phydm_bb_hw_dbg_info_n(void *dm_void, u32 *_used, char *output,187u32 *_out_len)188{189struct dm_struct *dm = (struct dm_struct *)dm_void;190u32 used = *_used;191u32 out_len = *_out_len;192u32 value32 = 0, value32_1 = 0;193u8 rf_gain_a = 0, rf_gain_b = 0, rf_gain_c = 0, rf_gain_d = 0;194u8 rx_snr_a = 0, rx_snr_b = 0, rx_snr_c = 0, rx_snr_d = 0;195s8 rxevm_0 = 0, rxevm_1 = 0;196#if 1197struct phydm_cfo_rpt cfo;198u8 i = 0;199#else200s32 short_cfo_a = 0, short_cfo_b = 0, long_cfo_a = 0, long_cfo_b = 0;201s32 scfo_a = 0, scfo_b = 0, avg_cfo_a = 0, avg_cfo_b = 0;202s32 cfo_end_a = 0, cfo_end_b = 0, acq_cfo_a = 0, acq_cfo_b = 0;203#endif204205PDM_SNPF(out_len, used, output + used, out_len - used, "\r\n %-35s\n",206"BB Report Info");207208/*@AGC result*/209value32 = odm_get_bb_reg(dm, R_0xdd0, MASKDWORD);210rf_gain_a = (u8)(value32 & 0x3f);211rf_gain_a = rf_gain_a << 1;212213rf_gain_b = (u8)((value32 >> 8) & 0x3f);214rf_gain_b = rf_gain_b << 1;215216rf_gain_c = (u8)((value32 >> 16) & 0x3f);217rf_gain_c = rf_gain_c << 1;218219rf_gain_d = (u8)((value32 >> 24) & 0x3f);220rf_gain_d = rf_gain_d << 1;221222PDM_SNPF(out_len, used, output + used, out_len - used,223"\r\n %-35s = %d / %d / %d / %d", "OFDM RX RF Gain(A/B/C/D)",224rf_gain_a, rf_gain_b, rf_gain_c, rf_gain_d);225226/*SNR report*/227value32 = odm_get_bb_reg(dm, R_0xdd4, MASKDWORD);228rx_snr_a = (u8)(value32 & 0xff);229rx_snr_a = rx_snr_a >> 1;230231rx_snr_b = (u8)((value32 >> 8) & 0xff);232rx_snr_b = rx_snr_b >> 1;233234rx_snr_c = (u8)((value32 >> 16) & 0xff);235rx_snr_c = rx_snr_c >> 1;236237rx_snr_d = (u8)((value32 >> 24) & 0xff);238rx_snr_d = rx_snr_d >> 1;239240PDM_SNPF(out_len, used, output + used, out_len - used,241"\r\n %-35s = %d / %d / %d / %d", "RXSNR(A/B/C/D, dB)",242rx_snr_a, rx_snr_b, rx_snr_c, rx_snr_d);243244/* PostFFT related info*/245value32 = odm_get_bb_reg(dm, R_0xdd8, MASKDWORD);246247rxevm_0 = (s8)((value32 & MASKBYTE2) >> 16);248rxevm_0 /= 2;249if (rxevm_0 < -63)250rxevm_0 = 0;251252rxevm_1 = (s8)((value32 & MASKBYTE3) >> 24);253rxevm_1 /= 2;254if (rxevm_1 < -63)255rxevm_1 = 0;256257PDM_SNPF(out_len, used, output + used, out_len - used,258"\r\n %-35s = %d / %d", "RXEVM (1ss/2ss)", rxevm_0, rxevm_1);259260#if 1261phydm_get_cfo_info(dm, &cfo);262for (i = 0; i < dm->num_rf_path; i++) {263PDM_SNPF(out_len, used, output + used, out_len - used,264"\r\n %s[%d] %-28s = {%d, %d, %d, %d, %d}",265"CFO", i, "{S, L, Sec, Acq, End}",266cfo.cfo_rpt_s[i], cfo.cfo_rpt_l[i], cfo.cfo_rpt_sec[i],267cfo.cfo_rpt_acq[i], cfo.cfo_rpt_end[i]);268}269#else270/*@CFO Report Info*/271odm_set_bb_reg(dm, R_0xd00, BIT(26), 1);272273/*Short CFO*/274value32 = odm_get_bb_reg(dm, R_0xdac, MASKDWORD);275value32_1 = odm_get_bb_reg(dm, R_0xdb0, MASKDWORD);276277short_cfo_b = (s32)(value32 & 0xfff); /*S(12,11)*/278short_cfo_a = (s32)((value32 & 0x0fff0000) >> 16);279280long_cfo_b = (s32)(value32_1 & 0x1fff); /*S(13,12)*/281long_cfo_a = (s32)((value32_1 & 0x1fff0000) >> 16);282283/*SFO 2's to dec*/284if (short_cfo_a > 2047)285short_cfo_a = short_cfo_a - 4096;286if (short_cfo_b > 2047)287short_cfo_b = short_cfo_b - 4096;288289short_cfo_a = (short_cfo_a * 312500) / 2048;290short_cfo_b = (short_cfo_b * 312500) / 2048;291292/*@LFO 2's to dec*/293294if (long_cfo_a > 4095)295long_cfo_a = long_cfo_a - 8192;296297if (long_cfo_b > 4095)298long_cfo_b = long_cfo_b - 8192;299300long_cfo_a = long_cfo_a * 312500 / 4096;301long_cfo_b = long_cfo_b * 312500 / 4096;302303PDM_SNPF(out_len, used, output + used, out_len - used, "\r\n %-35s",304"CFO Report Info");305PDM_SNPF(out_len, used, output + used, out_len - used,306"\r\n %-35s = %d / %d", "Short CFO(Hz) <A/B>", short_cfo_a,307short_cfo_b);308PDM_SNPF(out_len, used, output + used, out_len - used,309"\r\n %-35s = %d / %d", "Long CFO(Hz) <A/B>", long_cfo_a,310long_cfo_b);311312/*SCFO*/313value32 = odm_get_bb_reg(dm, R_0xdb8, MASKDWORD);314value32_1 = odm_get_bb_reg(dm, R_0xdb4, MASKDWORD);315316scfo_b = (s32)(value32 & 0x7ff); /*S(11,10)*/317scfo_a = (s32)((value32 & 0x07ff0000) >> 16);318319if (scfo_a > 1023)320scfo_a = scfo_a - 2048;321322if (scfo_b > 1023)323scfo_b = scfo_b - 2048;324325scfo_a = scfo_a * 312500 / 1024;326scfo_b = scfo_b * 312500 / 1024;327328avg_cfo_b = (s32)(value32_1 & 0x1fff); /*S(13,12)*/329avg_cfo_a = (s32)((value32_1 & 0x1fff0000) >> 16);330331if (avg_cfo_a > 4095)332avg_cfo_a = avg_cfo_a - 8192;333334if (avg_cfo_b > 4095)335avg_cfo_b = avg_cfo_b - 8192;336337avg_cfo_a = avg_cfo_a * 312500 / 4096;338avg_cfo_b = avg_cfo_b * 312500 / 4096;339340PDM_SNPF(out_len, used, output + used, out_len - used,341"\r\n %-35s = %d / %d", "value SCFO(Hz) <A/B>", scfo_a,342scfo_b);343PDM_SNPF(out_len, used, output + used, out_len - used,344"\r\n %-35s = %d / %d", "Avg CFO(Hz) <A/B>", avg_cfo_a,345avg_cfo_b);346347value32 = odm_get_bb_reg(dm, R_0xdbc, MASKDWORD);348value32_1 = odm_get_bb_reg(dm, R_0xde0, MASKDWORD);349350cfo_end_b = (s32)(value32 & 0x1fff); /*S(13,12)*/351cfo_end_a = (s32)((value32 & 0x1fff0000) >> 16);352353if (cfo_end_a > 4095)354cfo_end_a = cfo_end_a - 8192;355356if (cfo_end_b > 4095)357cfo_end_b = cfo_end_b - 8192;358359cfo_end_a = cfo_end_a * 312500 / 4096;360cfo_end_b = cfo_end_b * 312500 / 4096;361362acq_cfo_b = (s32)(value32_1 & 0x1fff); /*S(13,12)*/363acq_cfo_a = (s32)((value32_1 & 0x1fff0000) >> 16);364365if (acq_cfo_a > 4095)366acq_cfo_a = acq_cfo_a - 8192;367368if (acq_cfo_b > 4095)369acq_cfo_b = acq_cfo_b - 8192;370371acq_cfo_a = acq_cfo_a * 312500 / 4096;372acq_cfo_b = acq_cfo_b * 312500 / 4096;373374PDM_SNPF(out_len, used, output + used, out_len - used,375"\r\n %-35s = %d / %d", "End CFO(Hz) <A/B>", cfo_end_a,376cfo_end_b);377PDM_SNPF(out_len, used, output + used, out_len - used,378"\r\n %-35s = %d / %d", "ACQ CFO(Hz) <A/B>", acq_cfo_a,379acq_cfo_b);380#endif381}382#endif383384#if (ODM_IC_11AC_SERIES_SUPPORT)385#if (RTL8822B_SUPPORT)386void phydm_bb_hw_dbg_info_8822b(void *dm_void, u32 *_used, char *output,387u32 *_out_len)388{389struct dm_struct *dm = (struct dm_struct *)dm_void;390u32 used = *_used;391u32 out_len = *_out_len;392u32 condi_num = 0;393u8 i = 0;394395if (!(dm->support_ic_type == ODM_RTL8822B))396return;397398condi_num = phydm_get_condi_num_8822b(dm);399phydm_get_condi_num_acc_8822b(dm);400401PDM_SNPF(out_len, used, output + used, out_len - used,402"\r\n %-35s = %d.%.4d", "condi_num",403condi_num >> 4, phydm_show_fraction_num(condi_num & 0xf, 4));404405for (i = 0; i < CN_CNT_MAX; i++) {406PDM_SNPF(out_len, used, output + used, out_len - used,407"\r\n Tone_num[CN>%d]%-21s = %d",408i, " ", dm->phy_dbg_info.condi_num_cdf[i]);409}410411*_used = used;412*_out_len = out_len;413}414#endif415416void phydm_bb_hw_dbg_info_ac(void *dm_void, u32 *_used, char *output,417u32 *_out_len)418{419struct dm_struct *dm = (struct dm_struct *)dm_void;420u32 used = *_used;421u32 out_len = *_out_len;422char *tmp_string = NULL;423u8 rx_ht_bw, rx_vht_bw, rxsc, rx_ht, bw_idx = 0;424static u8 v_rx_bw;425u32 value32, value32_1, value32_2, value32_3;426struct phydm_cfo_rpt cfo;427u8 i = 0;428static u8 tail, parity, rsv, vrsv, smooth, htsound, agg;429static u8 stbc, vstbc, fec, fecext, sgi, sgiext, htltf, vgid, v_nsts;430static u8 vtxops, vrsv2, vbrsv, bf, vbcrc;431static u16 h_length, htcrc8, length;432static u16 vpaid;433static u16 v_length, vhtcrc8, v_mcss, v_tail, vb_tail;434static u8 hmcss, hrx_bw;435u8 pwdb;436s8 rxevm_0, rxevm_1, rxevm_2;437u8 rf_gain[4];438u8 rx_snr[4];439s32 sig_power;440441PDM_SNPF(out_len, used, output + used, out_len - used, "\r\n %-35s\n",442"BB Report Info");443444/*@ [BW & Mode] =====================================================*/445446value32 = odm_get_bb_reg(dm, R_0xf80, MASKDWORD);447rx_ht = (u8)((value32 & 0x180) >> 7);448449if (rx_ht == AD_VHT_MODE) {450tmp_string = "VHT";451bw_idx = (u8)((value32 >> 1) & 0x3);452} else if (rx_ht == AD_HT_MODE) {453tmp_string = "HT";454bw_idx = (u8)(value32 & 0x1);455} else {456tmp_string = "Legacy";457bw_idx = 0;458}459PDM_SNPF(out_len, used, output + used, out_len - used,460"\r\n %-35s %s %dM", "mode", tmp_string, (20 << bw_idx));461462if (rx_ht != AD_LEGACY_MODE) {463rxsc = (u8)(value32 & 0x78);464465if (rxsc == 0)466tmp_string = "duplicate/full bw";467else if (rxsc == 1)468tmp_string = "usc20-1";469else if (rxsc == 2)470tmp_string = "lsc20-1";471else if (rxsc == 3)472tmp_string = "usc20-2";473else if (rxsc == 4)474tmp_string = "lsc20-2";475else if (rxsc == 9)476tmp_string = "usc40";477else if (rxsc == 10)478tmp_string = "lsc40";479480PDM_SNPF(out_len, used, output + used, out_len - used,481" %-35s", tmp_string);482}483484/*@ [RX signal power and AGC related info] ==========================*/485486pwdb = (u8)odm_get_bb_reg(dm, R_0xf90, MASKBYTE1);487sig_power = -110 + (pwdb >> 1);488PDM_SNPF(out_len, used, output + used, out_len - used,489"\r\n %-35s = %d", "OFDM RX Signal Power(dB)", sig_power);490491value32 = odm_get_bb_reg(dm, R_0xd14, MASKDWORD);492rx_snr[RF_PATH_A] = (u8)(value32 & 0xFF) >> 1; /*@ S(8,1)*/493rf_gain[RF_PATH_A] = (s8)(((value32 & MASKBYTE1) >> 8) * 2);494495value32 = odm_get_bb_reg(dm, R_0xd54, MASKDWORD);496rx_snr[RF_PATH_B] = (u8)(value32 & 0xFF) >> 1; /*@ S(8,1)*/497rf_gain[RF_PATH_B] = (s8)(((value32 & MASKBYTE1) >> 8) * 2);498499value32 = odm_get_bb_reg(dm, R_0xd94, MASKDWORD);500rx_snr[RF_PATH_C] = (u8)(value32 & 0xFF) >> 1; /*@ S(8,1)*/501rf_gain[RF_PATH_C] = (s8)(((value32 & MASKBYTE1) >> 8) * 2);502503value32 = odm_get_bb_reg(dm, R_0xdd4, MASKDWORD);504rx_snr[RF_PATH_D] = (u8)(value32 & 0xFF) >> 1; /*@ S(8,1)*/505rf_gain[RF_PATH_D] = (s8)(((value32 & MASKBYTE1) >> 8) * 2);506507PDM_SNPF(out_len, used, output + used, out_len - used,508"\r\n %-35s = %d / %d / %d / %d", "OFDM RX RF Gain(A/B/C/D)",509rf_gain[RF_PATH_A], rf_gain[RF_PATH_B],510rf_gain[RF_PATH_C], rf_gain[RF_PATH_D]);511512/*@ [RX counter Info] ===============================================*/513514PDM_SNPF(out_len, used, output + used, out_len - used,515"\r\n %-35s = %d", "OFDM CCA cnt",516odm_get_bb_reg(dm, R_0xf08, 0xFFFF0000));517518PDM_SNPF(out_len, used, output + used, out_len - used,519"\r\n %-35s = %d", "OFDM SBD Fail cnt",520odm_get_bb_reg(dm, R_0xfd0, 0xFFFF));521522value32 = odm_get_bb_reg(dm, R_0xfc4, MASKDWORD);523PDM_SNPF(out_len, used, output + used, out_len - used,524"\r\n %-35s = %d / %d", "VHT SIGA/SIGB CRC8 Fail cnt",525value32 & 0xFFFF, ((value32 & 0xFFFF0000) >> 16));526527PDM_SNPF(out_len, used, output + used, out_len - used,528"\r\n %-35s = %d", "CCK CCA cnt",529odm_get_bb_reg(dm, R_0xfcc, 0xFFFF));530531value32 = odm_get_bb_reg(dm, R_0xfbc, MASKDWORD);532PDM_SNPF(out_len, used, output + used, out_len - used,533"\r\n %-35s = %d / %d",534"LSIG (parity Fail/rate Illegal) cnt", value32 & 0xFFFF,535((value32 & 0xFFFF0000) >> 16));536537PDM_SNPF(out_len, used, output + used, out_len - used,538"\r\n %-35s = %d / %d", "HT/VHT MCS NOT SUPPORT cnt",539odm_get_bb_reg(dm, R_0xfc0, (0xFFFF0000 >> 16)),540odm_get_bb_reg(dm, R_0xfc8, 0xFFFF));541542/*@ [PostFFT Info] =================================================*/543value32 = odm_get_bb_reg(dm, R_0xf8c, MASKDWORD);544rxevm_0 = (s8)((value32 & MASKBYTE2) >> 16);545rxevm_0 /= 2;546if (rxevm_0 < -63)547rxevm_0 = 0;548549rxevm_1 = (s8)((value32 & MASKBYTE3) >> 24);550rxevm_1 /= 2;551value32 = odm_get_bb_reg(dm, R_0xf88, MASKDWORD);552rxevm_2 = (s8)((value32 & MASKBYTE2) >> 16);553rxevm_2 /= 2;554555if (rxevm_1 < -63)556rxevm_1 = 0;557if (rxevm_2 < -63)558rxevm_2 = 0;559560PDM_SNPF(out_len, used, output + used, out_len - used,561"\r\n %-35s = %d / %d / %d", "RXEVM (1ss/2ss/3ss)", rxevm_0,562rxevm_1, rxevm_2);563PDM_SNPF(out_len, used, output + used, out_len - used,564"\r\n %-35s = %d / %d / %d / %d", "RXSNR(A/B/C/D dB)",565rx_snr[RF_PATH_A], rx_snr[RF_PATH_B],566rx_snr[RF_PATH_C], rx_snr[RF_PATH_D]);567568value32 = odm_get_bb_reg(dm, R_0xf8c, MASKDWORD);569PDM_SNPF(out_len, used, output + used, out_len - used,570"\r\n %-35s = %d / %d", "CSI_1st /CSI_2nd", value32 & 0xFFFF,571((value32 & 0xFFFF0000) >> 16));572573/*@ [CFO Report Info] ===============================================*/574phydm_get_cfo_info(dm, &cfo);575for (i = 0; i < dm->num_rf_path; i++) {576PDM_SNPF(out_len, used, output + used, out_len - used,577"\r\n %s[%d] %-28s = {%d, %d, %d, %d, %d}",578"CFO", i, "{S, L, Sec, Acq, End}",579cfo.cfo_rpt_s[i], cfo.cfo_rpt_l[i], cfo.cfo_rpt_sec[i],580cfo.cfo_rpt_acq[i], cfo.cfo_rpt_end[i]);581}582583/*@ [L-SIG Content] =================================================*/584value32 = odm_get_bb_reg(dm, R_0xf20, MASKDWORD);585586tail = (u8)((value32 & 0xfc0000) >> 18);/*@[23:18]*/587parity = (u8)((value32 & 0x20000) >> 17);/*@[17]*/588length = (u16)((value32 & 0x1ffe0) >> 5);/*@[16:5]*/589rsv = (u8)((value32 & 0x10) >> 4);/*@[4]*/590591PDM_SNPF(out_len, used, output + used, out_len - used, "\r\n %-35s",592"L-SIG");593PDM_SNPF(out_len, used, output + used, out_len - used,594"\r\n %-35s = %d M", "rate",595phydm_get_l_sig_rate(dm, (u8)(value32 & 0x0f)));596597PDM_SNPF(out_len, used, output + used, out_len - used,598"\r\n %-35s = %x / %d / %d", "Rsv/length/parity", rsv, length,599parity);600601if (rx_ht == AD_HT_MODE) {602/*@ [HT SIG 1] ======================================================*/603value32 = odm_get_bb_reg(dm, R_0xf2c, MASKDWORD);604605hmcss = (u8)(value32 & 0x7F);606hrx_bw = (u8)((value32 & 0x80) >> 7);607h_length = (u16)((value32 & 0x0fff00) >> 8);608609PDM_SNPF(out_len, used, output + used, out_len - used,610"\r\n %-35s", "HT-SIG1");611PDM_SNPF(out_len, used, output + used, out_len - used,612"\r\n %-35s = %d / %d / %d", "MCS/BW/length",613hmcss, hrx_bw, h_length);614/*@ [HT SIG 2] ======================================================*/615value32 = odm_get_bb_reg(dm, R_0xf30, MASKDWORD);616smooth = (u8)(value32 & 0x01);617htsound = (u8)((value32 & 0x02) >> 1);618rsv = (u8)((value32 & 0x04) >> 2);619agg = (u8)((value32 & 0x08) >> 3);620stbc = (u8)((value32 & 0x30) >> 4);621fec = (u8)((value32 & 0x40) >> 6);622sgi = (u8)((value32 & 0x80) >> 7);623htltf = (u8)((value32 & 0x300) >> 8);624htcrc8 = (u16)((value32 & 0x3fc00) >> 10);625tail = (u8)((value32 & 0xfc0000) >> 18);626627PDM_SNPF(out_len, used, output + used, out_len - used,628"\r\n %-35s",629"HT-SIG2");630PDM_SNPF(out_len, used, output + used, out_len - used,631"\r\n %-35s = %x / %x / %x / %x / %x / %x",632"Smooth/NoSound/Rsv/Aggregate/STBC/LDPC",633smooth, htsound, rsv, agg, stbc, fec);634PDM_SNPF(out_len, used, output + used, out_len - used,635"\r\n %-35s = %x / %x / %x / %x",636"SGI/E-HT-LTFs/CRC/tail",637sgi, htltf, htcrc8, tail);638} else if (rx_ht == AD_VHT_MODE) {639/*@ [VHT SIG A1] ====================================================*/640value32 = odm_get_bb_reg(dm, R_0xf2c, MASKDWORD);641642v_rx_bw = (u8)(value32 & 0x03);643vrsv = (u8)((value32 & 0x04) >> 2);644vstbc = (u8)((value32 & 0x08) >> 3);645vgid = (u8)((value32 & 0x3f0) >> 4);646v_nsts = (u8)(((value32 & 0x1c00) >> 10) + 1);647vpaid = (u16)((value32 & 0x3fe000) >> 13);648vtxops = (u8)((value32 & 0x400000) >> 22);649vrsv2 = (u8)((value32 & 0x800000) >> 23);650651PDM_SNPF(out_len, used, output + used, out_len - used,652"\r\n %-35s",653"VHT-SIG-A1");654PDM_SNPF(out_len, used, output + used, out_len - used,655"\r\n %-35s = %x / %x / %x / %x / %x / %x / %x / %x",656"BW/Rsv1/STBC/GID/Nsts/PAID/TXOPPS/Rsv2", v_rx_bw,657vrsv, vstbc, vgid, v_nsts, vpaid, vtxops, vrsv2);658659/*@ [VHT SIG A2] ====================================================*/660value32 = odm_get_bb_reg(dm, R_0xf30, MASKDWORD);661662/* @sgi=(u8)(value32&0x01); */663sgiext = (u8)(value32 & 0x03);664/* @fec = (u8)(value32&0x04); */665fecext = (u8)((value32 & 0x0C) >> 2);666667v_mcss = (u8)((value32 & 0xf0) >> 4);668bf = (u8)((value32 & 0x100) >> 8);669vrsv = (u8)((value32 & 0x200) >> 9);670vhtcrc8 = (u16)((value32 & 0x3fc00) >> 10);671v_tail = (u8)((value32 & 0xfc0000) >> 18);672673PDM_SNPF(out_len, used, output + used, out_len - used,674"\r\n %-35s", "VHT-SIG-A2");675PDM_SNPF(out_len, used, output + used, out_len - used,676"\r\n %-35s = %x / %x / %x / %x / %x / %x / %x",677"SGI/FEC/MCS/BF/Rsv/CRC/tail",678sgiext, fecext, v_mcss, bf, vrsv, vhtcrc8, v_tail);679680/*@ [VHT SIG B] ====================================================*/681value32 = odm_get_bb_reg(dm, R_0xf34, MASKDWORD);682683#if 0684v_length = (u16)(value32 & 0x1fffff);685vbrsv = (u8)((value32 & 0x600000) >> 21);686vb_tail = (u16)((value32 & 0x1f800000) >> 23);687vbcrc = (u8)((value32 & 0x80000000) >> 31);688#endif689690PDM_SNPF(out_len, used, output + used, out_len - used,691"\r\n %-35s", "VHT-SIG-B");692PDM_SNPF(out_len, used, output + used, out_len - used,693"\r\n %-35s = %x",694"Codeword", value32);695696#if 0697PDM_SNPF(out_len, used, output + used, out_len - used,698"\r\n %-35s = %x / %x / %x / %x",699"length/Rsv/tail/CRC",700v_length, vbrsv, vb_tail, vbcrc);701#endif702}703704*_used = used;705*_out_len = out_len;706}707#endif708709#ifdef PHYDM_IC_JGR3_SERIES_SUPPORT710void phydm_bb_hw_dbg_info_jgr3(void *dm_void, u32 *_used, char *output,711u32 *_out_len)712{713struct dm_struct *dm = (struct dm_struct *)dm_void;714u32 used = *_used;715u32 out_len = *_out_len;716char *tmp_string = NULL;717u8 rx_ht_bw = 0, rx_vht_bw = 0, rx_ht = 0;718static u8 v_rx_bw;719u32 value32 = 0;720u8 i = 0;721static u8 tail, parity, rsv, vrsv, smooth, htsound, agg;722static u8 stbc, vstbc, fec, fecext, sgi, sgiext, htltf, vgid, v_nsts;723static u8 vtxops, vrsv2, vbrsv, bf, vbcrc;724static u16 h_length, htcrc8, length;725static u16 vpaid;726static u16 v_length, vhtcrc8, v_mcss, v_tail, vb_tail;727static u8 hmcss, hrx_bw;728729PDM_SNPF(out_len, used, output + used, out_len - used, "\r\n %-35s\n",730"BB Report Info");731732/*@ [Mode] =====================================================*/733734value32 = odm_get_bb_reg(dm, R_0x2c20, MASKDWORD);735rx_ht = (u8)((value32 & 0xC0000) >> 18);736if (rx_ht == AD_VHT_MODE)737tmp_string = "VHT";738else if (rx_ht == AD_HT_MODE)739tmp_string = "HT";740else741tmp_string = "Legacy";742743PDM_SNPF(out_len, used, output + used, out_len - used,744"\r\n %-35s %s", "mode", tmp_string);745/*@ [RX counter Info] ===============================================*/746747PDM_SNPF(out_len, used, output + used, out_len - used,748"\r\n %-35s = %d", "CCK CCA cnt",749odm_get_bb_reg(dm, R_0x2c08, 0xFFFF));750751PDM_SNPF(out_len, used, output + used, out_len - used,752"\r\n %-35s = %d", "OFDM CCA cnt",753odm_get_bb_reg(dm, R_0x2c08, 0xFFFF0000));754755PDM_SNPF(out_len, used, output + used, out_len - used,756"\r\n %-35s = %d", "OFDM SBD Fail cnt",757odm_get_bb_reg(dm, R_0x2d20, 0xFFFF0000));758759PDM_SNPF(out_len, used, output + used, out_len - used,760"\r\n %-35s = %d / %d",761"LSIG (parity Fail/rate Illegal) cnt",762odm_get_bb_reg(dm, R_0x2d04, 0xFFFF0000),763odm_get_bb_reg(dm, R_0x2d08, 0xFFFF));764765value32 = odm_get_bb_reg(dm, R_0x2d10, MASKDWORD);766PDM_SNPF(out_len, used, output + used, out_len - used,767"\r\n %-35s = %d / %d", "HT/VHT MCS NOT SUPPORT cnt",768value32 & 0xFFFF, ((value32 & 0xFFFF0000) >> 16));769770value32 = odm_get_bb_reg(dm, R_0x2d0c, MASKDWORD);771PDM_SNPF(out_len, used, output + used, out_len - used,772"\r\n %-35s = %d / %d", "VHT SIGA/SIGB CRC8 Fail cnt",773value32 & 0xFFFF, ((value32 & 0xFFFF0000) >> 16));774/*@ [L-SIG Content] =================================================*/775value32 = odm_get_bb_reg(dm, R_0x2c20, MASKDWORD);776777parity = (u8)((value32 & 0x20000) >> 17);/*@[17]*/778length = (u16)((value32 & 0x1ffe0) >> 5);/*@[16:5]*/779rsv = (u8)((value32 & 0x10) >> 4);/*@[4]*/780781PDM_SNPF(out_len, used, output + used, out_len - used, "\r\n %-35s",782"L-SIG");783PDM_SNPF(out_len, used, output + used, out_len - used,784"\r\n %-35s = %d M", "rate",785phydm_get_l_sig_rate(dm, (u8)(value32 & 0x0f)));786787PDM_SNPF(out_len, used, output + used, out_len - used,788"\r\n %-35s = %x / %d / %d", "Rsv/length/parity", rsv, length,789parity);790791if (rx_ht == AD_HT_MODE) {792/*@ [HT SIG 1] ======================================================*/793value32 = odm_get_bb_reg(dm, R_0x2c2c, MASKDWORD);794795hmcss = (u8)(value32 & 0x7F);796hrx_bw = (u8)((value32 & 0x80) >> 7);797h_length = (u16)((value32 & 0x0fff00) >> 8);798799PDM_SNPF(out_len, used, output + used, out_len - used,800"\r\n %-35s", "HT-SIG1");801PDM_SNPF(out_len, used, output + used, out_len - used,802"\r\n %-35s = %d / %d / %d", "MCS/BW/length",803hmcss, hrx_bw, h_length);804/*@ [HT SIG 2] ======================================================*/805value32 = odm_get_bb_reg(dm, R_0x2c30, MASKDWORD);806smooth = (u8)(value32 & 0x01);807htsound = (u8)((value32 & 0x02) >> 1);808rsv = (u8)((value32 & 0x04) >> 2);809agg = (u8)((value32 & 0x08) >> 3);810stbc = (u8)((value32 & 0x30) >> 4);811fec = (u8)((value32 & 0x40) >> 6);812sgi = (u8)((value32 & 0x80) >> 7);813htltf = (u8)((value32 & 0x300) >> 8);814htcrc8 = (u16)((value32 & 0x3fc00) >> 10);815tail = (u8)((value32 & 0xfc0000) >> 18);816817PDM_SNPF(out_len, used, output + used, out_len - used,818"\r\n %-35s",819"HT-SIG2");820PDM_SNPF(out_len, used, output + used, out_len - used,821"\r\n %-35s = %x / %x / %x / %x / %x / %x",822"Smooth/NoSound/Rsv/Aggregate/STBC/LDPC",823smooth, htsound, rsv, agg, stbc, fec);824PDM_SNPF(out_len, used, output + used, out_len - used,825"\r\n %-35s = %x / %x / %x / %x",826"SGI/E-HT-LTFs/CRC/tail",827sgi, htltf, htcrc8, tail);828} else if (rx_ht == AD_VHT_MODE) {829/*@ [VHT SIG A1] ====================================================*/830value32 = odm_get_bb_reg(dm, R_0x2c2c, MASKDWORD);831832v_rx_bw = (u8)(value32 & 0x03);833vrsv = (u8)((value32 & 0x04) >> 2);834vstbc = (u8)((value32 & 0x08) >> 3);835vgid = (u8)((value32 & 0x3f0) >> 4);836v_nsts = (u8)(((value32 & 0x1c00) >> 10) + 1);837vpaid = (u16)((value32 & 0x3fe000) >> 13);838vtxops = (u8)((value32 & 0x400000) >> 22);839vrsv2 = (u8)((value32 & 0x800000) >> 23);840841PDM_SNPF(out_len, used, output + used, out_len - used,842"\r\n %-35s",843"VHT-SIG-A1");844PDM_SNPF(out_len, used, output + used, out_len - used,845"\r\n %-35s = %x / %x / %x / %x / %x / %x / %x / %x",846"BW/Rsv1/STBC/GID/Nsts/PAID/TXOPPS/Rsv2", v_rx_bw,847vrsv, vstbc, vgid, v_nsts, vpaid, vtxops, vrsv2);848849/*@ [VHT SIG A2] ====================================================*/850value32 = odm_get_bb_reg(dm, R_0x2c30, MASKDWORD);851852/* @sgi=(u8)(value32&0x01); */853sgiext = (u8)(value32 & 0x03);854/* @fec = (u8)(value32&0x04); */855fecext = (u8)((value32 & 0x0C) >> 2);856857v_mcss = (u8)((value32 & 0xf0) >> 4);858bf = (u8)((value32 & 0x100) >> 8);859vrsv = (u8)((value32 & 0x200) >> 9);860vhtcrc8 = (u16)((value32 & 0x3fc00) >> 10);861v_tail = (u8)((value32 & 0xfc0000) >> 18);862863PDM_SNPF(out_len, used, output + used, out_len - used,864"\r\n %-35s", "VHT-SIG-A2");865PDM_SNPF(out_len, used, output + used, out_len - used,866"\r\n %-35s = %x / %x / %x / %x / %x / %x / %x",867"SGI/FEC/MCS/BF/Rsv/CRC/tail",868sgiext, fecext, v_mcss, bf, vrsv, vhtcrc8, v_tail);869870/*@ [VHT SIG B] ====================================================*/871value32 = odm_get_bb_reg(dm, R_0x2c34, MASKDWORD);872873PDM_SNPF(out_len, used, output + used, out_len - used,874"\r\n %-35s", "VHT-SIG-B");875PDM_SNPF(out_len, used, output + used, out_len - used,876"\r\n %-35s = %x",877"Codeword", value32);878879if (v_rx_bw == 0) {880v_length = (u16)(value32 & 0x1ffff);881vbrsv = (u8)((value32 & 0xE0000) >> 17);882vb_tail = (u16)((value32 & 0x03F00000) >> 20);883} else if (v_rx_bw == 1) {884v_length = (u16)(value32 & 0x7FFFF);885vbrsv = (u8)((value32 & 0x180000) >> 19);886vb_tail = (u16)((value32 & 0x07E00000) >> 21);887} else if (v_rx_bw == 2) {888v_length = (u16)(value32 & 0x1fffff);889vbrsv = (u8)((value32 & 0x600000) >> 21);890vb_tail = (u16)((value32 & 0x1f800000) >> 23);891}892vbcrc = (u8)((value32 & 0x80000000) >> 31);893894PDM_SNPF(out_len, used, output + used, out_len - used,895"\r\n %-35s = %x / %x / %x / %x",896"length/Rsv/tail/CRC",897v_length, vbrsv, vb_tail, vbcrc);898}899900*_used = used;901*_out_len = out_len;902}903#endif904905u8 phydm_get_l_sig_rate(void *dm_void, u8 rate_idx_l_sig)906{907u8 rate_idx = 0xff;908909switch (rate_idx_l_sig) {910case 0x0b:911rate_idx = 6;912break;913case 0x0f:914rate_idx = 9;915break;916case 0x0a:917rate_idx = 12;918break;919case 0x0e:920rate_idx = 18;921break;922case 0x09:923rate_idx = 24;924break;925case 0x0d:926rate_idx = 36;927break;928case 0x08:929rate_idx = 48;930break;931case 0x0c:932rate_idx = 54;933break;934default:935rate_idx = 0xff;936break;937}938939return rate_idx;940}941942void phydm_bb_hw_dbg_info(void *dm_void, char input[][16], u32 *_used,943char *output, u32 *_out_len)944{945struct dm_struct *dm = (struct dm_struct *)dm_void;946u32 used = *_used;947u32 out_len = *_out_len;948949switch (dm->ic_ip_series) {950#if (ODM_IC_11N_SERIES_SUPPORT)951case PHYDM_IC_N:952phydm_bb_hw_dbg_info_n(dm, &used, output, &out_len);953break;954#endif955956#if (ODM_IC_11AC_SERIES_SUPPORT)957case PHYDM_IC_AC:958phydm_bb_hw_dbg_info_ac(dm, &used, output, &out_len);959phydm_reset_bb_hw_cnt(dm);960#if (RTL8822B_SUPPORT)961phydm_bb_hw_dbg_info_8822b(dm, &used, output, &out_len);962#endif963break;964#endif965966#ifdef PHYDM_IC_JGR3_SERIES_SUPPORT967case PHYDM_IC_JGR3:968phydm_bb_hw_dbg_info_jgr3(dm, &used, output, &out_len);969phydm_reset_bb_hw_cnt(dm);970break;971#endif972default:973break;974}975976*_used = used;977*_out_len = out_len;978}979980#endif /*@#ifdef CONFIG_PHYDM_DEBUG_FUNCTION*/981982#if (DM_ODM_SUPPORT_TYPE & ODM_WIN)983984void phydm_dm_summary_cli_win(void *dm_void, char *buf, u8 macid)985{986struct dm_struct *dm = (struct dm_struct *)dm_void;987struct phydm_dig_struct *dig_t = &dm->dm_dig_table;988struct phydm_cfo_track_struct *cfo_t = &dm->dm_cfo_track;989struct cmn_sta_info *sta = NULL;990struct ra_sta_info *ra = NULL;991struct dtp_info *dtp = NULL;992u64 comp = dm->support_ability;993u64 pause_comp = dm->pause_ability;994995if (!dm->is_linked) {996RT_SPRINTF(buf, DBGM_CLI_BUF_SIZE, "[%s]No Link !!!\n", __func__);997RT_PRINT(buf);998return;999}10001001RT_SPRINTF(buf, DBGM_CLI_BUF_SIZE, "00.(%s) %-12s: IGI=0x%x, Dyn_Rng=0x%x~0x%x, FA_th={%d,%d,%d}\n",1002((comp & ODM_BB_DIG) ?1003((pause_comp & ODM_BB_DIG) ? "P" : "V") : "."),1004"DIG",1005dig_t->cur_ig_value,1006dig_t->rx_gain_range_min, dig_t->rx_gain_range_max,1007dig_t->fa_th[0], dig_t->fa_th[1], dig_t->fa_th[2]);1008RT_PRINT(buf);10091010sta = dm->phydm_sta_info[macid];1011if (is_sta_active(sta)) {1012RT_PRINT(buf);10131014ra = &sta->ra_info;1015dtp = &sta->dtp_stat;10161017RT_SPRINTF(buf, DBGM_CLI_BUF_SIZE, "01.(%s) %-12s: rssi_lv=%d, mask=0x%llx\n",1018((comp & ODM_BB_RA_MASK) ?1019((pause_comp & ODM_BB_RA_MASK) ? "P" : "V") : "."),1020"RaMask",1021ra->rssi_level, ra->ramask);1022RT_PRINT(buf);10231024#ifdef CONFIG_DYNAMIC_TX_TWR1025RT_SPRINTF(buf, DBGM_CLI_BUF_SIZE, "02.(%s) %-12s: pwr_lv=%d\n",1026((comp & ODM_BB_DYNAMIC_TXPWR) ?1027((pause_comp & ODM_BB_DYNAMIC_TXPWR) ? "P" : "V") : "."),1028"DynTxPwr",1029dtp->sta_tx_high_power_lvl);1030RT_PRINT(buf);1031#endif1032}10331034RT_SPRINTF(buf, DBGM_CLI_BUF_SIZE, "05.(%s) %-12s: cck_pd_lv=%d\n",1035((comp & ODM_BB_CCK_PD) ?1036((pause_comp & ODM_BB_CCK_PD) ? "P" : "V") : "."),1037"CCK_PD", dm->dm_cckpd_table.cck_pd_lv);1038RT_PRINT(buf);10391040#ifdef CONFIG_PHYDM_ANTENNA_DIVERSITY1041RT_SPRINTF(buf, DBGM_CLI_BUF_SIZE, "06.(%s) %-12s: div_type=%d, curr_ant=%s\n",1042((comp & ODM_BB_ANT_DIV) ?1043((pause_comp & ODM_BB_ANT_DIV) ? "P" : "V") : "."),1044"ANT_DIV",1045dm->ant_div_type,1046(dm->dm_fat_table.rx_idle_ant == MAIN_ANT) ? "MAIN" : "AUX");1047RT_PRINT(buf);1048#endif10491050#ifdef PHYDM_POWER_TRAINING_SUPPORT1051RT_SPRINTF(buf, DBGM_CLI_BUF_SIZE, "08.(%s) %-12s: PT_score=%d, disable_PT=%d\n",1052((comp & ODM_BB_PWR_TRAIN) ?1053((pause_comp & ODM_BB_PWR_TRAIN) ? "P" : "V") : "."),1054"PwrTrain",1055dm->pow_train_table.pow_train_score,1056dm->is_disable_power_training);1057RT_PRINT(buf);1058#endif10591060#ifdef CONFIG_PHYDM_DFS_MASTER1061RT_SPRINTF(buf, DBGM_CLI_BUF_SIZE, "11.(%s) %-12s: dbg_mode=%d, region_domain=%d\n",1062((comp & ODM_BB_DFS) ?1063((pause_comp & ODM_BB_DFS) ? "P" : "V") : "."),1064"DFS",1065dm->dfs.dbg_mode, dm->dfs_region_domain);1066RT_PRINT(buf);1067#endif1068#ifdef PHYDM_SUPPORT_ADAPTIVITY1069RT_SPRINTF(buf, DBGM_CLI_BUF_SIZE, "13.(%s) %-12s: th{l2h, h2l}={%d, %d}, edcca_flag=%d\n",1070((comp & ODM_BB_ADAPTIVITY) ?1071((pause_comp & ODM_BB_ADAPTIVITY) ? "P" : "V") : "."),1072"Adaptivity",1073dm->adaptivity.th_l2h, dm->adaptivity.th_h2l,1074dm->false_alm_cnt.edcca_flag);1075RT_PRINT(buf);1076#endif1077RT_SPRINTF(buf, DBGM_CLI_BUF_SIZE, "14.(%s) %-12s: CFO_avg=%d kHz, CFO_traking=%s%d\n",1078((comp & ODM_BB_CFO_TRACKING) ?1079((pause_comp & ODM_BB_CFO_TRACKING) ? "P" : "V") : "."),1080"CfoTrack",1081cfo_t->CFO_ave_pre,1082((cfo_t->crystal_cap > cfo_t->def_x_cap) ? "+" : "-"),1083DIFF_2(cfo_t->crystal_cap, cfo_t->def_x_cap));1084RT_PRINT(buf);10851086RT_SPRINTF(buf, DBGM_CLI_BUF_SIZE, "15.(%s) %-12s: ratio{nhm, clm}={%d, %d}\n",1087((comp & ODM_BB_ENV_MONITOR) ?1088((pause_comp & ODM_BB_ENV_MONITOR) ? "P" : "V") : "."),1089"EnvMntr",1090dm->dm_ccx_info.nhm_ratio, dm->dm_ccx_info.clm_ratio);1091RT_PRINT(buf);1092#ifdef PHYDM_PRIMARY_CCA1093RT_SPRINTF(buf, DBGM_CLI_BUF_SIZE, "16.(%s) %-12s: CCA @ (%s SB)\n",1094((comp & ODM_BB_PRIMARY_CCA) ?1095((pause_comp & ODM_BB_PRIMARY_CCA) ? "P" : "V") : "."),1096"PriCCA",1097((dm->dm_pri_cca.mf_state == MF_USC_LSC) ? "D" :1098((dm->dm_pri_cca.mf_state == MF_LSC) ? "L" : "U")));1099RT_PRINT(buf);1100#endif1101#ifdef CONFIG_ADAPTIVE_SOML1102RT_SPRINTF(buf, DBGM_CLI_BUF_SIZE, "17.(%s) %-12s: soml_en = %s\n",1103((comp & ODM_BB_ADAPTIVE_SOML) ?1104((pause_comp & ODM_BB_ADAPTIVE_SOML) ? "P" : "V") : "."),1105"A-SOML",1106(dm->dm_soml_table.soml_last_state == SOML_ON) ?1107"ON" : "OFF");1108RT_PRINT(buf);1109#endif1110#ifdef PHYDM_LNA_SAT_CHK_SUPPORT1111RT_SPRINTF(buf, DBGM_CLI_BUF_SIZE, "18.(%s) %-12s:\n",1112((comp & ODM_BB_LNA_SAT_CHK) ?1113((pause_comp & ODM_BB_LNA_SAT_CHK) ? "P" : "V") : "."),1114"LNA_SAT_CHK");1115RT_PRINT(buf);1116#endif1117}11181119void phydm_basic_dbg_msg_cli_win(void *dm_void, char *buf)1120{1121struct dm_struct *dm = (struct dm_struct *)dm_void;1122struct phydm_fa_struct *fa_t = &dm->false_alm_cnt;1123struct phydm_cfo_track_struct *cfo_t = &dm->dm_cfo_track;1124struct odm_phy_dbg_info *dbg = &dm->phy_dbg_info;1125struct phydm_phystatus_statistic *dbg_s = &dbg->physts_statistic_info;1126struct phydm_phystatus_avg *dbg_avg = &dbg->phystatus_statistic_avg;1127char *rate_type = NULL;1128u8 tmp_rssi_avg[4];1129u8 tmp_snr_avg[4];1130u8 tmp_evm_avg[4];1131u32 tmp_cnt = 0;1132u8 macid, target_macid = 0;1133u8 i = 0;1134u8 rate_num = dm->num_rf_path;1135u8 ss_ofst = 0;1136struct cmn_sta_info *entry = NULL;1137char dbg_buf[PHYDM_SNPRINT_SIZE] = {0};11381139if (dm->debug_components & DBG_CMN)1140return;11411142RT_SPRINTF(buf, DBGM_CLI_BUF_SIZE, "\r\n PHYDM Common Dbg Msg --------->");1143RT_PRINT(buf);1144RT_SPRINTF(buf, DBGM_CLI_BUF_SIZE, "\r\n System up time=%d", dm->phydm_sys_up_time);1145RT_PRINT(buf);11461147if (dm->is_linked) {1148RT_SPRINTF(buf, DBGM_CLI_BUF_SIZE, "\r\n ID=((%d)), BW=((%d)), fc=((CH-%d))",1149dm->curr_station_id, 20 << *dm->band_width, *dm->channel);1150RT_PRINT(buf);11511152if (((*dm->channel <= 14) && (*dm->band_width == CHANNEL_WIDTH_40)) &&1153(dm->support_ic_type & ODM_IC_11N_SERIES)) {1154RT_SPRINTF(buf, DBGM_CLI_BUF_SIZE, "\r\n Primary CCA at ((%s SB))",1155(*dm->sec_ch_offset == SECOND_CH_AT_LSB) ? "U" : "L");1156RT_PRINT(buf);1157}11581159if (dm->cck_new_agc || dm->rx_rate > ODM_RATE11M) {1160RT_SPRINTF(buf, DBGM_CLI_BUF_SIZE, "\r\n [AGC Idx] {0x%x, 0x%x, 0x%x, 0x%x}",1161dm->ofdm_agc_idx[0], dm->ofdm_agc_idx[1],1162dm->ofdm_agc_idx[2], dm->ofdm_agc_idx[3]);1163RT_PRINT(buf);1164} else {1165RT_SPRINTF(buf, DBGM_CLI_BUF_SIZE, "\r\n [CCK AGC Idx] {LNA,VGA}={0x%x, 0x%x}",1166dm->cck_lna_idx, dm->cck_vga_idx);1167RT_PRINT(buf);1168}11691170phydm_print_rate_2_buff(dm, dm->rx_rate, dbg_buf, PHYDM_SNPRINT_SIZE);1171RT_SPRINTF(buf, DBGM_CLI_BUF_SIZE, "\r\n RSSI:{%d, %d, %d, %d}, RxRate:%s (0x%x)",1172(dm->rssi_a == 0xff) ? 0 : dm->rssi_a,1173(dm->rssi_b == 0xff) ? 0 : dm->rssi_b,1174(dm->rssi_c == 0xff) ? 0 : dm->rssi_c,1175(dm->rssi_d == 0xff) ? 0 : dm->rssi_d,1176dbg_buf, dm->rx_rate);1177RT_PRINT(buf);11781179phydm_print_rate_2_buff(dm, dm->phy_dbg_info.beacon_phy_rate, dbg_buf, PHYDM_SNPRINT_SIZE);1180RT_SPRINTF(buf, DBGM_CLI_BUF_SIZE, "\r\n Beacon_cnt=%d, rate_idx:%s (0x%x)",1181dm->phy_dbg_info.beacon_cnt_in_period,1182dbg_buf,1183dm->phy_dbg_info.beacon_phy_rate);1184RT_PRINT(buf);11851186/*Show phydm_rx_rate_distribution;*/1187RT_SPRINTF(buf, DBGM_CLI_BUF_SIZE, "\r\n [RxRate Cnt] =============>");1188RT_PRINT(buf);11891190/*@======CCK=================================================*/1191if (*dm->channel <= 14) {1192RT_SPRINTF(buf, DBGM_CLI_BUF_SIZE, "\r\n * CCK = {%d, %d, %d, %d}",1193dbg->num_qry_legacy_pkt[0], dbg->num_qry_legacy_pkt[1],1194dbg->num_qry_legacy_pkt[2], dbg->num_qry_legacy_pkt[3]);1195RT_PRINT(buf);1196}1197/*@======OFDM================================================*/1198RT_SPRINTF(buf, DBGM_CLI_BUF_SIZE, "\r\n * OFDM = {%d, %d, %d, %d, %d, %d, %d, %d}",1199dbg->num_qry_legacy_pkt[4], dbg->num_qry_legacy_pkt[5],1200dbg->num_qry_legacy_pkt[6], dbg->num_qry_legacy_pkt[7],1201dbg->num_qry_legacy_pkt[8], dbg->num_qry_legacy_pkt[9],1202dbg->num_qry_legacy_pkt[10], dbg->num_qry_legacy_pkt[11]);1203RT_PRINT(buf);12041205/*@======HT==================================================*/1206if (dbg->ht_pkt_not_zero) {1207for (i = 0; i < rate_num; i++) {1208ss_ofst = (i << 3);12091210RT_SPRINTF(buf, DBGM_CLI_BUF_SIZE, "\r\n * HT MCS[%d :%d ] = {%d, %d, %d, %d, %d, %d, %d, %d}",1211(ss_ofst), (ss_ofst + 7),1212dbg->num_qry_ht_pkt[ss_ofst + 0], dbg->num_qry_ht_pkt[ss_ofst + 1],1213dbg->num_qry_ht_pkt[ss_ofst + 2], dbg->num_qry_ht_pkt[ss_ofst + 3],1214dbg->num_qry_ht_pkt[ss_ofst + 4], dbg->num_qry_ht_pkt[ss_ofst + 5],1215dbg->num_qry_ht_pkt[ss_ofst + 6], dbg->num_qry_ht_pkt[ss_ofst + 7]);1216RT_PRINT(buf);1217}12181219if (dbg->low_bw_20_occur) {1220for (i = 0; i < rate_num; i++) {1221ss_ofst = (i << 3);12221223RT_SPRINTF(buf, DBGM_CLI_BUF_SIZE, "\r\n * [Low BW 20M] HT MCS[%d :%d ] = {%d, %d, %d, %d, %d, %d, %d, %d}",1224(ss_ofst), (ss_ofst + 7),1225dbg->num_qry_pkt_sc_20m[ss_ofst + 0], dbg->num_qry_pkt_sc_20m[ss_ofst + 1],1226dbg->num_qry_pkt_sc_20m[ss_ofst + 2], dbg->num_qry_pkt_sc_20m[ss_ofst + 3],1227dbg->num_qry_pkt_sc_20m[ss_ofst + 4], dbg->num_qry_pkt_sc_20m[ss_ofst + 5],1228dbg->num_qry_pkt_sc_20m[ss_ofst + 6], dbg->num_qry_pkt_sc_20m[ss_ofst + 7]);1229RT_PRINT(buf);1230}1231}1232}12331234#if (ODM_IC_11AC_SERIES_SUPPORT || defined(PHYDM_IC_JGR3_SERIES_SUPPORT))1235/*@======VHT=================================================*/1236if (dbg->vht_pkt_not_zero) {1237for (i = 0; i < rate_num; i++) {1238ss_ofst = 10 * i;12391240RT_SPRINTF(buf, DBGM_CLI_BUF_SIZE, "\r\n * VHT-%d ss MCS[0:9] = {%d, %d, %d, %d, %d, %d, %d, %d, %d, %d}",1241(i + 1),1242dbg->num_qry_vht_pkt[ss_ofst + 0], dbg->num_qry_vht_pkt[ss_ofst + 1],1243dbg->num_qry_vht_pkt[ss_ofst + 2], dbg->num_qry_vht_pkt[ss_ofst + 3],1244dbg->num_qry_vht_pkt[ss_ofst + 4], dbg->num_qry_vht_pkt[ss_ofst + 5],1245dbg->num_qry_vht_pkt[ss_ofst + 6], dbg->num_qry_vht_pkt[ss_ofst + 7],1246dbg->num_qry_vht_pkt[ss_ofst + 8], dbg->num_qry_vht_pkt[ss_ofst + 9]);1247RT_PRINT(buf);1248}12491250if (dbg->low_bw_20_occur) {1251for (i = 0; i < rate_num; i++) {1252ss_ofst = 10 * i;12531254RT_SPRINTF(buf, DBGM_CLI_BUF_SIZE, "\r\n *[Low BW 20M] VHT-%d ss MCS[0:9] = {%d, %d, %d, %d, %d, %d, %d, %d, %d, %d}",1255(i + 1),1256dbg->num_qry_pkt_sc_20m[ss_ofst + 0], dbg->num_qry_pkt_sc_20m[ss_ofst + 1],1257dbg->num_qry_pkt_sc_20m[ss_ofst + 2], dbg->num_qry_pkt_sc_20m[ss_ofst + 3],1258dbg->num_qry_pkt_sc_20m[ss_ofst + 4], dbg->num_qry_pkt_sc_20m[ss_ofst + 5],1259dbg->num_qry_pkt_sc_20m[ss_ofst + 6], dbg->num_qry_pkt_sc_20m[ss_ofst + 7],1260dbg->num_qry_pkt_sc_20m[ss_ofst + 8], dbg->num_qry_pkt_sc_20m[ss_ofst + 9]);1261RT_PRINT(buf);1262}1263}12641265if (dbg->low_bw_40_occur) {1266for (i = 0; i < rate_num; i++) {1267ss_ofst = 10 * i;12681269RT_SPRINTF(buf, DBGM_CLI_BUF_SIZE, "\r\n *[Low BW 40M] VHT-%d ss MCS[0:9] = {%d, %d, %d, %d, %d, %d, %d, %d, %d, %d}",1270(i + 1),1271dbg->num_qry_pkt_sc_40m[ss_ofst + 0], dbg->num_qry_pkt_sc_40m[ss_ofst + 1],1272dbg->num_qry_pkt_sc_40m[ss_ofst + 2], dbg->num_qry_pkt_sc_40m[ss_ofst + 3],1273dbg->num_qry_pkt_sc_40m[ss_ofst + 4], dbg->num_qry_pkt_sc_40m[ss_ofst + 5],1274dbg->num_qry_pkt_sc_40m[ss_ofst + 6], dbg->num_qry_pkt_sc_40m[ss_ofst + 7],1275dbg->num_qry_pkt_sc_40m[ss_ofst + 8], dbg->num_qry_pkt_sc_40m[ss_ofst + 9]);1276RT_PRINT(buf);1277}1278}1279}1280#endif12811282phydm_reset_rx_rate_distribution(dm);12831284//1 Show phydm_avg_phystatus_val1285RT_SPRINTF(buf, DBGM_CLI_BUF_SIZE,1286"\r\n [Avg PHY Statistic] ==============>\n");1287RT_PRINT(buf);1288#if 11289phydm_get_avg_phystatus_val(dm);12901291switch (dm->num_rf_path) {1292#if (defined(PHYDM_COMPILE_ABOVE_4SS))1293case 4:1294RT_SPRINTF(buf, DBGM_CLI_BUF_SIZE,1295"* %-8s Cnt=((%.3d)) RSSI:{%.2d, %.2d, %.2d, %.2d}\n",1296"[Beacon]", dbg_s->rssi_beacon_cnt,1297dbg_avg->rssi_beacon_avg[0],1298dbg_avg->rssi_beacon_avg[1],1299dbg_avg->rssi_beacon_avg[2],1300dbg_avg->rssi_beacon_avg[3]);1301break;1302#endif1303#if (defined(PHYDM_COMPILE_ABOVE_3SS))1304case 3:1305RT_SPRINTF(buf, DBGM_CLI_BUF_SIZE,1306"* %-8s Cnt=((%.3d)) RSSI:{%.2d, %.2d, %.2d}\n",1307"[Beacon]", dbg_s->rssi_beacon_cnt,1308dbg_avg->rssi_beacon_avg[0],1309dbg_avg->rssi_beacon_avg[1],1310dbg_avg->rssi_beacon_avg[2]);1311break;1312#endif1313#if (defined(PHYDM_COMPILE_ABOVE_2SS))1314case 2:1315RT_SPRINTF(buf, DBGM_CLI_BUF_SIZE,1316"* %-8s Cnt=((%.3d)) RSSI:{%.2d, %.2d}\n",1317"[Beacon]", dbg_s->rssi_beacon_cnt,1318dbg_avg->rssi_beacon_avg[0],1319dbg_avg->rssi_beacon_avg[1]);1320break;1321#endif1322default:1323RT_SPRINTF(buf, DBGM_CLI_BUF_SIZE,1324"* %-8s Cnt=((%.3d)) RSSI:{%.2d}\n",1325"[Beacon]", dbg_s->rssi_beacon_cnt,1326dbg_avg->rssi_beacon_avg[0]);1327break;1328}1329RT_PRINT(buf);13301331switch (dm->num_rf_path) {1332#ifdef PHYSTS_3RD_TYPE_SUPPORT1333#if (defined(PHYDM_COMPILE_ABOVE_4SS))1334case 4:1335RT_SPRINTF(buf, DBGM_CLI_BUF_SIZE,1336"* %-8s Cnt=((%.3d)) RSSI:{%.2d, %.2d, %.2d, %.2d}\n",1337"[CCK]", dbg_s->rssi_cck_cnt,1338dbg_avg->rssi_cck_avg,1339dbg_avg->rssi_cck_avg_abv_2ss[0],1340dbg_avg->rssi_cck_avg_abv_2ss[1],1341dbg_avg->rssi_cck_avg_abv_2ss[2]);1342break;1343#endif1344#if (defined(PHYDM_COMPILE_ABOVE_3SS))1345case 3:1346RT_SPRINTF(buf, DBGM_CLI_BUF_SIZE,1347"* %-8s Cnt=((%.3d)) RSSI:{%.2d, %.2d, %.2d}\n",1348"[CCK]", dbg_s->rssi_cck_cnt,1349dbg_avg->rssi_cck_avg,1350dbg_avg->rssi_cck_avg_abv_2ss[0],1351dbg_avg->rssi_cck_avg_abv_2ss[1]);1352break;1353#endif1354#if (defined(PHYDM_COMPILE_ABOVE_2SS))1355case 2:1356RT_SPRINTF(buf, DBGM_CLI_BUF_SIZE,1357"* %-8s Cnt=((%.3d)) RSSI:{%.2d, %.2d}\n",1358"[CCK]", dbg_s->rssi_cck_cnt,1359dbg_avg->rssi_cck_avg,1360dbg_avg->rssi_cck_avg_abv_2ss[0]);1361break;1362#endif1363#endif1364default:1365RT_SPRINTF(buf, DBGM_CLI_BUF_SIZE,1366"* %-8s Cnt=((%.3d)) RSSI:{%.2d}\n",1367"[CCK]", dbg_s->rssi_cck_cnt,1368dbg_avg->rssi_cck_avg);1369break;1370}1371RT_PRINT(buf);13721373for (i = 0; i <= 4; i++) {1374if (i > dm->num_rf_path)1375break;13761377odm_memory_set(dm, tmp_rssi_avg, 0, 4);1378odm_memory_set(dm, tmp_snr_avg, 0, 4);1379odm_memory_set(dm, tmp_evm_avg, 0, 4);13801381#if (defined(PHYDM_COMPILE_ABOVE_4SS))1382if (i == 4) {1383rate_type = "[4-SS]";1384tmp_cnt = dbg_s->rssi_4ss_cnt;1385odm_move_memory(dm, tmp_rssi_avg, dbg_avg->rssi_4ss_avg, dm->num_rf_path);1386odm_move_memory(dm, tmp_snr_avg, dbg_avg->snr_4ss_avg, dm->num_rf_path);1387odm_move_memory(dm, tmp_evm_avg, dbg_avg->evm_4ss_avg, 4);1388} else1389#endif1390#if (defined(PHYDM_COMPILE_ABOVE_3SS))1391if (i == 3) {1392rate_type = "[3-SS]";1393tmp_cnt = dbg_s->rssi_3ss_cnt;1394odm_move_memory(dm, tmp_rssi_avg, dbg_avg->rssi_3ss_avg, dm->num_rf_path);1395odm_move_memory(dm, tmp_snr_avg, dbg_avg->snr_3ss_avg, dm->num_rf_path);1396odm_move_memory(dm, tmp_evm_avg, dbg_avg->evm_3ss_avg, 3);1397} else1398#endif1399#if (defined(PHYDM_COMPILE_ABOVE_2SS))1400if (i == 2) {1401rate_type = "[2-SS]";1402tmp_cnt = dbg_s->rssi_2ss_cnt;1403odm_move_memory(dm, tmp_rssi_avg, dbg_avg->rssi_2ss_avg, dm->num_rf_path);1404odm_move_memory(dm, tmp_snr_avg, dbg_avg->snr_2ss_avg, dm->num_rf_path);1405odm_move_memory(dm, tmp_evm_avg, dbg_avg->evm_2ss_avg, 2);1406} else1407#endif1408if (i == 1) {1409rate_type = "[1-SS]";1410tmp_cnt = dbg_s->rssi_1ss_cnt;1411odm_move_memory(dm, tmp_rssi_avg, dbg_avg->rssi_1ss_avg, dm->num_rf_path);1412odm_move_memory(dm, tmp_snr_avg, dbg_avg->snr_1ss_avg, dm->num_rf_path);1413odm_move_memory(dm, tmp_evm_avg, &dbg_avg->evm_1ss_avg, 1);1414} else {1415rate_type = "[L-OFDM]";1416tmp_cnt = dbg_s->rssi_ofdm_cnt;1417odm_move_memory(dm, tmp_rssi_avg, dbg_avg->rssi_ofdm_avg, dm->num_rf_path);1418odm_move_memory(dm, tmp_snr_avg, dbg_avg->snr_ofdm_avg, dm->num_rf_path);1419odm_move_memory(dm, tmp_evm_avg, &dbg_avg->evm_ofdm_avg, 1);1420}14211422RT_SPRINTF(buf, DBGM_CLI_BUF_SIZE,1423"* %-8s Cnt=((%.3d)) RSSI:{%.2d, %.2d, %.2d, %.2d} SNR:{%.2d, %.2d, %.2d, %.2d} EVM:{-%.2d, -%.2d, -%.2d, -%.2d}\n",1424rate_type, tmp_cnt,1425tmp_rssi_avg[0], tmp_rssi_avg[1], tmp_rssi_avg[2], tmp_rssi_avg[3],1426tmp_snr_avg[0], tmp_snr_avg[1], tmp_snr_avg[2], tmp_snr_avg[3],1427tmp_evm_avg[0], tmp_evm_avg[1], tmp_evm_avg[2], tmp_evm_avg[3]);1428RT_PRINT(buf);1429}1430#else1431phydm_reset_phystatus_avg(dm);14321433/*@CCK*/1434dbg_avg->rssi_cck_avg = (u8)((dbg_s->rssi_cck_cnt != 0) ? (dbg_s->rssi_cck_sum / dbg_s->rssi_cck_cnt) : 0);1435RT_SPRINTF(buf, DBGM_CLI_BUF_SIZE, "\r\n * cck Cnt= ((%d)) RSSI:{%d}",1436dbg_s->rssi_cck_cnt, dbg_avg->rssi_cck_avg);1437RT_PRINT(buf);14381439/*OFDM*/1440if (dbg_s->rssi_ofdm_cnt != 0) {1441dbg_avg->rssi_ofdm_avg = (u8)(dbg_s->rssi_ofdm_sum / dbg_s->rssi_ofdm_cnt);1442dbg_avg->evm_ofdm_avg = (u8)(dbg_s->evm_ofdm_sum / dbg_s->rssi_ofdm_cnt);1443dbg_avg->snr_ofdm_avg = (u8)(dbg_s->snr_ofdm_sum / dbg_s->rssi_ofdm_cnt);1444}14451446RT_SPRINTF(buf, DBGM_CLI_BUF_SIZE, "\r\n * ofdm Cnt= ((%d)) RSSI:{%d} EVM:{%d} SNR:{%d}",1447dbg_s->rssi_ofdm_cnt, dbg_avg->rssi_ofdm_avg,1448dbg_avg->evm_ofdm_avg, dbg_avg->snr_ofdm_avg);1449RT_PRINT(buf);14501451if (dbg_s->rssi_1ss_cnt != 0) {1452dbg_avg->rssi_1ss_avg = (u8)(dbg_s->rssi_1ss_sum / dbg_s->rssi_1ss_cnt);1453dbg_avg->evm_1ss_avg = (u8)(dbg_s->evm_1ss_sum / dbg_s->rssi_1ss_cnt);1454dbg_avg->snr_1ss_avg = (u8)(dbg_s->snr_1ss_sum / dbg_s->rssi_1ss_cnt);1455}14561457RT_SPRINTF(buf, DBGM_CLI_BUF_SIZE, "\r\n * 1-ss Cnt= ((%d)) RSSI:{%d} EVM:{%d} SNR:{%d}",1458dbg_s->rssi_1ss_cnt, dbg_avg->rssi_1ss_avg,1459dbg_avg->evm_1ss_avg, dbg_avg->snr_1ss_avg);1460RT_PRINT(buf);14611462#if (defined(PHYDM_COMPILE_ABOVE_2SS))1463if (dm->support_ic_type & (PHYDM_IC_ABOVE_2SS)) {1464if (dbg_s->rssi_2ss_cnt != 0) {1465dbg_avg->rssi_2ss_avg[0] = (u8)(dbg_s->rssi_2ss_sum[0] / dbg_s->rssi_2ss_cnt);1466dbg_avg->rssi_2ss_avg[1] = (u8)(dbg_s->rssi_2ss_sum[1] / dbg_s->rssi_2ss_cnt);14671468dbg_avg->evm_2ss_avg[0] = (u8)(dbg_s->evm_2ss_sum[0] / dbg_s->rssi_2ss_cnt);1469dbg_avg->evm_2ss_avg[1] = (u8)(dbg_s->evm_2ss_sum[1] / dbg_s->rssi_2ss_cnt);14701471dbg_avg->snr_2ss_avg[0] = (u8)(dbg_s->snr_2ss_sum[0] / dbg_s->rssi_2ss_cnt);1472dbg_avg->snr_2ss_avg[1] = (u8)(dbg_s->snr_2ss_sum[1] / dbg_s->rssi_2ss_cnt);1473}14741475RT_SPRINTF(buf, DBGM_CLI_BUF_SIZE, "\r\n * 2-ss Cnt= ((%d)) RSSI:{%d, %d}, EVM:{%d, %d}, SNR:{%d, %d}",1476dbg_s->rssi_2ss_cnt, dbg_avg->rssi_2ss_avg[0],1477dbg_avg->rssi_2ss_avg[1], dbg_avg->evm_2ss_avg[0],1478dbg_avg->evm_2ss_avg[1], dbg_avg->snr_2ss_avg[0],1479dbg_avg->snr_2ss_avg[1]);1480RT_PRINT(buf);1481}1482#endif14831484#if (defined(PHYDM_COMPILE_ABOVE_3SS))1485if (dm->support_ic_type & (PHYDM_IC_ABOVE_3SS)) {1486if (dbg_s->rssi_3ss_cnt != 0) {1487dbg_avg->rssi_3ss_avg[0] = (u8)(dbg_s->rssi_3ss_sum[0] / dbg_s->rssi_3ss_cnt);1488dbg_avg->rssi_3ss_avg[1] = (u8)(dbg_s->rssi_3ss_sum[1] / dbg_s->rssi_3ss_cnt);1489dbg_avg->rssi_3ss_avg[2] = (u8)(dbg_s->rssi_3ss_sum[2] / dbg_s->rssi_3ss_cnt);14901491dbg_avg->evm_3ss_avg[0] = (u8)(dbg_s->evm_3ss_sum[0] / dbg_s->rssi_3ss_cnt);1492dbg_avg->evm_3ss_avg[1] = (u8)(dbg_s->evm_3ss_sum[1] / dbg_s->rssi_3ss_cnt);1493dbg_avg->evm_3ss_avg[2] = (u8)(dbg_s->evm_3ss_sum[2] / dbg_s->rssi_3ss_cnt);14941495dbg_avg->snr_3ss_avg[0] = (u8)(dbg_s->snr_3ss_sum[0] / dbg_s->rssi_3ss_cnt);1496dbg_avg->snr_3ss_avg[1] = (u8)(dbg_s->snr_3ss_sum[1] / dbg_s->rssi_3ss_cnt);1497dbg_avg->snr_3ss_avg[2] = (u8)(dbg_s->snr_3ss_sum[2] / dbg_s->rssi_3ss_cnt);1498}14991500RT_SPRINTF(buf, DBGM_CLI_BUF_SIZE, "\r\n * 3-ss Cnt= ((%d)) RSSI:{%d, %d, %d} EVM:{%d, %d, %d} SNR:{%d, %d, %d}",1501dbg_s->rssi_3ss_cnt, dbg_avg->rssi_3ss_avg[0],1502dbg_avg->rssi_3ss_avg[1], dbg_avg->rssi_3ss_avg[2],1503dbg_avg->evm_3ss_avg[0], dbg_avg->evm_3ss_avg[1],1504dbg_avg->evm_3ss_avg[2], dbg_avg->snr_3ss_avg[0],1505dbg_avg->snr_3ss_avg[1], dbg_avg->snr_3ss_avg[2]);1506RT_PRINT(buf);1507}1508#endif15091510#if (defined(PHYDM_COMPILE_ABOVE_4SS))1511if (dm->support_ic_type & PHYDM_IC_ABOVE_4SS) {1512if (dbg_s->rssi_4ss_cnt != 0) {1513dbg_avg->rssi_4ss_avg[0] = (u8)(dbg_s->rssi_4ss_sum[0] / dbg_s->rssi_4ss_cnt);1514dbg_avg->rssi_4ss_avg[1] = (u8)(dbg_s->rssi_4ss_sum[1] / dbg_s->rssi_4ss_cnt);1515dbg_avg->rssi_4ss_avg[2] = (u8)(dbg_s->rssi_4ss_sum[2] / dbg_s->rssi_4ss_cnt);1516dbg_avg->rssi_4ss_avg[3] = (u8)(dbg_s->rssi_4ss_sum[3] / dbg_s->rssi_4ss_cnt);15171518dbg_avg->evm_4ss_avg[0] = (u8)(dbg_s->evm_4ss_sum[0] / dbg_s->rssi_4ss_cnt);1519dbg_avg->evm_4ss_avg[1] = (u8)(dbg_s->evm_4ss_sum[1] / dbg_s->rssi_4ss_cnt);1520dbg_avg->evm_4ss_avg[2] = (u8)(dbg_s->evm_4ss_sum[2] / dbg_s->rssi_4ss_cnt);1521dbg_avg->evm_4ss_avg[3] = (u8)(dbg_s->evm_4ss_sum[3] / dbg_s->rssi_4ss_cnt);15221523dbg_avg->snr_4ss_avg[0] = (u8)(dbg_s->snr_4ss_sum[0] / dbg_s->rssi_4ss_cnt);1524dbg_avg->snr_4ss_avg[1] = (u8)(dbg_s->snr_4ss_sum[1] / dbg_s->rssi_4ss_cnt);1525dbg_avg->snr_4ss_avg[2] = (u8)(dbg_s->snr_4ss_sum[2] / dbg_s->rssi_4ss_cnt);1526dbg_avg->snr_4ss_avg[3] = (u8)(dbg_s->snr_4ss_sum[3] / dbg_s->rssi_4ss_cnt);1527}15281529RT_SPRINTF(buf, DBGM_CLI_BUF_SIZE, "\r\n * 4-ss Cnt= ((%d)) RSSI:{%d, %d, %d, %d} EVM:{%d, %d, %d, %d} SNR:{%d, %d, %d, %d}",1530dbg_s->rssi_4ss_cnt, dbg_avg->rssi_4ss_avg[0],1531dbg_avg->rssi_4ss_avg[1], dbg_avg->rssi_4ss_avg[2],1532dbg_avg->rssi_4ss_avg[3], dbg_avg->evm_4ss_avg[0],1533dbg_avg->evm_4ss_avg[1], dbg_avg->evm_4ss_avg[2],1534dbg_avg->evm_4ss_avg[3], dbg_avg->snr_4ss_avg[0],1535dbg_avg->snr_4ss_avg[1], dbg_avg->snr_4ss_avg[2],1536dbg_avg->snr_4ss_avg[3]);1537RT_PRINT(buf);1538}1539#endif1540#endif1541phydm_reset_phystatus_statistic(dm);1542/*@----------------------------------------------------------*/15431544/*Print TX rate*/1545for (macid = 0; macid < ODM_ASSOCIATE_ENTRY_NUM; macid++) {1546entry = dm->phydm_sta_info[macid];15471548if (is_sta_active(entry)) {1549phydm_print_rate_2_buff(dm, entry->ra_info.curr_tx_rate, dbg_buf, PHYDM_SNPRINT_SIZE);1550RT_SPRINTF(buf, DBGM_CLI_BUF_SIZE, "\r\n TxRate[%d]=%s (0x%x)", macid, dbg_buf, entry->ra_info.curr_tx_rate);1551RT_PRINT(buf);1552target_macid = macid;1553break;1554}1555}15561557RT_SPRINTF(buf, DBGM_CLI_BUF_SIZE,1558"\r\n TP {Tx, Rx, Total} = {%d, %d, %d}Mbps, Traffic_Load=(%d))",1559dm->tx_tp, dm->rx_tp, dm->total_tp, dm->traffic_load);1560RT_PRINT(buf);15611562RT_SPRINTF(buf, DBGM_CLI_BUF_SIZE, "\r\n CFO_avg=((%d kHz)), CFO_traking = ((%s%d))",1563cfo_t->CFO_ave_pre,1564((cfo_t->crystal_cap > cfo_t->def_x_cap) ? "+" : "-"),1565DIFF_2(cfo_t->crystal_cap, cfo_t->def_x_cap));1566RT_PRINT(buf);15671568/* @Condition number */1569#if (RTL8822B_SUPPORT)1570if (dm->support_ic_type == ODM_RTL8822B) {1571RT_SPRINTF(buf, DBGM_CLI_BUF_SIZE, "\r\n Condi_Num=((%d.%.4d))",1572dm->phy_dbg_info.condi_num >> 4,1573phydm_show_fraction_num(dm->phy_dbg_info.condi_num & 0xf, 4));1574RT_PRINT(buf);1575}1576#endif15771578#if (ODM_PHY_STATUS_NEW_TYPE_SUPPORT || defined(PHYSTS_3RD_TYPE_SUPPORT))1579/*STBC or LDPC pkt*/1580if (dm->support_ic_type & (PHYSTS_2ND_TYPE_IC |1581PHYSTS_3RD_TYPE_IC))1582RT_SPRINTF(buf, DBGM_CLI_BUF_SIZE, "\r\n Coding: LDPC=((%s)), STBC=((%s))",1583(dm->phy_dbg_info.is_ldpc_pkt) ? "Y" : "N",1584(dm->phy_dbg_info.is_stbc_pkt) ? "Y" : "N");1585RT_PRINT(buf);1586#endif15871588} else {1589RT_SPRINTF(buf, DBGM_CLI_BUF_SIZE, "\r\n No Link !!!");1590RT_PRINT(buf);1591}15921593RT_SPRINTF(buf, DBGM_CLI_BUF_SIZE, "\r\n [CCA Cnt] {CCK, OFDM, Total} = {%d, %d, %d}",1594fa_t->cnt_cck_cca, fa_t->cnt_ofdm_cca, fa_t->cnt_cca_all);1595RT_PRINT(buf);15961597RT_SPRINTF(buf, DBGM_CLI_BUF_SIZE, "\r\n [FA Cnt] {CCK, OFDM, Total} = {%d, %d, %d}",1598fa_t->cnt_cck_fail, fa_t->cnt_ofdm_fail, fa_t->cnt_all);1599RT_PRINT(buf);16001601#if (ODM_IC_11N_SERIES_SUPPORT)1602if (dm->support_ic_type & ODM_IC_11N_SERIES) {1603RT_SPRINTF(buf, DBGM_CLI_BUF_SIZE,1604"\r\n [OFDM FA Detail] Parity_Fail=%d, Rate_Illegal=%d, CRC8=%d, MCS_fail=%d, Fast_sync=%d, SB_Search_fail=%d",1605fa_t->cnt_parity_fail, fa_t->cnt_rate_illegal,1606fa_t->cnt_crc8_fail, fa_t->cnt_mcs_fail,1607fa_t->cnt_fast_fsync, fa_t->cnt_sb_search_fail);1608RT_PRINT(buf);1609}1610#endif1611RT_SPRINTF(buf, DBGM_CLI_BUF_SIZE,1612"\r\n is_linked = %d, Num_client = %d, rssi_min = %d, IGI = 0x%x, bNoisy=%d\n",1613dm->is_linked, dm->number_linked_client, dm->rssi_min,1614dm->dm_dig_table.cur_ig_value, dm->noisy_decision);1615RT_PRINT(buf);16161617phydm_dm_summary_cli_win(dm, buf, target_macid);1618}16191620#ifdef CONFIG_PHYDM_DEBUG_FUNCTION1621void phydm_sbd_check(1622struct dm_struct *dm)1623{1624static u32 pkt_cnt;1625static boolean sbd_state;1626u32 sym_count, count, value32;16271628if (sbd_state == 0) {1629pkt_cnt++;1630/*read SBD conter once every 5 packets*/1631if (pkt_cnt % 5 == 0) {1632odm_set_timer(dm, &dm->sbdcnt_timer, 0); /*@ms*/1633sbd_state = 1;1634}1635} else { /*read counter*/1636value32 = odm_get_bb_reg(dm, R_0xf98, MASKDWORD);1637sym_count = (value32 & 0x7C000000) >> 26;1638count = (value32 & 0x3F00000) >> 20;1639pr_debug("#SBD# sym_count %d count %d\n", sym_count, count);1640sbd_state = 0;1641}1642}1643#endif16441645void phydm_sbd_callback(1646struct phydm_timer_list *timer)1647{1648#ifdef CONFIG_PHYDM_DEBUG_FUNCTION1649void *adapter = timer->Adapter;1650HAL_DATA_TYPE *hal_data = GET_HAL_DATA((PADAPTER)adapter);1651struct dm_struct *dm = &hal_data->DM_OutSrc;16521653#if USE_WORKITEM1654odm_schedule_work_item(&dm->sbdcnt_workitem);1655#else1656phydm_sbd_check(dm);1657#endif1658#endif1659}16601661void phydm_sbd_workitem_callback(1662void *context)1663{1664#ifdef CONFIG_PHYDM_DEBUG_FUNCTION1665void *adapter = (void *)context;1666HAL_DATA_TYPE *hal_data = GET_HAL_DATA((PADAPTER)adapter);1667struct dm_struct *dm = &hal_data->DM_OutSrc;16681669phydm_sbd_check(dm);1670#endif1671}1672#endif16731674void phydm_reset_rx_rate_distribution(struct dm_struct *dm)1675{1676struct odm_phy_dbg_info *dbg = &dm->phy_dbg_info;16771678odm_memory_set(dm, &dbg->num_qry_legacy_pkt[0], 0,1679(LEGACY_RATE_NUM * 2));1680odm_memory_set(dm, &dbg->num_qry_ht_pkt[0], 0,1681(HT_RATE_NUM * 2));1682odm_memory_set(dm, &dbg->num_qry_pkt_sc_20m[0], 0,1683(LOW_BW_RATE_NUM * 2));16841685dbg->ht_pkt_not_zero = false;1686dbg->low_bw_20_occur = false;16871688#if (ODM_IC_11AC_SERIES_SUPPORT || defined(PHYDM_IC_JGR3_SERIES_SUPPORT))1689odm_memory_set(dm, &dbg->num_qry_vht_pkt[0], 0, VHT_RATE_NUM * 2);1690odm_memory_set(dm, &dbg->num_qry_pkt_sc_40m[0], 0, LOW_BW_RATE_NUM * 2);1691#if (ODM_PHY_STATUS_NEW_TYPE_SUPPORT == 1) || (defined(PHYSTS_3RD_TYPE_SUPPORT))1692odm_memory_set(dm, &dbg->num_mu_vht_pkt[0], 0, VHT_RATE_NUM * 2);1693#endif1694dbg->vht_pkt_not_zero = false;1695dbg->low_bw_40_occur = false;1696#endif1697}16981699void phydm_rx_rate_distribution(void *dm_void)1700{1701struct dm_struct *dm = (struct dm_struct *)dm_void;1702struct odm_phy_dbg_info *dbg = &dm->phy_dbg_info;1703u8 i = 0;1704u8 rate_num = dm->num_rf_path, ss_ofst = 0;17051706PHYDM_DBG(dm, DBG_CMN, "[RxRate Cnt] =============>\n");17071708/*@======CCK=========================================================*/1709if (*dm->channel <= 14) {1710PHYDM_DBG(dm, DBG_CMN, "* CCK = {%d, %d, %d, %d}\n",1711dbg->num_qry_legacy_pkt[0],1712dbg->num_qry_legacy_pkt[1],1713dbg->num_qry_legacy_pkt[2],1714dbg->num_qry_legacy_pkt[3]);1715}1716/*@======OFDM========================================================*/1717PHYDM_DBG(dm, DBG_CMN, "* OFDM = {%d, %d, %d, %d, %d, %d, %d, %d}\n",1718dbg->num_qry_legacy_pkt[4], dbg->num_qry_legacy_pkt[5],1719dbg->num_qry_legacy_pkt[6], dbg->num_qry_legacy_pkt[7],1720dbg->num_qry_legacy_pkt[8], dbg->num_qry_legacy_pkt[9],1721dbg->num_qry_legacy_pkt[10], dbg->num_qry_legacy_pkt[11]);17221723/*@======HT==========================================================*/1724if (dbg->ht_pkt_not_zero) {1725for (i = 0; i < rate_num; i++) {1726ss_ofst = (i << 3);17271728PHYDM_DBG(dm, DBG_CMN,1729"* HT MCS[%d :%d ] = {%d, %d, %d, %d, %d, %d, %d, %d}\n",1730(ss_ofst), (ss_ofst + 7),1731dbg->num_qry_ht_pkt[ss_ofst + 0],1732dbg->num_qry_ht_pkt[ss_ofst + 1],1733dbg->num_qry_ht_pkt[ss_ofst + 2],1734dbg->num_qry_ht_pkt[ss_ofst + 3],1735dbg->num_qry_ht_pkt[ss_ofst + 4],1736dbg->num_qry_ht_pkt[ss_ofst + 5],1737dbg->num_qry_ht_pkt[ss_ofst + 6],1738dbg->num_qry_ht_pkt[ss_ofst + 7]);1739}17401741if (dbg->low_bw_20_occur) {1742for (i = 0; i < rate_num; i++) {1743ss_ofst = (i << 3);17441745PHYDM_DBG(dm, DBG_CMN,1746"* [Low BW 20M] HT MCS[%d :%d ] = {%d, %d, %d, %d, %d, %d, %d, %d}\n",1747(ss_ofst), (ss_ofst + 7),1748dbg->num_qry_pkt_sc_20m[ss_ofst + 0],1749dbg->num_qry_pkt_sc_20m[ss_ofst + 1],1750dbg->num_qry_pkt_sc_20m[ss_ofst + 2],1751dbg->num_qry_pkt_sc_20m[ss_ofst + 3],1752dbg->num_qry_pkt_sc_20m[ss_ofst + 4],1753dbg->num_qry_pkt_sc_20m[ss_ofst + 5],1754dbg->num_qry_pkt_sc_20m[ss_ofst + 6],1755dbg->num_qry_pkt_sc_20m[ss_ofst + 7]);1756}1757}1758}17591760#if (ODM_IC_11AC_SERIES_SUPPORT || defined(PHYDM_IC_JGR3_SERIES_SUPPORT))1761/*@======VHT==========================================================*/1762if (dbg->vht_pkt_not_zero) {1763for (i = 0; i < rate_num; i++) {1764ss_ofst = 10 * i;17651766PHYDM_DBG(dm, DBG_CMN,1767"* VHT-%d ss MCS[0:9] = {%d, %d, %d, %d, %d, %d, %d, %d, %d, %d}\n",1768(i + 1),1769dbg->num_qry_vht_pkt[ss_ofst + 0],1770dbg->num_qry_vht_pkt[ss_ofst + 1],1771dbg->num_qry_vht_pkt[ss_ofst + 2],1772dbg->num_qry_vht_pkt[ss_ofst + 3],1773dbg->num_qry_vht_pkt[ss_ofst + 4],1774dbg->num_qry_vht_pkt[ss_ofst + 5],1775dbg->num_qry_vht_pkt[ss_ofst + 6],1776dbg->num_qry_vht_pkt[ss_ofst + 7],1777dbg->num_qry_vht_pkt[ss_ofst + 8],1778dbg->num_qry_vht_pkt[ss_ofst + 9]);1779}17801781if (dbg->low_bw_20_occur) {1782for (i = 0; i < rate_num; i++) {1783ss_ofst = 10 * i;17841785PHYDM_DBG(dm, DBG_CMN,1786"*[Low BW 20M] VHT-%d ss MCS[0:9] = {%d, %d, %d, %d, %d, %d, %d, %d, %d, %d}\n",1787(i + 1),1788dbg->num_qry_pkt_sc_20m[ss_ofst + 0],1789dbg->num_qry_pkt_sc_20m[ss_ofst + 1],1790dbg->num_qry_pkt_sc_20m[ss_ofst + 2],1791dbg->num_qry_pkt_sc_20m[ss_ofst + 3],1792dbg->num_qry_pkt_sc_20m[ss_ofst + 4],1793dbg->num_qry_pkt_sc_20m[ss_ofst + 5],1794dbg->num_qry_pkt_sc_20m[ss_ofst + 6],1795dbg->num_qry_pkt_sc_20m[ss_ofst + 7],1796dbg->num_qry_pkt_sc_20m[ss_ofst + 8],1797dbg->num_qry_pkt_sc_20m[ss_ofst + 9]);1798}1799}18001801if (dbg->low_bw_40_occur) {1802for (i = 0; i < rate_num; i++) {1803ss_ofst = 10 * i;18041805PHYDM_DBG(dm, DBG_CMN,1806"*[Low BW 40M] VHT-%d ss MCS[0:9] = {%d, %d, %d, %d, %d, %d, %d, %d, %d, %d}\n",1807(i + 1),1808dbg->num_qry_pkt_sc_40m[ss_ofst + 0],1809dbg->num_qry_pkt_sc_40m[ss_ofst + 1],1810dbg->num_qry_pkt_sc_40m[ss_ofst + 2],1811dbg->num_qry_pkt_sc_40m[ss_ofst + 3],1812dbg->num_qry_pkt_sc_40m[ss_ofst + 4],1813dbg->num_qry_pkt_sc_40m[ss_ofst + 5],1814dbg->num_qry_pkt_sc_40m[ss_ofst + 6],1815dbg->num_qry_pkt_sc_40m[ss_ofst + 7],1816dbg->num_qry_pkt_sc_40m[ss_ofst + 8],1817dbg->num_qry_pkt_sc_40m[ss_ofst + 9]);1818}1819}1820}1821#endif1822}18231824u16 phydm_rx_utility(void *dm_void, u16 avg_phy_rate, u8 rx_max_ss,1825enum channel_width bw)1826{1827struct dm_struct *dm = (struct dm_struct *)dm_void;1828struct odm_phy_dbg_info *dbg = &dm->phy_dbg_info;1829u16 utility_primitive = 0, utility = 0;18301831if (dbg->ht_pkt_not_zero) {1832/*@ MCS7 20M: tp = 65, 1000/65 = 15.38, 65*15.5 = 1007*/1833utility_primitive = avg_phy_rate * 15 + (avg_phy_rate >> 1);1834}1835#if (ODM_IC_11AC_SERIES_SUPPORT || defined(PHYDM_IC_JGR3_SERIES_SUPPORT))1836else if (dbg->vht_pkt_not_zero) {1837/*@ VHT 1SS MCS9(fake) 20M: tp = 90, 1000/90 = 11.11, 65*11.125 = 1001*/1838utility_primitive = avg_phy_rate * 11 + (avg_phy_rate >> 3);1839}1840#endif1841else {1842/*@ 54M, 1000/54 = 18.5, 54*18.5 = 999*/1843utility_primitive = avg_phy_rate * 18 + (avg_phy_rate >> 1);1844}18451846utility = (utility_primitive / rx_max_ss) >> bw;18471848if (utility > 1000)1849utility = 1000;18501851return utility;1852}18531854u16 phydm_rx_avg_phy_rate(void *dm_void)1855{1856struct dm_struct *dm = (struct dm_struct *)dm_void;1857struct odm_phy_dbg_info *dbg = &dm->phy_dbg_info;1858u8 i = 0, rate_num = 0, rate_base = 0;1859u16 rate = 0, avg_phy_rate = 0;1860u32 pkt_cnt = 0, phy_rate_sum = 0;18611862if (dbg->ht_pkt_not_zero) {1863rate_num = HT_RATE_NUM;1864rate_base = ODM_RATEMCS0;1865for (i = 0; i < rate_num; i++) {1866rate = phy_rate_table[i + rate_base] << *dm->band_width;1867phy_rate_sum += dbg->num_qry_ht_pkt[i] * rate;1868pkt_cnt += dbg->num_qry_ht_pkt[i];1869}1870}1871#if (ODM_IC_11AC_SERIES_SUPPORT || defined(PHYDM_IC_JGR3_SERIES_SUPPORT))1872else if (dbg->vht_pkt_not_zero) {1873rate_num = VHT_RATE_NUM;1874rate_base = ODM_RATEVHTSS1MCS0;1875for (i = 0; i < rate_num; i++) {1876rate = phy_rate_table[i + rate_base] << *dm->band_width;1877phy_rate_sum += dbg->num_qry_vht_pkt[i] * rate;1878pkt_cnt += dbg->num_qry_vht_pkt[i];1879}1880}1881#endif1882else {1883for (i = ODM_RATE1M; i <= ODM_RATE54M; i++) {1884/*SKIP 1M & 6M for beacon case*/1885if (*dm->channel < 36 && i == ODM_RATE1M)1886continue;18871888if (*dm->channel >= 36 && i == ODM_RATE6M)1889continue;18901891rate = phy_rate_table[i];1892phy_rate_sum += dbg->num_qry_legacy_pkt[i] * rate;1893pkt_cnt += dbg->num_qry_legacy_pkt[i];1894}1895}18961897#if (ODM_IC_11AC_SERIES_SUPPORT || defined(PHYDM_IC_JGR3_SERIES_SUPPORT))1898if (dbg->low_bw_40_occur) {1899for (i = 0; i < LOW_BW_RATE_NUM; i++) {1900rate = phy_rate_table[i + rate_base]1901<< CHANNEL_WIDTH_40;1902phy_rate_sum += dbg->num_qry_pkt_sc_40m[i] * rate;1903pkt_cnt += dbg->num_qry_pkt_sc_40m[i];1904}1905}1906#endif19071908if (dbg->low_bw_20_occur) {1909for (i = 0; i < LOW_BW_RATE_NUM; i++) {1910rate = phy_rate_table[i + rate_base];1911phy_rate_sum += dbg->num_qry_pkt_sc_20m[i] * rate;1912pkt_cnt += dbg->num_qry_pkt_sc_20m[i];1913}1914}19151916avg_phy_rate = (pkt_cnt == 0) ? 0 : (u16)(phy_rate_sum / pkt_cnt);19171918return avg_phy_rate;1919}19201921void phydm_print_hist_2_buf(void *dm_void, u16 *val, u16 len, char *buf,1922u16 buf_size)1923{1924struct dm_struct *dm = (struct dm_struct *)dm_void;19251926if (len == PHY_HIST_SIZE) {1927PHYDM_SNPRINTF(buf, buf_size,1928"[%.2d, %.2d, %.2d, %.2d, %.2d, %.2d, %.2d, %.2d, %.2d, %.2d, %.2d, %.2d]",1929val[0], val[1], val[2], val[3], val[4],1930val[5], val[6], val[7], val[8], val[9],1931val[10], val[11]);1932} else if (len == (PHY_HIST_SIZE - 1)) {1933PHYDM_SNPRINTF(buf, buf_size,1934"[%.2d, %.2d, %.2d, %.2d, %.2d, %.2d, %.2d, %.2d, %.2d, %.2d, %.2d]",1935val[0], val[1], val[2], val[3], val[4],1936val[5], val[6], val[7], val[8], val[9],1937val[10]);1938}1939}19401941void phydm_nss_hitogram(void *dm_void, enum PDM_RATE_TYPE rate_type)1942{1943struct dm_struct *dm = (struct dm_struct *)dm_void;1944struct odm_phy_dbg_info *dbg_i = &dm->phy_dbg_info;1945struct phydm_phystatus_statistic *dbg_s = &dbg_i->physts_statistic_info;1946char buf[PHYDM_SNPRINT_SIZE] = {0};1947u16 buf_size = PHYDM_SNPRINT_SIZE;1948u16 h_size = PHY_HIST_SIZE;1949u16 *evm_hist = &dbg_s->evm_1ss_hist[0];1950u16 *snr_hist = &dbg_s->snr_1ss_hist[0];1951u8 i = 0;1952u8 ss = phydm_rate_type_2_num_ss(dm, rate_type);19531954for (i = 0; i < ss; i++) {1955if (rate_type == PDM_1SS) {1956evm_hist = &dbg_s->evm_1ss_hist[0];1957snr_hist = &dbg_s->snr_1ss_hist[0];1958} else if (rate_type == PDM_2SS) {1959#if (defined(PHYDM_COMPILE_ABOVE_2SS))1960evm_hist = &dbg_s->evm_2ss_hist[i][0];1961snr_hist = &dbg_s->snr_2ss_hist[i][0];1962#endif1963} else if (rate_type == PDM_3SS) {1964#if (defined(PHYDM_COMPILE_ABOVE_3SS))1965evm_hist = &dbg_s->evm_3ss_hist[i][0];1966snr_hist = &dbg_s->snr_3ss_hist[i][0];1967#endif1968} else if (rate_type == PDM_4SS) {1969#if (defined(PHYDM_COMPILE_ABOVE_4SS))1970evm_hist = &dbg_s->evm_4ss_hist[i][0];1971snr_hist = &dbg_s->snr_4ss_hist[i][0];1972#endif1973}19741975phydm_print_hist_2_buf(dm, evm_hist, h_size, buf, buf_size);1976PHYDM_DBG(dm, DBG_CMN, "[%d-SS][EVM][%d]=%s\n", ss, i, buf);1977phydm_print_hist_2_buf(dm, snr_hist, h_size, buf, buf_size);1978PHYDM_DBG(dm, DBG_CMN, "[%d-SS][SNR][%d]=%s\n", ss, i, buf);1979}1980}19811982#ifdef PHYDM_PHYSTAUS_AUTO_SWITCH1983void phydm_show_cn_hitogram(void *dm_void)1984{1985struct dm_struct *dm = (struct dm_struct *)dm_void;1986struct odm_phy_dbg_info *dbg_i = &dm->phy_dbg_info;1987struct phydm_phystatus_statistic *dbg_s = &dbg_i->physts_statistic_info;1988u16 th_tmp[PHY_HIST_TH_SIZE];1989char buf[PHYDM_SNPRINT_SIZE] = {0};1990u8 i = 0;1991u16 *cn_hist = NULL;1992u32 cn_avg = 0;19931994if (!dm->pkt_proc_struct.physts_auto_swch_en)1995return;19961997if (dm->num_rf_path == 1)1998return;19992000PHYDM_DBG(dm, DBG_CMN, "[Condition number Histogram] ========>\n");2001/*@===[Threshold]=============================================================*/2002for (i = 0; i < PHY_HIST_TH_SIZE; i++)2003th_tmp[i] = dbg_i->cn_hist_th[i] >> 1;20042005phydm_print_hist_2_buf(dm, th_tmp,2006PHY_HIST_TH_SIZE, buf, PHYDM_SNPRINT_SIZE);2007PHYDM_DBG(dm, DBG_CMN, "%-22s=%s\n", "[CN_TH]", buf);20082009/*@===[Histogram]=============================================================*/20102011for (i = 1; i <= dm->num_rf_path; i++) {2012if (dbg_s->p4_cnt[i] == 0)2013continue;20142015cn_avg = PHYDM_DIV((dbg_s->cn_sum[i] + (dbg_s->p4_cnt[i] >> 1)),2016dbg_s->p4_cnt[i]);2017cn_hist = &dbg_s->cn_hist[i][0];2018phydm_print_hist_2_buf(dm, cn_hist,2019PHY_HIST_SIZE, buf, PHYDM_SNPRINT_SIZE);2020PHYDM_DBG(dm, DBG_CMN, "[%d-SS]%s=(avg:%d.%d)%s\n",2021i + 1, "[CN]", cn_avg >> 1, (cn_avg & 0x1) * 5, buf);2022}2023}2024#endif20252026void phydm_show_phy_hitogram(void *dm_void)2027{2028struct dm_struct *dm = (struct dm_struct *)dm_void;2029struct odm_phy_dbg_info *dbg_i = &dm->phy_dbg_info;2030struct phydm_phystatus_statistic *dbg_s = &dbg_i->physts_statistic_info;2031char buf[PHYDM_SNPRINT_SIZE] = {0};2032u16 buf_size = PHYDM_SNPRINT_SIZE;2033u16 th_size = PHY_HIST_SIZE - 1;2034u8 i = 0;20352036PHYDM_DBG(dm, DBG_CMN, "[PHY Histogram] ==============>\n");2037/*@===[Threshold]=============================================================*/2038phydm_print_hist_2_buf(dm, dbg_i->evm_hist_th, th_size, buf, buf_size);2039PHYDM_DBG(dm, DBG_CMN, "%-16s=%s\n", "[EVM_TH]", buf);20402041phydm_print_hist_2_buf(dm, dbg_i->snr_hist_th, th_size, buf, buf_size);2042PHYDM_DBG(dm, DBG_CMN, "%-16s=%s\n", "[SNR_TH]", buf);2043/*@===[OFDM]==================================================================*/2044if (dbg_s->rssi_ofdm_cnt) {2045phydm_print_hist_2_buf(dm, dbg_s->evm_ofdm_hist, PHY_HIST_SIZE,2046buf, buf_size);2047PHYDM_DBG(dm, DBG_CMN, "%-14s=%s\n", "[OFDM][EVM]", buf);20482049phydm_print_hist_2_buf(dm, dbg_s->snr_ofdm_hist, PHY_HIST_SIZE,2050buf, buf_size);2051PHYDM_DBG(dm, DBG_CMN, "%-14s=%s\n", "[OFDM][SNR]", buf);2052}2053/*@===[1-SS]==================================================================*/2054if (dbg_s->rssi_1ss_cnt)2055phydm_nss_hitogram(dm, PDM_1SS);2056/*@===[2-SS]==================================================================*/2057#if (defined(PHYDM_COMPILE_ABOVE_2SS))2058if ((dm->support_ic_type & PHYDM_IC_ABOVE_2SS) && dbg_s->rssi_2ss_cnt)2059phydm_nss_hitogram(dm, PDM_2SS);2060#endif2061/*@===[3-SS]==================================================================*/2062#if (defined(PHYDM_COMPILE_ABOVE_3SS))2063if ((dm->support_ic_type & PHYDM_IC_ABOVE_3SS) && dbg_s->rssi_3ss_cnt)2064phydm_nss_hitogram(dm, PDM_3SS);2065#endif2066/*@===[4-SS]==================================================================*/2067#if (defined(PHYDM_COMPILE_ABOVE_4SS))2068if (dm->support_ic_type & PHYDM_IC_ABOVE_4SS && dbg_s->rssi_4ss_cnt)2069phydm_nss_hitogram(dm, PDM_4SS);2070#endif2071}20722073void phydm_avg_phy_val_nss(void *dm_void, u8 nss)2074{2075struct dm_struct *dm = (struct dm_struct *)dm_void;2076struct odm_phy_dbg_info *dbg_i = &dm->phy_dbg_info;2077struct phydm_phystatus_statistic *dbg_s = &dbg_i->physts_statistic_info;2078struct phydm_phystatus_avg *dbg_avg = &dbg_i->phystatus_statistic_avg;2079char *rate_type = NULL;2080u32 *tmp_cnt = NULL;2081u8 *tmp_rssi_avg = NULL;2082u32 *tmp_rssi_sum = NULL;2083u8 *tmp_snr_avg = NULL;2084u32 *tmp_snr_sum = NULL;2085u8 *tmp_evm_avg = NULL;2086u32 *tmp_evm_sum = NULL;2087u8 evm_rpt_show[RF_PATH_MEM_SIZE];2088u8 i = 0;20892090odm_memory_set(dm, &evm_rpt_show[0], 0, RF_PATH_MEM_SIZE);20912092switch (nss) {2093#if (defined(PHYDM_COMPILE_ABOVE_4SS))2094case 4:2095rate_type = "[4-SS]";2096tmp_cnt = &dbg_s->rssi_4ss_cnt;2097tmp_rssi_avg = &dbg_avg->rssi_4ss_avg[0];2098tmp_snr_avg = &dbg_avg->snr_4ss_avg[0];2099tmp_rssi_sum = &dbg_s->rssi_4ss_sum[0];2100tmp_snr_sum = &dbg_s->snr_4ss_sum[0];2101tmp_evm_avg = &dbg_avg->evm_4ss_avg[0];2102tmp_evm_sum = &dbg_s->evm_4ss_sum[0];2103break;2104#endif2105#if (defined(PHYDM_COMPILE_ABOVE_3SS))2106case 3:2107rate_type = "[3-SS]";2108tmp_cnt = &dbg_s->rssi_3ss_cnt;2109tmp_rssi_avg = &dbg_avg->rssi_3ss_avg[0];2110tmp_snr_avg = &dbg_avg->snr_3ss_avg[0];2111tmp_rssi_sum = &dbg_s->rssi_3ss_sum[0];2112tmp_snr_sum = &dbg_s->snr_3ss_sum[0];2113tmp_evm_avg = &dbg_avg->evm_3ss_avg[0];2114tmp_evm_sum = &dbg_s->evm_3ss_sum[0];2115break;2116#endif2117#if (defined(PHYDM_COMPILE_ABOVE_2SS))2118case 2:2119rate_type = "[2-SS]";2120tmp_cnt = &dbg_s->rssi_2ss_cnt;2121tmp_rssi_avg = &dbg_avg->rssi_2ss_avg[0];2122tmp_snr_avg = &dbg_avg->snr_2ss_avg[0];2123tmp_rssi_sum = &dbg_s->rssi_2ss_sum[0];2124tmp_snr_sum = &dbg_s->snr_2ss_sum[0];2125tmp_evm_avg = &dbg_avg->evm_2ss_avg[0];2126tmp_evm_sum = &dbg_s->evm_2ss_sum[0];2127break;2128#endif2129case 1:2130rate_type = "[1-SS]";2131tmp_cnt = &dbg_s->rssi_1ss_cnt;2132tmp_rssi_avg = &dbg_avg->rssi_1ss_avg[0];2133tmp_snr_avg = &dbg_avg->snr_1ss_avg[0];2134tmp_rssi_sum = &dbg_s->rssi_1ss_sum[0];2135tmp_snr_sum = &dbg_s->snr_1ss_sum[0];2136tmp_evm_avg = &dbg_avg->evm_1ss_avg;2137tmp_evm_sum = &dbg_s->evm_1ss_sum;2138break;2139case 0:2140rate_type = "[L-OFDM]";2141tmp_cnt = &dbg_s->rssi_ofdm_cnt;2142tmp_rssi_avg = &dbg_avg->rssi_ofdm_avg[0];2143tmp_snr_avg = &dbg_avg->snr_ofdm_avg[0];2144tmp_rssi_sum = &dbg_s->rssi_ofdm_sum[0];2145tmp_snr_sum = &dbg_s->snr_ofdm_sum[0];2146tmp_evm_avg = &dbg_avg->evm_ofdm_avg;2147tmp_evm_sum = &dbg_s->evm_ofdm_sum;2148break;2149default:2150PHYDM_DBG(dm, DBG_CMN, "[warning] %s\n", __func__);2151return;2152}21532154if (*tmp_cnt != 0) {2155for (i = 0; i < dm->num_rf_path; i++) {2156tmp_rssi_avg[i] = (u8)(tmp_rssi_sum[i] / *tmp_cnt);2157tmp_snr_avg[i] = (u8)(tmp_snr_sum[i] / *tmp_cnt);2158}21592160if (nss == 0 || nss == 1) {2161*tmp_evm_avg = (u8)(*tmp_evm_sum / *tmp_cnt);2162evm_rpt_show[0] = *tmp_evm_avg;2163} else {2164for (i = 0; i < nss; i++) {2165tmp_evm_avg[i] = (u8)(tmp_evm_sum[i] /2166*tmp_cnt);2167evm_rpt_show[i] = tmp_evm_avg[i];2168}2169}2170}21712172#if (defined(PHYDM_COMPILE_ABOVE_4SS))2173PHYDM_DBG(dm, DBG_CMN,2174"* %-8s Cnt=((%.3d)) RSSI:{%.2d, %.2d, %.2d, %.2d} SNR:{%.2d, %.2d, %.2d, %.2d} EVM:{-%.2d, -%.2d, -%.2d, -%.2d}\n",2175rate_type, *tmp_cnt,2176tmp_rssi_avg[0], tmp_rssi_avg[1], tmp_rssi_avg[2],2177tmp_rssi_avg[3], tmp_snr_avg[0], tmp_snr_avg[1],2178tmp_snr_avg[2], tmp_snr_avg[3], evm_rpt_show[0],2179evm_rpt_show[1], evm_rpt_show[2], evm_rpt_show[3]);2180#elif (defined(PHYDM_COMPILE_ABOVE_3SS))2181PHYDM_DBG(dm, DBG_CMN,2182"* %-8s Cnt=((%.3d)) RSSI:{%.2d, %.2d, %.2d} SNR:{%.2d, %.2d, %.2d} EVM:{-%.2d, -%.2d, -%.2d}\n",2183rate_type, *tmp_cnt,2184tmp_rssi_avg[0], tmp_rssi_avg[1], tmp_rssi_avg[2],2185tmp_snr_avg[0], tmp_snr_avg[1], tmp_snr_avg[2],2186evm_rpt_show[0], evm_rpt_show[1], evm_rpt_show[2]);2187#elif (defined(PHYDM_COMPILE_ABOVE_2SS))2188PHYDM_DBG(dm, DBG_CMN,2189"* %-8s Cnt= ((%.3d)) RSSI:{%.2d, %.2d} SNR:{%.2d, %.2d} EVM:{-%.2d, -%.2d}\n",2190rate_type, *tmp_cnt,2191tmp_rssi_avg[0], tmp_rssi_avg[1],2192tmp_snr_avg[0], tmp_snr_avg[1],2193evm_rpt_show[0], evm_rpt_show[1]);2194#else2195PHYDM_DBG(dm, DBG_CMN,2196"* %-8s Cnt= ((%.3d)) RSSI:{%.2d} SNR:{%.2d} EVM:{-%.2d}\n",2197rate_type, *tmp_cnt,2198tmp_rssi_avg[0], tmp_snr_avg[0], evm_rpt_show[0]);2199#endif2200}22012202void phydm_get_avg_phystatus_val(void *dm_void)2203{2204struct dm_struct *dm = (struct dm_struct *)dm_void;2205struct odm_phy_dbg_info *dbg_i = &dm->phy_dbg_info;2206struct phydm_phystatus_statistic *dbg_s = &dbg_i->physts_statistic_info;2207struct phydm_phystatus_avg *dbg_avg = &dbg_i->phystatus_statistic_avg;2208u32 avg_tmp = 0;2209u8 i = 0;22102211PHYDM_DBG(dm, DBG_CMN, "[PHY Avg] ==============>\n");2212phydm_reset_phystatus_avg(dm);22132214/*@===[Beacon]===*/2215if (dbg_s->rssi_beacon_cnt) {2216for (i = 0; i < dm->num_rf_path; i++) {2217avg_tmp = dbg_s->rssi_beacon_sum[i] /2218dbg_s->rssi_beacon_cnt;2219dbg_avg->rssi_beacon_avg[i] = (u8)avg_tmp;2220}2221}22222223switch (dm->num_rf_path) {2224#if (defined(PHYDM_COMPILE_ABOVE_4SS))2225case 4:2226PHYDM_DBG(dm, DBG_CMN,2227"* %-8s Cnt=((%.3d)) RSSI:{%.2d, %.2d, %.2d, %.2d}\n",2228"[Beacon]", dbg_s->rssi_beacon_cnt,2229dbg_avg->rssi_beacon_avg[0],2230dbg_avg->rssi_beacon_avg[1],2231dbg_avg->rssi_beacon_avg[2],2232dbg_avg->rssi_beacon_avg[3]);2233break;2234#endif2235#if (defined(PHYDM_COMPILE_ABOVE_3SS))2236case 3:2237PHYDM_DBG(dm, DBG_CMN,2238"* %-8s Cnt=((%.3d)) RSSI:{%.2d, %.2d, %.2d}\n",2239"[Beacon]", dbg_s->rssi_beacon_cnt,2240dbg_avg->rssi_beacon_avg[0],2241dbg_avg->rssi_beacon_avg[1],2242dbg_avg->rssi_beacon_avg[2]);2243break;2244#endif2245#if (defined(PHYDM_COMPILE_ABOVE_2SS))2246case 2:2247PHYDM_DBG(dm, DBG_CMN,2248"* %-8s Cnt=((%.3d)) RSSI:{%.2d, %.2d}\n",2249"[Beacon]", dbg_s->rssi_beacon_cnt,2250dbg_avg->rssi_beacon_avg[0],2251dbg_avg->rssi_beacon_avg[1]);2252break;2253#endif2254PHYDM_DBG(dm, DBG_CMN, "* %-8s Cnt=((%.3d)) RSSI:{%.2d}\n",2255"[Beacon]", dbg_s->rssi_beacon_cnt,2256dbg_avg->rssi_beacon_avg[0]);2257break;2258}22592260/*@===[CCK]===*/2261if (dbg_s->rssi_cck_cnt) {2262dbg_avg->rssi_cck_avg = (u8)(dbg_s->rssi_cck_sum /2263dbg_s->rssi_cck_cnt);2264#ifdef PHYSTS_3RD_TYPE_SUPPORT2265if (dm->support_ic_type & PHYSTS_3RD_TYPE_IC) {2266for (i = 0; i < dm->num_rf_path - 1; i++) {2267avg_tmp = dbg_s->rssi_cck_sum_abv_2ss[i] /2268dbg_s->rssi_cck_cnt;2269dbg_avg->rssi_cck_avg_abv_2ss[i] = (u8)avg_tmp;2270}2271}2272#endif2273}22742275switch (dm->num_rf_path) {2276#ifdef PHYSTS_3RD_TYPE_SUPPORT2277#if (defined(PHYDM_COMPILE_ABOVE_4SS))2278case 4:2279PHYDM_DBG(dm, DBG_CMN,2280"* %-8s Cnt=((%.3d)) RSSI:{%.2d, %.2d, %.2d, %.2d}\n",2281"[CCK]", dbg_s->rssi_cck_cnt, dbg_avg->rssi_cck_avg,2282dbg_avg->rssi_cck_avg_abv_2ss[0],2283dbg_avg->rssi_cck_avg_abv_2ss[1],2284dbg_avg->rssi_cck_avg_abv_2ss[2]);2285break;2286#endif2287#if (defined(PHYDM_COMPILE_ABOVE_3SS))2288case 3:2289PHYDM_DBG(dm, DBG_CMN,2290"* %-8s Cnt=((%.3d)) RSSI:{%.2d, %.2d, %.2d}\n",2291"[CCK]", dbg_s->rssi_cck_cnt, dbg_avg->rssi_cck_avg,2292dbg_avg->rssi_cck_avg_abv_2ss[0],2293dbg_avg->rssi_cck_avg_abv_2ss[1]);2294break;2295#endif2296#if (defined(PHYDM_COMPILE_ABOVE_2SS))2297case 2:2298PHYDM_DBG(dm, DBG_CMN,2299"* %-8s Cnt=((%.3d)) RSSI:{%.2d, %.2d}\n",2300"[CCK]", dbg_s->rssi_cck_cnt, dbg_avg->rssi_cck_avg,2301dbg_avg->rssi_cck_avg_abv_2ss[0]);2302break;2303#endif2304#endif2305default:2306PHYDM_DBG(dm, DBG_CMN, "* %-8s Cnt=((%.3d)) RSSI:{%.2d}\n",2307"[CCK]", dbg_s->rssi_cck_cnt, dbg_avg->rssi_cck_avg);2308break;2309}23102311#if 12312for (i = 0; i <= dm->num_rf_path; i++)2313phydm_avg_phy_val_nss(dm, i);2314#else2315/*@===[OFDM]===*/2316phydm_avg_phy_val_nss(dm, 0);2317/*@===[1-SS]===*/2318phydm_avg_phy_val_nss(dm, 1);2319/*@===[2-SS]===*/2320#if (defined(PHYDM_COMPILE_ABOVE_2SS))2321if (dm->support_ic_type & (PHYDM_IC_ABOVE_2SS))2322phydm_avg_phy_val_nss(dm, 2);2323#endif2324/*@===[3-SS]===*/2325#if (defined(PHYDM_COMPILE_ABOVE_3SS))2326if (dm->support_ic_type & (PHYDM_IC_ABOVE_3SS))2327phydm_avg_phy_val_nss(dm, 3);2328#endif2329/*@===[4-SS]===*/2330#if (defined(PHYDM_COMPILE_ABOVE_4SS))2331if (dm->support_ic_type & PHYDM_IC_ABOVE_4SS)2332phydm_avg_phy_val_nss(dm, 4);2333#endif2334#endif2335}23362337void phydm_get_phy_statistic(void *dm_void)2338{2339struct dm_struct *dm = (struct dm_struct *)dm_void;2340struct cmn_sta_info *sta = dm->phydm_sta_info[dm->one_entry_macid];2341enum channel_width bw;2342u16 avg_phy_rate = 0;2343u16 utility = 0;2344u8 rx_ss = 1;23452346avg_phy_rate = phydm_rx_avg_phy_rate(dm);23472348if (dm->is_one_entry_only && is_sta_active(sta)) {2349rx_ss = phydm_get_rx_stream_num(dm, sta->mimo_type);2350bw = sta->bw_mode;2351utility = phydm_rx_utility(dm, avg_phy_rate, rx_ss, bw);2352}2353PHYDM_DBG(dm, DBG_CMN, "Avg_rx_rate = %d, rx_utility=( %d / 1000 )\n",2354avg_phy_rate, utility);23552356phydm_rx_rate_distribution(dm);2357phydm_reset_rx_rate_distribution(dm);23582359phydm_show_phy_hitogram(dm);2360#ifdef PHYDM_PHYSTAUS_AUTO_SWITCH2361phydm_show_cn_hitogram(dm);2362#endif2363phydm_get_avg_phystatus_val(dm);2364phydm_reset_phystatus_statistic(dm);2365};23662367void phydm_basic_dbg_msg_linked(void *dm_void)2368{2369struct dm_struct *dm = (struct dm_struct *)dm_void;2370struct phydm_cfo_track_struct *cfo_t = &dm->dm_cfo_track;2371struct odm_phy_dbg_info *dbg_t = &dm->phy_dbg_info;2372u16 macid, client_cnt = 0;2373u8 rate = 0;2374struct cmn_sta_info *entry = NULL;2375char dbg_buf[PHYDM_SNPRINT_SIZE] = {0};2376struct phydm_cfo_rpt cfo;2377u8 i = 0;23782379PHYDM_DBG(dm, DBG_CMN, "ID=((%d)), BW=((%d)), fc=((CH-%d))\n",2380dm->curr_station_id, 20 << *dm->band_width, *dm->channel);23812382#ifdef ODM_IC_11N_SERIES_SUPPORT2383#ifdef PHYDM_PRIMARY_CCA2384if (((*dm->channel <= 14) && (*dm->band_width == CHANNEL_WIDTH_40)) &&2385(dm->support_ic_type & ODM_IC_11N_SERIES)) {2386PHYDM_DBG(dm, DBG_CMN, "Primary CCA at ((%s SB))\n",2387((*dm->sec_ch_offset == SECOND_CH_AT_LSB) ? "U" :2388"L"));2389}2390#endif2391#endif23922393if (dm->cck_new_agc || dm->rx_rate > ODM_RATE11M) {2394PHYDM_DBG(dm, DBG_CMN, "[AGC Idx] {0x%x, 0x%x, 0x%x, 0x%x}\n",2395dm->ofdm_agc_idx[0], dm->ofdm_agc_idx[1],2396dm->ofdm_agc_idx[2], dm->ofdm_agc_idx[3]);2397} else {2398PHYDM_DBG(dm, DBG_CMN, "[CCK AGC Idx] {LNA,VGA}={0x%x, 0x%x}\n",2399dm->cck_lna_idx, dm->cck_vga_idx);2400}24012402phydm_print_rate_2_buff(dm, dm->rx_rate, dbg_buf, PHYDM_SNPRINT_SIZE);2403PHYDM_DBG(dm, DBG_CMN, "RSSI:{%d, %d, %d, %d}, RxRate:%s (0x%x)\n",2404(dm->rssi_a == 0xff) ? 0 : dm->rssi_a,2405(dm->rssi_b == 0xff) ? 0 : dm->rssi_b,2406(dm->rssi_c == 0xff) ? 0 : dm->rssi_c,2407(dm->rssi_d == 0xff) ? 0 : dm->rssi_d,2408dbg_buf, dm->rx_rate);24092410rate = dbg_t->beacon_phy_rate;2411phydm_print_rate_2_buff(dm, rate, dbg_buf, PHYDM_SNPRINT_SIZE);24122413PHYDM_DBG(dm, DBG_CMN, "Beacon_cnt=%d, rate_idx=%s (0x%x)\n",2414dbg_t->num_qry_beacon_pkt, dbg_buf, dbg_t->beacon_phy_rate);24152416phydm_get_phy_statistic(dm);24172418PHYDM_DBG(dm, DBG_CMN,2419"rxsc_idx {Legacy, 20, 40, 80} = {%d, %d, %d, %d}\n",2420dm->rxsc_l, dm->rxsc_20, dm->rxsc_40, dm->rxsc_80);24212422/*Print TX rate*/2423for (macid = 0; macid < ODM_ASSOCIATE_ENTRY_NUM; macid++) {2424entry = dm->phydm_sta_info[macid];24252426if (!is_sta_active(entry))2427continue;24282429rate = entry->ra_info.curr_tx_rate;2430phydm_print_rate_2_buff(dm, rate, dbg_buf, PHYDM_SNPRINT_SIZE);2431PHYDM_DBG(dm, DBG_CMN, "TxRate[%d]=%s (0x%x)\n",2432macid, dbg_buf, entry->ra_info.curr_tx_rate);24332434client_cnt++;24352436if (client_cnt >= dm->number_linked_client)2437break;2438}24392440PHYDM_DBG(dm, DBG_CMN,2441"TP {Tx, Rx, Total} = {%d, %d, %d}Mbps, Traffic_Load=(%d))\n",2442dm->tx_tp, dm->rx_tp, dm->total_tp, dm->traffic_load);24432444PHYDM_DBG(dm, DBG_CMN, "CFO_avg=((%d kHz)), CFO_traking = ((%s%d))\n",2445cfo_t->CFO_ave_pre,2446((cfo_t->crystal_cap > cfo_t->def_x_cap) ? "+" : "-"),2447DIFF_2(cfo_t->crystal_cap, cfo_t->def_x_cap));24482449/* @CFO report */2450switch (dm->ic_ip_series) {2451#ifdef PHYDM_IC_JGR3_SERIES_SUPPORT2452case PHYDM_IC_JGR3:2453PHYDM_DBG(dm, DBG_CMN, "cfo_tail = {%d, %d, %d, %d}\n",2454dbg_t->cfo_tail[0], dbg_t->cfo_tail[1],2455dbg_t->cfo_tail[2], dbg_t->cfo_tail[3]);2456break;2457#endif2458default:2459phydm_get_cfo_info(dm, &cfo);2460for (i = 0; i < dm->num_rf_path; i++) {2461PHYDM_DBG(dm, DBG_CMN,2462"CFO[%d] {S, L, Sec, Acq, End} = {%d, %d, %d, %d, %d}\n",2463i, cfo.cfo_rpt_s[i], cfo.cfo_rpt_l[i],2464cfo.cfo_rpt_sec[i], cfo.cfo_rpt_acq[i],2465cfo.cfo_rpt_end[i]);2466}2467break;2468}24692470/* @Condition number */2471#if (RTL8822B_SUPPORT)2472if (dm->support_ic_type == ODM_RTL8822B) {2473PHYDM_DBG(dm, DBG_CMN, "Condi_Num=((%d.%.4d)), %d\n",2474dbg_t->condi_num >> 4,2475phydm_show_fraction_num(dbg_t->condi_num & 0xf, 4),2476dbg_t->condi_num);2477}2478#endif2479#ifdef PHYSTS_3RD_TYPE_SUPPORT2480if (dm->support_ic_type & PHYSTS_3RD_TYPE_IC) {2481PHYDM_DBG(dm, DBG_CMN, "Condi_Num=((%d.%4d dB))\n",2482dbg_t->condi_num >> 1,2483phydm_show_fraction_num(dbg_t->condi_num & 0x1, 1));2484}2485#endif24862487#if (ODM_PHY_STATUS_NEW_TYPE_SUPPORT || defined(PHYSTS_3RD_TYPE_SUPPORT))2488/*STBC or LDPC pkt*/2489if (dm->support_ic_type & (PHYSTS_2ND_TYPE_IC | PHYSTS_3RD_TYPE_IC))2490PHYDM_DBG(dm, DBG_CMN, "Coding: LDPC=((%s)), STBC=((%s))\n",2491(dbg_t->is_ldpc_pkt) ? "Y" : "N",2492(dbg_t->is_stbc_pkt) ? "Y" : "N");2493#endif2494}24952496void phydm_dm_summary(void *dm_void, u8 macid)2497{2498struct dm_struct *dm = (struct dm_struct *)dm_void;2499struct phydm_dig_struct *dig_t = &dm->dm_dig_table;2500struct phydm_cfo_track_struct *cfo_t = &dm->dm_cfo_track;2501struct cmn_sta_info *sta = NULL;2502struct ra_sta_info *ra = NULL;2503struct dtp_info *dtp = NULL;2504u64 comp = dm->support_ability;2505u64 pause_comp = dm->pause_ability;25062507if (!(dm->debug_components & DBG_DM_SUMMARY))2508return;25092510if (!dm->is_linked) {2511pr_debug("[%s]No Link !!!\n", __func__);2512return;2513}25142515sta = dm->phydm_sta_info[macid];25162517if (!is_sta_active(sta)) {2518pr_debug("[Warning] %s invalid STA, macid=%d\n",2519__func__, macid);2520return;2521}25222523ra = &sta->ra_info;2524dtp = &sta->dtp_stat;2525pr_debug("[%s]===========>\n", __func__);25262527pr_debug("00.(%s) %-12s: IGI=0x%x, Dyn_Rng=0x%x~0x%x, FA_th={%d,%d,%d}\n",2528((comp & ODM_BB_DIG) ?2529((pause_comp & ODM_BB_DIG) ? "P" : "V") : "."),2530"DIG",2531dig_t->cur_ig_value,2532dig_t->rx_gain_range_min, dig_t->rx_gain_range_max,2533dig_t->fa_th[0], dig_t->fa_th[1], dig_t->fa_th[2]);25342535pr_debug("01.(%s) %-12s: rssi_lv=%d, mask=0x%llx\n",2536((comp & ODM_BB_RA_MASK) ?2537((pause_comp & ODM_BB_RA_MASK) ? "P" : "V") : "."),2538"RaMask",2539ra->rssi_level, ra->ramask);25402541#ifdef CONFIG_DYNAMIC_TX_TWR2542pr_debug("02.(%s) %-12s: pwr_lv=%d\n",2543((comp & ODM_BB_DYNAMIC_TXPWR) ?2544((pause_comp & ODM_BB_DYNAMIC_TXPWR) ? "P" : "V") : "."),2545"DynTxPwr",2546dtp->sta_tx_high_power_lvl);2547#endif25482549pr_debug("05.(%s) %-12s: cck_pd_lv=%d\n",2550((comp & ODM_BB_CCK_PD) ?2551((pause_comp & ODM_BB_CCK_PD) ? "P" : "V") : "."),2552"CCK_PD", dm->dm_cckpd_table.cck_pd_lv);25532554#ifdef CONFIG_PHYDM_ANTENNA_DIVERSITY2555pr_debug("06.(%s) %-12s: div_type=%d, curr_ant=%s\n",2556((comp & ODM_BB_ANT_DIV) ?2557((pause_comp & ODM_BB_ANT_DIV) ? "P" : "V") : "."),2558"ANT_DIV",2559dm->ant_div_type,2560(dm->dm_fat_table.rx_idle_ant == MAIN_ANT) ? "MAIN" : "AUX");2561#endif25622563#ifdef PHYDM_POWER_TRAINING_SUPPORT2564pr_debug("08.(%s) %-12s: PT_score=%d, disable_PT=%d\n",2565((comp & ODM_BB_PWR_TRAIN) ?2566((pause_comp & ODM_BB_PWR_TRAIN) ? "P" : "V") : "."),2567"PwrTrain",2568dm->pow_train_table.pow_train_score,2569dm->is_disable_power_training);2570#endif25712572#ifdef CONFIG_PHYDM_DFS_MASTER2573pr_debug("11.(%s) %-12s: dbg_mode=%d, region_domain=%d\n",2574((comp & ODM_BB_DFS) ?2575((pause_comp & ODM_BB_DFS) ? "P" : "V") : "."),2576"DFS",2577dm->dfs.dbg_mode, dm->dfs_region_domain);2578#endif2579#ifdef PHYDM_SUPPORT_ADAPTIVITY2580pr_debug("13.(%s) %-12s: th{l2h, h2l}={%d, %d}, edcca_flag=%d\n",2581((comp & ODM_BB_ADAPTIVITY) ?2582((pause_comp & ODM_BB_ADAPTIVITY) ? "P" : "V") : "."),2583"Adaptivity",2584dm->adaptivity.th_l2h, dm->adaptivity.th_h2l,2585dm->false_alm_cnt.edcca_flag);2586#endif2587pr_debug("14.(%s) %-12s: CFO_avg=%d kHz, CFO_traking=%s%d\n",2588((comp & ODM_BB_CFO_TRACKING) ?2589((pause_comp & ODM_BB_CFO_TRACKING) ? "P" : "V") : "."),2590"CfoTrack",2591cfo_t->CFO_ave_pre,2592((cfo_t->crystal_cap > cfo_t->def_x_cap) ? "+" : "-"),2593DIFF_2(cfo_t->crystal_cap, cfo_t->def_x_cap));25942595pr_debug("15.(%s) %-12s: ratio{nhm, clm}={%d, %d}\n",2596((comp & ODM_BB_ENV_MONITOR) ?2597((pause_comp & ODM_BB_ENV_MONITOR) ? "P" : "V") : "."),2598"EnvMntr",2599dm->dm_ccx_info.nhm_ratio, dm->dm_ccx_info.clm_ratio);26002601#ifdef PHYDM_PRIMARY_CCA2602pr_debug("16.(%s) %-12s: CCA @ (%s SB)\n",2603((comp & ODM_BB_PRIMARY_CCA) ?2604((pause_comp & ODM_BB_PRIMARY_CCA) ? "P" : "V") : "."),2605"PriCCA",2606((dm->dm_pri_cca.mf_state == MF_USC_LSC) ? "D" :2607((dm->dm_pri_cca.mf_state == MF_LSC) ? "L" : "U")));2608#endif2609#ifdef CONFIG_ADAPTIVE_SOML2610pr_debug("17.(%s) %-12s: soml_en = %s\n",2611((comp & ODM_BB_ADAPTIVE_SOML) ?2612((pause_comp & ODM_BB_ADAPTIVE_SOML) ? "P" : "V") : "."),2613"A-SOML",2614(dm->dm_soml_table.soml_last_state == SOML_ON) ?2615"ON" : "OFF");2616#endif2617#ifdef PHYDM_LNA_SAT_CHK_SUPPORT2618pr_debug("18.(%s) %-12s:\n",2619((comp & ODM_BB_LNA_SAT_CHK) ?2620((pause_comp & ODM_BB_LNA_SAT_CHK) ? "P" : "V") : "."),2621"LNA_SAT_CHK");2622#endif2623}26242625void phydm_basic_dbg_message(void *dm_void)2626{2627struct dm_struct *dm = (struct dm_struct *)dm_void;2628struct phydm_fa_struct *fa_t = &dm->false_alm_cnt;2629#ifdef NHM_SUPPORT2630struct ccx_info *ccx = &dm->dm_ccx_info;2631u8 nhm_valid = 0;2632#endif26332634if (!(dm->debug_components & DBG_CMN))2635return;263626372638if (dm->cmn_dbg_msg_cnt >= dm->cmn_dbg_msg_period) {2639dm->cmn_dbg_msg_cnt = PHYDM_WATCH_DOG_PERIOD;2640} else {2641dm->cmn_dbg_msg_cnt += PHYDM_WATCH_DOG_PERIOD;2642return;2643}26442645PHYDM_DBG(dm, DBG_CMN, "[%s] System up time: ((%d sec))---->\n",2646__func__, dm->phydm_sys_up_time);26472648if (dm->is_linked)2649phydm_basic_dbg_msg_linked(dm);2650else2651PHYDM_DBG(dm, DBG_CMN, "No Link !!!\n");26522653PHYDM_DBG(dm, DBG_CMN, "[CCA Cnt] {CCK, OFDM, Total} = {%d, %d, %d}\n",2654fa_t->cnt_cck_cca, fa_t->cnt_ofdm_cca, fa_t->cnt_cca_all);26552656PHYDM_DBG(dm, DBG_CMN, "[FA Cnt] {CCK, OFDM, Total} = {%d, %d, %d}\n",2657fa_t->cnt_cck_fail, fa_t->cnt_ofdm_fail, fa_t->cnt_all);26582659PHYDM_DBG(dm, DBG_CMN,2660"[OFDM FA Detail] Parity_Fail=%d, Rate_Illegal=%d, CRC8=%d, MCS_fail=%d, Fast_sync=%d, SB_Search_fail=%d\n",2661fa_t->cnt_parity_fail, fa_t->cnt_rate_illegal,2662fa_t->cnt_crc8_fail, fa_t->cnt_mcs_fail,2663fa_t->cnt_fast_fsync, fa_t->cnt_sb_search_fail);26642665#if (ODM_IC_11AC_SERIES_SUPPORT || defined(PHYDM_IC_JGR3_SERIES_SUPPORT))2666if (dm->support_ic_type & (ODM_IC_11AC_SERIES | ODM_IC_JGR3_SERIES)) {2667PHYDM_DBG(dm, DBG_CMN,2668"[OFDM FA Detail VHT] CRC8_VHT-SIGA=%d, CRC8_VHT-SIGB=%d, MCS_Fail_VHT=%d\n",2669fa_t->cnt_crc8_fail_vhta, fa_t->cnt_crc8_fail_vhtb,2670fa_t->cnt_mcs_fail_vht);2671}2672#endif2673PHYDM_DBG(dm, DBG_CMN,2674"is_linked = %d, Num_client = %d, rssi_min = %d, IGI = 0x%x, bNoisy=%d\n",2675dm->is_linked, dm->number_linked_client, dm->rssi_min,2676dm->dm_dig_table.cur_ig_value, dm->noisy_decision);26772678#ifdef NHM_SUPPORT2679if (dm->support_ability & ODM_BB_ENV_MONITOR) {2680nhm_valid = (ccx->nhm_noise_pwr_point * 100) >> 8;26812682PHYDM_DBG(dm, DBG_CMN,2683"[NHM] valid: %d percent, noise(RSSI) = %d, nhm_r[11](RSSI > %d)= %d\n\n",2684nhm_valid, ccx->nhm_noise_pwr,2685NTH_TH_2_RSSI(ccx->nhm_th[NHM_TH_NUM - 1]),2686ccx->nhm_result[NHM_RPT_NUM - 1]);2687}2688#endif2689}26902691void phydm_basic_profile(void *dm_void, u32 *_used, char *output, u32 *_out_len)2692{2693#ifdef CONFIG_PHYDM_DEBUG_FUNCTION2694struct dm_struct *dm = (struct dm_struct *)dm_void;2695char *cut = NULL;2696char *ic_type = NULL;2697u32 used = *_used;2698u32 out_len = *_out_len;2699u32 date = 0;2700char *commit_by = NULL;2701u32 release_ver = 0;27022703PDM_SNPF(out_len, used, output + used, out_len - used, "%-35s\n",2704"% Basic Profile %");27052706if (dm->support_ic_type == ODM_RTL8188E) {2707#if (RTL8188E_SUPPORT)2708ic_type = "RTL8188E";2709date = RELEASE_DATE_8188E;2710commit_by = COMMIT_BY_8188E;2711release_ver = RELEASE_VERSION_8188E;2712#endif2713#if (RTL8812A_SUPPORT)2714} else if (dm->support_ic_type == ODM_RTL8812) {2715ic_type = "RTL8812A";2716date = RELEASE_DATE_8812A;2717commit_by = COMMIT_BY_8812A;2718release_ver = RELEASE_VERSION_8812A;2719#endif2720#if (RTL8821A_SUPPORT)2721} else if (dm->support_ic_type == ODM_RTL8821) {2722ic_type = "RTL8821A";2723date = RELEASE_DATE_8821A;2724commit_by = COMMIT_BY_8821A;2725release_ver = RELEASE_VERSION_8821A;2726#endif2727#if (RTL8192E_SUPPORT)2728} else if (dm->support_ic_type == ODM_RTL8192E) {2729ic_type = "RTL8192E";2730date = RELEASE_DATE_8192E;2731commit_by = COMMIT_BY_8192E;2732release_ver = RELEASE_VERSION_8192E;2733#endif2734#if (RTL8723B_SUPPORT)2735} else if (dm->support_ic_type == ODM_RTL8723B) {2736ic_type = "RTL8723B";2737date = RELEASE_DATE_8723B;2738commit_by = COMMIT_BY_8723B;2739release_ver = RELEASE_VERSION_8723B;2740#endif2741#if (RTL8814A_SUPPORT)2742} else if (dm->support_ic_type == ODM_RTL8814A) {2743ic_type = "RTL8814A";2744date = RELEASE_DATE_8814A;2745commit_by = COMMIT_BY_8814A;2746release_ver = RELEASE_VERSION_8814A;2747#endif2748#if (RTL8881A_SUPPORT)2749} else if (dm->support_ic_type == ODM_RTL8881A) {2750ic_type = "RTL8881A";2751#endif2752#if (RTL8822B_SUPPORT)2753} else if (dm->support_ic_type == ODM_RTL8822B) {2754ic_type = "RTL8822B";2755date = RELEASE_DATE_8822B;2756commit_by = COMMIT_BY_8822B;2757release_ver = RELEASE_VERSION_8822B;2758#endif2759#if (RTL8197F_SUPPORT)2760} else if (dm->support_ic_type == ODM_RTL8197F) {2761ic_type = "RTL8197F";2762date = RELEASE_DATE_8197F;2763commit_by = COMMIT_BY_8197F;2764release_ver = RELEASE_VERSION_8197F;2765#endif2766#if (RTL8703B_SUPPORT)2767} else if (dm->support_ic_type == ODM_RTL8703B) {2768ic_type = "RTL8703B";2769date = RELEASE_DATE_8703B;2770commit_by = COMMIT_BY_8703B;2771release_ver = RELEASE_VERSION_8703B;2772#endif2773#if (RTL8195A_SUPPORT)2774} else if (dm->support_ic_type == ODM_RTL8195A) {2775ic_type = "RTL8195A";2776#endif2777#if (RTL8188F_SUPPORT)2778} else if (dm->support_ic_type == ODM_RTL8188F) {2779ic_type = "RTL8188F";2780date = RELEASE_DATE_8188F;2781commit_by = COMMIT_BY_8188F;2782release_ver = RELEASE_VERSION_8188F;2783#endif2784#if (RTL8723D_SUPPORT)2785} else if (dm->support_ic_type == ODM_RTL8723D) {2786ic_type = "RTL8723D";2787date = RELEASE_DATE_8723D;2788commit_by = COMMIT_BY_8723D;2789release_ver = RELEASE_VERSION_8723D;2790#endif2791}27922793/* @JJ ADD 20161014 */2794#if (RTL8710B_SUPPORT)2795else if (dm->support_ic_type == ODM_RTL8710B) {2796ic_type = "RTL8710B";2797date = RELEASE_DATE_8710B;2798commit_by = COMMIT_BY_8710B;2799release_ver = RELEASE_VERSION_8710B;2800}2801#endif28022803#if (RTL8721D_SUPPORT)2804else if (dm->support_ic_type == ODM_RTL8721D) {2805ic_type = "RTL8721D";2806date = RELEASE_DATE_8721D;2807commit_by = COMMIT_BY_8721D;2808release_ver = RELEASE_VERSION_8721D;2809}2810#endif28112812#if (RTL8710C_SUPPORT)2813else if (dm->support_ic_type == ODM_RTL8710C) {2814ic_type = "RTL8710C";2815date = RELEASE_DATE_8710C;2816commit_by = COMMIT_BY_8710C;2817release_ver = RELEASE_VERSION_8710C;2818}2819#endif28202821#if (RTL8821C_SUPPORT)2822else if (dm->support_ic_type == ODM_RTL8821C) {2823ic_type = "RTL8821C";2824date = RELEASE_DATE_8821C;2825commit_by = COMMIT_BY_8821C;2826release_ver = RELEASE_VERSION_8821C;2827}2828#endif28292830/*@jj add 20170822*/2831#if (RTL8192F_SUPPORT)2832else if (dm->support_ic_type == ODM_RTL8192F) {2833ic_type = "RTL8192F";2834date = RELEASE_DATE_8192F;2835commit_by = COMMIT_BY_8192F;2836release_ver = RELEASE_VERSION_8192F;2837}2838#endif28392840#if (RTL8198F_SUPPORT)2841else if (dm->support_ic_type == ODM_RTL8198F) {2842ic_type = "RTL8198F";2843date = RELEASE_DATE_8198F;2844commit_by = COMMIT_BY_8198F;2845release_ver = RELEASE_VERSION_8198F;2846}2847#endif28482849#if (RTL8822C_SUPPORT)2850else if (dm->support_ic_type == ODM_RTL8822C) {2851ic_type = "RTL8822C";2852date = RELEASE_DATE_8822C;2853commit_by = COMMIT_BY_8822C;2854release_ver = RELEASE_VERSION_8822C;2855}2856#endif28572858#if (RTL8812F_SUPPORT)2859else if (dm->support_ic_type == ODM_RTL8812F) {2860ic_type = "RTL8812F";2861date = RELEASE_DATE_8812F;2862commit_by = COMMIT_BY_8812F;2863release_ver = RELEASE_VERSION_8812F;2864}2865#endif28662867#if (RTL8197G_SUPPORT)2868else if (dm->support_ic_type == ODM_RTL8197G) {2869ic_type = "RTL8197G";2870date = RELEASE_DATE_8197G;2871commit_by = COMMIT_BY_8197G;2872release_ver = RELEASE_VERSION_8197G;2873}2874#endif28752876#if (RTL8814B_SUPPORT)2877else if (dm->support_ic_type == ODM_RTL8814B) {2878ic_type = "RTL8814B";2879date = RELEASE_DATE_8814B;2880commit_by = COMMIT_BY_8814B;2881release_ver = RELEASE_VERSION_8814B;2882}2883#endif28842885PDM_SNPF(out_len, used, output + used, out_len - used,2886" %-35s: %s (MP Chip: %s)\n", "IC type", ic_type,2887dm->is_mp_chip ? "Yes" : "No");28882889if (dm->cut_version == ODM_CUT_A)2890cut = "A";2891else if (dm->cut_version == ODM_CUT_B)2892cut = "B";2893else if (dm->cut_version == ODM_CUT_C)2894cut = "C";2895else if (dm->cut_version == ODM_CUT_D)2896cut = "D";2897else if (dm->cut_version == ODM_CUT_E)2898cut = "E";2899else if (dm->cut_version == ODM_CUT_F)2900cut = "F";2901else if (dm->cut_version == ODM_CUT_G)2902cut = "G";2903else if (dm->cut_version == ODM_CUT_H)2904cut = "H";2905else if (dm->cut_version == ODM_CUT_I)2906cut = "I";2907else if (dm->cut_version == ODM_CUT_J)2908cut = "J";2909else if (dm->cut_version == ODM_CUT_K)2910cut = "K";2911else if (dm->cut_version == ODM_CUT_L)2912cut = "L";2913else if (dm->cut_version == ODM_CUT_M)2914cut = "M";2915else if (dm->cut_version == ODM_CUT_N)2916cut = "N";2917else if (dm->cut_version == ODM_CUT_O)2918cut = "O";2919else if (dm->cut_version == ODM_CUT_TEST)2920cut = "TEST";2921else2922cut = "UNKNOWN";29232924PDM_SNPF(out_len, used, output + used, out_len - used, " %-35s: %d\n",2925"RFE type", dm->rfe_type);2926PDM_SNPF(out_len, used, output + used, out_len - used, " %-35s: %s\n",2927"Cut Ver", cut);2928PDM_SNPF(out_len, used, output + used, out_len - used, " %-35s: %d\n",2929"PHY Para Ver", odm_get_hw_img_version(dm));2930PDM_SNPF(out_len, used, output + used, out_len - used, " %-35s: %d\n",2931"PHY Para Commit date", date);2932PDM_SNPF(out_len, used, output + used, out_len - used, " %-35s: %s\n",2933"PHY Para Commit by", commit_by);2934PDM_SNPF(out_len, used, output + used, out_len - used, " %-35s: %d\n",2935"PHY Para Release Ver", release_ver);29362937PDM_SNPF(out_len, used, output + used, out_len - used,2938" %-35s: %d (Subversion: %d)\n", "FW Ver", dm->fw_version,2939dm->fw_sub_version);29402941/* @1 PHY DM version List */2942PDM_SNPF(out_len, used, output + used, out_len - used, "%-35s\n",2943"% PHYDM version %");2944PDM_SNPF(out_len, used, output + used, out_len - used, " %-35s: %s\n",2945"Code base", PHYDM_CODE_BASE);2946PDM_SNPF(out_len, used, output + used, out_len - used, " %-35s: %s\n",2947"Release Date", PHYDM_RELEASE_DATE);2948PDM_SNPF(out_len, used, output + used, out_len - used, " %-35s: %s\n",2949"Adaptivity", ADAPTIVITY_VERSION);2950PDM_SNPF(out_len, used, output + used, out_len - used, " %-35s: %s\n",2951"DIG", DIG_VERSION);2952PDM_SNPF(out_len, used, output + used, out_len - used, " %-35s: %s\n",2953"CFO Tracking", CFO_TRACKING_VERSION);2954#ifdef CONFIG_PHYDM_ANTENNA_DIVERSITY2955PDM_SNPF(out_len, used, output + used, out_len - used, " %-35s: %s\n",2956"AntDiv", ANTDIV_VERSION);2957#endif2958#ifdef CONFIG_DYNAMIC_TX_TWR2959PDM_SNPF(out_len, used, output + used, out_len - used, " %-35s: %s\n",2960"Dynamic TxPower", DYNAMIC_TXPWR_VERSION);2961#endif2962PDM_SNPF(out_len, used, output + used, out_len - used, " %-35s: %s\n",2963"RA Info", RAINFO_VERSION);2964#if (DM_ODM_SUPPORT_TYPE & ODM_WIN)2965PDM_SNPF(out_len, used, output + used, out_len - used, " %-35s: %s\n",2966"AntDetect", ANTDECT_VERSION);2967#endif2968#ifdef CONFIG_PATH_DIVERSITY2969PDM_SNPF(out_len, used, output + used, out_len - used, " %-35s: %s\n",2970"PathDiv", PATHDIV_VERSION);2971#endif2972#ifdef CONFIG_ADAPTIVE_SOML2973PDM_SNPF(out_len, used, output + used, out_len - used, " %-35s: %s\n",2974"Adaptive SOML", ADAPTIVE_SOML_VERSION);2975#endif2976#if (PHYDM_LA_MODE_SUPPORT)2977PDM_SNPF(out_len, used, output + used, out_len - used, " %-35s: %s\n",2978"LA mode", DYNAMIC_LA_MODE);2979#endif2980#ifdef PHYDM_PRIMARY_CCA2981PDM_SNPF(out_len, used, output + used, out_len - used, " %-35s: %s\n",2982"Primary CCA", PRIMARYCCA_VERSION);2983#endif2984PDM_SNPF(out_len, used, output + used, out_len - used, " %-35s: %s\n",2985"DFS", DFS_VERSION);29862987#if (RTL8822B_SUPPORT)2988if (dm->support_ic_type & ODM_RTL8822B)2989PDM_SNPF(out_len, used, output + used, out_len - used,2990" %-35s: %s\n", "PHY config 8822B",2991PHY_CONFIG_VERSION_8822B);29922993#endif2994#if (RTL8197F_SUPPORT)2995if (dm->support_ic_type & ODM_RTL8197F)2996PDM_SNPF(out_len, used, output + used, out_len - used,2997" %-35s: %s\n", "PHY config 8197F",2998PHY_CONFIG_VERSION_8197F);2999#endif30003001/*@jj add 20170822*/3002#if (RTL8192F_SUPPORT)3003if (dm->support_ic_type & ODM_RTL8192F)3004PDM_SNPF(out_len, used, output + used, out_len - used,3005" %-35s: %s\n", "PHY config 8192F",3006PHY_CONFIG_VERSION_8192F);3007#endif3008#if (RTL8721D_SUPPORT)3009if (dm->support_ic_type & ODM_RTL8721D)3010PDM_SNPF(out_len, used, output + used, out_len - used,3011" %-35s: %s\n", "PHY config 8721D",3012PHY_CONFIG_VERSION_8721D);3013#endif30143015#if (RTL8710C_SUPPORT)3016if (dm->support_ic_type & ODM_RTL8710C)3017PDM_SNPF(out_len, used, output + used, out_len - used,3018" %-35s: %s\n", "PHY config 8710C",3019PHY_CONFIG_VERSION_8710C);3020#endif30213022*_used = used;3023*_out_len = out_len;30243025#endif /*@#if CONFIG_PHYDM_DEBUG_FUNCTION*/3026}30273028#ifdef CONFIG_PHYDM_DEBUG_FUNCTION3029void phydm_fw_trace_en_h2c(void *dm_void, boolean enable,3030u32 fw_dbg_comp, u32 monitor_mode, u32 macid)3031{3032struct dm_struct *dm = (struct dm_struct *)dm_void;3033u8 h2c_parameter[7] = {0};3034u8 cmd_length;30353036if (dm->support_ic_type & PHYDM_IC_3081_SERIES) {3037h2c_parameter[0] = enable;3038h2c_parameter[1] = (u8)(fw_dbg_comp & MASKBYTE0);3039h2c_parameter[2] = (u8)((fw_dbg_comp & MASKBYTE1) >> 8);3040h2c_parameter[3] = (u8)((fw_dbg_comp & MASKBYTE2) >> 16);3041h2c_parameter[4] = (u8)((fw_dbg_comp & MASKBYTE3) >> 24);3042h2c_parameter[5] = (u8)monitor_mode;3043h2c_parameter[6] = (u8)macid;3044cmd_length = 7;30453046} else {3047h2c_parameter[0] = enable;3048h2c_parameter[1] = (u8)monitor_mode;3049h2c_parameter[2] = (u8)macid;3050cmd_length = 3;3051}30523053PHYDM_DBG(dm, DBG_FW_TRACE,3054"[H2C] FW_debug_en: (( %d )), mode: (( %d )), macid: (( %d ))\n",3055enable, monitor_mode, macid);30563057odm_fill_h2c_cmd(dm, PHYDM_H2C_FW_TRACE_EN, cmd_length, h2c_parameter);3058}30593060void phydm_get_per_path_txagc(void *dm_void, u8 path, u32 *_used, char *output,3061u32 *_out_len)3062{3063struct dm_struct *dm = (struct dm_struct *)dm_void;3064u8 rate_idx = 0;3065u8 txagc = 0;3066u32 used = *_used;3067u32 out_len = *_out_len;30683069#ifdef PHYDM_COMMON_API_SUPPORT3070if (!(dm->support_ic_type & CMN_API_SUPPORT_IC))3071return;30723073if (dm->num_rf_path == 1 && path > RF_PATH_A)3074return;3075else if (dm->num_rf_path == 2 && path > RF_PATH_B)3076return;3077else if (dm->num_rf_path == 3 && path > RF_PATH_C)3078return;3079else if (dm->num_rf_path == 4 && path > RF_PATH_D)3080return;30813082for (rate_idx = 0; rate_idx <= 0x53; rate_idx++) {3083if (!(dm->support_ic_type & PHYDM_IC_ABOVE_3SS) &&3084((rate_idx >= ODM_RATEMCS16 &&3085rate_idx < ODM_RATEVHTSS1MCS0) ||3086rate_idx >= ODM_RATEVHTSS3MCS0))3087continue;30883089if (rate_idx == ODM_RATE1M)3090PDM_SNPF(out_len, used, output + used, out_len - used,3091" %-35s\n", "CCK====>");3092else if (rate_idx == ODM_RATE6M)3093PDM_SNPF(out_len, used, output + used, out_len - used,3094"\n %-35s\n", "OFDM====>");3095else if (rate_idx == ODM_RATEMCS0)3096PDM_SNPF(out_len, used, output + used, out_len - used,3097"\n %-35s\n", "HT 1ss====>");3098else if (rate_idx == ODM_RATEMCS8)3099PDM_SNPF(out_len, used, output + used, out_len - used,3100"\n %-35s\n", "HT 2ss====>");3101else if (rate_idx == ODM_RATEMCS16)3102PDM_SNPF(out_len, used, output + used, out_len - used,3103"\n %-35s\n", "HT 3ss====>");3104else if (rate_idx == ODM_RATEMCS24)3105PDM_SNPF(out_len, used, output + used, out_len - used,3106"\n %-35s\n", "HT 4ss====>");3107else if (rate_idx == ODM_RATEVHTSS1MCS0)3108PDM_SNPF(out_len, used, output + used, out_len - used,3109"\n %-35s\n", "VHT 1ss====>");3110else if (rate_idx == ODM_RATEVHTSS2MCS0)3111PDM_SNPF(out_len, used, output + used, out_len - used,3112"\n %-35s\n", "VHT 2ss====>");3113else if (rate_idx == ODM_RATEVHTSS3MCS0)3114PDM_SNPF(out_len, used, output + used, out_len - used,3115"\n %-35s\n", "VHT 3ss====>");3116else if (rate_idx == ODM_RATEVHTSS4MCS0)3117PDM_SNPF(out_len, used, output + used, out_len - used,3118"\n %-35s\n", "VHT 4ss====>");31193120txagc = phydm_api_get_txagc(dm, (enum rf_path)path, rate_idx);3121if (config_phydm_read_txagc_check(txagc))3122PDM_SNPF(out_len, used, output + used,3123out_len - used, " 0x%02x ", txagc);3124else3125PDM_SNPF(out_len, used, output + used,3126out_len - used, " 0x%s ", "xx");3127}3128#endif31293130*_used = used;3131*_out_len = out_len;3132}31333134void phydm_get_txagc(void *dm_void, u32 *_used, char *output, u32 *_out_len)3135{3136struct dm_struct *dm = (struct dm_struct *)dm_void;3137u32 used = *_used;3138u32 out_len = *_out_len;3139u8 i = 0;31403141#if (RTL8822C_SUPPORT)3142PDM_SNPF(out_len, used, output + used,3143out_len - used, "Disabled DPD rate mask: 0x%x\n",3144dm->dis_dpd_rate);3145#endif31463147for (i = RF_PATH_A; i < dm->num_rf_path; i++) {3148if (i == RF_PATH_A)3149PDM_SNPF(out_len, used, output + used, out_len - used,3150"%-35s\n", "path-A====================");3151else if (i == RF_PATH_B)3152PDM_SNPF(out_len, used, output + used, out_len - used,3153"\n%-35s\n", "path-B====================");3154else if (i == RF_PATH_C)3155PDM_SNPF(out_len, used, output + used, out_len - used,3156"\n%-35s\n", "path-C====================");3157else if (i == RF_PATH_D)3158PDM_SNPF(out_len, used, output + used, out_len - used,3159"\n%-35s\n", "path-D====================");31603161phydm_get_per_path_txagc(dm, i, &used, output, &out_len);3162}3163*_used = used;3164*_out_len = out_len;3165}31663167void phydm_set_txagc(void *dm_void, u32 *const val, u32 *_used,3168char *output, u32 *_out_len)3169{3170struct dm_struct *dm = (struct dm_struct *)dm_void;3171u32 used = *_used;3172u32 out_len = *_out_len;3173u8 i = 0;3174u32 pow = 0; /*power index*/3175u8 vht_start_rate = ODM_RATEVHTSS1MCS0;3176boolean rpt = true;3177enum rf_path path = RF_PATH_A;31783179/*@val[1] = path*/3180/*@val[2] = hw_rate*/3181/*@val[3] = power_index*/31823183#ifdef PHYDM_COMMON_API_SUPPORT3184if (!(dm->support_ic_type & CMN_API_SUPPORT_IC))3185return;31863187path = (enum rf_path)val[1];31883189if (val[1] >= dm->num_rf_path) {3190PDM_SNPF(out_len, used, output + used, out_len - used,3191"Write path-%d rate_idx-0x%x fail\n", val[1], val[2]);3192} else if ((u8)val[2] != 0xff) {3193if (phydm_api_set_txagc(dm, val[3], path, (u8)val[2], true))3194PDM_SNPF(out_len, used, output + used, out_len - used,3195"Write path-%d rate_idx-0x%x = 0x%x\n",3196val[1], val[2], val[3]);3197else3198PDM_SNPF(out_len, used, output + used, out_len - used,3199"Write path-%d rate index-0x%x fail\n",3200val[1], val[2]);3201} else {32023203if (dm->support_ic_type &3204(ODM_RTL8822B | ODM_RTL8821C | ODM_RTL8195B)) {3205pow = (val[3] & 0x3f);3206pow = BYTE_DUPLICATE_2_DWORD(pow);32073208for (i = 0; i < ODM_RATEVHTSS2MCS9; i += 4)3209rpt &= phydm_api_set_txagc(dm, pow, path, i, 0);3210} else if (dm->support_ic_type &3211(ODM_RTL8197F | ODM_RTL8192F)) {3212pow = (val[3] & 0x3f);3213for (i = 0; i <= ODM_RATEMCS15; i++)3214rpt &= phydm_api_set_txagc(dm, pow, path, i, 0);3215} else if (dm->support_ic_type & ODM_RTL8198F) {3216pow = (val[3] & 0x7f);3217for (i = 0; i <= ODM_RATEVHTSS4MCS9; i++)3218rpt &= phydm_api_set_txagc(dm, pow, path, i, 0);3219} else if (dm->support_ic_type &3220(ODM_RTL8822C | ODM_RTL8812F | ODM_RTL8197G)) {3221pow = (val[3] & 0x7f);3222for (i = 0; i <= ODM_RATEMCS15; i++)3223rpt &= phydm_api_set_txagc(dm, pow, path, i, 0);3224for (i = vht_start_rate; i <= ODM_RATEVHTSS2MCS9; i++)3225rpt &= phydm_api_set_txagc(dm, pow, path, i, 0);3226} else if (dm->support_ic_type &3227(ODM_RTL8721D | ODM_RTL8710C)) {3228pow = (val[3] & 0x3f);3229for (i = 0; i <= ODM_RATEMCS7; i++)3230rpt &= phydm_api_set_txagc(dm, pow, path, i, 0);3231}32323233if (rpt)3234PDM_SNPF(out_len, used, output + used, out_len - used,3235"Write all TXAGC of path-%d = 0x%x\n",3236val[1], val[3]);3237else3238PDM_SNPF(out_len, used, output + used, out_len - used,3239"Write all TXAGC of path-%d fail\n", val[1]);3240}32413242#endif3243*_used = used;3244*_out_len = out_len;3245}32463247void phydm_shift_txagc(void *dm_void, u32 *const val, u32 *_used, char *output,3248u32 *_out_len)3249{3250struct dm_struct *dm = (struct dm_struct *)dm_void;3251u32 used = *_used;3252u32 out_len = *_out_len;3253u8 i = 0;3254u32 pow = 0; /*Power index*/3255boolean rpt = true;3256u8 vht_start_rate = ODM_RATEVHTSS1MCS0;3257enum rf_path path = RF_PATH_A;32583259#ifdef PHYDM_COMMON_API_SUPPORT3260if (!(dm->support_ic_type & CMN_API_SUPPORT_IC))3261return;32623263if (val[1] >= dm->num_rf_path) {3264PDM_SNPF(out_len, used, output + used, out_len - used,3265"Write path-%d fail\n", val[1]);3266return;3267}32683269path = (enum rf_path)val[1];32703271if ((u8)val[2] == 0) {3272/*@{0:-, 1:+} {Pwr Offset}*/3273if (dm->support_ic_type & (ODM_RTL8195B | ODM_RTL8821C)) {3274for (i = 0; i <= ODM_RATEMCS7; i++) {3275pow = phydm_api_get_txagc(dm, path, i) - val[3];3276rpt &= phydm_api_set_txagc(dm, pow, path, i, 1);3277}3278for (i = vht_start_rate; i <= ODM_RATEVHTSS1MCS9; i++) {3279pow = phydm_api_get_txagc(dm, path, i) - val[3];3280rpt &= phydm_api_set_txagc(dm, pow, path, i, 1);3281}3282} else if (dm->support_ic_type & (ODM_RTL8822B)) {3283for (i = 0; i <= ODM_RATEMCS15; i++) {3284pow = phydm_api_get_txagc(dm, path, i) - val[3];3285rpt &= phydm_api_set_txagc(dm, pow, path, i, 1);3286}3287for (i = vht_start_rate; i <= ODM_RATEVHTSS2MCS9; i++) {3288pow = phydm_api_get_txagc(dm, path, i) - val[3];3289rpt &= phydm_api_set_txagc(dm, pow, path, i, 1);3290}3291} else if (dm->support_ic_type &3292(ODM_RTL8197F | ODM_RTL8192F)) {3293for (i = 0; i <= ODM_RATEMCS15; i++) {3294pow = phydm_api_get_txagc(dm, path, i) - val[3];3295rpt &= phydm_api_set_txagc(dm, pow, path, i, 1);3296}3297} else if (dm->support_ic_type & ODM_IC_JGR3_SERIES) {3298rpt &= phydm_api_shift_txagc(dm, val[3], path, 0);3299} else if (dm->support_ic_type &3300(ODM_RTL8721D | ODM_RTL8710C)) {3301for (i = 0; i <= ODM_RATEMCS7; i++) {3302pow = phydm_api_get_txagc(dm, path, i) - val[3];3303rpt &= phydm_api_set_txagc(dm, pow, path, i, 1);3304}3305}3306} else if ((u8)val[2] == 1) {3307/*@{0:-, 1:+} {Pwr Offset}*/3308if (dm->support_ic_type & (ODM_RTL8195B | ODM_RTL8821C)) {3309for (i = 0; i <= ODM_RATEMCS7; i++) {3310pow = phydm_api_get_txagc(dm, path, i) + val[3];3311rpt &= phydm_api_set_txagc(dm, pow, path, i, 1);3312}3313for (i = vht_start_rate; i <= ODM_RATEVHTSS1MCS9; i++) {3314pow = phydm_api_get_txagc(dm, path, i) + val[3];3315rpt &= phydm_api_set_txagc(dm, pow, path, i, 1);3316}3317} else if (dm->support_ic_type & (ODM_RTL8822B)) {3318for (i = 0; i <= ODM_RATEMCS15; i++) {3319pow = phydm_api_get_txagc(dm, path, i) + val[3];3320rpt &= phydm_api_set_txagc(dm, pow, path, i, 1);3321}3322for (i = vht_start_rate; i <= ODM_RATEVHTSS2MCS9; i++) {3323pow = phydm_api_get_txagc(dm, path, i) + val[3];3324rpt &= phydm_api_set_txagc(dm, pow, path, i, 1);3325}3326} else if (dm->support_ic_type &3327(ODM_RTL8197F | ODM_RTL8192F)) {3328for (i = 0; i <= ODM_RATEMCS15; i++) {3329pow = phydm_api_get_txagc(dm, path, i) + val[3];3330rpt &= phydm_api_set_txagc(dm, pow, path, i, 1);3331}3332} else if (dm->support_ic_type & (ODM_RTL8721D |3333ODM_RTL8710C)) {3334for (i = 0; i <= ODM_RATEMCS7; i++) {3335pow = phydm_api_get_txagc(dm, path, i) + val[3];3336rpt &= phydm_api_set_txagc(dm, pow, path, i, 1);3337}3338} else if (dm->support_ic_type &3339(ODM_RTL8822C | ODM_RTL8814B |3340ODM_RTL8812F | ODM_RTL8197G)) {3341rpt &= phydm_api_shift_txagc(dm, val[3], path, 1);3342}3343}3344#ifdef PHYDM_IC_JGR3_SERIES_SUPPORT3345if (dm->support_ic_type & ODM_IC_JGR3_SERIES)3346PDM_SNPF(out_len, used, output + used, out_len - used,3347"[All rate] Set Path-%d Pow_idx: %s %d\n",3348val[1], (val[2] ? "+" : "-"), val[3]);3349else3350#endif3351PDM_SNPF(out_len, used, output + used, out_len - used,3352"[All rate] Set Path-%d Pow_idx: %s %d(%d.%s dB)\n",3353val[1], (val[2] ? "+" : "-"), val[3], val[3] >> 1,3354((val[3] & 1) ? "5" : "0"));33553356#endif3357*_used = used;3358*_out_len = out_len;3359}33603361void phydm_set_txagc_dbg(void *dm_void, char input[][16], u32 *_used,3362char *output, u32 *_out_len)3363{3364struct dm_struct *dm = (struct dm_struct *)dm_void;3365u32 used = *_used;3366u32 out_len = *_out_len;3367u32 var1[10] = {0};3368char help[] = "-h";3369u8 i = 0, input_idx = 0;33703371for (i = 0; i < 5; i++) {3372if (input[i + 1]) {3373PHYDM_SSCANF(input[i + 1], DCMD_HEX, &var1[i]);3374input_idx++;3375}3376}33773378if ((strcmp(input[1], help) == 0)) {3379PDM_SNPF(out_len, used, output + used, out_len - used,3380"{Dis:0, En:1} {pathA~D(0~3)} {rate_idx(Hex), All_rate:0xff} {txagc_idx (Hex)}\n");3381PDM_SNPF(out_len, used, output + used, out_len - used,3382"{Pwr Shift(All rate):2} {pathA~D(0~3)} {0:-, 1:+} {Pwr Offset(Hex)}\n");3383#ifdef PHYDM_IC_JGR3_SERIES_SUPPORT3384PDM_SNPF(out_len, used, output + used, out_len - used,3385"{reset all rate ref/diff to 0x0:0xff}\n");3386#endif3387} else if (var1[0] == 0) {3388dm->is_disable_phy_api = false;3389PDM_SNPF(out_len, used, output + used, out_len - used,3390"Disable API debug mode\n");3391} else if (var1[0] == 1) {3392dm->is_disable_phy_api = false;3393#ifdef CONFIG_TXAGC_DEBUG_8822C3394config_phydm_write_txagc_8822c(dm, var1[3],3395(enum rf_path)var1[1],3396(u8)var1[2]);3397#elif (defined(CONFIG_TXAGC_DEBUG_8814B))3398config_phydm_write_txagc_8814b(dm, var1[3],3399(enum rf_path)var1[1],3400(u8)var1[2]);3401#else3402phydm_set_txagc(dm, (u32 *)var1, &used, output, &out_len);3403#endif3404dm->is_disable_phy_api = true;3405} else if (var1[0] == 2) {3406PHYDM_SSCANF(input[4], DCMD_HEX, &var1[3]);3407dm->is_disable_phy_api = false;3408phydm_shift_txagc(dm, (u32 *)var1, &used, output, &out_len);3409dm->is_disable_phy_api = true;3410}3411#ifdef PHYDM_IC_JGR3_SERIES_SUPPORT3412else if (var1[0] == 0xff) {3413dm->is_disable_phy_api = false;3414phydm_reset_txagc(dm);3415dm->is_disable_phy_api = true;3416}3417#endif3418#ifdef CONFIG_TXAGC_DEBUG_8822C3419else if (var1[0] == 3) {3420dm->is_disable_phy_api = false;3421phydm_txagc_tab_buff_show_8822c(dm);3422dm->is_disable_phy_api = true;3423} else if (var1[0] == 4) {3424dm->is_disable_phy_api = false;3425config_phydm_set_txagc_to_hw_8822c(dm);3426dm->is_disable_phy_api = true;3427}3428#elif (defined(CONFIG_TXAGC_DEBUG_8814B))3429else if (var1[0] == 3) {3430dm->is_disable_phy_api = false;3431phydm_txagc_tab_buff_show_8814b(dm);3432dm->is_disable_phy_api = true;3433} else if (var1[0] == 4) {3434dm->is_disable_phy_api = false;3435config_phydm_set_txagc_to_hw_8814b(dm);3436dm->is_disable_phy_api = true;3437}3438#endif34393440*_used = used;3441*_out_len = out_len;3442}34433444void phydm_debug_trace(void *dm_void, char input[][16], u32 *_used,3445char *output, u32 *_out_len)3446{3447struct dm_struct *dm = (struct dm_struct *)dm_void;3448u64 pre_debug_components, one = 1;3449u64 comp = 0;3450u32 used = *_used;3451u32 out_len = *_out_len;3452u32 val[10] = {0};3453u8 i = 0;34543455for (i = 0; i < 5; i++) {3456if (input[i + 1])3457PHYDM_SSCANF(input[i + 1], DCMD_DECIMAL, &val[i]);3458}3459comp = dm->debug_components;3460pre_debug_components = dm->debug_components;34613462PDM_SNPF(out_len, used, output + used, out_len - used,3463"\n================================\n");3464if (val[0] == 100) {3465PDM_SNPF(out_len, used, output + used, out_len - used,3466"[DBG MSG] Component Selection\n");3467PDM_SNPF(out_len, used, output + used, out_len - used,3468"================================\n");3469PDM_SNPF(out_len, used, output + used, out_len - used,3470"00. (( %s ))DIG\n",3471((comp & DBG_DIG) ? ("V") : (".")));3472PDM_SNPF(out_len, used, output + used, out_len - used,3473"01. (( %s ))RA_MASK\n",3474((comp & DBG_RA_MASK) ? ("V") : (".")));3475PDM_SNPF(out_len, used, output + used, out_len - used,3476"02. (( %s ))DYN_TXPWR\n",3477((comp & DBG_DYN_TXPWR) ? ("V") : (".")));3478PDM_SNPF(out_len, used, output + used, out_len - used,3479"03. (( %s ))FA_CNT\n",3480((comp & DBG_FA_CNT) ? ("V") : (".")));3481PDM_SNPF(out_len, used, output + used, out_len - used,3482"04. (( %s ))RSSI_MNTR\n",3483((comp & DBG_RSSI_MNTR) ? ("V") : (".")));3484PDM_SNPF(out_len, used, output + used, out_len - used,3485"05. (( %s ))CCKPD\n",3486((comp & DBG_CCKPD) ? ("V") : (".")));3487PDM_SNPF(out_len, used, output + used, out_len - used,3488"06. (( %s ))ANT_DIV\n",3489((comp & DBG_ANT_DIV) ? ("V") : (".")));3490PDM_SNPF(out_len, used, output + used, out_len - used,3491"07. (( %s ))SMT_ANT\n",3492((comp & DBG_SMT_ANT) ? ("V") : (".")));3493PDM_SNPF(out_len, used, output + used, out_len - used,3494"08. (( %s ))PWR_TRAIN\n",3495((comp & DBG_PWR_TRAIN) ? ("V") : (".")));3496PDM_SNPF(out_len, used, output + used, out_len - used,3497"09. (( %s ))RA\n",3498((comp & DBG_RA) ? ("V") : (".")));3499PDM_SNPF(out_len, used, output + used, out_len - used,3500"10. (( %s ))PATH_DIV\n",3501((comp & DBG_PATH_DIV) ? ("V") : (".")));3502PDM_SNPF(out_len, used, output + used, out_len - used,3503"11. (( %s ))DFS\n",3504((comp & DBG_DFS) ? ("V") : (".")));3505PDM_SNPF(out_len, used, output + used, out_len - used,3506"12. (( %s ))DYN_ARFR\n",3507((comp & DBG_DYN_ARFR) ? ("V") : (".")));3508PDM_SNPF(out_len, used, output + used, out_len - used,3509"13. (( %s ))ADAPTIVITY\n",3510((comp & DBG_ADPTVTY) ? ("V") : (".")));3511PDM_SNPF(out_len, used, output + used, out_len - used,3512"14. (( %s ))CFO_TRK\n",3513((comp & DBG_CFO_TRK) ? ("V") : (".")));3514PDM_SNPF(out_len, used, output + used, out_len - used,3515"15. (( %s ))ENV_MNTR\n",3516((comp & DBG_ENV_MNTR) ? ("V") : (".")));3517PDM_SNPF(out_len, used, output + used, out_len - used,3518"16. (( %s ))PRI_CCA\n",3519((comp & DBG_PRI_CCA) ? ("V") : (".")));3520PDM_SNPF(out_len, used, output + used, out_len - used,3521"17. (( %s ))ADPTV_SOML\n",3522((comp & DBG_ADPTV_SOML) ? ("V") : (".")));3523PDM_SNPF(out_len, used, output + used, out_len - used,3524"18. (( %s ))LNA_SAT_CHK\n",3525((comp & DBG_LNA_SAT_CHK) ? ("V") : (".")));3526PDM_SNPF(out_len, used, output + used, out_len - used,3527"20. (( %s ))PHY_STATUS\n",3528((comp & DBG_PHY_STATUS) ? ("V") : (".")));3529PDM_SNPF(out_len, used, output + used, out_len - used,3530"21. (( %s ))TMP\n",3531((comp & DBG_TMP) ? ("V") : (".")));3532PDM_SNPF(out_len, used, output + used, out_len - used,3533"22. (( %s ))FW_DBG_TRACE\n",3534((comp & DBG_FW_TRACE) ? ("V") : (".")));3535PDM_SNPF(out_len, used, output + used, out_len - used,3536"23. (( %s ))TXBF\n",3537((comp & DBG_TXBF) ? ("V") : (".")));3538PDM_SNPF(out_len, used, output + used, out_len - used,3539"24. (( %s ))COMMON_FLOW\n",3540((comp & DBG_COMMON_FLOW) ? ("V") : (".")));3541PDM_SNPF(out_len, used, output + used, out_len - used,3542"28. (( %s ))PHY_CONFIG\n",3543((comp & ODM_PHY_CONFIG) ? ("V") : (".")));3544PDM_SNPF(out_len, used, output + used, out_len - used,3545"29. (( %s ))INIT\n",3546((comp & ODM_COMP_INIT) ? ("V") : (".")));3547PDM_SNPF(out_len, used, output + used, out_len - used,3548"30. (( %s ))COMMON\n",3549((comp & DBG_CMN) ? ("V") : (".")));3550PDM_SNPF(out_len, used, output + used, out_len - used,3551"31. (( %s ))API\n",3552((comp & ODM_COMP_API) ? ("V") : (".")));3553PDM_SNPF(out_len, used, output + used, out_len - used,3554"================================\n");35553556} else if (val[0] == 101) {3557dm->debug_components = 0;3558PDM_SNPF(out_len, used, output + used, out_len - used,3559"Disable all debug components\n");3560} else {3561if (val[1] == 1) /*@enable*/3562dm->debug_components |= (one << val[0]);3563else if (val[1] == 2) /*@disable*/3564dm->debug_components &= ~(one << val[0]);3565else3566PDM_SNPF(out_len, used, output + used, out_len - used,3567"[Warning] 1:on, 2:off\n");35683569if ((BIT(val[0]) == DBG_PHY_STATUS) && val[1] == 1) {3570dm->phy_dbg_info.show_phy_sts_all_pkt = (u8)val[2];3571dm->phy_dbg_info.show_phy_sts_max_cnt = (u16)val[3];35723573PDM_SNPF(out_len, used, output + used, out_len - used,3574"show_all_pkt=%d, show_max_num=%d\n\n",3575dm->phy_dbg_info.show_phy_sts_all_pkt,3576dm->phy_dbg_info.show_phy_sts_max_cnt);35773578} else if ((BIT(val[0]) == DBG_CMN) && (val[1] == 1)) {3579dm->cmn_dbg_msg_period = (u8)val[2];35803581if (dm->cmn_dbg_msg_period < PHYDM_WATCH_DOG_PERIOD)3582dm->cmn_dbg_msg_period = PHYDM_WATCH_DOG_PERIOD;35833584PDM_SNPF(out_len, used, output + used, out_len - used,3585"cmn_dbg_msg_period=%d\n",3586dm->cmn_dbg_msg_period);3587}3588}3589PDM_SNPF(out_len, used, output + used, out_len - used,3590"pre-DbgComponents = 0x%llx\n", pre_debug_components);3591PDM_SNPF(out_len, used, output + used, out_len - used,3592"Curr-DbgComponents = 0x%llx\n", dm->debug_components);3593PDM_SNPF(out_len, used, output + used, out_len - used,3594"================================\n");35953596*_used = used;3597*_out_len = out_len;3598}35993600void phydm_fw_debug_trace(void *dm_void, char input[][16], u32 *_used,3601char *output, u32 *_out_len)3602{3603struct dm_struct *dm = (struct dm_struct *)dm_void;3604u32 used = *_used;3605u32 out_len = *_out_len;3606u32 val[10] = {0};3607u8 i, input_idx = 0;3608char help[] = "-h";3609u32 pre_fw_debug_components = 0, one = 1;3610u32 comp = 0;36113612for (i = 0; i < 5; i++) {3613if (input[i + 1]) {3614PHYDM_SSCANF(input[i + 1], DCMD_DECIMAL, &val[i]);3615input_idx++;3616}3617}36183619if (input_idx == 0)3620return;36213622pre_fw_debug_components = dm->fw_debug_components;3623comp = dm->fw_debug_components;36243625if ((strcmp(input[1], help) == 0)) {3626PDM_SNPF(out_len, used, output + used, out_len - used,3627"{dbg_comp} {1:en, 2:dis} {mode} {macid}\n");3628} else {3629if (val[0] == 101) {3630dm->fw_debug_components = 0;3631PDM_SNPF(out_len, used, output + used, out_len - used,3632"%s\n", "Clear all fw debug components");3633} else {3634if (val[1] == 1) /*@enable*/3635dm->fw_debug_components |= (one << val[0]);3636else if (val[1] == 2) /*@disable*/3637dm->fw_debug_components &= ~(one << val[0]);3638else3639PDM_SNPF(out_len, used, output + used,3640out_len - used, "%s\n",3641"[Warning!!!] 1:enable, 2:disable");3642}36433644comp = dm->fw_debug_components;36453646if (comp == 0) {3647dm->debug_components &= ~DBG_FW_TRACE;3648/*@H2C to enable C2H Msg*/3649phydm_fw_trace_en_h2c(dm, false, comp, val[2], val[3]);3650} else {3651dm->debug_components |= DBG_FW_TRACE;3652/*@H2C to enable C2H Msg*/3653phydm_fw_trace_en_h2c(dm, true, comp, val[2], val[3]);3654}3655}3656}36573658#if (ODM_IC_11N_SERIES_SUPPORT)3659void phydm_dump_bb_reg_n(void *dm_void, u32 *_used, char *output, u32 *_out_len)3660{3661struct dm_struct *dm = (struct dm_struct *)dm_void;3662u32 addr = 0;3663u32 used = *_used;3664u32 out_len = *_out_len;36653666/*@For Nseries IC we only need to dump page8 to pageF using 3 digits*/3667for (addr = 0x800; addr < 0xfff; addr += 4) {3668PDM_VAST_SNPF(out_len, used, output + used, out_len - used,3669"0x%03x 0x%08x\n",3670addr, odm_get_bb_reg(dm, addr, MASKDWORD));3671}36723673*_used = used;3674*_out_len = out_len;3675}3676#endif36773678#if (ODM_IC_11AC_SERIES_SUPPORT)3679void phydm_dump_bb_reg_ac(void *dm_void, u32 *_used, char *output,3680u32 *_out_len)3681{3682struct dm_struct *dm = (struct dm_struct *)dm_void;3683u32 addr = 0;3684u32 used = *_used;3685u32 out_len = *_out_len;36863687for (addr = 0x800; addr < 0xfff; addr += 4) {3688PDM_VAST_SNPF(out_len, used, output + used, out_len - used,3689"0x%04x 0x%08x\n",3690addr, odm_get_bb_reg(dm, addr, MASKDWORD));3691}36923693if (!(dm->support_ic_type &3694(ODM_RTL8822B | ODM_RTL8814A | ODM_RTL8821C)))3695goto rpt_reg;36963697if (dm->rf_type > RF_2T2R) {3698for (addr = 0x1800; addr < 0x18ff; addr += 4)3699PDM_VAST_SNPF(out_len, used, output + used,3700out_len - used, "0x%04x 0x%08x\n",3701addr,3702odm_get_bb_reg(dm, addr, MASKDWORD));3703}37043705if (dm->rf_type > RF_3T3R) {3706for (addr = 0x1a00; addr < 0x1aff; addr += 4)3707PDM_VAST_SNPF(out_len, used, output + used,3708out_len - used, "0x%04x 0x%08x\n",3709addr,3710odm_get_bb_reg(dm, addr, MASKDWORD));3711}37123713for (addr = 0x1900; addr < 0x19ff; addr += 4)3714PDM_VAST_SNPF(out_len, used, output + used, out_len - used,3715"0x%04x 0x%08x\n",3716addr, odm_get_bb_reg(dm, addr, MASKDWORD));37173718for (addr = 0x1c00; addr < 0x1cff; addr += 4)3719PDM_VAST_SNPF(out_len, used, output + used, out_len - used,3720"0x%04x 0x%08x\n",3721addr, odm_get_bb_reg(dm, addr, MASKDWORD));37223723for (addr = 0x1f00; addr < 0x1fff; addr += 4)3724PDM_VAST_SNPF(out_len, used, output + used, out_len - used,3725"0x%04x 0x%08x\n",3726addr, odm_get_bb_reg(dm, addr, MASKDWORD));37273728rpt_reg:37293730*_used = used;3731*_out_len = out_len;3732}37333734#endif37353736#ifdef PHYDM_IC_JGR3_SERIES_SUPPORT3737void phydm_dump_bb_reg_jgr3(void *dm_void, u32 *_used, char *output,3738u32 *_out_len)3739{3740struct dm_struct *dm = (struct dm_struct *)dm_void;3741u32 addr = 0;3742u32 used = *_used;3743u32 out_len = *_out_len;37443745if (dm->support_ic_type & ODM_IC_JGR3_SERIES) {3746for (addr = 0x800; addr < 0xdff; addr += 4)3747PDM_VAST_SNPF(out_len, used, output + used,3748out_len - used, "0x%04x 0x%08x\n", addr,3749odm_get_bb_reg(dm, addr, MASKDWORD));37503751for (addr = 0x1800; addr < 0x1aff; addr += 4)3752PDM_VAST_SNPF(out_len, used, output + used,3753out_len - used, "0x%04x 0x%08x\n", addr,3754odm_get_bb_reg(dm, addr, MASKDWORD));37553756for (addr = 0x1c00; addr < 0x1eff; addr += 4)3757PDM_VAST_SNPF(out_len, used, output + used,3758out_len - used, "0x%04x 0x%08x\n", addr,3759odm_get_bb_reg(dm, addr, MASKDWORD));37603761for (addr = 0x4000; addr < 0x41ff; addr += 4)3762PDM_VAST_SNPF(out_len, used, output + used,3763out_len - used, "0x%04x 0x%08x\n", addr,3764odm_get_bb_reg(dm, addr, MASKDWORD));3765}3766*_used = used;3767*_out_len = out_len;3768}37693770void phydm_dump_bb_reg2_jgr3(void *dm_void, u32 *_used, char *output,3771u32 *_out_len)3772{3773struct dm_struct *dm = (struct dm_struct *)dm_void;3774u32 addr = 0;3775u32 used = *_used;3776u32 out_len = *_out_len;37773778if (!(dm->support_ic_type & ODM_IC_JGR3_SERIES))3779return;37803781#if (defined(PHYDM_COMPILE_ABOVE_4SS))3782if (dm->support_ic_type & PHYDM_IC_ABOVE_4SS) {3783for (addr = 0x5000; addr < 0x53ff; addr += 4) {3784PDM_VAST_SNPF(out_len, used, output + used,3785out_len - used, "0x%04x 0x%08x\n",3786addr,3787odm_get_bb_reg(dm, addr, MASKDWORD));3788}3789}3790#endif3791/* @Do not change the order of page-2C/2D*/3792PDM_VAST_SNPF(out_len, used, output + used, out_len - used,3793"------ BB report-register start ------\n");3794for (addr = 0x2c00; addr < 0x2dff; addr += 4) {3795PDM_VAST_SNPF(out_len, used, output + used, out_len - used,3796"0x%04x 0x%08x\n",3797addr, odm_get_bb_reg(dm, addr, MASKDWORD));3798}37993800*_used = used;3801*_out_len = out_len;3802}38033804void phydm_get_per_path_anapar_jgr3(void *dm_void, u8 path, u32 *_used,3805char *output, u32 *_out_len)3806{3807struct dm_struct *dm = (struct dm_struct *)dm_void;3808u8 state = 0;3809u8 state_bp = 0;3810u32 control_bb = 0;3811u32 control_pow = 0;3812u32 used = *_used;3813u32 out_len = *_out_len;3814u32 reg_idx = 0;3815u32 dbgport_idx = 0;3816u32 dbgport_val = 0;38173818PDM_SNPF(out_len, used, output + used, out_len - used, "path-%d:\n",3819path);38203821if (path == RF_PATH_A) {3822reg_idx = R_0x1830;3823dbgport_idx = 0x9F0;3824} else if (path == RF_PATH_B) {3825reg_idx = R_0x4130;3826dbgport_idx = 0xBF0;3827} else if (path == RF_PATH_C) {3828reg_idx = R_0x5230;3829dbgport_idx = 0xDF0;3830} else if (path == RF_PATH_D) {3831reg_idx = R_0x5330;3832dbgport_idx = 0xFF0;3833}38343835state_bp = (u8)odm_get_bb_reg(dm, reg_idx, 0xf00000);3836odm_set_bb_reg(dm, reg_idx, 0x38000000, 0x5); /* @read en*/38373838for (state = 0; state <= 0xf; state++) {3839odm_set_bb_reg(dm, reg_idx, 0xF00000, state);3840if (phydm_set_bb_dbg_port(dm, DBGPORT_PRI_3, dbgport_idx)) {3841dbgport_val = phydm_get_bb_dbg_port_val(dm);3842phydm_release_bb_dbg_port(dm);3843} else {3844PDM_SNPF(out_len, used, output + used, out_len - used,3845"state:0x%x = read dbg_port error!\n", state);3846}3847control_bb = (dbgport_val & 0xFFFF0) >> 4;3848control_pow = dbgport_val & 0xF;3849PDM_SNPF(out_len, used, output + used, out_len - used,3850"state:0x%x = control_bb:0x%x pow_bb:0x%x\n",3851state, control_bb, control_pow);3852}3853odm_set_bb_reg(dm, reg_idx, 0xf00000, state_bp);3854odm_set_bb_reg(dm, reg_idx, 0x38000000, 0x6); /* @write en*/38553856*_used = used;3857*_out_len = out_len;3858}38593860#endif38613862void phydm_dump_bb_reg(void *dm_void, u32 *_used, char *output, u32 *_out_len)3863{3864struct dm_struct *dm = (struct dm_struct *)dm_void;3865u32 used = *_used;3866u32 out_len = *_out_len;38673868PDM_VAST_SNPF(out_len, used, output + used, out_len - used,3869"BB==========\n");3870PDM_VAST_SNPF(out_len, used, output + used, out_len - used,3871"------ BB control register start ------\n");38723873switch (dm->ic_ip_series) {3874#ifdef PHYDM_IC_JGR3_SERIES_SUPPORT3875case PHYDM_IC_JGR3:3876phydm_dump_bb_reg_jgr3(dm, &used, output, &out_len);3877break;3878#endif38793880#if (ODM_IC_11AC_SERIES_SUPPORT)3881case PHYDM_IC_AC:3882phydm_dump_bb_reg_ac(dm, &used, output, &out_len);3883break;3884#endif38853886#if (ODM_IC_11N_SERIES_SUPPORT)3887case PHYDM_IC_N:3888phydm_dump_bb_reg_n(dm, &used, output, &out_len);3889break;3890#endif38913892default:3893break;3894}38953896*_used = used;3897*_out_len = out_len;3898}38993900void phydm_dump_rf_reg(void *dm_void, u32 *_used, char *output, u32 *_out_len)3901{3902struct dm_struct *dm = (struct dm_struct *)dm_void;3903u32 addr = 0;3904u32 used = *_used;3905u32 out_len = *_out_len;3906u32 reg = 0;39073908/* @dump RF register */3909PDM_VAST_SNPF(out_len, used, output + used, out_len - used,3910"RF-A==========\n");39113912for (addr = 0; addr <= 0xFF; addr++) {3913reg = odm_get_rf_reg(dm, RF_PATH_A, addr, RFREG_MASK);3914PDM_VAST_SNPF(out_len, used, output + used, out_len - used,3915"0x%02x 0x%05x\n", addr, reg);3916}39173918#ifdef PHYDM_COMPILE_ABOVE_2SS3919if (dm->rf_type > RF_1T1R) {3920PDM_VAST_SNPF(out_len, used, output + used, out_len - used,3921"RF-B==========\n");39223923for (addr = 0; addr <= 0xFF; addr++) {3924reg = odm_get_rf_reg(dm, RF_PATH_B, addr, RFREG_MASK);3925PDM_VAST_SNPF(out_len, used, output + used,3926out_len - used, "0x%02x 0x%05x\n",3927addr, reg);3928}3929}3930#endif39313932#ifdef PHYDM_COMPILE_ABOVE_3SS3933if (dm->rf_type > RF_2T2R) {3934PDM_VAST_SNPF(out_len, used, output + used, out_len - used,3935"RF-C==========\n");39363937for (addr = 0; addr <= 0xFF; addr++) {3938reg = odm_get_rf_reg(dm, RF_PATH_C, addr, RFREG_MASK);3939PDM_VAST_SNPF(out_len, used, output + used,3940out_len - used, "0x%02x 0x%05x\n",3941addr, reg);3942}3943}3944#endif39453946#ifdef PHYDM_COMPILE_ABOVE_4SS3947if (dm->rf_type > RF_3T3R) {3948PDM_VAST_SNPF(out_len, used, output + used, out_len - used,3949"RF-D==========\n");39503951for (addr = 0; addr <= 0xFF; addr++) {3952reg = odm_get_rf_reg(dm, RF_PATH_D, addr, RFREG_MASK);3953PDM_VAST_SNPF(out_len, used, output + used,3954out_len - used, "0x%02x 0x%05x\n",3955addr, reg);3956}3957}3958#endif39593960*_used = used;3961*_out_len = out_len;3962}39633964void phydm_dump_mac_reg(void *dm_void, u32 *_used, char *output, u32 *_out_len)3965{3966struct dm_struct *dm = (struct dm_struct *)dm_void;3967u32 addr = 0;3968u32 used = *_used;3969u32 out_len = *_out_len;39703971/* @dump MAC register */3972PDM_VAST_SNPF(out_len, used, output + used, out_len - used,3973"MAC==========\n");39743975for (addr = 0; addr < 0x7ff; addr += 4)3976PDM_VAST_SNPF(out_len, used, output + used, out_len - used,3977"0x%04x 0x%08x\n",3978addr, odm_get_bb_reg(dm, addr, MASKDWORD));39793980for (addr = 0x1000; addr < 0x17ff; addr += 4)3981PDM_VAST_SNPF(out_len, used, output + used, out_len - used,3982"0x%04x 0x%08x\n",3983addr, odm_get_bb_reg(dm, addr, MASKDWORD));39843985*_used = used;3986*_out_len = out_len;3987}39883989void phydm_dump_reg(void *dm_void, char input[][16], u32 *_used, char *output,3990u32 *_out_len)3991{3992struct dm_struct *dm = (struct dm_struct *)dm_void;3993char help[] = "-h";3994u32 var1[10] = {0};3995u32 used = *_used;3996u32 out_len = *_out_len;3997u32 addr = 0;39983999if (input[1])4000PHYDM_SSCANF(input[1], DCMD_DECIMAL, &var1[0]);40014002if ((strcmp(input[1], help) == 0)) {4003#ifdef PHYDM_IC_JGR3_SERIES_SUPPORT4004if (dm->support_ic_type & ODM_IC_JGR3_SERIES)4005PDM_SNPF(out_len, used, output + used, out_len - used,4006"dumpreg {0:all, 1:BB, 2:RF, 3:MAC 4:BB2 for jgr3}\n");4007else4008#endif4009PDM_SNPF(out_len, used, output + used, out_len - used,4010"dumpreg {0:all, 1:BB, 2:RF, 3:MAC}\n");4011} else if (var1[0] == 0) {4012phydm_dump_mac_reg(dm, &used, output, &out_len);4013phydm_dump_bb_reg(dm, &used, output, &out_len);4014#ifdef PHYDM_IC_JGR3_SERIES_SUPPORT4015if (dm->ic_ip_series == PHYDM_IC_JGR3)4016phydm_dump_bb_reg2_jgr3(dm, &used, output, &out_len);4017#endif40184019phydm_dump_rf_reg(dm, &used, output, &out_len);4020} else if (var1[0] == 1) {4021phydm_dump_bb_reg(dm, &used, output, &out_len);4022} else if (var1[0] == 2) {4023phydm_dump_rf_reg(dm, &used, output, &out_len);4024} else if (var1[0] == 3) {4025phydm_dump_mac_reg(dm, &used, output, &out_len);4026} else if (var1[0] == 4) {4027#ifdef PHYDM_IC_JGR3_SERIES_SUPPORT4028if (dm->ic_ip_series == PHYDM_IC_JGR3)4029phydm_dump_bb_reg2_jgr3(dm, &used, output, &out_len);4030#endif4031}40324033*_used = used;4034*_out_len = out_len;4035}40364037void phydm_enable_big_jump(void *dm_void, char input[][16], u32 *_used,4038char *output, u32 *_out_len)4039{4040#if (RTL8822B_SUPPORT)4041struct dm_struct *dm = (struct dm_struct *)dm_void;4042struct phydm_dig_struct *dig_t = &dm->dm_dig_table;4043u32 dm_value[10] = {0};4044u8 i, input_idx = 0;4045u32 val;40464047if (!(dm->support_ic_type & ODM_RTL8822B))4048return;40494050for (i = 0; i < 5; i++) {4051if (input[i + 1]) {4052PHYDM_SSCANF(input[i + 1], DCMD_HEX, &dm_value[i]);4053input_idx++;4054}4055}40564057if (input_idx == 0)4058return;40594060if (dm_value[0] == 0) {4061dm->dm_dig_table.enable_adjust_big_jump = false;40624063val = (dig_t->big_jump_step3 << 5) |4064(dig_t->big_jump_step2 << 3) |4065dig_t->big_jump_step1;40664067odm_set_bb_reg(dm, R_0x8c8, 0xfe, val);4068} else {4069dm->dm_dig_table.enable_adjust_big_jump = true;4070}4071#endif4072}40734074void phydm_show_rx_rate(void *dm_void, char input[][16], u32 *_used,4075char *output, u32 *_out_len)4076{4077#if (RTL8822B_SUPPORT || RTL8821C_SUPPORT || RTL8814B_SUPPORT ||\4078RTL8195B_SUPPORT || RTL8822C_SUPPORT)4079struct dm_struct *dm = (struct dm_struct *)dm_void;4080struct odm_phy_dbg_info *dbg = &dm->phy_dbg_info;4081u32 used = *_used;4082u32 out_len = *_out_len;4083u32 var1[10] = {0};4084char help[] = "-h";4085u8 i, input_idx = 0;40864087for (i = 0; i < 5; i++) {4088if (input[i + 1]) {4089PHYDM_SSCANF(input[i + 1], DCMD_HEX, &var1[i]);4090input_idx++;4091}4092}40934094if (input_idx == 0)4095return;40964097if ((strcmp(input[1], help) == 0)) {4098PDM_SNPF(out_len, used, output + used, out_len - used,4099"{1: show Rx rate, 0:reset counter}\n");4100*_used = used;4101*_out_len = out_len;4102return;41034104} else if (var1[0] == 0) {4105phydm_reset_rx_rate_distribution(dm);4106*_used = used;4107*_out_len = out_len;4108return;4109}41104111/* @==Show SU Rate====================================================*/4112PDM_SNPF(out_len, used, output + used, out_len - used,4113"=====Rx SU rate Statistics=====\n");4114PDM_SNPF(out_len, used, output + used, out_len - used,4115"[SU][1SS] {%d, %d, %d, %d | %d, %d, %d, %d | %d, %d}\n",4116dbg->num_qry_vht_pkt[0], dbg->num_qry_vht_pkt[1],4117dbg->num_qry_vht_pkt[2], dbg->num_qry_vht_pkt[3],4118dbg->num_qry_vht_pkt[4], dbg->num_qry_vht_pkt[5],4119dbg->num_qry_vht_pkt[6], dbg->num_qry_vht_pkt[7],4120dbg->num_qry_vht_pkt[8], dbg->num_qry_vht_pkt[9]);41214122#if (defined(PHYDM_COMPILE_ABOVE_2SS))4123if (dm->support_ic_type & (PHYDM_IC_ABOVE_2SS)) {4124PDM_SNPF(out_len, used, output + used, out_len - used,4125"[SU][2SS] {%d, %d, %d, %d | %d, %d, %d, %d | %d, %d}\n",4126dbg->num_qry_vht_pkt[10], dbg->num_qry_vht_pkt[11],4127dbg->num_qry_vht_pkt[12], dbg->num_qry_vht_pkt[13],4128dbg->num_qry_vht_pkt[14], dbg->num_qry_vht_pkt[15],4129dbg->num_qry_vht_pkt[16], dbg->num_qry_vht_pkt[17],4130dbg->num_qry_vht_pkt[18], dbg->num_qry_vht_pkt[19]);4131}4132#endif4133/* @==Show MU Rate====================================================*/4134#if (ODM_PHY_STATUS_NEW_TYPE_SUPPORT) || (defined(PHYSTS_3RD_TYPE_SUPPORT))4135PDM_SNPF(out_len, used, output + used, out_len - used,4136"=====Rx MU rate Statistics=====\n");4137PDM_SNPF(out_len, used, output + used, out_len - used,4138"[MU][1SS] {%d, %d, %d, %d | %d, %d, %d, %d | %d, %d}\n",4139dbg->num_mu_vht_pkt[0], dbg->num_mu_vht_pkt[1],4140dbg->num_mu_vht_pkt[2], dbg->num_mu_vht_pkt[3],4141dbg->num_mu_vht_pkt[4], dbg->num_mu_vht_pkt[5],4142dbg->num_mu_vht_pkt[6], dbg->num_mu_vht_pkt[7],4143dbg->num_mu_vht_pkt[8], dbg->num_mu_vht_pkt[9]);41444145#if (defined(PHYDM_COMPILE_ABOVE_2SS))4146if (dm->support_ic_type & (PHYDM_IC_ABOVE_2SS)) {4147PDM_SNPF(out_len, used, output + used, out_len - used,4148"[MU][2SS] {%d, %d, %d, %d | %d, %d, %d, %d | %d, %d}\n",4149dbg->num_mu_vht_pkt[10], dbg->num_mu_vht_pkt[11],4150dbg->num_mu_vht_pkt[12], dbg->num_mu_vht_pkt[13],4151dbg->num_mu_vht_pkt[14], dbg->num_mu_vht_pkt[15],4152dbg->num_mu_vht_pkt[16], dbg->num_mu_vht_pkt[17],4153dbg->num_mu_vht_pkt[18], dbg->num_mu_vht_pkt[19]);4154}4155#endif4156#endif4157*_used = used;4158*_out_len = out_len;4159#endif4160}41614162void phydm_per_tone_evm(void *dm_void, char input[][16], u32 *_used,4163char *output, u32 *_out_len)4164{4165struct dm_struct *dm = (struct dm_struct *)dm_void;4166u8 i, j;4167u32 used = *_used;4168u32 out_len = *_out_len;4169u32 var1[4] = {0};4170u32 val, tone_num, round;4171s8 rxevm_0, rxevm_1;4172s32 avg_num, evm_tone_0[256] = {0}, evm_tone_1[256] = {0};4173s32 rxevm_sum_0, rxevm_sum_1;41744175if (dm->support_ic_type & ODM_IC_11N_SERIES) {4176pr_debug("n series not support yet !\n");4177return;4178}41794180for (i = 0; i < 4; i++) {4181if (input[i + 1])4182PHYDM_SSCANF(input[i + 1], DCMD_DECIMAL, &var1[i]);4183}41844185avg_num = var1[0];4186round = var1[1];41874188if (!dm->is_linked) {4189PDM_SNPF(out_len, used, output + used, out_len - used,4190"No Link !!\n");41914192*_used = used;4193*_out_len = out_len;41944195return;4196}41974198pr_debug("ID=((%d)), BW=((%d)), fc=((CH-%d))\n", dm->curr_station_id,419920 << *dm->band_width, *dm->channel);4200pr_debug("avg_num =((%d)), round =((%d))\n", avg_num, round);4201#if (DM_ODM_SUPPORT_TYPE & ODM_AP)4202watchdog_stop(dm->priv);4203#endif4204for (j = 0; j < round; j++) {4205pr_debug("\nround((%d))\n", (j + 1));4206if (*dm->band_width == CHANNEL_WIDTH_20) {4207for (tone_num = 228; tone_num <= 255; tone_num++) {4208odm_set_bb_reg(dm, R_0x8c4, 0xff8, tone_num);4209rxevm_sum_0 = 0;4210rxevm_sum_1 = 0;4211for (i = 0; i < avg_num; i++) {4212val = odm_read_4byte(dm, R_0xf8c);42134214rxevm_0 = (s8)((val & MASKBYTE2) >> 16);4215rxevm_0 = (rxevm_0 / 2);4216if (rxevm_0 < -63)4217rxevm_0 = 0;42184219rxevm_1 = (s8)((val & MASKBYTE3) >> 24);4220rxevm_1 = (rxevm_1 / 2);4221if (rxevm_1 < -63)4222rxevm_1 = 0;4223rxevm_sum_0 += rxevm_0;4224rxevm_sum_1 += rxevm_1;4225ODM_delay_ms(1);4226}4227evm_tone_0[tone_num] = (rxevm_sum_0 / avg_num);4228evm_tone_1[tone_num] = (rxevm_sum_1 / avg_num);4229pr_debug("Tone(-%-3d) RXEVM(1ss/2ss)=%d, %d\n",4230(256 - tone_num), evm_tone_0[tone_num],4231evm_tone_1[tone_num]);4232}42334234for (tone_num = 1; tone_num <= 28; tone_num++) {4235odm_set_bb_reg(dm, R_0x8c4, 0xff8, tone_num);4236rxevm_sum_0 = 0;4237rxevm_sum_1 = 0;4238for (i = 0; i < avg_num; i++) {4239val = odm_read_4byte(dm, R_0xf8c);42404241rxevm_0 = (s8)((val & MASKBYTE2) >> 16);4242rxevm_0 = (rxevm_0 / 2);4243if (rxevm_0 < -63)4244rxevm_0 = 0;42454246rxevm_1 = (s8)((val & MASKBYTE3) >> 24);4247rxevm_1 = (rxevm_1 / 2);4248if (rxevm_1 < -63)4249rxevm_1 = 0;4250rxevm_sum_0 += rxevm_0;4251rxevm_sum_1 += rxevm_1;4252ODM_delay_ms(1);4253}4254evm_tone_0[tone_num] = (rxevm_sum_0 / avg_num);4255evm_tone_1[tone_num] = (rxevm_sum_1 / avg_num);4256pr_debug("Tone(%-3d) RXEVM(1ss/2ss)=%d, %d\n",4257tone_num, evm_tone_0[tone_num],4258evm_tone_1[tone_num]);4259}4260} else if (*dm->band_width == CHANNEL_WIDTH_40) {4261for (tone_num = 198; tone_num <= 254; tone_num++) {4262odm_set_bb_reg(dm, R_0x8c4, 0xff8, tone_num);4263rxevm_sum_0 = 0;4264rxevm_sum_1 = 0;4265for (i = 0; i < avg_num; i++) {4266val = odm_read_4byte(dm, R_0xf8c);42674268rxevm_0 = (s8)((val & MASKBYTE2) >> 16);4269rxevm_0 = (rxevm_0 / 2);4270if (rxevm_0 < -63)4271rxevm_0 = 0;42724273rxevm_1 = (s8)((val & MASKBYTE3) >> 24);4274rxevm_1 = (rxevm_1 / 2);4275if (rxevm_1 < -63)4276rxevm_1 = 0;42774278rxevm_sum_0 += rxevm_0;4279rxevm_sum_1 += rxevm_1;4280ODM_delay_ms(1);4281}4282evm_tone_0[tone_num] = (rxevm_sum_0 / avg_num);4283evm_tone_1[tone_num] = (rxevm_sum_1 / avg_num);4284pr_debug("Tone(-%-3d) RXEVM(1ss/2ss)=%d, %d\n",4285(256 - tone_num), evm_tone_0[tone_num],4286evm_tone_1[tone_num]);4287}42884289for (tone_num = 2; tone_num <= 58; tone_num++) {4290odm_set_bb_reg(dm, R_0x8c4, 0xff8, tone_num);4291rxevm_sum_0 = 0;4292rxevm_sum_1 = 0;4293for (i = 0; i < avg_num; i++) {4294val = odm_read_4byte(dm, R_0xf8c);42954296rxevm_0 = (s8)((val & MASKBYTE2) >> 16);4297rxevm_0 = (rxevm_0 / 2);4298if (rxevm_0 < -63)4299rxevm_0 = 0;43004301rxevm_1 = (s8)((val & MASKBYTE3) >> 24);4302rxevm_1 = (rxevm_1 / 2);4303if (rxevm_1 < -63)4304rxevm_1 = 0;4305rxevm_sum_0 += rxevm_0;4306rxevm_sum_1 += rxevm_1;4307ODM_delay_ms(1);4308}4309evm_tone_0[tone_num] = (rxevm_sum_0 / avg_num);4310evm_tone_1[tone_num] = (rxevm_sum_1 / avg_num);4311pr_debug("Tone(%-3d) RXEVM(1ss/2ss)=%d, %d\n",4312tone_num, evm_tone_0[tone_num],4313evm_tone_1[tone_num]);4314}4315} else if (*dm->band_width == CHANNEL_WIDTH_80) {4316for (tone_num = 134; tone_num <= 254; tone_num++) {4317odm_set_bb_reg(dm, R_0x8c4, 0xff8, tone_num);4318rxevm_sum_0 = 0;4319rxevm_sum_1 = 0;4320for (i = 0; i < avg_num; i++) {4321val = odm_read_4byte(dm, R_0xf8c);43224323rxevm_0 = (s8)((val & MASKBYTE2) >> 16);4324rxevm_0 = (rxevm_0 / 2);4325if (rxevm_0 < -63)4326rxevm_0 = 0;43274328rxevm_1 = (s8)((val & MASKBYTE3) >> 24);4329rxevm_1 = (rxevm_1 / 2);4330if (rxevm_1 < -63)4331rxevm_1 = 0;4332rxevm_sum_0 += rxevm_0;4333rxevm_sum_1 += rxevm_1;4334ODM_delay_ms(1);4335}4336evm_tone_0[tone_num] = (rxevm_sum_0 / avg_num);4337evm_tone_1[tone_num] = (rxevm_sum_1 / avg_num);4338pr_debug("Tone(-%-3d) RXEVM(1ss/2ss)=%d, %d\n",4339(256 - tone_num), evm_tone_0[tone_num],4340evm_tone_1[tone_num]);4341}43424343for (tone_num = 2; tone_num <= 122; tone_num++) {4344odm_set_bb_reg(dm, R_0x8c4, 0xff8, tone_num);4345rxevm_sum_0 = 0;4346rxevm_sum_1 = 0;4347for (i = 0; i < avg_num; i++) {4348val = odm_read_4byte(dm, R_0xf8c);43494350rxevm_0 = (s8)((val & MASKBYTE2) >> 16);4351rxevm_0 = (rxevm_0 / 2);4352if (rxevm_0 < -63)4353rxevm_0 = 0;43544355rxevm_1 = (s8)((val & MASKBYTE3) >> 24);4356rxevm_1 = (rxevm_1 / 2);4357if (rxevm_1 < -63)4358rxevm_1 = 0;4359rxevm_sum_0 += rxevm_0;4360rxevm_sum_1 += rxevm_1;4361ODM_delay_ms(1);4362}4363evm_tone_0[tone_num] = (rxevm_sum_0 / avg_num);4364evm_tone_1[tone_num] = (rxevm_sum_1 / avg_num);4365pr_debug("Tone(%-3d) RXEVM (1ss/2ss)=%d, %d\n",4366tone_num, evm_tone_0[tone_num],4367evm_tone_1[tone_num]);4368}4369}4370}4371*_used = used;4372*_out_len = out_len;4373}43744375void phydm_bw_ch_adjust(void *dm_void, char input[][16],4376u32 *_used, char *output, u32 *_out_len)4377{4378struct dm_struct *dm = (struct dm_struct *)dm_void;4379char help[] = "-h";4380u32 var1[10] = {0};4381u32 used = *_used;4382u32 out_len = *_out_len;4383u8 i;4384boolean is_enable_dbg_mode;4385u8 central_ch, primary_ch_idx;4386enum channel_width bw;43874388#ifdef PHYDM_COMMON_API_SUPPORT43894390if ((strcmp(input[1], help) == 0)) {4391PDM_SNPF(out_len, used, output + used, out_len - used,4392"{en} {CH} {pr_ch_idx 1/2/3/4/9/10} {0:20M,1:40M,2:80M}\n");4393goto out;4394}43954396if (!(dm->support_ic_type & CMN_API_SUPPORT_IC)) {4397PDM_SNPF(out_len, used, output + used, out_len - used,4398"Not support this API\n");4399goto out;4400}44014402for (i = 0; i < 4; i++) {4403if (input[i + 1])4404PHYDM_SSCANF(input[i + 1], DCMD_DECIMAL, &var1[i]);4405}44064407is_enable_dbg_mode = (boolean)var1[0];4408central_ch = (u8)var1[1];4409primary_ch_idx = (u8)var1[2];4410bw = (enum channel_width)var1[3];44114412if (is_enable_dbg_mode) {4413dm->is_disable_phy_api = false;4414phydm_api_switch_bw_channel(dm, central_ch, primary_ch_idx, bw);4415dm->is_disable_phy_api = true;4416PDM_SNPF(out_len, used, output + used, out_len - used,4417"central_ch = %d, primary_ch_idx = %d, bw = %d\n",4418central_ch, primary_ch_idx, bw);4419}4420out:4421#endif44224423*_used = used;4424*_out_len = out_len;4425}44264427void phydm_ext_rf_element_ctrl(void *dm_void, char input[][16], u32 *_used,4428char *output, u32 *_out_len)4429{4430struct dm_struct *dm = (struct dm_struct *)dm_void;4431u32 val[10] = {0};4432u8 i = 0, input_idx = 0;44334434for (i = 0; i < 5; i++) {4435if (input[i + 1]) {4436PHYDM_SSCANF(input[i + 1], DCMD_DECIMAL, &val[i]);4437input_idx++;4438}4439}44404441if (input_idx == 0)4442return;44434444if (val[0] == 1) /*@ext switch*/ {4445phydm_set_ext_switch(dm, val[1]);4446}4447}44484449void phydm_print_dbgport(void *dm_void, char input[][16], u32 *_used,4450char *output, u32 *_out_len)4451{4452struct dm_struct *dm = (struct dm_struct *)dm_void;4453char help[] = "-h";4454u32 var1[10] = {0};4455u32 used = *_used;4456u32 out_len = *_out_len;4457u32 dbg_port_value = 0;4458u8 val[32];4459u8 tmp = 0;4460u8 i;44614462if (strcmp(input[1], help) == 0) {4463PDM_SNPF(out_len, used, output + used, out_len - used,4464"{dbg_port_idx}\n");4465goto out;4466}44674468PHYDM_SSCANF(input[1], DCMD_HEX, &var1[0]);44694470dm->debug_components |= ODM_COMP_API;4471if (phydm_set_bb_dbg_port(dm, DBGPORT_PRI_3, var1[0])) {4472dbg_port_value = phydm_get_bb_dbg_port_val(dm);4473phydm_release_bb_dbg_port(dm);44744475for (i = 0; i < 32; i++)4476val[i] = (u8)((dbg_port_value & BIT(i)) >> i);44774478PDM_SNPF(out_len, used, output + used, out_len - used,4479"Dbg Port[0x%x] = ((0x%x))\n", var1[0],4480dbg_port_value);44814482for (i = 4; i != 0; i--) {4483tmp = 8 * (i - 1);4484PDM_SNPF(out_len, used, output + used, out_len - used,4485"val[%d:%d] = 8b'%d %d %d %d %d %d %d %d\n",4486tmp + 7, tmp, val[tmp + 7], val[tmp + 6],4487val[tmp + 5], val[tmp + 4], val[tmp + 3],4488val[tmp + 2], val[tmp + 1], val[tmp + 0]);4489}4490}4491dm->debug_components &= (~ODM_COMP_API);4492out:4493*_used = used;4494*_out_len = out_len;4495}44964497void phydm_get_anapar_table(void *dm_void, u32 *_used, char *output,4498u32 *_out_len)4499{4500struct dm_struct *dm = (struct dm_struct *)dm_void;4501u32 used = *_used;4502u32 out_len = *_out_len;4503enum rf_path i = RF_PATH_A;45044505#ifdef PHYDM_IC_JGR3_SERIES_SUPPORT4506if (!(dm->support_ic_type & ODM_IC_JGR3_SERIES))4507return;45084509PDM_VAST_SNPF(out_len, used, output + used, out_len - used,4510"------ Analog parameters start ------\n");45114512for (i = RF_PATH_A; i < (enum rf_path)dm->num_rf_path; i++)4513phydm_get_per_path_anapar_jgr3(dm, i, &used, output, &out_len);4514#endif45154516*_used = used;4517*_out_len = out_len;4518}45194520void phydm_dd_dbg_dump(void *dm_void, char input[][16], u32 *_used,4521char *output, u32 *_out_len)4522{4523struct dm_struct *dm = (struct dm_struct *)dm_void;4524char help[] = "-h";4525u32 var1[10] = {0};4526u32 used = *_used;4527u32 out_len = *_out_len;45284529PHYDM_SSCANF(input[1], DCMD_DECIMAL, &var1[0]);45304531if ((strcmp(input[1], help) == 0)) {4532PDM_SNPF(out_len, used, output + used, out_len - used,4533"dump: {1}\n");4534return;4535} else if (var1[0] == 1) {4536/*[Reg]*/4537phydm_dump_mac_reg(dm, &used, output, &out_len);4538phydm_dump_bb_reg(dm, &used, output, &out_len);4539#ifdef PHYDM_IC_JGR3_SERIES_SUPPORT4540if (dm->ic_ip_series == PHYDM_IC_JGR3)4541phydm_dump_bb_reg2_jgr3(dm, &used, output, &out_len);4542#endif45434544phydm_dump_rf_reg(dm, &used, output, &out_len);4545/*[Dbg Port]*/4546#ifdef PHYDM_AUTO_DEGBUG4547phydm_dbg_port_dump(dm, &used, output, &out_len);4548#endif4549/*[Analog Parameters]*/4550phydm_get_anapar_table(dm, &used, output, &out_len);4551}4552}45534554void phydm_nss_hitogram_mp(void *dm_void, enum PDM_RATE_TYPE rate_type,4555u32 *_used, char *output, u32 *_out_len)4556{4557struct dm_struct *dm = (struct dm_struct *)dm_void;4558struct odm_phy_dbg_info *dbg_i = &dm->phy_dbg_info;4559struct phydm_phystatus_statistic *dbg_s = &dbg_i->physts_statistic_info;4560u32 used = *_used;4561u32 out_len = *_out_len;4562char buf[PHYDM_SNPRINT_SIZE] = {0};4563u16 buf_size = PHYDM_SNPRINT_SIZE;4564u16 h_size = PHY_HIST_SIZE;4565u16 *evm_hist = &dbg_s->evm_1ss_hist[0];4566u16 *snr_hist = &dbg_s->snr_1ss_hist[0];4567u8 i = 0;4568u8 ss = phydm_rate_type_2_num_ss(dm, rate_type);45694570if (rate_type == PDM_OFDM) {4571phydm_print_hist_2_buf(dm, dbg_s->evm_ofdm_hist, PHY_HIST_SIZE,4572buf, buf_size);4573PDM_SNPF(out_len, used, output + used, out_len - used,4574"%-14s=%s\n", "[OFDM][EVM]", buf);45754576phydm_print_hist_2_buf(dm, dbg_s->snr_ofdm_hist, PHY_HIST_SIZE,4577buf, buf_size);4578PDM_SNPF(out_len, used, output + used, out_len - used,4579"%-14s=%s\n", "[OFDM][SNR]", buf);45804581*_used = used;4582*_out_len = out_len;4583return;4584}45854586for (i = 0; i < ss; i++) {4587if (rate_type == PDM_1SS) {4588evm_hist = &dbg_s->evm_1ss_hist[0];4589snr_hist = &dbg_s->snr_1ss_hist[0];4590} else if (rate_type == PDM_2SS) {4591#if (defined(PHYDM_COMPILE_ABOVE_2SS))4592evm_hist = &dbg_s->evm_2ss_hist[i][0];4593snr_hist = &dbg_s->snr_2ss_hist[i][0];4594#endif4595} else if (rate_type == PDM_3SS) {4596#if (defined(PHYDM_COMPILE_ABOVE_3SS))4597evm_hist = &dbg_s->evm_3ss_hist[i][0];4598snr_hist = &dbg_s->snr_3ss_hist[i][0];4599#endif4600} else if (rate_type == PDM_4SS) {4601#if (defined(PHYDM_COMPILE_ABOVE_4SS))4602evm_hist = &dbg_s->evm_4ss_hist[i][0];4603snr_hist = &dbg_s->snr_4ss_hist[i][0];4604#endif4605}46064607phydm_print_hist_2_buf(dm, evm_hist, h_size, buf, buf_size);4608PDM_SNPF(out_len, used, output + used, out_len - used,4609"[%d-SS][EVM][%d]=%s\n", ss, i, buf);4610phydm_print_hist_2_buf(dm, snr_hist, h_size, buf, buf_size);4611PDM_SNPF(out_len, used, output + used, out_len - used,4612"[%d-SS][SNR][%d]=%s\n", ss, i, buf);4613}4614*_used = used;4615*_out_len = out_len;4616}46174618void phydm_mp_dbg(void *dm_void, char input[][16], u32 *_used, char *output,4619u32 *_out_len)4620{4621struct dm_struct *dm = (struct dm_struct *)dm_void;4622struct odm_phy_dbg_info *dbg_i = &dm->phy_dbg_info;4623struct phydm_phystatus_statistic *dbg_s = &dbg_i->physts_statistic_info;4624struct phydm_phystatus_avg *dbg_avg = &dbg_i->phystatus_statistic_avg;4625char *rate_type = NULL;4626u8 tmp_rssi_avg[4];4627u8 tmp_snr_avg[4];4628u8 tmp_evm_avg[4];4629u32 tmp_cnt = 0;4630char buf[PHYDM_SNPRINT_SIZE] = {0};4631u32 used = *_used;4632u32 out_len = *_out_len;4633u32 var1[10] = {0};4634u16 buf_size = PHYDM_SNPRINT_SIZE;4635u16 th_size = PHY_HIST_SIZE - 1;4636u8 i = 0;46374638if (!(*dm->mp_mode))4639return;46404641PDM_SNPF(out_len, used, output + used, out_len - used,4642"BW=((%d)), fc=((CH-%d))\n",464320 << *dm->band_width, *dm->channel);46444645/*@===[PHY Histogram]================================================*/4646PDM_SNPF(out_len, used, output + used, out_len - used,4647"[PHY Histogram] ==============>\n");4648/*@===[Threshold]===*/4649phydm_print_hist_2_buf(dm, dbg_i->evm_hist_th, th_size, buf, buf_size);4650PDM_SNPF(out_len, used, output + used, out_len - used,4651"%-16s=%s\n", "[EVM_TH]", buf);4652phydm_print_hist_2_buf(dm, dbg_i->snr_hist_th, th_size, buf, buf_size);4653PDM_SNPF(out_len, used, output + used, out_len - used,4654"%-16s=%s\n", "[SNR_TH]", buf);4655/*@===[OFDM]===*/4656phydm_nss_hitogram_mp(dm, PDM_OFDM, &used, output, &out_len);4657/*@===[1-SS]===*/4658phydm_nss_hitogram_mp(dm, PDM_1SS, &used, output, &out_len);4659/*@===[2-SS]===*/4660#if (defined(PHYDM_COMPILE_ABOVE_2SS))4661if (dm->support_ic_type & PHYDM_IC_ABOVE_2SS)4662phydm_nss_hitogram_mp(dm, PDM_2SS, &used, output, &out_len);4663#endif4664/*@===[3-SS]===*/4665#if (defined(PHYDM_COMPILE_ABOVE_3SS))4666if (dm->support_ic_type & PHYDM_IC_ABOVE_3SS)4667phydm_nss_hitogram_mp(dm, PDM_3SS, &used, output, &out_len);4668#endif4669/*@===[4-SS]===*/4670#if (defined(PHYDM_COMPILE_ABOVE_4SS))4671if (dm->support_ic_type & PHYDM_IC_ABOVE_4SS)4672phydm_nss_hitogram_mp(dm, PDM_4SS, &used, output, &out_len);4673#endif4674/*@===[PHY Avg]======================================================*/4675phydm_get_avg_phystatus_val(dm);4676PDM_SNPF(out_len, used, output + used, out_len - used,4677"[PHY Avg] ==============>\n");46784679phydm_get_avg_phystatus_val(dm);46804681switch (dm->num_rf_path) {4682#if (defined(PHYDM_COMPILE_ABOVE_4SS))4683case 4:4684PDM_SNPF(out_len, used, output + used, out_len - used,4685"* %-8s Cnt=((%.3d)) RSSI:{%.2d, %.2d, %.2d, %.2d}\n",4686"[Beacon]", dbg_s->rssi_beacon_cnt,4687dbg_avg->rssi_beacon_avg[0],4688dbg_avg->rssi_beacon_avg[1],4689dbg_avg->rssi_beacon_avg[2],4690dbg_avg->rssi_beacon_avg[3]);4691break;4692#endif4693#if (defined(PHYDM_COMPILE_ABOVE_3SS))4694case 3:4695PDM_SNPF(out_len, used, output + used, out_len - used,4696"* %-8s Cnt=((%.3d)) RSSI:{%.2d, %.2d, %.2d}\n",4697"[Beacon]", dbg_s->rssi_beacon_cnt,4698dbg_avg->rssi_beacon_avg[0],4699dbg_avg->rssi_beacon_avg[1],4700dbg_avg->rssi_beacon_avg[2]);4701break;4702#endif4703#if (defined(PHYDM_COMPILE_ABOVE_2SS))4704case 2:4705PDM_SNPF(out_len, used, output + used, out_len - used,4706"* %-8s Cnt=((%.3d)) RSSI:{%.2d, %.2d}\n",4707"[Beacon]", dbg_s->rssi_beacon_cnt,4708dbg_avg->rssi_beacon_avg[0],4709dbg_avg->rssi_beacon_avg[1]);4710break;4711#endif4712default:4713PDM_SNPF(out_len, used, output + used, out_len - used,4714"* %-8s Cnt=((%.3d)) RSSI:{%.2d}\n",4715"[Beacon]", dbg_s->rssi_beacon_cnt,4716dbg_avg->rssi_beacon_avg[0]);4717break;4718}47194720switch (dm->num_rf_path) {4721#ifdef PHYSTS_3RD_TYPE_SUPPORT4722#if (defined(PHYDM_COMPILE_ABOVE_4SS))4723case 4:4724PDM_SNPF(out_len, used, output + used, out_len - used,4725"* %-8s Cnt=((%.3d)) RSSI:{%.2d, %.2d, %.2d, %.2d}\n",4726"[CCK]", dbg_s->rssi_cck_cnt,4727dbg_avg->rssi_cck_avg,4728dbg_avg->rssi_cck_avg_abv_2ss[0],4729dbg_avg->rssi_cck_avg_abv_2ss[1],4730dbg_avg->rssi_cck_avg_abv_2ss[2]);4731break;4732#endif4733#if (defined(PHYDM_COMPILE_ABOVE_3SS))4734case 3:4735PDM_SNPF(out_len, used, output + used, out_len - used,4736"* %-8s Cnt=((%.3d)) RSSI:{%.2d, %.2d, %.2d}\n",4737"[CCK]", dbg_s->rssi_cck_cnt,4738dbg_avg->rssi_cck_avg,4739dbg_avg->rssi_cck_avg_abv_2ss[0],4740dbg_avg->rssi_cck_avg_abv_2ss[1]);4741break;4742#endif4743#if (defined(PHYDM_COMPILE_ABOVE_2SS))4744case 2:4745PDM_SNPF(out_len, used, output + used, out_len - used,4746"* %-8s Cnt=((%.3d)) RSSI:{%.2d, %.2d}\n",4747"[CCK]", dbg_s->rssi_cck_cnt,4748dbg_avg->rssi_cck_avg,4749dbg_avg->rssi_cck_avg_abv_2ss[0]);4750break;4751#endif4752#endif4753default:4754PDM_SNPF(out_len, used, output + used, out_len - used,4755"* %-8s Cnt=((%.3d)) RSSI:{%.2d}\n",4756"[CCK]", dbg_s->rssi_cck_cnt, dbg_avg->rssi_cck_avg);4757break;4758}47594760for (i = 0; i <= 4; i++) {4761if (i > dm->num_rf_path)4762break;47634764odm_memory_set(dm, tmp_rssi_avg, 0, 4);4765odm_memory_set(dm, tmp_snr_avg, 0, 4);4766odm_memory_set(dm, tmp_evm_avg, 0, 4);47674768switch (i) {4769#if (defined(PHYDM_COMPILE_ABOVE_4SS))4770case 4:4771rate_type = "[4-SS]";4772tmp_cnt = dbg_s->rssi_4ss_cnt;4773odm_move_memory(dm, tmp_rssi_avg,4774dbg_avg->rssi_4ss_avg, dm->num_rf_path);4775odm_move_memory(dm, tmp_snr_avg,4776dbg_avg->snr_4ss_avg, dm->num_rf_path);4777odm_move_memory(dm, tmp_evm_avg, dbg_avg->evm_4ss_avg,47784);4779break;4780#endif4781#if (defined(PHYDM_COMPILE_ABOVE_3SS))4782case 3:4783rate_type = "[3-SS]";4784tmp_cnt = dbg_s->rssi_3ss_cnt;4785odm_move_memory(dm, tmp_rssi_avg,4786dbg_avg->rssi_3ss_avg, dm->num_rf_path);4787odm_move_memory(dm, tmp_snr_avg,4788dbg_avg->snr_3ss_avg, dm->num_rf_path);4789odm_move_memory(dm, tmp_evm_avg,4790dbg_avg->evm_3ss_avg, 3);4791break;4792#endif4793#if (defined(PHYDM_COMPILE_ABOVE_2SS))4794case 2:4795rate_type = "[2-SS]";4796tmp_cnt = dbg_s->rssi_2ss_cnt;4797odm_move_memory(dm, tmp_rssi_avg,4798dbg_avg->rssi_2ss_avg, dm->num_rf_path);4799odm_move_memory(dm, tmp_snr_avg, dbg_avg->snr_2ss_avg,4800dm->num_rf_path);4801odm_move_memory(dm, tmp_evm_avg,4802dbg_avg->evm_2ss_avg, 2);4803break;4804#endif4805case 1:4806rate_type = "[1-SS]";4807tmp_cnt = dbg_s->rssi_1ss_cnt;4808odm_move_memory(dm, tmp_rssi_avg,4809dbg_avg->rssi_1ss_avg, dm->num_rf_path);4810odm_move_memory(dm, tmp_snr_avg,4811dbg_avg->snr_1ss_avg, dm->num_rf_path);4812odm_move_memory(dm, tmp_evm_avg,4813&dbg_avg->evm_1ss_avg, 1);4814break;4815default:4816rate_type = "[L-OFDM]";4817tmp_cnt = dbg_s->rssi_ofdm_cnt;4818odm_move_memory(dm, tmp_rssi_avg,4819dbg_avg->rssi_ofdm_avg,4820dm->num_rf_path);4821odm_move_memory(dm, tmp_snr_avg,4822dbg_avg->snr_ofdm_avg, dm->num_rf_path);4823odm_move_memory(dm, tmp_evm_avg,4824&dbg_avg->evm_ofdm_avg, 1);4825break;4826}48274828PDM_SNPF(out_len, used, output + used, out_len - used,4829"* %-8s Cnt=((%.3d)) RSSI:{%.2d, %.2d, %.2d, %.2d} SNR:{%.2d, %.2d, %.2d, %.2d} EVM:{-%.2d, -%.2d, -%.2d, -%.2d}\n",4830rate_type, tmp_cnt,4831tmp_rssi_avg[0], tmp_rssi_avg[1],4832tmp_rssi_avg[2], tmp_rssi_avg[3],4833tmp_snr_avg[0], tmp_snr_avg[1],4834tmp_snr_avg[2], tmp_snr_avg[3],4835tmp_evm_avg[0], tmp_evm_avg[1],4836tmp_evm_avg[2], tmp_evm_avg[3]);4837}48384839phydm_reset_phystatus_statistic(dm);48404841PDM_SNPF(out_len, used, output + used, out_len - used,4842"rxsc_idx {Legacy, 20, 40, 80} = {%d, %d, %d, %d}\n",4843dm->rxsc_l, dm->rxsc_20, dm->rxsc_40, dm->rxsc_80);48444845*_used = used;4846*_out_len = out_len;4847}48484849void phydm_reg_monitor(void *dm_void, char input[][16], u32 *_used,4850char *output, u32 *_out_len)4851{4852struct dm_struct *dm = (struct dm_struct *)dm_void;4853char help[] = "-h";4854u32 var1[10] = {0};4855u32 used = *_used;4856u32 out_len = *_out_len;4857boolean en_mntr = false;4858u8 i = 0;48594860for (i = 0; i < 7; i++) {4861if (input[i + 1])4862PHYDM_SSCANF(input[i + 1], DCMD_DECIMAL, &var1[i]);4863}48644865if ((strcmp(input[1], help) == 0)) {4866PDM_SNPF(out_len, used, output + used, out_len - used,4867"reg_mntr {en} {0:all, 1:BB, 2:RF, 3:MAC 4:1/2/4 byte}\n");4868} else {4869if (var1[0] == 1)4870en_mntr = true;4871else4872en_mntr = false;48734874if (var1[1] == 0) {4875dm->en_reg_mntr_bb = en_mntr;4876dm->en_reg_mntr_rf = en_mntr;4877dm->en_reg_mntr_mac = en_mntr;4878dm->en_reg_mntr_byte = en_mntr;4879} else if (var1[1] == 1) {4880dm->en_reg_mntr_bb = en_mntr;4881} else if (var1[1] == 2) {4882dm->en_reg_mntr_rf = en_mntr;4883} else if (var1[1] == 3) {4884dm->en_reg_mntr_mac = en_mntr;4885} else if (var1[1] == 4) {4886dm->en_reg_mntr_byte = en_mntr;4887}4888}48894890PDM_SNPF(out_len, used, output + used, out_len - used,4891"en: BB:%d, RF:%d, MAC:%d, byte:%d\n", dm->en_reg_mntr_bb,4892dm->en_reg_mntr_rf, dm->en_reg_mntr_mac, dm->en_reg_mntr_byte);48934894*_used = used;4895*_out_len = out_len;4896}48974898#if RTL8814B_SUPPORT4899void phydm_spur_detect_dbg(void *dm_void, char input[][16], u32 *_used,4900char *output, u32 *_out_len)4901{4902struct dm_struct *dm = (struct dm_struct *)dm_void;4903char help[] = "-h";4904u32 var1[10] = {0};4905u32 used = *_used;4906u32 out_len = *_out_len;4907u32 i;49084909if ((strcmp(input[1], help) == 0)) {4910PDM_SNPF(out_len, used, output + used, out_len - used,4911"{0: Auto spur detect(NBI+CSI), 1:NBI only,");4912PDM_SNPF(out_len, used, output + used, out_len - used,4913"2: CSI only, 3: Disable}\n");4914PDM_SNPF(out_len, used, output + used, out_len - used,4915"{NBI path(0~3) | CSI wgt (0~7)}\n");4916} else {4917for (i = 0; i < 10; i++) {4918if (input[i + 1])4919PHYDM_SSCANF(input[i + 1], DCMD_HEX, &var1[i]);4920}49214922if (var1[0] == 1)4923dm->dsde_sel = DET_NBI;4924else if (var1[0] == 2)4925dm->dsde_sel = DET_CSI;4926else if (var1[0] == 3)4927dm->dsde_sel = DET_DISABLE;4928else4929dm->dsde_sel = DET_AUTO;49304931PDM_SNPF(out_len, used, output + used, out_len - used,4932"spur detect mode = %d\n", dm->dsde_sel);49334934if (dm->dsde_sel == DET_NBI) {4935if (var1[1] < 4) {4936dm->nbi_path_sel = (u8)var1[1];4937PDM_SNPF(out_len, used, output + used,4938out_len - used, "NBI set path %d\n",4939dm->nbi_path_sel);4940} else {4941PDM_SNPF(out_len, used, output + used,4942out_len - used, "path setting fail\n");4943}4944} else if (dm->dsde_sel == DET_CSI) {4945if (var1[1] < 8) {4946dm->csi_wgt = (u8)var1[1];4947PDM_SNPF(out_len, used, output + used,4948out_len - used, "CSI wgt %d\n",4949dm->csi_wgt);4950} else {4951PDM_SNPF(out_len, used, output + used,4952out_len - used,4953"CSI wgt setting fail\n");4954}4955}4956}49574958*_used = used;4959*_out_len = out_len;4960}4961#endif49624963struct phydm_command {4964char name[16];4965u8 id;4966};49674968enum PHYDM_CMD_ID {4969PHYDM_HELP,4970PHYDM_DEMO,4971PHYDM_RF_CMD,4972PHYDM_DIG,4973PHYDM_RA,4974PHYDM_PROFILE,4975PHYDM_ANTDIV,4976PHYDM_PATHDIV,4977PHYDM_DEBUG,4978PHYDM_MP_DEBUG,4979PHYDM_FW_DEBUG,4980PHYDM_SUPPORT_ABILITY,4981PHYDM_GET_TXAGC,4982PHYDM_SET_TXAGC,4983PHYDM_SMART_ANT,4984PHYDM_CH_BW,4985PHYDM_TRX_PATH,4986PHYDM_LA_MODE,4987PHYDM_DUMP_REG,4988PHYDM_AUTO_DBG,4989PHYDM_DD_DBG,4990PHYDM_BIG_JUMP,4991PHYDM_SHOW_RXRATE,4992PHYDM_NBI_EN,4993PHYDM_CSI_MASK_EN,4994PHYDM_DFS_DEBUG,4995PHYDM_DFS_HIST,4996PHYDM_NHM,4997PHYDM_CLM,4998PHYDM_FAHM,4999PHYDM_ENV_MNTR,5000PHYDM_BB_INFO,5001//PHYDM_TXBF,5002PHYDM_H2C,5003PHYDM_EXT_RF_E_CTRL,5004PHYDM_ADAPTIVE_SOML,5005PHYDM_PSD,5006PHYDM_DEBUG_PORT,5007PHYDM_DIS_HTSTF_CONTROL,5008PHYDM_CFO_TRK,5009PHYDM_ADAPTIVITY_DEBUG,5010PHYDM_DIS_DYM_ANT_WEIGHTING,5011PHYDM_FORECE_PT_STATE,5012PHYDM_STA_INFO,5013PHYDM_PAUSE_FUNC,5014PHYDM_PER_TONE_EVM,5015PHYDM_DYN_TXPWR,5016PHYDM_LNA_SAT,5017PHYDM_ANAPAR,5018PHYDM_CCK_RX_PATHDIV,5019PHYDM_BEAM_FORMING,5020PHYDM_REG_MONITOR,5021#if RTL8814B_SUPPORT5022PHYDM_SPUR_DETECT,5023#endif5024PHYDM_PHY_STATUS5025};50265027struct phydm_command phy_dm_ary[] = {5028{"-h", PHYDM_HELP}, /*@do not move this element to other position*/5029{"demo", PHYDM_DEMO}, /*@do not move this element to other position*/5030{"rf", PHYDM_RF_CMD},5031{"dig", PHYDM_DIG},5032{"ra", PHYDM_RA},5033{"profile", PHYDM_PROFILE},5034{"antdiv", PHYDM_ANTDIV},5035{"pathdiv", PHYDM_PATHDIV},5036{"dbg", PHYDM_DEBUG},5037{"mp_dbg", PHYDM_MP_DEBUG},5038{"fw_dbg", PHYDM_FW_DEBUG},5039{"ability", PHYDM_SUPPORT_ABILITY},5040{"get_txagc", PHYDM_GET_TXAGC},5041{"set_txagc", PHYDM_SET_TXAGC},5042{"smtant", PHYDM_SMART_ANT},5043{"ch_bw", PHYDM_CH_BW},5044{"trxpath", PHYDM_TRX_PATH},5045{"lamode", PHYDM_LA_MODE},5046{"dumpreg", PHYDM_DUMP_REG},5047{"auto_dbg", PHYDM_AUTO_DBG},5048{"dd_dbg", PHYDM_DD_DBG},5049{"bigjump", PHYDM_BIG_JUMP},5050{"rxrate", PHYDM_SHOW_RXRATE},5051{"nbi", PHYDM_NBI_EN},5052{"csi_mask", PHYDM_CSI_MASK_EN},5053{"dfs", PHYDM_DFS_DEBUG},5054{"dfs_hist", PHYDM_DFS_HIST},5055{"nhm", PHYDM_NHM},5056{"clm", PHYDM_CLM},5057{"fahm", PHYDM_FAHM},5058{"env_mntr", PHYDM_ENV_MNTR},5059{"bbinfo", PHYDM_BB_INFO},5060/*{"txbf", PHYDM_TXBF},*/5061{"h2c", PHYDM_H2C},5062{"ext_rfe", PHYDM_EXT_RF_E_CTRL},5063{"soml", PHYDM_ADAPTIVE_SOML},5064{"psd", PHYDM_PSD},5065{"dbgport", PHYDM_DEBUG_PORT},5066{"dis_htstf", PHYDM_DIS_HTSTF_CONTROL},5067{"cfo_trk", PHYDM_CFO_TRK},5068{"adapt_debug", PHYDM_ADAPTIVITY_DEBUG},5069{"dis_dym_ant_wgt", PHYDM_DIS_DYM_ANT_WEIGHTING},5070{"force_pt_state", PHYDM_FORECE_PT_STATE},5071{"sta_info", PHYDM_STA_INFO},5072{"pause", PHYDM_PAUSE_FUNC},5073{"evm", PHYDM_PER_TONE_EVM},5074{"dyn_txpwr", PHYDM_DYN_TXPWR},5075{"lna_sat", PHYDM_LNA_SAT},5076{"anapar", PHYDM_ANAPAR},5077{"cck_rx_pathdiv", PHYDM_CCK_RX_PATHDIV},5078{"bf", PHYDM_BEAM_FORMING},5079{"reg_mntr", PHYDM_REG_MONITOR},5080#if RTL8814B_SUPPORT5081{"spur_detect", PHYDM_SPUR_DETECT},5082#endif5083{"physts", PHYDM_PHY_STATUS}5084};50855086#endif /*@#ifdef CONFIG_PHYDM_DEBUG_FUNCTION*/50875088void phydm_cmd_parser(struct dm_struct *dm, char input[][MAX_ARGV],5089u32 input_num, u8 flag, char *output, u32 out_len)5090{5091#ifdef CONFIG_PHYDM_DEBUG_FUNCTION5092u32 used = 0;5093u8 id = 0;5094u32 var1[10] = {0};5095u32 i;5096u32 phydm_ary_size = sizeof(phy_dm_ary) / sizeof(struct phydm_command);50975098if (flag == 0) {5099PDM_SNPF(out_len, used, output + used, out_len - used,5100"GET, nothing to print\n");5101return;5102}51035104PDM_SNPF(out_len, used, output + used, out_len - used, "\n");51055106/* Parsing Cmd ID */5107if (input_num) {5108for (i = 0; i < phydm_ary_size; i++) {5109if (strcmp(phy_dm_ary[i].name, input[0]) == 0) {5110id = phy_dm_ary[i].id;5111break;5112}5113}5114if (i == phydm_ary_size) {5115PDM_SNPF(out_len, used, output + used, out_len - used,5116"PHYDM command not found!\n");5117return;5118}5119}51205121switch (id) {5122case PHYDM_HELP: {5123PDM_SNPF(out_len, used, output + used, out_len - used,5124"BB cmd ==>\n");51255126for (i = 0; i < phydm_ary_size - 2; i++)5127PDM_SNPF(out_len, used, output + used, out_len - used,5128" %-5d: %s\n", i, phy_dm_ary[i + 2].name);5129} break;51305131case PHYDM_DEMO: { /*@echo demo 10 0x3a z abcde >cmd*/5132u32 directory = 0;51335134#if (DM_ODM_SUPPORT_TYPE & (ODM_CE | ODM_AP))5135char char_temp;5136#else5137u32 char_temp = ' ';5138#endif51395140PHYDM_SSCANF(input[1], DCMD_DECIMAL, &directory);5141PDM_SNPF(out_len, used, output + used, out_len - used,5142"Decimal value = %d\n", directory);5143PHYDM_SSCANF(input[2], DCMD_HEX, &directory);5144PDM_SNPF(out_len, used, output + used, out_len - used,5145"Hex value = 0x%x\n", directory);5146PHYDM_SSCANF(input[3], DCMD_CHAR, &char_temp);5147PDM_SNPF(out_len, used, output + used, out_len - used,5148"Char = %c\n", char_temp);5149PDM_SNPF(out_len, used, output + used, out_len - used,5150"String = %s\n", input[4]);5151} break;5152case PHYDM_RF_CMD:5153halrf_cmd_parser(dm, input, &used, output, &out_len, input_num);5154break;51555156case PHYDM_DIG:5157phydm_dig_debug(dm, input, &used, output, &out_len);5158break;51595160case PHYDM_RA:5161phydm_ra_debug(dm, input, &used, output, &out_len);5162break;51635164case PHYDM_ANTDIV:5165#if (defined(CONFIG_PHYDM_ANTENNA_DIVERSITY))5166phydm_antdiv_debug(dm, input, &used, output, &out_len);5167#endif5168break;51695170case PHYDM_PATHDIV:5171#if (defined(CONFIG_PATH_DIVERSITY))5172phydm_pathdiv_debug(dm, input, &used, output, &out_len);5173#endif5174break;51755176case PHYDM_DEBUG:5177phydm_debug_trace(dm, input, &used, output, &out_len);5178break;51795180case PHYDM_MP_DEBUG:5181phydm_mp_dbg(dm, input, &used, output, &out_len);5182break;51835184case PHYDM_FW_DEBUG:5185phydm_fw_debug_trace(dm, input, &used, output, &out_len);5186break;51875188case PHYDM_SUPPORT_ABILITY:5189phydm_supportability_en(dm, input, &used, output, &out_len);5190break;51915192case PHYDM_SMART_ANT:5193#if (defined(CONFIG_PHYDM_ANTENNA_DIVERSITY))51945195#ifdef CONFIG_HL_SMART_ANTENNA_TYPE25196phydm_hl_smt_ant_dbg_type2(dm, input, &used, output, &out_len);5197#elif (defined(CONFIG_HL_SMART_ANTENNA_TYPE1))5198phydm_hl_smart_ant_debug(dm, input, &used, output, &out_len);5199#endif52005201#elif (defined(CONFIG_CUMITEK_SMART_ANTENNA))5202phydm_cumitek_smt_ant_debug(dm, input, &used, output, &out_len);5203#endif52045205break;52065207case PHYDM_CH_BW:5208phydm_bw_ch_adjust(dm, input, &used, output, &out_len);5209break;52105211case PHYDM_PROFILE:5212phydm_basic_profile(dm, &used, output, &out_len);5213break;52145215case PHYDM_GET_TXAGC:5216phydm_get_txagc(dm, &used, output, &out_len);5217break;52185219case PHYDM_SET_TXAGC:5220phydm_set_txagc_dbg(dm, input, &used, output, &out_len);5221break;52225223case PHYDM_TRX_PATH:5224phydm_config_trx_path(dm, input, &used, output, &out_len);5225break;52265227case PHYDM_LA_MODE:5228#if (PHYDM_LA_MODE_SUPPORT)5229phydm_la_cmd(dm, input, &used, output, &out_len);5230#endif5231break;52325233case PHYDM_DUMP_REG:5234phydm_dump_reg(dm, input, &used, output, &out_len);5235break;52365237case PHYDM_BIG_JUMP:5238phydm_enable_big_jump(dm, input, &used, output, &out_len);5239break;52405241case PHYDM_AUTO_DBG:5242#ifdef PHYDM_AUTO_DEGBUG5243phydm_auto_dbg_console(dm, input, &used, output, &out_len);5244#endif5245break;52465247case PHYDM_DD_DBG:5248phydm_dd_dbg_dump(dm, input, &used, output, &out_len);5249break;52505251case PHYDM_SHOW_RXRATE:5252phydm_show_rx_rate(dm, input, &used, output, &out_len);5253break;52545255case PHYDM_NBI_EN:5256phydm_nbi_debug(dm, input, &used, output, &out_len);5257break;52585259case PHYDM_CSI_MASK_EN:5260phydm_csi_debug(dm, input, &used, output, &out_len);5261break;52625263#ifdef CONFIG_PHYDM_DFS_MASTER5264case PHYDM_DFS_DEBUG:5265phydm_dfs_debug(dm, input, &used, output, &out_len);5266break;52675268case PHYDM_DFS_HIST:5269phydm_dfs_hist_dbg(dm, input, &used, output, &out_len);5270break;5271#endif52725273case PHYDM_NHM:5274#ifdef NHM_SUPPORT5275phydm_nhm_dbg(dm, input, &used, output, &out_len);5276#endif5277break;52785279case PHYDM_CLM:5280#ifdef CLM_SUPPORT5281phydm_clm_dbg(dm, input, &used, output, &out_len);5282#endif5283break;52845285#ifdef FAHM_SUPPORT5286case PHYDM_FAHM:5287phydm_fahm_dbg(dm, input, &used, output, &out_len);5288break;5289#endif52905291case PHYDM_ENV_MNTR:5292phydm_env_mntr_dbg(dm, input, &used, output, &out_len);5293break;52945295case PHYDM_BB_INFO:5296phydm_bb_hw_dbg_info(dm, input, &used, output, &out_len);5297break;5298/*5299case PHYDM_TXBF: {5300#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN | ODM_CE))5301#ifdef PHYDM_BEAMFORMING_SUPPORT5302struct _RT_BEAMFORMING_INFO *beamforming_info = NULL;53035304beamforming_info = &dm->beamforming_info;53055306PHYDM_SSCANF(input[1], DCMD_DECIMAL, &var1[0]);5307if (var1[0] == 0) {5308beamforming_info->apply_v_matrix = false;5309beamforming_info->snding3ss = true;5310PDM_SNPF(out_len, used, output + used, out_len - used,5311"\r\n dont apply V matrix and 3SS 789 snding\n");5312} else if (var1[0] == 1) {5313beamforming_info->apply_v_matrix = true;5314beamforming_info->snding3ss = true;5315PDM_SNPF(out_len, used, output + used, out_len - used,5316"\r\n apply V matrix and 3SS 789 snding\n");5317} else if (var1[0] == 2) {5318beamforming_info->apply_v_matrix = true;5319beamforming_info->snding3ss = false;5320PDM_SNPF(out_len, used, output + used, out_len - used,5321"\r\n default txbf setting\n");5322} else5323PDM_SNPF(out_len, used, output + used, out_len - used,5324"\r\n unknown cmd!!\n");5325#endif5326#endif5327} break;5328*/5329case PHYDM_H2C:5330phydm_h2C_debug(dm, input, &used, output, &out_len);5331break;53325333case PHYDM_EXT_RF_E_CTRL:5334phydm_ext_rf_element_ctrl(dm, input, &used, output, &out_len);5335break;53365337case PHYDM_ADAPTIVE_SOML:5338#ifdef CONFIG_ADAPTIVE_SOML5339phydm_soml_debug(dm, input, &used, output, &out_len);5340#endif5341break;53425343case PHYDM_PSD:53445345#ifdef CONFIG_PSD_TOOL5346phydm_psd_debug(dm, input, &used, output, &out_len);5347#endif53485349break;53505351case PHYDM_DEBUG_PORT:5352phydm_print_dbgport(dm, input, &used, output, &out_len);5353break;53545355case PHYDM_DIS_HTSTF_CONTROL: {5356if (input[1])5357PHYDM_SSCANF(input[1], DCMD_DECIMAL, &var1[0]);53585359if (var1[0] == 1) {5360/* setting being false is for debug */5361dm->bhtstfdisabled = true;5362PDM_SNPF(out_len, used, output + used, out_len - used,5363"Dynamic HT-STF Gain Control is Disable\n");5364} else {5365/* @default setting should be true,5366* always be dynamic control5367*/5368dm->bhtstfdisabled = false;5369PDM_SNPF(out_len, used, output + used, out_len - used,5370"Dynamic HT-STF Gain Control is Enable\n");5371}5372} break;53735374case PHYDM_CFO_TRK:5375phydm_cfo_tracking_debug(dm, input, &used, output, &out_len);5376break;53775378case PHYDM_ADAPTIVITY_DEBUG:5379#ifdef PHYDM_SUPPORT_ADAPTIVITY5380phydm_adaptivity_debug(dm, input, &used, output, &out_len);5381#endif5382break;53835384case PHYDM_DIS_DYM_ANT_WEIGHTING:5385#ifdef DYN_ANT_WEIGHTING_SUPPORT5386phydm_ant_weight_dbg(dm, input, &used, output, &out_len);5387#endif5388break;53895390case PHYDM_FORECE_PT_STATE:5391#ifdef PHYDM_POWER_TRAINING_SUPPORT5392phydm_pow_train_debug(dm, input, &used, output, &out_len);5393#endif5394break;53955396case PHYDM_STA_INFO:5397phydm_show_sta_info(dm, input, &used, output, &out_len);5398break;53995400case PHYDM_PAUSE_FUNC:5401phydm_pause_func_console(dm, input, &used, output, &out_len);5402break;54035404case PHYDM_PER_TONE_EVM:5405phydm_per_tone_evm(dm, input, &used, output, &out_len);5406break;54075408#ifdef CONFIG_DYNAMIC_TX_TWR5409case PHYDM_DYN_TXPWR:5410phydm_dtp_debug(dm, input, &used, output, &out_len);5411break;5412#endif54135414case PHYDM_LNA_SAT:5415#ifdef PHYDM_LNA_SAT_CHK_SUPPORT5416phydm_lna_sat_debug(dm, input, &used, output, &out_len);5417#endif5418break;54195420case PHYDM_ANAPAR:5421phydm_get_anapar_table(dm, &used, output, &out_len);5422break;5423case PHYDM_CCK_RX_PATHDIV:5424#ifdef PHYDM_CCK_RX_PATHDIV_SUPPORT5425phydm_cck_rx_pathdiv_dbg(dm, input, &used, output, &out_len);5426#endif5427break;54285429case PHYDM_BEAM_FORMING:5430#ifdef CONFIG_BB_TXBF_API5431phydm_bf_debug(dm, input, &used, output, &out_len);5432#endif5433break;5434case PHYDM_REG_MONITOR:5435phydm_reg_monitor(dm, input, &used, output, &out_len);5436break;54375438#if RTL8814B_SUPPORT5439case PHYDM_SPUR_DETECT:5440phydm_spur_detect_dbg(dm, input, &used, output, &out_len);5441break;5442#endif5443case PHYDM_PHY_STATUS:5444phydm_physts_dbg(dm, input, &used, output, &out_len);5445break;54465447default:5448PDM_SNPF(out_len, used, output + used, out_len - used,5449"Do not support this command\n");5450break;5451}5452#endif /*@#ifdef CONFIG_PHYDM_DEBUG_FUNCTION*/5453}54545455#if defined __ECOS || defined __ICCARM__5456#ifndef strsep5457char *strsep(char **s, const char *ct)5458{5459char *sbegin = *s;5460char *end;54615462if (!sbegin)5463return NULL;54645465end = strpbrk(sbegin, ct);5466if (end)5467*end++ = '\0';5468*s = end;5469return sbegin;5470}5471#endif5472#endif54735474#if (DM_ODM_SUPPORT_TYPE & (ODM_CE | ODM_AP | ODM_IOT))5475s32 phydm_cmd(struct dm_struct *dm, char *input, u32 in_len, u8 flag,5476char *output, u32 out_len)5477{5478char *token;5479u32 argc = 0;5480char argv[MAX_ARGC][MAX_ARGV];54815482do {5483token = strsep(&input, ", ");5484if (token) {5485if (strlen(token) <= MAX_ARGV)5486strcpy(argv[argc], token);54875488argc++;5489} else {5490break;5491}5492} while (argc < MAX_ARGC);54935494if (argc == 1)5495argv[0][strlen(argv[0]) - 1] = '\0';54965497phydm_cmd_parser(dm, argv, argc, flag, output, out_len);54985499return 0;5500}5501#endif55025503void phydm_fw_trace_handler(void *dm_void, u8 *cmd_buf, u8 cmd_len)5504{5505#ifdef CONFIG_PHYDM_DEBUG_FUNCTION5506struct dm_struct *dm = (struct dm_struct *)dm_void;55075508/*@u8 debug_trace_11byte[60];*/5509u8 freg_num, c2h_seq, buf_0 = 0;55105511if (!(dm->support_ic_type & PHYDM_IC_3081_SERIES))5512return;55135514if (cmd_len > 12 || cmd_len == 0) {5515pr_debug("[Warning] Error C2H cmd_len=%d\n", cmd_len);5516return;5517}55185519buf_0 = cmd_buf[0];5520freg_num = (buf_0 & 0xf);5521c2h_seq = (buf_0 & 0xf0) >> 4;55225523#if 05524PHYDM_DBG(dm, DBG_FW_TRACE,5525"[FW debug message] freg_num = (( %d )), c2h_seq=(( %d ))\n",5526freg_num, c2h_seq);55275528strncpy(debug_trace_11byte, &cmd_buf[1], (cmd_len - 1));5529debug_trace_11byte[cmd_len - 1] = '\0';5530PHYDM_DBG(dm, DBG_FW_TRACE, "[FW debug message] %s\n",5531debug_trace_11byte);5532PHYDM_DBG(dm, DBG_FW_TRACE, "[FW debug message] cmd_len = (( %d ))\n",5533cmd_len);5534PHYDM_DBG(dm, DBG_FW_TRACE, "[FW debug message] c2h_cmd_start=((%d))\n",5535dm->c2h_cmd_start);55365537PHYDM_DBG(dm, DBG_FW_TRACE, "pre_seq = (( %d )), current_seq=((%d))\n",5538dm->pre_c2h_seq, c2h_seq);5539PHYDM_DBG(dm, DBG_FW_TRACE, "fw_buff_is_enpty = (( %d ))\n",5540dm->fw_buff_is_enpty);5541#endif55425543if (c2h_seq != dm->pre_c2h_seq && dm->fw_buff_is_enpty == false) {5544dm->fw_debug_trace[dm->c2h_cmd_start] = '\0';5545PHYDM_DBG(dm, DBG_FW_TRACE, "[FW Dbg Queue Overflow] %s\n",5546dm->fw_debug_trace);5547dm->c2h_cmd_start = 0;5548}55495550if ((cmd_len - 1) > (60 - dm->c2h_cmd_start)) {5551dm->fw_debug_trace[dm->c2h_cmd_start] = '\0';5552PHYDM_DBG(dm, DBG_FW_TRACE,5553"[FW Dbg Queue error: wrong C2H length] %s\n",5554dm->fw_debug_trace);5555dm->c2h_cmd_start = 0;5556return;5557}55585559strncpy((char *)&dm->fw_debug_trace[dm->c2h_cmd_start],5560(char *)&cmd_buf[1], (cmd_len - 1));5561dm->c2h_cmd_start += (cmd_len - 1);5562dm->fw_buff_is_enpty = false;55635564if (freg_num == 0 || dm->c2h_cmd_start >= 60) {5565if (dm->c2h_cmd_start < 60)5566dm->fw_debug_trace[dm->c2h_cmd_start] = '\0';5567else5568dm->fw_debug_trace[59] = '\0';55695570PHYDM_DBG(dm, DBG_FW_TRACE, "[FW DBG Msg] %s\n",5571dm->fw_debug_trace);5572#if 05573/*@dbg_print("[FW DBG Msg] %s\n", dm->fw_debug_trace);*/5574#endif5575dm->c2h_cmd_start = 0;5576dm->fw_buff_is_enpty = true;5577}55785579dm->pre_c2h_seq = c2h_seq;5580#endif /*@#ifdef CONFIG_PHYDM_DEBUG_FUNCTION*/5581}55825583void phydm_fw_trace_handler_code(void *dm_void, u8 *buffer, u8 cmd_len)5584{5585#ifdef CONFIG_PHYDM_DEBUG_FUNCTION5586struct dm_struct *dm = (struct dm_struct *)dm_void;5587u8 function = buffer[0];5588u8 dbg_num = buffer[1];5589u16 content_0 = (((u16)buffer[3]) << 8) | ((u16)buffer[2]);5590u16 content_1 = (((u16)buffer[5]) << 8) | ((u16)buffer[4]);5591u16 content_2 = (((u16)buffer[7]) << 8) | ((u16)buffer[6]);5592u16 content_3 = (((u16)buffer[9]) << 8) | ((u16)buffer[8]);5593u16 content_4 = (((u16)buffer[11]) << 8) | ((u16)buffer[10]);55945595if (cmd_len > 12)5596PHYDM_DBG(dm, DBG_FW_TRACE,5597"[FW Msg] Invalid cmd length (( %d )) >12\n",5598cmd_len);5599/*@--------------------------------------------*/5600#ifdef CONFIG_RA_FW_DBG_CODE5601if (function == RATE_DECISION) {5602if (dbg_num == 0) {5603if (content_0 == 1)5604PHYDM_DBG(dm, DBG_FW_TRACE,5605"[FW] RA_CNT=((%d)) Max_device=((%d))--------------------------->\n",5606content_1, content_2);5607else if (content_0 == 2)5608PHYDM_DBG(dm, DBG_FW_TRACE,5609"[FW] Check RA macid= ((%d)), MediaStatus=((%d)), Dis_RA=((%d)), try_bit=((0x%x))\n",5610content_1, content_2, content_3,5611content_4);5612else if (content_0 == 3)5613PHYDM_DBG(dm, DBG_FW_TRACE,5614"[FW] Check RA total=((%d)), drop=((0x%x)), TXRPT_TRY_bit=((%x)), bNoisy=((%x))\n",5615content_1, content_2, content_3,5616content_4);5617} else if (dbg_num == 1) {5618if (content_0 == 1)5619PHYDM_DBG(dm, DBG_FW_TRACE,5620"[FW] RTY[0,1,2,3]=[ %d , %d , %d , %d ]\n",5621content_1, content_2, content_3,5622content_4);5623else if (content_0 == 2) {5624PHYDM_DBG(dm, DBG_FW_TRACE,5625"[FW] RTY[4]=[ %d ], drop=(( %d )), total=(( %d )), current_rate=((0x %x ))",5626content_1, content_2, content_3,5627content_4);5628phydm_print_rate(dm, (u8)content_4,5629DBG_FW_TRACE);5630} else if (content_0 == 3)5631PHYDM_DBG(dm, DBG_FW_TRACE,5632"[FW] penality_idx=(( %d ))\n",5633content_1);5634else if (content_0 == 4)5635PHYDM_DBG(dm, DBG_FW_TRACE,5636"[FW] RSSI=(( %d )), ra_stage = (( %d ))\n",5637content_1, content_2);5638} else if (dbg_num == 3) {5639if (content_0 == 1)5640PHYDM_DBG(dm, DBG_FW_TRACE,5641"[FW] Fast_RA (( DOWN )) total=((%d)), total>>1=((%d)), R4+R3+R2 = ((%d)), RateDownHold = ((%d))\n",5642content_1, content_2, content_3,5643content_4);5644else if (content_0 == 2)5645PHYDM_DBG(dm, DBG_FW_TRACE,5646"[FW] Fast_RA (( UP )) total_acc=((%d)), total_acc>>1=((%d)), R4+R3+R2 = ((%d)), RateDownHold = ((%d))\n",5647content_1, content_2, content_3,5648content_4);5649else if (content_0 == 3)5650PHYDM_DBG(dm, DBG_FW_TRACE,5651"[FW] Fast_RA (( UP )) ((rate Down Hold)) RA_CNT=((%d))\n",5652content_1);5653else if (content_0 == 4)5654PHYDM_DBG(dm, DBG_FW_TRACE,5655"[FW] Fast_RA (( UP )) ((tota_accl<5 skip)) RA_CNT=((%d))\n",5656content_1);5657else if (content_0 == 8)5658PHYDM_DBG(dm, DBG_FW_TRACE,5659"[FW] Fast_RA (( Reset Tx Rpt )) RA_CNT=((%d))\n",5660content_1);5661} else if (dbg_num == 4) {5662if (content_0 == 3)5663PHYDM_DBG(dm, DBG_FW_TRACE,5664"[FW] RER_CNT PCR_ori =(( %d )), ratio_ori =(( %d )), pcr_updown_bitmap =(( 0x%x )), pcr_var_diff =(( %d ))\n",5665content_1, content_2, content_3,5666content_4);5667else if (content_0 == 4)5668PHYDM_DBG(dm, DBG_FW_TRACE,5669"[FW] pcr_shift_value =(( %s%d )), rate_down_threshold =(( %d )), rate_up_threshold =(( %d ))\n",5670((content_1) ? "+" : "-"), content_2,5671content_3, content_4);5672else if (content_0 == 5)5673PHYDM_DBG(dm, DBG_FW_TRACE,5674"[FW] pcr_mean =(( %d )), PCR_VAR =(( %d )), offset =(( %d )), decision_offset_p =(( %d ))\n",5675content_1, content_2, content_3,5676content_4);5677} else if (dbg_num == 5) {5678if (content_0 == 1)5679PHYDM_DBG(dm, DBG_FW_TRACE,5680"[FW] (( UP)) Nsc=(( %d )), N_High=(( %d )), RateUp_Waiting=(( %d )), RateUp_Fail=(( %d ))\n",5681content_1, content_2, content_3,5682content_4);5683else if (content_0 == 2)5684PHYDM_DBG(dm, DBG_FW_TRACE,5685"[FW] ((DOWN)) Nsc=(( %d )), N_Low=(( %d ))\n",5686content_1, content_2);5687else if (content_0 == 3)5688PHYDM_DBG(dm, DBG_FW_TRACE,5689"[FW] ((HOLD)) Nsc=((%d)), N_High=((%d)), N_Low=((%d)), Reset_CNT=((%d))\n",5690content_1, content_2, content_3,5691content_4);5692} else if (dbg_num == 0x60) {5693if (content_0 == 1)5694PHYDM_DBG(dm, DBG_FW_TRACE,5695"[FW] ((AP RPT)) macid=((%d)), BUPDATE[macid]=((%d))\n",5696content_1, content_2);5697else if (content_0 == 4)5698PHYDM_DBG(dm, DBG_FW_TRACE,5699"[FW] ((AP RPT)) pass=((%d)), rty_num=((%d)), drop=((%d)), total=((%d))\n",5700content_1, content_2, content_3,5701content_4);5702else if (content_0 == 5)5703PHYDM_DBG(dm, DBG_FW_TRACE,5704"[FW] ((AP RPT)) PASS=((%d)), RTY_NUM=((%d)), DROP=((%d)), TOTAL=((%d))\n",5705content_1, content_2, content_3,5706content_4);5707}5708} else if (function == INIT_RA_TABLE) {5709if (dbg_num == 3)5710PHYDM_DBG(dm, DBG_FW_TRACE,5711"[FW][INIT_RA_INFO] Ra_init, RA_SKIP_CNT = (( %d ))\n",5712content_0);5713} else if (function == RATE_UP) {5714if (dbg_num == 2) {5715if (content_0 == 1)5716PHYDM_DBG(dm, DBG_FW_TRACE,5717"[FW][RateUp] ((Highest rate->return)), macid=((%d)) Nsc=((%d))\n",5718content_1, content_2);5719} else if (dbg_num == 5) {5720if (content_0 == 0)5721PHYDM_DBG(dm, DBG_FW_TRACE,5722"[FW][RateUp] ((rate UP)), up_rate_tmp=((0x%x)), rate_idx=((0x%x)), SGI_en=((%d)), SGI=((%d))\n",5723content_1, content_2, content_3,5724content_4);5725else if (content_0 == 1)5726PHYDM_DBG(dm, DBG_FW_TRACE,5727"[FW][RateUp] ((rate UP)), rate_1=((0x%x)), rate_2=((0x%x)), BW=((%d)), Try_Bit=((%d))\n",5728content_1, content_2, content_3,5729content_4);5730}5731} else if (function == RATE_DOWN) {5732if (dbg_num == 5) {5733if (content_0 == 1)5734PHYDM_DBG(dm, DBG_FW_TRACE,5735"[FW][RateDownStep] ((rate Down)), macid=((%d)), rate1=((0x%x)), rate2=((0x%x)), BW=((%d))\n",5736content_1, content_2, content_3,5737content_4);5738}5739} else if (function == TRY_DONE) {5740if (dbg_num == 1) {5741if (content_0 == 1)5742PHYDM_DBG(dm, DBG_FW_TRACE,5743"[FW][Try Done] ((try succsess )) macid=((%d)), Try_Done_cnt=((%d))\n",5744content_1, content_2);5745} else if (dbg_num == 2) {5746if (content_0 == 1)5747PHYDM_DBG(dm, DBG_FW_TRACE,5748"[FW][Try Done] ((try)) macid=((%d)), Try_Done_cnt=((%d)), rate_2=((%d)), try_succes=((%d))\n",5749content_1, content_2, content_3,5750content_4);5751}5752} else if (function == RA_H2C) {5753if (dbg_num == 1) {5754if (content_0 == 0)5755PHYDM_DBG(dm, DBG_FW_TRACE,5756"[FW][H2C=0x49] fw_trace_en=((%d)), mode =((%d)), macid=((%d))\n",5757content_1, content_2, content_3);5758}5759} else if (function == F_RATE_AP_RPT) {5760if (dbg_num == 1) {5761if (content_0 == 1)5762PHYDM_DBG(dm, DBG_FW_TRACE,5763"[FW][AP RPT] ((1)), SPE_STATIS=((0x%x))---------->\n",5764content_3);5765} else if (dbg_num == 2) {5766if (content_0 == 1)5767PHYDM_DBG(dm, DBG_FW_TRACE,5768"[FW][AP RPT] RTY_all=((%d))\n",5769content_1);5770} else if (dbg_num == 3) {5771if (content_0 == 1)5772PHYDM_DBG(dm, DBG_FW_TRACE,5773"[FW][AP RPT] MACID1[%d], TOTAL=((%d)), RTY=((%d))\n",5774content_3, content_1, content_2);5775} else if (dbg_num == 4) {5776if (content_0 == 1)5777PHYDM_DBG(dm, DBG_FW_TRACE,5778"[FW][AP RPT] MACID2[%d], TOTAL=((%d)), RTY=((%d))\n",5779content_3, content_1, content_2);5780} else if (dbg_num == 5) {5781if (content_0 == 1)5782PHYDM_DBG(dm, DBG_FW_TRACE,5783"[FW][AP RPT] MACID1[%d], PASS=((%d)), DROP=((%d))\n",5784content_3, content_1, content_2);5785} else if (dbg_num == 6) {5786if (content_0 == 1)5787PHYDM_DBG(dm, DBG_FW_TRACE,5788"[FW][AP RPT] MACID2[%d],, PASS=((%d)), DROP=((%d))\n",5789content_3, content_1, content_2);5790}5791} else if (function == DBC_FW_CLM) {5792PHYDM_DBG(dm, DBG_FW_TRACE,5793"[FW][CLM][%d, %d] = {%d, %d, %d, %d}\n", dbg_num,5794content_0, content_1, content_2, content_3,5795content_4);5796} else {5797PHYDM_DBG(dm, DBG_FW_TRACE,5798"[FW][general][%d, %d, %d] = {%d, %d, %d, %d}\n",5799function, dbg_num, content_0, content_1, content_2,5800content_3, content_4);5801}5802#else5803PHYDM_DBG(dm, DBG_FW_TRACE,5804"[FW][general][%d, %d, %d] = {%d, %d, %d, %d}\n", function,5805dbg_num, content_0, content_1, content_2, content_3,5806content_4);5807#endif5808/*@--------------------------------------------*/58095810#endif /*@#ifdef CONFIG_PHYDM_DEBUG_FUNCTION*/5811}58125813void phydm_fw_trace_handler_8051(void *dm_void, u8 *buffer, u8 cmd_len)5814{5815#ifdef CONFIG_PHYDM_DEBUG_FUNCTION5816struct dm_struct *dm = (struct dm_struct *)dm_void;5817#if 05818if (cmd_len >= 3)5819cmd_buf[cmd_len - 1] = '\0';5820PHYDM_DBG(dm, DBG_FW_TRACE, "[FW DBG Msg] %s\n", &cmd_buf[3]);5821#else58225823int i = 0;5824u8 extend_c2h_sub_id = 0, extend_c2h_dbg_len = 0;5825u8 extend_c2h_dbg_seq = 0;5826u8 fw_debug_trace[128];5827u8 *extend_c2h_dbg_content = 0;58285829if (cmd_len > 127)5830return;58315832extend_c2h_sub_id = buffer[0];5833extend_c2h_dbg_len = buffer[1];5834extend_c2h_dbg_content = buffer + 2; /*@DbgSeq+DbgContent for show HEX*/58355836#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)5837RT_DISP(FC2H, C2H_Summary, ("[Extend C2H packet], Extend_c2hSubId=0x%x, extend_c2h_dbg_len=%d\n",5838extend_c2h_sub_id, extend_c2h_dbg_len));58395840RT_DISP_DATA(FC2H, C2H_Summary, "[Extend C2H packet], Content Hex:", extend_c2h_dbg_content, cmd_len - 2);5841#endif58425843go_backfor_aggre_dbg_pkt:5844i = 0;5845extend_c2h_dbg_seq = buffer[2];5846extend_c2h_dbg_content = buffer + 3;58475848#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)5849RT_DISP(FC2H, C2H_Summary, ("[RTKFW, SEQ= %d] :", extend_c2h_dbg_seq));5850#endif58515852for (;; i++) {5853fw_debug_trace[i] = extend_c2h_dbg_content[i];5854if (extend_c2h_dbg_content[i + 1] == '\0') {5855fw_debug_trace[i + 1] = '\0';5856PHYDM_DBG(dm, DBG_FW_TRACE, "[FW DBG Msg] %s",5857&fw_debug_trace[0]);5858break;5859} else if (extend_c2h_dbg_content[i] == '\n') {5860fw_debug_trace[i + 1] = '\0';5861PHYDM_DBG(dm, DBG_FW_TRACE, "[FW DBG Msg] %s",5862&fw_debug_trace[0]);5863buffer = extend_c2h_dbg_content + i + 3;5864goto go_backfor_aggre_dbg_pkt;5865}5866}58675868#endif5869#endif /*@#ifdef CONFIG_PHYDM_DEBUG_FUNCTION*/5870}587158725873