net: wireless: rockchip_wlan: add rtl8723ds support
[firefly-linux-kernel-4.4.55.git] / drivers / net / wireless / rockchip_wlan / rtl8723ds / hal / phydm / 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 VOID\r
28 phydm_h2C_debug(\r
29         IN              PVOID           pDM_VOID,\r
30         IN              u4Byte          *const dm_value,\r
31         IN              u4Byte          *_used,\r
32         OUT             char                    *output,\r
33         IN              u4Byte          *_out_len\r
34 )\r
35 {\r
36         PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
37         u1Byte                  H2C_Parameter[H2C_MAX_LENGTH] = {0};\r
38         u1Byte                  phydm_h2c_id = (u1Byte)dm_value[0];\r
39         u1Byte                  i;\r
40         u4Byte                  used = *_used;\r
41         u4Byte                  out_len = *_out_len;\r
42 \r
43         PHYDM_SNPRINTF((output+used, out_len-used, "Phydm Send H2C_ID (( 0x%x))\n", phydm_h2c_id));\r
44         for (i = 0; i < H2C_MAX_LENGTH; i++) {\r
45                 \r
46                 H2C_Parameter[i] = (u1Byte)dm_value[i+1];\r
47                 PHYDM_SNPRINTF((output+used, out_len-used, "H2C: Byte[%d] = ((0x%x))\n", i, H2C_Parameter[i]));\r
48         }\r
49 \r
50         ODM_FillH2CCmd(pDM_Odm, phydm_h2c_id, H2C_MAX_LENGTH, H2C_Parameter);\r
51 \r
52 }\r
53 \r
54 #if (defined(CONFIG_RA_DBG_CMD))\r
55 VOID\r
56 odm_RA_ParaAdjust_Send_H2C(\r
57         IN      PVOID   pDM_VOID\r
58 )\r
59 {\r
60 \r
61         PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
62         pRA_T                   pRA_Table = &pDM_Odm->DM_RA_Table;\r
63         u1Byte                  H2C_Parameter[6] = {0};\r
64 \r
65         H2C_Parameter[0] = RA_FIRST_MACID;\r
66 \r
67         if (pRA_Table->RA_Para_feedback_req) { /*H2C_Parameter[5]=1 ; ask FW for all RA parameters*/\r
68                 ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_RA_DBG, ODM_DBG_LOUD, ("[H2C] Ask FW for RA parameter\n"));\r
69                 H2C_Parameter[5] |= BIT1; /*ask FW to report RA parameters*/\r
70                 H2C_Parameter[1] = pRA_Table->para_idx; /*pRA_Table->para_idx;*/\r
71                 pRA_Table->RA_Para_feedback_req = 0;\r
72         } else {\r
73                 ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_RA_DBG, ODM_DBG_LOUD, ("[H2C] Send H2C to FW for modifying RA parameter\n"));\r
74 \r
75                 H2C_Parameter[1] =  pRA_Table->para_idx;\r
76                 H2C_Parameter[2] =  pRA_Table->rate_idx;\r
77                 /* [8 bit]*/\r
78                 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
79                         H2C_Parameter[3] = pRA_Table->value;\r
80                         H2C_Parameter[4] = 0;\r
81                 }\r
82                 /* [16 bit]*/\r
83                 else {\r
84                         H2C_Parameter[3] = (u1Byte)(((pRA_Table->value_16) & 0xf0) >> 4); /*byte1*/\r
85                         H2C_Parameter[4] = (u1Byte)((pRA_Table->value_16) & 0x0f);      /*byte0*/\r
86                 }\r
87         }\r
88         ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_RA_DBG, ODM_DBG_LOUD, (" H2C_Parameter[1] = 0x%x\n", H2C_Parameter[1]));\r
89         ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_RA_DBG, ODM_DBG_LOUD, (" H2C_Parameter[2] = 0x%x\n", H2C_Parameter[2]));\r
90         ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_RA_DBG, ODM_DBG_LOUD, (" H2C_Parameter[3] = 0x%x\n", H2C_Parameter[3]));\r
91         ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_RA_DBG, ODM_DBG_LOUD, (" H2C_Parameter[4] = 0x%x\n", H2C_Parameter[4]));\r
92         ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_RA_DBG, ODM_DBG_LOUD, (" H2C_Parameter[5] = 0x%x\n", H2C_Parameter[5]));\r
93 \r
94         ODM_FillH2CCmd(pDM_Odm, ODM_H2C_RA_PARA_ADJUST, 6, H2C_Parameter);\r
95 \r
96 }\r
97 \r
98 \r
99 VOID\r
100 odm_RA_ParaAdjust(\r
101         IN              PVOID           pDM_VOID\r
102 )\r
103 {\r
104         PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
105         pRA_T                   pRA_Table = &pDM_Odm->DM_RA_Table;\r
106         u1Byte                  rate_idx = pRA_Table->rate_idx;\r
107         u1Byte                  value = pRA_Table->value;\r
108         u1Byte                  Pre_value = 0xff;\r
109 \r
110         if (pRA_Table->para_idx == RADBG_RTY_PENALTY) {\r
111                 Pre_value = pRA_Table->RTY_P[rate_idx];\r
112                 pRA_Table->RTY_P[rate_idx] = value;\r
113                 pRA_Table->RTY_P_modify_note[rate_idx] = 1;\r
114         } else if (pRA_Table->para_idx == RADBG_N_HIGH) {\r
115 \r
116         } else if (pRA_Table->para_idx == RADBG_N_LOW) {\r
117 \r
118         } else if (pRA_Table->para_idx == RADBG_RATE_UP_RTY_RATIO) {\r
119                 Pre_value = pRA_Table->RATE_UP_RTY_RATIO[rate_idx];\r
120                 pRA_Table->RATE_UP_RTY_RATIO[rate_idx] = value;\r
121                 pRA_Table->RATE_UP_RTY_RATIO_modify_note[rate_idx] = 1;\r
122         } else if (pRA_Table->para_idx == RADBG_RATE_DOWN_RTY_RATIO) {\r
123                 Pre_value = pRA_Table->RATE_DOWN_RTY_RATIO[rate_idx];\r
124                 pRA_Table->RATE_DOWN_RTY_RATIO[rate_idx] = value;\r
125                 pRA_Table->RATE_DOWN_RTY_RATIO_modify_note[rate_idx] = 1;\r
126         }\r
127         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
128         odm_RA_ParaAdjust_Send_H2C(pDM_Odm);\r
129 }\r
130 \r
131 VOID\r
132 phydm_ra_print_msg(\r
133         IN              PVOID           pDM_VOID,\r
134         IN              u1Byte          *value,\r
135         IN              u1Byte          *value_default,\r
136         IN              u1Byte          *modify_note\r
137 )\r
138 {\r
139         PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
140         pRA_T                   pRA_Table = &pDM_Odm->DM_RA_Table;\r
141         u4Byte i;\r
142 \r
143         ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_RA_DBG, ODM_DBG_LOUD, (" |Rate index| |Current-value| |Default-value| |Modify?|\n"));\r
144         for (i = 0 ; i <= (pRA_Table->rate_length); i++) {\r
145 #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN))\r
146                 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
147 #else\r
148                 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
149 #endif\r
150         }\r
151 \r
152 }\r
153 \r
154 VOID\r
155 odm_RA_debug(\r
156         IN              PVOID           pDM_VOID,\r
157         IN              u4Byte          *const dm_value\r
158 )\r
159 {\r
160         PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
161         pRA_T                   pRA_Table = &pDM_Odm->DM_RA_Table;\r
162 \r
163         pRA_Table->is_ra_dbg_init = FALSE;\r
164 \r
165         if (dm_value[0] == 100) { /*1 Print RA Parameters*/\r
166                 u1Byte  default_pointer_value;\r
167                 u1Byte  *pvalue;\r
168                 u1Byte  *pvalue_default;\r
169                 u1Byte  *pmodify_note;\r
170 \r
171                 pvalue = pvalue_default = pmodify_note = &default_pointer_value;\r
172 \r
173                 ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_RA_DBG, ODM_DBG_LOUD, ("\n------------------------------------------------------------------------------------\n"));\r
174 \r
175                 if (dm_value[1] == RADBG_RTY_PENALTY) { /* [1]*/\r
176                         ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_RA_DBG, ODM_DBG_LOUD, (" [1] RTY_PENALTY\n"));\r
177                         pvalue          =       &(pRA_Table->RTY_P[0]);\r
178                         pvalue_default  =       &(pRA_Table->RTY_P_default[0]);\r
179                         pmodify_note    =       (u1Byte *)&(pRA_Table->RTY_P_modify_note[0]);\r
180                 } else if (dm_value[1] == RADBG_N_HIGH) { /* [2]*/\r
181                         ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_RA_DBG, ODM_DBG_LOUD, (" [2] N_HIGH\n"));\r
182 \r
183                 } else if (dm_value[1] == RADBG_N_LOW) { /*[3]*/\r
184                         ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_RA_DBG, ODM_DBG_LOUD, (" [3] N_LOW\n"));\r
185 \r
186                 } else if (dm_value[1] == RADBG_RATE_UP_RTY_RATIO) { /* [8]*/\r
187                         ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_RA_DBG, ODM_DBG_LOUD, (" [8] RATE_UP_RTY_RATIO\n"));\r
188                         pvalue          =       &(pRA_Table->RATE_UP_RTY_RATIO[0]);\r
189                         pvalue_default  =       &(pRA_Table->RATE_UP_RTY_RATIO_default[0]);\r
190                         pmodify_note    =       (u1Byte *)&(pRA_Table->RATE_UP_RTY_RATIO_modify_note[0]);\r
191                 } else if (dm_value[1] == RADBG_RATE_DOWN_RTY_RATIO) { /* [9]*/\r
192                         ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_RA_DBG, ODM_DBG_LOUD, (" [9] RATE_DOWN_RTY_RATIO\n"));\r
193                         pvalue          =       &(pRA_Table->RATE_DOWN_RTY_RATIO[0]);\r
194                         pvalue_default  =       &(pRA_Table->RATE_DOWN_RTY_RATIO_default[0]);\r
195                         pmodify_note    =       (u1Byte *)&(pRA_Table->RATE_DOWN_RTY_RATIO_modify_note[0]);\r
196                 }\r
197 \r
198                 phydm_ra_print_msg(pDM_Odm, pvalue, pvalue_default, pmodify_note);\r
199                 ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_RA_DBG, ODM_DBG_LOUD, ("\n------------------------------------------------------------------------------------\n\n"));\r
200 \r
201         } else if (dm_value[0] == 101) {\r
202                 pRA_Table->para_idx = (u1Byte)dm_value[1];\r
203 \r
204                 pRA_Table->RA_Para_feedback_req = 1;\r
205                 odm_RA_ParaAdjust_Send_H2C(pDM_Odm);\r
206         } else {\r
207                 pRA_Table->para_idx = (u1Byte)dm_value[0];\r
208                 pRA_Table->rate_idx  = (u1Byte)dm_value[1];\r
209                 pRA_Table->value = (u1Byte)dm_value[2];\r
210 \r
211                 odm_RA_ParaAdjust(pDM_Odm);\r
212         }\r
213 }\r
214 \r
215 VOID\r
216 odm_RA_ParaAdjust_init(\r
217         IN              PVOID           pDM_VOID\r
218 )\r
219 {\r
220         PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
221         pRA_T                   pRA_Table = &pDM_Odm->DM_RA_Table;\r
222         u1Byte                  i;\r
223         u1Byte                  ra_para_pool_u8[3] = { RADBG_RTY_PENALTY,  RADBG_RATE_UP_RTY_RATIO, RADBG_RATE_DOWN_RTY_RATIO};\r
224         u1Byte                  RateSize_HT_1ss = 20, RateSize_HT_2ss = 28, RateSize_HT_3ss = 36;        /*4+8+8+8+8 =36*/\r
225         u1Byte                  RateSize_VHT_1ss = 10, RateSize_VHT_2ss = 20, RateSize_VHT_3ss = 30;     /*10 + 10 +10 =30*/\r
226         /*\r
227                 RTY_PENALTY             =       1,  //u8\r
228                 N_HIGH                          =       2,\r
229                 N_LOW                           =       3,\r
230                 RATE_UP_TABLE           =       4,\r
231                 RATE_DOWN_TABLE =       5,\r
232                 TRYING_NECESSARY        =       6,\r
233                 DROPING_NECESSARY =     7,\r
234                 RATE_UP_RTY_RATIO       =       8, //u8\r
235                 RATE_DOWN_RTY_RATIO=    9, //u8\r
236                 ALL_PARA                =       0xff\r
237 \r
238         */\r
239         ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_RA_DBG, ODM_DBG_LOUD, ("odm_RA_ParaAdjust_init\n"));\r
240 \r
241         if (pDM_Odm->SupportICType & (ODM_RTL8188F | ODM_RTL8195A | ODM_RTL8703B | ODM_RTL8723B | ODM_RTL8188E | ODM_RTL8723D))\r
242                 pRA_Table->rate_length = RateSize_HT_1ss;\r
243         else if (pDM_Odm->SupportICType & (ODM_RTL8192E | ODM_RTL8197F))\r
244                 pRA_Table->rate_length = RateSize_HT_2ss;\r
245         else if (pDM_Odm->SupportICType & (ODM_RTL8821 | ODM_RTL8881A | ODM_RTL8821C))\r
246                 pRA_Table->rate_length = RateSize_HT_1ss + RateSize_VHT_1ss;\r
247         else if (pDM_Odm->SupportICType & (ODM_RTL8812 | ODM_RTL8822B))\r
248                 pRA_Table->rate_length = RateSize_HT_2ss + RateSize_VHT_2ss;\r
249         else if (pDM_Odm->SupportICType == ODM_RTL8814A)\r
250                 pRA_Table->rate_length = RateSize_HT_3ss + RateSize_VHT_3ss;\r
251         else\r
252                 pRA_Table->rate_length = RateSize_HT_1ss;\r
253 \r
254         pRA_Table->is_ra_dbg_init = TRUE;\r
255         for (i = 0; i < 3; i++) {\r
256                 pRA_Table->RA_Para_feedback_req = 1;\r
257                 pRA_Table->para_idx     =       ra_para_pool_u8[i];\r
258                 odm_RA_ParaAdjust_Send_H2C(pDM_Odm);\r
259         }\r
260 }\r
261 \r
262 #else\r
263 \r
264 VOID\r
265 phydm_RA_debug_PCR(\r
266         IN              PVOID           pDM_VOID,\r
267         IN              u4Byte          *const dm_value,\r
268         IN              u4Byte          *_used,\r
269         OUT             char                    *output,\r
270         IN              u4Byte          *_out_len\r
271 )\r
272 {\r
273         PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
274         pRA_T                   pRA_Table = &pDM_Odm->DM_RA_Table;\r
275         u4Byte used = *_used;\r
276         u4Byte out_len = *_out_len;\r
277 \r
278         if (dm_value[0] == 100) {\r
279                 PHYDM_SNPRINTF((output+used, out_len-used, "[Get] PCR RA_threshold_offset = (( %s%d ))\n", ((pRA_Table->RA_threshold_offset == 0) ? " " : ((pRA_Table->RA_offset_direction) ? "+" : "-")), pRA_Table->RA_threshold_offset));\r
280                 /**/\r
281         } else if (dm_value[0] == 0) {\r
282                 pRA_Table->RA_offset_direction = 0;\r
283                 pRA_Table->RA_threshold_offset = (u1Byte)dm_value[1];\r
284                 PHYDM_SNPRINTF((output+used, out_len-used, "[Set] PCR RA_threshold_offset = (( -%d ))\n", pRA_Table->RA_threshold_offset));\r
285         } else if (dm_value[0] == 1) {\r
286                 pRA_Table->RA_offset_direction = 1;\r
287                 pRA_Table->RA_threshold_offset = (u1Byte)dm_value[1];\r
288                 PHYDM_SNPRINTF((output+used, out_len-used, "[Set] PCR RA_threshold_offset = (( +%d ))\n", pRA_Table->RA_threshold_offset));\r
289         } else {\r
290                 PHYDM_SNPRINTF((output+used, out_len-used, "[Set] Error\n"));\r
291                 /**/\r
292         }\r
293         \r
294 }\r
295 \r
296 #endif /*#if (defined(CONFIG_RA_DBG_CMD))*/\r
297 \r
298 VOID\r
299 ODM_C2HRaParaReportHandler(\r
300         IN      PVOID   pDM_VOID,\r
301         IN      pu1Byte CmdBuf,\r
302         IN      u1Byte  CmdLen\r
303 )\r
304 {\r
305         PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
306         pRA_T                   pRA_Table = &pDM_Odm->DM_RA_Table;\r
307 \r
308         u1Byte  para_idx = CmdBuf[0]; /*Retry Penalty, NH, NL*/\r
309         u1Byte  RateTypeStart = CmdBuf[1];\r
310         u1Byte  RateTypeLength = CmdLen - 2;\r
311         u1Byte  i;\r
312 \r
313 \r
314         ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_RA_DBG, ODM_DBG_LOUD, ("[ From FW C2H RA Para ]  CmdBuf[0]= (( %d ))\n", CmdBuf[0]));\r
315         \r
316 #if (defined(CONFIG_RA_DBG_CMD))\r
317         if (para_idx == RADBG_RTY_PENALTY) {\r
318                 ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_RA_DBG, ODM_DBG_LOUD, (" |Rate Index|   |RTY Penality Index|\n"));\r
319 \r
320                 for (i = 0 ; i < (RateTypeLength) ; i++) {\r
321                         if (pRA_Table->is_ra_dbg_init)\r
322                                 pRA_Table->RTY_P_default[RateTypeStart + i] = CmdBuf[2 + i];\r
323 \r
324                         pRA_Table->RTY_P[RateTypeStart + i] = CmdBuf[2 + i];\r
325                         ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_RA_DBG, ODM_DBG_LOUD, ("%8d  %15d \n", (RateTypeStart + i), pRA_Table->RTY_P[RateTypeStart + i]));\r
326                 }\r
327 \r
328         } else  if (para_idx == RADBG_N_HIGH) {\r
329                 /**/\r
330                 ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_RA_DBG, ODM_DBG_LOUD, (" |Rate Index|    |N-High|\n"));\r
331 \r
332 \r
333         } else if (para_idx == RADBG_N_LOW) {\r
334                 ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_RA_DBG, ODM_DBG_LOUD, (" |Rate Index|   |N-Low|\n"));\r
335                 /**/\r
336         }\r
337         else if (para_idx == RADBG_RATE_UP_RTY_RATIO) {\r
338                 ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_RA_DBG, ODM_DBG_LOUD, (" |Rate Index|   |Rate Up RTY Ratio|\n"));\r
339 \r
340                 for (i = 0; i < (RateTypeLength); i++) {\r
341                         if (pRA_Table->is_ra_dbg_init)\r
342                                 pRA_Table->RATE_UP_RTY_RATIO_default[RateTypeStart + i] = CmdBuf[2 + i];\r
343 \r
344                         pRA_Table->RATE_UP_RTY_RATIO[RateTypeStart + i] = CmdBuf[2 + i];\r
345                         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
346                 }\r
347         } else   if (para_idx == RADBG_RATE_DOWN_RTY_RATIO) {\r
348                 ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_RA_DBG, ODM_DBG_LOUD, (" |Rate Index|   |Rate Down RTY Ratio|\n"));\r
349 \r
350                 for (i = 0; i < (RateTypeLength); i++) {\r
351                         if (pRA_Table->is_ra_dbg_init)\r
352                                 pRA_Table->RATE_DOWN_RTY_RATIO_default[RateTypeStart + i] = CmdBuf[2 + i];\r
353 \r
354                         pRA_Table->RATE_DOWN_RTY_RATIO[RateTypeStart + i] = CmdBuf[2 + i];\r
355                         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
356                 }\r
357         } else   \r
358 #endif\r
359         if (para_idx == RADBG_DEBUG_MONITOR1) {\r
360                 ODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, ("-------------------------------\n"));\r
361                 if (pDM_Odm->SupportICType & PHYDM_IC_3081_SERIES) {\r
362 \r
363                         ODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, ("%5s  %d\n", "RSSI =", CmdBuf[1]));\r
364                         ODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, ("%5s  0x%x\n", "Rate =", CmdBuf[2] & 0x7f));\r
365                         ODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, ("%5s  %d\n", "SGI =", (CmdBuf[2] & 0x80) >> 7));\r
366                         ODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, ("%5s  %d\n", "BW =", CmdBuf[3]));\r
367                         ODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, ("%5s  %d\n", "BW_max =", CmdBuf[4]));\r
368                         ODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, ("%5s  0x%x\n", "multi_rate0 =", CmdBuf[5]));\r
369                         ODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, ("%5s  0x%x\n", "multi_rate1 =", CmdBuf[6]));\r
370                         ODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, ("%5s  %d\n", "DISRA =",        CmdBuf[7]));\r
371                         ODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, ("%5s  %d\n", "VHT_EN =", CmdBuf[8]));\r
372                         ODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, ("%5s  %d\n", "SGI_support =",  CmdBuf[9]));\r
373                         ODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, ("%5s  %d\n", "try_ness =", CmdBuf[10]));\r
374                         ODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, ("%5s  0x%x\n", "pre_rate =", CmdBuf[11]));\r
375                 } else {\r
376                         ODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, ("%5s  %d\n", "RSSI =", CmdBuf[1]));\r
377                         ODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, ("%5s  %x\n", "BW =", CmdBuf[2]));\r
378                         ODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, ("%5s  %d\n", "DISRA =", CmdBuf[3]));\r
379                         ODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, ("%5s  %d\n", "VHT_EN =", CmdBuf[4]));\r
380                         ODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, ("%5s  %d\n", "Hightest Rate =", CmdBuf[5]));\r
381                         ODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, ("%5s  0x%x\n", "Lowest Rate =", CmdBuf[6]));\r
382                         ODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, ("%5s  0x%x\n", "SGI_support =", CmdBuf[7]));\r
383                         ODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, ("%5s  %d\n", "Rate_ID =",      CmdBuf[8]));;\r
384                 }\r
385                 ODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, ("-------------------------------\n"));\r
386         } else   if (para_idx == RADBG_DEBUG_MONITOR2) {\r
387                 ODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, ("-------------------------------\n"));\r
388                 if (pDM_Odm->SupportICType & PHYDM_IC_3081_SERIES) {\r
389                         ODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, ("%5s  %d\n", "RateID =", CmdBuf[1]));\r
390                         ODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, ("%5s  0x%x\n", "highest_rate =", CmdBuf[2]));\r
391                         ODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, ("%5s  0x%x\n", "lowest_rate =", CmdBuf[3]));\r
392 \r
393                         for (i = 4; i <= 11; i++)\r
394                                 ODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, ("RAMASK =  0x%x\n", CmdBuf[i]));\r
395                 } else {\r
396                         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
397                                                 CmdBuf[8], CmdBuf[7], CmdBuf[6], CmdBuf[5], CmdBuf[4], CmdBuf[3], CmdBuf[2], CmdBuf[1]));\r
398                 }\r
399                 ODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, ("-------------------------------\n"));\r
400         } else   if (para_idx == RADBG_DEBUG_MONITOR3) {\r
401 \r
402                 for (i = 0; i < (CmdLen - 1); i++)\r
403                         ODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, ("content[%d] = %d\n", i, CmdBuf[1 + i]));\r
404         } else   if (para_idx == RADBG_DEBUG_MONITOR4)\r
405                 ODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, ("%5s  {%d.%d}\n", "RA Version =", CmdBuf[1], CmdBuf[2]));\r
406                 else if (para_idx == RADBG_DEBUG_MONITOR5) {\r
407                 ODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, ("%5s  0x%x\n", "Current rate =", CmdBuf[1]));\r
408                 ODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, ("%5s  %d\n", "Retry ratio =", CmdBuf[2]));\r
409                 ODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, ("%5s  %d\n", "Rate down ratio =", CmdBuf[3]));\r
410                 ODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, ("%5s  0x%x\n", "highest rate =", CmdBuf[4]));\r
411                 ODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, ("%5s  {0x%x 0x%x}\n", "Muti-try =", CmdBuf[5], CmdBuf[6]));\r
412                 ODM_RT_TRACE(pDM_Odm, ODM_FW_DEBUG_TRACE, ODM_DBG_LOUD, ("%5s  0x%x%x%x%x%x\n", "RA mask =", CmdBuf[11], CmdBuf[10], CmdBuf[9], CmdBuf[8], CmdBuf[7]));\r
413         }\r
414 }\r
415 \r
416 VOID\r
417 phydm_ra_dynamic_retry_count(\r
418         IN      PVOID   pDM_VOID\r
419 )\r
420 {\r
421         PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
422         pRA_T                   pRA_Table = &pDM_Odm->DM_RA_Table;\r
423         PSTA_INFO_T             pEntry;\r
424         u1Byte  i, retry_offset;\r
425         u4Byte  ma_rx_tp;\r
426 \r
427         if (!(pDM_Odm->SupportAbility & ODM_BB_DYNAMIC_ARFR)) {\r
428                 return;\r
429         }\r
430 \r
431         /*ODM_RT_TRACE(pDM_Odm, ODM_COMP_RATE_ADAPTIVE, ODM_DBG_LOUD, ("pDM_Odm->pre_b_noisy = %d\n", pDM_Odm->pre_b_noisy ));*/\r
432         if (pDM_Odm->pre_b_noisy != pDM_Odm->NoisyDecision) {\r
433 \r
434                 if (pDM_Odm->NoisyDecision) {\r
435                         ODM_RT_TRACE(pDM_Odm, ODM_COMP_RATE_ADAPTIVE, ODM_DBG_LOUD, ("->Noisy Env. RA fallback value\n"));\r
436                         ODM_SetMACReg(pDM_Odm, 0x430, bMaskDWord, 0x0);\r
437                         ODM_SetMACReg(pDM_Odm, 0x434, bMaskDWord, 0x04030201);          \r
438                 } else {\r
439                         ODM_RT_TRACE(pDM_Odm, ODM_COMP_RATE_ADAPTIVE, ODM_DBG_LOUD, ("->Clean Env. RA fallback value\n"));\r
440                         ODM_SetMACReg(pDM_Odm, 0x430, bMaskDWord, 0x01000000);\r
441                         ODM_SetMACReg(pDM_Odm, 0x434, bMaskDWord, 0x06050402);          \r
442                 }\r
443                 pDM_Odm->pre_b_noisy = pDM_Odm->NoisyDecision;\r
444         }\r
445 }\r
446 \r
447 #if (defined(CONFIG_RA_DYNAMIC_RTY_LIMIT))\r
448 \r
449 VOID\r
450 phydm_retry_limit_table_bound(\r
451         IN      PVOID   pDM_VOID,\r
452         IN      u1Byte  *retry_limit,\r
453         IN      u1Byte  offset\r
454 )\r
455 {\r
456         PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
457         pRA_T                   pRA_Table = &pDM_Odm->DM_RA_Table;\r
458 \r
459         if (*retry_limit >  offset) {\r
460                 \r
461                 *retry_limit -= offset;\r
462                 \r
463                 if (*retry_limit < pRA_Table->retrylimit_low)\r
464                         *retry_limit = pRA_Table->retrylimit_low;\r
465                 else if (*retry_limit > pRA_Table->retrylimit_high)\r
466                         *retry_limit = pRA_Table->retrylimit_high;\r
467         } else\r
468                 *retry_limit = pRA_Table->retrylimit_low;\r
469 }\r
470 \r
471 VOID\r
472 phydm_reset_retry_limit_table(\r
473         IN      PVOID   pDM_VOID\r
474 )\r
475 {\r
476         PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
477         pRA_T                   pRA_Table = &pDM_Odm->DM_RA_Table;\r
478         u1Byte                  i;\r
479 \r
480         #if (DM_ODM_SUPPORT_TYPE == ODM_WIN) /*support all IC platform*/\r
481 \r
482         #else\r
483                 #if ((RTL8192E_SUPPORT == 1) || (RTL8723B_SUPPORT == 1) || (RTL8188E_SUPPORT == 1)) \r
484                         u1Byte per_rate_retrylimit_table_20M[ODM_RATEMCS15+1] = {\r
485                                 1, 1, 2, 4,                                     /*CCK*/\r
486                                 2, 2, 4, 6, 8, 12, 16, 18,              /*OFDM*/\r
487                                 2, 4, 6, 8, 12, 18, 20, 22,             /*20M HT-1SS*/\r
488                                 2, 4, 6, 8, 12, 18, 20, 22              /*20M HT-2SS*/\r
489                         };\r
490                         u1Byte per_rate_retrylimit_table_40M[ODM_RATEMCS15+1] = {\r
491                                 1, 1, 2, 4,                                     /*CCK*/\r
492                                 2, 2, 4, 6, 8, 12, 16, 18,              /*OFDM*/\r
493                                 4, 8, 12, 16, 24, 32, 32, 32,           /*40M HT-1SS*/\r
494                                 4, 8, 12, 16, 24, 32, 32, 32            /*40M HT-2SS*/\r
495                         };\r
496 \r
497                 #elif (RTL8821A_SUPPORT == 1) || (RTL8881A_SUPPORT == 1) \r
498 \r
499                 #elif (RTL8812A_SUPPORT == 1)\r
500 \r
501                 #elif(RTL8814A_SUPPORT == 1)\r
502 \r
503                 #else\r
504 \r
505                 #endif\r
506         #endif\r
507 \r
508         memcpy(&(pRA_Table->per_rate_retrylimit_20M[0]), &(per_rate_retrylimit_table_20M[0]), ODM_NUM_RATE_IDX);\r
509         memcpy(&(pRA_Table->per_rate_retrylimit_40M[0]), &(per_rate_retrylimit_table_40M[0]), ODM_NUM_RATE_IDX);\r
510 \r
511         for (i = 0; i < ODM_NUM_RATE_IDX; i++) {\r
512                 phydm_retry_limit_table_bound(pDM_Odm, &(pRA_Table->per_rate_retrylimit_20M[i]), 0);\r
513                 phydm_retry_limit_table_bound(pDM_Odm, &(pRA_Table->per_rate_retrylimit_40M[i]), 0);\r
514         }       \r
515 }\r
516 \r
517 VOID\r
518 phydm_ra_dynamic_retry_limit_init(\r
519         IN      PVOID   pDM_VOID\r
520 )\r
521 {\r
522         PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
523         pRA_T                   pRA_Table = &pDM_Odm->DM_RA_Table;\r
524 \r
525         pRA_Table->retry_descend_num = RA_RETRY_DESCEND_NUM;\r
526         pRA_Table->retrylimit_low = RA_RETRY_LIMIT_LOW;\r
527         pRA_Table->retrylimit_high = RA_RETRY_LIMIT_HIGH;\r
528         \r
529         phydm_reset_retry_limit_table(pDM_Odm);\r
530         \r
531 }\r
532 \r
533 #endif\r
534 \r
535 VOID\r
536 phydm_ra_dynamic_retry_limit(\r
537         IN      PVOID   pDM_VOID\r
538 )\r
539 {\r
540 #if (defined(CONFIG_RA_DYNAMIC_RTY_LIMIT))\r
541         PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
542         pRA_T                   pRA_Table = &pDM_Odm->DM_RA_Table;\r
543         PSTA_INFO_T             pEntry;\r
544         u1Byte  i, retry_offset;\r
545         u4Byte  ma_rx_tp;\r
546 \r
547 \r
548         if (pDM_Odm->pre_number_active_client == pDM_Odm->number_active_client) {\r
549                 \r
550                 ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_RA_DBG, ODM_DBG_LOUD, (" pre_number_active_client ==  number_active_client\n"));\r
551                 return;\r
552                 \r
553         } else {\r
554                 if (pDM_Odm->number_active_client == 1) {\r
555                         phydm_reset_retry_limit_table(pDM_Odm);\r
556                         ODM_RT_TRACE(pDM_Odm, PHYDM_COMP_RA_DBG, ODM_DBG_LOUD, ("one client only->reset to default value\n"));\r
557                 } else {\r
558 \r
559                         retry_offset = pDM_Odm->number_active_client * pRA_Table->retry_descend_num;\r
560                         \r
561                         for (i = 0; i < ODM_NUM_RATE_IDX; i++) {\r
562 \r
563                                 phydm_retry_limit_table_bound(pDM_Odm, &(pRA_Table->per_rate_retrylimit_20M[i]), retry_offset);\r
564                                 phydm_retry_limit_table_bound(pDM_Odm, &(pRA_Table->per_rate_retrylimit_40M[i]), retry_offset); \r
565                         }                               \r
566                 }\r
567         }\r
568 #endif\r
569 }\r
570 \r
571 #if (defined(CONFIG_RA_DYNAMIC_RATE_ID))\r
572 VOID\r
573 phydm_ra_dynamic_rate_id_on_assoc(\r
574         IN      PVOID   pDM_VOID,\r
575         IN      u1Byte  wireless_mode,\r
576         IN      u1Byte  init_rate_id\r
577 )\r
578 {\r
579         PDM_ODM_T       pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
580         \r
581         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
582         \r
583         if ((pDM_Odm->RFType == ODM_2T2R) | (pDM_Odm->RFType == ODM_2T2R_GREEN) | (pDM_Odm->RFType == ODM_2T3R) | (pDM_Odm->RFType == ODM_2T4R)) {\r
584                 \r
585                 if ((pDM_Odm->SupportICType & (ODM_RTL8812|ODM_RTL8192E)) &&\r
586                         (wireless_mode & (ODM_WM_N24G | ODM_WM_N5G))\r
587                         ){\r
588                         ODM_RT_TRACE(pDM_Odm, ODM_COMP_RATE_ADAPTIVE, ODM_DBG_LOUD, ("[ON ASSOC] set N-2SS ARFR5 table\n"));\r
589                         ODM_SetMACReg(pDM_Odm, 0x4a4, bMaskDWord, 0xfc1ffff);   /*N-2SS, ARFR5, rate_id = 0xe*/\r
590                         ODM_SetMACReg(pDM_Odm, 0x4a8, bMaskDWord, 0x0);         /*N-2SS, ARFR5, rate_id = 0xe*/\r
591                 } else if ((pDM_Odm->SupportICType & (ODM_RTL8812)) &&\r
592                         (wireless_mode & (ODM_WM_AC_5G | ODM_WM_AC_24G | ODM_WM_AC_ONLY))\r
593                         ){\r
594                         ODM_RT_TRACE(pDM_Odm, ODM_COMP_RATE_ADAPTIVE, ODM_DBG_LOUD, ("[ON ASSOC] set AC-2SS ARFR0 table\n"));\r
595                         ODM_SetMACReg(pDM_Odm, 0x444, bMaskDWord, 0x0fff);      /*AC-2SS, ARFR0, rate_id = 0x9*/\r
596                         ODM_SetMACReg(pDM_Odm, 0x448, bMaskDWord, 0xff01f000);          /*AC-2SS, ARFR0, rate_id = 0x9*/\r
597                 }\r
598         }\r
599 \r
600 }\r
601 \r
602 VOID\r
603 phydm_ra_dynamic_rate_id_init(\r
604         IN      PVOID   pDM_VOID\r
605 )\r
606 {\r
607         PDM_ODM_T       pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
608         \r
609         if (pDM_Odm->SupportICType & (ODM_RTL8812|ODM_RTL8192E)) {\r
610                 \r
611                 ODM_SetMACReg(pDM_Odm, 0x4a4, bMaskDWord, 0xfc1ffff);   /*N-2SS, ARFR5, rate_id = 0xe*/\r
612                 ODM_SetMACReg(pDM_Odm, 0x4a8, bMaskDWord, 0x0);         /*N-2SS, ARFR5, rate_id = 0xe*/\r
613                 \r
614                 ODM_SetMACReg(pDM_Odm, 0x444, bMaskDWord, 0x0fff);              /*AC-2SS, ARFR0, rate_id = 0x9*/\r
615                 ODM_SetMACReg(pDM_Odm, 0x448, bMaskDWord, 0xff01f000);  /*AC-2SS, ARFR0, rate_id = 0x9*/\r
616         }\r
617 }\r
618 \r
619 VOID\r
620 phydm_update_rate_id(\r
621         IN      PVOID   pDM_VOID,\r
622         IN      u1Byte  rate,\r
623         IN      u1Byte  platform_macid\r
624 )\r
625 {\r
626         PDM_ODM_T       pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
627         pRA_T           pRA_Table = &pDM_Odm->DM_RA_Table;\r
628         u1Byte          current_tx_ss;\r
629         u1Byte          rate_idx = rate & 0x7f; /*remove bit7 SGI*/\r
630         u1Byte          wireless_mode;\r
631         u1Byte          phydm_macid;\r
632         PSTA_INFO_T     pEntry;\r
633         \r
634         \r
635 #if     0\r
636         if (rate_idx >= ODM_RATEVHTSS2MCS0) {\r
637                 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
638                 /*dummy for SD4 check patch*/\r
639         } else if (rate_idx >= ODM_RATEVHTSS1MCS0) {\r
640                 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
641                 /*dummy for SD4 check patch*/\r
642         } else if (rate_idx >= ODM_RATEMCS0) {\r
643                 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
644                 /*dummy for SD4 check patch*/\r
645         } else {\r
646                 ODM_RT_TRACE(pDM_Odm, ODM_COMP_RATE_ADAPTIVE, ODM_DBG_LOUD, ("Rate[%d]: (( HT-MCS%d ))\n", platform_macid, rate_idx));\r
647                 /*dummy for SD4 check patch*/\r
648         }\r
649 #endif\r
650                 \r
651         phydm_macid = pDM_Odm->platform2phydm_macid_table[platform_macid];\r
652         pEntry = pDM_Odm->pODM_StaInfo[phydm_macid];\r
653         \r
654         if (IS_STA_VALID(pEntry)) {\r
655                 wireless_mode = pEntry->WirelessMode;\r
656 \r
657                 if ((pDM_Odm->RFType  == ODM_2T2R) | (pDM_Odm->RFType  == ODM_2T2R_GREEN) | (pDM_Odm->RFType  == ODM_2T3R) | (pDM_Odm->RFType  == ODM_2T4R)) {\r
658                         \r
659                         pEntry->ratr_idx = pEntry->ratr_idx_init;\r
660                         if (wireless_mode & (ODM_WM_N24G | ODM_WM_N5G)) { /*N mode*/\r
661                                 if (rate_idx >= ODM_RATEMCS8 && rate_idx <= ODM_RATEMCS15) { /*2SS mode*/\r
662                                         \r
663                                         pEntry->ratr_idx = ARFR_5_RATE_ID;\r
664                                         ODM_RT_TRACE(pDM_Odm, ODM_COMP_RATE_ADAPTIVE, ODM_DBG_LOUD, ("ARFR_5\n"));\r
665                                 }\r
666                         } else if (wireless_mode & (ODM_WM_AC_5G | ODM_WM_AC_24G | ODM_WM_AC_ONLY)) {/*AC mode*/\r
667                                 if (rate_idx >= ODM_RATEVHTSS2MCS0 && rate_idx <= ODM_RATEVHTSS2MCS9) {/*2SS mode*/\r
668                                         \r
669                                         pEntry->ratr_idx = ARFR_0_RATE_ID;\r
670                                         ODM_RT_TRACE(pDM_Odm, ODM_COMP_RATE_ADAPTIVE, ODM_DBG_LOUD, ("ARFR_0\n"));\r
671                                 }\r
672                         }\r
673                         ODM_RT_TRACE(pDM_Odm, ODM_COMP_RATE_ADAPTIVE, ODM_DBG_LOUD, ("UPdate_RateID[%d]: (( 0x%x ))\n", platform_macid, pEntry->ratr_idx));\r
674                 }\r
675         }\r
676 \r
677 }\r
678 #endif\r
679 \r
680 VOID\r
681 phydm_print_rate(\r
682         IN      PVOID   pDM_VOID,\r
683         IN      u1Byte  rate,\r
684         IN      u4Byte  dbg_component\r
685 )\r
686 {\r
687         PDM_ODM_T       pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
688         u1Byte          legacy_table[12] = {1, 2, 5, 11, 6, 9, 12, 18, 24, 36, 48, 54};\r
689         u1Byte          rate_idx = rate & 0x7f; /*remove bit7 SGI*/\r
690         u1Byte          vht_en = (rate_idx >= ODM_RATEVHTSS1MCS0) ? 1 : 0;      \r
691         u1Byte          b_sgi = (rate & 0x80)>>7;\r
692         \r
693         ODM_RT_TRACE_F(pDM_Odm, dbg_component, ODM_DBG_LOUD, ("( %s%s%s%s%d%s%s)\n",\r
694                 ((rate_idx >= ODM_RATEVHTSS1MCS0) && (rate_idx <= ODM_RATEVHTSS1MCS9)) ? "VHT 1ss  " : "",\r
695                 ((rate_idx >= ODM_RATEVHTSS2MCS0) && (rate_idx <= ODM_RATEVHTSS2MCS9)) ? "VHT 2ss " : "",\r
696                 ((rate_idx >= ODM_RATEVHTSS3MCS0) && (rate_idx <= ODM_RATEVHTSS3MCS9)) ? "VHT 3ss " : "",\r
697                 (rate_idx >= ODM_RATEMCS0) ? "MCS " : "",\r
698                 (vht_en) ? ((rate_idx - ODM_RATEVHTSS1MCS0)%10) : ((rate_idx >= ODM_RATEMCS0) ? (rate_idx - ODM_RATEMCS0) : ((rate_idx <= ODM_RATE54M)?legacy_table[rate_idx]:0)),\r
699                 (b_sgi) ? "-S" : "  ",\r
700                 (rate_idx >= ODM_RATEMCS0) ? "" : "M"));\r
701 }\r
702 \r
703 VOID\r
704 phydm_c2h_ra_report_handler(\r
705         IN PVOID        pDM_VOID,\r
706         IN pu1Byte   CmdBuf,\r
707         IN u1Byte   CmdLen\r
708 )\r
709 {\r
710         PDM_ODM_T       pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
711         pRA_T           pRA_Table = &pDM_Odm->DM_RA_Table;\r
712         u1Byte  legacy_table[12] = {1,2,5,11,6,9,12,18,24,36,48,54};\r
713         u1Byte  macid = CmdBuf[1];\r
714         u1Byte  rate = CmdBuf[0];\r
715         u1Byte  rate_idx = rate & 0x7f; /*remove bit7 SGI*/\r
716         u1Byte  pre_rate = pRA_Table->link_tx_rate[macid];\r
717         u1Byte  rate_order;\r
718         #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\r
719         PADAPTER        Adapter = pDM_Odm->Adapter;\r
720 \r
721         GET_HAL_DATA(Adapter)->CurrentRARate = HwRateToMRate(rate_idx);\r
722         #endif\r
723         \r
724         \r
725         if (CmdLen >= 4) {\r
726                 if (CmdBuf[3] == 0) {\r
727                         ODM_RT_TRACE(pDM_Odm, ODM_COMP_RATE_ADAPTIVE, ODM_DBG_LOUD, ("TX Init-Rate Update[%d]:", macid));\r
728                         /**/\r
729                 } else if (CmdBuf[3] == 0xff) {\r
730                         ODM_RT_TRACE(pDM_Odm, ODM_COMP_RATE_ADAPTIVE, ODM_DBG_LOUD, ("FW Level: Fix rate[%d]:", macid));\r
731                         /**/\r
732                 } else if (CmdBuf[3] == 1) {\r
733                         ODM_RT_TRACE(pDM_Odm, ODM_COMP_RATE_ADAPTIVE, ODM_DBG_LOUD, ("Try Success[%d]:", macid));\r
734                         /**/\r
735                 } else if (CmdBuf[3] == 2) {\r
736                         ODM_RT_TRACE(pDM_Odm, ODM_COMP_RATE_ADAPTIVE, ODM_DBG_LOUD, ("Try Fail & Try Again[%d]:", macid));\r
737                         /**/\r
738                 } else if (CmdBuf[3] == 3) {\r
739                         ODM_RT_TRACE(pDM_Odm, ODM_COMP_RATE_ADAPTIVE, ODM_DBG_LOUD, ("Rate Back[%d]:", macid));\r
740                         /**/\r
741                 } else if (CmdBuf[3] == 4) {\r
742                         ODM_RT_TRACE(pDM_Odm, ODM_COMP_RATE_ADAPTIVE, ODM_DBG_LOUD, ("start rate by RSSI[%d]:", macid));\r
743                         /**/\r
744                 } else if (CmdBuf[3] == 5) {\r
745                         ODM_RT_TRACE(pDM_Odm, ODM_COMP_RATE_ADAPTIVE, ODM_DBG_LOUD, ("Try rate[%d]:", macid));\r
746                         /**/\r
747                 }\r
748         } else {\r
749                 ODM_RT_TRACE(pDM_Odm, ODM_COMP_RATE_ADAPTIVE, ODM_DBG_LOUD, ("Tx Rate Update[%d]:", macid));\r
750                 /**/\r
751         }\r
752         \r
753         /*phydm_print_rate(pDM_Odm, pre_rate_idx, ODM_COMP_RATE_ADAPTIVE);*/\r
754         /*ODM_RT_TRACE(pDM_Odm, ODM_COMP_RATE_ADAPTIVE, ODM_DBG_LOUD, (">\n",macid );*/\r
755         phydm_print_rate(pDM_Odm, rate, ODM_COMP_RATE_ADAPTIVE);\r
756 \r
757         pRA_Table->link_tx_rate[macid] = rate;\r
758 \r
759         /*trigger power training*/\r
760         #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN | ODM_CE))\r
761 \r
762         rate_order = phydm_rate_order_compute(pDM_Odm, rate_idx);\r
763         \r
764         if ((pDM_Odm->bOneEntryOnly) ||\r
765                 ((rate_order > pRA_Table->highest_client_tx_order) && (pRA_Table->power_tracking_flag == 1))\r
766                 ) {\r
767                 phydm_update_pwr_track(pDM_Odm, rate_idx);\r
768                 pRA_Table->power_tracking_flag = 0;\r
769         }\r
770         \r
771         #endif\r
772         \r
773         /*trigger dynamic rate ID*/\r
774         #if (defined(CONFIG_RA_DYNAMIC_RATE_ID))\r
775         if (pDM_Odm->SupportICType & (ODM_RTL8812|ODM_RTL8192E))\r
776                 phydm_update_rate_id(pDM_Odm, rate, macid);\r
777         #endif\r
778 \r
779 }\r
780 \r
781 VOID\r
782 odm_RSSIMonitorInit(\r
783         IN              PVOID           pDM_VOID\r
784 )\r
785 {\r
786 #if(DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))\r
787         PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
788         pRA_T           pRA_Table = &pDM_Odm->DM_RA_Table;\r
789         #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN))\r
790         PADAPTER                Adapter = pDM_Odm->Adapter;\r
791         HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(Adapter);\r
792 \r
793         pRA_Table->PT_collision_pre = TRUE;     /*used in ODM_DynamicARFBSelect(WIN only)*/\r
794         \r
795         pHalData->UndecoratedSmoothedPWDB = -1;\r
796         pHalData->ra_rpt_linked = FALSE;\r
797         #endif\r
798 \r
799         pRA_Table->firstconnect = FALSE;\r
800 \r
801         \r
802 #endif\r
803 }\r
804 \r
805 VOID\r
806 ODM_RAPostActionOnAssoc(\r
807         IN      PVOID   pDM_VOID\r
808 )\r
809 {\r
810         PDM_ODM_T       pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
811 /*\r
812         pDM_Odm->H2C_RARpt_connect = 1;\r
813         odm_RSSIMonitorCheck(pDM_Odm);\r
814         pDM_Odm->H2C_RARpt_connect = 0;\r
815 */\r
816 }\r
817 \r
818 VOID\r
819 phydm_initRaInfo(\r
820         IN              PVOID           pDM_VOID\r
821 )\r
822 {\r
823         PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
824 \r
825 #if (RTL8822B_SUPPORT == 1)\r
826         if (pDM_Odm->SupportICType == ODM_RTL8822B) {\r
827                 u4Byte  ret_value;\r
828 \r
829                 ret_value = ODM_GetBBReg(pDM_Odm, 0x4c8, bMaskByte2);\r
830                 ODM_SetBBReg(pDM_Odm, 0x4cc, bMaskByte3, (ret_value - 1));\r
831         }\r
832 #endif\r
833 }\r
834 \r
835 VOID\r
836 phydm_modify_RA_PCR_threshold(\r
837         IN              PVOID           pDM_VOID,\r
838         IN              u1Byte          RA_offset_direction,\r
839         IN              u1Byte          RA_threshold_offset\r
840 \r
841 )\r
842 {\r
843         PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
844         pRA_T                   pRA_Table = &pDM_Odm->DM_RA_Table;\r
845 \r
846         pRA_Table->RA_offset_direction = RA_offset_direction;\r
847         pRA_Table->RA_threshold_offset = RA_threshold_offset;\r
848         ODM_RT_TRACE(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_LOUD, ("Set RA_threshold_offset = (( %s%d ))\n", ((RA_threshold_offset == 0) ? " " : ((RA_offset_direction) ? "+" : "-")), RA_threshold_offset));\r
849 }\r
850 \r
851 VOID\r
852 odm_RSSIMonitorCheckMP(\r
853         IN      PVOID   pDM_VOID\r
854 )\r
855 {\r
856 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\r
857         PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
858         pRA_T                   pRA_Table = &pDM_Odm->DM_RA_Table;\r
859         u1Byte                  H2C_Parameter[H2C_0X42_LENGTH] = {0};\r
860         u4Byte                  i;\r
861         BOOLEAN                 bExtRAInfo = TRUE;\r
862         u1Byte                  cmdlen = H2C_0X42_LENGTH;\r
863         u1Byte                  TxBF_EN = 0, stbc_en = 0;\r
864 \r
865         PADAPTER                Adapter = pDM_Odm->Adapter;\r
866         HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(Adapter);\r
867         PSTA_INFO_T             pEntry = NULL;\r
868         s4Byte                  tmpEntryMaxPWDB = 0, tmpEntryMinPWDB = 0xff;\r
869         PMGNT_INFO              pMgntInfo = &Adapter->MgntInfo;\r
870         PMGNT_INFO              pDefaultMgntInfo = &Adapter->MgntInfo;\r
871         u8Byte                  curTxOkCnt = 0, curRxOkCnt = 0;\r
872 #if (BEAMFORMING_SUPPORT == 1)\r
873 #ifndef BEAMFORMING_VERSION_1\r
874         BEAMFORMING_CAP Beamform_cap = BEAMFORMING_CAP_NONE;\r
875 #endif\r
876 #endif\r
877         PADAPTER        pLoopAdapter = GetDefaultAdapter(Adapter);\r
878 \r
879         if (pDM_Odm->SupportICType == ODM_RTL8188E) {\r
880                 bExtRAInfo = FALSE;\r
881                 cmdlen = 3;\r
882         }\r
883 \r
884         while (pLoopAdapter) {\r
885 \r
886                 if (pLoopAdapter != NULL) {\r
887                         pMgntInfo = &pLoopAdapter->MgntInfo;\r
888                         curTxOkCnt = pLoopAdapter->TxStats.NumTxBytesUnicast - pMgntInfo->lastTxOkCnt;\r
889                         curRxOkCnt = pLoopAdapter->RxStats.NumRxBytesUnicast - pMgntInfo->lastRxOkCnt;\r
890                         pMgntInfo->lastTxOkCnt = curTxOkCnt;\r
891                         pMgntInfo->lastRxOkCnt = curRxOkCnt;\r
892                 }\r
893 \r
894                 for (i = 0; i < ASSOCIATE_ENTRY_NUM; i++) {\r
895 \r
896                         if (IsAPModeExist(pLoopAdapter)) {\r
897                                 if (GetFirstExtAdapter(pLoopAdapter) != NULL &&\r
898                                         GetFirstExtAdapter(pLoopAdapter) == pLoopAdapter)\r
899                                         pEntry = AsocEntry_EnumStation(pLoopAdapter, i);\r
900                                 else if (GetFirstGOPort(pLoopAdapter) != NULL &&\r
901                                                  IsFirstGoAdapter(pLoopAdapter))\r
902                                         pEntry = AsocEntry_EnumStation(pLoopAdapter, i);\r
903                         } else {\r
904                                 if (GetDefaultAdapter(pLoopAdapter) == pLoopAdapter)\r
905                                         pEntry = AsocEntry_EnumStation(pLoopAdapter, i);\r
906                         }\r
907 \r
908                         if (pEntry != NULL) {\r
909                                 if (pEntry->bAssociated) {\r
910 \r
911                                         RT_DISP_ADDR(FDM, DM_PWDB, ("pEntry->MacAddr ="), pEntry->MacAddr);\r
912                                         RT_DISP(FDM, DM_PWDB, ("pEntry->rssi = 0x%x(%d)\n",\r
913                                                                                    pEntry->rssi_stat.UndecoratedSmoothedPWDB, pEntry->rssi_stat.UndecoratedSmoothedPWDB));\r
914 \r
915                                         //2 BF_en\r
916 #if (BEAMFORMING_SUPPORT == 1)\r
917 #ifndef BEAMFORMING_VERSION_1\r
918                                         Beamform_cap = phydm_Beamforming_GetEntryBeamCapByMacId(pDM_Odm, pEntry->AssociatedMacId);\r
919                                         if (Beamform_cap & (BEAMFORMER_CAP_HT_EXPLICIT | BEAMFORMER_CAP_VHT_SU))\r
920                                                 TxBF_EN = 1;\r
921 #else\r
922                                         if(Beamform_GetSupportBeamformerCap(GetDefaultAdapter(Adapter), pEntry))\r
923                                                 TxBF_EN = 1;\r
924 #endif\r
925 #endif\r
926                                         //2 STBC_en\r
927                                         if ((IS_WIRELESS_MODE_AC(Adapter) && TEST_FLAG(pEntry->VHTInfo.STBC, STBC_VHT_ENABLE_TX)) ||\r
928                                                 TEST_FLAG(pEntry->HTInfo.STBC, STBC_HT_ENABLE_TX))\r
929                                                 stbc_en = 1;\r
930 \r
931                                         if (pEntry->rssi_stat.UndecoratedSmoothedPWDB < tmpEntryMinPWDB)\r
932                                                 tmpEntryMinPWDB = pEntry->rssi_stat.UndecoratedSmoothedPWDB;\r
933                                         if (pEntry->rssi_stat.UndecoratedSmoothedPWDB > tmpEntryMaxPWDB)\r
934                                                 tmpEntryMaxPWDB = pEntry->rssi_stat.UndecoratedSmoothedPWDB;\r
935 \r
936                                         H2C_Parameter[4] = (pRA_Table->RA_threshold_offset & 0x7f) | (pRA_Table->RA_offset_direction<<7); \r
937                                         ODM_RT_TRACE(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_LOUD, ("RA_threshold_offset = (( %s%d ))\n", ((pRA_Table->RA_threshold_offset == 0) ? " " : ((pRA_Table->RA_offset_direction) ? "+" : "-")),pRA_Table->RA_threshold_offset));\r
938 \r
939                                         if (bExtRAInfo) {\r
940                                                 if (curRxOkCnt > (curTxOkCnt * 6))\r
941                                                         H2C_Parameter[3] |= RAINFO_BE_RX_STATE;\r
942 \r
943                                                 if (TxBF_EN)\r
944                                                         H2C_Parameter[3] |= RAINFO_BF_STATE;\r
945                                                 else {\r
946                                                         if (stbc_en)\r
947                                                                 H2C_Parameter[3] |= RAINFO_STBC_STATE;\r
948                                                 }\r
949 \r
950                                                 if (pDM_Odm->NoisyDecision)\r
951                                                         H2C_Parameter[3] |= RAINFO_NOISY_STATE; \r
952                                                 else\r
953                                                         H2C_Parameter[3] &= (~RAINFO_NOISY_STATE);\r
954                                                 #if 1\r
955                                                 if (pDM_Odm->H2C_RARpt_connect) {\r
956                                                         H2C_Parameter[3] |= RAINFO_INIT_RSSI_RATE_STATE;\r
957                                                         ODM_RT_TRACE(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_LOUD, ("H2C_RARpt_connect = (( %d ))\n", pDM_Odm->H2C_RARpt_connect));\r
958                                                 }\r
959                                                 #else\r
960                                                 \r
961                                                 if (pEntry->rssi_stat.ra_rpt_linked == FALSE) {\r
962                                                         H2C_Parameter[3] |= RAINFO_INIT_RSSI_RATE_STATE;\r
963                                                         pEntry->rssi_stat.ra_rpt_linked = TRUE;\r
964 \r
965                                                         ODM_RT_TRACE(pDM_Odm, ODM_COMP_RSSI_MONITOR, ODM_DBG_LOUD, ("RA First Link, RSSI[%d] = ((%d))\n", \r
966                                                                 pEntry->AssociatedMacId, pEntry->rssi_stat.UndecoratedSmoothedPWDB));\r
967                                                 }\r
968                                                 #endif\r
969                                         }\r
970 \r
971                                         H2C_Parameter[2] = (u1Byte)(pEntry->rssi_stat.UndecoratedSmoothedPWDB & 0xFF);\r
972                                         //H2C_Parameter[1] = 0x20;   // fw v12 cmdid 5:use max macid ,for nic ,default macid is 0 ,max macid is 1\r
973                                         H2C_Parameter[0] = (pEntry->AssociatedMacId);\r
974 \r
975                                         ODM_FillH2CCmd(pDM_Odm, ODM_H2C_RSSI_REPORT, cmdlen, H2C_Parameter);\r
976                                 }\r
977                         } else\r
978                                 break;\r
979                 }\r
980 \r
981                 pLoopAdapter = GetNextExtAdapter(pLoopAdapter);\r
982         }\r
983 \r
984 \r
985         /*Default port*/\r
986         if (tmpEntryMaxPWDB != 0) {     // If associated entry is found\r
987                 pHalData->EntryMaxUndecoratedSmoothedPWDB = tmpEntryMaxPWDB;\r
988                 RT_DISP(FDM, DM_PWDB, ("EntryMaxPWDB = 0x%x(%d)\n",     tmpEntryMaxPWDB, tmpEntryMaxPWDB));\r
989         } else\r
990                 pHalData->EntryMaxUndecoratedSmoothedPWDB = 0;\r
991 \r
992         if (tmpEntryMinPWDB != 0xff) { // If associated entry is found\r
993                 pHalData->EntryMinUndecoratedSmoothedPWDB = tmpEntryMinPWDB;\r
994                 RT_DISP(FDM, DM_PWDB, ("EntryMinPWDB = 0x%x(%d)\n", tmpEntryMinPWDB, tmpEntryMinPWDB));\r
995 \r
996         } else\r
997                 pHalData->EntryMinUndecoratedSmoothedPWDB = 0;\r
998 \r
999         /* Default porti sent RSSI to FW */\r
1000         if (pHalData->bUseRAMask) {\r
1001                 ODM_RT_TRACE(pDM_Odm, ODM_COMP_RSSI_MONITOR, ODM_DBG_LOUD, ("1 RA First Link, RSSI[%d] = ((%d)) , ra_rpt_linked = ((%d))\n", \r
1002                         WIN_DEFAULT_PORT_MACID, pHalData->UndecoratedSmoothedPWDB, pHalData->ra_rpt_linked));           \r
1003                 if (pHalData->UndecoratedSmoothedPWDB > 0) {\r
1004                         \r
1005                         PRT_HIGH_THROUGHPUT                     pHTInfo = GET_HT_INFO(pDefaultMgntInfo);\r
1006                         PRT_VERY_HIGH_THROUGHPUT        pVHTInfo = GET_VHT_INFO(pDefaultMgntInfo);\r
1007 \r
1008                         /* BF_en*/\r
1009                         #if (BEAMFORMING_SUPPORT == 1)\r
1010                         #ifndef BEAMFORMING_VERSION_1\r
1011                         Beamform_cap = phydm_Beamforming_GetEntryBeamCapByMacId(pDM_Odm, pDefaultMgntInfo->mMacId);\r
1012 \r
1013                         if (Beamform_cap & (BEAMFORMER_CAP_HT_EXPLICIT | BEAMFORMER_CAP_VHT_SU))\r
1014                                 TxBF_EN = 1;\r
1015                         #else\r
1016                         if(Beamform_GetSupportBeamformerCap(GetDefaultAdapter(Adapter), NULL))\r
1017                                 TxBF_EN = 1;\r
1018                         #endif\r
1019                         #endif\r
1020 \r
1021                         /* STBC_en*/\r
1022                         if ((IS_WIRELESS_MODE_AC(Adapter) && TEST_FLAG(pVHTInfo->VhtCurStbc, STBC_VHT_ENABLE_TX)) ||\r
1023                                 TEST_FLAG(pHTInfo->HtCurStbc, STBC_HT_ENABLE_TX))\r
1024                                 stbc_en = 1;\r
1025 \r
1026                         H2C_Parameter[4] = (pRA_Table->RA_threshold_offset & 0x7f) | (pRA_Table->RA_offset_direction<<7); \r
1027                         ODM_RT_TRACE(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_LOUD, ("RA_threshold_offset = (( %s%d ))\n", ((pRA_Table->RA_threshold_offset == 0) ? " " : ((pRA_Table->RA_offset_direction) ? "+" : "-")), pRA_Table->RA_threshold_offset));\r
1028 \r
1029                         if (bExtRAInfo) {\r
1030                                 if (TxBF_EN)\r
1031                                         H2C_Parameter[3] |= RAINFO_BF_STATE;\r
1032                                 else {\r
1033                                         if (stbc_en)\r
1034                                                 H2C_Parameter[3] |= RAINFO_STBC_STATE;\r
1035                                 }\r
1036 \r
1037                                 #if 1\r
1038                                 if (pDM_Odm->H2C_RARpt_connect) {\r
1039                                         H2C_Parameter[3] |= RAINFO_INIT_RSSI_RATE_STATE;\r
1040                                         ODM_RT_TRACE(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_LOUD, ("H2C_RARpt_connect = (( %d ))\n", pDM_Odm->H2C_RARpt_connect));\r
1041                                 }\r
1042                                 #else\r
1043                                         ODM_RT_TRACE(pDM_Odm, ODM_COMP_RSSI_MONITOR, ODM_DBG_LOUD, ("2 RA First Link, RSSI[%d] = ((%d)) , ra_rpt_linked = ((%d))\n", \r
1044                                                 WIN_DEFAULT_PORT_MACID, pHalData->UndecoratedSmoothedPWDB, pHalData->ra_rpt_linked));\r
1045                                 \r
1046                                 if (pHalData->ra_rpt_linked == FALSE) {\r
1047                                 \r
1048                                         ODM_RT_TRACE(pDM_Odm, ODM_COMP_RSSI_MONITOR, ODM_DBG_LOUD, ("3 RA First Link, RSSI[%d] = ((%d)) , ra_rpt_linked = ((%d))\n", \r
1049                                                 WIN_DEFAULT_PORT_MACID, pHalData->UndecoratedSmoothedPWDB, pHalData->ra_rpt_linked));\r
1050                                         \r
1051                                         H2C_Parameter[3] |= RAINFO_INIT_RSSI_RATE_STATE;\r
1052                                         pHalData->ra_rpt_linked = TRUE;\r
1053 \r
1054 \r
1055                                 }\r
1056                                 #endif\r
1057                                 \r
1058                                 if (pDM_Odm->NoisyDecision == 1) {\r
1059                                         H2C_Parameter[3] |= RAINFO_NOISY_STATE;\r
1060                                         ODM_RT_TRACE(pDM_Odm, ODM_COMP_NOISY_DETECT, ODM_DBG_LOUD, ("[RSSIMonitorCheckMP] Send H2C to FW\n"));\r
1061                                 } else\r
1062                                         H2C_Parameter[3] &= (~RAINFO_NOISY_STATE);\r
1063 \r
1064                                 ODM_RT_TRACE(pDM_Odm, ODM_COMP_NOISY_DETECT, ODM_DBG_LOUD, ("[RSSIMonitorCheckMP] H2C_Parameter=%x\n", H2C_Parameter[3]));\r
1065                         }\r
1066 \r
1067                         H2C_Parameter[2] = (u1Byte)(pHalData->UndecoratedSmoothedPWDB & 0xFF);\r
1068                         /*H2C_Parameter[1] = 0x20;*/    /* fw v12 cmdid 5:use max macid ,for nic ,default macid is 0 ,max macid is 1*/\r
1069                         H2C_Parameter[0] = WIN_DEFAULT_PORT_MACID;              /* fw v12 cmdid 5:use max macid ,for nic ,default macid is 0 ,max macid is 1*/\r
1070 \r
1071                         ODM_FillH2CCmd(pDM_Odm, ODM_H2C_RSSI_REPORT, cmdlen, H2C_Parameter);\r
1072                 }\r
1073                 \r
1074                 // BT 3.0 HS mode Rssi\r
1075                 if (pDM_Odm->bBtHsOperation) {\r
1076                         H2C_Parameter[2] = pDM_Odm->btHsRssi;\r
1077                         //H2C_Parameter[1] = 0x0;\r
1078                         H2C_Parameter[0] = WIN_BT_PORT_MACID;\r
1079 \r
1080                         ODM_FillH2CCmd(pDM_Odm, ODM_H2C_RSSI_REPORT, cmdlen, H2C_Parameter);\r
1081                 }\r
1082         } else\r
1083                 PlatformEFIOWrite1Byte(Adapter, 0x4fe, (u1Byte)pHalData->UndecoratedSmoothedPWDB);\r
1084 \r
1085         if ((pDM_Odm->SupportICType == ODM_RTL8812) || (pDM_Odm->SupportICType == ODM_RTL8192E))\r
1086                 odm_RSSIDumpToRegister(pDM_Odm);\r
1087 \r
1088 \r
1089         {\r
1090                 PADAPTER pLoopAdapter = GetDefaultAdapter(Adapter);\r
1091                 BOOLEAN         default_pointer_value, *pbLink_temp = &default_pointer_value;\r
1092                 s4Byte  GlobalRSSI_min = 0xFF, LocalRSSI_Min;\r
1093                 BOOLEAN         bLink = FALSE;\r
1094 \r
1095                 while (pLoopAdapter) {\r
1096                         LocalRSSI_Min = phydm_FindMinimumRSSI(pDM_Odm, pLoopAdapter, pbLink_temp);\r
1097                         //DbgPrint("pHalData->bLinked=%d, LocalRSSI_Min=%d\n", pHalData->bLinked, LocalRSSI_Min);\r
1098 \r
1099                         if (*pbLink_temp)\r
1100                                 bLink = TRUE;\r
1101                         \r
1102                         if ((LocalRSSI_Min < GlobalRSSI_min) && (*pbLink_temp))\r
1103                                 GlobalRSSI_min = LocalRSSI_Min;\r
1104 \r
1105                         pLoopAdapter = GetNextExtAdapter(pLoopAdapter);\r
1106                 }\r
1107 \r
1108                 pHalData->bLinked = bLink;\r
1109                 ODM_CmnInfoUpdate(&pHalData->DM_OutSrc , ODM_CMNINFO_LINK, (u8Byte)bLink);\r
1110 \r
1111                 if (bLink)\r
1112                         ODM_CmnInfoUpdate(&pHalData->DM_OutSrc, ODM_CMNINFO_RSSI_MIN, (u8Byte)GlobalRSSI_min);\r
1113                 else\r
1114                         ODM_CmnInfoUpdate(&pHalData->DM_OutSrc, ODM_CMNINFO_RSSI_MIN, 0);\r
1115 \r
1116         }\r
1117 \r
1118 #endif  // #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\r
1119 }\r
1120 \r
1121 #if (DM_ODM_SUPPORT_TYPE == ODM_CE)\r
1122 /*H2C_RSSI_REPORT*/\r
1123 s8 phydm_rssi_report(PDM_ODM_T pDM_Odm, u8 mac_id)\r
1124 {\r
1125         PADAPTER Adapter = pDM_Odm->Adapter;\r
1126         pRA_T                   pRA_Table = &pDM_Odm->DM_RA_Table;\r
1127         struct dvobj_priv *pdvobjpriv = adapter_to_dvobj(Adapter);\r
1128         HAL_DATA_TYPE *pHalData = GET_HAL_DATA(Adapter);\r
1129         u8 H2C_Parameter[H2C_0X42_LENGTH] = {0};\r
1130         u8 UL_DL_STATE = 0, STBC_TX = 0, TxBF_EN = 0;\r
1131         u8 cmdlen = H2C_0X42_LENGTH, first_connect = _FALSE;\r
1132         u64     curTxOkCnt = 0, curRxOkCnt = 0;\r
1133         PSTA_INFO_T pEntry = pDM_Odm->pODM_StaInfo[mac_id];\r
1134         \r
1135         if (!IS_STA_VALID(pEntry))\r
1136                 return _FAIL;\r
1137 \r
1138         if (mac_id != pEntry->mac_id) {\r
1139                 ODM_RT_TRACE(pDM_Odm, ODM_COMP_RATE_ADAPTIVE, ODM_DBG_LOUD, ("%s mac_id:%u:%u invalid\n", __func__, mac_id, pEntry->mac_id));\r
1140                 rtw_warn_on(1);\r
1141                 return _FAIL;\r
1142         }       \r
1143         \r
1144         if (IS_MCAST(pEntry->hwaddr))  /*if(psta->mac_id ==1)*/\r
1145                 return _FAIL;\r
1146 \r
1147         if (pEntry->rssi_stat.UndecoratedSmoothedPWDB == (-1)) {\r
1148                 ODM_RT_TRACE(pDM_Odm, ODM_COMP_RATE_ADAPTIVE, ODM_DBG_LOUD, ("%s mac_id:%u, mac:"MAC_FMT", rssi == -1\n", __func__, pEntry->mac_id, MAC_ARG(pEntry->hwaddr)));\r
1149                 return _FAIL;\r
1150         }\r
1151 \r
1152         curTxOkCnt = pdvobjpriv->traffic_stat.cur_tx_bytes;\r
1153         curRxOkCnt = pdvobjpriv->traffic_stat.cur_rx_bytes;\r
1154         if (curRxOkCnt > (curTxOkCnt * 6))\r
1155                 UL_DL_STATE = 1;\r
1156         else\r
1157                 UL_DL_STATE = 0;\r
1158         \r
1159         #ifdef CONFIG_BEAMFORMING\r
1160         {\r
1161                 #if (BEAMFORMING_SUPPORT == 1)\r
1162                 BEAMFORMING_CAP Beamform_cap = phydm_Beamforming_GetEntryBeamCapByMacId(pDM_Odm, pEntry->mac_id);\r
1163                 #else/*for drv beamforming*/\r
1164                 BEAMFORMING_CAP Beamform_cap = beamforming_get_entry_beam_cap_by_mac_id(&Adapter->mlmepriv, pEntry->mac_id);\r
1165                 #endif\r
1166 \r
1167                 if (Beamform_cap & (BEAMFORMER_CAP_HT_EXPLICIT | BEAMFORMER_CAP_VHT_SU))\r
1168                         TxBF_EN = 1;\r
1169                 else\r
1170                         TxBF_EN = 0;\r
1171         }\r
1172         #endif /*#ifdef CONFIG_BEAMFORMING*/\r
1173                 \r
1174         if (TxBF_EN)\r
1175                 STBC_TX = 0;\r
1176         else {\r
1177                 #ifdef CONFIG_80211AC_VHT\r
1178                 if (IsSupportedVHT(pEntry->wireless_mode))\r
1179                         STBC_TX = TEST_FLAG(pEntry->vhtpriv.stbc_cap, STBC_VHT_ENABLE_TX);\r
1180                 else\r
1181                 #endif\r
1182                 #ifdef CONFIG_80211N_HT\r
1183                         STBC_TX = TEST_FLAG(pEntry->htpriv.stbc_cap, STBC_HT_ENABLE_TX);\r
1184                 #endif\r
1185         }\r
1186                 \r
1187         H2C_Parameter[0] = (u8)(pEntry->mac_id & 0xFF);\r
1188         H2C_Parameter[2] = pEntry->rssi_stat.UndecoratedSmoothedPWDB & 0x7F;\r
1189                 \r
1190         if (UL_DL_STATE)\r
1191                 H2C_Parameter[3] |= RAINFO_BE_RX_STATE;\r
1192                 \r
1193         if (TxBF_EN)\r
1194                 H2C_Parameter[3] |= RAINFO_BF_STATE;\r
1195         if (STBC_TX)\r
1196                 H2C_Parameter[3] |= RAINFO_STBC_STATE;\r
1197         if (pDM_Odm->NoisyDecision)\r
1198                 H2C_Parameter[3] |= RAINFO_NOISY_STATE;\r
1199                 \r
1200         if ((pEntry->ra_rpt_linked == _FALSE) && (pEntry->rssi_stat.bsend_rssi == RA_RSSI_STATE_SEND)) {\r
1201                 H2C_Parameter[3] |= RAINFO_INIT_RSSI_RATE_STATE;\r
1202                 pEntry->ra_rpt_linked = _TRUE;\r
1203                 pEntry->rssi_stat.bsend_rssi = RA_RSSI_STATE_HOLD;\r
1204                 first_connect = _TRUE;\r
1205         }\r
1206 \r
1207         H2C_Parameter[4] = (pRA_Table->RA_threshold_offset & 0x7f) | (pRA_Table->RA_offset_direction<<7); \r
1208         ODM_RT_TRACE(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_LOUD, ("RA_threshold_offset = (( %s%d ))\n", ((pRA_Table->RA_threshold_offset == 0) ? " " : ((pRA_Table->RA_offset_direction) ? "+" : "-")), pRA_Table->RA_threshold_offset));\r
1209         \r
1210         #if 1\r
1211         if (first_connect) {\r
1212                 ODM_RT_TRACE(pDM_Odm, ODM_COMP_RATE_ADAPTIVE, ODM_DBG_LOUD, ("%s mac_id:%u, mac:"MAC_FMT", rssi:%d\n", __func__,\r
1213                         pEntry->mac_id, MAC_ARG(pEntry->hwaddr), pEntry->rssi_stat.UndecoratedSmoothedPWDB));\r
1214                         \r
1215                 ODM_RT_TRACE(pDM_Odm, ODM_COMP_RATE_ADAPTIVE, ODM_DBG_LOUD, ("%s RAINFO - TP:%s, TxBF:%s, STBC:%s, Noisy:%s, Firstcont:%s\n", __func__,\r
1216                         (UL_DL_STATE) ? "DL" : "UL", (TxBF_EN) ? "EN" : "DIS", (STBC_TX) ? "EN" : "DIS",\r
1217                         (pDM_Odm->NoisyDecision) ? "True" : "False", (first_connect) ? "True" : "False"));\r
1218         }\r
1219         #endif\r
1220                 \r
1221         if (pHalData->fw_ractrl == _TRUE) {\r
1222                 #if (RTL8188E_SUPPORT == 1)\r
1223                 if (pDM_Odm->SupportICType == ODM_RTL8188E)\r
1224                         cmdlen = 3;\r
1225                 #endif\r
1226                 ODM_FillH2CCmd(pDM_Odm, ODM_H2C_RSSI_REPORT, cmdlen, H2C_Parameter);\r
1227         } else {\r
1228                 #if ((RTL8188E_SUPPORT == 1) && (RATE_ADAPTIVE_SUPPORT == 1))\r
1229                 if (pDM_Odm->SupportICType == ODM_RTL8188E)\r
1230                         ODM_RA_SetRSSI_8188E(pDM_Odm, (u8)(pEntry->mac_id & 0xFF), pEntry->rssi_stat.UndecoratedSmoothedPWDB & 0x7F);\r
1231                 #endif\r
1232         }\r
1233         return _SUCCESS;\r
1234 }\r
1235 \r
1236 void phydm_ra_rssi_rpt_wk_hdl(PVOID pContext)\r
1237 {\r
1238         PDM_ODM_T       pDM_Odm = (PDM_ODM_T)pContext;\r
1239         int i;\r
1240         u8 mac_id = 0xFF;\r
1241         PSTA_INFO_T     pEntry = NULL;  \r
1242         \r
1243         for (i = 0; i < ODM_ASSOCIATE_ENTRY_NUM; i++) {\r
1244                 pEntry = pDM_Odm->pODM_StaInfo[i];\r
1245                 if (IS_STA_VALID(pEntry)) {\r
1246                         if (IS_MCAST(pEntry->hwaddr))  /*if(psta->mac_id ==1)*/\r
1247                                 continue;\r
1248                         if (pEntry->ra_rpt_linked == _FALSE) {\r
1249                                 mac_id = i;\r
1250                                 break;\r
1251                         }\r
1252                 }\r
1253         }\r
1254         if (mac_id != 0xFF)\r
1255                 phydm_rssi_report(pDM_Odm, mac_id);\r
1256 }\r
1257 void phydm_ra_rssi_rpt_wk(PVOID pContext)\r
1258 {\r
1259         PDM_ODM_T       pDM_Odm = (PDM_ODM_T)pContext;\r
1260         \r
1261         rtw_run_in_thread_cmd(pDM_Odm->Adapter, phydm_ra_rssi_rpt_wk_hdl, pDM_Odm);\r
1262 }\r
1263 #endif\r
1264 \r
1265 VOID\r
1266 odm_RSSIMonitorCheckCE(\r
1267         IN              PVOID           pDM_VOID\r
1268 )\r
1269 {\r
1270 #if (DM_ODM_SUPPORT_TYPE == ODM_CE)\r
1271         PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
1272         PADAPTER                Adapter = pDM_Odm->Adapter;\r
1273         HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(Adapter);      \r
1274         PSTA_INFO_T           pEntry;\r
1275         int     i;\r
1276         int     tmpEntryMaxPWDB = 0, tmpEntryMinPWDB = 0xff;\r
1277         u8      sta_cnt = 0;\r
1278         \r
1279         if (pDM_Odm->bLinked != _TRUE)\r
1280                 return; \r
1281 \r
1282         for (i = 0; i < ODM_ASSOCIATE_ENTRY_NUM; i++) {\r
1283                 pEntry = pDM_Odm->pODM_StaInfo[i];\r
1284                 if (IS_STA_VALID(pEntry)) {\r
1285                         if (IS_MCAST(pEntry->hwaddr))  /*if(psta->mac_id ==1)*/\r
1286                                 continue;\r
1287 \r
1288                         if (pEntry->rssi_stat.UndecoratedSmoothedPWDB == (-1))\r
1289                                 continue;\r
1290 \r
1291                         if (pEntry->rssi_stat.UndecoratedSmoothedPWDB < tmpEntryMinPWDB)\r
1292                                 tmpEntryMinPWDB = pEntry->rssi_stat.UndecoratedSmoothedPWDB;\r
1293 \r
1294                         if (pEntry->rssi_stat.UndecoratedSmoothedPWDB > tmpEntryMaxPWDB)\r
1295                                 tmpEntryMaxPWDB = pEntry->rssi_stat.UndecoratedSmoothedPWDB;\r
1296 \r
1297                         if (phydm_rssi_report(pDM_Odm, i))\r
1298                                 sta_cnt++;\r
1299                 }\r
1300         }\r
1301 \r
1302         if (tmpEntryMaxPWDB != 0)       // If associated entry is found\r
1303                 pHalData->EntryMaxUndecoratedSmoothedPWDB = tmpEntryMaxPWDB;\r
1304         else\r
1305                 pHalData->EntryMaxUndecoratedSmoothedPWDB = 0;\r
1306 \r
1307         if (tmpEntryMinPWDB != 0xff) // If associated entry is found\r
1308                 pHalData->EntryMinUndecoratedSmoothedPWDB = tmpEntryMinPWDB;\r
1309         else\r
1310                 pHalData->EntryMinUndecoratedSmoothedPWDB = 0;\r
1311 \r
1312         FindMinimumRSSI(Adapter);//get pdmpriv->MinUndecoratedPWDBForDM\r
1313 \r
1314         pDM_Odm->RSSI_Min = pHalData->MinUndecoratedPWDBForDM;\r
1315         //ODM_CmnInfoUpdate(&pHalData->odmpriv ,ODM_CMNINFO_RSSI_MIN, pdmpriv->MinUndecoratedPWDBForDM);\r
1316 #endif//if (DM_ODM_SUPPORT_TYPE == ODM_CE)\r
1317 }\r
1318 \r
1319 \r
1320 VOID\r
1321 odm_RSSIMonitorCheckAP(\r
1322         IN              PVOID           pDM_VOID\r
1323 )\r
1324 {\r
1325 #if (DM_ODM_SUPPORT_TYPE == ODM_AP)\r
1326 #if (RTL8812A_SUPPORT || RTL8881A_SUPPORT || RTL8192E_SUPPORT || RTL8814A_SUPPORT || RTL8197F_SUPPORT)\r
1327 \r
1328         PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
1329         pRA_T                   pRA_Table = &pDM_Odm->DM_RA_Table;\r
1330         u1Byte                  H2C_Parameter[H2C_0X42_LENGTH] = {0};\r
1331         u4Byte                   i;\r
1332         BOOLEAN                 bExtRAInfo = TRUE;\r
1333         u1Byte                  cmdlen = H2C_0X42_LENGTH;\r
1334         u1Byte                  TxBF_EN = 0, stbc_en = 0;\r
1335 \r
1336         prtl8192cd_priv priv            = pDM_Odm->priv;\r
1337         PSTA_INFO_T     pstat;\r
1338         BOOLEAN                 act_bfer = FALSE;\r
1339 \r
1340 #if (BEAMFORMING_SUPPORT == 1)\r
1341         u1Byte  Idx=0xff;\r
1342 #if (defined(CONFIG_PHYDM_ANTENNA_DIVERSITY))\r
1343         pBDC_T  pDM_BdcTable = &pDM_Odm->DM_BdcTable;\r
1344         pDM_BdcTable->num_Txbfee_Client = 0;\r
1345         pDM_BdcTable->num_Txbfer_Client = 0;\r
1346 #endif\r
1347 #endif\r
1348         if (!pDM_Odm->H2C_RARpt_connect && (priv->up_time % 2))\r
1349                 return;\r
1350 \r
1351         if (pDM_Odm->SupportICType == ODM_RTL8188E) {\r
1352                 bExtRAInfo = FALSE;\r
1353                 cmdlen = 3;\r
1354         }\r
1355 \r
1356         for (i = 0; i < ODM_ASSOCIATE_ENTRY_NUM; i++) {\r
1357                 pstat = pDM_Odm->pODM_StaInfo[i];\r
1358 \r
1359                 if (IS_STA_VALID(pstat)) {\r
1360                         if (pstat->sta_in_firmware != 1)\r
1361                                 continue;\r
1362 \r
1363                         //2 BF_en\r
1364                 #if (BEAMFORMING_SUPPORT == 1)\r
1365                         BEAMFORMING_CAP Beamform_cap = Beamforming_GetEntryBeamCapByMacId(priv, pstat->aid);\r
1366                         PRT_BEAMFORMING_ENTRY   pEntry = Beamforming_GetEntryByMacId(priv, pstat->aid, &Idx);\r
1367 \r
1368                         if (Beamform_cap & (BEAMFORMER_CAP_HT_EXPLICIT | BEAMFORMER_CAP_VHT_SU))        {\r
1369                                 \r
1370                                 if (pEntry->Sounding_En)\r
1371                                         TxBF_EN = 1;\r
1372                                 else\r
1373                                         TxBF_EN = 0;\r
1374                                 \r
1375                                 act_bfer = TRUE;\r
1376                         }\r
1377 \r
1378                         #if (defined(CONFIG_PHYDM_ANTENNA_DIVERSITY)) /*BDC*/\r
1379                         if (act_bfer == TRUE) {\r
1380                                 pDM_BdcTable->w_BFee_Client[i] = 1; //AP act as BFer\r
1381                                 pDM_BdcTable->num_Txbfee_Client++;\r
1382                         } else {\r
1383                                 pDM_BdcTable->w_BFee_Client[i] = 0; //AP act as BFer\r
1384                         }\r
1385 \r
1386                         if ((Beamform_cap & BEAMFORMEE_CAP_HT_EXPLICIT) || (Beamform_cap & BEAMFORMEE_CAP_VHT_SU)) {\r
1387                                 pDM_BdcTable->w_BFer_Client[i] = 1; //AP act as BFee\r
1388                                 pDM_BdcTable->num_Txbfer_Client++;\r
1389                         } else {\r
1390                                 pDM_BdcTable->w_BFer_Client[i] = 0; //AP act as BFer\r
1391                         }\r
1392                         #endif\r
1393                 #endif\r
1394 \r
1395                         //2 STBC_en\r
1396                         if ((priv->pmib->dot11nConfigEntry.dot11nSTBC) &&\r
1397                                 ((pstat->ht_cap_buf.ht_cap_info & cpu_to_le16(_HTCAP_RX_STBC_CAP_))\r
1398                                 #ifdef RTK_AC_SUPPORT\r
1399                                 || (pstat->vht_cap_buf.vht_cap_info & cpu_to_le32(_VHTCAP_RX_STBC_CAP_))\r
1400                                 #endif\r
1401                                 ))\r
1402                                 stbc_en = 1;\r
1403 \r
1404                         //2 RAINFO\r
1405 \r
1406                         H2C_Parameter[4] = (pRA_Table->RA_threshold_offset & 0x7f) | (pRA_Table->RA_offset_direction<<7); \r
1407                         ODM_RT_TRACE(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_LOUD, ("RA_threshold_offset = (( %s%d ))\n", ((pRA_Table->RA_threshold_offset == 0) ? " " : ((pRA_Table->RA_offset_direction) ? "+" : "-")), pRA_Table->RA_threshold_offset));\r
1408 \r
1409                         if (bExtRAInfo) {\r
1410                                 if ((pstat->rx_avarage)  > ((pstat->tx_avarage) * 6))\r
1411                                         H2C_Parameter[3] |= RAINFO_BE_RX_STATE;\r
1412 \r
1413                                 if (TxBF_EN)\r
1414                                         H2C_Parameter[3] |= RAINFO_BF_STATE;\r
1415                                 else {\r
1416                                         if (stbc_en)\r
1417                                                 H2C_Parameter[3] |= RAINFO_STBC_STATE;\r
1418                                 }\r
1419 \r
1420                                 if (pDM_Odm->NoisyDecision)\r
1421                                         H2C_Parameter[3] |= RAINFO_NOISY_STATE;\r
1422                                 else\r
1423                                         H2C_Parameter[3] &= (~RAINFO_NOISY_STATE);\r
1424                                 \r
1425                                 if (pstat->H2C_rssi_rpt) {\r
1426                                         H2C_Parameter[3] |= RAINFO_INIT_RSSI_RATE_STATE;\r
1427                                         ODM_RT_TRACE(pDM_Odm, ODM_COMP_RATE_ADAPTIVE, ODM_DBG_LOUD, ("[RA Init] set Init rate by RSSI, STA %d\n", pstat->aid));\r
1428                                 }\r
1429 \r
1430                                 /*ODM_RT_TRACE(pDM_Odm,PHYDM_COMP_RA_DBG, ODM_DBG_LOUD, ("[RAINFO] H2C_Para[3] = %x\n",H2C_Parameter[3]));*/\r
1431                         }\r
1432 \r
1433                         H2C_Parameter[2] = (u1Byte)(pstat->rssi & 0xFF);\r
1434                         H2C_Parameter[0] = REMAP_AID(pstat);\r
1435 \r
1436                         ODM_RT_TRACE(pDM_Odm, ODM_COMP_COMMON, ODM_DBG_LOUD, ("H2C_Parameter[3]=%d\n", H2C_Parameter[3]));\r
1437 \r
1438                         //ODM_RT_TRACE(pDM_Odm,PHYDM_COMP_RA_DBG, ODM_DBG_LOUD, ("[RSSI] H2C_Para[2] = %x,  \n",H2C_Parameter[2]));\r
1439                         //ODM_RT_TRACE(pDM_Odm,PHYDM_COMP_RA_DBG, ODM_DBG_LOUD, ("[MACID] H2C_Para[0] = %x,  \n",H2C_Parameter[0]));\r
1440 \r
1441                         ODM_FillH2CCmd(pDM_Odm, ODM_H2C_RSSI_REPORT, cmdlen, H2C_Parameter);\r
1442 \r
1443                 }\r
1444         }\r
1445 \r
1446 #endif\r
1447 #endif\r
1448 \r
1449 }\r
1450 \r
1451 VOID\r
1452 odm_RSSIMonitorCheck(\r
1453         IN              PVOID           pDM_VOID\r
1454 )\r
1455 {\r
1456         PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
1457         \r
1458         if (!(pDM_Odm->SupportAbility & ODM_BB_RSSI_MONITOR))\r
1459                 return;\r
1460 \r
1461         switch  (pDM_Odm->SupportPlatform) {\r
1462         case    ODM_WIN:\r
1463                 odm_RSSIMonitorCheckMP(pDM_Odm);\r
1464                 break;\r
1465 \r
1466         case    ODM_CE:\r
1467                 odm_RSSIMonitorCheckCE(pDM_Odm);\r
1468                 break;\r
1469 \r
1470         case    ODM_AP:\r
1471                 odm_RSSIMonitorCheckAP(pDM_Odm);\r
1472                 break;\r
1473 \r
1474         default:\r
1475                 break;\r
1476         }\r
1477 \r
1478 }\r
1479 \r
1480 VOID\r
1481 odm_RateAdaptiveMaskInit(\r
1482         IN      PVOID   pDM_VOID\r
1483 )\r
1484 {\r
1485         PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
1486         PODM_RATE_ADAPTIVE      pOdmRA = &pDM_Odm->RateAdaptive;\r
1487 \r
1488 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\r
1489         PMGNT_INFO              pMgntInfo = &pDM_Odm->Adapter->MgntInfo;\r
1490         HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(pDM_Odm->Adapter);\r
1491 \r
1492         pMgntInfo->Ratr_State = DM_RATR_STA_INIT;\r
1493 \r
1494         if (pMgntInfo->DM_Type == DM_Type_ByDriver)\r
1495                 pHalData->bUseRAMask = TRUE;\r
1496         else\r
1497                 pHalData->bUseRAMask = FALSE;\r
1498 \r
1499 #elif (DM_ODM_SUPPORT_TYPE == ODM_CE)\r
1500         pOdmRA->Type = DM_Type_ByDriver;\r
1501         if (pOdmRA->Type == DM_Type_ByDriver)\r
1502                 pDM_Odm->bUseRAMask = _TRUE;\r
1503         else\r
1504                 pDM_Odm->bUseRAMask = _FALSE;\r
1505 #endif\r
1506 \r
1507         pOdmRA->RATRState = DM_RATR_STA_INIT;\r
1508 \r
1509 #if(DM_ODM_SUPPORT_TYPE & ODM_WIN)\r
1510         if (pDM_Odm->SupportICType == ODM_RTL8812)\r
1511                 pOdmRA->LdpcThres = 50;\r
1512         else\r
1513                 pOdmRA->LdpcThres = 35;\r
1514 \r
1515         pOdmRA->RtsThres = 35;\r
1516 \r
1517 #elif(DM_ODM_SUPPORT_TYPE & ODM_CE)\r
1518         pOdmRA->LdpcThres = 35;\r
1519         pOdmRA->bUseLdpc = FALSE;\r
1520 \r
1521 #else\r
1522         pOdmRA->UltraLowRSSIThresh = 9;\r
1523 \r
1524 #endif\r
1525 \r
1526         pOdmRA->HighRSSIThresh = 50;\r
1527 #if (DM_ODM_SUPPORT_TYPE == ODM_AP) && \\r
1528         ((DEV_BUS_TYPE == RT_USB_INTERFACE) || (DEV_BUS_TYPE == RT_SDIO_INTERFACE))\r
1529         pOdmRA->LowRSSIThresh = 23;\r
1530 #else\r
1531         pOdmRA->LowRSSIThresh = 20;\r
1532 #endif\r
1533 }\r
1534 /*-----------------------------------------------------------------------------\r
1535  * Function:    odm_RefreshRateAdaptiveMask()\r
1536  *\r
1537  * Overview:    Update rate table mask according to rssi\r
1538  *\r
1539  * Input:               NONE\r
1540  *\r
1541  * Output:              NONE\r
1542  *\r
1543  * Return:              NONE\r
1544  *\r
1545  * Revised History:\r
1546  *      When            Who             Remark\r
1547  *      05/27/2009      hpfan   Create Version 0.\r
1548  *\r
1549  *---------------------------------------------------------------------------*/\r
1550 VOID\r
1551 odm_RefreshRateAdaptiveMask(\r
1552         IN      PVOID   pDM_VOID\r
1553 )\r
1554 {\r
1555         PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
1556 \r
1557         if (!pDM_Odm->bLinked)\r
1558                 return;\r
1559                 \r
1560         if (!(pDM_Odm->SupportAbility & ODM_BB_RA_MASK)) {\r
1561                 ODM_RT_TRACE(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_TRACE, ("odm_RefreshRateAdaptiveMask(): Return cos not supported\n"));\r
1562                 return;\r
1563         }\r
1564         //\r
1565         // 2011/09/29 MH In HW integration first stage, we provide 4 different handle to operate\r
1566         // at the same time. In the stage2/3, we need to prive universal interface and merge all\r
1567         // HW dynamic mechanism.\r
1568         //\r
1569         switch  (pDM_Odm->SupportPlatform) {\r
1570         case    ODM_WIN:\r
1571                 odm_RefreshRateAdaptiveMaskMP(pDM_Odm);\r
1572                 break;\r
1573 \r
1574         case    ODM_CE:\r
1575                 odm_RefreshRateAdaptiveMaskCE(pDM_Odm);\r
1576                 break;\r
1577 \r
1578         case    ODM_AP:\r
1579                 odm_RefreshRateAdaptiveMaskAPADSL(pDM_Odm);\r
1580                 break;\r
1581         }\r
1582 \r
1583 }\r
1584 \r
1585 u1Byte\r
1586 phydm_trans_platform_bw(\r
1587         IN      PVOID           pDM_VOID,\r
1588         IN      u1Byte          BW\r
1589 )\r
1590 {\r
1591         #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\r
1592                 if (BW == CHANNEL_WIDTH_20)\r
1593                         BW = PHYDM_BW_20;\r
1594                         \r
1595                 else if (BW == CHANNEL_WIDTH_40)\r
1596                         BW = PHYDM_BW_40;\r
1597                         \r
1598                 else if (BW == CHANNEL_WIDTH_80)\r
1599                         BW = PHYDM_BW_80;\r
1600                         \r
1601                 else if (BW == CHANNEL_WIDTH_160)\r
1602                         BW = PHYDM_BW_160;\r
1603                         \r
1604                 else if (BW == CHANNEL_WIDTH_80_80)\r
1605                         BW = PHYDM_BW_80_80;\r
1606 \r
1607         #elif (DM_ODM_SUPPORT_TYPE == ODM_AP)\r
1608         \r
1609                 if (BW == HT_CHANNEL_WIDTH_20)\r
1610                         BW = PHYDM_BW_20;\r
1611                         \r
1612                 else if (BW == HT_CHANNEL_WIDTH_20_40)\r
1613                         BW = PHYDM_BW_40;\r
1614                         \r
1615                 else if (BW == HT_CHANNEL_WIDTH_80)\r
1616                         BW = PHYDM_BW_80;\r
1617                         \r
1618                 else if (BW == HT_CHANNEL_WIDTH_160)\r
1619                         BW = PHYDM_BW_160;\r
1620                         \r
1621                 else if (BW == HT_CHANNEL_WIDTH_10)\r
1622                         BW = PHYDM_BW_10;\r
1623                 \r
1624                 else if (BW == HT_CHANNEL_WIDTH_5)\r
1625                         BW = PHYDM_BW_5;\r
1626 \r
1627         #elif (DM_ODM_SUPPORT_TYPE == ODM_CE)\r
1628 \r
1629                 if (BW == CHANNEL_WIDTH_20)\r
1630                         BW = PHYDM_BW_20;\r
1631                         \r
1632                 else if (BW == CHANNEL_WIDTH_40)\r
1633                         BW = PHYDM_BW_40;\r
1634                         \r
1635                 else if (BW == CHANNEL_WIDTH_80)\r
1636                         BW = PHYDM_BW_80;\r
1637                         \r
1638                 else if (BW == CHANNEL_WIDTH_160)\r
1639                         BW = PHYDM_BW_160;\r
1640                         \r
1641                 else if (BW == CHANNEL_WIDTH_80_80)\r
1642                         BW = PHYDM_BW_80_80;\r
1643         #endif\r
1644 \r
1645         return BW;\r
1646 \r
1647 }\r
1648 \r
1649 u1Byte\r
1650 phydm_trans_platform_rf_type(\r
1651         IN      PVOID           pDM_VOID,\r
1652         IN      u1Byte          RfType\r
1653 )\r
1654 {\r
1655         #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\r
1656                 if (RfType == RF_1T2R)\r
1657                         RfType = PHYDM_RF_1T2R;\r
1658                         \r
1659                 else if (RfType == RF_2T4R)\r
1660                         RfType = PHYDM_RF_2T4R;\r
1661                         \r
1662                 else if (RfType == RF_2T2R)\r
1663                         RfType = PHYDM_RF_2T2R;\r
1664                         \r
1665                 else if (RfType == RF_1T1R)\r
1666                         RfType = PHYDM_RF_1T1R;\r
1667                         \r
1668                 else if (RfType == RF_2T2R_GREEN)\r
1669                         RfType = PHYDM_RF_2T2R_GREEN;\r
1670                         \r
1671                 else if (RfType == RF_3T3R)\r
1672                         RfType = PHYDM_RF_3T3R;\r
1673                         \r
1674                 else if (RfType == RF_4T4R)\r
1675                         RfType = PHYDM_RF_4T4R;\r
1676                         \r
1677                 else if (RfType == RF_2T3R)\r
1678                         RfType = PHYDM_RF_1T2R;\r
1679 \r
1680                 else if (RfType == RF_3T4R)\r
1681                         RfType = PHYDM_RF_3T4R;\r
1682 \r
1683         #elif (DM_ODM_SUPPORT_TYPE == ODM_AP)\r
1684 \r
1685                 if (RfType == MIMO_1T2R)\r
1686                         RfType = PHYDM_RF_1T2R;\r
1687                         \r
1688                 else if (RfType == MIMO_2T4R)\r
1689                         RfType = PHYDM_RF_2T4R;\r
1690                         \r
1691                 else if (RfType == MIMO_2T2R)\r
1692                         RfType = PHYDM_RF_2T2R;\r
1693                         \r
1694                 else if (RfType == MIMO_1T1R)\r
1695                         RfType = PHYDM_RF_1T1R;\r
1696                         \r
1697                 else if (RfType == MIMO_3T3R)\r
1698                         RfType = PHYDM_RF_3T3R;\r
1699                         \r
1700                 else if (RfType == MIMO_4T4R)\r
1701                         RfType = PHYDM_RF_4T4R;\r
1702                         \r
1703                 else if (RfType == MIMO_2T3R)\r
1704                         RfType = PHYDM_RF_1T2R;\r
1705 \r
1706                 else if (RfType == MIMO_3T4R)\r
1707                         RfType = PHYDM_RF_3T4R;\r
1708 \r
1709         #elif (DM_ODM_SUPPORT_TYPE == ODM_CE)\r
1710         \r
1711                 if (RfType == RF_1T2R)\r
1712                         RfType = PHYDM_RF_1T2R;\r
1713                         \r
1714                 else if (RfType == RF_2T4R)\r
1715                         RfType = PHYDM_RF_2T4R;\r
1716                         \r
1717                 else if (RfType == RF_2T2R)\r
1718                         RfType = PHYDM_RF_2T2R;\r
1719                         \r
1720                 else if (RfType == RF_1T1R)\r
1721                         RfType = PHYDM_RF_1T1R;\r
1722                 \r
1723                 else if (RfType == RF_2T2R_GREEN)\r
1724                         RfType = PHYDM_RF_2T2R_GREEN;\r
1725                 \r
1726                 else if (RfType == RF_3T3R)\r
1727                         RfType = PHYDM_RF_3T3R;\r
1728                         \r
1729                 else if (RfType == RF_4T4R)\r
1730                         RfType = PHYDM_RF_4T4R;\r
1731                         \r
1732                 else if (RfType == RF_2T3R)\r
1733                         RfType = PHYDM_RF_1T2R;\r
1734 \r
1735                 else if (RfType == RF_3T4R)\r
1736                         RfType = PHYDM_RF_3T4R;\r
1737 \r
1738         #endif\r
1739 \r
1740         return RfType;\r
1741 \r
1742 }\r
1743 \r
1744 u4Byte\r
1745 phydm_trans_platform_wireless_mode(\r
1746         IN      PVOID           pDM_VOID,\r
1747         IN      u4Byte          wireless_mode\r
1748 )\r
1749 {\r
1750         #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\r
1751         \r
1752         #elif (DM_ODM_SUPPORT_TYPE == ODM_AP)\r
1753 \r
1754         #elif (DM_ODM_SUPPORT_TYPE == ODM_CE)\r
1755         \r
1756         if (wireless_mode == WIRELESS_11A)\r
1757                         wireless_mode = PHYDM_WIRELESS_MODE_A;\r
1758                         \r
1759                 else if (wireless_mode == WIRELESS_11B)\r
1760                         wireless_mode = PHYDM_WIRELESS_MODE_B;\r
1761                         \r
1762                 else if ((wireless_mode == WIRELESS_11G) || (wireless_mode == WIRELESS_11BG))\r
1763                         wireless_mode = PHYDM_WIRELESS_MODE_G;\r
1764                         \r
1765                 else if (wireless_mode == WIRELESS_AUTO)\r
1766                         wireless_mode = PHYDM_WIRELESS_MODE_AUTO;\r
1767                         \r
1768                 else if ((wireless_mode == WIRELESS_11_24N) || (wireless_mode == WIRELESS_11G_24N) || (wireless_mode == WIRELESS_11B_24N) ||\r
1769                         (wireless_mode == WIRELESS_11BG_24N) || (wireless_mode == WIRELESS_MODE_24G) || (wireless_mode == WIRELESS_11ABGN) || (wireless_mode == WIRELESS_11AGN))\r
1770                         wireless_mode = PHYDM_WIRELESS_MODE_N_24G;\r
1771                         \r
1772                 else if ((wireless_mode == WIRELESS_11_5N) || (wireless_mode == WIRELESS_11A_5N))\r
1773                         wireless_mode = PHYDM_WIRELESS_MODE_N_5G;\r
1774                         \r
1775                 else if ((wireless_mode == WIRELESS_11AC) || (wireless_mode == WIRELESS_11_5AC) || (wireless_mode == WIRELESS_MODE_5G))\r
1776                         wireless_mode = PHYDM_WIRELESS_MODE_AC_5G;\r
1777                         \r
1778                 else if (wireless_mode == WIRELESS_11_24AC)\r
1779                         wireless_mode = PHYDM_WIRELESS_MODE_AC_24G;\r
1780 \r
1781                 else if (wireless_mode == WIRELESS_11AC)\r
1782                         wireless_mode = PHYDM_WIRELESS_MODE_AC_ONLY;\r
1783                 \r
1784                 else if (wireless_mode == WIRELESS_MODE_MAX)\r
1785                         wireless_mode = PHYDM_WIRELESS_MODE_MAX;\r
1786                 else\r
1787                         wireless_mode = PHYDM_WIRELESS_MODE_UNKNOWN;    \r
1788         #endif\r
1789 \r
1790         return wireless_mode;\r
1791 \r
1792 }\r
1793 \r
1794 u1Byte\r
1795 phydm_vht_en_mapping(\r
1796         IN      PVOID                   pDM_VOID,\r
1797         IN      u4Byte                  WirelessMode\r
1798 )\r
1799 {\r
1800         PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
1801         u1Byte                  vht_en_out = 0;\r
1802 \r
1803         if ((WirelessMode == PHYDM_WIRELESS_MODE_AC_5G) ||\r
1804                 (WirelessMode == PHYDM_WIRELESS_MODE_AC_24G) ||\r
1805                 (WirelessMode == PHYDM_WIRELESS_MODE_AC_ONLY)\r
1806                 ) {\r
1807                 vht_en_out = 1;\r
1808                 /**/\r
1809         }\r
1810         \r
1811         ODM_RT_TRACE(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_LOUD, ("WirelessMode= (( 0x%x )), VHT_EN= (( %d ))\n", WirelessMode, vht_en_out));\r
1812         return vht_en_out;\r
1813 }\r
1814 \r
1815 u1Byte\r
1816 phydm_rate_id_mapping(\r
1817         IN      PVOID                   pDM_VOID,\r
1818         IN      u4Byte                  WirelessMode,\r
1819         IN      u1Byte                  RfType,\r
1820         IN      u1Byte                  bw\r
1821 )\r
1822 {\r
1823         PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
1824         u1Byte                  rate_id_idx = 0;\r
1825         u1Byte                  phydm_BW;\r
1826         u1Byte                  phydm_RfType;\r
1827         \r
1828         phydm_BW = phydm_trans_platform_bw(pDM_Odm, bw);\r
1829         phydm_RfType = phydm_trans_platform_rf_type(pDM_Odm, RfType);\r
1830         #if (DM_ODM_SUPPORT_TYPE == ODM_CE)\r
1831         WirelessMode = phydm_trans_platform_wireless_mode(pDM_Odm, WirelessMode);\r
1832         #endif\r
1833 \r
1834         ODM_RT_TRACE(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_LOUD, ("wirelessMode= (( 0x%x )), RfType = (( 0x%x )), BW = (( 0x%x ))\n", \r
1835                 WirelessMode, phydm_RfType, phydm_BW));\r
1836 \r
1837         \r
1838         switch (WirelessMode) {\r
1839         \r
1840         case PHYDM_WIRELESS_MODE_N_24G:\r
1841                 {\r
1842         \r
1843                         if (phydm_BW == PHYDM_BW_40) {\r
1844                         \r
1845                                 if (phydm_RfType == PHYDM_RF_1T1R)\r
1846                                         rate_id_idx = PHYDM_BGN_40M_1SS;\r
1847                                 else if (phydm_RfType == PHYDM_RF_2T2R)\r
1848                                         rate_id_idx = PHYDM_BGN_40M_2SS;\r
1849                                 else\r
1850                                         rate_id_idx = PHYDM_ARFR5_N_3SS;\r
1851                                 \r
1852                         } else {\r
1853                         \r
1854                                 if (phydm_RfType == PHYDM_RF_1T1R)\r
1855                                         rate_id_idx = PHYDM_BGN_20M_1SS;\r
1856                                 else if (phydm_RfType == PHYDM_RF_2T2R)\r
1857                                         rate_id_idx = PHYDM_BGN_20M_2SS;\r
1858                                 else\r
1859                                         rate_id_idx = PHYDM_ARFR5_N_3SS;\r
1860                         }\r
1861                 }\r
1862                 break;\r
1863                 \r
1864         case PHYDM_WIRELESS_MODE_N_5G:\r
1865                 {\r
1866                         if (phydm_RfType == PHYDM_RF_1T1R)\r
1867                                 rate_id_idx = PHYDM_GN_N1SS;\r
1868                         else if (phydm_RfType == PHYDM_RF_2T2R)\r
1869                                 rate_id_idx = PHYDM_GN_N2SS;\r
1870                         else\r
1871                                 rate_id_idx = PHYDM_ARFR5_N_3SS;\r
1872                 }\r
1873                 \r
1874                 break;\r
1875         \r
1876         case PHYDM_WIRELESS_MODE_G:\r
1877                 rate_id_idx = PHYDM_BG;\r
1878                 break;\r
1879                                 \r
1880         case PHYDM_WIRELESS_MODE_A:\r
1881                 rate_id_idx = PHYDM_G;\r
1882                 break;  \r
1883         \r
1884         case PHYDM_WIRELESS_MODE_B:\r
1885                 rate_id_idx = PHYDM_B_20M;\r
1886                 break;\r
1887         \r
1888         \r
1889         case PHYDM_WIRELESS_MODE_AC_5G:\r
1890         case PHYDM_WIRELESS_MODE_AC_ONLY:\r
1891                 {\r
1892                         if (phydm_RfType == PHYDM_RF_1T1R)\r
1893                                 rate_id_idx = PHYDM_ARFR1_AC_1SS;\r
1894                         else if (phydm_RfType == PHYDM_RF_2T2R)\r
1895                                 rate_id_idx = PHYDM_ARFR0_AC_2SS;\r
1896                         else\r
1897                                 rate_id_idx = PHYDM_ARFR4_AC_3SS;\r
1898                 }\r
1899                 break;\r
1900         \r
1901         case PHYDM_WIRELESS_MODE_AC_24G:\r
1902                 {\r
1903                         /*Becareful to set "Lowest rate" while using PHYDM_ARFR4_AC_3SS in 2.4G/5G*/          \r
1904                         if (phydm_BW >= PHYDM_BW_80) {\r
1905                                 if (phydm_RfType == PHYDM_RF_1T1R)\r
1906                                         rate_id_idx = PHYDM_ARFR1_AC_1SS;\r
1907                                 else if (phydm_RfType == PHYDM_RF_2T2R)\r
1908                                         rate_id_idx = PHYDM_ARFR0_AC_2SS;\r
1909                                 else\r
1910                                         rate_id_idx = PHYDM_ARFR4_AC_3SS;\r
1911                         } else {\r
1912                                 \r
1913                                 if (phydm_RfType == PHYDM_RF_1T1R)\r
1914                                         rate_id_idx = PHYDM_ARFR2_AC_2G_1SS;\r
1915                                 else if (phydm_RfType == PHYDM_RF_2T2R)\r
1916                                         rate_id_idx = PHYDM_ARFR3_AC_2G_2SS;\r
1917                                 else\r
1918                                         rate_id_idx = PHYDM_ARFR4_AC_3SS;\r
1919                         }\r
1920                 }\r
1921                 break;\r
1922         \r
1923         default:\r
1924                 rate_id_idx = 0;\r
1925                 break;\r
1926         }\r
1927         \r
1928         ODM_RT_TRACE(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_LOUD, ("RA Rate ID = (( 0x%d ))\n", rate_id_idx));\r
1929         \r
1930         return rate_id_idx;\r
1931 }\r
1932 \r
1933 VOID\r
1934 phydm_UpdateHalRAMask(\r
1935         IN      PVOID                   pDM_VOID,\r
1936         IN      u4Byte                  wirelessMode,\r
1937         IN      u1Byte                  RfType,\r
1938         IN      u1Byte                  BW,\r
1939         IN      u1Byte                  MimoPs_enable,\r
1940         IN      u1Byte                  disable_cck_rate,\r
1941         IN      u4Byte                  *ratr_bitmap_msb_in,\r
1942         IN      u4Byte                  *ratr_bitmap_lsb_in,\r
1943         IN      u1Byte                  tx_rate_level\r
1944         )\r
1945 {\r
1946         PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
1947         u4Byte                  mask_rate_threshold;\r
1948         u1Byte                  phydm_RfType;\r
1949         u1Byte                  phydm_BW;\r
1950         u4Byte                  ratr_bitmap = *ratr_bitmap_lsb_in, ratr_bitmap_msb = *ratr_bitmap_msb_in;\r
1951         /*PODM_RATE_ADAPTIVE            pRA = &(pDM_Odm->RateAdaptive);*/\r
1952 \r
1953         #if (DM_ODM_SUPPORT_TYPE == ODM_CE)\r
1954         wirelessMode = phydm_trans_platform_wireless_mode(pDM_Odm, wirelessMode);\r
1955         #endif\r
1956         \r
1957         phydm_RfType = phydm_trans_platform_rf_type(pDM_Odm, RfType);\r
1958         phydm_BW = phydm_trans_platform_bw(pDM_Odm, BW);\r
1959         \r
1960         /*ODM_RT_TRACE(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_LOUD, ("phydm_RfType = (( %x )), RfType = (( %x ))\n", phydm_RfType, RfType));*/\r
1961         ODM_RT_TRACE(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_LOUD, ("Platfoem original RA Mask = (( 0x %x | %x ))\n", ratr_bitmap_msb, ratr_bitmap));\r
1962         \r
1963         switch (wirelessMode) {\r
1964                 \r
1965         case PHYDM_WIRELESS_MODE_B:\r
1966                 {\r
1967                         ratr_bitmap &= 0x0000000f;\r
1968                 }\r
1969                 break;\r
1970 \r
1971         case PHYDM_WIRELESS_MODE_G:\r
1972                 {                       \r
1973                         ratr_bitmap &= 0x00000ff5;\r
1974                 }\r
1975                 break;\r
1976                 \r
1977         case PHYDM_WIRELESS_MODE_A:\r
1978                 {\r
1979                         ratr_bitmap &= 0x00000ff0;\r
1980                 }\r
1981                 break;\r
1982                 \r
1983         case PHYDM_WIRELESS_MODE_N_24G:\r
1984         case PHYDM_WIRELESS_MODE_N_5G:\r
1985                 {\r
1986                         if (MimoPs_enable)\r
1987                                 phydm_RfType = PHYDM_RF_1T1R;\r
1988                         \r
1989                         if (phydm_RfType == PHYDM_RF_1T1R) {\r
1990                                 \r
1991                                 if (phydm_BW == PHYDM_BW_40)\r
1992                                         ratr_bitmap &= 0x000ff015;\r
1993                                 else\r
1994                                         ratr_bitmap &= 0x000ff005;\r
1995                         } else if (phydm_RfType == PHYDM_RF_2T2R || phydm_RfType == PHYDM_RF_2T4R || phydm_RfType == PHYDM_RF_2T3R) {\r
1996                         \r
1997                                 if (phydm_BW == PHYDM_BW_40)\r
1998                                         ratr_bitmap &= 0x0ffff015;\r
1999                                 else\r
2000                                         ratr_bitmap &= 0x0ffff005;\r
2001                         } else { /*3T*/\r
2002                         \r
2003                                 ratr_bitmap &= 0xfffff015;\r
2004                                 ratr_bitmap_msb &= 0xf;\r
2005                         }\r
2006                 }\r
2007                 break;\r
2008 \r
2009         case PHYDM_WIRELESS_MODE_AC_24G:\r
2010                 {\r
2011                         if (phydm_RfType == PHYDM_RF_1T1R)\r
2012                                 ratr_bitmap &= 0x003ff015;      \r
2013                         else if (phydm_RfType == PHYDM_RF_2T2R || phydm_RfType == PHYDM_RF_2T4R || phydm_RfType == PHYDM_RF_2T3R) \r
2014                                 ratr_bitmap &= 0xfffff015;\r
2015                         else {/*3T*/\r
2016                                 \r
2017                                 ratr_bitmap &= 0xfffff010;\r
2018                                 ratr_bitmap_msb &= 0x3ff;\r
2019                         }\r
2020 \r
2021                         if (phydm_BW == PHYDM_BW_20) {/* AC 20MHz doesn't support MCS9 */\r
2022                                 ratr_bitmap &= 0x7fdfffff;\r
2023                                 ratr_bitmap_msb &= 0x1ff;\r
2024                         }\r
2025                 }\r
2026                 break;\r
2027 \r
2028         case PHYDM_WIRELESS_MODE_AC_5G:\r
2029                 {\r
2030                         if (phydm_RfType == PHYDM_RF_1T1R)\r
2031                                 ratr_bitmap &= 0x003ff010;\r
2032                         else if (phydm_RfType == PHYDM_RF_2T2R || phydm_RfType == PHYDM_RF_2T4R || phydm_RfType == PHYDM_RF_2T3R) \r
2033                                 ratr_bitmap &= 0xfffff010;\r
2034                         else {/*3T*/\r
2035                                 \r
2036                                 ratr_bitmap &= 0xfffff010;\r
2037                                 ratr_bitmap_msb &= 0x3ff;\r
2038                         }\r
2039 \r
2040                         if (phydm_BW == PHYDM_BW_20) {/* AC 20MHz doesn't support MCS9 */\r
2041                                 ratr_bitmap &= 0x7fdfffff;\r
2042                                 ratr_bitmap_msb &= 0x1ff;\r
2043                         }\r
2044                 }\r
2045                 break;\r
2046 \r
2047         default:\r
2048                 break;\r
2049         }\r
2050 \r
2051         if (wirelessMode != PHYDM_WIRELESS_MODE_B) {\r
2052                 \r
2053                 if (tx_rate_level == 0) \r
2054                         ratr_bitmap &=  0xffffffff;\r
2055                 else if (tx_rate_level == 1) \r
2056                         ratr_bitmap &=  0xfffffff0;\r
2057                  else if (tx_rate_level == 2) \r
2058                         ratr_bitmap &=  0xffffefe0;\r
2059                 else if (tx_rate_level == 3) \r
2060                         ratr_bitmap &=  0xffffcfc0;\r
2061                 else if (tx_rate_level == 4) \r
2062                         ratr_bitmap &=  0xffff8f80;\r
2063                 else if (tx_rate_level >= 5) \r
2064                         ratr_bitmap &=  0xffff0f00;\r
2065                 \r
2066         }\r
2067         \r
2068         if (disable_cck_rate)\r
2069                 ratr_bitmap &= 0xfffffff0;\r
2070 \r
2071         ODM_RT_TRACE(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_LOUD, ("wirelessMode= (( 0x%x )), RfType = (( 0x%x )), BW = (( 0x%x )), MimoPs_en = (( %d )), tx_rate_level= (( 0x%d ))\n", \r
2072                 wirelessMode, phydm_RfType, phydm_BW, MimoPs_enable, tx_rate_level));\r
2073 \r
2074         /*ODM_RT_TRACE(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_LOUD, ("111 Phydm modified RA Mask = (( 0x %x | %x ))\n", ratr_bitmap_msb, ratr_bitmap));*/\r
2075 \r
2076         *ratr_bitmap_lsb_in = ratr_bitmap;\r
2077         *ratr_bitmap_msb_in = ratr_bitmap_msb;\r
2078         ODM_RT_TRACE(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_LOUD, ("Phydm modified RA Mask = (( 0x %x | %x ))\n", *ratr_bitmap_msb_in, *ratr_bitmap_lsb_in));\r
2079 \r
2080 }\r
2081 \r
2082 u1Byte \r
2083 phydm_RA_level_decision(\r
2084         IN              PVOID                   pDM_VOID,\r
2085         IN              u4Byte                  rssi,\r
2086         IN              u1Byte                  Ratr_State\r
2087         )\r
2088 {\r
2089         PDM_ODM_T       pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
2090         u1Byte  ra_lowest_rate;\r
2091         u1Byte  ra_rate_floor_table[RA_FLOOR_TABLE_SIZE] = {20, 34, 38, 42, 46, 50, 100}; /*MCS0 ~ MCS4 , VHT1SS MCS0 ~ MCS4 , G 6M~24M*/\r
2092         u1Byte  new_Ratr_State = 0;\r
2093         u1Byte  i;\r
2094 \r
2095         ODM_RT_TRACE(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_LOUD, ("curr RA level = ((%d)), Rate_floor_table ori [ %d , %d, %d , %d, %d, %d]\n", Ratr_State, \r
2096                 ra_rate_floor_table[0], ra_rate_floor_table[1], ra_rate_floor_table[2], ra_rate_floor_table[3], ra_rate_floor_table[4], ra_rate_floor_table[5]));\r
2097 \r
2098         for (i = 0; i < RA_FLOOR_TABLE_SIZE; i++) {\r
2099 \r
2100                 if (i >= (Ratr_State))\r
2101                         ra_rate_floor_table[i] += RA_FLOOR_UP_GAP;\r
2102         }\r
2103         \r
2104         ODM_RT_TRACE(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_LOUD, ("RSSI = ((%d)), Rate_floor_table_mod [ %d , %d, %d , %d, %d, %d]\n", \r
2105                 rssi, ra_rate_floor_table[0], ra_rate_floor_table[1], ra_rate_floor_table[2], ra_rate_floor_table[3], ra_rate_floor_table[4], ra_rate_floor_table[5]));\r
2106         \r
2107         for (i = 0; i < RA_FLOOR_TABLE_SIZE; i++) {\r
2108 \r
2109                 if (rssi < ra_rate_floor_table[i]) {\r
2110                         new_Ratr_State = i;\r
2111                         break;\r
2112                 }\r
2113         }\r
2114 \r
2115 \r
2116 \r
2117         return  new_Ratr_State;         \r
2118 \r
2119 }\r
2120 \r
2121 VOID\r
2122 odm_RefreshRateAdaptiveMaskMP(\r
2123         IN              PVOID           pDM_VOID\r
2124 )\r
2125 {\r
2126 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\r
2127         PDM_ODM_T                               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
2128         PADAPTER                                pAdapter         =  pDM_Odm->Adapter;\r
2129         PADAPTER                                pTargetAdapter = NULL;\r
2130         HAL_DATA_TYPE                   *pHalData = GET_HAL_DATA(pAdapter);\r
2131         PMGNT_INFO                              pMgntInfo = GetDefaultMgntInfo(pAdapter);\r
2132         u4Byte          i;\r
2133         PSTA_INFO_T pEntry;\r
2134         u1Byte          Ratr_State_new;\r
2135 \r
2136         if (pAdapter->bDriverStopped) {\r
2137                 ODM_RT_TRACE(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_TRACE, ("<---- odm_RefreshRateAdaptiveMask(): driver is going to unload\n"));\r
2138                 return;\r
2139         }\r
2140 \r
2141         if (!pHalData->bUseRAMask) {\r
2142                 ODM_RT_TRACE(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_LOUD, ("<---- odm_RefreshRateAdaptiveMask(): driver does not control rate adaptive mask\n"));\r
2143                 return;\r
2144         }\r
2145 \r
2146         // if default port is connected, update RA table for default port (infrastructure mode only)\r
2147         if (pMgntInfo->mAssoc && (!ACTING_AS_AP(pAdapter))) {\r
2148                 odm_RefreshLdpcRtsMP(pAdapter, pDM_Odm, pMgntInfo->mMacId,  pMgntInfo->IOTPeer, pHalData->UndecoratedSmoothedPWDB);\r
2149                 /*ODM_RT_TRACE(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_LOUD, ("Infrasture Mode\n"));*/\r
2150 \r
2151                 #if RA_MASK_PHYDMLIZE_WIN\r
2152                         Ratr_State_new = phydm_RA_level_decision(pDM_Odm, pHalData->UndecoratedSmoothedPWDB, pMgntInfo->Ratr_State);\r
2153 \r
2154                         if (pMgntInfo->Ratr_State != Ratr_State_new) {\r
2155                                 \r
2156                                 ODM_PRINT_ADDR(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_LOUD, ("Target AP addr :"), pMgntInfo->Bssid);\r
2157                                 ODM_RT_TRACE(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_LOUD, ("Update RA Level: ((%x)) -> ((%x)),  RSSI = ((%d))\n\n", \r
2158                                         pMgntInfo->Ratr_State, Ratr_State_new, pHalData->UndecoratedSmoothedPWDB));\r
2159                                 \r
2160                                 pMgntInfo->Ratr_State = Ratr_State_new;\r
2161                                 pAdapter->HalFunc.UpdateHalRAMaskHandler(pAdapter, pMgntInfo->mMacId, NULL, Ratr_State_new);\r
2162                         } else {\r
2163                                 ODM_RT_TRACE(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_LOUD, ("Stay in RA level  = (( %d ))\n\n", Ratr_State_new));\r
2164                                 /**/\r
2165                         }\r
2166                         \r
2167                 #else\r
2168                         if (ODM_RAStateCheck(pDM_Odm, pHalData->UndecoratedSmoothedPWDB, pMgntInfo->bSetTXPowerTrainingByOid, &pMgntInfo->Ratr_State)) {\r
2169                                 ODM_PRINT_ADDR(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_LOUD, ("Target AP addr : "), pMgntInfo->Bssid);\r
2170                                 ODM_RT_TRACE(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_LOUD, ("RSSI:%d, RSSI_LEVEL:%d\n", pHalData->UndecoratedSmoothedPWDB, pMgntInfo->Ratr_State));\r
2171                                 pAdapter->HalFunc.UpdateHalRAMaskHandler(pAdapter, pMgntInfo->mMacId, NULL, pMgntInfo->Ratr_State);\r
2172                         } else if (pDM_Odm->bChangeState) {\r
2173                                 ODM_PRINT_ADDR(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_LOUD, ("Target AP addr : "), pMgntInfo->Bssid);\r
2174                                 ODM_RT_TRACE(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_LOUD, ("Change Power Training State, bDisablePowerTraining = %d\n", pDM_Odm->bDisablePowerTraining));\r
2175                                 pAdapter->HalFunc.UpdateHalRAMaskHandler(pAdapter, pMgntInfo->mMacId, NULL, pMgntInfo->Ratr_State);\r
2176                         }\r
2177                 #endif\r
2178         }\r
2179 \r
2180         //\r
2181         // The following part configure AP/VWifi/IBSS rate adaptive mask.\r
2182         //\r
2183 \r
2184         if (pMgntInfo->mIbss)   // Target: AP/IBSS peer.\r
2185                 pTargetAdapter = GetDefaultAdapter(pAdapter);\r
2186         else\r
2187                 pTargetAdapter = GetFirstAPAdapter(pAdapter);\r
2188 \r
2189         // if extension port (softap) is started, updaet RA table for more than one clients associate\r
2190         if (pTargetAdapter != NULL) {\r
2191                 for (i = 0; i < ODM_ASSOCIATE_ENTRY_NUM; i++) {\r
2192                         \r
2193                         pEntry = AsocEntry_EnumStation(pTargetAdapter, i);\r
2194                         \r
2195                         if (IS_STA_VALID(pEntry)) {\r
2196 \r
2197                                 odm_RefreshLdpcRtsMP(pAdapter, pDM_Odm, pEntry->AssociatedMacId, pEntry->IOTPeer, pEntry->rssi_stat.UndecoratedSmoothedPWDB);\r
2198 \r
2199                                 #if RA_MASK_PHYDMLIZE_WIN\r
2200                                 Ratr_State_new = phydm_RA_level_decision(pDM_Odm, pEntry->rssi_stat.UndecoratedSmoothedPWDB, pEntry->Ratr_State);\r
2201 \r
2202                                 if (pEntry->Ratr_State != Ratr_State_new) {\r
2203                                         \r
2204                                         ODM_PRINT_ADDR(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_LOUD, ("Target AP addr :"), pEntry->MacAddr);\r
2205                                         ODM_RT_TRACE(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_LOUD, ("Update Tx RA Level: ((%x)) -> ((%x)),  RSSI = ((%d))\n", \r
2206                                                 pEntry->Ratr_State, Ratr_State_new,  pEntry->rssi_stat.UndecoratedSmoothedPWDB));\r
2207                                         \r
2208                                         pEntry->Ratr_State = Ratr_State_new;\r
2209                                         pAdapter->HalFunc.UpdateHalRAMaskHandler(pAdapter, pEntry->AssociatedMacId, NULL, Ratr_State_new);\r
2210                                 } else {\r
2211                                         ODM_RT_TRACE(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_LOUD, ("Stay in RA level  = (( %d ))\n\n", Ratr_State_new));\r
2212                                         /**/\r
2213                                 }\r
2214                         \r
2215                                 \r
2216                                 #else\r
2217                                 \r
2218                                 if (ODM_RAStateCheck(pDM_Odm, pEntry->rssi_stat.UndecoratedSmoothedPWDB, pMgntInfo->bSetTXPowerTrainingByOid, &pEntry->Ratr_State)) {\r
2219                                         ODM_PRINT_ADDR(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_LOUD, ("Target STA addr : "), pEntry->MacAddr);\r
2220                                         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
2221                                         pAdapter->HalFunc.UpdateHalRAMaskHandler(pTargetAdapter, pEntry->AssociatedMacId, pEntry, pEntry->Ratr_State);\r
2222                                 } else if (pDM_Odm->bChangeState) {\r
2223                                         ODM_RT_TRACE(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_LOUD, ("Change Power Training State, bDisablePowerTraining = %d\n", pDM_Odm->bDisablePowerTraining));\r
2224                                         pAdapter->HalFunc.UpdateHalRAMaskHandler(pAdapter, pMgntInfo->mMacId, NULL, pMgntInfo->Ratr_State);\r
2225                                 }\r
2226                                 #endif\r
2227                                 \r
2228                         }\r
2229                 }\r
2230         }\r
2231         \r
2232         #if RA_MASK_PHYDMLIZE_WIN\r
2233 \r
2234         #else\r
2235                 if (pMgntInfo->bSetTXPowerTrainingByOid)\r
2236                         pMgntInfo->bSetTXPowerTrainingByOid = FALSE;\r
2237         #endif\r
2238 #endif  // #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\r
2239 }\r
2240 \r
2241 \r
2242 VOID\r
2243 odm_RefreshRateAdaptiveMaskCE(\r
2244         IN      PVOID   pDM_VOID\r
2245 )\r
2246 {\r
2247 #if (DM_ODM_SUPPORT_TYPE == ODM_CE)\r
2248         PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
2249         PADAPTER        pAdapter         =  pDM_Odm->Adapter;\r
2250         PODM_RATE_ADAPTIVE              pRA = &pDM_Odm->RateAdaptive;\r
2251         u4Byte          i;\r
2252         PSTA_INFO_T pEntry;\r
2253         u1Byte          Ratr_State_new;\r
2254 \r
2255         if (RTW_CANNOT_RUN(pAdapter)) {\r
2256                 ODM_RT_TRACE(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_TRACE, ("<---- odm_RefreshRateAdaptiveMask(): driver is going to unload\n"));\r
2257                 return;\r
2258         }\r
2259 \r
2260         if (!pDM_Odm->bUseRAMask) {\r
2261                 ODM_RT_TRACE(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_LOUD, ("<---- odm_RefreshRateAdaptiveMask(): driver does not control rate adaptive mask\n"));\r
2262                 return;\r
2263         }\r
2264 \r
2265         for (i = 0; i < ODM_ASSOCIATE_ENTRY_NUM; i++) {\r
2266                 \r
2267                 pEntry = pDM_Odm->pODM_StaInfo[i];\r
2268                 \r
2269                 if (IS_STA_VALID(pEntry)) {\r
2270 \r
2271                         if (IS_MCAST(pEntry->hwaddr))\r
2272                                 continue;\r
2273 \r
2274                         #if ((RTL8812A_SUPPORT == 1) || (RTL8821A_SUPPORT == 1))\r
2275                         if ((pDM_Odm->SupportICType == ODM_RTL8812) || (pDM_Odm->SupportICType == ODM_RTL8821)) {\r
2276                                 if (pEntry->rssi_stat.UndecoratedSmoothedPWDB < pRA->LdpcThres) {\r
2277                                         pRA->bUseLdpc = TRUE;\r
2278                                         pRA->bLowerRtsRate = TRUE;\r
2279                                         if ((pDM_Odm->SupportICType == ODM_RTL8821) && (pDM_Odm->CutVersion == ODM_CUT_A))\r
2280                                                 Set_RA_LDPC_8812(pEntry, TRUE);\r
2281                                         //DbgPrint("RSSI=%d, bUseLdpc = TRUE\n", pHalData->UndecoratedSmoothedPWDB);\r
2282                                 } else if (pEntry->rssi_stat.UndecoratedSmoothedPWDB > (pRA->LdpcThres - 5)) {\r
2283                                         pRA->bUseLdpc = FALSE;\r
2284                                         pRA->bLowerRtsRate = FALSE;\r
2285                                         if ((pDM_Odm->SupportICType == ODM_RTL8821) && (pDM_Odm->CutVersion == ODM_CUT_A))\r
2286                                                 Set_RA_LDPC_8812(pEntry, FALSE);\r
2287                                         //DbgPrint("RSSI=%d, bUseLdpc = FALSE\n", pHalData->UndecoratedSmoothedPWDB);\r
2288                                 }\r
2289                         }\r
2290                         #endif\r
2291                         \r
2292                 #if RA_MASK_PHYDMLIZE_CE\r
2293                         Ratr_State_new = phydm_RA_level_decision(pDM_Odm, pEntry->rssi_stat.UndecoratedSmoothedPWDB, pEntry->rssi_level);\r
2294 \r
2295                         if (pEntry->rssi_level != Ratr_State_new) {\r
2296                                 \r
2297                                 /*ODM_PRINT_ADDR(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_LOUD, ("Target AP addr :"), pstat->hwaddr);*/\r
2298                                 ODM_RT_TRACE(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_LOUD, ("Update Tx RA Level: ((%x)) -> ((%x)),  RSSI = ((%d))\n", \r
2299                                          pEntry->rssi_level, Ratr_State_new, pEntry->rssi_stat.UndecoratedSmoothedPWDB));\r
2300                                 \r
2301                                 pEntry->rssi_level = Ratr_State_new;\r
2302                                 rtw_hal_update_ra_mask(pEntry, pEntry->rssi_level);\r
2303                         } else {\r
2304                                 ODM_RT_TRACE(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_LOUD, ("Stay in RA level  = (( %d ))\n\n", Ratr_State_new));\r
2305                                 /**/\r
2306                         }\r
2307                 #else\r
2308                         if (TRUE == ODM_RAStateCheck(pDM_Odm, pEntry->rssi_stat.UndecoratedSmoothedPWDB, FALSE , &pEntry->rssi_level)) {\r
2309                                 ODM_RT_TRACE(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_LOUD, ("RSSI:%d, RSSI_LEVEL:%d\n", pEntry->rssi_stat.UndecoratedSmoothedPWDB, pEntry->rssi_level));\r
2310                                 //printk("RSSI:%d, RSSI_LEVEL:%d\n", pstat->rssi_stat.UndecoratedSmoothedPWDB, pstat->rssi_level);\r
2311                                 rtw_hal_update_ra_mask(pEntry, pEntry->rssi_level);\r
2312                         } else if (pDM_Odm->bChangeState) {\r
2313                                 ODM_RT_TRACE(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_LOUD, ("Change Power Training State, bDisablePowerTraining = %d\n", pDM_Odm->bDisablePowerTraining));\r
2314                                 rtw_hal_update_ra_mask(pEntry, pEntry->rssi_level);\r
2315                         }\r
2316                 #endif\r
2317 \r
2318                 }\r
2319         }\r
2320 \r
2321 #endif\r
2322 }\r
2323 \r
2324 VOID\r
2325 odm_RefreshRateAdaptiveMaskAPADSL(\r
2326         IN      PVOID   pDM_VOID\r
2327 )\r
2328 {\r
2329 #if (DM_ODM_SUPPORT_TYPE & ODM_AP)\r
2330         PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
2331         struct rtl8192cd_priv *priv = pDM_Odm->priv;\r
2332         struct aid_obj *aidarray;\r
2333         u4Byte          i;\r
2334         PSTA_INFO_T pEntry;\r
2335         u1Byte          Ratr_State_new;\r
2336         \r
2337         if (priv->up_time % 2)\r
2338                 return;\r
2339 \r
2340         for (i = 0; i < ODM_ASSOCIATE_ENTRY_NUM; i++) {\r
2341                 pEntry = pDM_Odm->pODM_StaInfo[i];\r
2342 \r
2343                 if (IS_STA_VALID(pEntry)) {\r
2344                         \r
2345                         #if defined(UNIVERSAL_REPEATER) || defined(MBSSID)\r
2346                         aidarray = container_of(pEntry, struct aid_obj, station);\r
2347                         priv = aidarray->priv;\r
2348                         #endif\r
2349 \r
2350                         if (!priv->pmib->dot11StationConfigEntry.autoRate)\r
2351                                 continue;\r
2352 \r
2353 #if RA_MASK_PHYDMLIZE_AP\r
2354                         Ratr_State_new = phydm_RA_level_decision(pDM_Odm, (u4Byte)pEntry->rssi, pEntry->rssi_level);\r
2355 \r
2356                         if (pEntry->rssi_level != Ratr_State_new) {\r
2357                                 \r
2358                                 ODM_PRINT_ADDR(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_LOUD, ("Target AP addr :"), pEntry->hwaddr);\r
2359                                 ODM_RT_TRACE(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_LOUD, ("Update Tx RA Level: ((%x)) -> ((%x)),  RSSI = ((%d))\n", pEntry->rssi_level, Ratr_State_new, pEntry->rssi));\r
2360                                 \r
2361                                 pEntry->rssi_level = Ratr_State_new;\r
2362                                 phydm_gen_ramask_h2c_AP(pDM_Odm, priv, pEntry, pEntry->rssi_level);\r
2363                         } else {\r
2364                                 ODM_RT_TRACE(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_LOUD, ("Stay in RA level  = (( %d ))\n\n", Ratr_State_new));\r
2365                                 /**/\r
2366                         }\r
2367 \r
2368 #else\r
2369                         if (ODM_RAStateCheck(pDM_Odm, (s4Byte)pEntry->rssi, FALSE, &pEntry->rssi_level)) {\r
2370                                 ODM_PRINT_ADDR(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_LOUD, ("Target STA addr : "), pEntry->hwaddr);\r
2371                                 ODM_RT_TRACE(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_LOUD, ("RSSI:%d, RSSI_LEVEL:%d\n", pEntry->rssi, pEntry->rssi_level));\r
2372 \r
2373         #ifdef CONFIG_WLAN_HAL\r
2374                                 if (IS_HAL_CHIP(priv)) {\r
2375         #ifdef WDS\r
2376                         /*if(!(pstat->state & WIFI_WDS))*/      /*if WDS donot setting*/\r
2377         #endif\r
2378                                         GET_HAL_INTERFACE(priv)->UpdateHalRAMaskHandler(priv, pEntry, pEntry->rssi_level);\r
2379                                 } else\r
2380         #endif\r
2381 \r
2382         #ifdef CONFIG_RTL_8812_SUPPORT\r
2383                                         if (GET_CHIP_VER(priv) == VERSION_8812E)\r
2384                                                 UpdateHalRAMask8812(priv, pEntry, 3);\r
2385                                         else\r
2386         #endif\r
2387                                         {\r
2388         #ifdef CONFIG_RTL_88E_SUPPORT\r
2389                                                 if (GET_CHIP_VER(priv) == VERSION_8188E) {\r
2390         #ifdef TXREPORT\r
2391                                                         add_RATid(priv, pEntry);\r
2392         #endif\r
2393                                                 }\r
2394         #endif\r
2395 \r
2396 \r
2397                                         }\r
2398                                 }\r
2399 #endif /*#ifdef RA_MASK_PHYDMLIZE*/\r
2400                         \r
2401                 }\r
2402         }\r
2403 #endif /*#if (DM_ODM_SUPPORT_TYPE & ODM_AP)*/\r
2404 }\r
2405 \r
2406 VOID\r
2407 odm_RefreshBasicRateMask(\r
2408         IN      PVOID   pDM_VOID\r
2409 )\r
2410 {\r
2411 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\r
2412         PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
2413         PADAPTER                Adapter  =  pDM_Odm->Adapter;\r
2414         static u1Byte           Stage = 0;\r
2415         u1Byte                  CurStage = 0;\r
2416         OCTET_STRING    osRateSet;\r
2417         PMGNT_INFO              pMgntInfo = GetDefaultMgntInfo(Adapter);\r
2418         u1Byte                  RateSet[5] = {MGN_1M, MGN_2M, MGN_5_5M, MGN_11M, MGN_6M};\r
2419 \r
2420         if (pDM_Odm->SupportICType != ODM_RTL8812 && pDM_Odm->SupportICType != ODM_RTL8821)\r
2421                 return;\r
2422 \r
2423         if (pDM_Odm->bLinked == FALSE)  // unlink Default port information\r
2424                 CurStage = 0;\r
2425         else if (pDM_Odm->RSSI_Min < 40)        // link RSSI  < 40%\r
2426                 CurStage = 1;\r
2427         else if (pDM_Odm->RSSI_Min > 45)        // link RSSI > 45%\r
2428                 CurStage = 3;\r
2429         else\r
2430                 CurStage = 2;                                   // link  25% <= RSSI <= 30%\r
2431 \r
2432         if (CurStage != Stage) {\r
2433                 if (CurStage == 1) {\r
2434                         FillOctetString(osRateSet, RateSet, 5);\r
2435                         FilterSupportRate(pMgntInfo->mBrates, &osRateSet, FALSE);\r
2436                         Adapter->HalFunc.SetHwRegHandler(Adapter, HW_VAR_BASIC_RATE, (pu1Byte)&osRateSet);\r
2437                 } else if (CurStage == 3 && (Stage == 1 || Stage == 2))\r
2438                         Adapter->HalFunc.SetHwRegHandler(Adapter, HW_VAR_BASIC_RATE, (pu1Byte)(&pMgntInfo->mBrates));\r
2439         }\r
2440 \r
2441         Stage = CurStage;\r
2442 #endif\r
2443 }\r
2444 \r
2445 u1Byte\r
2446 phydm_rate_order_compute(\r
2447         IN      PVOID   pDM_VOID,\r
2448         IN      u1Byte  rate_idx\r
2449         )\r
2450 {\r
2451         PDM_ODM_T       pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
2452         u1Byte          rate_order = 0;\r
2453 \r
2454         if (rate_idx >= ODM_RATEVHTSS4MCS0) {\r
2455                 \r
2456                 rate_idx -= ODM_RATEVHTSS4MCS0;\r
2457                 /**/\r
2458         } else if (rate_idx >= ODM_RATEVHTSS3MCS0) {\r
2459         \r
2460                 rate_idx -= ODM_RATEVHTSS3MCS0;\r
2461                 /**/    \r
2462         } else if (rate_idx >= ODM_RATEVHTSS2MCS0) {\r
2463         \r
2464                 rate_idx -= ODM_RATEVHTSS2MCS0;\r
2465                 /**/    \r
2466         } else if (rate_idx >= ODM_RATEVHTSS1MCS0) {\r
2467         \r
2468                 rate_idx -= ODM_RATEVHTSS1MCS0;\r
2469                 /**/\r
2470         } else if (rate_idx >= ODM_RATEMCS24) {\r
2471         \r
2472                 rate_idx -= ODM_RATEMCS24;\r
2473                 /**/\r
2474         } else if (rate_idx >= ODM_RATEMCS16) {\r
2475         \r
2476                 rate_idx -= ODM_RATEMCS16;\r
2477                 /**/\r
2478         } else if (rate_idx >= ODM_RATEMCS8) {\r
2479         \r
2480                 rate_idx -= ODM_RATEMCS8;       \r
2481                 /**/\r
2482         }\r
2483         rate_order = rate_idx;\r
2484 \r
2485         return rate_order;\r
2486 \r
2487 }\r
2488 \r
2489 VOID\r
2490 phydm_ra_common_info_update(\r
2491         IN      PVOID   pDM_VOID\r
2492         )\r
2493 {\r
2494         PDM_ODM_T       pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
2495         pRA_T           pRA_Table = &pDM_Odm->DM_RA_Table;\r
2496         u2Byte          macid;\r
2497         u1Byte          rate_order_tmp;\r
2498         u1Byte          cnt = 0;\r
2499 \r
2500         pRA_Table->highest_client_tx_order = 0;\r
2501         pRA_Table->power_tracking_flag = 1;\r
2502 \r
2503         if (pDM_Odm->number_linked_client != 0) {\r
2504                 for (macid = 0; macid < ODM_ASSOCIATE_ENTRY_NUM; macid++) {\r
2505                         \r
2506                         rate_order_tmp = phydm_rate_order_compute(pDM_Odm, ((pRA_Table->link_tx_rate[macid]) & 0x7f));\r
2507 \r
2508                         if (rate_order_tmp >= (pRA_Table->highest_client_tx_order)) {\r
2509                                 pRA_Table->highest_client_tx_order = rate_order_tmp;\r
2510                                 pRA_Table->highest_client_tx_rate_order = macid;\r
2511                         }\r
2512                         \r
2513                         cnt++;\r
2514                 \r
2515                         if (cnt == pDM_Odm->number_linked_client)\r
2516                                 break;\r
2517                 }\r
2518                 ODM_RT_TRACE(pDM_Odm, ODM_COMP_RATE_ADAPTIVE, ODM_DBG_LOUD, ("MACID[%d], Highest Tx order Update for power traking: %d\n", (pRA_Table->highest_client_tx_rate_order), (pRA_Table->highest_client_tx_order)));\r
2519         }\r
2520 }\r
2521 \r
2522 VOID\r
2523 phydm_ra_info_watchdog(\r
2524         IN      PVOID   pDM_VOID\r
2525         )\r
2526 {\r
2527         PDM_ODM_T       pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
2528 \r
2529         phydm_ra_common_info_update(pDM_Odm);\r
2530         phydm_ra_dynamic_retry_limit(pDM_Odm);\r
2531         phydm_ra_dynamic_retry_count(pDM_Odm);\r
2532         odm_RefreshRateAdaptiveMask(pDM_Odm);\r
2533         odm_RefreshBasicRateMask(pDM_Odm);\r
2534 }\r
2535 \r
2536 VOID\r
2537 phydm_ra_info_init(\r
2538         IN      PVOID   pDM_VOID\r
2539         )\r
2540 {\r
2541         PDM_ODM_T       pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
2542         pRA_T           pRA_Table = &pDM_Odm->DM_RA_Table;\r
2543 \r
2544         pRA_Table->highest_client_tx_rate_order = 0;\r
2545         pRA_Table->highest_client_tx_order = 0;\r
2546         pRA_Table->RA_threshold_offset = 0;\r
2547         pRA_Table->RA_offset_direction = 0;\r
2548 \r
2549         #if (defined(CONFIG_RA_DYNAMIC_RTY_LIMIT))\r
2550         phydm_ra_dynamic_retry_limit_init(pDM_Odm);\r
2551         #endif\r
2552         \r
2553         #if (defined(CONFIG_RA_DYNAMIC_RATE_ID))\r
2554         phydm_ra_dynamic_rate_id_init(pDM_Odm);\r
2555         #endif\r
2556         #if (defined(CONFIG_RA_DBG_CMD))\r
2557         odm_RA_ParaAdjust_init(pDM_Odm);\r
2558         #endif\r
2559 \r
2560 }\r
2561 \r
2562 \r
2563 #if (DM_ODM_SUPPORT_TYPE & (ODM_WIN | ODM_CE))\r
2564 u1Byte\r
2565 odm_Find_RTS_Rate(\r
2566         IN              PVOID                   pDM_VOID,\r
2567         IN              u1Byte                  Tx_Rate,\r
2568         IN              BOOLEAN                 bErpProtect\r
2569 )\r
2570 {\r
2571         PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
2572         u1Byte  RTS_Ini_Rate = ODM_RATE6M;\r
2573         \r
2574         if (bErpProtect) /* use CCK rate as RTS*/\r
2575                 RTS_Ini_Rate = ODM_RATE1M;\r
2576         else {\r
2577                 switch (Tx_Rate) {\r
2578                 case ODM_RATEVHTSS3MCS9:\r
2579                 case ODM_RATEVHTSS3MCS8:\r
2580                 case ODM_RATEVHTSS3MCS7:\r
2581                 case ODM_RATEVHTSS3MCS6:\r
2582                 case ODM_RATEVHTSS3MCS5:\r
2583                 case ODM_RATEVHTSS3MCS4:\r
2584                 case ODM_RATEVHTSS3MCS3:\r
2585                 case ODM_RATEVHTSS2MCS9:\r
2586                 case ODM_RATEVHTSS2MCS8:\r
2587                 case ODM_RATEVHTSS2MCS7:\r
2588                 case ODM_RATEVHTSS2MCS6:\r
2589                 case ODM_RATEVHTSS2MCS5:\r
2590                 case ODM_RATEVHTSS2MCS4:\r
2591                 case ODM_RATEVHTSS2MCS3:\r
2592                 case ODM_RATEVHTSS1MCS9:\r
2593                 case ODM_RATEVHTSS1MCS8:\r
2594                 case ODM_RATEVHTSS1MCS7:\r
2595                 case ODM_RATEVHTSS1MCS6:\r
2596                 case ODM_RATEVHTSS1MCS5:\r
2597                 case ODM_RATEVHTSS1MCS4:\r
2598                 case ODM_RATEVHTSS1MCS3:\r
2599                 case ODM_RATEMCS15:\r
2600                 case ODM_RATEMCS14:\r
2601                 case ODM_RATEMCS13:\r
2602                 case ODM_RATEMCS12:\r
2603                 case ODM_RATEMCS11:\r
2604                 case ODM_RATEMCS7:\r
2605                 case ODM_RATEMCS6:\r
2606                 case ODM_RATEMCS5:\r
2607                 case ODM_RATEMCS4:\r
2608                 case ODM_RATEMCS3:\r
2609                 case ODM_RATE54M:\r
2610                 case ODM_RATE48M:\r
2611                 case ODM_RATE36M:\r
2612                 case ODM_RATE24M:               \r
2613                         RTS_Ini_Rate = ODM_RATE24M;\r
2614                         break;\r
2615                 case ODM_RATEVHTSS3MCS2:\r
2616                 case ODM_RATEVHTSS3MCS1:\r
2617                 case ODM_RATEVHTSS2MCS2:\r
2618                 case ODM_RATEVHTSS2MCS1:\r
2619                 case ODM_RATEVHTSS1MCS2:\r
2620                 case ODM_RATEVHTSS1MCS1:\r
2621                 case ODM_RATEMCS10:\r
2622                 case ODM_RATEMCS9:\r
2623                 case ODM_RATEMCS2:\r
2624                 case ODM_RATEMCS1:\r
2625                 case ODM_RATE18M:\r
2626                 case ODM_RATE12M:\r
2627                         RTS_Ini_Rate = ODM_RATE12M;\r
2628                         break;\r
2629                 case ODM_RATEVHTSS3MCS0:\r
2630                 case ODM_RATEVHTSS2MCS0:\r
2631                 case ODM_RATEVHTSS1MCS0:\r
2632                 case ODM_RATEMCS8:\r
2633                 case ODM_RATEMCS0:\r
2634                 case ODM_RATE9M:\r
2635                 case ODM_RATE6M:\r
2636                         RTS_Ini_Rate = ODM_RATE6M;\r
2637                         break;\r
2638                 case ODM_RATE11M:\r
2639                 case ODM_RATE5_5M:\r
2640                 case ODM_RATE2M:\r
2641                 case ODM_RATE1M:\r
2642                         RTS_Ini_Rate = ODM_RATE1M;\r
2643                         break;\r
2644                 default:\r
2645                         RTS_Ini_Rate = ODM_RATE6M;\r
2646                         break;\r
2647                 }\r
2648         }\r
2649 \r
2650         if (*pDM_Odm->pBandType == 1) {\r
2651                 if (RTS_Ini_Rate < ODM_RATE6M)\r
2652                         RTS_Ini_Rate = ODM_RATE6M;\r
2653         }\r
2654         return RTS_Ini_Rate;\r
2655 \r
2656 }\r
2657 \r
2658 VOID\r
2659 odm_Set_RA_DM_ARFB_by_Noisy(\r
2660         IN      PDM_ODM_T       pDM_Odm\r
2661 )\r
2662 {\r
2663 #if 0\r
2664 \r
2665         /*DbgPrint("DM_ARFB ====>\n");*/\r
2666         if (pDM_Odm->bNoisyState) {\r
2667                 ODM_Write4Byte(pDM_Odm, 0x430, 0x00000000);\r
2668                 ODM_Write4Byte(pDM_Odm, 0x434, 0x05040200);\r
2669                 /*DbgPrint("DM_ARFB ====> Noisy State\n");*/\r
2670         } else {\r
2671                 ODM_Write4Byte(pDM_Odm, 0x430, 0x02010000);\r
2672                 ODM_Write4Byte(pDM_Odm, 0x434, 0x07050403);\r
2673                 /*DbgPrint("DM_ARFB ====> Clean State\n");*/\r
2674         }\r
2675 #endif\r
2676 }\r
2677 \r
2678 VOID\r
2679 ODM_UpdateNoisyState(\r
2680         IN      PVOID           pDM_VOID,\r
2681         IN      BOOLEAN         bNoisyStateFromC2H\r
2682 )\r
2683 {\r
2684         PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
2685 \r
2686         /*DbgPrint("Get C2H Command! NoisyState=0x%x\n ", bNoisyStateFromC2H);*/\r
2687         if (pDM_Odm->SupportICType == ODM_RTL8821  || pDM_Odm->SupportICType == ODM_RTL8812  ||\r
2688                 pDM_Odm->SupportICType == ODM_RTL8723B || pDM_Odm->SupportICType == ODM_RTL8192E || pDM_Odm->SupportICType == ODM_RTL8188E || pDM_Odm->SupportICType == ODM_RTL8723D)\r
2689                 pDM_Odm->bNoisyState = bNoisyStateFromC2H;\r
2690         odm_Set_RA_DM_ARFB_by_Noisy(pDM_Odm);\r
2691 };\r
2692 \r
2693 VOID\r
2694 phydm_update_pwr_track(\r
2695         IN      PVOID           pDM_VOID,\r
2696         IN      u1Byte          Rate\r
2697 )\r
2698 {\r
2699         PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
2700         u1Byte                  pathIdx = 0;\r
2701 \r
2702         ODM_RT_TRACE(pDM_Odm, ODM_COMP_TX_PWR_TRACK, ODM_DBG_LOUD, ("Pwr Track Get Rate=0x%x\n", Rate));\r
2703 \r
2704         pDM_Odm->TxRate = Rate;\r
2705                 \r
2706         #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\r
2707                 #if DEV_BUS_TYPE == RT_PCI_INTERFACE\r
2708                         #if USE_WORKITEM\r
2709                         PlatformScheduleWorkItem(&pDM_Odm->RaRptWorkitem);\r
2710                         #else\r
2711                         if (pDM_Odm->SupportICType == ODM_RTL8821) {\r
2712                                 #if (RTL8821A_SUPPORT == 1)\r
2713                                 ODM_TxPwrTrackSetPwr8821A(pDM_Odm, MIX_MODE, ODM_RF_PATH_A, 0);\r
2714                                 #endif\r
2715                         } else if (pDM_Odm->SupportICType == ODM_RTL8812) {\r
2716                                 for (pathIdx = ODM_RF_PATH_A; pathIdx < MAX_PATH_NUM_8812A; pathIdx++) {\r
2717                                         #if (RTL8812A_SUPPORT == 1)\r
2718                                         ODM_TxPwrTrackSetPwr8812A(pDM_Odm, MIX_MODE, pathIdx, 0);\r
2719                                         #endif\r
2720                                 }\r
2721                         } else if (pDM_Odm->SupportICType == ODM_RTL8723B) {\r
2722                                 #if (RTL8723B_SUPPORT == 1)\r
2723                                 ODM_TxPwrTrackSetPwr_8723B(pDM_Odm, MIX_MODE, ODM_RF_PATH_A, 0);\r
2724                                 #endif\r
2725                         } else if (pDM_Odm->SupportICType == ODM_RTL8192E) {\r
2726                                 for (pathIdx = ODM_RF_PATH_A; pathIdx < MAX_PATH_NUM_8192E; pathIdx++) {\r
2727                                         #if (RTL8192E_SUPPORT == 1)\r
2728                                         ODM_TxPwrTrackSetPwr92E(pDM_Odm, MIX_MODE, pathIdx, 0);\r
2729                                         #endif\r
2730                                 }\r
2731                         } else if (pDM_Odm->SupportICType == ODM_RTL8188E) {\r
2732                                 #if (RTL8188E_SUPPORT == 1)\r
2733                                 ODM_TxPwrTrackSetPwr88E(pDM_Odm, MIX_MODE, ODM_RF_PATH_A, 0);\r
2734                                 #endif\r
2735                         }\r
2736                         #endif\r
2737                 #else\r
2738                         PlatformScheduleWorkItem(&pDM_Odm->RaRptWorkitem);\r
2739                 #endif\r
2740         #endif\r
2741 \r
2742 }\r
2743 \r
2744 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\r
2745 \r
2746 s4Byte\r
2747 phydm_FindMinimumRSSI(\r
2748 IN              PDM_ODM_T               pDM_Odm,\r
2749 IN              PADAPTER                pAdapter,\r
2750 IN      OUT     BOOLEAN                 *pbLink_temp\r
2751 \r
2752         )\r
2753 {       \r
2754         HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(pAdapter);\r
2755         PMGNT_INFO              pMgntInfo = &(pAdapter->MgntInfo);\r
2756         BOOLEAN                 act_as_ap = ACTING_AS_AP(pAdapter);\r
2757         \r
2758         /* 1.Determine the minimum RSSI */\r
2759         if ((!pMgntInfo->bMediaConnect) ||      \r
2760                 (act_as_ap && (pHalData->EntryMinUndecoratedSmoothedPWDB == 0))) {/* We should check AP mode and Entry info.into consideration, revised by Roger, 2013.10.18*/\r
2761         \r
2762                 pHalData->MinUndecoratedPWDBForDM = 0;\r
2763                 *pbLink_temp = FALSE;\r
2764 \r
2765         } else\r
2766                 *pbLink_temp = TRUE; \r
2767         \r
2768 \r
2769         if (pMgntInfo->bMediaConnect) { /* Default port*/\r
2770         \r
2771                 if (act_as_ap || pMgntInfo->mIbss) {\r
2772                         pHalData->MinUndecoratedPWDBForDM = pHalData->EntryMinUndecoratedSmoothedPWDB;\r
2773                         /**/\r
2774                 } else {\r
2775                         pHalData->MinUndecoratedPWDBForDM = pHalData->UndecoratedSmoothedPWDB;\r
2776                         /**/\r
2777                 }\r
2778         } else { /* associated entry pwdb*/\r
2779                 pHalData->MinUndecoratedPWDBForDM = pHalData->EntryMinUndecoratedSmoothedPWDB;\r
2780                 /**/\r
2781         }\r
2782 \r
2783         return pHalData->MinUndecoratedPWDBForDM;\r
2784 }\r
2785 \r
2786 VOID\r
2787 ODM_UpdateInitRateWorkItemCallback(\r
2788         IN      PVOID   pContext\r
2789 )\r
2790 {\r
2791         PADAPTER        Adapter = (PADAPTER)pContext;\r
2792         HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(Adapter);\r
2793         PDM_ODM_T               pDM_Odm = &pHalData->DM_OutSrc;\r
2794         u1Byte          p = 0;  \r
2795 \r
2796         if (pDM_Odm->SupportICType == ODM_RTL8821) {\r
2797                 ODM_TxPwrTrackSetPwr8821A(pDM_Odm, MIX_MODE, ODM_RF_PATH_A, 0);\r
2798                 /**/\r
2799         } else if (pDM_Odm->SupportICType == ODM_RTL8812) {\r
2800                 for (p = ODM_RF_PATH_A; p < MAX_PATH_NUM_8812A; p++) {    /*DOn't know how to include &c*/\r
2801                 \r
2802                         ODM_TxPwrTrackSetPwr8812A(pDM_Odm, MIX_MODE, p, 0);\r
2803                         /**/\r
2804                 }\r
2805         } else if (pDM_Odm->SupportICType == ODM_RTL8723B) {\r
2806                         ODM_TxPwrTrackSetPwr_8723B(pDM_Odm, MIX_MODE, ODM_RF_PATH_A, 0);\r
2807                         /**/\r
2808         } else if (pDM_Odm->SupportICType == ODM_RTL8192E) {\r
2809                 for (p = ODM_RF_PATH_A; p < MAX_PATH_NUM_8192E; p++) {   /*DOn't know how to include &c*/\r
2810                         ODM_TxPwrTrackSetPwr92E(pDM_Odm, MIX_MODE, p, 0);\r
2811                         /**/\r
2812                 }\r
2813         } else if (pDM_Odm->SupportICType == ODM_RTL8188E) {\r
2814                 ODM_TxPwrTrackSetPwr88E(pDM_Odm, MIX_MODE, ODM_RF_PATH_A, 0);\r
2815                 /**/\r
2816         }\r
2817 }\r
2818 \r
2819 VOID\r
2820 odm_RSSIDumpToRegister(\r
2821         IN      PVOID   pDM_VOID\r
2822 )\r
2823 {\r
2824         PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
2825         PADAPTER                Adapter = pDM_Odm->Adapter;\r
2826 \r
2827         if (pDM_Odm->SupportICType == ODM_RTL8812) {\r
2828                 PlatformEFIOWrite1Byte(Adapter, rA_RSSIDump_Jaguar, Adapter->RxStats.RxRSSIPercentage[0]);\r
2829                 PlatformEFIOWrite1Byte(Adapter, rB_RSSIDump_Jaguar, Adapter->RxStats.RxRSSIPercentage[1]);\r
2830 \r
2831                 /* Rx EVM*/\r
2832                 PlatformEFIOWrite1Byte(Adapter, rS1_RXevmDump_Jaguar, Adapter->RxStats.RxEVMdbm[0]);\r
2833                 PlatformEFIOWrite1Byte(Adapter, rS2_RXevmDump_Jaguar, Adapter->RxStats.RxEVMdbm[1]);\r
2834 \r
2835                 /* Rx SNR*/\r
2836                 PlatformEFIOWrite1Byte(Adapter, rA_RXsnrDump_Jaguar, (u1Byte)(Adapter->RxStats.RxSNRdB[0]));\r
2837                 PlatformEFIOWrite1Byte(Adapter, rB_RXsnrDump_Jaguar, (u1Byte)(Adapter->RxStats.RxSNRdB[1]));\r
2838 \r
2839                 /* Rx Cfo_Short*/\r
2840                 PlatformEFIOWrite2Byte(Adapter, rA_CfoShortDump_Jaguar, Adapter->RxStats.RxCfoShort[0]);\r
2841                 PlatformEFIOWrite2Byte(Adapter, rB_CfoShortDump_Jaguar, Adapter->RxStats.RxCfoShort[1]);\r
2842 \r
2843                 /* Rx Cfo_Tail*/\r
2844                 PlatformEFIOWrite2Byte(Adapter, rA_CfoLongDump_Jaguar, Adapter->RxStats.RxCfoTail[0]);\r
2845                 PlatformEFIOWrite2Byte(Adapter, rB_CfoLongDump_Jaguar, Adapter->RxStats.RxCfoTail[1]);\r
2846         } else if (pDM_Odm->SupportICType == ODM_RTL8192E) {\r
2847                 PlatformEFIOWrite1Byte(Adapter, rA_RSSIDump_92E, Adapter->RxStats.RxRSSIPercentage[0]);\r
2848                 PlatformEFIOWrite1Byte(Adapter, rB_RSSIDump_92E, Adapter->RxStats.RxRSSIPercentage[1]);\r
2849                 /* Rx EVM*/\r
2850                 PlatformEFIOWrite1Byte(Adapter, rS1_RXevmDump_92E, Adapter->RxStats.RxEVMdbm[0]);\r
2851                 PlatformEFIOWrite1Byte(Adapter, rS2_RXevmDump_92E, Adapter->RxStats.RxEVMdbm[1]);\r
2852                 /* Rx SNR*/\r
2853                 PlatformEFIOWrite1Byte(Adapter, rA_RXsnrDump_92E, (u1Byte)(Adapter->RxStats.RxSNRdB[0]));\r
2854                 PlatformEFIOWrite1Byte(Adapter, rB_RXsnrDump_92E, (u1Byte)(Adapter->RxStats.RxSNRdB[1]));\r
2855                 /* Rx Cfo_Short*/\r
2856                 PlatformEFIOWrite2Byte(Adapter, rA_CfoShortDump_92E, Adapter->RxStats.RxCfoShort[0]);\r
2857                 PlatformEFIOWrite2Byte(Adapter, rB_CfoShortDump_92E, Adapter->RxStats.RxCfoShort[1]);\r
2858                 /* Rx Cfo_Tail*/\r
2859                 PlatformEFIOWrite2Byte(Adapter, rA_CfoLongDump_92E, Adapter->RxStats.RxCfoTail[0]);\r
2860                 PlatformEFIOWrite2Byte(Adapter, rB_CfoLongDump_92E, Adapter->RxStats.RxCfoTail[1]);\r
2861         }\r
2862 }\r
2863 \r
2864 VOID\r
2865 odm_RefreshLdpcRtsMP(\r
2866         IN      PADAPTER                        pAdapter,\r
2867         IN      PDM_ODM_T                       pDM_Odm,\r
2868         IN      u1Byte                          mMacId,\r
2869         IN      u1Byte                          IOTPeer,\r
2870         IN      s4Byte                          UndecoratedSmoothedPWDB\r
2871 )\r
2872 {\r
2873         BOOLEAN                                 bCtlLdpc = FALSE;\r
2874         PODM_RATE_ADAPTIVE              pRA = &pDM_Odm->RateAdaptive;\r
2875 \r
2876         if (pDM_Odm->SupportICType != ODM_RTL8821 && pDM_Odm->SupportICType != ODM_RTL8812)\r
2877                 return;\r
2878 \r
2879         if ((pDM_Odm->SupportICType == ODM_RTL8821) && (pDM_Odm->CutVersion == ODM_CUT_A))\r
2880                 bCtlLdpc = TRUE;\r
2881         else if (pDM_Odm->SupportICType == ODM_RTL8812 &&\r
2882                          IOTPeer == HT_IOT_PEER_REALTEK_JAGUAR_CCUTAP)\r
2883                 bCtlLdpc = TRUE;\r
2884 \r
2885         if (bCtlLdpc) {\r
2886                 if (UndecoratedSmoothedPWDB < (pRA->LdpcThres - 5))\r
2887                         MgntSet_TX_LDPC(pAdapter, mMacId, TRUE);\r
2888                 else if (UndecoratedSmoothedPWDB > pRA->LdpcThres)\r
2889                         MgntSet_TX_LDPC(pAdapter, mMacId, FALSE);\r
2890         }\r
2891 \r
2892         if (UndecoratedSmoothedPWDB < (pRA->RtsThres - 5))\r
2893                 pRA->bLowerRtsRate = TRUE;\r
2894         else if (UndecoratedSmoothedPWDB > pRA->RtsThres)\r
2895                 pRA->bLowerRtsRate = FALSE;\r
2896 }\r
2897 \r
2898 #if 0\r
2899 VOID\r
2900 ODM_DynamicARFBSelect(\r
2901         IN              PVOID           pDM_VOID,\r
2902         IN              u1Byte                  rate,\r
2903         IN              BOOLEAN                 Collision_State\r
2904 )\r
2905 {\r
2906         PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
2907         pRA_T                   pRA_Table = &pDM_Odm->DM_RA_Table;\r
2908 \r
2909         if (pDM_Odm->SupportICType != ODM_RTL8192E)\r
2910                 return;\r
2911 \r
2912         if (Collision_State == pRA_Table->PT_collision_pre)\r
2913                 return;\r
2914 \r
2915         if (rate >= DESC_RATEMCS8  && rate <= DESC_RATEMCS12) {\r
2916                 if (Collision_State == 1) {\r
2917                         if (rate == DESC_RATEMCS12) {\r
2918 \r
2919                                 ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E, 0x0);\r
2920                                 ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E+4, 0x07060501);\r
2921                         } else if (rate == DESC_RATEMCS11) {\r
2922 \r
2923                                 ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E, 0x0);\r
2924                                 ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E+4, 0x07070605);\r
2925                         } else if (rate == DESC_RATEMCS10) {\r
2926 \r
2927                                 ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E, 0x0);\r
2928                                 ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E+4, 0x08080706);\r
2929                         } else if (rate == DESC_RATEMCS9) {\r
2930 \r
2931                                 ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E, 0x0);\r
2932                                 ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E+4, 0x08080707);\r
2933                         } else {\r
2934 \r
2935                                 ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E, 0x0);\r
2936                                 ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E+4, 0x09090808);\r
2937                         }\r
2938                 } else { /* Collision_State == 0*/\r
2939                         if (rate == DESC_RATEMCS12) {\r
2940 \r
2941                                 ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E, 0x05010000);\r
2942                                 ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E+4, 0x09080706);\r
2943                         } else if (rate == DESC_RATEMCS11) {\r
2944 \r
2945                                 ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E, 0x06050000);\r
2946                                 ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E+4, 0x09080807);\r
2947                         } else if (rate == DESC_RATEMCS10) {\r
2948 \r
2949                                 ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E, 0x07060000);\r
2950                                 ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E+4, 0x0a090908);\r
2951                         } else if (rate == DESC_RATEMCS9) {\r
2952 \r
2953                                 ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E, 0x07070000);\r
2954                                 ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E+4, 0x0a090808);\r
2955                         } else {\r
2956 \r
2957                                 ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E, 0x08080000);\r
2958                                 ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E+4, 0x0b0a0909);\r
2959                         }\r
2960                 }\r
2961         } else { /* MCS13~MCS15,  1SS, G-mode*/\r
2962                 if (Collision_State == 1) {\r
2963                         if (rate == DESC_RATEMCS15) {\r
2964 \r
2965                                 ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E, 0x00000000);\r
2966                                 ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E+4, 0x05040302);\r
2967                         } else if (rate == DESC_RATEMCS14) {\r
2968 \r
2969                                 ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E, 0x00000000);\r
2970                                 ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E+4, 0x06050302);\r
2971                         } else if (rate == DESC_RATEMCS13) {\r
2972 \r
2973                                 ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E, 0x00000000);\r
2974                                 ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E+4, 0x07060502);\r
2975                         } else {\r
2976 \r
2977                                 ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E, 0x00000000);\r
2978                                 ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E+4, 0x06050402);\r
2979                         }\r
2980                 } else { // Collision_State == 0\r
2981                         if (rate == DESC_RATEMCS15) {\r
2982 \r
2983                                 ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E, 0x03020000);\r
2984                                 ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E+4, 0x07060504);\r
2985                         } else if (rate == DESC_RATEMCS14) {\r
2986 \r
2987                                 ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E, 0x03020000);\r
2988                                 ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E+4, 0x08070605);\r
2989                         } else if (rate == DESC_RATEMCS13) {\r
2990 \r
2991                                 ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E, 0x05020000);\r
2992                                 ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E+4, 0x09080706);\r
2993                         } else {\r
2994 \r
2995                                 ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E, 0x04020000);\r
2996                                 ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E+4, 0x08070605);\r
2997                         }\r
2998                 }\r
2999         }\r
3000         pRA_Table->PT_collision_pre = Collision_State;\r
3001 }\r
3002 #endif\r
3003 \r
3004 VOID\r
3005 ODM_RateAdaptiveStateApInit(\r
3006         IN      PVOID           PADAPTER_VOID,\r
3007         IN      PRT_WLAN_STA    pEntry\r
3008 )\r
3009 {\r
3010         PADAPTER                Adapter = (PADAPTER)PADAPTER_VOID;\r
3011         pEntry->Ratr_State = DM_RATR_STA_INIT;\r
3012 }\r
3013 #elif (DM_ODM_SUPPORT_TYPE == ODM_CE) /*#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)*/\r
3014 \r
3015 static void\r
3016 FindMinimumRSSI(\r
3017         IN      PADAPTER        pAdapter\r
3018 )\r
3019 {\r
3020         HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(pAdapter);\r
3021         PDM_ODM_T               pDM_Odm = &(pHalData->odmpriv);\r
3022 \r
3023         /*Determine the minimum RSSI*/\r
3024 \r
3025         if ((pDM_Odm->bLinked != _TRUE) &&\r
3026                 (pHalData->EntryMinUndecoratedSmoothedPWDB == 0)) {\r
3027                 pHalData->MinUndecoratedPWDBForDM = 0;\r
3028                 /*ODM_RT_TRACE(pDM_Odm,COMP_BB_POWERSAVING, DBG_LOUD, ("Not connected to any\n"));*/\r
3029         } else\r
3030                 pHalData->MinUndecoratedPWDBForDM = pHalData->EntryMinUndecoratedSmoothedPWDB;\r
3031 \r
3032         /*DBG_8192C("%s=>MinUndecoratedPWDBForDM(%d)\n",__FUNCTION__,pdmpriv->MinUndecoratedPWDBForDM);*/\r
3033         /*ODM_RT_TRACE(pDM_Odm,COMP_DIG, DBG_LOUD, ("MinUndecoratedPWDBForDM =%d\n",pHalData->MinUndecoratedPWDBForDM));*/\r
3034 }\r
3035 \r
3036 u8Byte\r
3037 PhyDM_Get_Rate_Bitmap_Ex(\r
3038         IN      PVOID           pDM_VOID,\r
3039         IN      u4Byte          macid,\r
3040         IN      u8Byte          ra_mask,\r
3041         IN      u1Byte          rssi_level,\r
3042         OUT             u8Byte  *dm_RA_Mask,\r
3043         OUT             u1Byte  *dm_RteID\r
3044 )\r
3045 {\r
3046         PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
3047         PSTA_INFO_T     pEntry;\r
3048         u8Byte  rate_bitmap = 0;\r
3049         u1Byte  WirelessMode;\r
3050 \r
3051         pEntry = pDM_Odm->pODM_StaInfo[macid];\r
3052         if (!IS_STA_VALID(pEntry))\r
3053                 return ra_mask;\r
3054         WirelessMode = pEntry->wireless_mode;\r
3055         switch (WirelessMode) {\r
3056         case ODM_WM_B:\r
3057                 if (ra_mask & 0x000000000000000c) /* 11M or 5.5M enable */\r
3058                         rate_bitmap = 0x000000000000000d;\r
3059                 else\r
3060                         rate_bitmap = 0x000000000000000f;\r
3061                 break;\r
3062 \r
3063         case (ODM_WM_G):\r
3064         case (ODM_WM_A):\r
3065                 if (rssi_level == DM_RATR_STA_HIGH)\r
3066                         rate_bitmap = 0x0000000000000f00;\r
3067                 else\r
3068                         rate_bitmap = 0x0000000000000ff0;\r
3069                 break;\r
3070 \r
3071         case (ODM_WM_B|ODM_WM_G):\r
3072                 if (rssi_level == DM_RATR_STA_HIGH)\r
3073                         rate_bitmap = 0x0000000000000f00;\r
3074                 else if (rssi_level == DM_RATR_STA_MIDDLE)\r
3075                         rate_bitmap = 0x0000000000000ff0;\r
3076                 else\r
3077                         rate_bitmap = 0x0000000000000ff5;\r
3078                 break;\r
3079 \r
3080         case (ODM_WM_B|ODM_WM_G|ODM_WM_N24G):\r
3081         case (ODM_WM_B|ODM_WM_N24G):\r
3082         case (ODM_WM_G|ODM_WM_N24G):\r
3083         case (ODM_WM_A|ODM_WM_N5G): {\r
3084                 if (pDM_Odm->RFType == ODM_1T2R || pDM_Odm->RFType == ODM_1T1R) {\r
3085                         if (rssi_level == DM_RATR_STA_HIGH)\r
3086                                 rate_bitmap = 0x00000000000f0000;\r
3087                         else if (rssi_level == DM_RATR_STA_MIDDLE)\r
3088                                 rate_bitmap = 0x00000000000ff000;\r
3089                         else {\r
3090                                 if (*(pDM_Odm->pBandWidth) == ODM_BW40M)\r
3091                                         rate_bitmap = 0x00000000000ff015;\r
3092                                 else\r
3093                                         rate_bitmap = 0x00000000000ff005;\r
3094                         }\r
3095                 } else if (pDM_Odm->RFType == ODM_2T2R  || pDM_Odm->RFType == ODM_2T3R  || pDM_Odm->RFType == ODM_2T4R) {\r
3096                         if (rssi_level == DM_RATR_STA_HIGH)\r
3097                                 rate_bitmap = 0x000000000f8f0000;\r
3098                         else if (rssi_level == DM_RATR_STA_MIDDLE)\r
3099                                 rate_bitmap = 0x000000000f8ff000;\r
3100                         else {\r
3101                                 if (*(pDM_Odm->pBandWidth) == ODM_BW40M)\r
3102                                         rate_bitmap = 0x000000000f8ff015;\r
3103                                 else\r
3104                                         rate_bitmap = 0x000000000f8ff005;\r
3105                         }\r
3106                 } else {\r
3107                         if (rssi_level == DM_RATR_STA_HIGH)\r
3108                                 rate_bitmap = 0x0000000f0f0f0000;\r
3109                         else if (rssi_level == DM_RATR_STA_MIDDLE)\r
3110                                 rate_bitmap = 0x0000000fcfcfe000;\r
3111                         else {\r
3112                                 if (*(pDM_Odm->pBandWidth) == ODM_BW40M)\r
3113                                         rate_bitmap = 0x0000000ffffff015;\r
3114                                 else\r
3115                                         rate_bitmap = 0x0000000ffffff005;\r
3116                         }\r
3117                 }\r
3118         }\r
3119         break;\r
3120 \r
3121         case (ODM_WM_AC|ODM_WM_G):\r
3122                 if (rssi_level == 1)\r
3123                         rate_bitmap = 0x00000000fc3f0000;\r
3124                 else if (rssi_level == 2)\r
3125                         rate_bitmap = 0x00000000fffff000;\r
3126                 else\r
3127                         rate_bitmap = 0x00000000ffffffff;\r
3128                 break;\r
3129 \r
3130         case (ODM_WM_AC|ODM_WM_A):\r
3131 \r
3132                 if (pDM_Odm->RFType == ODM_1T2R || pDM_Odm->RFType == ODM_1T1R) {\r
3133                         if (rssi_level == 1)                            /* add by Gary for ac-series */\r
3134                                 rate_bitmap = 0x00000000003f8000;\r
3135                         else if (rssi_level == 2)\r
3136                                 rate_bitmap = 0x00000000003fe000;\r
3137                         else\r
3138                                 rate_bitmap = 0x00000000003ff010;\r
3139                 } else if (pDM_Odm->RFType == ODM_2T2R  || pDM_Odm->RFType == ODM_2T3R  || pDM_Odm->RFType == ODM_2T4R) {\r
3140                         if (rssi_level == 1)                            /* add by Gary for ac-series */\r
3141                                 rate_bitmap = 0x00000000fe3f8000;       /* VHT 2SS MCS3~9 */\r
3142                         else if (rssi_level == 2)\r
3143                                 rate_bitmap = 0x00000000fffff000;       /* VHT 2SS MCS0~9 */\r
3144                         else\r
3145                                 rate_bitmap = 0x00000000fffff010;       /* All */\r
3146                 } else {\r
3147                         if (rssi_level == 1)                            /* add by Gary for ac-series */\r
3148                                 rate_bitmap = 0x000003f8fe3f8000ULL;       /* VHT 3SS MCS3~9 */\r
3149                         else if (rssi_level == 2)\r
3150                                 rate_bitmap = 0x000003fffffff000ULL;       /* VHT3SS MCS0~9 */\r
3151                         else\r
3152                                 rate_bitmap = 0x000003fffffff010ULL;       /* All */\r
3153                 }\r
3154                 break;\r
3155 \r
3156         default:\r
3157                 if (pDM_Odm->RFType == ODM_1T2R || pDM_Odm->RFType == ODM_1T1R)\r
3158                         rate_bitmap = 0x00000000000fffff;\r
3159                 else if (pDM_Odm->RFType == ODM_2T2R  || pDM_Odm->RFType == ODM_2T3R  || pDM_Odm->RFType == ODM_2T4R)\r
3160                         rate_bitmap = 0x000000000fffffff;\r
3161                 else\r
3162                         rate_bitmap = 0x0000003fffffffffULL;\r
3163                 break;\r
3164 \r
3165         }\r
3166         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
3167 \r
3168         return (ra_mask & rate_bitmap);\r
3169 }\r
3170 \r
3171 \r
3172 u4Byte\r
3173 ODM_Get_Rate_Bitmap(\r
3174         IN      PVOID           pDM_VOID,\r
3175         IN      u4Byte          macid,\r
3176         IN      u4Byte          ra_mask,\r
3177         IN      u1Byte          rssi_level\r
3178 )\r
3179 {\r
3180         PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
3181         PSTA_INFO_T     pEntry;\r
3182         u4Byte  rate_bitmap = 0;\r
3183         u1Byte  WirelessMode;\r
3184         //u1Byte        WirelessMode =*(pDM_Odm->pWirelessMode);\r
3185 \r
3186 \r
3187         pEntry = pDM_Odm->pODM_StaInfo[macid];\r
3188         if (!IS_STA_VALID(pEntry))\r
3189                 return ra_mask;\r
3190 \r
3191         WirelessMode = pEntry->wireless_mode;\r
3192 \r
3193         switch (WirelessMode) {\r
3194         case ODM_WM_B:\r
3195                 if (ra_mask & 0x0000000c)               //11M or 5.5M enable\r
3196                         rate_bitmap = 0x0000000d;\r
3197                 else\r
3198                         rate_bitmap = 0x0000000f;\r
3199                 break;\r
3200 \r
3201         case (ODM_WM_G):\r
3202         case (ODM_WM_A):\r
3203                 if (rssi_level == DM_RATR_STA_HIGH)\r
3204                         rate_bitmap = 0x00000f00;\r
3205                 else\r
3206                         rate_bitmap = 0x00000ff0;\r
3207                 break;\r
3208 \r
3209         case (ODM_WM_B|ODM_WM_G):\r
3210                 if (rssi_level == DM_RATR_STA_HIGH)\r
3211                         rate_bitmap = 0x00000f00;\r
3212                 else if (rssi_level == DM_RATR_STA_MIDDLE)\r
3213                         rate_bitmap = 0x00000ff0;\r
3214                 else\r
3215                         rate_bitmap = 0x00000ff5;\r
3216                 break;\r
3217 \r
3218         case (ODM_WM_B|ODM_WM_G|ODM_WM_N24G)    :\r
3219         case (ODM_WM_B|ODM_WM_N24G)     :\r
3220         case (ODM_WM_G|ODM_WM_N24G)     :\r
3221         case (ODM_WM_A|ODM_WM_N5G)      : {\r
3222                 if (pDM_Odm->RFType == ODM_1T2R || pDM_Odm->RFType == ODM_1T1R) {\r
3223                         if (rssi_level == DM_RATR_STA_HIGH)\r
3224                                 rate_bitmap = 0x000f0000;\r
3225                         else if (rssi_level == DM_RATR_STA_MIDDLE)\r
3226                                 rate_bitmap = 0x000ff000;\r
3227                         else {\r
3228                                 if (*(pDM_Odm->pBandWidth) == ODM_BW40M)\r
3229                                         rate_bitmap = 0x000ff015;\r
3230                                 else\r
3231                                         rate_bitmap = 0x000ff005;\r
3232                         }\r
3233                 } else {\r
3234                         if (rssi_level == DM_RATR_STA_HIGH)\r
3235                                 rate_bitmap = 0x0f8f0000;\r
3236                         else if (rssi_level == DM_RATR_STA_MIDDLE)\r
3237                                 rate_bitmap = 0x0f8ff000;\r
3238                         else {\r
3239                                 if (*(pDM_Odm->pBandWidth) == ODM_BW40M)\r
3240                                         rate_bitmap = 0x0f8ff015;\r
3241                                 else\r
3242                                         rate_bitmap = 0x0f8ff005;\r
3243                         }\r
3244                 }\r
3245         }\r
3246         break;\r
3247 \r
3248         case (ODM_WM_AC|ODM_WM_G):\r
3249                 if (rssi_level == 1)\r
3250                         rate_bitmap = 0xfc3f0000;\r
3251                 else if (rssi_level == 2)\r
3252                         rate_bitmap = 0xfffff000;\r
3253                 else\r
3254                         rate_bitmap = 0xffffffff;\r
3255                 break;\r
3256 \r
3257         case (ODM_WM_AC|ODM_WM_A):\r
3258 \r
3259                 if (pDM_Odm->RFType == RF_1T1R) {\r
3260                         if (rssi_level == 1)                            // add by Gary for ac-series\r
3261                                 rate_bitmap = 0x003f8000;\r
3262                         else if (rssi_level == 2)\r
3263                                 rate_bitmap = 0x003ff000;\r
3264                         else\r
3265                                 rate_bitmap = 0x003ff010;\r
3266                 } else {\r
3267                         if (rssi_level == 1)                            // add by Gary for ac-series\r
3268                                 rate_bitmap = 0xfe3f8000;       // VHT 2SS MCS3~9\r
3269                         else if (rssi_level == 2)\r
3270                                 rate_bitmap = 0xfffff000;       // VHT 2SS MCS0~9\r
3271                         else\r
3272                                 rate_bitmap = 0xfffff010;       // All\r
3273                 }\r
3274                 break;\r
3275 \r
3276         default:\r
3277                 if (pDM_Odm->RFType == RF_1T2R)\r
3278                         rate_bitmap = 0x000fffff;\r
3279                 else\r
3280                         rate_bitmap = 0x0fffffff;\r
3281                 break;\r
3282 \r
3283         }\r
3284 \r
3285         ODM_RT_TRACE(pDM_Odm, ODM_COMP_RATE_ADAPTIVE, ODM_DBG_LOUD, ("%s ==> rssi_level:0x%02x, WirelessMode:0x%02x, rate_bitmap:0x%08x\n", __func__, rssi_level, WirelessMode, rate_bitmap));\r
3286         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
3287 \r
3288         return (ra_mask & rate_bitmap);\r
3289 \r
3290 }\r
3291 \r
3292 #endif //#if (DM_ODM_SUPPORT_TYPE == ODM_CE)\r
3293 \r
3294 #elif (DM_ODM_SUPPORT_TYPE & (ODM_AP))\r
3295 \r
3296 VOID\r
3297 phydm_gen_ramask_h2c_AP(\r
3298         IN              PVOID                   pDM_VOID,\r
3299         IN              struct rtl8192cd_priv *priv,\r
3300         IN              PSTA_INFO_T             *pEntry,\r
3301         IN              u1Byte                  rssi_level\r
3302 )\r
3303 {\r
3304         PDM_ODM_T       pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
3305 \r
3306         if (pDM_Odm->SupportICType & (ODM_RTL8192E | ODM_RTL8881A)) {\r
3307                 \r
3308                 #ifdef CONFIG_WLAN_HAL\r
3309                 GET_HAL_INTERFACE(priv)->UpdateHalRAMaskHandler(priv, pEntry, rssi_level);\r
3310                 #endif\r
3311                 \r
3312         } else if (pDM_Odm->SupportICType == ODM_RTL8812) {\r
3313         \r
3314                 #if (RTL8812A_SUPPORT == 1)\r
3315                 UpdateHalRAMask8812(priv, pEntry, rssi_level);\r
3316                 /**/\r
3317                 #endif\r
3318         } else if (pDM_Odm->SupportICType == ODM_RTL8188E) {\r
3319         \r
3320                 #if (RTL8188E_SUPPORT == 1)\r
3321                 #ifdef TXREPORT\r
3322                 add_RATid(priv, pEntry);\r
3323                 /**/\r
3324                 #endif\r
3325                 #endif\r
3326         }\r
3327 }\r
3328 \r
3329 \r
3330 #endif /*#if (DM_ODM_SUPPORT_TYPE & (ODM_WIN| ODM_CE))*/\r
3331 \r
3332 \r
3333 /* RA_MASK_PHYDMLIZE, will delete it later*/\r
3334 \r
3335 #if (RA_MASK_PHYDMLIZE_CE || RA_MASK_PHYDMLIZE_AP || RA_MASK_PHYDMLIZE_WIN)\r
3336 \r
3337 BOOLEAN\r
3338 ODM_RAStateCheck(\r
3339         IN              PVOID                   pDM_VOID,\r
3340         IN              s4Byte                  RSSI,\r
3341         IN              BOOLEAN                 bForceUpdate,\r
3342         OUT             pu1Byte                 pRATRState\r
3343 )\r
3344 {\r
3345         PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
3346         PODM_RATE_ADAPTIVE pRA = &pDM_Odm->RateAdaptive;\r
3347         const u1Byte GoUpGap = 5;\r
3348         u1Byte HighRSSIThreshForRA = pRA->HighRSSIThresh;\r
3349         u1Byte LowRSSIThreshForRA = pRA->LowRSSIThresh;\r
3350         u1Byte RATRState;\r
3351         \r
3352         ODM_RT_TRACE(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_LOUD, ("RSSI= (( %d )), Current_RSSI_level = (( %d ))\n", RSSI, *pRATRState));\r
3353         ODM_RT_TRACE(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_LOUD, ("[Ori RA RSSI Thresh]  High= (( %d )), Low = (( %d ))\n", HighRSSIThreshForRA, LowRSSIThreshForRA));\r
3354         /* Threshold Adjustment:*/\r
3355         /* when RSSI state trends to go up one or two levels, make sure RSSI is high enough.*/\r
3356         /* Here GoUpGap is added to solve the boundary's level alternation issue.*/\r
3357 #if (DM_ODM_SUPPORT_TYPE & (ODM_AP))\r
3358         u1Byte UltraLowRSSIThreshForRA = pRA->UltraLowRSSIThresh;\r
3359 \r
3360         if (pDM_Odm->SupportICType == ODM_RTL8881A)\r
3361                 LowRSSIThreshForRA = 30;                /* for LDPC / BCC switch*/\r
3362 #endif\r
3363 \r
3364         switch (*pRATRState) {\r
3365         case DM_RATR_STA_INIT:\r
3366         case DM_RATR_STA_HIGH:\r
3367                 break;\r
3368 \r
3369         case DM_RATR_STA_MIDDLE:\r
3370                 HighRSSIThreshForRA += GoUpGap;\r
3371                 break;\r
3372 \r
3373         case DM_RATR_STA_LOW:\r
3374                 HighRSSIThreshForRA += GoUpGap;\r
3375                 LowRSSIThreshForRA += GoUpGap;\r
3376                 break;\r
3377 \r
3378 #if (DM_ODM_SUPPORT_TYPE & (ODM_AP))\r
3379         case DM_RATR_STA_ULTRA_LOW:\r
3380                 HighRSSIThreshForRA += GoUpGap;\r
3381                 LowRSSIThreshForRA += GoUpGap;\r
3382                 UltraLowRSSIThreshForRA += GoUpGap;\r
3383                 break;\r
3384 #endif\r
3385 \r
3386         default:\r
3387                 ODM_RT_ASSERT(pDM_Odm, FALSE, ("wrong rssi level setting %d !", *pRATRState));\r
3388                 break;\r
3389         }\r
3390 \r
3391         /* Decide RATRState by RSSI.*/\r
3392         if (RSSI > HighRSSIThreshForRA)\r
3393                 RATRState = DM_RATR_STA_HIGH;\r
3394         else if (RSSI > LowRSSIThreshForRA)\r
3395                 RATRState = DM_RATR_STA_MIDDLE;\r
3396 \r
3397 #if (DM_ODM_SUPPORT_TYPE & (ODM_AP))\r
3398         else if (RSSI > UltraLowRSSIThreshForRA)\r
3399                 RATRState = DM_RATR_STA_LOW;\r
3400         else\r
3401                 RATRState = DM_RATR_STA_ULTRA_LOW;\r
3402 #else\r
3403         else\r
3404                 RATRState = DM_RATR_STA_LOW;\r
3405 #endif\r
3406         ODM_RT_TRACE(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_LOUD, ("[Mod RA RSSI Thresh]  High= (( %d )), Low = (( %d ))\n", HighRSSIThreshForRA, LowRSSIThreshForRA));\r
3407         /*printk("==>%s,RATRState:0x%02x ,RSSI:%d\n",__FUNCTION__,RATRState,RSSI);*/\r
3408 \r
3409         if (*pRATRState != RATRState || bForceUpdate) {\r
3410                 ODM_RT_TRACE(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_LOUD, ("[RSSI Level Update] %d -> %d\n", *pRATRState, RATRState));\r
3411                 *pRATRState = RATRState;\r
3412                 return TRUE;\r
3413         }\r
3414 \r
3415         return FALSE;\r
3416 }\r
3417 \r
3418 #endif\r
3419 \r
3420 \r