hc
2023-11-06 15ade055295d13f95d49e3d99b09f3bbfb4a43e7
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
/******************************************************************************
 *
 * 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"
 
VOID 
odm_DynamicBBPowerSavingInit(
   IN        PVOID                    pDM_VOID
   )
{
   PDM_ODM_T        pDM_Odm = (PDM_ODM_T)pDM_VOID;
   pPS_T    pDM_PSTable = &pDM_Odm->DM_PSTable;
 
   pDM_PSTable->PreCCAState = CCA_MAX;
   pDM_PSTable->CurCCAState = CCA_MAX;
   pDM_PSTable->PreRFState = RF_MAX;
   pDM_PSTable->CurRFState = RF_MAX;
   pDM_PSTable->Rssi_val_min = 0;
   pDM_PSTable->initialize = 0;
}
 
void
ODM_RF_Saving(
   IN        PVOID                    pDM_VOID,
   IN    u1Byte        bForceInNormal 
   )
{
   PDM_ODM_T        pDM_Odm = (PDM_ODM_T)pDM_VOID;
#if (DM_ODM_SUPPORT_TYPE != ODM_AP)
   pPS_T    pDM_PSTable = &pDM_Odm->DM_PSTable;
   u1Byte    Rssi_Up_bound = 30 ;
   u1Byte    Rssi_Low_bound = 25;
#if (DM_ODM_SUPPORT_TYPE == ODM_CE)
   if(pDM_Odm->PatchID == 40 ) //RT_CID_819x_FUNAI_TV
   {
       Rssi_Up_bound = 50 ;
       Rssi_Low_bound = 45;
   }
#endif
   if(pDM_PSTable->initialize == 0){
       
       pDM_PSTable->Reg874 = (ODM_GetBBReg(pDM_Odm, 0x874, bMaskDWord)&0x1CC000)>>14;
       pDM_PSTable->RegC70 = (ODM_GetBBReg(pDM_Odm, 0xc70, bMaskDWord)&BIT3)>>3;
       pDM_PSTable->Reg85C = (ODM_GetBBReg(pDM_Odm, 0x85c, bMaskDWord)&0xFF000000)>>24;
       pDM_PSTable->RegA74 = (ODM_GetBBReg(pDM_Odm, 0xa74, bMaskDWord)&0xF000)>>12;
       //Reg818 = PHY_QueryBBReg(pAdapter, 0x818, bMaskDWord);
       pDM_PSTable->initialize = 1;
   }
 
   if(!bForceInNormal)
   {
       if(pDM_Odm->RSSI_Min != 0xFF)
       {             
           if(pDM_PSTable->PreRFState == RF_Normal)
           {
               if(pDM_Odm->RSSI_Min >= Rssi_Up_bound)
                   pDM_PSTable->CurRFState = RF_Save;
               else
                   pDM_PSTable->CurRFState = RF_Normal;
           }
           else{
               if(pDM_Odm->RSSI_Min <= Rssi_Low_bound)
                   pDM_PSTable->CurRFState = RF_Normal;
               else
                   pDM_PSTable->CurRFState = RF_Save;
           }
       }
       else
           pDM_PSTable->CurRFState=RF_MAX;
   }
   else
   {
       pDM_PSTable->CurRFState = RF_Normal;
   }
   
   if(pDM_PSTable->PreRFState != pDM_PSTable->CurRFState)
   {
       if(pDM_PSTable->CurRFState == RF_Save)
       {
           ODM_SetBBReg(pDM_Odm, 0x874  , 0x1C0000, 0x2); //Reg874[20:18]=3'b010
           ODM_SetBBReg(pDM_Odm, 0xc70, BIT3, 0); //RegC70[3]=1'b0
           ODM_SetBBReg(pDM_Odm, 0x85c, 0xFF000000, 0x63); //Reg85C[31:24]=0x63
           ODM_SetBBReg(pDM_Odm, 0x874, 0xC000, 0x2); //Reg874[15:14]=2'b10
           ODM_SetBBReg(pDM_Odm, 0xa74, 0xF000, 0x3); //RegA75[7:4]=0x3
           ODM_SetBBReg(pDM_Odm, 0x818, BIT28, 0x0); //Reg818[28]=1'b0
           ODM_SetBBReg(pDM_Odm, 0x818, BIT28, 0x1); //Reg818[28]=1'b1
       }
       else
       {
           ODM_SetBBReg(pDM_Odm, 0x874  , 0x1CC000, pDM_PSTable->Reg874); 
           ODM_SetBBReg(pDM_Odm, 0xc70, BIT3, pDM_PSTable->RegC70); 
           ODM_SetBBReg(pDM_Odm, 0x85c, 0xFF000000, pDM_PSTable->Reg85C);
           ODM_SetBBReg(pDM_Odm, 0xa74, 0xF000, pDM_PSTable->RegA74); 
           ODM_SetBBReg(pDM_Odm,0x818, BIT28, 0x0);  
       }
       pDM_PSTable->PreRFState =pDM_PSTable->CurRFState;
   }
#endif    
}