811 lines
21 KiB
C
811 lines
21 KiB
C
/******************************************************************************
|
|
*
|
|
* 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 "mp_precomp.h"
|
|
#include "phydm_precomp.h"
|
|
|
|
#if(defined(CONFIG_PATH_DIVERSITY))
|
|
#if RTL8814A_SUPPORT
|
|
|
|
VOID
|
|
phydm_dtp_fix_tx_path(
|
|
IN PVOID pDM_VOID,
|
|
IN u1Byte path
|
|
)
|
|
{
|
|
PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
|
|
pPATHDIV_T pDM_PathDiv = &pDM_Odm->DM_PathDiv;
|
|
u1Byte i,num_enable_path=0;
|
|
|
|
if(path==pDM_PathDiv->pre_tx_path)
|
|
{
|
|
return;
|
|
}
|
|
else
|
|
{
|
|
pDM_PathDiv->pre_tx_path=path;
|
|
}
|
|
|
|
ODM_SetBBReg( pDM_Odm, 0x93c, BIT18|BIT19, 3);
|
|
|
|
for(i=0; i<4; i++)
|
|
{
|
|
if(path&BIT(i))
|
|
num_enable_path++;
|
|
}
|
|
ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, (" Number of trun-on path : (( %d ))\n", num_enable_path));
|
|
|
|
if(num_enable_path == 1)
|
|
{
|
|
ODM_SetBBReg( pDM_Odm, 0x93c, 0xf00000, path);
|
|
|
|
if(path==PHYDM_A)//1-1
|
|
{
|
|
ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, (" Trun on path (( A ))\n"));
|
|
ODM_SetBBReg( pDM_Odm, 0x93c, BIT25|BIT24, 0);
|
|
}
|
|
else if(path==PHYDM_B)//1-2
|
|
{
|
|
ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, (" Trun on path (( B ))\n"));
|
|
ODM_SetBBReg( pDM_Odm, 0x93c, BIT27|BIT26, 0);
|
|
}
|
|
else if(path==PHYDM_C)//1-3
|
|
{
|
|
ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, (" Trun on path (( C ))\n"));
|
|
ODM_SetBBReg( pDM_Odm, 0x93c, BIT29|BIT28, 0);
|
|
|
|
}
|
|
else if(path==PHYDM_D)//1-4
|
|
{
|
|
ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, (" Trun on path (( D ))\n"));
|
|
ODM_SetBBReg( pDM_Odm, 0x93c, BIT31|BIT30, 0);
|
|
}
|
|
|
|
}
|
|
else if(num_enable_path == 2)
|
|
{
|
|
ODM_SetBBReg( pDM_Odm, 0x93c, 0xf00000, path);
|
|
ODM_SetBBReg( pDM_Odm, 0x940, 0xf0, path);
|
|
|
|
if(path==PHYDM_AB)//2-1
|
|
{
|
|
ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, (" Trun on path (( A B ))\n"));
|
|
//set for 1ss
|
|
ODM_SetBBReg( pDM_Odm, 0x93c, BIT25|BIT24, 0);
|
|
ODM_SetBBReg( pDM_Odm, 0x93c, BIT27|BIT26, 1);
|
|
//set for 2ss
|
|
ODM_SetBBReg( pDM_Odm, 0x940, BIT9|BIT8, 0);
|
|
ODM_SetBBReg( pDM_Odm, 0x940, BIT11|BIT10, 1);
|
|
}
|
|
else if(path==PHYDM_AC)//2-2
|
|
{
|
|
ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, (" Trun on path (( A C ))\n"));
|
|
//set for 1ss
|
|
ODM_SetBBReg( pDM_Odm, 0x93c, BIT25|BIT24, 0);
|
|
ODM_SetBBReg( pDM_Odm, 0x93c, BIT29|BIT28, 1);
|
|
//set for 2ss
|
|
ODM_SetBBReg( pDM_Odm, 0x940, BIT9|BIT8, 0);
|
|
ODM_SetBBReg( pDM_Odm, 0x940, BIT13|BIT12, 1);
|
|
}
|
|
else if(path==PHYDM_AD)//2-3
|
|
{
|
|
ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, (" Trun on path (( A D ))\n"));
|
|
//set for 1ss
|
|
ODM_SetBBReg( pDM_Odm, 0x93c, BIT25|BIT24, 0);
|
|
ODM_SetBBReg( pDM_Odm, 0x93c, BIT31|BIT30, 1);
|
|
//set for 2ss
|
|
ODM_SetBBReg( pDM_Odm, 0x940, BIT9|BIT8, 0);
|
|
ODM_SetBBReg( pDM_Odm, 0x940, BIT15|BIT14, 1);
|
|
}
|
|
else if(path==PHYDM_BC)//2-4
|
|
{
|
|
ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, (" Trun on path (( B C ))\n"));
|
|
//set for 1ss
|
|
ODM_SetBBReg( pDM_Odm, 0x93c, BIT27|BIT26, 0);
|
|
ODM_SetBBReg( pDM_Odm, 0x93c, BIT29|BIT28, 1);
|
|
//set for 2ss
|
|
ODM_SetBBReg( pDM_Odm, 0x940, BIT11|BIT10, 0);
|
|
ODM_SetBBReg( pDM_Odm, 0x940, BIT13|BIT12, 1);
|
|
}
|
|
else if(path==PHYDM_BD)//2-5
|
|
{
|
|
ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, (" Trun on path (( B D ))\n"));
|
|
//set for 1ss
|
|
ODM_SetBBReg( pDM_Odm, 0x93c, BIT27|BIT26, 0);
|
|
ODM_SetBBReg( pDM_Odm, 0x93c, BIT31|BIT30, 1);
|
|
//set for 2ss
|
|
ODM_SetBBReg( pDM_Odm, 0x940, BIT11|BIT10, 0);
|
|
ODM_SetBBReg( pDM_Odm, 0x940, BIT15|BIT14, 1);
|
|
}
|
|
else if(path==PHYDM_CD)//2-6
|
|
{
|
|
ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, (" Trun on path (( C D ))\n"));
|
|
//set for 1ss
|
|
ODM_SetBBReg( pDM_Odm, 0x93c, BIT29|BIT28, 0);
|
|
ODM_SetBBReg( pDM_Odm, 0x93c, BIT31|BIT30, 1);
|
|
//set for 2ss
|
|
ODM_SetBBReg( pDM_Odm, 0x940, BIT13|BIT12, 0);
|
|
ODM_SetBBReg( pDM_Odm, 0x940, BIT15|BIT14, 1);
|
|
}
|
|
|
|
}
|
|
else if(num_enable_path == 3)
|
|
{
|
|
ODM_SetBBReg( pDM_Odm, 0x93c, 0xf00000, path);
|
|
ODM_SetBBReg( pDM_Odm, 0x940, 0xf0, path);
|
|
ODM_SetBBReg( pDM_Odm, 0x940, 0xf0000, path);
|
|
|
|
if(path==PHYDM_ABC)//3-1
|
|
{
|
|
ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, (" Trun on path (( A B C))\n"));
|
|
//set for 1ss
|
|
ODM_SetBBReg( pDM_Odm, 0x93c, BIT25|BIT24, 0);
|
|
ODM_SetBBReg( pDM_Odm, 0x93c, BIT27|BIT26, 1);
|
|
ODM_SetBBReg( pDM_Odm, 0x93c, BIT29|BIT28, 2);
|
|
//set for 2ss
|
|
ODM_SetBBReg( pDM_Odm, 0x940, BIT9|BIT8, 0);
|
|
ODM_SetBBReg( pDM_Odm, 0x940, BIT11|BIT10, 1);
|
|
ODM_SetBBReg( pDM_Odm, 0x940, BIT13|BIT12, 2);
|
|
//set for 3ss
|
|
ODM_SetBBReg( pDM_Odm, 0x940, BIT21|BIT20, 0);
|
|
ODM_SetBBReg( pDM_Odm, 0x940, BIT23|BIT22, 1);
|
|
ODM_SetBBReg( pDM_Odm, 0x940, BIT25|BIT24, 2);
|
|
}
|
|
else if(path==PHYDM_ABD)//3-2
|
|
{
|
|
ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, (" Trun on path (( A B D ))\n"));
|
|
//set for 1ss
|
|
ODM_SetBBReg( pDM_Odm, 0x93c, BIT25|BIT24, 0);
|
|
ODM_SetBBReg( pDM_Odm, 0x93c, BIT27|BIT26, 1);
|
|
ODM_SetBBReg( pDM_Odm, 0x93c, BIT31|BIT30, 2);
|
|
//set for 2ss
|
|
ODM_SetBBReg( pDM_Odm, 0x940, BIT9|BIT8, 0);
|
|
ODM_SetBBReg( pDM_Odm, 0x940, BIT11|BIT10, 1);
|
|
ODM_SetBBReg( pDM_Odm, 0x940, BIT15|BIT14, 2);
|
|
//set for 3ss
|
|
ODM_SetBBReg( pDM_Odm, 0x940, BIT21|BIT20, 0);
|
|
ODM_SetBBReg( pDM_Odm, 0x940, BIT23|BIT22, 1);
|
|
ODM_SetBBReg( pDM_Odm, 0x940, BIT27|BIT26, 2);
|
|
|
|
}
|
|
else if(path==PHYDM_ACD)//3-3
|
|
{
|
|
ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, (" Trun on path (( A C D ))\n"));
|
|
//set for 1ss
|
|
ODM_SetBBReg( pDM_Odm, 0x93c, BIT25|BIT24, 0);
|
|
ODM_SetBBReg( pDM_Odm, 0x93c, BIT29|BIT28, 1);
|
|
ODM_SetBBReg( pDM_Odm, 0x93c, BIT31|BIT30, 2);
|
|
//set for 2ss
|
|
ODM_SetBBReg( pDM_Odm, 0x940, BIT9|BIT8, 0);
|
|
ODM_SetBBReg( pDM_Odm, 0x940, BIT13|BIT12, 1);
|
|
ODM_SetBBReg( pDM_Odm, 0x940, BIT15|BIT14, 2);
|
|
//set for 3ss
|
|
ODM_SetBBReg( pDM_Odm, 0x940, BIT21|BIT20, 0);
|
|
ODM_SetBBReg( pDM_Odm, 0x940, BIT25|BIT24, 1);
|
|
ODM_SetBBReg( pDM_Odm, 0x940, BIT27|BIT26, 2);
|
|
}
|
|
else if(path==PHYDM_BCD)//3-4
|
|
{
|
|
ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, (" Trun on path (( B C D))\n"));
|
|
//set for 1ss
|
|
ODM_SetBBReg( pDM_Odm, 0x93c, BIT27|BIT26, 0);
|
|
ODM_SetBBReg( pDM_Odm, 0x93c, BIT29|BIT28, 1);
|
|
ODM_SetBBReg( pDM_Odm, 0x93c, BIT31|BIT30, 2);
|
|
//set for 2ss
|
|
ODM_SetBBReg( pDM_Odm, 0x940, BIT11|BIT10, 0);
|
|
ODM_SetBBReg( pDM_Odm, 0x940, BIT13|BIT12, 1);
|
|
ODM_SetBBReg( pDM_Odm, 0x940, BIT15|BIT14, 2);
|
|
//set for 3ss
|
|
ODM_SetBBReg( pDM_Odm, 0x940, BIT23|BIT22, 0);
|
|
ODM_SetBBReg( pDM_Odm, 0x940, BIT25|BIT24, 1);
|
|
ODM_SetBBReg( pDM_Odm, 0x940, BIT27|BIT26, 2);
|
|
}
|
|
}
|
|
else if(num_enable_path == 4)
|
|
{
|
|
ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, (" Trun on path ((A B C D))\n"));
|
|
}
|
|
|
|
}
|
|
|
|
VOID
|
|
phydm_find_default_path(
|
|
IN PVOID pDM_VOID
|
|
)
|
|
{
|
|
PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
|
|
pPATHDIV_T pDM_PathDiv = &pDM_Odm->DM_PathDiv;
|
|
u4Byte rssi_avg_a=0, rssi_avg_b=0, rssi_avg_c=0, rssi_avg_d=0, rssi_avg_bcd=0;
|
|
u4Byte rssi_total_a=0, rssi_total_b=0, rssi_total_c=0, rssi_total_d=0;
|
|
|
|
//2 Default Path Selection By RSSI
|
|
|
|
rssi_avg_a = (pDM_PathDiv->path_a_cnt_all > 0)? (pDM_PathDiv->path_a_sum_all / pDM_PathDiv->path_a_cnt_all) :0 ;
|
|
rssi_avg_b = (pDM_PathDiv->path_b_cnt_all > 0)? (pDM_PathDiv->path_b_sum_all / pDM_PathDiv->path_b_cnt_all) :0 ;
|
|
rssi_avg_c = (pDM_PathDiv->path_c_cnt_all > 0)? (pDM_PathDiv->path_c_sum_all / pDM_PathDiv->path_c_cnt_all) :0 ;
|
|
rssi_avg_d = (pDM_PathDiv->path_d_cnt_all > 0)? (pDM_PathDiv->path_d_sum_all / pDM_PathDiv->path_d_cnt_all) :0 ;
|
|
|
|
|
|
pDM_PathDiv->path_a_sum_all = 0;
|
|
pDM_PathDiv->path_a_cnt_all = 0;
|
|
pDM_PathDiv->path_b_sum_all = 0;
|
|
pDM_PathDiv->path_b_cnt_all = 0;
|
|
pDM_PathDiv->path_c_sum_all = 0;
|
|
pDM_PathDiv->path_c_cnt_all = 0;
|
|
pDM_PathDiv->path_d_sum_all = 0;
|
|
pDM_PathDiv->path_d_cnt_all = 0;
|
|
|
|
if(pDM_PathDiv->use_path_a_as_default_ant == 1)
|
|
{
|
|
rssi_avg_bcd=(rssi_avg_b+rssi_avg_c+rssi_avg_d)/3;
|
|
|
|
if( (rssi_avg_a + ANT_DECT_RSSI_TH) > rssi_avg_bcd )
|
|
{
|
|
pDM_PathDiv->is_pathA_exist=TRUE;
|
|
pDM_PathDiv->default_path=PATH_A;
|
|
}
|
|
else
|
|
{
|
|
pDM_PathDiv->is_pathA_exist=FALSE;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if( (rssi_avg_a >=rssi_avg_b) && (rssi_avg_a >=rssi_avg_c)&&(rssi_avg_a >=rssi_avg_d))
|
|
pDM_PathDiv->default_path=PATH_A;
|
|
else if( (rssi_avg_b >=rssi_avg_c)&&(rssi_avg_b >=rssi_avg_d))
|
|
pDM_PathDiv->default_path=PATH_B;
|
|
else if( rssi_avg_c >=rssi_avg_d)
|
|
pDM_PathDiv->default_path=PATH_C;
|
|
else
|
|
pDM_PathDiv->default_path=PATH_D;
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
VOID
|
|
phydm_candidate_dtp_update(
|
|
IN PVOID pDM_VOID
|
|
)
|
|
{
|
|
PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
|
|
pPATHDIV_T pDM_PathDiv = &pDM_Odm->DM_PathDiv;
|
|
|
|
pDM_PathDiv->num_candidate=3;
|
|
|
|
if(pDM_PathDiv->use_path_a_as_default_ant == 1)
|
|
{
|
|
if(pDM_PathDiv->num_tx_path==3)
|
|
{
|
|
if(pDM_PathDiv->is_pathA_exist)
|
|
{
|
|
pDM_PathDiv->ant_candidate_1 = PHYDM_ABC;
|
|
pDM_PathDiv->ant_candidate_2 = PHYDM_ABD;
|
|
pDM_PathDiv->ant_candidate_3 = PHYDM_ACD;
|
|
}
|
|
else // use path BCD
|
|
{
|
|
pDM_PathDiv->num_candidate=1;
|
|
phydm_dtp_fix_tx_path(pDM_Odm, PHYDM_BCD);
|
|
return;
|
|
}
|
|
}
|
|
else if(pDM_PathDiv->num_tx_path==2)
|
|
{
|
|
if(pDM_PathDiv->is_pathA_exist)
|
|
{
|
|
pDM_PathDiv->ant_candidate_1 = PHYDM_AB;
|
|
pDM_PathDiv->ant_candidate_2 = PHYDM_AC;
|
|
pDM_PathDiv->ant_candidate_3 = PHYDM_AD;
|
|
}
|
|
else
|
|
{
|
|
pDM_PathDiv->ant_candidate_1 = PHYDM_BC;
|
|
pDM_PathDiv->ant_candidate_2 = PHYDM_BD;
|
|
pDM_PathDiv->ant_candidate_3 = PHYDM_CD;
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
//2 3 TX Mode
|
|
if(pDM_PathDiv->num_tx_path==3)//choose 3 ant form 4
|
|
{
|
|
if(pDM_PathDiv->default_path == PATH_A) //choose 2 ant form 3
|
|
{
|
|
pDM_PathDiv->ant_candidate_1 = PHYDM_ABC;
|
|
pDM_PathDiv->ant_candidate_2 = PHYDM_ABD;
|
|
pDM_PathDiv->ant_candidate_3 = PHYDM_ACD;
|
|
}
|
|
else if(pDM_PathDiv->default_path==PATH_B)
|
|
{
|
|
pDM_PathDiv->ant_candidate_1 = PHYDM_ABC;
|
|
pDM_PathDiv->ant_candidate_2 = PHYDM_ABD;
|
|
pDM_PathDiv->ant_candidate_3 = PHYDM_BCD;
|
|
}
|
|
else if(pDM_PathDiv->default_path == PATH_C)
|
|
{
|
|
pDM_PathDiv->ant_candidate_1 = PHYDM_ABC;
|
|
pDM_PathDiv->ant_candidate_2 = PHYDM_ACD;
|
|
pDM_PathDiv->ant_candidate_3 = PHYDM_BCD;
|
|
}
|
|
else if(pDM_PathDiv->default_path == PATH_D)
|
|
{
|
|
pDM_PathDiv->ant_candidate_1 = PHYDM_ABD;
|
|
pDM_PathDiv->ant_candidate_2 = PHYDM_ACD;
|
|
pDM_PathDiv->ant_candidate_3 = PHYDM_BCD;
|
|
}
|
|
}
|
|
|
|
//2 2 TX Mode
|
|
else if(pDM_PathDiv->num_tx_path==2)//choose 2 ant form 4
|
|
{
|
|
if(pDM_PathDiv->default_path == PATH_A) //choose 2 ant form 3
|
|
{
|
|
pDM_PathDiv->ant_candidate_1 = PHYDM_AB;
|
|
pDM_PathDiv->ant_candidate_2 = PHYDM_AC;
|
|
pDM_PathDiv->ant_candidate_3 = PHYDM_AD;
|
|
}
|
|
else if(pDM_PathDiv->default_path==PATH_B)
|
|
{
|
|
pDM_PathDiv->ant_candidate_1 = PHYDM_AB;
|
|
pDM_PathDiv->ant_candidate_2 = PHYDM_BC;
|
|
pDM_PathDiv->ant_candidate_3 = PHYDM_BD;
|
|
}
|
|
else if(pDM_PathDiv->default_path == PATH_C)
|
|
{
|
|
pDM_PathDiv->ant_candidate_1 = PHYDM_AC;
|
|
pDM_PathDiv->ant_candidate_2 = PHYDM_BC;
|
|
pDM_PathDiv->ant_candidate_3 = PHYDM_CD;
|
|
}
|
|
else if(pDM_PathDiv->default_path == PATH_D)
|
|
{
|
|
pDM_PathDiv->ant_candidate_1= PHYDM_AD;
|
|
pDM_PathDiv->ant_candidate_2 = PHYDM_BD;
|
|
pDM_PathDiv->ant_candidate_3= PHYDM_CD;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
VOID
|
|
phydm_dynamic_tx_path(
|
|
IN PVOID pDM_VOID
|
|
)
|
|
{
|
|
PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
|
|
pPATHDIV_T pDM_PathDiv = &pDM_Odm->DM_PathDiv;
|
|
|
|
PSTA_INFO_T pEntry;
|
|
u4Byte i;
|
|
u1Byte num_client=0;
|
|
u1Byte H2C_Parameter[6] ={0};
|
|
|
|
|
|
if(!pDM_Odm->bLinked) //bLinked==False
|
|
{
|
|
ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("DTP_8814 [No Link!!!]\n"));
|
|
|
|
if(pDM_PathDiv->bBecomeLinked == TRUE)
|
|
{
|
|
ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, (" [Be disconnected]----->\n"));
|
|
pDM_PathDiv->bBecomeLinked = pDM_Odm->bLinked;
|
|
}
|
|
return;
|
|
}
|
|
else
|
|
{
|
|
if(pDM_PathDiv->bBecomeLinked ==FALSE)
|
|
{
|
|
ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, (" [Be Linked !!!]----->\n"));
|
|
pDM_PathDiv->bBecomeLinked = pDM_Odm->bLinked;
|
|
}
|
|
}
|
|
|
|
//2 [Period CTRL]
|
|
if(pDM_PathDiv->dtp_period >=2)
|
|
{
|
|
pDM_PathDiv->dtp_period=0;
|
|
}
|
|
else
|
|
{
|
|
//ODM_RT_TRACE(pDM_Odm,ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("Phydm_Dynamic_Tx_Path_8814A() Stay = (( %d ))\n",pDM_PathDiv->dtp_period));
|
|
pDM_PathDiv->dtp_period++;
|
|
return;
|
|
}
|
|
|
|
|
|
//2 [Fix Path]
|
|
if (pDM_Odm->path_select != PHYDM_AUTO_PATH)
|
|
{
|
|
return;
|
|
}
|
|
|
|
//2 [Check Bfer]
|
|
#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
|
|
#if (BEAMFORMING_SUPPORT == 1)
|
|
{
|
|
BEAMFORMING_CAP BeamformCap = (pDM_Odm->BeamformingInfo.BeamformCap);
|
|
|
|
if( BeamformCap & BEAMFORMER_CAP ) // BFmer On && Div On -> Div Off
|
|
{
|
|
if( pDM_PathDiv->fix_path_bfer == 0)
|
|
{
|
|
ODM_RT_TRACE(pDM_Odm, ODM_COMP_PATH_DIV,ODM_DBG_LOUD,("[ PathDiv : OFF ] BFmer ==1 \n"));
|
|
pDM_PathDiv->fix_path_bfer = 1 ;
|
|
}
|
|
return;
|
|
}
|
|
else // BFmer Off && Div Off -> Div On
|
|
{
|
|
if( pDM_PathDiv->fix_path_bfer == 1 )
|
|
{
|
|
ODM_RT_TRACE(pDM_Odm, ODM_COMP_PATH_DIV,ODM_DBG_LOUD,("[ PathDiv : ON ] BFmer ==0 \n"));
|
|
pDM_PathDiv->fix_path_bfer = 0;
|
|
}
|
|
}
|
|
}
|
|
#endif
|
|
#endif
|
|
|
|
if(pDM_PathDiv->use_path_a_as_default_ant ==1)
|
|
{
|
|
phydm_find_default_path(pDM_Odm);
|
|
phydm_candidate_dtp_update(pDM_Odm);
|
|
}
|
|
else
|
|
{
|
|
if( pDM_PathDiv->dtp_state == PHYDM_DTP_INIT)
|
|
{
|
|
phydm_find_default_path(pDM_Odm);
|
|
phydm_candidate_dtp_update(pDM_Odm);
|
|
pDM_PathDiv->dtp_state = PHYDM_DTP_RUNNING_1;
|
|
}
|
|
|
|
else if( pDM_PathDiv->dtp_state == PHYDM_DTP_RUNNING_1)
|
|
{
|
|
pDM_PathDiv->dtp_check_patha_counter++;
|
|
|
|
if(pDM_PathDiv->dtp_check_patha_counter>=NUM_RESET_DTP_PERIOD)
|
|
{
|
|
pDM_PathDiv->dtp_check_patha_counter=0;
|
|
pDM_PathDiv->dtp_state = PHYDM_DTP_INIT;
|
|
}
|
|
//2 Search space update
|
|
else
|
|
{
|
|
// 1. find the worst candidate
|
|
|
|
|
|
// 2. repalce the worst candidate
|
|
}
|
|
}
|
|
}
|
|
|
|
//2 Dynamic Path Selection H2C
|
|
|
|
if(pDM_PathDiv->num_candidate == 1)
|
|
{
|
|
return;
|
|
}
|
|
else
|
|
{
|
|
H2C_Parameter[0] = pDM_PathDiv->num_candidate;
|
|
H2C_Parameter[1] = pDM_PathDiv->num_tx_path;
|
|
H2C_Parameter[2] = pDM_PathDiv->ant_candidate_1;
|
|
H2C_Parameter[3] = pDM_PathDiv->ant_candidate_2;
|
|
H2C_Parameter[4] = pDM_PathDiv->ant_candidate_3;
|
|
|
|
ODM_FillH2CCmd(pDM_Odm, PHYDM_H2C_DYNAMIC_TX_PATH, 6, H2C_Parameter);
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
VOID
|
|
phydm_dynamic_tx_path_init(
|
|
IN PVOID pDM_VOID
|
|
)
|
|
{
|
|
PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
|
|
pPATHDIV_T pDM_PathDiv = &(pDM_Odm->DM_PathDiv);
|
|
PADAPTER pAdapter = pDM_Odm->Adapter;
|
|
#if ((DM_ODM_SUPPORT_TYPE == ODM_WIN) && USB_SWITCH_SUPPORT)
|
|
USB_MODE_MECH *pUsbModeMech = &pAdapter->UsbModeMechanism;
|
|
#endif
|
|
u1Byte search_space_2[NUM_CHOOSE2_FROM4]= {PHYDM_AB, PHYDM_AC, PHYDM_AD, PHYDM_BC, PHYDM_BD, PHYDM_CD };
|
|
u1Byte search_space_3[NUM_CHOOSE3_FROM4]= {PHYDM_BCD, PHYDM_ACD, PHYDM_ABD, PHYDM_ABC};
|
|
|
|
#if ((DM_ODM_SUPPORT_TYPE == ODM_WIN) && USB_SWITCH_SUPPORT)
|
|
pDM_PathDiv->is_u3_mode = (pUsbModeMech->CurUsbMode==USB_MODE_U3)? 1 : 0 ;
|
|
#else
|
|
pDM_PathDiv->is_u3_mode = 1;
|
|
#endif
|
|
ODM_RT_TRACE(pDM_Odm, ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("Dynamic TX Path Init 8814\n"));
|
|
ODM_RT_TRACE(pDM_Odm, ODM_COMP_PATH_DIV, ODM_DBG_LOUD, ("is_u3_mode = (( %d ))\n", pDM_PathDiv->is_u3_mode));
|
|
|
|
memcpy(&(pDM_PathDiv->search_space_2[0]), &(search_space_2[0]), NUM_CHOOSE2_FROM4);
|
|
memcpy(&(pDM_PathDiv->search_space_3[0]), &(search_space_3[0]), NUM_CHOOSE3_FROM4);
|
|
|
|
pDM_PathDiv->use_path_a_as_default_ant= 1;
|
|
pDM_PathDiv->dtp_state = PHYDM_DTP_INIT;
|
|
pDM_Odm->path_select = PHYDM_AUTO_PATH;
|
|
pDM_PathDiv->path_div_type = PHYDM_4R_PATH_DIV;
|
|
|
|
|
|
if(pDM_PathDiv->is_u3_mode )
|
|
{
|
|
pDM_PathDiv->num_tx_path=3;
|
|
phydm_dtp_fix_tx_path(pDM_Odm, PHYDM_BCD);/* 3TX Set Init TX Path*/
|
|
|
|
}
|
|
else
|
|
{
|
|
pDM_PathDiv->num_tx_path=2;
|
|
phydm_dtp_fix_tx_path(pDM_Odm, PHYDM_BC);/* 2TX // Set Init TX Path*/
|
|
}
|
|
|
|
}
|
|
|
|
|
|
VOID
|
|
phydm_process_rssi_for_path_div(
|
|
IN OUT PVOID pDM_VOID,
|
|
IN PVOID p_phy_info_void,
|
|
IN PVOID p_pkt_info_void
|
|
)
|
|
{
|
|
PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
|
|
PODM_PHY_INFO_T pPhyInfo=(PODM_PHY_INFO_T)p_phy_info_void;
|
|
PODM_PACKET_INFO_T pPktinfo=(PODM_PACKET_INFO_T)p_pkt_info_void;
|
|
pPATHDIV_T pDM_PathDiv = &(pDM_Odm->DM_PathDiv);
|
|
|
|
if(pPktinfo->bPacketToSelf || pPktinfo->bPacketMatchBSSID)
|
|
{
|
|
if(pPktinfo->DataRate > ODM_RATE11M)
|
|
{
|
|
if(pDM_PathDiv->path_div_type == PHYDM_4R_PATH_DIV)
|
|
{
|
|
#if RTL8814A_SUPPORT
|
|
if(pDM_Odm->SupportICType & ODM_RTL8814A)
|
|
{
|
|
pDM_PathDiv->path_a_sum_all+=pPhyInfo->RxMIMOSignalStrength[0];
|
|
pDM_PathDiv->path_a_cnt_all++;
|
|
|
|
pDM_PathDiv->path_b_sum_all+=pPhyInfo->RxMIMOSignalStrength[1];
|
|
pDM_PathDiv->path_b_cnt_all++;
|
|
|
|
pDM_PathDiv->path_c_sum_all+=pPhyInfo->RxMIMOSignalStrength[2];
|
|
pDM_PathDiv->path_c_cnt_all++;
|
|
|
|
pDM_PathDiv->path_d_sum_all+=pPhyInfo->RxMIMOSignalStrength[3];
|
|
pDM_PathDiv->path_d_cnt_all++;
|
|
}
|
|
#endif
|
|
}
|
|
else
|
|
{
|
|
pDM_PathDiv->PathA_Sum[pPktinfo->StationID]+=pPhyInfo->RxMIMOSignalStrength[0];
|
|
pDM_PathDiv->PathA_Cnt[pPktinfo->StationID]++;
|
|
|
|
pDM_PathDiv->PathB_Sum[pPktinfo->StationID]+=pPhyInfo->RxMIMOSignalStrength[1];
|
|
pDM_PathDiv->PathB_Cnt[pPktinfo->StationID]++;
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
}
|
|
|
|
#endif //#if RTL8814A_SUPPORT
|
|
|
|
VOID
|
|
odm_pathdiv_debug(
|
|
IN PVOID pDM_VOID,
|
|
IN u4Byte *const dm_value,
|
|
IN u4Byte *_used,
|
|
OUT char *output,
|
|
IN u4Byte *_out_len
|
|
)
|
|
{
|
|
PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
|
|
pPATHDIV_T pDM_PathDiv = &(pDM_Odm->DM_PathDiv);
|
|
u4Byte used = *_used;
|
|
u4Byte out_len = *_out_len;
|
|
|
|
pDM_Odm->path_select = (dm_value[0] & 0xf);
|
|
PHYDM_SNPRINTF((output+used, out_len-used,"Path_select = (( 0x%x ))\n",pDM_Odm->path_select ));
|
|
|
|
//2 [Fix Path]
|
|
if (pDM_Odm->path_select != PHYDM_AUTO_PATH)
|
|
{
|
|
PHYDM_SNPRINTF((output+used, out_len-used,"Trun on path [%s%s%s%s]\n",
|
|
((pDM_Odm->path_select) & 0x1)?"A":"",
|
|
((pDM_Odm->path_select) & 0x2)?"B":"",
|
|
((pDM_Odm->path_select) & 0x4)?"C":"",
|
|
((pDM_Odm->path_select) & 0x8)?"D":"" ));
|
|
|
|
phydm_dtp_fix_tx_path( pDM_Odm, pDM_Odm->path_select );
|
|
}
|
|
else
|
|
{
|
|
PHYDM_SNPRINTF((output+used, out_len-used,"%s\n","Auto Path"));
|
|
}
|
|
}
|
|
|
|
#endif // #if(defined(CONFIG_PATH_DIVERSITY))
|
|
|
|
VOID
|
|
phydm_c2h_dtp_handler(
|
|
IN PVOID pDM_VOID,
|
|
IN pu1Byte CmdBuf,
|
|
IN u1Byte CmdLen
|
|
)
|
|
{
|
|
#if(defined(CONFIG_PATH_DIVERSITY))
|
|
PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
|
|
pPATHDIV_T pDM_PathDiv = &(pDM_Odm->DM_PathDiv);
|
|
|
|
u1Byte macid = CmdBuf[0];
|
|
u1Byte target = CmdBuf[1];
|
|
u1Byte nsc_1 = CmdBuf[2];
|
|
u1Byte nsc_2 = CmdBuf[3];
|
|
u1Byte nsc_3 = CmdBuf[4];
|
|
|
|
ODM_RT_TRACE(pDM_Odm, ODM_COMP_PATH_DIV,ODM_DBG_LOUD,("Target_candidate = (( %d ))\n", target));
|
|
/*
|
|
if( (nsc_1 >= nsc_2) && (nsc_1 >= nsc_3))
|
|
{
|
|
phydm_dtp_fix_tx_path(pDM_Odm, pDM_PathDiv->ant_candidate_1);
|
|
}
|
|
else if( nsc_2 >= nsc_3)
|
|
{
|
|
phydm_dtp_fix_tx_path(pDM_Odm, pDM_PathDiv->ant_candidate_2);
|
|
}
|
|
else
|
|
{
|
|
phydm_dtp_fix_tx_path(pDM_Odm, pDM_PathDiv->ant_candidate_3);
|
|
}
|
|
*/
|
|
#endif
|
|
}
|
|
|
|
VOID
|
|
odm_PathDiversity(
|
|
IN PVOID pDM_VOID
|
|
)
|
|
{
|
|
#if(defined(CONFIG_PATH_DIVERSITY))
|
|
PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
|
|
if(!(pDM_Odm->SupportAbility & ODM_BB_PATH_DIV))
|
|
{
|
|
ODM_RT_TRACE(pDM_Odm, ODM_COMP_PATH_DIV,ODM_DBG_LOUD,("Return: Not Support PathDiv\n"));
|
|
return;
|
|
}
|
|
|
|
#if RTL8812A_SUPPORT
|
|
|
|
if(pDM_Odm->SupportICType & ODM_RTL8812)
|
|
ODM_PathDiversity_8812A(pDM_Odm);
|
|
else
|
|
#endif
|
|
|
|
#if RTL8814A_SUPPORT
|
|
if(pDM_Odm->SupportICType & ODM_RTL8814A)
|
|
phydm_dynamic_tx_path(pDM_Odm);
|
|
else
|
|
#endif
|
|
{}
|
|
#endif
|
|
}
|
|
|
|
VOID
|
|
odm_PathDiversityInit(
|
|
IN PVOID pDM_VOID
|
|
)
|
|
{
|
|
#if(defined(CONFIG_PATH_DIVERSITY))
|
|
PDM_ODM_T pDM_Odm = (PDM_ODM_T)pDM_VOID;
|
|
|
|
/*pDM_Odm->SupportAbility |= ODM_BB_PATH_DIV;*/
|
|
|
|
if(pDM_Odm->mp_mode == TRUE)
|
|
return;
|
|
|
|
if(!(pDM_Odm->SupportAbility & ODM_BB_PATH_DIV))
|
|
{
|
|
ODM_RT_TRACE(pDM_Odm, ODM_COMP_PATH_DIV,ODM_DBG_LOUD,("Return: Not Support PathDiv\n"));
|
|
return;
|
|
}
|
|
|
|
#if RTL8812A_SUPPORT
|
|
if(pDM_Odm->SupportICType & ODM_RTL8812)
|
|
ODM_PathDiversityInit_8812A(pDM_Odm);
|
|
else
|
|
#endif
|
|
|
|
#if RTL8814A_SUPPORT
|
|
if(pDM_Odm->SupportICType & ODM_RTL8814A)
|
|
phydm_dynamic_tx_path_init(pDM_Odm);
|
|
else
|
|
#endif
|
|
{}
|
|
#endif
|
|
}
|
|
|
|
|
|
|
|
#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
|
|
//
|
|
// 2011/12/02 MH Copy from MP oursrc for temporarily test.
|
|
//
|
|
|
|
VOID
|
|
odm_PathDivChkAntSwitchCallback(
|
|
PRT_TIMER pTimer
|
|
)
|
|
{
|
|
}
|
|
|
|
VOID
|
|
odm_PathDivChkAntSwitchWorkitemCallback(
|
|
IN PVOID pContext
|
|
)
|
|
{
|
|
}
|
|
|
|
VOID
|
|
odm_CCKTXPathDiversityCallback(
|
|
PRT_TIMER pTimer
|
|
)
|
|
{
|
|
}
|
|
|
|
VOID
|
|
odm_CCKTXPathDiversityWorkItemCallback(
|
|
IN PVOID pContext
|
|
)
|
|
{
|
|
}
|
|
u1Byte
|
|
odm_SwAntDivSelectScanChnl(
|
|
IN PADAPTER Adapter
|
|
)
|
|
{
|
|
return 0;
|
|
}
|
|
VOID
|
|
odm_SwAntDivConstructScanChnl(
|
|
IN PADAPTER Adapter,
|
|
IN u1Byte ScanChnl
|
|
)
|
|
{
|
|
}
|
|
|
|
#endif // #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)
|
|
|