rtl8192eu-linux-driver/hal/OUTSRC/odm_AntDiv.c

2270 lines
76 KiB
C
Raw Normal View History

/******************************************************************************
*
* Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of version 2 of the GNU General Public License as
* published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License along with
* this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
*
*
******************************************************************************/
//============================================================
// include files
//============================================================
#include "odm_precomp.h"
#if (defined(CONFIG_HW_ANTENNA_DIVERSITY))
VOID
odm_AntDiv_on_off( IN PDM_ODM_T pDM_Odm ,IN u1Byte swch)
{
if(pDM_Odm->AntDivType==S0S1_SW_ANTDIV || pDM_Odm->AntDivType==CGCS_RX_SW_ANTDIV)
return;
if(pDM_Odm->SupportICType & ODM_N_ANTDIV_SUPPORT)
{
ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("(( Turn %s )) N-Series AntDiv Function\n",(swch==ANTDIV_ON)?"ON" : "OFF"));
ODM_SetBBReg(pDM_Odm, 0xc50 , BIT7, swch); //OFDM AntDiv function block enable
ODM_SetBBReg(pDM_Odm, 0xa00 , BIT15, swch); //CCK AntDiv function block enable
}
else if(pDM_Odm->SupportICType & ODM_AC_ANTDIV_SUPPORT)
{
ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("(( Turn %s )) AC-Series AntDiv Function\n",(swch==ANTDIV_ON)?"ON" : "OFF"));
if(pDM_Odm->SupportICType == ODM_RTL8812)
{
ODM_SetBBReg(pDM_Odm, 0xc50 , BIT7, swch); //OFDM AntDiv function block enable
ODM_SetBBReg(pDM_Odm, 0xa00 , BIT15, swch); //CCK AntDiv function block enable
}
else
{
ODM_SetBBReg(pDM_Odm, 0x8D4 , BIT24, swch); //OFDM AntDiv function block enable
ODM_SetBBReg(pDM_Odm, 0x800 , BIT25, swch); //CCK AntDiv function block enable
}
}
}
VOID
ODM_UpdateRxIdleAnt(IN PDM_ODM_T pDM_Odm, IN u1Byte Ant)
{
pFAT_T pDM_FatTable = &pDM_Odm->DM_FatTable;
u4Byte DefaultAnt, OptionalAnt,value32;
#if (DM_ODM_SUPPORT_TYPE & (ODM_CE|ODM_WIN))
PADAPTER pAdapter = pDM_Odm->Adapter;
HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter);
#endif
if(pDM_FatTable->RxIdleAnt != Ant)
{
ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[ Update Rx-Idle-Ant ] RxIdleAnt =%s\n",(Ant==MAIN_ANT)?"MAIN_ANT":"AUX_ANT"));
pDM_FatTable->RxIdleAnt = Ant;
if(Ant == MAIN_ANT)
{
DefaultAnt = ANT1_2G;
OptionalAnt = ANT2_2G;
}
else
{
DefaultAnt = ANT2_2G;
OptionalAnt = ANT1_2G;
}
if(pDM_Odm->SupportICType & ODM_N_ANTDIV_SUPPORT)
{
if(pDM_Odm->SupportICType==ODM_RTL8192E)
{
ODM_SetBBReg(pDM_Odm, 0xB38 , BIT5|BIT4|BIT3, DefaultAnt); //Default RX
ODM_SetBBReg(pDM_Odm, 0xB38 , BIT8|BIT7|BIT6, OptionalAnt);//Optional RX
}
else
{
ODM_SetBBReg(pDM_Odm, 0x864 , BIT5|BIT4|BIT3, DefaultAnt); //Default RX
ODM_SetBBReg(pDM_Odm, 0x864 , BIT8|BIT7|BIT6, OptionalAnt); //Optional RX
if(pDM_Odm->SupportICType == ODM_RTL8723B)
{
value32 = ODM_GetBBReg(pDM_Odm, 0x948, 0xFFF);
if (value32 !=0x280)
ODM_SetBBReg(pDM_Odm, 0x948 , BIT9, DefaultAnt);
rtw_hal_set_tx_power_level(pAdapter, pHalData->CurrentChannel);
}
}
ODM_SetBBReg(pDM_Odm, 0x860, BIT14|BIT13|BIT12, DefaultAnt); //Default TX
}
else if(pDM_Odm->SupportICType & ODM_AC_ANTDIV_SUPPORT)
{
ODM_SetBBReg(pDM_Odm, 0xC08 , BIT21|BIT20|BIT19, DefaultAnt); //Default RX
ODM_SetBBReg(pDM_Odm, 0xC08 , BIT24|BIT23|BIT22, OptionalAnt);//Optional RX
ODM_SetBBReg(pDM_Odm, 0xC08 , BIT27|BIT26|BIT25, DefaultAnt); //Default TX
}
ODM_SetMACReg(pDM_Odm, 0x6D8 , BIT10|BIT9|BIT8, DefaultAnt); //PathA Resp Tx
}
else// pDM_FatTable->RxIdleAnt == Ant
{
ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[ Stay in Ori-Ant ] RxIdleAnt =%s\n",(Ant==MAIN_ANT)?"MAIN_ANT":"AUX_ANT"));
pDM_FatTable->RxIdleAnt = Ant;
}
}
VOID
odm_UpdateTxAnt(IN PDM_ODM_T pDM_Odm, IN u1Byte Ant, IN u4Byte MacId)
{
pFAT_T pDM_FatTable = &pDM_Odm->DM_FatTable;
u1Byte TxAnt;
if(Ant == MAIN_ANT)
TxAnt = ANT1_2G;
else
TxAnt = ANT2_2G;
pDM_FatTable->antsel_a[MacId] = TxAnt&BIT0;
pDM_FatTable->antsel_b[MacId] = (TxAnt&BIT1)>>1;
pDM_FatTable->antsel_c[MacId] = (TxAnt&BIT2)>>2;
#if (DM_ODM_SUPPORT_TYPE == ODM_AP)
if (pDM_Odm->antdiv_rssi)
{
//panic_printk("[Tx from TxInfo]: MacID:(( %d )), TxAnt = (( %s ))\n",MacId,(Ant==MAIN_ANT)?"MAIN_ANT":"AUX_ANT");
//panic_printk("antsel_tr_mux=(( 3'b%d%d%d ))\n", pDM_FatTable->antsel_c[MacId] , pDM_FatTable->antsel_b[MacId] , pDM_FatTable->antsel_a[MacId] );
}
#endif
//ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[Tx from TxInfo]: MacID:(( %d )), TxAnt = (( %s ))\n",
// MacId,(Ant==MAIN_ANT)?"MAIN_ANT":"AUX_ANT"));
//ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,("antsel_tr_mux=(( 3'b%d%d%d ))\n",
//pDM_FatTable->antsel_c[MacId] , pDM_FatTable->antsel_b[MacId] , pDM_FatTable->antsel_a[MacId] ));
}
#if (RTL8188E_SUPPORT == 1)
VOID
odm_RX_HWAntDiv_Init_88E(
IN PDM_ODM_T pDM_Odm
)
{
u4Byte value32;
pDM_Odm->AntType = ODM_AUTO_ANT;
#if (MP_DRIVER == 1)
pDM_Odm->AntDivType = CGCS_RX_SW_ANTDIV;
ODM_SetBBReg(pDM_Odm, ODM_REG_IGI_A_11N , BIT7, 0); // disable HW AntDiv
ODM_SetBBReg(pDM_Odm, ODM_REG_LNA_SWITCH_11N , BIT31, 1); // 1:CG, 0:CS
return;
#endif
ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("***8188E AntDiv_Init => AntDivType=[CGCS_RX_HW_ANTDIV]\n"));
//MAC Setting
value32 = ODM_GetMACReg(pDM_Odm, ODM_REG_ANTSEL_PIN_11N, bMaskDWord);
ODM_SetMACReg(pDM_Odm, ODM_REG_ANTSEL_PIN_11N, bMaskDWord, value32|(BIT23|BIT25)); //Reg4C[25]=1, Reg4C[23]=1 for pin output
//Pin Settings
ODM_SetBBReg(pDM_Odm, ODM_REG_PIN_CTRL_11N , BIT9|BIT8, 0);//Reg870[8]=1'b0, Reg870[9]=1'b0 //antsel antselb by HW
ODM_SetBBReg(pDM_Odm, ODM_REG_RX_ANT_CTRL_11N , BIT10, 0); //Reg864[10]=1'b0 //antsel2 by HW
ODM_SetBBReg(pDM_Odm, ODM_REG_LNA_SWITCH_11N , BIT22, 1); //Regb2c[22]=1'b0 //disable CS/CG switch
ODM_SetBBReg(pDM_Odm, ODM_REG_LNA_SWITCH_11N , BIT31, 1); //Regb2c[31]=1'b1 //output at CG only
//OFDM Settings
ODM_SetBBReg(pDM_Odm, ODM_REG_ANTDIV_PARA1_11N , bMaskDWord, 0x000000a0);
//CCK Settings
ODM_SetBBReg(pDM_Odm, ODM_REG_BB_PWR_SAV4_11N , BIT7, 1); //Fix CCK PHY status report issue
ODM_SetBBReg(pDM_Odm, ODM_REG_CCK_ANTDIV_PARA2_11N , BIT4, 1); //CCK complete HW AntDiv within 64 samples
ODM_SetBBReg(pDM_Odm, ODM_REG_ANT_MAPPING1_11N , 0xFFFF, 0x0102); //antenna mapping table
}
VOID
odm_TRX_HWAntDiv_Init_88E(
IN PDM_ODM_T pDM_Odm
)
{
u4Byte value32;
#if (MP_DRIVER == 1)
pDM_Odm->AntDivType = CGCS_RX_SW_ANTDIV;
ODM_SetBBReg(pDM_Odm, ODM_REG_IGI_A_11N , BIT7, 0); // disable HW AntDiv
ODM_SetBBReg(pDM_Odm, ODM_REG_RX_ANT_CTRL_11N , BIT5|BIT4|BIT3, 0); //Default RX (0/1)
return;
#endif
ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("***8188E AntDiv_Init => AntDivType=[CG_TRX_HW_ANTDIV (SPDT)]\n"));
//MAC Setting
value32 = ODM_GetMACReg(pDM_Odm, ODM_REG_ANTSEL_PIN_11N, bMaskDWord);
ODM_SetMACReg(pDM_Odm, ODM_REG_ANTSEL_PIN_11N, bMaskDWord, value32|(BIT23|BIT25)); //Reg4C[25]=1, Reg4C[23]=1 for pin output
//Pin Settings
ODM_SetBBReg(pDM_Odm, ODM_REG_PIN_CTRL_11N , BIT9|BIT8, 0);//Reg870[8]=1'b0, Reg870[9]=1'b0 //antsel antselb by HW
ODM_SetBBReg(pDM_Odm, ODM_REG_RX_ANT_CTRL_11N , BIT10, 0); //Reg864[10]=1'b0 //antsel2 by HW
ODM_SetBBReg(pDM_Odm, ODM_REG_LNA_SWITCH_11N , BIT22, 0); //Regb2c[22]=1'b0 //disable CS/CG switch
ODM_SetBBReg(pDM_Odm, ODM_REG_LNA_SWITCH_11N , BIT31, 1); //Regb2c[31]=1'b1 //output at CG only
//OFDM Settings
ODM_SetBBReg(pDM_Odm, ODM_REG_ANTDIV_PARA1_11N , bMaskDWord, 0x000000a0);
//CCK Settings
ODM_SetBBReg(pDM_Odm, ODM_REG_BB_PWR_SAV4_11N , BIT7, 1); //Fix CCK PHY status report issue
ODM_SetBBReg(pDM_Odm, ODM_REG_CCK_ANTDIV_PARA2_11N , BIT4, 1); //CCK complete HW AntDiv within 64 samples
//antenna mapping table
if(!pDM_Odm->bIsMPChip) //testchip
{
ODM_SetBBReg(pDM_Odm, ODM_REG_RX_DEFUALT_A_11N , BIT10|BIT9|BIT8, 1); //Reg858[10:8]=3'b001
ODM_SetBBReg(pDM_Odm, ODM_REG_RX_DEFUALT_A_11N , BIT13|BIT12|BIT11, 2); //Reg858[13:11]=3'b010
}
else //MPchip
ODM_SetBBReg(pDM_Odm, ODM_REG_ANT_MAPPING1_11N , bMaskDWord, 0x0201); //Reg914=3'b010, Reg915=3'b001
}
VOID
odm_Smart_HWAntDiv_Init_88E(
IN PDM_ODM_T pDM_Odm
)
{
u4Byte value32, i;
pFAT_T pDM_FatTable = &pDM_Odm->DM_FatTable;
u4Byte AntCombination = 2;
ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("***8188E AntDiv_Init => AntDivType=[CG_TRX_SMART_ANTDIV]\n"));
#if (MP_DRIVER == 1)
ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_LOUD, ("pDM_Odm->AntDivType: %d\n", pDM_Odm->AntDivType));
return;
#endif
for(i=0; i<6; i++)
{
pDM_FatTable->Bssid[i] = 0;
pDM_FatTable->antSumRSSI[i] = 0;
pDM_FatTable->antRSSIcnt[i] = 0;
pDM_FatTable->antAveRSSI[i] = 0;
}
pDM_FatTable->TrainIdx = 0;
pDM_FatTable->FAT_State = FAT_NORMAL_STATE;
//MAC Setting
value32 = ODM_GetMACReg(pDM_Odm, 0x4c, bMaskDWord);
ODM_SetMACReg(pDM_Odm, 0x4c, bMaskDWord, value32|(BIT23|BIT25)); //Reg4C[25]=1, Reg4C[23]=1 for pin output
value32 = ODM_GetMACReg(pDM_Odm, 0x7B4, bMaskDWord);
ODM_SetMACReg(pDM_Odm, 0x7b4, bMaskDWord, value32|(BIT16|BIT17)); //Reg7B4[16]=1 enable antenna training, Reg7B4[17]=1 enable A2 match
//value32 = PlatformEFIORead4Byte(Adapter, 0x7B4);
//PlatformEFIOWrite4Byte(Adapter, 0x7b4, value32|BIT18); //append MACID in reponse packet
//Match MAC ADDR
ODM_SetMACReg(pDM_Odm, 0x7b4, 0xFFFF, 0);
ODM_SetMACReg(pDM_Odm, 0x7b0, bMaskDWord, 0);
ODM_SetBBReg(pDM_Odm, 0x870 , BIT9|BIT8, 0);//Reg870[8]=1'b0, Reg870[9]=1'b0 //antsel antselb by HW
ODM_SetBBReg(pDM_Odm, 0x864 , BIT10, 0); //Reg864[10]=1'b0 //antsel2 by HW
ODM_SetBBReg(pDM_Odm, 0xb2c , BIT22, 0); //Regb2c[22]=1'b0 //disable CS/CG switch
ODM_SetBBReg(pDM_Odm, 0xb2c , BIT31, 1); //Regb2c[31]=1'b1 //output at CG only
ODM_SetBBReg(pDM_Odm, 0xca4 , bMaskDWord, 0x000000a0);
//antenna mapping table
if(AntCombination == 2)
{
if(!pDM_Odm->bIsMPChip) //testchip
{
ODM_SetBBReg(pDM_Odm, 0x858 , BIT10|BIT9|BIT8, 1); //Reg858[10:8]=3'b001
ODM_SetBBReg(pDM_Odm, 0x858 , BIT13|BIT12|BIT11, 2); //Reg858[13:11]=3'b010
}
else //MPchip
{
ODM_SetBBReg(pDM_Odm, 0x914 , bMaskByte0, 1);
ODM_SetBBReg(pDM_Odm, 0x914 , bMaskByte1, 2);
}
}
else if(AntCombination == 7)
{
if(!pDM_Odm->bIsMPChip) //testchip
{
ODM_SetBBReg(pDM_Odm, 0x858 , BIT10|BIT9|BIT8, 0); //Reg858[10:8]=3'b000
ODM_SetBBReg(pDM_Odm, 0x858 , BIT13|BIT12|BIT11, 1); //Reg858[13:11]=3'b001
ODM_SetBBReg(pDM_Odm, 0x878 , BIT16, 0);
ODM_SetBBReg(pDM_Odm, 0x858 , BIT15|BIT14, 2); //(Reg878[0],Reg858[14:15])=3'b010
ODM_SetBBReg(pDM_Odm, 0x878 , BIT19|BIT18|BIT17, 3);//Reg878[3:1]=3b'011
ODM_SetBBReg(pDM_Odm, 0x878 , BIT22|BIT21|BIT20, 4);//Reg878[6:4]=3b'100
ODM_SetBBReg(pDM_Odm, 0x878 , BIT25|BIT24|BIT23, 5);//Reg878[9:7]=3b'101
ODM_SetBBReg(pDM_Odm, 0x878 , BIT28|BIT27|BIT26, 6);//Reg878[12:10]=3b'110
ODM_SetBBReg(pDM_Odm, 0x878 , BIT31|BIT30|BIT29, 7);//Reg878[15:13]=3b'111
}
else //MPchip
{
ODM_SetBBReg(pDM_Odm, 0x914 , bMaskByte0, 0);
ODM_SetBBReg(pDM_Odm, 0x914 , bMaskByte1, 1);
ODM_SetBBReg(pDM_Odm, 0x914 , bMaskByte2, 2);
ODM_SetBBReg(pDM_Odm, 0x914 , bMaskByte3, 3);
ODM_SetBBReg(pDM_Odm, 0x918 , bMaskByte0, 4);
ODM_SetBBReg(pDM_Odm, 0x918 , bMaskByte1, 5);
ODM_SetBBReg(pDM_Odm, 0x918 , bMaskByte2, 6);
ODM_SetBBReg(pDM_Odm, 0x918 , bMaskByte3, 7);
}
}
//Default Ant Setting when no fast training
ODM_SetBBReg(pDM_Odm, 0x80c , BIT21, 1); //Reg80c[21]=1'b1 //from TX Info
ODM_SetBBReg(pDM_Odm, 0x864 , BIT5|BIT4|BIT3, 0); //Default RX
ODM_SetBBReg(pDM_Odm, 0x864 , BIT8|BIT7|BIT6, 1); //Optional RX
//ODM_SetBBReg(pDM_Odm, 0x860 , BIT14|BIT13|BIT12, 1); //Default TX
//Enter Traing state
ODM_SetBBReg(pDM_Odm, 0x864 , BIT2|BIT1|BIT0, (AntCombination-1)); //Reg864[2:0]=3'd6 //ant combination=reg864[2:0]+1
//ODM_SetBBReg(pDM_Odm, 0xc50 , BIT7, 0); //RegC50[7]=1'b0 //disable HW AntDiv
//ODM_SetBBReg(pDM_Odm, 0xe08 , BIT16, 0); //RegE08[16]=1'b0 //disable fast training
//ODM_SetBBReg(pDM_Odm, 0xe08 , BIT16, 1); //RegE08[16]=1'b1 //enable fast training
ODM_SetBBReg(pDM_Odm, 0xc50 , BIT7, 1); //RegC50[7]=1'b1 //enable HW AntDiv
//SW Control
//PHY_SetBBReg(Adapter, 0x864 , BIT10, 1);
//PHY_SetBBReg(Adapter, 0x870 , BIT9, 1);
//PHY_SetBBReg(Adapter, 0x870 , BIT8, 1);
//PHY_SetBBReg(Adapter, 0x864 , BIT11, 1);
//PHY_SetBBReg(Adapter, 0x860 , BIT9, 0);
//PHY_SetBBReg(Adapter, 0x860 , BIT8, 0);
}
#endif //#if (RTL8188E_SUPPORT == 1)
#if (RTL8192E_SUPPORT == 1)
VOID
odm_RX_HWAntDiv_Init_92E(
IN PDM_ODM_T pDM_Odm
)
{
#if (MP_DRIVER == 1)
//pDM_Odm->AntDivType = CGCS_RX_SW_ANTDIV;
odm_AntDiv_on_off(pDM_Odm, ANTDIV_OFF);
ODM_SetBBReg(pDM_Odm, 0xc50 , BIT8, 0); //r_rxdiv_enable_anta Regc50[8]=1'b0 0: control by c50[9]
ODM_SetBBReg(pDM_Odm, 0xc50 , BIT9, 1); // 1:CG, 0:CS
return;
#endif
ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("***8192E AntDiv_Init => AntDivType=[CGCS_RX_HW_ANTDIV]\n"));
//Pin Settings
ODM_SetBBReg(pDM_Odm, 0x870 , BIT8, 0);//Reg870[8]=1'b0, // "antsel" is controled by HWs
ODM_SetBBReg(pDM_Odm, 0xc50 , BIT8, 1); //Regc50[8]=1'b1 //" CS/CG switching" is controled by HWs
//Mapping table
ODM_SetBBReg(pDM_Odm, 0x914 , 0xFFFF, 0x0100); //antenna mapping table
//OFDM Settings
ODM_SetBBReg(pDM_Odm, 0xca4 , 0x7FF, 0xA0); //thershold
ODM_SetBBReg(pDM_Odm, 0xca4 , 0x7FF000, 0x0); //bias
//CCK Settings
ODM_SetBBReg(pDM_Odm, 0xa04 , 0xF000000, 0); //Select which path to receive for CCK_1 & CCK_2
ODM_SetBBReg(pDM_Odm, 0xb34 , BIT30, 1); //(92E) ANTSEL_CCK_opt = r_en_antsel_cck? ANTSEL_CCK: 1'b0
ODM_SetBBReg(pDM_Odm, 0xa74 , BIT7, 1); //Fix CCK PHY status report issue
ODM_SetBBReg(pDM_Odm, 0xa0c , BIT4, 1); //CCK complete HW AntDiv within 64 samples
}
VOID
odm_TRX_HWAntDiv_Init_92E(
IN PDM_ODM_T pDM_Odm
)
{
#if (MP_DRIVER == 1)
//pDM_Odm->AntDivType = CGCS_RX_SW_ANTDIV;
odm_AntDiv_on_off(pDM_Odm, ANTDIV_OFF);
ODM_SetBBReg(pDM_Odm, 0xc50 , BIT8, 0); //r_rxdiv_enable_anta Regc50[8]=1'b0 0: control by c50[9]
ODM_SetBBReg(pDM_Odm, 0xc50 , BIT9, 1); // 1:CG, 0:CS
return;
#endif
#if (DM_ODM_SUPPORT_TYPE & ODM_AP)
pDM_Odm->antdiv_rssi=0;
#endif
ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("***8192E AntDiv_Init => AntDivType=[CG_TRX_HW_ANTDIV]\n"));
//3 --RFE pin setting---------
//[MAC]
ODM_SetMACReg(pDM_Odm, 0x38, BIT11, 1); //DBG PAD Driving control (GPIO 8)
ODM_SetMACReg(pDM_Odm, 0x4c, BIT23, 0); //path-A , RFE_CTRL_3 & RFE_CTRL_4
//[BB]
ODM_SetBBReg(pDM_Odm, 0x944 , BIT4|BIT3, 0x3); //RFE_buffer
ODM_SetBBReg(pDM_Odm, 0x940 , BIT7|BIT6, 0x0); // r_rfe_path_sel_ (RFE_CTRL_3)
ODM_SetBBReg(pDM_Odm, 0x940 , BIT9|BIT8, 0x0); // r_rfe_path_sel_ (RFE_CTRL_4)
ODM_SetBBReg(pDM_Odm, 0x944 , BIT31, 0); //RFE_buffer
ODM_SetBBReg(pDM_Odm, 0x92C , BIT3, 0); //rfe_inv (RFE_CTRL_3)
ODM_SetBBReg(pDM_Odm, 0x92C , BIT4, 1); //rfe_inv (RFE_CTRL_4)
ODM_SetBBReg(pDM_Odm, 0x930 , 0xFF000, 0x88); //path-A , RFE_CTRL_3 & 4=> ANTSEL[0]
//3 -------------------------
//Pin Settings
ODM_SetBBReg(pDM_Odm, 0xC50 , BIT8, 0); //path-A //disable CS/CG switch
ODM_SetBBReg(pDM_Odm, 0xC50 , BIT9, 1); //path-A //output at CG only
ODM_SetBBReg(pDM_Odm, 0x870 , BIT9|BIT8, 0); //path-A //antsel antselb by HW
ODM_SetBBReg(pDM_Odm, 0xB38 , BIT10, 0); //path-A //antsel2 by HW
//Mapping table
ODM_SetBBReg(pDM_Odm, 0x914 , 0xFFFF, 0x0100); //antenna mapping table
//OFDM Settings
ODM_SetBBReg(pDM_Odm, 0xca4 , 0x7FF, 0xA0); //thershold
ODM_SetBBReg(pDM_Odm, 0xca4 , 0x7FF000, 0x0); //bias
//CCK Settings
ODM_SetBBReg(pDM_Odm, 0xa04 , 0xF000000, 0); //Select which path to receive for CCK_1 & CCK_2
ODM_SetBBReg(pDM_Odm, 0xb34 , BIT30, 1); //(92E) ANTSEL_CCK_opt = r_en_antsel_cck? ANTSEL_CCK: 1'b0
ODM_SetBBReg(pDM_Odm, 0xa74 , BIT7, 1); //Fix CCK PHY status report issue
ODM_SetBBReg(pDM_Odm, 0xa0c , BIT4, 1); //CCK complete HW AntDiv within 64 samples
//Timming issue
ODM_SetBBReg(pDM_Odm, 0xE20 , BIT23|BIT22|BIT21|BIT20, 8); //keep antidx after tx for ACK ( unit x 32 mu sec)
}
VOID
odm_Smart_HWAntDiv_Init_92E(
IN PDM_ODM_T pDM_Odm
)
{
ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("***8188E AntDiv_Init => AntDivType=[CG_TRX_SMART_ANTDIV]\n"));
}
#endif //#if (RTL8192E_SUPPORT == 1)
#if (RTL8723B_SUPPORT == 1)
VOID
odm_TRX_HWAntDiv_Init_8723B(
IN PDM_ODM_T pDM_Odm
)
{
ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("***8723B AntDiv_Init => AntDivType=[CG_TRX_HW_ANTDIV(DPDT)]\n"));
//Mapping Table
ODM_SetBBReg(pDM_Odm, 0x914 , bMaskByte0, 0);
ODM_SetBBReg(pDM_Odm, 0x914 , bMaskByte1, 1);
//OFDM HW AntDiv Parameters
ODM_SetBBReg(pDM_Odm, 0xCA4 , 0x7FF, 0xa0); //thershold
ODM_SetBBReg(pDM_Odm, 0xCA4 , 0x7FF000, 0x00); //bias
//CCK HW AntDiv Parameters
ODM_SetBBReg(pDM_Odm, 0xA74 , BIT7, 1); //patch for clk from 88M to 80M
ODM_SetBBReg(pDM_Odm, 0xA0C , BIT4, 1); //do 64 samples
//BT Coexistence
ODM_SetBBReg(pDM_Odm, 0x864, BIT12, 0); //keep antsel_map when GNT_BT = 1
ODM_SetBBReg(pDM_Odm, 0x874 , BIT23, 0); //Disable hw antsw & fast_train.antsw when GNT_BT=1
//Output Pin Settings
ODM_SetBBReg(pDM_Odm, 0x870 , BIT8, 0); //
ODM_SetBBReg(pDM_Odm, 0x948 , BIT6, 0); //WL_BB_SEL_BTG_TRXG_anta, (1: HW CTRL 0: SW CTRL)
ODM_SetBBReg(pDM_Odm, 0x948 , BIT7, 0);
ODM_SetMACReg(pDM_Odm, 0x40 , BIT3, 1);
ODM_SetMACReg(pDM_Odm, 0x38 , BIT11, 1);
ODM_SetMACReg(pDM_Odm, 0x4C , BIT24|BIT23, 2); //select DPDT_P and DPDT_N as output pin
ODM_SetBBReg(pDM_Odm, 0x944 , BIT0|BIT1, 3); //in/out
ODM_SetBBReg(pDM_Odm, 0x944 , BIT31, 0); //
ODM_SetBBReg(pDM_Odm, 0x92C , BIT1, 0); //DPDT_P non-inverse
ODM_SetBBReg(pDM_Odm, 0x92C , BIT0, 1); //DPDT_N inverse
ODM_SetBBReg(pDM_Odm, 0x930 , 0xF0, 8); // DPDT_P = ANTSEL[0]
ODM_SetBBReg(pDM_Odm, 0x930 , 0xF, 8); // DPDT_N = ANTSEL[0]
//Timming issue
ODM_SetBBReg(pDM_Odm, 0xE20 , BIT23|BIT22|BIT21|BIT20, 8); //keep antidx after tx for ACK ( unit x 32 mu sec)
//2 [--For HW Bug Setting]
if(pDM_Odm->AntType == ODM_AUTO_ANT)
ODM_SetBBReg(pDM_Odm, 0xA00 , BIT15, 0); //CCK AntDiv function block enable
//ODM_SetBBReg(pDM_Odm, 0x80C , BIT21, 0); //TX Ant by Reg
}
VOID
odm_S0S1_SWAntDiv_Init_8723B(
IN PDM_ODM_T pDM_Odm
)
{
pSWAT_T pDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table;
pFAT_T pDM_FatTable = &pDM_Odm->DM_FatTable;
ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("***8723B AntDiv_Init => AntDivType=[ S0S1_SW_AntDiv] \n"));
//Mapping Table
ODM_SetBBReg(pDM_Odm, 0x914 , bMaskByte0, 0);
ODM_SetBBReg(pDM_Odm, 0x914 , bMaskByte1, 1);
//Output Pin Settings
//ODM_SetBBReg(pDM_Odm, 0x948 , BIT6, 0x1);
ODM_SetBBReg(pDM_Odm, 0x870 , BIT9|BIT8, 0);
pDM_FatTable->bBecomeLinked =FALSE;
pDM_SWAT_Table->try_flag = 0xff;
pDM_SWAT_Table->Double_chk_flag = 0;
pDM_SWAT_Table->TrafficLoad = TRAFFIC_LOW;
//Timming issue
ODM_SetBBReg(pDM_Odm, 0xE20 , BIT23|BIT22|BIT21|BIT20, 8); //keep antidx after tx for ACK ( unit x 32 mu sec)
//2 [--For HW Bug Setting]
ODM_SetBBReg(pDM_Odm, 0x80C , BIT21, 0); //TX Ant by Reg
}
#endif //#if (RTL8723B_SUPPORT == 1)
#if (RTL8821A_SUPPORT == 1)
VOID
odm_TRX_HWAntDiv_Init_8821A(
IN PDM_ODM_T pDM_Odm
)
{
#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
PADAPTER pAdapter = pDM_Odm->Adapter;
pAdapter->HalFunc.GetHalDefVarHandler(pAdapter, HAL_DEF_5G_ANT_SELECT, (pu1Byte)(&pDM_Odm->AntType));
#else
pDM_Odm->AntType = ODM_AUTO_ANT;
#endif
pAdapter->HalFunc.GetHalDefVarHandler(pAdapter, HAL_DEF_5G_ANT_SELECT, (pu1Byte)(&pDM_Odm->AntType));
ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("***8821A AntDiv_Init => AntDivType=[ CG_TRX_HW_ANTDIV (DPDT)] \n"));
//Output Pin Settings
ODM_SetMACReg(pDM_Odm, 0x4C , BIT25, 0);
ODM_SetMACReg(pDM_Odm, 0x64 , BIT29, 1); //PAPE by WLAN control
ODM_SetMACReg(pDM_Odm, 0x64 , BIT28, 1); //LNAON by WLAN control
ODM_SetBBReg(pDM_Odm, 0xCB0 , bMaskDWord, 0x77775745);
ODM_SetBBReg(pDM_Odm, 0xCB8 , BIT16, 0);
ODM_SetMACReg(pDM_Odm, 0x4C , BIT23, 0); //select DPDT_P and DPDT_N as output pin
ODM_SetMACReg(pDM_Odm, 0x4C , BIT24, 1); //by WLAN control
ODM_SetBBReg(pDM_Odm, 0xCB4 , 0xF, 8); // DPDT_P = ANTSEL[0]
ODM_SetBBReg(pDM_Odm, 0xCB4 , 0xF0, 8); // DPDT_N = ANTSEL[0]
ODM_SetBBReg(pDM_Odm, 0xCB4 , BIT29, 0); //DPDT_P non-inverse
ODM_SetBBReg(pDM_Odm, 0xCB4 , BIT28, 1); //DPDT_N inverse
//Mapping Table
ODM_SetBBReg(pDM_Odm, 0xCA4 , bMaskByte0, 0);
ODM_SetBBReg(pDM_Odm, 0xCA4 , bMaskByte1, 1);
//Set ANT1_8821A as MAIN_ANT
if((pDM_Odm->AntType == ODM_FIX_MAIN_ANT) || (pDM_Odm->AntType == ODM_AUTO_ANT))
ODM_UpdateRxIdleAnt(pDM_Odm, MAIN_ANT);
else
ODM_UpdateRxIdleAnt(pDM_Odm, AUX_ANT);
//OFDM HW AntDiv Parameters
ODM_SetBBReg(pDM_Odm, 0x8D4 , 0x7FF, 0xA0); //thershold
ODM_SetBBReg(pDM_Odm, 0x8D4 , 0x7FF000, 0x10); //bias
//CCK HW AntDiv Parameters
ODM_SetBBReg(pDM_Odm, 0xA74 , BIT7, 1); //patch for clk from 88M to 80M
ODM_SetBBReg(pDM_Odm, 0xA0C , BIT4, 1); //do 64 samples
ODM_SetBBReg(pDM_Odm, 0x800 , BIT25, 0); //CCK AntDiv function block enable
//BT Coexistence
ODM_SetBBReg(pDM_Odm, 0xCAC , BIT9, 1); //keep antsel_map when GNT_BT = 1
ODM_SetBBReg(pDM_Odm, 0x804 , BIT4, 1); //Disable hw antsw & fast_train.antsw when GNT_BT=1
//Timming issue
ODM_SetBBReg(pDM_Odm, 0x818 , BIT23|BIT22|BIT21|BIT20, 8); //keep antidx after tx for ACK ( unit x 32 mu sec)
ODM_SetBBReg(pDM_Odm, 0x8CC , BIT20|BIT19|BIT18, 3); //settling time of antdiv by RF LNA = 100ns
//response TX ant by RX ant
ODM_SetMACReg(pDM_Odm, 0x668 , BIT3, 1);
//2 [--For HW Bug Setting]
if(pDM_Odm->AntType == ODM_AUTO_ANT)
ODM_SetBBReg(pDM_Odm, 0x800 , BIT25, 0); //CCK AntDiv function block enable
}
VOID
odm_S0S1_SWAntDiv_Init_8821A(
IN PDM_ODM_T pDM_Odm
)
{
pSWAT_T pDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table;
pFAT_T pDM_FatTable = &pDM_Odm->DM_FatTable;
#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
PADAPTER pAdapter = pDM_Odm->Adapter;
pAdapter->HalFunc.GetHalDefVarHandler(pAdapter, HAL_DEF_5G_ANT_SELECT, (pu1Byte)(&pDM_Odm->AntType));
#else
pDM_Odm->AntType = ODM_AUTO_ANT;
#endif
ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("***8821A AntDiv_Init => AntDivType=[ S0S1_SW_AntDiv] \n"));
//Output Pin Settings
ODM_SetMACReg(pDM_Odm, 0x4C , BIT25, 0);
ODM_SetMACReg(pDM_Odm, 0x64 , BIT29, 1); //PAPE by WLAN control
ODM_SetMACReg(pDM_Odm, 0x64 , BIT28, 1); //LNAON by WLAN control
ODM_SetBBReg(pDM_Odm, 0xCB0 , bMaskDWord, 0x77775745);
ODM_SetBBReg(pDM_Odm, 0xCB8 , BIT16, 0);
ODM_SetMACReg(pDM_Odm, 0x4C , BIT23, 0); //select DPDT_P and DPDT_N as output pin
ODM_SetMACReg(pDM_Odm, 0x4C , BIT24, 1); //by WLAN control
ODM_SetBBReg(pDM_Odm, 0xCB4 , 0xF, 8); // DPDT_P = ANTSEL[0]
ODM_SetBBReg(pDM_Odm, 0xCB4 , 0xF0, 8); // DPDT_N = ANTSEL[0]
ODM_SetBBReg(pDM_Odm, 0xCB4 , BIT29, 0); //DPDT_P non-inverse
ODM_SetBBReg(pDM_Odm, 0xCB4 , BIT28, 1); //DPDT_N inverse
//Mapping Table
ODM_SetBBReg(pDM_Odm, 0xCA4 , bMaskByte0, 0);
ODM_SetBBReg(pDM_Odm, 0xCA4 , bMaskByte1, 1);
//Set ANT1_8821A as MAIN_ANT
if((pDM_Odm->AntType == ODM_FIX_MAIN_ANT) || (pDM_Odm->AntType == ODM_AUTO_ANT))
ODM_UpdateRxIdleAnt(pDM_Odm, MAIN_ANT);
else
ODM_UpdateRxIdleAnt(pDM_Odm, AUX_ANT);
//OFDM HW AntDiv Parameters
ODM_SetBBReg(pDM_Odm, 0x8D4 , 0x7FF, 0xA0); //thershold
ODM_SetBBReg(pDM_Odm, 0x8D4 , 0x7FF000, 0x10); //bias
//CCK HW AntDiv Parameters
ODM_SetBBReg(pDM_Odm, 0xA74 , BIT7, 1); //patch for clk from 88M to 80M
ODM_SetBBReg(pDM_Odm, 0xA0C , BIT4, 1); //do 64 samples
ODM_SetBBReg(pDM_Odm, 0x800 , BIT25, 0); //CCK AntDiv function block enable
//BT Coexistence
ODM_SetBBReg(pDM_Odm, 0xCAC , BIT9, 1); //keep antsel_map when GNT_BT = 1
ODM_SetBBReg(pDM_Odm, 0x804 , BIT4, 1); //Disable hw antsw & fast_train.antsw when GNT_BT=1
//Timming issue
ODM_SetBBReg(pDM_Odm, 0x818 , BIT23|BIT22|BIT21|BIT20, 8); //keep antidx after tx for ACK ( unit x 32 mu sec)
ODM_SetBBReg(pDM_Odm, 0x8CC , BIT20|BIT19|BIT18, 3); //settling time of antdiv by RF LNA = 100ns
//response TX ant by RX ant
ODM_SetMACReg(pDM_Odm, 0x668 , BIT3, 1);
//2 [--For HW Bug Setting]
if(pDM_Odm->AntType == ODM_AUTO_ANT)
ODM_SetBBReg(pDM_Odm, 0x800 , BIT25, 0); //CCK AntDiv function block enable
ODM_SetBBReg(pDM_Odm, 0x900 , BIT18, 0);
pDM_SWAT_Table->try_flag = 0xff;
pDM_SWAT_Table->Double_chk_flag = 0;
pDM_SWAT_Table->TrafficLoad = TRAFFIC_LOW;
pDM_SWAT_Table->CurAntenna = MAIN_ANT;
pDM_SWAT_Table->PreAntenna = MAIN_ANT;
pDM_SWAT_Table->SWAS_NoLink_State = 0;
}
#endif //#if (RTL8821A_SUPPORT == 1)
#if (RTL8881A_SUPPORT == 1)
VOID
odm_RX_HWAntDiv_Init_8881A(
IN PDM_ODM_T pDM_Odm
)
{
ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("***8881A AntDiv_Init => AntDivType=[ CGCS_RX_HW_ANTDIV] \n"));
}
VOID
odm_TRX_HWAntDiv_Init_8881A(
IN PDM_ODM_T pDM_Odm
)
{
ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("***8881A AntDiv_Init => AntDivType=[ CG_TRX_HW_ANTDIV (SPDT)] \n"));
//Output Pin Settings
// [SPDT related]
ODM_SetMACReg(pDM_Odm, 0x4C , BIT25, 0);
ODM_SetMACReg(pDM_Odm, 0x4C , BIT26, 0);
ODM_SetBBReg(pDM_Odm, 0xCB4 , BIT31, 0); //delay buffer
ODM_SetBBReg(pDM_Odm, 0xCB4 , BIT22, 0);
ODM_SetBBReg(pDM_Odm, 0xCB4 , BIT24, 1);
ODM_SetBBReg(pDM_Odm, 0xCB0 , 0xF00, 8); // DPDT_P = ANTSEL[0]
ODM_SetBBReg(pDM_Odm, 0xCB0 , 0xF0000, 8); // DPDT_N = ANTSEL[0]
//Mapping Table
ODM_SetBBReg(pDM_Odm, 0xCA4 , bMaskByte0, 0);
ODM_SetBBReg(pDM_Odm, 0xCA4 , bMaskByte1, 1);
//OFDM HW AntDiv Parameters
ODM_SetBBReg(pDM_Odm, 0x8D4 , 0x7FF, 0xA0); //thershold
ODM_SetBBReg(pDM_Odm, 0x8D4 , 0x7FF000, 0x0); //bias
ODM_SetBBReg(pDM_Odm, 0x8CC , BIT20|BIT19|BIT18, 3); //settling time of antdiv by RF LNA = 100ns
//CCK HW AntDiv Parameters
ODM_SetBBReg(pDM_Odm, 0xA74 , BIT7, 1); //patch for clk from 88M to 80M
ODM_SetBBReg(pDM_Odm, 0xA0C , BIT4, 1); //do 64 samples
//Timming issue
ODM_SetBBReg(pDM_Odm, 0x818 , BIT23|BIT22|BIT21|BIT20, 8); //keep antidx after tx for ACK ( unit x 32 mu sec)
//2 [--For HW Bug Setting]
ODM_SetBBReg(pDM_Odm, 0x900 , BIT18, 0); //TX Ant by Reg // A-cut bug
}
#endif //#if (RTL8881A_SUPPORT == 1)
#if (RTL8812A_SUPPORT == 1)
VOID
odm_TRX_HWAntDiv_Init_8812A(
IN PDM_ODM_T pDM_Odm
)
{
ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("***8812A AntDiv_Init => AntDivType=[ CG_TRX_HW_ANTDIV (SPDT)] \n"));
//3 //3 --RFE pin setting---------
//[BB]
ODM_SetBBReg(pDM_Odm, 0x900 , BIT10|BIT9|BIT8, 0x0); //disable SW switch
ODM_SetBBReg(pDM_Odm, 0x900 , BIT17|BIT16, 0x0);
ODM_SetBBReg(pDM_Odm, 0x974 , BIT7|BIT6, 0x3); // in/out
ODM_SetBBReg(pDM_Odm, 0xCB4 , BIT31, 0); //delay buffer
ODM_SetBBReg(pDM_Odm, 0xCB4 , BIT26, 0);
ODM_SetBBReg(pDM_Odm, 0xCB4 , BIT27, 1);
ODM_SetBBReg(pDM_Odm, 0xCB0 , 0xF000000, 8); // DPDT_P = ANTSEL[0]
ODM_SetBBReg(pDM_Odm, 0xCB0 , 0xF0000000, 8); // DPDT_N = ANTSEL[0]
//3 -------------------------
//Mapping Table
ODM_SetBBReg(pDM_Odm, 0xCA4 , bMaskByte0, 0);
ODM_SetBBReg(pDM_Odm, 0xCA4 , bMaskByte1, 1);
//OFDM HW AntDiv Parameters
ODM_SetBBReg(pDM_Odm, 0x8D4 , 0x7FF, 0xA0); //thershold
ODM_SetBBReg(pDM_Odm, 0x8D4 , 0x7FF000, 0x0); //bias
ODM_SetBBReg(pDM_Odm, 0x8CC , BIT20|BIT19|BIT18, 3); //settling time of antdiv by RF LNA = 100ns
//CCK HW AntDiv Parameters
ODM_SetBBReg(pDM_Odm, 0xA74 , BIT7, 1); //patch for clk from 88M to 80M
ODM_SetBBReg(pDM_Odm, 0xA0C , BIT4, 1); //do 64 samples
//Timming issue
ODM_SetBBReg(pDM_Odm, 0x818 , BIT23|BIT22|BIT21|BIT20, 8); //keep antidx after tx for ACK ( unit x 32 mu sec)
//2 [--For HW Bug Setting]
ODM_SetBBReg(pDM_Odm, 0x900 , BIT18, 0); //TX Ant by Reg // A-cut bug
}
#endif //#if (RTL8812A_SUPPORT == 1)
VOID
odm_HW_AntDiv(
IN PDM_ODM_T pDM_Odm
)
{
u4Byte i,MinMaxRSSI=0xFF, AntDivMaxRSSI=0, MaxRSSI=0, LocalMaxRSSI;
u4Byte Main_RSSI, Aux_RSSI, pkt_ratio_m=0, pkt_ratio_a=0,pkt_threshold=10;
u1Byte RxIdleAnt=0, TargetAnt=7;
pFAT_T pDM_FatTable = &pDM_Odm->DM_FatTable;
pDIG_T pDM_DigTable = &pDM_Odm->DM_DigTable;
PSTA_INFO_T pEntry;
if(!pDM_Odm->bLinked) //bLinked==False
{
ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[No Link!!!]\n"));
#if(DM_ODM_SUPPORT_TYPE == ODM_AP)
if (pDM_Odm->antdiv_rssi)
panic_printk("[No Link!!!]\n");
#endif
if(pDM_FatTable->bBecomeLinked == TRUE)
{
odm_AntDiv_on_off(pDM_Odm, ANTDIV_OFF);
ODM_UpdateRxIdleAnt(pDM_Odm, MAIN_ANT);
pDM_FatTable->bBecomeLinked = pDM_Odm->bLinked;
}
return;
}
else
{
if(pDM_FatTable->bBecomeLinked ==FALSE)
{
ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[Linked !!!]\n"));
odm_AntDiv_on_off(pDM_Odm, ANTDIV_ON);
if(pDM_Odm->SupportICType == ODM_RTL8821 )
ODM_SetBBReg(pDM_Odm, 0x800 , BIT25, 0); //CCK AntDiv function disable
#if(DM_ODM_SUPPORT_TYPE == ODM_AP)
else if(pDM_Odm->SupportICType == ODM_RTL8881 )
ODM_SetBBReg(pDM_Odm, 0x800 , BIT25, 0); //CCK AntDiv function disable
#endif
else if(pDM_Odm->SupportICType == ODM_RTL8723B ||pDM_Odm->SupportICType == ODM_RTL8812)
ODM_SetBBReg(pDM_Odm, 0xA00 , BIT15, 0); //CCK AntDiv function disable
pDM_FatTable->bBecomeLinked = pDM_Odm->bLinked;
if(pDM_Odm->SupportICType==ODM_RTL8723B && pDM_Odm->AntDivType == CG_TRX_HW_ANTDIV)
{
ODM_SetBBReg(pDM_Odm, 0x930 , 0xF0, 8); // DPDT_P = ANTSEL[0] // for 8723B AntDiv function patch. BB Dino 130412
ODM_SetBBReg(pDM_Odm, 0x930 , 0xF, 8); // DPDT_N = ANTSEL[0]
}
}
}
ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("\n[HW AntDiv] Start =>\n"));
for (i=0; i<ODM_ASSOCIATE_ENTRY_NUM; i++)
{
pEntry = pDM_Odm->pODM_StaInfo[i];
if(IS_STA_VALID(pEntry))
{
//2 Caculate RSSI per Antenna
Main_RSSI = (pDM_FatTable->MainAnt_Cnt[i]!=0)?(pDM_FatTable->MainAnt_Sum[i]/pDM_FatTable->MainAnt_Cnt[i]):0;
Aux_RSSI = (pDM_FatTable->AuxAnt_Cnt[i]!=0)?(pDM_FatTable->AuxAnt_Sum[i]/pDM_FatTable->AuxAnt_Cnt[i]):0;
TargetAnt = (Main_RSSI==Aux_RSSI)?pDM_FatTable->RxIdleAnt:((Main_RSSI>=Aux_RSSI)?MAIN_ANT:AUX_ANT);
/*
if( pDM_FatTable->MainAnt_Cnt[i]!=0 && pDM_FatTable->AuxAnt_Cnt[i]!=0 )
{
pkt_ratio_m=( pDM_FatTable->MainAnt_Cnt[i] / pDM_FatTable->AuxAnt_Cnt[i] );
pkt_ratio_a=( pDM_FatTable->AuxAnt_Cnt[i] / pDM_FatTable->MainAnt_Cnt[i] );
if (pkt_ratio_m >= pkt_threshold)
TargetAnt=MAIN_ANT;
else if(pkt_ratio_a >= pkt_threshold)
TargetAnt=AUX_ANT;
}
*/
ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("*** SupportICType=[%u] \n",pDM_Odm->SupportICType));
ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("*** Main_Cnt = (( %u )) , Main_RSSI= (( %u )) \n", pDM_FatTable->MainAnt_Cnt[i], Main_RSSI));
ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("*** Aux_Cnt = (( %u )) , Aux_RSSI = (( %u )) \n", pDM_FatTable->AuxAnt_Cnt[i] , Aux_RSSI ));
ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("*** MAC ID:[ %u ] , TargetAnt = (( %s )) \n", i ,( TargetAnt ==MAIN_ANT)?"MAIN_ANT":"AUX_ANT"));
ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("*** Phy_AntSel_A=[ %d, %d, %d] \n",((pDM_Odm->DM_FatTable.antsel_rx_keep_0)&BIT2)>>2,
((pDM_Odm->DM_FatTable.antsel_rx_keep_0)&BIT1) >>1, ((pDM_Odm->DM_FatTable.antsel_rx_keep_0)&BIT0)));
#if(DM_ODM_SUPPORT_TYPE == ODM_AP)
if (pDM_Odm->antdiv_rssi)
{
panic_printk("*** SupportICType=[%lu] \n",pDM_Odm->SupportICType);
//panic_printk("*** Phy_AntSel_A=[ %d, %d, %d] \n",((pDM_Odm->DM_FatTable.antsel_rx_keep_0)&BIT2)>>2,
// ((pDM_Odm->DM_FatTable.antsel_rx_keep_0)&BIT1) >>1, ((pDM_Odm->DM_FatTable.antsel_rx_keep_0)&BIT0));
//panic_printk("*** Phy_AntSel_B=[ %d, %d, %d] \n",((pDM_Odm->DM_FatTable.antsel_rx_keep_1)&BIT2)>>2,
// ((pDM_Odm->DM_FatTable.antsel_rx_keep_1)&BIT1) >>1, ((pDM_Odm->DM_FatTable.antsel_rx_keep_1)&BIT0))
panic_printk("*** Client[ %lu ] , Main_Cnt = (( %lu )) , Main_RSSI= (( %lu )) \n",i, pDM_FatTable->MainAnt_Cnt[i], Main_RSSI);
panic_printk("*** Client[ %lu ] , Aux_Cnt = (( %lu )) , Aux_RSSI = (( %lu )) \n" ,i, pDM_FatTable->AuxAnt_Cnt[i] , Aux_RSSI);
}
#endif
LocalMaxRSSI = (Main_RSSI>Aux_RSSI)?Main_RSSI:Aux_RSSI;
//2 Select MaxRSSI for DIG
if((LocalMaxRSSI > AntDivMaxRSSI) && (LocalMaxRSSI < 40))
AntDivMaxRSSI = LocalMaxRSSI;
if(LocalMaxRSSI > MaxRSSI)
MaxRSSI = LocalMaxRSSI;
//2 Select RX Idle Antenna
if ( (LocalMaxRSSI != 0) && (LocalMaxRSSI < MinMaxRSSI) )
{
RxIdleAnt = TargetAnt;
MinMaxRSSI = LocalMaxRSSI;
}
/*
if((pDM_FatTable->RxIdleAnt == MAIN_ANT) && (Main_RSSI == 0))
Main_RSSI = Aux_RSSI;
else if((pDM_FatTable->RxIdleAnt == AUX_ANT) && (Aux_RSSI == 0))
Aux_RSSI = Main_RSSI;
LocalMinRSSI = (Main_RSSI>Aux_RSSI)?Aux_RSSI:Main_RSSI;
if(LocalMinRSSI < MinRSSI)
{
MinRSSI = LocalMinRSSI;
RxIdleAnt = TargetAnt;
}
*/
//2 Select TX Antenna
#if TX_BY_REG
#else
if(pDM_Odm->AntDivType != CGCS_RX_HW_ANTDIV)
odm_UpdateTxAnt(pDM_Odm, TargetAnt, i);
#endif
}
pDM_FatTable->MainAnt_Sum[i] = 0;
pDM_FatTable->AuxAnt_Sum[i] = 0;
pDM_FatTable->MainAnt_Cnt[i] = 0;
pDM_FatTable->AuxAnt_Cnt[i] = 0;
}
//2 Set RX Idle Antenna
ODM_UpdateRxIdleAnt(pDM_Odm, RxIdleAnt);
#if(DM_ODM_SUPPORT_TYPE == ODM_AP)
if (pDM_Odm->antdiv_rssi)
panic_printk("*** RxIdleAnt = (( %s )) \n \n", ( RxIdleAnt ==MAIN_ANT)?"MAIN_ANT":"AUX_ANT");
#endif
pDM_DigTable->AntDiv_RSSI_max = AntDivMaxRSSI;
pDM_DigTable->RSSI_max = MaxRSSI;
}
#if (RTL8723B_SUPPORT == 1)||(RTL8821A_SUPPORT == 1)
VOID
odm_S0S1_SwAntDiv(
IN PDM_ODM_T pDM_Odm,
IN u1Byte Step
)
{
u4Byte i,MinMaxRSSI=0xFF, LocalMaxRSSI,LocalMinRSSI;
u4Byte Main_RSSI, Aux_RSSI;
u1Byte reset_period=10, SWAntDiv_threshold=35;
u1Byte HighTraffic_TrainTime_U=0x32,HighTraffic_TrainTime_L,Train_time_temp;
u1Byte LowTraffic_TrainTime_U=200,LowTraffic_TrainTime_L;
u1Byte RxIdleAnt, TargetAnt, nextAnt;
pSWAT_T pDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table;
pFAT_T pDM_FatTable = &pDM_Odm->DM_FatTable;
PSTA_INFO_T pEntry=NULL;
//static u1Byte reset_idx;
u4Byte value32;
PADAPTER Adapter = pDM_Odm->Adapter;
u8Byte curTxOkCnt=0, curRxOkCnt=0,TxCntOffset, RxCntOffset;
if(!pDM_Odm->bLinked) //bLinked==False
{
ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[No Link!!!]\n"));
if(pDM_FatTable->bBecomeLinked == TRUE)
{
ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("Set REG 948[9:6]=0x0 \n"));
if(pDM_Odm->SupportICType == ODM_RTL8723B)
ODM_SetBBReg(pDM_Odm, 0x948 , BIT9|BIT8|BIT7|BIT6, 0x0);
pDM_FatTable->bBecomeLinked = pDM_Odm->bLinked;
}
return;
}
else
{
if(pDM_FatTable->bBecomeLinked ==FALSE)
{
ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[Linked !!!]\n"));
if(pDM_Odm->SupportICType == ODM_RTL8723B)
{
value32 = ODM_GetBBReg(pDM_Odm, 0x864, BIT5|BIT4|BIT3);
if (value32==0x0)
ODM_UpdateRxIdleAnt(pDM_Odm, MAIN_ANT);
else if (value32==0x1)
ODM_UpdateRxIdleAnt(pDM_Odm, AUX_ANT);
ODM_SetBBReg(pDM_Odm, 0x948 , BIT6, 0x1);
ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("Set REG 948[6]=0x1 , Set REG 864[5:3]=0x%x \n",value32 ));
}
pDM_SWAT_Table->lastTxOkCnt = 0;
pDM_SWAT_Table->lastRxOkCnt =0;
TxCntOffset = Adapter->TxStats.NumTxBytesUnicast;
RxCntOffset = Adapter->RxStats.NumRxBytesUnicast;
pDM_FatTable->bBecomeLinked = pDM_Odm->bLinked;
}
else
{
TxCntOffset = 0;
RxCntOffset = 0;
}
}
ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[%d] { try_flag=(( %d )), Step=(( %d )), Double_chk_flag = (( %d )) }\n",
__LINE__,pDM_SWAT_Table->try_flag,Step,pDM_SWAT_Table->Double_chk_flag));
// Handling step mismatch condition.
// Peak step is not finished at last time. Recover the variable and check again.
if( Step != pDM_SWAT_Table->try_flag )
{
ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[Step != try_flag] Need to Reset After Link\n"));
ODM_SwAntDivRestAfterLink(pDM_Odm);
}
if(pDM_SWAT_Table->try_flag == 0xff)
{
pDM_SWAT_Table->try_flag = 0;
pDM_SWAT_Table->Train_time_flag=0;
ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD,("[set try_flag = 0] Prepare for peak!\n\n"));
return;
}
else//if( try_flag != 0xff )
{
//1 Normal State (Begin Trying)
if(pDM_SWAT_Table->try_flag == 0)
{
//---trafic decision---
curTxOkCnt = Adapter->TxStats.NumTxBytesUnicast - pDM_SWAT_Table->lastTxOkCnt - TxCntOffset;
curRxOkCnt =Adapter->RxStats.NumRxBytesUnicast - pDM_SWAT_Table->lastRxOkCnt - RxCntOffset;
pDM_SWAT_Table->lastTxOkCnt = Adapter->TxStats.NumTxBytesUnicast;
pDM_SWAT_Table->lastRxOkCnt = Adapter->RxStats.NumRxBytesUnicast;
if (curTxOkCnt > 1875000 || curRxOkCnt > 1875000)//if(PlatformDivision64(curTxOkCnt+curRxOkCnt, 2) > 1875000) ( 1.875M * 8bit ) / 2= 7.5M bits /sec )
{
pDM_SWAT_Table->TrafficLoad = TRAFFIC_HIGH;
Train_time_temp=pDM_SWAT_Table->Train_time ;
if(pDM_SWAT_Table->Train_time_flag==3)
{
HighTraffic_TrainTime_L=0xa;
if(Train_time_temp<=16)
Train_time_temp=HighTraffic_TrainTime_L;
else
Train_time_temp-=16;
}
else if(pDM_SWAT_Table->Train_time_flag==2)
{
Train_time_temp-=8;
HighTraffic_TrainTime_L=0xf;
}
else if(pDM_SWAT_Table->Train_time_flag==1)
{
Train_time_temp-=4;
HighTraffic_TrainTime_L=0x1e;
}
else if(pDM_SWAT_Table->Train_time_flag==0)
{
Train_time_temp+=8;
HighTraffic_TrainTime_L=0x28;
}
//ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("*** Train_time_temp = ((%d))\n",Train_time_temp));
//--
if(Train_time_temp > HighTraffic_TrainTime_U)
Train_time_temp=HighTraffic_TrainTime_U;
else if(Train_time_temp < HighTraffic_TrainTime_L)
Train_time_temp=HighTraffic_TrainTime_L;
pDM_SWAT_Table->Train_time = Train_time_temp; //50ms~10ms
ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD,(" Train_time_flag=((%d)) , Train_time=((%d)) \n",pDM_SWAT_Table->Train_time_flag, pDM_SWAT_Table->Train_time));
ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (" [HIGH Traffic] \n" ));
}
else if (curTxOkCnt > 125000 || curRxOkCnt > 125000) // ( 0.125M * 8bit ) / 2 = 0.5M bits /sec )
{
pDM_SWAT_Table->TrafficLoad = TRAFFIC_LOW;
Train_time_temp=pDM_SWAT_Table->Train_time ;
if(pDM_SWAT_Table->Train_time_flag==3)
{
LowTraffic_TrainTime_L=10;
if(Train_time_temp<50)
Train_time_temp=LowTraffic_TrainTime_L;
else
Train_time_temp-=50;
}
else if(pDM_SWAT_Table->Train_time_flag==2)
{
Train_time_temp-=30;
LowTraffic_TrainTime_L=36;
}
else if(pDM_SWAT_Table->Train_time_flag==1)
{
Train_time_temp-=10;
LowTraffic_TrainTime_L=40;
}
else
Train_time_temp+=10;
//--
if(Train_time_temp >= LowTraffic_TrainTime_U)
Train_time_temp=LowTraffic_TrainTime_U;
else if(Train_time_temp <= LowTraffic_TrainTime_L)
Train_time_temp=LowTraffic_TrainTime_L;
pDM_SWAT_Table->Train_time = Train_time_temp; //50ms~20ms
ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD,(" Train_time_flag=((%d)) , Train_time=((%d)) \n",pDM_SWAT_Table->Train_time_flag, pDM_SWAT_Table->Train_time));
ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (" [Low Traffic] \n" ));
}
else
{
pDM_SWAT_Table->TrafficLoad = TRAFFIC_UltraLOW;
pDM_SWAT_Table->Train_time = 0xc8; //200ms
ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (" [Ultra-Low Traffic] \n" ));
}
ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("TxOkCnt=(( %llu )), RxOkCnt=(( %llu )) \n",
curTxOkCnt ,curRxOkCnt ));
//-----------------
ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD,(" Current MinMaxRSSI is ((%d)) \n",pDM_FatTable->MinMaxRSSI));
//---reset index---
if(pDM_SWAT_Table->reset_idx>=reset_period)
{
pDM_FatTable->MinMaxRSSI=0; //
pDM_SWAT_Table->reset_idx=0;
}
ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("reset_idx = (( %d )) \n",pDM_SWAT_Table->reset_idx ));
//ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD,("reset_idx=%d\n",pDM_SWAT_Table->reset_idx));
pDM_SWAT_Table->reset_idx++;
//---double check flag---
if(pDM_FatTable->MinMaxRSSI > SWAntDiv_threshold && pDM_SWAT_Table->Double_chk_flag== 0)
{
ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD,(" MinMaxRSSI is ((%d)), and > %d \n",
pDM_FatTable->MinMaxRSSI,SWAntDiv_threshold));
pDM_SWAT_Table->Double_chk_flag =1;
pDM_SWAT_Table->try_flag = 1;
pDM_SWAT_Table->RSSI_Trying = 0;
ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (" Test the current Ant for (( %d )) ms again \n", pDM_SWAT_Table->Train_time));
ODM_UpdateRxIdleAnt(pDM_Odm, pDM_FatTable->RxIdleAnt);
ODM_SetTimer(pDM_Odm,&pDM_SWAT_Table->SwAntennaSwitchTimer_8723B, pDM_SWAT_Table->Train_time ); //ms
return;
}
nextAnt = (pDM_FatTable->RxIdleAnt == MAIN_ANT)? AUX_ANT : MAIN_ANT;
pDM_SWAT_Table->try_flag = 1;
if(pDM_SWAT_Table->reset_idx<=1)
pDM_SWAT_Table->RSSI_Trying = 2;
else
pDM_SWAT_Table->RSSI_Trying = 1;
ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD,("[set try_flag=1] Normal State: Begin Trying!! \n"));
}
else if(pDM_SWAT_Table->try_flag == 1 && pDM_SWAT_Table->Double_chk_flag== 0)
{
nextAnt = (pDM_FatTable->RxIdleAnt == MAIN_ANT)? AUX_ANT : MAIN_ANT;
pDM_SWAT_Table->RSSI_Trying--;
}
//1 Decision State
if((pDM_SWAT_Table->try_flag == 1)&&(pDM_SWAT_Table->RSSI_Trying == 0) )
{
for (i=0; i<ODM_ASSOCIATE_ENTRY_NUM; i++)
{
pEntry = pDM_Odm->pODM_StaInfo[i];
if(IS_STA_VALID(pEntry))
{
//2 Caculate RSSI per Antenna
Main_RSSI = (pDM_FatTable->MainAnt_Cnt[i]!=0)?(pDM_FatTable->MainAnt_Sum[i]/pDM_FatTable->MainAnt_Cnt[i]):0;
Aux_RSSI = (pDM_FatTable->AuxAnt_Cnt[i]!=0)?(pDM_FatTable->AuxAnt_Sum[i]/pDM_FatTable->AuxAnt_Cnt[i]):0;
if(pDM_FatTable->MainAnt_Cnt[i]<=1 && pDM_FatTable->CCK_counter_main>=1)
Main_RSSI=0;
if(pDM_FatTable->AuxAnt_Cnt[i]<=1 && pDM_FatTable->CCK_counter_aux>=1)
Aux_RSSI=0;
TargetAnt = (Main_RSSI==Aux_RSSI)?pDM_SWAT_Table->PreAntenna:((Main_RSSI>=Aux_RSSI)?MAIN_ANT:AUX_ANT);
LocalMaxRSSI = (Main_RSSI>=Aux_RSSI) ? Main_RSSI : Aux_RSSI;
LocalMinRSSI = (Main_RSSI>=Aux_RSSI) ? Aux_RSSI : Main_RSSI;
ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("*** CCK_counter_main = (( %d )) , CCK_counter_aux= (( %d )) \n", pDM_FatTable->CCK_counter_main, pDM_FatTable->CCK_counter_aux));
ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("*** OFDM_counter_main = (( %d )) , OFDM_counter_aux= (( %d )) \n", pDM_FatTable->OFDM_counter_main, pDM_FatTable->OFDM_counter_aux));
ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("*** Main_Cnt = (( %d )) , Main_RSSI= (( %d )) \n", pDM_FatTable->MainAnt_Cnt[i], Main_RSSI));
ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("*** Aux_Cnt = (( %d )) , Aux_RSSI = (( %d )) \n", pDM_FatTable->AuxAnt_Cnt[i] , Aux_RSSI ));
ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("*** MAC ID:[ %d ] , TargetAnt = (( %s )) \n", i ,( TargetAnt ==MAIN_ANT)?"MAIN_ANT":"AUX_ANT"));
//2 Select RX Idle Antenna
if (LocalMaxRSSI != 0 && LocalMaxRSSI < MinMaxRSSI)
{
RxIdleAnt = TargetAnt;
MinMaxRSSI = LocalMaxRSSI;
ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("*** LocalMaxRSSI-LocalMinRSSI = ((%d))\n",(LocalMaxRSSI-LocalMinRSSI)));
if((LocalMaxRSSI-LocalMinRSSI)>8)
{
if(LocalMinRSSI != 0)
pDM_SWAT_Table->Train_time_flag=3;
else
{
if(MinMaxRSSI > SWAntDiv_threshold)
pDM_SWAT_Table->Train_time_flag=0;
else
pDM_SWAT_Table->Train_time_flag=3;
}
}
else if((LocalMaxRSSI-LocalMinRSSI)>5)
pDM_SWAT_Table->Train_time_flag=2;
else if((LocalMaxRSSI-LocalMinRSSI)>2)
pDM_SWAT_Table->Train_time_flag=1;
else
pDM_SWAT_Table->Train_time_flag=0;
}
//2 Select TX Antenna
if(TargetAnt == MAIN_ANT)
pDM_FatTable->antsel_a[i] = ANT1_2G;
else
pDM_FatTable->antsel_a[i] = ANT2_2G;
}
pDM_FatTable->MainAnt_Sum[i] = 0;
pDM_FatTable->AuxAnt_Sum[i] = 0;
pDM_FatTable->MainAnt_Cnt[i] = 0;
pDM_FatTable->AuxAnt_Cnt[i] = 0;
pDM_FatTable->CCK_counter_main=0;
pDM_FatTable->CCK_counter_aux=0;
pDM_FatTable->OFDM_counter_main=0;
pDM_FatTable->OFDM_counter_aux=0;
}
pDM_FatTable->MinMaxRSSI=MinMaxRSSI;
pDM_SWAT_Table->try_flag = 0;
if( pDM_SWAT_Table->Double_chk_flag==1)
{
pDM_SWAT_Table->Double_chk_flag=0;
if(pDM_FatTable->MinMaxRSSI > SWAntDiv_threshold)
{
ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD,(" [Double check] MinMaxRSSI ((%d)) > %d again!! \n",
pDM_FatTable->MinMaxRSSI,SWAntDiv_threshold));
ODM_UpdateRxIdleAnt(pDM_Odm, RxIdleAnt);
ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD,("[reset try_flag = 0] Training accomplished !!!] \n\n\n"));
return;
}
else
{
ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD,(" [Double check] MinMaxRSSI ((%d)) <= %d !! \n",
pDM_FatTable->MinMaxRSSI,SWAntDiv_threshold));
nextAnt = (pDM_FatTable->RxIdleAnt == MAIN_ANT)? AUX_ANT : MAIN_ANT;
pDM_SWAT_Table->try_flag = 0;
pDM_SWAT_Table->reset_idx=reset_period;
ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD,("[set try_flag=0] Normal State: Need to tryg again!! \n\n\n"));
return;
}
}
else
{
pDM_SWAT_Table->PreAntenna =RxIdleAnt;
ODM_UpdateRxIdleAnt(pDM_Odm, RxIdleAnt );
ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD,("[reset try_flag = 0] Training accomplished !!!] \n\n\n"));
return;
}
}
}
//1 4.Change TRX antenna
ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("RSSI_Trying = (( %d )), Ant: (( %s )) >>> (( %s )) \n",
pDM_SWAT_Table->RSSI_Trying, (pDM_FatTable->RxIdleAnt == MAIN_ANT?"MAIN":"AUX"),(nextAnt == MAIN_ANT?"MAIN":"AUX")));
ODM_UpdateRxIdleAnt(pDM_Odm, nextAnt);
//1 5.Reset Statistics
pDM_FatTable->RxIdleAnt = nextAnt;
//1 6.Set next timer (Trying State)
ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV, ODM_DBG_LOUD, (" Test ((%s)) Ant for (( %d )) ms \n", (nextAnt == MAIN_ANT?"MAIN":"AUX"), pDM_SWAT_Table->Train_time));
ODM_SetTimer(pDM_Odm,&pDM_SWAT_Table->SwAntennaSwitchTimer_8723B, pDM_SWAT_Table->Train_time ); //ms
}
#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
VOID
ODM_SW_AntDiv_Callback(
PRT_TIMER pTimer
)
{
PADAPTER Adapter = (PADAPTER)pTimer->Adapter;
HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);
pSWAT_T pDM_SWAT_Table = &pHalData->DM_OutSrc.DM_SWAT_Table;
#if DEV_BUS_TYPE==RT_PCI_INTERFACE
#if USE_WORKITEM
ODM_ScheduleWorkItem(&pDM_SWAT_Table->SwAntennaSwitchWorkitem_8723B);
#else
{
//DbgPrint("SW_antdiv_Callback");
odm_S0S1_SwAntDiv(&pHalData->DM_OutSrc, SWAW_STEP_DETERMINE);
}
#endif
#else
ODM_ScheduleWorkItem(&pDM_SWAT_Table->SwAntennaSwitchWorkitem_8723B);
#endif
}
VOID
ODM_SW_AntDiv_WorkitemCallback(
IN PVOID pContext
)
{
PADAPTER pAdapter = (PADAPTER)pContext;
HAL_DATA_TYPE *pHalData = GET_HAL_DATA(pAdapter);
//DbgPrint("SW_antdiv_Workitem_Callback");
odm_S0S1_SwAntDiv(&pHalData->DM_OutSrc, SWAW_STEP_DETERMINE);
}
#endif //#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
#if (DM_ODM_SUPPORT_TYPE == ODM_CE)
VOID
ODM_SW_AntDiv_Callback(void *FunctionContext)
{
PDM_ODM_T pDM_Odm= (PDM_ODM_T)FunctionContext;
PADAPTER padapter = pDM_Odm->Adapter;
if(padapter->net_closed == _TRUE)
return;
//odm_S0S1_SwAntDiv(pDM_Odm, SWAW_STEP_DETERMINE);
}
#endif //#if (DM_ODM_SUPPORT_TYPE == ODM_CE)
#endif //#if (RTL8723B_SUPPORT == 1)
#if(RTL8188E_SUPPORT == 1 || RTL8192E_SUPPORT == 1)
#if (!(DM_ODM_SUPPORT_TYPE == ODM_CE))
VOID
odm_SetNextMACAddrTarget(
IN PDM_ODM_T pDM_Odm
)
{
pFAT_T pDM_FatTable = &pDM_Odm->DM_FatTable;
PSTA_INFO_T pEntry;
//u1Byte Bssid[6];
u4Byte value32, i;
//
//2012.03.26 LukeLee: The MAC address is changed according to MACID in turn
//
ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("odm_SetNextMACAddrTarget() ==>\n"));
if(pDM_Odm->bLinked)
{
for (i=0; i<ODM_ASSOCIATE_ENTRY_NUM; i++)
{
if((pDM_FatTable->TrainIdx+1) == ODM_ASSOCIATE_ENTRY_NUM)
pDM_FatTable->TrainIdx = 0;
else
pDM_FatTable->TrainIdx++;
pEntry = pDM_Odm->pODM_StaInfo[pDM_FatTable->TrainIdx];
if(IS_STA_VALID(pEntry))
{
//Match MAC ADDR
#if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
value32 = (pEntry->hwaddr[5]<<8)|pEntry->hwaddr[4];
#else
value32 = (pEntry->MacAddr[5]<<8)|pEntry->MacAddr[4];
#endif
ODM_SetMACReg(pDM_Odm, 0x7b4, 0xFFFF, value32);
#if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
value32 = (pEntry->hwaddr[3]<<24)|(pEntry->hwaddr[2]<<16) |(pEntry->hwaddr[1]<<8) |pEntry->hwaddr[0];
#else
value32 = (pEntry->MacAddr[3]<<24)|(pEntry->MacAddr[2]<<16) |(pEntry->MacAddr[1]<<8) |pEntry->MacAddr[0];
#endif
ODM_SetMACReg(pDM_Odm, 0x7b0, bMaskDWord, value32);
ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("pDM_FatTable->TrainIdx=%lu\n",pDM_FatTable->TrainIdx));
#if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))
ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("Training MAC Addr = %x:%x:%x:%x:%x:%x\n",
pEntry->hwaddr[5],pEntry->hwaddr[4],pEntry->hwaddr[3],pEntry->hwaddr[2],pEntry->hwaddr[1],pEntry->hwaddr[0]));
#else
ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("Training MAC Addr = %x:%x:%x:%x:%x:%x\n",
pEntry->MacAddr[5],pEntry->MacAddr[4],pEntry->MacAddr[3],pEntry->MacAddr[2],pEntry->MacAddr[1],pEntry->MacAddr[0]));
#endif
break;
}
}
}
#if 0
//
//2012.03.26 LukeLee: This should be removed later, the MAC address is changed according to MACID in turn
//
#if( DM_ODM_SUPPORT_TYPE & ODM_WIN)
{
PADAPTER Adapter = pDM_Odm->Adapter;
PMGNT_INFO pMgntInfo = &Adapter->MgntInfo;
for (i=0; i<6; i++)
{
Bssid[i] = pMgntInfo->Bssid[i];
//DbgPrint("Bssid[%d]=%x\n", i, Bssid[i]);
}
}
#endif
//odm_SetNextMACAddrTarget(pDM_Odm);
//1 Select MAC Address Filter
for (i=0; i<6; i++)
{
if(Bssid[i] != pDM_FatTable->Bssid[i])
{
bMatchBSSID = FALSE;
break;
}
}
if(bMatchBSSID == FALSE)
{
//Match MAC ADDR
value32 = (Bssid[5]<<8)|Bssid[4];
ODM_SetMACReg(pDM_Odm, 0x7b4, 0xFFFF, value32);
value32 = (Bssid[3]<<24)|(Bssid[2]<<16) |(Bssid[1]<<8) |Bssid[0];
ODM_SetMACReg(pDM_Odm, 0x7b0, bMaskDWord, value32);
}
return bMatchBSSID;
#endif
}
VOID
odm_FastAntTraining(
IN PDM_ODM_T pDM_Odm
)
{
u4Byte i, MaxRSSI=0;
u1Byte TargetAnt=2;
pFAT_T pDM_FatTable = &pDM_Odm->DM_FatTable;
BOOLEAN bPktFilterMacth = FALSE;
ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("==>odm_FastAntTraining()\n"));
//1 TRAINING STATE
if(pDM_FatTable->FAT_State == FAT_TRAINING_STATE)
{
ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("Enter FAT_TRAINING_STATE\n"));
//2 Caculate RSSI per Antenna
for (i=0; i<7; i++)
{
if(pDM_FatTable->antRSSIcnt[i] == 0)
pDM_FatTable->antAveRSSI[i] = 0;
else
{
pDM_FatTable->antAveRSSI[i] = pDM_FatTable->antSumRSSI[i] /pDM_FatTable->antRSSIcnt[i];
bPktFilterMacth = TRUE;
}
if(pDM_FatTable->antAveRSSI[i] > MaxRSSI)
{
MaxRSSI = pDM_FatTable->antAveRSSI[i];
TargetAnt = (u1Byte) i;
}
ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("pDM_FatTable->antAveRSSI[%lu] = %lu, pDM_FatTable->antRSSIcnt[%lu] = %lu\n",
i, pDM_FatTable->antAveRSSI[i], i, pDM_FatTable->antRSSIcnt[i]));
}
//2 Select TRX Antenna
if(bPktFilterMacth == FALSE)
{
ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("None Packet is matched\n"));
ODM_SetBBReg(pDM_Odm, 0xe08 , BIT16, 0); //RegE08[16]=1'b0 //disable fast training
ODM_SetBBReg(pDM_Odm, 0xc50 , BIT7, 0); //RegC50[7]=1'b0 //disable HW AntDiv
}
else
{
ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("TargetAnt=%d, MaxRSSI=%lu\n",TargetAnt,MaxRSSI));
ODM_SetBBReg(pDM_Odm, 0xe08 , BIT16, 0); //RegE08[16]=1'b0 //disable fast training
//ODM_SetBBReg(pDM_Odm, 0xc50 , BIT7, 0); //RegC50[7]=1'b0 //disable HW AntDiv
ODM_SetBBReg(pDM_Odm, 0x864 , BIT8|BIT7|BIT6, TargetAnt); //Default RX is Omni, Optional RX is the best decision by FAT
//ODM_SetBBReg(pDM_Odm, 0x860 , BIT14|BIT13|BIT12, TargetAnt); //Default TX
ODM_SetBBReg(pDM_Odm, 0x80c , BIT21, 1); //Reg80c[21]=1'b1 //from TX Info
#if 0
pEntry = pDM_Odm->pODM_StaInfo[pDM_FatTable->TrainIdx];
if(IS_STA_VALID(pEntry))
{
pEntry->antsel_a = TargetAnt&BIT0;
pEntry->antsel_b = (TargetAnt&BIT1)>>1;
pEntry->antsel_c = (TargetAnt&BIT2)>>2;
}
#else
pDM_FatTable->antsel_a[pDM_FatTable->TrainIdx] = TargetAnt&BIT0;
pDM_FatTable->antsel_b[pDM_FatTable->TrainIdx] = (TargetAnt&BIT1)>>1;
pDM_FatTable->antsel_c[pDM_FatTable->TrainIdx] = (TargetAnt&BIT2)>>2;
#endif
if(TargetAnt == 0)
ODM_SetBBReg(pDM_Odm, 0xc50 , BIT7, 0); //RegC50[7]=1'b0 //disable HW AntDiv
}
//2 Reset Counter
for(i=0; i<7; i++)
{
pDM_FatTable->antSumRSSI[i] = 0;
pDM_FatTable->antRSSIcnt[i] = 0;
}
pDM_FatTable->FAT_State = FAT_NORMAL_STATE;
return;
}
//1 NORMAL STATE
if(pDM_FatTable->FAT_State == FAT_NORMAL_STATE)
{
ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("Enter FAT_NORMAL_STATE\n"));
odm_SetNextMACAddrTarget(pDM_Odm);
#if 0
pEntry = pDM_Odm->pODM_StaInfo[pDM_FatTable->TrainIdx];
if(IS_STA_VALID(pEntry))
{
pEntry->antsel_a = TargetAnt&BIT0;
pEntry->antsel_b = (TargetAnt&BIT1)>>1;
pEntry->antsel_c = (TargetAnt&BIT2)>>2;
}
#endif
//2 Prepare Training
pDM_FatTable->FAT_State = FAT_TRAINING_STATE;
ODM_SetBBReg(pDM_Odm, 0xe08 , BIT16, 1); //RegE08[16]=1'b1 //enable fast training
ODM_SetBBReg(pDM_Odm, 0xc50 , BIT7, 1); //RegC50[7]=1'b1 //enable HW AntDiv
ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("Start FAT_TRAINING_STATE\n"));
ODM_SetTimer(pDM_Odm,&pDM_Odm->FastAntTrainingTimer, 500 ); //ms
}
}
VOID
odm_FastAntTrainingCallback(
IN PDM_ODM_T pDM_Odm
)
{
#if (DM_ODM_SUPPORT_TYPE == ODM_CE)
PADAPTER padapter = pDM_Odm->Adapter;
if(padapter->net_closed == _TRUE)
return;
//if(*pDM_Odm->pbNet_closed == TRUE)
// return;
#endif
#if USE_WORKITEM
ODM_ScheduleWorkItem(&pDM_Odm->FastAntTrainingWorkitem);
#else
odm_FastAntTraining(pDM_Odm);
#endif
}
VOID
odm_FastAntTrainingWorkItemCallback(
IN PDM_ODM_T pDM_Odm
)
{
odm_FastAntTraining(pDM_Odm);
}
#endif
#endif
VOID
ODM_AntDivInit(
IN PDM_ODM_T pDM_Odm
)
{
pFAT_T pDM_FatTable = &pDM_Odm->DM_FatTable;
pSWAT_T pDM_SWAT_Table = &pDM_Odm->DM_SWAT_Table;
if(!(pDM_Odm->SupportAbility & ODM_BB_ANT_DIV))
{
ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("[Return!!!] Not Support Antenna Diversity Function\n"));
return;
}
//---
#if (DM_ODM_SUPPORT_TYPE == ODM_AP)
if(pDM_FatTable->AntDiv_2G_5G == ODM_ANTDIV_2G)
{
ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("[2G AntDiv Init]: Only Support 2G Antenna Diversity Function\n"));
if(!(pDM_Odm->SupportICType & ODM_ANTDIV_2G_SUPPORT_IC))
return;
}
else if(pDM_FatTable->AntDiv_2G_5G == ODM_ANTDIV_5G)
{
ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("[5G AntDiv Init]: Only Support 5G Antenna Diversity Function\n"));
if(!(pDM_Odm->SupportICType & ODM_ANTDIV_5G_SUPPORT_IC))
return;
}
else if(pDM_FatTable->AntDiv_2G_5G == (ODM_ANTDIV_2G|ODM_ANTDIV_5G))
{
ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("[2G & 5G AntDiv Init]:Support Both 2G & 5G Antenna Diversity Function\n"));
}
pDM_Odm->antdiv_rssi=0;
#endif
//---
//2 [--General---]
pDM_Odm->antdiv_period=0;
pDM_Odm->antdiv_select=0;
pDM_SWAT_Table->Ant5G = MAIN_ANT;
pDM_SWAT_Table->Ant2G = MAIN_ANT;
pDM_FatTable->CCK_counter_main=0;
pDM_FatTable->CCK_counter_aux=0;
pDM_FatTable->OFDM_counter_main=0;
pDM_FatTable->OFDM_counter_aux=0;
//3 [Set MAIN_ANT as default antenna if Auto-Ant enable]
if (pDM_Odm->antdiv_select==1)
pDM_Odm->AntType = ODM_FIX_MAIN_ANT;
else if (pDM_Odm->antdiv_select==2)
pDM_Odm->AntType = ODM_FIX_AUX_ANT;
else if(pDM_Odm->antdiv_select==0)
pDM_Odm->AntType = ODM_AUTO_ANT;
if(pDM_Odm->AntType == ODM_AUTO_ANT)
{
odm_AntDiv_on_off(pDM_Odm, ANTDIV_OFF);
ODM_UpdateRxIdleAnt(pDM_Odm, MAIN_ANT);
}
else
{
odm_AntDiv_on_off(pDM_Odm, ANTDIV_OFF);
if(pDM_Odm->AntType == ODM_FIX_MAIN_ANT)
{
ODM_UpdateRxIdleAnt(pDM_Odm, MAIN_ANT);
return;
}
else if(pDM_Odm->AntType == ODM_FIX_AUX_ANT)
{
ODM_UpdateRxIdleAnt(pDM_Odm, AUX_ANT);
return;
}
}
//---
if(pDM_Odm->AntDivType != CGCS_RX_HW_ANTDIV)
{
if(pDM_Odm->SupportICType & ODM_N_ANTDIV_SUPPORT)
{
#if TX_BY_REG
ODM_SetBBReg(pDM_Odm, 0x80c , BIT21, 0); //Reg80c[21]=1'b0 //from Reg
#else
ODM_SetBBReg(pDM_Odm, 0x80c , BIT21, 1);
#endif
}
else if(pDM_Odm->SupportICType & ODM_AC_ANTDIV_SUPPORT)
{
#if TX_BY_REG
ODM_SetBBReg(pDM_Odm, 0x900 , BIT18, 0);
#else
ODM_SetBBReg(pDM_Odm, 0x900 , BIT18, 1);
#endif
}
}
//2 [--88E---]
if(pDM_Odm->SupportICType == ODM_RTL8188E)
{
#if (RTL8188E_SUPPORT == 1)
//pDM_Odm->AntDivType = CGCS_RX_HW_ANTDIV;
//pDM_Odm->AntDivType = CG_TRX_HW_ANTDIV;
//pDM_Odm->AntDivType = CG_TRX_SMART_ANTDIV;
if( (pDM_Odm->AntDivType != CGCS_RX_HW_ANTDIV) && (pDM_Odm->AntDivType != CG_TRX_HW_ANTDIV) && (pDM_Odm->AntDivType != CG_TRX_SMART_ANTDIV))
{
ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("[Return!!!] 88E Not Supprrt This AntDiv Type\n"));
pDM_Odm->SupportAbility &= ~(ODM_BB_ANT_DIV);
return;
}
if(pDM_Odm->AntDivType == CGCS_RX_HW_ANTDIV)
odm_RX_HWAntDiv_Init_88E(pDM_Odm);
else if(pDM_Odm->AntDivType == CG_TRX_HW_ANTDIV)
odm_TRX_HWAntDiv_Init_88E(pDM_Odm);
else if(pDM_Odm->AntDivType == CG_TRX_SMART_ANTDIV)
odm_Smart_HWAntDiv_Init_88E(pDM_Odm);
#endif
}
//2 [--92E---]
#if (RTL8192E_SUPPORT == 1)
else if(pDM_Odm->SupportICType == ODM_RTL8192E)
{
//pDM_Odm->AntDivType = CGCS_RX_HW_ANTDIV;
//pDM_Odm->AntDivType = CG_TRX_HW_ANTDIV;
//pDM_Odm->AntDivType = CG_TRX_SMART_ANTDIV;
if( (pDM_Odm->AntDivType != CGCS_RX_HW_ANTDIV) && (pDM_Odm->AntDivType != CG_TRX_HW_ANTDIV) && (pDM_Odm->AntDivType != CG_TRX_SMART_ANTDIV))
{
ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("[Return!!!] 8192E Not Supprrt This AntDiv Type\n"));
pDM_Odm->SupportAbility &= ~(ODM_BB_ANT_DIV);
return;
}
if(pDM_Odm->AntDivType == CGCS_RX_HW_ANTDIV)
odm_RX_HWAntDiv_Init_92E(pDM_Odm);
else if(pDM_Odm->AntDivType == CG_TRX_HW_ANTDIV)
odm_TRX_HWAntDiv_Init_92E(pDM_Odm);
else if(pDM_Odm->AntDivType == CG_TRX_SMART_ANTDIV)
odm_Smart_HWAntDiv_Init_92E(pDM_Odm);
}
#endif
//2 [--8723B---]
#if (RTL8723B_SUPPORT == 1)
else if(pDM_Odm->SupportICType == ODM_RTL8723B)
{
//pDM_Odm->AntDivType = S0S1_SW_ANTDIV;
//pDM_Odm->AntDivType = CG_TRX_HW_ANTDIV;
if(pDM_Odm->AntDivType != S0S1_SW_ANTDIV && pDM_Odm->AntDivType != CG_TRX_HW_ANTDIV)
{
ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("[Return!!!] 8723B Not Supprrt This AntDiv Type\n"));
pDM_Odm->SupportAbility &= ~(ODM_BB_ANT_DIV);
return;
}
if( pDM_Odm->AntDivType==S0S1_SW_ANTDIV)
odm_S0S1_SWAntDiv_Init_8723B(pDM_Odm);
else if(pDM_Odm->AntDivType==CG_TRX_HW_ANTDIV)
odm_TRX_HWAntDiv_Init_8723B(pDM_Odm);
}
#endif
//2 [--8811A 8821A---]
#if (RTL8821A_SUPPORT == 1)
else if(pDM_Odm->SupportICType == ODM_RTL8821)
{
//pDM_Odm->AntDivType = CG_TRX_HW_ANTDIV;
pDM_Odm->AntDivType = S0S1_SW_ANTDIV;
if( pDM_Odm->AntDivType != CG_TRX_HW_ANTDIV && pDM_Odm->AntDivType != S0S1_SW_ANTDIV)
{
ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("[Return!!!] 8821A & 8811A Not Supprrt This AntDiv Type\n"));
pDM_Odm->SupportAbility &= ~(ODM_BB_ANT_DIV);
return;
}
if(pDM_Odm->AntDivType==CG_TRX_HW_ANTDIV)
odm_TRX_HWAntDiv_Init_8821A(pDM_Odm);
else if( pDM_Odm->AntDivType==S0S1_SW_ANTDIV)
odm_S0S1_SWAntDiv_Init_8821A(pDM_Odm);
}
#endif
//2 [--8881A---]
#if (RTL8881A_SUPPORT == 1)
else if(pDM_Odm->SupportICType == ODM_RTL8881A)
{
//pDM_Odm->AntDivType = CGCS_RX_HW_ANTDIV;
//pDM_Odm->AntDivType = CG_TRX_HW_ANTDIV;
if(pDM_Odm->AntDivType != CGCS_RX_HW_ANTDIV && pDM_Odm->AntDivType != CG_TRX_HW_ANTDIV)
{
ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("[Return!!!] 8881A Not Supprrt This AntDiv Type\n"));
pDM_Odm->SupportAbility &= ~(ODM_BB_ANT_DIV);
return;
}
if(pDM_Odm->AntDivType == CGCS_RX_HW_ANTDIV)
odm_RX_HWAntDiv_Init_8881A(pDM_Odm);
else if(pDM_Odm->AntDivType == CG_TRX_HW_ANTDIV)
odm_TRX_HWAntDiv_Init_8881A(pDM_Odm);
}
#endif
//2 [--8812---]
#if (RTL8812A_SUPPORT == 1)
else if(pDM_Odm->SupportICType == ODM_RTL8812)
{
//pDM_Odm->AntDivType = CG_TRX_HW_ANTDIV;
if( pDM_Odm->AntDivType != CG_TRX_HW_ANTDIV)
{
ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("[Return!!!] 8812A Not Supprrt This AntDiv Type\n"));
pDM_Odm->SupportAbility &= ~(ODM_BB_ANT_DIV);
return;
}
odm_TRX_HWAntDiv_Init_8812A(pDM_Odm);
}
#endif
//ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("*** SupportICType=[%lu] \n",pDM_Odm->SupportICType));
//ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("*** AntDiv SupportAbility=[%lu] \n",(pDM_Odm->SupportAbility & ODM_BB_ANT_DIV)>>6));
//ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("*** AntDiv Type=[%d] \n",pDM_Odm->AntDivType));
}
VOID
ODM_AntDiv(
IN PDM_ODM_T pDM_Odm
)
{
PADAPTER pAdapter = pDM_Odm->Adapter;
pFAT_T pDM_FatTable = &pDM_Odm->DM_FatTable;
//#if (DM_ODM_SUPPORT_TYPE == ODM_AP)
if(*pDM_Odm->pBandType == ODM_BAND_5G )
{
if(pDM_FatTable->idx_AntDiv_counter_5G < pDM_Odm->antdiv_period )
{
pDM_FatTable->idx_AntDiv_counter_5G++;
return;
}
else
pDM_FatTable->idx_AntDiv_counter_5G=0;
}
else if(*pDM_Odm->pBandType == ODM_BAND_2_4G )
{
if(pDM_FatTable->idx_AntDiv_counter_2G < pDM_Odm->antdiv_period )
{
pDM_FatTable->idx_AntDiv_counter_2G++;
return;
}
else
pDM_FatTable->idx_AntDiv_counter_2G=0;
}
//#endif
//----------
if(!(pDM_Odm->SupportAbility & ODM_BB_ANT_DIV))
{
ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("[Return!!!] Not Support Antenna Diversity Function\n"));
return;
}
//----------
#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
if(pAdapter->MgntInfo.AntennaTest)
return;
{
#if (BEAMFORMING_SUPPORT == 1)
BEAMFORMING_CAP BeamformCap = (pAdapter->MgntInfo.BeamformingInfo.BeamformCap);
if( BeamformCap & BEAMFORMEE_CAP ) // BFmee On && Div On -> Div Off
{
ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("[ AntDiv : OFF ] BFmee ==1 \n"));
if(pDM_Odm->SupportAbility & ODM_BB_ANT_DIV)
{
odm_AntDiv_on_off(pDM_Odm, ANTDIV_OFF);
pDM_Odm->SupportAbility &= ~(ODM_BB_ANT_DIV);
return;
}
}
else // BFmee Off && Div Off -> Div On
#endif
{
if(!(pDM_Odm->SupportAbility & ODM_BB_ANT_DIV) && pDM_Odm->bLinked)
{
ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("[ AntDiv : ON ] BFmee ==0 \n"));
if((pDM_Odm->AntDivType!=S0S1_SW_ANTDIV) )
odm_AntDiv_on_off(pDM_Odm, ANTDIV_ON);
pDM_Odm->SupportAbility |= (ODM_BB_ANT_DIV);
}
}
}
#endif
//----------
#if (DM_ODM_SUPPORT_TYPE == ODM_AP)
if(pDM_FatTable->AntDiv_2G_5G == ODM_ANTDIV_2G)
{
ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("[ 2G AntDiv Running ]\n"));
if(!(pDM_Odm->SupportICType & ODM_ANTDIV_2G_SUPPORT_IC))
return;
}
else if(pDM_FatTable->AntDiv_2G_5G == ODM_ANTDIV_5G)
{
ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("[ 5G AntDiv Running ]\n"));
if(!(pDM_Odm->SupportICType & ODM_ANTDIV_5G_SUPPORT_IC))
return;
}
else if(pDM_FatTable->AntDiv_2G_5G == (ODM_ANTDIV_2G|ODM_ANTDIV_5G))
{
ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("[ 2G & 5G AntDiv Running ]\n"));
}
#endif
//----------
if (pDM_Odm->antdiv_select==1)
pDM_Odm->AntType = ODM_FIX_MAIN_ANT;
else if (pDM_Odm->antdiv_select==2)
pDM_Odm->AntType = ODM_FIX_AUX_ANT;
else if (pDM_Odm->antdiv_select==0)
pDM_Odm->AntType = ODM_AUTO_ANT;
//ODM_RT_TRACE(pDM_Odm, ODM_COMP_ANT_DIV,ODM_DBG_LOUD,("AntType= (( %d )) , pre_AntType= (( %d )) \n",pDM_Odm->AntType,pDM_Odm->pre_AntType));
if(pDM_Odm->AntType != ODM_AUTO_ANT)
{
ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("Fix Antenna at (( %s ))\n",(pDM_Odm->AntType == ODM_FIX_MAIN_ANT)?"MAIN":"AUX"));
if(pDM_Odm->AntType != pDM_Odm->pre_AntType)
{
odm_AntDiv_on_off(pDM_Odm, ANTDIV_OFF);
if(pDM_Odm->SupportICType & ODM_N_ANTDIV_SUPPORT)
ODM_SetBBReg(pDM_Odm, 0x80c , BIT21, 0);
else if(pDM_Odm->SupportICType & ODM_AC_ANTDIV_SUPPORT)
ODM_SetBBReg(pDM_Odm, 0x900 , BIT18, 0);
if(pDM_Odm->AntType == ODM_FIX_MAIN_ANT)
ODM_UpdateRxIdleAnt(pDM_Odm, MAIN_ANT);
else if(pDM_Odm->AntType == ODM_FIX_AUX_ANT)
ODM_UpdateRxIdleAnt(pDM_Odm, AUX_ANT);
}
pDM_Odm->pre_AntType=pDM_Odm->AntType;
return;
}
else
{
if(pDM_Odm->AntType != pDM_Odm->pre_AntType)
{
odm_AntDiv_on_off(pDM_Odm, ANTDIV_ON);
if(pDM_Odm->SupportICType & ODM_N_ANTDIV_SUPPORT)
ODM_SetBBReg(pDM_Odm, 0x80c , BIT21, 1);
else if(pDM_Odm->SupportICType & ODM_AC_ANTDIV_SUPPORT)
ODM_SetBBReg(pDM_Odm, 0x900 , BIT18, 1);
}
pDM_Odm->pre_AntType=pDM_Odm->AntType;
}
//3 -----------------------------------------------------------------------------------------------------------
//2 [--88E---]
if(pDM_Odm->SupportICType == ODM_RTL8188E)
{
#if (RTL8188E_SUPPORT == 1)
if(pDM_Odm->AntDivType==CG_TRX_HW_ANTDIV ||pDM_Odm->AntDivType==CGCS_RX_HW_ANTDIV)
odm_HW_AntDiv(pDM_Odm);
#if (!(DM_ODM_SUPPORT_TYPE == ODM_CE))
else if (pDM_Odm->AntDivType==CG_TRX_SMART_ANTDIV)
odm_FastAntTraining(pDM_Odm);
#endif
#endif
}
//2 [--92E---]
#if (RTL8192E_SUPPORT == 1)
else if(pDM_Odm->SupportICType == ODM_RTL8192E)
{
if(pDM_Odm->AntDivType==CGCS_RX_HW_ANTDIV)
odm_HW_AntDiv(pDM_Odm);
#if (!(DM_ODM_SUPPORT_TYPE == ODM_CE))
else if (pDM_Odm->AntDivType==CG_TRX_SMART_ANTDIV)
odm_FastAntTraining(pDM_Odm);
#endif
}
#endif
#if (RTL8723B_SUPPORT == 1)
//2 [--8723B---]
else if(pDM_Odm->SupportICType == ODM_RTL8723B)
{
if (pDM_Odm->AntDivType==S0S1_SW_ANTDIV)
odm_S0S1_SwAntDiv(pDM_Odm, SWAW_STEP_PEAK);
else if (pDM_Odm->AntDivType==CG_TRX_HW_ANTDIV)
odm_HW_AntDiv(pDM_Odm);
}
#endif
//2 [--8821A---]
#if (RTL8821A_SUPPORT == 1)
else if(pDM_Odm->SupportICType == ODM_RTL8821)
{
if(pDM_Odm->bBtDisabled) //BT disabled
{
if(pDM_Odm->AntDivType == S0S1_SW_ANTDIV)
{
pDM_Odm->AntDivType=CG_TRX_HW_ANTDIV;
ODM_SetBBReg(pDM_Odm, 0x8D4 , BIT24, 1);
}
}
else //BT enabled
{
if(pDM_Odm->AntDivType == CG_TRX_HW_ANTDIV)
{
pDM_Odm->AntDivType=S0S1_SW_ANTDIV;
ODM_SetBBReg(pDM_Odm, 0x8D4 , BIT24, 0);
}
}
if (pDM_Odm->AntDivType==S0S1_SW_ANTDIV)
odm_S0S1_SwAntDiv(pDM_Odm, SWAW_STEP_PEAK);
else if (pDM_Odm->AntDivType==CG_TRX_HW_ANTDIV)
odm_HW_AntDiv(pDM_Odm);
}
#endif
//2 [--8881A---]
#if (RTL8881A_SUPPORT == 1)
else if(pDM_Odm->SupportICType == ODM_RTL8881A)
odm_HW_AntDiv(pDM_Odm);
#endif
//2 [--8812A---]
#if (RTL8812A_SUPPORT == 1)
else if(pDM_Odm->SupportICType == ODM_RTL8812)
odm_HW_AntDiv(pDM_Odm);
#endif
}
VOID
odm_AntselStatistics(
IN PDM_ODM_T pDM_Odm,
IN u1Byte antsel_tr_mux,
IN u4Byte MacId,
IN u4Byte RxPWDBAll
)
{
pFAT_T pDM_FatTable = &pDM_Odm->DM_FatTable;
if(antsel_tr_mux == ANT1_2G)
{
pDM_FatTable->MainAnt_Sum[MacId]+=RxPWDBAll;
pDM_FatTable->MainAnt_Cnt[MacId]++;
}
else
{
pDM_FatTable->AuxAnt_Sum[MacId]+=RxPWDBAll;
pDM_FatTable->AuxAnt_Cnt[MacId]++;
}
}
VOID
ODM_Process_RSSIForAntDiv(
IN OUT PDM_ODM_T pDM_Odm,
IN PODM_PHY_INFO_T pPhyInfo,
IN PODM_PACKET_INFO_T pPktinfo
)
{
u1Byte isCCKrate=0,CCKMaxRate=DESC_RATE11M;
pFAT_T pDM_FatTable = &pDM_Odm->DM_FatTable;
#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN))
u4Byte RxPower_Ant0, RxPower_Ant1;
#else
u1Byte RxPower_Ant0, RxPower_Ant1;
#endif
if(pDM_Odm->SupportICType & ODM_N_ANTDIV_SUPPORT)
CCKMaxRate=DESC_RATE11M;
else if(pDM_Odm->SupportICType & ODM_AC_ANTDIV_SUPPORT)
CCKMaxRate=DESC_RATE11M;
isCCKrate = (pPktinfo->DataRate <= CCKMaxRate)?TRUE:FALSE;
#if ((RTL8192C_SUPPORT == 1) ||(RTL8192D_SUPPORT == 1))
if(pDM_Odm->SupportICType & ODM_RTL8192C|ODM_RTL8192D)
{
if(pPktinfo->bPacketToSelf || pPktinfo->bPacketBeacon)
{
//if(pPktinfo->bPacketBeacon)
//{
// DbgPrint("This is beacon, isCCKrate=%d\n", isCCKrate);
//}
ODM_AntselStatistics_88C(pDM_Odm, pPktinfo->StationID, pPhyInfo->RxPWDBAll, isCCKrate);
}
}
#endif
if( (pDM_Odm->SupportICType == ODM_RTL8192E||pDM_Odm->SupportICType == ODM_RTL8812) && (pPktinfo->DataRate > CCKMaxRate) )
{
RxPower_Ant0 = pPhyInfo->RxMIMOSignalStrength[0];
RxPower_Ant1= pPhyInfo->RxMIMOSignalStrength[1];
}
else
RxPower_Ant0=pPhyInfo->RxPWDBAll;
if(pDM_Odm->AntDivType == CG_TRX_SMART_ANTDIV)
{
if( (pDM_Odm->SupportICType & ODM_SMART_ANT_SUPPORT) && pPktinfo->bPacketToSelf && pDM_FatTable->FAT_State == FAT_TRAINING_STATE )//(pPktinfo->bPacketMatchBSSID && (!pPktinfo->bPacketBeacon))
{
u1Byte antsel_tr_mux;
antsel_tr_mux = (pDM_FatTable->antsel_rx_keep_2<<2) |(pDM_FatTable->antsel_rx_keep_1 <<1) |pDM_FatTable->antsel_rx_keep_0;
pDM_FatTable->antSumRSSI[antsel_tr_mux] += RxPower_Ant0;
pDM_FatTable->antRSSIcnt[antsel_tr_mux]++;
}
}
else //AntDivType != CG_TRX_SMART_ANTDIV
{
if( ( pDM_Odm->SupportICType & ODM_ANTDIV_SUPPORT ) && (pPktinfo->bPacketToSelf || pPktinfo->bPacketMatchBSSID) )
{
if(pDM_Odm->SupportICType == ODM_RTL8188E || pDM_Odm->SupportICType == ODM_RTL8192E)
odm_AntselStatistics(pDM_Odm, pDM_FatTable->antsel_rx_keep_0, pPktinfo->StationID,RxPower_Ant0);
else// SupportICType == ODM_RTL8821 and ODM_RTL8723B and ODM_RTL8812)
{
if(isCCKrate && (pDM_Odm->AntDivType == S0S1_SW_ANTDIV))
{
pDM_FatTable->antsel_rx_keep_0 = (pDM_FatTable->RxIdleAnt == MAIN_ANT) ? ANT1_2G : ANT2_2G;
if(pDM_FatTable->antsel_rx_keep_0==ANT1_2G)
pDM_FatTable->CCK_counter_main++;
else// if(pDM_FatTable->antsel_rx_keep_0==ANT2_2G)
pDM_FatTable->CCK_counter_aux++;
odm_AntselStatistics(pDM_Odm, pDM_FatTable->antsel_rx_keep_0, pPktinfo->StationID, RxPower_Ant0);
}
else
{
if(pDM_FatTable->antsel_rx_keep_0==ANT1_2G)
pDM_FatTable->OFDM_counter_main++;
else// if(pDM_FatTable->antsel_rx_keep_0==ANT2_2G)
pDM_FatTable->OFDM_counter_aux++;
odm_AntselStatistics(pDM_Odm, pDM_FatTable->antsel_rx_keep_0, pPktinfo->StationID, RxPower_Ant0);
}
}
}
}
//ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,("isCCKrate=%d, PWDB_ALL=%d\n",isCCKrate, pPhyInfo->RxPWDBAll));
//ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD,("antsel_tr_mux=3'b%d%d%d\n",pDM_FatTable->antsel_rx_keep_2, pDM_FatTable->antsel_rx_keep_1, pDM_FatTable->antsel_rx_keep_0));
}
#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))
VOID
ODM_SetTxAntByTxInfo(
IN PDM_ODM_T pDM_Odm,
IN pu1Byte pDesc,
IN u1Byte macId
)
{
pFAT_T pDM_FatTable = &pDM_Odm->DM_FatTable;
if(!(pDM_Odm->SupportAbility & ODM_BB_ANT_DIV))
return;
if(pDM_Odm->AntDivType==CGCS_RX_HW_ANTDIV)
return;
if(pDM_Odm->SupportICType == ODM_RTL8723B)
{
#if (RTL8723B_SUPPORT == 1)
SET_TX_DESC_ANTSEL_A_8723B(pDesc, pDM_FatTable->antsel_a[macId]);
//ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[8723B] SetTxAntByTxInfo_WIN: MacID=%d, antsel_tr_mux=3'b%d%d%d\n",
//macId, pDM_FatTable->antsel_c[macId], pDM_FatTable->antsel_b[macId], pDM_FatTable->antsel_a[macId]));
#endif
}
else if(pDM_Odm->SupportICType == ODM_RTL8821)
{
#if (RTL8821A_SUPPORT == 1)
SET_TX_DESC_ANTSEL_A_8812(pDesc, pDM_FatTable->antsel_a[macId]);
//ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[8821A] SetTxAntByTxInfo_WIN: MacID=%d, antsel_tr_mux=3'b%d%d%d\n",
//macId, pDM_FatTable->antsel_c[macId], pDM_FatTable->antsel_b[macId], pDM_FatTable->antsel_a[macId]));
#endif
}
else if(pDM_Odm->SupportICType == ODM_RTL8188E)
{
#if (RTL8188E_SUPPORT == 1)
SET_TX_DESC_ANTSEL_A_88E(pDesc, pDM_FatTable->antsel_a[macId]);
SET_TX_DESC_ANTSEL_B_88E(pDesc, pDM_FatTable->antsel_b[macId]);
SET_TX_DESC_ANTSEL_C_88E(pDesc, pDM_FatTable->antsel_c[macId]);
//ODM_RT_TRACE(pDM_Odm,ODM_COMP_ANT_DIV, ODM_DBG_LOUD, ("[8188E] SetTxAntByTxInfo_WIN: MacID=%d, antsel_tr_mux=3'b%d%d%d\n",
//macId, pDM_FatTable->antsel_c[macId], pDM_FatTable->antsel_b[macId], pDM_FatTable->antsel_a[macId]));
#endif
}
else if(pDM_Odm->SupportICType == ODM_RTL8192E)
{
}
}
#else// (DM_ODM_SUPPORT_TYPE == ODM_AP)
VOID
ODM_SetTxAntByTxInfo(
//IN PDM_ODM_T pDM_Odm,
struct rtl8192cd_priv *priv,
struct tx_desc *pdesc,
struct tx_insn *txcfg,
unsigned short aid
)
{
pFAT_T pDM_FatTable = &priv->pshare->_dmODM.DM_FatTable;
u4Byte SupportICType=priv->pshare->_dmODM.SupportICType;
if(SupportICType == ODM_RTL8881A)
{
//panic_printk("[%s] [%d] ******ODM_SetTxAntByTxInfo_8881E****** \n",__FUNCTION__,__LINE__);
pdesc->Dword6 &= set_desc(~ (BIT(18)|BIT(17)|BIT(16)));
pdesc->Dword6 |= set_desc(pDM_FatTable->antsel_a[aid]<<16);
}
else if(SupportICType == ODM_RTL8192E)
{
//panic_printk("[%s] [%d] ******ODM_SetTxAntByTxInfo_8192E****** \n",__FUNCTION__,__LINE__);
pdesc->Dword6 &= set_desc(~ (BIT(18)|BIT(17)|BIT(16)));
pdesc->Dword6 |= set_desc(pDM_FatTable->antsel_a[aid]<<16);
}
else if(SupportICType == ODM_RTL8812)
{
//3 [path-A]
//panic_printk("[%s] [%d] ******ODM_SetTxAntByTxInfo_8881E****** \n",__FUNCTION__,__LINE__);
pdesc->Dword6 &= set_desc(~ BIT(16));
pdesc->Dword6 &= set_desc(~ BIT(17));
pdesc->Dword6 &= set_desc(~ BIT(18));
if(txcfg->pstat)
{
pdesc->Dword6 |= set_desc(pDM_FatTable->antsel_a[aid]<<16);
pdesc->Dword6 |= set_desc(pDM_FatTable->antsel_b[aid]<<17);
pdesc->Dword6 |= set_desc(pDM_FatTable->antsel_c[aid]<<18);
}
}
}
#endif
#else
VOID ODM_AntDivInit( IN PDM_ODM_T pDM_Odm ){}
VOID ODM_AntDiv( IN PDM_ODM_T pDM_Odm){}
#endif //#if (defined(CONFIG_HW_ANTENNA_DIVERSITY))