/****************************************************************************** * * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. * * This program is free software; you can redistribute it and/or modify it * under the terms of version 2 of the GNU General Public License as * published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License along with * this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA * * ******************************************************************************/ #include "mp_precomp.h" #include "../phydm_precomp.h" #if (RTL8822B_SUPPORT == 1) /*---------------------------Define Local Constant---------------------------*/ /*---------------------------Define Local Constant---------------------------*/ #if !(DM_ODM_SUPPORT_TYPE & ODM_AP) void DoIQK_8822B( PVOID pDM_VOID, u1Byte DeltaThermalIndex, u1Byte ThermalValue, u1Byte Threshold ) { PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; PADAPTER Adapter = pDM_Odm->Adapter; HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter); ODM_ResetIQKResult(pDM_Odm); pDM_Odm->RFCalibrateInfo.ThermalValue_IQK= ThermalValue; PHY_IQCalibrate_8822B(pDM_Odm, TRUE); } #else /*Originally pConfig->DoIQK is hooked PHY_IQCalibrate_8822B, but DoIQK_8822B and PHY_IQCalibrate_8822B have different arguments*/ void DoIQK_8822B( PVOID pDM_VOID, u1Byte DeltaThermalIndex, u1Byte ThermalValue, u1Byte Threshold ) { PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; BOOLEAN bReCovery = (BOOLEAN) DeltaThermalIndex; PHY_IQCalibrate_8822B(pDM_Odm, TRUE); } #endif VOID _IQK_Fill_IQK_Report_8822B( IN PVOID pDM_VOID, u1Byte channel ) { PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; PIQK_INFO pIQK_info = &pDM_Odm->IQK_info; u4Byte tmp1 = 0x0, tmp2 = 0x0, tmp3 = 0x0; u1Byte i; for (i = 0; i < SS_8822B; i++) { tmp1 = tmp1 + ((pIQK_info->IQK_fail_report[channel][i][TX_IQK] & 0x1) << i); tmp2 = tmp2 + ((pIQK_info->IQK_fail_report[channel][i][RX_IQK] & 0x1) << (i+4)); tmp3 = tmp3 + ((pIQK_info->RXIQK_fail_code[channel][i] & 0x3) << (i*2+8)); } ODM_Write4Byte(pDM_Odm, 0x1b00, 0xf8000008); ODM_SetBBReg(pDM_Odm, 0x1bf0, 0x0000ffff, tmp1 | tmp2 | tmp3); for (i = 0; i < 2; i++) ODM_Write4Byte(pDM_Odm, 0x1be8+(i*4), (pIQK_info->RXIQK_AGC[channel][(i*2)+1] << 16) | pIQK_info->RXIQK_AGC[channel][i*2]); } VOID _IQK_IQK_failReport_8822B( IN PDM_ODM_T pDM_Odm ) { u4Byte tmp1bf0 = 0x0; u1Byte i; tmp1bf0 = ODM_Read4Byte(pDM_Odm, 0x1bf0); for (i = 0; i < 4; i++) { if (tmp1bf0 & (0x1 << i)) #if !(DM_ODM_SUPPORT_TYPE & ODM_AP) ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("[IQK] please check S%d TXIQK\n", i)); #else panic_printk("[IQK] please check S%d TXIQK\n", i); #endif if (tmp1bf0 & (0x1 << (i + 12))) #if !(DM_ODM_SUPPORT_TYPE & ODM_AP) ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("[IQK] please check S%d RXIQK\n", i)); #else panic_printk("[IQK] please check S%d RXIQK\n", i); #endif } } VOID _IQK_BackupMacBB_8822B( IN PDM_ODM_T pDM_Odm, IN pu4Byte MAC_backup, IN pu4Byte BB_backup, IN pu4Byte Backup_MAC_REG, IN pu4Byte Backup_BB_REG ) { u4Byte i; for (i = 0; i < MAC_REG_NUM_8822B; i++) MAC_backup[i] = ODM_Read4Byte(pDM_Odm, Backup_MAC_REG[i]); for (i = 0; i < BB_REG_NUM_8822B; i++) BB_backup[i] = ODM_Read4Byte(pDM_Odm, Backup_BB_REG[i]); /* ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("[IQK]BackupMacBB Success!!!!\n")); */ } VOID _IQK_BackupRF_8822B( IN PDM_ODM_T pDM_Odm, IN u4Byte RF_backup[][2], IN pu4Byte Backup_RF_REG ) { u4Byte i; for (i = 0; i < RF_REG_NUM_8822B; i++) { RF_backup[i][ODM_RF_PATH_A] = ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_A, Backup_RF_REG[i], bRFRegOffsetMask); RF_backup[i][ODM_RF_PATH_B] = ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_B, Backup_RF_REG[i], bRFRegOffsetMask); } /* ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("[IQK]BackupRF Success!!!!\n")); */ } VOID _IQK_AGCbnd_int_8822B( IN PDM_ODM_T pDM_Odm ) { /*initialize RX AGC bnd, it must do after bbreset*/ ODM_Write4Byte(pDM_Odm, 0x1b00, 0xf8000008); ODM_Write4Byte(pDM_Odm, 0x1b00, 0xf80a7008); ODM_Write4Byte(pDM_Odm, 0x1b00, 0xf8015008); ODM_Write4Byte(pDM_Odm, 0x1b00, 0xf8000008); /*ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_TRACE, ("[IQK]init. rx agc bnd\n"));*/ } VOID _IQK_BB_Reset_8822B( IN PDM_ODM_T pDM_Odm ) { BOOLEAN CCAing = FALSE; u4Byte count = 0; ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x0, bRFRegOffsetMask, 0x10000); ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, 0x0, bRFRegOffsetMask, 0x10000); while (1) { ODM_Write4Byte(pDM_Odm, 0x8fc, 0x0); ODM_SetBBReg(pDM_Odm, 0x198c, 0x7, 0x7); CCAing = (BOOLEAN) ODM_GetBBReg(pDM_Odm, 0xfa0, BIT3); if (count > 30) CCAing = FALSE; if (CCAing) { ODM_delay_ms(1); count++; } else { ODM_Write1Byte(pDM_Odm, 0x808, 0x0); /*RX ant off*/ ODM_SetBBReg(pDM_Odm, 0xa04, BIT27|BIT26|BIT25|BIT24, 0x0); /*CCK RX Path off*/ /*BBreset*/ ODM_SetBBReg(pDM_Odm, 0x0, BIT16, 0x0); ODM_SetBBReg(pDM_Odm, 0x0, BIT16, 0x1); if (ODM_GetBBReg(pDM_Odm, 0x660, BIT16)) ODM_Write4Byte(pDM_Odm, 0x6b4, 0x89000006); /*ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("[IQK]BBreset!!!!\n"));*/ break; } } } VOID _IQK_AFESetting_8822B( IN PDM_ODM_T pDM_Odm, IN BOOLEAN Do_IQK ) { if (Do_IQK) { ODM_Write4Byte(pDM_Odm, 0xc60, 0x50000000); ODM_Write4Byte(pDM_Odm, 0xc60, 0x70070040); ODM_Write4Byte(pDM_Odm, 0xe60, 0x50000000); ODM_Write4Byte(pDM_Odm, 0xe60, 0x70070040); ODM_Write4Byte(pDM_Odm, 0xc58, 0xd8000402); ODM_Write4Byte(pDM_Odm, 0xc5c, 0xd1000120); ODM_Write4Byte(pDM_Odm, 0xc6c, 0x00000a15); ODM_Write4Byte(pDM_Odm, 0xe58, 0xd8000402); ODM_Write4Byte(pDM_Odm, 0xe5c, 0xd1000120); ODM_Write4Byte(pDM_Odm, 0xe6c, 0x00000a15); _IQK_BB_Reset_8822B(pDM_Odm); /* ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("[IQK]AFE setting for IQK mode!!!!\n")); */ } else { ODM_Write4Byte(pDM_Odm, 0xc60, 0x50000000); ODM_Write4Byte(pDM_Odm, 0xc60, 0x70038040); ODM_Write4Byte(pDM_Odm, 0xe60, 0x50000000); ODM_Write4Byte(pDM_Odm, 0xe60, 0x70038040); ODM_Write4Byte(pDM_Odm, 0xc58, 0xd8020402); ODM_Write4Byte(pDM_Odm, 0xc5c, 0xde000120); ODM_Write4Byte(pDM_Odm, 0xc6c, 0x0000122a); ODM_Write4Byte(pDM_Odm, 0xe58, 0xd8020402); ODM_Write4Byte(pDM_Odm, 0xe5c, 0xde000120); ODM_Write4Byte(pDM_Odm, 0xe6c, 0x0000122a); /* ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("[IQK]AFE setting for Normal mode!!!!\n")); */ } } VOID _IQK_RestoreMacBB_8822B( IN PDM_ODM_T pDM_Odm, IN pu4Byte MAC_backup, IN pu4Byte BB_backup, IN pu4Byte Backup_MAC_REG, IN pu4Byte Backup_BB_REG ) { u4Byte i; for (i = 0; i < MAC_REG_NUM_8822B; i++) ODM_Write4Byte(pDM_Odm, Backup_MAC_REG[i], MAC_backup[i]); for (i = 0; i < BB_REG_NUM_8822B; i++) ODM_Write4Byte(pDM_Odm, Backup_BB_REG[i], BB_backup[i]); /* ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("[IQK]RestoreMacBB Success!!!!\n")); */ } VOID _IQK_RestoreRF_8822B( IN PDM_ODM_T pDM_Odm, IN pu4Byte Backup_RF_REG, IN u4Byte RF_backup[][2] ) { u4Byte i; ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0xef, bRFRegOffsetMask, 0x0); ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, 0xef, bRFRegOffsetMask, 0x0); /*0xdf[4]=0*/ ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0xdf, bRFRegOffsetMask, RF_backup[0][ODM_RF_PATH_A]&(~BIT4)); ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, 0xdf, bRFRegOffsetMask, RF_backup[0][ODM_RF_PATH_B]&(~BIT4)); for (i = 1; i < RF_REG_NUM_8822B; i++) { ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, Backup_RF_REG[i], bRFRegOffsetMask, RF_backup[i][ODM_RF_PATH_A]); ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, Backup_RF_REG[i], bRFRegOffsetMask, RF_backup[i][ODM_RF_PATH_B]); } /* ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("[IQK]RestoreRF Success!!!!\n")); */ } void _IQK_backupIQK_8822B( IN PDM_ODM_T pDM_Odm, IN u1Byte step ) { PIQK_INFO pIQK_info = &pDM_Odm->IQK_info; u1Byte i, j, k, path, idx; u4Byte tmp; u2Byte IQK_Apply[2] = {0xc94, 0xe94}; if (step == 0x0) { pIQK_info->IQK_Channel[1] = pIQK_info->IQK_Channel[0]; for (i = 0; i < 2; i++) { pIQK_info->LOK_IDAC[1][i] = pIQK_info->LOK_IDAC[0][i]; pIQK_info->RXIQK_AGC[1][i] = pIQK_info->RXIQK_AGC[0][i]; pIQK_info->bypassIQK[1][i] = pIQK_info->bypassIQK[0][i]; pIQK_info->RXIQK_fail_code[1][i] = pIQK_info->RXIQK_fail_code[0][i]; for (j = 0; j < 2; j++) { pIQK_info->IQK_fail_report[1][i][j] = pIQK_info->IQK_fail_report[0][i][j]; for (k = 0; k < 8; k++) { pIQK_info->IQK_CFIR_real[1][i][j][k] = pIQK_info->IQK_CFIR_real[0][i][j][k]; pIQK_info->IQK_CFIR_imag[1][i][j][k] = pIQK_info->IQK_CFIR_imag[0][i][j][k]; } } } for (i = 0; i < 4; i++) { pIQK_info->RXIQK_fail_code[0][i] = 0x0; pIQK_info->RXIQK_AGC[0][i] = 0x0; for (j = 0; j < 2; j++) { pIQK_info->IQK_fail_report[0][i][j] = TRUE; pIQK_info->gs_retry_count[0][i][j] = 0x0; } for (j = 0; j < 3; j++) pIQK_info->retry_count[0][i][j] = 0x0; } } else { pIQK_info->IQK_Channel[0] = pIQK_info->RFReg18; for (path = 0; path < 2; path++) { pIQK_info->LOK_IDAC[0][path] = ODM_GetRFReg(pDM_Odm, path, 0x58, bRFRegOffsetMask); pIQK_info->bypassIQK[0][path] = ODM_GetBBReg(pDM_Odm, IQK_Apply[path], bMaskDWord); for (idx = 0; idx < 2; idx++) { ODM_SetBBReg(pDM_Odm, 0x1b00, bMaskDWord, 0xf8000008 | path << 1); if (idx == 0) ODM_SetBBReg(pDM_Odm, 0x1b0c, BIT13|BIT12, 0x3); else ODM_SetBBReg(pDM_Odm, 0x1b0c, BIT13|BIT12, 0x1); ODM_SetBBReg(pDM_Odm, 0x1bd4, BIT20|BIT19|BIT18|BIT17|BIT16, 0x10); for (i = 0; i < 8; i++) { ODM_SetBBReg(pDM_Odm, 0x1bd8, bMaskDWord, 0xe0000001+(i*4)); tmp = ODM_GetBBReg(pDM_Odm, 0x1bfc, bMaskDWord); pIQK_info->IQK_CFIR_real[0][path][idx][i] = (tmp & 0x0fff0000)>>16; pIQK_info->IQK_CFIR_imag[0][path][idx][i] = tmp & 0xfff; } } ODM_SetBBReg(pDM_Odm, 0x1bd8, bMaskDWord, 0x0); ODM_SetBBReg(pDM_Odm, 0x1b0c, BIT13|BIT12, 0x0); } } } VOID _IQK_ReloadIQKsetting_8822B( IN PDM_ODM_T pDM_Odm, IN u1Byte channel, IN u1Byte reload_idx /*1: reload TX, 2: reload LO, TX, RX*/ ) { PIQK_INFO pIQK_info = &pDM_Odm->IQK_info; u1Byte i, path, idx; u2Byte IQK_Apply[2] = {0xc94, 0xe94}; for (path = 0; path < 2; path++) { if (reload_idx == 2) { ODM_SetRFReg(pDM_Odm, path, 0xdf, BIT4, 0x1); ODM_SetRFReg(pDM_Odm, path, 0x58, bRFRegOffsetMask, pIQK_info->LOK_IDAC[channel][path]); } for (idx = 0; idx < reload_idx; idx++) { ODM_SetBBReg(pDM_Odm, 0x1b00, bMaskDWord, 0xf8000008 | path << 1); ODM_SetBBReg(pDM_Odm, 0x1b2c, bMaskDWord, 0x7); ODM_SetBBReg(pDM_Odm, 0x1b38, bMaskDWord, 0x20000000); ODM_SetBBReg(pDM_Odm, 0x1b3c, bMaskDWord, 0x20000000); ODM_SetBBReg(pDM_Odm, 0x1bcc, bMaskDWord, 0x00000000); if (idx == 0) ODM_SetBBReg(pDM_Odm, 0x1b0c, BIT13|BIT12, 0x3); else ODM_SetBBReg(pDM_Odm, 0x1b0c, BIT13|BIT12, 0x1); ODM_SetBBReg(pDM_Odm, 0x1bd4, BIT20|BIT19|BIT18|BIT17|BIT16, 0x10); for (i = 0; i < 8; i++) { ODM_Write4Byte(pDM_Odm, 0x1bd8, ((0xc0000000 >> idx) + 0x3)+(i*4)+(pIQK_info->IQK_CFIR_real[channel][path][idx][i]<<9)); ODM_Write4Byte(pDM_Odm, 0x1bd8, ((0xc0000000 >> idx) + 0x1)+(i*4)+(pIQK_info->IQK_CFIR_imag[channel][path][idx][i]<<9)); } } ODM_SetBBReg(pDM_Odm, IQK_Apply[path], bMaskDWord, pIQK_info->bypassIQK[channel][path]); ODM_SetBBReg(pDM_Odm, 0x1bd8, bMaskDWord, 0x0); ODM_SetBBReg(pDM_Odm, 0x1b0c, BIT13|BIT12, 0x0); } } BOOLEAN _IQK_ReloadIQK_8822B( IN PDM_ODM_T pDM_Odm, IN BOOLEAN reset ) { PIQK_INFO pIQK_info = &pDM_Odm->IQK_info; u1Byte i; BOOLEAN reload = FALSE; if (reset) { for (i = 0; i < 2; i++) pIQK_info->IQK_Channel[i] = 0x0; } else { pIQK_info->RFReg18 = ODM_GetRFReg(pDM_Odm, 0, 0x18, bRFRegOffsetMask); for (i = 0; i < 2; i++) { if (pIQK_info->RFReg18 == pIQK_info->IQK_Channel[i]) { _IQK_ReloadIQKsetting_8822B(pDM_Odm, i, 2); _IQK_Fill_IQK_Report_8822B(pDM_Odm, i); ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("[IQK]reload IQK result before!!!!\n")); reload = TRUE; } } } return reload; } VOID _IQK_RFESetting_8822B( IN PDM_ODM_T pDM_Odm, IN BOOLEAN extPAon ) { if (extPAon) { /*RFE setting*/ ODM_Write4Byte(pDM_Odm, 0xcb0, 0x77777777); ODM_Write4Byte(pDM_Odm, 0xcb4, 0x00007777); ODM_Write4Byte(pDM_Odm, 0xcbc, 0x0000083B); ODM_Write4Byte(pDM_Odm, 0xeb0, 0x77777777); ODM_Write4Byte(pDM_Odm, 0xeb4, 0x00007777); ODM_Write4Byte(pDM_Odm, 0xebc, 0x0000083B); /*ODM_Write4Byte(pDM_Odm, 0x1990, 0x00000c30);*/ ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("[IQK]external PA on!!!!\n")); } else { /*RFE setting*/ ODM_Write4Byte(pDM_Odm, 0xcb0, 0x77777777); ODM_Write4Byte(pDM_Odm, 0xcb4, 0x00007777); ODM_Write4Byte(pDM_Odm, 0xcbc, 0x00000100); ODM_Write4Byte(pDM_Odm, 0xeb0, 0x77777777); ODM_Write4Byte(pDM_Odm, 0xeb4, 0x00007777); ODM_Write4Byte(pDM_Odm, 0xebc, 0x00000100); /*ODM_Write4Byte(pDM_Odm, 0x1990, 0x00000c30);*/ /* ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("[IQK]external PA off!!!!\n"));*/ } } VOID _IQK_RFSetting_8822B( IN PDM_ODM_T pDM_Odm ) { u1Byte path; u4Byte tmp; ODM_Write4Byte(pDM_Odm, 0x1b00, 0xf8000008); ODM_Write4Byte(pDM_Odm, 0x1bb8, 0x00000000); for (path = 0; path < 2; path++) { /*0xdf:B11 = 1,B4 = 0, B1 = 1*/ tmp = ODM_GetRFReg(pDM_Odm, path, 0xdf, bRFRegOffsetMask); tmp = (tmp&(~BIT4))|BIT1|BIT11; ODM_SetRFReg(pDM_Odm, path, 0xdf, bRFRegOffsetMask, tmp); /*release 0x56 TXBB*/ ODM_SetRFReg(pDM_Odm, path, 0x65, bRFRegOffsetMask, 0x09000); if (*pDM_Odm->pBandType == ODM_BAND_5G) { ODM_SetRFReg(pDM_Odm, path, 0xef, BIT19, 0x1); ODM_SetRFReg(pDM_Odm, path, 0x33, bRFRegOffsetMask, 0x00026); ODM_SetRFReg(pDM_Odm, path, 0x3e, bRFRegOffsetMask, 0x00037); ODM_SetRFReg(pDM_Odm, path, 0x3f, bRFRegOffsetMask, 0xdefce); ODM_SetRFReg(pDM_Odm, path, 0xef, BIT19, 0x0); } else { ODM_SetRFReg(pDM_Odm, path, 0xef, BIT19, 0x1); ODM_SetRFReg(pDM_Odm, path, 0x33, bRFRegOffsetMask, 0x00026); ODM_SetRFReg(pDM_Odm, path, 0x3e, bRFRegOffsetMask, 0x00037); ODM_SetRFReg(pDM_Odm, path, 0x3f, bRFRegOffsetMask, 0x5efce); ODM_SetRFReg(pDM_Odm, path, 0xef, BIT19, 0x0); } } } VOID _IQK_ConfigureMACBB_8822B( IN PDM_ODM_T pDM_Odm ) { /*MACBB register setting*/ ODM_Write1Byte(pDM_Odm, 0x522, 0x7f); ODM_SetBBReg(pDM_Odm, 0x550, BIT11|BIT3, 0x0); ODM_SetBBReg(pDM_Odm, 0x90c, BIT15, 0x1); /*0x90c[15]=1: dac_buf reset selection*/ ODM_SetBBReg(pDM_Odm, 0x9a4, BIT31, 0x0); /*0x9a4[31]=0: Select da clock*/ /*0xc94[0]=1, 0xe94[0]=1: Åýtx±qiqk¥´¥X¨Ó*/ ODM_SetBBReg(pDM_Odm, 0xc94, BIT0, 0x1); ODM_SetBBReg(pDM_Odm, 0xe94, BIT0, 0x1); /* 3-wire off*/ ODM_Write4Byte(pDM_Odm, 0xc00, 0x00000004); ODM_Write4Byte(pDM_Odm, 0xe00, 0x00000004); /* ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("[IQK]Set MACBB setting for IQK!!!!\n"));*/ } VOID _IQK_LOKSetting_8822B( IN PDM_ODM_T pDM_Odm, IN u1Byte Path ) { ODM_Write4Byte(pDM_Odm, 0x1b00, 0xf8000008 | Path << 1); ODM_Write4Byte(pDM_Odm, 0x1bcc, 0x9); ODM_Write1Byte(pDM_Odm, 0x1b23, 0x00); switch (*pDM_Odm->pBandType) { case ODM_BAND_2_4G: ODM_Write1Byte(pDM_Odm, 0x1b2b, 0x00); ODM_SetRFReg(pDM_Odm, Path, 0x56, bRFRegOffsetMask, 0x50df2); ODM_SetRFReg(pDM_Odm, Path, 0x8f, bRFRegOffsetMask, 0xadc00); /* WE_LUT_TX_LOK*/ ODM_SetRFReg(pDM_Odm, Path, 0xef, BIT4, 0x1); ODM_SetRFReg(pDM_Odm, Path, 0x33, BIT1|BIT0, 0x0); break; case ODM_BAND_5G: ODM_Write1Byte(pDM_Odm, 0x1b2b, 0x80); ODM_SetRFReg(pDM_Odm, Path, 0x56, bRFRegOffsetMask, 0x5086c); ODM_SetRFReg(pDM_Odm, Path, 0x8f, bRFRegOffsetMask, 0xa9c00); /* WE_LUT_TX_LOK*/ ODM_SetRFReg(pDM_Odm, Path, 0xef, BIT4, 0x1); ODM_SetRFReg(pDM_Odm, Path, 0x33, BIT1|BIT0, 0x1); break; } /* ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("[IQK]Set LOK setting!!!!\n"));*/ } VOID _IQK_TXKSetting_8822B( IN PDM_ODM_T pDM_Odm, IN u1Byte Path ) { ODM_Write4Byte(pDM_Odm, 0x1b00, 0xf8000008 | Path << 1); ODM_Write4Byte(pDM_Odm, 0x1bcc, 0x9); ODM_Write4Byte(pDM_Odm, 0x1b20, 0x01440008); if (Path == 0x0) ODM_Write4Byte(pDM_Odm, 0x1b00, 0xf800000a); else ODM_Write4Byte(pDM_Odm, 0x1b00, 0xf8000008); ODM_Write4Byte(pDM_Odm, 0x1bcc, 0x3f); switch (*pDM_Odm->pBandType) { case ODM_BAND_2_4G: ODM_SetRFReg(pDM_Odm, Path, 0x56, bRFRegOffsetMask, 0x50df2); ODM_SetRFReg(pDM_Odm, Path, 0x8f, bRFRegOffsetMask, 0xadc00); ODM_Write1Byte(pDM_Odm, 0x1b2b, 0x00); break; case ODM_BAND_5G: ODM_SetRFReg(pDM_Odm, Path, 0x56, bRFRegOffsetMask, 0x500ef); ODM_SetRFReg(pDM_Odm, Path, 0x8f, bRFRegOffsetMask, 0xa9c00); ODM_Write1Byte(pDM_Odm, 0x1b2b, 0x80); break; } /* ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("[IQK]Set TXK setting!!!!\n"));*/ } VOID _IQK_RXK1Setting_8822B( IN PDM_ODM_T pDM_Odm, IN u1Byte Path ) { PIQK_INFO pIQK_info = &pDM_Odm->IQK_info; ODM_Write4Byte(pDM_Odm, 0x1b00, 0xf8000008 | Path << 1); switch (*pDM_Odm->pBandType) { case ODM_BAND_2_4G: pIQK_info->tmp1bcc = 0x09; ODM_Write1Byte(pDM_Odm, 0x1bcc, pIQK_info->tmp1bcc); ODM_Write1Byte(pDM_Odm, 0x1b2b, 0x00); ODM_Write4Byte(pDM_Odm, 0x1b20, 0x01450008); ODM_Write4Byte(pDM_Odm, 0x1b24, 0x01460c88); ODM_SetRFReg(pDM_Odm, Path, 0x56, bRFRegOffsetMask, 0x510e0); ODM_SetRFReg(pDM_Odm, Path, 0x8f, bRFRegOffsetMask, 0xacc00); break; case ODM_BAND_5G: pIQK_info->tmp1bcc = 0x09; ODM_Write1Byte(pDM_Odm, 0x1bcc, 0x09); ODM_Write1Byte(pDM_Odm, 0x1b2b, 0x80); ODM_Write4Byte(pDM_Odm, 0x1b20, 0x00850008); ODM_Write4Byte(pDM_Odm, 0x1b24, 0x00460048); ODM_SetRFReg(pDM_Odm, Path, 0x56, bRFRegOffsetMask, 0x510e0); ODM_SetRFReg(pDM_Odm, Path, 0x8f, bRFRegOffsetMask, 0xadc00); break; } /*ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("[IQK]Set RXK setting!!!!\n"));*/ } VOID _IQK_RXK2Setting_8822B( IN PDM_ODM_T pDM_Odm, IN u1Byte Path ) { PIQK_INFO pIQK_info = &pDM_Odm->IQK_info; ODM_Write4Byte(pDM_Odm, 0x1b00, 0xf8000008 | Path << 1); switch (*pDM_Odm->pBandType) { case ODM_BAND_2_4G: pIQK_info->tmp1bcc = 0x12; ODM_Write1Byte(pDM_Odm, 0x1bcc, pIQK_info->tmp1bcc); ODM_Write1Byte(pDM_Odm, 0x1b2b, 0x00); ODM_Write4Byte(pDM_Odm, 0x1b20, 0x01450008); ODM_Write4Byte(pDM_Odm, 0x1b24, 0x01460848); ODM_SetRFReg(pDM_Odm, Path, 0x56, bRFRegOffsetMask, 0x510e0); ODM_SetRFReg(pDM_Odm, Path, 0x8f, bRFRegOffsetMask, 0xa9c00); break; case ODM_BAND_5G: if (Path == ODM_RF_PATH_A) { pIQK_info->tmp1bcc = 0x12; ODM_Write1Byte(pDM_Odm, 0x1bcc, pIQK_info->tmp1bcc); } else { pIQK_info->tmp1bcc = 0x09; ODM_Write1Byte(pDM_Odm, 0x1bcc, pIQK_info->tmp1bcc); } ODM_Write1Byte(pDM_Odm, 0x1b2b, 0x80); ODM_Write4Byte(pDM_Odm, 0x1b20, 0x00850008); ODM_Write4Byte(pDM_Odm, 0x1b24, 0x00460848); ODM_SetRFReg(pDM_Odm, Path, 0x56, bRFRegOffsetMask, 0x51060); ODM_SetRFReg(pDM_Odm, Path, 0x8f, bRFRegOffsetMask, 0xa9c00); break; } /* ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("[IQK]Set RXK setting!!!!\n"));*/ } BOOLEAN _IQK_CheckCal_8822B( IN PDM_ODM_T pDM_Odm, IN u4Byte IQK_CMD ) { BOOLEAN notready = TRUE, fail = TRUE; u4Byte delay_count = 0x0; while (notready) { if (ODM_Read4Byte(pDM_Odm, 0x1b00) == (IQK_CMD & 0xffffff0f)) { fail = (BOOLEAN) ODM_GetBBReg(pDM_Odm, 0x1b08, BIT26); notready = FALSE; } else { ODM_delay_ms(1); delay_count++; } if (delay_count >= 50) { fail = TRUE; ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("[IQK]IQK timeout!!!\n")); break; } } ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("[IQK]delay count = 0x%x!!!\n", delay_count)); return fail; } BOOLEAN _IQK_RXIQK_GainSearchFail_8822B( IN PDM_ODM_T pDM_Odm, IN u1Byte Path, IN u1Byte step ) { PIQK_INFO pIQK_info = &pDM_Odm->IQK_info; BOOLEAN fail = TRUE; u4Byte IQK_CMD = 0x0, RFReg0, tmp, bb_idx; ODM_Write4Byte(pDM_Odm, 0x1b00, 0xf8000008 | Path << 1); if (step == RXIQK1) ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("[IQK]============ S%d RXIQK GainSearch ============\n", Path)); if (step == RXIQK1) IQK_CMD = 0xf8000208 | (1 << (Path + 4)); else IQK_CMD = 0xf8000308 | (1 << (Path + 4)); ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_TRACE, ("[IQK]S%d GS%d_Trigger = 0x%x\n", Path, step, IQK_CMD)); ODM_Write4Byte(pDM_Odm, 0x1b00, IQK_CMD); ODM_Write4Byte(pDM_Odm, 0x1b00, IQK_CMD+0x1); ODM_delay_ms(GS_delay_8822B); fail = _IQK_CheckCal_8822B(pDM_Odm, IQK_CMD); ODM_Write4Byte(pDM_Odm, 0x1b00, 0xf8000008 | Path << 1); ODM_Write4Byte(pDM_Odm, 0x1bcc, pIQK_info->tmp1bcc); if (step == RXIQK2) { RFReg0 = ODM_GetRFReg(pDM_Odm, Path, 0x0, bRFRegOffsetMask); ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_TRACE, ("[IQK]S%d ==> RF0x0 = 0x%x\n", Path, RFReg0)); tmp = (RFReg0 & 0x1fe0) >> 5; pIQK_info->lna_idx = tmp >> 5; bb_idx = tmp & 0x1f; if (bb_idx == 0x1) { if (pIQK_info->lna_idx != 0x0) pIQK_info->lna_idx--; fail = TRUE; } else if (bb_idx == 0xa) { if (pIQK_info->lna_idx != 0x7) pIQK_info->lna_idx++; fail = TRUE; } else fail = FALSE; if (fail) { ODM_Write4Byte(pDM_Odm, 0x1b00, 0xf8000008 | Path << 1); ODM_Write4Byte(pDM_Odm, 0x1b24, (ODM_Read4Byte(pDM_Odm, 0x1b24) & 0xffffe3ff) | (pIQK_info->lna_idx << 10)); } } return fail; } BOOLEAN _LOK_One_Shot_8822B( IN PVOID pDM_VOID, u1Byte Path ) { PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; PIQK_INFO pIQK_info = &pDM_Odm->IQK_info; u1Byte delay_count = 0, ii; BOOLEAN LOK_notready = FALSE; u4Byte LOK_temp = 0; u4Byte IQK_CMD = 0x0; ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_TRACE, ("[IQK]==========S%d LOK ==========\n", Path)); IQK_CMD = 0xf8000008|(1<<(4+Path)); ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_TRACE,("[IQK]LOK_Trigger = 0x%x\n", IQK_CMD)); ODM_Write4Byte(pDM_Odm, 0x1b00, IQK_CMD); ODM_Write4Byte(pDM_Odm, 0x1b00, IQK_CMD+1); /*LOK: CMD ID = 0 {0xf8000018, 0xf8000028}*/ /*LOK: CMD ID = 0 {0xf8000019, 0xf8000029}*/ ODM_delay_ms(LOK_delay_8822B); delay_count = 0; LOK_notready = TRUE; while (LOK_notready) { if (ODM_Read4Byte(pDM_Odm, 0x1b00) == (IQK_CMD & 0xffffff0f)) LOK_notready = FALSE; else LOK_notready = TRUE; if (LOK_notready) { ODM_delay_ms(1); delay_count++; } if (delay_count >= 50) { ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("[IQK]S%d LOK timeout!!!\n", Path)); break; } } ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_TRACE, ("[IQK]S%d ==> delay_count = 0x%d\n", Path, delay_count)); if (ODM_COMP_CALIBRATION) { if (!LOK_notready) { LOK_temp = ODM_GetRFReg(pDM_Odm, (ODM_RF_RADIO_PATH_E)Path, 0x58, bRFRegOffsetMask); ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_TRACE, ("[IQK]0x58 = 0x%x\n", LOK_temp)); } else { ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_TRACE, ("[IQK]==>S%d LOK Fail!!!\n", Path)); } } pIQK_info->LOK_fail[Path] = LOK_notready; return LOK_notready; } BOOLEAN _IQK_One_Shot_8822B( IN PVOID pDM_VOID, u1Byte Path, u1Byte idx ) { PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; PIQK_INFO pIQK_info = &pDM_Odm->IQK_info; u1Byte delay_count = 0; BOOLEAN notready = TRUE, fail = TRUE, search_fail = TRUE; u4Byte IQK_CMD = 0x0, tmp; u2Byte IQK_Apply[2] = {0xc94, 0xe94}; if (idx == TXIQK) ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("[IQK]============ S%d WBTXIQK ============\n", Path)); else if (idx == RXIQK1) ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("[IQK]============ S%d WBRXIQK STEP1============\n", Path)); else ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("[IQK]============ S%d WBRXIQK STEP2============\n", Path)); if (idx == TXIQK) { IQK_CMD = 0xf8000008 | ((*pDM_Odm->pBandWidth + 4) << 8) | (1 << (Path + 4)); ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_TRACE, ("[IQK]TXK_Trigger = 0x%x\n", IQK_CMD)); /*{0xf8000418, 0xf800042a} ==> 20 WBTXK (CMD = 4)*/ /*{0xf8000518, 0xf800052a} ==> 40 WBTXK (CMD = 5)*/ /*{0xf8000618, 0xf800062a} ==> 80 WBTXK (CMD = 6)*/ } else if (idx == RXIQK1) { if (*pDM_Odm->pBandWidth == 2) IQK_CMD = 0xf8000808 | (1 << (Path + 4)); else IQK_CMD = 0xf8000708 | (1 << (Path + 4)); ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_TRACE, ("[IQK]RXK1_Trigger = 0x%x\n", IQK_CMD)); /*{0xf8000718, 0xf800072a} ==> 20 WBTXK (CMD = 7)*/ /*{0xf8000718, 0xf800072a} ==> 40 WBTXK (CMD = 7)*/ /*{0xf8000818, 0xf800082a} ==> 80 WBTXK (CMD = 8)*/ } else if (idx == RXIQK2) { IQK_CMD = 0xf8000008 | ((*pDM_Odm->pBandWidth + 9) << 8) | (1 << (Path+4)); ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_TRACE, ("[IQK]RXK2_Trigger = 0x%x\n", IQK_CMD)); /*{0xf8000918, 0xf800092a} ==> 20 WBRXK (CMD = 9)*/ /*{0xf8000a18, 0xf8000a2a} ==> 40 WBRXK (CMD = 10)*/ /*{0xf8000b18, 0xf8000b2a} ==> 80 WBRXK (CMD = 11)*/ ODM_Write4Byte(pDM_Odm, 0x1b00, 0xf8000008 | Path << 1); ODM_Write4Byte(pDM_Odm, 0x1b24, (ODM_Read4Byte(pDM_Odm, 0x1b24) & 0xffffe3ff) | ((pIQK_info->lna_idx & 0x7) << 10)); } ODM_Write4Byte(pDM_Odm, 0x1b00, IQK_CMD); ODM_Write4Byte(pDM_Odm, 0x1b00, IQK_CMD+0x1); ODM_delay_ms(WBIQK_delay_8822B); while (notready) { if (ODM_Read4Byte(pDM_Odm, 0x1b00) == (IQK_CMD & 0xffffff0f)) notready = FALSE; else notready = TRUE; if (notready) { ODM_delay_ms(1); delay_count++; } else { fail = (BOOLEAN) ODM_GetBBReg(pDM_Odm, 0x1b08, BIT26); break; } if (delay_count >= 50) { ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("[IQK]S%d IQK timeout!!!\n", Path)); break; } } if (pDM_Odm->DebugComponents && ODM_COMP_CALIBRATION) { ODM_Write4Byte(pDM_Odm, 0x1b00, 0xf8000008 | Path << 1); ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_TRACE, ("[IQK]S%d ==> 0x1b00 = 0x%x, 0x1b08 = 0x%x\n", Path, ODM_Read4Byte(pDM_Odm, 0x1b00), ODM_Read4Byte(pDM_Odm, 0x1b08))); ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_TRACE, ("[IQK]S%d ==> delay_count = 0x%d\n", Path, delay_count)); if (idx != TXIQK) ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_TRACE, ("[IQK]S%d ==> RF0x0 = 0x%x, RF0x56 = 0x%x\n", Path, ODM_GetRFReg(pDM_Odm, Path, 0x0, bRFRegOffsetMask), ODM_GetRFReg(pDM_Odm, Path, 0x56, bRFRegOffsetMask))); } ODM_Write4Byte(pDM_Odm, 0x1b00, 0xf8000008 | Path << 1); if (idx == RXIQK2) { pIQK_info->RXIQK_AGC[0][Path] = ODM_GetRFReg(pDM_Odm, Path, 0x0, bRFRegOffsetMask) >> 4; ODM_Write4Byte(pDM_Odm, 0x1b38, 0x20000000); if (!fail) /*RXIQK success*/ ODM_SetBBReg(pDM_Odm, IQK_Apply[Path], (BIT11|BIT10), 0x1); else ODM_SetBBReg(pDM_Odm, IQK_Apply[Path], (BIT11|BIT10), 0x0); } if (idx == TXIQK) pIQK_info->IQK_fail_report[0][Path][TXIQK] = fail; else pIQK_info->IQK_fail_report[0][Path][RXIQK] = fail; return fail; } BOOLEAN _IQK_RXIQKbyPath_8822B( IN PVOID pDM_VOID, u1Byte Path ) { PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; PIQK_INFO pIQK_info = &pDM_Odm->IQK_info; BOOLEAN KFAIL = TRUE, gonext; u1Byte i; #if 1 /*while (1) {*/ switch (pIQK_info->rxiqk_step) { case 1: /*gain search_RXK1*/ _IQK_RXK1Setting_8822B(pDM_Odm, Path); gonext = FALSE; while (1) { KFAIL = _IQK_RXIQK_GainSearchFail_8822B(pDM_Odm, Path, RXIQK1); if (KFAIL && (pIQK_info->gs_retry_count[0][Path][RXIQK1] < 2)) pIQK_info->gs_retry_count[0][Path][RXIQK1]++; else if (KFAIL) { pIQK_info->RXIQK_fail_code[0][Path] = 0; pIQK_info->rxiqk_step = 5; gonext = TRUE; } else { pIQK_info->rxiqk_step++; gonext = TRUE; } if (gonext) break; } break; case 2: /*gain search_RXK2*/ _IQK_RXK2Setting_8822B(pDM_Odm, Path); while (1) { KFAIL = _IQK_RXIQK_GainSearchFail_8822B(pDM_Odm, Path, RXIQK2); if (KFAIL && (pIQK_info->gs_retry_count[0][Path][RXIQK2] < 2)) pIQK_info->gs_retry_count[0][Path][RXIQK2]++; else { pIQK_info->rxiqk_step++; break; } } break; case 3: /*RXK1*/ _IQK_RXK1Setting_8822B(pDM_Odm, Path); gonext = FALSE; while (1) { KFAIL = _IQK_One_Shot_8822B(pDM_Odm, Path, RXIQK1); if (KFAIL && (pIQK_info->retry_count[0][Path][RXIQK1] < 2)) pIQK_info->retry_count[0][Path][RXIQK1]++; else if (KFAIL) { pIQK_info->RXIQK_fail_code[0][Path] = 1; pIQK_info->rxiqk_step = 5; gonext = TRUE; } else { pIQK_info->rxiqk_step++; gonext = TRUE; } if (gonext) break; } break; case 4: /*RXK2*/ _IQK_RXK2Setting_8822B(pDM_Odm, Path); gonext = FALSE; while (1) { KFAIL = _IQK_One_Shot_8822B(pDM_Odm, Path, RXIQK2); if (KFAIL && (pIQK_info->retry_count[0][Path][RXIQK2] < 2)) pIQK_info->retry_count[0][Path][RXIQK2]++; else if (KFAIL) { pIQK_info->RXIQK_fail_code[0][Path] = 2; pIQK_info->rxiqk_step = 5; gonext = TRUE; } else { pIQK_info->rxiqk_step++; gonext = TRUE; } if (gonext) break; } break; } return KFAIL; #endif } VOID _IQK_IQKbyPath_8822B( IN PVOID pDM_VOID ) { PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; PIQK_INFO pIQK_info = &pDM_Odm->IQK_info; BOOLEAN KFAIL = TRUE; u1Byte i; /* ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_TRACE, ("[IQK]IQKstep = 0x%x\n", pDM_Odm->RFCalibrateInfo.IQKstep)); */ #if 1 switch (pDM_Odm->RFCalibrateInfo.IQKstep) { case 1: /*S0 LOK*/ #if 1 _IQK_LOKSetting_8822B(pDM_Odm, ODM_RF_PATH_A); _LOK_One_Shot_8822B(pDM_Odm, ODM_RF_PATH_A); #endif pDM_Odm->RFCalibrateInfo.IQKstep++; break; case 2: /*S1 LOK*/ #if 1 _IQK_LOKSetting_8822B(pDM_Odm, ODM_RF_PATH_B); _LOK_One_Shot_8822B(pDM_Odm, ODM_RF_PATH_B); #endif pDM_Odm->RFCalibrateInfo.IQKstep++; break; case 3: /*S0 TXIQK*/ #if 1 _IQK_TXKSetting_8822B(pDM_Odm, ODM_RF_PATH_A); KFAIL = _IQK_One_Shot_8822B(pDM_Odm, ODM_RF_PATH_A, TXIQK); ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_TRACE, ("[IQK]S0TXK KFail = 0x%x\n", KFAIL)); if (KFAIL && (pIQK_info->retry_count[0][ODM_RF_PATH_A][TXIQK] < 3)) pIQK_info->retry_count[0][ODM_RF_PATH_A][TXIQK]++; else #endif pDM_Odm->RFCalibrateInfo.IQKstep++; break; case 4: /*S1 TXIQK*/ #if 1 _IQK_TXKSetting_8822B(pDM_Odm, ODM_RF_PATH_B); KFAIL = _IQK_One_Shot_8822B(pDM_Odm, ODM_RF_PATH_B, TXIQK); ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_TRACE, ("[IQK]S1TXK KFail = 0x%x\n", KFAIL)); if (KFAIL && pIQK_info->retry_count[0][ODM_RF_PATH_B][TXIQK] < 3) pIQK_info->retry_count[0][ODM_RF_PATH_B][TXIQK]++; else #endif pDM_Odm->RFCalibrateInfo.IQKstep++; break; case 5: /*S0 RXIQK*/ KFAIL = _IQK_RXIQKbyPath_8822B(pDM_Odm, ODM_RF_PATH_A); ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_TRACE, ("[IQK]S0RXK KFail = 0x%x\n", KFAIL)); if (pIQK_info->rxiqk_step == 5) { pDM_Odm->RFCalibrateInfo.IQKstep++; pIQK_info->rxiqk_step = 1; if (KFAIL) ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("[IQK]S0RXK fail code: %d!!!\n", pIQK_info->RXIQK_fail_code[0][ODM_RF_PATH_A])); } break; case 6: /*S1 RXIQK*/ KFAIL = _IQK_RXIQKbyPath_8822B(pDM_Odm, ODM_RF_PATH_B); ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_TRACE, ("[IQK]S1RXK KFail = 0x%x\n", KFAIL)); if (pIQK_info->rxiqk_step == 5) { pDM_Odm->RFCalibrateInfo.IQKstep++; pIQK_info->rxiqk_step = 1; if (KFAIL) ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("[IQK]S1RXK fail code: %d!!!\n", pIQK_info->RXIQK_fail_code[0][ODM_RF_PATH_B])); ODM_Write4Byte(pDM_Odm, 0x1bcc, 0x0); } break; } if (pDM_Odm->RFCalibrateInfo.IQKstep == 7) { ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_TRACE, ("[IQK]==========LOK summary ==========\n")); ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("[IQK]PathA_LOK_notready = %d, PathB_LOK1_notready = %d\n", pIQK_info->LOK_fail[ODM_RF_PATH_A], pIQK_info->LOK_fail[ODM_RF_PATH_B])); ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_TRACE, ("[IQK]==========IQK summary ==========\n")); ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("[IQK]PathA_TXIQK_fail = %d, PathB_TXIQK_fail = %d\n", pIQK_info->IQK_fail_report[0][ODM_RF_PATH_A][TXIQK], pIQK_info->IQK_fail_report[0][ODM_RF_PATH_B][TXIQK])); ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("[IQK]PathA_RXIQK_fail = %d, PathB_RXIQK_fail = %d\n", pIQK_info->IQK_fail_report[0][ODM_RF_PATH_A][RXIQK], pIQK_info->IQK_fail_report[0][ODM_RF_PATH_B][RXIQK])); ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("[IQK]PathA_TXIQK_retry = %d, PathB_TXIQK_retry = %d\n", pIQK_info->retry_count[0][ODM_RF_PATH_A][TXIQK], pIQK_info->retry_count[0][ODM_RF_PATH_B][TXIQK])); ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("[IQK]PathA_RXK1_retry = %d, PathA_RXK2_retry = %d, PathB_RXK1_retry = %d, PathB_RXK2_retry = %d\n", pIQK_info->retry_count[0][ODM_RF_PATH_A][RXIQK1], pIQK_info->retry_count[0][ODM_RF_PATH_A][RXIQK2], pIQK_info->retry_count[0][ODM_RF_PATH_B][RXIQK1], pIQK_info->retry_count[0][ODM_RF_PATH_B][RXIQK2])); ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("[IQK]PathA_GS1_retry = %d, PathA_GS2_retry = %d, PathB_GS1_retry = %d, PathB_GS2_retry = %d\n", pIQK_info->gs_retry_count[0][ODM_RF_PATH_A][RXIQK1], pIQK_info->gs_retry_count[0][ODM_RF_PATH_A][RXIQK2], pIQK_info->gs_retry_count[0][ODM_RF_PATH_B][RXIQK1], pIQK_info->gs_retry_count[0][ODM_RF_PATH_B][RXIQK2])); ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_TRACE, ("[IQK]================================\n")); for (i = 0; i < 2; i++) { ODM_Write4Byte(pDM_Odm, 0x1b00, 0xf8000008 | i << 1); ODM_Write4Byte(pDM_Odm, 0x1b2c, 0x7); ODM_Write4Byte(pDM_Odm, 0x1bcc, 0x0); } } #endif } VOID _IQK_StartIQK_8822B( IN PDM_ODM_T pDM_Odm ) { u4Byte tmp; /*GNT_WL = 1*/ tmp = ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x1, bRFRegOffsetMask); tmp = tmp|BIT5|BIT0; ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_A, 0x1, bRFRegOffsetMask, tmp); tmp = ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_B, 0x1, bRFRegOffsetMask); tmp = tmp|BIT5|BIT0; ODM_SetRFReg(pDM_Odm, ODM_RF_PATH_B, 0x1, bRFRegOffsetMask, tmp); _IQK_IQKbyPath_8822B(pDM_Odm); } VOID _IQCalibrate_8822B_Init( IN PVOID pDM_VOID ) { PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; PIQK_INFO pIQK_info = &pDM_Odm->IQK_info; u1Byte i, j, k, m; if (pIQK_info->IQKtimes == 0) { ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("[IQK]=====>PHY_IQCalibrate_8822B_Init\n")); for (i = 0; i < SS_8822B; i++) { for (j = 0; j < 2; j++) { pIQK_info->LOK_fail[i] = TRUE; pIQK_info->IQK_fail[j][i] = TRUE; pIQK_info->IQC_Matrix[j][i] = 0x20000000; } } for (i = 0; i < 2; i++) { pIQK_info->IQK_Channel[i] = 0x0; for (j = 0; j < SS_8822B; j++) { pIQK_info->LOK_IDAC[i][j] = 0x0; pIQK_info->RXIQK_AGC[i][j] = 0x0; pIQK_info->bypassIQK[i][j] = 0x0; for (k = 0; k < 2; k++) { pIQK_info->IQK_fail_report[i][j][k] = TRUE; for (m = 0; m < 8; m++) { pIQK_info->IQK_CFIR_real[i][j][k][m] = 0x0; pIQK_info->IQK_CFIR_imag[i][j][k][m] = 0x0; } } for (k = 0; k < 3; k++) pIQK_info->retry_count[i][j][k] = 0x0; } } } } VOID phy_IQCalibrate_8822B( IN PDM_ODM_T pDM_Odm, IN BOOLEAN reset ) { u4Byte MAC_backup[MAC_REG_NUM_8822B], BB_backup[BB_REG_NUM_8822B], RF_backup[RF_REG_NUM_8822B][SS_8822B]; u4Byte Backup_MAC_REG[MAC_REG_NUM_8822B] = {0x520, 0x550}; u4Byte Backup_BB_REG[BB_REG_NUM_8822B] = {0x808, 0x90c, 0xc00, 0xcb0, 0xcb4, 0xcbc, 0xe00, 0xeb0, 0xeb4, 0xebc, 0x1990, 0x9a4, 0xa04}; u4Byte Backup_RF_REG[RF_REG_NUM_8822B] = {0xdf, 0x8f, 0x65, 0x0, 0x1}; u1Byte i, j; PIQK_INFO pIQK_info = &pDM_Odm->IQK_info; if (!pDM_Odm->mp_mode) if (_IQK_ReloadIQK_8822B(pDM_Odm, reset)) return; ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_TRACE, ("[IQK]==========IQK strat!!!!!==========\n")); ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("[IQK]pBandType = %s, BandWidth = %d, ExtPA2G = %d, ExtPA5G = %d\n", (*pDM_Odm->pBandType == ODM_BAND_5G) ? "5G" : "2G", *pDM_Odm->pBandWidth, pDM_Odm->ExtPA, pDM_Odm->ExtPA5G)); ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("[IQK]Interface = %d, CutVersion = %x\n", pDM_Odm->SupportInterface, pDM_Odm->CutVersion)); pIQK_info->IQKtimes++; pDM_Odm->RFCalibrateInfo.IQK_TotalProgressingTime = 0; pDM_Odm->RFCalibrateInfo.IQKstep = 1; pIQK_info->rxiqk_step = 1; _IQK_backupIQK_8822B(pDM_Odm, 0); _IQK_BackupMacBB_8822B(pDM_Odm, MAC_backup, BB_backup, Backup_MAC_REG, Backup_BB_REG); _IQK_BackupRF_8822B(pDM_Odm, RF_backup, Backup_RF_REG); _IQK_ConfigureMACBB_8822B(pDM_Odm); _IQK_AFESetting_8822B(pDM_Odm,TRUE); _IQK_RFESetting_8822B(pDM_Odm, FALSE); _IQK_AGCbnd_int_8822B(pDM_Odm); _IQK_RFSetting_8822B(pDM_Odm); while (1) { if (!pDM_Odm->mp_mode) pDM_Odm->RFCalibrateInfo.IQK_StartTime = ODM_GetCurrentTime(pDM_Odm); _IQK_StartIQK_8822B(pDM_Odm); if (!pDM_Odm->mp_mode) { pDM_Odm->RFCalibrateInfo.IQK_ProgressingTime = ODM_GetProgressingTime(pDM_Odm, pDM_Odm->RFCalibrateInfo.IQK_StartTime); pDM_Odm->RFCalibrateInfo.IQK_TotalProgressingTime += ODM_GetProgressingTime(pDM_Odm, pDM_Odm->RFCalibrateInfo.IQK_StartTime); ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("[IQK]IQK ProgressingTime = %lld ms\n", pDM_Odm->RFCalibrateInfo.IQK_ProgressingTime)); } if (pDM_Odm->RFCalibrateInfo.IQKstep == 7) break; }; _IQK_backupIQK_8822B(pDM_Odm, 1); _IQK_AFESetting_8822B(pDM_Odm,FALSE); _IQK_RestoreMacBB_8822B(pDM_Odm, MAC_backup, BB_backup, Backup_MAC_REG, Backup_BB_REG); _IQK_RestoreRF_8822B(pDM_Odm, Backup_RF_REG, RF_backup); _IQK_Fill_IQK_Report_8822B(pDM_Odm, 0); pDM_Odm->RFCalibrateInfo.IQK_TotalProgressingTime += ODM_GetProgressingTime(pDM_Odm, pDM_Odm->RFCalibrateInfo.IQK_StartTime); ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("[IQK]Total IQK ProgressingTime = %lld ms\n", pDM_Odm->RFCalibrateInfo.IQK_TotalProgressingTime)); ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_TRACE, ("[IQK]==========IQK end!!!!!==========\n")); } VOID phy_IQCalibrate_By_FW_8822B( IN PVOID pDM_VOID, IN u1Byte clear ) { } /*IQK version:v3.2 , NCTL v0.6*/ /*1.add LNA boundary of RX gain search*/ VOID PHY_IQCalibrate_8822B( IN PVOID pDM_VOID, IN BOOLEAN clear ) { PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID; u4Byte counter = 0x0; #if !(DM_ODM_SUPPORT_TYPE & ODM_AP) PADAPTER pAdapter = pDM_Odm->Adapter; HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); #if (MP_DRIVER == 1) #if (DM_ODM_SUPPORT_TYPE == ODM_WIN) PMPT_CONTEXT pMptCtx = &(pAdapter->MptCtx); #else PMPT_CONTEXT pMptCtx = &(pAdapter->mppriv.MptCtx); #endif #endif #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN)) if (ODM_CheckPowerStatus(pAdapter) == FALSE) return; #endif #if MP_DRIVER == 1 if( pMptCtx->bSingleTone || pMptCtx->bCarrierSuppression ) return; #endif #endif pDM_Odm->IQKFWOffload = 0; /*FW IQK*/ if (pDM_Odm->IQKFWOffload) { if ( ! pDM_Odm->RFCalibrateInfo.bIQKInProgress) { ODM_AcquireSpinLock(pDM_Odm, RT_IQK_SPINLOCK); pDM_Odm->RFCalibrateInfo.bIQKInProgress = TRUE; ODM_ReleaseSpinLock(pDM_Odm, RT_IQK_SPINLOCK); pDM_Odm->RFCalibrateInfo.IQK_StartTime = ODM_GetCurrentTime(pDM_Odm); ODM_Write4Byte(pDM_Odm, 0x1b00, 0xf8000008); ODM_SetBBReg(pDM_Odm, 0x1bf0, 0xff000000, 0xff); ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_TRACE, ("[IQK]0x1bf0 = 0x%x\n", ODM_Read4Byte(pDM_Odm, 0x1bf0))); phy_IQCalibrate_By_FW_8822B(pDM_Odm, clear); while (1) { if (((ODM_Read4Byte(pDM_Odm, 0x1bf0) >> 24) == 0x7f) || (counter > 300)) break; counter++; ODM_delay_ms(1); }; ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_TRACE, ("[IQK]counter = %d\n", counter)); pDM_Odm->RFCalibrateInfo.IQK_ProgressingTime = ODM_GetProgressingTime(pDM_Odm, pDM_Odm->RFCalibrateInfo.IQK_StartTime); ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("[IQK]IQK ProgressingTime = %lld ms\n", pDM_Odm->RFCalibrateInfo.IQK_ProgressingTime)); ODM_AcquireSpinLock(pDM_Odm, RT_IQK_SPINLOCK); pDM_Odm->RFCalibrateInfo.bIQKInProgress = FALSE; ODM_ReleaseSpinLock(pDM_Odm, RT_IQK_SPINLOCK); } else ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("== Return the IQK CMD, because the IQK in Progress ==\n")); } else { _IQCalibrate_8822B_Init(pDM_VOID); if (!pDM_Odm->RFCalibrateInfo.bIQKInProgress) { ODM_AcquireSpinLock(pDM_Odm, RT_IQK_SPINLOCK); pDM_Odm->RFCalibrateInfo.bIQKInProgress = TRUE; ODM_ReleaseSpinLock(pDM_Odm, RT_IQK_SPINLOCK); if (pDM_Odm->mp_mode) pDM_Odm->RFCalibrateInfo.IQK_StartTime = ODM_GetCurrentTime(pDM_Odm); #if (DM_ODM_SUPPORT_TYPE & (ODM_CE)) phy_IQCalibrate_8822B(pDM_Odm, clear); /*DBG_871X("%s,%d, do IQK %u ms\n", __func__, __LINE__, rtw_get_passing_time_ms(time_iqk));*/ #else phy_IQCalibrate_8822B(pDM_Odm, clear); #endif if (pDM_Odm->mp_mode) { pDM_Odm->RFCalibrateInfo.IQK_ProgressingTime = ODM_GetProgressingTime(pDM_Odm, pDM_Odm->RFCalibrateInfo.IQK_StartTime); ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("[IQK]IQK ProgressingTime = %lld ms\n", pDM_Odm->RFCalibrateInfo.IQK_ProgressingTime)); } ODM_AcquireSpinLock(pDM_Odm, RT_IQK_SPINLOCK); pDM_Odm->RFCalibrateInfo.bIQKInProgress = FALSE; ODM_ReleaseSpinLock(pDM_Odm, RT_IQK_SPINLOCK); } else{ ODM_RT_TRACE(pDM_Odm, ODM_COMP_CALIBRATION, ODM_DBG_LOUD, ("[IQK]== Return the IQK CMD, because the IQK in Progress ==\n")); } } #if (DM_ODM_SUPPORT_TYPE & ODM_AP) _IQK_IQK_failReport_8822B(pDM_Odm); #endif } #endif