1 /******************************************************************************
3 * Copyright(c) 2007 - 2016 Realtek Corporation.
5 * This program is free software; you can redistribute it and/or modify it
6 * under the terms of version 2 of the GNU General Public License as
7 * published by the Free Software Foundation.
9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
14 * The full GNU General Public License is included in this distribution in the
15 * file called LICENSE.
17 * Contact Information:
18 * wlanfae <wlanfae@realtek.com>
19 * Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park,
20 * Hsinchu 300, Taiwan.
22 * Larry Finger <Larry.Finger@lwfinger.net>
24 *****************************************************************************/
26 /*============================================================*/
28 /*============================================================*/
29 #include "mp_precomp.h"
30 #include "phydm_precomp.h"
32 /*<YuChen, 150720> Add for KFree Feature Requested by RF David.*/
33 /*This is a phydm API*/
35 static void phydm_set_kfree_to_rf_8814a(void *dm_void, u8 e_rf_path, u8 data)
37 struct phy_dm_struct *dm = (struct phy_dm_struct *)dm_void;
38 struct dm_rf_calibration_struct *cali_info = &dm->rf_calibrate_info;
41 if ((data % 2) != 0) { /*odd->positive*/
43 odm_set_rf_reg(dm, e_rf_path, REG_RF_TX_GAIN_OFFSET, BIT(19),
46 } else { /*even->negative*/
47 odm_set_rf_reg(dm, e_rf_path, REG_RF_TX_GAIN_OFFSET, BIT(19),
51 ODM_RT_TRACE(dm, ODM_COMP_MP, "%s(): RF_0x55[19]= %d\n", __func__,
55 odm_set_rf_reg(dm, e_rf_path, REG_RF_TX_GAIN_OFFSET, BIT(14),
57 odm_set_rf_reg(dm, e_rf_path, REG_RF_TX_GAIN_OFFSET,
58 BIT(17) | BIT(16) | BIT(15), 0);
59 cali_info->kfree_offset[e_rf_path] = 0;
62 odm_set_rf_reg(dm, e_rf_path, REG_RF_TX_GAIN_OFFSET, BIT(14),
64 odm_set_rf_reg(dm, e_rf_path, REG_RF_TX_GAIN_OFFSET,
65 BIT(17) | BIT(16) | BIT(15), 0);
66 cali_info->kfree_offset[e_rf_path] = 0;
69 odm_set_rf_reg(dm, e_rf_path, REG_RF_TX_GAIN_OFFSET, BIT(14),
71 odm_set_rf_reg(dm, e_rf_path, REG_RF_TX_GAIN_OFFSET,
72 BIT(17) | BIT(16) | BIT(15), 1);
73 cali_info->kfree_offset[e_rf_path] = 1;
76 odm_set_rf_reg(dm, e_rf_path, REG_RF_TX_GAIN_OFFSET, BIT(14),
78 odm_set_rf_reg(dm, e_rf_path, REG_RF_TX_GAIN_OFFSET,
79 BIT(17) | BIT(16) | BIT(15), 1);
80 cali_info->kfree_offset[e_rf_path] = 1;
83 odm_set_rf_reg(dm, e_rf_path, REG_RF_TX_GAIN_OFFSET, BIT(14),
85 odm_set_rf_reg(dm, e_rf_path, REG_RF_TX_GAIN_OFFSET,
86 BIT(17) | BIT(16) | BIT(15), 2);
87 cali_info->kfree_offset[e_rf_path] = 2;
90 odm_set_rf_reg(dm, e_rf_path, REG_RF_TX_GAIN_OFFSET, BIT(14),
92 odm_set_rf_reg(dm, e_rf_path, REG_RF_TX_GAIN_OFFSET,
93 BIT(17) | BIT(16) | BIT(15), 2);
94 cali_info->kfree_offset[e_rf_path] = 2;
97 odm_set_rf_reg(dm, e_rf_path, REG_RF_TX_GAIN_OFFSET, BIT(14),
99 odm_set_rf_reg(dm, e_rf_path, REG_RF_TX_GAIN_OFFSET,
100 BIT(17) | BIT(16) | BIT(15), 3);
101 cali_info->kfree_offset[e_rf_path] = 3;
104 odm_set_rf_reg(dm, e_rf_path, REG_RF_TX_GAIN_OFFSET, BIT(14),
106 odm_set_rf_reg(dm, e_rf_path, REG_RF_TX_GAIN_OFFSET,
107 BIT(17) | BIT(16) | BIT(15), 3);
108 cali_info->kfree_offset[e_rf_path] = 3;
111 odm_set_rf_reg(dm, e_rf_path, REG_RF_TX_GAIN_OFFSET, BIT(14),
113 odm_set_rf_reg(dm, e_rf_path, REG_RF_TX_GAIN_OFFSET,
114 BIT(17) | BIT(16) | BIT(15), 4);
115 cali_info->kfree_offset[e_rf_path] = 4;
118 odm_set_rf_reg(dm, e_rf_path, REG_RF_TX_GAIN_OFFSET, BIT(14),
120 odm_set_rf_reg(dm, e_rf_path, REG_RF_TX_GAIN_OFFSET,
121 BIT(17) | BIT(16) | BIT(15), 4);
122 cali_info->kfree_offset[e_rf_path] = 4;
125 odm_set_rf_reg(dm, e_rf_path, REG_RF_TX_GAIN_OFFSET, BIT(14),
127 odm_set_rf_reg(dm, e_rf_path, REG_RF_TX_GAIN_OFFSET,
128 BIT(17) | BIT(16) | BIT(15), 5);
129 cali_info->kfree_offset[e_rf_path] = 5;
137 /*that means Kfree offset is negative, we need to record it.*/
138 cali_info->kfree_offset[e_rf_path] =
139 (-1) * cali_info->kfree_offset[e_rf_path];
140 ODM_RT_TRACE(dm, ODM_COMP_MP, "%s(): kfree_offset = %d\n",
141 __func__, cali_info->kfree_offset[e_rf_path]);
143 ODM_RT_TRACE(dm, ODM_COMP_MP, "%s(): kfree_offset = %d\n",
144 __func__, cali_info->kfree_offset[e_rf_path]);
148 static void phydm_set_kfree_to_rf(void *dm_void, u8 e_rf_path, u8 data)
150 struct phy_dm_struct *dm = (struct phy_dm_struct *)dm_void;
152 if (dm->support_ic_type & ODM_RTL8814A)
153 phydm_set_kfree_to_rf_8814a(dm, e_rf_path, data);
156 void phydm_config_kfree(void *dm_void, u8 channel_to_sw, u8 *kfree_table)
158 struct phy_dm_struct *dm = (struct phy_dm_struct *)dm_void;
159 struct dm_rf_calibration_struct *cali_info = &dm->rf_calibrate_info;
160 u8 rfpath = 0, max_rf_path = 0;
163 if (dm->support_ic_type & ODM_RTL8814A)
164 max_rf_path = 4; /*0~3*/
165 else if (dm->support_ic_type &
166 (ODM_RTL8812 | ODM_RTL8192E | ODM_RTL8822B))
167 max_rf_path = 2; /*0~1*/
171 ODM_RT_TRACE(dm, ODM_COMP_MP, "===>%s()\n", __func__);
173 if (cali_info->reg_rf_kfree_enable == 2) {
174 ODM_RT_TRACE(dm, ODM_COMP_MP,
175 "%s(): reg_rf_kfree_enable == 2, Disable\n",
180 if (cali_info->reg_rf_kfree_enable != 1 &&
181 cali_info->reg_rf_kfree_enable != 0) {
182 ODM_RT_TRACE(dm, ODM_COMP_MP, "<===%s()\n", __func__);
186 ODM_RT_TRACE(dm, ODM_COMP_MP, "%s(): reg_rf_kfree_enable == true\n",
188 /*Make sure the targetval is defined*/
189 if (((cali_info->reg_rf_kfree_enable == 1) &&
190 (kfree_table[0] != 0xFF)) ||
191 cali_info->rf_kfree_enable) {
192 /*if kfree_table[0] == 0xff, means no Kfree*/
193 if (*dm->band_type == ODM_BAND_2_4G) {
194 if (channel_to_sw <= 14 && channel_to_sw >= 1)
195 channel_idx = PHYDM_2G;
196 } else if (*dm->band_type == ODM_BAND_5G) {
197 if (channel_to_sw >= 36 && channel_to_sw <= 48)
198 channel_idx = PHYDM_5GLB1;
199 if (channel_to_sw >= 52 && channel_to_sw <= 64)
200 channel_idx = PHYDM_5GLB2;
201 if (channel_to_sw >= 100 && channel_to_sw <= 120)
202 channel_idx = PHYDM_5GMB1;
203 if (channel_to_sw >= 124 && channel_to_sw <= 144)
204 channel_idx = PHYDM_5GMB2;
205 if (channel_to_sw >= 149 && channel_to_sw <= 177)
206 channel_idx = PHYDM_5GHB;
209 for (rfpath = ODM_RF_PATH_A; rfpath < max_rf_path; rfpath++) {
210 ODM_RT_TRACE(dm, ODM_COMP_MP, "%s(): PATH_%d: %#x\n",
212 kfree_table[channel_idx * max_rf_path +
214 phydm_set_kfree_to_rf(
216 kfree_table[channel_idx * max_rf_path +
222 "%s(): targetval not defined, Don't execute KFree Process.\n",
227 ODM_RT_TRACE(dm, ODM_COMP_MP, "<===%s()\n", __func__);