/****************************************************************************** * * Copyright(c) 2007 - 2017 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 files * ************************************************************ */ #include "mp_precomp.h" #include "phydm_precomp.h" void halrf_basic_profile(void *dm_void, u32 *_used, char *output, u32 *_out_len) { #ifdef CONFIG_PHYDM_DEBUG_FUNCTION struct dm_struct *dm = (struct dm_struct *)dm_void; u32 used = *_used; u32 out_len = *_out_len; /* HAL RF version List */ PDM_SNPF(out_len, used, output + used, out_len - used, "%-35s\n", "% HAL RF version %"); PDM_SNPF(out_len, used, output + used, out_len - used, " %-35s: %s\n", "Power Tracking", HALRF_POWRTRACKING_VER); PDM_SNPF(out_len, used, output + used, out_len - used, " %-35s: %s %s\n", "IQK", (dm->fw_offload_ability & PHYDM_RF_IQK_OFFLOAD) ? "FW" : HALRF_IQK_VER, (halrf_match_iqk_version(dm_void)) ? "(match)" : "(mismatch)"); PDM_SNPF(out_len, used, output + used, out_len - used, " %-35s: %s\n", "LCK", HALRF_LCK_VER); PDM_SNPF(out_len, used, output + used, out_len - used, " %-35s: %s\n", "DPK", HALRF_DPK_VER); PDM_SNPF(out_len, used, output + used, out_len - used, " %-35s: %s\n", "KFREE", HALRF_KFREE_VER); PDM_SNPF(out_len, used, output + used, out_len - used, " %-35s: %s\n", "TX 2G Current Calibration", HALRF_PABIASK_VER); PDM_SNPF(out_len, used, output + used, out_len - used, " %-35s: %s\n", "RFK Init. Parameter", HALRF_RFK_INIT_VER); *_used = used; *_out_len = out_len; #endif } void halrf_debug_trace(void *dm_void, char input[][16], u32 *_used, char *output, u32 *_out_len) { struct dm_struct *dm = (struct dm_struct *)dm_void; struct _hal_rf_ *rf = &dm->rf_table; u32 one = 1; u32 used = *_used; u32 out_len = *_out_len; u32 rf_var[10] = {0}; u8 i; for (i = 0; i < 5; i++) if (input[i + 1]) PHYDM_SSCANF(input[i + 2], DCMD_DECIMAL, &rf_var[i]); if (rf_var[0] == 100) { PDM_SNPF(out_len, used, output + used, out_len - used, "\n[DBG MSG] RF Selection\n"); PDM_SNPF(out_len, used, output + used, out_len - used, "00. (( %s ))TX_PWR_TRACK\n", ((rf->rf_dbg_comp & DBG_RF_TX_PWR_TRACK) ? ("V") : ("."))); PDM_SNPF(out_len, used, output + used, out_len - used, "01. (( %s ))IQK\n", ((rf->rf_dbg_comp & DBG_RF_IQK) ? ("V") : ("."))); PDM_SNPF(out_len, used, output + used, out_len - used, "02. (( %s ))LCK\n", ((rf->rf_dbg_comp & DBG_RF_LCK) ? ("V") : ("."))); PDM_SNPF(out_len, used, output + used, out_len - used, "03. (( %s ))DPK\n", ((rf->rf_dbg_comp & DBG_RF_DPK) ? ("V") : ("."))); PDM_SNPF(out_len, used, output + used, out_len - used, "04. (( %s ))TXGAPK\n", ((rf->rf_dbg_comp & DBG_RF_TXGAPK) ? ("V") : ("."))); PDM_SNPF(out_len, used, output + used, out_len - used, "29. (( %s ))MP\n", ((rf->rf_dbg_comp & DBG_RF_MP) ? ("V") : ("."))); PDM_SNPF(out_len, used, output + used, out_len - used, "30. (( %s ))TMP\n", ((rf->rf_dbg_comp & DBG_RF_TMP) ? ("V") : ("."))); PDM_SNPF(out_len, used, output + used, out_len - used, "31. (( %s ))INIT\n", ((rf->rf_dbg_comp & DBG_RF_INIT) ? ("V") : ("."))); } else if (rf_var[0] == 101) { rf->rf_dbg_comp = 0; PDM_SNPF(out_len, used, output + used, out_len - used, "Disable all DBG COMP\n"); } else { if (rf_var[1] == 1) /*enable*/ rf->rf_dbg_comp |= (one << rf_var[0]); else if (rf_var[1] == 2) /*disable*/ rf->rf_dbg_comp &= ~(one << rf_var[0]); } PDM_SNPF(out_len, used, output + used, out_len - used, "\nCurr-RF_Dbg_Comp = 0x%x\n", rf->rf_dbg_comp); *_used = used; *_out_len = out_len; } struct halrf_command { char name[16]; u8 id; }; enum halrf_CMD_ID { HALRF_HELP, HALRF_SUPPORTABILITY, HALRF_DBG_COMP, HALRF_PROFILE, HALRF_IQK_INFO, HALRF_IQK, HALRF_IQK_DEBUG, }; struct halrf_command halrf_cmd_ary[] = { {"-h", HALRF_HELP}, {"ability", HALRF_SUPPORTABILITY}, {"dbg", HALRF_DBG_COMP}, {"profile", HALRF_PROFILE}, {"iqk_info", HALRF_IQK_INFO}, {"iqk", HALRF_IQK}, {"iqk_dbg", HALRF_IQK_DEBUG}, }; void halrf_cmd_parser(void *dm_void, char input[][16], u32 *_used, char *output, u32 *_out_len, u32 input_num) { struct dm_struct *dm = (struct dm_struct *)dm_void; #ifdef CONFIG_PHYDM_DEBUG_FUNCTION u8 id = 0; u32 rf_var[10] = {0}; u32 i, input_idx = 0; u32 halrf_ary_size = sizeof(halrf_cmd_ary) / sizeof(struct halrf_command); u32 used = *_used; u32 out_len = *_out_len; /* Parsing Cmd ID */ for (i = 0; i < halrf_ary_size; i++) { if (strcmp(halrf_cmd_ary[i].name, input[1]) == 0) { id = halrf_cmd_ary[i].id; break; } } if (i == halrf_ary_size) { PDM_SNPF(out_len, used, output + used, out_len - used, "RF Cmd not found\n"); return; } switch (id) { case HALRF_HELP: PDM_SNPF(out_len, used, output + used, out_len - used, "RF cmd ==>\n"); for (i = 0; i < halrf_ary_size - 1; i++) { PDM_SNPF(out_len, used, output + used, out_len - used, " %-5d: %s\n", i, halrf_cmd_ary[i + 1].name); } break; case HALRF_SUPPORTABILITY: halrf_support_ability_debug(dm, &input[0], &used, output, &out_len); break; case HALRF_DBG_COMP: halrf_debug_trace(dm, &input[0], &used, output, &out_len); break; case HALRF_PROFILE: halrf_basic_profile(dm, &used, output, &out_len); break; case HALRF_IQK_INFO: #if (RTL8822B_SUPPORT == 1 || RTL8821C_SUPPORT == 1) halrf_iqk_info_dump(dm, &used, output, &out_len); #endif break; case HALRF_IQK: PDM_SNPF(out_len, used, output + used, out_len - used, "TRX IQK Trigger\n"); halrf_iqk_trigger(dm, false); #if (RTL8822B_SUPPORT == 1 || RTL8821C_SUPPORT == 1) halrf_iqk_info_dump(dm, &used, output, &out_len); #endif break; case HALRF_IQK_DEBUG: for (i = 0; i < 5; i++) { if (input[i + 1]) { PHYDM_SSCANF(input[i + 2], DCMD_HEX, &rf_var[i]); input_idx++; } } if (input_idx >= 1) { #if (RTL8822B_SUPPORT == 1 || RTL8821C_SUPPORT == 1) if (dm->support_ic_type & (ODM_RTL8822B | ODM_RTL8821C)) halrf_iqk_debug(dm, (u32 *)rf_var, &used, output, &out_len); #endif } break; default: break; } *_used = used; *_out_len = out_len; #endif } void halrf_init_debug_setting(void *dm_void) { struct dm_struct *dm = (struct dm_struct *)dm_void; struct _hal_rf_ *rf = &dm->rf_table; rf->rf_dbg_comp = 0; }