ARM64: DTS: Add rk3399-firefly uart4 device, node as /dev/ttyS1
[firefly-linux-kernel-4.4.55.git] / drivers / net / wireless / rockchip_wlan / rtl8723bu / hal / OUTSRC / phydm_RaInfo.c
1 /******************************************************************************\r
2  *\r
3  * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.\r
4  *\r
5  * This program is free software; you can redistribute it and/or modify it\r
6  * under the terms of version 2 of the GNU General Public License as\r
7  * published by the Free Software Foundation.\r
8  *\r
9  * This program is distributed in the hope that it will be useful, but WITHOUT\r
10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\r
11  * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for\r
12  * more details.\r
13  *\r
14  * You should have received a copy of the GNU General Public License along with\r
15  * this program; if not, write to the Free Software Foundation, Inc.,\r
16  * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA\r
17  *\r
18  *\r
19  ******************************************************************************/\r
20 \r
21 //============================================================\r
22 // include files\r
23 //============================================================\r
24 #include "Mp_Precomp.h"\r
25 #include "phydm_precomp.h"\r
26 \r
27 #if (defined(CONFIG_RA_DBG_CMD))\r
28 VOID\r
29 ODM_C2HRaParaReportHandler(\r
30         IN      PVOID   pDM_VOID,\r
31         IN pu1Byte   CmdBuf,\r
32         IN u1Byte   CmdLen\r
33 )\r
34 {\r
35         PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
36         pRA_T               pRA_Table = &pDM_Odm->DM_RA_Table;\r
37 \r
38         u1Byte  para_idx = CmdBuf[0]; //Retry Penalty, NH, NL\r
39         u1Byte  RateTypeStart = CmdBuf[1];\r
40         u1Byte  RateTypeLength = CmdLen - 2;\r
41         u1Byte  i;\r
42 \r
43         ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_RA_DBG, ODM_DBG_LOUD, ("[ From FW C2H RA Para ]  CmdBuf[0]= (( %d ))\n", CmdBuf[0]));\r
44 \r
45         if (para_idx == RADBG_RTY_PENALTY) {\r
46                 ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_RA_DBG, ODM_DBG_LOUD, (" |Rate Index|   |RTY Penality Index| \n"));\r
47 \r
48                 for (i = 0 ; i < (RateTypeLength) ; i++) {\r
49                         if (pRA_Table->is_ra_dbg_init)\r
50                                 pRA_Table->RTY_P_default[RateTypeStart + i] = CmdBuf[2 + i];\r
51 \r
52                         pRA_Table->RTY_P[RateTypeStart + i] = CmdBuf[2 + i];\r
53                         ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_RA_DBG, ODM_DBG_LOUD, ("%8d  %15d \n", (RateTypeStart + i), pRA_Table->RTY_P[RateTypeStart + i]));\r
54                 }\r
55 \r
56         } else  if (para_idx == RADBG_N_HIGH) {\r
57                 ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_RA_DBG, ODM_DBG_LOUD, (" |Rate Index|    |N-High| \n"));\r
58 \r
59 \r
60         } else  if (para_idx == RADBG_N_LOW){\r
61                 ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_RA_DBG, ODM_DBG_LOUD, (" |Rate Index|   |N-Low| \n"));\r
62 \r
63         }\r
64         else     if (para_idx == RADBG_RATE_UP_RTY_RATIO) {\r
65                 ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_RA_DBG, ODM_DBG_LOUD, (" |Rate Index|   |Rate Up RTY Ratio| \n"));\r
66 \r
67                 for (i = 0 ; i < (RateTypeLength) ; i++) {\r
68                         if (pRA_Table->is_ra_dbg_init)\r
69                                 pRA_Table->RATE_UP_RTY_RATIO_default[RateTypeStart + i] = CmdBuf[2 + i];\r
70 \r
71                         pRA_Table->RATE_UP_RTY_RATIO[RateTypeStart + i] = CmdBuf[2 + i];\r
72                         ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_RA_DBG, ODM_DBG_LOUD, ("%8d  %15d \n", (RateTypeStart + i), pRA_Table->RATE_UP_RTY_RATIO[RateTypeStart + i]));\r
73                 }\r
74         } else   if (para_idx == RADBG_RATE_DOWN_RTY_RATIO) {\r
75                 ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_RA_DBG, ODM_DBG_LOUD, (" |Rate Index|   |Rate Down RTY Ratio| \n"));\r
76 \r
77                 for (i = 0 ; i < (RateTypeLength) ; i++) {\r
78                         if (pRA_Table->is_ra_dbg_init)\r
79                                 pRA_Table->RATE_DOWN_RTY_RATIO_default[RateTypeStart + i] = CmdBuf[2 + i];\r
80 \r
81                         pRA_Table->RATE_DOWN_RTY_RATIO[RateTypeStart + i] = CmdBuf[2 + i];\r
82                         ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_RA_DBG, ODM_DBG_LOUD, ("%8d  %15d \n", (RateTypeStart + i), pRA_Table->RATE_DOWN_RTY_RATIO[RateTypeStart + i]));\r
83                 }\r
84         } else   if (para_idx == RADBG_DEBUG_MONITOR1) {\r
85                 ODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, ("-------------------------------\n"));\r
86                 if (pDM_Odm->SupportICType & PHYDM_IC_3081_SERIES) {\r
87 \r
88                         ODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, ("%5s  %d \n", "RSSI =", CmdBuf[1]));\r
89                         ODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, ("%5s  0x%x \n", "Rate =", CmdBuf[2] & 0x7f));\r
90                         ODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, ("%5s  %d \n", "SGI =", (CmdBuf[2] & 0x80) >> 7));\r
91                         ODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, ("%5s  %d \n", "BW =", CmdBuf[3]));\r
92                         ODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, ("%5s  %d \n", "BW_max =", CmdBuf[4]));\r
93                         ODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, ("%5s  0x%x \n", "multi_rate0 =", CmdBuf[5]));\r
94                         ODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, ("%5s  0x%x \n", "multi_rate1 =", CmdBuf[6]));\r
95                         ODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, ("%5s  %d \n", "DISRA =",       CmdBuf[7]));\r
96                         ODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, ("%5s  %d \n", "VHT_EN =", CmdBuf[8]));\r
97                         ODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, ("%5s  %d \n", "SGI_support =", CmdBuf[9]));\r
98                         ODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, ("%5s  %d \n", "try_ness =", CmdBuf[10]));\r
99                         ODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, ("%5s  0x%x \n", "pre_rate =", CmdBuf[11]));\r
100                 } else {\r
101                         ODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, ("%5s  %d \n", "RSSI =", CmdBuf[1]));\r
102                         ODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, ("%5s  %x \n", "BW =", CmdBuf[2]));\r
103                         ODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, ("%5s  %d \n", "DISRA =", CmdBuf[3]));\r
104                         ODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, ("%5s  %d \n", "VHT_EN =", CmdBuf[4]));\r
105                         ODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, ("%5s  %d \n", "Hightest Rate =", CmdBuf[5]));\r
106                         ODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, ("%5s  0x%x \n", "Lowest Rate =", CmdBuf[6]));\r
107                         ODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, ("%5s  0x%x \n", "SGI_support =", CmdBuf[7]));\r
108                         ODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, ("%5s  %d \n", "Rate_ID =",     CmdBuf[8]));;\r
109                 }\r
110                 ODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, ("-------------------------------\n"));\r
111         } else   if (para_idx == RADBG_DEBUG_MONITOR2) {\r
112                 ODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, ("-------------------------------\n"));\r
113                 if (pDM_Odm->SupportICType & PHYDM_IC_3081_SERIES) {\r
114                         ODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, ("%5s  %d \n", "RateID =", CmdBuf[1]));\r
115                         ODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, ("%5s  0x%x \n", "highest_rate =", CmdBuf[2]));\r
116                         ODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, ("%5s  0x%x \n", "lowest_rate =", CmdBuf[3]));\r
117 \r
118                         for (i = 4 ; i <= 11 ; i++)\r
119                                 ODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, ("RAMASK =  0x%x \n", CmdBuf[i]));\r
120                 } else {\r
121                         ODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, ("%5s  %x%x  %x%x  %x%x  %x%x \n", "RA Mask:",\r
122                                                  CmdBuf[8], CmdBuf[7], CmdBuf[6], CmdBuf[5], CmdBuf[4], CmdBuf[3], CmdBuf[2], CmdBuf[1]));\r
123                 }\r
124                 ODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, ("-------------------------------\n"));\r
125         } else   if (para_idx == RADBG_DEBUG_MONITOR3) {\r
126 \r
127                 for (i = 0 ; i < (CmdLen - 1) ; i++)\r
128                         ODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, ("content[%d] =  %d \n", i, CmdBuf[1 + i]));\r
129         } else   if (para_idx == RADBG_DEBUG_MONITOR4)\r
130                 ODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, ("%5s  {%d.%d} \n", "RA Version =", CmdBuf[1], CmdBuf[2]));\r
131 \r
132 }\r
133 \r
134 VOID\r
135 odm_RA_ParaAdjust_Send_H2C(\r
136         IN      PVOID   pDM_VOID\r
137 )\r
138 {\r
139 \r
140         PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
141         pRA_T                   pRA_Table = &pDM_Odm->DM_RA_Table;\r
142         u1Byte                  H2C_Parameter[6] = {0};\r
143 \r
144         H2C_Parameter[0] =  RA_FIRST_MACID;\r
145 \r
146         //ODM_RT_TRACE(pDM_Odm,PHYDM_COMP_RA_DBG, ODM_DBG_LOUD, ("RA_Para_feedback_req= (( %d ))  \n",pRA_Table->RA_Para_feedback_req ));\r
147         if (pRA_Table->RA_Para_feedback_req) { //H2C_Parameter[5]=1 ; ask FW for all RA parameters\r
148                 ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_RA_DBG, ODM_DBG_LOUD, ("[H2C] Ask FW for RA parameter \n"));\r
149                 H2C_Parameter[5] |= BIT1; //ask FW to report RA parameters\r
150                 H2C_Parameter[1] =  pRA_Table->para_idx; //pRA_Table->para_idx;\r
151                 pRA_Table->RA_Para_feedback_req = 0;\r
152         } else {\r
153                 ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_RA_DBG, ODM_DBG_LOUD, ("[H2C] Send H2C to FW for modifying RA parameter \n"));\r
154 \r
155                 H2C_Parameter[1] =  pRA_Table->para_idx;\r
156                 H2C_Parameter[2] =  pRA_Table->rate_idx;\r
157                 //1 [8 bit]\r
158                 if (pRA_Table->para_idx == RADBG_RTY_PENALTY || pRA_Table->para_idx == RADBG_RATE_UP_RTY_RATIO || pRA_Table->para_idx == RADBG_RATE_DOWN_RTY_RATIO) {\r
159                         H2C_Parameter[3] = pRA_Table->value;\r
160                         H2C_Parameter[4] = 0;\r
161                 }\r
162                 //1 [16 bit]\r
163                 else { //if ((pRA_Table->rate_idx==RADBG_N_HIGH)||(pRA_Table->rate_idx==RADBG_N_LOW))\r
164                         H2C_Parameter[3] = (u1Byte)(((pRA_Table->value_16) & 0xf0) >> 4); //byte1\r
165                         H2C_Parameter[4] = (u1Byte)((pRA_Table->value_16) & 0x0f);         //byte0\r
166                 }\r
167         }\r
168         ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_RA_DBG, ODM_DBG_LOUD, (" H2C_Parameter[1] = 0x%x  \n", H2C_Parameter[1]));\r
169         ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_RA_DBG, ODM_DBG_LOUD, (" H2C_Parameter[2] = 0x%x  \n", H2C_Parameter[2]));\r
170         ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_RA_DBG, ODM_DBG_LOUD, (" H2C_Parameter[3] = 0x%x  \n", H2C_Parameter[3]));\r
171         ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_RA_DBG, ODM_DBG_LOUD, (" H2C_Parameter[4] = 0x%x  \n", H2C_Parameter[4]));\r
172         ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_RA_DBG, ODM_DBG_LOUD, (" H2C_Parameter[5] = 0x%x  \n", H2C_Parameter[5]));\r
173 \r
174         ODM_FillH2CCmd(pDM_Odm, ODM_H2C_RA_PARA_ADJUST, 6, H2C_Parameter);\r
175 \r
176 }\r
177 \r
178 \r
179 VOID\r
180 odm_RA_ParaAdjust(\r
181         IN              PVOID           pDM_VOID\r
182 )\r
183 {\r
184         PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
185         pRA_T                   pRA_Table = &pDM_Odm->DM_RA_Table;\r
186         u1Byte                  para_idx = pRA_Table->para_idx;\r
187         u1Byte                  rate_idx = pRA_Table->rate_idx;\r
188         u1Byte                  value = pRA_Table->value;\r
189         u1Byte                  Pre_value = 0xff;\r
190 \r
191         u1Byte                  temp_idx;\r
192         BOOLEAN                 sign = 0;\r
193 \r
194         if (pRA_Table->para_idx == RADBG_RTY_PENALTY) {\r
195                 Pre_value = pRA_Table->RTY_P[rate_idx];\r
196                 pRA_Table->RTY_P[rate_idx] = value;\r
197                 pRA_Table->RTY_P_modify_note[rate_idx] = 1;\r
198         } else  if (pRA_Table->para_idx == RADBG_N_HIGH) {\r
199 \r
200         } else  if (pRA_Table->para_idx == RADBG_N_LOW) {\r
201 \r
202         } else   if (pRA_Table->para_idx == RADBG_RATE_UP_RTY_RATIO) {\r
203                 Pre_value = pRA_Table->RATE_UP_RTY_RATIO[rate_idx];\r
204                 pRA_Table->RATE_UP_RTY_RATIO[rate_idx] = value;\r
205                 pRA_Table->RATE_UP_RTY_RATIO_modify_note[rate_idx] = 1;\r
206         } else   if (pRA_Table->para_idx == RADBG_RATE_DOWN_RTY_RATIO) {\r
207                 Pre_value = pRA_Table->RATE_DOWN_RTY_RATIO[rate_idx];\r
208                 pRA_Table->RATE_DOWN_RTY_RATIO[rate_idx] = value;\r
209                 pRA_Table->RATE_DOWN_RTY_RATIO_modify_note[rate_idx] = 1;\r
210         }\r
211         ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_RA_DBG, ODM_DBG_LOUD, ("  Change RA Papa[%d], Rate[ %d ],   ((%d))  ->  ((%d)) \n", pRA_Table->para_idx, rate_idx, Pre_value, value));\r
212         odm_RA_ParaAdjust_Send_H2C(pDM_Odm);\r
213 }\r
214 \r
215 \r
216 VOID\r
217 phydm_ra_print_msg(\r
218         IN              PVOID           pDM_VOID,\r
219         IN              u1Byte          *value,\r
220         IN              u1Byte          *value_default,\r
221         IN              u1Byte          *modify_note\r
222 )\r
223 {\r
224         PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
225         pRA_T                   pRA_Table = &pDM_Odm->DM_RA_Table;\r
226         u4Byte i;\r
227 \r
228         ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_RA_DBG, ODM_DBG_LOUD, (" |Rate index| |Current-value| |Default-value| |Modify?| \n"));\r
229         for (i = 0 ; i <= (pRA_Table->rate_length); i++) {\r
230 #if(DM_ODM_SUPPORT_TYPE & (ODM_WIN))\r
231                 ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_RA_DBG, ODM_DBG_LOUD, ("     [ %d ]  %20d  %25d  %20s \n", i, value[i], value_default[i], ((modify_note[i] == 1) ? "V" : " .  ")));\r
232 #else\r
233                 ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_RA_DBG, ODM_DBG_LOUD, ("     [ %d ]  %10d  %14d  %14s \n", i, value[i], value_default[i], ((modify_note[i] == 1) ? "V" : " .  ")));\r
234 #endif\r
235         }\r
236 \r
237 }\r
238 \r
239 VOID\r
240 odm_RA_debug(\r
241         IN              PVOID           pDM_VOID,\r
242         IN              u4Byte          *const dm_value\r
243 )\r
244 {\r
245         PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
246         pRA_T                   pRA_Table = &pDM_Odm->DM_RA_Table;\r
247         u4Byte i;\r
248 \r
249         pRA_Table->is_ra_dbg_init = FALSE;\r
250 \r
251         if (dm_value[0] == 100) { /*1 Print RA Parameters*/\r
252                 u1Byte  default_pointer_value;\r
253                 u1Byte  *pvalue;\r
254                 u1Byte  *pvalue_default;\r
255                 u1Byte  *pmodify_note;\r
256 \r
257                 pvalue = pvalue_default = pmodify_note = &default_pointer_value;\r
258 \r
259                 ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_RA_DBG, ODM_DBG_LOUD, ("\n------------------------------------------------------------------------------------\n"));\r
260 \r
261                 if (dm_value[1] == RADBG_RTY_PENALTY) { /* [1]*/\r
262                         ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_RA_DBG, ODM_DBG_LOUD, (" [1] RTY_PENALTY \n"));\r
263                         pvalue          =       &(pRA_Table->RTY_P[0]);\r
264                         pvalue_default  =       &(pRA_Table->RTY_P_default[0]);\r
265                         pmodify_note    =       &(pRA_Table->RTY_P_modify_note[0]);\r
266                 } else if (dm_value[1] == RADBG_N_HIGH) { /* [2]*/\r
267                         ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_RA_DBG, ODM_DBG_LOUD, (" [2] N_HIGH \n"));\r
268 \r
269                 } else if (dm_value[1] == RADBG_N_LOW) { /*[3]*/\r
270                         ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_RA_DBG, ODM_DBG_LOUD, (" [3] N_LOW \n"));\r
271 \r
272                 } else if (dm_value[1] == RADBG_RATE_UP_RTY_RATIO) { /* [8]*/\r
273                         ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_RA_DBG, ODM_DBG_LOUD, (" [8] RATE_UP_RTY_RATIO \n"));\r
274                         pvalue          =       &(pRA_Table->RATE_UP_RTY_RATIO[0]);\r
275                         pvalue_default  =       &(pRA_Table->RATE_UP_RTY_RATIO_default[0]);\r
276                         pmodify_note    =       &(pRA_Table->RATE_UP_RTY_RATIO_modify_note[0]);\r
277                 } else if (dm_value[1] == RADBG_RATE_DOWN_RTY_RATIO) { /* [9]*/\r
278                         ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_RA_DBG, ODM_DBG_LOUD, (" [9] RATE_DOWN_RTY_RATIO \n"));\r
279                         pvalue          =       &(pRA_Table->RATE_DOWN_RTY_RATIO[0]);\r
280                         pvalue_default  =       &(pRA_Table->RATE_DOWN_RTY_RATIO_default[0]);\r
281                         pmodify_note    =       &(pRA_Table->RATE_DOWN_RTY_RATIO_modify_note[0]);\r
282                 }\r
283 \r
284                 phydm_ra_print_msg(pDM_Odm, pvalue, pvalue_default, pmodify_note);\r
285                 ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_RA_DBG, ODM_DBG_LOUD, ("\n------------------------------------------------------------------------------------\n\n"));\r
286 \r
287         } else if (dm_value[0] == 101) {\r
288                 pRA_Table->para_idx = (u1Byte)dm_value[1];\r
289 \r
290                 pRA_Table->RA_Para_feedback_req = 1;\r
291                 odm_RA_ParaAdjust_Send_H2C(pDM_Odm);\r
292         } else {\r
293                 pRA_Table->para_idx = (u1Byte)dm_value[0];\r
294                 pRA_Table->rate_idx  = (u1Byte)dm_value[1];\r
295                 pRA_Table->value = (u1Byte)dm_value[2];\r
296 \r
297                 odm_RA_ParaAdjust(pDM_Odm);\r
298         }\r
299 \r
300 }\r
301 \r
302 VOID\r
303 odm_RA_ParaAdjust_init(\r
304         IN              PVOID           pDM_VOID\r
305 )\r
306 {\r
307         PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
308         pRA_T                   pRA_Table = &pDM_Odm->DM_RA_Table;\r
309         u1Byte                  i;\r
310         u1Byte                  ra_para_pool_u8[3] = { RADBG_RTY_PENALTY,  RADBG_RATE_UP_RTY_RATIO, RADBG_RATE_DOWN_RTY_RATIO};\r
311         /*\r
312                 RTY_PENALTY             =       1,  //u8\r
313                 N_HIGH                          =       2,\r
314                 N_LOW                           =       3,\r
315                 RATE_UP_TABLE           =       4,\r
316                 RATE_DOWN_TABLE =       5,\r
317                 TRYING_NECESSARY        =       6,\r
318                 DROPING_NECESSARY =     7,\r
319                 RATE_UP_RTY_RATIO       =       8, //u8\r
320                 RATE_DOWN_RTY_RATIO=    9, //u8\r
321                 ALL_PARA                =       0xff\r
322 \r
323         */\r
324         ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_RA_DBG, ODM_DBG_LOUD, ("odm_RA_ParaAdjust_init \n"));\r
325 \r
326         pRA_Table->is_ra_dbg_init = TRUE;\r
327         for (i = 0; i < 3; i++) {\r
328                 pRA_Table->RA_Para_feedback_req = 1;\r
329                 pRA_Table->para_idx     =       ra_para_pool_u8[i];\r
330                 odm_RA_ParaAdjust_Send_H2C(pDM_Odm);\r
331         }\r
332 \r
333         if (pDM_Odm->SupportICType == ODM_RTL8192E)\r
334                 pRA_Table->rate_length = ODM_RATEMCS15;\r
335         else if ((pDM_Odm->SupportICType == ODM_RTL8723B) || (pDM_Odm->SupportICType == ODM_RTL8188E))\r
336                 pRA_Table->rate_length = ODM_RATEMCS7;\r
337         else if ((pDM_Odm->SupportICType == ODM_RTL8821) || (pDM_Odm->SupportICType == ODM_RTL8881A))\r
338                 pRA_Table->rate_length = ODM_RATEVHTSS1MCS9;\r
339         else if (pDM_Odm->SupportICType == ODM_RTL8812)\r
340                 pRA_Table->rate_length = ODM_RATEVHTSS2MCS9;\r
341         else if (pDM_Odm->SupportICType == ODM_RTL8814A)\r
342                 pRA_Table->rate_length = ODM_RATEVHTSS3MCS9;\r
343         else\r
344                 pRA_Table->rate_length = ODM_RATEVHTSS4MCS9;\r
345 \r
346 }\r
347 \r
348 #else\r
349 \r
350 VOID\r
351 ODM_C2HRaParaReportHandler(\r
352         IN      PVOID   pDM_VOID,\r
353         IN pu1Byte   CmdBuf,\r
354         IN u1Byte   CmdLen\r
355 )\r
356 {\r
357 }\r
358 \r
359 VOID\r
360 odm_RA_debug(\r
361         IN              PVOID           pDM_VOID,\r
362         IN              u4Byte          *const dm_value\r
363 )\r
364 {\r
365 }\r
366 \r
367 VOID\r
368 odm_RA_ParaAdjust_init(\r
369         IN              PVOID           pDM_VOID\r
370 )\r
371 \r
372 {\r
373 }\r
374 \r
375 #endif //#if (defined(CONFIG_RA_DBG_CMD))\r
376 \r
377 #if (defined(CONFIG_RA_DYNAMIC_RTY_LIMIT))\r
378 \r
379 VOID\r
380 phydm_retry_limit_table_bound(\r
381         IN      PVOID   pDM_VOID,\r
382         IN      u1Byte  *retry_limit,\r
383         IN      u1Byte  offset\r
384 )\r
385 {\r
386         PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
387         pRA_T                   pRA_Table = &pDM_Odm->DM_RA_Table;\r
388 \r
389         if (*retry_limit >  offset) {\r
390                 \r
391                 *retry_limit -= offset;\r
392                 \r
393                 if (*retry_limit < pRA_Table->retrylimit_low)\r
394                         *retry_limit = pRA_Table->retrylimit_low;\r
395                 else if (*retry_limit > pRA_Table->retrylimit_high)\r
396                         *retry_limit = pRA_Table->retrylimit_high;\r
397         } else\r
398                 *retry_limit = pRA_Table->retrylimit_low;\r
399 }\r
400 \r
401 VOID\r
402 phydm_reset_retry_limit_table(\r
403         IN      PVOID   pDM_VOID\r
404 )\r
405 {\r
406         PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
407         pRA_T                   pRA_Table = &pDM_Odm->DM_RA_Table;\r
408         u1Byte                  i;\r
409 \r
410         #if (DM_ODM_SUPPORT_TYPE == ODM_WIN) /*support all IC platform*/\r
411 \r
412         #else\r
413                 #if ((RTL8192E_SUPPORT == 1) || (RTL8723B_SUPPORT == 1) || (RTL8188E_SUPPORT == 1)) \r
414                         u1Byte per_rate_retrylimit_table_20M[ODM_RATEMCS15+1] = {\r
415                                 1, 1, 2, 4,                                     /*CCK*/\r
416                                 2, 2, 4, 6, 8, 12, 16, 18,              /*OFDM*/\r
417                                 2, 4, 6, 8, 12, 18, 20, 22,             /*20M HT-1SS*/\r
418                                 2, 4, 6, 8, 12, 18, 20, 22              /*20M HT-2SS*/\r
419                         };\r
420                         u1Byte per_rate_retrylimit_table_40M[ODM_RATEMCS15+1] = {\r
421                                 1, 1, 2, 4,                                     /*CCK*/\r
422                                 2, 2, 4, 6, 8, 12, 16, 18,              /*OFDM*/\r
423                                 4, 8, 12, 16, 24, 32, 32, 32,           /*40M HT-1SS*/\r
424                                 4, 8, 12, 16, 24, 32, 32, 32            /*40M HT-2SS*/\r
425                         };\r
426 \r
427                 #elif (RTL8821A_SUPPORT == 1) || (RTL8881A_SUPPORT == 1) \r
428 \r
429                 #elif (RTL8812A_SUPPORT == 1)\r
430 \r
431                 #elif(RTL8814A_SUPPORT == 1)\r
432 \r
433                 #else\r
434 \r
435                 #endif\r
436         #endif\r
437 \r
438         memcpy(&(pRA_Table->per_rate_retrylimit_20M[0]), &(per_rate_retrylimit_table_20M[0]), ODM_NUM_RATE_IDX);\r
439         memcpy(&(pRA_Table->per_rate_retrylimit_40M[0]), &(per_rate_retrylimit_table_40M[0]), ODM_NUM_RATE_IDX);\r
440 \r
441         for (i = 0; i < ODM_NUM_RATE_IDX; i++) {\r
442                 phydm_retry_limit_table_bound(pDM_Odm, &(pRA_Table->per_rate_retrylimit_20M[i]), 0);\r
443                 phydm_retry_limit_table_bound(pDM_Odm, &(pRA_Table->per_rate_retrylimit_40M[i]), 0);\r
444         }       \r
445 }\r
446 \r
447 VOID\r
448 phydm_ra_dynamic_retry_limit(\r
449         IN      PVOID   pDM_VOID\r
450 )\r
451 {\r
452         PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
453         pRA_T                   pRA_Table = &pDM_Odm->DM_RA_Table;\r
454         PSTA_INFO_T             pEntry;\r
455         u1Byte  i, retry_offset;\r
456         u4Byte  ma_rx_tp;\r
457 \r
458 \r
459         if (pDM_Odm->pre_number_active_client == pDM_Odm->number_active_client) {\r
460                 \r
461                 ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_RA_DBG, ODM_DBG_LOUD, (" pre_number_active_client ==  number_active_client\n"));\r
462                 return;\r
463                 \r
464         } else {\r
465                 if (pDM_Odm->number_active_client == 1) {\r
466                         phydm_reset_retry_limit_table(pDM_Odm);\r
467                         ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_RA_DBG, ODM_DBG_LOUD, ("one client only->reset to default value\n"));\r
468                 } else {\r
469 \r
470                         retry_offset = pDM_Odm->number_active_client * pRA_Table->retry_descend_num;\r
471                         \r
472                         for (i = 0; i < ODM_NUM_RATE_IDX; i++) {\r
473 \r
474                                 phydm_retry_limit_table_bound(pDM_Odm, &(pRA_Table->per_rate_retrylimit_20M[i]), retry_offset);\r
475                                 phydm_retry_limit_table_bound(pDM_Odm, &(pRA_Table->per_rate_retrylimit_40M[i]), retry_offset); \r
476                         }                               \r
477                 }\r
478         }\r
479 }\r
480 \r
481 VOID\r
482 phydm_ra_dynamic_retry_limit_init(\r
483         IN      PVOID   pDM_VOID\r
484 )\r
485 {\r
486         PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
487         pRA_T                   pRA_Table = &pDM_Odm->DM_RA_Table;\r
488 \r
489         pRA_Table->retry_descend_num = RA_RETRY_DESCEND_NUM;\r
490         pRA_Table->retrylimit_low = RA_RETRY_LIMIT_LOW;\r
491         pRA_Table->retrylimit_high = RA_RETRY_LIMIT_HIGH;\r
492         \r
493         phydm_reset_retry_limit_table(pDM_Odm);\r
494         \r
495 }\r
496 #else\r
497 VOID\r
498 phydm_ra_dynamic_retry_limit(\r
499         IN      PVOID   pDM_VOID\r
500 )\r
501 {\r
502 }\r
503 #endif\r
504 \r
505 #if (DM_ODM_SUPPORT_TYPE == ODM_AP)\r
506 VOID\r
507 phydm_ra_dynamic_rate_id_on_assoc(\r
508         IN      PVOID   pDM_VOID,\r
509         IN      u1Byte  wireless_mode,\r
510         IN      u1Byte  init_rate_id\r
511 )\r
512 {\r
513         PDM_ODM_T       pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
514         \r
515         ODM_RT_TRACE(pDM_Odm, ODM_COMP_RATE_ADAPTIVE, ODM_DBG_LOUD, ("[ON ASSOC] rf_mode = ((0x%x)), wireless_mode = ((0x%x)), init_rate_id = ((0x%x))\n", pDM_Odm->RFType, wireless_mode, init_rate_id));\r
516         \r
517         if ((pDM_Odm->RFType == ODM_2T2R) | (pDM_Odm->RFType == ODM_2T2R_GREEN) | (pDM_Odm->RFType == ODM_2T3R) | (pDM_Odm->RFType == ODM_2T4R)) {\r
518                 \r
519                 if ((pDM_Odm->SupportICType & (ODM_RTL8812|ODM_RTL8192E)) &&\r
520                         (wireless_mode & (ODM_WM_N24G | ODM_WM_N5G))\r
521                         ){\r
522                         ODM_RT_TRACE(pDM_Odm, ODM_COMP_RATE_ADAPTIVE, ODM_DBG_LOUD, ("[ON ASSOC] set N-2SS ARFR5 table\n"));\r
523                         ODM_SetMACReg(pDM_Odm, 0x4a4, bMaskDWord, 0xfc1ffff);   /*N-2SS, ARFR5, rate_id = 0xe*/\r
524                         ODM_SetMACReg(pDM_Odm, 0x4a8, bMaskDWord, 0x0);         /*N-2SS, ARFR5, rate_id = 0xe*/\r
525                 } else if ((pDM_Odm->SupportICType & (ODM_RTL8812)) &&\r
526                         (wireless_mode & (ODM_WM_AC_5G | ODM_WM_AC_24G | ODM_WM_AC_ONLY))\r
527                         ){\r
528                         ODM_RT_TRACE(pDM_Odm, ODM_COMP_RATE_ADAPTIVE, ODM_DBG_LOUD, ("[ON ASSOC] set AC-2SS ARFR0 table\n"));\r
529                         ODM_SetMACReg(pDM_Odm, 0x444, bMaskDWord, 0x0fff);      /*AC-2SS, ARFR0, rate_id = 0x9*/\r
530                         ODM_SetMACReg(pDM_Odm, 0x448, bMaskDWord, 0xff01f000);          /*AC-2SS, ARFR0, rate_id = 0x9*/\r
531                 }\r
532         }\r
533 \r
534 }\r
535 \r
536 VOID\r
537 phydm_ra_dynamic_rate_id_init(\r
538         IN      PVOID   pDM_VOID\r
539 )\r
540 {\r
541         PDM_ODM_T       pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
542         \r
543         if (pDM_Odm->SupportICType & (ODM_RTL8812|ODM_RTL8192E)) {\r
544                 \r
545                 ODM_SetMACReg(pDM_Odm, 0x4a4, bMaskDWord, 0xfc1ffff);   /*N-2SS, ARFR5, rate_id = 0xe*/\r
546                 ODM_SetMACReg(pDM_Odm, 0x4a8, bMaskDWord, 0x0);         /*N-2SS, ARFR5, rate_id = 0xe*/\r
547                 \r
548                 ODM_SetMACReg(pDM_Odm, 0x444, bMaskDWord, 0x0fff);              /*AC-2SS, ARFR0, rate_id = 0x9*/\r
549                 ODM_SetMACReg(pDM_Odm, 0x448, bMaskDWord, 0xff01f000);  /*AC-2SS, ARFR0, rate_id = 0x9*/\r
550         }\r
551 }\r
552 \r
553 VOID\r
554 phydm_update_rate_id(\r
555         IN      PVOID   pDM_VOID,\r
556         IN      u1Byte  rate,\r
557         IN      u1Byte  platform_macid\r
558 )\r
559 {\r
560         PDM_ODM_T       pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
561         pRA_T           pRA_Table = &pDM_Odm->DM_RA_Table;\r
562         u1Byte          current_tx_ss;\r
563         u1Byte          rate_idx = rate & 0x7f; /*remove bit7 SGI*/\r
564         u1Byte          wireless_mode;  \r
565         u1Byte          phydm_macid;\r
566         PSTA_INFO_T     pEntry;\r
567         \r
568         if (rate_idx >= ODM_RATEVHTSS2MCS0) {\r
569                 ODM_RT_TRACE(pDM_Odm, ODM_COMP_RATE_ADAPTIVE, ODM_DBG_LOUD, ("Rate[%d]: (( VHT2SS-MCS%d ))\n", platform_macid, (rate_idx-ODM_RATEVHTSS2MCS0)));\r
570                 /*dummy for SD4 check patch*/\r
571         } else if (rate_idx >= ODM_RATEVHTSS1MCS0) {\r
572                 ODM_RT_TRACE(pDM_Odm, ODM_COMP_RATE_ADAPTIVE, ODM_DBG_LOUD, ("Rate[%d]: (( VHT1SS-MCS%d ))\n", platform_macid, (rate_idx-ODM_RATEVHTSS1MCS0)));\r
573                 /*dummy for SD4 check patch*/\r
574         } else if (rate_idx >= ODM_RATEMCS0) {\r
575                 ODM_RT_TRACE(pDM_Odm, ODM_COMP_RATE_ADAPTIVE, ODM_DBG_LOUD, ("Rate[%d]: (( HT-MCS%d ))\n", platform_macid, (rate_idx-ODM_RATEMCS0)));\r
576                 /*dummy for SD4 check patch*/\r
577         } else {\r
578                 ODM_RT_TRACE(pDM_Odm, ODM_COMP_RATE_ADAPTIVE, ODM_DBG_LOUD, ("Rate[%d]: (( HT-MCS%d ))\n", platform_macid, rate_idx));\r
579                 /*dummy for SD4 check patch*/\r
580         }\r
581 \r
582         phydm_macid = pDM_Odm->platform2phydm_macid_table[platform_macid];\r
583         pEntry = pDM_Odm->pODM_StaInfo[phydm_macid];\r
584         \r
585         if (IS_STA_VALID(pEntry)) {\r
586                 wireless_mode = pEntry->WirelessMode;\r
587 \r
588                 if ((pDM_Odm->RFType  == ODM_2T2R) | (pDM_Odm->RFType  == ODM_2T2R_GREEN) | (pDM_Odm->RFType  == ODM_2T3R) | (pDM_Odm->RFType  == ODM_2T4R)) {\r
589                         \r
590                         pEntry->ratr_idx = pEntry->ratr_idx_init;\r
591                         if (wireless_mode & (ODM_WM_N24G | ODM_WM_N5G)) { /*N mode*/\r
592                                 if (rate_idx >= ODM_RATEMCS8 && rate_idx <= ODM_RATEMCS15) { /*2SS mode*/\r
593                                         \r
594                                         pEntry->ratr_idx = ARFR_5_RATE_ID;\r
595                                         ODM_RT_TRACE(pDM_Odm, ODM_COMP_RATE_ADAPTIVE, ODM_DBG_LOUD, ("ARFR_5\n"));\r
596                                 }\r
597                         } else if (wireless_mode & (ODM_WM_AC_5G | ODM_WM_AC_24G | ODM_WM_AC_ONLY)) {/*AC mode*/\r
598                                 if (rate_idx >= ODM_RATEVHTSS2MCS0 && rate_idx <= ODM_RATEVHTSS2MCS9) {/*2SS mode*/\r
599                                         \r
600                                         pEntry->ratr_idx = ARFR_0_RATE_ID;\r
601                                         ODM_RT_TRACE(pDM_Odm, ODM_COMP_RATE_ADAPTIVE, ODM_DBG_LOUD, ("ARFR_0\n"));\r
602                                 }\r
603                         }\r
604                         ODM_RT_TRACE(pDM_Odm, ODM_COMP_RATE_ADAPTIVE, ODM_DBG_LOUD, ("UPdate_RateID[%d]: (( 0x%x ))\n", platform_macid, pEntry->ratr_idx));\r
605                 }\r
606         }\r
607 \r
608 }\r
609 #endif\r
610 \r
611 VOID\r
612 phydm_c2h_ra_report_handler(\r
613         IN PVOID        pDM_VOID,\r
614         IN pu1Byte   CmdBuf,\r
615         IN u1Byte   CmdLen\r
616 )\r
617 {\r
618         PDM_ODM_T       pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
619         pRA_T           pRA_Table = &pDM_Odm->DM_RA_Table;\r
620         u1Byte  rate = CmdBuf[0];\r
621         u1Byte  macid = CmdBuf[1];\r
622         #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\r
623         PADAPTER        Adapter = pDM_Odm->Adapter;\r
624         \r
625         GET_HAL_DATA(Adapter)->CurrentRARate = HwRateToMRate(rate);     \r
626         ODM_UpdateInitRate(pDM_Odm, rate);\r
627         #endif\r
628 \r
629         #if (DM_ODM_SUPPORT_TYPE == ODM_AP)\r
630         if (pDM_Odm->SupportICType & (ODM_RTL8812|ODM_RTL8192E))\r
631                 phydm_update_rate_id(pDM_Odm, rate, macid);\r
632         #endif\r
633 \r
634 }\r
635 \r
636 VOID\r
637 odm_RSSIMonitorInit(\r
638         IN              PVOID           pDM_VOID\r
639 )\r
640 {\r
641 #if(DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))\r
642         PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
643         pRA_T           pRA_Table = &pDM_Odm->DM_RA_Table;\r
644         pRA_Table->firstconnect = FALSE;\r
645 \r
646 #if(DM_ODM_SUPPORT_TYPE & (ODM_WIN))\r
647         pRA_Table->PT_collision_pre = TRUE;   //used in ODM_DynamicARFBSelect(WIN only)\r
648 #endif\r
649 #endif\r
650 }\r
651 \r
652 VOID\r
653 ODM_RAPostActionOnAssoc(\r
654         IN      PVOID   pDM_VOID\r
655 )\r
656 {\r
657         PDM_ODM_T       pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
658 \r
659         pDM_Odm->H2C_RARpt_connect = 1;\r
660         odm_RSSIMonitorCheck(pDM_Odm);\r
661         pDM_Odm->H2C_RARpt_connect = 0;\r
662 }\r
663 \r
664 VOID\r
665 odm_RSSIMonitorCheck(\r
666         IN              PVOID           pDM_VOID\r
667 )\r
668 {\r
669         //\r
670         // For AP/ADSL use prtl8192cd_priv\r
671         // For CE/NIC use PADAPTER\r
672         //\r
673         PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
674         if (!(pDM_Odm->SupportAbility & ODM_BB_RSSI_MONITOR))\r
675                 return;\r
676 \r
677         //\r
678         // 2011/09/29 MH In HW integration first stage, we provide 4 different handle to operate\r
679         // at the same time. In the stage2/3, we need to prive universal interface and merge all\r
680         // HW dynamic mechanism.\r
681         //\r
682         switch  (pDM_Odm->SupportPlatform) {\r
683         case    ODM_WIN:\r
684                 odm_RSSIMonitorCheckMP(pDM_Odm);\r
685                 break;\r
686 \r
687         case    ODM_CE:\r
688                 odm_RSSIMonitorCheckCE(pDM_Odm);\r
689                 break;\r
690 \r
691         case    ODM_AP:\r
692                 odm_RSSIMonitorCheckAP(pDM_Odm);\r
693                 break;\r
694 \r
695         case    ODM_ADSL:\r
696                 //odm_DIGAP(pDM_Odm);\r
697                 break;\r
698         }\r
699 \r
700 }       // odm_RSSIMonitorCheck\r
701 \r
702 VOID\r
703 odm_RSSIMonitorCheckMP(\r
704         IN      PVOID   pDM_VOID\r
705 )\r
706 {\r
707 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\r
708         PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
709         u1Byte                  H2C_Parameter[4] = {0};\r
710         u4Byte                  i;\r
711         BOOLEAN                 bExtRAInfo = FALSE;\r
712         u1Byte                  cmdlen = 3;\r
713         u1Byte                  TxBF_EN = 0, stbc_en = 0;\r
714 \r
715         PADAPTER                Adapter = pDM_Odm->Adapter;\r
716         HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(Adapter);\r
717         PRT_WLAN_STA    pEntry = NULL;\r
718         s4Byte                  tmpEntryMaxPWDB = 0, tmpEntryMinPWDB = 0xff;\r
719         PMGNT_INFO              pMgntInfo = &Adapter->MgntInfo;\r
720         PMGNT_INFO              pDefaultMgntInfo = &Adapter->MgntInfo;\r
721         u8Byte                  curTxOkCnt = 0, curRxOkCnt = 0;\r
722         //BOOLEAN                       FirstConnect = 0;\r
723         pRA_T                   pRA_Table = &pDM_Odm->DM_RA_Table;\r
724         pDIG_T                  pDM_DigTable = &pDM_Odm->DM_DigTable;\r
725 \r
726 #if (BEAMFORMING_SUPPORT )\r
727         BEAMFORMING_CAP Beamform_cap = BEAMFORMING_CAP_NONE;\r
728 #endif\r
729 \r
730         PADAPTER        pLoopAdapter = GetDefaultAdapter(Adapter);\r
731 \r
732         if (pDM_Odm->SupportICType & EXT_RA_INFO_SUPPORT_IC) {\r
733                 bExtRAInfo = TRUE;\r
734                 cmdlen = 4;\r
735         }\r
736 \r
737         //FirstConnect = (pDM_Odm->bLinked) && (pDM_DigTable->bMediaConnect_0 == FALSE);\r
738         //pRA_Table->firstconnect = pHalData->bLinked;\r
739 \r
740 \r
741         /*\r
742                 if(pDM_Odm->SupportICType == ODM_RTL8188E && (pDefaultMgntInfo->CustomerID==RT_CID_819x_HP))\r
743                 {\r
744                         if(curRxOkCnt >(curTxOkCnt*6))\r
745                                 PlatformEFIOWrite4Byte(Adapter, REG_ARFR0, 0x8f015);\r
746                         else\r
747                                 PlatformEFIOWrite4Byte(Adapter, REG_ARFR0, 0xff015);\r
748                 }\r
749 \r
750 \r
751                 if(pDM_Odm->SupportICType == ODM_RTL8812 || pDM_Odm->SupportICType == ODM_RTL8821 ||\r
752                    pDM_Odm->SupportICType == ODM_RTL8814A|| pDM_Odm->SupportICType == ODM_RTL8822B)\r
753                 {\r
754                         if(curRxOkCnt >(curTxOkCnt*6))\r
755                                 H2C_Parameter[3]|=RAINFO_BE_RX_STATE;\r
756                 }\r
757         */\r
758 \r
759         while (pLoopAdapter) {\r
760 \r
761                 if (pLoopAdapter != NULL) {\r
762                         pMgntInfo = &pLoopAdapter->MgntInfo;\r
763                         curTxOkCnt = pLoopAdapter->TxStats.NumTxBytesUnicast - pMgntInfo->lastTxOkCnt;\r
764                         curRxOkCnt = pLoopAdapter->RxStats.NumRxBytesUnicast - pMgntInfo->lastRxOkCnt;\r
765                         pMgntInfo->lastTxOkCnt = curTxOkCnt;\r
766                         pMgntInfo->lastRxOkCnt = curRxOkCnt;\r
767                 }\r
768 \r
769                 for (i = 0; i < ASSOCIATE_ENTRY_NUM; i++) {\r
770 \r
771                         if (IsAPModeExist(pLoopAdapter)) {\r
772                                 if (GetFirstExtAdapter(pLoopAdapter) != NULL &&\r
773                                         GetFirstExtAdapter(pLoopAdapter) == pLoopAdapter)\r
774                                         pEntry = AsocEntry_EnumStation(pLoopAdapter, i);\r
775                                 else if (GetFirstGOPort(pLoopAdapter) != NULL &&\r
776                                                  IsFirstGoAdapter(pLoopAdapter))\r
777                                         pEntry = AsocEntry_EnumStation(pLoopAdapter, i);\r
778                         } else {\r
779                                 if (GetDefaultAdapter(pLoopAdapter) == pLoopAdapter)\r
780                                         pEntry = AsocEntry_EnumStation(pLoopAdapter, i);\r
781                         }\r
782 \r
783                         if (pEntry != NULL) {\r
784                                 if (pEntry->bAssociated) {\r
785 \r
786                                         RT_DISP_ADDR(FDM, DM_PWDB, ("pEntry->MacAddr ="), pEntry->MacAddr);\r
787                                         RT_DISP(FDM, DM_PWDB, ("pEntry->rssi = 0x%x(%d)\n",\r
788                                                                                    pEntry->rssi_stat.UndecoratedSmoothedPWDB, pEntry->rssi_stat.UndecoratedSmoothedPWDB));\r
789 \r
790                                         //2 BF_en\r
791 #if (BEAMFORMING_SUPPORT)\r
792                                         Beamform_cap = phydm_Beamforming_GetEntryBeamCapByMacId(pDM_Odm, pEntry->AssociatedMacId);\r
793                                         if (Beamform_cap & (BEAMFORMER_CAP_HT_EXPLICIT | BEAMFORMER_CAP_VHT_SU))\r
794                                                 TxBF_EN = 1;\r
795 #endif\r
796                                         //2 STBC_en\r
797                                         if ((IS_WIRELESS_MODE_AC(Adapter) && TEST_FLAG(pEntry->VHTInfo.STBC, STBC_VHT_ENABLE_TX)) ||\r
798                                                 TEST_FLAG(pEntry->HTInfo.STBC, STBC_HT_ENABLE_TX))\r
799                                                 stbc_en = 1;\r
800 \r
801                                         if (pEntry->rssi_stat.UndecoratedSmoothedPWDB < tmpEntryMinPWDB)\r
802                                                 tmpEntryMinPWDB = pEntry->rssi_stat.UndecoratedSmoothedPWDB;\r
803                                         if (pEntry->rssi_stat.UndecoratedSmoothedPWDB > tmpEntryMaxPWDB)\r
804                                                 tmpEntryMaxPWDB = pEntry->rssi_stat.UndecoratedSmoothedPWDB;\r
805 \r
806                                         if (bExtRAInfo) {\r
807                                                 if (curRxOkCnt > (curTxOkCnt * 6))\r
808                                                         H2C_Parameter[3] |= RAINFO_BE_RX_STATE;\r
809 \r
810                                                 if (TxBF_EN)\r
811                                                         H2C_Parameter[3] |= RAINFO_BF_STATE;\r
812                                                 else {\r
813                                                         if (stbc_en)\r
814                                                                 H2C_Parameter[3] |= RAINFO_STBC_STATE;\r
815                                                 }\r
816 \r
817                                                 if (pDM_Odm->H2C_RARpt_connect)\r
818                                                         H2C_Parameter[3] |= RAINFO_INIT_RSSI_RATE_STATE;\r
819                                         }\r
820 \r
821                                         H2C_Parameter[2] = (u1Byte)(pEntry->rssi_stat.UndecoratedSmoothedPWDB & 0xFF);\r
822                                         //H2C_Parameter[1] = 0x20;   // fw v12 cmdid 5:use max macid ,for nic ,default macid is 0 ,max macid is 1\r
823                                         H2C_Parameter[0] = (pEntry->AssociatedMacId);\r
824 \r
825                                         ODM_FillH2CCmd(pDM_Odm, ODM_H2C_RSSI_REPORT, cmdlen, H2C_Parameter);\r
826                                 }\r
827                         } else\r
828                                 break;\r
829                 }\r
830 \r
831                 pLoopAdapter = GetNextExtAdapter(pLoopAdapter);\r
832         }\r
833 \r
834         if (tmpEntryMaxPWDB != 0) {     // If associated entry is found\r
835                 pHalData->EntryMaxUndecoratedSmoothedPWDB = tmpEntryMaxPWDB;\r
836                 RT_DISP(FDM, DM_PWDB, ("EntryMaxPWDB = 0x%x(%d)\n",     tmpEntryMaxPWDB, tmpEntryMaxPWDB));\r
837         } else\r
838                 pHalData->EntryMaxUndecoratedSmoothedPWDB = 0;\r
839 \r
840         if (tmpEntryMinPWDB != 0xff) { // If associated entry is found\r
841                 pHalData->EntryMinUndecoratedSmoothedPWDB = tmpEntryMinPWDB;\r
842                 RT_DISP(FDM, DM_PWDB, ("EntryMinPWDB = 0x%x(%d)\n", tmpEntryMinPWDB, tmpEntryMinPWDB));\r
843 \r
844         } else\r
845                 pHalData->EntryMinUndecoratedSmoothedPWDB = 0;\r
846 \r
847         // Indicate Rx signal strength to FW.\r
848         if (pHalData->bUseRAMask) {\r
849                 PRT_HIGH_THROUGHPUT             pHTInfo = GET_HT_INFO(pDefaultMgntInfo);\r
850                 PRT_VERY_HIGH_THROUGHPUT        pVHTInfo = GET_VHT_INFO(pDefaultMgntInfo);\r
851 \r
852                 //2 BF_en\r
853 #if (BEAMFORMING_SUPPORT == 1)\r
854                 Beamform_cap = phydm_Beamforming_GetEntryBeamCapByMacId(pDM_Odm, pDefaultMgntInfo->mMacId);\r
855 \r
856                 if (Beamform_cap & (BEAMFORMER_CAP_HT_EXPLICIT | BEAMFORMER_CAP_VHT_SU))\r
857                         TxBF_EN = 1;\r
858 #endif\r
859 \r
860                 //2 STBC_en\r
861                 if ((IS_WIRELESS_MODE_AC(Adapter) && TEST_FLAG(pVHTInfo->VhtCurStbc, STBC_VHT_ENABLE_TX)) ||\r
862                         TEST_FLAG(pHTInfo->HtCurStbc, STBC_HT_ENABLE_TX))\r
863                         stbc_en = 1;\r
864 \r
865                 if (bExtRAInfo) {\r
866                         if (TxBF_EN)\r
867                                 H2C_Parameter[3] |= RAINFO_BF_STATE;\r
868                         else {\r
869                                 if (stbc_en)\r
870                                         H2C_Parameter[3] |= RAINFO_STBC_STATE;\r
871                         }\r
872 \r
873                         if (pDM_Odm->H2C_RARpt_connect)\r
874                                 H2C_Parameter[3] |= RAINFO_INIT_RSSI_RATE_STATE;\r
875                 }\r
876 \r
877                 H2C_Parameter[2] = (u1Byte)(pHalData->UndecoratedSmoothedPWDB & 0xFF);\r
878                 //H2C_Parameter[1] = 0x20;      // fw v12 cmdid 5:use max macid ,for nic ,default macid is 0 ,max macid is 1\r
879                 H2C_Parameter[0] = 0;           // fw v12 cmdid 5:use max macid ,for nic ,default macid is 0 ,max macid is 1\r
880 \r
881                 ODM_FillH2CCmd(pDM_Odm, ODM_H2C_RSSI_REPORT, cmdlen, H2C_Parameter);\r
882 \r
883                 // BT 3.0 HS mode Rssi\r
884                 if (pDM_Odm->bBtHsOperation) {\r
885                         H2C_Parameter[2] = pDM_Odm->btHsRssi;\r
886                         //H2C_Parameter[1] = 0x0;\r
887                         H2C_Parameter[0] = 2;\r
888 \r
889                         ODM_FillH2CCmd(pDM_Odm, ODM_H2C_RSSI_REPORT, cmdlen, H2C_Parameter);\r
890                 }\r
891         } else\r
892                 PlatformEFIOWrite1Byte(Adapter, 0x4fe, (u1Byte)pHalData->UndecoratedSmoothedPWDB);\r
893 \r
894         if ((pDM_Odm->SupportICType == ODM_RTL8812) || (pDM_Odm->SupportICType == ODM_RTL8192E))\r
895                 odm_RSSIDumpToRegister(pDM_Odm);\r
896 \r
897 \r
898         {\r
899                 PADAPTER pLoopAdapter = GetDefaultAdapter(Adapter);\r
900                 s4Byte  GlobalRSSI_min = 0xFF, LocalRSSI_Min;\r
901                 BOOLEAN         bLink = FALSE;\r
902 \r
903                 while (pLoopAdapter) {\r
904                         LocalRSSI_Min = odm_FindMinimumRSSI(pLoopAdapter);\r
905                         //DbgPrint("pHalData->bLinked=%d, LocalRSSI_Min=%d\n", pHalData->bLinked, LocalRSSI_Min);\r
906                         if ((LocalRSSI_Min < GlobalRSSI_min) && (LocalRSSI_Min != 0))\r
907                                 GlobalRSSI_min = LocalRSSI_Min;\r
908 \r
909                         if (pHalData->bLinked)\r
910                                 bLink = TRUE;\r
911 \r
912                         pLoopAdapter = GetNextExtAdapter(pLoopAdapter);\r
913                 }\r
914 \r
915                 pHalData->bLinked = bLink;\r
916                 ODM_CmnInfoUpdate(&pHalData->DM_OutSrc , ODM_CMNINFO_LINK, (u8Byte)bLink);\r
917                 ODM_CmnInfoUpdate(&pHalData->DM_OutSrc , ODM_CMNINFO_RSSI_MIN, (u8Byte)GlobalRSSI_min);\r
918 \r
919         }\r
920 \r
921 #endif  // #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\r
922 }\r
923 \r
924 VOID\r
925 odm_RSSIMonitorCheckCE(\r
926         IN              PVOID           pDM_VOID\r
927 )\r
928 {\r
929 #if (DM_ODM_SUPPORT_TYPE == ODM_CE)\r
930         PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
931         PADAPTER        Adapter = pDM_Odm->Adapter;\r
932         HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(Adapter);      \r
933         struct dvobj_priv       *pdvobjpriv = adapter_to_dvobj(Adapter);\r
934         int     i;\r
935         int     tmpEntryMaxPWDB = 0, tmpEntryMinPWDB = 0xff;\r
936         u8      sta_cnt = 0;\r
937         u32     UL_DL_STATE = 0, STBC_TX = 0, TxBF_EN = 0;\r
938         u32     PWDB_rssi[NUM_STA] = {0}; //[0~15]:MACID, [16~31]:PWDB_rssi\r
939         BOOLEAN                 FirstConnect = FALSE;\r
940         pRA_T                   pRA_Table = &pDM_Odm->DM_RA_Table;\r
941 \r
942         if (pDM_Odm->bLinked != _TRUE)\r
943                 return;\r
944 \r
945 #if((RTL8812A_SUPPORT==1)||(RTL8821A_SUPPORT==1))\r
946         if ((pDM_Odm->SupportICType == ODM_RTL8812) || (pDM_Odm->SupportICType == ODM_RTL8821)) {\r
947                 u64     curTxOkCnt = pdvobjpriv->traffic_stat.cur_tx_bytes;\r
948                 u64     curRxOkCnt = pdvobjpriv->traffic_stat.cur_rx_bytes;\r
949 \r
950                 if (curRxOkCnt > (curTxOkCnt * 6))\r
951                         UL_DL_STATE = 1;\r
952                 else\r
953                         UL_DL_STATE = 0;\r
954         }\r
955 #endif\r
956 \r
957         FirstConnect = (pDM_Odm->bLinked) && (pRA_Table->firstconnect == FALSE);\r
958         pRA_Table->firstconnect = pDM_Odm->bLinked;\r
959 \r
960         //if(check_fwstate(&Adapter->mlmepriv, WIFI_AP_STATE|WIFI_ADHOC_STATE|WIFI_ADHOC_MASTER_STATE) == _TRUE)\r
961         {\r
962                 struct sta_info *psta;\r
963 \r
964                 for (i = 0; i < ODM_ASSOCIATE_ENTRY_NUM; i++) {\r
965                         if (IS_STA_VALID(psta = pDM_Odm->pODM_StaInfo[i])) {\r
966                                 if (IS_MCAST(psta->hwaddr))  //if(psta->mac_id ==1)\r
967                                         continue;\r
968 \r
969                                 if (psta->rssi_stat.UndecoratedSmoothedPWDB == (-1))\r
970                                         continue;\r
971 \r
972                                 if (psta->rssi_stat.UndecoratedSmoothedPWDB < tmpEntryMinPWDB)\r
973                                         tmpEntryMinPWDB = psta->rssi_stat.UndecoratedSmoothedPWDB;\r
974 \r
975                                 if (psta->rssi_stat.UndecoratedSmoothedPWDB > tmpEntryMaxPWDB)\r
976                                         tmpEntryMaxPWDB = psta->rssi_stat.UndecoratedSmoothedPWDB;\r
977 \r
978 #if 0\r
979                                 DBG_871X("%s mac_id:%u, mac:"MAC_FMT", rssi:%d\n", __func__,\r
980                                                  psta->mac_id, MAC_ARG(psta->hwaddr), psta->rssi_stat.UndecoratedSmoothedPWDB);\r
981 #endif\r
982 \r
983                                 if (psta->rssi_stat.UndecoratedSmoothedPWDB != (-1)) {\r
984 \r
985 #ifdef CONFIG_80211N_HT\r
986                                         if (pDM_Odm->SupportICType == ODM_RTL8192E || pDM_Odm->SupportICType == ODM_RTL8812) {\r
987 #ifdef CONFIG_BEAMFORMING\r
988                                                 BEAMFORMING_CAP Beamform_cap = beamforming_get_entry_beam_cap_by_mac_id(&Adapter->mlmepriv, psta->mac_id);\r
989 \r
990                                                 if (Beamform_cap & (BEAMFORMER_CAP_HT_EXPLICIT | BEAMFORMER_CAP_VHT_SU))\r
991                                                         TxBF_EN = 1;\r
992                                                 else\r
993                                                         TxBF_EN = 0;\r
994 \r
995                                                 if (TxBF_EN)\r
996                                                         STBC_TX = 0;\r
997                                                 else\r
998 #endif\r
999                                                 {\r
1000 #ifdef CONFIG_80211AC_VHT\r
1001                                                         if (IsSupportedVHT(psta->wireless_mode))\r
1002                                                                 STBC_TX = TEST_FLAG(psta->vhtpriv.stbc_cap, STBC_VHT_ENABLE_TX);\r
1003                                                         else\r
1004 #endif\r
1005                                                                 STBC_TX = TEST_FLAG(psta->htpriv.stbc_cap, STBC_HT_ENABLE_TX);\r
1006                                                 }\r
1007                                         }\r
1008 #endif\r
1009 \r
1010                                         if (pDM_Odm->SupportICType == ODM_RTL8192D)\r
1011                                                 PWDB_rssi[sta_cnt++] = (psta->mac_id | (psta->rssi_stat.UndecoratedSmoothedPWDB << 16) | ((Adapter->stapriv.asoc_sta_count + 1) << 8));\r
1012                                         else if ((pDM_Odm->SupportICType == ODM_RTL8192E) || (pDM_Odm->SupportICType == ODM_RTL8812) || (pDM_Odm->SupportICType == ODM_RTL8821))\r
1013                                                 PWDB_rssi[sta_cnt++] = (((u8)(psta->mac_id & 0xFF)) | ((psta->rssi_stat.UndecoratedSmoothedPWDB & 0x7F) << 16) | (STBC_TX << 25) | (FirstConnect << 29) | (TxBF_EN << 30));\r
1014                                         else\r
1015                                                 PWDB_rssi[sta_cnt++] = (psta->mac_id | (psta->rssi_stat.UndecoratedSmoothedPWDB << 16));\r
1016                                 }\r
1017                         }\r
1018                 }\r
1019 \r
1020                 //printk("%s==> sta_cnt(%d)\n",__FUNCTION__,sta_cnt);\r
1021 \r
1022                 for (i = 0; i < sta_cnt; i++) {\r
1023                         if (PWDB_rssi[i] != (0)) {\r
1024                                 if (pHalData->fw_ractrl == _TRUE) { // Report every sta's RSSI to FW\r
1025 #if((RTL8812A_SUPPORT==1)||(RTL8821A_SUPPORT==1))\r
1026                                         if ((pDM_Odm->SupportICType == ODM_RTL8812) || (pDM_Odm->SupportICType == ODM_RTL8821)) {\r
1027                                                 PWDB_rssi[i] |= (UL_DL_STATE << 24);\r
1028                                                 rtl8812_set_rssi_cmd(Adapter, (u8 *)(&PWDB_rssi[i]));\r
1029                                         }\r
1030 #endif\r
1031 #if(RTL8192E_SUPPORT==1)\r
1032                                         if (pDM_Odm->SupportICType == ODM_RTL8192E)\r
1033                                                 rtl8192e_set_rssi_cmd(Adapter, (u8 *)(&PWDB_rssi[i]));\r
1034 #endif\r
1035 #if(RTL8723B_SUPPORT==1)\r
1036                                         if (pDM_Odm->SupportICType == ODM_RTL8723B)\r
1037                                                 rtl8723b_set_rssi_cmd(Adapter, (u8 *)(&PWDB_rssi[i]));\r
1038 #endif\r
1039 \r
1040 #if(RTL8188E_SUPPORT==1)\r
1041                                         if (pDM_Odm->SupportICType == ODM_RTL8188E)\r
1042                                                 rtl8188e_set_rssi_cmd(Adapter, (u8 *)(&PWDB_rssi[i]));\r
1043 #endif\r
1044 \r
1045 #if (RTL8814A_SUPPORT == 1)\r
1046                                         if (pDM_Odm->SupportICType == ODM_RTL8814A)\r
1047                                                 rtl8814_set_rssi_cmd(Adapter, (u8 *)(&PWDB_rssi[i]));\r
1048 #endif\r
1049                                 } else {\r
1050 #if((RTL8188E_SUPPORT==1)&&(RATE_ADAPTIVE_SUPPORT == 1))\r
1051                                         if (pDM_Odm->SupportICType == ODM_RTL8188E) {\r
1052                                                 ODM_RA_SetRSSI_8188E(\r
1053                                                         &(pHalData->odmpriv), (PWDB_rssi[i] & 0xFF), (u8)((PWDB_rssi[i] >> 16) & 0xFF));\r
1054                                         }\r
1055 #endif\r
1056                                 }\r
1057                         }\r
1058                 }\r
1059         }\r
1060 \r
1061 \r
1062 \r
1063         if (tmpEntryMaxPWDB != 0)       // If associated entry is found\r
1064                 pHalData->EntryMaxUndecoratedSmoothedPWDB = tmpEntryMaxPWDB;\r
1065         else\r
1066                 pHalData->EntryMaxUndecoratedSmoothedPWDB = 0;\r
1067 \r
1068         if (tmpEntryMinPWDB != 0xff) // If associated entry is found\r
1069                 pHalData->EntryMinUndecoratedSmoothedPWDB = tmpEntryMinPWDB;\r
1070         else\r
1071                 pHalData->EntryMinUndecoratedSmoothedPWDB = 0;\r
1072 \r
1073         FindMinimumRSSI(Adapter);//get pdmpriv->MinUndecoratedPWDBForDM\r
1074 \r
1075         pDM_Odm->RSSI_Min = pHalData->MinUndecoratedPWDBForDM;\r
1076         //ODM_CmnInfoUpdate(&pHalData->odmpriv ,ODM_CMNINFO_RSSI_MIN, pdmpriv->MinUndecoratedPWDBForDM);\r
1077 #endif//if (DM_ODM_SUPPORT_TYPE == ODM_CE)\r
1078 }\r
1079 \r
1080 \r
1081 VOID\r
1082 odm_RSSIMonitorCheckAP(\r
1083         IN              PVOID           pDM_VOID\r
1084 )\r
1085 {\r
1086 #if (DM_ODM_SUPPORT_TYPE == ODM_AP)\r
1087 #if (RTL8812A_SUPPORT||RTL8881A_SUPPORT||RTL8192E_SUPPORT||RTL8814A_SUPPORT)\r
1088 \r
1089         PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
1090         u1Byte                  H2C_Parameter[4] = {0};\r
1091         u4Byte                   i;\r
1092         BOOLEAN                 bExtRAInfo = FALSE;\r
1093         u1Byte                  cmdlen = 3 ;\r
1094         u1Byte                  TxBF_EN = 0, stbc_en = 0;\r
1095 \r
1096         prtl8192cd_priv priv            = pDM_Odm->priv;\r
1097         PSTA_INFO_T             pstat;\r
1098         BOOLEAN                 act_bfer = FALSE;\r
1099 \r
1100 #ifdef BEAMFORMING_SUPPORT\r
1101 #if (defined(CONFIG_HW_ANTENNA_DIVERSITY))\r
1102         pBDC_T  pDM_BdcTable = &pDM_Odm->DM_BdcTable;\r
1103         pDM_BdcTable->num_Txbfee_Client = 0;\r
1104         pDM_BdcTable->num_Txbfer_Client = 0;\r
1105 #endif\r
1106 #endif\r
1107 \r
1108 \r
1109         if (priv->up_time % 2)\r
1110                 return;\r
1111 \r
1112         if (pDM_Odm->SupportICType & EXT_RA_INFO_SUPPORT_IC) {\r
1113                 bExtRAInfo = TRUE;\r
1114                 cmdlen = 4;\r
1115         }\r
1116 \r
1117         for (i = 0; i < ODM_ASSOCIATE_ENTRY_NUM; i++) {\r
1118                 pstat = pDM_Odm->pODM_StaInfo[i];\r
1119 \r
1120                 if (IS_STA_VALID(pstat)) {\r
1121                         if (pstat->sta_in_firmware != 1)\r
1122                                 continue;\r
1123 \r
1124                         //2 BF_en\r
1125 #ifdef BEAMFORMING_SUPPORT\r
1126                         BEAMFORMING_CAP Beamform_cap = Beamforming_GetEntryBeamCapByMacId(priv, pstat->aid);\r
1127 \r
1128                         if (Beamform_cap == BEAMFORMER_CAP_HT_EXPLICIT || Beamform_cap == BEAMFORMER_CAP_VHT_SU ||\r
1129                                 Beamform_cap == (BEAMFORMER_CAP_HT_EXPLICIT | BEAMFORMEE_CAP_HT_EXPLICIT) ||\r
1130                                 Beamform_cap == (BEAMFORMER_CAP_VHT_SU | BEAMFORMEE_CAP_VHT_SU)) {\r
1131                                 TxBF_EN = 1;\r
1132                                 act_bfer = TRUE;\r
1133                         }\r
1134 \r
1135 #if (defined(CONFIG_HW_ANTENNA_DIVERSITY)) //BDC\r
1136 \r
1137                         if (act_bfer == TRUE) {\r
1138                                 pDM_BdcTable->w_BFee_Client[i] = 1; //AP act as BFer\r
1139                                 pDM_BdcTable->num_Txbfee_Client++;\r
1140                         } else {\r
1141                                 pDM_BdcTable->w_BFee_Client[i] = 0; //AP act as BFer\r
1142                         }\r
1143 \r
1144                         if ((Beamform_cap & BEAMFORMEE_CAP_HT_EXPLICIT) || (Beamform_cap & BEAMFORMEE_CAP_VHT_SU)) {\r
1145                                 pDM_BdcTable->w_BFer_Client[i] = 1; //AP act as BFee\r
1146                                 pDM_BdcTable->num_Txbfer_Client++;\r
1147                         } else {\r
1148                                 pDM_BdcTable->w_BFer_Client[i] = 0; //AP act as BFer\r
1149                         }\r
1150 #endif\r
1151 #endif\r
1152 \r
1153                         //2 STBC_en\r
1154                         if ((priv->pmib->dot11nConfigEntry.dot11nSTBC) &&\r
1155                                 ((pstat->ht_cap_buf.ht_cap_info & cpu_to_le16(_HTCAP_RX_STBC_CAP_))\r
1156 #ifdef RTK_AC_SUPPORT\r
1157                                  || (pstat->vht_cap_buf.vht_cap_info & cpu_to_le32(_VHTCAP_RX_STBC_CAP_))\r
1158 #endif\r
1159                                 ))\r
1160                                 stbc_en = 1;\r
1161 \r
1162                         //2 RAINFO\r
1163 \r
1164                         if (bExtRAInfo) {\r
1165                                 if ((pstat->rx_avarage)  > ((pstat->tx_avarage) * 6))\r
1166                                         H2C_Parameter[3] |= RAINFO_BE_RX_STATE;\r
1167 \r
1168                                 if (TxBF_EN)\r
1169                                         H2C_Parameter[3] |= RAINFO_BF_STATE;\r
1170                                 else {\r
1171                                         if (stbc_en)\r
1172                                                 H2C_Parameter[3] |= RAINFO_STBC_STATE;\r
1173                                 }\r
1174 \r
1175                                 if (pDM_Odm->H2C_RARpt_connect)\r
1176                                         H2C_Parameter[3] |= RAINFO_INIT_RSSI_RATE_STATE;\r
1177 \r
1178                                 //ODM_RT_TRACE(pDM_Odm,PHYDM_COMP_RA_DBG, ODM_DBG_LOUD, ("[RAINFO] H2C_Para[3] = %x,  \n",H2C_Parameter[3]));\r
1179                         }\r
1180 \r
1181                         H2C_Parameter[2] = (u1Byte)(pstat->rssi & 0xFF);\r
1182                         H2C_Parameter[0] = REMAP_AID(pstat);\r
1183 \r
1184                         //ODM_RT_TRACE(pDM_Odm,PHYDM_COMP_RA_DBG, ODM_DBG_LOUD, ("[RSSI] H2C_Para[2] = %x,  \n",H2C_Parameter[2]));\r
1185                         //ODM_RT_TRACE(pDM_Odm,PHYDM_COMP_RA_DBG, ODM_DBG_LOUD, ("[MACID] H2C_Para[0] = %x,  \n",H2C_Parameter[0]));\r
1186 \r
1187                         ODM_FillH2CCmd(pDM_Odm, ODM_H2C_RSSI_REPORT, cmdlen, H2C_Parameter);\r
1188 \r
1189                 }\r
1190         }\r
1191 \r
1192 #endif\r
1193 #endif\r
1194 \r
1195 }\r
1196 \r
1197 \r
1198 VOID\r
1199 odm_RateAdaptiveMaskInit(\r
1200         IN      PVOID   pDM_VOID\r
1201 )\r
1202 {\r
1203         PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
1204         PODM_RATE_ADAPTIVE      pOdmRA = &pDM_Odm->RateAdaptive;\r
1205 \r
1206 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\r
1207         PMGNT_INFO              pMgntInfo = &pDM_Odm->Adapter->MgntInfo;\r
1208         HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(pDM_Odm->Adapter);\r
1209 \r
1210         pMgntInfo->Ratr_State = DM_RATR_STA_INIT;\r
1211 \r
1212         if (pMgntInfo->DM_Type == DM_Type_ByDriver)\r
1213                 pHalData->bUseRAMask = TRUE;\r
1214         else\r
1215                 pHalData->bUseRAMask = FALSE;\r
1216 \r
1217 #elif (DM_ODM_SUPPORT_TYPE == ODM_CE)\r
1218         pOdmRA->Type = DM_Type_ByDriver;\r
1219         if (pOdmRA->Type == DM_Type_ByDriver)\r
1220                 pDM_Odm->bUseRAMask = _TRUE;\r
1221         else\r
1222                 pDM_Odm->bUseRAMask = _FALSE;\r
1223 #endif\r
1224 \r
1225         pOdmRA->RATRState = DM_RATR_STA_INIT;\r
1226 \r
1227 #if(DM_ODM_SUPPORT_TYPE & ODM_WIN)\r
1228         if (pDM_Odm->SupportICType == ODM_RTL8812)\r
1229                 pOdmRA->LdpcThres = 50;\r
1230         else\r
1231                 pOdmRA->LdpcThres = 35;\r
1232 \r
1233         pOdmRA->RtsThres = 35;\r
1234 \r
1235 #elif(DM_ODM_SUPPORT_TYPE & ODM_CE)\r
1236         pOdmRA->LdpcThres = 35;\r
1237         pOdmRA->bUseLdpc = FALSE;\r
1238 \r
1239 #else\r
1240         pOdmRA->UltraLowRSSIThresh = 9;\r
1241 \r
1242 #endif\r
1243 \r
1244         pOdmRA->HighRSSIThresh = 50;\r
1245         pOdmRA->LowRSSIThresh = 20;\r
1246 }\r
1247 /*-----------------------------------------------------------------------------\r
1248  * Function:    odm_RefreshRateAdaptiveMask()\r
1249  *\r
1250  * Overview:    Update rate table mask according to rssi\r
1251  *\r
1252  * Input:               NONE\r
1253  *\r
1254  * Output:              NONE\r
1255  *\r
1256  * Return:              NONE\r
1257  *\r
1258  * Revised History:\r
1259  *      When            Who             Remark\r
1260  *      05/27/2009      hpfan   Create Version 0.\r
1261  *\r
1262  *---------------------------------------------------------------------------*/\r
1263 VOID\r
1264 odm_RefreshRateAdaptiveMask(\r
1265         IN      PVOID   pDM_VOID\r
1266 )\r
1267 {\r
1268         PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
1269         ODM_RT_TRACE(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_TRACE, ("odm_RefreshRateAdaptiveMask()---------->\n"));\r
1270         if (!(pDM_Odm->SupportAbility & ODM_BB_RA_MASK)) {\r
1271                 ODM_RT_TRACE(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_TRACE, ("odm_RefreshRateAdaptiveMask(): Return cos not supported\n"));\r
1272                 return;\r
1273         }\r
1274         //\r
1275         // 2011/09/29 MH In HW integration first stage, we provide 4 different handle to operate\r
1276         // at the same time. In the stage2/3, we need to prive universal interface and merge all\r
1277         // HW dynamic mechanism.\r
1278         //\r
1279         switch  (pDM_Odm->SupportPlatform) {\r
1280         case    ODM_WIN:\r
1281                 odm_RefreshRateAdaptiveMaskMP(pDM_Odm);\r
1282                 break;\r
1283 \r
1284         case    ODM_CE:\r
1285                 odm_RefreshRateAdaptiveMaskCE(pDM_Odm);\r
1286                 break;\r
1287 \r
1288         case    ODM_AP:\r
1289         case    ODM_ADSL:\r
1290                 odm_RefreshRateAdaptiveMaskAPADSL(pDM_Odm);\r
1291                 break;\r
1292         }\r
1293 \r
1294 }\r
1295 \r
1296 VOID\r
1297 odm_RefreshRateAdaptiveMaskMP(\r
1298         IN              PVOID           pDM_VOID\r
1299 )\r
1300 {\r
1301 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\r
1302         PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
1303         PADAPTER                                pAdapter         =  pDM_Odm->Adapter;\r
1304         PADAPTER                                pTargetAdapter = NULL;\r
1305         HAL_DATA_TYPE                   *pHalData = GET_HAL_DATA(pAdapter);\r
1306         PMGNT_INFO                              pMgntInfo = GetDefaultMgntInfo(pAdapter);\r
1307 \r
1308         if (pAdapter->bDriverStopped) {\r
1309                 ODM_RT_TRACE(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_TRACE, ("<---- odm_RefreshRateAdaptiveMask(): driver is going to unload\n"));\r
1310                 return;\r
1311         }\r
1312 \r
1313         if (!pHalData->bUseRAMask) {\r
1314                 ODM_RT_TRACE(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_LOUD, ("<---- odm_RefreshRateAdaptiveMask(): driver does not control rate adaptive mask\n"));\r
1315                 return;\r
1316         }\r
1317 \r
1318         // if default port is connected, update RA table for default port (infrastructure mode only)\r
1319         if (pMgntInfo->mAssoc && (!ACTING_AS_AP(pAdapter))) {\r
1320                 odm_RefreshLdpcRtsMP(pAdapter, pDM_Odm, pMgntInfo->mMacId,  pMgntInfo->IOTPeer, pHalData->UndecoratedSmoothedPWDB);\r
1321                 ODM_RT_TRACE(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_LOUD, ("odm_RefreshRateAdaptiveMask(): Infrasture Mode\n"));\r
1322                 if (ODM_RAStateCheck(pDM_Odm, pHalData->UndecoratedSmoothedPWDB, pMgntInfo->bSetTXPowerTrainingByOid, &pMgntInfo->Ratr_State)) {\r
1323                         ODM_PRINT_ADDR(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_LOUD, ("Target AP addr : "), pMgntInfo->Bssid);\r
1324                         ODM_RT_TRACE(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_LOUD, ("RSSI:%d, RSSI_LEVEL:%d\n", pHalData->UndecoratedSmoothedPWDB, pMgntInfo->Ratr_State));\r
1325                         pAdapter->HalFunc.UpdateHalRAMaskHandler(pAdapter, pMgntInfo->mMacId, NULL, pMgntInfo->Ratr_State);\r
1326                 } else if (pDM_Odm->bChangeState) {\r
1327                         ODM_PRINT_ADDR(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_LOUD, ("Target AP addr : "), pMgntInfo->Bssid);\r
1328                         ODM_RT_TRACE(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_LOUD, ("Change Power Training State, bDisablePowerTraining = %d\n", pDM_Odm->bDisablePowerTraining));\r
1329                         pAdapter->HalFunc.UpdateHalRAMaskHandler(pAdapter, pMgntInfo->mMacId, NULL, pMgntInfo->Ratr_State);\r
1330                 }\r
1331         }\r
1332 \r
1333         //\r
1334         // The following part configure AP/VWifi/IBSS rate adaptive mask.\r
1335         //\r
1336 \r
1337         if (pMgntInfo->mIbss)   // Target: AP/IBSS peer.\r
1338                 pTargetAdapter = GetDefaultAdapter(pAdapter);\r
1339         else\r
1340                 pTargetAdapter = GetFirstAPAdapter(pAdapter);\r
1341 \r
1342         // if extension port (softap) is started, updaet RA table for more than one clients associate\r
1343         if (pTargetAdapter != NULL) {\r
1344                 int     i;\r
1345                 PRT_WLAN_STA    pEntry;\r
1346 \r
1347                 for (i = 0; i < ODM_ASSOCIATE_ENTRY_NUM; i++) {\r
1348                         pEntry = AsocEntry_EnumStation(pTargetAdapter, i);\r
1349                         if (NULL != pEntry) {\r
1350                                 if (pEntry->bAssociated) {\r
1351                                         odm_RefreshLdpcRtsMP(pAdapter, pDM_Odm, pEntry->AssociatedMacId, pEntry->IOTPeer, pEntry->rssi_stat.UndecoratedSmoothedPWDB);\r
1352 \r
1353                                         if (ODM_RAStateCheck(pDM_Odm, pEntry->rssi_stat.UndecoratedSmoothedPWDB, pMgntInfo->bSetTXPowerTrainingByOid, &pEntry->Ratr_State)) {\r
1354                                                 ODM_PRINT_ADDR(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_LOUD, ("Target STA addr : "), pEntry->MacAddr);\r
1355                                                 ODM_RT_TRACE(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_LOUD, ("RSSI:%d, RSSI_LEVEL:%d\n", pEntry->rssi_stat.UndecoratedSmoothedPWDB, pEntry->Ratr_State));\r
1356                                                 pAdapter->HalFunc.UpdateHalRAMaskHandler(pTargetAdapter, pEntry->AssociatedMacId, pEntry, pEntry->Ratr_State);\r
1357                                         } else if (pDM_Odm->bChangeState) {\r
1358                                                 ODM_RT_TRACE(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_LOUD, ("Change Power Training State, bDisablePowerTraining = %d\n", pDM_Odm->bDisablePowerTraining));\r
1359                                                 pAdapter->HalFunc.UpdateHalRAMaskHandler(pAdapter, pMgntInfo->mMacId, NULL, pMgntInfo->Ratr_State);\r
1360                                         }\r
1361                                 }\r
1362                         }\r
1363                 }\r
1364         }\r
1365 \r
1366         if (pMgntInfo->bSetTXPowerTrainingByOid)\r
1367                 pMgntInfo->bSetTXPowerTrainingByOid = FALSE;\r
1368 #endif  // #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\r
1369 }\r
1370 \r
1371 \r
1372 VOID\r
1373 odm_RefreshRateAdaptiveMaskCE(\r
1374         IN      PVOID   pDM_VOID\r
1375 )\r
1376 {\r
1377 #if (DM_ODM_SUPPORT_TYPE == ODM_CE)\r
1378         PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
1379         u1Byte  i;\r
1380         PADAPTER        pAdapter         =  pDM_Odm->Adapter;\r
1381         PODM_RATE_ADAPTIVE              pRA = &pDM_Odm->RateAdaptive;\r
1382 \r
1383         if (pAdapter->bDriverStopped) {\r
1384                 ODM_RT_TRACE(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_TRACE, ("<---- odm_RefreshRateAdaptiveMask(): driver is going to unload\n"));\r
1385                 return;\r
1386         }\r
1387 \r
1388         if (!pDM_Odm->bUseRAMask) {\r
1389                 ODM_RT_TRACE(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_LOUD, ("<---- odm_RefreshRateAdaptiveMask(): driver does not control rate adaptive mask\n"));\r
1390                 return;\r
1391         }\r
1392 \r
1393         //printk("==> %s \n",__FUNCTION__);\r
1394 \r
1395         for (i = 0; i < ODM_ASSOCIATE_ENTRY_NUM; i++) {\r
1396                 PSTA_INFO_T pstat = pDM_Odm->pODM_StaInfo[i];\r
1397                 if (IS_STA_VALID(pstat)) {\r
1398                         if (IS_MCAST(pstat->hwaddr))  //if(psta->mac_id ==1)\r
1399                                 continue;\r
1400                         if (IS_MCAST(pstat->hwaddr))\r
1401                                 continue;\r
1402 \r
1403 #if((RTL8812A_SUPPORT==1)||(RTL8821A_SUPPORT==1))\r
1404                         if ((pDM_Odm->SupportICType == ODM_RTL8812) || (pDM_Odm->SupportICType == ODM_RTL8821)) {\r
1405                                 if (pstat->rssi_stat.UndecoratedSmoothedPWDB < pRA->LdpcThres) {\r
1406                                         pRA->bUseLdpc = TRUE;\r
1407                                         pRA->bLowerRtsRate = TRUE;\r
1408                                         if ((pDM_Odm->SupportICType == ODM_RTL8821) && (pDM_Odm->CutVersion == ODM_CUT_A))\r
1409                                                 Set_RA_LDPC_8812(pstat, TRUE);\r
1410                                         //DbgPrint("RSSI=%d, bUseLdpc = TRUE\n", pHalData->UndecoratedSmoothedPWDB);\r
1411                                 } else if (pstat->rssi_stat.UndecoratedSmoothedPWDB > (pRA->LdpcThres - 5)) {\r
1412                                         pRA->bUseLdpc = FALSE;\r
1413                                         pRA->bLowerRtsRate = FALSE;\r
1414                                         if ((pDM_Odm->SupportICType == ODM_RTL8821) && (pDM_Odm->CutVersion == ODM_CUT_A))\r
1415                                                 Set_RA_LDPC_8812(pstat, FALSE);\r
1416                                         //DbgPrint("RSSI=%d, bUseLdpc = FALSE\n", pHalData->UndecoratedSmoothedPWDB);\r
1417                                 }\r
1418                         }\r
1419 #endif\r
1420 \r
1421                         if (TRUE == ODM_RAStateCheck(pDM_Odm, pstat->rssi_stat.UndecoratedSmoothedPWDB, FALSE , &pstat->rssi_level)) {\r
1422                                 ODM_RT_TRACE(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_LOUD, ("RSSI:%d, RSSI_LEVEL:%d\n", pstat->rssi_stat.UndecoratedSmoothedPWDB, pstat->rssi_level));\r
1423                                 //printk("RSSI:%d, RSSI_LEVEL:%d\n", pstat->rssi_stat.UndecoratedSmoothedPWDB, pstat->rssi_level);\r
1424                                 rtw_hal_update_ra_mask(pstat, pstat->rssi_level);\r
1425                         } else if (pDM_Odm->bChangeState) {\r
1426                                 ODM_RT_TRACE(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_LOUD, ("Change Power Training State, bDisablePowerTraining = %d\n", pDM_Odm->bDisablePowerTraining));\r
1427                                 rtw_hal_update_ra_mask(pstat, pstat->rssi_level);\r
1428                         }\r
1429 \r
1430                 }\r
1431         }\r
1432 \r
1433 #endif\r
1434 }\r
1435 \r
1436 VOID\r
1437 odm_RefreshRateAdaptiveMaskAPADSL(\r
1438         IN      PVOID   pDM_VOID\r
1439 )\r
1440 {\r
1441 #if (DM_ODM_SUPPORT_TYPE & ODM_AP)\r
1442         PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
1443         struct rtl8192cd_priv *priv = pDM_Odm->priv;\r
1444         struct aid_obj *aidarray;\r
1445         u4Byte i;\r
1446         PSTA_INFO_T pstat;\r
1447 \r
1448         if (priv->up_time % 2)\r
1449                 return;\r
1450 \r
1451         for (i = 0; i < ODM_ASSOCIATE_ENTRY_NUM; i++) {\r
1452                 pstat = pDM_Odm->pODM_StaInfo[i];\r
1453 \r
1454                 if (IS_STA_VALID(pstat)) {\r
1455 #if defined(UNIVERSAL_REPEATER) || defined(MBSSID)\r
1456                         aidarray = container_of(pstat, struct aid_obj, station);\r
1457                         priv = aidarray->priv;\r
1458 #endif\r
1459 \r
1460                         if (!priv->pmib->dot11StationConfigEntry.autoRate)\r
1461                                 continue;\r
1462 \r
1463                         if (ODM_RAStateCheck(pDM_Odm, (s4Byte)pstat->rssi, FALSE, &pstat->rssi_level)) {\r
1464                                 ODM_PRINT_ADDR(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_LOUD, ("Target STA addr : "), pstat->hwaddr);\r
1465                                 ODM_RT_TRACE(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_LOUD, ("RSSI:%d, RSSI_LEVEL:%d\n", pstat->rssi, pstat->rssi_level));\r
1466 \r
1467 #if defined(CONFIG_PCI_HCI)\r
1468 #ifdef CONFIG_WLAN_HAL\r
1469                                 if (IS_HAL_CHIP(priv)) {\r
1470 #ifdef WDS\r
1471 //                                      if(!(pstat->state & WIFI_WDS))//if WDS donot setting\r
1472 #endif\r
1473                                         GET_HAL_INTERFACE(priv)->UpdateHalRAMaskHandler(priv, pstat, pstat->rssi_level);\r
1474                                 } else\r
1475 #endif\r
1476 #ifdef CONFIG_RTL_8812_SUPPORT\r
1477                                         if (GET_CHIP_VER(priv) == VERSION_8812E)\r
1478                                                 UpdateHalRAMask8812(priv, pstat, 3);\r
1479                                         else\r
1480 #endif\r
1481 #ifdef CONFIG_RTL_88E_SUPPORT\r
1482                                                 if (GET_CHIP_VER(priv) == VERSION_8188E) {\r
1483 #ifdef TXREPORT\r
1484                                                         add_RATid(priv, pstat);\r
1485 #endif\r
1486                                                 } else\r
1487 #endif\r
1488                                                 {\r
1489 #if defined(CONFIG_RTL_92D_SUPPORT) || defined(CONFIG_RTL_92C_SUPPORT)\r
1490                                                         add_update_RATid(priv, pstat);\r
1491 #endif\r
1492                                                 }\r
1493 #elif defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI)\r
1494                                 update_STA_RATid(priv, pstat);\r
1495 #endif\r
1496                         }\r
1497                 }\r
1498         }\r
1499 #endif\r
1500 }\r
1501 \r
1502 \r
1503 // Return Value: BOOLEAN\r
1504 // - TRUE: RATRState is changed.\r
1505 BOOLEAN\r
1506 ODM_RAStateCheck(\r
1507         IN              PVOID                   pDM_VOID,\r
1508         IN              s4Byte                  RSSI,\r
1509         IN              BOOLEAN                 bForceUpdate,\r
1510         OUT             pu1Byte                 pRATRState\r
1511 )\r
1512 {\r
1513         PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
1514         PODM_RATE_ADAPTIVE pRA = &pDM_Odm->RateAdaptive;\r
1515         const u1Byte GoUpGap = 5;\r
1516         u1Byte HighRSSIThreshForRA = pRA->HighRSSIThresh;\r
1517         u1Byte LowRSSIThreshForRA = pRA->LowRSSIThresh;\r
1518         u1Byte RATRState;\r
1519 \r
1520         // Threshold Adjustment:\r
1521         // when RSSI state trends to go up one or two levels, make sure RSSI is high enough.\r
1522         // Here GoUpGap is added to solve the boundary's level alternation issue.\r
1523 #if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))\r
1524         u1Byte UltraLowRSSIThreshForRA = pRA->UltraLowRSSIThresh;\r
1525         if (pDM_Odm->SupportICType == ODM_RTL8881A)\r
1526                 LowRSSIThreshForRA = 30;                // for LDPC / BCC switch\r
1527 #endif\r
1528 \r
1529         switch (*pRATRState) {\r
1530         case DM_RATR_STA_INIT:\r
1531         case DM_RATR_STA_HIGH:\r
1532                 break;\r
1533 \r
1534         case DM_RATR_STA_MIDDLE:\r
1535                 HighRSSIThreshForRA += GoUpGap;\r
1536                 break;\r
1537 \r
1538         case DM_RATR_STA_LOW:\r
1539                 HighRSSIThreshForRA += GoUpGap;\r
1540                 LowRSSIThreshForRA += GoUpGap;\r
1541                 break;\r
1542 \r
1543 #if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))\r
1544         case DM_RATR_STA_ULTRA_LOW:\r
1545                 HighRSSIThreshForRA += GoUpGap;\r
1546                 LowRSSIThreshForRA += GoUpGap;\r
1547                 UltraLowRSSIThreshForRA += GoUpGap;\r
1548                 break;\r
1549 #endif\r
1550 \r
1551         default:\r
1552                 ODM_RT_ASSERT(pDM_Odm, FALSE, ("wrong rssi level setting %d !", *pRATRState));\r
1553                 break;\r
1554         }\r
1555 \r
1556         // Decide RATRState by RSSI.\r
1557         if (RSSI > HighRSSIThreshForRA)\r
1558                 RATRState = DM_RATR_STA_HIGH;\r
1559         else if (RSSI > LowRSSIThreshForRA)\r
1560                 RATRState = DM_RATR_STA_MIDDLE;\r
1561 \r
1562 #if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))\r
1563         else if (RSSI > UltraLowRSSIThreshForRA)\r
1564                 RATRState = DM_RATR_STA_LOW;\r
1565         else\r
1566                 RATRState = DM_RATR_STA_ULTRA_LOW;\r
1567 #else\r
1568         else\r
1569                 RATRState = DM_RATR_STA_LOW;\r
1570 #endif\r
1571         //printk("==>%s,RATRState:0x%02x ,RSSI:%d \n",__FUNCTION__,RATRState,RSSI);\r
1572 \r
1573         if (*pRATRState != RATRState || bForceUpdate) {\r
1574                 ODM_RT_TRACE(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_LOUD, ("RSSI Level %d -> %d\n", *pRATRState, RATRState));\r
1575                 *pRATRState = RATRState;\r
1576                 return TRUE;\r
1577         }\r
1578 \r
1579         return FALSE;\r
1580 }\r
1581 \r
1582 VOID\r
1583 odm_RefreshBasicRateMask(\r
1584         IN      PVOID   pDM_VOID\r
1585 )\r
1586 {\r
1587 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\r
1588         PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
1589         PADAPTER                Adapter  =  pDM_Odm->Adapter;\r
1590         static u1Byte           Stage = 0;\r
1591         u1Byte                  CurStage = 0;\r
1592         OCTET_STRING    osRateSet;\r
1593         PMGNT_INFO              pMgntInfo = GetDefaultMgntInfo(Adapter);\r
1594         u1Byte                  RateSet[5] = {MGN_1M, MGN_2M, MGN_5_5M, MGN_11M, MGN_6M};\r
1595 \r
1596         if (pDM_Odm->SupportICType != ODM_RTL8812 && pDM_Odm->SupportICType != ODM_RTL8821)\r
1597                 return;\r
1598 \r
1599         if (pDM_Odm->bLinked == FALSE)  // unlink Default port information\r
1600                 CurStage = 0;\r
1601         else if (pDM_Odm->RSSI_Min < 40)        // link RSSI  < 40%\r
1602                 CurStage = 1;\r
1603         else if (pDM_Odm->RSSI_Min > 45)        // link RSSI > 45%\r
1604                 CurStage = 3;\r
1605         else\r
1606                 CurStage = 2;                                   // link  25% <= RSSI <= 30%\r
1607 \r
1608         if (CurStage != Stage) {\r
1609                 if (CurStage == 1) {\r
1610                         FillOctetString(osRateSet, RateSet, 5);\r
1611                         FilterSupportRate(pMgntInfo->mBrates, &osRateSet, FALSE);\r
1612                         Adapter->HalFunc.SetHwRegHandler(Adapter, HW_VAR_BASIC_RATE, (pu1Byte)&osRateSet);\r
1613                 } else if (CurStage == 3 && (Stage == 1 || Stage == 2))\r
1614                         Adapter->HalFunc.SetHwRegHandler(Adapter, HW_VAR_BASIC_RATE, (pu1Byte)(&pMgntInfo->mBrates));\r
1615         }\r
1616 \r
1617         Stage = CurStage;\r
1618 #endif\r
1619 }\r
1620 \r
1621 \r
1622 VOID\r
1623 phydm_ra_info_init(\r
1624         IN      PVOID   pDM_VOID\r
1625         )\r
1626 {\r
1627         PDM_ODM_T       pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
1628 \r
1629         #if (defined(CONFIG_RA_DYNAMIC_RTY_LIMIT))\r
1630         phydm_ra_dynamic_retry_limit_init(pDM_Odm);\r
1631         #endif\r
1632         #if (DM_ODM_SUPPORT_TYPE == ODM_AP)\r
1633         phydm_ra_dynamic_rate_id_init(pDM_Odm);\r
1634         #endif\r
1635 }\r
1636 \r
1637 \r
1638 #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN | ODM_CE))\r
1639 u1Byte\r
1640 odm_Find_RTS_Rate(\r
1641         IN              PVOID                   pDM_VOID,\r
1642         IN              u1Byte                  Tx_Rate,\r
1643         IN              BOOLEAN                 bErpProtect\r
1644 )\r
1645 {\r
1646         PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
1647         u1Byte  RTS_Ini_Rate = ODM_RATE6M;\r
1648         \r
1649         if (bErpProtect) /* use CCK rate as RTS*/\r
1650                 RTS_Ini_Rate = ODM_RATE1M;\r
1651         else {\r
1652                 switch (Tx_Rate) {\r
1653                 case ODM_RATEVHTSS3MCS9:\r
1654                 case ODM_RATEVHTSS3MCS8:\r
1655                 case ODM_RATEVHTSS3MCS7:\r
1656                 case ODM_RATEVHTSS3MCS6:\r
1657                 case ODM_RATEVHTSS3MCS5:\r
1658                 case ODM_RATEVHTSS3MCS4:\r
1659                 case ODM_RATEVHTSS3MCS3:\r
1660                 case ODM_RATEVHTSS2MCS9:\r
1661                 case ODM_RATEVHTSS2MCS8:\r
1662                 case ODM_RATEVHTSS2MCS7:\r
1663                 case ODM_RATEVHTSS2MCS6:\r
1664                 case ODM_RATEVHTSS2MCS5:\r
1665                 case ODM_RATEVHTSS2MCS4:\r
1666                 case ODM_RATEVHTSS2MCS3:\r
1667                 case ODM_RATEVHTSS1MCS9:\r
1668                 case ODM_RATEVHTSS1MCS8:\r
1669                 case ODM_RATEVHTSS1MCS7:\r
1670                 case ODM_RATEVHTSS1MCS6:\r
1671                 case ODM_RATEVHTSS1MCS5:\r
1672                 case ODM_RATEVHTSS1MCS4:\r
1673                 case ODM_RATEVHTSS1MCS3:\r
1674                 case ODM_RATEMCS15:\r
1675                 case ODM_RATEMCS14:\r
1676                 case ODM_RATEMCS13:\r
1677                 case ODM_RATEMCS12:\r
1678                 case ODM_RATEMCS11:\r
1679                 case ODM_RATEMCS7:\r
1680                 case ODM_RATEMCS6:\r
1681                 case ODM_RATEMCS5:\r
1682                 case ODM_RATEMCS4:\r
1683                 case ODM_RATEMCS3:\r
1684                 case ODM_RATE54M:\r
1685                 case ODM_RATE48M:\r
1686                 case ODM_RATE36M:\r
1687                 case ODM_RATE24M:               \r
1688                         RTS_Ini_Rate = ODM_RATE24M;\r
1689                         break;\r
1690                 case ODM_RATEVHTSS3MCS2:\r
1691                 case ODM_RATEVHTSS3MCS1:\r
1692                 case ODM_RATEVHTSS2MCS2:\r
1693                 case ODM_RATEVHTSS2MCS1:\r
1694                 case ODM_RATEVHTSS1MCS2:\r
1695                 case ODM_RATEVHTSS1MCS1:\r
1696                 case ODM_RATEMCS10:\r
1697                 case ODM_RATEMCS9:\r
1698                 case ODM_RATEMCS2:\r
1699                 case ODM_RATEMCS1:\r
1700                 case ODM_RATE18M:\r
1701                 case ODM_RATE12M:\r
1702                         RTS_Ini_Rate = ODM_RATE12M;\r
1703                         break;\r
1704                 case ODM_RATEVHTSS3MCS0:\r
1705                 case ODM_RATEVHTSS2MCS0:\r
1706                 case ODM_RATEVHTSS1MCS0:\r
1707                 case ODM_RATEMCS8:\r
1708                 case ODM_RATEMCS0:\r
1709                 case ODM_RATE9M:\r
1710                 case ODM_RATE6M:\r
1711                         RTS_Ini_Rate = ODM_RATE6M;\r
1712                         break;\r
1713                 case ODM_RATE11M:\r
1714                 case ODM_RATE5_5M:\r
1715                 case ODM_RATE2M:\r
1716                 case ODM_RATE1M:\r
1717                         RTS_Ini_Rate = ODM_RATE1M;\r
1718                         break;\r
1719                 default:\r
1720                         RTS_Ini_Rate = ODM_RATE6M;\r
1721                         break;\r
1722                 }\r
1723         }\r
1724 \r
1725         if (*pDM_Odm->pBandType == 1) {\r
1726                 if (RTS_Ini_Rate < ODM_RATE6M)\r
1727                         RTS_Ini_Rate = ODM_RATE6M;\r
1728         }\r
1729         return RTS_Ini_Rate;\r
1730 \r
1731 }\r
1732 \r
1733 VOID\r
1734 odm_Set_RA_DM_ARFB_by_Noisy(\r
1735         IN      PDM_ODM_T       pDM_Odm\r
1736 )\r
1737 {\r
1738         /*DbgPrint("DM_ARFB ====>\n");*/\r
1739         if (pDM_Odm->bNoisyState) {\r
1740                 ODM_Write4Byte(pDM_Odm, 0x430, 0x00000000);\r
1741                 ODM_Write4Byte(pDM_Odm, 0x434, 0x05040200);\r
1742                 /*DbgPrint("DM_ARFB ====> Noisy State\n");*/\r
1743         } else {\r
1744                 ODM_Write4Byte(pDM_Odm, 0x430, 0x02010000);\r
1745                 ODM_Write4Byte(pDM_Odm, 0x434, 0x07050403);\r
1746                 /*DbgPrint("DM_ARFB ====> Clean State\n");*/\r
1747         }\r
1748 \r
1749 }\r
1750 \r
1751 VOID\r
1752 ODM_UpdateNoisyState(\r
1753         IN      PVOID           pDM_VOID,\r
1754         IN      BOOLEAN         bNoisyStateFromC2H\r
1755 )\r
1756 {\r
1757         PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
1758 \r
1759         /*DbgPrint("Get C2H Command! NoisyState=0x%x\n ", bNoisyStateFromC2H);*/\r
1760         if (pDM_Odm->SupportICType == ODM_RTL8821  || pDM_Odm->SupportICType == ODM_RTL8812  ||\r
1761                 pDM_Odm->SupportICType == ODM_RTL8723B || pDM_Odm->SupportICType == ODM_RTL8192E || pDM_Odm->SupportICType == ODM_RTL8188E)\r
1762                 pDM_Odm->bNoisyState = bNoisyStateFromC2H;\r
1763         odm_Set_RA_DM_ARFB_by_Noisy(pDM_Odm);\r
1764 };\r
1765 \r
1766 u4Byte\r
1767 Set_RA_DM_Ratrbitmap_by_Noisy(\r
1768         IN      PVOID                   pDM_VOID,\r
1769         IN      WIRELESS_MODE   WirelessMode,\r
1770         IN      u4Byte                  ratr_bitmap,\r
1771         IN      u1Byte                  rssi_level\r
1772 )\r
1773 {\r
1774         PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
1775         u4Byte ret_bitmap = ratr_bitmap;\r
1776         \r
1777         switch (WirelessMode) {\r
1778         case WIRELESS_MODE_AC_24G:\r
1779         case WIRELESS_MODE_AC_5G:\r
1780         case WIRELESS_MODE_AC_ONLY:\r
1781                 if (pDM_Odm->bNoisyState) { /*in Noisy State*/\r
1782                         if (rssi_level == 1)\r
1783                                 ret_bitmap &= 0xfe3f0e08;\r
1784                         else if (rssi_level == 2)\r
1785                                 ret_bitmap &= 0xff3f8f8c;\r
1786                         else if (rssi_level == 3)\r
1787                                 ret_bitmap &= 0xffffffff;\r
1788                         else\r
1789                                 ret_bitmap &= 0xffffffff;\r
1790                 } else {                                /* in SNR State*/\r
1791                         if (rssi_level == 1)\r
1792                                 ret_bitmap &= 0xfc3e0c08;\r
1793                         else if (rssi_level == 2)\r
1794                                 ret_bitmap &= 0xfe3f0e08;\r
1795                         else if (rssi_level == 3)\r
1796                                 ret_bitmap &= 0xffffffff;\r
1797                         else\r
1798                                 ret_bitmap &= 0xffffffff;\r
1799                 }\r
1800                 break;\r
1801         case WIRELESS_MODE_B:\r
1802         case WIRELESS_MODE_A:\r
1803         case WIRELESS_MODE_G:\r
1804         case WIRELESS_MODE_N_24G:\r
1805         case WIRELESS_MODE_N_5G:\r
1806                 if (pDM_Odm->bNoisyState) {\r
1807                         if (rssi_level == 1)\r
1808                                 ret_bitmap &= 0x0f0e0c08;\r
1809                         else if (rssi_level == 2)\r
1810                                 ret_bitmap &= 0x0f8f0e0c;\r
1811                         else if (rssi_level == 3)\r
1812                                 ret_bitmap &= 0xffffffff;\r
1813                         else\r
1814                                 ret_bitmap &= 0xffffffff;\r
1815                 } else {\r
1816                         if (rssi_level == 1)\r
1817                                 ret_bitmap &= 0x0f8f0e08;\r
1818                         else if (rssi_level == 2)\r
1819                                 ret_bitmap &= 0x0fcf8f8c;\r
1820                         else if (rssi_level == 3)\r
1821                                 ret_bitmap &= 0xffffffff;\r
1822                         else\r
1823                                 ret_bitmap &= 0xffffffff;\r
1824                 }\r
1825                 break;\r
1826         default:\r
1827                 break;\r
1828         }\r
1829         /*DbgPrint("DM_RAMask ====> rssi_LV = %d, BITMAP = %x\n", rssi_level, ret_bitmap);*/\r
1830         return ret_bitmap;\r
1831 \r
1832 }\r
1833 \r
1834 VOID\r
1835 ODM_UpdateInitRate(\r
1836         IN      PVOID           pDM_VOID,\r
1837         IN      u1Byte          Rate\r
1838 )\r
1839 {\r
1840         PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
1841         u1Byte                  p = 0;\r
1842 \r
1843         ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, ("Get C2H Command! Rate=0x%x\n", Rate));\r
1844 \r
1845         if (pDM_Odm->SupportICType == ODM_RTL8821  || pDM_Odm->SupportICType == ODM_RTL8812  ||\r
1846                 pDM_Odm->SupportICType == ODM_RTL8723B || pDM_Odm->SupportICType == ODM_RTL8192E || pDM_Odm->SupportICType == ODM_RTL8188E) {\r
1847                 pDM_Odm->TxRate = Rate;\r
1848 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\r
1849 #if DEV_BUS_TYPE == RT_PCI_INTERFACE\r
1850 #if USE_WORKITEM\r
1851                 PlatformScheduleWorkItem(&pDM_Odm->RaRptWorkitem);\r
1852 #else\r
1853                 if (pDM_Odm->SupportICType == ODM_RTL8821) {\r
1854 #if (RTL8821A_SUPPORT == 1)\r
1855                         ODM_TxPwrTrackSetPwr8821A(pDM_Odm, MIX_MODE, ODM_RF_PATH_A, 0);\r
1856 #endif\r
1857                 } else if (pDM_Odm->SupportICType == ODM_RTL8812) {\r
1858                         for (p = ODM_RF_PATH_A; p < MAX_PATH_NUM_8812A; p++) {\r
1859 #if (RTL8812A_SUPPORT == 1)\r
1860                                 ODM_TxPwrTrackSetPwr8812A(pDM_Odm, MIX_MODE, p, 0);\r
1861 #endif\r
1862                         }\r
1863                 } else if (pDM_Odm->SupportICType == ODM_RTL8723B) {\r
1864 #if (RTL8723B_SUPPORT == 1)\r
1865                         ODM_TxPwrTrackSetPwr_8723B(pDM_Odm, MIX_MODE, ODM_RF_PATH_A, 0);\r
1866 #endif\r
1867                 } else if (pDM_Odm->SupportICType == ODM_RTL8192E) {\r
1868                         for (p = ODM_RF_PATH_A; p < MAX_PATH_NUM_8192E; p++) {\r
1869 #if (RTL8192E_SUPPORT == 1)\r
1870                                 ODM_TxPwrTrackSetPwr92E(pDM_Odm, MIX_MODE, p, 0);\r
1871 #endif\r
1872                         }\r
1873                 } else if (pDM_Odm->SupportICType == ODM_RTL8188E) {\r
1874 #if (RTL8188E_SUPPORT == 1)\r
1875                         ODM_TxPwrTrackSetPwr88E(pDM_Odm, MIX_MODE, ODM_RF_PATH_A, 0);\r
1876 #endif\r
1877                 }\r
1878 #endif\r
1879 #else\r
1880                 PlatformScheduleWorkItem(&pDM_Odm->RaRptWorkitem);\r
1881 #endif\r
1882 #endif\r
1883         } else\r
1884                 return;\r
1885 }\r
1886 \r
1887 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\r
1888 \r
1889 VOID\r
1890 odm_RSSIDumpToRegister(\r
1891         IN      PVOID   pDM_VOID\r
1892 )\r
1893 {\r
1894         PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
1895         PADAPTER                Adapter = pDM_Odm->Adapter;\r
1896 \r
1897         if (pDM_Odm->SupportICType == ODM_RTL8812) {\r
1898                 PlatformEFIOWrite1Byte(Adapter, rA_RSSIDump_Jaguar, Adapter->RxStats.RxRSSIPercentage[0]);\r
1899                 PlatformEFIOWrite1Byte(Adapter, rB_RSSIDump_Jaguar, Adapter->RxStats.RxRSSIPercentage[1]);\r
1900 \r
1901                 /* Rx EVM*/\r
1902                 PlatformEFIOWrite1Byte(Adapter, rS1_RXevmDump_Jaguar, Adapter->RxStats.RxEVMdbm[0]);\r
1903                 PlatformEFIOWrite1Byte(Adapter, rS2_RXevmDump_Jaguar, Adapter->RxStats.RxEVMdbm[1]);\r
1904 \r
1905                 /* Rx SNR*/\r
1906                 PlatformEFIOWrite1Byte(Adapter, rA_RXsnrDump_Jaguar, (u1Byte)(Adapter->RxStats.RxSNRdB[0]));\r
1907                 PlatformEFIOWrite1Byte(Adapter, rB_RXsnrDump_Jaguar, (u1Byte)(Adapter->RxStats.RxSNRdB[1]));\r
1908 \r
1909                 /* Rx Cfo_Short*/\r
1910                 PlatformEFIOWrite2Byte(Adapter, rA_CfoShortDump_Jaguar, Adapter->RxStats.RxCfoShort[0]);\r
1911                 PlatformEFIOWrite2Byte(Adapter, rB_CfoShortDump_Jaguar, Adapter->RxStats.RxCfoShort[1]);\r
1912 \r
1913                 /* Rx Cfo_Tail*/\r
1914                 PlatformEFIOWrite2Byte(Adapter, rA_CfoLongDump_Jaguar, Adapter->RxStats.RxCfoTail[0]);\r
1915                 PlatformEFIOWrite2Byte(Adapter, rB_CfoLongDump_Jaguar, Adapter->RxStats.RxCfoTail[1]);\r
1916         } else if (pDM_Odm->SupportICType == ODM_RTL8192E) {\r
1917                 PlatformEFIOWrite1Byte(Adapter, rA_RSSIDump_92E, Adapter->RxStats.RxRSSIPercentage[0]);\r
1918                 PlatformEFIOWrite1Byte(Adapter, rB_RSSIDump_92E, Adapter->RxStats.RxRSSIPercentage[1]);\r
1919                 /* Rx EVM*/\r
1920                 PlatformEFIOWrite1Byte(Adapter, rS1_RXevmDump_92E, Adapter->RxStats.RxEVMdbm[0]);\r
1921                 PlatformEFIOWrite1Byte(Adapter, rS2_RXevmDump_92E, Adapter->RxStats.RxEVMdbm[1]);\r
1922                 /* Rx SNR*/\r
1923                 PlatformEFIOWrite1Byte(Adapter, rA_RXsnrDump_92E, (u1Byte)(Adapter->RxStats.RxSNRdB[0]));\r
1924                 PlatformEFIOWrite1Byte(Adapter, rB_RXsnrDump_92E, (u1Byte)(Adapter->RxStats.RxSNRdB[1]));\r
1925                 /* Rx Cfo_Short*/\r
1926                 PlatformEFIOWrite2Byte(Adapter, rA_CfoShortDump_92E, Adapter->RxStats.RxCfoShort[0]);\r
1927                 PlatformEFIOWrite2Byte(Adapter, rB_CfoShortDump_92E, Adapter->RxStats.RxCfoShort[1]);\r
1928                 /* Rx Cfo_Tail*/\r
1929                 PlatformEFIOWrite2Byte(Adapter, rA_CfoLongDump_92E, Adapter->RxStats.RxCfoTail[0]);\r
1930                 PlatformEFIOWrite2Byte(Adapter, rB_CfoLongDump_92E, Adapter->RxStats.RxCfoTail[1]);\r
1931         }\r
1932 }\r
1933 \r
1934 VOID\r
1935 odm_RefreshLdpcRtsMP(\r
1936         IN      PADAPTER                        pAdapter,\r
1937         IN      PDM_ODM_T                       pDM_Odm,\r
1938         IN      u1Byte                          mMacId,\r
1939         IN      u1Byte                          IOTPeer,\r
1940         IN      s4Byte                          UndecoratedSmoothedPWDB\r
1941 )\r
1942 {\r
1943         BOOLEAN                                 bCtlLdpc = FALSE;\r
1944         PMGNT_INFO                              pMgntInfo = GetDefaultMgntInfo(pAdapter);\r
1945         PODM_RATE_ADAPTIVE              pRA = &pDM_Odm->RateAdaptive;\r
1946 \r
1947         if (pDM_Odm->SupportICType != ODM_RTL8821 && pDM_Odm->SupportICType != ODM_RTL8812)\r
1948                 return;\r
1949 \r
1950         if ((pDM_Odm->SupportICType == ODM_RTL8821) && (pDM_Odm->CutVersion == ODM_CUT_A))\r
1951                 bCtlLdpc = TRUE;\r
1952         else if (pDM_Odm->SupportICType == ODM_RTL8812 &&\r
1953                          IOTPeer == HT_IOT_PEER_REALTEK_JAGUAR_CCUTAP)\r
1954                 bCtlLdpc = TRUE;\r
1955 \r
1956         if (bCtlLdpc) {\r
1957                 if (UndecoratedSmoothedPWDB < (pRA->LdpcThres - 5))\r
1958                         MgntSet_TX_LDPC(pAdapter, mMacId, TRUE);\r
1959                 else if (UndecoratedSmoothedPWDB > pRA->LdpcThres)\r
1960                         MgntSet_TX_LDPC(pAdapter, mMacId, FALSE);\r
1961         }\r
1962 \r
1963         if (UndecoratedSmoothedPWDB < (pRA->RtsThres - 5))\r
1964                 pRA->bLowerRtsRate = TRUE;\r
1965         else if (UndecoratedSmoothedPWDB > pRA->RtsThres)\r
1966                 pRA->bLowerRtsRate = FALSE;\r
1967 }\r
1968 \r
1969 VOID\r
1970 ODM_DynamicARFBSelect(\r
1971         IN              PVOID           pDM_VOID,\r
1972         IN              u1Byte                  rate,\r
1973         IN              BOOLEAN                 Collision_State\r
1974 )\r
1975 {\r
1976         PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
1977         pRA_T                   pRA_Table = &pDM_Odm->DM_RA_Table;\r
1978 \r
1979         if (pDM_Odm->SupportICType != ODM_RTL8192E)\r
1980                 return;\r
1981 \r
1982         if (Collision_State == pRA_Table->PT_collision_pre)\r
1983                 return;\r
1984 \r
1985         if (rate >= DESC_RATEMCS8  && rate <= DESC_RATEMCS12) {\r
1986                 if (Collision_State == 1) {\r
1987                         if (rate == DESC_RATEMCS12) {\r
1988 \r
1989                                 ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E, 0x0);\r
1990                                 ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E+4, 0x07060501);\r
1991                         } else if (rate == DESC_RATEMCS11) {\r
1992 \r
1993                                 ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E, 0x0);\r
1994                                 ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E+4, 0x07070605);\r
1995                         } else if (rate == DESC_RATEMCS10) {\r
1996 \r
1997                                 ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E, 0x0);\r
1998                                 ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E+4, 0x08080706);\r
1999                         } else if (rate == DESC_RATEMCS9) {\r
2000 \r
2001                                 ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E, 0x0);\r
2002                                 ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E+4, 0x08080707);\r
2003                         } else {\r
2004 \r
2005                                 ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E, 0x0);\r
2006                                 ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E+4, 0x09090808);\r
2007                         }\r
2008                 } else { /* Collision_State == 0*/\r
2009                         if (rate == DESC_RATEMCS12) {\r
2010 \r
2011                                 ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E, 0x05010000);\r
2012                                 ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E+4, 0x09080706);\r
2013                         } else if (rate == DESC_RATEMCS11) {\r
2014 \r
2015                                 ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E, 0x06050000);\r
2016                                 ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E+4, 0x09080807);\r
2017                         } else if (rate == DESC_RATEMCS10) {\r
2018 \r
2019                                 ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E, 0x07060000);\r
2020                                 ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E+4, 0x0a090908);\r
2021                         } else if (rate == DESC_RATEMCS9) {\r
2022 \r
2023                                 ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E, 0x07070000);\r
2024                                 ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E+4, 0x0a090808);\r
2025                         } else {\r
2026 \r
2027                                 ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E, 0x08080000);\r
2028                                 ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E+4, 0x0b0a0909);\r
2029                         }\r
2030                 }\r
2031         } else { /* MCS13~MCS15,  1SS, G-mode*/\r
2032                 if (Collision_State == 1) {\r
2033                         if (rate == DESC_RATEMCS15) {\r
2034 \r
2035                                 ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E, 0x00000000);\r
2036                                 ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E+4, 0x05040302);\r
2037                         } else if (rate == DESC_RATEMCS14) {\r
2038 \r
2039                                 ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E, 0x00000000);\r
2040                                 ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E+4, 0x06050302);\r
2041                         } else if (rate == DESC_RATEMCS13) {\r
2042 \r
2043                                 ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E, 0x00000000);\r
2044                                 ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E+4, 0x07060502);\r
2045                         } else {\r
2046 \r
2047                                 ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E, 0x00000000);\r
2048                                 ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E+4, 0x06050402);\r
2049                         }\r
2050                 } else { // Collision_State == 0\r
2051                         if (rate == DESC_RATEMCS15) {\r
2052 \r
2053                                 ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E, 0x03020000);\r
2054                                 ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E+4, 0x07060504);\r
2055                         } else if (rate == DESC_RATEMCS14) {\r
2056 \r
2057                                 ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E, 0x03020000);\r
2058                                 ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E+4, 0x08070605);\r
2059                         } else if (rate == DESC_RATEMCS13) {\r
2060 \r
2061                                 ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E, 0x05020000);\r
2062                                 ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E+4, 0x09080706);\r
2063                         } else {\r
2064 \r
2065                                 ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E, 0x04020000);\r
2066                                 ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E+4, 0x08070605);\r
2067                         }\r
2068 \r
2069 \r
2070                 }\r
2071 \r
2072         }\r
2073         pRA_Table->PT_collision_pre = Collision_State;\r
2074 }\r
2075 \r
2076 VOID\r
2077 ODM_RateAdaptiveStateApInit(\r
2078         IN      PVOID           PADAPTER_VOID,\r
2079         IN      PRT_WLAN_STA    pEntry\r
2080 )\r
2081 {\r
2082         PADAPTER                Adapter = (PADAPTER)PADAPTER_VOID;\r
2083         pEntry->Ratr_State = DM_RATR_STA_INIT;\r
2084 }\r
2085 #elif (DM_ODM_SUPPORT_TYPE == ODM_CE) /*#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)*/\r
2086 \r
2087 static void\r
2088 FindMinimumRSSI(\r
2089         IN      PADAPTER        pAdapter\r
2090 )\r
2091 {\r
2092         HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(pAdapter);\r
2093         PDM_ODM_T               pDM_Odm = &(pHalData->odmpriv);\r
2094 \r
2095         /*Determine the minimum RSSI*/\r
2096 \r
2097         if ((pDM_Odm->bLinked != _TRUE) &&\r
2098                 (pHalData->EntryMinUndecoratedSmoothedPWDB == 0)) {\r
2099                 pHalData->MinUndecoratedPWDBForDM = 0;\r
2100                 /*ODM_RT_TRACE(pDM_Odm,COMP_BB_POWERSAVING, DBG_LOUD, ("Not connected to any\n"));*/\r
2101         } else\r
2102                 pHalData->MinUndecoratedPWDBForDM = pHalData->EntryMinUndecoratedSmoothedPWDB;\r
2103 \r
2104         /*DBG_8192C("%s=>MinUndecoratedPWDBForDM(%d)\n",__FUNCTION__,pdmpriv->MinUndecoratedPWDBForDM);*/\r
2105         /*ODM_RT_TRACE(pDM_Odm,COMP_DIG, DBG_LOUD, ("MinUndecoratedPWDBForDM =%d\n",pHalData->MinUndecoratedPWDBForDM));*/\r
2106 }\r
2107 \r
2108 u8Byte\r
2109 PhyDM_Get_Rate_Bitmap_Ex(\r
2110         IN      PVOID           pDM_VOID,\r
2111         IN      u4Byte          macid,\r
2112         IN      u8Byte          ra_mask,\r
2113         IN      u1Byte          rssi_level,\r
2114         OUT             u8Byte  *dm_RA_Mask,\r
2115         OUT             u1Byte  *dm_RteID\r
2116 )\r
2117 {\r
2118         PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
2119         PSTA_INFO_T     pEntry;\r
2120         u8Byte  rate_bitmap = 0;\r
2121         u1Byte  WirelessMode;\r
2122 \r
2123         pEntry = pDM_Odm->pODM_StaInfo[macid];\r
2124         if (!IS_STA_VALID(pEntry))\r
2125                 return ra_mask;\r
2126         WirelessMode = pEntry->wireless_mode;\r
2127         switch (WirelessMode) {\r
2128         case ODM_WM_B:\r
2129                 if (ra_mask & 0x000000000000000c) /* 11M or 5.5M enable */\r
2130                         rate_bitmap = 0x000000000000000d;\r
2131                 else\r
2132                         rate_bitmap = 0x000000000000000f;\r
2133                 break;\r
2134 \r
2135         case (ODM_WM_G):\r
2136         case (ODM_WM_A):\r
2137                 if (rssi_level == DM_RATR_STA_HIGH)\r
2138                         rate_bitmap = 0x0000000000000f00;\r
2139                 else\r
2140                         rate_bitmap = 0x0000000000000ff0;\r
2141                 break;\r
2142 \r
2143         case (ODM_WM_B|ODM_WM_G):\r
2144                 if (rssi_level == DM_RATR_STA_HIGH)\r
2145                         rate_bitmap = 0x0000000000000f00;\r
2146                 else if (rssi_level == DM_RATR_STA_MIDDLE)\r
2147                         rate_bitmap = 0x0000000000000ff0;\r
2148                 else\r
2149                         rate_bitmap = 0x0000000000000ff5;\r
2150                 break;\r
2151 \r
2152         case (ODM_WM_B|ODM_WM_G|ODM_WM_N24G):\r
2153         case (ODM_WM_B|ODM_WM_N24G):\r
2154         case (ODM_WM_G|ODM_WM_N24G):\r
2155         case (ODM_WM_A|ODM_WM_N5G): {\r
2156                 if (pDM_Odm->RFType == ODM_1T2R || pDM_Odm->RFType == ODM_1T1R) {\r
2157                         if (rssi_level == DM_RATR_STA_HIGH)\r
2158                                 rate_bitmap = 0x00000000000f0000;\r
2159                         else if (rssi_level == DM_RATR_STA_MIDDLE)\r
2160                                 rate_bitmap = 0x00000000000ff000;\r
2161                         else {\r
2162                                 if (*(pDM_Odm->pBandWidth) == ODM_BW40M)\r
2163                                         rate_bitmap = 0x00000000000ff015;\r
2164                                 else\r
2165                                         rate_bitmap = 0x00000000000ff005;\r
2166                         }\r
2167                 } else if (pDM_Odm->RFType == ODM_2T2R  || pDM_Odm->RFType == ODM_2T3R  || pDM_Odm->RFType == ODM_2T4R) {\r
2168                         if (rssi_level == DM_RATR_STA_HIGH)\r
2169                                 rate_bitmap = 0x000000000f8f0000;\r
2170                         else if (rssi_level == DM_RATR_STA_MIDDLE)\r
2171                                 rate_bitmap = 0x000000000f8ff000;\r
2172                         else {\r
2173                                 if (*(pDM_Odm->pBandWidth) == ODM_BW40M)\r
2174                                         rate_bitmap = 0x000000000f8ff015;\r
2175                                 else\r
2176                                         rate_bitmap = 0x000000000f8ff005;\r
2177                         }\r
2178                 } else {\r
2179                         if (rssi_level == DM_RATR_STA_HIGH)\r
2180                                 rate_bitmap = 0x0000000f0f0f0000;\r
2181                         else if (rssi_level == DM_RATR_STA_MIDDLE)\r
2182                                 rate_bitmap = 0x0000000fcfcfe000;\r
2183                         else {\r
2184                                 if (*(pDM_Odm->pBandWidth) == ODM_BW40M)\r
2185                                         rate_bitmap = 0x0000000ffffff015;\r
2186                                 else\r
2187                                         rate_bitmap = 0x0000000ffffff005;\r
2188                         }\r
2189                 }\r
2190         }\r
2191         break;\r
2192 \r
2193         case (ODM_WM_AC|ODM_WM_G):\r
2194                 if (rssi_level == 1)\r
2195                         rate_bitmap = 0x00000000fc3f0000;\r
2196                 else if (rssi_level == 2)\r
2197                         rate_bitmap = 0x00000000fffff000;\r
2198                 else\r
2199                         rate_bitmap = 0x00000000ffffffff;\r
2200                 break;\r
2201 \r
2202         case (ODM_WM_AC|ODM_WM_A):\r
2203 \r
2204                 if (pDM_Odm->RFType == ODM_1T2R || pDM_Odm->RFType == ODM_1T1R) {\r
2205                         if (rssi_level == 1)                            /* add by Gary for ac-series */\r
2206                                 rate_bitmap = 0x00000000003f8000;\r
2207                         else if (rssi_level == 2)\r
2208                                 rate_bitmap = 0x00000000003fe000;\r
2209                         else\r
2210                                 rate_bitmap = 0x00000000003ff010;\r
2211                 } else if (pDM_Odm->RFType == ODM_2T2R  || pDM_Odm->RFType == ODM_2T3R  || pDM_Odm->RFType == ODM_2T4R) {\r
2212                         if (rssi_level == 1)                            /* add by Gary for ac-series */\r
2213                                 rate_bitmap = 0x00000000fe3f8000;       /* VHT 2SS MCS3~9 */\r
2214                         else if (rssi_level == 2)\r
2215                                 rate_bitmap = 0x00000000fffff000;       /* VHT 2SS MCS0~9 */\r
2216                         else\r
2217                                 rate_bitmap = 0x00000000fffff010;       /* All */\r
2218                 } else {\r
2219                         if (rssi_level == 1)                            /* add by Gary for ac-series */\r
2220                                 rate_bitmap = 0x000003f8fe3f8000ULL;       /* VHT 3SS MCS3~9 */\r
2221                         else if (rssi_level == 2)\r
2222                                 rate_bitmap = 0x000003fffffff000ULL;       /* VHT3SS MCS0~9 */\r
2223                         else\r
2224                                 rate_bitmap = 0x000003fffffff010ULL;       /* All */\r
2225                 }\r
2226                 break;\r
2227 \r
2228         default:\r
2229                 if (pDM_Odm->RFType == ODM_1T2R || pDM_Odm->RFType == ODM_1T1R)\r
2230                         rate_bitmap = 0x00000000000fffff;\r
2231                 else if (pDM_Odm->RFType == ODM_2T2R  || pDM_Odm->RFType == ODM_2T3R  || pDM_Odm->RFType == ODM_2T4R)\r
2232                         rate_bitmap = 0x000000000fffffff;\r
2233                 else\r
2234                         rate_bitmap = 0x0000003fffffffffULL;\r
2235                 break;\r
2236 \r
2237         }\r
2238         ODM_RT_TRACE(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_LOUD, (" ==> rssi_level:0x%02x, WirelessMode:0x%02x, rate_bitmap:0x%016llx\n", rssi_level, WirelessMode, rate_bitmap));\r
2239 \r
2240         return (ra_mask & rate_bitmap);\r
2241 }\r
2242 \r
2243 \r
2244 u4Byte\r
2245 ODM_Get_Rate_Bitmap(\r
2246         IN      PVOID           pDM_VOID,\r
2247         IN      u4Byte          macid,\r
2248         IN      u4Byte          ra_mask,\r
2249         IN      u1Byte          rssi_level\r
2250 )\r
2251 {\r
2252         PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
2253         PSTA_INFO_T     pEntry;\r
2254         u4Byte  rate_bitmap = 0;\r
2255         u1Byte  WirelessMode;\r
2256         //u1Byte        WirelessMode =*(pDM_Odm->pWirelessMode);\r
2257 \r
2258 \r
2259         pEntry = pDM_Odm->pODM_StaInfo[macid];\r
2260         if (!IS_STA_VALID(pEntry))\r
2261                 return ra_mask;\r
2262 \r
2263         WirelessMode = pEntry->wireless_mode;\r
2264 \r
2265         switch (WirelessMode) {\r
2266         case ODM_WM_B:\r
2267                 if (ra_mask & 0x0000000c)               //11M or 5.5M enable\r
2268                         rate_bitmap = 0x0000000d;\r
2269                 else\r
2270                         rate_bitmap = 0x0000000f;\r
2271                 break;\r
2272 \r
2273         case (ODM_WM_G):\r
2274         case (ODM_WM_A):\r
2275                 if (rssi_level == DM_RATR_STA_HIGH)\r
2276                         rate_bitmap = 0x00000f00;\r
2277                 else\r
2278                         rate_bitmap = 0x00000ff0;\r
2279                 break;\r
2280 \r
2281         case (ODM_WM_B|ODM_WM_G):\r
2282                 if (rssi_level == DM_RATR_STA_HIGH)\r
2283                         rate_bitmap = 0x00000f00;\r
2284                 else if (rssi_level == DM_RATR_STA_MIDDLE)\r
2285                         rate_bitmap = 0x00000ff0;\r
2286                 else\r
2287                         rate_bitmap = 0x00000ff5;\r
2288                 break;\r
2289 \r
2290         case (ODM_WM_B|ODM_WM_G|ODM_WM_N24G)    :\r
2291         case (ODM_WM_B|ODM_WM_N24G)     :\r
2292         case (ODM_WM_G|ODM_WM_N24G)     :\r
2293         case (ODM_WM_A|ODM_WM_N5G)      : {\r
2294                 if (pDM_Odm->RFType == ODM_1T2R || pDM_Odm->RFType == ODM_1T1R) {\r
2295                         if (rssi_level == DM_RATR_STA_HIGH)\r
2296                                 rate_bitmap = 0x000f0000;\r
2297                         else if (rssi_level == DM_RATR_STA_MIDDLE)\r
2298                                 rate_bitmap = 0x000ff000;\r
2299                         else {\r
2300                                 if (*(pDM_Odm->pBandWidth) == ODM_BW40M)\r
2301                                         rate_bitmap = 0x000ff015;\r
2302                                 else\r
2303                                         rate_bitmap = 0x000ff005;\r
2304                         }\r
2305                 } else {\r
2306                         if (rssi_level == DM_RATR_STA_HIGH)\r
2307                                 rate_bitmap = 0x0f8f0000;\r
2308                         else if (rssi_level == DM_RATR_STA_MIDDLE)\r
2309                                 rate_bitmap = 0x0f8ff000;\r
2310                         else {\r
2311                                 if (*(pDM_Odm->pBandWidth) == ODM_BW40M)\r
2312                                         rate_bitmap = 0x0f8ff015;\r
2313                                 else\r
2314                                         rate_bitmap = 0x0f8ff005;\r
2315                         }\r
2316                 }\r
2317         }\r
2318         break;\r
2319 \r
2320         case (ODM_WM_AC|ODM_WM_G):\r
2321                 if (rssi_level == 1)\r
2322                         rate_bitmap = 0xfc3f0000;\r
2323                 else if (rssi_level == 2)\r
2324                         rate_bitmap = 0xfffff000;\r
2325                 else\r
2326                         rate_bitmap = 0xffffffff;\r
2327                 break;\r
2328 \r
2329         case (ODM_WM_AC|ODM_WM_A):\r
2330 \r
2331                 if (pDM_Odm->RFType == RF_1T1R) {\r
2332                         if (rssi_level == 1)                            // add by Gary for ac-series\r
2333                                 rate_bitmap = 0x003f8000;\r
2334                         else if (rssi_level == 2)\r
2335                                 rate_bitmap = 0x003ff000;\r
2336                         else\r
2337                                 rate_bitmap = 0x003ff010;\r
2338                 } else {\r
2339                         if (rssi_level == 1)                            // add by Gary for ac-series\r
2340                                 rate_bitmap = 0xfe3f8000;       // VHT 2SS MCS3~9\r
2341                         else if (rssi_level == 2)\r
2342                                 rate_bitmap = 0xfffff000;       // VHT 2SS MCS0~9\r
2343                         else\r
2344                                 rate_bitmap = 0xfffff010;       // All\r
2345                 }\r
2346                 break;\r
2347 \r
2348         default:\r
2349                 if (pDM_Odm->RFType == RF_1T2R)\r
2350                         rate_bitmap = 0x000fffff;\r
2351                 else\r
2352                         rate_bitmap = 0x0fffffff;\r
2353                 break;\r
2354 \r
2355         }\r
2356 \r
2357         DBG_871X("%s ==> rssi_level:0x%02x, WirelessMode:0x%02x, rate_bitmap:0x%08x\n", __func__, rssi_level, WirelessMode, rate_bitmap);\r
2358         ODM_RT_TRACE(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_LOUD, (" ==> rssi_level:0x%02x, WirelessMode:0x%02x, rate_bitmap:0x%08x\n", rssi_level, WirelessMode, rate_bitmap));\r
2359 \r
2360         return (ra_mask & rate_bitmap);\r
2361 \r
2362 }\r
2363 \r
2364 #endif //#if (DM_ODM_SUPPORT_TYPE == ODM_CE)\r
2365 \r
2366 #endif /*#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN| ODM_CE))*/\r
2367 \r