1 /******************************************************************************
\r
3 * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
\r
5 * This program is free software; you can redistribute it and/or modify it
\r
6 * under the terms of version 2 of the GNU General Public License as
\r
7 * published by the Free Software Foundation.
\r
9 * This program is distributed in the hope that it will be useful, but WITHOUT
\r
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
\r
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
\r
14 * You should have received a copy of the GNU General Public License along with
\r
15 * this program; if not, write to the Free Software Foundation, Inc.,
\r
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
\r
19 ******************************************************************************/
\r
20 #define _RTL8723B_PHYCFG_C_
\r
22 #include <rtl8723b_hal.h>
\r
25 /*---------------------------Define Local Constant---------------------------*/
\r
26 /* Channel switch:The size of command tables for switch channel*/
\r
27 #define MAX_PRECMD_CNT 16
\r
28 #define MAX_RFDEPENDCMD_CNT 16
\r
29 #define MAX_POSTCMD_CNT 16
\r
31 #define MAX_DOZE_WAITING_TIMES_9x 64
\r
33 /*---------------------------Define Local Constant---------------------------*/
\r
36 /*------------------------Define global variable-----------------------------*/
\r
38 /*------------------------Define local variable------------------------------*/
\r
41 /*--------------------Define export function prototype-----------------------*/
\r
42 // Please refer to header file
\r
43 /*--------------------Define export function prototype-----------------------*/
\r
45 /*----------------------------Function Body----------------------------------*/
\r
47 // 1. BB register R/W API
\r
51 * Function: phy_CalculateBitShift
\r
53 * OverView: Get shifted position of the BitMask
\r
59 * Return: u4Byte Return the shift bit bit position of the mask
\r
62 phy_CalculateBitShift(
\r
68 for(i=0; i<=31; i++)
\r
70 if ( ((BitMask>>i) & 0x1 ) == 1)
\r
79 * Function: PHY_QueryBBReg
\r
81 * OverView: Read "sepcific bits" from BB register
\r
85 * u4Byte RegAddr, //The target address to be readback
\r
86 * u4Byte BitMask //The target bit position in the target address
\r
89 * Return: u4Byte Data //The readback register value
\r
90 * Note: This function is equal to "GetRegSetting" in PHY programming guide
\r
93 PHY_QueryBBReg_8723B(
\r
94 IN PADAPTER Adapter,
\r
99 u32 ReturnValue = 0, OriginalValue, BitShift;
\r
100 u16 BBWaitCounter = 0;
\r
102 #if (DISABLE_BB_RF == 1)
\r
106 //RT_TRACE(COMP_RF, DBG_TRACE, ("--->PHY_QueryBBReg(): RegAddr(%#lx), BitMask(%#lx)\n", RegAddr, BitMask));
\r
108 OriginalValue = rtw_read32(Adapter, RegAddr);
\r
109 BitShift = phy_CalculateBitShift(BitMask);
\r
110 ReturnValue = (OriginalValue & BitMask) >> BitShift;
\r
112 return (ReturnValue);
\r
118 * Function: PHY_SetBBReg
\r
120 * OverView: Write "Specific bits" to BB register (page 8~)
\r
123 * PADAPTER Adapter,
\r
124 * u4Byte RegAddr, //The target address to be modified
\r
125 * u4Byte BitMask //The target bit position in the target address
\r
127 * u4Byte Data //The new register value in the target bit position
\r
128 * //of the target address
\r
132 * Note: This function is equal to "PutRegSetting" in PHY programming guide
\r
136 PHY_SetBBReg_8723B(
\r
137 IN PADAPTER Adapter,
\r
143 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
\r
144 //u16 BBWaitCounter = 0;
\r
145 u32 OriginalValue, BitShift;
\r
147 #if (DISABLE_BB_RF == 1)
\r
151 //RT_TRACE(COMP_RF, DBG_TRACE, ("--->PHY_SetBBReg(): RegAddr(%#lx), BitMask(%#lx), Data(%#lx)\n", RegAddr, BitMask, Data));
\r
153 if(BitMask!= bMaskDWord){//if not "double word" write
\r
154 OriginalValue = rtw_read32(Adapter, RegAddr);
\r
155 BitShift = phy_CalculateBitShift(BitMask);
\r
156 Data = ((OriginalValue & (~BitMask)) | ((Data << BitShift) & BitMask));
\r
159 rtw_write32(Adapter, RegAddr, Data);
\r
165 // 2. RF register R/W API
\r
168 /*-----------------------------------------------------------------------------
\r
169 * Function: phy_FwRFSerialRead()
\r
171 * Overview: We support firmware to execute RF-R/W.
\r
181 * 01/21/2008 MHC Create Version 0.
\r
183 *---------------------------------------------------------------------------*/
\r
185 phy_FwRFSerialRead(
\r
186 IN PADAPTER Adapter,
\r
187 IN RF_PATH eRFPath,
\r
191 //RT_ASSERT(FALSE,("deprecate!\n"));
\r
194 } /* phy_FwRFSerialRead */
\r
197 /*-----------------------------------------------------------------------------
\r
198 * Function: phy_FwRFSerialWrite()
\r
200 * Overview: We support firmware to execute RF-R/W.
\r
210 * 01/21/2008 MHC Create Version 0.
\r
212 *---------------------------------------------------------------------------*/
\r
214 phy_FwRFSerialWrite(
\r
215 IN PADAPTER Adapter,
\r
216 IN RF_PATH eRFPath,
\r
220 //RT_ASSERT(FALSE,("deprecate!\n"));
\r
224 phy_RFSerialRead_8723B(
\r
225 IN PADAPTER Adapter,
\r
226 IN RF_PATH eRFPath,
\r
231 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
\r
232 BB_REGISTER_DEFINITION_T *pPhyReg = &pHalData->PHYRegDef[eRFPath];
\r
234 u32 tmplong,tmplong2;
\r
236 u4Byte MaskforPhySet=0;
\r
240 // Make sure RF register offset is correct
\r
244 NewOffset = Offset;
\r
246 if(eRFPath == RF_PATH_A)
\r
248 tmplong2 = PHY_QueryBBReg(Adapter, rFPGA0_XA_HSSIParameter2|MaskforPhySet, bMaskDWord);;
\r
249 tmplong2 = (tmplong2 & (~bLSSIReadAddress)) | (NewOffset<<23) | bLSSIReadEdge; //T65 RF
\r
250 PHY_SetBBReg(Adapter, rFPGA0_XA_HSSIParameter2|MaskforPhySet, bMaskDWord, tmplong2&(~bLSSIReadEdge));
\r
254 tmplong2 = PHY_QueryBBReg(Adapter, rFPGA0_XB_HSSIParameter2|MaskforPhySet, bMaskDWord);
\r
255 tmplong2 = (tmplong2 & (~bLSSIReadAddress)) | (NewOffset<<23) | bLSSIReadEdge; //T65 RF
\r
256 PHY_SetBBReg(Adapter, rFPGA0_XB_HSSIParameter2|MaskforPhySet, bMaskDWord, tmplong2&(~bLSSIReadEdge));
\r
259 tmplong2 = PHY_QueryBBReg(Adapter, rFPGA0_XA_HSSIParameter2|MaskforPhySet, bMaskDWord);
\r
260 PHY_SetBBReg(Adapter, rFPGA0_XA_HSSIParameter2|MaskforPhySet, bMaskDWord, tmplong2 & (~bLSSIReadEdge));
\r
261 PHY_SetBBReg(Adapter, rFPGA0_XA_HSSIParameter2|MaskforPhySet, bMaskDWord, tmplong2 | bLSSIReadEdge);
\r
266 rtw_udelay_os(MAX_STALL_TIME);
\r
269 if(eRFPath == RF_PATH_A)
\r
270 RfPiEnable = (u1Byte)PHY_QueryBBReg(Adapter, rFPGA0_XA_HSSIParameter1|MaskforPhySet, BIT8);
\r
271 else if(eRFPath == RF_PATH_B)
\r
272 RfPiEnable = (u1Byte)PHY_QueryBBReg(Adapter, rFPGA0_XB_HSSIParameter1|MaskforPhySet, BIT8);
\r
275 { // Read from BBreg8b8, 12 bits for 8190, 20bits for T65 RF
\r
276 retValue = PHY_QueryBBReg(Adapter, pPhyReg->rfLSSIReadBackPi|MaskforPhySet, bLSSIReadBackData);
\r
278 //RT_DISP(FINIT, INIT_RF, ("Readback from RF-PI : 0x%x\n", retValue));
\r
281 { //Read from BBreg8a0, 12 bits for 8190, 20 bits for T65 RF
\r
282 retValue = PHY_QueryBBReg(Adapter, pPhyReg->rfLSSIReadBack|MaskforPhySet, bLSSIReadBackData);
\r
284 //RT_DISP(FINIT, INIT_RF,("Readback from RF-SI : 0x%x\n", retValue));
\r
291 * Function: phy_RFSerialWrite_8723B
\r
293 * OverView: Write data to RF register (page 8~)
\r
296 * PADAPTER Adapter,
\r
297 * RF_PATH eRFPath, //Radio path of A/B/C/D
\r
298 * u4Byte Offset, //The target address to be read
\r
299 * u4Byte Data //The new register Data in the target bit position
\r
300 * //of the target to be read
\r
304 * Note: Threre are three types of serial operations:
\r
305 * 1. Software serial write
\r
306 * 2. Hardware LSSI-Low Speed Serial Interface
\r
307 * 3. Hardware HSSI-High speed
\r
308 * serial write. Driver need to implement (1) and (2).
\r
309 * This function is equal to the combination of RF_ReadReg() and RFLSSIRead()
\r
311 * Note: For RF8256 only
\r
312 * The total count of RTL8256(Zebra4) register is around 36 bit it only employs
\r
313 * 4-bit RF address. RTL8256 uses "register mode control bit" (Reg00[12], Reg00[10])
\r
314 * to access register address bigger than 0xf. See "Appendix-4 in PHY Configuration
\r
315 * programming guide" for more details.
\r
316 * Thus, we define a sub-finction for RTL8526 register address conversion
\r
317 * ===========================================================
\r
318 * Register Mode RegCTL[1] RegCTL[0] Note
\r
319 * (Reg00[12]) (Reg00[10])
\r
320 * ===========================================================
\r
321 * Reg_Mode0 0 x Reg 0 ~15(0x0 ~ 0xf)
\r
322 * ------------------------------------------------------------------
\r
323 * Reg_Mode1 1 0 Reg 16 ~30(0x1 ~ 0xf)
\r
324 * ------------------------------------------------------------------
\r
325 * Reg_Mode2 1 1 Reg 31 ~ 45(0x1 ~ 0xf)
\r
326 * ------------------------------------------------------------------
\r
328 * 2008/09/02 MH Add 92S RF definition
\r
334 phy_RFSerialWrite_8723B(
\r
335 IN PADAPTER Adapter,
\r
336 IN RF_PATH eRFPath,
\r
341 u32 DataAndAddr = 0;
\r
342 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
\r
343 BB_REGISTER_DEFINITION_T *pPhyReg = &pHalData->PHYRegDef[eRFPath];
\r
351 //PHY_RFShadowWrite(Adapter, eRFPath, Offset, Data);
\r
354 // Switch page for 8256 RF IC
\r
356 NewOffset = Offset;
\r
359 // Put write addr in [5:0] and write data in [31:16]
\r
361 //DataAndAddr = (Data<<16) | (NewOffset&0x3f);
\r
362 DataAndAddr = ((NewOffset<<20) | (Data&0x000fffff)) & 0x0fffffff; // T65 RF
\r
367 PHY_SetBBReg(Adapter, pPhyReg->rf3wireOffset, bMaskDWord, DataAndAddr);
\r
368 //RTPRINT(FPHY, PHY_RFW, ("RFW-%d Addr[0x%lx]=0x%lx\n", eRFPath, pPhyReg->rf3wireOffset, DataAndAddr));
\r
374 * Function: PHY_QueryRFReg
\r
376 * OverView: Query "Specific bits" to RF register (page 8~)
\r
379 * PADAPTER Adapter,
\r
380 * RF_PATH eRFPath, //Radio path of A/B/C/D
\r
381 * u4Byte RegAddr, //The target address to be read
\r
382 * u4Byte BitMask //The target bit position in the target address
\r
386 * Return: u4Byte Readback value
\r
387 * Note: This function is equal to "GetRFRegSetting" in PHY programming guide
\r
390 PHY_QueryRFReg_8723B(
\r
391 IN PADAPTER Adapter,
\r
397 u32 Original_Value, Readback_Value, BitShift;
\r
399 #if (DISABLE_BB_RF == 1)
\r
403 Original_Value = phy_RFSerialRead_8723B(Adapter, eRFPath, RegAddr);
\r
405 BitShift = phy_CalculateBitShift(BitMask);
\r
406 Readback_Value = (Original_Value & BitMask) >> BitShift;
\r
408 return (Readback_Value);
\r
412 * Function: PHY_SetRFReg
\r
414 * OverView: Write "Specific bits" to RF register (page 8~)
\r
417 * PADAPTER Adapter,
\r
418 * RF_PATH eRFPath, //Radio path of A/B/C/D
\r
419 * u4Byte RegAddr, //The target address to be modified
\r
420 * u4Byte BitMask //The target bit position in the target address
\r
422 * u4Byte Data //The new register Data in the target bit position
\r
423 * //of the target address
\r
427 * Note: This function is equal to "PutRFRegSetting" in PHY programming guide
\r
430 PHY_SetRFReg_8723B(
\r
431 IN PADAPTER Adapter,
\r
438 u32 Original_Value, BitShift;
\r
440 #if (DISABLE_BB_RF == 1)
\r
444 // RF data is 12 bits only
\r
445 if (BitMask != bRFRegOffsetMask)
\r
447 Original_Value = phy_RFSerialRead_8723B(Adapter, eRFPath, RegAddr);
\r
448 BitShift = phy_CalculateBitShift(BitMask);
\r
449 Data = ((Original_Value & (~BitMask)) | (Data<< BitShift));
\r
452 phy_RFSerialWrite_8723B(Adapter, eRFPath, RegAddr, Data);
\r
457 // 3. Initial MAC/BB/RF config by reading MAC/BB/RF txt.
\r
461 /*-----------------------------------------------------------------------------
\r
462 * Function: PHY_MACConfig8192C
\r
464 * Overview: Condig MAC by header file or parameter file.
\r
474 * 08/12/2008 MHC Create Version 0.
\r
476 *---------------------------------------------------------------------------*/
\r
477 s32 PHY_MACConfig8723B(PADAPTER Adapter)
\r
479 int rtStatus = _SUCCESS;
\r
480 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
\r
482 s8 sz8723MACRegFile[] = RTL8723B_PHY_MACREG;
\r
485 pszMACRegFile = sz8723MACRegFile;
\r
490 #ifdef CONFIG_LOAD_PHY_PARA_FROM_FILE
\r
491 rtStatus = phy_ConfigMACWithParaFile(Adapter, pszMACRegFile);
\r
492 if (rtStatus == _FAIL)
\r
495 #ifdef CONFIG_EMBEDDED_FWIMG
\r
496 ODM_ConfigMACWithHeaderFile(&pHalData->odmpriv);
\r
497 rtStatus = _SUCCESS;
\r
498 #endif//CONFIG_EMBEDDED_FWIMG
\r
505 * Function: phy_InitBBRFRegisterDefinition
\r
507 * OverView: Initialize Register definition offset for Radio Path A/B/C/D
\r
510 * PADAPTER Adapter,
\r
514 * Note: The initialization value is constant and it should never be changes
\r
517 phy_InitBBRFRegisterDefinition(
\r
518 IN PADAPTER Adapter
\r
521 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
\r
523 // RF Interface Sowrtware Control
\r
524 pHalData->PHYRegDef[ODM_RF_PATH_A].rfintfs = rFPGA0_XAB_RFInterfaceSW; // 16 LSBs if read 32-bit from 0x870
\r
525 pHalData->PHYRegDef[ODM_RF_PATH_B].rfintfs = rFPGA0_XAB_RFInterfaceSW; // 16 MSBs if read 32-bit from 0x870 (16-bit for 0x872)
\r
527 // RF Interface Output (and Enable)
\r
528 pHalData->PHYRegDef[ODM_RF_PATH_A].rfintfo = rFPGA0_XA_RFInterfaceOE; // 16 LSBs if read 32-bit from 0x860
\r
529 pHalData->PHYRegDef[ODM_RF_PATH_B].rfintfo = rFPGA0_XB_RFInterfaceOE; // 16 LSBs if read 32-bit from 0x864
\r
531 // RF Interface (Output and) Enable
\r
532 pHalData->PHYRegDef[ODM_RF_PATH_A].rfintfe = rFPGA0_XA_RFInterfaceOE; // 16 MSBs if read 32-bit from 0x860 (16-bit for 0x862)
\r
533 pHalData->PHYRegDef[ODM_RF_PATH_B].rfintfe = rFPGA0_XB_RFInterfaceOE; // 16 MSBs if read 32-bit from 0x864 (16-bit for 0x866)
\r
535 pHalData->PHYRegDef[ODM_RF_PATH_A].rf3wireOffset = rFPGA0_XA_LSSIParameter; //LSSI Parameter
\r
536 pHalData->PHYRegDef[ODM_RF_PATH_B].rf3wireOffset = rFPGA0_XB_LSSIParameter;
\r
538 pHalData->PHYRegDef[ODM_RF_PATH_A].rfHSSIPara2 = rFPGA0_XA_HSSIParameter2; //wire control parameter2
\r
539 pHalData->PHYRegDef[ODM_RF_PATH_B].rfHSSIPara2 = rFPGA0_XB_HSSIParameter2; //wire control parameter2
\r
541 // Tranceiver Readback LSSI/HSPI mode
\r
542 pHalData->PHYRegDef[ODM_RF_PATH_A].rfLSSIReadBack = rFPGA0_XA_LSSIReadBack;
\r
543 pHalData->PHYRegDef[ODM_RF_PATH_B].rfLSSIReadBack = rFPGA0_XB_LSSIReadBack;
\r
544 pHalData->PHYRegDef[ODM_RF_PATH_A].rfLSSIReadBackPi = TransceiverA_HSPI_Readback;
\r
545 pHalData->PHYRegDef[ODM_RF_PATH_B].rfLSSIReadBackPi = TransceiverB_HSPI_Readback;
\r
549 #if (MP_DRIVER == 1)
\r
551 /*-----------------------------------------------------------------------------
\r
552 * Function: phy_ConfigBBWithMpHeaderFile
\r
554 * Overview: Config PHY_REG_MP array
\r
564 * 02/04/2010 chiyokolin Modify to new files.
\r
565 *---------------------------------------------------------------------------*/
\r
567 phy_ConfigBBWithMpHeaderFile(
\r
568 IN PADAPTER Adapter,
\r
569 IN u1Byte ConfigType)
\r
572 u32* Rtl8723BPHY_REGArray_Table_MP;
\r
573 u16 PHY_REGArrayMPLen;
\r
574 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
\r
577 PHY_REGArrayMPLen = Rtl8723B_PHY_REG_Array_MPLength;
\r
578 Rtl8723BPHY_REGArray_Table_MP = (u32*)Rtl8723B_PHY_REG_Array_MP;
\r
580 if(ConfigType == BaseBand_Config_PHY_REG)
\r
582 for(i=0;i<PHY_REGArrayMPLen;i=i+2)
\r
584 if (Rtl8723BPHY_REGArray_Table_MP[i] == 0xfe) {
\r
585 #ifdef CONFIG_LONG_DELAY_ISSUE
\r
591 else if (Rtl8723BPHY_REGArray_Table_MP[i] == 0xfd)
\r
593 else if (Rtl8723BPHY_REGArray_Table_MP[i] == 0xfc)
\r
595 else if (Rtl8723BPHY_REGArray_Table_MP[i] == 0xfb) {
\r
596 #ifdef CONFIG_LONG_DELAY_ISSUE
\r
602 else if (Rtl8723BPHY_REGArray_Table_MP[i] == 0xfa)
\r
604 else if (Rtl8723BPHY_REGArray_Table_MP[i] == 0xf9)
\r
606 PHY_SetBBReg(Adapter, Rtl8723BPHY_REGArray_Table_MP[i], bMaskDWord, Rtl8723BPHY_REGArray_Table_MP[i+1]);
\r
608 // Add 1us delay between BB/RF register setting.
\r
611 // RT_TRACE(COMP_INIT, DBG_TRACE, ("The Rtl8192CPHY_REGArray_Table_MP[%d] is %lx Rtl8192CPHY_REGArray_Table_MP[%d] is %lx \n", i, i+1, Rtl8192CPHY_REGArray_Table_MP[i], Rtl8192CPHY_REGArray_Table_MP[i+1]));
\r
616 // RT_TRACE(COMP_SEND, DBG_LOUD, ("phy_ConfigBBWithMpHeaderFile(): ConfigType != BaseBand_Config_PHY_REG\n"));
\r
620 } /* phy_ConfigBBWithMpHeaderFile */
\r
622 #endif // #if (MP_DRIVER == 1)
\r
626 phy_BB8723b_Config_ParaFile(
\r
627 IN PADAPTER Adapter
\r
630 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
\r
631 int rtStatus = _SUCCESS;
\r
632 u8 sz8723BBRegFile[] = RTL8723B_PHY_REG;
\r
633 u8 sz8723AGCTableFile[] = RTL8723B_AGC_TAB;
\r
634 u8 sz8723BBBRegPgFile[] = RTL8723B_PHY_REG_PG;
\r
635 u8 sz8723BBRegMpFile[] = RTL8723B_PHY_REG_MP;
\r
636 u8 sz8723BRFTxPwrLmtFile[] = RTL8723B_TXPWR_LMT;
\r
637 u8 *pszBBRegFile = NULL, *pszAGCTableFile = NULL, *pszBBRegPgFile = NULL, *pszBBRegMpFile=NULL, *pszRFTxPwrLmtFile = NULL;
\r
639 pszBBRegFile = sz8723BBRegFile ;
\r
640 pszAGCTableFile = sz8723AGCTableFile;
\r
641 pszBBRegPgFile = sz8723BBBRegPgFile;
\r
642 pszBBRegMpFile = sz8723BBRegMpFile;
\r
643 pszRFTxPwrLmtFile = sz8723BRFTxPwrLmtFile;
\r
645 // Read Tx Power Limit File
\r
646 PHY_InitTxPowerLimit( Adapter );
\r
647 if ( Adapter->registrypriv.RegEnableTxPowerLimit == 1 ||
\r
648 ( Adapter->registrypriv.RegEnableTxPowerLimit == 2 && pHalData->EEPROMRegulatory == 1 ) )
\r
650 #ifdef CONFIG_LOAD_PHY_PARA_FROM_FILE
\r
651 if (PHY_ConfigRFWithPowerLimitTableParaFile( Adapter, pszRFTxPwrLmtFile )== _FAIL)
\r
654 #ifdef CONFIG_EMBEDDED_FWIMG
\r
655 if (HAL_STATUS_SUCCESS != ODM_ConfigRFWithHeaderFile(&pHalData->odmpriv, CONFIG_RF_TXPWR_LMT, (ODM_RF_RADIO_PATH_E)0))
\r
660 if(rtStatus != _SUCCESS){
\r
661 DBG_871X("%s():Read Tx power limit fail\n",__func__);
\r
662 goto phy_BB8190_Config_ParaFile_Fail;
\r
667 // 1. Read PHY_REG.TXT BB INIT!!
\r
669 #ifdef CONFIG_LOAD_PHY_PARA_FROM_FILE
\r
670 if (phy_ConfigBBWithParaFile(Adapter, pszBBRegFile, CONFIG_BB_PHY_REG) == _FAIL)
\r
673 #ifdef CONFIG_EMBEDDED_FWIMG
\r
674 if (HAL_STATUS_SUCCESS != ODM_ConfigBBWithHeaderFile(&pHalData->odmpriv, CONFIG_BB_PHY_REG))
\r
679 if(rtStatus != _SUCCESS){
\r
680 DBG_8192C("%s():Write BB Reg Fail!!", __func__);
\r
681 goto phy_BB8190_Config_ParaFile_Fail;
\r
685 if (Adapter->registrypriv.mp_mode == 1)
\r
688 // 1.1 Read PHY_REG_MP.TXT BB INIT!!
\r
690 #ifdef CONFIG_LOAD_PHY_PARA_FROM_FILE
\r
691 if (phy_ConfigBBWithMpParaFile(Adapter, pszBBRegMpFile) == _FAIL)
\r
694 #ifdef CONFIG_EMBEDDED_FWIMG
\r
695 if (HAL_STATUS_SUCCESS != ODM_ConfigBBWithHeaderFile(&pHalData->odmpriv, CONFIG_BB_PHY_REG_MP))
\r
700 if(rtStatus != _SUCCESS){
\r
701 DBG_8192C("%s():Write BB Reg MP Fail!!", __func__);
\r
702 goto phy_BB8190_Config_ParaFile_Fail;
\r
705 #endif // #if (MP_DRIVER == 1)
\r
707 // If EEPROM or EFUSE autoload OK, We must config by PHY_REG_PG.txt
\r
708 PHY_InitTxPowerByRate( Adapter );
\r
709 if ( Adapter->registrypriv.RegEnableTxPowerByRate == 1 ||
\r
710 ( Adapter->registrypriv.RegEnableTxPowerByRate == 2 && pHalData->EEPROMRegulatory != 2 ) )
\r
712 #ifdef CONFIG_LOAD_PHY_PARA_FROM_FILE
\r
713 if (phy_ConfigBBWithPgParaFile(Adapter, pszBBRegPgFile) == _FAIL)
\r
716 #ifdef CONFIG_EMBEDDED_FWIMG
\r
717 if (HAL_STATUS_SUCCESS != ODM_ConfigBBWithHeaderFile(&pHalData->odmpriv, CONFIG_BB_PHY_REG_PG))
\r
722 if ( pHalData->odmpriv.PhyRegPgValueType == PHY_REG_PG_EXACT_VALUE )
\r
723 PHY_TxPowerByRateConfiguration( Adapter );
\r
725 if ( Adapter->registrypriv.RegEnableTxPowerLimit == 1 ||
\r
726 ( Adapter->registrypriv.RegEnableTxPowerLimit == 2 && pHalData->EEPROMRegulatory == 1 ) )
\r
727 PHY_ConvertTxPowerLimitToPowerIndex( Adapter );
\r
729 if(rtStatus != _SUCCESS){
\r
730 DBG_8192C("%s():BB_PG Reg Fail!!\n",__func__);
\r
735 // 2. Read BB AGC table Initialization
\r
737 #ifdef CONFIG_LOAD_PHY_PARA_FROM_FILE
\r
738 if (phy_ConfigBBWithParaFile(Adapter, pszAGCTableFile, CONFIG_BB_AGC_TAB) == _FAIL)
\r
741 #ifdef CONFIG_EMBEDDED_FWIMG
\r
742 if (HAL_STATUS_SUCCESS != ODM_ConfigBBWithHeaderFile(&pHalData->odmpriv, CONFIG_BB_AGC_TAB))
\r
747 if(rtStatus != _SUCCESS){
\r
748 DBG_8192C("%s():AGC Table Fail\n", __func__);
\r
749 goto phy_BB8190_Config_ParaFile_Fail;
\r
752 phy_BB8190_Config_ParaFile_Fail:
\r
760 IN PADAPTER Adapter
\r
763 int rtStatus = _SUCCESS;
\r
764 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
\r
767 u8 value8, CrystalCap;
\r
769 phy_InitBBRFRegisterDefinition(Adapter);
\r
771 // Enable BB and RF
\r
772 RegVal = rtw_read16(Adapter, REG_SYS_FUNC_EN);
\r
773 rtw_write16(Adapter, REG_SYS_FUNC_EN, (u16)(RegVal|BIT13|BIT0|BIT1));
\r
775 /* switch ant to BT */
\r
776 #ifdef CONFIG_USB_HCI
\r
777 rtw_write32(Adapter, 0x948, 0x0); // USB use Antenna S0
\r
779 if (pHalData->ant_path == ODM_RF_PATH_A)
\r
780 rtw_write32(Adapter, 0x948, 0x280);
\r
782 rtw_write32(Adapter, 0x948, 0x0);
\r
785 rtw_write8(Adapter, REG_RF_CTRL, RF_EN|RF_RSTB|RF_SDMRSTB);
\r
789 PHY_SetRFReg(Adapter, ODM_RF_PATH_A, 0x1, 0xfffff,0x780);
\r
792 // 20090923 Joseph: Advised by Steven and Jenyu. Power sequence before init RF.
\r
793 rtw_write8(Adapter, REG_AFE_PLL_CTRL, 0x83);
\r
794 rtw_write8(Adapter, REG_AFE_PLL_CTRL+1, 0xdb);
\r
797 rtw_write8(Adapter, REG_SYS_FUNC_EN, FEN_PPLL|FEN_PCIEA|FEN_DIO_PCIE|FEN_BB_GLB_RSTn|FEN_BBRSTB);
\r
799 rtw_write8(Adapter, REG_AFE_XTAL_CTRL+1, 0x80);
\r
802 // Config BB and AGC
\r
804 rtStatus = phy_BB8723b_Config_ParaFile(Adapter);
\r
806 // 0x2C[23:18] = 0x2C[17:12] = CrystalCap
\r
807 CrystalCap = pHalData->CrystalCap & 0x3F;
\r
808 PHY_SetBBReg(Adapter, REG_MAC_PHY_CTRL, 0xFFF000, (CrystalCap | (CrystalCap << 6)));
\r
813 void phy_LCK_8723B(
\r
814 IN PADAPTER Adapter
\r
817 PHY_SetRFReg(Adapter, RF_PATH_A, 0xB0, bRFRegOffsetMask, 0xDFBE0);
\r
818 PHY_SetRFReg(Adapter, RF_PATH_A, RF_CHNLBW, bRFRegOffsetMask, 0x8C01);
\r
819 rtw_mdelay_os(200);
\r
820 PHY_SetRFReg(Adapter, RF_PATH_A, 0xB0, bRFRegOffsetMask, 0xDFFE0);
\r
824 // Block & Path enable
\r
825 #define rOFDMCCKEN_Jaguar 0x808 // OFDM/CCK block enable
\r
826 #define bOFDMEN_Jaguar 0x20000000
\r
827 #define bCCKEN_Jaguar 0x10000000
\r
828 #define rRxPath_Jaguar 0x808 // Rx antenna
\r
829 #define bRxPath_Jaguar 0xff
\r
830 #define rTxPath_Jaguar 0x80c // Tx antenna
\r
831 #define bTxPath_Jaguar 0x0fffffff
\r
832 #define rCCK_RX_Jaguar 0xa04 // for cck rx path selection
\r
833 #define bCCK_RX_Jaguar 0x0c000000
\r
834 #define rVhtlen_Use_Lsig_Jaguar 0x8c3 // Use LSIG for VHT length
\r
836 PHY_BB8723B_Config_1T(
\r
837 IN PADAPTER Adapter
\r
840 // BB OFDM RX Path_A
\r
841 PHY_SetBBReg(Adapter, rRxPath_Jaguar, bRxPath_Jaguar, 0x11);
\r
842 // BB OFDM TX Path_A
\r
843 PHY_SetBBReg(Adapter, rTxPath_Jaguar, bMaskLWord, 0x1111);
\r
844 // BB CCK R/Rx Path_A
\r
845 PHY_SetBBReg(Adapter, rCCK_RX_Jaguar, bCCK_RX_Jaguar, 0x0);
\r
847 PHY_SetBBReg(Adapter, 0x8bc, 0xc0000060, 0x4);
\r
848 // RF Path_B HSSI OFF
\r
849 PHY_SetBBReg(Adapter, 0xe00, 0xf, 0x4);
\r
850 // RF Path_B Power Down
\r
851 PHY_SetBBReg(Adapter, 0xe90, bMaskDWord, 0);
\r
853 PHY_SetBBReg(Adapter, 0xe60, bMaskDWord, 0);
\r
854 PHY_SetBBReg(Adapter, 0xe64, bMaskDWord, 0);
\r
860 IN PADAPTER Adapter
\r
863 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
\r
864 int rtStatus = _SUCCESS;
\r
869 rtStatus = PHY_RF6052_Config8723B(Adapter);
\r
871 phy_LCK_8723B(Adapter);
\r
872 //PHY_BB8723B_Config_1T(Adapter);
\r
877 /*-----------------------------------------------------------------------------
\r
878 * Function: PHY_ConfigRFWithParaFile()
\r
880 * Overview: This function read RF parameters from general file format, and do RF 3-wire
\r
882 * Input: PADAPTER Adapter
\r
883 * ps1Byte pFileName
\r
888 * Return: RT_STATUS_SUCCESS: configuration file exist
\r
890 * Note: Delay may be required for RF configuration
\r
891 *---------------------------------------------------------------------------*/
\r
893 PHY_ConfigRFWithParaFile_8723B(
\r
894 IN PADAPTER Adapter,
\r
902 //****************************************
\r
903 /*-----------------------------------------------------------------------------
\r
904 * Function: PHY_ConfigRFWithHeaderFile()
\r
906 * Overview: This function read RF parameters from general file format, and do RF 3-wire
\r
908 * Input: PADAPTER Adapter
\r
909 * ps1Byte pFileName
\r
914 * Return: RT_STATUS_SUCCESS: configuration file exist
\r
916 * Note: Delay may be required for RF configuration
\r
917 *---------------------------------------------------------------------------*/
\r
918 void phy_PowerIndexCheck8723B(
\r
919 IN PADAPTER Adapter,
\r
921 IN OUT u8 *cckPowerLevel,
\r
922 IN OUT u8 *ofdmPowerLevel,
\r
923 IN OUT u8 *BW20PowerLevel,
\r
924 IN OUT u8 *BW40PowerLevel
\r
928 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
\r
930 pHalData->CurrentCckTxPwrIdx = cckPowerLevel[0];
\r
931 pHalData->CurrentOfdm24GTxPwrIdx = ofdmPowerLevel[0];
\r
932 pHalData->CurrentBW2024GTxPwrIdx = BW20PowerLevel[0];
\r
933 pHalData->CurrentBW4024GTxPwrIdx = BW40PowerLevel[0];
\r
935 RT_TRACE(_module_hal_init_c_, _drv_info_,
\r
936 ("PHY_SetTxPowerLevel8723B(): CurrentCckTxPwrIdx : 0x%x,CurrentOfdm24GTxPwrIdx: 0x%x\n",
\r
937 pHalData->CurrentCckTxPwrIdx, pHalData->CurrentOfdm24GTxPwrIdx));
\r
940 /**************************************************************************************************************
\r
942 * The low-level interface to set TxAGC , called by both MP and Normal Driver.
\r
944 * <20120830, Kordan>
\r
945 **************************************************************************************************************/
\r
948 PHY_SetTxPowerIndex_8723B(
\r
949 IN PADAPTER Adapter,
\r
955 if (RFPath == ODM_RF_PATH_A || RFPath == ODM_RF_PATH_B)
\r
959 case MGN_1M: PHY_SetBBReg(Adapter, rTxAGC_A_CCK1_Mcs32, bMaskByte1, PowerIndex); break;
\r
960 case MGN_2M: PHY_SetBBReg(Adapter, rTxAGC_B_CCK11_A_CCK2_11, bMaskByte1, PowerIndex); break;
\r
961 case MGN_5_5M: PHY_SetBBReg(Adapter, rTxAGC_B_CCK11_A_CCK2_11, bMaskByte2, PowerIndex); break;
\r
962 case MGN_11M: PHY_SetBBReg(Adapter, rTxAGC_B_CCK11_A_CCK2_11, bMaskByte3, PowerIndex); break;
\r
964 case MGN_6M: PHY_SetBBReg(Adapter, rTxAGC_A_Rate18_06, bMaskByte0, PowerIndex); break;
\r
965 case MGN_9M: PHY_SetBBReg(Adapter, rTxAGC_A_Rate18_06, bMaskByte1, PowerIndex); break;
\r
966 case MGN_12M: PHY_SetBBReg(Adapter, rTxAGC_A_Rate18_06, bMaskByte2, PowerIndex); break;
\r
967 case MGN_18M: PHY_SetBBReg(Adapter, rTxAGC_A_Rate18_06, bMaskByte3, PowerIndex); break;
\r
969 case MGN_24M: PHY_SetBBReg(Adapter, rTxAGC_A_Rate54_24, bMaskByte0, PowerIndex); break;
\r
970 case MGN_36M: PHY_SetBBReg(Adapter, rTxAGC_A_Rate54_24, bMaskByte1, PowerIndex); break;
\r
971 case MGN_48M: PHY_SetBBReg(Adapter, rTxAGC_A_Rate54_24, bMaskByte2, PowerIndex); break;
\r
972 case MGN_54M: PHY_SetBBReg(Adapter, rTxAGC_A_Rate54_24, bMaskByte3, PowerIndex); break;
\r
974 case MGN_MCS0: PHY_SetBBReg(Adapter, rTxAGC_A_Mcs03_Mcs00, bMaskByte0, PowerIndex); break;
\r
975 case MGN_MCS1: PHY_SetBBReg(Adapter, rTxAGC_A_Mcs03_Mcs00, bMaskByte1, PowerIndex); break;
\r
976 case MGN_MCS2: PHY_SetBBReg(Adapter, rTxAGC_A_Mcs03_Mcs00, bMaskByte2, PowerIndex); break;
\r
977 case MGN_MCS3: PHY_SetBBReg(Adapter, rTxAGC_A_Mcs03_Mcs00, bMaskByte3, PowerIndex); break;
\r
979 case MGN_MCS4: PHY_SetBBReg(Adapter, rTxAGC_A_Mcs07_Mcs04, bMaskByte0, PowerIndex); break;
\r
980 case MGN_MCS5: PHY_SetBBReg(Adapter, rTxAGC_A_Mcs07_Mcs04, bMaskByte1, PowerIndex); break;
\r
981 case MGN_MCS6: PHY_SetBBReg(Adapter, rTxAGC_A_Mcs07_Mcs04, bMaskByte2, PowerIndex); break;
\r
982 case MGN_MCS7: PHY_SetBBReg(Adapter, rTxAGC_A_Mcs07_Mcs04, bMaskByte3, PowerIndex); break;
\r
985 DBG_871X("Invalid Rate!!\n");
\r
991 RT_TRACE(_module_hal_init_c_, _drv_err_,("Invalid RFPath!!\n"));
\r
996 phy_GetCurrentTxNum_8723B(
\r
997 IN PADAPTER pAdapter
\r
1000 return RF_TX_NUM_NONIMPLEMENT;
\r
1004 PHY_GetTxPowerIndex_8723B(
\r
1005 IN PADAPTER pAdapter,
\r
1008 IN CHANNEL_WIDTH BandWidth,
\r
1012 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(pAdapter);
\r
1013 s8 txPower = 0, powerDiffByRate = 0, limit = 0;
\r
1014 BOOLEAN bIn24G = _FALSE;
\r
1016 //DBG_871X("===>%s\n", __FUNCTION__ );
\r
1018 txPower = (s8) PHY_GetTxPowerIndexBase( pAdapter,RFPath, Rate, BandWidth, Channel, &bIn24G );
\r
1019 powerDiffByRate = PHY_GetTxPowerByRate( pAdapter, BAND_ON_2_4G, ODM_RF_PATH_A, RF_1TX, Rate );
\r
1021 limit = PHY_GetTxPowerLimit( pAdapter, pAdapter->registrypriv.RegPwrTblSel, (u8)(!bIn24G), pHalData->CurrentChannelBW, RFPath, Rate, pHalData->CurrentChannel);
\r
1023 powerDiffByRate = powerDiffByRate > limit ? limit : powerDiffByRate;
\r
1024 txPower += powerDiffByRate;
\r
1026 txPower += PHY_GetTxPowerTrackingOffset( pAdapter, RFPath, Rate );
\r
1028 if(txPower > MAX_POWER_INDEX)
\r
1029 txPower = MAX_POWER_INDEX;
\r
1031 //DBG_871X("Final Tx Power(RF-%c, Channel: %d) = %d(0x%X)\n", ((RFPath==0)?'A':'B'), Channel, txPower, txPower));
\r
1032 return (u8) txPower;
\r
1036 PHY_SetTxPowerLevel8723B(
\r
1037 IN PADAPTER Adapter,
\r
1041 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter);
\r
1042 PDM_ODM_T pDM_Odm = &pHalData->odmpriv;
\r
1043 pFAT_T pDM_FatTable = &pDM_Odm->DM_FatTable;
\r
1044 u8 RFPath = ODM_RF_PATH_A;
\r
1046 if(pHalData->AntDivCfg){// antenna diversity Enable
\r
1047 RFPath = ( (pDM_FatTable->RxIdleAnt == MAIN_ANT) ? ODM_RF_PATH_A : ODM_RF_PATH_B);
\r
1049 else{ // antenna diversity disable
\r
1050 RFPath = pHalData->ant_path;
\r
1053 RT_TRACE(_module_hal_init_c_, _drv_info_,("==>PHY_SetTxPowerLevel8723B()\n"));
\r
1055 PHY_SetTxPowerLevelByPath(Adapter, Channel, RFPath);
\r
1057 RT_TRACE(_module_hal_init_c_, _drv_info_,("<==PHY_SetTxPowerLevel8723B()\n"));
\r
1061 PHY_GetTxPowerLevel8723B(
\r
1062 IN PADAPTER Adapter,
\r
1063 OUT s32* powerlevel
\r
1066 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
\r
1067 s32 TxPwrDbm = 13;
\r
1069 RT_TRACE(COMP_TXAGC, DBG_LOUD, ("PHY_GetTxPowerLevel8723B(): TxPowerLevel: %#x\n", TxPwrDbm));
\r
1071 if ( pMgntInfo->ClientConfigPwrInDbm != UNSPECIFIED_PWR_DBM )
\r
1072 *powerlevel = pMgntInfo->ClientConfigPwrInDbm;
\r
1074 *powerlevel = TxPwrDbm;
\r
1079 // <20130321, VincentLan> A workaround to eliminate the 2440MHz & 2480MHz spur of 8723B. (Asked by Rock.)
\r
1081 phy_SpurCalibration_8723B(
\r
1082 IN PADAPTER pAdapter,
\r
1083 IN u1Byte ToChannel,
\r
1084 IN u1Byte threshold
\r
1087 u4Byte freq[6] = {0xFCCD, 0xFC4D, 0xFFCD, 0xFF4D, 0xFCCD, 0xFF9A}; // {chnl 5, 6, 7, 8, 13, 14}
\r
1089 u1Byte b_doNotch = FALSE;
\r
1090 u1Byte initial_gain;
\r
1091 BOOLEAN bHW_Ctrl = FALSE, bSW_Ctrl = FALSE,bHW_Ctrl_S1 = FALSE, bSW_Ctrl_S1 = FALSE;
\r
1095 u4Byte wlan_channel, CurrentChannel, Is40MHz;
\r
1096 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter);
\r
1097 //PMGNT_INFO pMgntInfo = &(pAdapter->MgntInfo);
\r
1098 PDM_ODM_T pDM_Odm = &(pHalData->odmpriv);
\r
1099 //PDM_ODM_T pDM_Odm = &pHalData->DM_OutSrc;
\r
1101 // check threshold
\r
1102 if(threshold <= 0x0)
\r
1105 DBG_8192C("===>phy_SpurCalibration_8723B: Channel = %d\n", ToChannel);
\r
1107 if (ToChannel == 5)
\r
1109 else if (ToChannel == 6)
\r
1111 else if (ToChannel == 7)
\r
1113 else if (ToChannel == 8)
\r
1115 else if (ToChannel == 13)
\r
1117 else if (ToChannel == 14)
\r
1122 reg948 = PHY_QueryBBReg(pAdapter, rS0S1_PathSwitch, bMaskDWord);
\r
1123 if((reg948 & BIT6) == 0x0)
\r
1129 bHW_Ctrl_S1 = (PHY_QueryBBReg(pAdapter, rFPGA0_XB_RFInterfaceOE, BIT5|BIT4|BIT3)==0x1)? TRUE:FALSE;
\r
1131 bSW_Ctrl_S1 = ((reg948 & BIT9) == 0x0)? TRUE:FALSE;
\r
1133 // If wlan at S1 (both HW control & SW control) and current channel=5,6,7,8,13,14
\r
1134 if ((bHW_Ctrl_S1 || bSW_Ctrl_S1) && (idx <= 5))
\r
1136 initial_gain = (u1Byte) (ODM_GetBBReg(pDM_Odm, rOFDM0_XAAGCCore1, bMaskByte0) & 0x7f);
\r
1137 ODM_Write_DIG(pDM_Odm, 0x30);
\r
1138 PHY_SetBBReg(pAdapter, rFPGA0_AnalogParameter4, bMaskDWord, 0xccf000c0); // disable 3-wire
\r
1140 PHY_SetBBReg(pAdapter, rFPGA0_PSDFunction, bMaskDWord, freq[idx]); // Setup PSD
\r
1141 PHY_SetBBReg(pAdapter, rFPGA0_PSDFunction, bMaskDWord, 0x400000 | freq[idx]); // Start PSD
\r
1143 rtw_msleep_os(30);
\r
1145 if(PHY_QueryBBReg(pAdapter, rFPGA0_PSDReport, bMaskDWord) >= threshold)
\r
1148 PHY_SetBBReg(pAdapter, rFPGA0_PSDFunction, bMaskDWord, freq[idx]); // turn off PSD
\r
1149 PHY_SetBBReg(pAdapter, rFPGA0_AnalogParameter4, bMaskDWord, 0xccc000c0); // enable 3-wire
\r
1150 ODM_Write_DIG(pDM_Odm, initial_gain);
\r
1153 // --- Notch Filter --- Asked by Rock
\r
1156 CurrentChannel = ODM_GetRFReg(pDM_Odm, ODM_RF_PATH_A, RF_CHNLBW, bRFRegOffsetMask);
\r
1157 wlan_channel = CurrentChannel & 0x0f; //Get center frequency
\r
1159 switch(wlan_channel) //Set notch filter
\r
1163 ODM_SetBBReg(pDM_Odm, 0xC40, BIT28|BIT27|BIT26|BIT25|BIT24, 0xB);
\r
1164 ODM_SetBBReg(pDM_Odm, 0xC40, BIT9, 0x1); //enable notch filter
\r
1165 ODM_SetBBReg(pDM_Odm, 0xD40, bMaskDWord, 0x06000000);
\r
1166 ODM_SetBBReg(pDM_Odm, 0xD44, bMaskDWord, 0x00000000);
\r
1167 ODM_SetBBReg(pDM_Odm, 0xD48, bMaskDWord, 0x00000000);
\r
1168 ODM_SetBBReg(pDM_Odm, 0xD4C, bMaskDWord, 0x00000000);
\r
1169 ODM_SetBBReg(pDM_Odm, 0xD2C, BIT28, 0x1); //enable CSI mask
\r
1172 ODM_SetBBReg(pDM_Odm, 0xC40, BIT28|BIT27|BIT26|BIT25|BIT24, 0x4);
\r
1173 ODM_SetBBReg(pDM_Odm, 0xC40, BIT9, 0x1); //enable notch filter
\r
1174 ODM_SetBBReg(pDM_Odm, 0xD40, bMaskDWord, 0x00000600);
\r
1175 ODM_SetBBReg(pDM_Odm, 0xD44, bMaskDWord, 0x00000000);
\r
1176 ODM_SetBBReg(pDM_Odm, 0xD48, bMaskDWord, 0x00000000);
\r
1177 ODM_SetBBReg(pDM_Odm, 0xD4C, bMaskDWord, 0x00000000);
\r
1178 ODM_SetBBReg(pDM_Odm, 0xD2C, BIT28, 0x1); //enable CSI mask
\r
1181 ODM_SetBBReg(pDM_Odm, 0xC40, BIT28|BIT27|BIT26|BIT25|BIT24, 0x3);
\r
1182 ODM_SetBBReg(pDM_Odm, 0xC40, BIT9, 0x1); //enable notch filter
\r
1183 ODM_SetBBReg(pDM_Odm, 0xD40, bMaskDWord, 0x00000000);
\r
1184 ODM_SetBBReg(pDM_Odm, 0xD44, bMaskDWord, 0x00000000);
\r
1185 ODM_SetBBReg(pDM_Odm, 0xD48, bMaskDWord, 0x00000000);
\r
1186 ODM_SetBBReg(pDM_Odm, 0xD4C, bMaskDWord, 0x06000000);
\r
1187 ODM_SetBBReg(pDM_Odm, 0xD2C, BIT28, 0x1); //enable CSI mask
\r
1190 ODM_SetBBReg(pDM_Odm, 0xC40, BIT28|BIT27|BIT26|BIT25|BIT24, 0xA);
\r
1191 ODM_SetBBReg(pDM_Odm, 0xC40, BIT9, 0x1); //enable notch filter
\r
1192 ODM_SetBBReg(pDM_Odm, 0xD40, bMaskDWord, 0x00000000);
\r
1193 ODM_SetBBReg(pDM_Odm, 0xD44, bMaskDWord, 0x00000000);
\r
1194 ODM_SetBBReg(pDM_Odm, 0xD48, bMaskDWord, 0x00000000);
\r
1195 ODM_SetBBReg(pDM_Odm, 0xD4C, bMaskDWord, 0x00000380);
\r
1196 ODM_SetBBReg(pDM_Odm, 0xD2C, BIT28, 0x1); //enable CSI mask
\r
1199 ODM_SetBBReg(pDM_Odm, 0xC40, BIT28|BIT27|BIT26|BIT25|BIT24, 0x5);
\r
1200 ODM_SetBBReg(pDM_Odm, 0xC40, BIT9, 0x1); //enable notch filter
\r
1201 ODM_SetBBReg(pDM_Odm, 0xD40, bMaskDWord, 0x00000000);
\r
1202 ODM_SetBBReg(pDM_Odm, 0xD44, bMaskDWord, 0x00000000);
\r
1203 ODM_SetBBReg(pDM_Odm, 0xD48, bMaskDWord, 0x00000000);
\r
1204 ODM_SetBBReg(pDM_Odm, 0xD4C, bMaskDWord, 0x00180000);
\r
1205 ODM_SetBBReg(pDM_Odm, 0xD2C, BIT28, 0x1); //enable CSI mask
\r
1208 ODM_SetBBReg(pDM_Odm, 0xC40, BIT9, 0x0); //disable notch filter
\r
1209 ODM_SetBBReg(pDM_Odm, 0xD2C, BIT28, 0x0); //disable CSI mask function
\r
1211 }//switch(wlan_channel)
\r
1215 ODM_SetBBReg(pDM_Odm, 0xC40, BIT9, 0x0); //disable notch filter
\r
1216 ODM_SetBBReg(pDM_Odm, 0xD2C, BIT28, 0x0); //disable CSI mask
\r
1221 phy_SetRegBW_8723B(
\r
1222 IN PADAPTER Adapter,
\r
1223 CHANNEL_WIDTH CurrentBW
\r
1226 u16 RegRfMod_BW, u2tmp = 0;
\r
1227 RegRfMod_BW = rtw_read16(Adapter, REG_TRXPTCL_CTL_8723B);
\r
1231 case CHANNEL_WIDTH_20:
\r
1232 rtw_write16(Adapter, REG_TRXPTCL_CTL_8723B, (RegRfMod_BW & 0xFE7F)); // BIT 7 = 0, BIT 8 = 0
\r
1235 case CHANNEL_WIDTH_40:
\r
1236 u2tmp = RegRfMod_BW | BIT7;
\r
1237 rtw_write16(Adapter, REG_TRXPTCL_CTL_8723B, (u2tmp & 0xFEFF)); // BIT 7 = 1, BIT 8 = 0
\r
1240 case CHANNEL_WIDTH_80:
\r
1241 u2tmp = RegRfMod_BW | BIT8;
\r
1242 rtw_write16(Adapter, REG_TRXPTCL_CTL_8723B, (u2tmp & 0xFF7F)); // BIT 7 = 0, BIT 8 = 1
\r
1246 DBG_871X("phy_PostSetBWMode8723B(): unknown Bandwidth: %#X\n",CurrentBW);
\r
1252 phy_GetSecondaryChnl_8723B(
\r
1253 IN PADAPTER Adapter
\r
1256 u8 SCSettingOf40 = 0, SCSettingOf20 = 0;
\r
1257 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter);
\r
1259 RT_TRACE(_module_hal_init_c_, _drv_info_,("SCMapping: VHT Case: pHalData->CurrentChannelBW %d, pHalData->nCur80MhzPrimeSC %d, pHalData->nCur40MhzPrimeSC %d \n",pHalData->CurrentChannelBW,pHalData->nCur80MhzPrimeSC,pHalData->nCur40MhzPrimeSC));
\r
1260 if(pHalData->CurrentChannelBW== CHANNEL_WIDTH_80)
\r
1262 if(pHalData->nCur80MhzPrimeSC == HAL_PRIME_CHNL_OFFSET_LOWER)
\r
1263 SCSettingOf40 = VHT_DATA_SC_40_LOWER_OF_80MHZ;
\r
1264 else if(pHalData->nCur80MhzPrimeSC == HAL_PRIME_CHNL_OFFSET_UPPER)
\r
1265 SCSettingOf40 = VHT_DATA_SC_40_UPPER_OF_80MHZ;
\r
1267 RT_TRACE(_module_hal_init_c_, _drv_err_,("SCMapping: Not Correct Primary40MHz Setting \n"));
\r
1269 if((pHalData->nCur40MhzPrimeSC == HAL_PRIME_CHNL_OFFSET_LOWER) && (pHalData->nCur80MhzPrimeSC == HAL_PRIME_CHNL_OFFSET_LOWER))
\r
1270 SCSettingOf20 = VHT_DATA_SC_20_LOWEST_OF_80MHZ;
\r
1271 else if((pHalData->nCur40MhzPrimeSC == HAL_PRIME_CHNL_OFFSET_UPPER) && (pHalData->nCur80MhzPrimeSC == HAL_PRIME_CHNL_OFFSET_LOWER))
\r
1272 SCSettingOf20 = VHT_DATA_SC_20_LOWER_OF_80MHZ;
\r
1273 else if((pHalData->nCur40MhzPrimeSC == HAL_PRIME_CHNL_OFFSET_LOWER) && (pHalData->nCur80MhzPrimeSC == HAL_PRIME_CHNL_OFFSET_UPPER))
\r
1274 SCSettingOf20 = VHT_DATA_SC_20_UPPER_OF_80MHZ;
\r
1275 else if((pHalData->nCur40MhzPrimeSC == HAL_PRIME_CHNL_OFFSET_UPPER) && (pHalData->nCur80MhzPrimeSC == HAL_PRIME_CHNL_OFFSET_UPPER))
\r
1276 SCSettingOf20 = VHT_DATA_SC_20_UPPERST_OF_80MHZ;
\r
1278 RT_TRACE(_module_hal_init_c_, _drv_err_,("SCMapping: Not Correct Primary40MHz Setting \n"));
\r
1280 else if(pHalData->CurrentChannelBW == CHANNEL_WIDTH_40)
\r
1282 RT_TRACE(_module_hal_init_c_, _drv_info_,("SCMapping: VHT Case: pHalData->CurrentChannelBW %d, pHalData->nCur40MhzPrimeSC %d \n",pHalData->CurrentChannelBW,pHalData->nCur40MhzPrimeSC));
\r
1284 if(pHalData->nCur40MhzPrimeSC == HAL_PRIME_CHNL_OFFSET_UPPER)
\r
1285 SCSettingOf20 = VHT_DATA_SC_20_UPPER_OF_80MHZ;
\r
1286 else if(pHalData->nCur40MhzPrimeSC == HAL_PRIME_CHNL_OFFSET_LOWER)
\r
1287 SCSettingOf20 = VHT_DATA_SC_20_LOWER_OF_80MHZ;
\r
1289 RT_TRACE(_module_hal_init_c_, _drv_err_,("SCMapping: Not Correct Primary40MHz Setting \n"));
\r
1292 RT_TRACE(_module_hal_init_c_, _drv_info_,("SCMapping: SC Value %x \n", ( (SCSettingOf40 << 4) | SCSettingOf20)));
\r
1293 return ( (SCSettingOf40 << 4) | SCSettingOf20);
\r
1297 phy_PostSetBwMode8723B(
\r
1298 IN PADAPTER Adapter
\r
1301 u1Byte SubChnlNum = 0;
\r
1302 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
\r
1305 //3 Set Reg668 Reg440 BW
\r
1306 phy_SetRegBW_8723B(Adapter, pHalData->CurrentChannelBW);
\r
1309 SubChnlNum = phy_GetSecondaryChnl_8723B(Adapter);
\r
1310 rtw_write8(Adapter, REG_DATA_SC_8723B, SubChnlNum);
\r
1313 //3//<2>Set PHY related register
\r
1315 switch(pHalData->CurrentChannelBW)
\r
1317 /* 20 MHz channel*/
\r
1318 case CHANNEL_WIDTH_20:
\r
1319 PHY_SetBBReg(Adapter, rFPGA0_RFMOD, bRFMOD, 0x0);
\r
1321 PHY_SetBBReg(Adapter, rFPGA1_RFMOD, bRFMOD, 0x0);
\r
1323 // PHY_SetBBReg(Adapter, rFPGA0_AnalogParameter2, BIT10, 1);
\r
1325 PHY_SetBBReg(Adapter, rOFDM0_TxPseudoNoiseWgt, (BIT31|BIT30), 0x0);
\r
1329 /* 40 MHz channel*/
\r
1330 case CHANNEL_WIDTH_40:
\r
1331 PHY_SetBBReg(Adapter, rFPGA0_RFMOD, bRFMOD, 0x1);
\r
1333 PHY_SetBBReg(Adapter, rFPGA1_RFMOD, bRFMOD, 0x1);
\r
1335 // Set Control channel to upper or lower. These settings are required only for 40MHz
\r
1336 PHY_SetBBReg(Adapter, rCCK0_System, bCCKSideBand, (pHalData->nCur40MhzPrimeSC>>1));
\r
1338 PHY_SetBBReg(Adapter, rOFDM1_LSTF, 0xC00, pHalData->nCur40MhzPrimeSC);
\r
1340 // PHY_SetBBReg(Adapter, rFPGA0_AnalogParameter2, BIT10, 0);
\r
1342 PHY_SetBBReg(Adapter, 0x818, (BIT26|BIT27), (pHalData->nCur40MhzPrimeSC==HAL_PRIME_CHNL_OFFSET_LOWER)?2:1);
\r
1349 /*RT_TRACE(COMP_DBG, DBG_LOUD, ("phy_SetBWMode8723B(): unknown Bandwidth: %#X\n"\
\r
1350 ,pHalData->CurrentChannelBW));*/
\r
1355 //3<3>Set RF related register
\r
1356 PHY_RF6052SetBandwidth8723B(Adapter, pHalData->CurrentChannelBW);
\r
1361 IN PADAPTER pAdapter
\r
1364 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter);
\r
1365 u8 channelToSW = pHalData->CurrentChannel;
\r
1367 if(pHalData->rf_chip == RF_PSEUDO_11N)
\r
1369 //RT_TRACE(COMP_MLME,DBG_LOUD,("phy_SwChnl8723B: return for PSEUDO \n"));
\r
1372 pHalData->RfRegChnlVal[0] = ((pHalData->RfRegChnlVal[0] & 0xfffff00) | channelToSW );
\r
1373 PHY_SetRFReg(pAdapter, ODM_RF_PATH_A, RF_CHNLBW, 0x3FF, pHalData->RfRegChnlVal[0] );
\r
1374 PHY_SetRFReg(pAdapter, ODM_RF_PATH_B, RF_CHNLBW, 0x3FF, pHalData->RfRegChnlVal[0] );
\r
1376 DBG_8192C("===>phy_SwChnl8723B: Channel = %d\n", channelToSW);
\r
1377 //phy_SpurCalibration_8723B(pAdapter, channelToSW, 0x16);
\r
1381 phy_SwChnlAndSetBwMode8723B(
\r
1382 IN PADAPTER Adapter
\r
1385 HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
\r
1387 //RT_TRACE(COMP_SCAN, DBG_LOUD, ("phy_SwChnlAndSetBwMode8723B(): bSwChnl %d, bSetChnlBW %d \n", pHalData->bSwChnl, pHalData->bSetChnlBW));
\r
1388 if ( Adapter->bNotifyChannelChange )
\r
1390 DBG_871X( "[%s] bSwChnl=%d, ch=%d, bSetChnlBW=%d, bw=%d\n",
\r
1392 pHalData->bSwChnl,
\r
1393 pHalData->CurrentChannel,
\r
1394 pHalData->bSetChnlBW,
\r
1395 pHalData->CurrentChannelBW);
\r
1398 if((Adapter->bDriverStopped) || (Adapter->bSurpriseRemoved))
\r
1403 if(pHalData->bSwChnl)
\r
1405 phy_SwChnl8723B(Adapter);
\r
1406 pHalData->bSwChnl = _FALSE;
\r
1409 if(pHalData->bSetChnlBW)
\r
1411 phy_PostSetBwMode8723B(Adapter);
\r
1412 pHalData->bSetChnlBW = _FALSE;
\r
1415 PHY_SetTxPowerLevel8723B(Adapter, pHalData->CurrentChannel);
\r
1419 PHY_HandleSwChnlAndSetBW8723B(
\r
1420 IN PADAPTER Adapter,
\r
1421 IN BOOLEAN bSwitchChannel,
\r
1422 IN BOOLEAN bSetBandWidth,
\r
1424 IN CHANNEL_WIDTH ChnlWidth,
\r
1425 IN EXTCHNL_OFFSET ExtChnlOffsetOf40MHz,
\r
1426 IN EXTCHNL_OFFSET ExtChnlOffsetOf80MHz,
\r
1427 IN u8 CenterFrequencyIndex1
\r
1430 //static BOOLEAN bInitialzed = _FALSE;
\r
1431 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter);
\r
1432 u8 tmpChannel = pHalData->CurrentChannel;
\r
1433 CHANNEL_WIDTH tmpBW= pHalData->CurrentChannelBW;
\r
1434 u8 tmpnCur40MhzPrimeSC = pHalData->nCur40MhzPrimeSC;
\r
1435 u8 tmpnCur80MhzPrimeSC = pHalData->nCur80MhzPrimeSC;
\r
1436 u8 tmpCenterFrequencyIndex1 =pHalData->CurrentCenterFrequencyIndex1;
\r
1437 struct mlme_ext_priv *pmlmeext = &Adapter->mlmeextpriv;
\r
1439 //DBG_871X("=> PHY_HandleSwChnlAndSetBW8812: bSwitchChannel %d, bSetBandWidth %d \n",bSwitchChannel,bSetBandWidth);
\r
1441 //check is swchnl or setbw
\r
1442 if(!bSwitchChannel && !bSetBandWidth)
\r
1444 DBG_871X("PHY_HandleSwChnlAndSetBW8812: not switch channel and not set bandwidth \n");
\r
1448 //skip change for channel or bandwidth is the same
\r
1449 if(bSwitchChannel)
\r
1451 //if(pHalData->CurrentChannel != ChannelNum)
\r
1453 if (HAL_IsLegalChannel(Adapter, ChannelNum))
\r
1454 pHalData->bSwChnl = _TRUE;
\r
1461 if(bInitialzed == _FALSE)
\r
1463 bInitialzed = _TRUE;
\r
1464 pHalData->bSetChnlBW = _TRUE;
\r
1466 else if((pHalData->CurrentChannelBW != ChnlWidth) ||(pHalData->nCur40MhzPrimeSC != ExtChnlOffsetOf40MHz) || (pHalData->CurrentCenterFrequencyIndex1!= CenterFrequencyIndex1))
\r
1468 pHalData->bSetChnlBW = _TRUE;
\r
1471 pHalData->bSetChnlBW = _TRUE;
\r
1475 if(!pHalData->bSetChnlBW && !pHalData->bSwChnl)
\r
1477 //DBG_871X("<= PHY_HandleSwChnlAndSetBW8812: bSwChnl %d, bSetChnlBW %d \n",pHalData->bSwChnl,pHalData->bSetChnlBW);
\r
1482 if(pHalData->bSwChnl)
\r
1484 pHalData->CurrentChannel=ChannelNum;
\r
1485 pHalData->CurrentCenterFrequencyIndex1 = ChannelNum;
\r
1489 if(pHalData->bSetChnlBW)
\r
1491 pHalData->CurrentChannelBW = ChnlWidth;
\r
1493 if(ExtChnlOffsetOf40MHz==EXTCHNL_OFFSET_LOWER)
\r
1494 pHalData->nCur40MhzPrimeSC = HAL_PRIME_CHNL_OFFSET_UPPER;
\r
1495 else if(ExtChnlOffsetOf40MHz==EXTCHNL_OFFSET_UPPER)
\r
1496 pHalData->nCur40MhzPrimeSC = HAL_PRIME_CHNL_OFFSET_LOWER;
\r
1498 pHalData->nCur40MhzPrimeSC = HAL_PRIME_CHNL_OFFSET_DONT_CARE;
\r
1500 if(ExtChnlOffsetOf80MHz==EXTCHNL_OFFSET_LOWER)
\r
1501 pHalData->nCur80MhzPrimeSC = HAL_PRIME_CHNL_OFFSET_UPPER;
\r
1502 else if(ExtChnlOffsetOf80MHz==EXTCHNL_OFFSET_UPPER)
\r
1503 pHalData->nCur80MhzPrimeSC = HAL_PRIME_CHNL_OFFSET_LOWER;
\r
1505 pHalData->nCur80MhzPrimeSC = HAL_PRIME_CHNL_OFFSET_DONT_CARE;
\r
1507 pHalData->nCur40MhzPrimeSC = ExtChnlOffsetOf40MHz;
\r
1508 pHalData->nCur80MhzPrimeSC = ExtChnlOffsetOf80MHz;
\r
1511 pHalData->CurrentCenterFrequencyIndex1 = CenterFrequencyIndex1;
\r
1514 //Switch workitem or set timer to do switch channel or setbandwidth operation
\r
1515 if((!Adapter->bDriverStopped) && (!Adapter->bSurpriseRemoved))
\r
1517 phy_SwChnlAndSetBwMode8723B(Adapter);
\r
1521 if(pHalData->bSwChnl)
\r
1523 pHalData->CurrentChannel = tmpChannel;
\r
1524 pHalData->CurrentCenterFrequencyIndex1 = tmpChannel;
\r
1526 if(pHalData->bSetChnlBW)
\r
1528 pHalData->CurrentChannelBW = tmpBW;
\r
1529 pHalData->nCur40MhzPrimeSC = tmpnCur40MhzPrimeSC;
\r
1530 pHalData->nCur80MhzPrimeSC = tmpnCur80MhzPrimeSC;
\r
1531 pHalData->CurrentCenterFrequencyIndex1 = tmpCenterFrequencyIndex1;
\r
1535 //DBG_871X("Channel %d ChannelBW %d ",pHalData->CurrentChannel, pHalData->CurrentChannelBW);
\r
1536 //DBG_871X("40MhzPrimeSC %d 80MhzPrimeSC %d ",pHalData->nCur40MhzPrimeSC, pHalData->nCur80MhzPrimeSC);
\r
1537 //DBG_871X("CenterFrequencyIndex1 %d \n",pHalData->CurrentCenterFrequencyIndex1);
\r
1539 //DBG_871X("<= PHY_HandleSwChnlAndSetBW8812: bSwChnl %d, bSetChnlBW %d \n",pHalData->bSwChnl,pHalData->bSetChnlBW);
\r
1544 PHY_SetBWMode8723B(
\r
1545 IN PADAPTER Adapter,
\r
1546 IN CHANNEL_WIDTH Bandwidth, // 20M or 40M
\r
1547 IN unsigned char Offset // Upper, Lower, or Don't care
\r
1550 PHAL_DATA_TYPE pHalData = GET_HAL_DATA(Adapter);
\r
1552 PHY_HandleSwChnlAndSetBW8723B(Adapter, _FALSE, _TRUE, pHalData->CurrentChannel, Bandwidth, Offset, Offset, pHalData->CurrentChannel);
\r
1556 PHY_SwChnl8723B( // Call after initialization
\r
1557 IN PADAPTER Adapter,
\r
1561 PHY_HandleSwChnlAndSetBW8723B(Adapter, _TRUE, _FALSE, channel, 0, 0, 0, channel);
\r
1565 PHY_SetSwChnlBWMode8723B(
\r
1566 IN PADAPTER Adapter,
\r
1568 IN CHANNEL_WIDTH Bandwidth,
\r
1573 //DBG_871X("%s()===>\n",__FUNCTION__);
\r
1575 PHY_HandleSwChnlAndSetBW8723B(Adapter, _TRUE, _TRUE, channel, Bandwidth, Offset40, Offset80, channel);
\r
1577 //DBG_871X("<==%s()\n",__FUNCTION__);
\r
1581 _PHY_DumpRFReg_8723B(IN PADAPTER pAdapter)
\r
1583 u32 rfRegValue,rfRegOffset;
\r
1585 RT_TRACE(_module_hal_init_c_, _drv_info_, ("_PHY_DumpRFReg_8723B()====>\n"));
\r
1587 for(rfRegOffset = 0x00;rfRegOffset<=0x30;rfRegOffset++){
\r
1588 rfRegValue = PHY_QueryRFReg_8723B(pAdapter,RF_PATH_A, rfRegOffset, bMaskDWord);
\r
1589 RT_TRACE(_module_hal_init_c_, _drv_info_, (" 0x%02x = 0x%08x\n",rfRegOffset,rfRegValue));
\r
1591 RT_TRACE(_module_hal_init_c_, _drv_info_, ("<===== _PHY_DumpRFReg_8723B()\n"));
\r