/****************************************************************************** * * Copyright(c) 2007 - 2020 Realtek Corporation. * * This program is free software; you can redistribute it and/or modify it * under the terms of version 2 of the GNU General Public License as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * The full GNU General Public License is included in this distribution in the * file called LICENSE. * * Contact Information: * wlanfae * Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park, * Hsinchu 300, Taiwan. * * Larry Finger * *****************************************************************************/ #include "halrf_precomp.h" void halrf_dbg_setting_init(struct rf_info *rf) { rf->fw_dbg_component = 0; rf->dbg_component = /*DBG_RF_TX_PWR_TRACK | */ /*DBG_RF_IQK | */ /*DBG_RF_LCK | */ /*DBG_RF_DPK | */ /*DBG_RF_TXGAPK | */ /*DBG_RF_DACK | */ /*DBG_RF_DPK_TRACK | */ /*DBG_RF_RXDCK | */ /*DBG_RF_RFK | */ /*DBG_RF_MP | */ /*DBG_RF_TMP | */ /*DBG_RF_INIT | */ /*DBG_RF_POWER | */ /*DBG_RF_RXGAINK | */ /*DBG_RF_THER_TRIM | */ /*DBG_RF_PABIAS_TRIM | */ /*DBG_RF_TSSI_TRIM | */ /*DBG_RF_PSD | */ /*DBG_RF_CHK | */ /*DBG_RF_XTAL_TRACK | */ 0; rf->cmn_dbg_msg_cnt = HALRF_WATCHDOG_PERIOD; rf->cmn_dbg_msg_period = HALRF_WATCHDOG_PERIOD; } void halrf_iqk_log(struct rf_info *rf) { #if 0 struct halrf_iqk_info *iqk_info = &rf->iqk; /* IQK INFO */ RF_DBG(rf, DBG_RF_IQK, "%-20s\n", "====== IQK Info ======"); RF_DBG(rf, DBG_RF_IQK, "%-20s: %d %d\n", "iqk count / fail count", iqk_info->iqk_cnt, iqk_info->iqk_fail_cnt); RF_DBG(rf, DBG_RF_IQK, "%-20s: %s\n", "segment_iqk", (iqk_info->segment_iqk) ? "True" : "False"); #endif } void halrf_lck_log(struct rf_info *rf) { RF_DBG(rf, DBG_RF_LCK, "%-20s\n", "====== LCK Info ======"); } void halrf_support_ability(struct rf_info *rf, char input[][16], u32 *_used, char *output, u32 *_out_len) { u32 value[10] = {0}; u32 used = *_used; u32 out_len = *_out_len; u8 i; for (i = 0; i < 5; i++) if (input[i + 1]) _os_sscanf(input[i + 1], "%d", &value[i]); if (value[0] == 100) { RF_DBG_CNSL(out_len, used, output + used, out_len - used, "[RF Supportability]\n"); RF_DBG_CNSL(out_len, used, output + used, out_len - used, "00. (( %s ))Power Tracking\n", ((rf->support_ability & HAL_RF_TX_PWR_TRACK) ? ("V") : ("."))); RF_DBG_CNSL(out_len, used, output + used, out_len - used, "01. (( %s ))IQK\n", ((rf->support_ability & HAL_RF_IQK) ? ("V") : ("."))); RF_DBG_CNSL(out_len, used, output + used, out_len - used, "02. (( %s ))LCK\n", ((rf->support_ability & HAL_RF_LCK) ? ("V") : ("."))); RF_DBG_CNSL(out_len, used, output + used, out_len - used, "03. (( %s ))DPK\n", ((rf->support_ability & HAL_RF_DPK) ? ("V") : ("."))); RF_DBG_CNSL(out_len, used, output + used, out_len - used, "04. (( %s ))HAL_RF_TXGAPK\n", ((rf->support_ability & HAL_RF_TXGAPK) ? ("V") : ("."))); RF_DBG_CNSL(out_len, used, output + used, out_len - used, "05. (( %s ))HAL_RF_DACK\n", ((rf->support_ability & HAL_RF_DACK) ? ("V") : ("."))); RF_DBG_CNSL(out_len, used, output + used, out_len - used, "06. (( %s ))DPK_TRACK\n", ((rf->support_ability & HAL_RF_DPK_TRACK) ? ("V") : ("."))); #ifdef CONFIG_2G_BAND_SHIFT RF_DBG_CNSL(out_len, used, output + used, out_len - used, "07. (( %s ))HAL_2GBAND_SHIFT\n", ((rf->support_ability & HAL_2GBAND_SHIFT) ? ("V") : ("."))); #endif RF_DBG_CNSL(out_len, used, output + used, out_len - used, "08. (( %s ))HAL_RF_RXDCK\n", ((rf->support_ability & HAL_RF_RXDCK) ? ("V") : ("."))); RF_DBG_CNSL(out_len, used, output + used, out_len - used, "13. (( %s ))HAL_RF_THER_TRIM\n", ((rf->support_ability & HAL_RF_THER_TRIM) ? ("V") : ("."))); RF_DBG_CNSL(out_len, used, output + used, out_len - used, "14. (( %s ))HAL_RF_PABIAS_TRIM\n", ((rf->support_ability & HAL_RF_PABIAS_TRIM) ? ("V") : ("."))); RF_DBG_CNSL(out_len, used, output + used, out_len - used, "15. (( %s ))HAL_RF_TSSI_TRIM\n", ((rf->support_ability & HAL_RF_TSSI_TRIM) ? ("V") : ("."))); RF_DBG_CNSL(out_len, used, output + used, out_len - used, "17. (( %s ))HAL_RF_TSSI_TRK\n", ((rf->support_ability & HAL_RF_TSSI_TRK) ? ("V") : ("."))); RF_DBG_CNSL(out_len, used, output + used, out_len - used, "18. (( %s ))HAL_RF_XTAL_TRACK\n", ((rf->support_ability & HAL_RF_XTAL_TRACK) ? ("V") : ("."))); RF_DBG_CNSL(out_len, used, output + used, out_len - used, "19. (( %s ))HAL_RF_TX_SHAPE\n", ((rf->support_ability & HAL_RF_TX_SHAPE) ? ("V") : ("."))); } else { if (value[1] == 1) /* enable */ rf->support_ability |= BIT(value[0]); else if (value[1] == 2) /* disable */ rf->support_ability &= ~(BIT(value[0])); else RF_DBG_CNSL(out_len, used, output + used, out_len - used, "[Warning!!!] 1:enable, 2:disable\n"); } RF_DBG_CNSL(out_len, used, output + used, out_len - used, "Curr-RF_supportability = 0x%x\n\n", rf->support_ability); *_used = used; *_out_len = out_len; } void halrf_dbg_trace(struct rf_info *rf, char input[][16], u32 *_used, char *output, u32 *_out_len) { u32 one = 1; u32 used = *_used; u32 out_len = *_out_len; u32 value[10] = {0}; u8 i; for (i = 0; i < 5; i++) if (input[i + 1]) _os_sscanf(input[i + 1], "%d", &value[i]); if (value[0] == 100) { RF_DBG_CNSL(out_len, used, output + used, out_len - used, "[RF Debug Trace Selection]\n"); RF_DBG_CNSL(out_len, used, output + used, out_len - used, "00. (( %s ))TX_PWR_TRACK\n", ((rf->dbg_component & DBG_RF_TX_PWR_TRACK) ? ("V") : ("."))); RF_DBG_CNSL(out_len, used, output + used, out_len - used, "01. (( %s ))IQK\n", ((rf->dbg_component & DBG_RF_IQK) ? ("V") : ("."))); RF_DBG_CNSL(out_len, used, output + used, out_len - used, "02. (( %s ))LCK\n", ((rf->dbg_component & DBG_RF_LCK) ? ("V") : ("."))); RF_DBG_CNSL(out_len, used, output + used, out_len - used, "03. (( %s ))DPK\n", ((rf->dbg_component & DBG_RF_DPK) ? ("V") : ("."))); RF_DBG_CNSL(out_len, used, output + used, out_len - used, "04. (( %s ))TXGAPK\n", ((rf->dbg_component & DBG_RF_TXGAPK) ? ("V") : ("."))); RF_DBG_CNSL(out_len, used, output + used, out_len - used, "05. (( %s ))DACK\n", ((rf->dbg_component & DBG_RF_DACK) ? ("V") : ("."))); RF_DBG_CNSL(out_len, used, output + used, out_len - used, "06. (( %s ))DPK_TRACK\n", ((rf->dbg_component & DBG_RF_DPK_TRACK) ? ("V") : ("."))); RF_DBG_CNSL(out_len, used, output + used, out_len - used, "08. (( %s ))RXDCK\n", ((rf->dbg_component & DBG_RF_RXDCK) ? ("V") : ("."))); RF_DBG_CNSL(out_len, used, output + used, out_len - used, "09. (( %s ))RFK\n", ((rf->dbg_component & DBG_RF_RFK) ? ("V") : ("."))); RF_DBG_CNSL(out_len, used, output + used, out_len - used, "10. (( %s ))INIT\n", ((rf->dbg_component & DBG_RF_INIT) ? ("V") : ("."))); RF_DBG_CNSL(out_len, used, output + used, out_len - used, "11. (( %s ))POWER\n", ((rf->dbg_component & DBG_RF_POWER) ? ("V") : ("."))); RF_DBG_CNSL(out_len, used, output + used, out_len - used, "28. (( %s ))FW\n", ((rf->dbg_component & DBG_RF_FW) ? ("V") : ("."))); RF_DBG_CNSL(out_len, used, output + used, out_len - used, "29. (( %s ))MP\n", ((rf->dbg_component & DBG_RF_MP) ? ("V") : ("."))); RF_DBG_CNSL(out_len, used, output + used, out_len - used, "30. (( %s ))TMP\n", ((rf->dbg_component & DBG_RF_TMP) ? ("V") : ("."))); } else if (value[0] == 101) { rf->dbg_component = 0; RF_DBG_CNSL(out_len, used, output + used, out_len - used, "Disable all DBG COMP\n"); } else { if (value[1] == 1) /*enable*/ rf->dbg_component |= (one << value[0]); else if (value[1] == 2) /*disable*/ rf->dbg_component &= ~(one << value[0]); } RF_DBG_CNSL(out_len, used, output + used, out_len - used, "Curr-RF_Dbg_Comp = 0x%x\n", rf->dbg_component); *_used = used; *_out_len = out_len; } void halrf_dump_rfk_reg(struct rf_info *rf, char input[][16], u32 *_used, char *output, u32 *_out_len) { u32 val[10] = {0}; u32 used = *_used; u32 out_len = *_out_len; u32 addr = 0; RF_DBG_CNSL(out_len, used, output + used, out_len - used, "===================[ RFK Reg start ]===================\n"); for (addr = 0x8000; addr < 0xa000; addr += 0x10) RF_DBG_CNSL(out_len, used, output + used, out_len - used, " 0x%x : 0x%08x 0x%08x 0x%08x 0x%08x\n", addr, halrf_rreg(rf, addr, MASKDWORD), halrf_rreg(rf, addr + 0x4, MASKDWORD), halrf_rreg(rf, addr + 0x8, MASKDWORD), halrf_rreg(rf, addr + 0xc, MASKDWORD)); *_used = used; *_out_len = out_len; } void _halrf_dpk_info(struct rf_info *rf, char input[][16], u32 *_used, char *output, u32 *_out_len) { struct rtw_hal_com_t *hal_i = rf->hal_com; struct halrf_dpk_info *dpk = &rf->dpk; u32 used = *_used; u32 out_len = *_out_len; char *ic_name = NULL; u32 dpk_ver = 0; u32 rf_para = 0; u32 rfk_init_ver = 0; u8 path, kidx; u32 rf_para_min = 0; switch (hal_i->chip_id) { #ifdef RF_8852A_SUPPORT case CHIP_WIFI6_8852A: ic_name = "8852A"; dpk_ver = DPK_VER_8852A; rf_para_min = 16; break; #endif #ifdef RF_8852B_SUPPORT case CHIP_WIFI6_8852B: ic_name = "8852B"; dpk_ver = DPK_VER_8852B; break; #endif default: break; } rf_para = halrf_get_radio_reg_ver(rf); rfk_init_ver = halrf_get_nctl_reg_ver(rf); RF_DBG_CNSL(out_len, used, output + used, out_len - used, "\n===============[ DPK info %s ]===============\n", ic_name); RF_DBG_CNSL(out_len, used, output + used, out_len - used, " %-25s = 0x%x\n", "DPK Ver", dpk_ver); RF_DBG_CNSL(out_len, used, output + used, out_len - used, " %-25s = %d (%s)\n", "RF Para Ver", rf_para, rf_para >= rf_para_min ? "match" : "mismatch"); RF_DBG_CNSL(out_len, used, output + used, out_len - used, " %-25s = 0x%x\n", "RFK init ver", rfk_init_ver); RF_DBG_CNSL(out_len, used, output + used, out_len - used, " %-25s = %d / %d / %d (RFE type:%d)\n", "Ext_PA 2G / 5G / 6G", rf->fem.epa_2g, rf->fem.epa_5g, rf->fem.epa_6g, rf->phl_com->dev_cap.rfe_type); if (dpk->bp[0][0].ch == 0) { RF_DBG_CNSL(out_len, used, output + used, out_len - used, "\n %-25s\n", "No DPK had been done before!!!"); return; } RF_DBG_CNSL(out_len, used, output + used, out_len - used, " %-25s = %d / %d / %d\n", "DPK Cal / OK / Reload", dpk->dpk_cal_cnt, dpk->dpk_ok_cnt, dpk->dpk_reload_cnt); RF_DBG_CNSL(out_len, used, output + used, out_len - used, " %-25s = %s\n", "BT IQK timeout", rf->is_bt_iqk_timeout ? "Yes" : "No"); RF_DBG_CNSL(out_len, used, output + used, out_len - used, " %-25s = %s\n", "DPD status", dpk->is_dpk_enable ? "Enable" : "Disable"); RF_DBG_CNSL(out_len, used, output + used, out_len - used, " %-25s = %s\n", "DPD track status", (rf->support_ability & HAL_RF_DPK_TRACK) ? "Enable" : "Disable"); RF_DBG_CNSL(out_len, used, output + used, out_len - used, " %-25s = %s / %s\n", "DBCC / TSSI", rf->hal_com->dbcc_en ? "On" : "Off", rf->is_tssi_mode[0] ? "On" : "Off"); for (path = 0; path < KPATH; path++) { for (kidx = 0; kidx < DPK_BKUP_NUM; kidx++) { if (dpk->bp[path][kidx].ch == 0) break; RF_DBG_CNSL(out_len, used, output + used, out_len - used, "=============== S%d[%d] ===============\n", path, kidx); RF_DBG_CNSL(out_len, used, output + used, out_len - used, " %-25s = %s / %d / %s\n", "Band / CH / BW", dpk->bp[path][kidx].band == 0 ? "2G" : (dpk->bp[path][kidx].band == 1 ? "5G" : "6G"), dpk->bp[path][kidx].ch, dpk->bp[path][kidx].bw == 0 ? "20M" : (dpk->bp[path][kidx].bw == 1 ? "40M" : "80M")); RF_DBG_CNSL(out_len, used, output + used, out_len - used, " %-25s = %s \n", "DPK result", dpk->bp[path][kidx].path_ok ? "OK" : "Fail"); RF_DBG_CNSL(out_len, used, output + used, out_len - used, " %-25s = 0x%x / 0x%x\n", "DPK TxAGC / Gain Scaling", dpk->bp[path][kidx].txagc_dpk, dpk->bp[path][kidx].gs); RF_DBG_CNSL(out_len, used, output + used, out_len - used, " %-25s = %d / %d\n", "Corr (idx/val)", dpk->corr_idx[path][kidx], dpk->corr_val[path][kidx]); RF_DBG_CNSL(out_len, used, output + used, out_len - used, " %-25s = %d / %d\n", "DC (I/Q)", dpk->dc_i[path][kidx], dpk->dc_q[path][kidx]); } } *_used = used; *_out_len = out_len; } void halrf_dpk_dbg_cmd(struct rf_info *rf, char input[][16], u32 *_used, char *output, u32 *_out_len) { #if 1 char *cmd[5] = {"-h", "on", "off", "info", "trigger"}; u32 used = *_used; u32 out_len = *_out_len; u32 val = 0; u8 i; if (!(rf->support_ability & HAL_RF_DPK)) { RF_DBG_CNSL(out_len, used, output + used, out_len - used, "DPK is Unsupported!!!\n"); return; } if (_os_strcmp(input[1], cmd[0]) == 0) { for (i = 1; i < 5; i++) RF_DBG_CNSL(out_len, used, output + used, out_len - used, " %s\n", cmd[i]); } else if (_os_strcmp(input[1], cmd[1]) == 0) { RF_DBG_CNSL(out_len, used, output + used, out_len - used, "DPK is Enabled!!\n"); halrf_dpk_onoff(rf, true); } else if (_os_strcmp(input[1], cmd[2]) == 0) { RF_DBG_CNSL(out_len, used, output + used, out_len - used, "DPK is Disabled!!\n"); halrf_dpk_onoff(rf, false); } else if (_os_strcmp(input[1], cmd[3]) == 0) { _halrf_dpk_info(rf, input, &used, output, &out_len); } else if (_os_strcmp(input[1], cmd[4]) == 0){ RF_DBG_CNSL(out_len, used, output + used, out_len - used, " DPK Trigger start!!\n"); _os_sscanf(input[1], "%d", &val); halrf_dpk_trigger(rf, val, false); RF_DBG_CNSL(out_len, used, output + used, out_len - used, " DPK Trigger finish!!\n"); } else RF_DBG_CNSL(out_len, used, output + used, out_len - used, " No CMD find!!\n"); *_used = used; *_out_len = out_len; #endif } void halrf_rx_dck_info(struct rf_info *rf, char input[][16], u32 *_used, char *output, u32 *_out_len) { struct rtw_hal_com_t *hal_i = rf->hal_com; struct halrf_rx_dck_info *rx_dck = &rf->rx_dck; u32 used = *_used; u32 out_len = *_out_len; char *ic_name = NULL; u32 rxdck_ver = 0; u8 path; u32 addr = 0; u32 reg_05[KPATH]; switch (hal_i->chip_id) { #ifdef RF_8852A_SUPPORT case CHIP_WIFI6_8852A: ic_name = "8852A"; rxdck_ver = RXDCK_VER_8852A; break; #endif #ifdef RF_8852B_SUPPORT case CHIP_WIFI6_8852B: ic_name = "8852B"; rxdck_ver = RXDCK_VER_8852B; break; #endif default: break; } RF_DBG_CNSL(out_len, used, output + used, out_len - used, "\n===============[ RX_DCK info %s ]===============\n", ic_name); RF_DBG_CNSL(out_len, used, output + used, out_len - used, " %-25s = 0x%x\n", "RX_DCK Ver", rxdck_ver); if (rx_dck->loc[0].cur_ch == 0) { RF_DBG_CNSL(out_len, used, output + used, out_len - used, "\n %-25s\n", "No RX_DCK had been done before!!!"); return; } for (path = 0; path < KPATH; path++) { RF_DBG_CNSL(out_len, used, output + used, out_len - used, " S%d:", path); RF_DBG_CNSL(out_len, used, output + used, out_len - used, " %-25s = %s / %d / %s / %s\n", "Band / CH / BW / Cal", rx_dck->loc[path].cur_band == 0 ? "2G" : (rx_dck->loc[path].cur_band == 1 ? "5G" : "6G"), rx_dck->loc[path].cur_ch, rx_dck->loc[path].cur_bw == 0 ? "20M" : (rx_dck->loc[path].cur_bw == 1 ? "40M" : "80M"), rx_dck->is_afe ? "AFE" : "RFC"); } for (path = 0; path < KPATH; path++) { RF_DBG_CNSL(out_len, used, output + used, out_len - used, "\n---------------[ S%d DCK Value ]---------------\n", path); reg_05[path] = halrf_rrf(rf, path, 0x5, MASKRF); halrf_wrf(rf, path, 0x5, BIT(0), 0x0); halrf_wrf(rf, path, 0x00, MASKRFMODE, RF_RX); for (addr = 0; addr < 0x20; addr++) { halrf_wrf(rf, path, 0x00, 0x07c00, addr); /*[14:10]*/ RF_DBG_CNSL(out_len, used, output + used, out_len - used, "0x%02x | 0x%02x/ 0x%02x 0x%02x/ 0x%02x\n", addr, halrf_rrf(rf, path, 0x92, 0xF0000), /*[19:16]*/ halrf_rrf(rf, path, 0x92, 0x0FC00), /*[15:10]*/ halrf_rrf(rf, path, 0x93, 0xF0000), /*[19:16]*/ halrf_rrf(rf, path, 0x93, 0x0FC00)); /*[15:10]*/ } halrf_wrf(rf, path, 0x5, BIT(0), reg_05[path]); } *_used = used; *_out_len = out_len; } void halrf_get_rx_dck_value(struct rf_info *rf, char input[][16], u32 *_used, char *output, u32 *_out_len) { u32 val_1 = 0, val_2 = 0; u32 used = *_used; u32 out_len = *_out_len; u32 reg_05[KPATH]; _os_sscanf(input[2], "%d", &val_1); /*RF path*/ _os_sscanf(input[3], "%x", &val_2); /*RF 0x0*/ if (val_1 > 3) { RF_DBG_CNSL(out_len, used, output + used, out_len - used, " Wrong path number!!\n"); return; } reg_05[val_1] = halrf_rrf(rf, val_1, 0x5, MASKRF); halrf_wrf(rf, val_1, 0x5, BIT(0), 0x0); halrf_wrf(rf, val_1, 0x00, MASKRF, val_2); RF_DBG_CNSL(out_len, used, output + used, out_len - used, " Input S%d RF0x00 = 0x%x\n", val_1, val_2); RF_DBG_CNSL(out_len, used, output + used, out_len - used, " Get I : RXBB / TIA = 0x%x / 0x%x\n", halrf_rrf(rf, val_1, 0x92, 0xF0000), /*[19:16]*/ halrf_rrf(rf, val_1, 0x92, 0x0FC00)); /*[15:10]*/ RF_DBG_CNSL(out_len, used, output + used, out_len - used, " Get Q : RXBB / TIA = 0x%x / 0x%x\n", halrf_rrf(rf, val_1, 0x93, 0xF0000), /*[19:16]*/ halrf_rrf(rf, val_1, 0x93, 0x0FC00)); /*[15:10]*/ halrf_wrf(rf, val_1, 0x5, BIT(0), reg_05[val_1]); *_used = used; *_out_len = out_len; } void halrf_rx_dck_dbg_cmd(struct rf_info *rf, char input[][16], u32 *_used, char *output, u32 *_out_len) { char *cmd[6] = {"-h", "on", "off", "info", "trigger", "get"}; u32 used = *_used; u32 out_len = *_out_len; u32 val_1 = 0, val_2 = 0; u8 i; if (!(rf->support_ability & HAL_RF_RXDCK)) { RF_DBG_CNSL(out_len, used, output + used, out_len - used, "RX_DCK is Unsupported!!!\n"); return; } if (_os_strcmp(input[1], cmd[0]) == 0) { for (i = 1; i < 6; i++) RF_DBG_CNSL(out_len, used, output + used, out_len - used, " %s\n", cmd[i]); } else if (_os_strcmp(input[1], cmd[1]) == 0) { RF_DBG_CNSL(out_len, used, output + used, out_len - used, "RX_DCK is Enabled!!\n"); halrf_rx_dck_onoff(rf, true); } else if (_os_strcmp(input[1], cmd[2]) == 0) { RF_DBG_CNSL(out_len, used, output + used, out_len - used, "RX_DCK is Disabled!!\n"); halrf_rx_dck_onoff(rf, false); } else if (_os_strcmp(input[1], cmd[3]) == 0) { halrf_rx_dck_info(rf, input, &used, output, &out_len); } else if (_os_strcmp(input[1], cmd[4]) == 0) { RF_DBG_CNSL(out_len, used, output + used, out_len - used, "RX DCK Trigger\n"); _os_sscanf(input[2], "%d", &val_1); _os_sscanf(input[3], "%d", &val_2); halrf_rx_dck_trigger(rf, val_1, (bool)val_2); } else if (_os_strcmp(input[1], cmd[5]) == 0) { halrf_get_rx_dck_value(rf, input, &used, output, &out_len); } else RF_DBG_CNSL(out_len, used, output + used, out_len - used, " No CMD find!!\n"); *_used = used; *_out_len = out_len; } void halrf_dack_info(struct rf_info *rf, char input[][16], u32 *_used, char *output, u32 *_out_len) { struct rtw_hal_com_t *hal_i = rf->hal_com; struct halrf_dack_info *dack = &rf->dack; u32 used = *_used; u32 out_len = *_out_len; char *ic_name = NULL; u32 dack_ver = 0; u32 rf_para = 0; u32 rfk_init_ver = 0; u8 i; switch (hal_i->chip_id) { #ifdef RF_8852A_SUPPORT case CHIP_WIFI6_8852A: ic_name = "8852A"; dack_ver = DACK_VER_8852AB; rf_para = halrf_get_radio_reg_ver(rf); break; #endif default: break; } RF_DBG_CNSL(out_len, used, output + used, out_len - used, "\n===============[ DACK info %s ]===============\n", ic_name); RF_DBG_CNSL(out_len, used, output + used, out_len - used, " %-25s = 0x%x\n", "DACK Ver", dack_ver); RF_DBG_CNSL(out_len, used, output + used, out_len - used, " %-25s = %d\n", "RF Para Ver", rf_para); if (dack->dack_cnt == 0) { RF_DBG_CNSL(out_len, used, output + used, out_len - used, "\n %-25s\n", "No DACK had been done before!!!"); return; } RF_DBG_CNSL(out_len, used, output + used, out_len - used, " %-25s = %d\n", "DACK count", dack->dack_cnt); RF_DBG_CNSL(out_len, used, output + used, out_len - used, " %-25s = %d ms\n", "DACK processing time", dack->dack_time); RF_DBG_CNSL(out_len, used, output + used, out_len - used, " %-60s = %d / %d / %d / %d / %d / %d\n", "DACK timeout(ADDCK_0/ADDCK_1/DADCK_0/DADCK_1/MSBK_0/MSBK_1):", dack->addck_timeout[0], dack->addck_timeout[1], dack->dadck_timeout[0], dack->dadck_timeout[1], dack->msbk_timeout[0], dack->msbk_timeout[1]); RF_DBG_CNSL(out_len, used, output + used, out_len - used, " %-25s = %s\n", "DACK Fail(last)", (dack->dack_fail) ? "TRUE" : "FALSE"); RF_DBG_CNSL(out_len, used, output + used, out_len - used, "===============[ ADDCK result ]===============\n"); RF_DBG_CNSL(out_len, used, output + used, out_len - used, " %-25s = 0x%x / 0x%x \n", "S0_I/ S0_Q", dack->addck_d[0][0], dack->addck_d[0][1]); RF_DBG_CNSL(out_len, used, output + used, out_len - used, " %-25s = 0x%x / 0x%x \n", "S1_I/ S1_Q", dack->addck_d[1][0], dack->addck_d[1][1]); RF_DBG_CNSL(out_len, used, output + used, out_len - used, "===============[ DADCK result ]===============\n"); RF_DBG_CNSL(out_len, used, output + used, out_len - used, " %-25s = 0x%x / 0x%x \n", "S0_I/ S0_Q", dack->dadck_d[0][0], dack->dadck_d[0][1]); RF_DBG_CNSL(out_len, used, output + used, out_len - used, " %-25s = 0x%x / 0x%x \n", "S1_I/ S1_Q", dack->dadck_d[1][0], dack->dadck_d[1][1]); RF_DBG_CNSL(out_len, used, output + used, out_len - used, "===============[ biask result ]===============\n"); RF_DBG_CNSL(out_len, used, output + used, out_len - used, " %-25s = 0x%x / 0x%x \n", "S0_I/ S0_Q", dack->biask_d[0][0], dack->biask_d[0][1]); RF_DBG_CNSL(out_len, used, output + used, out_len - used, " %-25s = 0x%x / 0x%x \n", "S1_I/ S1_Q", dack->biask_d[1][0], dack->biask_d[1][1]); RF_DBG_CNSL(out_len, used, output + used, out_len - used, "===============[ MSBK result ]===============\n"); for (i = 0; i < 16; i++) { RF_DBG_CNSL(out_len, used, output + used, out_len - used, " %s [%2d] = 0x%x/ 0x%x/ 0x%x/ 0x%x\n", "S0_I/S0_Q/S1_I/S1_Q", i, dack->msbk_d[0][0][i], dack->msbk_d[0][1][i], dack->msbk_d[1][0][i], dack->msbk_d[1][1][i]); } *_used = used; *_out_len = out_len; } void halrf_dack_dbg_cmd(struct rf_info *rf, char input[][16], u32 *_used, char *output, u32 *_out_len) { #if 1 char *cmd[5] = {"-h", "on", "off", "info", "trigger"}; u32 used = *_used; u32 out_len = *_out_len; u32 val = 0; u8 i; if (!(rf->support_ability & HAL_RF_DACK)) { RF_DBG_CNSL(out_len, used, output + used, out_len - used, "DACK is Unsupported!!!\n"); return; } if (_os_strcmp(input[1], cmd[0]) == 0) { for (i = 1; i < 5; i++) RF_DBG_CNSL(out_len, used, output + used, out_len - used, " %s\n", cmd[i]); } else if (_os_strcmp(input[1], cmd[1]) == 0) { RF_DBG_CNSL(out_len, used, output + used, out_len - used, "DPK is Enabled!!\n"); halrf_dack_onoff(rf, true); } else if (_os_strcmp(input[1], cmd[2]) == 0) { RF_DBG_CNSL(out_len, used, output + used, out_len - used, "DPK is Disabled!!\n"); halrf_dack_onoff(rf, false); } else if (_os_strcmp(input[1], cmd[3]) == 0) { halrf_dack_info(rf, input, &used, output, &out_len); } else if (_os_strcmp(input[1], cmd[4]) == 0){ RF_DBG_CNSL(out_len, used, output + used, out_len - used, " DACKTrigger start!!\n"); _os_sscanf(input[1], "%d", &val); halrf_dack_trigger(rf, true); RF_DBG_CNSL(out_len, used, output + used, out_len - used, " DACK Trigger finish!!\n"); } else RF_DBG_CNSL(out_len, used, output + used, out_len - used, " No CMD find!!\n"); *_used = used; *_out_len = out_len; #endif } void _halrf_tssi_info(struct rf_info *rf, char input[][16], u32 *_used, char *output, u32 *_out_len) { struct rtw_hal_com_t *hal_i = rf->hal_com; struct halrf_tssi_info *tssi_info = &rf->tssi; struct halrf_dpk_info *dpk = &rf->dpk; u8 channel = rf->hal_com->band[0].cur_chandef.center_ch; u32 bw = rf->hal_com->band[0].cur_chandef.bw; u32 band = rf->hal_com->band[0].cur_chandef.band; u8 txsc_ch = rf->hal_com->band[0].cur_chandef.chan; u32 used = *_used; u32 out_len = *_out_len; char *ic_name = NULL; u32 tssi_ver = 0; switch (hal_i->chip_id) { #ifdef RF_8852A_SUPPORT case CHIP_WIFI6_8852A: ic_name = "8852A"; tssi_ver = TSSI_VER_8852A; break; #endif #ifdef RF_8852B_SUPPORT case CHIP_WIFI6_8852B: ic_name = "8852B"; tssi_ver = TSSI_VER_8852B; break; #endif default: break; } RF_DBG_CNSL(out_len, used, output + used, out_len - used, "\n===============[ TSSI info %s ]===============\n", ic_name); RF_DBG_CNSL(out_len, used, output + used, out_len - used, " %-25s = 0x%x\n", "TSSI Ver", tssi_ver); RF_DBG_CNSL(out_len, used, output + used, out_len - used, " %-25s = %d / %d / %d (RFE type:%d)\n", "Ext_PA 2G / 5G / 6G", rf->fem.epa_2g, rf->fem.epa_5g, rf->fem.epa_6g, rf->phl_com->dev_cap.rfe_type); //RF_DBG_CNSL(out_len, used, output + used, out_len - used, " %-25s = %s\n", // "BT IQK timeout", rf->is_bt_iqk_timeout ? "Yes" : "No"); RF_DBG_CNSL(out_len, used, output + used, out_len - used, " %-25s = %s/%s\n", "TSSI status A/B", rf->is_tssi_mode[RF_PATH_A] ? "Enable" : "Disable", rf->is_tssi_mode[RF_PATH_B] ? "Enable" : "Disable"); RF_DBG_CNSL(out_len, used, output + used, out_len - used, " %-25s = %s / %s\n", "DBCC / DPK", rf->hal_com->dbcc_en ? "On" : "Off", dpk->is_dpk_enable ? "On" : "Off"); RF_DBG_CNSL(out_len, used, output + used, out_len - used, " %-25s = %s / %d / %s / %d\n", "Band / CH / BW / TXSC", band == BAND_ON_24G ? "2G" : (band == BAND_ON_5G ? "5G" : "6G"), channel, bw == 0 ? "20M" : (bw == 1 ? "40M" : "80M"), txsc_ch); RF_DBG_CNSL(out_len, used, output + used, out_len - used, " %-25s : DE(%d) = EFUSE(%d) + Trim(%d)\n", "TSSI DE CCK A", tssi_info->curr_tssi_cck_de[RF_PATH_A], tssi_info->curr_tssi_efuse_cck_de[RF_PATH_A], tssi_info->curr_tssi_trim_de[RF_PATH_A]); RF_DBG_CNSL(out_len, used, output + used, out_len - used, " %-25s : DE(%d) = EFUSE(%d) + Trim(%d)\n", "TSSI DE CCK B", tssi_info->curr_tssi_cck_de[RF_PATH_B], tssi_info->curr_tssi_efuse_cck_de[RF_PATH_B], tssi_info->curr_tssi_trim_de[RF_PATH_B]); RF_DBG_CNSL(out_len, used, output + used, out_len - used, " %-25s : DE(%d) = EFUSE(%d) + Trim(%d)\n", "TSSI DE OFDM A", tssi_info->curr_tssi_ofdm_de[RF_PATH_A], tssi_info->curr_tssi_efuse_ofdm_de[RF_PATH_A], tssi_info->curr_tssi_trim_de[RF_PATH_A]); RF_DBG_CNSL(out_len, used, output + used, out_len - used, " %-25s : DE(%d) = EFUSE(%d) + Trim(%d)\n", "TSSI DE OFDM B", tssi_info->curr_tssi_ofdm_de[RF_PATH_B], tssi_info->curr_tssi_efuse_ofdm_de[RF_PATH_B], tssi_info->curr_tssi_trim_de[RF_PATH_B]); halrf_get_tssi_info(rf, input, &used, output, &out_len); *_used = used; *_out_len = out_len; } void halrf_tssi_dbg_cmd(struct rf_info *rf, char input[][16], u32 *_used, char *output, u32 *_out_len) { char *cmd[7] = {"-h", "on", "off", "info", "trk", "trigger", "final"}; u32 used = *_used; u32 out_len = *_out_len; u32 val = 0, val1 = 0; u8 i; #if 0 if (!(rf->support_ability & HAL_RF_TX_PWR_TRACK)) { RF_DBG_CNSL(out_len, used, output + used, out_len - used, "TSSI is Unsupported!!!\n"); return; } #endif if (_os_strcmp(input[1], cmd[0]) == 0) { for (i = 1; i < 7; i++) RF_DBG_CNSL(out_len, used, output + used, out_len - used, " %s\n", cmd[i]); } else if (_os_strcmp(input[1], cmd[1]) == 0) { RF_DBG_CNSL(out_len, used, output + used, out_len - used, "TSSI is Enabled!!\n"); halrf_tssi_enable(rf, val); } else if (_os_strcmp(input[1], cmd[2]) == 0) { RF_DBG_CNSL(out_len, used, output + used, out_len - used, "TSSI is Disabled!!\n"); halrf_tssi_disable(rf, val); } else if (_os_strcmp(input[1], cmd[3]) == 0) { _halrf_tssi_info(rf, input, &used, output, &out_len); } else if (_os_strcmp(input[1], cmd[4]) == 0) { halrf_get_tssi_trk_info(rf, input, &used, output, &out_len); } else if (_os_strcmp(input[1], cmd[5]) == 0) { RF_DBG_CNSL(out_len, used, output + used, out_len - used, "TSSI Trigger start!!\n"); _os_sscanf(input[2], "%d", &val); halrf_tssi_trigger(rf, val); RF_DBG_CNSL(out_len, used, output + used, out_len - used, "TSSI Trigger finish, TSSI ON!!!\n"); } else if (_os_strcmp(input[1], cmd[6]) == 0){ _os_sscanf(input[1], "%d", &val); _os_sscanf(input[2], "%d", &val1); RF_DBG_CNSL(out_len, used, output + used, out_len - used, "TSSI Final Path%s\n", (val1 == RF_PATH_A) ? "A" : "B"); RF_DBG_CNSL(out_len, used, output + used, out_len - used, "TSSI Final Path%s Result:%d\n", (val1 == RF_PATH_A) ? "A" : "B", halrf_tssi_get_final(rf, val, (u8)val1)); } else RF_DBG_CNSL(out_len, used, output + used, out_len - used, " No CMD find!!\n"); *_used = used; *_out_len = out_len; } static void _halrf_iqk_info(struct rf_info *rf, char input[][16], u32 *_used, char *output, u32 *_out_len) { struct rtw_hal_com_t *hal_i = rf->hal_com; struct halrf_iqk_info *iqk_info = &rf->iqk; u32 used = *_used; u32 out_len = *_out_len; char *ic_name = NULL; u32 ver = 0; u32 rfk_init_ver = 0; //RF_DBG(rf, DBG_RF_IQK, "[IQK]===>%s\n", __func__); switch (hal_i->chip_id) { case CHIP_WIFI6_8852A: ic_name = "8852A"; ver = halrf_get_iqk_ver(rf); rfk_init_ver = halrf_get_nctl_reg_ver(rf); break; default: break; } RF_DBG_CNSL(out_len, used, output + used, out_len - used, "\n===============[ IQK info %s ]===============\n", ic_name); RF_DBG_CNSL(out_len, used, output + used, out_len - used, " %-25s = 0x%x\n", "IQK Version", ver); RF_DBG_CNSL(out_len, used, output + used, out_len - used, " %-25s = 0x%x\n", "RFK init ver", rfk_init_ver); RF_DBG_CNSL(out_len, used, output + used, out_len - used, " %-25s = %d / %d / %d\n", "IQK Cal / Fail / Reload", iqk_info->iqk_times, iqk_info->iqk_fail_cnt, iqk_info->reload_cnt); RF_DBG_CNSL(out_len, used, output + used, out_len - used, " %-25s = %s / %d / %s\n", "S0 Band / CH / BW", iqk_info->iqk_band[0]== 0 ? "2G" : (iqk_info->iqk_band[0] == 1 ? "5G" : "6G"), iqk_info->iqk_ch[0], iqk_info->iqk_bw[0] == 0 ? "20M" : (iqk_info->iqk_bw[0] == 1 ? "40M" : "80M")); RF_DBG_CNSL(out_len, used, output + used, out_len - used, " %-25s = %s\n", "S0 NB/WB TXIQK", iqk_info->is_wb_txiqk[0]? "WBTXK" : "NBTXK"); RF_DBG_CNSL(out_len, used, output + used, out_len - used, " %-25s = %s\n", "S0 NB/WB RXIQK", iqk_info->is_wb_rxiqk[0]? "WBRXK" : "NBRXK"); RF_DBG_CNSL(out_len, used, output + used, out_len - used, " %-25s = %s\n", "S0 LOK status", (iqk_info->lok_cor_fail[0][0] | iqk_info->lok_fin_fail[0][0]) ? "Fail" : "Pass"); RF_DBG_CNSL(out_len, used, output + used, out_len - used, " %-25s = %s\n", "S0 TXK status", iqk_info->iqk_tx_fail[0][0]? "Fail" : "Pass"); RF_DBG_CNSL(out_len, used, output + used, out_len - used, " %-25s = %s\n", "S0 RXK status", iqk_info->iqk_rx_fail[0][0]? "Fail" : "Pass"); RF_DBG_CNSL(out_len, used, output + used, out_len - used, " %-25s = %s / %d / %s\n", "S1 Band / CH / BW", iqk_info->iqk_band[1]== 0 ? "2G" : (iqk_info->iqk_band[1] == 1 ? "5G" : "6G"), iqk_info->iqk_ch[1], iqk_info->iqk_bw[1] == 0 ? "20M" : (iqk_info->iqk_bw[1] == 1 ? "40M" : "80M")); RF_DBG_CNSL(out_len, used, output + used, out_len - used, " %-25s = %s\n", "S1 NB/WB TXIQK", iqk_info->is_wb_txiqk[1]? "WBTXK" : "NBTXK"); RF_DBG_CNSL(out_len, used, output + used, out_len - used, " %-25s = %s\n", "S1 NB/WB RXIQK", iqk_info->is_wb_rxiqk[1]? "WBRXK" : "NBRXK"); RF_DBG_CNSL(out_len, used, output + used, out_len - used, " %-25s = %s\n", "S1 LOK status", (iqk_info->lok_cor_fail[0][1] | iqk_info->lok_fin_fail[0][1]) ? "Fail" : "Pass"); RF_DBG_CNSL(out_len, used, output + used, out_len - used, " %-25s = %s\n", "S1 TXK status", iqk_info->iqk_tx_fail[0][1]? "Fail" : "Pass"); RF_DBG_CNSL(out_len, used, output + used, out_len - used, " %-25s = %s\n", "S1 RXK status", iqk_info->iqk_rx_fail[0][1]? "Fail" : "Pass"); *_used = used; *_out_len = out_len; return; } void halrf_iqk_bypass_cmd(struct rf_info *rf, char input[][16], u32 *_used, char *output, u32 *_out_len) { #if 1 char *cmd[4] = {"-h", "lok", "txk", "rxk"}; u32 used = *_used; u32 out_len = *_out_len; u32 val = 0; u8 i; if (!(rf->support_ability & HAL_RF_IQK)) { RF_DBG_CNSL(out_len, used, output + used, out_len - used, "IQK is Unsupported!!!\n"); return; } if (_os_strcmp(input[1], cmd[0]) == 0) { for (i = 1; i < 4; i++) RF_DBG_CNSL(out_len, used, output + used, out_len - used, " %s\n", cmd[i]); } else if (_os_strcmp(input[1], cmd[1]) == 0) { RF_DBG_CNSL(out_len, used, output + used, out_len - used, "LOK is Bypass!!\n"); halrf_iqk_lok_bypass(rf, 0x0); halrf_iqk_lok_bypass(rf, 0x1); } else if (_os_strcmp(input[1], cmd[2]) == 0) { RF_DBG_CNSL(out_len, used, output + used, out_len - used, "TOK is Bypass!!\n"); halrf_iqk_tx_bypass(rf, 0x0); halrf_iqk_tx_bypass(rf, 0x1); } else if (_os_strcmp(input[1], cmd[3]) == 0) { RF_DBG_CNSL(out_len, used, output + used, out_len - used, "RXK is Bypass!!\n"); halrf_iqk_rx_bypass(rf, 0x0); halrf_iqk_rx_bypass(rf, 0x1); } else { RF_DBG_CNSL(out_len, used, output + used, out_len - used, " No CMD find!!\n"); } *_used = used; *_out_len = out_len; #endif } void halrf_iqk_klog_cmd(struct rf_info *rf, char input[][16], u32 *_used, char *output, u32 *_out_len) { #if 1 char *cmd[6] = {"-h", "fft", "sram", "xym", "cfir", "off"}; u32 used = *_used; u32 out_len = *_out_len; u32 val = 0; u8 i; if (!(rf->support_ability & HAL_RF_IQK)) { RF_DBG_CNSL(out_len, used, output + used, out_len - used, "IQK is Unsupported!!!\n"); return; } if (_os_strcmp(input[1], cmd[0]) == 0) { for (i = 1; i < 6; i++) RF_DBG_CNSL(out_len, used, output + used, out_len - used, " %s\n", cmd[i]); } else if (_os_strcmp(input[1], cmd[1]) == 0) { RF_DBG_CNSL(out_len, used, output + used, out_len - used, "FFT message turn on!!\n"); halrf_iqk_fft_enable(rf, true); } else if (_os_strcmp(input[1], cmd[2]) == 0) { RF_DBG_CNSL(out_len, used, output + used, out_len - used, "Sram message turn on!!\n"); halrf_iqk_sram_enable(rf, true); } else if (_os_strcmp(input[1], cmd[3]) == 0) { RF_DBG_CNSL(out_len, used, output + used, out_len - used, "XYM message turn on!!\n"); halrf_iqk_xym_enable(rf, true); } else if (_os_strcmp(input[1], cmd[4]) == 0) { RF_DBG_CNSL(out_len, used, output + used, out_len - used, "CFIR message turn on!!\n"); halrf_iqk_cfir_enable(rf, true); } else if (_os_strcmp(input[1], cmd[4]) == 0) { RF_DBG_CNSL(out_len, used, output + used, out_len - used, "all message turn off!!\n"); halrf_iqk_fft_enable(rf, false); halrf_iqk_sram_enable(rf, false); halrf_iqk_xym_enable(rf, false); halrf_iqk_cfir_enable(rf, false); } else { RF_DBG_CNSL(out_len, used, output + used, out_len - used, " No CMD find!!\n"); } *_used = used; *_out_len = out_len; #endif } void halrf_iqk_dbg_cmd(struct rf_info *rf, char input[][16], u32 *_used, char *output, u32 *_out_len) { char *cmd[7] = {"-h", "on", "off", "info", "trigger", "nbiqk", "rxevm"}; u32 used = *_used; u32 out_len = *_out_len; u32 val = 0; u8 i; u8 rxevm = 0x0; if (!(rf->support_ability & HAL_RF_IQK)) { RF_DBG_CNSL(out_len, used, output + used, out_len - used, "IQK is Unsupported!!!\n"); return; } if (_os_strcmp(input[1], cmd[0]) == 0) { for (i = 1; i < 8; i++) RF_DBG_CNSL(out_len, used, output + used, out_len - used, " %s\n", cmd[i]); } else if (_os_strcmp(input[1], cmd[1]) == 0) { RF_DBG_CNSL(out_len, used, output + used, out_len - used, "IQK is Enabled!!\n"); halrf_iqk_onoff(rf, true); } else if (_os_strcmp(input[1], cmd[2]) == 0) { RF_DBG_CNSL(out_len, used, output + used, out_len - used, "IQK is Disabled!!\n"); halrf_iqk_onoff(rf, false); } else if (_os_strcmp(input[1], cmd[3]) == 0) { _halrf_iqk_info(rf, input, &used, output, &out_len); } else if (_os_strcmp(input[1], cmd[4]) == 0){ RF_DBG_CNSL(out_len, used, output + used, out_len - used, " WBIQK Trigger start!!\n"); halrf_nbiqk_enable(rf, false); halrf_iqk_trigger(rf, HW_PHY_0, false); } else if (_os_strcmp(input[1], cmd[5]) == 0){ halrf_nbiqk_enable(rf, true); halrf_iqk_trigger(rf, val, false); RF_DBG_CNSL(out_len, used, output + used, out_len - used, " NBIQK Trigger!!\n"); } else if (_os_strcmp(input[1], cmd[6]) == 0){ rxevm = halrf_iqk_get_rxevm( rf); RF_DBG_CNSL(out_len, used, output + used, out_len - used, " RXEVM = -%d dB!!\n", rxevm); } else { RF_DBG_CNSL(out_len, used, output + used, out_len - used, " No CMD find!!\n"); } *_used = used; *_out_len = out_len; } void halrf_pwr_table_dbg_cmd(struct rf_info *rf, char input[][16], u32 *_used, char *output, u32 *_out_len) { struct halrf_pwr_info *pwr = &rf->pwr_info; char *cmd[7] = {"-h", "rate", "limit", "limit_ru", "set_all", "set", "txshape"}; u32 used = *_used; u32 out_len = *_out_len; u32 val = 0; u32 tmp; u8 i; if (_os_strcmp(input[1], cmd[0]) == 0) { for (i = 1; i < 7; i++) RF_DBG_CNSL(out_len, used, output + used, out_len - used, " %s\n", cmd[i]); } else if (_os_strcmp(input[1], cmd[1]) == 0) { RF_DBG_CNSL(out_len, used, output + used, out_len - used, "Power by rate info\n"); halrf_pwr_by_rate_info(rf, input, &used, output, &out_len); } else if (_os_strcmp(input[1], cmd[2]) == 0) { RF_DBG_CNSL(out_len, used, output + used, out_len - used, "Power limit info\n"); halrf_pwr_limit_info(rf, input, &used, output, &out_len); } else if (_os_strcmp(input[1], cmd[3]) == 0) { RF_DBG_CNSL(out_len, used, output + used, out_len - used, "Power limit RU info\n"); halrf_pwr_limit_ru_info(rf, input, &used, output, &out_len); } else if (_os_strcmp(input[1], cmd[4]) == 0) { pwr->fix_power[RF_PATH_A] = false; pwr->fix_power_dbm[RF_PATH_A] = 0; pwr->fix_power[RF_PATH_B] = false; pwr->fix_power_dbm[RF_PATH_B] = 0; RF_DBG_CNSL(out_len, used, output + used, out_len - used, "Reset Power by Rate, Power limit and Power Limit RU to Default\n"); halrf_set_power(rf, HW_PHY_0, PWR_BY_RATE); halrf_set_power(rf, HW_PHY_0, PWR_LIMIT); halrf_set_power(rf, HW_PHY_0, PWR_LIMIT_RU); #ifndef RTW_FLASH_98D //halrf_set_power(rf, HW_PHY_1, PWR_BY_RATE); //halrf_set_power(rf, HW_PHY_1, PWR_LIMIT); //halrf_set_power(rf, HW_PHY_1, PWR_LIMIT_RU); #endif } else if (_os_strcmp(input[1], cmd[5]) == 0) { _os_sscanf(input[2], "%d", &tmp); RF_DBG_CNSL(out_len, used, output + used, out_len - used, "Set Power by Rate, Power limit and Power Limit RU %d.%ddBm\n", tmp / 2, tmp * 10 / 2 % 10); halrf_set_fix_power_to_struct(rf, HW_PHY_0, (s8)tmp); } else if (_os_strcmp(input[1], cmd[6]) == 0) { _os_sscanf(input[2], "%d", &tmp); RF_DBG_CNSL(out_len, used, output + used, out_len - used, "Set TX Shape = 255, disable Set Tx shape function\n"); RF_DBG_CNSL(out_len, used, output + used, out_len - used, "Set TX Shape = %d\n", tmp); halrf_set_tx_shape(rf, (u8)tmp); } else RF_DBG_CNSL(out_len, used, output + used, out_len - used, " No CMD find!!\n"); *_used = used; *_out_len = out_len; } void halrf_rfk_check_reg_cmd(struct rf_info *rf, char input[][16], u32 *_used, char *output, u32 *_out_len) { #if 1 char *cmd[3] = {"-h", "backup", "check"}; u32 used = *_used; u32 out_len = *_out_len; u32 val = 0; u8 i; if (_os_strcmp(input[1], cmd[0]) == 0) { for (i = 1; i < 3; i++) RF_DBG_CNSL(out_len, used, output + used, out_len - used, " %s\n", cmd[i]); } else if (_os_strcmp(input[1], cmd[1]) == 0) { RF_DBG_CNSL(out_len, used, output + used, out_len - used, "RFK backup!!\n"); halrf_rfk_reg_backup(rf); halrf_rfc_reg_backup(rf); } else if (_os_strcmp(input[1], cmd[2]) == 0) { RF_DBG_CNSL(out_len, used, output + used, out_len - used, "RFK check!!\n"); #if 1 RF_DBG_CNSL(out_len, used, output + used, out_len - used, "[RFK]DACK reg check : %s \n", (halrf_dack_reg_check_fail(rf)) ? "FAIL" : "OK"); RF_DBG_CNSL(out_len, used, output + used, out_len - used, "[RFK]RFK reg check : %s \n", (halrf_rfk_reg_check_fail(rf))?"FAIL" : "OK"); RF_DBG_CNSL(out_len, used, output + used, out_len - used, "[RFK]RFC reg check : %s \n", (halrf_rfc_reg_check_fail(rf))?"FAIL" : "OK"); #endif } else RF_DBG_CNSL(out_len, used, output + used, out_len - used, " No CMD find!!\n"); *_used = used; *_out_len = out_len; #endif } void halrf_test_cmd(struct rf_info *rf, char input[][16], u32 *_used, char *output, u32 *_out_len) { #if 0 u32 used = *_used; u32 out_len = *_out_len; u32 val[10] = {0}; u8 i; for (i = 0; i < 5; i++) { if (input[i + 1]) HALRF_SCAN(input[i + 1], DCMD_DECIMAL, &val[i]); } if (val[0] == 0) { halrf_rfk_chl_thermal(rf, (u8)val[1], (u8)val[2]); }else if (val[0] == 1) { halrf_rfk_recovery_chl_thermal(rf, (u8)val[1], (u8)val[2]); } *_used = used; *_out_len = out_len; #endif } void _halrf_gapk_info(struct rf_info *rf, char input[][16], u32 *_used, char *output, u32 *_out_len) { struct rtw_hal_com_t *hal_i = rf->hal_com; struct halrf_gapk_info *txgapk_info = &rf->gapk; struct halrf_iqk_info *iqk_info = &rf->iqk; u8 i; u8 channel = rf->hal_com->band[0].cur_chandef.center_ch; u32 bw = rf->hal_com->band[0].cur_chandef.bw; u32 band = rf->hal_com->band[0].cur_chandef.band; u32 used = *_used; u32 out_len = *_out_len; char *ic_name = NULL; u32 txgapk_ver = 0; u32 rf_para = 0; u32 rfk_init_ver = 0; switch (hal_i->chip_id) { #ifdef RF_8852A_SUPPORT case CHIP_WIFI6_8852A: ic_name = "8852A"; txgapk_ver = TXGAPK_VER_8852A; rf_para = halrf_get_radio_reg_ver(rf); rfk_init_ver = halrf_get_nctl_reg_ver(rf); break; #endif #ifdef RF_8852B_SUPPORT case CHIP_WIFI6_8852B: ic_name = "8852B"; txgapk_ver = TXGAPK_VER_8852B; rf_para = halrf_get_radio_reg_ver(rf); rfk_init_ver = halrf_get_nctl_reg_ver(rf); break; #endif default: break; } RF_DBG_CNSL(out_len, used, output + used, out_len - used, "\n===============[ TxGapK info %s ]===============\n", ic_name); RF_DBG_CNSL(out_len, used, output + used, out_len - used, " %-25s = 0x%x\n", "TxGapK Ver", txgapk_ver); RF_DBG_CNSL(out_len, used, output + used, out_len - used, " %-25s = %d\n", "RF Para Ver", rf_para); RF_DBG_CNSL(out_len, used, output + used, out_len - used, " %-25s = 0x%x\n", "RFK init ver", rfk_init_ver); RF_DBG_CNSL(out_len, used, output + used, out_len - used, " %-25s = %d / %d / %d (RFE type:%d)\n", "Ext_PA 2G / 5G / 6G", rf->fem.epa_2g, rf->fem.epa_5g, rf->fem.epa_6g, rf->phl_com->dev_cap.rfe_type); RF_DBG_CNSL(out_len, used, output + used, out_len - used, " %-25s = %s / %d / %s\n", "Band / CH / BW", band == BAND_ON_24G ? "2G" : (band == BAND_ON_5G ? "5G" : "6G"), channel, bw == 0 ? "20M" : (bw == 1 ? "40M" : "80M")); RF_DBG_CNSL(out_len, used, output + used, out_len - used, "=======================\n"); /* table info */ RF_DBG_CNSL(out_len, used, output + used, out_len - used, " %-25s = %d / %d\n", "iqk_info->iqk_mcc_ch[0][0]/[0][1]", iqk_info->iqk_mcc_ch[0][0], iqk_info->iqk_mcc_ch[0][1]); RF_DBG_CNSL(out_len, used, output + used, out_len - used, " %-25s = %d / %d\n", "iqk_info->iqk_mcc_ch[1][0]/[1][1]", iqk_info->iqk_mcc_ch[1][0], iqk_info->iqk_mcc_ch[1][1]); RF_DBG_CNSL(out_len, used, output + used, out_len - used, " %-25s = %d / %d\n", "iqk_info->iqk_table_idx[0]/[1]", iqk_info->iqk_table_idx[0], iqk_info->iqk_table_idx[1]); RF_DBG_CNSL(out_len, used, output + used, out_len - used, " %-25s = %d\n", "txgapk_info->txgapk_mcc_ch[0]", txgapk_info->txgapk_mcc_ch[0]); RF_DBG_CNSL(out_len, used, output + used, out_len - used, " %-25s = %d\n", "txgapk_info->txgapk_mcc_ch[1]", txgapk_info->txgapk_mcc_ch[1]); RF_DBG_CNSL(out_len, used, output + used, out_len - used, " %-25s = %d\n", "txgapk_info->txgapk_table_idx", txgapk_info->txgapk_table_idx); RF_DBG_CNSL(out_len, used, output + used, out_len - used, " %-25s = %d\n", "txgapk_info->ch", txgapk_info->ch[0]); RF_DBG_CNSL(out_len, used, output + used, out_len - used, "===============[ TxGapK result ]===============\n"); RF_DBG_CNSL(out_len, used, output + used, out_len - used, " %-25s = %s\n", "TXGapK OK(last)", (txgapk_info->is_txgapk_ok) ? "TRUE" : "FALSE"); RF_DBG_CNSL(out_len, used, output + used, out_len - used, " %-25s = 0x%x / 0x%x\n", "Read0x8010 Befr /Aftr GapK", txgapk_info->r0x8010[0], txgapk_info->r0x8010[1]); RF_DBG_CNSL(out_len, used, output + used, out_len - used, "[ NCTL Done Check Times R_0xbff / R_0x80fc ]\n"); /* txgapk_info->txgapk_chk_cnt[2][2][2]; */ /* path */ /* track pwr */ /* 0xbff8 0x80fc*/ RF_DBG_CNSL(out_len, used, output + used, out_len - used, " %-25s = %d / %d\n", "Path_0 Track", txgapk_info->txgapk_chk_cnt[0][TXGAPK_TRACK][0], txgapk_info->txgapk_chk_cnt[0][TXGAPK_TRACK][1]); RF_DBG_CNSL(out_len, used, output + used, out_len - used, " %-25s = %d / %d\n", "Path_0 PWR",txgapk_info->txgapk_chk_cnt[0][TXGAPK_PWR][0], txgapk_info->txgapk_chk_cnt[0][TXGAPK_PWR][1]); RF_DBG_CNSL(out_len, used, output + used, out_len - used, " %-25s = %d / %d\n", "Path_0 IQKBK", txgapk_info->txgapk_chk_cnt[0][TXGAPK_IQKBK][0], txgapk_info->txgapk_chk_cnt[0][TXGAPK_IQKBK][1]); RF_DBG_CNSL(out_len, used, output + used, out_len - used, " %-25s = %d / %d\n", "Path_1 Track", txgapk_info->txgapk_chk_cnt[1][TXGAPK_TRACK][0], txgapk_info->txgapk_chk_cnt[1][TXGAPK_TRACK][1]); RF_DBG_CNSL(out_len, used, output + used, out_len - used, " %-25s = %d / %d\n", "Path_1 PWR", txgapk_info->txgapk_chk_cnt[1][TXGAPK_PWR][0], txgapk_info->txgapk_chk_cnt[1][TXGAPK_PWR][1]); RF_DBG_CNSL(out_len, used, output + used, out_len - used, " %-25s = %d / %d\n", "Path_1 IQKBK", txgapk_info->txgapk_chk_cnt[1][TXGAPK_IQKBK][0], txgapk_info->txgapk_chk_cnt[1][TXGAPK_IQKBK][1]); for (i = 0; i < 17; i++) { RF_DBG_CNSL(out_len, used, output + used, out_len - used, " %s [%2d] = 0x%02x/ 0x%02x/ 0x%02x/ 0x%02x\n", "S0: Trk_d/Trk_ta/Pwr_d/Pwr_ta", i, txgapk_info->track_d[0][i]&0xff, txgapk_info->track_ta[0][i]&0xff, txgapk_info->power_d[0][i]&0xff, txgapk_info->power_ta[0][i]&0xff); } for (i = 0; i < 17; i++) { RF_DBG_CNSL(out_len, used, output + used, out_len - used, " %s [%2d] = 0x%02x/ 0x%02x/ 0x%02x/ 0x%02x\n", "S1: Trk_d/Trk_ta/Pwr_d/Pwr_ta", i, txgapk_info->track_d[1][i]&0xff, txgapk_info->track_ta[1][i]&0xff, txgapk_info->power_d[1][i]&0xff, txgapk_info->power_ta[1][i]&0xff); } *_used = used; *_out_len = out_len; } void halrf_txgapk_dbg_cmd(struct rf_info *rf, char input[][16], u32 *_used, char *output, u32 *_out_len) { char *cmd[5] = {"-h", "on", "off", "info", "trigger"}; u32 used = *_used; u32 out_len = *_out_len; u32 val = 0; u8 i; if (!(rf->support_ability & HAL_RF_TXGAPK)) { RF_DBG_CNSL(out_len, used, output + used, out_len - used, "TXGAPK is Unsupported!!!\n"); return; } if (_os_strcmp(input[1], cmd[0]) == 0) { for (i = 1; i < 5; i++) RF_DBG_CNSL(out_len, used, output + used, out_len - used, " %s\n", cmd[i]); } else if (_os_strcmp(input[1], cmd[1]) == 0) { RF_DBG_CNSL(out_len, used, output + used, out_len - used, "TXGAPK is Enabled!!\n"); halrf_gapk_enable(rf, val); } else if (_os_strcmp(input[1], cmd[2]) == 0) { RF_DBG_CNSL(out_len, used, output + used, out_len - used, "TXGAPK is Disabled!!\n"); halrf_gapk_disable(rf, val); } else if (_os_strcmp(input[1], cmd[3]) == 0) { _halrf_gapk_info(rf, input, &used, output, &out_len); } else if (_os_strcmp(input[1], cmd[4]) == 0){ RF_DBG_CNSL(out_len, used, output + used, out_len - used, "TXGAPK Trigger start!!\n"); _os_sscanf(input[1], "%d", &val); halrf_gapk_trigger(rf, val, true); RF_DBG_CNSL(out_len, used, output + used, out_len - used, "TXGAPK Trigger finish, TXGAPK ON!!!\n"); } else RF_DBG_CNSL(out_len, used, output + used, out_len - used, " No CMD find!!\n"); *_used = used; *_out_len = out_len; } void halrf_dump_rf_reg_cmd(struct rf_info *rf, char input[][16], u32 *_used, char *output, u32 *_out_len) { char *cmd[1] = {"-h"}; u32 used = *_used; u32 out_len = *_out_len; u32 val = 0; u32 i; u32 start_addr = 0, end_addr = 0, range_value = 0, path = 0; _os_sscanf(input[1], "%x", &path); _os_sscanf(input[2], "%x", &start_addr); _os_sscanf(input[3], "%x", &range_value); end_addr = start_addr + range_value; if (_os_strcmp(input[1], cmd[0]) == 0) { RF_DBG_CNSL(out_len, used, output + used, out_len - used, " Command parameters :\n"); RF_DBG_CNSL(out_len, used, output + used, out_len - used, " : 0/1/2/3 = rf-A/B/C/D\n"); RF_DBG_CNSL(out_len, used, output + used, out_len - used, " : rf start offset (HEX)\n"); RF_DBG_CNSL(out_len, used, output + used, out_len - used, " : number of offset to dump (HEX)\n"); } else if (path < RTW_PHL_MAX_RF_PATH) { RF_DBG_CNSL(out_len, used, output + used, out_len - used, " Dump RF Register Path:%d 0x%X ~ 0x%X\n", path, start_addr, end_addr - 1); RF_DBG_CNSL(out_len, used, output + used, out_len - used, " See Result in DebugView or Debug Log\n"); for (i = start_addr; i < end_addr; i = i + 4) { if (!(i % 4)) { RF_DBG_VAST(out_len, used, output + used, out_len - used, " RF-%d (0x%02X) = ", path, i); } RF_DBG_VAST(out_len, used, output + used, out_len - used, "%05X %05X %05X %05X\n", halrf_rrf(rf, path, i, 0xfffff), halrf_rrf(rf, path, i + 1, 0xfffff), halrf_rrf(rf, path, i + 2, 0xfffff), halrf_rrf(rf, path, i + 3, 0xfffff)); } RF_DBG_VAST(out_len, used, output + used, out_len - used, "\n\n\n"); for (i = start_addr; i < end_addr; i++) { RF_DBG_VAST(out_len, used, output + used, out_len - used, " RF-%d (0x%02X) = %05X\n", path, i, halrf_rrf(rf, path, i, 0xfffff)); } } else { RF_DBG_CNSL(out_len, used, output + used, out_len - used, " echo rf dump -h\n"); } *_used = used; *_out_len = out_len; }