1 /******************************************************************************
3 * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
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 * You should have received a copy of the GNU General Public License along with
15 * this program; if not, write to the Free Software Foundation, Inc.,
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
19 ******************************************************************************/
21 #include "mp_precomp.h"
22 #include "../phydm_precomp.h"
26 /*---------------------------Define Local Constant---------------------------*/
28 #define IQK_DELAY_TIME_8703B 10
29 #define LCK_DELAY_TIME_8703B 100
32 #define REG_LTECOEX_CTRL 0x07C0
33 #define REG_LTECOEX_WRITE_DATA 0x07C4
34 #define REG_LTECOEX_READ_DATA 0x07C8
35 #define REG_LTECOEX_PATH_CONTROL 0x70
39 /* 2010/04/25 MH Define the max tx power tracking tx agc power. */
40 #define ODM_TXPWRTRACK_MAX_IDX8703B 6
52 /*---------------------------Define Local Constant---------------------------*/
55 /* 3============================================================
57 * 3============================================================ */
60 void set_iqk_matrix_8703b(
61 struct PHY_DM_STRUCT *p_dm_odm,
68 s32 ele_A = 0, ele_D = 0, ele_C = 0, value32, tmp;
69 s32 ele_A_ext = 0, ele_C_ext = 0, ele_D_ext = 0;
71 rf_path = ODM_RF_PATH_A;
74 if (OFDM_index >= OFDM_TABLE_SIZE)
75 OFDM_index = OFDM_TABLE_SIZE - 1;
76 else if (OFDM_index < 0)
79 if ((iqk_result_x != 0) && (*(p_dm_odm->p_band_type) == ODM_BAND_2_4G)) {
82 ele_D = (ofdm_swing_table_new[OFDM_index] & 0xFFC00000) >> 22;
83 ele_D_ext = (((iqk_result_x * ele_D) >> 7) & 0x01);
86 if ((iqk_result_x & 0x00000200) != 0) /* consider minus */
87 iqk_result_x = iqk_result_x | 0xFFFFFC00;
88 ele_A = ((iqk_result_x * ele_D) >> 8) & 0x000003FF;
89 ele_A_ext = ((iqk_result_x * ele_D) >> 7) & 0x1;
91 if ((iqk_result_y & 0x00000200) != 0)
92 iqk_result_y = iqk_result_y | 0xFFFFFC00;
93 ele_C = ((iqk_result_y * ele_D) >> 8) & 0x000003FF;
94 ele_C_ext = ((iqk_result_y * ele_D) >> 7) & 0x1;
98 /* write new elements A, C, D to regC80, regC94, reg0xc4c, and element B is always 0 */
100 value32 = (ele_D << 22) | ((ele_C & 0x3F) << 16) | ele_A;
101 odm_set_bb_reg(p_dm_odm, REG_OFDM_0_XA_TX_IQ_IMBALANCE, MASKDWORD, value32);
103 value32 = (ele_C & 0x000003C0) >> 6;
104 odm_set_bb_reg(p_dm_odm, REG_OFDM_0_XC_TX_AFE, MASKH4BITS, value32);
106 value32 = (ele_D_ext << 28) | (ele_A_ext << 31) | (ele_C_ext << 29);
107 value32 = (odm_get_bb_reg(p_dm_odm, REG_OFDM_0_ECCA_THRESHOLD, MASKDWORD) & (~(BIT(31) | BIT(29) | BIT(28)))) | value32;
108 odm_set_bb_reg(p_dm_odm, REG_OFDM_0_ECCA_THRESHOLD, MASKDWORD, value32);
111 /* write new elements A, C, D to regC88, regC9C, regC4C, and element B is always 0 */
113 value32 = (ele_D << 22) | ((ele_C & 0x3F) << 16) | ele_A;
114 odm_set_bb_reg(p_dm_odm, REG_OFDM_0_XB_TX_IQ_IMBALANCE, MASKDWORD, value32);
116 value32 = (ele_C & 0x000003C0) >> 6;
117 odm_set_bb_reg(p_dm_odm, REG_OFDM_0_XD_TX_AFE, MASKH4BITS, value32);
119 value32 = (ele_D_ext << 24) | (ele_A_ext << 27) | (ele_C_ext << 25);
120 value32 = (odm_get_bb_reg(p_dm_odm, REG_OFDM_0_ECCA_THRESHOLD, MASKDWORD) & (~(BIT(24) | BIT(27) | BIT(25)))) | value32;
121 odm_set_bb_reg(p_dm_odm, REG_OFDM_0_ECCA_THRESHOLD, MASKDWORD, value32);
129 odm_set_bb_reg(p_dm_odm, REG_OFDM_0_XA_TX_IQ_IMBALANCE, MASKDWORD, ofdm_swing_table_new[OFDM_index]);
130 odm_set_bb_reg(p_dm_odm, REG_OFDM_0_XC_TX_AFE, MASKH4BITS, 0x00);
131 value32 = odm_get_bb_reg(p_dm_odm, REG_OFDM_0_ECCA_THRESHOLD, MASKDWORD) & (~(BIT(31) | BIT(29) | BIT(28)));
132 odm_set_bb_reg(p_dm_odm, REG_OFDM_0_ECCA_THRESHOLD, MASKDWORD, value32);
136 odm_set_bb_reg(p_dm_odm, REG_OFDM_0_XB_TX_IQ_IMBALANCE, MASKDWORD, ofdm_swing_table_new[OFDM_index]);
137 odm_set_bb_reg(p_dm_odm, REG_OFDM_0_XD_TX_AFE, MASKH4BITS, 0x00);
138 value32 = odm_get_bb_reg(p_dm_odm, REG_OFDM_0_ECCA_THRESHOLD, MASKDWORD) & (~(BIT(24) | BIT(27) | BIT(25)));
139 odm_set_bb_reg(p_dm_odm, REG_OFDM_0_ECCA_THRESHOLD, MASKDWORD, value32);
147 ODM_RT_TRACE(p_dm_odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, ("TxPwrTracking path %c: X = 0x%x, Y = 0x%x ele_A = 0x%x ele_C = 0x%x ele_D = 0x%x ele_A_ext = 0x%x ele_C_ext = 0x%x ele_D_ext = 0x%x\n",
148 (rf_path == ODM_RF_PATH_A ? 'A' : 'B'), (u32)iqk_result_x, (u32)iqk_result_y, (u32)ele_A, (u32)ele_C, (u32)ele_D, (u32)ele_A_ext, (u32)ele_C_ext, (u32)ele_D_ext));
152 set_cck_filter_coefficient_8703b(
153 struct PHY_DM_STRUCT *p_dm_odm,
157 odm_write_1byte(p_dm_odm, 0xa22, cck_swing_table_ch1_ch14_88f[cck_swing_index][0]);
158 odm_write_1byte(p_dm_odm, 0xa23, cck_swing_table_ch1_ch14_88f[cck_swing_index][1]);
159 odm_write_1byte(p_dm_odm, 0xa24, cck_swing_table_ch1_ch14_88f[cck_swing_index][2]);
160 odm_write_1byte(p_dm_odm, 0xa25, cck_swing_table_ch1_ch14_88f[cck_swing_index][3]);
161 odm_write_1byte(p_dm_odm, 0xa26, cck_swing_table_ch1_ch14_88f[cck_swing_index][4]);
162 odm_write_1byte(p_dm_odm, 0xa27, cck_swing_table_ch1_ch14_88f[cck_swing_index][5]);
163 odm_write_1byte(p_dm_odm, 0xa28, cck_swing_table_ch1_ch14_88f[cck_swing_index][6]);
164 odm_write_1byte(p_dm_odm, 0xa29, cck_swing_table_ch1_ch14_88f[cck_swing_index][7]);
165 odm_write_1byte(p_dm_odm, 0xa9a, cck_swing_table_ch1_ch14_88f[cck_swing_index][8]);
166 odm_write_1byte(p_dm_odm, 0xa9b, cck_swing_table_ch1_ch14_88f[cck_swing_index][9]);
167 odm_write_1byte(p_dm_odm, 0xa9c, cck_swing_table_ch1_ch14_88f[cck_swing_index][10]);
168 odm_write_1byte(p_dm_odm, 0xa9d, cck_swing_table_ch1_ch14_88f[cck_swing_index][11]);
169 odm_write_1byte(p_dm_odm, 0xaa0, cck_swing_table_ch1_ch14_88f[cck_swing_index][12]);
170 odm_write_1byte(p_dm_odm, 0xaa1, cck_swing_table_ch1_ch14_88f[cck_swing_index][13]);
171 odm_write_1byte(p_dm_odm, 0xaa2, cck_swing_table_ch1_ch14_88f[cck_swing_index][14]);
172 odm_write_1byte(p_dm_odm, 0xaa3, cck_swing_table_ch1_ch14_88f[cck_swing_index][15]);
177 u8 delta_thermal_index,
182 struct PHY_DM_STRUCT *p_dm_odm = (struct PHY_DM_STRUCT *)p_dm_void;
184 #if !(DM_ODM_SUPPORT_TYPE & ODM_AP)
185 struct _ADAPTER *adapter = p_dm_odm->adapter;
188 odm_reset_iqk_result(p_dm_odm);
191 p_dm_odm->rf_calibrate_info.thermal_value_iqk = thermal_value;
192 #if (DM_ODM_SUPPORT_TYPE & ODM_AP)
193 phy_iq_calibrate_8703b(p_dm_odm, false);
195 phy_iq_calibrate_8703b(adapter, false);
201 /*-----------------------------------------------------------------------------
202 * Function: odm_TxPwrTrackSetPwr88E()
204 * Overview: 88E change all channel tx power accordign to flag.
205 * OFDM & CCK are all different.
215 * 04/23/2012 MHC Create version 0.
217 *---------------------------------------------------------------------------*/
219 odm_tx_pwr_track_set_pwr_8703b(
221 enum pwrtrack_method method,
223 u8 channel_mapped_index
226 struct PHY_DM_STRUCT *p_dm_odm = (struct PHY_DM_STRUCT *)p_dm_void;
227 struct _ADAPTER *adapter = p_dm_odm->adapter;
228 PHAL_DATA_TYPE p_hal_data = GET_HAL_DATA(adapter);
229 u8 pwr_tracking_limit_ofdm = 34; /* +0dB */
230 u8 pwr_tracking_limit_cck = CCK_TABLE_SIZE_88F - 1; /* -2dB */
232 u8 final_ofdm_swing_index = 0;
233 u8 final_cck_swing_index = 0;
234 struct odm_rf_calibration_structure *p_rf_calibrate_info = &(p_dm_odm->rf_calibrate_info);
236 #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN))
237 #if (MP_DRIVER == 1) /*win MP */
238 PMPT_CONTEXT p_mpt_ctx = &(adapter->MptCtx);
240 tx_rate = MptToMgntRate(p_mpt_ctx->MptRateIndex);
242 PMGNT_INFO p_mgnt_info = &(adapter->MgntInfo);
243 if (!p_mgnt_info->ForcedDataRate) { /*auto rate*/
244 tx_rate = adapter->HalFunc.GetHwRateFromMRateHandler(p_dm_odm->tx_rate);
246 tx_rate = (u8) p_mgnt_info->ForcedDataRate;
248 #elif (DM_ODM_SUPPORT_TYPE & (ODM_CE))
249 if (p_dm_odm->mp_mode == true) { /*CE MP*/
250 PMPT_CONTEXT p_mpt_ctx = &(adapter->mppriv.mpt_ctx);
252 tx_rate = mpt_to_mgnt_rate(p_mpt_ctx->mpt_rate_index);
253 } else { /*CE normal*/
254 u16 rate = *(p_dm_odm->p_forced_data_rate);
256 if (!rate) { /*auto rate*/
257 if (p_dm_odm->number_linked_client != 0)
258 tx_rate = hw_rate_to_m_rate(p_dm_odm->tx_rate);
259 } else /*force rate*/
265 ODM_RT_TRACE(p_dm_odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, ("===>ODM_TxPwrTrackSetPwr8703B\n"));
267 if (tx_rate != 0xFF) {
269 if (((tx_rate >= MGN_1M) && (tx_rate <= MGN_5_5M)) || (tx_rate == MGN_11M))
270 pwr_tracking_limit_cck = CCK_TABLE_SIZE_88F - 1;
272 else if ((tx_rate >= MGN_6M) && (tx_rate <= MGN_48M))
273 pwr_tracking_limit_ofdm = 36; /*+3dB*/
274 else if (tx_rate == MGN_54M)
275 pwr_tracking_limit_ofdm = 34; /*+2dB*/
277 else if ((tx_rate >= MGN_MCS0) && (tx_rate <= MGN_MCS2)) /*QPSK/BPSK*/
278 pwr_tracking_limit_ofdm = 38; /*+4dB*/
279 else if ((tx_rate >= MGN_MCS3) && (tx_rate <= MGN_MCS4)) /*16QAM*/
280 pwr_tracking_limit_ofdm = 36; /*+3dB*/
281 else if ((tx_rate >= MGN_MCS5) && (tx_rate <= MGN_MCS7)) /*64QAM*/
282 pwr_tracking_limit_ofdm = 34; /*+2dB*/
284 pwr_tracking_limit_ofdm = p_rf_calibrate_info->default_ofdm_index; /*Default OFDM index = 30*/
286 ODM_RT_TRACE(p_dm_odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, ("tx_rate=0x%x, pwr_tracking_limit=%d\n", tx_rate, pwr_tracking_limit_ofdm));
288 if (method == TXAGC) {
289 u32 pwr = 0, tx_agc = 0;
290 struct _ADAPTER *adapter = p_dm_odm->adapter;
292 ODM_RT_TRACE(p_dm_odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, ("odm_TxPwrTrackSetPwr8703B CH=%d\n", *(p_dm_odm->p_channel)));
294 p_rf_calibrate_info->remnant_ofdm_swing_idx[rf_path] = p_rf_calibrate_info->absolute_ofdm_swing_idx[rf_path];
296 #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN | ODM_CE))
298 p_rf_calibrate_info->modify_tx_agc_flag_path_a = true;
299 p_rf_calibrate_info->modify_tx_agc_flag_path_a_cck = true;
301 odm_set_tx_power_index_by_rate_section(p_dm_odm, rf_path, *p_dm_odm->p_channel, CCK);
302 odm_set_tx_power_index_by_rate_section(p_dm_odm, rf_path, *p_dm_odm->p_channel, OFDM);
303 odm_set_tx_power_index_by_rate_section(p_dm_odm, rf_path, *p_dm_odm->p_channel, HT_MCS0_MCS7);
305 pwr = odm_get_bb_reg(p_dm_odm, REG_TX_AGC_A_RATE18_06, 0xFF);
306 pwr += p_rf_calibrate_info->power_index_offset[rf_path];
307 odm_set_bb_reg(p_dm_odm, REG_TX_AGC_A_CCK_1_MCS32, MASKBYTE1, pwr);
308 tx_agc = (pwr << 16) | (pwr << 8) | (pwr);
309 odm_set_bb_reg(p_dm_odm, REG_TX_AGC_B_CCK_11_A_CCK_2_11, 0xffffff00, tx_agc);
310 RT_DISP(FPHY, PHY_TXPWR, ("ODM_TxPwrTrackSetPwr8703B: CCK Tx-rf(A) Power = 0x%x\n", tx_agc));
312 pwr = odm_get_bb_reg(p_dm_odm, REG_TX_AGC_A_RATE18_06, 0xFF);
313 pwr += (p_rf_calibrate_info->bb_swing_idx_ofdm[rf_path] - p_rf_calibrate_info->bb_swing_idx_ofdm_base[rf_path]);
314 tx_agc |= ((pwr << 24) | (pwr << 16) | (pwr << 8) | pwr);
315 odm_set_bb_reg(p_dm_odm, REG_TX_AGC_A_RATE18_06, MASKDWORD, tx_agc);
316 odm_set_bb_reg(p_dm_odm, REG_TX_AGC_A_RATE54_24, MASKDWORD, tx_agc);
317 odm_set_bb_reg(p_dm_odm, REG_TX_AGC_A_MCS03_MCS00, MASKDWORD, tx_agc);
318 odm_set_bb_reg(p_dm_odm, REG_TX_AGC_A_MCS07_MCS04, MASKDWORD, tx_agc);
319 odm_set_bb_reg(p_dm_odm, REG_TX_AGC_A_MCS11_MCS08, MASKDWORD, tx_agc);
320 odm_set_bb_reg(p_dm_odm, REG_TX_AGC_A_MCS15_MCS12, MASKDWORD, tx_agc);
321 RT_DISP(FPHY, PHY_TXPWR, ("ODM_TxPwrTrackSetPwr8703B: OFDM Tx-rf(A) Power = 0x%x\n", tx_agc));
324 } else if (method == BBSWING) {
325 final_ofdm_swing_index = p_rf_calibrate_info->default_ofdm_index + p_rf_calibrate_info->absolute_ofdm_swing_idx[rf_path];
326 final_cck_swing_index = p_rf_calibrate_info->default_cck_index + p_rf_calibrate_info->absolute_ofdm_swing_idx[rf_path];
328 ODM_RT_TRACE(p_dm_odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,
329 (" p_rf_calibrate_info->default_ofdm_index=%d, p_rf_calibrate_info->DefaultCCKIndex=%d, p_rf_calibrate_info->absolute_ofdm_swing_idx[rf_path]=%d, p_rf_calibrate_info->remnant_cck_swing_idx=%d rf_path = %d\n",
330 p_rf_calibrate_info->default_ofdm_index, p_rf_calibrate_info->default_cck_index, p_rf_calibrate_info->absolute_ofdm_swing_idx[rf_path], p_rf_calibrate_info->remnant_cck_swing_idx, rf_path));
332 /* Adjust BB swing by OFDM IQ matrix */
333 if (final_ofdm_swing_index >= pwr_tracking_limit_ofdm)
334 final_ofdm_swing_index = pwr_tracking_limit_ofdm;
335 else if (final_ofdm_swing_index < 0)
336 final_ofdm_swing_index = 0;
338 if (final_cck_swing_index >= CCK_TABLE_SIZE)
339 final_cck_swing_index = CCK_TABLE_SIZE - 1;
340 else if (p_rf_calibrate_info->bb_swing_idx_cck < 0)
341 final_cck_swing_index = 0;
343 set_iqk_matrix_8703b(p_dm_odm, final_ofdm_swing_index, ODM_RF_PATH_A,
344 p_rf_calibrate_info->iqk_matrix_reg_setting[channel_mapped_index].value[0][0],
345 p_rf_calibrate_info->iqk_matrix_reg_setting[channel_mapped_index].value[0][1]);
347 set_cck_filter_coefficient_8703b(p_dm_odm, final_cck_swing_index);
349 } else if (method == MIX_MODE) {
350 ODM_RT_TRACE(p_dm_odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,
351 (" p_dm_odm->default_ofdm_index=%d, p_dm_odm->DefaultCCKIndex=%d, p_dm_odm->absolute_ofdm_swing_idx[rf_path]=%d, p_dm_odm->remnant_cck_swing_idx=%d rf_path = %d\n",
352 p_rf_calibrate_info->default_ofdm_index, p_rf_calibrate_info->default_cck_index, p_rf_calibrate_info->absolute_ofdm_swing_idx[rf_path], p_rf_calibrate_info->remnant_cck_swing_idx, rf_path));
354 final_ofdm_swing_index = p_rf_calibrate_info->default_ofdm_index + p_rf_calibrate_info->absolute_ofdm_swing_idx[rf_path];
355 final_cck_swing_index = p_rf_calibrate_info->default_cck_index + p_rf_calibrate_info->absolute_ofdm_swing_idx[rf_path];
357 ODM_RT_TRACE(p_dm_odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,
358 (" p_dm_odm->default_ofdm_index=%d, p_dm_odm->DefaultCCKIndex=%d, p_dm_odm->absolute_ofdm_swing_idx[rf_path]=%d rf_path = %d\n",
359 p_rf_calibrate_info->default_ofdm_index, p_rf_calibrate_info->default_cck_index, p_rf_calibrate_info->absolute_ofdm_swing_idx[rf_path], rf_path));
361 ODM_RT_TRACE(p_dm_odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,
362 (" final_ofdm_swing_index=%d, final_cck_swing_index=%d rf_path=%d\n",
363 final_ofdm_swing_index, final_cck_swing_index, rf_path));
366 if (final_ofdm_swing_index > pwr_tracking_limit_ofdm) { /*BBSwing higher then Limit*/
367 p_rf_calibrate_info->remnant_ofdm_swing_idx[rf_path] = final_ofdm_swing_index - pwr_tracking_limit_ofdm;
369 set_iqk_matrix_8703b(p_dm_odm, pwr_tracking_limit_ofdm, ODM_RF_PATH_A,
370 p_rf_calibrate_info->iqk_matrix_reg_setting[channel_mapped_index].value[0][0],
371 p_rf_calibrate_info->iqk_matrix_reg_setting[channel_mapped_index].value[0][1]);
373 p_rf_calibrate_info->modify_tx_agc_flag_path_a = true;
374 odm_set_tx_power_index_by_rate_section(p_dm_odm, rf_path, *p_dm_odm->p_channel, OFDM);
375 odm_set_tx_power_index_by_rate_section(p_dm_odm, rf_path, *p_dm_odm->p_channel, HT_MCS0_MCS7);
377 ODM_RT_TRACE(p_dm_odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,
378 (" ******Path_A Over BBSwing Limit, pwr_tracking_limit = %d, Remnant tx_agc value = %d\n",
379 pwr_tracking_limit_ofdm, p_rf_calibrate_info->remnant_ofdm_swing_idx[rf_path]));
380 } else if (final_ofdm_swing_index < 0) {
381 p_rf_calibrate_info->remnant_ofdm_swing_idx[rf_path] = final_ofdm_swing_index;
383 set_iqk_matrix_8703b(p_dm_odm, 0, ODM_RF_PATH_A,
384 p_rf_calibrate_info->iqk_matrix_reg_setting[channel_mapped_index].value[0][0],
385 p_rf_calibrate_info->iqk_matrix_reg_setting[channel_mapped_index].value[0][1]);
387 p_rf_calibrate_info->modify_tx_agc_flag_path_a = true;
388 odm_set_tx_power_index_by_rate_section(p_dm_odm, rf_path, *p_dm_odm->p_channel, OFDM);
389 odm_set_tx_power_index_by_rate_section(p_dm_odm, rf_path, *p_dm_odm->p_channel, HT_MCS0_MCS7);
391 ODM_RT_TRACE(p_dm_odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,
392 (" ******Path_A Lower then BBSwing lower bound 0, Remnant tx_agc value = %d\n",
393 p_rf_calibrate_info->remnant_ofdm_swing_idx[rf_path]));
395 set_iqk_matrix_8703b(p_dm_odm, final_ofdm_swing_index, ODM_RF_PATH_A,
396 p_rf_calibrate_info->iqk_matrix_reg_setting[channel_mapped_index].value[0][0],
397 p_rf_calibrate_info->iqk_matrix_reg_setting[channel_mapped_index].value[0][1]);
399 ODM_RT_TRACE(p_dm_odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,
400 (" ******Path_A Compensate with BBSwing, final_ofdm_swing_index = %d\n", final_ofdm_swing_index));
402 if (p_rf_calibrate_info->modify_tx_agc_flag_path_a) { /*If tx_agc has changed, reset tx_agc again*/
403 p_rf_calibrate_info->remnant_ofdm_swing_idx[rf_path] = 0;
404 odm_set_tx_power_index_by_rate_section(p_dm_odm, rf_path, *p_dm_odm->p_channel, OFDM);
405 odm_set_tx_power_index_by_rate_section(p_dm_odm, rf_path, *p_dm_odm->p_channel, HT_MCS0_MCS7);
406 p_rf_calibrate_info->modify_tx_agc_flag_path_a = false;
408 ODM_RT_TRACE(p_dm_odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,
409 (" ******Path_A p_dm_odm->Modify_TxAGC_Flag = false\n"));
412 if (final_cck_swing_index > pwr_tracking_limit_cck) {
413 ODM_RT_TRACE(p_dm_odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,
414 (" final_cck_swing_index(%d) > pwr_tracking_limit_cck(%d)\n", final_cck_swing_index, pwr_tracking_limit_cck));
416 p_rf_calibrate_info->remnant_cck_swing_idx = final_cck_swing_index - pwr_tracking_limit_cck;
418 set_cck_filter_coefficient_8703b(p_dm_odm, pwr_tracking_limit_cck);
420 ODM_RT_TRACE(p_dm_odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, ("******Path_A CCK Over Limit, pwr_tracking_limit_cck = %d, p_dm_odm->remnant_cck_swing_idx = %d\n", pwr_tracking_limit_cck, p_rf_calibrate_info->remnant_cck_swing_idx));
422 p_rf_calibrate_info->modify_tx_agc_flag_path_a_cck = true;
424 odm_set_tx_power_index_by_rate_section(p_dm_odm, ODM_RF_PATH_A, *p_dm_odm->p_channel, CCK);
426 } else if (final_cck_swing_index < 0) { /* Lowest CCK index = 0 */
428 ODM_RT_TRACE(p_dm_odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,
429 (" final_cck_swing_index(%d) < 0 pwr_tracking_limit_cck(%d)\n", final_cck_swing_index, pwr_tracking_limit_cck));
431 p_rf_calibrate_info->remnant_cck_swing_idx = final_cck_swing_index;
433 set_cck_filter_coefficient_8703b(p_dm_odm, 0);
435 ODM_RT_TRACE(p_dm_odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, ("******Path_A CCK Under Limit, pwr_tracking_limit_cck = %d, p_dm_odm->remnant_cck_swing_idx = %d\n", 0, p_rf_calibrate_info->remnant_cck_swing_idx));
437 p_rf_calibrate_info->modify_tx_agc_flag_path_a_cck = true;
439 odm_set_tx_power_index_by_rate_section(p_dm_odm, ODM_RF_PATH_A, *p_dm_odm->p_channel, CCK);
443 ODM_RT_TRACE(p_dm_odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,
444 (" else final_cck_swing_index=%d pwr_tracking_limit_cck(%d)\n", final_cck_swing_index, pwr_tracking_limit_cck));
446 set_cck_filter_coefficient_8703b(p_dm_odm, final_cck_swing_index);
448 ODM_RT_TRACE(p_dm_odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, ("******Path_A CCK Compensate with BBSwing, final_cck_swing_index = %d\n", final_cck_swing_index));
450 p_rf_calibrate_info->modify_tx_agc_flag_path_a_cck = false;
452 p_rf_calibrate_info->remnant_cck_swing_idx = 0;
454 if (p_rf_calibrate_info->modify_tx_agc_flag_path_a_cck) { /*If tx_agc has changed, reset tx_agc again*/
455 p_rf_calibrate_info->remnant_cck_swing_idx = 0;
456 odm_set_tx_power_index_by_rate_section(p_dm_odm, ODM_RF_PATH_A, *p_dm_odm->p_channel, CCK);
457 p_rf_calibrate_info->modify_tx_agc_flag_path_a_cck = false;
465 return; /* This method is not supported. */
470 get_delta_swing_table_8703b(
472 u8 **temperature_up_a,
473 u8 **temperature_down_a,
474 u8 **temperature_up_b,
475 u8 **temperature_down_b
478 struct PHY_DM_STRUCT *p_dm_odm = (struct PHY_DM_STRUCT *)p_dm_void;
479 struct _ADAPTER *adapter = p_dm_odm->adapter;
480 struct odm_rf_calibration_structure *p_rf_calibrate_info = &(p_dm_odm->rf_calibrate_info);
481 HAL_DATA_TYPE *p_hal_data = GET_HAL_DATA(adapter);
483 u8 channel = *p_dm_odm->p_channel;
486 if (p_dm_odm->mp_mode == true) {
487 #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN | ODM_CE))
488 #if (DM_ODM_SUPPORT_TYPE & ODM_WIN)
490 PMPT_CONTEXT p_mpt_ctx = &(adapter->MptCtx);
492 tx_rate = MptToMgntRate(p_mpt_ctx->MptRateIndex);
494 #elif (DM_ODM_SUPPORT_TYPE & ODM_CE)
495 PMPT_CONTEXT p_mpt_ctx = &(adapter->mppriv.mpt_ctx);
497 tx_rate = mpt_to_mgnt_rate(p_mpt_ctx->mpt_rate_index);
501 u16 rate = *(p_dm_odm->p_forced_data_rate);
503 if (!rate) { /*auto rate*/
504 #if (DM_ODM_SUPPORT_TYPE & ODM_WIN)
505 tx_rate = adapter->HalFunc.GetHwRateFromMRateHandler(p_dm_odm->tx_rate);
506 #elif (DM_ODM_SUPPORT_TYPE & ODM_CE)
507 if (p_dm_odm->number_linked_client != 0)
508 tx_rate = hw_rate_to_m_rate(p_dm_odm->tx_rate);
510 } else /*force rate*/
514 ODM_RT_TRACE(p_dm_odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, ("Power Tracking tx_rate=0x%X\n", tx_rate));
516 if (1 <= channel && channel <= 14) {
517 if (IS_CCK_RATE(tx_rate)) {
518 *temperature_up_a = p_rf_calibrate_info->delta_swing_table_idx_2g_cck_a_p;
519 *temperature_down_a = p_rf_calibrate_info->delta_swing_table_idx_2g_cck_a_n;
520 *temperature_up_b = p_rf_calibrate_info->delta_swing_table_idx_2g_cck_b_p;
521 *temperature_down_b = p_rf_calibrate_info->delta_swing_table_idx_2g_cck_b_n;
523 *temperature_up_a = p_rf_calibrate_info->delta_swing_table_idx_2ga_p;
524 *temperature_down_a = p_rf_calibrate_info->delta_swing_table_idx_2ga_n;
525 *temperature_up_b = p_rf_calibrate_info->delta_swing_table_idx_2gb_p;
526 *temperature_down_b = p_rf_calibrate_info->delta_swing_table_idx_2gb_n;
529 *temperature_up_a = (u8 *)delta_swing_table_idx_2ga_p_8188e;
530 *temperature_down_a = (u8 *)delta_swing_table_idx_2ga_n_8188e;
531 *temperature_up_b = (u8 *)delta_swing_table_idx_2ga_p_8188e;
532 *temperature_down_b = (u8 *)delta_swing_table_idx_2ga_n_8188e;
541 get_delta_swing_xtal_table_8703b(
543 s8 **temperature_up_xtal,
544 s8 **temperature_down_xtal
547 struct PHY_DM_STRUCT *p_dm_odm = (struct PHY_DM_STRUCT *)p_dm_void;
548 struct odm_rf_calibration_structure *p_rf_calibrate_info = &(p_dm_odm->rf_calibrate_info);
550 *temperature_up_xtal = p_rf_calibrate_info->delta_swing_table_xtal_p;
551 *temperature_down_xtal = p_rf_calibrate_info->delta_swing_table_xtal_n;
557 odm_txxtaltrack_set_xtal_8703b(
561 struct PHY_DM_STRUCT *p_dm_odm = (struct PHY_DM_STRUCT *)p_dm_void;
562 struct odm_rf_calibration_structure *p_rf_calibrate_info = &(p_dm_odm->rf_calibrate_info);
563 struct _ADAPTER *adapter = p_dm_odm->adapter;
564 HAL_DATA_TYPE *p_hal_data = GET_HAL_DATA(adapter);
569 crystal_cap = p_hal_data->crystal_cap & 0x3F;
570 crystal_cap = crystal_cap + p_rf_calibrate_info->xtal_offset;
574 else if (crystal_cap > 63)
578 ODM_RT_TRACE(p_dm_odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,
579 ("crystal_cap(%d)= p_hal_data->crystal_cap(%d) + p_rf_calibrate_info->xtal_offset(%d)\n", crystal_cap, p_hal_data->crystal_cap, p_rf_calibrate_info->xtal_offset));
581 odm_set_bb_reg(p_dm_odm, REG_MAC_PHY_CTRL, 0xFFF000, (crystal_cap | (crystal_cap << 6)));
583 ODM_RT_TRACE(p_dm_odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD,
584 ("crystal_cap(0x2c) 0x%X\n", odm_get_bb_reg(p_dm_odm, REG_MAC_PHY_CTRL, 0xFFF000)));
591 void configure_txpower_track_8703b(
592 struct _TXPWRTRACK_CFG *p_config
595 p_config->swing_table_size_cck = CCK_TABLE_SIZE;
596 p_config->swing_table_size_ofdm = OFDM_TABLE_SIZE;
597 p_config->threshold_iqk = IQK_THRESHOLD;
598 p_config->average_thermal_num = AVG_THERMAL_NUM_8703B;
599 p_config->rf_path_count = MAX_PATH_NUM_8703B;
600 p_config->thermal_reg_addr = RF_T_METER_8703B;
602 p_config->odm_tx_pwr_track_set_pwr = odm_tx_pwr_track_set_pwr_8703b;
603 p_config->do_iqk = do_iqk_8703b;
604 p_config->phy_lc_calibrate = phy_lc_calibrate_8703b;
605 p_config->get_delta_swing_table = get_delta_swing_table_8703b;
606 p_config->get_delta_swing_xtal_table = get_delta_swing_xtal_table_8703b;
607 p_config->odm_txxtaltrack_set_xtal = odm_txxtaltrack_set_xtal_8703b;
613 #define MAX_TOLERANCE 5
614 #define IQK_DELAY_TIME 1 /* ms */
616 u8 /* bit0 = 1 => Tx OK, bit1 = 1 => Rx OK */
617 phy_path_a_iqk_8703b(
618 #if (DM_ODM_SUPPORT_TYPE & ODM_AP)
619 struct PHY_DM_STRUCT *p_dm_odm
621 struct _ADAPTER *p_adapter
625 u32 reg_eac, reg_e94, reg_e9c, tmp/*, reg_ea4*/;
626 u8 result = 0x00, ktime;
627 u32 original_path, original_gnt;
629 #if !(DM_ODM_SUPPORT_TYPE & ODM_AP)
630 HAL_DATA_TYPE *p_hal_data = GET_HAL_DATA(p_adapter);
631 #if (DM_ODM_SUPPORT_TYPE == ODM_CE)
632 struct PHY_DM_STRUCT *p_dm_odm = &p_hal_data->odmpriv;
634 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
635 struct PHY_DM_STRUCT *p_dm_odm = &p_hal_data->DM_OutSrc;
638 ODM_RT_TRACE(p_dm_odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("[IQK]TX IQK!\n"));
640 /*8703b IQK v2.0 20150713*/
643 odm_set_bb_reg(p_dm_odm, REG_TX_IQK, MASKDWORD, 0x01007c00);
644 odm_set_bb_reg(p_dm_odm, REG_RX_IQK, MASKDWORD, 0x01004800);
645 /*path-A IQK setting*/
646 odm_set_bb_reg(p_dm_odm, REG_TX_IQK_TONE_A, MASKDWORD, 0x18008c1c);
647 odm_set_bb_reg(p_dm_odm, REG_RX_IQK_TONE_A, MASKDWORD, 0x38008c1c);
648 odm_set_bb_reg(p_dm_odm, REG_TX_IQK_TONE_B, MASKDWORD, 0x38008c1c);
649 odm_set_bb_reg(p_dm_odm, REG_RX_IQK_TONE_B, MASKDWORD, 0x38008c1c);
650 /* odm_set_bb_reg(p_dm_odm, REG_TX_IQK_PI_A, MASKDWORD, 0x8214010a);*/
651 odm_set_bb_reg(p_dm_odm, REG_TX_IQK_PI_A, MASKDWORD, 0x8214030f);
652 odm_set_bb_reg(p_dm_odm, REG_RX_IQK_PI_A, MASKDWORD, 0x28110000);
653 odm_set_bb_reg(p_dm_odm, REG_TX_IQK_PI_B, MASKDWORD, 0x82110000);
654 odm_set_bb_reg(p_dm_odm, REG_RX_IQK_PI_B, MASKDWORD, 0x28110000);
656 /*LO calibration setting*/
657 odm_set_bb_reg(p_dm_odm, REG_IQK_AGC_RSP, MASKDWORD, 0x00462911);
660 odm_set_bb_reg(p_dm_odm, REG_FPGA0_IQK, 0xffffff00, 0x000000);
663 odm_set_rf_reg(p_dm_odm, ODM_RF_PATH_A, 0xdf, 0x800, 0x1);
664 odm_set_rf_reg(p_dm_odm, ODM_RF_PATH_A, 0x55, 0x0007f, 0x7);
665 odm_set_rf_reg(p_dm_odm, ODM_RF_PATH_A, 0x7f, RFREGOFFSETMASK, 0x0d400);
668 odm_set_bb_reg(p_dm_odm, REG_FPGA0_IQK, 0xffffff00, 0x808000);
672 /*Save Original path Owner, Original GNT*/
673 original_path = odm_get_mac_reg(p_dm_odm, REG_LTECOEX_PATH_CONTROL, MASKDWORD); /*save 0x70*/
674 odm_set_bb_reg(p_dm_odm, REG_LTECOEX_CTRL, MASKDWORD, 0x800f0038);
676 original_gnt = odm_get_bb_reg(p_dm_odm, REG_LTECOEX_READ_DATA, MASKDWORD); /*save 0x38*/
678 /*set GNT_WL=1/GNT_BT=0 and path owner to WiFi for pause BT traffic*/
679 odm_set_bb_reg(p_dm_odm, REG_LTECOEX_WRITE_DATA, MASKDWORD, 0x00007700);
680 odm_set_bb_reg(p_dm_odm, REG_LTECOEX_CTRL, MASKDWORD, 0xc0020038); /*0x38[15:8] = 0x77*/
681 odm_set_mac_reg(p_dm_odm, REG_LTECOEX_PATH_CONTROL, BIT(26), 0x1); /*0x70[26] =1 --> path Owner to WiFi*/
684 /*One shot, path A LOK & IQK*/
685 odm_set_bb_reg(p_dm_odm, REG_IQK_AGC_PTS, MASKDWORD, 0xf9000000);
686 odm_set_bb_reg(p_dm_odm, REG_IQK_AGC_PTS, MASKDWORD, 0xf8000000);
689 ODM_delay_ms(IQK_DELAY_TIME_8703B);
691 while ((odm_get_bb_reg(p_dm_odm, 0xe90, MASKDWORD) == 0) && ktime < 10) {
698 /*Restore GNT_WL/GNT_BT and path owner*/
699 odm_set_bb_reg(p_dm_odm, REG_LTECOEX_WRITE_DATA, MASKDWORD, original_gnt);
700 odm_set_bb_reg(p_dm_odm, REG_LTECOEX_CTRL, MASKDWORD, 0xc00f0038);
701 odm_set_mac_reg(p_dm_odm, REG_LTECOEX_PATH_CONTROL, 0xffffffff, original_path);
703 original_path = odm_get_mac_reg(p_dm_odm, REG_LTECOEX_PATH_CONTROL, MASKDWORD); /*save 0x70*/
704 odm_set_bb_reg(p_dm_odm, REG_LTECOEX_CTRL, MASKDWORD, 0x800f0038);
706 original_gnt = odm_get_bb_reg(p_dm_odm, REG_LTECOEX_READ_DATA, MASKDWORD); /*save 0x38*/
711 odm_set_bb_reg(p_dm_odm, REG_FPGA0_IQK, 0xffffff00, 0x000000);
712 /* PA/PAD controlled by 0x0*/
713 odm_set_rf_reg(p_dm_odm, ODM_RF_PATH_A, 0xdf, 0x800, 0x0);
716 reg_eac = odm_get_bb_reg(p_dm_odm, REG_RX_POWER_AFTER_IQK_A_2, MASKDWORD);
717 reg_e94 = odm_get_bb_reg(p_dm_odm, REG_TX_POWER_BEFORE_IQK_A, MASKDWORD);
718 reg_e9c = odm_get_bb_reg(p_dm_odm, REG_TX_POWER_AFTER_IQK_A, MASKDWORD);
719 ODM_RT_TRACE(p_dm_odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("[IQK]0xeac = 0x%x\n", reg_eac));
720 ODM_RT_TRACE(p_dm_odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("[IQK]0xe94 = 0x%x, 0xe9c = 0x%x\n", reg_e94, reg_e9c));
721 /*monitor image power before & after IQK*/
722 ODM_RT_TRACE(p_dm_odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("[IQK]0xe90(before IQK)= 0x%x, 0xe98(afer IQK) = 0x%x\n",
723 odm_get_bb_reg(p_dm_odm, 0xe90, MASKDWORD), odm_get_bb_reg(p_dm_odm, 0xe98, MASKDWORD)));
725 if (!(reg_eac & BIT(28)) &&
726 (((reg_e94 & 0x03FF0000) >> 16) != 0x142) &&
727 (((reg_e9c & 0x03FF0000) >> 16) != 0x42))
735 u8 /* bit0 = 1 => Tx OK, bit1 = 1 => Rx OK */
736 phy_path_a_rx_iqk_8703b(
737 #if (DM_ODM_SUPPORT_TYPE & ODM_AP)
738 struct PHY_DM_STRUCT *p_dm_odm
740 struct _ADAPTER *p_adapter
744 u32 reg_eac, reg_e94, reg_e9c, reg_ea4, u4tmp, tmp;
745 u8 result = 0x00, ktime;
746 u32 original_path, original_gnt;
748 #if !(DM_ODM_SUPPORT_TYPE & ODM_AP)
749 HAL_DATA_TYPE *p_hal_data = GET_HAL_DATA(p_adapter);
750 #if (DM_ODM_SUPPORT_TYPE == ODM_CE)
751 struct PHY_DM_STRUCT *p_dm_odm = &p_hal_data->odmpriv;
753 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
754 struct PHY_DM_STRUCT *p_dm_odm = &p_hal_data->DM_OutSrc;
759 ODM_RT_TRACE(p_dm_odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("[IQK]RX IQK:Get TXIMR setting\n"));
763 odm_set_bb_reg(p_dm_odm, REG_TX_IQK, MASKDWORD, 0x01007c00);
764 odm_set_bb_reg(p_dm_odm, REG_RX_IQK, MASKDWORD, 0x01004800);
766 /* path-A IQK setting */
767 odm_set_bb_reg(p_dm_odm, REG_TX_IQK_TONE_A, MASKDWORD, 0x18008c1c);
768 odm_set_bb_reg(p_dm_odm, REG_RX_IQK_TONE_A, MASKDWORD, 0x38008c1c);
769 odm_set_bb_reg(p_dm_odm, REG_TX_IQK_TONE_B, MASKDWORD, 0x38008c1c);
770 odm_set_bb_reg(p_dm_odm, REG_RX_IQK_TONE_B, MASKDWORD, 0x38008c1c);
772 /* odm_set_bb_reg(p_dm_odm, REG_TX_IQK_PI_A, MASKDWORD, 0x82160c1f); */
773 odm_set_bb_reg(p_dm_odm, REG_TX_IQK_PI_A, MASKDWORD, 0x8216000f);
774 odm_set_bb_reg(p_dm_odm, REG_RX_IQK_PI_A, MASKDWORD, 0x28110000);
775 odm_set_bb_reg(p_dm_odm, REG_TX_IQK_PI_B, MASKDWORD, 0x82110000);
776 odm_set_bb_reg(p_dm_odm, REG_RX_IQK_PI_B, MASKDWORD, 0x28110000);
778 /* LO calibration setting */
779 odm_set_bb_reg(p_dm_odm, REG_IQK_AGC_RSP, MASKDWORD, 0x0046a911);
782 odm_set_bb_reg(p_dm_odm, REG_FPGA0_IQK, 0xffffff00, 0x000000);
784 /* modify RXIQK mode table */
785 odm_set_rf_reg(p_dm_odm, ODM_RF_PATH_A, RF_WE_LUT, 0x80000, 0x1);
786 odm_set_rf_reg(p_dm_odm, ODM_RF_PATH_A, RF_RCK_OS, RFREGOFFSETMASK, 0x30000);
787 odm_set_rf_reg(p_dm_odm, ODM_RF_PATH_A, RF_TXPA_G1, RFREGOFFSETMASK, 0x00007);
789 /* odm_set_rf_reg(p_dm_odm, ODM_RF_PATH_A, RF_TXPA_G2, RFREGOFFSETMASK, 0xf7fb7); */
790 odm_set_rf_reg(p_dm_odm, ODM_RF_PATH_A, RF_TXPA_G2, RFREGOFFSETMASK, 0x57db7);
792 odm_set_bb_reg(p_dm_odm, REG_FPGA0_IQK, 0xffffff00, 0x808000);
796 /*Save Original path Owner, Original GNT*/
797 original_path = odm_get_mac_reg(p_dm_odm, REG_LTECOEX_PATH_CONTROL, MASKDWORD); /*save 0x70*/
798 odm_set_bb_reg(p_dm_odm, REG_LTECOEX_CTRL, MASKDWORD, 0x800f0038);
800 original_gnt = odm_get_bb_reg(p_dm_odm, REG_LTECOEX_READ_DATA, MASKDWORD); /*save 0x38*/
802 /*set GNT_WL=1/GNT_BT=0 and path owner to WiFi for pause BT traffic*/
803 odm_set_bb_reg(p_dm_odm, REG_LTECOEX_WRITE_DATA, MASKDWORD, 0x00007700);
804 odm_set_bb_reg(p_dm_odm, REG_LTECOEX_CTRL, MASKDWORD, 0xc0020038); /*0x38[15:8] = 0x77*/
805 odm_set_mac_reg(p_dm_odm, REG_LTECOEX_PATH_CONTROL, BIT(26), 0x1); /*0x70[26] =1 --> path Owner to WiFi*/
808 /* One shot, path A LOK & IQK */
809 odm_set_bb_reg(p_dm_odm, REG_IQK_AGC_PTS, MASKDWORD, 0xf9000000);
810 odm_set_bb_reg(p_dm_odm, REG_IQK_AGC_PTS, MASKDWORD, 0xf8000000);
813 ODM_delay_ms(IQK_DELAY_TIME_8703B);
815 while ((odm_get_bb_reg(p_dm_odm, 0xe90, MASKDWORD) == 0) && ktime < 10) {
822 /*Restore GNT_WL/GNT_BT and path owner*/
823 odm_set_bb_reg(p_dm_odm, REG_LTECOEX_WRITE_DATA, MASKDWORD, original_gnt);
824 odm_set_bb_reg(p_dm_odm, REG_LTECOEX_CTRL, MASKDWORD, 0xc00f0038);
825 odm_set_mac_reg(p_dm_odm, REG_LTECOEX_PATH_CONTROL, 0xffffffff, original_path);
827 original_path = odm_get_mac_reg(p_dm_odm, REG_LTECOEX_PATH_CONTROL, MASKDWORD); /*save 0x70*/
828 odm_set_bb_reg(p_dm_odm, REG_LTECOEX_CTRL, MASKDWORD, 0x800f0038);
830 original_gnt = odm_get_bb_reg(p_dm_odm, REG_LTECOEX_READ_DATA, MASKDWORD); /*save 0x38*/
836 odm_set_bb_reg(p_dm_odm, REG_FPGA0_IQK, 0xffffff00, 0x000000);
839 reg_eac = odm_get_bb_reg(p_dm_odm, REG_RX_POWER_AFTER_IQK_A_2, MASKDWORD);
840 reg_e94 = odm_get_bb_reg(p_dm_odm, REG_TX_POWER_BEFORE_IQK_A, MASKDWORD);
841 reg_e9c = odm_get_bb_reg(p_dm_odm, REG_TX_POWER_AFTER_IQK_A, MASKDWORD);
842 ODM_RT_TRACE(p_dm_odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("[IQK]0xeac = 0x%x\n", reg_eac));
843 ODM_RT_TRACE(p_dm_odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("[IQK]0xe94 = 0x%x, 0xe9c = 0x%x\n", reg_e94, reg_e9c));
844 /*monitor image power before & after IQK*/
845 ODM_RT_TRACE(p_dm_odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("[IQK]0xe90(before IQK)= 0x%x, 0xe98(afer IQK) = 0x%x\n",
846 odm_get_bb_reg(p_dm_odm, 0xe90, MASKDWORD), odm_get_bb_reg(p_dm_odm, 0xe98, MASKDWORD)));
849 tmp = (reg_e9c & 0x03FF0000) >> 16;
850 if ((tmp & 0x200) > 0)
853 if (!(reg_eac & BIT(28)) &&
854 (((reg_e94 & 0x03FF0000) >> 16) != 0x142) &&
855 (((reg_e9c & 0x03FF0000) >> 16) != 0x42))
858 else /* if Tx not OK, ignore Rx */
863 u4tmp = 0x80007C00 | (reg_e94 & 0x3FF0000) | ((reg_e9c & 0x3FF0000) >> 16);
864 odm_set_bb_reg(p_dm_odm, REG_TX_IQK, MASKDWORD, u4tmp);
865 ODM_RT_TRACE(p_dm_odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("[IQK]0xe40 = 0x%x u4tmp = 0x%x\n", odm_get_bb_reg(p_dm_odm, REG_TX_IQK, MASKDWORD), u4tmp));
868 ODM_RT_TRACE(p_dm_odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("[IQK]RX IQK\n"));
871 odm_set_bb_reg(p_dm_odm, REG_RX_IQK, MASKDWORD, 0x01004800);
873 /* path-A IQK setting */
874 odm_set_bb_reg(p_dm_odm, REG_TX_IQK_TONE_A, MASKDWORD, 0x38008c1c);
875 odm_set_bb_reg(p_dm_odm, REG_RX_IQK_TONE_A, MASKDWORD, 0x18008c1c);
876 odm_set_bb_reg(p_dm_odm, REG_TX_IQK_TONE_B, MASKDWORD, 0x38008c1c);
877 odm_set_bb_reg(p_dm_odm, REG_RX_IQK_TONE_B, MASKDWORD, 0x38008c1c);
879 odm_set_bb_reg(p_dm_odm, REG_TX_IQK_PI_A, MASKDWORD, 0x82110000);
880 odm_set_bb_reg(p_dm_odm, REG_RX_IQK_PI_A, MASKDWORD, 0x28160c1f);
881 /* odm_set_bb_reg(p_dm_odm, REG_RX_IQK_PI_A, MASKDWORD, 0x2816001f);*/
882 odm_set_bb_reg(p_dm_odm, REG_TX_IQK_PI_B, MASKDWORD, 0x82110000);
883 odm_set_bb_reg(p_dm_odm, REG_RX_IQK_PI_B, MASKDWORD, 0x28110000);
885 /* LO calibration setting */
886 odm_set_bb_reg(p_dm_odm, REG_IQK_AGC_RSP, MASKDWORD, 0x0046a8d1);
889 /* modify RXIQK mode table */
890 odm_set_bb_reg(p_dm_odm, REG_FPGA0_IQK, 0xffffff00, 0x000000);
891 odm_set_rf_reg(p_dm_odm, ODM_RF_PATH_A, RF_WE_LUT, 0x80000, 0x1);
892 odm_set_rf_reg(p_dm_odm, ODM_RF_PATH_A, RF_RCK_OS, RFREGOFFSETMASK, 0x30000);
893 odm_set_rf_reg(p_dm_odm, ODM_RF_PATH_A, RF_TXPA_G1, RFREGOFFSETMASK, 0x00007);
895 odm_set_rf_reg(p_dm_odm, ODM_RF_PATH_A, RF_TXPA_G2, RFREGOFFSETMASK, 0xf7d77);
898 odm_set_rf_reg(p_dm_odm, ODM_RF_PATH_A, 0xdf, 0x800, 0x1);
899 odm_set_rf_reg(p_dm_odm, ODM_RF_PATH_A, 0x55, 0x0007f, 0x5);
902 odm_set_bb_reg(p_dm_odm, REG_FPGA0_IQK, 0xffffff00, 0x808000);
906 /*Save Original path Owner, Original GNT*/
907 original_path = odm_get_mac_reg(p_dm_odm, REG_LTECOEX_PATH_CONTROL, MASKDWORD); /*save 0x70*/
908 odm_set_bb_reg(p_dm_odm, REG_LTECOEX_CTRL, MASKDWORD, 0x800f0038);
910 original_gnt = odm_get_bb_reg(p_dm_odm, REG_LTECOEX_READ_DATA, MASKDWORD); /*save 0x38*/
912 /*set GNT_WL=1/GNT_BT=0 and path owner to WiFi for pause BT traffic*/
913 odm_set_bb_reg(p_dm_odm, REG_LTECOEX_WRITE_DATA, MASKDWORD, 0x00007700);
914 odm_set_bb_reg(p_dm_odm, REG_LTECOEX_CTRL, MASKDWORD, 0xc0020038); /*0x38[15:8] = 0x77*/
915 odm_set_mac_reg(p_dm_odm, REG_LTECOEX_PATH_CONTROL, BIT(26), 0x1); /*0x70[26] =1 --> path Owner to WiFi*/
918 /* One shot, path A LOK & IQK */
919 odm_set_bb_reg(p_dm_odm, REG_IQK_AGC_PTS, MASKDWORD, 0xf9000000);
920 odm_set_bb_reg(p_dm_odm, REG_IQK_AGC_PTS, MASKDWORD, 0xf8000000);
923 ODM_delay_ms(IQK_DELAY_TIME_8703B);
925 while ((odm_get_bb_reg(p_dm_odm, 0xe90, MASKDWORD) == 0) && ktime < 10) {
932 /*Restore GNT_WL/GNT_BT and path owner*/
933 odm_set_bb_reg(p_dm_odm, REG_LTECOEX_WRITE_DATA, MASKDWORD, original_gnt);
934 odm_set_bb_reg(p_dm_odm, REG_LTECOEX_CTRL, MASKDWORD, 0xc00f0038);
935 odm_set_mac_reg(p_dm_odm, REG_LTECOEX_PATH_CONTROL, 0xffffffff, original_path);
937 original_path = odm_get_mac_reg(p_dm_odm, REG_LTECOEX_PATH_CONTROL, MASKDWORD); /*save 0x70*/
938 odm_set_bb_reg(p_dm_odm, REG_LTECOEX_CTRL, MASKDWORD, 0x800f0038);
940 original_gnt = odm_get_bb_reg(p_dm_odm, REG_LTECOEX_READ_DATA, MASKDWORD); /*save 0x38*/
946 odm_set_bb_reg(p_dm_odm, REG_FPGA0_IQK, 0xffffff00, 0x000000);
947 /* PA/PAD controlled by 0x0 */
948 odm_set_rf_reg(p_dm_odm, ODM_RF_PATH_A, 0xdf, 0x800, 0x0);
951 reg_eac = odm_get_bb_reg(p_dm_odm, REG_RX_POWER_AFTER_IQK_A_2, MASKDWORD);
952 reg_ea4 = odm_get_bb_reg(p_dm_odm, REG_RX_POWER_BEFORE_IQK_A_2, MASKDWORD);
953 ODM_RT_TRACE(p_dm_odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("[IQK]0xeac = 0x%x\n", reg_eac));
954 ODM_RT_TRACE(p_dm_odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("[IQK]0xea4 = 0x%x, 0xeac = 0x%x\n", reg_ea4, reg_eac));
955 /* monitor image power before & after IQK */
956 ODM_RT_TRACE(p_dm_odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("[IQK]0xea0(before IQK)= 0x%x, 0xea8(afer IQK) = 0x%x\n",
957 odm_get_bb_reg(p_dm_odm, 0xea0, MASKDWORD), odm_get_bb_reg(p_dm_odm, 0xea8, MASKDWORD)));
960 tmp = (reg_eac & 0x03FF0000) >> 16;
961 if ((tmp & 0x200) > 0)
964 if (!(reg_eac & BIT(27)) && /*if Tx is OK, check whether Rx is OK*/
965 (((reg_ea4 & 0x03FF0000) >> 16) != 0x132) &&
966 (((reg_eac & 0x03FF0000) >> 16) != 0x36) &&
967 (((reg_ea4 & 0x03FF0000) >> 16) < 0x11a) &&
968 (((reg_ea4 & 0x03FF0000) >> 16) > 0xe6) &&
971 else /* if Tx not OK, ignore Rx */
972 ODM_RT_TRACE(p_dm_odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("path A Rx IQK fail!!\n"));
979 _phy_path_a_fill_iqk_matrix8703b(
980 #if (DM_ODM_SUPPORT_TYPE & ODM_AP)
981 struct PHY_DM_STRUCT *p_dm_odm,
983 struct _ADAPTER *p_adapter,
991 u32 oldval_0, X, TX0_A, reg, tmp0xc80, tmp0xc94, tmp0xc4c, tmp0xc14, tmp0xca0;
993 #if !(DM_ODM_SUPPORT_TYPE & ODM_AP)
994 HAL_DATA_TYPE *p_hal_data = GET_HAL_DATA(p_adapter);
995 #if (DM_ODM_SUPPORT_TYPE == ODM_CE)
996 struct PHY_DM_STRUCT *p_dm_odm = &p_hal_data->odmpriv;
998 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
999 struct PHY_DM_STRUCT *p_dm_odm = &p_hal_data->DM_OutSrc;
1002 struct odm_rf_calibration_structure *p_rf_calibrate_info = &(p_dm_odm->rf_calibrate_info);
1004 ODM_RT_TRACE(p_dm_odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("[IQK]path A IQ Calibration %s !\n", (is_iqk_ok) ? "Success" : "Failed"));
1006 if (final_candidate == 0xFF)
1009 else if (is_iqk_ok) {
1011 oldval_0 = (odm_get_bb_reg(p_dm_odm, REG_OFDM_0_XA_TX_IQ_IMBALANCE, MASKDWORD) >> 22) & 0x3FF;
1013 X = result[final_candidate][0];
1014 if ((X & 0x00000200) != 0)
1016 TX0_A = (X * oldval_0) >> 8;
1017 ODM_RT_TRACE(p_dm_odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("[IQK]X = 0x%x, TX0_A = 0x%x, oldval_0 0x%x\n", X, TX0_A, oldval_0));
1018 tmp0xc80 = (odm_get_bb_reg(p_dm_odm, REG_OFDM_0_XA_TX_IQ_IMBALANCE, MASKDWORD) & 0xfffffc00) | (TX0_A & 0x3ff);
1019 tmp0xc4c = (((X * oldval_0 >> 7) & 0x1) << 31) | (odm_get_bb_reg(p_dm_odm, REG_OFDM_0_ECCA_THRESHOLD, MASKDWORD) & 0x7fffffff);
1021 Y = result[final_candidate][1];
1022 if ((Y & 0x00000200) != 0)
1026 TX0_C = (Y * oldval_0) >> 8;
1027 ODM_RT_TRACE(p_dm_odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("[IQK]Y = 0x%x, TX = 0x%x\n", Y, TX0_C));
1029 tmp0xc94 = (((TX0_C & 0x3C0) >> 6) << 28) | (odm_get_bb_reg(p_dm_odm, REG_OFDM_0_XC_TX_AFE, MASKDWORD) & 0x0fffffff);
1031 p_rf_calibrate_info->tx_iqc_8703b[idx_0xc94][KEY] = REG_OFDM_0_XC_TX_AFE;
1032 p_rf_calibrate_info->tx_iqc_8703b[idx_0xc94][VAL] = tmp0xc94;
1034 tmp0xc80 = (tmp0xc80 & 0xffc0ffff) | (TX0_C & 0x3F) << 16;
1036 p_rf_calibrate_info->tx_iqc_8703b[idx_0xc80][KEY] = REG_OFDM_0_XA_TX_IQ_IMBALANCE;
1037 p_rf_calibrate_info->tx_iqc_8703b[idx_0xc80][VAL] = tmp0xc80;
1039 tmp0xc4c = (tmp0xc4c & 0xdfffffff) | (((Y * oldval_0 >> 7) & 0x1) << 29);
1041 p_rf_calibrate_info->tx_iqc_8703b[idx_0xc4c][KEY] = REG_OFDM_0_ECCA_THRESHOLD;
1042 p_rf_calibrate_info->tx_iqc_8703b[idx_0xc4c][VAL] = tmp0xc4c;
1045 ODM_RT_TRACE(p_dm_odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("[IQK]_phy_path_a_fill_iqk_matrix8703b only Tx OK\n"));
1047 /* <20130226, Kordan> Saving RxIQC, otherwise not initialized. */
1048 p_rf_calibrate_info->rx_iqc_8703b[idx_0xca0][KEY] = REG_OFDM_0_RX_IQ_EXT_ANTA;
1049 p_rf_calibrate_info->rx_iqc_8703b[idx_0xca0][VAL] = 0xfffffff & odm_get_bb_reg(p_dm_odm, REG_OFDM_0_RX_IQ_EXT_ANTA, MASKDWORD);
1050 p_rf_calibrate_info->rx_iqc_8703b[idx_0xc14][KEY] = REG_OFDM_0_XA_RX_IQ_IMBALANCE;
1051 p_rf_calibrate_info->rx_iqc_8703b[idx_0xc14][VAL] = 0x40000100;
1055 reg = result[final_candidate][2];
1056 #if (DM_ODM_SUPPORT_TYPE == ODM_AP)
1057 if (RTL_ABS(reg, 0x100) >= 16)
1062 tmp0xc14 = (0x40000100 & 0xfffffc00) | reg;
1064 reg = result[final_candidate][3] & 0x3F;
1065 tmp0xc14 = (tmp0xc14 & 0xffff03ff) | (reg << 10);
1067 p_rf_calibrate_info->rx_iqc_8703b[idx_0xc14][KEY] = REG_OFDM_0_XA_RX_IQ_IMBALANCE;
1068 p_rf_calibrate_info->rx_iqc_8703b[idx_0xc14][VAL] = tmp0xc14;
1070 reg = (result[final_candidate][3] >> 6) & 0xF;
1071 tmp0xca0 = odm_get_bb_reg(p_dm_odm, REG_OFDM_0_RX_IQ_EXT_ANTA, 0x0fffffff) | (reg << 28);
1073 p_rf_calibrate_info->rx_iqc_8703b[idx_0xca0][KEY] = REG_OFDM_0_RX_IQ_EXT_ANTA;
1074 p_rf_calibrate_info->rx_iqc_8703b[idx_0xca0][VAL] = tmp0xca0;
1080 _phy_path_b_fill_iqk_matrix8703b(
1081 #if (DM_ODM_SUPPORT_TYPE & ODM_AP)
1082 struct PHY_DM_STRUCT *p_dm_odm,
1084 struct _ADAPTER *p_adapter,
1089 boolean is_tx_only /* do Tx only */
1092 u32 oldval_1, X, TX1_A, reg, tmp0xc80, tmp0xc94, tmp0xc4c, tmp0xc14, tmp0xca0;
1094 #if !(DM_ODM_SUPPORT_TYPE & ODM_AP)
1095 HAL_DATA_TYPE *p_hal_data = GET_HAL_DATA(p_adapter);
1096 #if (DM_ODM_SUPPORT_TYPE == ODM_CE)
1097 struct PHY_DM_STRUCT *p_dm_odm = &p_hal_data->odmpriv;
1099 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
1100 struct PHY_DM_STRUCT *p_dm_odm = &p_hal_data->DM_OutSrc;
1103 struct odm_rf_calibration_structure *p_rf_calibrate_info = &(p_dm_odm->rf_calibrate_info);
1105 ODM_RT_TRACE(p_dm_odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("[IQK]path B IQ Calibration %s !\n", (is_iqk_ok) ? "Success" : "Failed"));
1107 if (final_candidate == 0xFF)
1110 else if (is_iqk_ok) {
1111 oldval_1 = (odm_get_bb_reg(p_dm_odm, REG_OFDM_0_XA_TX_IQ_IMBALANCE, MASKDWORD) >> 22) & 0x3FF;
1114 X = result[final_candidate][4];
1115 if ((X & 0x00000200) != 0)
1117 TX1_A = (X * oldval_1) >> 8;
1118 ODM_RT_TRACE(p_dm_odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("[IQK]X = 0x%x, TX1_A = 0x%x\n", X, TX1_A));
1120 tmp0xc80 = (odm_get_bb_reg(p_dm_odm, REG_OFDM_0_XA_TX_IQ_IMBALANCE, MASKDWORD) & 0xfffffc00) | (TX1_A & 0x3ff);
1121 tmp0xc4c = (((X * oldval_1 >> 7) & 0x1) << 31) | (odm_get_bb_reg(p_dm_odm, REG_OFDM_0_ECCA_THRESHOLD, MASKDWORD) & 0x7fffffff);
1123 Y = result[final_candidate][5];
1124 if ((Y & 0x00000200) != 0)
1127 TX1_C = (Y * oldval_1) >> 8;
1128 ODM_RT_TRACE(p_dm_odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("[IQK]Y = 0x%x, TX1_C = 0x%x\n", Y, TX1_C));
1132 tmp0xc94 = (((TX1_C & 0x3C0) >> 6) << 28) | (odm_get_bb_reg(p_dm_odm, REG_OFDM_0_XC_TX_AFE, MASKDWORD) & 0x0fffffff);
1134 p_rf_calibrate_info->tx_iqc_8703b[PATH_S0][idx_0xc94][KEY] = REG_OFDM_0_XC_TX_AFE;
1135 p_rf_calibrate_info->tx_iqc_8703b[PATH_S0][idx_0xc94][VAL] = tmp0xc94;
1137 tmp0xc80 = (tmp0xc80 & 0xffc0ffff) | (TX1_C & 0x3F) << 16;
1138 p_rf_calibrate_info->tx_iqc_8703b[PATH_S0][idx_0xc80][KEY] = REG_OFDM_0_XA_TX_IQ_IMBALANCE;
1139 p_rf_calibrate_info->tx_iqc_8703b[PATH_S0][idx_0xc80][VAL] = tmp0xc80;
1141 tmp0xc4c = (tmp0xc4c & 0xdfffffff) | (((Y * oldval_1 >> 7) & 0x1) << 29);
1142 p_rf_calibrate_info->tx_iqc_8703b[PATH_S0][idx_0xc4c][KEY] = REG_OFDM_0_ECCA_THRESHOLD;
1143 p_rf_calibrate_info->tx_iqc_8703b[PATH_S0][idx_0xc4c][VAL] = tmp0xc4c;
1146 ODM_RT_TRACE(p_dm_odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("[IQK]_phy_path_b_fill_iqk_matrix8703b only Tx OK\n"));
1148 p_rf_calibrate_info->rx_iqc_8703b[PATH_S0][idx_0xc14][KEY] = REG_OFDM_0_XA_RX_IQ_IMBALANCE;
1149 p_rf_calibrate_info->rx_iqc_8703b[PATH_S0][idx_0xc14][VAL] = 0x40000100;
1150 p_rf_calibrate_info->rx_iqc_8703b[PATH_S0][idx_0xca0][KEY] = REG_OFDM_0_RX_IQ_EXT_ANTA;
1151 p_rf_calibrate_info->rx_iqc_8703b[PATH_S0][idx_0xca0][VAL] = 0x0fffffff & odm_get_bb_reg(p_dm_odm, REG_OFDM_0_RX_IQ_EXT_ANTA, MASKDWORD);
1156 reg = result[final_candidate][6];
1157 tmp0xc14 = (0x40000100 & 0xfffffc00) | reg;
1159 reg = result[final_candidate][7] & 0x3F;
1160 tmp0xc14 = (tmp0xc14 & 0xffff03ff) | (reg << 10);
1162 p_rf_calibrate_info->rx_iqc_8703b[PATH_S0][idx_0xc14][KEY] = REG_OFDM_0_XA_RX_IQ_IMBALANCE;
1163 p_rf_calibrate_info->rx_iqc_8703b[PATH_S0][idx_0xc14][VAL] = tmp0xc14;
1165 reg = (result[final_candidate][7] >> 6) & 0xF;
1166 tmp0xca0 = odm_get_bb_reg(p_dm_odm, REG_OFDM_0_RX_IQ_EXT_ANTA, 0x0fffffff) | (reg << 28);
1168 p_rf_calibrate_info->rx_iqc_8703b[PATH_S0][idx_0xca0][KEY] = REG_OFDM_0_RX_IQ_EXT_ANTA;
1169 p_rf_calibrate_info->rx_iqc_8703b[PATH_S0][idx_0xca0][VAL] = tmp0xca0;
1175 odm_set_iqc_by_rfpath_8703b(
1176 struct PHY_DM_STRUCT *p_dm_odm
1180 struct odm_rf_calibration_structure *p_rf_calibrate_info = &(p_dm_odm->rf_calibrate_info);
1183 if ((p_rf_calibrate_info->tx_iqc_8703b[idx_0xc80][VAL] != 0x0) && (p_rf_calibrate_info->rx_iqc_8703b[idx_0xc14][VAL] != 0x0)) {
1185 ODM_RT_TRACE(p_dm_odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("[IQK]reload RF IQC!!!\n"));
1186 ODM_RT_TRACE(p_dm_odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("[IQK]0xc80 = 0x%x!!!\n", p_rf_calibrate_info->tx_iqc_8703b[idx_0xc80][VAL]));
1187 ODM_RT_TRACE(p_dm_odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("[IQK]0xc14 = 0x%x!!!\n", p_rf_calibrate_info->tx_iqc_8703b[idx_0xc14][VAL]));
1190 odm_set_bb_reg(p_dm_odm, p_rf_calibrate_info->tx_iqc_8703b[idx_0xc94][KEY], MASKH4BITS, (p_rf_calibrate_info->tx_iqc_8703b[idx_0xc94][VAL] >> 28));
1191 odm_set_bb_reg(p_dm_odm, p_rf_calibrate_info->tx_iqc_8703b[idx_0xc80][KEY], MASKDWORD, p_rf_calibrate_info->tx_iqc_8703b[idx_0xc80][VAL]);
1192 odm_set_bb_reg(p_dm_odm, p_rf_calibrate_info->tx_iqc_8703b[idx_0xc4c][KEY], BIT(31), (p_rf_calibrate_info->tx_iqc_8703b[idx_0xc4c][VAL] >> 31));
1193 odm_set_bb_reg(p_dm_odm, p_rf_calibrate_info->tx_iqc_8703b[idx_0xc4c][KEY], BIT(29), ((p_rf_calibrate_info->tx_iqc_8703b[idx_0xc4c][VAL] & BIT(29)) >> 29));
1196 odm_set_bb_reg(p_dm_odm, p_rf_calibrate_info->rx_iqc_8703b[idx_0xc14][KEY], MASKDWORD, p_rf_calibrate_info->rx_iqc_8703b[idx_0xc14][VAL]);
1197 odm_set_bb_reg(p_dm_odm, p_rf_calibrate_info->rx_iqc_8703b[idx_0xca0][KEY], MASKDWORD, p_rf_calibrate_info->rx_iqc_8703b[idx_0xca0][VAL]);
1201 ODM_RT_TRACE(p_dm_odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("[IQK]IQC value invalid!!!\n"));
1207 #if !(DM_ODM_SUPPORT_TYPE & ODM_WIN)
1209 odm_check_power_status(
1210 struct _ADAPTER *adapter)
1213 HAL_DATA_TYPE *p_hal_data = GET_HAL_DATA(adapter);
1214 struct PHY_DM_STRUCT *p_dm_odm = &p_hal_data->DM_OutSrc;
1215 RT_RF_POWER_STATE rt_state;
1216 PMGNT_INFO p_mgnt_info = &(adapter->MgntInfo);
1218 /* 2011/07/27 MH We are not testing ready~~!! We may fail to get correct value when init sequence.*/
1219 if (p_mgnt_info->init_adpt_in_progress == true) {
1220 ODM_RT_TRACE(p_dm_odm, COMP_INIT, DBG_LOUD, ("odm_check_power_status Return true, due to initadapter"));
1225 /* 2011/07/19 MH We can not execute tx power tracking/ LLC calibrate or IQK.*/
1227 phydm_get_hw_reg_interface(p_dm_odm, HW_VAR_RF_STATE, (u8 *)(&rt_state));
1228 if (adapter->is_driver_stopped || adapter->is_driver_is_going_to_pnp_set_power_sleep || rt_state == eRfOff) {
1229 ODM_RT_TRACE(p_dm_odm, COMP_INIT, DBG_LOUD, ("odm_check_power_status Return false, due to %d/%d/%d\n",
1230 adapter->is_driver_stopped, adapter->is_driver_is_going_to_pnp_set_power_sleep, rt_state));
1239 _phy_save_adda_registers8703b(
1240 #if (DM_ODM_SUPPORT_TYPE & ODM_AP)
1241 struct PHY_DM_STRUCT *p_dm_odm,
1243 struct _ADAPTER *p_adapter,
1251 #if !(DM_ODM_SUPPORT_TYPE & ODM_AP)
1252 HAL_DATA_TYPE *p_hal_data = GET_HAL_DATA(p_adapter);
1253 #if (DM_ODM_SUPPORT_TYPE == ODM_CE)
1254 struct PHY_DM_STRUCT *p_dm_odm = &p_hal_data->odmpriv;
1256 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
1257 struct PHY_DM_STRUCT *p_dm_odm = &p_hal_data->DM_OutSrc;
1260 if (odm_check_power_status(p_adapter) == false)
1264 /* ODM_RT_TRACE(p_dm_odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("Save ADDA parameters.\n")); */
1265 for (i = 0; i < register_num; i++)
1266 adda_backup[i] = odm_get_bb_reg(p_dm_odm, adda_reg[i], MASKDWORD);
1271 _phy_save_mac_registers8703b(
1272 #if (DM_ODM_SUPPORT_TYPE & ODM_AP)
1273 struct PHY_DM_STRUCT *p_dm_odm,
1275 struct _ADAPTER *p_adapter,
1282 #if !(DM_ODM_SUPPORT_TYPE & ODM_AP)
1283 HAL_DATA_TYPE *p_hal_data = GET_HAL_DATA(p_adapter);
1284 #if (DM_ODM_SUPPORT_TYPE == ODM_CE)
1285 struct PHY_DM_STRUCT *p_dm_odm = &p_hal_data->odmpriv;
1287 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
1288 struct PHY_DM_STRUCT *p_dm_odm = &p_hal_data->DM_OutSrc;
1291 /* ODM_RT_TRACE(p_dm_odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("Save MAC parameters.\n")); */
1292 for (i = 0; i < (IQK_MAC_REG_NUM - 1); i++)
1293 mac_backup[i] = odm_read_1byte(p_dm_odm, mac_reg[i]);
1295 mac_backup[i] = odm_read_4byte(p_dm_odm, mac_reg[i]);
1301 _phy_reload_adda_registers8703b(
1302 #if (DM_ODM_SUPPORT_TYPE & ODM_AP)
1303 struct PHY_DM_STRUCT *p_dm_odm,
1305 struct _ADAPTER *p_adapter,
1313 #if !(DM_ODM_SUPPORT_TYPE & ODM_AP)
1314 HAL_DATA_TYPE *p_hal_data = GET_HAL_DATA(p_adapter);
1315 #if (DM_ODM_SUPPORT_TYPE == ODM_CE)
1316 struct PHY_DM_STRUCT *p_dm_odm = &p_hal_data->odmpriv;
1318 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
1319 struct PHY_DM_STRUCT *p_dm_odm = &p_hal_data->DM_OutSrc;
1323 /* ODM_RT_TRACE(p_dm_odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("Reload ADDA power saving parameters !\n")); */
1324 for (i = 0 ; i < regiester_num; i++)
1325 odm_set_bb_reg(p_dm_odm, adda_reg[i], MASKDWORD, adda_backup[i]);
1330 _phy_reload_mac_registers8703b(
1331 #if (DM_ODM_SUPPORT_TYPE & ODM_AP)
1332 struct PHY_DM_STRUCT *p_dm_odm,
1334 struct _ADAPTER *p_adapter,
1341 #if !(DM_ODM_SUPPORT_TYPE & ODM_AP)
1342 HAL_DATA_TYPE *p_hal_data = GET_HAL_DATA(p_adapter);
1343 #if (DM_ODM_SUPPORT_TYPE == ODM_CE)
1344 struct PHY_DM_STRUCT *p_dm_odm = &p_hal_data->odmpriv;
1346 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
1347 struct PHY_DM_STRUCT *p_dm_odm = &p_hal_data->DM_OutSrc;
1350 /* ODM_RT_TRACE(p_dm_odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("Reload MAC parameters !\n")); */
1351 for (i = 0 ; i < (IQK_MAC_REG_NUM - 1); i++)
1352 odm_write_1byte(p_dm_odm, mac_reg[i], (u8)mac_backup[i]);
1354 odm_write_4byte(p_dm_odm, mac_reg[i], mac_backup[i]);
1359 _phy_path_adda_on8703b(
1360 #if (DM_ODM_SUPPORT_TYPE & ODM_AP)
1361 struct PHY_DM_STRUCT *p_dm_odm,
1363 struct _ADAPTER *p_adapter,
1366 boolean is_path_a_on
1371 #if !(DM_ODM_SUPPORT_TYPE & ODM_AP)
1372 HAL_DATA_TYPE *p_hal_data = GET_HAL_DATA(p_adapter);
1373 #if (DM_ODM_SUPPORT_TYPE == ODM_CE)
1374 struct PHY_DM_STRUCT *p_dm_odm = &p_hal_data->odmpriv;
1376 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
1377 struct PHY_DM_STRUCT *p_dm_odm = &p_hal_data->DM_OutSrc;
1380 /* ODM_RT_TRACE(p_dm_odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("ADDA ON.\n")); */
1382 path_on = 0x03c00014;
1385 for (i = 0; i < IQK_ADDA_REG_NUM; i++)
1386 odm_set_bb_reg(p_dm_odm, adda_reg[i], MASKDWORD, path_on);
1391 _phy_mac_setting_calibration8703b(
1392 #if (DM_ODM_SUPPORT_TYPE & ODM_AP)
1393 struct PHY_DM_STRUCT *p_dm_odm,
1395 struct _ADAPTER *p_adapter,
1402 #if !(DM_ODM_SUPPORT_TYPE & ODM_AP)
1403 HAL_DATA_TYPE *p_hal_data = GET_HAL_DATA(p_adapter);
1404 #if (DM_ODM_SUPPORT_TYPE == ODM_CE)
1405 struct PHY_DM_STRUCT *p_dm_odm = &p_hal_data->odmpriv;
1407 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
1408 struct PHY_DM_STRUCT *p_dm_odm = &p_hal_data->DM_OutSrc;
1411 /* ODM_RT_TRACE(p_dm_odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("MAC settings for Calibration.\n")); */
1413 odm_write_1byte(p_dm_odm, mac_reg[i], 0x3F);
1415 for (i = 1 ; i < (IQK_MAC_REG_NUM - 1); i++)
1416 odm_write_1byte(p_dm_odm, mac_reg[i], (u8)(mac_backup[i] & (~BIT(3))));
1418 odm_write_1byte(p_dm_odm, mac_reg[i], (u8)(mac_backup[i] & (~BIT(5))));
1423 phy_simularity_compare_8703b(
1424 #if (DM_ODM_SUPPORT_TYPE & ODM_AP)
1425 struct PHY_DM_STRUCT *p_dm_odm,
1427 struct _ADAPTER *p_adapter,
1434 u32 i, j, diff, simularity_bit_map, bound = 0;
1435 #if !(DM_ODM_SUPPORT_TYPE & ODM_AP)
1436 HAL_DATA_TYPE *p_hal_data = GET_HAL_DATA(p_adapter);
1437 #if (DM_ODM_SUPPORT_TYPE == ODM_CE)
1438 struct PHY_DM_STRUCT *p_dm_odm = &p_hal_data->odmpriv;
1442 u8 final_candidate[2] = {0xFF, 0xFF}; /* for path A and path B */
1443 boolean is_result = true;
1444 /* #if !(DM_ODM_SUPPORT_TYPE & ODM_AP) */
1445 /* bool is2T = IS_92C_SERIAL( p_hal_data->version_id);
1447 boolean is2T = true;
1450 s32 tmp1 = 0, tmp2 = 0;
1457 /* ODM_RT_TRACE(p_dm_odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("===> IQK:phy_simularity_compare_8192e c1 %d c2 %d!!!\n", c1, c2)); */
1460 simularity_bit_map = 0;
1462 for (i = 0; i < bound; i++) {
1464 if ((i == 1) || (i == 3) || (i == 5) || (i == 7)) {
1465 if ((result[c1][i] & 0x00000200) != 0)
1466 tmp1 = result[c1][i] | 0xFFFFFC00;
1468 tmp1 = result[c1][i];
1470 if ((result[c2][i] & 0x00000200) != 0)
1471 tmp2 = result[c2][i] | 0xFFFFFC00;
1473 tmp2 = result[c2][i];
1475 tmp1 = result[c1][i];
1476 tmp2 = result[c2][i];
1479 diff = (tmp1 > tmp2) ? (tmp1 - tmp2) : (tmp2 - tmp1);
1481 if (diff > MAX_TOLERANCE) {
1482 /* ODM_RT_TRACE(p_dm_odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("IQK:differnece overflow %d index %d compare1 0x%x compare2 0x%x!!!\n", diff, i, result[c1][i], result[c2][i])); */
1484 if ((i == 2 || i == 6) && !simularity_bit_map) {
1485 if (result[c1][i] + result[c1][i + 1] == 0)
1486 final_candidate[(i / 4)] = c2;
1487 else if (result[c2][i] + result[c2][i + 1] == 0)
1488 final_candidate[(i / 4)] = c1;
1490 simularity_bit_map = simularity_bit_map | (1 << i);
1492 simularity_bit_map = simularity_bit_map | (1 << i);
1496 /* ODM_RT_TRACE(p_dm_odm,ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("IQK:phy_simularity_compare_8192e simularity_bit_map %x !!!\n", simularity_bit_map)); */
1498 if (simularity_bit_map == 0) {
1499 for (i = 0; i < (bound / 4); i++) {
1500 if (final_candidate[i] != 0xFF) {
1501 for (j = i * 4; j < (i + 1) * 4 - 2; j++)
1502 result[3][j] = result[final_candidate[i]][j];
1509 if (!(simularity_bit_map & 0x03)) { /*path A TX OK*/
1510 for (i = 0; i < 2; i++)
1511 result[3][i] = result[c1][i];
1514 if (!(simularity_bit_map & 0x0c)) { /*path A RX OK*/
1515 for (i = 2; i < 4; i++)
1516 result[3][i] = result[c1][i];
1519 if (!(simularity_bit_map & 0x30)) { /*path B TX OK*/
1520 for (i = 4; i < 6; i++)
1521 result[3][i] = result[c1][i];
1525 if (!(simularity_bit_map & 0xc0)) { /*path B RX OK*/
1526 for (i = 6; i < 8; i++)
1527 result[3][i] = result[c1][i];
1536 _phy_iq_calibrate_8703b(
1537 #if (DM_ODM_SUPPORT_TYPE & ODM_AP)
1538 struct PHY_DM_STRUCT *p_dm_odm,
1540 struct _ADAPTER *p_adapter,
1546 #if !(DM_ODM_SUPPORT_TYPE & ODM_AP)
1547 HAL_DATA_TYPE *p_hal_data = GET_HAL_DATA(p_adapter);
1548 #if (DM_ODM_SUPPORT_TYPE == ODM_CE)
1549 struct PHY_DM_STRUCT *p_dm_odm = &p_hal_data->odmpriv;
1551 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
1552 struct PHY_DM_STRUCT *p_dm_odm = &p_hal_data->DM_OutSrc;
1556 u8 path_aok, path_bok;
1557 u8 tmp0xc50 = (u8)odm_get_bb_reg(p_dm_odm, 0xC50, MASKBYTE0);
1558 u8 tmp0xc58 = (u8)odm_get_bb_reg(p_dm_odm, 0xC58, MASKBYTE0);
1559 u32 ADDA_REG[IQK_ADDA_REG_NUM] = {
1560 REG_FPGA0_XCD_SWITCH_CONTROL, REG_BLUE_TOOTH,
1561 REG_RX_WAIT_CCA, REG_TX_CCK_RFON,
1562 REG_TX_CCK_BBON, REG_TX_OFDM_RFON,
1563 REG_TX_OFDM_BBON, REG_TX_TO_RX,
1564 REG_TX_TO_TX, REG_RX_CCK,
1565 REG_RX_OFDM, REG_RX_WAIT_RIFS,
1566 REG_RX_TO_RX, REG_STANDBY,
1567 REG_SLEEP, REG_PMPD_ANAEN
1569 u32 IQK_MAC_REG[IQK_MAC_REG_NUM] = {
1570 REG_TXPAUSE, REG_BCN_CTRL,
1571 REG_BCN_CTRL_1, REG_GPIO_MUXCFG
1574 /*since 92C & 92D have the different define in IQK_BB_REG*/
1575 u32 IQK_BB_REG_92C[IQK_BB_REG_NUM] = {
1576 REG_OFDM_0_TRX_PATH_ENABLE, REG_OFDM_0_TR_MUX_PAR,
1577 REG_FPGA0_XCD_RF_INTERFACE_SW, REG_CONFIG_ANT_A, REG_CONFIG_ANT_B,
1578 REG_FPGA0_XAB_RF_INTERFACE_SW, REG_FPGA0_XA_RF_INTERFACE_OE,
1579 REG_FPGA0_XB_RF_INTERFACE_OE, REG_CCK_0_AFE_SETTING
1584 #if (DM_ODM_SUPPORT_TYPE & (ODM_AP))
1585 u32 retry_count = 2;
1588 const u32 retry_count = 1;
1590 const u32 retry_count = 2;
1594 /* Note: IQ calibration must be performed after loading*/
1595 /*PHY_REG.txt , and radio_a, radio_b.txt*/
1599 #if (DM_ODM_SUPPORT_TYPE & (ODM_AP))
1601 if (p_dm_odm->priv->pshare->rf_ft_var.mp_specific)
1608 /* bbvalue = odm_get_bb_reg(p_dm_odm, REG_FPGA0_RFMOD, MASKDWORD);
1609 * RT_DISP(FINIT, INIT_IQK, ("_phy_iq_calibrate_8188e()==>0x%08x\n",bbvalue)); */
1611 ODM_RT_TRACE(p_dm_odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("[IQK]IQ Calibration for %d times\n", t));
1613 /* Save ADDA parameters, turn path A ADDA on*/
1614 #if !(DM_ODM_SUPPORT_TYPE & ODM_AP)
1615 _phy_save_adda_registers8703b(p_adapter, ADDA_REG, p_dm_odm->rf_calibrate_info.ADDA_backup, IQK_ADDA_REG_NUM);
1616 _phy_save_mac_registers8703b(p_adapter, IQK_MAC_REG, p_dm_odm->rf_calibrate_info.IQK_MAC_backup);
1617 _phy_save_adda_registers8703b(p_adapter, IQK_BB_REG_92C, p_dm_odm->rf_calibrate_info.IQK_BB_backup, IQK_BB_REG_NUM);
1619 _phy_save_adda_registers8703b(p_dm_odm, ADDA_REG, p_dm_odm->rf_calibrate_info.ADDA_backup, IQK_ADDA_REG_NUM);
1620 _phy_save_mac_registers8703b(p_dm_odm, IQK_MAC_REG, p_dm_odm->rf_calibrate_info.IQK_MAC_backup);
1621 _phy_save_adda_registers8703b(p_dm_odm, IQK_BB_REG_92C, p_dm_odm->rf_calibrate_info.IQK_BB_backup, IQK_BB_REG_NUM);
1624 ODM_RT_TRACE(p_dm_odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("[IQK]IQ Calibration for %d times\n", t));
1626 #if !(DM_ODM_SUPPORT_TYPE & ODM_AP)
1628 _phy_path_adda_on8703b(p_adapter, ADDA_REG, true);
1630 _phy_path_adda_on8703b(p_dm_odm, ADDA_REG, true);
1635 #if !(DM_ODM_SUPPORT_TYPE & ODM_AP)
1636 _phy_mac_setting_calibration8703b(p_adapter, IQK_MAC_REG, p_dm_odm->rf_calibrate_info.IQK_MAC_backup);
1638 _phy_mac_setting_calibration8703b(p_dm_odm, IQK_MAC_REG, p_dm_odm->rf_calibrate_info.IQK_MAC_backup);
1642 /*odm_set_bb_reg(p_dm_odm, REG_FPGA0_RFMOD, BIT24, 0x00);*/
1643 odm_set_bb_reg(p_dm_odm, REG_CCK_0_AFE_SETTING, 0x0f000000, 0xf);
1644 odm_set_bb_reg(p_dm_odm, REG_OFDM_0_TRX_PATH_ENABLE, MASKDWORD, 0x03a05600);
1645 odm_set_bb_reg(p_dm_odm, REG_OFDM_0_TR_MUX_PAR, MASKDWORD, 0x000800e4);
1646 odm_set_bb_reg(p_dm_odm, REG_FPGA0_XCD_RF_INTERFACE_SW, MASKDWORD, 0x25204000);
1651 for (i = 0 ; i < retry_count ; i++) {
1652 #if !(DM_ODM_SUPPORT_TYPE & ODM_AP)
1653 path_aok = phy_path_a_iqk_8703b(p_adapter);
1655 path_aok = phy_path_a_iqk_8703b(p_dm_odm);
1658 if (path_aok == 0x01) {
1659 ODM_RT_TRACE(p_dm_odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("[IQK]Tx IQK Success!!\n"));
1660 result[t][0] = (odm_get_bb_reg(p_dm_odm, REG_TX_POWER_BEFORE_IQK_A, MASKDWORD) & 0x3FF0000) >> 16;
1661 result[t][1] = (odm_get_bb_reg(p_dm_odm, REG_TX_POWER_AFTER_IQK_A, MASKDWORD) & 0x3FF0000) >> 16;
1671 for (i = 0 ; i < retry_count ; i++) {
1672 #if !(DM_ODM_SUPPORT_TYPE & ODM_AP)
1673 path_aok = phy_path_a_rx_iqk_8703b(p_adapter);
1675 path_aok = phy_path_a_rx_iqk_8703b(p_dm_odm);
1677 if (path_aok == 0x03) {
1678 ODM_RT_TRACE(p_dm_odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("[IQK]Rx IQK Success!!\n"));
1679 /* result[t][0] = (odm_get_bb_reg(p_dm_odm, REG_TX_POWER_BEFORE_IQK_A, MASKDWORD)&0x3FF0000)>>16;
1680 * result[t][1] = (odm_get_bb_reg(p_dm_odm, REG_TX_POWER_AFTER_IQK_A, MASKDWORD)&0x3FF0000)>>16; */
1681 result[t][2] = (odm_get_bb_reg(p_dm_odm, REG_RX_POWER_BEFORE_IQK_A_2, MASKDWORD) & 0x3FF0000) >> 16;
1682 result[t][3] = (odm_get_bb_reg(p_dm_odm, REG_RX_POWER_AFTER_IQK_A_2, MASKDWORD) & 0x3FF0000) >> 16;
1685 ODM_RT_TRACE(p_dm_odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("[IQK]Rx IQK Fail!!\n"));
1688 if (0x00 == path_aok)
1689 ODM_RT_TRACE(p_dm_odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("[IQK]IQK failed!!\n"));
1698 if ((*p_dm_odm->p_is_1_antenna == false) || ((*p_dm_odm->p_is_1_antenna == true) && (*p_dm_odm->p_rf_default_path == 1))
1699 || (p_dm_odm->support_interface == ODM_ITRF_USB))
1703 for (i = 0 ; i < retry_count ; i++) {
1704 #if !(DM_ODM_SUPPORT_TYPE & ODM_AP)
1705 path_bok = phy_path_b_iqk_8703b(p_adapter);
1707 path_bok = phy_path_b_iqk_8703b(p_dm_odm);
1709 /* if(path_bok == 0x03){ */
1710 if (path_bok == 0x01) {
1711 ODM_RT_TRACE(p_dm_odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("[IQK]S0 Tx IQK Success!!\n"));
1712 result[t][4] = (odm_get_bb_reg(p_dm_odm, REG_TX_POWER_BEFORE_IQK_A, MASKDWORD) & 0x3FF0000) >> 16;
1713 result[t][5] = (odm_get_bb_reg(p_dm_odm, REG_TX_POWER_AFTER_IQK_A, MASKDWORD) & 0x3FF0000) >> 16;
1723 for (i = 0 ; i < retry_count ; i++) {
1724 #if !(DM_ODM_SUPPORT_TYPE & ODM_AP)
1725 path_bok = phy_path_b_rx_iqk_8703b(p_adapter);
1727 path_bok = phy_path_b_rx_iqk_8703b(p_dm_odm);
1729 if (path_bok == 0x03) {
1730 ODM_RT_TRACE(p_dm_odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("[IQK]S0 Rx IQK Success!!\n"));
1731 /* result[t][0] = (odm_get_bb_reg(p_dm_odm, REG_TX_POWER_BEFORE_IQK_A, MASKDWORD)&0x3FF0000)>>16;
1732 * result[t][1] = (odm_get_bb_reg(p_dm_odm, REG_TX_POWER_AFTER_IQK_A, MASKDWORD)&0x3FF0000)>>16; */
1733 result[t][6] = (odm_get_bb_reg(p_dm_odm, REG_RX_POWER_BEFORE_IQK_A_2, MASKDWORD) & 0x3FF0000) >> 16;
1734 result[t][7] = (odm_get_bb_reg(p_dm_odm, REG_RX_POWER_AFTER_IQK_A_2, MASKDWORD) & 0x3FF0000) >> 16;
1738 ODM_RT_TRACE(p_dm_odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("[IQK]S0 Rx IQK Fail!!\n"));
1744 if (0x00 == path_bok)
1745 ODM_RT_TRACE(p_dm_odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("[IQK]S0 IQK failed!!\n"));
1750 /* Back to BB mode, load original value */
1751 ODM_RT_TRACE(p_dm_odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("[IQK]IQK:Back to BB mode, load original value!\n"));
1752 odm_set_bb_reg(p_dm_odm, REG_FPGA0_IQK, 0xffffff00, 0x000000);
1755 #if !(DM_ODM_SUPPORT_TYPE & ODM_AP)
1757 /* Reload ADDA power saving parameters*/
1758 _phy_reload_adda_registers8703b(p_adapter, ADDA_REG, p_dm_odm->rf_calibrate_info.ADDA_backup, IQK_ADDA_REG_NUM);
1760 /* Reload MAC parameters*/
1761 _phy_reload_mac_registers8703b(p_adapter, IQK_MAC_REG, p_dm_odm->rf_calibrate_info.IQK_MAC_backup);
1763 _phy_reload_adda_registers8703b(p_adapter, IQK_BB_REG_92C, p_dm_odm->rf_calibrate_info.IQK_BB_backup, IQK_BB_REG_NUM);
1765 /* Reload ADDA power saving parameters*/
1766 _phy_reload_adda_registers8703b(p_dm_odm, ADDA_REG, p_dm_odm->rf_calibrate_info.ADDA_backup, IQK_ADDA_REG_NUM);
1768 /* Reload MAC parameters*/
1769 _phy_reload_mac_registers8703b(p_dm_odm, IQK_MAC_REG, p_dm_odm->rf_calibrate_info.IQK_MAC_backup);
1771 _phy_reload_adda_registers8703b(p_dm_odm, IQK_BB_REG_92C, p_dm_odm->rf_calibrate_info.IQK_BB_backup, IQK_BB_REG_NUM);
1774 /* Allen initial gain 0xc50 */
1775 /* Restore RX initial gain */
1776 odm_set_bb_reg(p_dm_odm, 0xc50, MASKBYTE0, 0x50);
1777 odm_set_bb_reg(p_dm_odm, 0xc50, MASKBYTE0, tmp0xc50);
1779 /* load 0xe30 IQC default value */
1780 odm_set_bb_reg(p_dm_odm, REG_TX_IQK_TONE_A, MASKDWORD, 0x01008c00);
1781 odm_set_bb_reg(p_dm_odm, REG_RX_IQK_TONE_A, MASKDWORD, 0x01008c00);
1784 ODM_RT_TRACE(p_dm_odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("[IQK]_phy_iq_calibrate_8703b() <==\n"));
1790 _phy_lc_calibrate_8703b(
1791 struct PHY_DM_STRUCT *p_dm_odm,
1796 u32 rf_amode = 0, rf_bmode = 0, lc_cal, cnt;
1797 #if !(DM_ODM_SUPPORT_TYPE & ODM_AP)
1798 struct _ADAPTER *p_adapter = p_dm_odm->adapter;
1801 /*Check continuous TX and Packet TX*/
1802 tmp_reg = odm_read_1byte(p_dm_odm, 0xd03);
1804 if ((tmp_reg & 0x70) != 0) /*Deal with contisuous TX case*/
1805 odm_write_1byte(p_dm_odm, 0xd03, tmp_reg & 0x8F); /*disable all continuous TX*/
1806 else /* Deal with Packet TX case*/
1807 odm_write_1byte(p_dm_odm, REG_TXPAUSE, 0xFF); /* block all queues*/
1811 lc_cal = odm_get_rf_reg(p_dm_odm, ODM_RF_PATH_A, RF_CHNLBW, RFREGOFFSETMASK);
1814 odm_set_rf_reg(p_dm_odm, ODM_RF_PATH_A, RF_CHNLBW, RFREGOFFSETMASK, lc_cal | 0x08000);
1816 for (cnt = 0; cnt < 100; cnt++) {
1817 if (odm_get_rf_reg(p_dm_odm, ODM_RF_PATH_A, RF_CHNLBW, 0x8000) != 0x1)
1823 /*Recover channel number*/
1824 odm_set_rf_reg(p_dm_odm, ODM_RF_PATH_A, RF_CHNLBW, RFREGOFFSETMASK, lc_cal);
1827 /*Restore original situation*/
1828 if ((tmp_reg & 0x70) != 0) {
1829 /*Deal with contisuous TX case*/
1830 odm_write_1byte(p_dm_odm, 0xd03, tmp_reg);
1832 /* Deal with Packet TX case*/
1833 odm_write_1byte(p_dm_odm, REG_TXPAUSE, 0x00);
1838 /* IQK version:V0.4*/
1839 /* 1. add coex. related setting*/
1842 phy_iq_calibrate_8703b(
1843 #if (DM_ODM_SUPPORT_TYPE & ODM_AP)
1844 struct PHY_DM_STRUCT *p_dm_odm,
1846 struct _ADAPTER *p_adapter,
1851 #if !(DM_ODM_SUPPORT_TYPE & ODM_AP)
1852 HAL_DATA_TYPE *p_hal_data = GET_HAL_DATA(p_adapter);
1854 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
1855 struct PHY_DM_STRUCT *p_dm_odm = &p_hal_data->DM_OutSrc;
1856 #else /* (DM_ODM_SUPPORT_TYPE == ODM_CE)*/
1857 struct PHY_DM_STRUCT *p_dm_odm = &p_hal_data->odmpriv;
1860 #if (MP_DRIVER == 1)
1861 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
1862 PMPT_CONTEXT p_mpt_ctx = &(p_adapter->mpt_ctx);
1863 #else/* (DM_ODM_SUPPORT_TYPE == ODM_CE)*/
1864 PMPT_CONTEXT p_mpt_ctx = &(p_adapter->mppriv.mpt_ctx);
1866 #endif/*(MP_DRIVER == 1)*/
1872 struct odm_rf_calibration_structure *p_rf_calibrate_info = &(p_dm_odm->rf_calibrate_info);
1874 s32 result[4][8]; /* last is final result */
1875 u8 i, final_candidate, indexforchannel;
1876 boolean is_patha_ok, is_pathb_ok;
1877 s32 rege94, rege9c, regea4, regeac, regeb4, regebc, regec4, regecc, reg_tmp = 0;
1878 boolean is12simular, is13simular, is23simular;
1879 boolean is_start_cont_tx = false, is_single_tone = false, is_carrier_suppression = false;
1880 u32 IQK_BB_REG_92C[IQK_BB_REG_NUM] = {
1881 REG_OFDM_0_XA_RX_IQ_IMBALANCE, REG_OFDM_0_XB_RX_IQ_IMBALANCE,
1882 REG_OFDM_0_ECCA_THRESHOLD, REG_OFDM_0_AGC_RSSI_TABLE,
1883 REG_OFDM_0_XA_TX_IQ_IMBALANCE, REG_OFDM_0_XB_TX_IQ_IMBALANCE,
1884 REG_OFDM_0_XC_TX_AFE, REG_OFDM_0_XD_TX_AFE,
1885 REG_OFDM_0_RX_IQ_EXT_ANTA
1887 boolean is_reload_iqk = false;
1889 #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN | ODM_CE))
1890 if (odm_check_power_status(p_adapter) == false)
1893 struct rtl8192cd_priv *priv = p_dm_odm->priv;
1896 if (priv->pshare->rf_ft_var.mp_specific) {
1897 if ((OPMODE & WIFI_MP_CTX_PACKET) || (OPMODE & WIFI_MP_CTX_ST))
1902 if (priv->pshare->IQK_88E_done)
1904 priv->pshare->IQK_88E_done = 1;
1908 #if (DM_ODM_SUPPORT_TYPE == ODM_CE)
1909 if (!(p_dm_odm->support_ability & ODM_RF_CALIBRATION))
1915 if (p_dm_odm->mp_mode == true) {
1917 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
1918 /* <VincentL, 131231> Add to determine IQK ON/OFF in certain case, Suggested by Cheng.*/
1919 if (!p_hal_data->iqk_mp_switch)
1923 is_start_cont_tx = p_mpt_ctx->is_start_cont_tx;
1924 is_single_tone = p_mpt_ctx->is_single_tone;
1925 is_carrier_suppression = p_mpt_ctx->is_carrier_suppression;
1927 /* 20120213<Kordan> Turn on when continuous Tx to pass lab testing. (required by Edlu)*/
1928 if (is_single_tone || is_carrier_suppression)
1938 if (p_dm_odm->rf_calibrate_info.is_iqk_in_progress)
1941 #if (DM_ODM_SUPPORT_TYPE & (ODM_CE | ODM_AP))
1943 #else/* for ODM_WIN */
1944 if (is_recovery && (!p_adapter->bInHctTest)) /* YJ,add for PowerTest,120405 */
1947 ODM_RT_TRACE(p_dm_odm, ODM_COMP_INIT, ODM_DBG_LOUD, ("[IQK]phy_iq_calibrate_8703b: Return due to is_recovery!\n"));
1948 #if !(DM_ODM_SUPPORT_TYPE & ODM_AP)
1949 _phy_reload_adda_registers8703b(p_adapter, IQK_BB_REG_92C, p_dm_odm->rf_calibrate_info.IQK_BB_backup_recover, 9);
1951 _phy_reload_adda_registers8703b(p_dm_odm, IQK_BB_REG_92C, p_dm_odm->rf_calibrate_info.IQK_BB_backup_recover, 9);
1957 if (p_dm_odm->mp_mode == false) {
1959 /* check if IQK had been done before!! */
1961 ODM_RT_TRACE(p_dm_odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("[IQK] 0xc80 = 0x%x\n", p_rf_calibrate_info->tx_iqc_8703b[idx_0xc80][VAL]));
1962 if (odm_set_iqc_by_rfpath_8703b(p_dm_odm)) {
1963 ODM_RT_TRACE(p_dm_odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("[IQK]IQK value is reloaded!!!\n"));
1964 is_reload_iqk = true;
1971 /*Check & wait if BT is doing IQK*/
1973 if (p_dm_odm->mp_mode == false) {
1975 /* Set H2C cmd to inform FW (enable). */
1976 SetFwWiFiCalibrationCmd(p_adapter, 1);
1979 u1b_tmp = odm_read_1byte(p_dm_odm, 0x1e6);
1980 while (u1b_tmp != 0x1 && count < 1000) {
1981 odm_stall_execution(10);
1982 u1b_tmp = odm_read_1byte(p_dm_odm, 0x1e6);
1987 RT_TRACE(COMP_INIT, DBG_LOUD, ("[IQK]Polling 0x1e6 to 1 for WiFi calibration H2C cmd FAIL! count(%d)", count));
1990 /* Wait BT IQK finished. */
1991 /* polling 0x1e7[0]=1 or 300ms timeout */
1992 u1b_tmp = odm_read_1byte(p_dm_odm, 0x1e7);
1993 while ((!(u1b_tmp & BIT(0))) && count < 6000) {
1994 odm_stall_execution(50);
1995 u1b_tmp = odm_read_1byte(p_dm_odm, 0x1e7);
2001 /* IQK start!!!!!!!!!! */
2003 ODM_RT_TRACE(p_dm_odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("[IQK]IQK:Start!!!\n"));
2004 odm_acquire_spin_lock(p_dm_odm, RT_IQK_SPINLOCK);
2005 p_dm_odm->rf_calibrate_info.is_iqk_in_progress = true;
2006 odm_release_spin_lock(p_dm_odm, RT_IQK_SPINLOCK);
2009 for (i = 0; i < 8; i++) {
2015 final_candidate = 0xff;
2016 is_patha_ok = false;
2017 is_pathb_ok = false;
2018 is12simular = false;
2019 is23simular = false;
2020 is13simular = false;
2023 for (i = 0; i < 3; i++) {
2024 #if !(DM_ODM_SUPPORT_TYPE & ODM_AP)
2025 _phy_iq_calibrate_8703b(p_adapter, result, i);
2027 _phy_iq_calibrate_8703b(p_dm_odm, result, i);
2032 #if !(DM_ODM_SUPPORT_TYPE & ODM_AP)
2033 is12simular = phy_simularity_compare_8703b(p_adapter, result, 0, 1);
2035 is12simular = phy_simularity_compare_8703b(p_dm_odm, result, 0, 1);
2038 final_candidate = 0;
2039 ODM_RT_TRACE(p_dm_odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("[IQK]IQK: is12simular final_candidate is %x\n", final_candidate));
2045 #if !(DM_ODM_SUPPORT_TYPE & ODM_AP)
2046 is13simular = phy_simularity_compare_8703b(p_adapter, result, 0, 2);
2048 is13simular = phy_simularity_compare_8703b(p_dm_odm, result, 0, 2);
2051 final_candidate = 0;
2052 ODM_RT_TRACE(p_dm_odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("[IQK]IQK: is13simular final_candidate is %x\n", final_candidate));
2056 #if !(DM_ODM_SUPPORT_TYPE & ODM_AP)
2057 is23simular = phy_simularity_compare_8703b(p_adapter, result, 1, 2);
2059 is23simular = phy_simularity_compare_8703b(p_dm_odm, result, 1, 2);
2062 final_candidate = 1;
2063 ODM_RT_TRACE(p_dm_odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("[IQK]IQK: is23simular final_candidate is %x\n", final_candidate));
2065 for (i = 0; i < 8; i++)
2066 reg_tmp += result[3][i];
2069 final_candidate = 3;
2071 final_candidate = 0xFF;
2075 /* RT_TRACE(COMP_INIT,DBG_LOUD,("Release Mutex in IQCalibrate\n"));*/
2077 for (i = 0; i < 4; i++) {
2078 rege94 = result[i][0];
2079 rege9c = result[i][1];
2080 regea4 = result[i][2];
2081 regeac = result[i][3];
2082 regeb4 = result[i][4];
2083 regebc = result[i][5];
2084 regec4 = result[i][6];
2085 regecc = result[i][7];
2086 ODM_RT_TRACE(p_dm_odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("[IQK]IQK: rege94=%x rege9c=%x regea4=%x regeac=%x regeb4=%x regebc=%x regec4=%x regecc=%x\n ", rege94, rege9c, regea4, regeac, regeb4, regebc, regec4, regecc));
2089 if (final_candidate != 0xff) {
2090 p_dm_odm->rf_calibrate_info.rege94 = rege94 = result[final_candidate][0];
2091 p_dm_odm->rf_calibrate_info.rege9c = rege9c = result[final_candidate][1];
2092 regea4 = result[final_candidate][2];
2093 regeac = result[final_candidate][3];
2094 p_dm_odm->rf_calibrate_info.regeb4 = regeb4 = result[final_candidate][4];
2095 p_dm_odm->rf_calibrate_info.regebc = regebc = result[final_candidate][5];
2096 regec4 = result[final_candidate][6];
2097 regecc = result[final_candidate][7];
2098 ODM_RT_TRACE(p_dm_odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("[IQK]IQK: final_candidate is %x\n", final_candidate));
2099 ODM_RT_TRACE(p_dm_odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("[IQK]IQK: rege94=%x rege9c=%x regea4=%x regeac=%x regeb4=%x regebc=%x regec4=%x regecc=%x\n ", rege94, rege9c, regea4, regeac, regeb4, regebc, regec4, regecc));
2100 is_patha_ok = is_pathb_ok = true;
2102 ODM_RT_TRACE(p_dm_odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("[IQK]IQK: FAIL use default value\n"));
2103 p_dm_odm->rf_calibrate_info.rege94 = p_dm_odm->rf_calibrate_info.regeb4 = 0x100; /* X default value */
2104 p_dm_odm->rf_calibrate_info.rege9c = p_dm_odm->rf_calibrate_info.regebc = 0x0; /* Y default value */
2107 /* fill IQK matrix */
2109 _phy_path_a_fill_iqk_matrix8703b(p_adapter, is_patha_ok, result, final_candidate, (regea4 == 0));
2111 * _phy_path_b_fill_iqk_matrix8703b(p_adapter, is_pathb_ok, result, final_candidate, (regec4 == 0)); */
2113 #if !(DM_ODM_SUPPORT_TYPE & ODM_AP)
2114 indexforchannel = odm_get_right_chnl_place_for_iqk(*p_dm_odm->p_channel);
2116 indexforchannel = 0;
2119 /* To Fix BSOD when final_candidate is 0xff
2120 * by sherry 20120321 */
2121 if (final_candidate < 4) {
2122 for (i = 0; i < iqk_matrix_reg_num; i++)
2123 p_dm_odm->rf_calibrate_info.iqk_matrix_reg_setting[indexforchannel].value[0][i] = result[final_candidate][i];
2124 p_dm_odm->rf_calibrate_info.iqk_matrix_reg_setting[indexforchannel].is_iqk_done = true;
2126 /* RT_DISP(FINIT, INIT_IQK, ("\nIQK OK indexforchannel %d.\n", indexforchannel)); */
2127 ODM_RT_TRACE(p_dm_odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("[IQK]\nIQK OK indexforchannel %d.\n", indexforchannel));
2130 #if !(DM_ODM_SUPPORT_TYPE & ODM_AP)
2131 _phy_save_adda_registers8703b(p_adapter, IQK_BB_REG_92C, p_dm_odm->rf_calibrate_info.IQK_BB_backup_recover, 9);
2133 _phy_save_adda_registers8703b(p_dm_odm, IQK_BB_REG_92C, p_dm_odm->rf_calibrate_info.IQK_BB_backup_recover, IQK_BB_REG_NUM);
2136 /* fill IQK register */
2137 odm_set_iqc_by_rfpath_8703b(p_dm_odm);
2139 if (p_dm_odm->mp_mode == false) {
2141 /* Set H2C cmd to inform FW (disable). */
2142 SetFwWiFiCalibrationCmd(p_adapter, 0);
2146 u1b_tmp = odm_read_1byte(p_dm_odm, 0x1e6);
2147 while (u1b_tmp != 0 && count < 1000) {
2148 odm_stall_execution(10);
2149 u1b_tmp = odm_read_1byte(p_dm_odm, 0x1e6);
2154 RT_TRACE(COMP_INIT, DBG_LOUD, ("[IQK]Polling 0x1e6 to 0 for WiFi calibration H2C cmd FAIL! count(%d)", count));
2159 odm_acquire_spin_lock(p_dm_odm, RT_IQK_SPINLOCK);
2160 p_dm_odm->rf_calibrate_info.is_iqk_in_progress = false;
2161 odm_release_spin_lock(p_dm_odm, RT_IQK_SPINLOCK);
2163 ODM_RT_TRACE(p_dm_odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("[IQK]IQK finished\n"));
2168 phy_lc_calibrate_8703b(
2172 boolean is_start_cont_tx = false, is_single_tone = false, is_carrier_suppression = false;
2173 u32 timeout = 2000, timecount = 0;
2174 struct PHY_DM_STRUCT *p_dm_odm = (struct PHY_DM_STRUCT *)p_dm_void;
2175 #if !(DM_ODM_SUPPORT_TYPE & ODM_AP)
2176 struct _ADAPTER *p_adapter = p_dm_odm->adapter;
2177 HAL_DATA_TYPE *p_hal_data = GET_HAL_DATA(p_adapter);
2179 #if (MP_DRIVER == 1)
2180 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
2181 PMPT_CONTEXT p_mpt_ctx = &(p_adapter->mpt_ctx);
2182 #else/* (DM_ODM_SUPPORT_TYPE == ODM_CE)*/
2183 PMPT_CONTEXT p_mpt_ctx = &(p_adapter->mppriv.mpt_ctx);
2185 #endif/*(MP_DRIVER == 1)*/
2192 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
2193 /* <VincentL, 140319> Add to Disable Default LCK when Cont Tx, For Lab Test Usage. */
2194 if (!p_hal_data->iqk_mp_switch)
2198 is_start_cont_tx = p_mpt_ctx->is_start_cont_tx;
2199 is_single_tone = p_mpt_ctx->is_single_tone;
2200 is_carrier_suppression = p_mpt_ctx->is_carrier_suppression;
2208 #if (DM_ODM_SUPPORT_TYPE == ODM_CE)
2209 if (!(p_dm_odm->support_ability & ODM_RF_CALIBRATION))
2213 /* 20120213<Kordan> Turn on when continuous Tx to pass lab testing. (required by Edlu) */
2214 if (is_single_tone || is_carrier_suppression)
2217 while (*(p_dm_odm->p_is_scan_in_process) && timecount < timeout) {
2222 p_dm_odm->rf_calibrate_info.is_lck_in_progress = true;
2225 _phy_lc_calibrate_8703b(p_dm_odm, false);
2228 p_dm_odm->rf_calibrate_info.is_lck_in_progress = false;
2230 ODM_RT_TRACE(p_dm_odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("LCK:Finish!!!interface %d\n", p_dm_odm->interface_index));
2234 void _phy_set_rf_path_switch_8703b(
2235 #if (DM_ODM_SUPPORT_TYPE & ODM_AP)
2236 struct PHY_DM_STRUCT *p_dm_odm,
2238 struct _ADAPTER *p_adapter,
2244 HAL_DATA_TYPE *p_hal_data = GET_HAL_DATA(p_adapter);
2245 #if (DM_ODM_SUPPORT_TYPE == ODM_CE)
2246 struct PHY_DM_STRUCT *p_dm_odm = &p_hal_data->odmpriv;
2248 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
2249 struct PHY_DM_STRUCT *p_dm_odm = &p_hal_data->DM_OutSrc;
2252 if (is_main) { /*Set WIFI S1*/
2253 odm_set_bb_reg(p_dm_odm, 0x7C4, MASKLWORD, 0x7703);
2254 odm_set_bb_reg(p_dm_odm, 0x7C0, MASKDWORD, 0xC00F0038);
2255 } else { /*Set BT S0*/
2256 odm_set_bb_reg(p_dm_odm, 0x7C4, MASKLWORD, 0xCC03);
2257 odm_set_bb_reg(p_dm_odm, 0x7C0, MASKDWORD, 0xC00F0038);
2261 void phy_set_rf_path_switch_8703b(
2262 #if (DM_ODM_SUPPORT_TYPE & ODM_AP)
2263 struct PHY_DM_STRUCT *p_dm_odm,
2265 struct _ADAPTER *p_adapter,
2271 HAL_DATA_TYPE *p_hal_data = GET_HAL_DATA(p_adapter);
2272 #if (DM_ODM_SUPPORT_TYPE == ODM_CE)
2273 struct PHY_DM_STRUCT *p_dm_odm = &p_hal_data->odmpriv;
2275 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
2276 struct PHY_DM_STRUCT *p_dm_odm = &p_hal_data->DM_OutSrc;
2283 #if !(DM_ODM_SUPPORT_TYPE & ODM_AP)
2284 _phy_set_rf_path_switch_8703b(p_adapter, is_main, true);
2290 /*return value true => WIFI(S1); false => BT(S0)*/
2291 boolean _phy_query_rf_path_switch_8703b(
2292 #if (DM_ODM_SUPPORT_TYPE & ODM_AP)
2293 struct PHY_DM_STRUCT *p_dm_odm,
2295 struct _ADAPTER *p_adapter,
2300 #if !(DM_ODM_SUPPORT_TYPE & ODM_AP)
2301 HAL_DATA_TYPE *p_hal_data = GET_HAL_DATA(p_adapter);
2302 #if (DM_ODM_SUPPORT_TYPE == ODM_CE)
2303 struct PHY_DM_STRUCT *p_dm_odm = &p_hal_data->odmpriv;
2305 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
2306 struct PHY_DM_STRUCT *p_dm_odm = &p_hal_data->DM_OutSrc;
2311 if (odm_get_bb_reg(p_dm_odm, 0x7C4, MASKLWORD) == 0x7703)
2320 /*return value true => WIFI(S1); false => BT(S0)*/
2321 boolean phy_query_rf_path_switch_8703b(
2322 #if (DM_ODM_SUPPORT_TYPE & ODM_AP)
2323 struct PHY_DM_STRUCT *p_dm_odm
2325 struct _ADAPTER *p_adapter
2334 #if !(DM_ODM_SUPPORT_TYPE & ODM_AP)
2335 return _phy_query_rf_path_switch_8703b(p_adapter, false);
2337 return _phy_query_rf_path_switch_8703b(p_dm_odm, false);