Path: blob/master/ALFA-W1F1/RTL8814AU/hal/phydm/halrf/halrf.c
1308 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* ************************************************************28*/2930#include "mp_precomp.h"31#include "phydm_precomp.h"3233#if (RTL8822B_SUPPORT == 1 || RTL8821C_SUPPORT == 1 ||\34RTL8195B_SUPPORT == 1 || RTL8198F_SUPPORT == 1 ||\35RTL8814B_SUPPORT == 1 || RTL8822C_SUPPORT == 1 ||\36RTL8812F_SUPPORT == 1 || RTL8710C_SUPPORT == 1 ||\37RTL8197G_SUPPORT == 1)3839void _iqk_check_if_reload(void *dm_void)40{41struct dm_struct *dm = (struct dm_struct *)dm_void;42struct dm_iqk_info *iqk_info = &dm->IQK_info;4344iqk_info->is_reload = (boolean)odm_get_bb_reg(dm, R_0x1bf0, BIT(16));45}4647void _iqk_page_switch(void *dm_void)48{49struct dm_struct *dm = (struct dm_struct *)dm_void;5051if (dm->support_ic_type == ODM_RTL8821C)52odm_write_4byte(dm, 0x1b00, 0xf8000008);53else54odm_write_4byte(dm, 0x1b00, 0xf800000a);55}5657u32 halrf_psd_log2base(u32 val)58{59u8 j;60u32 tmp, tmp2, val_integerd_b = 0, tindex, shiftcount = 0;61u32 result, val_fractiond_b = 0;62u32 table_fraction[21] = {630, 432, 332, 274, 232, 200, 174, 151, 132, 115,64100, 86, 74, 62, 51, 42, 32, 23, 15, 7, 0};6566if (val == 0)67return 0;6869tmp = val;7071while (1) {72if (tmp == 1)73break;7475tmp = (tmp >> 1);76shiftcount++;77}7879val_integerd_b = shiftcount + 1;8081tmp2 = 1;82for (j = 1; j <= val_integerd_b; j++)83tmp2 = tmp2 * 2;8485tmp = (val * 100) / tmp2;86tindex = tmp / 5;8788if (tindex > 20)89tindex = 20;9091val_fractiond_b = table_fraction[tindex];9293result = val_integerd_b * 100 - val_fractiond_b;9495return result;96}9798void halrf_iqk_xym_enable(struct dm_struct *dm, u8 xym_enable)99{100struct dm_iqk_info *iqk_info = &dm->IQK_info;101102if (xym_enable == 0)103iqk_info->xym_read = false;104else105iqk_info->xym_read = true;106107RF_DBG(dm, DBG_RF_IQK, "[IQK]%-20s %s\n", "xym_read = ",108(iqk_info->xym_read ? "true" : "false"));109}110111/*xym_type => 0: rx_sym; 1: tx_xym; 2:gs1_xym; 3:gs2_sym; 4: rxk1_xym*/112void halrf_iqk_xym_read(void *dm_void, u8 path, u8 xym_type)113{114struct dm_struct *dm = (struct dm_struct *)dm_void;115struct dm_iqk_info *iqk_info = &dm->IQK_info;116u8 i, start, num;117u32 tmp1, tmp2;118119if (!iqk_info->xym_read)120return;121122if (*dm->band_width == 0) {123start = 3;124num = 4;125} else if (*dm->band_width == 1) {126start = 2;127num = 6;128} else {129start = 0;130num = 10;131}132133odm_write_4byte(dm, 0x1b00, 0xf8000008);134tmp1 = odm_read_4byte(dm, 0x1b1c);135odm_write_4byte(dm, 0x1b1c, 0xa2193c32);136137odm_write_4byte(dm, 0x1b00, 0xf800000a);138tmp2 = odm_read_4byte(dm, 0x1b1c);139odm_write_4byte(dm, 0x1b1c, 0xa2193c32);140141for (path = 0; path < 2; path++) {142odm_write_4byte(dm, 0x1b00, 0xf8000008 | path << 1);143switch (xym_type) {144case 0:145for (i = 0; i < num; i++) {146odm_write_4byte(dm, 0x1b14, 0xe6 + start + i);147odm_write_4byte(dm, 0x1b14, 0x0);148iqk_info->rx_xym[path][i] =149odm_read_4byte(dm, 0x1b38);150}151break;152case 1:153for (i = 0; i < num; i++) {154odm_write_4byte(dm, 0x1b14, 0xe6 + start + i);155odm_write_4byte(dm, 0x1b14, 0x0);156iqk_info->tx_xym[path][i] =157odm_read_4byte(dm, 0x1b38);158}159break;160case 2:161for (i = 0; i < 6; i++) {162odm_write_4byte(dm, 0x1b14, 0xe0 + i);163odm_write_4byte(dm, 0x1b14, 0x0);164iqk_info->gs1_xym[path][i] =165odm_read_4byte(dm, 0x1b38);166}167break;168case 3:169for (i = 0; i < 6; i++) {170odm_write_4byte(dm, 0x1b14, 0xe0 + i);171odm_write_4byte(dm, 0x1b14, 0x0);172iqk_info->gs2_xym[path][i] =173odm_read_4byte(dm, 0x1b38);174}175break;176case 4:177for (i = 0; i < 6; i++) {178odm_write_4byte(dm, 0x1b14, 0xe0 + i);179odm_write_4byte(dm, 0x1b14, 0x0);180iqk_info->rxk1_xym[path][i] =181odm_read_4byte(dm, 0x1b38);182}183break;184}185odm_write_4byte(dm, 0x1b38, 0x20000000);186odm_write_4byte(dm, 0x1b00, 0xf8000008);187odm_write_4byte(dm, 0x1b1c, tmp1);188odm_write_4byte(dm, 0x1b00, 0xf800000a);189odm_write_4byte(dm, 0x1b1c, tmp2);190_iqk_page_switch(dm);191}192}193194/*xym_type => 0: rx_sym; 1: tx_xym; 2:gs1_xym; 3:gs2_sym; 4: rxk1_xym*/195void halrf_iqk_xym_show(struct dm_struct *dm, u8 xym_type)196{197u8 num, path, path_num, i;198struct dm_iqk_info *iqk_info = &dm->IQK_info;199200if (dm->rf_type == RF_1T1R)201path_num = 0x1;202else if (dm->rf_type == RF_2T2R)203path_num = 0x2;204else205path_num = 0x4;206207if (*dm->band_width == CHANNEL_WIDTH_20)208num = 4;209else if (*dm->band_width == CHANNEL_WIDTH_40)210num = 6;211else212num = 10;213214for (path = 0; path < path_num; path++) {215switch (xym_type) {216case 0:217for (i = 0; i < num; i++)218RF_DBG(dm, DBG_RF_IQK,219"[IQK]%-20s %-2d: 0x%x\n",220(path == 0) ? "PATH A RX-XYM " :221"PATH B RX-XYM", i,222iqk_info->rx_xym[path][i]);223break;224case 1:225for (i = 0; i < num; i++)226RF_DBG(dm, DBG_RF_IQK,227"[IQK]%-20s %-2d: 0x%x\n",228(path == 0) ? "PATH A TX-XYM " :229"PATH B TX-XYM", i,230iqk_info->tx_xym[path][i]);231break;232case 2:233for (i = 0; i < 6; i++)234RF_DBG(dm, DBG_RF_IQK,235"[IQK]%-20s %-2d: 0x%x\n",236(path == 0) ? "PATH A GS1-XYM " :237"PATH B GS1-XYM", i,238iqk_info->gs1_xym[path][i]);239break;240case 3:241for (i = 0; i < 6; i++)242RF_DBG(dm, DBG_RF_IQK,243"[IQK]%-20s %-2d: 0x%x\n",244(path == 0) ? "PATH A GS2-XYM " :245"PATH B GS2-XYM", i,246iqk_info->gs2_xym[path][i]);247break;248case 4:249for (i = 0; i < 6; i++)250RF_DBG(dm, DBG_RF_IQK,251"[IQK]%-20s %-2d: 0x%x\n",252(path == 0) ? "PATH A RXK1-XYM " :253"PATH B RXK1-XYM", i,254iqk_info->rxk1_xym[path][i]);255break;256}257}258}259260void halrf_iqk_xym_dump(void *dm_void)261{262u32 tmp1, tmp2;263struct dm_struct *dm = (struct dm_struct *)dm_void;264265odm_write_4byte(dm, 0x1b00, 0xf8000008);266tmp1 = odm_read_4byte(dm, 0x1b1c);267odm_write_4byte(dm, 0x1b00, 0xf800000a);268tmp2 = odm_read_4byte(dm, 0x1b1c);269#if 0270/*halrf_iqk_xym_read(dm, xym_type);*/271#endif272odm_write_4byte(dm, 0x1b00, 0xf8000008);273odm_write_4byte(dm, 0x1b1c, tmp1);274odm_write_4byte(dm, 0x1b00, 0xf800000a);275odm_write_4byte(dm, 0x1b1c, tmp2);276_iqk_page_switch(dm);277}278279void halrf_iqk_info_dump(void *dm_void, u32 *_used, char *output, u32 *_out_len)280{281struct dm_struct *dm = (struct dm_struct *)dm_void;282u32 used = *_used;283u32 out_len = *_out_len;284u8 rf_path, j, reload_iqk = 0;285u32 tmp;286/*two channel, PATH, TX/RX, 0:pass 1 :fail*/287boolean iqk_result[2][NUM][2];288struct dm_iqk_info *iqk_info = &dm->IQK_info;289290if (!(dm->support_ic_type & (ODM_RTL8822B | ODM_RTL8821C)))291return;292293/* IQK INFO */294PDM_SNPF(out_len, used, output + used, out_len - used, "%-20s\n",295"% IQK Info %");296PDM_SNPF(out_len, used, output + used, out_len - used, "%-20s\n",297(dm->fw_offload_ability & PHYDM_RF_IQK_OFFLOAD) ? "FW-IQK" :298"Driver-IQK");299300reload_iqk = (u8)odm_get_bb_reg(dm, R_0x1bf0, BIT(16));301PDM_SNPF(out_len, used, output + used, out_len - used, "%-20s: %s\n",302"reload", (reload_iqk) ? "True" : "False");303304PDM_SNPF(out_len, used, output + used, out_len - used, "%-20s: %s\n",305"rfk_forbidden", (iqk_info->rfk_forbidden) ? "True" : "False");306#if (RTL8814A_SUPPORT == 1 || RTL8822B_SUPPORT == 1 || \307RTL8821C_SUPPORT == 1 || RTL8195B_SUPPORT == 1 ||\308RTL8814B_SUPPORT == 1 || RTL8822C_SUPPORT == 1)309PDM_SNPF(out_len, used, output + used, out_len - used, "%-20s: %s\n",310"segment_iqk", (iqk_info->segment_iqk) ? "True" : "False");311#endif312313PDM_SNPF(out_len, used, output + used, out_len - used, "%-20s:%d %d\n",314"iqk count / fail count", dm->n_iqk_cnt, dm->n_iqk_fail_cnt);315316PDM_SNPF(out_len, used, output + used, out_len - used, "%-20s: %d\n",317"channel", *dm->channel);318319if (*dm->band_width == CHANNEL_WIDTH_20)320PDM_SNPF(out_len, used, output + used, out_len - used,321"%-20s: %s\n", "bandwidth", "BW_20");322else if (*dm->band_width == CHANNEL_WIDTH_40)323PDM_SNPF(out_len, used, output + used, out_len - used,324"%-20s: %s\n", "bandwidth", "BW_40");325else if (*dm->band_width == CHANNEL_WIDTH_80)326PDM_SNPF(out_len, used, output + used, out_len - used,327"%-20s: %s\n", "bandwidth", "BW_80");328else if (*dm->band_width == CHANNEL_WIDTH_160)329PDM_SNPF(out_len, used, output + used, out_len - used,330"%-20s: %s\n", "bandwidth", "BW_160");331else if (*dm->band_width == CHANNEL_WIDTH_80_80)332PDM_SNPF(out_len, used, output + used, out_len - used,333"%-20s: %s\n", "bandwidth", "BW_80_80");334else335PDM_SNPF(out_len, used, output + used, out_len - used,336"%-20s: %s\n", "bandwidth", "BW_UNKNOWN");337338PDM_SNPF(out_len, used, output + used, out_len - used,339"%-20s: %llu %s\n", "progressing_time",340dm->rf_calibrate_info.iqk_total_progressing_time, "(ms)");341342tmp = odm_read_4byte(dm, 0x1bf0);343for (rf_path = RF_PATH_A; rf_path <= RF_PATH_B; rf_path++)344for (j = 0; j < 2; j++)345iqk_result[0][rf_path][j] = (boolean)346(tmp & (BIT(rf_path + (j * 4)) >> (rf_path + (j * 4))));347348PDM_SNPF(out_len, used, output + used, out_len - used,349"%-20s: 0x%08x\n", "Reg0x1bf0", tmp);350PDM_SNPF(out_len, used, output + used, out_len - used, "%-20s: %s\n",351"PATH_A-Tx result",352(iqk_result[0][RF_PATH_A][0]) ? "Fail" : "Pass");353PDM_SNPF(out_len, used, output + used, out_len - used, "%-20s: %s\n",354"PATH_A-Rx result",355(iqk_result[0][RF_PATH_A][1]) ? "Fail" : "Pass");356#if (RTL8822B_SUPPORT == 1)357PDM_SNPF(out_len, used, output + used, out_len - used, "%-20s: %s\n",358"PATH_B-Tx result",359(iqk_result[0][RF_PATH_B][0]) ? "Fail" : "Pass");360PDM_SNPF(out_len, used, output + used, out_len - used, "%-20s: %s\n",361"PATH_B-Rx result",362(iqk_result[0][RF_PATH_B][1]) ? "Fail" : "Pass");363#endif364*_used = used;365*_out_len = out_len;366}367368void halrf_get_fw_version(void *dm_void)369{370struct dm_struct *dm = (struct dm_struct *)dm_void;371struct _hal_rf_ *rf = &dm->rf_table;372373rf->fw_ver = (dm->fw_version << 16) | dm->fw_sub_version;374}375376void halrf_iqk_dbg(void *dm_void)377{378struct dm_struct *dm = (struct dm_struct *)dm_void;379u8 rf_path, j;380u32 tmp;381/*two channel, PATH, TX/RX, 0:pass 1 :fail*/382boolean iqk_result[2][NUM][2];383struct dm_iqk_info *iqk_info = &dm->IQK_info;384struct _hal_rf_ *rf = &dm->rf_table;385386/* IQK INFO */387RF_DBG(dm, DBG_RF_IQK, "%-20s\n", "====== IQK Info ======");388389RF_DBG(dm, DBG_RF_IQK, "%-20s\n",390(dm->fw_offload_ability & PHYDM_RF_IQK_OFFLOAD) ? "FW-IQK" :391"Driver-IQK");392393if (dm->fw_offload_ability & PHYDM_RF_IQK_OFFLOAD) {394halrf_get_fw_version(dm);395RF_DBG(dm, DBG_RF_IQK, "%-20s: 0x%x\n", "FW_VER", rf->fw_ver);396} else {397RF_DBG(dm, DBG_RF_IQK, "%-20s: %s\n", "IQK_VER", HALRF_IQK_VER);398}399400RF_DBG(dm, DBG_RF_IQK, "%-20s: %s\n", "reload",401(iqk_info->is_reload) ? "True" : "False");402403RF_DBG(dm, DBG_RF_IQK, "%-20s: %d %d\n", "iqk count / fail count",404dm->n_iqk_cnt, dm->n_iqk_fail_cnt);405406RF_DBG(dm, DBG_RF_IQK, "%-20s: %d\n", "channel", *dm->channel);407408if (*dm->band_width == CHANNEL_WIDTH_20)409RF_DBG(dm, DBG_RF_IQK, "%-20s: %s\n", "bandwidth", "BW_20");410else if (*dm->band_width == CHANNEL_WIDTH_40)411RF_DBG(dm, DBG_RF_IQK, "%-20s: %s\n", "bandwidth", "BW_40");412else if (*dm->band_width == CHANNEL_WIDTH_80)413RF_DBG(dm, DBG_RF_IQK, "%-20s: %s\n", "bandwidth", "BW_80");414else if (*dm->band_width == CHANNEL_WIDTH_160)415RF_DBG(dm, DBG_RF_IQK, "%-20s: %s\n", "bandwidth", "BW_160");416else if (*dm->band_width == CHANNEL_WIDTH_80_80)417RF_DBG(dm, DBG_RF_IQK, "%-20s: %s\n", "bandwidth", "BW_80_80");418else419RF_DBG(dm, DBG_RF_IQK, "%-20s: %s\n", "bandwidth",420"BW_UNKNOWN");421#if 0422/*423* RF_DBG(dm, DBG_RF_IQK, "%-20s: %llu %s\n",424* "progressing_time",425* dm->rf_calibrate_info.iqk_total_progressing_time, "(ms)");426*/427#endif428RF_DBG(dm, DBG_RF_IQK, "%-20s: %s\n", "rfk_forbidden",429(iqk_info->rfk_forbidden) ? "True" : "False");430#if (RTL8814A_SUPPORT == 1 || RTL8822B_SUPPORT == 1 || \431RTL8821C_SUPPORT == 1 || RTL8195B_SUPPORT == 1 ||\432RTL8814B_SUPPORT == 1 || RTL8822C_SUPPORT == 1)433RF_DBG(dm, DBG_RF_IQK, "%-20s: %s\n", "segment_iqk",434(iqk_info->segment_iqk) ? "True" : "False");435#endif436437RF_DBG(dm, DBG_RF_IQK, "%-20s: %llu %s\n", "progressing_time",438dm->rf_calibrate_info.iqk_progressing_time, "(ms)");439440tmp = odm_read_4byte(dm, 0x1bf0);441for (rf_path = RF_PATH_A; rf_path <= RF_PATH_B; rf_path++)442for (j = 0; j < 2; j++)443iqk_result[0][rf_path][j] = (boolean)444(tmp & (BIT(rf_path + (j * 4)) >> (rf_path + (j * 4))));445446RF_DBG(dm, DBG_RF_IQK, "%-20s: 0x%08x\n", "Reg0x1bf0", tmp);447RF_DBG(dm, DBG_RF_IQK, "%-20s: 0x%08x\n", "Reg0x1be8",448odm_read_4byte(dm, 0x1be8));449RF_DBG(dm, DBG_RF_IQK, "%-20s: %s\n", "PATH_A-Tx result",450(iqk_result[0][RF_PATH_A][0]) ? "Fail" : "Pass");451RF_DBG(dm, DBG_RF_IQK, "%-20s: %s\n", "PATH_A-Rx result",452(iqk_result[0][RF_PATH_A][1]) ? "Fail" : "Pass");453#if (RTL8822B_SUPPORT == 1)454RF_DBG(dm, DBG_RF_IQK, "%-20s: %s\n", "PATH_B-Tx result",455(iqk_result[0][RF_PATH_B][0]) ? "Fail" : "Pass");456RF_DBG(dm, DBG_RF_IQK, "%-20s: %s\n", "PATH_B-Rx result",457(iqk_result[0][RF_PATH_B][1]) ? "Fail" : "Pass");458#endif459}460461void halrf_lck_dbg(struct dm_struct *dm)462{463RF_DBG(dm, DBG_RF_IQK, "%-20s\n", "====== LCK Info ======");464#if 0465/*RF_DBG(dm, DBG_RF_IQK, "%-20s\n",466* (dm->fw_offload_ability & PHYDM_RF_IQK_OFFLOAD) ? "LCK" : "RTK"));467*/468#endif469RF_DBG(dm, DBG_RF_IQK, "%-20s: %llu %s\n", "progressing_time",470dm->rf_calibrate_info.lck_progressing_time, "(ms)");471}472void phydm_get_iqk_cfir(void *dm_void, u8 idx, u8 path, boolean debug)473{474struct dm_struct *dm = (struct dm_struct *)dm_void;475476switch (dm->support_ic_type) {477#if (RTL8822B_SUPPORT == 1)478case ODM_RTL8822B:479phy_get_iqk_cfir_8822b(dm, idx, path, debug);480break;481#endif482#if (RTL8822C_SUPPORT == 1)483case ODM_RTL8822C:484phy_get_iqk_cfir_8822c(dm, idx, path, debug);485break;486#endif487default:488break;489}490}491492493void halrf_iqk_dbg_cfir_backup(void *dm_void)494{495struct dm_struct *dm = (struct dm_struct *)dm_void;496struct dm_iqk_info *iqk_info = &dm->IQK_info;497u8 path, idx, i;498499switch (dm->support_ic_type) {500#if (RTL8822B_SUPPORT == 1)501case ODM_RTL8822B:502phy_iqk_dbg_cfir_backup_8822b(dm);503break;504#endif505#if (RTL8822C_SUPPORT == 1)506case ODM_RTL8822C:507phy_iqk_dbg_cfir_backup_8822c(dm);508break;509#endif510default:511break;512}513514}515516void halrf_iqk_dbg_cfir_backup_update(void *dm_void)517{518struct dm_struct *dm = (struct dm_struct *)dm_void;519struct dm_iqk_info *iqk = &dm->IQK_info;520u8 i, path, idx;521u32 bmask13_12 = BIT(13) | BIT(12);522u32 bmask20_16 = BIT(20) | BIT(19) | BIT(18) | BIT(17) | BIT(16);523u32 data;524525switch (dm->support_ic_type) {526#if (RTL8822B_SUPPORT == 1)527case ODM_RTL8822B:528phy_iqk_dbg_cfir_backup_update_8822b(dm);529break;530#endif531#if (RTL8822C_SUPPORT == 1)532case ODM_RTL8822C:533phy_iqk_dbg_cfir_backup_update_8822c(dm);534break;535#endif536default:537break;538}539}540541void halrf_iqk_dbg_cfir_reload(void *dm_void)542{543struct dm_struct *dm = (struct dm_struct *)dm_void;544struct dm_iqk_info *iqk = &dm->IQK_info;545u8 i, path, idx;546u32 bmask13_12 = BIT(13) | BIT(12);547u32 bmask20_16 = BIT(20) | BIT(19) | BIT(18) | BIT(17) | BIT(16);548u32 data;549550switch (dm->support_ic_type) {551#if (RTL8822B_SUPPORT == 1)552case ODM_RTL8822B:553phy_iqk_dbg_cfir_reload_8822b(dm);554break;555#endif556#if (RTL8822C_SUPPORT == 1)557case ODM_RTL8822C:558phy_iqk_dbg_cfir_reload_8822c(dm);559break;560#endif561default:562break;563}564}565566void halrf_iqk_dbg_cfir_write(void *dm_void, u8 type, u32 path, u32 idx,567u32 i, u32 data)568{569struct dm_struct *dm = (struct dm_struct *)dm_void;570struct dm_iqk_info *iqk_info = &dm->IQK_info;571572switch (dm->support_ic_type) {573#if (RTL8822B_SUPPORT == 1)574case ODM_RTL8822B:575phy_iqk_dbg_cfir_write_8822b(dm, type, path, idx, i, data);576break;577#endif578#if (RTL8822C_SUPPORT == 1)579case ODM_RTL8822C:580phy_iqk_dbg_cfir_write_8822c(dm, type, path, idx, i, data);581break;582#endif583default:584break;585}586}587588void halrf_iqk_dbg_cfir_backup_show(void *dm_void)589{590struct dm_struct *dm = (struct dm_struct *)dm_void;591struct dm_iqk_info *iqk_info = &dm->IQK_info;592u8 path, idx, i;593594switch (dm->support_ic_type) {595#if (RTL8822B_SUPPORT == 1)596case ODM_RTL8822B:597phy_iqk_dbg_cfir_backup_8822b(dm);598break;599#endif600#if (RTL8822C_SUPPORT == 1)601case ODM_RTL8822C:602phy_iqk_dbg_cfir_backup_8822c(dm);603break;604#endif605default:606break;607}608}609610void halrf_do_imr_test(void *dm_void, u8 flag_imr_test)611{612struct dm_struct *dm = (struct dm_struct *)dm_void;613614if (flag_imr_test != 0x0)615switch (dm->support_ic_type) {616#if (RTL8822B_SUPPORT == 1)617case ODM_RTL8822B:618do_imr_test_8822b(dm);619break;620#endif621#if (RTL8821C_SUPPORT == 1)622case ODM_RTL8821C:623do_imr_test_8821c(dm);624break;625#endif626default:627break;628}629}630631void halrf_iqk_debug(void *dm_void, u32 *const dm_value, u32 *_used,632char *output, u32 *_out_len)633{634struct dm_struct *dm = (struct dm_struct *)dm_void;635636#if 0637/*dm_value[0]=0x0: backup from SRAM & show*/638/*dm_value[0]=0x1: write backup CFIR to SRAM*/639/*dm_value[0]=0x2: reload default CFIR to SRAM*/640/*dm_value[0]=0x3: show backup*/641/*dm_value[0]=0x10: write backup CFIR real part*/642/*--> dm_value[1]:path, dm_value[2]:tx/rx, dm_value[3]:index, dm_value[4]:data*/643/*dm_value[0]=0x11: write backup CFIR imag*/644/*--> dm_value[1]:path, dm_value[2]:tx/rx, dm_value[3]:index, dm_value[4]:data*/645/*dm_value[0]=0x20 :xym_read enable*/646/*--> dm_value[1]:0:disable, 1:enable*/647/*if dm_value[0]=0x20 = enable, */648/*0x1:show rx_sym; 0x2: tx_xym; 0x3:gs1_xym; 0x4:gs2_sym; 0x5:rxk1_xym*/649#endif650if (dm_value[0] == 0x0)651halrf_iqk_dbg_cfir_backup(dm);652else if (dm_value[0] == 0x1)653halrf_iqk_dbg_cfir_backup_update(dm);654else if (dm_value[0] == 0x2)655halrf_iqk_dbg_cfir_reload(dm);656else if (dm_value[0] == 0x3)657halrf_iqk_dbg_cfir_backup_show(dm);658else if (dm_value[0] == 0x10)659halrf_iqk_dbg_cfir_write(dm, 0, dm_value[1], dm_value[2],660dm_value[3], dm_value[4]);661else if (dm_value[0] == 0x11)662halrf_iqk_dbg_cfir_write(dm, 1, dm_value[1], dm_value[2],663dm_value[3], dm_value[4]);664else if (dm_value[0] == 0x20)665halrf_iqk_xym_enable(dm, (u8)dm_value[1]);666else if (dm_value[0] == 0x21)667halrf_iqk_xym_show(dm, (u8)dm_value[1]);668else if (dm_value[0] == 0x30)669halrf_do_imr_test(dm, (u8)dm_value[1]);670}671672void halrf_iqk_hwtx_check(void *dm_void, boolean is_check)673{674#if 0675struct dm_struct *dm = (struct dm_struct *)dm_void;676struct dm_iqk_info *iqk_info = &dm->IQK_info;677u32 tmp_b04;678679if (is_check) {680iqk_info->is_hwtx = (boolean)odm_get_bb_reg(dm, R_0xb00, BIT(8));681} else {682if (iqk_info->is_hwtx) {683tmp_b04 = odm_read_4byte(dm, 0xb04);684odm_set_bb_reg(dm, R_0xb04, BIT(3) | BIT(2), 0x0);685odm_write_4byte(dm, 0xb04, tmp_b04);686}687}688#endif689}690#endif691692u8 halrf_match_iqk_version(void *dm_void)693{694struct dm_struct *dm = (struct dm_struct *)dm_void;695696u32 iqk_version = 0;697char temp[10] = {0};698699odm_move_memory(dm, temp, HALRF_IQK_VER, sizeof(temp));700PHYDM_SSCANF(temp + 2, DCMD_HEX, &iqk_version);701702if (dm->support_ic_type == ODM_RTL8822B) {703if (iqk_version >= 0x24 && (odm_get_hw_img_version(dm) >= 72))704return 1;705else if ((iqk_version <= 0x23) &&706(odm_get_hw_img_version(dm) <= 71))707return 1;708else709return 0;710}711712if (dm->support_ic_type == ODM_RTL8821C) {713if (iqk_version >= 0x18 && (odm_get_hw_img_version(dm) >= 37))714return 1;715else716return 0;717}718719return 1;720}721722void halrf_rf_lna_setting(void *dm_void, enum halrf_lna_set type)723{724struct dm_struct *dm = (struct dm_struct *)dm_void;725726switch (dm->support_ic_type) {727#if (RTL8188E_SUPPORT == 1)728case ODM_RTL8188E:729halrf_rf_lna_setting_8188e(dm, type);730break;731#endif732#if (RTL8192E_SUPPORT == 1)733case ODM_RTL8192E:734halrf_rf_lna_setting_8192e(dm, type);735break;736#endif737#if (RTL8192F_SUPPORT == 1)738case ODM_RTL8192F:739halrf_rf_lna_setting_8192f(dm, type);740break;741#endif742743#if (RTL8723B_SUPPORT == 1)744case ODM_RTL8723B:745halrf_rf_lna_setting_8723b(dm, type);746break;747#endif748#if (RTL8812A_SUPPORT == 1)749case ODM_RTL8812:750halrf_rf_lna_setting_8812a(dm, type);751break;752#endif753#if ((RTL8821A_SUPPORT == 1) || (RTL8881A_SUPPORT == 1))754case ODM_RTL8881A:755case ODM_RTL8821:756halrf_rf_lna_setting_8821a(dm, type);757break;758#endif759#if (RTL8822B_SUPPORT == 1)760case ODM_RTL8822B:761halrf_rf_lna_setting_8822b(dm_void, type);762break;763#endif764#if (RTL8822C_SUPPORT == 1)765case ODM_RTL8822C:766halrf_rf_lna_setting_8822c(dm_void, type);767break;768#endif769#if (RTL8812F_SUPPORT == 1)770case ODM_RTL8812F:771halrf_rf_lna_setting_8812f(dm_void, type);772break;773#endif774#if (RTL8821C_SUPPORT == 1)775case ODM_RTL8821C:776halrf_rf_lna_setting_8821c(dm_void, type);777break;778#endif779#if (RTL8814B_SUPPORT == 1)780case ODM_RTL8814B:781break;782#endif783default:784break;785}786}787788void halrf_support_ability_debug(void *dm_void, char input[][16], u32 *_used,789char *output, u32 *_out_len)790{791struct dm_struct *dm = (struct dm_struct *)dm_void;792struct _hal_rf_ *rf = &dm->rf_table;793u32 dm_value[10] = {0};794u32 used = *_used;795u32 out_len = *_out_len;796u8 i;797798for (i = 0; i < 5; i++)799if (input[i + 1])800PHYDM_SSCANF(input[i + 2], DCMD_DECIMAL, &dm_value[i]);801802if (dm_value[0] == 100) {803PDM_SNPF(out_len, used, output + used, out_len - used,804"\n[RF Supportability]\n");805PDM_SNPF(out_len, used, output + used, out_len - used,806"00. (( %s ))Power Tracking\n",807((rf->rf_supportability & HAL_RF_TX_PWR_TRACK) ?808("V") : (".")));809PDM_SNPF(out_len, used, output + used, out_len - used,810"01. (( %s ))IQK\n",811((rf->rf_supportability & HAL_RF_IQK) ? ("V") :812(".")));813PDM_SNPF(out_len, used, output + used, out_len - used,814"02. (( %s ))LCK\n",815((rf->rf_supportability & HAL_RF_LCK) ? ("V") :816(".")));817PDM_SNPF(out_len, used, output + used, out_len - used,818"03. (( %s ))DPK\n",819((rf->rf_supportability & HAL_RF_DPK) ? ("V") :820(".")));821PDM_SNPF(out_len, used, output + used, out_len - used,822"04. (( %s ))HAL_RF_TXGAPK\n",823((rf->rf_supportability & HAL_RF_TXGAPK) ? ("V") :824(".")));825#ifdef CONFIG_2G_BAND_SHIFT826PDM_SNPF(out_len, used, output + used, out_len - used,827"07. (( %s ))HAL_2GBAND_SHIFT\n",828((rf->rf_supportability & HAL_2GBAND_SHIFT) ? ("V") :829(".")));830#endif831832} else {833if (dm_value[1] == 1) /* enable */834rf->rf_supportability |= BIT(dm_value[0]);835else if (dm_value[1] == 2) /* disable */836rf->rf_supportability &= ~(BIT(dm_value[0]));837else838PDM_SNPF(out_len, used, output + used, out_len - used,839"[Warning!!!] 1:enable, 2:disable\n");840}841PDM_SNPF(out_len, used, output + used, out_len - used,842"\nCurr-RF_supportability = 0x%x\n\n", rf->rf_supportability);843844*_used = used;845*_out_len = out_len;846}847848#ifdef CONFIG_2G_BAND_SHIFT849void halrf_support_band_shift_debug(void *dm_void, char input[][16], u32 *_used,850char *output, u32 *_out_len)851{852struct dm_struct *dm = (struct dm_struct *)dm_void;853struct _hal_rf_ *rf = &dm->rf_table;854//u32 band_value[2] = {00};855u32 dm_value[10] = {0};856u32 used = *_used;857u32 out_len = *_out_len;858u8 i;859860#if (RTL8192F_SUPPORT == 1)861for (i = 0; i < 7; i++)862if (input[i + 1])863PHYDM_SSCANF(input[i + 2], DCMD_DECIMAL, &dm_value[i]);864865if (!(rf->rf_supportability & HAL_2GBAND_SHIFT)) {866PDM_SNPF(out_len, used, output + used, out_len - used,867"\nCurr-RF_supportability[07. (( . ))HAL_2GBAND_SHIFT]\nNo RF Band Shift,default: 2.4G!\n");868} else {869if (dm_value[0] == 01) {870rf->rf_shift_band = HAL_RF_2P3;871halrf_lck_trigger(dm);872PDM_SNPF(out_len, used, output + used, out_len - used,873"\n[rf_shift_band] = %d\nRF Band Shift to 2.3G!\n",874rf->rf_shift_band);875} else if (dm_value[0] == 02) {876rf->rf_shift_band = HAL_RF_2P5;877halrf_lck_trigger(dm);878PDM_SNPF(out_len, used, output + used, out_len - used,879"\n[rf_shift_band] = %d\nRF Band Shift to 2.5G!\n",880rf->rf_shift_band);881} else {882rf->rf_shift_band = HAL_RF_2P4;883halrf_lck_trigger(dm);884PDM_SNPF(out_len, used, output + used, out_len - used,885"\n[rf_shift_band] = %d\nNo RF Band Shift,default: 2.4G!\n",886rf->rf_shift_band);887}888}889*_used = used;890*_out_len = out_len;891#endif892}893#endif894895void halrf_cmn_info_init(void *dm_void, enum halrf_cmninfo_init cmn_info,896u32 value)897{898struct dm_struct *dm = (struct dm_struct *)dm_void;899struct _hal_rf_ *rf = &dm->rf_table;900901switch (cmn_info) {902case HALRF_CMNINFO_EEPROM_THERMAL_VALUE:903rf->eeprom_thermal = (u8)value;904break;905case HALRF_CMNINFO_PWT_TYPE:906rf->pwt_type = (u8)value;907break;908default:909break;910}911}912913void halrf_cmn_info_hook(void *dm_void, enum halrf_cmninfo_hook cmn_info,914void *value)915{916struct dm_struct *dm = (struct dm_struct *)dm_void;917struct _hal_rf_ *rf = &dm->rf_table;918919switch (cmn_info) {920case HALRF_CMNINFO_CON_TX:921rf->is_con_tx = (boolean *)value;922break;923case HALRF_CMNINFO_SINGLE_TONE:924rf->is_single_tone = (boolean *)value;925break;926case HALRF_CMNINFO_CARRIER_SUPPRESSION:927rf->is_carrier_suppresion = (boolean *)value;928break;929case HALRF_CMNINFO_MP_RATE_INDEX:930rf->mp_rate_index = (u8 *)value;931break;932case HALRF_CMNINFO_MANUAL_RF_SUPPORTABILITY:933rf->manual_rf_supportability = (u32 *)value;934break;935default:936/*do nothing*/937break;938}939}940941void halrf_cmn_info_set(void *dm_void, u32 cmn_info, u64 value)942{943/* This init variable may be changed in run time. */944struct dm_struct *dm = (struct dm_struct *)dm_void;945struct _hal_rf_ *rf = &dm->rf_table;946947switch (cmn_info) {948case HALRF_CMNINFO_ABILITY:949rf->rf_supportability = (u32)value;950break;951952case HALRF_CMNINFO_DPK_EN:953rf->dpk_en = (u8)value;954break;955case HALRF_CMNINFO_RFK_FORBIDDEN:956dm->IQK_info.rfk_forbidden = (boolean)value;957break;958#if (RTL8814A_SUPPORT == 1 || RTL8822B_SUPPORT == 1 || \959RTL8821C_SUPPORT == 1 || RTL8195B_SUPPORT == 1 ||\960RTL8814B_SUPPORT == 1 || RTL8822C_SUPPORT == 1)961case HALRF_CMNINFO_IQK_SEGMENT:962dm->IQK_info.segment_iqk = (boolean)value;963break;964#endif965case HALRF_CMNINFO_RATE_INDEX:966rf->p_rate_index = (u32)value;967break;968/*#if (DM_ODM_SUPPORT_TYPE & ODM_WIN)*/969case HALRF_CMNINFO_MP_PSD_POINT:970rf->halrf_psd_data.point = (u32)value;971break;972case HALRF_CMNINFO_MP_PSD_START_POINT:973rf->halrf_psd_data.start_point = (u32)value;974break;975case HALRF_CMNINFO_MP_PSD_STOP_POINT:976rf->halrf_psd_data.stop_point = (u32)value;977break;978case HALRF_CMNINFO_MP_PSD_AVERAGE:979rf->halrf_psd_data.average = (u32)value;980break;981/*#endif*/982default:983/* do nothing */984break;985}986}987988u64 halrf_cmn_info_get(void *dm_void, u32 cmn_info)989{990/* This init variable may be changed in run time. */991struct dm_struct *dm = (struct dm_struct *)dm_void;992struct _hal_rf_ *rf = &dm->rf_table;993u64 return_value = 0;994995switch (cmn_info) {996case HALRF_CMNINFO_ABILITY:997return_value = (u32)rf->rf_supportability;998break;999case HALRF_CMNINFO_RFK_FORBIDDEN:1000return_value = dm->IQK_info.rfk_forbidden;1001break;1002#if (RTL8814A_SUPPORT == 1 || RTL8822B_SUPPORT == 1 || \1003RTL8821C_SUPPORT == 1 || RTL8195B_SUPPORT == 1 ||\1004RTL8814B_SUPPORT == 1 || RTL8822C_SUPPORT == 1)1005case HALRF_CMNINFO_IQK_SEGMENT:1006return_value = dm->IQK_info.segment_iqk;1007break;1008#endif1009default:1010/* do nothing */1011break;1012}10131014return return_value;1015}10161017void halrf_supportability_init_mp(void *dm_void)1018{1019struct dm_struct *dm = (struct dm_struct *)dm_void;1020struct _hal_rf_ *rf = &dm->rf_table;10211022switch (dm->support_ic_type) {1023case ODM_RTL8814B:1024#if (RTL8814B_SUPPORT == 1)1025rf->rf_supportability =1026/*HAL_RF_TX_PWR_TRACK |*/1027HAL_RF_IQK |1028HAL_RF_LCK |1029HAL_RF_DPK |1030HAL_RF_DACK |1031HAL_RF_DPK_TRACK |10320;1033#endif1034break;1035#if (RTL8822B_SUPPORT == 1)1036case ODM_RTL8822B:1037rf->rf_supportability =1038/*HAL_RF_TX_PWR_TRACK |*/1039HAL_RF_IQK |1040HAL_RF_LCK |1041/*@HAL_RF_DPK |*/10420;1043break;1044#endif1045#if (RTL8822C_SUPPORT == 1)1046case ODM_RTL8822C:1047rf->rf_supportability =1048/*HAL_RF_TX_PWR_TRACK |*/1049HAL_RF_IQK |1050HAL_RF_LCK |1051HAL_RF_DPK |1052HAL_RF_DACK |1053HAL_RF_DPK_TRACK |10540;1055break;1056#endif1057#if (RTL8821C_SUPPORT == 1)1058case ODM_RTL8821C:1059rf->rf_supportability =1060/*HAL_RF_TX_PWR_TRACK |*/1061HAL_RF_IQK |1062HAL_RF_LCK |1063/*@HAL_RF_DPK |*/1064/*@HAL_RF_TXGAPK |*/10650;1066break;1067#endif1068#if (RTL8195B_SUPPORT == 1)1069case ODM_RTL8195B:1070rf->rf_supportability =1071HAL_RF_TX_PWR_TRACK |1072HAL_RF_IQK |1073HAL_RF_LCK |1074HAL_RF_DPK |1075HAL_RF_TXGAPK |1076HAL_RF_DPK_TRACK |10770;1078break;1079#endif1080#if (RTL8812F_SUPPORT == 1)1081case ODM_RTL8812F:1082rf->rf_supportability =1083/*HAL_RF_TX_PWR_TRACK |*/1084HAL_RF_IQK |1085HAL_RF_LCK |1086HAL_RF_DPK |1087HAL_RF_DACK |1088HAL_RF_DPK_TRACK |10890;1090break;1091#endif10921093#if (RTL8198F_SUPPORT == 1)1094case ODM_RTL8198F:1095rf->rf_supportability =1096/*HAL_RF_TX_PWR_TRACK |*/1097HAL_RF_IQK |1098HAL_RF_LCK |1099HAL_RF_DPK |1100/*@HAL_RF_TXGAPK |*/11010;1102break;1103#endif11041105#if (RTL8192F_SUPPORT == 1)1106case ODM_RTL8192F:1107rf->rf_supportability =1108/*HAL_RF_TX_PWR_TRACK |*/1109HAL_RF_IQK |1110HAL_RF_LCK |1111HAL_RF_DPK |1112/*@HAL_RF_TXGAPK |*/1113#ifdef CONFIG_2G_BAND_SHIFT1114/*@HAL_2GBAND_SHIFT |*/1115#endif11160;1117break;1118#endif11191120#if (RTL8197F_SUPPORT == 1)1121case ODM_RTL8197F:1122rf->rf_supportability =1123/*HAL_RF_TX_PWR_TRACK |*/1124HAL_RF_IQK |1125HAL_RF_LCK |1126HAL_RF_DPK |1127/*@HAL_RF_TXGAPK |*/11280;1129break;1130#endif1131#if (RTL8197G_SUPPORT == 1)1132case ODM_RTL8197G:1133rf->rf_supportability =1134/*HAL_RF_TX_PWR_TRACK |*/1135HAL_RF_IQK |1136/*HAL_RF_LCK |*/1137HAL_RF_DPK |1138/*@HAL_RF_TXGAPK |*/1139/*HAL_RF_DPK_TRACK |*/11400;1141break;1142#endif1143#if (RTL8721D_SUPPORT == 1)1144case ODM_RTL8721D:1145rf->rf_supportability =1146HAL_RF_TX_PWR_TRACK |1147HAL_RF_IQK |1148HAL_RF_LCK |1149HAL_RF_DPK |1150HAL_RF_DPK_TRACK |1151/*@HAL_RF_TXGAPK |*/11520;1153break;1154#endif11551156default:1157rf->rf_supportability =1158/*HAL_RF_TX_PWR_TRACK |*/1159HAL_RF_IQK |1160HAL_RF_LCK |1161/*@HAL_RF_DPK |*/1162/*@HAL_RF_TXGAPK |*/11630;1164break;1165}11661167RF_DBG(dm, DBG_RF_INIT,1168"IC = ((0x%x)), RF_Supportability Init MP = ((0x%x))\n",1169dm->support_ic_type, rf->rf_supportability);1170}11711172void halrf_supportability_init(void *dm_void)1173{1174struct dm_struct *dm = (struct dm_struct *)dm_void;1175struct _hal_rf_ *rf = &dm->rf_table;11761177switch (dm->support_ic_type) {1178case ODM_RTL8814B:1179#if (RTL8814B_SUPPORT == 1)1180rf->rf_supportability =1181HAL_RF_TX_PWR_TRACK |1182HAL_RF_IQK |1183HAL_RF_LCK |1184HAL_RF_DPK |1185HAL_RF_DACK |1186HAL_RF_DPK_TRACK |11870;1188#endif1189break;1190#if (RTL8822B_SUPPORT == 1)1191case ODM_RTL8822B:1192rf->rf_supportability =1193HAL_RF_TX_PWR_TRACK |1194HAL_RF_IQK |1195HAL_RF_LCK |1196/*@HAL_RF_DPK |*/11970;1198break;1199#endif1200#if (RTL8822C_SUPPORT == 1)1201case ODM_RTL8822C:1202rf->rf_supportability =1203HAL_RF_TX_PWR_TRACK |1204HAL_RF_IQK |1205HAL_RF_LCK |1206HAL_RF_DPK |1207HAL_RF_DACK |1208HAL_RF_DPK_TRACK |12090;1210break;1211#endif1212#if (RTL8821C_SUPPORT == 1)1213case ODM_RTL8821C:1214rf->rf_supportability =1215HAL_RF_TX_PWR_TRACK |1216HAL_RF_IQK |1217HAL_RF_LCK |1218/*@HAL_RF_DPK |*/1219/*@HAL_RF_TXGAPK |*/12200;1221break;1222#endif1223#if (RTL8195B_SUPPORT == 1)1224case ODM_RTL8195B:1225rf->rf_supportability =1226HAL_RF_TX_PWR_TRACK |1227HAL_RF_IQK |1228HAL_RF_LCK |1229HAL_RF_DPK |1230HAL_RF_TXGAPK |1231HAL_RF_DPK_TRACK |12320;1233break;1234#endif1235#if (RTL8812F_SUPPORT == 1)1236case ODM_RTL8812F:1237rf->rf_supportability =1238HAL_RF_TX_PWR_TRACK |1239HAL_RF_IQK |1240HAL_RF_LCK |1241HAL_RF_DPK |1242HAL_RF_DACK |1243HAL_RF_DPK_TRACK |12440;1245break;1246#endif12471248#if (RTL8198F_SUPPORT == 1)1249case ODM_RTL8198F:1250rf->rf_supportability =1251HAL_RF_TX_PWR_TRACK |1252HAL_RF_IQK |1253HAL_RF_LCK |1254HAL_RF_DPK |1255/*@HAL_RF_TXGAPK |*/12560;1257break;1258#endif12591260#if (RTL8192F_SUPPORT == 1)1261case ODM_RTL8192F:1262rf->rf_supportability =1263HAL_RF_TX_PWR_TRACK |1264HAL_RF_IQK |1265HAL_RF_LCK |1266HAL_RF_DPK |1267/*@HAL_RF_TXGAPK |*/1268#ifdef CONFIG_2G_BAND_SHIFT1269/*@HAL_2GBAND_SHIFT |*/1270#endif12710;1272break;1273#endif12741275#if (RTL8197F_SUPPORT == 1)1276case ODM_RTL8197F:1277rf->rf_supportability =1278HAL_RF_TX_PWR_TRACK |1279HAL_RF_IQK |1280HAL_RF_LCK |1281HAL_RF_DPK |1282/*@HAL_RF_TXGAPK |*/12830;1284break;1285#endif1286#if (RTL8197G_SUPPORT == 1)1287case ODM_RTL8197G:1288rf->rf_supportability =1289HAL_RF_TX_PWR_TRACK |1290HAL_RF_IQK |1291/*HAL_RF_LCK |*/1292HAL_RF_DPK |1293/*@HAL_RF_TXGAPK |*/1294/*HAL_RF_DPK_TRACK |*/1295#ifdef CONFIG_2G_BAND_SHIFT1296HAL_2GBAND_SHIFT |1297#endif12980;1299break;1300#endif1301#if (RTL8721D_SUPPORT == 1)1302case ODM_RTL8721D:1303rf->rf_supportability =1304HAL_RF_TX_PWR_TRACK |1305HAL_RF_IQK |1306HAL_RF_LCK |1307HAL_RF_DPK |1308HAL_RF_DPK_TRACK |1309/*@HAL_RF_TXGAPK |*/13100;1311break;1312#endif13131314default:1315rf->rf_supportability =1316HAL_RF_TX_PWR_TRACK |1317HAL_RF_IQK |1318HAL_RF_LCK |1319/*@HAL_RF_DPK |*/13200;1321break;1322}13231324RF_DBG(dm, DBG_RF_INIT,1325"IC = ((0x%x)), RF_Supportability Init = ((0x%x))\n",1326dm->support_ic_type, rf->rf_supportability);1327}13281329void halrf_watchdog(void *dm_void)1330{1331struct dm_struct *dm = (struct dm_struct *)dm_void;1332struct _hal_rf_ *rf = &dm->rf_table;1333#if 01334/*RF_DBG(dm, DBG_RF_TMP, "%s\n", __func__);*/1335#endif13361337if (rf->is_dpk_in_progress || dm->rf_calibrate_info.is_iqk_in_progress ||1338rf->is_tssi_in_progress)1339return;13401341phydm_rf_watchdog(dm);1342halrf_dpk_track(dm);1343}13441345#if 01346void1347halrf_iqk_init(1348void *dm_void1349)1350{1351struct dm_struct *dm = (struct dm_struct *)dm_void;1352struct _hal_rf_ *rf = &dm->rf_table;13531354switch (dm->support_ic_type) {1355#if (RTL8814B_SUPPORT == 1)1356case ODM_RTL8814B:1357break;1358#endif1359#if (RTL8822B_SUPPORT == 1)1360case ODM_RTL8822B:1361_iq_calibrate_8822b_init(dm);1362break;1363#endif1364#if (RTL8822C_SUPPORT == 1)1365case ODM_RTL8822C:1366_iq_calibrate_8822c_init(dm);1367break;1368#endif1369#if (RTL8821C_SUPPORT == 1)1370case ODM_RTL8821C:1371break;1372#endif13731374default:1375break;1376}1377}1378#endif13791380void halrf_reload_iqk(void *dm_void, boolean reset)1381{1382struct dm_struct *dm = (struct dm_struct *)dm_void;1383struct dm_iqk_info *iqk_info = &dm->IQK_info;1384u8 i, ch;1385u32 tmp;1386u32 bit_mask_20_16 = BIT(20) | BIT(19) | BIT(18) | BIT(17) | BIT(16);13871388switch (dm->support_ic_type) {1389#if (RTL8822C_SUPPORT == 1)1390case ODM_RTL8822C:1391iqk_reload_iqk_8822c(dm, reset);1392break;1393#endif1394default:1395break;1396}1397}13981399void halrf_rfk_handshake(void *dm_void, boolean is_before_k)1400{1401struct dm_struct *dm = (struct dm_struct *)dm_void;14021403if (*dm->mp_mode)1404return;14051406switch (dm->support_ic_type) {1407#if (RTL8822C_SUPPORT == 1)1408case ODM_RTL8822C:1409halrf_rfk_handshake_8822c(dm, is_before_k);1410break;1411#endif1412default:1413break;1414}1415}14161417void halrf_rf_k_connect_trigger(void *dm_void, boolean is_recovery,1418enum halrf_k_segment_time seg_time)1419{1420struct dm_struct *dm = (struct dm_struct *)dm_void;1421struct dm_dpk_info *dpk_info = &dm->dpk_info;1422struct _hal_rf_ *rf = &dm->rf_table;14231424if (dm->mp_mode && rf->is_con_tx && rf->is_single_tone &&1425rf->is_carrier_suppresion) {1426if (*dm->mp_mode &&1427(*rf->is_con_tx || *rf->is_single_tone ||1428*rf->is_carrier_suppresion))1429return;1430}1431/*[TX GAP K]*/14321433/*[LOK, IQK]*/1434halrf_segment_iqk_trigger(dm, true, seg_time);14351436/*[TSSI Trk]*/1437halrf_tssi_trigger(dm);14381439/*[DPK]*/1440if(dpk_info->is_dpk_by_channel == true)1441halrf_dpk_trigger(dm);1442else1443halrf_dpk_reload(dm);14441445//ADDA restore to MP_UI setting;1446config_halrf_path_adda_setting_trigger(dm);1447}14481449void config_halrf_path_adda_setting_trigger(void *dm_void)1450{1451struct dm_struct *dm = (struct dm_struct *)dm_void;14521453#if (RTL8814B_SUPPORT == 1)1454if (dm->support_ic_type & ODM_RTL8814B)1455config_phydm_path_adda_setting_8814b(dm);1456#endif14571458}14591460void halrf_dack_trigger(void *dm_void)1461{1462struct dm_struct *dm = (struct dm_struct *)dm_void;1463struct _hal_rf_ *rf = &dm->rf_table;14641465u64 start_time;14661467if (!(rf->rf_supportability & HAL_RF_DACK))1468return;14691470start_time = odm_get_current_time(dm);14711472switch (dm->support_ic_type) {1473#if (RTL8822C_SUPPORT == 1)1474case ODM_RTL8822C:1475halrf_dac_cal_8822c(dm);1476break;1477#endif1478#if (RTL8812F_SUPPORT == 1)1479case ODM_RTL8812F:1480halrf_dac_cal_8812f(dm);1481break;1482#endif1483#if (RTL8814B_SUPPORT == 1)1484case ODM_RTL8814B:1485halrf_dac_cal_8814b(dm);1486break;1487#endif1488default:1489break;1490}1491rf->dpk_progressing_time = odm_get_progressing_time(dm, start_time);1492RF_DBG(dm, DBG_RF_DACK, "[DACK]DACK progressing_time = %lld ms\n",1493rf->dpk_progressing_time);1494}149514961497void halrf_dack_dbg(void *dm_void)1498{1499struct dm_struct *dm = (struct dm_struct *)dm_void;1500struct _hal_rf_ *rf = &dm->rf_table;15011502u64 start_time;15031504if (!(rf->rf_supportability & HAL_RF_DACK))1505return;15061507switch (dm->support_ic_type) {1508#if (RTL8822C_SUPPORT == 1)1509case ODM_RTL8822C:1510halrf_dack_dbg_8822c(dm);1511break;1512#endif1513default:1514break;1515}1516}151715181519void halrf_segment_iqk_trigger(void *dm_void, boolean clear,1520boolean segment_iqk)1521{1522struct dm_struct *dm = (struct dm_struct *)dm_void;1523struct dm_iqk_info *iqk_info = &dm->IQK_info;1524struct _hal_rf_ *rf = &dm->rf_table;1525u64 start_time;15261527#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN))1528if (odm_check_power_status(dm) == false)1529return;1530#endif15311532if (dm->mp_mode &&1533rf->is_con_tx &&1534rf->is_single_tone &&1535rf->is_carrier_suppresion)1536if (*dm->mp_mode &&1537((*rf->is_con_tx ||1538*rf->is_single_tone ||1539*rf->is_carrier_suppresion)))1540return;15411542#if (DM_ODM_SUPPORT_TYPE == ODM_CE)1543if (!(rf->rf_supportability & HAL_RF_IQK))1544return;1545#endif15461547#if DISABLE_BB_RF1548return;1549#endif1550if (iqk_info->rfk_forbidden)1551return;15521553halrf_rfk_handshake(dm, true);15541555if (!dm->rf_calibrate_info.is_iqk_in_progress) {1556odm_acquire_spin_lock(dm, RT_IQK_SPINLOCK);1557dm->rf_calibrate_info.is_iqk_in_progress = true;1558odm_release_spin_lock(dm, RT_IQK_SPINLOCK);1559start_time = odm_get_current_time(dm);1560dm->IQK_info.segment_iqk = segment_iqk;15611562switch (dm->support_ic_type) {1563#if (RTL8822B_SUPPORT == 1)1564case ODM_RTL8822B:1565phy_iq_calibrate_8822b(dm, clear, segment_iqk);1566break;1567#endif1568#if (RTL8822C_SUPPORT == 1)1569case ODM_RTL8822C:1570phy_iq_calibrate_8822c(dm, clear, segment_iqk);1571break;1572#endif1573#if (RTL8821C_SUPPORT == 1)1574case ODM_RTL8821C:1575phy_iq_calibrate_8821c(dm, clear, segment_iqk);1576break;1577#endif1578#if (RTL8814B_SUPPORT == 1)1579case ODM_RTL8814B:1580phy_iq_calibrate_8814b(dm, clear, segment_iqk);1581break;1582#endif1583#if (RTL8195B_SUPPORT == 1)1584case ODM_RTL8195B:1585phy_iq_calibrate_8195b(dm, clear, segment_iqk);1586break;1587#endif1588#if (RTL8710C_SUPPORT == 1)1589case ODM_RTL8710C:1590phy_iq_calibrate_8710c(dm, clear, segment_iqk);1591break;1592#endif1593#if (RTL8198F_SUPPORT == 1)1594case ODM_RTL8198F:1595phy_iq_calibrate_8198f(dm, clear, segment_iqk);1596break;1597#endif1598#if (RTL8812F_SUPPORT == 1)1599case ODM_RTL8812F:1600phy_iq_calibrate_8812f(dm, clear, segment_iqk);1601break;1602#endif1603#if (RTL8197G_SUPPORT == 1)1604case ODM_RTL8197G:1605phy_iq_calibrate_8197g(dm, clear, segment_iqk);1606break;1607#endif1608#if (RTL8188E_SUPPORT == 1)1609case ODM_RTL8188E:1610phy_iq_calibrate_8188e(dm, false);1611break;1612#endif1613#if (RTL8188F_SUPPORT == 1)1614case ODM_RTL8188F:1615phy_iq_calibrate_8188f(dm, false);1616break;1617#endif1618#if (RTL8192E_SUPPORT == 1)1619case ODM_RTL8192E:1620phy_iq_calibrate_8192e(dm, false);1621break;1622#endif1623#if (RTL8197F_SUPPORT == 1)1624case ODM_RTL8197F:1625phy_iq_calibrate_8197f(dm, false);1626break;1627#endif1628#if (RTL8192F_SUPPORT == 1)1629case ODM_RTL8192F:1630phy_iq_calibrate_8192f(dm, false);1631break;1632#endif1633#if (RTL8703B_SUPPORT == 1)1634case ODM_RTL8703B:1635phy_iq_calibrate_8703b(dm, false);1636break;1637#endif1638#if (RTL8710B_SUPPORT == 1)1639case ODM_RTL8710B:1640phy_iq_calibrate_8710b(dm, false);1641break;1642#endif1643#if (RTL8723B_SUPPORT == 1)1644case ODM_RTL8723B:1645phy_iq_calibrate_8723b(dm, false);1646break;1647#endif1648#if (RTL8723D_SUPPORT == 1)1649case ODM_RTL8723D:1650phy_iq_calibrate_8723d(dm, false);1651break;1652#endif1653#if (RTL8721D_SUPPORT == 1)1654case ODM_RTL8721D:1655phy_iq_calibrate_8721d(dm, false);1656break;1657#endif1658#if (RTL8812A_SUPPORT == 1)1659case ODM_RTL8812:1660phy_iq_calibrate_8812a(dm, false);1661break;1662#endif1663#if (RTL8821A_SUPPORT == 1)1664case ODM_RTL8821:1665phy_iq_calibrate_8821a(dm, false);1666break;1667#endif1668#if (RTL8814A_SUPPORT == 1)1669case ODM_RTL8814A:1670phy_iq_calibrate_8814a(dm, false);1671break;1672#endif1673default:1674break;1675}1676dm->rf_calibrate_info.iqk_progressing_time =1677odm_get_progressing_time(dm, start_time);1678RF_DBG(dm, DBG_RF_IQK, "[IQK]IQK progressing_time = %lld ms\n",1679dm->rf_calibrate_info.iqk_progressing_time);16801681odm_acquire_spin_lock(dm, RT_IQK_SPINLOCK);1682dm->rf_calibrate_info.is_iqk_in_progress = false;1683odm_release_spin_lock(dm, RT_IQK_SPINLOCK);16841685halrf_rfk_handshake(dm, false);1686} else {1687RF_DBG(dm, DBG_RF_IQK,1688"== Return the IQK CMD, because RFKs in Progress ==\n");1689}1690}169116921693void halrf_iqk_trigger(void *dm_void, boolean is_recovery)1694{1695struct dm_struct *dm = (struct dm_struct *)dm_void;1696struct dm_iqk_info *iqk_info = &dm->IQK_info;1697struct dm_dpk_info *dpk_info = &dm->dpk_info;1698struct _hal_rf_ *rf = &dm->rf_table;1699u64 start_time;17001701#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN))1702if (odm_check_power_status(dm) == false)1703return;1704#endif17051706if (dm->mp_mode &&1707rf->is_con_tx &&1708rf->is_single_tone &&1709rf->is_carrier_suppresion)1710if (*dm->mp_mode &&1711((*rf->is_con_tx ||1712*rf->is_single_tone ||1713*rf->is_carrier_suppresion)))1714return;17151716if (!(rf->rf_supportability & HAL_RF_IQK))1717return;17181719#if DISABLE_BB_RF1720return;1721#endif17221723if (iqk_info->rfk_forbidden)1724return;17251726halrf_rfk_handshake(dm, true);17271728if (!dm->rf_calibrate_info.is_iqk_in_progress) {1729odm_acquire_spin_lock(dm, RT_IQK_SPINLOCK);1730dm->rf_calibrate_info.is_iqk_in_progress = true;1731odm_release_spin_lock(dm, RT_IQK_SPINLOCK);1732start_time = odm_get_current_time(dm);1733switch (dm->support_ic_type) {1734#if (RTL8188E_SUPPORT == 1)1735case ODM_RTL8188E:1736phy_iq_calibrate_8188e(dm, is_recovery);1737break;1738#endif1739#if (RTL8188F_SUPPORT == 1)1740case ODM_RTL8188F:1741phy_iq_calibrate_8188f(dm, is_recovery);1742break;1743#endif1744#if (RTL8192E_SUPPORT == 1)1745case ODM_RTL8192E:1746phy_iq_calibrate_8192e(dm, is_recovery);1747break;1748#endif1749#if (RTL8197F_SUPPORT == 1)1750case ODM_RTL8197F:1751phy_iq_calibrate_8197f(dm, is_recovery);1752break;1753#endif1754#if (RTL8192F_SUPPORT == 1)1755case ODM_RTL8192F:1756phy_iq_calibrate_8192f(dm, is_recovery);1757break;1758#endif1759#if (RTL8703B_SUPPORT == 1)1760case ODM_RTL8703B:1761phy_iq_calibrate_8703b(dm, is_recovery);1762break;1763#endif1764#if (RTL8710B_SUPPORT == 1)1765case ODM_RTL8710B:1766phy_iq_calibrate_8710b(dm, is_recovery);1767break;1768#endif1769#if (RTL8723B_SUPPORT == 1)1770case ODM_RTL8723B:1771phy_iq_calibrate_8723b(dm, is_recovery);1772break;1773#endif1774#if (RTL8723D_SUPPORT == 1)1775case ODM_RTL8723D:1776phy_iq_calibrate_8723d(dm, is_recovery);1777break;1778#endif1779#if (RTL8721D_SUPPORT == 1)1780case ODM_RTL8721D:1781phy_iq_calibrate_8721d(dm, is_recovery);1782break;1783#endif1784#if (RTL8812A_SUPPORT == 1)1785case ODM_RTL8812:1786phy_iq_calibrate_8812a(dm, is_recovery);1787break;1788#endif1789#if (RTL8821A_SUPPORT == 1)1790case ODM_RTL8821:1791phy_iq_calibrate_8821a(dm, is_recovery);1792break;1793#endif1794#if (RTL8814A_SUPPORT == 1)1795case ODM_RTL8814A:1796phy_iq_calibrate_8814a(dm, is_recovery);1797break;1798#endif1799#if (RTL8822B_SUPPORT == 1)1800case ODM_RTL8822B:1801phy_iq_calibrate_8822b(dm, false, false);1802break;1803#endif1804#if (RTL8822C_SUPPORT == 1)1805case ODM_RTL8822C:1806phy_iq_calibrate_8822c(dm, false, false);1807break;1808#endif1809#if (RTL8821C_SUPPORT == 1)1810case ODM_RTL8821C:1811phy_iq_calibrate_8821c(dm, false, false);1812break;1813#endif1814#if (RTL8814B_SUPPORT == 1)1815case ODM_RTL8814B:1816phy_iq_calibrate_8814b(dm, false, false);1817break;1818#endif1819#if (RTL8195B_SUPPORT == 1)1820case ODM_RTL8195B:1821phy_iq_calibrate_8195b(dm, false, false);1822break;1823#endif1824#if (RTL8710C_SUPPORT == 1)1825case ODM_RTL8710C:1826phy_iq_calibrate_8710c(dm, false, false);1827break;1828#endif1829#if (RTL8198F_SUPPORT == 1)1830case ODM_RTL8198F:1831phy_iq_calibrate_8198f(dm, false, false);1832break;1833#endif1834#if (RTL8812F_SUPPORT == 1)1835case ODM_RTL8812F:1836phy_iq_calibrate_8812f(dm, false, false);1837break;1838#endif1839#if (RTL8197G_SUPPORT == 1)1840case ODM_RTL8197G:1841phy_iq_calibrate_8197g(dm, false, false);1842break;1843#endif1844default:1845break;1846}1847rf->iqk_progressing_time = odm_get_progressing_time(dm, start_time);1848RF_DBG(dm, DBG_RF_LCK, "[IQK]Trigger IQK progressing_time = %lld ms\n",1849rf->iqk_progressing_time);1850odm_acquire_spin_lock(dm, RT_IQK_SPINLOCK);1851dm->rf_calibrate_info.is_iqk_in_progress = false;1852odm_release_spin_lock(dm, RT_IQK_SPINLOCK);18531854halrf_rfk_handshake(dm, false);1855} else {1856RF_DBG(dm, DBG_RF_IQK,1857"== Return the IQK CMD, because RFKs in Progress ==\n");1858}1859}18601861void halrf_lck_trigger(void *dm_void)1862{1863struct dm_struct *dm = (struct dm_struct *)dm_void;1864struct dm_iqk_info *iqk_info = &dm->IQK_info;1865struct _hal_rf_ *rf = &dm->rf_table;1866u64 start_time;18671868#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN))1869if (odm_check_power_status(dm) == false)1870return;1871#endif18721873if (dm->mp_mode &&1874rf->is_con_tx &&1875rf->is_single_tone &&1876rf->is_carrier_suppresion)1877if (*dm->mp_mode &&1878((*rf->is_con_tx ||1879*rf->is_single_tone ||1880*rf->is_carrier_suppresion)))1881return;18821883if (!(rf->rf_supportability & HAL_RF_LCK))1884return;18851886#if DISABLE_BB_RF1887return;1888#endif1889if (iqk_info->rfk_forbidden)1890return;1891while (*dm->is_scan_in_process) {1892RF_DBG(dm, DBG_RF_IQK, "[LCK]scan is in process, bypass LCK\n");1893return;1894}18951896if (!dm->rf_calibrate_info.is_lck_in_progress) {1897odm_acquire_spin_lock(dm, RT_IQK_SPINLOCK);1898dm->rf_calibrate_info.is_lck_in_progress = true;1899odm_release_spin_lock(dm, RT_IQK_SPINLOCK);1900start_time = odm_get_current_time(dm);1901switch (dm->support_ic_type) {1902#if (RTL8188E_SUPPORT == 1)1903case ODM_RTL8188E:1904phy_lc_calibrate_8188e(dm);1905break;1906#endif1907#if (RTL8188F_SUPPORT == 1)1908case ODM_RTL8188F:1909phy_lc_calibrate_8188f(dm);1910break;1911#endif1912#if (RTL8192E_SUPPORT == 1)1913case ODM_RTL8192E:1914phy_lc_calibrate_8192e(dm);1915break;1916#endif1917#if (RTL8197F_SUPPORT == 1)1918case ODM_RTL8197F:1919phy_lc_calibrate_8197f(dm);1920break;1921#endif1922#if (RTL8192F_SUPPORT == 1)1923case ODM_RTL8192F:1924phy_lc_calibrate_8192f(dm);1925break;1926#endif1927#if (RTL8703B_SUPPORT == 1)1928case ODM_RTL8703B:1929phy_lc_calibrate_8703b(dm);1930break;1931#endif1932#if (RTL8710B_SUPPORT == 1)1933case ODM_RTL8710B:1934phy_lc_calibrate_8710b(dm);1935break;1936#endif1937#if (RTL8721D_SUPPORT == 1)1938case ODM_RTL8721D:1939phy_lc_calibrate_8721d(dm);1940break;1941#endif1942#if (RTL8723B_SUPPORT == 1)1943case ODM_RTL8723B:1944phy_lc_calibrate_8723b(dm);1945break;1946#endif1947#if (RTL8723D_SUPPORT == 1)1948case ODM_RTL8723D:1949phy_lc_calibrate_8723d(dm);1950break;1951#endif1952#if (RTL8812A_SUPPORT == 1)1953case ODM_RTL8812:1954phy_lc_calibrate_8812a(dm);1955break;1956#endif1957#if (RTL8821A_SUPPORT == 1)1958case ODM_RTL8821:1959phy_lc_calibrate_8821a(dm);1960break;1961#endif1962#if (RTL8814A_SUPPORT == 1)1963case ODM_RTL8814A:1964phy_lc_calibrate_8814a(dm);1965break;1966#endif1967#if (RTL8822B_SUPPORT == 1)1968case ODM_RTL8822B:1969phy_lc_calibrate_8822b(dm);1970break;1971#endif1972#if (RTL8822C_SUPPORT == 1)1973case ODM_RTL8822C:1974phy_lc_calibrate_8822c(dm);1975break;1976#endif1977#if (RTL8812F_SUPPORT == 1)1978case ODM_RTL8812F:1979phy_lc_calibrate_8812f(dm);1980break;1981#endif1982#if (RTL8821C_SUPPORT == 1)1983case ODM_RTL8821C:1984phy_lc_calibrate_8821c(dm);1985break;1986#endif1987#if (RTL8814B_SUPPORT == 1)1988case ODM_RTL8814B:1989break;1990#endif1991#if (RTL8710C_SUPPORT == 1)1992case ODM_RTL8710C:1993phy_lc_calibrate_8710c(dm);1994break;1995#endif1996default:1997break;1998}1999dm->rf_calibrate_info.lck_progressing_time =2000odm_get_progressing_time(dm, start_time);2001RF_DBG(dm, DBG_RF_IQK, "[IQK]LCK progressing_time = %lld ms\n",2002dm->rf_calibrate_info.lck_progressing_time);2003#if (RTL8822B_SUPPORT == 1 || RTL8821C_SUPPORT == 1)2004halrf_lck_dbg(dm);2005#endif2006odm_acquire_spin_lock(dm, RT_IQK_SPINLOCK);2007dm->rf_calibrate_info.is_lck_in_progress = false;2008odm_release_spin_lock(dm, RT_IQK_SPINLOCK);2009} else {2010RF_DBG(dm, DBG_RF_IQK,2011"= Return the LCK CMD, because RFK is in Progress =\n");2012}2013}20142015void halrf_aac_check(struct dm_struct *dm)2016{2017switch (dm->support_ic_type) {2018#if (RTL8821C_SUPPORT == 1)2019case ODM_RTL8821C:2020#if 02021aac_check_8821c(dm);2022#endif2023break;2024#endif2025#if (RTL8822B_SUPPORT == 1)2026case ODM_RTL8822B:2027#if 12028aac_check_8822b(dm);2029#endif2030break;2031#endif2032default:2033break;2034}2035}20362037void halrf_x2k_check(struct dm_struct *dm)2038{20392040switch (dm->support_ic_type) {2041case ODM_RTL8821C:2042#if (RTL8821C_SUPPORT == 1)2043#endif2044break;2045case ODM_RTL8822C:2046#if (RTL8822C_SUPPORT == 1)2047phy_x2_check_8822c(dm);2048break;2049#endif2050case ODM_RTL8812F:2051#if (RTL8812F_SUPPORT == 1)2052phy_x2_check_8812f(dm);2053break;2054#endif2055default:2056break;2057}2058}20592060void halrf_set_rfsupportability(void *dm_void)2061{2062struct dm_struct *dm = (struct dm_struct *)dm_void;2063struct _hal_rf_ *rf = &dm->rf_table;20642065if (rf->manual_rf_supportability &&2066*rf->manual_rf_supportability != 0xffffffff) {2067rf->rf_supportability = *rf->manual_rf_supportability;2068} else if (*dm->mp_mode) {2069halrf_supportability_init_mp(dm);2070} else {2071halrf_supportability_init(dm);2072}2073}20742075void halrf_init(void *dm_void)2076{2077struct dm_struct *dm = (struct dm_struct *)dm_void;2078struct _hal_rf_ *rf = &dm->rf_table;20792080RF_DBG(dm, DBG_RF_INIT, "HALRF_Init\n");2081rf->aac_checked = false;2082halrf_init_debug_setting(dm);2083halrf_set_rfsupportability(dm);2084#if 12085/*Init all RF funciton*/2086halrf_aac_check(dm);2087halrf_dack_trigger(dm);2088halrf_x2k_check(dm);2089#endif20902091/*power trim, thrmal trim, pa bias*/2092phydm_config_new_kfree(dm);20932094/*TSSI Init*/2095halrf_tssi_dck(dm, true);2096halrf_tssi_get_efuse(dm);2097halrf_tssi_set_de(dm);2098}20992100void halrf_dpk_trigger(void *dm_void)2101{2102struct dm_struct *dm = (struct dm_struct *)dm_void;2103struct _hal_rf_ *rf = &dm->rf_table;2104struct dm_dpk_info *dpk_info = &dm->dpk_info;2105struct dm_iqk_info *iqk_info = &dm->IQK_info;21062107u64 start_time;21082109#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN))2110if (odm_check_power_status(dm) == false)2111return;2112#endif21132114if (dm->mp_mode &&2115rf->is_con_tx &&2116rf->is_single_tone &&2117rf->is_carrier_suppresion)2118if (*dm->mp_mode &&2119((*rf->is_con_tx ||2120*rf->is_single_tone ||2121*rf->is_carrier_suppresion)))2122return;21232124if (!(rf->rf_supportability & HAL_RF_DPK))2125return;21262127#if DISABLE_BB_RF2128return;2129#endif21302131if (iqk_info->rfk_forbidden)2132return;21332134halrf_rfk_handshake(dm, true);21352136if (!rf->is_dpk_in_progress) {2137odm_acquire_spin_lock(dm, RT_IQK_SPINLOCK);2138rf->is_dpk_in_progress = true;2139odm_release_spin_lock(dm, RT_IQK_SPINLOCK);2140start_time = odm_get_current_time(dm);21412142switch (dm->support_ic_type) {2143#if (RTL8822C_SUPPORT == 1)2144case ODM_RTL8822C:2145do_dpk_8822c(dm);2146break;2147#endif21482149#if (DM_ODM_SUPPORT_TYPE & (ODM_AP))2150#if (RTL8197F_SUPPORT == 1)2151case ODM_RTL8197F:2152do_dpk_8197f(dm);2153break;2154#endif2155#if (RTL8192F_SUPPORT == 1)2156case ODM_RTL8192F:2157do_dpk_8192f(dm);2158break;2159#endif21602161#if (RTL8198F_SUPPORT == 1)2162case ODM_RTL8198F:2163do_dpk_8198f(dm);2164break;2165#endif2166#if (RTL8812F_SUPPORT == 1)2167case ODM_RTL8812F:2168do_dpk_8812f(dm);2169break;2170#endif2171#if (RTL8197G_SUPPORT == 1)2172case ODM_RTL8197G:2173do_dpk_8197g(dm);2174break;2175#endif21762177#endif21782179#if (RTL8814B_SUPPORT == 1)2180case ODM_RTL8814B:2181do_dpk_8814b(dm);2182break;2183#endif21842185#if (DM_ODM_SUPPORT_TYPE & (ODM_IOT))2186#if (RTL8195B_SUPPORT == 1)2187case ODM_RTL8195B:2188do_dpk_8195b(dm);2189break;2190#endif2191#if (RTL8721D_SUPPORT == 1)2192case ODM_RTL8721D:2193do_dpk_8721d(dm);2194break;2195#endif2196#endif2197default:2198break;2199}2200rf->dpk_progressing_time = odm_get_progressing_time(dm, start_time);2201RF_DBG(dm, DBG_RF_DPK, "[DPK]DPK progressing_time = %lld ms\n",2202rf->dpk_progressing_time);22032204odm_acquire_spin_lock(dm, RT_IQK_SPINLOCK);2205rf->is_dpk_in_progress = false;2206odm_release_spin_lock(dm, RT_IQK_SPINLOCK);22072208halrf_rfk_handshake(dm, false);2209} else {2210RF_DBG(dm, DBG_RF_DPK,2211"== Return the DPK CMD, because RFKs in Progress ==\n");2212}2213}22142215void halrf_set_dpkbychannel(void *dm_void, boolean dpk_by_ch)2216{2217struct dm_struct *dm = (struct dm_struct *)dm_void;2218struct _hal_rf_ *rf = &dm->rf_table;2219struct dm_dpk_info *dpk_info = &dm->dpk_info;2220struct dm_iqk_info *iqk_info = &dm->IQK_info;222122222223switch (dm->support_ic_type) {2224#if (RTL8814B_SUPPORT == 1)2225case ODM_RTL8814B:2226dpk_set_dpkbychannel_8814b(dm, dpk_by_ch);2227break;2228#endif22292230#if (DM_ODM_SUPPORT_TYPE & (ODM_IOT))2231#if (RTL8195B_SUPPORT == 1)2232case ODM_RTL8195B:2233dpk_set_dpkbychannel_8195b(dm,dpk_by_ch);2234break;2235#endif2236#endif2237default:2238if (dpk_by_ch)2239dpk_info->is_dpk_by_channel = 1;2240else2241dpk_info->is_dpk_by_channel = 0;2242break;2243}22442245}22462247void halrf_set_dpkenable(void *dm_void, boolean is_dpk_enable)2248{2249struct dm_struct *dm = (struct dm_struct *)dm_void;2250struct _hal_rf_ *rf = &dm->rf_table;2251struct dm_dpk_info *dpk_info = &dm->dpk_info;2252struct dm_iqk_info *iqk_info = &dm->IQK_info;225322542255switch (dm->support_ic_type) {2256#if (RTL8814B_SUPPORT == 1)2257case ODM_RTL8814B:2258dpk_set_is_dpk_enable_8814b(dm, is_dpk_enable);2259break;2260#endif22612262#if (DM_ODM_SUPPORT_TYPE & (ODM_IOT))2263#if (RTL8195B_SUPPORT == 1)2264case ODM_RTL8195B:2265dpk_set_is_dpk_enable_8195b(dm, is_dpk_enable);2266break;2267#endif22682269#if (RTL8721D_SUPPORT == 1)2270case RTL8721D_SUPPORT:2271dpk_set_is_dpk_enable_8721d(dm, is_dpk_enable);2272break;2273#endif22742275#endif227622772278default:2279break;2280}22812282}2283boolean halrf_get_dpkbychannel(void *dm_void)2284{2285struct dm_struct *dm = (struct dm_struct *)dm_void;2286struct _hal_rf_ *rf = &dm->rf_table;2287struct dm_dpk_info *dpk_info = &dm->dpk_info;2288struct dm_iqk_info *iqk_info = &dm->IQK_info;2289boolean is_dpk_by_channel = true;22902291switch (dm->support_ic_type) {2292#if (RTL8814B_SUPPORT == 1)2293case ODM_RTL8814B:2294is_dpk_by_channel = dpk_get_dpkbychannel_8814b(dm);2295break;2296#endif22972298#if (DM_ODM_SUPPORT_TYPE & (ODM_IOT))2299#if (RTL8195B_SUPPORT == 1)2300case ODM_RTL8195B:2301is_dpk_by_channel = dpk_get_dpkbychannel_8195b(dm);2302break;2303#endif2304#endif23052306default:2307break;2308}2309return is_dpk_by_channel;23102311}231223132314boolean halrf_get_dpkenable(void *dm_void)2315{2316struct dm_struct *dm = (struct dm_struct *)dm_void;2317struct _hal_rf_ *rf = &dm->rf_table;2318struct dm_dpk_info *dpk_info = &dm->dpk_info;2319struct dm_iqk_info *iqk_info = &dm->IQK_info;2320boolean is_dpk_enable = true;232123222323switch (dm->support_ic_type) {2324#if (RTL8814B_SUPPORT == 1)2325case ODM_RTL8814B:2326is_dpk_enable = dpk_get_is_dpk_enable_8814b(dm);2327break;2328#endif23292330#if (DM_ODM_SUPPORT_TYPE & (ODM_IOT))2331#if (RTL8195B_SUPPORT == 1)2332case ODM_RTL8195B:2333is_dpk_enable = dpk_get_is_dpk_enable_8195b(dm);2334break;2335#endif2336#endif2337default:2338break;2339}2340return is_dpk_enable;23412342}23432344u8 halrf_dpk_result_check(void *dm_void)2345{2346struct dm_struct *dm = (struct dm_struct *)dm_void;2347struct dm_dpk_info *dpk_info = &dm->dpk_info;23482349u8 result = 0;23502351switch (dm->support_ic_type) {2352#if (RTL8822C_SUPPORT == 1)2353case ODM_RTL8822C:2354if (dpk_info->dpk_path_ok == 0x3)2355result = 1;2356else2357result = 0;2358break;2359#endif23602361#if (RTL8195B_SUPPORT == 1)2362case ODM_RTL8195B:2363if (dpk_info->dpk_path_ok == 0x1)2364result = 1;2365else2366result = 0;2367break;2368#endif23692370#if (RTL8721D_SUPPORT == 1)2371case ODM_RTL8721D:2372if (dpk_info->dpk_path_ok == 0x1)2373result = 1;2374else2375result = 0;2376break;2377#endif23782379#if (DM_ODM_SUPPORT_TYPE & (ODM_AP))23802381#if (RTL8197F_SUPPORT == 1)2382case ODM_RTL8197F:2383if (dpk_info->dpk_path_ok == 0x3)2384result = 1;2385else2386result = 0;2387break;2388#endif23892390#if (RTL8192F_SUPPORT == 1)2391case ODM_RTL8192F:2392if (dpk_info->dpk_path_ok == 0x3)2393result = 1;2394else2395result = 0;2396break;2397#endif23982399#if (RTL8198F_SUPPORT == 1)2400case ODM_RTL8198F:2401if (dpk_info->dpk_path_ok == 0xf)2402result = 1;2403else2404result = 0;2405break;2406#endif24072408#if (RTL8814B_SUPPORT == 1)2409case ODM_RTL8814B:2410if (dpk_info->dpk_path_ok == 0xf)2411result = 1;2412else2413result = 0;2414break;2415#endif24162417#if (RTL8812F_SUPPORT == 1)2418case ODM_RTL8812F:2419if (dpk_info->dpk_path_ok == 0x3)2420result = 1;2421else2422result = 0;2423break;2424#endif24252426#if (RTL8197G_SUPPORT == 1)2427case ODM_RTL8197G:2428if (dpk_info->dpk_path_ok == 0x3)2429result = 1;2430else2431result = 0;2432break;2433#endif24342435#endif2436default:2437break;2438}2439return result;2440}24412442void halrf_dpk_sram_read(void *dm_void)2443{2444struct dm_struct *dm = (struct dm_struct *)dm_void;24452446u8 path, group;24472448switch (dm->support_ic_type) {2449#if (RTL8822C_SUPPORT == 1)2450case ODM_RTL8822C:2451dpk_coef_read_8822c(dm);2452break;2453#endif24542455#if (RTL8195B_SUPPORT == 1)2456case ODM_RTL8195B:2457dpk_sram_read_8195b(dm);2458break;2459#endif24602461#if (RTL8721D_SUPPORT == 1)2462case ODM_RTL8721D:2463dpk_sram_read_8721d(dm);2464break;2465#endif24662467#if (DM_ODM_SUPPORT_TYPE & (ODM_AP))24682469#if (RTL8197F_SUPPORT == 1)2470case ODM_RTL8197F:2471dpk_sram_read_8197f(dm);2472break;2473#endif24742475#if (RTL8192F_SUPPORT == 1)2476case ODM_RTL8192F:2477dpk_sram_read_8192f(dm);2478break;2479#endif24802481#if (RTL8198F_SUPPORT == 1)2482case ODM_RTL8198F:2483dpk_sram_read_8198f(dm);2484break;2485#endif24862487#if (RTL8814B_SUPPORT == 1)2488case ODM_RTL8814B:2489dpk_sram_read_8814b(dm);2490break;2491#endif24922493#if (RTL8812F_SUPPORT == 1)2494case ODM_RTL8812F:2495dpk_coef_read_8812f(dm);2496break;2497#endif24982499#if (RTL8197G_SUPPORT == 1)2500case ODM_RTL8197G:2501dpk_sram_read_8197g(dm);2502break;2503#endif25042505#endif2506default:2507break;2508}2509}25102511void halrf_dpk_enable_disable(void *dm_void)2512{2513struct dm_struct *dm = (struct dm_struct *)dm_void;2514struct _hal_rf_ *rf = &dm->rf_table;25152516if (!(rf->rf_supportability & HAL_RF_DPK))2517return;25182519if (!rf->is_dpk_in_progress) {2520odm_acquire_spin_lock(dm, RT_IQK_SPINLOCK);2521rf->is_dpk_in_progress = true;2522odm_release_spin_lock(dm, RT_IQK_SPINLOCK);25232524switch (dm->support_ic_type) {2525#if (RTL8822C_SUPPORT == 1)2526case ODM_RTL8822C:2527dpk_enable_disable_8822c(dm);2528break;2529#endif2530#if (RTL8195B_SUPPORT == 1)2531case ODM_RTL8195B:2532dpk_enable_disable_8195b(dm);2533break;2534#endif2535#if (RTL8721D_SUPPORT == 1)2536case ODM_RTL8721D:2537phy_dpk_enable_disable_8721d(dm);2538break;2539#endif25402541#if (DM_ODM_SUPPORT_TYPE & (ODM_AP))25422543#if (RTL8197F_SUPPORT == 1)2544case ODM_RTL8197F:2545phy_dpk_enable_disable_8197f(dm);2546break;2547#endif2548#if (RTL8192F_SUPPORT == 1)2549case ODM_RTL8192F:2550phy_dpk_enable_disable_8192f(dm);2551break;2552#endif25532554#if (RTL8198F_SUPPORT == 1)2555case ODM_RTL8198F:2556dpk_enable_disable_8198f(dm);2557break;2558#endif25592560#if (RTL8814B_SUPPORT == 1)2561case ODM_RTL8814B:2562dpk_enable_disable_8814b(dm);2563break;2564#endif25652566#if (RTL8812F_SUPPORT == 1)2567case ODM_RTL8812F:2568dpk_enable_disable_8812f(dm);2569break;2570#endif25712572#if (RTL8197G_SUPPORT == 1)2573case ODM_RTL8197G:2574dpk_enable_disable_8197g(dm);2575break;2576#endif25772578#endif2579default:2580break;2581}25822583odm_acquire_spin_lock(dm, RT_IQK_SPINLOCK);2584rf->is_dpk_in_progress = false;2585odm_release_spin_lock(dm, RT_IQK_SPINLOCK);2586} else {2587RF_DBG(dm, DBG_RF_DPK,2588"== Return the DPK CMD, because RFKs in Progress ==\n");2589}2590}25912592void halrf_dpk_track(void *dm_void)2593{2594struct dm_struct *dm = (struct dm_struct *)dm_void;2595struct dm_dpk_info *dpk_info = &dm->dpk_info;2596struct _hal_rf_ *rf = &dm->rf_table;25972598if (rf->is_dpk_in_progress || dm->rf_calibrate_info.is_iqk_in_progress ||2599dm->is_psd_in_process || (dpk_info->dpk_path_ok == 0) ||2600!(rf->rf_supportability & HAL_RF_DPK_TRACK) || rf->is_tssi_in_progress)2601return;26022603switch (dm->support_ic_type) {2604#if (RTL8814B_SUPPORT == 1)2605case ODM_RTL8814B:2606dpk_track_8814b(dm);2607break;2608#endif26092610#if (RTL8822C_SUPPORT == 1)2611case ODM_RTL8822C:2612dpk_track_8822c(dm);2613break;2614#endif26152616#if (RTL8195B_SUPPORT == 1)2617case ODM_RTL8195B:2618dpk_track_8195b(dm);2619break;2620#endif26212622#if (RTL8721D_SUPPORT == 1)2623case ODM_RTL8721D:2624phy_dpk_track_8721d(dm);2625break;2626#endif26272628#if (DM_ODM_SUPPORT_TYPE & (ODM_AP))26292630#if (RTL8197F_SUPPORT == 1)2631case ODM_RTL8197F:2632phy_dpk_track_8197f(dm);2633break;2634#endif26352636#if (RTL8192F_SUPPORT == 1)2637case ODM_RTL8192F:2638phy_dpk_track_8192f(dm);2639break;2640#endif26412642#if (RTL8198F_SUPPORT == 1)2643case ODM_RTL8198F:2644dpk_track_8198f(dm);2645break;2646#endif26472648#if (RTL8812F_SUPPORT == 1)2649case ODM_RTL8812F:2650dpk_track_8812f(dm);2651break;2652#endif26532654#if (RTL8197G_SUPPORT == 1)2655case ODM_RTL8197G:2656dpk_track_8197g(dm);2657break;2658#endif26592660#endif2661default:2662break;2663}2664}26652666void halrf_set_dpk_track(void *dm_void, u8 enable)2667{2668struct dm_struct *dm = (struct dm_struct *)dm_void;2669struct _hal_rf_ *rf = &(dm->rf_table);26702671if (enable)2672rf->rf_supportability = rf->rf_supportability | HAL_RF_DPK_TRACK;2673else2674rf->rf_supportability = rf->rf_supportability & ~HAL_RF_DPK_TRACK;2675}26762677void halrf_dpk_reload(void *dm_void)2678{2679struct dm_struct *dm = (struct dm_struct *)dm_void;2680struct dm_dpk_info *dpk_info = &dm->dpk_info;26812682switch (dm->support_ic_type) {2683#if (RTL8195B_SUPPORT == 1)2684case ODM_RTL8195B:2685if (dpk_info->dpk_path_ok > 0)2686dpk_reload_8195b(dm);2687break;2688#endif2689#if (RTL8721D_SUPPORT == 1)2690case ODM_RTL8721D:2691if (dpk_info->dpk_path_ok > 0)2692dpk_reload_8721d(dm);2693break;2694#endif26952696#if (DM_ODM_SUPPORT_TYPE & (ODM_AP))26972698#if (RTL8197F_SUPPORT == 1)2699case ODM_RTL8197F:2700if (dpk_info->dpk_path_ok > 0)2701dpk_reload_8197f(dm);2702break;2703#endif27042705#if (RTL8192F_SUPPORT == 1)2706case ODM_RTL8192F:2707if (dpk_info->dpk_path_ok > 0)2708dpk_reload_8192f(dm);27092710break;2711#endif27122713#if (RTL8198F_SUPPORT == 1)2714case ODM_RTL8198F:2715if (dpk_info->dpk_path_ok > 0)2716dpk_reload_8198f(dm);2717break;2718#endif27192720#if (RTL8814B_SUPPORT == 1)2721case ODM_RTL8814B:2722if (dpk_info->dpk_path_ok > 0)2723dpk_reload_8814b(dm);2724break;2725#endif27262727#endif2728default:2729break;2730}2731}27322733void halrf_dpk_info_rsvd_page(void *dm_void, u8 *buf, u32 *buf_size)2734{2735struct dm_struct *dm = (struct dm_struct *)dm_void;2736struct _hal_rf_ *rf = &dm->rf_table;2737struct dm_dpk_info *dpk_info = &dm->dpk_info;27382739if (!(rf->rf_supportability & HAL_RF_DPK) || rf->is_dpk_in_progress)2740return;27412742switch (dm->support_ic_type) {2743#if (RTL8822C_SUPPORT == 1)2744case ODM_RTL8822C:2745dpk_info_rsvd_page_8822c(dm, buf, buf_size);2746break;2747#endif2748default:2749break;2750}2751}27522753void halrf_iqk_info_rsvd_page(void *dm_void, u8 *buf, u32 *buf_size)2754{2755struct dm_struct *dm = (struct dm_struct *)dm_void;2756struct _hal_rf_ *rf = &dm->rf_table;27572758if (!(rf->rf_supportability & HAL_RF_IQK))2759return;27602761if (dm->rf_calibrate_info.is_iqk_in_progress)2762return;27632764switch (dm->support_ic_type) {2765#if (RTL8822C_SUPPORT == 1)2766case ODM_RTL8822C:2767iqk_info_rsvd_page_8822c(dm, buf, buf_size);2768break;2769#endif2770default:2771break;2772}2773}27742775enum hal_status2776halrf_config_rfk_with_header_file(void *dm_void, u32 config_type)2777{2778struct dm_struct *dm = (struct dm_struct *)dm_void;2779enum hal_status result = HAL_STATUS_SUCCESS;2780#if 02781#if (RTL8822B_SUPPORT == 1)2782if (dm->support_ic_type == ODM_RTL8822B) {2783if (config_type == CONFIG_BB_RF_CAL_INIT)2784odm_read_and_config_mp_8822b_cal_init(dm);2785}2786#endif2787#endif2788#if (RTL8197G_SUPPORT == 1)2789if (dm->support_ic_type == ODM_RTL8197G) {2790if (config_type == CONFIG_BB_RF_CAL_INIT)2791odm_read_and_config_mp_8197g_cal_init(dm);2792}2793#endif2794#if (RTL8198F_SUPPORT == 1)2795if (dm->support_ic_type == ODM_RTL8198F) {2796if (config_type == CONFIG_BB_RF_CAL_INIT)2797odm_read_and_config_mp_8198f_cal_init(dm);2798}2799#endif2800#if (RTL8812F_SUPPORT == 1)2801if (dm->support_ic_type == ODM_RTL8812F) {2802if (config_type == CONFIG_BB_RF_CAL_INIT)2803odm_read_and_config_mp_8812f_cal_init(dm);2804}2805#endif2806#if (RTL8822C_SUPPORT == 1)2807if (dm->support_ic_type == ODM_RTL8822C) {2808if (config_type == CONFIG_BB_RF_CAL_INIT)2809odm_read_and_config_mp_8822c_cal_init(dm);2810}2811#endif2812#if (RTL8814B_SUPPORT == 1)2813if (dm->support_ic_type == ODM_RTL8814B) {2814if (config_type == CONFIG_BB_RF_CAL_INIT)2815odm_read_and_config_mp_8814b_cal_init(dm);2816}2817#endif2818#if (RTL8195B_SUPPORT == 1)2819if (dm->support_ic_type == ODM_RTL8195B) {2820if (config_type == CONFIG_BB_RF_CAL_INIT)2821odm_read_and_config_mp_8195b_cal_init(dm);2822}2823#endif2824#if (RTL8721D_SUPPORT == 1)2825if (dm->support_ic_type == ODM_RTL8721D) {2826if (config_type == CONFIG_BB_RF_CAL_INIT)2827odm_read_and_config_mp_8721d_cal_init(dm);2828}2829#endif28302831return result;2832}28332834void halrf_txgapk_trigger(void *dm_void)2835{2836struct dm_struct *dm = (struct dm_struct *)dm_void;2837struct _hal_rf_ *rf = &dm->rf_table;28382839u64 start_time;28402841start_time = odm_get_current_time(dm);28422843switch (dm->support_ic_type) {2844#if (DM_ODM_SUPPORT_TYPE & (ODM_IOT))2845#if (RTL8195B_SUPPORT == 1)2846case ODM_RTL8195B:2847phy_txgap_calibrate_8195b(dm, false);2848break;2849#endif2850#if (RTL8721D_SUPPORT == 1)2851case ODM_RTL8721D:2852phy_txgap_calibrate_8721d(dm, false);2853break;2854#endif28552856#endif28572858default:2859break;2860}2861rf->dpk_progressing_time =2862odm_get_progressing_time(dm_void, start_time);2863RF_DBG(dm, DBG_RF_TXGAPK, "[TGGC]TXGAPK progressing_time = %lld ms\n",2864rf->dpk_progressing_time);2865}28662867void halrf_tssi_get_efuse(void *dm_void)2868{2869struct dm_struct *dm = (struct dm_struct *)dm_void;28702871#if (RTL8822C_SUPPORT == 1)2872if (dm->support_ic_type & ODM_RTL8822C) {2873halrf_tssi_get_efuse_8822c(dm);2874halrf_get_efuse_thermal_pwrtype_8822c(dm);2875}2876#endif28772878#if (RTL8812F_SUPPORT == 1)2879if (dm->support_ic_type & ODM_RTL8812F) {2880halrf_tssi_get_efuse_8812f(dm);2881}2882#endif28832884#if (RTL8814B_SUPPORT == 1)2885if (dm->support_ic_type & ODM_RTL8814B) {2886halrf_tssi_get_efuse_8814b(dm);2887halrf_get_efuse_thermal_pwrtype_8814b(dm);2888}2889#endif28902891#if (RTL8197G_SUPPORT == 1)2892if (dm->support_ic_type & ODM_RTL8197G) {2893halrf_tssi_get_efuse_8197g(dm);2894}2895#endif28962897}28982899void halrf_do_rxbb_dck(void *dm_void)2900{2901struct dm_struct *dm = (struct dm_struct *)dm_void;290229032904#if (RTL8814B_SUPPORT == 1)2905if (dm->support_ic_type == ODM_RTL8814B)2906halrf_do_rxbb_dck_8814b(dm);2907#endif29082909}29102911void halrf_do_tssi(void *dm_void)2912{2913struct dm_struct *dm = (struct dm_struct *)dm_void;29142915#if (RTL8822C_SUPPORT == 1)2916if (dm->support_ic_type == ODM_RTL8822C)2917halrf_do_tssi_8822c(dm);2918#endif29192920#if (RTL8812F_SUPPORT == 1)2921if (dm->support_ic_type == ODM_RTL8812F)2922halrf_do_tssi_8812f(dm);2923#endif29242925#if (RTL8197G_SUPPORT == 1)2926if (dm->support_ic_type == ODM_RTL8197G)2927halrf_do_tssi_8197g(dm);2928#endif29292930}29312932void halrf_do_thermal(void *dm_void)2933{2934struct dm_struct *dm = (struct dm_struct *)dm_void;29352936#if (RTL8822C_SUPPORT == 1)2937if (dm->support_ic_type & ODM_RTL8822C)2938halrf_do_thermal_8822c(dm);2939#endif2940}2941294229432944u32 halrf_set_tssi_value(void *dm_void, u32 tssi_value)2945{2946struct dm_struct *dm = (struct dm_struct *)dm_void;29472948#if (RTL8822C_SUPPORT == 1)2949if (dm->support_ic_type & ODM_RTL8822C)2950return halrf_set_tssi_value_8822c(dm, tssi_value);2951#endif29522953#if (RTL8814B_SUPPORT == 1)2954if (dm->support_ic_type & ODM_RTL8814B)2955return halrf_set_tssi_value_8814b(dm, tssi_value);2956#endif29572958return 0;2959}29602961void halrf_set_tssi_power(void *dm_void, s8 power)2962{2963struct dm_struct *dm = (struct dm_struct *)dm_void;29642965#if (RTL8822C_SUPPORT == 1)2966/*halrf_set_tssi_poewr_8822c(dm, power);*/2967#endif2968}29692970void halrf_tssi_set_de_for_tx_verify(void *dm_void, u32 tssi_de, u8 path)2971{2972struct dm_struct *dm = (struct dm_struct *)dm_void;29732974#if (RTL8822C_SUPPORT == 1)2975if (dm->support_ic_type & ODM_RTL8822C)2976halrf_tssi_set_de_for_tx_verify_8822c(dm, tssi_de, path);2977#endif29782979#if (RTL8814B_SUPPORT == 1)2980if (dm->support_ic_type & ODM_RTL8814B)2981halrf_tssi_set_de_for_tx_verify_8814b(dm, tssi_de, path);2982#endif29832984#if (RTL8812F_SUPPORT == 1)2985if (dm->support_ic_type & ODM_RTL8812F)2986halrf_tssi_set_de_for_tx_verify_8812f(dm, tssi_de, path);2987#endif298829892990}29912992u32 halrf_query_tssi_value(void *dm_void)2993{2994struct dm_struct *dm = (struct dm_struct *)dm_void;29952996#if (RTL8822C_SUPPORT == 1)2997if (dm->support_ic_type & ODM_RTL8822C)2998return halrf_query_tssi_value_8822c(dm);2999#endif30003001#if (RTL8814B_SUPPORT == 1)3002if (dm->support_ic_type & ODM_RTL8814B)3003return halrf_query_tssi_value_8814b(dm);3004#endif3005return 0;3006}30073008void halrf_tssi_cck(void *dm_void)3009{3010struct dm_struct *dm = (struct dm_struct *)dm_void;30113012#if (RTL8822C_SUPPORT == 1)3013/*halrf_tssi_cck_8822c(dm);*/3014if (dm->support_ic_type & ODM_RTL8822C)3015halrf_thermal_cck_8822c(dm);3016#endif30173018}30193020void halrf_thermal_cck(void *dm_void)3021{3022struct dm_struct *dm = (struct dm_struct *)dm_void;30233024#if (RTL8822C_SUPPORT == 1)3025if (dm->support_ic_type & ODM_RTL8822C)3026halrf_thermal_cck_8822c(dm);3027#endif30283029}30303031void halrf_tssi_set_de(void *dm_void)3032{3033struct dm_struct *dm = (struct dm_struct *)dm_void;30343035#if (RTL8814B_SUPPORT == 1)3036if (dm->support_ic_type & ODM_RTL8814B)3037halrf_tssi_set_de_8814b(dm);3038#endif3039}30403041void halrf_tssi_dck(void *dm_void, u8 direct_do)3042{3043struct dm_struct *dm = (struct dm_struct *)dm_void;30443045halrf_rfk_handshake(dm, true);30463047#if (RTL8814B_SUPPORT == 1)3048if (dm->support_ic_type & ODM_RTL8814B)3049halrf_tssi_dck_8814b(dm, direct_do);3050#endif30513052#if (RTL8822C_SUPPORT == 1)3053if (dm->support_ic_type & ODM_RTL8822C)3054halrf_tssi_dck_8822c(dm);3055#endif30563057#if (RTL8812F_SUPPORT == 1)3058if (dm->support_ic_type & ODM_RTL8812F)3059halrf_tssi_dck_8812f(dm);3060#endif30613062#if (RTL8197G_SUPPORT == 1)3063if (dm->support_ic_type == ODM_RTL8197G)3064halrf_tssi_dck_8197g(dm);3065#endif30663067halrf_rfk_handshake(dm, false);30683069}30703071void halrf_calculate_tssi_codeword(void *dm_void)3072{3073struct dm_struct *dm = (struct dm_struct *)dm_void;30743075#if (RTL8814B_SUPPORT == 1)3076if (dm->support_ic_type & ODM_RTL8814B)3077halrf_calculate_tssi_codeword_8814b(dm, RF_PATH_A);3078#endif30793080}30813082void halrf_set_tssi_codeword(void *dm_void)3083{3084struct dm_struct *dm = (struct dm_struct *)dm_void;3085struct _hal_rf_ *rf = &dm->rf_table;3086struct _halrf_tssi_data *tssi = &rf->halrf_tssi_data;30873088#if (RTL8814B_SUPPORT == 1)3089if (dm->support_ic_type & ODM_RTL8814B)3090halrf_set_tssi_codeword_8814b(dm, tssi->tssi_codeword);3091#endif3092}30933094u8 halrf_get_tssi_codeword_for_txindex(void *dm_void)3095{3096struct dm_struct *dm = (struct dm_struct *)dm_void;30973098#if (RTL8814B_SUPPORT == 1)3099if (dm->support_ic_type & ODM_RTL8814B)3100return 60;3101/*return halrf_get_tssi_codeword_8814b(dm);*/3102#endif31033104#if (RTL8822C_SUPPORT == 1)3105if (dm->support_ic_type & ODM_RTL8822C)3106return 64;3107#endif31083109#if (RTL8812F_SUPPORT == 1)3110if (dm->support_ic_type & ODM_RTL8812F)3111return 100;3112#endif31133114#if (RTL8197G_SUPPORT == 1)3115if (dm->support_ic_type & ODM_RTL8197G)3116return 100;3117#endif31183119return 60;3120}31213122u32 halrf_tssi_get_de(void *dm_void, u8 path)3123{3124struct dm_struct *dm = (struct dm_struct *)dm_void;31253126#if (RTL8822C_SUPPORT == 1)3127if (dm->support_ic_type & ODM_RTL8822C)3128return halrf_tssi_get_de_8822c(dm, path);3129#endif31303131#if (RTL8812F_SUPPORT == 1)3132if (dm->support_ic_type & ODM_RTL8812F)3133return halrf_tssi_get_de_8812f(dm, path);3134#endif31353136#if (RTL8814B_SUPPORT == 1)3137if (dm->support_ic_type & ODM_RTL8814B)3138return halrf_tssi_get_de_8814b(dm, path);3139#endif31403141#if (RTL8197G_SUPPORT == 1)3142if (dm->support_ic_type & ODM_RTL8197G)3143return halrf_tssi_get_de_8197g(dm, path);3144#endif3145return 0;3146}31473148void halrf_tssi_trigger(void *dm_void)3149{3150struct dm_struct *dm = (struct dm_struct *)dm_void;31513152halrf_calculate_tssi_codeword(dm);3153halrf_set_tssi_codeword(dm);3154halrf_tssi_dck(dm, false);3155#if (DM_ODM_SUPPORT_TYPE & (ODM_AP))3156halrf_tssi_get_efuse(dm);3157#endif3158halrf_tssi_set_de(dm);3159halrf_do_tssi(dm);3160}31613162/*Golbal function*/3163void halrf_reload_bp(void *dm_void, u32 *bp_reg, u32 *bp, u32 num)3164{3165struct dm_struct *dm = (struct dm_struct *)dm_void;3166u32 i;31673168for (i = 0; i < num; i++)3169odm_write_4byte(dm, bp_reg[i], bp[i]);3170}31713172void halrf_reload_bprf(void *dm_void, u32 *bp_reg, u32 bp[][4], u32 num,3173u8 ss)3174{3175struct dm_struct *dm = (struct dm_struct *)dm_void;3176u32 i, path;31773178for (i = 0; i < num; i++) {3179for (path = 0; path < ss; path++)3180odm_set_rf_reg(dm, (enum rf_path)path, bp_reg[i],3181MASK20BITS, bp[i][path]);3182}3183}31843185void halrf_bp(void *dm_void, u32 *bp_reg, u32 *bp, u32 num)3186{3187struct dm_struct *dm = (struct dm_struct *)dm_void;3188u32 i;31893190for (i = 0; i < num; i++)3191bp[i] = odm_read_4byte(dm, bp_reg[i]);3192}31933194void halrf_bprf(void *dm_void, u32 *bp_reg, u32 bp[][4], u32 num, u8 ss)3195{3196struct dm_struct *dm = (struct dm_struct *)dm_void;3197u32 i, path;31983199for (i = 0; i < num; i++) {3200for (path = 0; path < ss; path++) {3201bp[i][path] =3202odm_get_rf_reg(dm, (enum rf_path)path,3203bp_reg[i], MASK20BITS);3204}3205}3206}32073208void halrf_swap(void *dm_void, u32 *v1, u32 *v2)3209{3210struct dm_struct *dm = (struct dm_struct *)dm_void;3211u32 temp;32123213temp = *v1;3214*v1 = *v2;3215*v2 = temp;3216}32173218void halrf_bubble(void *dm_void, u32 *v1, u32 *v2)3219{3220struct dm_struct *dm = (struct dm_struct *)dm_void;3221u32 temp;32223223if (*v1 >= 0x200 && *v2 >= 0x200) {3224if (*v1 > *v2)3225halrf_swap(dm, v1, v2);3226} else if (*v1 < 0x200 && *v2 < 0x200) {3227if (*v1 > *v2)3228halrf_swap(dm, v1, v2);3229} else if (*v1 < 0x200 && *v2 >= 0x200) {3230halrf_swap(dm, v1, v2);3231}3232}32333234void halrf_b_sort(void *dm_void, u32 *iv, u32 *qv)3235{3236struct dm_struct *dm = (struct dm_struct *)dm_void;3237u32 temp;3238u32 i, j;32393240RF_DBG(dm, DBG_RF_DACK, "[DACK]bubble!!!!!!!!!!!!");3241for (i = 0; i < SN - 1; i++) {3242for (j = 0; j < (SN - 1 - i) ; j++) {3243halrf_bubble(dm, &iv[j], &iv[j + 1]);3244halrf_bubble(dm, &qv[j], &qv[j + 1]);3245}3246}3247}32483249void halrf_minmax_compare(void *dm_void, u32 value, u32 *min,3250u32 *max)3251{3252struct dm_struct *dm = (struct dm_struct *)dm_void;32533254if (value >= 0x200) {3255if (*min >= 0x200) {3256if (*min > value)3257*min = value;3258} else {3259*min = value;3260}3261if (*max >= 0x200) {3262if (*max < value)3263*max = value;3264}3265} else {3266if (*min < 0x200) {3267if (*min > value)3268*min = value;3269}32703271if (*max >= 0x200) {3272*max = value;3273} else {3274if (*max < value)3275*max = value;3276}3277}3278}32793280u32 halrf_delta(void *dm_void, u32 v1, u32 v2)3281{3282struct dm_struct *dm = (struct dm_struct *)dm_void;32833284if (v1 >= 0x200 && v2 >= 0x200) {3285if (v1 > v2)3286return v1 - v2;3287else3288return v2 - v1;3289} else if (v1 >= 0x200 && v2 < 0x200) {3290return v2 + (0x400 - v1);3291} else if (v1 < 0x200 && v2 >= 0x200) {3292return v1 + (0x400 - v2);3293}32943295if (v1 > v2)3296return v1 - v2;3297else3298return v2 - v1;3299}33003301boolean halrf_compare(void *dm_void, u32 value)3302{3303struct dm_struct *dm = (struct dm_struct *)dm_void;33043305boolean fail = false;33063307if (value >= 0x200 && (0x400 - value) > 0x64)3308fail = true;3309else if (value < 0x200 && value > 0x64)3310fail = true;33113312if (fail)3313RF_DBG(dm, DBG_RF_DACK, "[DACK]overflow!!!!!!!!!!!!!!!");3314return fail;3315}33163317void halrf_mode(void *dm_void, u32 *i_value, u32 *q_value)3318{3319struct dm_struct *dm = (struct dm_struct *)dm_void;3320u32 iv[SN], qv[SN], im[SN], qm[SN], temp, temp1, temp2;3321u32 p, m, t;3322u32 i_max = 0, q_max = 0, i_min = 0x0, q_min = 0x0, c = 0x0;3323u32 i_delta, q_delta;3324u8 i, j, ii = 0, qi = 0;3325boolean fail = false;33263327ODM_delay_ms(10);3328for (i = 0; i < SN; i++) {3329im[i] = 0;3330qm[i] = 0;3331}3332i = 0;3333c = 0;3334while (i < SN && c < 1000) {3335c++;3336temp = odm_get_bb_reg(dm, 0x2dbc, 0x3fffff);3337iv[i] = (temp & 0x3ff000) >> 12;3338qv[i] = temp & 0x3ff;33393340fail = false;3341if (halrf_compare(dm, iv[i]))3342fail = true;3343if (halrf_compare(dm, qv[i]))3344fail = true;3345if (!fail)3346i++;3347}3348c = 0;3349do {3350c++;3351i_min = iv[0];3352i_max = iv[0];3353q_min = qv[0];3354q_max = qv[0];3355for (i = 0; i < SN; i++) {3356halrf_minmax_compare(dm, iv[i], &i_min, &i_max);3357halrf_minmax_compare(dm, qv[i], &q_min, &q_max);3358}3359RF_DBG(dm, DBG_RF_DACK, "[DACK]i_min=0x%x, i_max=0x%x",3360i_min, i_max);3361RF_DBG(dm, DBG_RF_DACK, "[DACK]q_min=0x%x, q_max=0x%x",3362q_min, q_max);3363if (i_max < 0x200 && i_min < 0x200)3364i_delta = i_max - i_min;3365else if (i_max >= 0x200 && i_min >= 0x200)3366i_delta = i_max - i_min;3367else3368i_delta = i_max + (0x400 - i_min);33693370if (q_max < 0x200 && q_min < 0x200)3371q_delta = q_max - q_min;3372else if (q_max >= 0x200 && q_min >= 0x200)3373q_delta = q_max - q_min;3374else3375q_delta = q_max + (0x400 - q_min);3376RF_DBG(dm, DBG_RF_DACK, "[DACK]i_delta=0x%x, q_delta=0x%x",3377i_delta, q_delta);3378halrf_b_sort(dm, iv, qv);3379if (i_delta > 5 || q_delta > 5) {3380temp = odm_get_bb_reg(dm, 0x2dbc, 0x3fffff);3381iv[0] = (temp & 0x3ff000) >> 12;3382qv[0] = temp & 0x3ff;3383temp = odm_get_bb_reg(dm, 0x2dbc, 0x3fffff);3384iv[SN - 1] = (temp & 0x3ff000) >> 12;3385qv[SN - 1] = temp & 0x3ff;3386} else {3387break;3388}3389} while (c < 100);3390#if 13391#if 03392for (i = 0; i < SN; i++)3393RF_DBG(dm, DBG_RF_DACK, "[DACK]iv[%d] = 0x%x\n", i, iv[i]);3394for (i = 0; i < SN; i++)3395RF_DBG(dm, DBG_RF_DACK, "[DACK]qv[%d] = 0x%x\n", i, qv[i]);3396#endif3397/*i*/3398m = 0;3399p = 0;3400for (i = 10; i < SN - 10; i++) {3401if (iv[i] > 0x200)3402m = (0x400 - iv[i]) + m;3403else3404p = iv[i] + p;3405}34063407if (p > m) {3408t = p - m;3409t = t / (SN - 20);3410} else {3411t = m - p;3412t = t / (SN - 20);3413if (t != 0x0)3414t = 0x400 - t;3415}3416*i_value = t;3417/*q*/3418m = 0;3419p = 0;3420for (i = 10; i < SN - 10; i++) {3421if (qv[i] > 0x200)3422m = (0x400 - qv[i]) + m;3423else3424p = qv[i] + p;3425}3426if (p > m) {3427t = p - m;3428t = t / (SN - 20);3429} else {3430t = m - p;3431t = t / (SN - 20);3432if (t != 0x0)3433t = 0x400 - t;3434}3435*q_value = t;3436#endif3437}3438343934403441