Path: blob/master/ALFA-W1F1/RTL8814AU/hal/phydm/halrf/halrf_kfree.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 files*/27/*@============================================================*/28#include "mp_precomp.h"29#include "phydm_precomp.h"3031/*@<YuChen, 150720> Add for KFree Feature Requested by RF David.*/32/*@This is a phydm API*/3334void phydm_set_kfree_to_rf_8814a(void *dm_void, u8 e_rf_path, u8 data)35{36struct dm_struct *dm = (struct dm_struct *)dm_void;37struct dm_rf_calibration_struct *cali_info = &dm->rf_calibrate_info;38boolean is_odd;39u32 tx_gain_bitmask = (BIT(17) | BIT(16) | BIT(15));4041if ((data % 2) != 0) { /*odd->positive*/42data = data - 1;43odm_set_rf_reg(dm, e_rf_path, RF_0x55, BIT(19), 1);44is_odd = true;45} else { /*even->negative*/46odm_set_rf_reg(dm, e_rf_path, RF_0x55, BIT(19), 0);47is_odd = false;48}49RF_DBG(dm, DBG_RF_MP, "phy_ConfigKFree8814A(): RF_0x55[19]= %d\n",50is_odd);51switch (data) {52case 0:53odm_set_rf_reg(dm, e_rf_path, RF_0x55, BIT(14), 0);54odm_set_rf_reg(dm, e_rf_path, RF_0x55, tx_gain_bitmask, 0);55cali_info->kfree_offset[e_rf_path] = 0;56break;57case 2:58odm_set_rf_reg(dm, e_rf_path, RF_0x55, BIT(14), 1);59odm_set_rf_reg(dm, e_rf_path, RF_0x55, tx_gain_bitmask, 0);60cali_info->kfree_offset[e_rf_path] = 0;61break;62case 4:63odm_set_rf_reg(dm, e_rf_path, RF_0x55, BIT(14), 0);64odm_set_rf_reg(dm, e_rf_path, RF_0x55, tx_gain_bitmask, 1);65cali_info->kfree_offset[e_rf_path] = 1;66break;67case 6:68odm_set_rf_reg(dm, e_rf_path, RF_0x55, BIT(14), 1);69odm_set_rf_reg(dm, e_rf_path, RF_0x55, tx_gain_bitmask, 1);70cali_info->kfree_offset[e_rf_path] = 1;71break;72case 8:73odm_set_rf_reg(dm, e_rf_path, RF_0x55, BIT(14), 0);74odm_set_rf_reg(dm, e_rf_path, RF_0x55, tx_gain_bitmask, 2);75cali_info->kfree_offset[e_rf_path] = 2;76break;77case 10:78odm_set_rf_reg(dm, e_rf_path, RF_0x55, BIT(14), 1);79odm_set_rf_reg(dm, e_rf_path, RF_0x55, tx_gain_bitmask, 2);80cali_info->kfree_offset[e_rf_path] = 2;81break;82case 12:83odm_set_rf_reg(dm, e_rf_path, RF_0x55, BIT(14), 0);84odm_set_rf_reg(dm, e_rf_path, RF_0x55, tx_gain_bitmask, 3);85cali_info->kfree_offset[e_rf_path] = 3;86break;87case 14:88odm_set_rf_reg(dm, e_rf_path, RF_0x55, BIT(14), 1);89odm_set_rf_reg(dm, e_rf_path, RF_0x55, tx_gain_bitmask, 3);90cali_info->kfree_offset[e_rf_path] = 3;91break;92case 16:93odm_set_rf_reg(dm, e_rf_path, RF_0x55, BIT(14), 0);94odm_set_rf_reg(dm, e_rf_path, RF_0x55, tx_gain_bitmask, 4);95cali_info->kfree_offset[e_rf_path] = 4;96break;97case 18:98odm_set_rf_reg(dm, e_rf_path, RF_0x55, BIT(14), 1);99odm_set_rf_reg(dm, e_rf_path, RF_0x55, tx_gain_bitmask, 4);100cali_info->kfree_offset[e_rf_path] = 4;101break;102case 20:103odm_set_rf_reg(dm, e_rf_path, RF_0x55, BIT(14), 0);104odm_set_rf_reg(dm, e_rf_path, RF_0x55, tx_gain_bitmask, 5);105cali_info->kfree_offset[e_rf_path] = 5;106break;107108default:109break;110}111112if (!is_odd) {113/*that means Kfree offset is negative, we need to record it.*/114cali_info->kfree_offset[e_rf_path] =115(-1) * cali_info->kfree_offset[e_rf_path];116RF_DBG(dm, DBG_RF_MP,117"phy_ConfigKFree8814A(): kfree_offset = %d\n",118cali_info->kfree_offset[e_rf_path]);119} else {120RF_DBG(dm, DBG_RF_MP,121"phy_ConfigKFree8814A(): kfree_offset = %d\n",122cali_info->kfree_offset[e_rf_path]);123}124}125126void phydm_get_thermal_trim_offset_8821c(void *dm_void)127{128struct dm_struct *dm = (struct dm_struct *)dm_void;129struct odm_power_trim_data *power_trim_info = &dm->power_trim_data;130131u8 pg_therm = 0xff;132133odm_efuse_one_byte_read(dm, PPG_THERMAL_OFFSET_21C, &pg_therm, false);134135if (pg_therm != 0xff) {136pg_therm = pg_therm & 0x1f;137if ((pg_therm & BIT(0)) == 0)138power_trim_info->thermal = (-1 * (pg_therm >> 1));139else140power_trim_info->thermal = (pg_therm >> 1);141142power_trim_info->flag |= KFREE_FLAG_THERMAL_K_ON;143}144145RF_DBG(dm, DBG_RF_MP, "[kfree] 8821c thermal trim flag:0x%02x\n",146power_trim_info->flag);147148if (power_trim_info->flag & KFREE_FLAG_THERMAL_K_ON)149RF_DBG(dm, DBG_RF_MP, "[kfree] 8821c thermal:%d\n",150power_trim_info->thermal);151}152153void phydm_get_power_trim_offset_8821c(void *dm_void)154{155struct dm_struct *dm = (struct dm_struct *)dm_void;156struct odm_power_trim_data *power_trim_info = &dm->power_trim_data;157158u8 pg_power = 0xff, i;159160odm_efuse_one_byte_read(dm, PPG_2G_TXAB_21C, &pg_power, false);161162if (pg_power != 0xff) {163power_trim_info->bb_gain[0][0] = pg_power;164odm_efuse_one_byte_read(dm, PPG_5GL1_TXA_21C, &pg_power, false);165power_trim_info->bb_gain[1][0] = pg_power;166odm_efuse_one_byte_read(dm, PPG_5GL2_TXA_21C, &pg_power, false);167power_trim_info->bb_gain[2][0] = pg_power;168odm_efuse_one_byte_read(dm, PPG_5GM1_TXA_21C, &pg_power, false);169power_trim_info->bb_gain[3][0] = pg_power;170odm_efuse_one_byte_read(dm, PPG_5GM2_TXA_21C, &pg_power, false);171power_trim_info->bb_gain[4][0] = pg_power;172odm_efuse_one_byte_read(dm, PPG_5GH1_TXA_21C, &pg_power, false);173power_trim_info->bb_gain[5][0] = pg_power;174power_trim_info->flag =175power_trim_info->flag | KFREE_FLAG_ON |176KFREE_FLAG_ON_2G | KFREE_FLAG_ON_5G;177}178179RF_DBG(dm, DBG_RF_MP, "[kfree] 8821c power trim flag:0x%02x\n",180power_trim_info->flag);181182if (power_trim_info->flag & KFREE_FLAG_ON) {183for (i = 0; i < KFREE_BAND_NUM; i++)184RF_DBG(dm, DBG_RF_MP,185"[kfree] 8821c pwr_trim->bb_gain[%d][0]=0x%X\n",186i, power_trim_info->bb_gain[i][0]);187}188}189190void phydm_set_kfree_to_rf_8821c(void *dm_void, u8 e_rf_path, boolean wlg_btg,191u8 data)192{193struct dm_struct *dm = (struct dm_struct *)dm_void;194u8 wlg, btg;195u32 gain_bmask = (BIT(18) | BIT(17) | BIT(16) | BIT(15) | BIT(14));196u32 s_gain_bmask = (BIT(19) | BIT(18) | BIT(17) |197BIT(16) | BIT(15) | BIT(14));198199odm_set_rf_reg(dm, e_rf_path, RF_0xde, BIT(0), 1);200odm_set_rf_reg(dm, e_rf_path, RF_0xde, BIT(5), 1);201odm_set_rf_reg(dm, e_rf_path, RF_0x55, BIT(6), 1);202odm_set_rf_reg(dm, e_rf_path, RF_0x65, BIT(6), 1);203204if (wlg_btg) {205wlg = data & 0xf;206btg = (data & 0xf0) >> 4;207208odm_set_rf_reg(dm, e_rf_path, RF_0x55, BIT(19), (wlg & BIT(0)));209odm_set_rf_reg(dm, e_rf_path, RF_0x55, gain_bmask, (wlg >> 1));210211odm_set_rf_reg(dm, e_rf_path, RF_0x65, BIT(19), (btg & BIT(0)));212odm_set_rf_reg(dm, e_rf_path, RF_0x65, gain_bmask, (btg >> 1));213} else {214odm_set_rf_reg(dm, e_rf_path, RF_0x55, BIT(19), data & BIT(0));215odm_set_rf_reg(dm, e_rf_path, RF_0x55, gain_bmask,216((data & 0x1f) >> 1));217}218219RF_DBG(dm, DBG_RF_MP,220"[kfree] 8821c 0x55[19:14]=0x%X 0x65[19:14]=0x%X\n",221odm_get_rf_reg(dm, e_rf_path, RF_0x55, s_gain_bmask),222odm_get_rf_reg(dm, e_rf_path, RF_0x65, s_gain_bmask));223}224225void phydm_clear_kfree_to_rf_8821c(void *dm_void, u8 e_rf_path, u8 data)226{227struct dm_struct *dm = (struct dm_struct *)dm_void;228u32 gain_bmask = (BIT(18) | BIT(17) | BIT(16) | BIT(15) | BIT(14));229u32 s_gain_bmask = (BIT(19) | BIT(18) | BIT(17) |230BIT(16) | BIT(15) | BIT(14));231232odm_set_rf_reg(dm, e_rf_path, RF_0xde, BIT(0), 1);233odm_set_rf_reg(dm, e_rf_path, RF_0xde, BIT(5), 1);234odm_set_rf_reg(dm, e_rf_path, RF_0x55, BIT(6), 1);235odm_set_rf_reg(dm, e_rf_path, RF_0x65, BIT(6), 1);236237odm_set_rf_reg(dm, e_rf_path, RF_0x55, BIT(19), (data & BIT(0)));238odm_set_rf_reg(dm, e_rf_path, RF_0x55, gain_bmask, (data >> 1));239240odm_set_rf_reg(dm, e_rf_path, RF_0x65, BIT(19), (data & BIT(0)));241odm_set_rf_reg(dm, e_rf_path, RF_0x65, gain_bmask, (data >> 1));242243odm_set_rf_reg(dm, e_rf_path, RF_0xde, BIT(0), 0);244odm_set_rf_reg(dm, e_rf_path, RF_0xde, BIT(5), 0);245odm_set_rf_reg(dm, e_rf_path, RF_0x55, BIT(6), 0);246odm_set_rf_reg(dm, e_rf_path, RF_0x65, BIT(6), 0);247248RF_DBG(dm, DBG_RF_MP,249"[kfree] 8821c 0x55[19:14]=0x%X 0x65[19:14]=0x%X\n",250odm_get_rf_reg(dm, e_rf_path, RF_0x55, s_gain_bmask),251odm_get_rf_reg(dm, e_rf_path, RF_0x65, s_gain_bmask));252}253254void phydm_get_thermal_trim_offset_8822b(void *dm_void)255{256struct dm_struct *dm = (struct dm_struct *)dm_void;257struct odm_power_trim_data *power_trim_info = &dm->power_trim_data;258259u8 pg_therm = 0xff;260261odm_efuse_one_byte_read(dm, PPG_THERMAL_OFFSET_22B, &pg_therm, false);262263if (pg_therm != 0xff) {264pg_therm = pg_therm & 0x1f;265if ((pg_therm & BIT(0)) == 0)266power_trim_info->thermal = (-1 * (pg_therm >> 1));267else268power_trim_info->thermal = (pg_therm >> 1);269270power_trim_info->flag |= KFREE_FLAG_THERMAL_K_ON;271}272273RF_DBG(dm, DBG_RF_MP, "[kfree] 8822b thermal trim flag:0x%02x\n",274power_trim_info->flag);275276if (power_trim_info->flag & KFREE_FLAG_THERMAL_K_ON)277RF_DBG(dm, DBG_RF_MP, "[kfree] 8822b thermal:%d\n",278power_trim_info->thermal);279}280281void phydm_get_power_trim_offset_8822b(void *dm_void)282{283struct dm_struct *dm = (struct dm_struct *)dm_void;284struct odm_power_trim_data *power_trim_info = &dm->power_trim_data;285286u8 pg_power = 0xff, i, j;287288odm_efuse_one_byte_read(dm, PPG_2G_TXAB_22B, &pg_power, false);289290if (pg_power != 0xff) {291/*Path A*/292odm_efuse_one_byte_read(dm, PPG_2G_TXAB_22B, &pg_power, false);293power_trim_info->bb_gain[0][0] = (pg_power & 0xf);294295/*Path B*/296odm_efuse_one_byte_read(dm, PPG_2G_TXAB_22B, &pg_power, false);297power_trim_info->bb_gain[0][1] = ((pg_power & 0xf0) >> 4);298299power_trim_info->flag |= KFREE_FLAG_ON_2G;300power_trim_info->flag |= KFREE_FLAG_ON;301}302303odm_efuse_one_byte_read(dm, PPG_5GL1_TXA_22B, &pg_power, false);304305if (pg_power != 0xff) {306/*Path A*/307odm_efuse_one_byte_read(dm, PPG_5GL1_TXA_22B, &pg_power, false);308power_trim_info->bb_gain[1][0] = pg_power;309odm_efuse_one_byte_read(dm, PPG_5GL2_TXA_22B, &pg_power, false);310power_trim_info->bb_gain[2][0] = pg_power;311odm_efuse_one_byte_read(dm, PPG_5GM1_TXA_22B, &pg_power, false);312power_trim_info->bb_gain[3][0] = pg_power;313odm_efuse_one_byte_read(dm, PPG_5GM2_TXA_22B, &pg_power, false);314power_trim_info->bb_gain[4][0] = pg_power;315odm_efuse_one_byte_read(dm, PPG_5GH1_TXA_22B, &pg_power, false);316power_trim_info->bb_gain[5][0] = pg_power;317318/*Path B*/319odm_efuse_one_byte_read(dm, PPG_5GL1_TXB_22B, &pg_power, false);320power_trim_info->bb_gain[1][1] = pg_power;321odm_efuse_one_byte_read(dm, PPG_5GL2_TXB_22B, &pg_power, false);322power_trim_info->bb_gain[2][1] = pg_power;323odm_efuse_one_byte_read(dm, PPG_5GM1_TXB_22B, &pg_power, false);324power_trim_info->bb_gain[3][1] = pg_power;325odm_efuse_one_byte_read(dm, PPG_5GM2_TXB_22B, &pg_power, false);326power_trim_info->bb_gain[4][1] = pg_power;327odm_efuse_one_byte_read(dm, PPG_5GH1_TXB_22B, &pg_power, false);328power_trim_info->bb_gain[5][1] = pg_power;329330power_trim_info->flag |= KFREE_FLAG_ON_5G;331power_trim_info->flag |= KFREE_FLAG_ON;332}333334RF_DBG(dm, DBG_RF_MP, "[kfree] 8822b power trim flag:0x%02x\n",335power_trim_info->flag);336337if (!(power_trim_info->flag & KFREE_FLAG_ON))338return;339340for (i = 0; i < KFREE_BAND_NUM; i++) {341for (j = 0; j < 2; j++)342RF_DBG(dm, DBG_RF_MP,343"[kfree] 8822b PwrTrim->bb_gain[%d][%d]=0x%X\n",344i, j, power_trim_info->bb_gain[i][j]);345}346}347348void phydm_set_pa_bias_to_rf_8822b(void *dm_void, u8 e_rf_path, s8 tx_pa_bias)349{350struct dm_struct *dm = (struct dm_struct *)dm_void;351u32 rf_reg_51 = 0, rf_reg_52 = 0, rf_reg_3f = 0;352u32 tx_pa_bias_bmask = (BIT(12) | BIT(11) | BIT(10) | BIT(9));353354rf_reg_51 = odm_get_rf_reg(dm, e_rf_path, RF_0x51, RFREGOFFSETMASK);355rf_reg_52 = odm_get_rf_reg(dm, e_rf_path, RF_0x52, RFREGOFFSETMASK);356357RF_DBG(dm, DBG_RF_MP,358"[kfree] 8822b 2g rf(0x51)=0x%X rf(0x52)=0x%X path=%d\n",359rf_reg_51, rf_reg_52, e_rf_path);360361#if 0362/*rf3f => rf52[19:17] = rf3f[2:0] rf52[16:15] = rf3f[4:3] rf52[3:0] = rf3f[8:5]*/363/*rf3f => rf51[6:3] = rf3f[12:9] rf52[13] = rf3f[13]*/364#endif365rf_reg_3f = ((rf_reg_52 & 0xe0000) >> 17) |366(((rf_reg_52 & 0x18000) >> 15) << 3) |367((rf_reg_52 & 0xf) << 5) |368(((rf_reg_51 & 0x78) >> 3) << 9) |369(((rf_reg_52 & 0x2000) >> 13) << 13);370371RF_DBG(dm, DBG_RF_MP,372"[kfree] 8822b 2g original pa_bias=%d rf_reg_3f=0x%X path=%d\n",373tx_pa_bias, rf_reg_3f, e_rf_path);374375tx_pa_bias = (s8)((rf_reg_3f & tx_pa_bias_bmask) >> 9) + tx_pa_bias;376377if (tx_pa_bias < 0)378tx_pa_bias = 0;379else if (tx_pa_bias > 7)380tx_pa_bias = 7;381382rf_reg_3f = ((rf_reg_3f & 0xfe1ff) | (tx_pa_bias << 9));383384RF_DBG(dm, DBG_RF_MP,385"[kfree] 8822b 2g 0x%X 0x%X pa_bias=%d rfreg_3f=0x%X path=%d\n",386PPG_PABIAS_2GA_22B, PPG_PABIAS_2GB_22B,387tx_pa_bias, rf_reg_3f, e_rf_path);388389odm_set_rf_reg(dm, e_rf_path, RF_0xef, BIT(10), 0x1);390odm_set_rf_reg(dm, e_rf_path, RF_0x33, RFREGOFFSETMASK, 0x0);391odm_set_rf_reg(dm, e_rf_path, RF_0x3f, RFREGOFFSETMASK, rf_reg_3f);392odm_set_rf_reg(dm, e_rf_path, RF_0x33, BIT(0), 0x1);393odm_set_rf_reg(dm, e_rf_path, RF_0x3f, RFREGOFFSETMASK, rf_reg_3f);394odm_set_rf_reg(dm, e_rf_path, RF_0x33, BIT(1), 0x1);395odm_set_rf_reg(dm, e_rf_path, RF_0x3f, RFREGOFFSETMASK, rf_reg_3f);396odm_set_rf_reg(dm, e_rf_path, RF_0x33, (BIT(1) | BIT(0)), 0x3);397odm_set_rf_reg(dm, e_rf_path, RF_0x3f, RFREGOFFSETMASK, rf_reg_3f);398odm_set_rf_reg(dm, e_rf_path, RF_0xef, BIT(10), 0x0);399400RF_DBG(dm, DBG_RF_MP,401"[kfree] 8822b 2g tx pa bias rf_0x3f(0x%X) path=%d\n",402odm_get_rf_reg(dm, e_rf_path, RF_0x3f,403(BIT(12) | BIT(11) | BIT(10) | BIT(9))),404e_rf_path);405}406407void phydm_get_pa_bias_offset_8822b(void *dm_void)408{409struct dm_struct *dm = (struct dm_struct *)dm_void;410struct odm_power_trim_data *power_trim_info = &dm->power_trim_data;411412u8 pg_pa_bias = 0xff, e_rf_path = 0;413s8 tx_pa_bias[2] = {0};414415odm_efuse_one_byte_read(dm, PPG_PABIAS_2GA_22B, &pg_pa_bias, false);416417if (pg_pa_bias != 0xff) {418/*paht a*/419odm_efuse_one_byte_read(dm, PPG_PABIAS_2GA_22B,420&pg_pa_bias, false);421pg_pa_bias = pg_pa_bias & 0xf;422423if ((pg_pa_bias & BIT(0)) == 0)424tx_pa_bias[0] = (-1 * (pg_pa_bias >> 1));425else426tx_pa_bias[0] = (pg_pa_bias >> 1);427428/*paht b*/429odm_efuse_one_byte_read(dm, PPG_PABIAS_2GB_22B,430&pg_pa_bias, false);431pg_pa_bias = pg_pa_bias & 0xf;432433if ((pg_pa_bias & BIT(0)) == 0)434tx_pa_bias[1] = (-1 * (pg_pa_bias >> 1));435else436tx_pa_bias[1] = (pg_pa_bias >> 1);437438RF_DBG(dm, DBG_RF_MP,439"[kfree] 8822b 2g PathA_pa_bias:%d PathB_pa_bias:%d\n",440tx_pa_bias[0], tx_pa_bias[1]);441442for (e_rf_path = RF_PATH_A; e_rf_path < 2; e_rf_path++)443phydm_set_pa_bias_to_rf_8822b(dm, e_rf_path,444tx_pa_bias[e_rf_path]);445446power_trim_info->pa_bias_flag |= PA_BIAS_FLAG_ON;447} else {448RF_DBG(dm, DBG_RF_MP, "[kfree] 8822b 2g tx pa bias no pg\n");449}450}451452void phydm_set_kfree_to_rf_8822b(void *dm_void, u8 e_rf_path, u8 data)453{454struct dm_struct *dm = (struct dm_struct *)dm_void;455u32 gain_bmask = (BIT(18) | BIT(17) | BIT(16) | BIT(15) | BIT(14));456457odm_set_rf_reg(dm, e_rf_path, RF_0xde, BIT(0), 1);458odm_set_rf_reg(dm, e_rf_path, RF_0xde, BIT(4), 1);459odm_set_rf_reg(dm, e_rf_path, RF_0x65, MASKLWORD, 0x9000);460odm_set_rf_reg(dm, e_rf_path, RF_0x55, BIT(5), 1);461462odm_set_rf_reg(dm, e_rf_path, RF_0x55, BIT(19), (data & BIT(0)));463odm_set_rf_reg(dm, e_rf_path, RF_0x55, gain_bmask,464((data & 0x1f) >> 1));465466RF_DBG(dm, DBG_RF_MP, "[kfree] 8822b 0x55[19:14]=0x%X path=%d\n",467odm_get_rf_reg(dm, e_rf_path, RF_0x55,468(BIT(19) | BIT(18) | BIT(17) | BIT(16) |469BIT(15) | BIT(14))), e_rf_path);470}471472void phydm_clear_kfree_to_rf_8822b(void *dm_void, u8 e_rf_path, u8 data)473{474struct dm_struct *dm = (struct dm_struct *)dm_void;475u32 gain_bmask = (BIT(18) | BIT(17) | BIT(16) | BIT(15) | BIT(14));476477odm_set_rf_reg(dm, e_rf_path, RF_0xde, BIT(0), 1);478odm_set_rf_reg(dm, e_rf_path, RF_0xde, BIT(4), 1);479odm_set_rf_reg(dm, e_rf_path, RF_0x65, MASKLWORD, 0x9000);480odm_set_rf_reg(dm, e_rf_path, RF_0x55, BIT(5), 1);481482odm_set_rf_reg(dm, e_rf_path, RF_0x55, BIT(19), (data & BIT(0)));483odm_set_rf_reg(dm, e_rf_path, RF_0x55, gain_bmask,484((data & 0x1f) >> 1));485486odm_set_rf_reg(dm, e_rf_path, RF_0xde, BIT(0), 0);487odm_set_rf_reg(dm, e_rf_path, RF_0xde, BIT(4), 1);488odm_set_rf_reg(dm, e_rf_path, RF_0x65, MASKLWORD, 0x9000);489odm_set_rf_reg(dm, e_rf_path, RF_0x55, BIT(5), 0);490odm_set_rf_reg(dm, e_rf_path, RF_0x55, BIT(7), 0);491492RF_DBG(dm, DBG_RF_MP,493"[kfree] 8822b clear power trim 0x55[19:14]=0x%X path=%d\n",494odm_get_rf_reg(dm, e_rf_path, RF_0x55,495(BIT(19) | BIT(18) | BIT(17) | BIT(16) |496BIT(15) | BIT(14))), e_rf_path);497}498499void phydm_get_thermal_trim_offset_8710b(void *dm_void)500{501struct dm_struct *dm = (struct dm_struct *)dm_void;502struct odm_power_trim_data *power_trim_info = &dm->power_trim_data;503504u8 pg_therm = 0xff;505506odm_efuse_one_byte_read(dm, 0x0EF, &pg_therm, false);507508if (pg_therm != 0xff) {509pg_therm = pg_therm & 0x1f;510if ((pg_therm & BIT(0)) == 0)511power_trim_info->thermal = (-1 * (pg_therm >> 1));512else513power_trim_info->thermal = (pg_therm >> 1);514515power_trim_info->flag |= KFREE_FLAG_THERMAL_K_ON;516}517518RF_DBG(dm, DBG_RF_MP, "[kfree] 8710b thermal trim flag:0x%02x\n",519power_trim_info->flag);520521if (power_trim_info->flag & KFREE_FLAG_THERMAL_K_ON)522RF_DBG(dm, DBG_RF_MP, "[kfree] 8710b thermal:%d\n",523power_trim_info->thermal);524}525526void phydm_get_power_trim_offset_8710b(void *dm_void)527{528struct dm_struct *dm = (struct dm_struct *)dm_void;529struct odm_power_trim_data *power_trim_info = &dm->power_trim_data;530531u8 pg_power = 0xff;532533odm_efuse_one_byte_read(dm, 0xEE, &pg_power, false);534535if (pg_power != 0xff) {536/*Path A*/537odm_efuse_one_byte_read(dm, 0xEE, &pg_power, false);538power_trim_info->bb_gain[0][0] = (pg_power & 0xf);539540power_trim_info->flag |= KFREE_FLAG_ON_2G;541power_trim_info->flag |= KFREE_FLAG_ON;542}543544RF_DBG(dm, DBG_RF_MP, "[kfree] 8710b power trim flag:0x%02x\n",545power_trim_info->flag);546547if (power_trim_info->flag & KFREE_FLAG_ON)548RF_DBG(dm, DBG_RF_MP,549"[kfree] 8710b power_trim_data->bb_gain[0][0]=0x%X\n",550power_trim_info->bb_gain[0][0]);551}552553void phydm_set_kfree_to_rf_8710b(void *dm_void, u8 e_rf_path, u8 data)554{555struct dm_struct *dm = (struct dm_struct *)dm_void;556u32 gain_bmask = (BIT(18) | BIT(17) | BIT(16) | BIT(15));557558odm_set_rf_reg(dm, e_rf_path, RF_0x55, BIT(19), (data & BIT(0)));559odm_set_rf_reg(dm, e_rf_path, RF_0x55, gain_bmask, ((data & 0xf) >> 1));560561RF_DBG(dm, DBG_RF_MP, "[kfree] 8710b 0x55[19:14]=0x%X path=%d\n",562odm_get_rf_reg(dm, e_rf_path, RF_0x55,563(BIT(19) | BIT(18) | BIT(17) | BIT(16) |564BIT(15) | BIT(14))), e_rf_path);565}566567void phydm_clear_kfree_to_rf_8710b(void *dm_void, u8 e_rf_path, u8 data)568{569struct dm_struct *dm = (struct dm_struct *)dm_void;570u32 gain_bmask = (BIT(18) | BIT(17) | BIT(16) | BIT(15) | BIT(14));571572odm_set_rf_reg(dm, e_rf_path, RF_0x55, BIT(19), (data & BIT(0)));573odm_set_rf_reg(dm, e_rf_path, RF_0x55, gain_bmask,574((data & 0x1f) >> 1));575576RF_DBG(dm, DBG_RF_MP,577"[kfree] 8710b clear power trim 0x55[19:14]=0x%X path=%d\n",578odm_get_rf_reg(dm, e_rf_path, RF_0x55,579(BIT(19) | BIT(18) | BIT(17) | BIT(16) |580BIT(15) | BIT(14))), e_rf_path);581}582583void phydm_get_thermal_trim_offset_8192f(void *dm_void)584{585struct dm_struct *dm = (struct dm_struct *)dm_void;586struct odm_power_trim_data *power_trim_info = &dm->power_trim_data;587588u8 pg_therm = 0xff;589590odm_efuse_one_byte_read(dm, 0x1EF, &pg_therm, false);591592if (pg_therm != 0xff) {593pg_therm = pg_therm & 0x1f;594if ((pg_therm & BIT(0)) == 0)595power_trim_info->thermal = (-1 * (pg_therm >> 1));596else597power_trim_info->thermal = (pg_therm >> 1);598599power_trim_info->flag |= KFREE_FLAG_THERMAL_K_ON;600}601602RF_DBG(dm, DBG_RF_MP, "[kfree] 8192f thermal trim flag:0x%02x\n",603power_trim_info->flag);604605if (power_trim_info->flag & KFREE_FLAG_THERMAL_K_ON)606RF_DBG(dm, DBG_RF_MP, "[kfree] 8192f thermal:%d\n",607power_trim_info->thermal);608}609610void phydm_get_power_trim_offset_8192f(void *dm_void)611{612struct dm_struct *dm = (struct dm_struct *)dm_void;613struct odm_power_trim_data *power_trim_info = &dm->power_trim_data;614615u8 pg_power1 = 0xff, pg_power2 = 0xff, pg_power3 = 0xff, i, j;616617odm_efuse_one_byte_read(dm, 0x1EE, &pg_power1, false); /*CH4-9*/618619if (pg_power1 != 0xff) {620/*Path A*/621odm_efuse_one_byte_read(dm, 0x1EE, &pg_power1, false);622power_trim_info->bb_gain[1][0] = (pg_power1 & 0xf);623/*Path B*/624odm_efuse_one_byte_read(dm, 0x1EE, &pg_power1, false);625power_trim_info->bb_gain[1][1] = ((pg_power1 & 0xf0) >> 4);626627power_trim_info->flag |= KFREE_FLAG_ON_2G;628power_trim_info->flag |= KFREE_FLAG_ON;629}630631odm_efuse_one_byte_read(dm, 0x1EC, &pg_power2, false); /*CH1-3*/632633if (pg_power2 != 0xff) {634/*Path A*/635odm_efuse_one_byte_read(dm, 0x1EC, &pg_power2, false);636power_trim_info->bb_gain[0][0] = (pg_power2 & 0xf);637/*Path B*/638odm_efuse_one_byte_read(dm, 0x1EC, &pg_power2, false);639power_trim_info->bb_gain[0][1] = ((pg_power2 & 0xf0) >> 4);640641power_trim_info->flag |= KFREE_FLAG_ON_2G;642power_trim_info->flag |= KFREE_FLAG_ON;643} else {644power_trim_info->bb_gain[0][0] = (pg_power1 & 0xf);645power_trim_info->bb_gain[0][1] = ((pg_power1 & 0xf0) >> 4);646}647648odm_efuse_one_byte_read(dm, 0x1EA, &pg_power3, false); /*CH10-14*/649650if (pg_power3 != 0xff) {651/*Path A*/652odm_efuse_one_byte_read(dm, 0x1EA, &pg_power3, false);653power_trim_info->bb_gain[2][0] = (pg_power3 & 0xf);654/*Path B*/655odm_efuse_one_byte_read(dm, 0x1EA, &pg_power3, false);656power_trim_info->bb_gain[2][1] = ((pg_power3 & 0xf0) >> 4);657658power_trim_info->flag |= KFREE_FLAG_ON_2G;659power_trim_info->flag |= KFREE_FLAG_ON;660} else {661power_trim_info->bb_gain[2][0] = (pg_power1 & 0xf);662power_trim_info->bb_gain[2][1] = ((pg_power1 & 0xf0) >> 4);663}664665RF_DBG(dm, DBG_RF_MP, "[kfree] 8192F power trim flag:0x%02x\n",666power_trim_info->flag);667668if (!(power_trim_info->flag & KFREE_FLAG_ON))669return;670671for (i = 0; i < KFREE_CH_NUM; i++) {672for (j = 0; j < 2; j++)673RF_DBG(dm, DBG_RF_MP,674"[kfree] 8192F PwrTrim->bb_gain[%d][%d]=0x%X\n",675i, j, power_trim_info->bb_gain[i][j]);676}677}678679void phydm_set_kfree_to_rf_8192f(void *dm_void, u8 e_rf_path, u8 channel_idx,680u8 data)681{682struct dm_struct *dm = (struct dm_struct *)dm_void;683684/*power_trim based on 55[19:14]*/685odm_set_rf_reg(dm, e_rf_path, RF_0x55, BIT(5), 1);686/*enable 55[14] for 0.5db step*/687odm_set_rf_reg(dm, e_rf_path, RF_0xf5, BIT(18), 1);688/*enter power_trim debug mode*/689odm_set_rf_reg(dm, e_rf_path, RF_0xdf, BIT(7), 1);690/*write enable*/691odm_set_rf_reg(dm, e_rf_path, RF_0xef, BIT(7), 1);692693if (e_rf_path == 0) {694if (channel_idx == 0) {695odm_set_rf_reg(dm, e_rf_path, RF_0x33, 0x70000, 0);696odm_set_rf_reg(dm, e_rf_path, 0x33, 0x3F, data);697698odm_set_rf_reg(dm, e_rf_path, RF_0x33, 0x70000, 1);699odm_set_rf_reg(dm, e_rf_path, 0x33, 0x3F, data);700701} else if (channel_idx == 1) {702odm_set_rf_reg(dm, e_rf_path, RF_0x33, 0x70000, 2);703odm_set_rf_reg(dm, e_rf_path, 0x33, 0x3F, data);704705odm_set_rf_reg(dm, e_rf_path, RF_0x33, 0x70000, 3);706odm_set_rf_reg(dm, e_rf_path, 0x33, 0x3F, data);707} else if (channel_idx == 2) {708odm_set_rf_reg(dm, e_rf_path, RF_0x33, 0x70000, 4);709odm_set_rf_reg(dm, e_rf_path, 0x33, 0x3F, data);710711odm_set_rf_reg(dm, e_rf_path, RF_0x33, 0x70000, 5);712odm_set_rf_reg(dm, e_rf_path, 0x33, 0x3F, data);713}714} else if (e_rf_path == 1) {715if (channel_idx == 0) {716odm_set_rf_reg(dm, e_rf_path, RF_0x33, 0x70000, 0);717odm_set_rf_reg(dm, e_rf_path, 0x33, 0x3F, data);718719odm_set_rf_reg(dm, e_rf_path, RF_0x33, 0x70000, 1);720odm_set_rf_reg(dm, e_rf_path, 0x33, 0x3F, data);721} else if (channel_idx == 1) {722odm_set_rf_reg(dm, e_rf_path, RF_0x33, 0x70000, 2);723odm_set_rf_reg(dm, e_rf_path, 0x33, 0x3F, data);724725odm_set_rf_reg(dm, e_rf_path, RF_0x33, 0x70000, 3);726odm_set_rf_reg(dm, e_rf_path, 0x33, 0x3F, data);727} else if (channel_idx == 2) {728odm_set_rf_reg(dm, e_rf_path, RF_0x33, 0x70000, 4);729odm_set_rf_reg(dm, e_rf_path, 0x33, 0x3F, data);730731odm_set_rf_reg(dm, e_rf_path, RF_0x33, 0x70000, 5);732odm_set_rf_reg(dm, e_rf_path, 0x33, 0x3F, data);733}734}735736/*leave power_trim debug mode*/737odm_set_rf_reg(dm, e_rf_path, RF_0xdf, BIT(7), 0);738/*write disable*/739odm_set_rf_reg(dm, e_rf_path, RF_0xef, BIT(7), 0);740741RF_DBG(dm, DBG_RF_MP,742"[kfree] 8192F 0x55[19:14]=0x%X path=%d channel=%d\n",743odm_get_rf_reg(dm, e_rf_path, RF_0x55,744(BIT(19) | BIT(18) | BIT(17) | BIT(16) |745BIT(15) | BIT(14))), e_rf_path, channel_idx);746}747748#if 0749/*750void phydm_clear_kfree_to_rf_8192f(void *dm_void, u8 e_rf_path, u8 data)751{752struct dm_struct *dm = (struct dm_struct *)dm_void;753struct dm_rf_calibration_struct *cali_info = &dm->rf_calibrate_info;754755odm_set_rf_reg(dm, e_rf_path, RF_0x55, BIT(19), (data & BIT(0)));756odm_set_rf_reg(dm, e_rf_path, RF_0x55, (BIT(18) | BIT(17) | BIT(16) | BIT(15) | BIT(14)), ((data & 0x1f) >> 1));757758RF_DBG(dm, DBG_RF_MP,759"[kfree] 8192F clear power trim 0x55[19:14]=0x%X path=%d\n",760odm_get_rf_reg(dm, e_rf_path, RF_0x55, (BIT(19) | BIT(18) | BIT(17) | BIT(16) | BIT(15) | BIT(14))),761e_rf_path762);763}764*/765#endif766767void phydm_get_thermal_trim_offset_8198f(void *dm_void)768{769struct dm_struct *dm = (struct dm_struct *)dm_void;770struct odm_power_trim_data *power_trim_info = &dm->power_trim_data;771772u8 pg_therm = 0;773774odm_efuse_one_byte_read(dm, PPG_THERMAL_OFFSET_98F, &pg_therm, false);775776if (pg_therm != 0) {777pg_therm = pg_therm & 0x1f;778if ((pg_therm & BIT(0)) == 0)779power_trim_info->thermal = (-1 * (pg_therm >> 1));780else781power_trim_info->thermal = (pg_therm >> 1);782783power_trim_info->flag |= KFREE_FLAG_THERMAL_K_ON;784}785786RF_DBG(dm, DBG_RF_MP, "[kfree] 8198f thermal trim flag:0x%02x\n",787power_trim_info->flag);788789if (power_trim_info->flag & KFREE_FLAG_THERMAL_K_ON)790RF_DBG(dm, DBG_RF_MP, "[kfree] 8198f thermal:%d\n",791power_trim_info->thermal);792}793794void phydm_get_power_trim_offset_8198f(void *dm_void)795{796struct dm_struct *dm = (struct dm_struct *)dm_void;797struct odm_power_trim_data *power_trim_info = &dm->power_trim_data;798799u8 pg_power = 0, i, j;800801odm_efuse_one_byte_read(dm, PPG_2GL_TXAB_98F, &pg_power, false);802803if (pg_power != 0) {804power_trim_info->bb_gain[0][0] = pg_power & 0xf;805power_trim_info->bb_gain[0][1] = (pg_power & 0xf0) >> 4;806807odm_efuse_one_byte_read(dm, PPG_2GL_TXCD_98F, &pg_power, false);808power_trim_info->bb_gain[0][2] = pg_power & 0xf;809power_trim_info->bb_gain[0][3] = (pg_power & 0xf0) >> 4;810811odm_efuse_one_byte_read(dm, PPG_2GM_TXAB_98F, &pg_power, false);812power_trim_info->bb_gain[1][0] = pg_power & 0xf;813power_trim_info->bb_gain[1][1] = (pg_power & 0xf0) >> 4;814815odm_efuse_one_byte_read(dm, PPG_2GM_TXCD_98F, &pg_power, false);816power_trim_info->bb_gain[1][2] = pg_power & 0xf;817power_trim_info->bb_gain[1][3] = (pg_power & 0xf0) >> 4;818819odm_efuse_one_byte_read(dm, PPG_2GH_TXAB_98F, &pg_power, false);820power_trim_info->bb_gain[2][0] = pg_power & 0xf;821power_trim_info->bb_gain[2][1] = (pg_power & 0xf0) >> 4;822823odm_efuse_one_byte_read(dm, PPG_2GH_TXCD_98F, &pg_power, false);824power_trim_info->bb_gain[2][2] = pg_power & 0xf;825power_trim_info->bb_gain[2][3] = (pg_power & 0xf0) >> 4;826827power_trim_info->flag =828power_trim_info->flag | KFREE_FLAG_ON | KFREE_FLAG_ON_2G;829}830831RF_DBG(dm, DBG_RF_MP, "[kfree] 8198f power trim flag:0x%02x\n",832power_trim_info->flag);833834if (power_trim_info->flag & KFREE_FLAG_ON) {835for (i = 0; i < KFREE_BAND_NUM; i++) {836for (j = 0; j < MAX_RF_PATH; j++) {837RF_DBG(dm, DBG_RF_MP,838"[kfree] 8198f pwr_trim->bb_gain[%d][%d]=0x%X\n",839i, j, power_trim_info->bb_gain[i][j]);840}841}842}843}844845void phydm_get_pa_bias_offset_8198f(void *dm_void)846{847struct dm_struct *dm = (struct dm_struct *)dm_void;848struct odm_power_trim_data *power_trim_info = &dm->power_trim_data;849850u8 pg_pa_bias = 0, i;851u8 tx_pa_bias[4] = {0};852853odm_efuse_one_byte_read(dm, PPG_PABIAS_2GAB_98F, &pg_pa_bias, false);854855if (pg_pa_bias != 0) {856/*paht ab*/857odm_efuse_one_byte_read(dm, PPG_PABIAS_2GAB_98F,858&pg_pa_bias, false);859tx_pa_bias[0] = pg_pa_bias & 0xf;860tx_pa_bias[1] = ((pg_pa_bias & 0xf0) >> 4);861862/*paht cd*/863odm_efuse_one_byte_read(dm, PPG_PABIAS_2GCD_98F,864&pg_pa_bias, false);865tx_pa_bias[2] = pg_pa_bias & 0xf;866tx_pa_bias[3] = ((pg_pa_bias & 0xf0) >> 4);867868for (i = RF_PATH_A; i < 4; i++) {869if ((tx_pa_bias[i] & 0x1) == 1)870tx_pa_bias[i] = tx_pa_bias[i] & 0xe;871else872tx_pa_bias[i] = tx_pa_bias[i] | 0x1;873}874875RF_DBG(dm, DBG_RF_MP,876"[kfree] 8198f PathA_pa_bias:0x%x PathB_pa_bias:0x%x\n",877tx_pa_bias[0], tx_pa_bias[1]);878879RF_DBG(dm, DBG_RF_MP,880"[kfree] 8198f PathC_pa_bias:0x%x PathD_pa_bias:0x%x\n",881tx_pa_bias[2], tx_pa_bias[3]);882883for (i = RF_PATH_A; i < 4; i++)884odm_set_rf_reg(dm, i, 0x60, 0x0000f000, tx_pa_bias[i]);885886power_trim_info->pa_bias_flag |= PA_BIAS_FLAG_ON;887} else {888RF_DBG(dm, DBG_RF_MP, "[kfree] 8198f tx pa bias no pg\n");889}890}891892void phydm_get_set_lna_offset_8198f(void *dm_void)893{894struct dm_struct *dm = (struct dm_struct *)dm_void;895struct odm_power_trim_data *power_trim_info = &dm->power_trim_data;896897u8 pg_pa_bias = 0, i;898u8 cg[4] = {0}, cs[4] = {0};899u32 rf_reg;900901odm_efuse_one_byte_read(dm, PPG_LNA_2GA_98F, &pg_pa_bias, false);902903if (pg_pa_bias != 0) {904odm_efuse_one_byte_read(dm, PPG_LNA_2GA_98F,905&pg_pa_bias, false);906cg[0] = (pg_pa_bias & 0xc) >> 2;907cs[0] = pg_pa_bias & 0x3;908909odm_efuse_one_byte_read(dm, PPG_LNA_2GB_98F,910&pg_pa_bias, false);911cg[1] = (pg_pa_bias & 0xc) >> 2;912cs[1] = pg_pa_bias & 0x3;913914odm_efuse_one_byte_read(dm, PPG_LNA_2GC_98F,915&pg_pa_bias, false);916cg[2] = (pg_pa_bias & 0xc) >> 2;917cs[2] = pg_pa_bias & 0x3;918919odm_efuse_one_byte_read(dm, PPG_LNA_2GD_98F,920&pg_pa_bias, false);921cg[3] = (pg_pa_bias & 0xc) >> 2;922cs[3] = pg_pa_bias & 0x3;923924for (i = RF_PATH_A; i < 4; i++) {925RF_DBG(dm, DBG_RF_MP,926"[kfree] 8198f lna cg[%d]=0x%x cs[%d]=0x%x\n",927i, cg[i], i, cs[i]);928odm_set_rf_reg(dm, i, 0xdf, RFREGOFFSETMASK, 0x2);929930if (cg[i] == 0x3) {931rf_reg = odm_get_rf_reg(dm, i, 0x86, (BIT(19) | BIT(18)));932rf_reg = rf_reg + 1;933if (rf_reg >= 0x3)934rf_reg = 0x3;935odm_set_rf_reg(dm, i, 0x86, (BIT(19) | BIT(18)), rf_reg);936RF_DBG(dm, DBG_RF_MP,937"[kfree] 8198f lna CG set rf 0x86 [19:18]=0x%x path=%d\n", rf_reg, i);938}939if (cs[i] == 0x3) {940rf_reg = odm_get_rf_reg(dm, i, 0x86, (BIT(17) | BIT(16)));941rf_reg = rf_reg + 1;942if (rf_reg >= 0x3)943rf_reg = 0x3;944odm_set_rf_reg(dm, i, 0x86, (BIT(17) | BIT(16)), rf_reg);945RF_DBG(dm, DBG_RF_MP,946"[kfree] 8198f lna CS set rf 0x86 [17:16]=0x%x path=%d\n", rf_reg, i);947}948}949950power_trim_info->lna_flag |= LNA_FLAG_ON;951} else {952RF_DBG(dm, DBG_RF_MP, "[kfree] 8198f lna no pg\n");953}954}955956957void phydm_set_kfree_to_rf_8198f(void *dm_void, u8 e_rf_path, u8 data)958{959struct dm_struct *dm = (struct dm_struct *)dm_void;960struct odm_power_trim_data *power_trim_info = &dm->power_trim_data;961u32 band, i;962s8 pwr_offset[3];963964RF_DBG(dm, DBG_RF_MP,965"[kfree] %s:Set kfree to rf 0x33\n", __func__);966967/*power_trim based on 55[19:14]*/968odm_set_rf_reg(dm, e_rf_path, RF_0x55, BIT(5), 1);969/*enable 55[14] for 0.5db step*/970odm_set_rf_reg(dm, e_rf_path, RF_0xf5, BIT(18), 1);971/*enter power_trim debug mode*/972odm_set_rf_reg(dm, e_rf_path, RF_0xdf, BIT(7), 0);973/*write enable*/974odm_set_rf_reg(dm, e_rf_path, RF_0xef, BIT(7), 1);975976for (i =0; i < 3; i++)977pwr_offset[i] = power_trim_info->bb_gain[i][e_rf_path];978979odm_set_rf_reg(dm, e_rf_path, RF_0x33, 0x70000, 0);980odm_set_rf_reg(dm, e_rf_path, RF_0x33, 0x3F, pwr_offset[0]);981odm_set_rf_reg(dm, e_rf_path, RF_0x33, 0x70000, 1);982odm_set_rf_reg(dm, e_rf_path, RF_0x33, 0x3F, pwr_offset[0]);983odm_set_rf_reg(dm, e_rf_path, RF_0x33, 0x70000, 2);984odm_set_rf_reg(dm, e_rf_path, RF_0x33, 0x3F, pwr_offset[1]);985odm_set_rf_reg(dm, e_rf_path, RF_0x33, 0x70000, 3);986odm_set_rf_reg(dm, e_rf_path, RF_0x33, 0x3F, pwr_offset[1]);987odm_set_rf_reg(dm, e_rf_path, RF_0x33, 0x70000, 4);988odm_set_rf_reg(dm, e_rf_path, RF_0x33, 0x3F, pwr_offset[2]);989odm_set_rf_reg(dm, e_rf_path, RF_0x33, 0x70000, 5);990odm_set_rf_reg(dm, e_rf_path, RF_0x33, 0x3F, pwr_offset[2]);991992/*leave power_trim debug mode*/993/*odm_set_rf_reg(dm, e_rf_path, RF_0xdf, BIT(7), 0);*/994/*write disable*/995odm_set_rf_reg(dm, e_rf_path, RF_0xef, BIT(7), 0);996997}998999void phydm_clear_kfree_to_rf_8198f(void *dm_void, u8 e_rf_path, u8 data)1000{1001struct dm_struct *dm = (struct dm_struct *)dm_void;10021003RF_DBG(dm, DBG_RF_MP,1004"[kfree] %s:Clear kfree to rf 0x55\n", __func__);1005#if 01006/*power_trim based on 55[19:14]*/1007odm_set_rf_reg(dm, e_rf_path, RF_0x55, BIT(5), 1);1008/*enable 55[14] for 0.5db step*/1009odm_set_rf_reg(dm, e_rf_path, RF_0xf5, BIT(18), 1);1010/*enter power_trim debug mode*/1011odm_set_rf_reg(dm, e_rf_path, RF_0xdf, BIT(7), 0);1012/*write enable*/1013odm_set_rf_reg(dm, e_rf_path, RF_0xef, BIT(7), 1);10141015odm_set_rf_reg(dm, e_rf_path, RF_0x33, 0x70000, 0);1016odm_set_rf_reg(dm, e_rf_path, RF_0x33, 0x3F, data);1017odm_set_rf_reg(dm, e_rf_path, RF_0x33, 0x70000, 1);1018odm_set_rf_reg(dm, e_rf_path, RF_0x33, 0x3F, data);1019odm_set_rf_reg(dm, e_rf_path, RF_0x33, 0x70000, 2);1020odm_set_rf_reg(dm, e_rf_path, RF_0x33, 0x3F, data);1021odm_set_rf_reg(dm, e_rf_path, RF_0x33, 0x70000, 3);1022odm_set_rf_reg(dm, e_rf_path, RF_0x33, 0x3F, data);1023odm_set_rf_reg(dm, e_rf_path, RF_0x33, 0x70000, 4);1024odm_set_rf_reg(dm, e_rf_path, RF_0x33, 0x3F, data);1025odm_set_rf_reg(dm, e_rf_path, RF_0x33, 0x70000, 5);1026odm_set_rf_reg(dm, e_rf_path, RF_0x33, 0x3F, data);10271028/*leave power_trim debug mode*/1029odm_set_rf_reg(dm, e_rf_path, RF_0xdf, BIT(7), 0);1030/*enable 55[14] for 0.5db step*/1031odm_set_rf_reg(dm, e_rf_path, RF_0xf5, BIT(18), 0);1032/*write disable*/1033odm_set_rf_reg(dm, e_rf_path, RF_0xef, BIT(7), 0);1034#else10351036odm_set_rf_reg(dm, e_rf_path, RF_0xdf, BIT(7), 1);1037/*odm_set_rf_reg(dm, e_rf_path, RF_0xf5, BIT(18), 0);*/10381039#endif10401041}10421043void phydm_get_set_thermal_trim_offset_8822c(void *dm_void)1044{1045struct dm_struct *dm = (struct dm_struct *)dm_void;1046struct odm_power_trim_data *power_trim_info = &dm->power_trim_data;10471048u8 pg_therm = 0xff, thermal[2] = {0};10491050odm_efuse_one_byte_read(dm, PPG_THERMAL_A_OFFSET_22C, &pg_therm, false);10511052if (pg_therm != 0xff) {1053/*s0*/1054pg_therm = pg_therm & 0x1f;10551056thermal[RF_PATH_A] =1057((pg_therm & 0x1) << 3) | ((pg_therm >> 1) & 0x7);10581059odm_set_rf_reg(dm, RF_PATH_A, RF_0x43, 0x000f0000, thermal[RF_PATH_A]);10601061/*s1*/1062odm_efuse_one_byte_read(dm, PPG_THERMAL_B_OFFSET_22C, &pg_therm, false);10631064pg_therm = pg_therm & 0x1f;10651066thermal[RF_PATH_B] = ((pg_therm & 0x1) << 3) | ((pg_therm >> 1) & 0x7);10671068odm_set_rf_reg(dm, RF_PATH_B, RF_0x43, 0x000f0000, thermal[RF_PATH_B]);10691070power_trim_info->flag |= KFREE_FLAG_THERMAL_K_ON;10711072}10731074RF_DBG(dm, DBG_RF_MP, "[kfree] 8822c thermal trim flag:0x%02x\n",1075power_trim_info->flag);10761077if (power_trim_info->flag & KFREE_FLAG_THERMAL_K_ON)1078RF_DBG(dm, DBG_RF_MP, "[kfree] 8822c thermalA:%d thermalB:%d\n",1079thermal[RF_PATH_A],1080thermal[RF_PATH_B]);1081}10821083void phydm_set_power_trim_offset_8822c(void *dm_void)1084{1085struct dm_struct *dm = (struct dm_struct *)dm_void;1086struct odm_power_trim_data *power_trim_info = &dm->power_trim_data;1087u8 e_rf_path;10881089for (e_rf_path = RF_PATH_A; e_rf_path < 2; e_rf_path++)1090{1091odm_set_rf_reg(dm, e_rf_path, RF_0xee, BIT(19), 1);10921093odm_set_rf_reg(dm, e_rf_path, RF_0x33, RFREGOFFSETMASK, 0x0);1094odm_set_rf_reg(dm, e_rf_path, RF_0x3f, RFREGOFFSETMASK,1095power_trim_info->bb_gain[0][e_rf_path]);1096odm_set_rf_reg(dm, e_rf_path, RF_0x33, RFREGOFFSETMASK, 0x1);1097odm_set_rf_reg(dm, e_rf_path, RF_0x3f, RFREGOFFSETMASK,1098power_trim_info->bb_gain[1][e_rf_path]);1099odm_set_rf_reg(dm, e_rf_path, RF_0x33, RFREGOFFSETMASK, 0x2);1100odm_set_rf_reg(dm, e_rf_path, RF_0x3f, RFREGOFFSETMASK,1101power_trim_info->bb_gain[2][e_rf_path]);1102odm_set_rf_reg(dm, e_rf_path, RF_0x33, RFREGOFFSETMASK, 0x3);1103odm_set_rf_reg(dm, e_rf_path, RF_0x3f, RFREGOFFSETMASK,1104power_trim_info->bb_gain[2][e_rf_path]);1105odm_set_rf_reg(dm, e_rf_path, RF_0x33, RFREGOFFSETMASK, 0x4);1106odm_set_rf_reg(dm, e_rf_path, RF_0x3f, RFREGOFFSETMASK,1107power_trim_info->bb_gain[3][e_rf_path]);1108odm_set_rf_reg(dm, e_rf_path, RF_0x33, RFREGOFFSETMASK, 0x5);1109odm_set_rf_reg(dm, e_rf_path, RF_0x3f, RFREGOFFSETMASK,1110power_trim_info->bb_gain[4][e_rf_path]);1111odm_set_rf_reg(dm, e_rf_path, RF_0x33, RFREGOFFSETMASK, 0x6);1112odm_set_rf_reg(dm, e_rf_path, RF_0x3f, RFREGOFFSETMASK,1113power_trim_info->bb_gain[5][e_rf_path]);1114odm_set_rf_reg(dm, e_rf_path, RF_0x33, RFREGOFFSETMASK, 0x7);1115odm_set_rf_reg(dm, e_rf_path, RF_0x3f, RFREGOFFSETMASK,1116power_trim_info->bb_gain[6][e_rf_path]);1117odm_set_rf_reg(dm, e_rf_path, RF_0x33, RFREGOFFSETMASK, 0x8);1118odm_set_rf_reg(dm, e_rf_path, RF_0x3f, RFREGOFFSETMASK,1119power_trim_info->bb_gain[7][e_rf_path]);1120odm_set_rf_reg(dm, e_rf_path, RF_0x33, RFREGOFFSETMASK, 0x9);1121odm_set_rf_reg(dm, e_rf_path, RF_0x3f, RFREGOFFSETMASK,1122power_trim_info->bb_gain[3][e_rf_path]);1123odm_set_rf_reg(dm, e_rf_path, RF_0x33, RFREGOFFSETMASK, 0xa);1124odm_set_rf_reg(dm, e_rf_path, RF_0x3f, RFREGOFFSETMASK,1125power_trim_info->bb_gain[4][e_rf_path]);1126odm_set_rf_reg(dm, e_rf_path, RF_0x33, RFREGOFFSETMASK, 0xb);1127odm_set_rf_reg(dm, e_rf_path, RF_0x3f, RFREGOFFSETMASK,1128power_trim_info->bb_gain[5][e_rf_path]);1129odm_set_rf_reg(dm, e_rf_path, RF_0x33, RFREGOFFSETMASK, 0xc);1130odm_set_rf_reg(dm, e_rf_path, RF_0x3f, RFREGOFFSETMASK,1131power_trim_info->bb_gain[6][e_rf_path]);1132odm_set_rf_reg(dm, e_rf_path, RF_0x33, RFREGOFFSETMASK, 0xd);1133odm_set_rf_reg(dm, e_rf_path, RF_0x3f, RFREGOFFSETMASK,1134power_trim_info->bb_gain[7][e_rf_path]);1135odm_set_rf_reg(dm, e_rf_path, RF_0x33, RFREGOFFSETMASK, 0xe);1136odm_set_rf_reg(dm, e_rf_path, RF_0x3f, RFREGOFFSETMASK,1137power_trim_info->bb_gain[7][e_rf_path]);11381139odm_set_rf_reg(dm, e_rf_path, RF_0xee, BIT(19), 0);1140}1141}11421143void phydm_get_set_power_trim_offset_8822c(void *dm_void)1144{1145struct dm_struct *dm = (struct dm_struct *)dm_void;1146struct odm_power_trim_data *power_trim_info = &dm->power_trim_data;11471148u8 pg_power = 0xff, i, j;1149u8 pg_power1, pg_power2 , pg_power3, pg_power4, pg_power5;11501151odm_efuse_one_byte_read(dm, PPG_2GL_TXAB_22C, &pg_power1, false);1152odm_efuse_one_byte_read(dm, PPG_2GM_TXAB_22C, &pg_power2, false);1153odm_efuse_one_byte_read(dm, PPG_2GH_TXAB_22C, &pg_power3, false);1154odm_efuse_one_byte_read(dm, PPG_5GL1_TXA_22C, &pg_power4, false);1155odm_efuse_one_byte_read(dm, PPG_5GL1_TXB_22C, &pg_power5, false);11561157if (pg_power1 != 0xff || pg_power2 != 0xff || pg_power3 != 0xff ||1158pg_power4 != 0xff || pg_power5 != 0xff) {1159odm_efuse_one_byte_read(dm, PPG_2GL_TXAB_22C, &pg_power, false);1160if (pg_power == 0xff)1161pg_power = 0;1162power_trim_info->bb_gain[0][0] = pg_power & 0xf;1163power_trim_info->bb_gain[0][1] = (pg_power & 0xf0) >> 4;11641165odm_efuse_one_byte_read(dm, PPG_2GM_TXAB_22C, &pg_power, false);1166if (pg_power == 0xff)1167pg_power = 0;1168power_trim_info->bb_gain[1][0] = pg_power & 0xf;1169power_trim_info->bb_gain[1][1] = (pg_power & 0xf0) >> 4;11701171odm_efuse_one_byte_read(dm, PPG_2GH_TXAB_22C, &pg_power, false);1172if (pg_power == 0xff)1173pg_power = 0;1174power_trim_info->bb_gain[2][0] = pg_power & 0xf;1175power_trim_info->bb_gain[2][1] = (pg_power & 0xf0) >> 4;11761177odm_efuse_one_byte_read(dm, PPG_5GL1_TXA_22C, &pg_power, false);1178if (pg_power == 0xff)1179pg_power = 0;1180power_trim_info->bb_gain[3][0] = pg_power & 0x1f;1181odm_efuse_one_byte_read(dm, PPG_5GL1_TXB_22C, &pg_power, false);1182if (pg_power == 0xff)1183pg_power = 0;1184power_trim_info->bb_gain[3][1] = pg_power & 0x1f;11851186odm_efuse_one_byte_read(dm, PPG_5GL2_TXA_22C, &pg_power, false);1187if (pg_power == 0xff)1188pg_power = 0;1189power_trim_info->bb_gain[4][0] = pg_power & 0x1f;1190odm_efuse_one_byte_read(dm, PPG_5GL2_TXB_22C, &pg_power, false);1191if (pg_power == 0xff)1192pg_power = 0;1193power_trim_info->bb_gain[4][1] = pg_power & 0x1f;11941195odm_efuse_one_byte_read(dm, PPG_5GM1_TXA_22C, &pg_power, false);1196if (pg_power == 0xff)1197pg_power = 0;1198power_trim_info->bb_gain[5][0] = pg_power & 0x1f;1199odm_efuse_one_byte_read(dm, PPG_5GM1_TXB_22C, &pg_power, false);1200if (pg_power == 0xff)1201pg_power = 0;1202power_trim_info->bb_gain[5][1] = pg_power & 0x1f;12031204odm_efuse_one_byte_read(dm, PPG_5GM2_TXA_22C, &pg_power, false);1205if (pg_power == 0xff)1206pg_power = 0;1207power_trim_info->bb_gain[6][0] = pg_power & 0x1f;1208odm_efuse_one_byte_read(dm, PPG_5GM2_TXB_22C, &pg_power, false);1209if (pg_power == 0xff)1210pg_power = 0;1211power_trim_info->bb_gain[6][1] = pg_power & 0x1f;12121213odm_efuse_one_byte_read(dm, PPG_5GH1_TXA_22C, &pg_power, false);1214if (pg_power == 0xff)1215pg_power = 0;1216power_trim_info->bb_gain[7][0] = pg_power & 0x1f;1217odm_efuse_one_byte_read(dm, PPG_5GH1_TXB_22C, &pg_power, false);1218if (pg_power == 0xff)1219pg_power = 0;1220power_trim_info->bb_gain[7][1] = pg_power & 0x1f;12211222power_trim_info->flag =1223power_trim_info->flag | KFREE_FLAG_ON |1224KFREE_FLAG_ON_2G |1225KFREE_FLAG_ON_5G;12261227phydm_set_power_trim_offset_8822c(dm);1228}12291230RF_DBG(dm, DBG_RF_MP, "[kfree] 8822c power trim flag:0x%02x\n",1231power_trim_info->flag);12321233if (power_trim_info->flag & KFREE_FLAG_ON) {1234for (i = 0; i < KFREE_BAND_NUM; i++) {1235for (j = 0; j < 2; j++) {1236RF_DBG(dm, DBG_RF_MP,1237"[kfree] 8822c pwr_trim->bb_gain[%d][%d]=0x%X\n",1238i, j, power_trim_info->bb_gain[i][j]);1239}1240}1241}1242}12431244void phydm_get_tssi_trim_offset_8822c(void *dm_void)1245{1246struct dm_struct *dm = (struct dm_struct *)dm_void;1247struct odm_power_trim_data *power_trim_info = &dm->power_trim_data;12481249u8 i, j = 0;1250u8 pg_power[16] = {0};12511252odm_efuse_one_byte_read(dm, TSSI_2GM_TXA_22C, &pg_power[0], false);1253odm_efuse_one_byte_read(dm, TSSI_2GM_TXB_22C, &pg_power[1], false);1254odm_efuse_one_byte_read(dm, TSSI_2GH_TXA_22C, &pg_power[2], false);1255odm_efuse_one_byte_read(dm, TSSI_2GH_TXB_22C, &pg_power[3], false);1256odm_efuse_one_byte_read(dm, TSSI_5GL1_TXA_22C, &pg_power[4], false);1257odm_efuse_one_byte_read(dm, TSSI_5GL1_TXB_22C, &pg_power[5], false);1258odm_efuse_one_byte_read(dm, TSSI_5GL2_TXA_22C, &pg_power[6], false);1259odm_efuse_one_byte_read(dm, TSSI_5GL2_TXB_22C, &pg_power[7], false);1260odm_efuse_one_byte_read(dm, TSSI_5GM1_TXA_22C, &pg_power[8], false);1261odm_efuse_one_byte_read(dm, TSSI_5GM1_TXB_22C, &pg_power[9], false);1262odm_efuse_one_byte_read(dm, TSSI_5GM2_TXA_22C, &pg_power[10], false);1263odm_efuse_one_byte_read(dm, TSSI_5GM2_TXB_22C, &pg_power[11], false);1264odm_efuse_one_byte_read(dm, TSSI_5GH1_TXA_22C, &pg_power[12], false);1265odm_efuse_one_byte_read(dm, TSSI_5GH1_TXB_22C, &pg_power[13], false);1266odm_efuse_one_byte_read(dm, TSSI_5GH2_TXA_22C, &pg_power[14], false);1267odm_efuse_one_byte_read(dm, TSSI_5GH2_TXB_22C, &pg_power[15], false);12681269for (i = 0; i < 16; i++) {1270if (pg_power[i] == 0xff)1271j++;1272}12731274if (j == 15) {1275RF_DBG(dm, DBG_RF_MP, "[kfree] 8822c tssi trim no PG\n");1276return;1277} else {1278power_trim_info->tssi_trim[0][0] = (s8)pg_power[0];1279power_trim_info->tssi_trim[0][1] = (s8)pg_power[1];1280power_trim_info->tssi_trim[1][0] = (s8)pg_power[0];1281power_trim_info->tssi_trim[1][1] = (s8)pg_power[1];1282power_trim_info->tssi_trim[2][0] = (s8)pg_power[2];1283power_trim_info->tssi_trim[2][1] = (s8)pg_power[3];1284power_trim_info->tssi_trim[3][0] = (s8)pg_power[4];1285power_trim_info->tssi_trim[3][1] = (s8)pg_power[5];1286power_trim_info->tssi_trim[4][0] = (s8)pg_power[6];1287power_trim_info->tssi_trim[4][1] = (s8)pg_power[7];1288power_trim_info->tssi_trim[5][0] = (s8)pg_power[8];1289power_trim_info->tssi_trim[5][1] = (s8)pg_power[9];1290power_trim_info->tssi_trim[6][0] = (s8)pg_power[10];1291power_trim_info->tssi_trim[6][1] = (s8)pg_power[11];1292power_trim_info->tssi_trim[7][0] = (s8)pg_power[12];1293power_trim_info->tssi_trim[7][1] = (s8)pg_power[13];1294power_trim_info->tssi_trim[8][0] = (s8)pg_power[14];1295power_trim_info->tssi_trim[8][1] = (s8)pg_power[15];12961297power_trim_info->flag =1298power_trim_info->flag | TSSI_TRIM_FLAG_ON;12991300if (power_trim_info->flag & TSSI_TRIM_FLAG_ON) {1301for (i = 0; i < KFREE_BAND_NUM; i++) {1302for (j = 0; j < 2; j++) {1303RF_DBG(dm, DBG_RF_MP,1304"[kfree] 8822c tssi_trim[%d][%d]=0x%X\n",1305i, j, power_trim_info->tssi_trim[i][j]);1306}1307}1308}1309}1310}13111312s8 phydm_get_tssi_trim_de_8822c(void *dm_void, u8 path)1313{1314struct dm_struct *dm = (struct dm_struct *)dm_void;1315struct odm_power_trim_data *power_trim_info = &dm->power_trim_data;13161317u8 channel = *dm->channel, group = 0;13181319if (channel >= 1 && channel <= 3)1320group = 0;1321else if (channel >= 4 && channel <= 9)1322group = 1;1323else if (channel >= 10 && channel <= 14)1324group = 2;1325else if (channel >= 36 && channel <= 50)1326group = 3;1327else if (channel >= 52 && channel <= 64)1328group = 4;1329else if (channel >= 100 && channel <= 118)1330group = 5;1331else if (channel >= 120 && channel <= 144)1332group = 6;1333else if (channel >= 149 && channel <= 165)1334group = 7;1335else if (channel >= 167 && channel <= 177)1336group = 8;1337else {1338RF_DBG(dm, DBG_RF_MP, "[kfree] Channel(%d) is not exist in Group\n",1339channel);1340return 0;1341}13421343return power_trim_info->tssi_trim[group][path];1344}1345134613471348void phydm_get_set_pa_bias_offset_8822c(void *dm_void)1349{1350struct dm_struct *dm = (struct dm_struct *)dm_void;1351struct odm_power_trim_data *power_trim_info = &dm->power_trim_data;13521353u8 pg_pa_bias = 0xff;13541355RF_DBG(dm, DBG_RF_MP, "======>%s\n", __func__);13561357odm_efuse_one_byte_read(dm, PPG_PABIAS_2GA_22C, &pg_pa_bias, false);13581359if (pg_pa_bias != 0xff) {1360/*2G s0*/1361odm_efuse_one_byte_read(dm, PPG_PABIAS_2GA_22C,1362&pg_pa_bias, false);1363pg_pa_bias = pg_pa_bias & 0xf;13641365RF_DBG(dm, DBG_RF_MP, "[kfree] 2G s0 pa_bias=0x%x\n", pg_pa_bias);13661367odm_set_rf_reg(dm, RF_PATH_A, 0x60, 0x0000f000, pg_pa_bias);13681369/*2G s1*/1370odm_efuse_one_byte_read(dm, PPG_PABIAS_2GB_22C,1371&pg_pa_bias, false);1372pg_pa_bias = pg_pa_bias & 0xf;13731374RF_DBG(dm, DBG_RF_MP, "[kfree] 2G s1 pa_bias=0x%x\n", pg_pa_bias);13751376odm_set_rf_reg(dm, RF_PATH_B, 0x60, 0x0000f000, pg_pa_bias);13771378/*5G s0*/1379odm_efuse_one_byte_read(dm, PPG_PABIAS_5GA_22C,1380&pg_pa_bias, false);1381pg_pa_bias = pg_pa_bias & 0xf;13821383RF_DBG(dm, DBG_RF_MP, "[kfree] 5G s0 pa_bias=0x%x\n", pg_pa_bias);13841385odm_set_rf_reg(dm, RF_PATH_A, 0x60, 0x000f0000, pg_pa_bias);13861387/*5G s1*/1388odm_efuse_one_byte_read(dm, PPG_PABIAS_5GB_22C,1389&pg_pa_bias, false);1390pg_pa_bias = pg_pa_bias & 0xf;13911392RF_DBG(dm, DBG_RF_MP, "[kfree] 5G s1 pa_bias=0x%x\n", pg_pa_bias);13931394odm_set_rf_reg(dm, RF_PATH_B, 0x60, 0x000f0000, pg_pa_bias);13951396power_trim_info->pa_bias_flag |= PA_BIAS_FLAG_ON;1397} else {1398RF_DBG(dm, DBG_RF_MP, "[kfree] 8822c tx pa bias no pg\n");1399}14001401}14021403void phydm_get_set_thermal_trim_offset_8812f(void *dm_void)1404{1405struct dm_struct *dm = (struct dm_struct *)dm_void;1406struct odm_power_trim_data *power_trim_info = &dm->power_trim_data;14071408u8 pg_therm = 0xff, thermal[2] = {0};14091410odm_efuse_one_byte_read(dm, PPG_THERMAL_A_OFFSET_22C, &pg_therm, false);14111412if (pg_therm != 0xff) {1413/*s0*/1414pg_therm = pg_therm & 0x1f;14151416thermal[RF_PATH_A] =1417((pg_therm & 0x1) << 3) | ((pg_therm >> 1) & 0x7);14181419odm_set_rf_reg(dm, RF_PATH_A, RF_0x43, 0x000f0000, thermal[RF_PATH_A]);14201421/*s1*/1422odm_efuse_one_byte_read(dm, PPG_THERMAL_B_OFFSET_22C, &pg_therm, false);14231424pg_therm = pg_therm & 0x1f;14251426thermal[RF_PATH_B] = ((pg_therm & 0x1) << 3) | ((pg_therm >> 1) & 0x7);14271428odm_set_rf_reg(dm, RF_PATH_B, RF_0x43, 0x000f0000, thermal[RF_PATH_B]);14291430power_trim_info->flag |= KFREE_FLAG_THERMAL_K_ON;14311432}14331434RF_DBG(dm, DBG_RF_MP, "[kfree] 8812f thermal trim flag:0x%02x\n",1435power_trim_info->flag);14361437if (power_trim_info->flag & KFREE_FLAG_THERMAL_K_ON)1438RF_DBG(dm, DBG_RF_MP, "[kfree] 8812f thermalA:%d thermalB:%d\n",1439thermal[RF_PATH_A],1440thermal[RF_PATH_B]);1441}14421443void phydm_set_power_trim_offset_8812f(void *dm_void)1444{1445struct dm_struct *dm = (struct dm_struct *)dm_void;1446struct odm_power_trim_data *power_trim_info = &dm->power_trim_data;1447u8 e_rf_path;14481449for (e_rf_path = RF_PATH_A; e_rf_path < 2; e_rf_path++)1450{1451odm_set_rf_reg(dm, e_rf_path, RF_0xee, BIT(19), 1);14521453#if 01454odm_set_rf_reg(dm, e_rf_path, RF_0x33, RFREGOFFSETMASK, 0x0);1455odm_set_rf_reg(dm, e_rf_path, RF_0x3f, RFREGOFFSETMASK,1456power_trim_info->bb_gain[0][e_rf_path]);1457odm_set_rf_reg(dm, e_rf_path, RF_0x33, RFREGOFFSETMASK, 0x1);1458odm_set_rf_reg(dm, e_rf_path, RF_0x3f, RFREGOFFSETMASK,1459power_trim_info->bb_gain[1][e_rf_path]);1460odm_set_rf_reg(dm, e_rf_path, RF_0x33, RFREGOFFSETMASK, 0x2);1461odm_set_rf_reg(dm, e_rf_path, RF_0x3f, RFREGOFFSETMASK,1462power_trim_info->bb_gain[2][e_rf_path]);1463odm_set_rf_reg(dm, e_rf_path, RF_0x33, RFREGOFFSETMASK, 0x3);1464odm_set_rf_reg(dm, e_rf_path, RF_0x3f, RFREGOFFSETMASK,1465power_trim_info->bb_gain[2][e_rf_path]);1466#endif1467odm_set_rf_reg(dm, e_rf_path, RF_0x33, RFREGOFFSETMASK, 0x4);1468odm_set_rf_reg(dm, e_rf_path, RF_0x3f, RFREGOFFSETMASK,1469power_trim_info->bb_gain[3][e_rf_path]);1470odm_set_rf_reg(dm, e_rf_path, RF_0x33, RFREGOFFSETMASK, 0x5);1471odm_set_rf_reg(dm, e_rf_path, RF_0x3f, RFREGOFFSETMASK,1472power_trim_info->bb_gain[4][e_rf_path]);1473odm_set_rf_reg(dm, e_rf_path, RF_0x33, RFREGOFFSETMASK, 0x6);1474odm_set_rf_reg(dm, e_rf_path, RF_0x3f, RFREGOFFSETMASK,1475power_trim_info->bb_gain[5][e_rf_path]);1476odm_set_rf_reg(dm, e_rf_path, RF_0x33, RFREGOFFSETMASK, 0x7);1477odm_set_rf_reg(dm, e_rf_path, RF_0x3f, RFREGOFFSETMASK,1478power_trim_info->bb_gain[6][e_rf_path]);1479odm_set_rf_reg(dm, e_rf_path, RF_0x33, RFREGOFFSETMASK, 0x8);1480odm_set_rf_reg(dm, e_rf_path, RF_0x3f, RFREGOFFSETMASK,1481power_trim_info->bb_gain[7][e_rf_path]);1482odm_set_rf_reg(dm, e_rf_path, RF_0x33, RFREGOFFSETMASK, 0x9);1483odm_set_rf_reg(dm, e_rf_path, RF_0x3f, RFREGOFFSETMASK,1484power_trim_info->bb_gain[3][e_rf_path]);1485odm_set_rf_reg(dm, e_rf_path, RF_0x33, RFREGOFFSETMASK, 0xa);1486odm_set_rf_reg(dm, e_rf_path, RF_0x3f, RFREGOFFSETMASK,1487power_trim_info->bb_gain[4][e_rf_path]);1488odm_set_rf_reg(dm, e_rf_path, RF_0x33, RFREGOFFSETMASK, 0xb);1489odm_set_rf_reg(dm, e_rf_path, RF_0x3f, RFREGOFFSETMASK,1490power_trim_info->bb_gain[5][e_rf_path]);1491odm_set_rf_reg(dm, e_rf_path, RF_0x33, RFREGOFFSETMASK, 0xc);1492odm_set_rf_reg(dm, e_rf_path, RF_0x3f, RFREGOFFSETMASK,1493power_trim_info->bb_gain[6][e_rf_path]);1494odm_set_rf_reg(dm, e_rf_path, RF_0x33, RFREGOFFSETMASK, 0xd);1495odm_set_rf_reg(dm, e_rf_path, RF_0x3f, RFREGOFFSETMASK,1496power_trim_info->bb_gain[7][e_rf_path]);1497odm_set_rf_reg(dm, e_rf_path, RF_0x33, RFREGOFFSETMASK, 0xe);1498odm_set_rf_reg(dm, e_rf_path, RF_0x3f, RFREGOFFSETMASK,1499power_trim_info->bb_gain[7][e_rf_path]);15001501odm_set_rf_reg(dm, e_rf_path, RF_0xee, BIT(19), 0);1502}1503}15041505void phydm_get_set_power_trim_offset_8812f(void *dm_void)1506{1507struct dm_struct *dm = (struct dm_struct *)dm_void;1508struct odm_power_trim_data *power_trim_info = &dm->power_trim_data;15091510u8 pg_power = 0xff, i, j;1511u8 pg_power1 = 0, pg_power2 = 0, pg_power3 = 0;1512u8 pg_power4 = 0, pg_power5 = 0;15131514odm_efuse_one_byte_read(dm, PPG_5GL1_TXA_22C, &pg_power1, false);1515odm_efuse_one_byte_read(dm, PPG_5GL1_TXB_22C, &pg_power2, false);1516odm_efuse_one_byte_read(dm, PPG_5GL2_TXA_22C, &pg_power3, false);1517odm_efuse_one_byte_read(dm, PPG_5GL2_TXB_22C, &pg_power4, false);1518odm_efuse_one_byte_read(dm, PPG_5GM1_TXA_22C, &pg_power5, false);15191520if (pg_power1 != 0xff || pg_power2 != 0xff || pg_power3 != 0xff ||1521pg_power4 != 0xff || pg_power5 != 0xff) {1522#if 01523odm_efuse_one_byte_read(dm, PPG_2GL_TXAB_22C, &pg_power, false);1524if (pg_power == 0xff)1525pg_power = 0;1526power_trim_info->bb_gain[0][0] = pg_power & 0xf;1527power_trim_info->bb_gain[0][1] = (pg_power & 0xf0) >> 4;15281529odm_efuse_one_byte_read(dm, PPG_2GM_TXAB_22C, &pg_power, false);1530if (pg_power == 0xff)1531pg_power = 0;1532power_trim_info->bb_gain[1][0] = pg_power & 0xf;1533power_trim_info->bb_gain[1][1] = (pg_power & 0xf0) >> 4;15341535odm_efuse_one_byte_read(dm, PPG_2GH_TXAB_22C, &pg_power, false);1536if (pg_power == 0xff)1537pg_power = 0;1538power_trim_info->bb_gain[2][0] = pg_power & 0xf;1539power_trim_info->bb_gain[2][1] = (pg_power & 0xf0) >> 4;1540#endif1541odm_efuse_one_byte_read(dm, PPG_5GL1_TXA_22C, &pg_power, false);1542if (pg_power == 0xff)1543pg_power = 0;1544power_trim_info->bb_gain[3][0] = pg_power & 0x1f;1545odm_efuse_one_byte_read(dm, PPG_5GL1_TXB_22C, &pg_power, false);1546if (pg_power == 0xff)1547pg_power = 0;1548power_trim_info->bb_gain[3][1] = pg_power & 0x1f;15491550odm_efuse_one_byte_read(dm, PPG_5GL2_TXA_22C, &pg_power, false);1551if (pg_power == 0xff)1552pg_power = 0;1553power_trim_info->bb_gain[4][0] = pg_power & 0x1f;1554odm_efuse_one_byte_read(dm, PPG_5GL2_TXB_22C, &pg_power, false);1555if (pg_power == 0xff)1556pg_power = 0;1557power_trim_info->bb_gain[4][1] = pg_power & 0x1f;15581559odm_efuse_one_byte_read(dm, PPG_5GM1_TXA_22C, &pg_power, false);1560if (pg_power == 0xff)1561pg_power = 0;1562power_trim_info->bb_gain[5][0] = pg_power & 0x1f;1563odm_efuse_one_byte_read(dm, PPG_5GM1_TXB_22C, &pg_power, false);1564if (pg_power == 0xff)1565pg_power = 0;1566power_trim_info->bb_gain[5][1] = pg_power & 0x1f;15671568odm_efuse_one_byte_read(dm, PPG_5GM2_TXA_22C, &pg_power, false);1569if (pg_power == 0xff)1570pg_power = 0;1571power_trim_info->bb_gain[6][0] = pg_power & 0x1f;1572odm_efuse_one_byte_read(dm, PPG_5GM2_TXB_22C, &pg_power, false);1573if (pg_power == 0xff)1574pg_power = 0;1575power_trim_info->bb_gain[6][1] = pg_power & 0x1f;15761577odm_efuse_one_byte_read(dm, PPG_5GH1_TXA_22C, &pg_power, false);1578if (pg_power == 0xff)1579pg_power = 0;1580power_trim_info->bb_gain[7][0] = pg_power & 0x1f;1581odm_efuse_one_byte_read(dm, PPG_5GH1_TXB_22C, &pg_power, false);1582if (pg_power == 0xff)1583pg_power = 0;1584power_trim_info->bb_gain[7][1] = pg_power & 0x1f;15851586power_trim_info->flag =1587power_trim_info->flag | KFREE_FLAG_ON | KFREE_FLAG_ON_5G;15881589phydm_set_power_trim_offset_8812f(dm);1590}15911592RF_DBG(dm, DBG_RF_MP, "[kfree] 8812f power trim flag:0x%02x\n",1593power_trim_info->flag);15941595if (power_trim_info->flag & KFREE_FLAG_ON) {1596for (i = 0; i < KFREE_BAND_NUM; i++) {1597for (j = 0; j < 2; j++) {1598RF_DBG(dm, DBG_RF_MP,1599"[kfree] 8812f pwr_trim->bb_gain[%d][%d]=0x%X\n",1600i, j, power_trim_info->bb_gain[i][j]);1601}1602}1603}1604}16051606void phydm_get_tssi_trim_offset_8812f(void *dm_void)1607{1608struct dm_struct *dm = (struct dm_struct *)dm_void;1609struct odm_power_trim_data *power_trim_info = &dm->power_trim_data;16101611u8 i, j = 0;1612u8 pg_power[16] = {0};16131614#if 01615odm_efuse_one_byte_read(dm, TSSI_2GM_TXA_22C, &pg_power[0], false);1616odm_efuse_one_byte_read(dm, TSSI_2GM_TXB_22C, &pg_power[1], false);1617odm_efuse_one_byte_read(dm, TSSI_2GH_TXA_22C, &pg_power[2], false);1618odm_efuse_one_byte_read(dm, TSSI_2GH_TXB_22C, &pg_power[3], false);1619#endif1620odm_efuse_one_byte_read(dm, TSSI_5GL1_TXA_22C, &pg_power[4], false);1621odm_efuse_one_byte_read(dm, TSSI_5GL1_TXB_22C, &pg_power[5], false);1622odm_efuse_one_byte_read(dm, TSSI_5GL2_TXA_22C, &pg_power[6], false);1623odm_efuse_one_byte_read(dm, TSSI_5GL2_TXB_22C, &pg_power[7], false);1624odm_efuse_one_byte_read(dm, TSSI_5GM1_TXA_22C, &pg_power[8], false);1625odm_efuse_one_byte_read(dm, TSSI_5GM1_TXB_22C, &pg_power[9], false);1626odm_efuse_one_byte_read(dm, TSSI_5GM2_TXA_22C, &pg_power[10], false);1627odm_efuse_one_byte_read(dm, TSSI_5GM2_TXB_22C, &pg_power[11], false);1628odm_efuse_one_byte_read(dm, TSSI_5GH1_TXA_22C, &pg_power[12], false);1629odm_efuse_one_byte_read(dm, TSSI_5GH1_TXB_22C, &pg_power[13], false);1630odm_efuse_one_byte_read(dm, TSSI_5GH2_TXA_22C, &pg_power[14], false);1631odm_efuse_one_byte_read(dm, TSSI_5GH2_TXB_22C, &pg_power[15], false);16321633for (i = 4; i < 16; i++) {1634if (pg_power[i] == 0xff)1635j++;1636}16371638if (j == 12) {1639RF_DBG(dm, DBG_RF_MP, "[kfree] 8812f tssi trim no PG\n");1640return;1641} else {1642#if 01643power_trim_info->tssi_trim[0][0] = (s8)pg_power[0];1644power_trim_info->tssi_trim[0][1] = (s8)pg_power[1];1645power_trim_info->tssi_trim[1][0] = (s8)pg_power[0];1646power_trim_info->tssi_trim[1][1] = (s8)pg_power[1];1647power_trim_info->tssi_trim[2][0] = (s8)pg_power[2];1648power_trim_info->tssi_trim[2][1] = (s8)pg_power[3];1649#endif1650power_trim_info->tssi_trim[3][0] = (s8)pg_power[4];1651power_trim_info->tssi_trim[3][1] = (s8)pg_power[5];1652power_trim_info->tssi_trim[4][0] = (s8)pg_power[6];1653power_trim_info->tssi_trim[4][1] = (s8)pg_power[7];1654power_trim_info->tssi_trim[5][0] = (s8)pg_power[8];1655power_trim_info->tssi_trim[5][1] = (s8)pg_power[9];1656power_trim_info->tssi_trim[6][0] = (s8)pg_power[10];1657power_trim_info->tssi_trim[6][1] = (s8)pg_power[11];1658power_trim_info->tssi_trim[7][0] = (s8)pg_power[12];1659power_trim_info->tssi_trim[7][1] = (s8)pg_power[13];1660power_trim_info->tssi_trim[8][0] = (s8)pg_power[14];1661power_trim_info->tssi_trim[8][1] = (s8)pg_power[15];16621663power_trim_info->flag =1664power_trim_info->flag | TSSI_TRIM_FLAG_ON;16651666if (power_trim_info->flag & TSSI_TRIM_FLAG_ON) {1667for (i = 0; i < KFREE_BAND_NUM; i++) {1668for (j = 0; j < 2; j++) {1669RF_DBG(dm, DBG_RF_MP,1670"[kfree] 8812f tssi_trim[%d][%d]=0x%X\n",1671i, j, power_trim_info->tssi_trim[i][j]);1672}1673}1674}1675}1676}16771678s8 phydm_get_tssi_trim_de_8812f(void *dm_void, u8 path)1679{1680struct dm_struct *dm = (struct dm_struct *)dm_void;1681struct odm_power_trim_data *power_trim_info = &dm->power_trim_data;16821683u8 channel = *dm->channel, group = 0;16841685if (channel >= 1 && channel <= 3)1686group = 0;1687else if (channel >= 4 && channel <= 9)1688group = 1;1689else if (channel >= 10 && channel <= 14)1690group = 2;1691else if (channel >= 36 && channel <= 50)1692group = 3;1693else if (channel >= 52 && channel <= 64)1694group = 4;1695else if (channel >= 100 && channel <= 118)1696group = 5;1697else if (channel >= 120 && channel <= 144)1698group = 6;1699else if (channel >= 149 && channel <= 165)1700group = 7;1701else if (channel >= 167 && channel <= 177)1702group = 8;1703else {1704RF_DBG(dm, DBG_RF_MP, "[kfree] Channel(%d) is not exist in Group\n",1705channel);1706return 0;1707}17081709return power_trim_info->tssi_trim[group][path];1710}17111712void phydm_get_set_pa_bias_offset_8812f(void *dm_void)1713{1714struct dm_struct *dm = (struct dm_struct *)dm_void;1715struct odm_power_trim_data *power_trim_info = &dm->power_trim_data;17161717u8 pg_pa_bias = 0xff;17181719RF_DBG(dm, DBG_RF_MP, "======>%s\n", __func__);17201721odm_efuse_one_byte_read(dm, PPG_PABIAS_5GA_22C, &pg_pa_bias, false);17221723if (pg_pa_bias != 0xff) {1724#if 01725/*2G s0*/1726odm_efuse_one_byte_read(dm, PPG_PABIAS_2GA_22C,1727&pg_pa_bias, false);1728pg_pa_bias = pg_pa_bias & 0xf;17291730RF_DBG(dm, DBG_RF_MP, "[kfree] 2G s0 pa_bias=0x%x\n", pg_pa_bias);17311732odm_set_rf_reg(dm, RF_PATH_A, 0x60, 0x0000f000, pg_pa_bias);17331734/*2G s1*/1735odm_efuse_one_byte_read(dm, PPG_PABIAS_2GB_22C,1736&pg_pa_bias, false);1737pg_pa_bias = pg_pa_bias & 0xf;17381739RF_DBG(dm, DBG_RF_MP, "[kfree] 2G s1 pa_bias=0x%x\n", pg_pa_bias);17401741odm_set_rf_reg(dm, RF_PATH_B, 0x60, 0x0000f000, pg_pa_bias);1742#endif17431744/*5G s0*/1745odm_efuse_one_byte_read(dm, PPG_PABIAS_5GA_22C,1746&pg_pa_bias, false);1747pg_pa_bias = pg_pa_bias & 0xf;17481749RF_DBG(dm, DBG_RF_MP, "[kfree] 5G s0 pa_bias=0x%x\n", pg_pa_bias);17501751odm_set_rf_reg(dm, RF_PATH_A, 0x60, 0x000f0000, pg_pa_bias);17521753/*5G s1*/1754odm_efuse_one_byte_read(dm, PPG_PABIAS_5GB_22C,1755&pg_pa_bias, false);1756pg_pa_bias = pg_pa_bias & 0xf;17571758RF_DBG(dm, DBG_RF_MP, "[kfree] 5G s1 pa_bias=0x%x\n", pg_pa_bias);17591760odm_set_rf_reg(dm, RF_PATH_B, 0x60, 0x000f0000, pg_pa_bias);17611762power_trim_info->pa_bias_flag |= PA_BIAS_FLAG_ON;1763} else {1764RF_DBG(dm, DBG_RF_MP, "[kfree] 8812f tx pa bias no pg\n");1765}17661767}17681769void phydm_get_thermal_trim_offset_8195b(void *dm_void)1770{1771struct dm_struct *dm = (struct dm_struct *)dm_void;1772struct odm_power_trim_data *power_trim_info = &dm->power_trim_data;17731774u8 pg_therm = 0xff;17751776odm_efuse_one_byte_read(dm, PPG_THERMAL_OFFSET_95B, &pg_therm, false);17771778if (pg_therm != 0xff) {1779pg_therm = pg_therm & 0x1f;1780if ((pg_therm & BIT(0)) == 0)1781power_trim_info->thermal = (-1 * (pg_therm >> 1));1782else1783power_trim_info->thermal = (pg_therm >> 1);17841785power_trim_info->flag |= KFREE_FLAG_THERMAL_K_ON;1786}17871788RF_DBG(dm, DBG_RF_MP, "[kfree] 8195b thermal trim flag:0x%02x\n",1789power_trim_info->flag);17901791if (power_trim_info->flag & KFREE_FLAG_THERMAL_K_ON)1792RF_DBG(dm, DBG_RF_MP, "[kfree] 8195b thermal:%d\n",1793power_trim_info->thermal);1794}17951796void phydm_set_power_trim_rf_8195b(void *dm_void)1797{1798struct dm_struct *dm = (struct dm_struct *)dm_void;1799struct odm_power_trim_data *power_trim_info = &dm->power_trim_data;1800u32 band, i;1801s8 pwr_offset[3];18021803RF_DBG(dm, DBG_RF_MP,1804"[kfree] %s:Set kfree to rf 0x33\n", __func__);18051806odm_set_rf_reg(dm, RF_PATH_A, RF_0xee, BIT(19), 1);18071808odm_set_rf_reg(dm, RF_PATH_A, RF_0x33, RFREGOFFSETMASK, 0x0);1809odm_set_rf_reg(dm, RF_PATH_A, RF_0x3f, 0x0000003f,1810power_trim_info->bb_gain[0][RF_PATH_A]);1811odm_set_rf_reg(dm, RF_PATH_A, RF_0x33, RFREGOFFSETMASK, 0x1);1812odm_set_rf_reg(dm, RF_PATH_A, RF_0x3f, 0x0000003f,1813power_trim_info->bb_gain[1][RF_PATH_A]);1814odm_set_rf_reg(dm, RF_PATH_A, RF_0x33, RFREGOFFSETMASK, 0x2);1815odm_set_rf_reg(dm, RF_PATH_A, RF_0x3f, 0x0000003f,1816power_trim_info->bb_gain[2][RF_PATH_A]);1817odm_set_rf_reg(dm, RF_PATH_A, RF_0x33, RFREGOFFSETMASK, 0x4);1818odm_set_rf_reg(dm, RF_PATH_A, RF_0x3f, 0x0000003f,1819power_trim_info->bb_gain[3][RF_PATH_A]);1820odm_set_rf_reg(dm, RF_PATH_A, RF_0x33, RFREGOFFSETMASK, 0x5);1821odm_set_rf_reg(dm, RF_PATH_A, RF_0x3f, 0x0000003f,1822power_trim_info->bb_gain[4][RF_PATH_A]);1823odm_set_rf_reg(dm, RF_PATH_A, RF_0x33, RFREGOFFSETMASK, 0x6);1824odm_set_rf_reg(dm, RF_PATH_A, RF_0x3f, 0x0000003f,1825power_trim_info->bb_gain[5][RF_PATH_A]);1826odm_set_rf_reg(dm, RF_PATH_A, RF_0x33, RFREGOFFSETMASK, 0x7);1827odm_set_rf_reg(dm, RF_PATH_A, RF_0x3f, 0x0000003f,1828power_trim_info->bb_gain[6][RF_PATH_A]);1829odm_set_rf_reg(dm, RF_PATH_A, RF_0x33, RFREGOFFSETMASK, 0x8);1830odm_set_rf_reg(dm, RF_PATH_A, RF_0x3f, 0x0000003f,1831power_trim_info->bb_gain[7][RF_PATH_A]);1832odm_set_rf_reg(dm, RF_PATH_A, RF_0x33, RFREGOFFSETMASK, 0xe);1833odm_set_rf_reg(dm, RF_PATH_A, RF_0x3f, 0x0000003f,1834power_trim_info->bb_gain[7][RF_PATH_A]);18351836odm_set_rf_reg(dm, RF_PATH_A, RF_0xee, BIT(19), 0);18371838}18391840void phydm_get_set_power_trim_offset_8195b(void *dm_void)1841{1842struct dm_struct *dm = (struct dm_struct *)dm_void;1843struct odm_power_trim_data *power_trim_info = &dm->power_trim_data;18441845u8 pg_power = 0xff, i, j;18461847odm_efuse_one_byte_read(dm, PPG_2GL_TXA_95B, &pg_power, false);18481849if (pg_power != 0xff) {1850power_trim_info->bb_gain[0][0] = pg_power & 0xf;18511852odm_efuse_one_byte_read(dm, PPG_2GM_TXA_95B, &pg_power, false);1853power_trim_info->bb_gain[1][0] = pg_power & 0xf;18541855odm_efuse_one_byte_read(dm, PPG_2GH_TXA_95B, &pg_power, false);1856power_trim_info->bb_gain[2][0] = pg_power & 0xf;18571858odm_efuse_one_byte_read(dm, PPG_5GL1_TXA_95B, &pg_power, false);1859power_trim_info->bb_gain[3][0] = pg_power & 0x1f;18601861odm_efuse_one_byte_read(dm, PPG_5GL2_TXA_95B, &pg_power, false);1862power_trim_info->bb_gain[4][0] = pg_power & 0x1f;18631864odm_efuse_one_byte_read(dm, PPG_5GM1_TXA_95B, &pg_power, false);1865power_trim_info->bb_gain[5][0] = pg_power & 0x1f;18661867odm_efuse_one_byte_read(dm, PPG_5GM2_TXA_95B, &pg_power, false);1868power_trim_info->bb_gain[6][0] = pg_power & 0x1f;18691870odm_efuse_one_byte_read(dm, PPG_5GH1_TXA_95B, &pg_power, false);1871power_trim_info->bb_gain[7][0] = pg_power & 0x1f;18721873phydm_set_power_trim_rf_8195b(dm);18741875power_trim_info->flag =1876power_trim_info->flag |1877KFREE_FLAG_ON | KFREE_FLAG_ON_2G | KFREE_FLAG_ON_5G;1878}18791880RF_DBG(dm, DBG_RF_MP, "[kfree] 8195b power trim flag:0x%02x\n",1881power_trim_info->flag);18821883if (power_trim_info->flag & KFREE_FLAG_ON) {1884for (i = 0; i < KFREE_BAND_NUM; i++) {1885for (j = 0; j < 1; j++) {1886RF_DBG(dm, DBG_RF_MP,1887"[kfree] 8195b pwr_trim->bb_gain[%d][%d]=0x%X\n",1888i, j, power_trim_info->bb_gain[i][j]);1889}1890}1891}1892}18931894void phydm_get_set_pa_bias_offset_8195b(void *dm_void)1895{1896struct dm_struct *dm = (struct dm_struct *)dm_void;1897struct odm_power_trim_data *power_trim_info = &dm->power_trim_data;18981899u8 pg_pa_bias = 0xff;19001901RF_DBG(dm, DBG_RF_MP, "======>%s\n", __func__);19021903odm_efuse_one_byte_read(dm, PPG_PABIAS_2GA_95B, &pg_pa_bias, false);19041905if (pg_pa_bias != 0xff) {1906/*2G*/1907odm_efuse_one_byte_read(dm, PPG_PABIAS_2GA_95B,1908&pg_pa_bias, false);1909pg_pa_bias = pg_pa_bias & 0xf;19101911RF_DBG(dm, DBG_RF_MP, "[kfree] 2G pa_bias=0x%x\n", pg_pa_bias);19121913odm_set_rf_reg(dm, RF_PATH_A, 0x60, 0x0000f000, pg_pa_bias);19141915/*5G*/1916odm_efuse_one_byte_read(dm, PPG_PABIAS_5GA_95B,1917&pg_pa_bias, false);1918pg_pa_bias = pg_pa_bias & 0xf;19191920RF_DBG(dm, DBG_RF_MP, "[kfree] 5G pa_bias=0x%x\n", pg_pa_bias);19211922odm_set_rf_reg(dm, RF_PATH_A, 0x60, 0x000f0000, pg_pa_bias);19231924power_trim_info->pa_bias_flag |= PA_BIAS_FLAG_ON;1925} else {1926RF_DBG(dm, DBG_RF_MP, "[kfree] 8195b tx pa bias no pg\n");1927}1928}19291930void phydm_get_thermal_trim_offset_8721d(void *dm_void)1931{1932struct dm_struct *dm = (struct dm_struct *)dm_void;1933struct odm_power_trim_data *power_trim_info = &dm->power_trim_data;19341935u8 pg_therm = 0xff;19361937odm_efuse_one_byte_read(dm, PPG_THERMAL_OFFSET_8721D, &pg_therm, false);19381939if (pg_therm != 0xff) {1940pg_therm = pg_therm & 0x1f;1941if ((pg_therm & BIT(0)) == 0)1942power_trim_info->thermal = (-1 * (pg_therm >> 1));1943else1944power_trim_info->thermal = (pg_therm >> 1);19451946power_trim_info->flag |= KFREE_FLAG_THERMAL_K_ON;1947}19481949RF_DBG(dm, DBG_RF_MP, "[kfree] 8721d thermal trim flag:0x%02x\n",1950power_trim_info->flag);19511952if (power_trim_info->flag & KFREE_FLAG_THERMAL_K_ON)1953RF_DBG(dm, DBG_RF_MP, "[kfree] 8721d thermal:%d\n",1954power_trim_info->thermal);1955}19561957void phydm_set_power_trim_rf_8721d(void *dm_void, u8 pg_band)1958{1959struct dm_struct *dm = (struct dm_struct *)dm_void;1960struct odm_power_trim_data *power_trim_info = &dm->power_trim_data;19611962RF_DBG(dm, DBG_RF_MP, "[kfree] %s:Set kfree to rf 0x33\n", __func__);19631964odm_set_rf_reg(dm, RF_PATH_A, RF_0xee, BIT(19), 1);1965if (pg_band == 1) {1966odm_set_rf_reg(dm, RF_PATH_A, RF_0x33, RFREGOFFSETMASK, 0x0);1967odm_set_rf_reg(dm, RF_PATH_A, RF_0x3f, 0x0000003f,1968power_trim_info->bb_gain[0][RF_PATH_A]);1969odm_set_rf_reg(dm, RF_PATH_A, RF_0x33, RFREGOFFSETMASK, 0x1);1970odm_set_rf_reg(dm, RF_PATH_A, RF_0x3f, 0x0000003f,1971power_trim_info->bb_gain[1][RF_PATH_A]);1972odm_set_rf_reg(dm, RF_PATH_A, RF_0x33, RFREGOFFSETMASK, 0x2);1973odm_set_rf_reg(dm, RF_PATH_A, RF_0x3f, 0x0000003f,1974power_trim_info->bb_gain[2][RF_PATH_A]);1975} else if (pg_band == 2) {1976odm_set_rf_reg(dm, RF_PATH_A, RF_0x33, RFREGOFFSETMASK, 0x4);1977odm_set_rf_reg(dm, RF_PATH_A, RF_0x3f, 0x0000003f,1978power_trim_info->bb_gain[3][RF_PATH_A]);1979odm_set_rf_reg(dm, RF_PATH_A, RF_0x33, RFREGOFFSETMASK, 0x5);1980odm_set_rf_reg(dm, RF_PATH_A, RF_0x3f, 0x0000003f,1981power_trim_info->bb_gain[4][RF_PATH_A]);1982odm_set_rf_reg(dm, RF_PATH_A, RF_0x33, RFREGOFFSETMASK, 0x6);1983odm_set_rf_reg(dm, RF_PATH_A, RF_0x3f, 0x0000003f,1984power_trim_info->bb_gain[5][RF_PATH_A]);1985odm_set_rf_reg(dm, RF_PATH_A, RF_0x33, RFREGOFFSETMASK, 0x7);1986odm_set_rf_reg(dm, RF_PATH_A, RF_0x3f, 0x0000003f,1987power_trim_info->bb_gain[6][RF_PATH_A]);1988odm_set_rf_reg(dm, RF_PATH_A, RF_0x33, RFREGOFFSETMASK, 0x8);1989odm_set_rf_reg(dm, RF_PATH_A, RF_0x3f, 0x0000003f,1990power_trim_info->bb_gain[7][RF_PATH_A]);1991}1992odm_set_rf_reg(dm, RF_PATH_A, RF_0xee, BIT(19), 0);1993}19941995void phydm_get_set_power_trim_offset_8721d(void *dm_void)1996{1997struct dm_struct *dm = (struct dm_struct *)dm_void;1998struct odm_power_trim_data *power_trim_info = &dm->power_trim_data;19992000u8 pg_power = 0xff, pg_power_5g = 0xff, i, j;2001u8 pg_band = 0;20022003odm_efuse_one_byte_read(dm, PPG_2G_TXA_8721D, &pg_power, false);2004odm_efuse_one_byte_read(dm, PPG_5GL1_TXA_8721D, &pg_power_5g, false);20052006if (pg_power != 0xff) {2007pg_band = 1;2008power_trim_info->bb_gain[0][0] = pg_power & 0xf;2009power_trim_info->bb_gain[1][0] = pg_power & 0xf;2010power_trim_info->bb_gain[2][0] = pg_power & 0xf;20112012phydm_set_power_trim_rf_8721d(dm, pg_band);20132014power_trim_info->flag =2015power_trim_info->flag |2016KFREE_FLAG_ON | KFREE_FLAG_ON_2G;2017}2018if (pg_power_5g != 0xff) {2019pg_band = 2;2020power_trim_info->bb_gain[3][0] = pg_power_5g & 0x1f;20212022odm_efuse_one_byte_read(dm, PPG_5GL2_TXA_8721D,2023&pg_power_5g, false);2024power_trim_info->bb_gain[4][0] = pg_power_5g & 0x1f;20252026odm_efuse_one_byte_read(dm, PPG_5GM1_TXA_8721D,2027&pg_power_5g, false);2028power_trim_info->bb_gain[5][0] = pg_power_5g & 0x1f;20292030odm_efuse_one_byte_read(dm, PPG_5GM2_TXA_8721D,2031&pg_power_5g, false);2032power_trim_info->bb_gain[6][0] = pg_power_5g & 0x1f;20332034odm_efuse_one_byte_read(dm, PPG_5GH1_TXA_8721D,2035&pg_power_5g, false);2036power_trim_info->bb_gain[7][0] = pg_power_5g & 0x1f;20372038phydm_set_power_trim_rf_8721d(dm, pg_band);20392040power_trim_info->flag =2041power_trim_info->flag |2042KFREE_FLAG_ON | KFREE_FLAG_ON_5G;2043}20442045RF_DBG(dm, DBG_RF_MP, "[kfree] 8721d power trim flag:0x%02x\n",2046power_trim_info->flag);20472048if (power_trim_info->flag & KFREE_FLAG_ON) {2049for (i = 0; i < KFREE_BAND_NUM; i++) {2050for (j = 0; j < 1; j++) {2051RF_DBG(dm, DBG_RF_MP,2052"[kfree] 8721d pwr_trim->bb_gain[%d][%d]=0x%X\n",2053i, j, power_trim_info->bb_gain[i][j]);2054}2055}2056}2057}20582059void phydm_get_set_pa_bias_offset_8721d(void *dm_void)2060{2061struct dm_struct *dm = (struct dm_struct *)dm_void;2062struct odm_power_trim_data *power_trim_info = &dm->power_trim_data;20632064u8 pg_pa_bias = 0xff;2065#if 02066RF_DBG(dm, DBG_RF_MP, "======>%s\n", __func__);20672068odm_efuse_one_byte_read(dm, PPG_PABIAS_2GA_95B, &pg_pa_bias, false);20692070if (pg_pa_bias != 0xff) {2071/*2G*/2072odm_efuse_one_byte_read(dm, PPG_PABIAS_2GA_95B,2073&pg_pa_bias, false);2074pg_pa_bias = pg_pa_bias & 0xf;20752076RF_DBG(dm, DBG_RF_MP, "[kfree] 2G pa_bias=0x%x\n", pg_pa_bias);20772078odm_set_rf_reg(dm, RF_PATH_A, 0x60, 0x0000f000, pg_pa_bias);20792080/*5G*/2081odm_efuse_one_byte_read(dm, PPG_PABIAS_5GA_95B,2082&pg_pa_bias, false);2083pg_pa_bias = pg_pa_bias & 0xf;20842085RF_DBG(dm, DBG_RF_MP, "[kfree] 5G pa_bias=0x%x\n", pg_pa_bias);20862087odm_set_rf_reg(dm, RF_PATH_A, 0x60, 0x000f0000, pg_pa_bias);20882089power_trim_info->pa_bias_flag |= PA_BIAS_FLAG_ON;2090} else {2091RF_DBG(dm, DBG_RF_MP, "[kfree] 8721d tx pa bias no pg\n");2092}2093#endif2094}20952096void phydm_get_thermal_trim_offset_8197g(void *dm_void)2097{2098struct dm_struct *dm = (struct dm_struct *)dm_void;2099struct odm_power_trim_data *power_trim_info = &dm->power_trim_data;21002101u8 pg_therm = 0;21022103odm_efuse_one_byte_read(dm, PPG_THERMAL_OFFSET_97G, &pg_therm, false);21042105if (pg_therm != 0) {2106pg_therm = pg_therm & 0x1f;2107if ((pg_therm & BIT(0)) == 0)2108power_trim_info->thermal = (-1 * (pg_therm >> 1));2109else2110power_trim_info->thermal = (pg_therm >> 1);21112112power_trim_info->flag |= KFREE_FLAG_THERMAL_K_ON;2113}21142115RF_DBG(dm, DBG_RF_MP, "[kfree] 8197g thermal trim flag:0x%02x\n",2116power_trim_info->flag);21172118if (power_trim_info->flag & KFREE_FLAG_THERMAL_K_ON)2119RF_DBG(dm, DBG_RF_MP, "[kfree] 8197g thermal:%d\n",2120power_trim_info->thermal);2121}21222123void phydm_set_power_trim_offset_8197g(void *dm_void)2124{2125struct dm_struct *dm = (struct dm_struct *)dm_void;2126struct odm_power_trim_data *power_trim_info = &dm->power_trim_data;2127u8 e_rf_path;21282129for (e_rf_path = RF_PATH_A; e_rf_path < 2; e_rf_path++)2130{2131odm_set_rf_reg(dm, e_rf_path, RF_0xef, BIT(7), 1);21322133odm_set_rf_reg(dm, e_rf_path, RF_0x33, 0x1c000, 0);2134odm_set_rf_reg(dm, e_rf_path, RF_0x33, 0x3F,2135power_trim_info->bb_gain[0][e_rf_path]);2136odm_set_rf_reg(dm, e_rf_path, RF_0x33, 0x1c000, 1);2137odm_set_rf_reg(dm, e_rf_path, RF_0x33, 0x3F,2138power_trim_info->bb_gain[0][e_rf_path]);2139odm_set_rf_reg(dm, e_rf_path, RF_0x33, 0x1c000, 2);2140odm_set_rf_reg(dm, e_rf_path, RF_0x33, 0x3F,2141power_trim_info->bb_gain[1][e_rf_path]);2142odm_set_rf_reg(dm, e_rf_path, RF_0x33, 0x1c000, 3);2143odm_set_rf_reg(dm, e_rf_path, RF_0x33, 0x3F,2144power_trim_info->bb_gain[1][e_rf_path]);2145odm_set_rf_reg(dm, e_rf_path, RF_0x33, 0x1c000, 4);2146odm_set_rf_reg(dm, e_rf_path, RF_0x33, 0x3F,2147power_trim_info->bb_gain[2][e_rf_path]);2148odm_set_rf_reg(dm, e_rf_path, RF_0x33, 0x1c000, 5);2149odm_set_rf_reg(dm, e_rf_path, RF_0x33, 0x3F,2150power_trim_info->bb_gain[2][e_rf_path]);21512152odm_set_rf_reg(dm, e_rf_path, RF_0xef, BIT(7), 0);2153}21542155}21562157void phydm_get_set_power_trim_offset_8197g(void *dm_void)2158{2159struct dm_struct *dm = (struct dm_struct *)dm_void;2160struct odm_power_trim_data *power_trim_info = &dm->power_trim_data;21612162u8 pg_power = 0, i, j;21632164odm_efuse_one_byte_read(dm, PPG_2GL_TXAB_97G, &pg_power, false);21652166if (pg_power != 0) {2167power_trim_info->bb_gain[0][0] = pg_power & 0xf;2168power_trim_info->bb_gain[0][1] = (pg_power & 0xf0) >> 4;21692170odm_efuse_one_byte_read(dm, PPG_2GM_TXAB_97G, &pg_power, false);2171power_trim_info->bb_gain[1][0] = pg_power & 0xf;2172power_trim_info->bb_gain[1][1] = (pg_power & 0xf0) >> 4;21732174odm_efuse_one_byte_read(dm, PPG_2GH_TXAB_97G, &pg_power, false);2175power_trim_info->bb_gain[2][0] = pg_power & 0xf;2176power_trim_info->bb_gain[2][1] = (pg_power & 0xf0) >> 4;21772178phydm_set_power_trim_offset_8197g(dm);21792180power_trim_info->flag =2181power_trim_info->flag | KFREE_FLAG_ON | KFREE_FLAG_ON_2G;2182}21832184RF_DBG(dm, DBG_RF_MP, "[kfree] 8197g power trim flag:0x%02x\n",2185power_trim_info->flag);21862187if (power_trim_info->flag & KFREE_FLAG_ON) {2188for (i = 0; i < KFREE_BAND_NUM; i++) {2189for (j = 0; j < MAX_RF_PATH; j++) {2190RF_DBG(dm, DBG_RF_MP,2191"[kfree] 8197g pwr_trim->bb_gain[%d][%d]=0x%X\n",2192i, j, power_trim_info->bb_gain[i][j]);2193}2194}2195}2196}21972198void phydm_get_set_pa_bias_offset_8197g(void *dm_void)2199{2200struct dm_struct *dm = (struct dm_struct *)dm_void;2201struct odm_power_trim_data *power_trim_info = &dm->power_trim_data;22022203u8 pg_pa_bias = 0xff, i;2204u8 tx_pa_bias[4] = {0};22052206odm_efuse_one_byte_read(dm, PPG_PABIAS_2GAB_97G, &pg_pa_bias, false);22072208if (pg_pa_bias != 0xff) {2209/*paht ab*/2210odm_efuse_one_byte_read(dm, PPG_PABIAS_2GAB_97G,2211&pg_pa_bias, false);2212tx_pa_bias[0] = pg_pa_bias & 0xf;2213tx_pa_bias[1] = ((pg_pa_bias & 0xf0) >> 4);22142215RF_DBG(dm, DBG_RF_MP,2216"[kfree] 8197g PathA_pa_bias:0x%x PathB_pa_bias:0x%x\n",2217tx_pa_bias[0], tx_pa_bias[1]);22182219for (i = RF_PATH_A; i < 2; i++)2220odm_set_rf_reg(dm, i, 0x60, 0x0000f000, tx_pa_bias[i]);22212222power_trim_info->pa_bias_flag |= PA_BIAS_FLAG_ON;2223} else {2224RF_DBG(dm, DBG_RF_MP, "[kfree] 8197g tx pa bias no pg\n");2225}2226}22272228void phydm_get_set_lna_offset_8197g(void *dm_void)2229{2230struct dm_struct *dm = (struct dm_struct *)dm_void;2231struct odm_power_trim_data *power_trim_info = &dm->power_trim_data;22322233u8 pg_lna[2] = {0}, i, pg_lna_tmp = 0;2234u32 rf_reg;22352236odm_efuse_one_byte_read(dm, PPG_LNA_2GA_97G, &pg_lna_tmp, false);22372238if (pg_lna_tmp != 0) {2239odm_efuse_one_byte_read(dm, PPG_LNA_2GA_97G,2240&pg_lna[0], false);22412242odm_efuse_one_byte_read(dm, PPG_LNA_2GB_97G,2243&pg_lna[1], false);22442245for (i = RF_PATH_A; i < 2; i++) {2246RF_DBG(dm, DBG_RF_MP,2247"[kfree] 8197g lna\n");2248odm_set_rf_reg(dm, i, 0x88, 0x00000f00, pg_lna[i]);2249}22502251power_trim_info->lna_flag |= LNA_FLAG_ON;2252} else {2253RF_DBG(dm, DBG_RF_MP, "[kfree] 8197g lna no pg\n");2254}2255}22562257s8 phydm_get_tssi_trim_de(void *dm_void, u8 path)2258{2259struct dm_struct *dm = (struct dm_struct *)dm_void;22602261if (dm->support_ic_type & ODM_RTL8822C)2262return phydm_get_tssi_trim_de_8822c(dm, path);2263else if (dm->support_ic_type & ODM_RTL8812F)2264return phydm_get_tssi_trim_de_8812f(dm, path);2265else2266return 0;2267}22682269void phydm_do_new_kfree(void *dm_void)2270{2271struct dm_struct *dm = (struct dm_struct *)dm_void;22722273if (dm->support_ic_type & ODM_RTL8822C) {2274phydm_get_set_thermal_trim_offset_8822c(dm);2275phydm_get_set_power_trim_offset_8822c(dm);2276phydm_get_set_pa_bias_offset_8822c(dm);2277phydm_get_tssi_trim_offset_8822c(dm);2278}22792280if (dm->support_ic_type & ODM_RTL8812F) {2281phydm_get_set_thermal_trim_offset_8812f(dm);2282phydm_get_set_power_trim_offset_8812f(dm);2283phydm_get_set_pa_bias_offset_8812f(dm);2284phydm_get_tssi_trim_offset_8812f(dm);2285}22862287if (dm->support_ic_type & ODM_RTL8195B) {2288phydm_get_thermal_trim_offset_8195b(dm);2289phydm_get_set_power_trim_offset_8195b(dm);2290phydm_get_set_pa_bias_offset_8195b(dm);2291}22922293if (dm->support_ic_type & ODM_RTL8721D) {2294phydm_get_thermal_trim_offset_8721d(dm);2295phydm_get_set_power_trim_offset_8721d(dm);2296/*phydm_get_set_pa_bias_offset_8721d(dm);*/2297}22982299if (dm->support_ic_type & ODM_RTL8198F)2300phydm_get_set_lna_offset_8198f(dm);23012302if (dm->support_ic_type & ODM_RTL8197G) {2303phydm_get_thermal_trim_offset_8197g(dm);2304phydm_get_set_power_trim_offset_8197g(dm);2305phydm_get_set_pa_bias_offset_8197g(dm);2306/*phydm_get_tssi_trim_offset_8197g(dm);*/2307/*phydm_get_set_lna_offset_8197g(dm);*/2308}2309}23102311void phydm_set_kfree_to_rf(void *dm_void, u8 e_rf_path, u8 data)2312{2313struct dm_struct *dm = (struct dm_struct *)dm_void;23142315if (dm->support_ic_type & ODM_RTL8814A)2316phydm_set_kfree_to_rf_8814a(dm, e_rf_path, data);23172318if ((dm->support_ic_type & ODM_RTL8821C) &&2319(*dm->band_type == ODM_BAND_2_4G))2320phydm_set_kfree_to_rf_8821c(dm, e_rf_path, true, data);2321else if (dm->support_ic_type & ODM_RTL8821C)2322phydm_set_kfree_to_rf_8821c(dm, e_rf_path, false, data);23232324if (dm->support_ic_type & ODM_RTL8822B)2325phydm_set_kfree_to_rf_8822b(dm, e_rf_path, data);23262327if (dm->support_ic_type & ODM_RTL8710B)2328phydm_set_kfree_to_rf_8710b(dm, e_rf_path, data);23292330if (dm->support_ic_type & ODM_RTL8198F)2331phydm_set_kfree_to_rf_8198f(dm, e_rf_path, data);2332}23332334void phydm_clear_kfree_to_rf(void *dm_void, u8 e_rf_path, u8 data)2335{2336struct dm_struct *dm = (struct dm_struct *)dm_void;23372338if (dm->support_ic_type & ODM_RTL8822B)2339phydm_clear_kfree_to_rf_8822b(dm, e_rf_path, 1);23402341if (dm->support_ic_type & ODM_RTL8821C)2342phydm_clear_kfree_to_rf_8821c(dm, e_rf_path, 1);23432344if (dm->support_ic_type & ODM_RTL8198F)2345phydm_clear_kfree_to_rf_8198f(dm, e_rf_path, 0);2346}23472348void phydm_get_thermal_trim_offset(void *dm_void)2349{2350struct dm_struct *dm = (struct dm_struct *)dm_void;23512352#if (DM_ODM_SUPPORT_TYPE & ODM_WIN)2353void *adapter = dm->adapter;2354HAL_DATA_TYPE *hal_data = GET_HAL_DATA(((PADAPTER)adapter));2355PEFUSE_HAL pEfuseHal = &hal_data->EfuseHal;2356u1Byte eFuseContent[DCMD_EFUSE_MAX_SECTION_NUM * EFUSE_MAX_WORD_UNIT * 2];23572358if (HAL_MAC_Dump_EFUSE(&GET_HAL_MAC_INFO((PADAPTER)adapter), EFUSE_WIFI, eFuseContent, pEfuseHal->PhysicalLen_WiFi, HAL_MAC_EFUSE_PHYSICAL, HAL_MAC_EFUSE_PARSE_DRV) != RT_STATUS_SUCCESS)2359RF_DBG(dm, DBG_RF_MP, "[kfree] dump efuse fail !!!\n");2360#endif23612362if (dm->support_ic_type & ODM_RTL8821C)2363phydm_get_thermal_trim_offset_8821c(dm_void);2364else if (dm->support_ic_type & ODM_RTL8822B)2365phydm_get_thermal_trim_offset_8822b(dm_void);2366else if (dm->support_ic_type & ODM_RTL8710B)2367phydm_get_thermal_trim_offset_8710b(dm_void);2368else if (dm->support_ic_type & ODM_RTL8192F)2369phydm_get_thermal_trim_offset_8192f(dm_void);2370else if (dm->support_ic_type & ODM_RTL8198F)2371phydm_get_thermal_trim_offset_8198f(dm_void);2372}23732374void phydm_get_power_trim_offset(void *dm_void)2375{2376struct dm_struct *dm = (struct dm_struct *)dm_void;23772378#if 0 //(DM_ODM_SUPPORT_TYPE & ODM_WIN) // 2017 MH DM Should use the same code.s2379void *adapter = dm->adapter;2380HAL_DATA_TYPE *hal_data = GET_HAL_DATA(((PADAPTER)adapter));2381PEFUSE_HAL pEfuseHal = &hal_data->EfuseHal;2382u1Byte eFuseContent[DCMD_EFUSE_MAX_SECTION_NUM * EFUSE_MAX_WORD_UNIT * 2];23832384if (HAL_MAC_Dump_EFUSE(&GET_HAL_MAC_INFO(adapter), EFUSE_WIFI, eFuseContent, pEfuseHal->PhysicalLen_WiFi, HAL_MAC_EFUSE_PHYSICAL, HAL_MAC_EFUSE_PARSE_DRV) != RT_STATUS_SUCCESS)2385RF_DBG(dm, DBG_RF_MP, "[kfree] dump efuse fail !!!\n");2386#endif23872388if (dm->support_ic_type & ODM_RTL8821C)2389phydm_get_power_trim_offset_8821c(dm_void);2390else if (dm->support_ic_type & ODM_RTL8822B)2391phydm_get_power_trim_offset_8822b(dm_void);2392else if (dm->support_ic_type & ODM_RTL8710B)2393phydm_get_power_trim_offset_8710b(dm_void);2394else if (dm->support_ic_type & ODM_RTL8192F)2395phydm_get_power_trim_offset_8192f(dm_void);2396else if (dm->support_ic_type & ODM_RTL8198F)2397phydm_get_power_trim_offset_8198f(dm_void);2398}23992400void phydm_get_pa_bias_offset(void *dm_void)2401{2402struct dm_struct *dm = (struct dm_struct *)dm_void;24032404#if (DM_ODM_SUPPORT_TYPE & ODM_WIN)2405void *adapter = dm->adapter;2406HAL_DATA_TYPE *hal_data = GET_HAL_DATA(((PADAPTER)adapter));2407PEFUSE_HAL pEfuseHal = &hal_data->EfuseHal;2408u1Byte eFuseContent[DCMD_EFUSE_MAX_SECTION_NUM * EFUSE_MAX_WORD_UNIT * 2];24092410if (HAL_MAC_Dump_EFUSE(&GET_HAL_MAC_INFO((PADAPTER)adapter), EFUSE_WIFI, eFuseContent, pEfuseHal->PhysicalLen_WiFi, HAL_MAC_EFUSE_PHYSICAL, HAL_MAC_EFUSE_PARSE_DRV) != RT_STATUS_SUCCESS)2411RF_DBG(dm, DBG_RF_MP, "[kfree] dump efuse fail !!!\n");2412#endif24132414if (dm->support_ic_type & ODM_RTL8822B)2415phydm_get_pa_bias_offset_8822b(dm_void);24162417if (dm->support_ic_type & ODM_RTL8198F)2418phydm_get_pa_bias_offset_8198f(dm);2419}24202421s8 phydm_get_thermal_offset(void *dm_void)2422{2423struct dm_struct *dm = (struct dm_struct *)dm_void;2424struct odm_power_trim_data *power_trim_info = &dm->power_trim_data;24252426if (power_trim_info->flag & KFREE_FLAG_THERMAL_K_ON)2427return power_trim_info->thermal;2428else2429return 0;2430}24312432void phydm_do_kfree(void *dm_void, u8 channel_to_sw)2433{2434struct dm_struct *dm = (struct dm_struct *)dm_void;2435struct odm_power_trim_data *pwrtrim = &dm->power_trim_data;2436u8 channel_idx = 0, rfpath = 0, max_path = 0, kfree_band_num = 0;2437u8 i, j;2438s8 bb_gain;24392440if (dm->support_ic_type & ODM_RTL8814A)2441max_path = 4; /*0~3*/2442else if (dm->support_ic_type &2443(ODM_RTL8812 | ODM_RTL8822B | ODM_RTL8192F)) {2444max_path = 2; /*0~1*/2445kfree_band_num = KFREE_BAND_NUM;2446} else if (dm->support_ic_type & ODM_RTL8821C) {2447max_path = 1;2448kfree_band_num = KFREE_BAND_NUM;2449} else if (dm->support_ic_type & ODM_RTL8710B) {2450max_path = 1;2451kfree_band_num = 1;2452} else if (dm->support_ic_type & ODM_RTL8198F) {2453max_path = 4;2454kfree_band_num = 3;2455}24562457if (dm->support_ic_type &2458(ODM_RTL8192F | ODM_RTL8822B | ODM_RTL8821C |2459ODM_RTL8814A | ODM_RTL8710B)) {2460for (i = 0; i < kfree_band_num; i++) {2461for (j = 0; j < max_path; j++)2462RF_DBG(dm, DBG_RF_MP,2463"[kfree] PwrTrim->gain[%d][%d]=0x%X\n",2464i, j, pwrtrim->bb_gain[i][j]);2465}2466}2467if (*dm->band_type == ODM_BAND_2_4G &&2468pwrtrim->flag & KFREE_FLAG_ON_2G) {2469if (!(dm->support_ic_type & ODM_RTL8192F)) {2470if (channel_to_sw >= 1 && channel_to_sw <= 14)2471channel_idx = PHYDM_2G;2472for (rfpath = RF_PATH_A; rfpath < max_path; rfpath++) {2473RF_DBG(dm, DBG_RF_MP,2474"[kfree] %s:chnl=%d PATH=%d gain:0x%X\n",2475__func__, channel_to_sw, rfpath,2476pwrtrim->bb_gain[channel_idx][rfpath]);2477bb_gain = pwrtrim->bb_gain[channel_idx][rfpath];2478phydm_set_kfree_to_rf(dm, rfpath, bb_gain);2479}2480} else if (dm->support_ic_type & ODM_RTL8192F) {2481if (channel_to_sw >= 1 && channel_to_sw <= 3)2482channel_idx = 0;2483if (channel_to_sw >= 4 && channel_to_sw <= 9)2484channel_idx = 1;2485if (channel_to_sw >= 10 && channel_to_sw <= 14)2486channel_idx = 2;2487for (rfpath = RF_PATH_A; rfpath < max_path; rfpath++) {2488RF_DBG(dm, DBG_RF_MP,2489"[kfree] %s:chnl=%d PATH=%d gain:0x%X\n",2490__func__, channel_to_sw, rfpath,2491pwrtrim->bb_gain[channel_idx][rfpath]);2492bb_gain = pwrtrim->bb_gain[channel_idx][rfpath];2493phydm_set_kfree_to_rf_8192f(dm, rfpath,2494channel_idx,2495bb_gain);2496}2497}2498} else if (*dm->band_type == ODM_BAND_5G &&2499pwrtrim->flag & KFREE_FLAG_ON_5G) {2500if (channel_to_sw >= 36 && channel_to_sw <= 48)2501channel_idx = PHYDM_5GLB1;2502if (channel_to_sw >= 52 && channel_to_sw <= 64)2503channel_idx = PHYDM_5GLB2;2504if (channel_to_sw >= 100 && channel_to_sw <= 120)2505channel_idx = PHYDM_5GMB1;2506if (channel_to_sw >= 122 && channel_to_sw <= 144)2507channel_idx = PHYDM_5GMB2;2508if (channel_to_sw >= 149 && channel_to_sw <= 177)2509channel_idx = PHYDM_5GHB;25102511for (rfpath = RF_PATH_A; rfpath < max_path; rfpath++) {2512RF_DBG(dm, DBG_RF_MP,2513"[kfree] %s: channel=%d PATH=%d bb_gain:0x%X\n",2514__func__, channel_to_sw, rfpath,2515pwrtrim->bb_gain[channel_idx][rfpath]);2516bb_gain = pwrtrim->bb_gain[channel_idx][rfpath];2517phydm_set_kfree_to_rf(dm, rfpath, bb_gain);2518}2519} else {2520RF_DBG(dm, DBG_RF_MP, "[kfree] Set default Register\n");2521if (!(dm->support_ic_type & ODM_RTL8192F)) {2522for (rfpath = RF_PATH_A; rfpath < max_path; rfpath++) {2523bb_gain = pwrtrim->bb_gain[channel_idx][rfpath];2524phydm_clear_kfree_to_rf(dm, rfpath, bb_gain);2525}2526}2527#if 02528/*else if(dm->support_ic_type & ODM_RTL8192F){2529if (channel_to_sw >= 1 && channel_to_sw <= 3)2530channel_idx = 0;2531if (channel_to_sw >= 4 && channel_to_sw <= 9)2532channel_idx = 1;2533if (channel_to_sw >= 9 && channel_to_sw <= 14)2534channel_idx = 2;2535for (rfpath = RF_PATH_A; rfpath < max_path; rfpath++)2536phydm_clear_kfree_to_rf_8192f(dm, rfpath, pwrtrim->bb_gain[channel_idx][rfpath]);2537}*/2538#endif2539}2540}25412542void phydm_config_new_kfree(void *dm_void)2543{2544struct dm_struct *dm = (struct dm_struct *)dm_void;2545struct dm_rf_calibration_struct *cali_info = &dm->rf_calibrate_info;25462547if (cali_info->reg_rf_kfree_enable == 2) {2548RF_DBG(dm, DBG_RF_MP,2549"[kfree] %s: reg_rf_kfree_enable == 2, Disable\n",2550__func__);2551return;2552} else if (cali_info->reg_rf_kfree_enable == 1 ||2553cali_info->reg_rf_kfree_enable == 0) {2554RF_DBG(dm, DBG_RF_MP,2555"[kfree] %s: reg_rf_kfree_enable == true\n", __func__);25562557phydm_do_new_kfree(dm);2558}2559}25602561void phydm_config_kfree(void *dm_void, u8 channel_to_sw)2562{2563struct dm_struct *dm = (struct dm_struct *)dm_void;2564struct dm_rf_calibration_struct *cali_info = &dm->rf_calibrate_info;2565struct odm_power_trim_data *pwrtrim = &dm->power_trim_data;25662567RF_DBG(dm, DBG_RF_MP, "===>[kfree] phy_ConfigKFree()\n");25682569if (cali_info->reg_rf_kfree_enable == 2) {2570RF_DBG(dm, DBG_RF_MP,2571"[kfree] %s: reg_rf_kfree_enable == 2, Disable\n",2572__func__);2573return;2574} else if (cali_info->reg_rf_kfree_enable == 1 ||2575cali_info->reg_rf_kfree_enable == 0) {2576RF_DBG(dm, DBG_RF_MP,2577"[kfree] %s: reg_rf_kfree_enable == true\n", __func__);2578/*Make sure the targetval is defined*/2579if (!(pwrtrim->flag & KFREE_FLAG_ON)) {2580RF_DBG(dm, DBG_RF_MP,2581"[kfree] %s: efuse is 0xff, KFree not work\n",2582__func__);2583return;2584}2585#if 02586/*if kfree_table[0] == 0xff, means no Kfree*/2587#endif2588phydm_do_kfree(dm, channel_to_sw);2589}2590RF_DBG(dm, DBG_RF_MP, "<===[kfree] phy_ConfigKFree()\n");2591}259225932594