Path: blob/master/ALFA-W1F1/RTL8814AU/hal/rtl8814a/rtl8814a_phycfg.c
1307 views
/******************************************************************************1*2* Copyright(c) 2007 - 2017 Realtek Corporation.3*4* This program is free software; you can redistribute it and/or modify it5* under the terms of version 2 of the GNU General Public License as6* published by the Free Software Foundation.7*8* This program is distributed in the hope that it will be useful, but WITHOUT9* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or10* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for11* more details.12*13*****************************************************************************/14#define _RTL8814A_PHYCFG_C_1516/* #include <drv_types.h> */1718#include <rtl8814a_hal.h>19#include "hal_com_h2c.h"2021/*---------------------Define local function prototype-----------------------*/2223/*----------------------------Function Body----------------------------------*/24/* 1 1. BB register R/W API */2526u3227PHY_QueryBBReg8814A(28PADAPTER Adapter,29u32 RegAddr,30u32 BitMask31)32{33u32 ReturnValue = 0, OriginalValue, BitShift;3435#if (DISABLE_BB_RF == 1)36return 0;37#endif3839#if (SIC_ENABLE == 1)40return SIC_QueryBBReg(Adapter, RegAddr, BitMask);41#endif4243OriginalValue = rtw_read32(Adapter, RegAddr);44BitShift = PHY_CalculateBitShift(BitMask);45ReturnValue = (OriginalValue & BitMask) >> BitShift;4647/* RTW_INFO("BBR MASK=0x%x Addr[0x%x]=0x%x\n", BitMask, RegAddr, OriginalValue); */4849return ReturnValue;50}515253void54PHY_SetBBReg8814A(55PADAPTER Adapter,56u32 RegAddr,57u32 BitMask,58u32 Data59)60{61u32 OriginalValue, BitShift;6263#if (DISABLE_BB_RF == 1)64return;65#endif6667#if (SIC_ENABLE == 1)68SIC_SetBBReg(Adapter, RegAddr, BitMask, Data);69return;70#endif7172if (BitMask != bMaskDWord) {73/* if not "double word" write */74OriginalValue = rtw_read32(Adapter, RegAddr);75BitShift = PHY_CalculateBitShift(BitMask);76Data = ((OriginalValue)&(~BitMask)) | (((Data << BitShift)) & BitMask);77}7879rtw_write32(Adapter, RegAddr, Data);8081/* RTW_INFO("BBW MASK=0x%x Addr[0x%x]=0x%x\n", BitMask, RegAddr, Data); */82}83848586static u3287phy_RFRead_8814A(88PADAPTER Adapter,89enum rf_path eRFPath,90u32 RegAddr,91u32 BitMask92)93{94u32 DataAndAddr = 0;95u32 Readback_Value, Direct_Addr;9697RegAddr &= 0xff;98switch (eRFPath) {99case RF_PATH_A:100Direct_Addr = 0x2800 + RegAddr * 4;101break;102case RF_PATH_B:103Direct_Addr = 0x2c00 + RegAddr * 4;104break;105case RF_PATH_C:106Direct_Addr = 0x3800 + RegAddr * 4;107break;108case RF_PATH_D:109Direct_Addr = 0x3c00 + RegAddr * 4;110break;111default: /* pathA */112Direct_Addr = 0x2800 + RegAddr * 4;113break;114}115116117BitMask &= bRFRegOffsetMask;118119Readback_Value = phy_query_bb_reg(Adapter, Direct_Addr, BitMask);120/* RTW_INFO("RFR-%d Addr[0x%x]=0x%x\n", eRFPath, RegAddr, Readback_Value); */121122return Readback_Value;123}124125126static void127phy_RFWrite_8814A(128PADAPTER Adapter,129enum rf_path eRFPath,130u32 Offset,131u32 Data132)133{134u32 DataAndAddr = 0;135HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);136BB_REGISTER_DEFINITION_T *pPhyReg = &pHalData->PHYRegDef[eRFPath];137138/* 2009/06/17 MH We can not execute IO for power save or other accident mode. */139/* if(RT_CANNOT_IO(Adapter)) */140/* { */141/* RT_DISP(FPHY, PHY_RFW, ("phy_RFSerialWrite stop\n")); */142/* return; */143/* } */144145Offset &= 0xff;146147/* Shadow Update */148/* PHY_RFShadowWrite(Adapter, eRFPath, Offset, Data); */149150/* Put write addr in [27:20] and write data in [19:00] */151DataAndAddr = ((Offset << 20) | (Data & 0x000fffff)) & 0x0fffffff;152153/* Write Operation */154phy_set_bb_reg(Adapter, pPhyReg->rf3wireOffset, bMaskDWord, DataAndAddr);155/* RTW_INFO("RFW-%d Addr[0x%x]=0x%x\n", eRFPath, pPhyReg->rf3wireOffset, DataAndAddr); */156}157158159u32160PHY_QueryRFReg8814A(161PADAPTER Adapter,162enum rf_path eRFPath,163u32 RegAddr,164u32 BitMask165)166{167u32 Readback_Value;168169#if (DISABLE_BB_RF == 1)170return 0;171#endif172173Readback_Value = phy_RFRead_8814A(Adapter, eRFPath, RegAddr, BitMask);174175return Readback_Value;176}177178179void180PHY_SetRFReg8814A(181PADAPTER Adapter,182enum rf_path eRFPath,183u32 RegAddr,184u32 BitMask,185u32 Data186)187{188189#if (DISABLE_BB_RF == 1)190return;191#endif192193if (BitMask == 0)194return;195196RegAddr &= 0xff;197/* RF data is 20 bits only */198if (BitMask != bLSSIWrite_data_Jaguar) {199u32 Original_Value, BitShift;200201Original_Value = phy_RFRead_8814A(Adapter, eRFPath, RegAddr, bLSSIWrite_data_Jaguar);202BitShift = PHY_CalculateBitShift(BitMask);203Data = ((Original_Value)&(~BitMask)) | (Data << BitShift);204}205206phy_RFWrite_8814A(Adapter, eRFPath, RegAddr, Data);207208209}210211/*212* 3. Initial MAC/BB/RF config by reading MAC/BB/RF txt.213* */214215s32 PHY_MACConfig8814(PADAPTER Adapter)216{217int rtStatus = _FAIL;218HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);219220/* */221/* Config MAC */222/* */223#ifdef CONFIG_LOAD_PHY_PARA_FROM_FILE224rtStatus = phy_ConfigMACWithParaFile(Adapter, PHY_FILE_MAC_REG);225if (rtStatus == _FAIL)226#endif /* CONFIG_LOAD_PHY_PARA_FROM_FILE */227{228#ifdef CONFIG_EMBEDDED_FWIMG229odm_config_mac_with_header_file(&pHalData->odmpriv);230rtStatus = _SUCCESS;231#endif/* CONFIG_EMBEDDED_FWIMG */232}233234return rtStatus;235}236237238static void239phy_InitBBRFRegisterDefinition(240PADAPTER Adapter241)242{243HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);244245/* RF Interface Sowrtware Control */246pHalData->PHYRegDef[RF_PATH_A].rfintfs = rFPGA0_XAB_RFInterfaceSW; /* 16 LSBs if read 32-bit from 0x870 */247pHalData->PHYRegDef[RF_PATH_B].rfintfs = rFPGA0_XAB_RFInterfaceSW; /* 16 MSBs if read 32-bit from 0x870 (16-bit for 0x872) */248249/* RF Interface Output (and Enable) */250pHalData->PHYRegDef[RF_PATH_A].rfintfo = rFPGA0_XA_RFInterfaceOE; /* 16 LSBs if read 32-bit from 0x860 */251pHalData->PHYRegDef[RF_PATH_B].rfintfo = rFPGA0_XB_RFInterfaceOE; /* 16 LSBs if read 32-bit from 0x864 */252253/* RF Interface (Output and) Enable */254pHalData->PHYRegDef[RF_PATH_A].rfintfe = rFPGA0_XA_RFInterfaceOE; /* 16 MSBs if read 32-bit from 0x860 (16-bit for 0x862) */255pHalData->PHYRegDef[RF_PATH_B].rfintfe = rFPGA0_XB_RFInterfaceOE; /* 16 MSBs if read 32-bit from 0x864 (16-bit for 0x866) */256257if (IS_HARDWARE_TYPE_JAGUAR_AND_JAGUAR2(Adapter)) {258pHalData->PHYRegDef[RF_PATH_A].rf3wireOffset = rA_LSSIWrite_Jaguar; /* LSSI Parameter */259pHalData->PHYRegDef[RF_PATH_B].rf3wireOffset = rB_LSSIWrite_Jaguar;260261pHalData->PHYRegDef[RF_PATH_A].rfHSSIPara2 = rHSSIRead_Jaguar; /* wire control parameter2 */262pHalData->PHYRegDef[RF_PATH_B].rfHSSIPara2 = rHSSIRead_Jaguar; /* wire control parameter2 */263} else {264pHalData->PHYRegDef[RF_PATH_A].rf3wireOffset = rFPGA0_XA_LSSIParameter; /* LSSI Parameter */265pHalData->PHYRegDef[RF_PATH_B].rf3wireOffset = rFPGA0_XB_LSSIParameter;266267pHalData->PHYRegDef[RF_PATH_A].rfHSSIPara2 = rFPGA0_XA_HSSIParameter2; /* wire control parameter2 */268pHalData->PHYRegDef[RF_PATH_B].rfHSSIPara2 = rFPGA0_XB_HSSIParameter2; /* wire control parameter2 */269}270271if (IS_HARDWARE_TYPE_8814A(Adapter)) {272pHalData->PHYRegDef[RF_PATH_C].rf3wireOffset = rC_LSSIWrite_Jaguar2; /* LSSI Parameter */273pHalData->PHYRegDef[RF_PATH_D].rf3wireOffset = rD_LSSIWrite_Jaguar2;274275pHalData->PHYRegDef[RF_PATH_C].rfHSSIPara2 = rHSSIRead_Jaguar; /* wire control parameter2 */276pHalData->PHYRegDef[RF_PATH_D].rfHSSIPara2 = rHSSIRead_Jaguar; /* wire control parameter2 */277}278279if (IS_HARDWARE_TYPE_JAGUAR_AND_JAGUAR2(Adapter)) {280/* Tranceiver Readback LSSI/HSPI mode */281pHalData->PHYRegDef[RF_PATH_A].rfLSSIReadBack = rA_SIRead_Jaguar;282pHalData->PHYRegDef[RF_PATH_B].rfLSSIReadBack = rB_SIRead_Jaguar;283pHalData->PHYRegDef[RF_PATH_A].rfLSSIReadBackPi = rA_PIRead_Jaguar;284pHalData->PHYRegDef[RF_PATH_B].rfLSSIReadBackPi = rB_PIRead_Jaguar;285} else {286/* Tranceiver Readback LSSI/HSPI mode */287pHalData->PHYRegDef[RF_PATH_A].rfLSSIReadBack = rFPGA0_XA_LSSIReadBack;288pHalData->PHYRegDef[RF_PATH_B].rfLSSIReadBack = rFPGA0_XB_LSSIReadBack;289pHalData->PHYRegDef[RF_PATH_A].rfLSSIReadBackPi = TransceiverA_HSPI_Readback;290pHalData->PHYRegDef[RF_PATH_B].rfLSSIReadBackPi = TransceiverB_HSPI_Readback;291}292293if (IS_HARDWARE_TYPE_8814A(Adapter)) {294/* Tranceiver Readback LSSI/HSPI mode */295pHalData->PHYRegDef[RF_PATH_C].rfLSSIReadBack = rC_SIRead_Jaguar2;296pHalData->PHYRegDef[RF_PATH_D].rfLSSIReadBack = rD_SIRead_Jaguar2;297pHalData->PHYRegDef[RF_PATH_C].rfLSSIReadBackPi = rC_PIRead_Jaguar2;298pHalData->PHYRegDef[RF_PATH_D].rfLSSIReadBackPi = rD_PIRead_Jaguar2;299}300301/* pHalData->bPhyValueInitReady=TRUE; */302}303304void _rtw_config_trx_path_8814a(_adapter *adapter)305{306enum rf_type rf_path = GET_HAL_RFPATH(adapter);307308/*config RF PATH*/309switch (rf_path) {310case RF_1T1R:311case RF_2T4R:312case RF_3T3R:313/*RX CCK disable 2R CCA*/314phy_set_bb_reg(adapter, rCCK0_FalseAlarmReport, BIT18|BIT22, 0);315/*pathB tx on, path A/C/D tx off*/316phy_set_bb_reg(adapter, rCCK_RX_Jaguar, 0xf0000000, 0x4);317/*pathB rx*/318phy_set_bb_reg(adapter, rCCK_RX_Jaguar, 0x0f000000, 0x5);319break;320default:321/*RX CCK disable 2R CCA*/322phy_set_bb_reg(adapter, rCCK0_FalseAlarmReport, BIT18|BIT22, 0);323/*pathB tx on, path A/C/D tx off*/324phy_set_bb_reg(adapter, rCCK_RX_Jaguar, 0xf0000000, 0x4);325/*pathB rx*/326phy_set_bb_reg(adapter, rCCK_RX_Jaguar, 0x0f000000, 0x5);327RTW_INFO("%s, unknown rf_type: %d\n", __func__, rf_path);328break;329}330}331332int333PHY_BBConfig8814(334PADAPTER Adapter335)336{337int rtStatus = _SUCCESS;338HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);339u8 TmpU1B = 0;340341phy_InitBBRFRegisterDefinition(Adapter);342343/* . APLL_EN,,APLL_320_GATEB,APLL_320BIAS, auto config by hw fsm after pfsm_go (0x4 bit 8) set */344TmpU1B = PlatformEFIORead1Byte(Adapter, REG_SYS_FUNC_EN_8814A);345346if (IS_HARDWARE_TYPE_8814AU(Adapter))347TmpU1B |= FEN_USBA;348else if (IS_HARDWARE_TYPE_8814AE(Adapter))349TmpU1B |= FEN_PCIEA;350351PlatformEFIOWrite1Byte(Adapter, REG_SYS_FUNC_EN, TmpU1B);352353TmpU1B = PlatformEFIORead1Byte(Adapter, 0x1002);354PlatformEFIOWrite1Byte(Adapter, 0x1002, (TmpU1B | FEN_BB_GLB_RSTn | FEN_BBRSTB)); /* same with 8812 */355356/* 6. 0x1f[7:0] = 0x07 PathA RF Power On */357PlatformEFIOWrite1Byte(Adapter, REG_RF_CTRL0_8814A , 0x07);/* RF_SDMRSTB,RF_RSTB,RF_EN same with 8723a */358/* 7. 0x20[7:0] = 0x07 PathB RF Power On */359/* 8. 0x21[7:0] = 0x07 PathC RF Power On */360PlatformEFIOWrite2Byte(Adapter, REG_RF_CTRL1_8814A , 0x0707);/* RF_SDMRSTB,RF_RSTB,RF_EN same with 8723a */361/* 9. 0x76[7:0] = 0x07 PathD RF Power On */362PlatformEFIOWrite1Byte(Adapter, REG_RF_CTRL3_8814A , 0x7);363364/* */365/* Config BB and AGC */366/* */367rtStatus = phy_BB8814A_Config_ParaFile(Adapter);368369if (rtw_phydm_set_crystal_cap(Adapter, pHalData->crystal_cap) == _FALSE) {370RTW_ERR("Init crystal_cap failed\n");371rtw_warn_on(1);372rtStatus = _FAIL;373}374_rtw_config_trx_path_8814a(Adapter);375376return rtStatus;377}378379s32380phy_BB8814A_Config_ParaFile(381PADAPTER Adapter382)383{384HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);385int rtStatus = _SUCCESS;386387/* Read PHY_REG.TXT BB INIT!! */388#ifdef CONFIG_LOAD_PHY_PARA_FROM_FILE389if (phy_ConfigBBWithParaFile(Adapter, PHY_FILE_PHY_REG, CONFIG_BB_PHY_REG) == _FAIL)390#endif391{392#ifdef CONFIG_EMBEDDED_FWIMG393if (HAL_STATUS_SUCCESS != odm_config_bb_with_header_file(&pHalData->odmpriv, CONFIG_BB_PHY_REG))394rtStatus = _FAIL;395#endif396}397398if (rtStatus != _SUCCESS) {399RTW_INFO("%s(): CONFIG_BB_PHY_REG Fail!!\n", __FUNCTION__);400goto phy_BB_Config_ParaFile_Fail;401}402403/* Read PHY_REG_MP.TXT BB INIT!! */404#if (MP_DRIVER == 1)405if (Adapter->registrypriv.mp_mode == 1) {406#ifdef CONFIG_LOAD_PHY_PARA_FROM_FILE407if (phy_ConfigBBWithMpParaFile(Adapter, PHY_FILE_PHY_REG_MP) == _FAIL)408#endif409{410#ifdef CONFIG_EMBEDDED_FWIMG411if (HAL_STATUS_SUCCESS != odm_config_bb_with_header_file(&pHalData->odmpriv, CONFIG_BB_PHY_REG_MP))412rtStatus = _FAIL;413#endif414}415416if (rtStatus != _SUCCESS) {417RTW_INFO("phy_BB8812_Config_ParaFile():Write BB Reg MP Fail!!\n");418goto phy_BB_Config_ParaFile_Fail;419}420}421#endif /* #if (MP_DRIVER == 1) */422423/* BB AGC table Initialization */424#ifdef CONFIG_LOAD_PHY_PARA_FROM_FILE425if (phy_ConfigBBWithParaFile(Adapter, PHY_FILE_AGC_TAB, CONFIG_BB_AGC_TAB) == _FAIL)426#endif427{428#ifdef CONFIG_EMBEDDED_FWIMG429if (HAL_STATUS_SUCCESS != odm_config_bb_with_header_file(&pHalData->odmpriv, CONFIG_BB_AGC_TAB))430rtStatus = _FAIL;431#endif432}433434if (rtStatus != _SUCCESS)435RTW_INFO("%s(): CONFIG_BB_AGC_TAB Fail!!\n", __FUNCTION__);436437phy_BB_Config_ParaFile_Fail:438439return rtStatus;440441}442443444void445phy_ADC_CLK_8814A(446PADAPTER Adapter447)448{449HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);450u32 MAC_REG_520, BB_REG_8FC, BB_REG_808, RXIQC[4];451u32 Search_index = 0, MAC_Active = 1;452u32 RXIQC_REG[2][4] = {{0xc10, 0xe10, 0x1810, 0x1a10}, {0xc14, 0xe14, 0x1814, 0x1a14}} ;453454if (GET_CVID_CUT_VERSION(pHalData->version_id) != A_CUT_VERSION)455return;456457/* 1 Step1. MAC TX pause */458MAC_REG_520 = phy_query_bb_reg(Adapter, 0x520, bMaskDWord);459BB_REG_8FC = phy_query_bb_reg(Adapter, 0x8fc, bMaskDWord);460BB_REG_808 = phy_query_bb_reg(Adapter, 0x808, bMaskDWord);461phy_set_bb_reg(Adapter, 0x520, bMaskByte2, 0x3f);462463/* 1 Step 2. Backup RXIQC & RXIQC = 0 */464for (Search_index = 0; Search_index < 4; Search_index++) {465RXIQC[Search_index] = phy_query_bb_reg(Adapter, RXIQC_REG[0][Search_index], bMaskDWord);466phy_set_bb_reg(Adapter, RXIQC_REG[0][Search_index], bMaskDWord, 0x0);467phy_set_bb_reg(Adapter, RXIQC_REG[1][Search_index], bMaskDWord, 0x0);468}469phy_set_bb_reg(Adapter, 0xa14, 0x00000300, 0x3);470Search_index = 0;471472/* 1 Step 3. Monitor MAC IDLE */473phy_set_bb_reg(Adapter, 0x8fc, bMaskDWord, 0x0);474while (MAC_Active) {475MAC_Active = phy_query_bb_reg(Adapter, 0xfa0, bMaskDWord) & (0x803e0008);476Search_index++;477if (Search_index > 1000)478break;479}480481/* 1 Step 4. ADC clk flow */482phy_set_bb_reg(Adapter, 0x808, bMaskByte0, 0x11);483phy_set_bb_reg(Adapter, 0x90c, BIT(13), 0x1);484phy_set_bb_reg(Adapter, 0x764, BIT(10) | BIT(9), 0x3);485phy_set_bb_reg(Adapter, 0x804, BIT(2), 0x1);486487/* 0xc1c/0xe1c/0x181c/0x1a1c[4] must=1 to ensure table can be written when bbrstb=0 */488/* 0xc60/0xe60/0x1860/0x1a60[15] always = 1 after this line */489/* 0xc60/0xe60/0x1860/0x1a60[14] always = 0 bcz its error in A-cut */490491/* power_off/clk_off @ anapar_state=idle mode */492phy_set_bb_reg(Adapter, 0xc60, bMaskDWord, 0x15800002); /* 0xc60 0x15808002 */493phy_set_bb_reg(Adapter, 0xc60, bMaskDWord, 0x01808003); /* 0xc60 0x01808003 */494phy_set_bb_reg(Adapter, 0xe60, bMaskDWord, 0x15800002); /* 0xe60 0x15808002 */495phy_set_bb_reg(Adapter, 0xe60, bMaskDWord, 0x01808003); /* 0xe60 0x01808003 */496phy_set_bb_reg(Adapter, 0x1860, bMaskDWord, 0x15800002); /* 0x1860 0x15808002 */497phy_set_bb_reg(Adapter, 0x1860, bMaskDWord, 0x01808003); /* 0x1860 0x01808003 */498phy_set_bb_reg(Adapter, 0x1a60, bMaskDWord, 0x15800002); /* 0x1a60 0x15808002 */499phy_set_bb_reg(Adapter, 0x1a60, bMaskDWord, 0x01808003); /* 0x1a60 0x01808003 */500501phy_set_bb_reg(Adapter, 0x764, BIT(10), 0x0);502phy_set_bb_reg(Adapter, 0x804, BIT(2), 0x0);503phy_set_bb_reg(Adapter, 0xc5c, bMaskDWord, 0x0D080058); /* 0xc5c 0x00080058 */ /* [19] =1 to turn off ADC */504phy_set_bb_reg(Adapter, 0xe5c, bMaskDWord, 0x0D080058); /* 0xe5c 0x00080058 */ /* [19] =1 to turn off ADC */505phy_set_bb_reg(Adapter, 0x185c, bMaskDWord, 0x0D080058); /* 0x185c 0x00080058 */ /* [19] =1 to turn off ADC */506phy_set_bb_reg(Adapter, 0x1a5c, bMaskDWord, 0x0D080058); /* 0x1a5c 0x00080058 */ /* [19] =1 to turn off ADC */507508/* power_on/clk_off */509/* phy_set_bb_reg(Adapter, 0x764, BIT(10), 0x1); */510phy_set_bb_reg(Adapter, 0xc5c, bMaskDWord, 0x0D000058); /* 0xc5c 0x0D000058 */ /* [19] =0 to turn on ADC */511phy_set_bb_reg(Adapter, 0xe5c, bMaskDWord, 0x0D000058); /* 0xe5c 0x0D000058 */ /* [19] =0 to turn on ADC */512phy_set_bb_reg(Adapter, 0x185c, bMaskDWord, 0x0D000058); /* 0x185c 0x0D000058 */ /* [19] =0 to turn on ADC */513phy_set_bb_reg(Adapter, 0x1a5c, bMaskDWord, 0x0D000058); /* 0x1a5c 0x0D000058 */ /* [19] =0 to turn on ADC */514515/* power_on/clk_on @ anapar_state=BT mode */516phy_set_bb_reg(Adapter, 0xc60, bMaskDWord, 0x05808032); /* 0xc60 0x05808002 */517phy_set_bb_reg(Adapter, 0xe60, bMaskDWord, 0x05808032); /* 0xe60 0x05808002 */518phy_set_bb_reg(Adapter, 0x1860, bMaskDWord, 0x05808032); /* 0x1860 0x05808002 */519phy_set_bb_reg(Adapter, 0x1a60, bMaskDWord, 0x05808032); /* 0x1a60 0x05808002 */520phy_set_bb_reg(Adapter, 0x764, BIT(10), 0x1);521phy_set_bb_reg(Adapter, 0x804, BIT(2), 0x1);522523/* recover original setting @ anapar_state=BT mode */524phy_set_bb_reg(Adapter, 0xc60, bMaskDWord, 0x05808032); /* 0xc60 0x05808036 */525phy_set_bb_reg(Adapter, 0xe60, bMaskDWord, 0x05808032); /* 0xe60 0x05808036 */526phy_set_bb_reg(Adapter, 0x1860, bMaskDWord, 0x05808032); /* 0x1860 0x05808036 */527phy_set_bb_reg(Adapter, 0x1a60, bMaskDWord, 0x05808032); /* 0x1a60 0x05808036 */528529phy_set_bb_reg(Adapter, 0xc60, bMaskDWord, 0x05800002); /* 0xc60 0x05800002 */530phy_set_bb_reg(Adapter, 0xc60, bMaskDWord, 0x07808003); /* 0xc60 0x07808003 */531phy_set_bb_reg(Adapter, 0xe60, bMaskDWord, 0x05800002); /* 0xe60 0x05800002 */532phy_set_bb_reg(Adapter, 0xe60, bMaskDWord, 0x07808003); /* 0xe60 0x07808003 */533phy_set_bb_reg(Adapter, 0x1860, bMaskDWord, 0x05800002); /* 0x1860 0x05800002 */534phy_set_bb_reg(Adapter, 0x1860, bMaskDWord, 0x07808003); /* 0x1860 0x07808003 */535phy_set_bb_reg(Adapter, 0x1a60, bMaskDWord, 0x05800002); /* 0x1a60 0x05800002 */536phy_set_bb_reg(Adapter, 0x1a60, bMaskDWord, 0x07808003); /* 0x1a60 0x07808003 */537538phy_set_bb_reg(Adapter, 0x764, BIT(10) | BIT(9), 0x0);539phy_set_bb_reg(Adapter, 0x804, BIT(2), 0x0);540phy_set_bb_reg(Adapter, 0x90c, BIT(13), 0x0);541542/* 1 Step 5. Recover MAC TX & IQC */543phy_set_bb_reg(Adapter, 0x520, bMaskDWord, MAC_REG_520);544phy_set_bb_reg(Adapter, 0x8fc, bMaskDWord, BB_REG_8FC);545phy_set_bb_reg(Adapter, 0x808, bMaskDWord, BB_REG_808);546for (Search_index = 0; Search_index < 4; Search_index++) {547phy_set_bb_reg(Adapter, RXIQC_REG[0][Search_index], bMaskDWord, RXIQC[Search_index]);548phy_set_bb_reg(Adapter, RXIQC_REG[1][Search_index], bMaskDWord, 0x01000000);549}550phy_set_bb_reg(Adapter, 0xa14, 0x00000300, 0x0);551}552553void554PHY_ConfigBB_8814A(555PADAPTER Adapter556)557{558559HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);560561phy_set_bb_reg(Adapter, rOFDMCCKEN_Jaguar, bOFDMEN_Jaguar | bCCKEN_Jaguar, 0x3);562}563564565566/* 2 3.3 RF Config */567568s32569PHY_RFConfig8814A(570PADAPTER Adapter571)572{573HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);574int rtStatus = _SUCCESS;575576/* vivi added this, 20100610 */577if (rtw_is_surprise_removed(Adapter))578return _FAIL;579580switch (pHalData->rf_chip) {581case RF_PSEUDO_11N:582RTW_INFO("%s(): RF_PSEUDO_11N\n", __FUNCTION__);583break;584default:585rtStatus = PHY_RF6052_Config_8814A(Adapter);586break;587}588589return rtStatus;590}591592/* 1 5. Tx Power setting API */593594void595phy_TxPwrAdjInPercentage(596PADAPTER Adapter,597s16* pTxPwrIdx)598{599HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);600int txPower = *pTxPwrIdx + pHalData->CurrentTxPwrIdx - 18;601602*pTxPwrIdx = txPower > RF6052_MAX_TX_PWR ? RF6052_MAX_TX_PWR : txPower;603}604605606#if 0 //unused?607void608PHY_GetTxPowerLevel8814(609IN PADAPTER Adapter,610OUT s32* powerlevel611)612{613HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);614*powerlevel = pHalData->CurrentTxPwrIdx;615#if 0616HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);617PMGNT_INFO pMgntInfo = &(Adapter->MgntInfo);618s4Byte TxPwrDbm = 13;619620if ( pMgntInfo->ClientConfigPwrInDbm != UNSPECIFIED_PWR_DBM )621*powerlevel = pMgntInfo->ClientConfigPwrInDbm;622else623*powerlevel = TxPwrDbm;624#endif //0625/*626//PMPT_CONTEXT pMptCtx = &(Adapter->mppriv.mpt_ctx);627//u8 mgn_rate = mpt_to_mgnt_rate(HwRateToMPTRate(Adapter->mppriv.rateidx));628*powerlevel=PHY_GetTxPowerIndex8814A(Adapter,RF_PATH_A ,MGN_MCS7, pHalData->current_channel_bw, pHalData->current_channel, NULL);629*powerlevel/=2;630*/631}632#endif633634void635PHY_SetTxPowerLevel8814(636PADAPTER Adapter,637u8 Channel638)639{640u32 i, j, k = 0;641u32 value[264] = {0};642u32 path = 0, PowerIndex, txagc_table_wd = 0x00801000;643644HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);645646u8 jaguar2Rates[][4] = { {MGN_1M, MGN_2M, MGN_5_5M, MGN_11M},647{MGN_6M, MGN_9M, MGN_12M, MGN_18M},648{MGN_24M, MGN_36M, MGN_48M, MGN_54M},649{MGN_MCS0, MGN_MCS1, MGN_MCS2, MGN_MCS3},650{MGN_MCS4, MGN_MCS5, MGN_MCS6, MGN_MCS7},651{MGN_MCS8, MGN_MCS9, MGN_MCS10, MGN_MCS11},652{MGN_MCS12, MGN_MCS13, MGN_MCS14, MGN_MCS15},653{MGN_MCS16, MGN_MCS17, MGN_MCS18, MGN_MCS19},654{MGN_MCS20, MGN_MCS21, MGN_MCS22, MGN_MCS23},655{MGN_VHT1SS_MCS0, MGN_VHT1SS_MCS1, MGN_VHT1SS_MCS2, MGN_VHT1SS_MCS3},656{MGN_VHT1SS_MCS4, MGN_VHT1SS_MCS5, MGN_VHT1SS_MCS6, MGN_VHT1SS_MCS7},657{MGN_VHT2SS_MCS8, MGN_VHT2SS_MCS9, MGN_VHT2SS_MCS0, MGN_VHT2SS_MCS1},658{MGN_VHT2SS_MCS2, MGN_VHT2SS_MCS3, MGN_VHT2SS_MCS4, MGN_VHT2SS_MCS5},659{MGN_VHT2SS_MCS6, MGN_VHT2SS_MCS7, MGN_VHT2SS_MCS8, MGN_VHT2SS_MCS9},660{MGN_VHT3SS_MCS0, MGN_VHT3SS_MCS1, MGN_VHT3SS_MCS2, MGN_VHT3SS_MCS3},661{MGN_VHT3SS_MCS4, MGN_VHT3SS_MCS5, MGN_VHT3SS_MCS6, MGN_VHT3SS_MCS7},662{MGN_VHT3SS_MCS8, MGN_VHT3SS_MCS9, 0, 0}663};664665666for (path = RF_PATH_A; path <= RF_PATH_D; ++path)667phy_set_tx_power_level_by_path(Adapter, Channel, (u8)path);668#if 0 /* todo H2C_TXPOWER_INDEX_OFFLOAD ? */669if (Adapter->MgntInfo.bScanInProgress == FALSE && pHalData->RegFWOffload == 2)670HalDownloadTxPowerLevel8814(Adapter, value);671#endif /* 0 */672}673674675/**************************************************************************************************************676* Description:677* The low-level interface to get the FINAL Tx Power Index , called by both MP and Normal Driver.678*679* <20120830, Kordan>680**************************************************************************************************************/681u8682PHY_GetTxPowerIndex8814A(683PADAPTER pAdapter,684enum rf_path RFPath,685u8 Rate,686u8 BandWidth,687u8 Channel,688struct txpwr_idx_comp *tic689)690{691PHAL_DATA_TYPE pHalData = GET_HAL_DATA(pAdapter);692struct hal_spec_t *hal_spec = GET_HAL_SPEC(pAdapter);693s16 power_idx;694u8 pg = 0;695s8 by_rate_diff = 0, limit = 0, tpt_offset = 0;696u8 ntx_idx = phy_get_current_tx_num(pAdapter, Rate);697BOOLEAN bIn24G = FALSE;698699pg = phy_get_pg_txpwr_idx(pAdapter, RFPath, Rate, ntx_idx, BandWidth, Channel, &bIn24G);700701by_rate_diff = PHY_GetTxPowerByRate(pAdapter, (u8)(!bIn24G), RFPath, Rate);702limit = PHY_GetTxPowerLimit(pAdapter, NULL, (u8)(!bIn24G), pHalData->current_channel_bw, RFPath, Rate, ntx_idx, pHalData->current_channel);703704/* tpt_offset += PHY_GetTxPowerTrackingOffset(pAdapter, RFPath, Rate); */705706if (tic)707txpwr_idx_comp_set(tic, ntx_idx, pg, by_rate_diff, limit, tpt_offset, 0, 0, 0);708709by_rate_diff = by_rate_diff > limit ? limit : by_rate_diff;710power_idx = pg + by_rate_diff + tpt_offset;711712#if 0 /* todo ? */713#if CCX_SUPPORT714CCX_CellPowerLimit(pAdapter, Channel, Rate, &power_idx);715#endif716#endif717718719phy_TxPwrAdjInPercentage(pAdapter, &power_idx);720721if (power_idx < 0)722power_idx = 0;723else if (power_idx > hal_spec->txgi_max)724power_idx = hal_spec->txgi_max;725726return power_idx;727}728729u8730phy_get_tx_power_index_8814a(731PADAPTER pAdapter,732enum rf_path RFPath,733u8 Rate,734enum channel_width BandWidth,735u8 Channel736)737{738return PHY_GetTxPowerIndex8814A(pAdapter, RFPath, Rate, BandWidth, Channel, NULL);739}740741void742PHY_SetTxPowerIndex_8814A(743PADAPTER Adapter,744u32 PowerIndex,745enum rf_path RFPath,746u8 Rate747)748{749u32 txagc_table_wd = 0x00801000;750751txagc_table_wd |= (RFPath << 8) | MRateToHwRate(Rate) | (PowerIndex << 24);752phy_set_bb_reg(Adapter, 0x1998, bMaskDWord, txagc_table_wd);753/* RTW_INFO("txagc_table_wd %x\n", txagc_table_wd); */754if (Rate == MGN_1M) {755phy_set_bb_reg(Adapter, 0x1998, bMaskDWord, txagc_table_wd); /* first time to turn on the txagc table */756/* second to write the addr0 */757}758}759760u32761PHY_GetTxBBSwing_8814A(762PADAPTER Adapter,763BAND_TYPE Band,764enum rf_path RFPath765)766{767HAL_DATA_TYPE *pHalData = GET_HAL_DATA(GetDefaultAdapter(Adapter));768struct dm_struct *pDM_Odm = &pHalData->odmpriv;769struct dm_rf_calibration_struct *pRFCalibrateInfo = &(pDM_Odm->rf_calibrate_info);770s8 bbSwing_2G = -1 * GetRegTxBBSwing_2G(Adapter);771s8 bbSwing_5G = -1 * GetRegTxBBSwing_5G(Adapter);772u32 out = 0x200;773const s8 AUTO = -1;774775776if (pHalData->bautoload_fail_flag) {777if (Band == BAND_ON_2_4G) {778pRFCalibrateInfo->bb_swing_diff_2g = bbSwing_2G;779if (bbSwing_2G == 0)780out = 0x200; /* 0 dB */781else if (bbSwing_2G == -3)782out = 0x16A; /* -3 dB */783else if (bbSwing_2G == -6)784out = 0x101; /* -6 dB */785else if (bbSwing_2G == -9)786out = 0x0B6; /* -9 dB */787else {788if (pHalData->ExternalPA_2G) {789pRFCalibrateInfo->bb_swing_diff_2g = -3;790out = 0x16A;791} else {792pRFCalibrateInfo->bb_swing_diff_2g = 0;793out = 0x200;794}795}796} else if (Band == BAND_ON_5G) {797pRFCalibrateInfo->bb_swing_diff_5g = bbSwing_5G;798if (bbSwing_5G == 0)799out = 0x200; /* 0 dB */800else if (bbSwing_5G == -3)801out = 0x16A; /* -3 dB */802else if (bbSwing_5G == -6)803out = 0x101; /* -6 dB */804else if (bbSwing_5G == -9)805out = 0x0B6; /* -9 dB */806else {807if (pHalData->external_pa_5g) {808pRFCalibrateInfo->bb_swing_diff_5g = -3;809out = 0x16A;810} else {811pRFCalibrateInfo->bb_swing_diff_5g = 0;812out = 0x200;813}814}815} else {816pRFCalibrateInfo->bb_swing_diff_2g = -3;817pRFCalibrateInfo->bb_swing_diff_5g = -3;818out = 0x16A; /* -3 dB */819}820} else {821u32 swing = 0, onePathSwing = 0;822823if (Band == BAND_ON_2_4G) {824if (GetRegTxBBSwing_2G(Adapter) == AUTO) {825EFUSE_ShadowRead(Adapter, 1, EEPROM_TX_BBSWING_2G_8814, (u32 *)&swing);826if (swing == 0xFF) {827if (bbSwing_2G == 0)828swing = 0x00; /* 0 dB */829else if (bbSwing_2G == -3)830swing = 0x55; /* -3 dB */831else if (bbSwing_2G == -6)832swing = 0xAA; /* -6 dB */833else if (bbSwing_2G == -9)834swing = 0xFF; /* -9 dB */835else836swing = 0x00;837}838} else if (bbSwing_2G == 0)839swing = 0x00; /* 0 dB */840else if (bbSwing_2G == -3)841swing = 0x55; /* -3 dB */842else if (bbSwing_2G == -6)843swing = 0xAA; /* -6 dB */844else if (bbSwing_2G == -9)845swing = 0xFF; /* -9 dB */846else847swing = 0x00;848} else {849if (GetRegTxBBSwing_5G(Adapter) == AUTO) {850EFUSE_ShadowRead(Adapter, 1, EEPROM_TX_BBSWING_5G_8814, (u32 *)&swing);851if (swing == 0xFF) {852if (bbSwing_5G == 0)853swing = 0x00; /* 0 dB */854else if (bbSwing_5G == -3)855swing = 0x55; /* -3 dB */856else if (bbSwing_5G == -6)857swing = 0xAA; /* -6 dB */858else if (bbSwing_5G == -9)859swing = 0xFF; /* -9 dB */860else861swing = 0x00;862}863} else if (bbSwing_5G == 0)864swing = 0x00; /* 0 dB */865else if (bbSwing_5G == -3)866swing = 0x55; /* -3 dB */867else if (bbSwing_5G == -6)868swing = 0xAA; /* -6 dB */869else if (bbSwing_5G == -9)870swing = 0xFF; /* -9 dB */871else872swing = 0x00;873}874875if (RFPath == RF_PATH_A)876onePathSwing = (swing & 0x3) >> 0; /* 0xC6/C7[1:0] */877else if (RFPath == RF_PATH_B)878onePathSwing = (swing & 0xC) >> 2; /* 0xC6/C7[3:2] */879else if (RFPath == RF_PATH_C)880onePathSwing = (swing & 0x30) >> 4; /* 0xC6/C7[5:4] */881else if (RFPath == RF_PATH_D)882onePathSwing = (swing & 0xC0) >> 6; /* 0xC6/C7[7:6] */883884if (onePathSwing == 0x0) {885if (Band == BAND_ON_2_4G)886pRFCalibrateInfo->bb_swing_diff_2g = 0;887else888pRFCalibrateInfo->bb_swing_diff_5g = 0;889out = 0x200; /* 0 dB */890} else if (onePathSwing == 0x1) {891if (Band == BAND_ON_2_4G)892pRFCalibrateInfo->bb_swing_diff_2g = -3;893else894pRFCalibrateInfo->bb_swing_diff_5g = -3;895out = 0x16A; /* -3 dB */896} else if (onePathSwing == 0x2) {897if (Band == BAND_ON_2_4G)898pRFCalibrateInfo->bb_swing_diff_2g = -6;899else900pRFCalibrateInfo->bb_swing_diff_5g = -6;901out = 0x101; /* -6 dB */902} else if (onePathSwing == 0x3) {903if (Band == BAND_ON_2_4G)904pRFCalibrateInfo->bb_swing_diff_2g = -9;905else906pRFCalibrateInfo->bb_swing_diff_5g = -9;907out = 0x0B6; /* -9 dB */908}909}910return out;911}912913914/* 1 7. BandWidth setting API */915916void917phy_SetBwRegAdc_8814A(918PADAPTER Adapter,919u8 Band,920enum channel_width CurrentBW921)922{923switch (CurrentBW) {924case CHANNEL_WIDTH_20:925if (Band == BAND_ON_5G) {926phy_set_bb_reg(Adapter, rRFMOD_Jaguar, BIT(1) | BIT(0), 0x0); /* 0x8ac[28, 21,20,16, 9:6,1,0]=10'b10_0011_0000 */927} else {928phy_set_bb_reg(Adapter, rRFMOD_Jaguar, BIT(1) | BIT(0), 0x0); /* 0x8ac[28, 21,20,16, 9:6,1,0]=10'b10_0101_0000 */929}930break;931932case CHANNEL_WIDTH_40:933if (Band == BAND_ON_5G) {934phy_set_bb_reg(Adapter, rRFMOD_Jaguar, BIT(1) | BIT(0), 0x1); /* 0x8ac[17, 11, 10, 7:6,1,0]=7'b100_0001 */935} else {936phy_set_bb_reg(Adapter, rRFMOD_Jaguar, BIT(1) | BIT(0), 0x1); /* 0x8ac[17, 11, 10, 7:6,1,0]=7'b101_0001 */937}938break;939940case CHANNEL_WIDTH_80:941phy_set_bb_reg(Adapter, rRFMOD_Jaguar, BIT(1) | BIT(0), 0x02); /* 0x8ac[7:6,1,0]=4'b0010 */942break;943944default:945RT_DISP(FPHY, PHY_BBW, ("phy_SetBwRegAdc_8814A(): unknown Bandwidth: %#X\n", CurrentBW));946break;947}948}949950951void952phy_SetBwRegAgc_8814A(953PADAPTER Adapter,954u8 Band,955enum channel_width CurrentBW956)957{958u32 AgcValue = 7;959switch (CurrentBW) {960case CHANNEL_WIDTH_20:961if (Band == BAND_ON_5G)962AgcValue = 6;963else964AgcValue = 6;965break;966967case CHANNEL_WIDTH_40:968if (Band == BAND_ON_5G)969AgcValue = 8;970else971AgcValue = 7;972break;973974case CHANNEL_WIDTH_80:975AgcValue = 3;976break;977978default:979RT_DISP(FPHY, PHY_BBW, ("phy_SetBwRegAgc_8814A(): unknown Bandwidth: %#X\n", CurrentBW));980break;981}982983phy_set_bb_reg(Adapter, rAGC_table_Jaguar, 0xf000, AgcValue); /* 0x82C[15:12] = AgcValue */984}985986987BOOLEAN988phy_SwBand8814A(989PADAPTER pAdapter,990u8 channelToSW)991{992u8 u1Btmp;993BOOLEAN ret_value = _TRUE;994u8 Band = BAND_ON_5G, BandToSW;995996u1Btmp = rtw_read8(pAdapter, REG_CCK_CHECK_8814A);997if (u1Btmp & BIT7)998Band = BAND_ON_5G;999else1000Band = BAND_ON_2_4G;10011002/* Use current channel to judge Band Type and switch Band if need. */1003if (channelToSW > 14)1004BandToSW = BAND_ON_5G;1005else1006BandToSW = BAND_ON_2_4G;10071008if (BandToSW != Band)1009PHY_SwitchWirelessBand8814A(pAdapter, BandToSW);10101011return ret_value;1012}101310141015void1016PHY_SetRFEReg8814A(1017PADAPTER Adapter,1018BOOLEAN bInit,1019u8 Band1020)1021{1022u8 u1tmp = 0;1023HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);10241025if (bInit) {1026switch (pHalData->rfe_type) {1027case 2:1028case 1:1029phy_set_bb_reg(Adapter, 0x1994, 0xf, 0xf); /* 0x1994[3:0] = 0xf */1030u1tmp = PlatformEFIORead1Byte(Adapter, REG_GPIO_IO_SEL_8814A);1031rtw_write8(Adapter, REG_GPIO_IO_SEL_8814A, u1tmp | 0xf0); /* 0x40[23:20] = 0xf */1032break;1033case 0:1034phy_set_bb_reg(Adapter, 0x1994, 0xf, 0xf); /* 0x1994[3:0] = 0xf */1035u1tmp = PlatformEFIORead1Byte(Adapter, REG_GPIO_IO_SEL_8814A);1036rtw_write8(Adapter, REG_GPIO_IO_SEL_8814A, u1tmp | 0xc0); /* 0x40[23:22] = 2b'11 */1037break;1038}1039} else if (Band == BAND_ON_2_4G) {1040switch (pHalData->rfe_type) {1041case 2:1042phy_set_bb_reg(Adapter, rA_RFE_Pinmux_Jaguar, bMaskDWord, 0x72707270); /* 0xCB0 = 0x72707270 */1043phy_set_bb_reg(Adapter, rB_RFE_Pinmux_Jaguar, bMaskDWord, 0x72707270); /* 0xEB0 = 0x72707270 */1044phy_set_bb_reg(Adapter, rC_RFE_Pinmux_Jaguar, bMaskDWord, 0x72707270); /* 0x18B4 = 0x72707270 */1045phy_set_bb_reg(Adapter, rD_RFE_Pinmux_Jaguar, bMaskDWord, 0x77707770); /* 0x1AB4 = 0x77707770 */1046if (pHalData->EEPROMBluetoothCoexist == FALSE) /*WiFi*/1047phy_set_bb_reg(Adapter, 0x1ABC, 0x0ff00000, 0x72); /* 0x1ABC[27:20] = 0x72 */1048break;10491050case 1:1051phy_set_bb_reg(Adapter, rA_RFE_Pinmux_Jaguar, bMaskDWord, 0x77777777); /* 0xCB0 = 0x77777777 */1052phy_set_bb_reg(Adapter, rB_RFE_Pinmux_Jaguar, bMaskDWord, 0x77777777); /* 0xEB0 = 0x77777777 */1053phy_set_bb_reg(Adapter, rC_RFE_Pinmux_Jaguar, bMaskDWord, 0x77777777); /* 0x18B4 = 0x77777777 */1054phy_set_bb_reg(Adapter, rD_RFE_Pinmux_Jaguar, bMaskDWord, 0x77777777); /* 0x1AB4 = 0x77777777 */1055if (pHalData->EEPROMBluetoothCoexist == FALSE) /*WiFi*/1056phy_set_bb_reg(Adapter, 0x1ABC, 0x0ff00000, 0x77); /* 0x1ABC[27:20] = 0x77 */1057break;10581059case 0:1060default:1061phy_set_bb_reg(Adapter, rA_RFE_Pinmux_Jaguar, bMaskDWord, 0x77777777); /* 0xCB0 = 0x77777777 */1062phy_set_bb_reg(Adapter, rB_RFE_Pinmux_Jaguar, bMaskDWord, 0x77777777); /* 0xEB0 = 0x77777777 */1063phy_set_bb_reg(Adapter, rC_RFE_Pinmux_Jaguar, bMaskDWord, 0x77777777); /* 0x18B4 = 0x77777777 */1064if (pHalData->EEPROMBluetoothCoexist == FALSE) /*WiFi*/1065phy_set_bb_reg(Adapter, 0x1ABC, 0x0ff00000, 0x77); /* 0x1ABC[27:20] = 0x77 */1066break;10671068}1069} else {1070switch (pHalData->rfe_type) {1071case 2:1072phy_set_bb_reg(Adapter, rA_RFE_Pinmux_Jaguar, bMaskDWord, 0x37173717); /* 0xCB0 = 0x37173717 */1073phy_set_bb_reg(Adapter, rB_RFE_Pinmux_Jaguar, bMaskDWord, 0x37173717); /* 0xEB0 = 0x37173717 */1074phy_set_bb_reg(Adapter, rC_RFE_Pinmux_Jaguar, bMaskDWord, 0x37173717); /* 0x18B4 = 0x37173717 */1075phy_set_bb_reg(Adapter, rD_RFE_Pinmux_Jaguar, bMaskDWord, 0x77177717); /* 0x1AB4 = 0x77177717 */1076if (pHalData->EEPROMBluetoothCoexist == FALSE) /*WiFi*/1077phy_set_bb_reg(Adapter, 0x1ABC, 0x0ff00000, 0x37); /* 0x1ABC[27:20] = 0x37 */1078break;10791080case 1:1081phy_set_bb_reg(Adapter, rA_RFE_Pinmux_Jaguar, bMaskDWord, 0x33173317); /* 0xCB0 = 0x33173317 */1082phy_set_bb_reg(Adapter, rB_RFE_Pinmux_Jaguar, bMaskDWord, 0x33173317); /* 0xEB0 = 0x33173317 */1083phy_set_bb_reg(Adapter, rC_RFE_Pinmux_Jaguar, bMaskDWord, 0x33173317); /* 0x18B4 = 0x33173317 */1084phy_set_bb_reg(Adapter, rD_RFE_Pinmux_Jaguar, bMaskDWord, 0x77177717); /* 0x1AB4 = 0x77177717 */1085if (pHalData->EEPROMBluetoothCoexist == FALSE) /*WiFi*/1086phy_set_bb_reg(Adapter, 0x1ABC, 0x0ff00000, 0x33); /* 0x1ABC[27:20] = 0x33 */1087break;10881089case 0:1090default:1091phy_set_bb_reg(Adapter, rA_RFE_Pinmux_Jaguar, bMaskDWord, 0x54775477); /* 0xCB0 = 0x54775477 */1092phy_set_bb_reg(Adapter, rB_RFE_Pinmux_Jaguar, bMaskDWord, 0x54775477); /* 0xEB0 = 0x54775477 */1093phy_set_bb_reg(Adapter, rC_RFE_Pinmux_Jaguar, bMaskDWord, 0x54775477); /* 0x18B4 = 0x54775477 */1094phy_set_bb_reg(Adapter, rD_RFE_Pinmux_Jaguar, bMaskDWord, 0x54775477); /* 0x1AB4 = 0x54775477 */1095if (pHalData->EEPROMBluetoothCoexist == FALSE) /*WiFi*/1096phy_set_bb_reg(Adapter, 0x1ABC, 0x0ff00000, 0x54); /* 0x1ABC[27:20] = 0x54 */1097break;1098}1099}1100}11011102void1103phy_SetBBSwingByBand_8814A(1104PADAPTER Adapter,1105u8 Band,1106u8 PreviousBand1107)1108{1109HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);11101111s8 BBDiffBetweenBand = 0;1112struct dm_struct *pDM_Odm = &pHalData->odmpriv;1113struct dm_rf_calibration_struct *pRFCalibrateInfo = &(pDM_Odm->rf_calibrate_info);11141115phy_set_bb_reg(Adapter, rA_TxScale_Jaguar, 0xFFE00000,1116PHY_GetTxBBSwing_8814A(Adapter, (BAND_TYPE)Band, RF_PATH_A)); /* 0xC1C[31:21] */1117phy_set_bb_reg(Adapter, rB_TxScale_Jaguar, 0xFFE00000,1118PHY_GetTxBBSwing_8814A(Adapter, (BAND_TYPE)Band, RF_PATH_B)); /* 0xE1C[31:21] */1119phy_set_bb_reg(Adapter, rC_TxScale_Jaguar2, 0xFFE00000,1120PHY_GetTxBBSwing_8814A(Adapter, (BAND_TYPE)Band, RF_PATH_C)); /* 0x181C[31:21] */1121phy_set_bb_reg(Adapter, rD_TxScale_Jaguar2, 0xFFE00000,1122PHY_GetTxBBSwing_8814A(Adapter, (BAND_TYPE)Band, RF_PATH_D)); /* 0x1A1C[31:21] */11231124/* <20121005, Kordan> When TxPowerTrack is ON, we should take care of the change of BB swing. */1125/* That is, reset all info to trigger Tx power tracking. */11261127if (Band != PreviousBand) {1128BBDiffBetweenBand = (pRFCalibrateInfo->bb_swing_diff_2g - pRFCalibrateInfo->bb_swing_diff_5g);1129BBDiffBetweenBand = (Band == BAND_ON_2_4G) ? BBDiffBetweenBand : (-1 * BBDiffBetweenBand);1130pRFCalibrateInfo->default_ofdm_index += BBDiffBetweenBand * 2;1131}11321133odm_clear_txpowertracking_state(pDM_Odm);1134}113511361137s321138PHY_SwitchWirelessBand8814A(1139PADAPTER Adapter,1140u8 Band1141)1142{1143HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);1144u8 PreBand = pHalData->current_band_type, tepReg = 0;11451146//RTW_INFO("==>PHY_SwitchWirelessBand8814() %s\n", ((Band == 0) ? "2.4G" : "5G"));11471148pHalData->current_band_type = (BAND_TYPE)Band;11491150#ifdef CONFIG_BT_COEXIST1151if (pHalData->EEPROMBluetoothCoexist) {1152struct mlme_ext_priv *mlmeext;11531154/* switch band under site survey or not, must notify to BT COEX */1155mlmeext = &Adapter->mlmeextpriv;1156if (mlmeext_scan_state(mlmeext) != SCAN_DISABLE)1157rtw_btcoex_switchband_notify(_TRUE, pHalData->current_band_type);1158else1159rtw_btcoex_switchband_notify(_FALSE, pHalData->current_band_type);1160} else1161rtw_btcoex_wifionly_switchband_notify(Adapter);1162#else /* !CONFIG_BT_COEXIST */1163rtw_btcoex_wifionly_switchband_notify(Adapter);1164#endif /* CONFIG_BT_COEXIST */11651166/*clear 0x1000[16], When this bit is set to 0, CCK and OFDM are disabled, and clock are gated. Otherwise, CCK and OFDM are enabled. */1167tepReg = rtw_read8(Adapter, REG_SYS_CFG3_8814A + 2);1168rtw_write8(Adapter, REG_SYS_CFG3_8814A + 2, tepReg & (~BIT0));11691170/* STOP Tx/Rx */1171/* phy_set_bb_reg(Adapter, rOFDMCCKEN_Jaguar, bOFDMEN_Jaguar|bCCKEN_Jaguar, 0x00); */11721173if (Band == BAND_ON_2_4G) {1174/* 2.4G band */11751176/* AGC table select */1177phy_set_bb_reg(Adapter, rAGC_table_Jaguar2, 0x1F, 0); /* 0x958[4:0] = 5b'00000 */11781179PHY_SetRFEReg8814A(Adapter, FALSE, Band);11801181/* cck_enable */1182/* phy_set_bb_reg(Adapter, rOFDMCCKEN_Jaguar, bOFDMEN_Jaguar|bCCKEN_Jaguar, 0x3); */11831184if (Adapter->registrypriv.mp_mode == 0) {1185/* 0x80C & 0xa04 must set the same value. */1186phy_set_bb_reg(Adapter, rTxPath_Jaguar, 0xf0, 0x2);1187phy_set_bb_reg(Adapter, rCCK_RX_Jaguar, 0x0f000000, 0x5);1188}11891190phy_set_bb_reg(Adapter, rOFDMCCKEN_Jaguar, bOFDMEN_Jaguar | bCCKEN_Jaguar, 0x3);119111921193/* CCK_CHECK_en */1194rtw_write8(Adapter, REG_CCK_CHECK_8814A, 0x0);1195/* after 5G swicth 2G , set A82[2] = 0 */1196phy_set_bb_reg(Adapter, 0xa80, BIT18, 0x0);11971198} else { /* 5G band */1199/* CCK_CHECK_en */1200rtw_write8(Adapter, REG_CCK_CHECK_8814A, 0x80);1201/* Enable CCK Tx function, even when CCK is off */1202phy_set_bb_reg(Adapter, 0xa80, BIT18, 0x1);12031204/* AGC table select */1205/* Postpone to channel switch */1206/* phy_set_bb_reg(Adapter, rAGC_table_Jaguar2, 0x1F, 1); */ /* 0x958[4:0] = 5b'00001 */12071208PHY_SetRFEReg8814A(Adapter, FALSE, Band);12091210if (Adapter->registrypriv.mp_mode == 0) {1211phy_set_bb_reg(Adapter, rTxPath_Jaguar, 0xf0, 0x0);1212phy_set_bb_reg(Adapter, rCCK_RX_Jaguar, 0x0f000000, 0xF);1213}12141215phy_set_bb_reg(Adapter, rOFDMCCKEN_Jaguar, bOFDMEN_Jaguar | bCCKEN_Jaguar, 0x02);1216/* RTW_INFO("==>PHY_SwitchWirelessBand8814() BAND_ON_5G settings OFDM index 0x%x\n", pHalData->OFDM_index[0]); */1217}12181219phy_SetBBSwingByBand_8814A(Adapter, Band, PreBand);1220phy_SetBwRegAdc_8814A(Adapter, Band, pHalData->current_channel_bw);1221phy_SetBwRegAgc_8814A(Adapter, Band, pHalData->current_channel_bw);1222/* set 0x1000[16], When this bit is set to 0, CCK and OFDM are disabled, and clock are gated. Otherwise, CCK and OFDM are enabled.*/1223tepReg = rtw_read8(Adapter, REG_SYS_CFG3_8814A + 2);1224rtw_write8(Adapter, REG_SYS_CFG3_8814A + 2, tepReg | BIT0);12251226RTW_INFO("<==PHY_SwitchWirelessBand8814():Switch Band OK.\n");1227return _SUCCESS;1228}122912301231u81232phy_GetSecondaryChnl_8814A(1233PADAPTER Adapter1234)1235{1236u8 SCSettingOf40 = 0, SCSettingOf20 = 0;1237PHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter);12381239/* RTW_INFO("SCMapping: Case: pHalData->current_channel_bw %d, pHalData->nCur80MhzPrimeSC %d, pHalData->nCur40MhzPrimeSC %d\n",pHalData->current_channel_bw,pHalData->nCur80MhzPrimeSC,pHalData->nCur40MhzPrimeSC); */1240if (pHalData->current_channel_bw == CHANNEL_WIDTH_80) {1241if (pHalData->nCur80MhzPrimeSC == HAL_PRIME_CHNL_OFFSET_LOWER)1242SCSettingOf40 = VHT_DATA_SC_40_LOWER_OF_80MHZ;1243else if (pHalData->nCur80MhzPrimeSC == HAL_PRIME_CHNL_OFFSET_UPPER)1244SCSettingOf40 = VHT_DATA_SC_40_UPPER_OF_80MHZ;1245else1246RTW_INFO("SCMapping: DONOT CARE Mode Setting\n");12471248if ((pHalData->nCur40MhzPrimeSC == HAL_PRIME_CHNL_OFFSET_LOWER) && (pHalData->nCur80MhzPrimeSC == HAL_PRIME_CHNL_OFFSET_LOWER))1249SCSettingOf20 = VHT_DATA_SC_20_LOWEST_OF_80MHZ;1250else if ((pHalData->nCur40MhzPrimeSC == HAL_PRIME_CHNL_OFFSET_UPPER) && (pHalData->nCur80MhzPrimeSC == HAL_PRIME_CHNL_OFFSET_LOWER))1251SCSettingOf20 = VHT_DATA_SC_20_LOWER_OF_80MHZ;1252else if ((pHalData->nCur40MhzPrimeSC == HAL_PRIME_CHNL_OFFSET_LOWER) && (pHalData->nCur80MhzPrimeSC == HAL_PRIME_CHNL_OFFSET_UPPER))1253SCSettingOf20 = VHT_DATA_SC_20_UPPER_OF_80MHZ;1254else if ((pHalData->nCur40MhzPrimeSC == HAL_PRIME_CHNL_OFFSET_UPPER) && (pHalData->nCur80MhzPrimeSC == HAL_PRIME_CHNL_OFFSET_UPPER))1255SCSettingOf20 = VHT_DATA_SC_20_UPPERST_OF_80MHZ;1256else {1257if (pHalData->nCur80MhzPrimeSC == HAL_PRIME_CHNL_OFFSET_LOWER)1258SCSettingOf20 = VHT_DATA_SC_40_LOWER_OF_80MHZ;1259else if (pHalData->nCur80MhzPrimeSC == HAL_PRIME_CHNL_OFFSET_UPPER)1260SCSettingOf20 = VHT_DATA_SC_40_UPPER_OF_80MHZ;1261else1262RTW_INFO("SCMapping: DONOT CARE Mode Setting\n");1263}1264} else if (pHalData->current_channel_bw == CHANNEL_WIDTH_40) {1265RTW_INFO("SCMapping: pHalData->current_channel_bw %d, pHalData->nCur40MhzPrimeSC %d\n", pHalData->current_channel_bw, pHalData->nCur40MhzPrimeSC);12661267if (pHalData->nCur40MhzPrimeSC == HAL_PRIME_CHNL_OFFSET_UPPER)1268SCSettingOf20 = VHT_DATA_SC_20_UPPER_OF_80MHZ;1269else if (pHalData->nCur40MhzPrimeSC == HAL_PRIME_CHNL_OFFSET_LOWER)1270SCSettingOf20 = VHT_DATA_SC_20_LOWER_OF_80MHZ;1271else1272RTW_INFO("SCMapping: DONOT CARE Mode Setting\n");1273}12741275/*RTW_INFO("SCMapping: SC Value %x\n", ((SCSettingOf40 << 4) | SCSettingOf20));*/1276return (SCSettingOf40 << 4) | SCSettingOf20;1277}127812791280void1281phy_SetBwRegMac_8814A(1282PADAPTER Adapter,1283enum channel_width CurrentBW1284)1285{1286u16 RegRfMod_BW, u2tmp = 0;1287RegRfMod_BW = PlatformEFIORead2Byte(Adapter, REG_TRXPTCL_CTL_8814A);12881289switch (CurrentBW) {1290case CHANNEL_WIDTH_20:1291PlatformEFIOWrite2Byte(Adapter, REG_TRXPTCL_CTL_8814A, (RegRfMod_BW & 0xFE7F)); /* BIT 7 = 0, BIT 8 = 0 */1292break;12931294case CHANNEL_WIDTH_40:1295u2tmp = RegRfMod_BW | BIT7;1296PlatformEFIOWrite2Byte(Adapter, REG_TRXPTCL_CTL_8814A, (u2tmp & 0xFEFF)); /* BIT 7 = 1, BIT 8 = 0 */1297break;12981299case CHANNEL_WIDTH_80:1300u2tmp = RegRfMod_BW | BIT8;1301PlatformEFIOWrite2Byte(Adapter, REG_TRXPTCL_CTL_8814A, (u2tmp & 0xFF7F)); /* BIT 7 = 0, BIT 8 = 1 */1302break;13031304default:1305RT_DISP(FPHY, PHY_BBW, ("phy_SetBwRegMac_8814A(): unknown Bandwidth: %#X\n", CurrentBW));1306break;1307}1308}13091310void PHY_Set_SecCCATH_by_RXANT_8814A(PADAPTER pAdapter, u32 ulAntennaRx)1311{1312PHAL_DATA_TYPE pHalData = GET_HAL_DATA(pAdapter);13131314if ((pHalData->bSWToBW40M == TRUE) && (pHalData->current_channel_bw != CHANNEL_WIDTH_40)) {1315phy_set_bb_reg(pAdapter, rPwed_TH_Jaguar, 0x007c0000, pHalData->BackUp_BB_REG_4_2nd_CCA[0]);1316phy_set_bb_reg(pAdapter, rCCAonSec_Jaguar, 0x0000ff00, pHalData->BackUp_BB_REG_4_2nd_CCA[1]);1317phy_set_bb_reg(pAdapter, r_L1_SBD_start_time, 0x0f000000, pHalData->BackUp_BB_REG_4_2nd_CCA[2]);1318pHalData->bSWToBW40M = FALSE;1319}13201321if ((pHalData->bSWToBW80M == TRUE) && (pHalData->current_channel_bw != CHANNEL_WIDTH_80)) {1322phy_set_bb_reg(pAdapter, r_L1_SBD_start_time, 0x0f000000, pHalData->BackUp_BB_REG_4_2nd_CCA[2]);1323pHalData->bSWToBW80M = FALSE;1324}13251326/*1 Setting CCA TH 2nd CCA parameter by Rx Antenna*/1327if (pHalData->current_channel_bw == CHANNEL_WIDTH_80) {1328if (pHalData->bSWToBW80M == FALSE)1329pHalData->BackUp_BB_REG_4_2nd_CCA[2] = phy_query_bb_reg(pAdapter, r_L1_SBD_start_time, 0x0f000000);13301331pHalData->bSWToBW80M = TRUE;13321333switch (ulAntennaRx) {1334case ANTENNA_A:1335case ANTENNA_B:1336case ANTENNA_C:1337case ANTENNA_D:1338phy_set_bb_reg(pAdapter, r_L1_SBD_start_time, 0x0f000000, 0x0b);/* 0x844[27:24] = 0xb */1339phy_set_bb_reg(pAdapter, rCCAonSec_Jaguar, 0x00000001, 0x1); /* 0x838 Enable 2ndCCA */1340phy_set_bb_reg(pAdapter, rAGC_table_Jaguar, 0x00FF0000, 0x89); /* 0x82C[23:20] = 8, PWDB_TH_QB, 0x82C[19:16] = 9, PWDB_TH_HB*/1341phy_set_bb_reg(pAdapter, rCCAonSec_Jaguar, 0x0FFF0000, 0x887); /* 838[27:24]=8, RF80_secondary40, 838[23:20]=8, RF80_secondary20, 838[19:16]=7, RF80_primary*/1342phy_set_bb_reg(pAdapter, rL1_Weight_Jaguar, 0x0000F000, 0x7); /* 840[15:12]=7, L1_square_Pk_weight_80M*/1343break;13441345case ANTENNA_AB:1346case ANTENNA_AC:1347case ANTENNA_AD:1348case ANTENNA_BC:1349case ANTENNA_BD:1350case ANTENNA_CD:1351phy_set_bb_reg(pAdapter, r_L1_SBD_start_time, 0x0f000000, 0x0d);1352phy_set_bb_reg(pAdapter, rCCAonSec_Jaguar, 0x00000001, 0x1); /* Enable 2ndCCA*/1353phy_set_bb_reg(pAdapter, rAGC_table_Jaguar, 0x00FF0000, 0x78); /* 0x82C[23:20] = 7, PWDB_TH_QB, 0x82C[19:16] = 8, PWDB_TH_HB*/1354phy_set_bb_reg(pAdapter, rCCAonSec_Jaguar, 0x0FFF0000, 0x444); /* 838[27:24]=4, RF80_secondary40, 838[23:20]=4, RF80_secondary20, 838[19:16]=4, RF80_primary*/1355phy_set_bb_reg(pAdapter, rL1_Weight_Jaguar, 0x0000F000, 0x6); /* 840[15:12]=6, L1_square_Pk_weight_80M*/1356break;13571358case ANTENNA_ABC:1359case ANTENNA_ABD:1360case ANTENNA_ACD:1361case ANTENNA_BCD:1362phy_set_bb_reg(pAdapter, r_L1_SBD_start_time, 0x0f000000, 0x0d);1363phy_set_bb_reg(pAdapter, rCCAonSec_Jaguar, 0x00000001, 0x1); /* Enable 2ndCCA*/1364phy_set_bb_reg(pAdapter, rAGC_table_Jaguar, 0x00FF0000, 0x98); /* 0x82C[23:20] = 9, PWDB_TH_QB, 0x82C[19:16] = 8, PWDB_TH_HB*/1365phy_set_bb_reg(pAdapter, rCCAonSec_Jaguar, 0x0FFF0000, 0x666); /* 838[27:24]=6, RF80_secondary40, 838[23:20]=6, RF80_secondary20, 838[19:16]=6, RF80_primary*/1366phy_set_bb_reg(pAdapter, rL1_Weight_Jaguar, 0x0000F000, 0x6); /* 840[15:12]=6, L1_square_Pk_weight_80M*/1367break;13681369case ANTENNA_ABCD:1370phy_set_bb_reg(pAdapter, r_L1_SBD_start_time, 0x0f000000, 0x0d);1371phy_set_bb_reg(pAdapter, rCCAonSec_Jaguar, 0x00000001, 0x1); /*Enable 2ndCCA*/1372phy_set_bb_reg(pAdapter, rAGC_table_Jaguar, 0x00FF0000, 0x98); /* 0x82C[23:20] = 9, PWDB_TH_QB, 0x82C[19:16] = 8, PWDB_TH_HB*/1373phy_set_bb_reg(pAdapter, rCCAonSec_Jaguar, 0x0FFF0000, 0x666); /* 838[27:24]=6, RF80_secondary40, 838[23:20]=6, RF80_secondary20, 838[19:16]=6, RF80_primary*/1374phy_set_bb_reg(pAdapter, rL1_Weight_Jaguar, 0x0000F000, 0x7); /*840[15:12]=7, L1_square_Pk_weight_80M*/1375break;13761377default:1378RTW_INFO("Unknown Rx antenna.\n");1379break;1380}1381} else if (pHalData->current_channel_bw == CHANNEL_WIDTH_40) {1382if (pHalData->bSWToBW40M == FALSE) {1383pHalData->BackUp_BB_REG_4_2nd_CCA[0] = phy_query_bb_reg(pAdapter, rPwed_TH_Jaguar, 0x007c0000);1384pHalData->BackUp_BB_REG_4_2nd_CCA[1] = phy_query_bb_reg(pAdapter, rCCAonSec_Jaguar, 0x0000ff00);1385pHalData->BackUp_BB_REG_4_2nd_CCA[2] = phy_query_bb_reg(pAdapter, r_L1_SBD_start_time, 0x0f000000);1386}13871388switch (ulAntennaRx) {1389case ANTENNA_A: /* xT1R*/1390case ANTENNA_B:1391case ANTENNA_C:1392case ANTENNA_D:1393phy_set_bb_reg(pAdapter, r_L1_SBD_start_time, 0x0f000000, 0x0b);1394phy_set_bb_reg(pAdapter, rPwed_TH_Jaguar, 0x007c0000, 0xe);1395phy_set_bb_reg(pAdapter, rCCAonSec_Jaguar, 0x0000ff00, 0x43);1396phy_set_bb_reg(pAdapter, rCCAonSec_Jaguar, 0x00000001, 0x1);1397break;1398case ANTENNA_AB: /* xT2R*/1399case ANTENNA_AC:1400case ANTENNA_AD:1401case ANTENNA_BC:1402case ANTENNA_BD:1403case ANTENNA_CD:1404phy_set_bb_reg(pAdapter, r_L1_SBD_start_time, 0x0f000000, 0x0d);1405phy_set_bb_reg(pAdapter, rPwed_TH_Jaguar, 0x007c0000, 0x8);1406phy_set_bb_reg(pAdapter, rCCAonSec_Jaguar, 0x0000ff00, 0x43);1407phy_set_bb_reg(pAdapter, rCCAonSec_Jaguar, 0x00000001, 0x1);1408break;1409case ANTENNA_ABC: /* xT3R*/1410case ANTENNA_ABD:1411case ANTENNA_ACD:1412case ANTENNA_BCD:1413case ANTENNA_ABCD: /* xT4R*/1414phy_set_bb_reg(pAdapter, r_L1_SBD_start_time, 0x0f000000, 0x0d);1415phy_set_bb_reg(pAdapter, rPwed_TH_Jaguar, 0x007c0000, 0xa);1416phy_set_bb_reg(pAdapter, rCCAonSec_Jaguar, 0x0000ff00, 0x43);1417phy_set_bb_reg(pAdapter, rCCAonSec_Jaguar, 0x00000001, 0x1);1418break;1419default:1420break;1421}1422pHalData->bSWToBW40M = TRUE;1423} else {1424phy_set_bb_reg(pAdapter, rCCAonSec_Jaguar, 0x00000001, 0x0); /* Enable 2ndCCA*/1425phy_set_bb_reg(pAdapter, rAGC_table_Jaguar, 0x00FF0000, 0x43); /* 0x82C[23:20] = 9, PWDB_TH_QB, 0x82C[19:16] = 8, PWDB_TH_HB*/1426phy_set_bb_reg(pAdapter, rCCAonSec_Jaguar, 0x0FFF0000, 0x7aa); /* 838[27:24]=6, RF80_secondary40, 838[23:20]=6, RF80_secondary20, 838[19:16]=6, RF80_primary*/1427phy_set_bb_reg(pAdapter, rL1_Weight_Jaguar, 0x0000F000, 0x7); /* 840[15:12]=7, L1_square_Pk_weight_80M*/1428}14291430}143114321433void PHY_SetRXSC_by_TXSC_8814A(PADAPTER Adapter, u8 SubChnlNum)1434{1435PHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter);14361437if (pHalData->current_channel_bw == CHANNEL_WIDTH_80) {1438if (SubChnlNum == 0)1439phy_set_bb_reg(Adapter, rRFMOD_Jaguar, 0x00000003c, 0x1);1440else if (SubChnlNum == 1)1441phy_set_bb_reg(Adapter, rRFMOD_Jaguar, 0x00000003c, 0x1);1442else if (SubChnlNum == 2)1443phy_set_bb_reg(Adapter, rRFMOD_Jaguar, 0x00000003c, 0x2);1444else if (SubChnlNum == 4)1445phy_set_bb_reg(Adapter, rRFMOD_Jaguar, 0x00000003c, 0x4);1446else if (SubChnlNum == 3)1447phy_set_bb_reg(Adapter, rRFMOD_Jaguar, 0x00000003c, 0x3);1448else if (SubChnlNum == 9)1449phy_set_bb_reg(Adapter, rRFMOD_Jaguar, 0x00000003c, 0x1);1450else if (SubChnlNum == 10)1451phy_set_bb_reg(Adapter, rRFMOD_Jaguar, 0x00000003c, 0x2);1452} else if (pHalData->current_channel_bw == CHANNEL_WIDTH_40) {1453if (SubChnlNum == 1)1454phy_set_bb_reg(Adapter, rRFMOD_Jaguar, 0x00000003c, 0x1);1455else if (SubChnlNum == 2)1456phy_set_bb_reg(Adapter, rRFMOD_Jaguar, 0x00000003c, 0x2);1457} else1458phy_set_bb_reg(Adapter, rRFMOD_Jaguar, 0x00000003c, 0x0);1459}146014611462/* <20141230, James> A workaround to eliminate the 5280MHz & 5600MHz & 5760MHzspur of 8814A. (Asked by BBSD Neil.)*/1463void phy_SpurCalibration_8814A(PADAPTER Adapter)1464{1465HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);14661467BOOLEAN Reset_NBI_CSI = TRUE;1468struct dm_struct *pDM_Odm = &pHalData->odmpriv;1469static u32 bak_82c = 0, bak_830 = 0;14701471/*RTW_INFO("%s(),RFE Type =%d, CurrentCh = %d ,ChannelBW =%d\n", __func__, pHalData->rfe_type, pHalData->current_channel, pHalData->current_channel_bw);*/1472/*RTW_INFO("%s(),Before RrNBI_Setting_Jaguar= %x\n", __func__, phy_query_bb_reg(Adapter, rNBI_Setting_Jaguar, bMaskDWord));*/14731474if (pHalData->rfe_type == 0) {1475switch (pHalData->current_channel_bw) {1476case CHANNEL_WIDTH_40:1477if (pHalData->current_channel == 54 || pHalData->current_channel == 118) {1478phy_set_bb_reg(Adapter, rNBI_Setting_Jaguar, 0x000fe000, 0x3e >> 1);1479phy_set_bb_reg(Adapter, rCSI_Mask_Setting1_Jaguar, BIT(0), 1);1480phy_set_bb_reg(Adapter, rCSI_Fix_Mask0_Jaguar, bMaskDWord, 0);1481phy_set_bb_reg(Adapter, rCSI_Fix_Mask1_Jaguar, BIT(0), 1);1482phy_set_bb_reg(Adapter, rCSI_Fix_Mask6_Jaguar, bMaskDWord, 0);1483phy_set_bb_reg(Adapter, rCSI_Fix_Mask7_Jaguar, bMaskDWord, 0);1484Reset_NBI_CSI = FALSE;1485} else if (pHalData->current_channel == 151) {1486phy_set_bb_reg(Adapter, rNBI_Setting_Jaguar, 0x000fe000, 0x1e >> 1);1487phy_set_bb_reg(Adapter, rCSI_Mask_Setting1_Jaguar, BIT(0), 1);1488phy_set_bb_reg(Adapter, rCSI_Fix_Mask0_Jaguar, BIT(16), 1);1489phy_set_bb_reg(Adapter, rCSI_Fix_Mask1_Jaguar, bMaskDWord, 0);1490phy_set_bb_reg(Adapter, rCSI_Fix_Mask6_Jaguar, bMaskDWord, 0);1491phy_set_bb_reg(Adapter, rCSI_Fix_Mask7_Jaguar, bMaskDWord, 0);1492Reset_NBI_CSI = FALSE;1493}1494break;14951496case CHANNEL_WIDTH_80:1497if (pHalData->current_channel == 58 || pHalData->current_channel == 122) {1498phy_set_bb_reg(Adapter, rNBI_Setting_Jaguar, 0x000fe000, 0x3a >> 1);1499phy_set_bb_reg(Adapter, rCSI_Mask_Setting1_Jaguar, BIT(0), 1);1500phy_set_bb_reg(Adapter, rCSI_Fix_Mask0_Jaguar, bMaskDWord, 0);1501phy_set_bb_reg(Adapter, rCSI_Fix_Mask1_Jaguar, bMaskDWord, 0);1502phy_set_bb_reg(Adapter, rCSI_Fix_Mask6_Jaguar, bMaskDWord, 0);1503phy_set_bb_reg(Adapter, rCSI_Fix_Mask7_Jaguar, BIT(0), 1);1504Reset_NBI_CSI = FALSE;1505} else if (pHalData->current_channel == 155) {1506phy_set_bb_reg(Adapter, rNBI_Setting_Jaguar, 0x000fe000, 0x5a >> 1);1507phy_set_bb_reg(Adapter, rCSI_Mask_Setting1_Jaguar, BIT(0), 1);1508phy_set_bb_reg(Adapter, rCSI_Fix_Mask0_Jaguar, bMaskDWord, 0);1509phy_set_bb_reg(Adapter, rCSI_Fix_Mask1_Jaguar, bMaskDWord, 0);1510phy_set_bb_reg(Adapter, rCSI_Fix_Mask6_Jaguar, BIT(16), 1);1511phy_set_bb_reg(Adapter, rCSI_Fix_Mask7_Jaguar, bMaskDWord, 0);1512Reset_NBI_CSI = FALSE;1513}1514break;1515case CHANNEL_WIDTH_20:1516if (pHalData->current_channel == 153) {1517phy_set_bb_reg(Adapter, rNBI_Setting_Jaguar, 0x000fe000, 0x1e >> 1);1518phy_set_bb_reg(Adapter, rCSI_Mask_Setting1_Jaguar, BIT(0), 1);1519phy_set_bb_reg(Adapter, rCSI_Fix_Mask0_Jaguar, bMaskDWord, 0);1520phy_set_bb_reg(Adapter, rCSI_Fix_Mask1_Jaguar, bMaskDWord, 0);1521phy_set_bb_reg(Adapter, rCSI_Fix_Mask6_Jaguar, bMaskDWord, 0);1522phy_set_bb_reg(Adapter, rCSI_Fix_Mask7_Jaguar, BIT(16), 1);1523Reset_NBI_CSI = FALSE;1524}15251526/* Add for 8814AE module ch140 MP Rx */1527if (pHalData->current_channel == 140) {1528if (bak_82c == 0)1529bak_82c = phy_query_bb_reg(Adapter, 0x82c, bMaskDWord);1530if (bak_830 == 0)1531bak_830 = phy_query_bb_reg(Adapter, 0x830, bMaskDWord);15321533phy_set_bb_reg(Adapter, 0x82c, bMaskDWord, 0x75438170);1534phy_set_bb_reg(Adapter, 0x830, bMaskDWord, 0x79a18a0a);1535} else {1536if ((phy_query_bb_reg(Adapter, 0x82c, bMaskDWord) == 0x75438170) && (bak_82c != 0))1537phy_set_bb_reg(Adapter, 0x82c, bMaskDWord, bak_82c);15381539if ((phy_query_bb_reg(Adapter, 0x830, bMaskDWord) == 0x79a18a0a) && (bak_830 != 0))1540phy_set_bb_reg(Adapter, 0x830, bMaskDWord, bak_830);15411542bak_82c = phy_query_bb_reg(Adapter, 0x82c, bMaskDWord);1543bak_830 = phy_query_bb_reg(Adapter, 0x830, bMaskDWord);1544}1545break;15461547default:1548break;1549}1550} else if (pHalData->rfe_type == 1 || pHalData->rfe_type == 2) {1551switch (pHalData->current_channel_bw) {1552case CHANNEL_WIDTH_20:1553if (pHalData->current_channel == 153) {1554phy_set_bb_reg(Adapter, rNBI_Setting_Jaguar, 0x000fe000, 0x1E >> 1);1555phy_set_bb_reg(Adapter, rCSI_Mask_Setting1_Jaguar, BIT(0), 1);1556phy_set_bb_reg(Adapter, rCSI_Fix_Mask0_Jaguar, bMaskDWord, 0);1557phy_set_bb_reg(Adapter, rCSI_Fix_Mask1_Jaguar, bMaskDWord, 0);1558phy_set_bb_reg(Adapter, rCSI_Fix_Mask6_Jaguar, bMaskDWord, 0);1559phy_set_bb_reg(Adapter, rCSI_Fix_Mask7_Jaguar, BIT(16), 1);1560Reset_NBI_CSI = FALSE;1561}1562break;1563case CHANNEL_WIDTH_40:1564if (pHalData->current_channel == 151) {1565phy_set_bb_reg(Adapter, rNBI_Setting_Jaguar, 0x000fe000, 0x1e >> 1);1566phy_set_bb_reg(Adapter, rCSI_Mask_Setting1_Jaguar, BIT(0), 1);1567phy_set_bb_reg(Adapter, rCSI_Fix_Mask0_Jaguar, BIT(16), 1);1568phy_set_bb_reg(Adapter, rCSI_Fix_Mask1_Jaguar, bMaskDWord, 0);1569phy_set_bb_reg(Adapter, rCSI_Fix_Mask6_Jaguar, bMaskDWord, 0);1570phy_set_bb_reg(Adapter, rCSI_Fix_Mask7_Jaguar, bMaskDWord, 0);1571Reset_NBI_CSI = FALSE;1572}1573break;1574case CHANNEL_WIDTH_80:1575if (pHalData->current_channel == 155) {1576phy_set_bb_reg(Adapter, rNBI_Setting_Jaguar, 0x000fe000, 0x5a >> 1);1577phy_set_bb_reg(Adapter, rCSI_Mask_Setting1_Jaguar, BIT(0), 1);1578phy_set_bb_reg(Adapter, rCSI_Fix_Mask0_Jaguar, bMaskDWord, 0);1579phy_set_bb_reg(Adapter, rCSI_Fix_Mask1_Jaguar, bMaskDWord, 0);1580phy_set_bb_reg(Adapter, rCSI_Fix_Mask6_Jaguar, BIT(16), 1);1581phy_set_bb_reg(Adapter, rCSI_Fix_Mask7_Jaguar, bMaskDWord, 0);1582Reset_NBI_CSI = FALSE;1583}1584break;15851586default:1587break;1588}1589}15901591if (Reset_NBI_CSI) {1592phy_set_bb_reg(Adapter, rNBI_Setting_Jaguar, 0x000fe000, 0xfc >> 1);1593phy_set_bb_reg(Adapter, rCSI_Mask_Setting1_Jaguar, BIT(0), 0);1594phy_set_bb_reg(Adapter, rCSI_Fix_Mask0_Jaguar, bMaskDWord, 0);1595phy_set_bb_reg(Adapter, rCSI_Fix_Mask1_Jaguar, bMaskDWord, 0);1596phy_set_bb_reg(Adapter, rCSI_Fix_Mask6_Jaguar, bMaskDWord, 0);1597phy_set_bb_reg(Adapter, rCSI_Fix_Mask7_Jaguar, bMaskDWord, 0);1598}15991600phydm_spur_nbi_setting_8814a(pDM_Odm);1601/*RTW_INFO("%s(),After RrNBI_Setting_Jaguar= %x\n", __func__, phy_query_bb_reg(Adapter, rNBI_Setting_Jaguar, bMaskDWord));*/1602}160316041605void phy_ModifyInitialGain_8814A(1606PADAPTER Adapter)1607{1608HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);1609u8 channel = pHalData->current_channel;1610s8 offset[4]; /*{A,B,C,D}*/1611u8 i = 0;1612u8 chnl_section = 0xff;16131614if (channel <= 14 && channel > 0)1615chnl_section = 0; /*2G*/1616else if (channel <= 64 && channel >= 36)1617chnl_section = 1; /*5GL*/1618else if (channel <= 144 && channel >= 100)1619chnl_section = 2; /*5GM*/1620else if (channel <= 177 && channel >= 149)1621chnl_section = 3; /*5GH*/16221623if (chnl_section > 3) {1624RTW_INFO("%s: worng channel section\n", __func__);1625return;1626}16271628for (i = 0; i < 4; i++) {1629u8 hex_offset;16301631hex_offset = (u8)(pHalData->RxGainOffset[chnl_section] >> (12 - 4 * i)) & 0x0f;1632RTW_INFO("%s: pHalData->RxGainOffset[%d] = %x\n", __func__, chnl_section, pHalData->RxGainOffset[chnl_section]);1633RTW_INFO("%s: hex_offset = %x\n", __func__, hex_offset);16341635if (hex_offset == 0xf)1636offset[i] = 0;1637else if (hex_offset >= 0x8)1638offset[i] = 0x11 - hex_offset;1639else1640offset[i] = 0x0 - hex_offset;1641offset[i] = (offset[i] / 2) * 2;1642RTW_INFO("%s: offset[%d] = %x\n", __func__, i, offset[i]);1643RTW_INFO("%s: BackUp_IG_REG_4_Chnl_Section[%d] = %x\n", __func__, i, pHalData->BackUp_IG_REG_4_Chnl_Section[i]);1644}16451646if (pHalData->BackUp_IG_REG_4_Chnl_Section[0] != 0 &&1647pHalData->BackUp_IG_REG_4_Chnl_Section[1] != 0 &&1648pHalData->BackUp_IG_REG_4_Chnl_Section[2] != 0 &&1649pHalData->BackUp_IG_REG_4_Chnl_Section[3] != 01650) {1651phy_set_bb_reg(Adapter, rA_IGI_Jaguar, 0x000000ff, pHalData->BackUp_IG_REG_4_Chnl_Section[0] + offset[0]);1652phy_set_bb_reg(Adapter, rB_IGI_Jaguar, 0x000000ff, pHalData->BackUp_IG_REG_4_Chnl_Section[1] + offset[1]);1653phy_set_bb_reg(Adapter, rC_IGI_Jaguar2, 0x000000ff, pHalData->BackUp_IG_REG_4_Chnl_Section[2] + offset[2]);1654phy_set_bb_reg(Adapter, rD_IGI_Jaguar2, 0x000000ff, pHalData->BackUp_IG_REG_4_Chnl_Section[3] + offset[3]);1655}1656}165716581659void phy_SetBwMode8814A(PADAPTER Adapter)1660{1661u8 SubChnlNum = 0;1662HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);16631664/* 3 Set Reg668 BW */1665phy_SetBwRegMac_8814A(Adapter, pHalData->current_channel_bw);16661667/* 3 Set Reg483 */1668SubChnlNum = phy_GetSecondaryChnl_8814A(Adapter);1669rtw_write8(Adapter, REG_DATA_SC_8814A, SubChnlNum);16701671if (pHalData->rf_chip == RF_PSEUDO_11N) {1672RTW_INFO("phy_SetBwMode8814A: return for PSEUDO\n");1673return;1674}16751676/* 3 Set Reg8AC Reg8C4 Reg8C8 */1677phy_SetBwRegAdc_8814A(Adapter, pHalData->current_band_type, pHalData->current_channel_bw);1678/* 3 Set Reg82C */1679phy_SetBwRegAgc_8814A(Adapter, pHalData->current_band_type, pHalData->current_channel_bw);16801681/* 3 Set Reg848 RegA00 */1682switch (pHalData->current_channel_bw) {1683case CHANNEL_WIDTH_20:1684break;16851686case CHANNEL_WIDTH_40:1687phy_set_bb_reg(Adapter, rRFMOD_Jaguar, 0x3C, SubChnlNum); /* 0x8ac[5:2]=1/2 */16881689if (SubChnlNum == VHT_DATA_SC_20_UPPER_OF_80MHZ) /* 0xa00[4]=1/0 */1690phy_set_bb_reg(Adapter, rCCK_System_Jaguar, bCCK_System_Jaguar, 1);1691else1692phy_set_bb_reg(Adapter, rCCK_System_Jaguar, bCCK_System_Jaguar, 0);1693break;16941695case CHANNEL_WIDTH_80:1696phy_set_bb_reg(Adapter, rRFMOD_Jaguar, 0x3C, SubChnlNum); /* 0x8ac[5:2]=1/2/3/4/9/10 */1697break;16981699default:1700RTW_INFO("%s():unknown Bandwidth:%#X\n", __func__, pHalData->current_channel_bw);1701break;1702}17031704#if (MP_DRIVER == 1)1705if (Adapter->registrypriv.mp_mode == 1) {1706/* 2 Set Reg 0x8AC */1707PHY_SetRXSC_by_TXSC_8814A(Adapter, (SubChnlNum & 0xf));1708PHY_Set_SecCCATH_by_RXANT_8814A(Adapter, pHalData->AntennaRxPath);1709}1710#endif1711/* 3 Set RF related register */1712PHY_RF6052SetBandwidth8814A(Adapter, pHalData->current_channel_bw);17131714phy_ADC_CLK_8814A(Adapter);1715phy_SpurCalibration_8814A(Adapter);1716}1717171817191720/* 1 6. Channel setting API */17211722/* <YuChen, 140529> Add for KFree Feature Requested by RF David.1723* We need support ABCD four path Kfree */17241725void1726phy_SetKfreeToRF_8814A(1727PADAPTER Adapter,1728enum rf_path eRFPath,1729u8 Data1730)1731{1732HAL_DATA_TYPE *pHalData = GET_HAL_DATA(GetDefaultAdapter(Adapter));1733struct dm_struct *pDM_Odm = &pHalData->odmpriv;1734BOOLEAN bOdd;1735struct dm_rf_calibration_struct *pRFCalibrateInfo = &(pDM_Odm->rf_calibrate_info);1736if ((Data % 2) != 0) { /* odd->positive */1737Data = Data - 1;1738phy_set_rf_reg(Adapter, eRFPath, REG_RF_TX_GAIN_OFFSET, BIT19, 1);1739bOdd = TRUE;1740} else { /* even->negative */1741phy_set_rf_reg(Adapter, eRFPath, REG_RF_TX_GAIN_OFFSET, BIT19, 0);1742bOdd = FALSE;1743}1744switch (Data) {1745case 2:1746phy_set_rf_reg(Adapter, eRFPath, REG_RF_TX_GAIN_OFFSET, BIT14, 1);1747pRFCalibrateInfo->kfree_offset[eRFPath] = 0;1748break;1749case 4:1750phy_set_rf_reg(Adapter, eRFPath, REG_RF_TX_GAIN_OFFSET, BIT17 | BIT16 | BIT15, 1);1751pRFCalibrateInfo->kfree_offset[eRFPath] = 1;1752break;1753case 6:1754phy_set_rf_reg(Adapter, eRFPath, REG_RF_TX_GAIN_OFFSET, BIT14, 1);1755phy_set_rf_reg(Adapter, eRFPath, REG_RF_TX_GAIN_OFFSET, BIT17 | BIT16 | BIT15, 1);1756pRFCalibrateInfo->kfree_offset[eRFPath] = 1;1757break;1758case 8:1759phy_set_rf_reg(Adapter, eRFPath, REG_RF_TX_GAIN_OFFSET, BIT17 | BIT16 | BIT15, 2);1760pRFCalibrateInfo->kfree_offset[eRFPath] = 2;1761break;1762case 10:1763phy_set_rf_reg(Adapter, eRFPath, REG_RF_TX_GAIN_OFFSET, BIT14, 1);1764phy_set_rf_reg(Adapter, eRFPath, REG_RF_TX_GAIN_OFFSET, BIT17 | BIT16 | BIT15, 2);1765pRFCalibrateInfo->kfree_offset[eRFPath] = 2;1766break;1767case 12:1768phy_set_rf_reg(Adapter, eRFPath, REG_RF_TX_GAIN_OFFSET, BIT17 | BIT16 | BIT15, 3);1769pRFCalibrateInfo->kfree_offset[eRFPath] = 3;1770break;1771case 14:1772phy_set_rf_reg(Adapter, eRFPath, REG_RF_TX_GAIN_OFFSET, BIT14, 1);1773phy_set_rf_reg(Adapter, eRFPath, REG_RF_TX_GAIN_OFFSET, BIT17 | BIT16 | BIT15, 3);1774pRFCalibrateInfo->kfree_offset[eRFPath] = 3;1775break;1776case 16:1777phy_set_rf_reg(Adapter, eRFPath, REG_RF_TX_GAIN_OFFSET, BIT17 | BIT16 | BIT15, 4);1778pRFCalibrateInfo->kfree_offset[eRFPath] = 4;1779break;1780case 18:1781phy_set_rf_reg(Adapter, eRFPath, REG_RF_TX_GAIN_OFFSET, BIT14, 1);1782phy_set_rf_reg(Adapter, eRFPath, REG_RF_TX_GAIN_OFFSET, BIT17 | BIT16 | BIT15, 4);1783pRFCalibrateInfo->kfree_offset[eRFPath] = 4;1784break;1785case 20:1786phy_set_rf_reg(Adapter, eRFPath, REG_RF_TX_GAIN_OFFSET, BIT17 | BIT16 | BIT15, 5);1787pRFCalibrateInfo->kfree_offset[eRFPath] = 5;1788break;17891790default:1791break;1792}17931794if (bOdd == FALSE) { /* that means Kfree offset is negative, we need to record it. */1795pRFCalibrateInfo->kfree_offset[eRFPath] = (-1) * pRFCalibrateInfo->kfree_offset[eRFPath];1796}17971798}179918001801void1802phy_ConfigKFree8814A(1803PADAPTER Adapter,1804u8 channelToSW,1805BAND_TYPE bandType1806)1807{1808u8 targetval_A = 0xFF;1809u8 targetval_B = 0xFF;1810u8 targetval_C = 0xFF;1811u8 targetval_D = 0xFF;1812HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);18131814/* RTW_INFO("===>phy_ConfigKFree8814A()\n"); */18151816if (Adapter->registrypriv.RegPwrTrimEnable == 2) {1817/*RTW_INFO("phy_ConfigKFree8814A(): RegRfKFreeEnable == 2, Disable\n");*/1818return;1819} else if (Adapter->registrypriv.RegPwrTrimEnable == 1 || Adapter->registrypriv.RegPwrTrimEnable == 0) {1820RTW_INFO("phy_ConfigKFree8814A(): RegPwrTrimEnable == TRUE\n");1821if (bandType == BAND_ON_2_4G) {1822RTW_INFO("phy_ConfigKFree8814A(): bandType == BAND_ON_2_4G, channelToSW= %d\n", channelToSW);1823if (channelToSW <= 14 && channelToSW >= 1) {1824efuse_OneByteRead(Adapter, 0x3F4, &targetval_A, FALSE); /* for Path A and B */1825efuse_OneByteRead(Adapter, 0x3F5, &targetval_B, FALSE); /* for Path C and D */1826}18271828} else if (bandType == BAND_ON_5G) {1829RTW_INFO("phy_ConfigKFree8814A(): bandType == BAND_ON_5G, channelToSW= %d\n", channelToSW);1830if (channelToSW >= 36 && channelToSW < 50) { /* 5GLB_1 */1831efuse_OneByteRead(Adapter, 0x3E0, &targetval_A, FALSE);1832efuse_OneByteRead(Adapter, 0x3E1, &targetval_B, FALSE);1833efuse_OneByteRead(Adapter, 0x3E2, &targetval_C, FALSE);1834efuse_OneByteRead(Adapter, 0x3E3, &targetval_D, FALSE);1835} else if (channelToSW >= 50 && channelToSW <= 64) { /* 5GLB_2 */1836efuse_OneByteRead(Adapter, 0x3E4, &targetval_A, FALSE);1837efuse_OneByteRead(Adapter, 0x3E5, &targetval_B, FALSE);1838efuse_OneByteRead(Adapter, 0x3E6, &targetval_C, FALSE);1839efuse_OneByteRead(Adapter, 0x3E7, &targetval_D, FALSE);1840} else if (channelToSW >= 100 && channelToSW <= 118) { /* 5GMB_1 */1841efuse_OneByteRead(Adapter, 0x3E8, &targetval_A, FALSE);1842efuse_OneByteRead(Adapter, 0x3E9, &targetval_B, FALSE);1843efuse_OneByteRead(Adapter, 0x3EA, &targetval_C, FALSE);1844efuse_OneByteRead(Adapter, 0x3EB, &targetval_D, FALSE);1845} else if (channelToSW >= 120 && channelToSW <= 140) { /* 5GMB_2 */1846efuse_OneByteRead(Adapter, 0x3EC, &targetval_A, FALSE);1847efuse_OneByteRead(Adapter, 0x3ED, &targetval_B, FALSE);1848efuse_OneByteRead(Adapter, 0x3EE, &targetval_C, FALSE);1849efuse_OneByteRead(Adapter, 0x3EF, &targetval_D, FALSE);1850} else if (channelToSW >= 149 && channelToSW <= 165) { /* 5GHB */1851efuse_OneByteRead(Adapter, 0x3F0, &targetval_A, FALSE);1852efuse_OneByteRead(Adapter, 0x3F1, &targetval_B, FALSE);1853efuse_OneByteRead(Adapter, 0x3F2, &targetval_C, FALSE);1854efuse_OneByteRead(Adapter, 0x3F3, &targetval_D, FALSE);1855}1856}1857RTW_INFO("phy_ConfigKFree8814A(): targetval_A= %#x\n", targetval_A);1858RTW_INFO("phy_ConfigKFree8814A(): targetval_B= %#x\n", targetval_B);1859RTW_INFO("phy_ConfigKFree8814A(): targetval_C= %#x\n", targetval_C);1860RTW_INFO("phy_ConfigKFree8814A(): targetval_D= %#x\n", targetval_D);18611862/* Make sure the targetval is defined */1863if ((Adapter->registrypriv.RegPwrTrimEnable == 1) && ((targetval_A != 0xFF) || (pHalData->RfKFreeEnable == TRUE))) {1864if (bandType == BAND_ON_2_4G) { /* 2G */1865phy_SetKfreeToRF_8814A(Adapter, RF_PATH_A, targetval_A & 0x0F);1866phy_SetKfreeToRF_8814A(Adapter, RF_PATH_B, (targetval_A & 0xF0) >> 4);1867phy_SetKfreeToRF_8814A(Adapter, RF_PATH_C, targetval_B & 0x0F);1868phy_SetKfreeToRF_8814A(Adapter, RF_PATH_D, (targetval_B & 0xF0) >> 4);1869} else if (bandType == BAND_ON_5G) {1870phy_SetKfreeToRF_8814A(Adapter, RF_PATH_A, targetval_A & 0x1F);1871phy_SetKfreeToRF_8814A(Adapter, RF_PATH_B, targetval_B & 0x1F);1872phy_SetKfreeToRF_8814A(Adapter, RF_PATH_C, targetval_C & 0x1F);1873phy_SetKfreeToRF_8814A(Adapter, RF_PATH_D, targetval_D & 0x1F);1874}1875} else {1876return;1877}1878}1879}18801881void1882phy_SwChnl8814A(1883PADAPTER pAdapter1884)1885{1886enum rf_path eRFPath = RF_PATH_A, channelIdx = 0;1887HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter);1888#ifdef CONFIG_RF_POWER_TRIM1889struct kfree_data_t *kfree_data = &pHalData->kfree_data;1890#endif1891u8 channelToSW = pHalData->current_channel;1892u32 RFValToWR , RFTmpVal, BitShift, BitMask;18931894/* RTW_INFO("[BW:CHNL], phy_SwChnl8814A(), switch to channel %d !!\n", channelToSW); */18951896if (phy_SwBand8814A(pAdapter, channelToSW) == FALSE)1897RTW_INFO("error Chnl %d", channelToSW);18981899if (pHalData->rf_chip == RF_PSEUDO_11N) {1900return;1901}19021903#ifdef CONFIG_RF_POWER_TRIM1904/* <YuChen, 140529> Add for KFree Feature Requested by RF David. */1905if (kfree_data->flag & KFREE_FLAG_ON) {19061907channelIdx = rtw_ch_to_bb_gain_sel(channelToSW);1908#if 01909if (pHalData->RfKFree_ch_group != channelIdx) {1910/* Todo: wait for new phydm ready */1911phy_ConfigKFree8814A(pAdapter, channelToSW, pHalData->current_band_type);1912phydm_ConfigKFree(pDM_Odm, channelToSW, kfree_data->bb_gain);1913RTW_INFO("RfKFree_ch_group =%d\n", channelIdx);1914}1915#endif19161917pHalData->RfKFree_ch_group = channelIdx;19181919}1920#endif /*CONFIG_RF_POWER_TRIM*/1921if (pHalData->RegFWOffload == 2)1922FillH2CCmd_8814(pAdapter, H2C_CHNL_SWITCH_OFFLOAD, 1, &channelToSW);1923else {1924/* fc_area */1925if (36 <= channelToSW && channelToSW <= 48)1926phy_set_bb_reg(pAdapter, rFc_area_Jaguar, 0x1ffe0000, 0x494);1927else if (50 <= channelToSW && channelToSW <= 64)1928phy_set_bb_reg(pAdapter, rFc_area_Jaguar, 0x1ffe0000, 0x453);1929else if (100 <= channelToSW && channelToSW <= 116)1930phy_set_bb_reg(pAdapter, rFc_area_Jaguar, 0x1ffe0000, 0x452);1931else if (118 <= channelToSW)1932phy_set_bb_reg(pAdapter, rFc_area_Jaguar, 0x1ffe0000, 0x412);1933else1934phy_set_bb_reg(pAdapter, rFc_area_Jaguar, 0x1ffe0000, 0x96a);19351936for (eRFPath = 0; eRFPath < pHalData->NumTotalRFPath; eRFPath++) {1937/* RF_MOD_AG */1938if (36 <= channelToSW && channelToSW <= 64)1939RFValToWR = 0x101; /* 5'b00101 */1940else if (100 <= channelToSW && channelToSW <= 140)1941RFValToWR = 0x301; /* 5'b01101 */1942else if (140 < channelToSW)1943RFValToWR = 0x501; /* 5'b10101 */1944else1945RFValToWR = 0x000; /* 5'b00000 */19461947/* Channel to switch */1948BitMask = BIT18 | BIT17 | BIT16 | BIT9 | BIT8;1949BitShift = PHY_CalculateBitShift(BitMask);1950RFTmpVal = channelToSW | (RFValToWR << BitShift);19511952BitMask = BIT18 | BIT17 | BIT16 | BIT9 | BIT8 | bMaskByte0;19531954phy_set_rf_reg(pAdapter, eRFPath, RF_CHNLBW_Jaguar, BitMask, RFTmpVal);1955}19561957if (36 <= channelToSW && channelToSW <= 64) /* Band 1 & Band 2 */1958phy_set_bb_reg(pAdapter, rAGC_table_Jaguar2, 0x1F, 1); /* 0x958[4:0] = 0x1 */1959else if (100 <= channelToSW && channelToSW <= 144) /* Band 3 */1960phy_set_bb_reg(pAdapter, rAGC_table_Jaguar2, 0x1F, 2); /* 0x958[4:0] = 0x2 */1961else if (channelToSW >= 149) /* Band 4 */1962phy_set_bb_reg(pAdapter, rAGC_table_Jaguar2, 0x1F, 3); /* 0x958[4:0] = 0x3 */1963}19641965if (pAdapter->registrypriv.mp_mode == 1) {1966if (!pHalData->bSetChnlBW)1967phy_ADC_CLK_8814A(pAdapter);1968phy_SpurCalibration_8814A(pAdapter);1969phy_ModifyInitialGain_8814A(pAdapter);1970}19711972/* 2.4G CCK TX DFIR */1973if (channelToSW >= 1 && channelToSW <= 11) {1974phy_set_bb_reg(pAdapter, rCCK0_TxFilter1, bMaskDWord, 0x1a1b0030);1975phy_set_bb_reg(pAdapter, rCCK0_TxFilter2, bMaskDWord, 0x090e1317);1976phy_set_bb_reg(pAdapter, rCCK0_DebugPort, bMaskDWord, 0x00000204);1977} else if (channelToSW >= 12 && channelToSW <= 13) {1978phy_set_bb_reg(pAdapter, rCCK0_TxFilter1, bMaskDWord, 0x1a1b0030);1979phy_set_bb_reg(pAdapter, rCCK0_TxFilter2, bMaskDWord, 0x090e1217);1980phy_set_bb_reg(pAdapter, rCCK0_DebugPort, bMaskDWord, 0x00000305);1981} else if (channelToSW == 14) {1982phy_set_bb_reg(pAdapter, rCCK0_TxFilter1, bMaskDWord, 0x1a1b0030);1983phy_set_bb_reg(pAdapter, rCCK0_TxFilter2, bMaskDWord, 0x00000E17);1984phy_set_bb_reg(pAdapter, rCCK0_DebugPort, bMaskDWord, 0x00000000);1985}19861987}19881989#if 01990/* void1991* PHY_SwChnlTimerCallback8814A( */1992/* PRT_TIMER pTimer */1993/* ) */1994{1995/* PADAPTER pAdapter = (PADAPTER)pTimer->Adapter; */1996/* HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter); */199719981999if (rtw_is_drv_stopped(padapter))2000return;20012002if (pHalData->rf_chip == RF_PSEUDO_11N) {2003pHalData->SwChnlInProgress = FALSE;2004return; /* return immediately if it is peudo-phy */2005}200620072008PlatformAcquireSpinLock(pAdapter, RT_CHANNEL_AND_BANDWIDTH_SPINLOCK);2009pHalData->SwChnlInProgress = TRUE;2010PlatformReleaseSpinLock(pAdapter, RT_CHANNEL_AND_BANDWIDTH_SPINLOCK);20112012phy_SwChnl8814A(pAdapter);20132014PlatformAcquireSpinLock(pAdapter, RT_CHANNEL_AND_BANDWIDTH_SPINLOCK);2015pHalData->SwChnlInProgress = FALSE;2016PlatformReleaseSpinLock(pAdapter, RT_CHANNEL_AND_BANDWIDTH_SPINLOCK);20172018}201920202021void2022PHY_SwChnlWorkItemCallback8814A(2023void *pContext2024)2025{2026PADAPTER pAdapter = (PADAPTER)pContext;2027HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter);20282029if (pAdapter->bInSetPower && RT_USB_CANNOT_IO(pAdapter)) {20302031pHalData->SwChnlInProgress = FALSE;2032return;2033}20342035if (rtw_is_drv_stopped(padapter))2036return;20372038if (pHalData->rf_chip == RF_PSEUDO_11N) {2039pHalData->SwChnlInProgress = FALSE;2040return; /* return immediately if it is peudo-phy */2041}20422043PlatformAcquireSpinLock(pAdapter, RT_CHANNEL_AND_BANDWIDTH_SPINLOCK);2044pHalData->SwChnlInProgress = TRUE;2045PlatformReleaseSpinLock(pAdapter, RT_CHANNEL_AND_BANDWIDTH_SPINLOCK);20462047phy_SwChnl8814A(pAdapter);20482049PlatformAcquireSpinLock(pAdapter, RT_CHANNEL_AND_BANDWIDTH_SPINLOCK);2050pHalData->SwChnlInProgress = FALSE;2051PlatformReleaseSpinLock(pAdapter, RT_CHANNEL_AND_BANDWIDTH_SPINLOCK);20522053}205420552056void2057HAL_HandleSwChnl8814A(/* Call after initialization */2058PADAPTER pAdapter,2059u8 channel2060)2061{2062PADAPTER Adapter = GetDefaultAdapter(pAdapter);2063HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);2064pHalData->current_channel = channel;2065phy_SwChnl8814A(Adapter);206620672068#if (MP_DRIVER == 1)2069/* <20120712, Kordan> IQK on each channel, asked by James. */2070phy_iq_calibrate_8814a(pAdapter, FALSE);2071#endif20722073}2074#endif20752076void2077phy_SwChnlAndSetBwMode8814A(2078PADAPTER Adapter2079)2080{2081HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);2082struct dm_struct *pDM_Odm = &pHalData->odmpriv;20832084/* RTW_INFO("phy_SwChnlAndSetBwMode8814A(): bSwChnl %d, bSetChnlBW %d\n", pHalData->bSwChnl, pHalData->bSetChnlBW); */2085if (Adapter->bNotifyChannelChange) {2086RTW_INFO("[%s] bSwChnl=%d, ch=%d, bSetChnlBW=%d, bw=%d\n",2087__FUNCTION__,2088pHalData->bSwChnl,2089pHalData->current_channel,2090pHalData->bSetChnlBW,2091pHalData->current_channel_bw);2092}20932094if (RTW_CANNOT_RUN(Adapter)) {2095pHalData->bSwChnlAndSetBWInProgress = FALSE;2096return;2097}20982099if (pHalData->bSwChnl) {2100phy_SwChnl8814A(Adapter);2101pHalData->bSwChnl = FALSE;2102}21032104if (pHalData->bSetChnlBW) {2105phy_SetBwMode8814A(Adapter);2106pHalData->bSetChnlBW = FALSE;2107}21082109if (Adapter->registrypriv.mp_mode == 0) {2110odm_clear_txpowertracking_state(pDM_Odm);2111rtw_hal_set_tx_power_level(Adapter, pHalData->current_channel);2112if (pHalData->bNeedIQK == _TRUE) {2113/*phy_iq_calibrate_8814a(pDM_Odm, _FALSE);*/2114halrf_iqk_trigger(&pHalData->odmpriv, _FALSE);2115pHalData->bNeedIQK = _FALSE;2116}2117} else2118halrf_iqk_trigger(&pHalData->odmpriv, _FALSE);2119/*phy_iq_calibrate_8814a(pDM_Odm, _FALSE);*/2120#if 0 /* todo */2121#if (AUTO_CHNL_SEL_NHM == 1)2122if (IS_AUTO_CHNL_SUPPORT(Adapter) &&2123P2PIsSocialChannel(pHalData->current_channel)) {21242125/* Reset NHM counter */2126odm_auto_channel_select_reset(GET_PDM_ODM(Adapter));21272128SET_AUTO_CHNL_STATE(Adapter, ACS_BEFORE_NHM);/* Before NHM measurement */2129}2130#endif2131#endif /* 0 */2132pHalData->bSwChnlAndSetBWInProgress = FALSE;2133}213421352136void2137PHY_SwChnlAndSetBWModeCallback8814A(2138void *pContext2139)2140{2141PADAPTER Adapter = (PADAPTER)pContext;2142phy_SwChnlAndSetBwMode8814A(Adapter);2143}21442145#if 02146/* */2147/* Description: */2148/* Switch channel synchronously. Called by SwChnlByDelayHandler. */2149/* */2150/* Implemented by Bruce, 2008-02-14. */2151/* The following procedure is operted according to SwChanlCallback8190Pci(). */2152/* However, this procedure is performed synchronously which should be running under */2153/* passive level. */2154/* */2155void2156PHY_SwChnlSynchronously8814A(/* Only called during initialize */2157PADAPTER Adapter,2158u8 channel2159)2160{2161HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);216221632164/* Cannot IO. */2165if (RT_CANNOT_IO(Adapter))2166return;21672168/* Channel Switching is in progress. */2169if (pHalData->bSwChnlAndSetBWInProgress)2170return;21712172/* return immediately if it is peudo-phy */2173if (pHalData->rf_chip == RF_PSEUDO_11N) {2174pHalData->bSwChnlAndSetBWInProgress = FALSE;2175return;2176}21772178switch (pHalData->CurrentWirelessMode) {2179case WIRELESS_MODE_A:2180case WIRELESS_MODE_N_5G:2181case WIRELESS_MODE_AC_5G:2182/* Get first channel error when change between 5G and 2.4G band. */2183/* FIX ME!!! */2184if (channel <= 14)2185return;2186RT_ASSERT((channel > 14), ("WIRELESS_MODE_A but channel<=14"));2187break;21882189case WIRELESS_MODE_B:2190case WIRELESS_MODE_G:2191case WIRELESS_MODE_N_24G:2192case WIRELESS_MODE_AC_24G:2193/* Get first channel error when change between 5G and 2.4G band. */2194/* FIX ME!!! */2195if (channel > 14)2196return;2197RT_ASSERT((channel <= 14), ("WIRELESS_MODE_G but channel>14"));2198break;21992200default:2201RT_ASSERT(FALSE, ("Invalid WirelessMode(%#x)!!\n", pHalData->CurrentWirelessMode));2202break;22032204}22052206pHalData->bSwChnlAndSetBWInProgress = TRUE;2207if (channel == 0)2208channel = 1;22092210pHalData->bSwChnl = TRUE;2211pHalData->bSetChnlBW = FALSE;2212pHalData->current_channel = channel;22132214phy_SwChnlAndSetBwMode8814A(Adapter);221522162217}2218#endif22192220void2221PHY_HandleSwChnlAndSetBW8814A(2222PADAPTER Adapter,2223BOOLEAN bSwitchChannel,2224BOOLEAN bSetBandWidth,2225u8 ChannelNum,2226enum channel_width ChnlWidth,2227u8 ChnlOffsetOf40MHz,2228u8 ChnlOffsetOf80MHz,2229u8 CenterFrequencyIndex12230)2231{2232PADAPTER pDefAdapter = GetDefaultAdapter(Adapter);2233PHAL_DATA_TYPE pHalData = GET_HAL_DATA(pDefAdapter);2234u8 tmpChannel = pHalData->current_channel;2235enum channel_width tmpBW = pHalData->current_channel_bw;2236u8 tmpnCur40MhzPrimeSC = pHalData->nCur40MhzPrimeSC;2237u8 tmpnCur80MhzPrimeSC = pHalData->nCur80MhzPrimeSC;2238u8 tmpCenterFrequencyIndex1 = pHalData->CurrentCenterFrequencyIndex1;2239struct mlme_ext_priv *pmlmeext = &Adapter->mlmeextpriv;22402241/* check is swchnl or setbw */2242if (!bSwitchChannel && !bSetBandWidth) {2243RTW_INFO("PHY_HandleSwChnlAndSetBW8812: not switch channel and not set bandwidth\n");2244return;2245}22462247/* skip change for channel or bandwidth is the same */2248if (bSwitchChannel) {2249if (pHalData->current_channel != ChannelNum) {2250if (HAL_IsLegalChannel(Adapter, ChannelNum))2251pHalData->bSwChnl = _TRUE;2252else2253return;2254}2255}22562257if (bSetBandWidth) {2258if (pHalData->bChnlBWInitialized == _FALSE) {2259pHalData->bChnlBWInitialized = _TRUE;2260pHalData->bSetChnlBW = _TRUE;2261} else if ((pHalData->current_channel_bw != ChnlWidth) ||2262(pHalData->nCur40MhzPrimeSC != ChnlOffsetOf40MHz) ||2263(pHalData->nCur80MhzPrimeSC != ChnlOffsetOf80MHz) ||2264(pHalData->CurrentCenterFrequencyIndex1 != CenterFrequencyIndex1))2265pHalData->bSetChnlBW = _TRUE;2266}22672268if (!pHalData->bSetChnlBW && !pHalData->bSwChnl && pHalData->bNeedIQK != _TRUE) {2269/* RTW_INFO("<= PHY_HandleSwChnlAndSetBW8812: bSwChnl %d, bSetChnlBW %d\n",pHalData->bSwChnl,pHalData->bSetChnlBW); */2270return;2271}227222732274if (pHalData->bSwChnl) {2275pHalData->current_channel = ChannelNum;2276pHalData->CurrentCenterFrequencyIndex1 = ChannelNum;2277}227822792280if (pHalData->bSetChnlBW) {2281pHalData->current_channel_bw = ChnlWidth;2282#if 02283if (ExtChnlOffsetOf40MHz == EXTCHNL_OFFSET_LOWER)2284pHalData->nCur40MhzPrimeSC = HAL_PRIME_CHNL_OFFSET_UPPER;2285else if (ExtChnlOffsetOf40MHz == EXTCHNL_OFFSET_UPPER)2286pHalData->nCur40MhzPrimeSC = HAL_PRIME_CHNL_OFFSET_LOWER;2287else2288pHalData->nCur40MhzPrimeSC = HAL_PRIME_CHNL_OFFSET_DONT_CARE;22892290if (ExtChnlOffsetOf80MHz == EXTCHNL_OFFSET_LOWER)2291pHalData->nCur80MhzPrimeSC = HAL_PRIME_CHNL_OFFSET_UPPER;2292else if (ExtChnlOffsetOf80MHz == EXTCHNL_OFFSET_UPPER)2293pHalData->nCur80MhzPrimeSC = HAL_PRIME_CHNL_OFFSET_LOWER;2294else2295pHalData->nCur80MhzPrimeSC = HAL_PRIME_CHNL_OFFSET_DONT_CARE;2296#else2297pHalData->nCur40MhzPrimeSC = ChnlOffsetOf40MHz;2298pHalData->nCur80MhzPrimeSC = ChnlOffsetOf80MHz;2299#endif23002301pHalData->CurrentCenterFrequencyIndex1 = CenterFrequencyIndex1;2302}23032304/* Switch workitem or set timer to do switch channel or setbandwidth operation */2305if (!RTW_CANNOT_RUN(Adapter))2306phy_SwChnlAndSetBwMode8814A(Adapter);2307else {2308if (pHalData->bSwChnl) {2309pHalData->current_channel = tmpChannel;2310pHalData->CurrentCenterFrequencyIndex1 = tmpChannel;2311}2312if (pHalData->bSetChnlBW) {2313pHalData->current_channel_bw = tmpBW;2314pHalData->nCur40MhzPrimeSC = tmpnCur40MhzPrimeSC;2315pHalData->nCur80MhzPrimeSC = tmpnCur80MhzPrimeSC;2316pHalData->CurrentCenterFrequencyIndex1 = tmpCenterFrequencyIndex1;2317}2318}23192320/* RTW_INFO("Channel %d ChannelBW %d ",pHalData->current_channel, pHalData->current_channel_bw); */2321/* RTW_INFO("40MhzPrimeSC %d 80MhzPrimeSC %d ",pHalData->nCur40MhzPrimeSC, pHalData->nCur80MhzPrimeSC); */2322/* RTW_INFO("CenterFrequencyIndex1 %d\n",pHalData->CurrentCenterFrequencyIndex1); */23232324/* RTW_INFO("<= PHY_HandleSwChnlAndSetBW8812: bSwChnl %d, bSetChnlBW %d\n",pHalData->bSwChnl,pHalData->bSetChnlBW); */23252326}232723282329BOOLEAN2330SetAntennaConfig8814A(2331PADAPTER pAdapter,2332u8 DefaultAnt /* 0: Main, 1: Aux. */2333)2334{2335return TRUE;2336}23372338void2339PHY_SetSwChnlBWMode8814(2340PADAPTER Adapter,2341u8 channel,2342enum channel_width Bandwidth,2343u8 Offset40,2344u8 Offset802345)2346{2347/* RTW_INFO("%s()===>\n",__FUNCTION__); */23482349PHY_HandleSwChnlAndSetBW8814A(Adapter, _TRUE, _TRUE, channel, Bandwidth, Offset40, Offset80, channel);23502351/* RTW_INFO("<==%s()\n",__FUNCTION__); */2352}235323542355