video: rockchip: tve: support rk3228
[firefly-linux-kernel-4.4.55.git] / drivers / net / wireless / rockchip_wlan / rtl8723bu / hal / OUTSRC / odm_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 "odm_precomp.h"\r
25 \r
26 \r
27 #if(DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))\r
28 VOID\r
29 odm_RSSIMonitorInit(\r
30         IN              PVOID           pDM_VOID\r
31         )\r
32 {\r
33         PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
34         pRA_T           pRA_Table = &pDM_Odm->DM_RA_Table;\r
35         pRA_Table->firstconnect = FALSE;\r
36         \r
37 #if(DM_ODM_SUPPORT_TYPE & (ODM_WIN))\r
38         pRA_Table->PT_collision_pre = TRUE;   //be used in ODM_DynamicARFBSelect(WIN only)\r
39 #endif  \r
40 \r
41 }\r
42 #endif\r
43 \r
44 VOID\r
45 odm_RSSIMonitorCheck(\r
46         IN              PVOID           pDM_VOID\r
47         )\r
48 {\r
49         // \r
50         // For AP/ADSL use prtl8192cd_priv\r
51         // For CE/NIC use PADAPTER\r
52         //\r
53 PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
54         if (!(pDM_Odm->SupportAbility & ODM_BB_RSSI_MONITOR))\r
55                 return;\r
56         \r
57         //\r
58         // 2011/09/29 MH In HW integration first stage, we provide 4 different handle to operate\r
59         // at the same time. In the stage2/3, we need to prive universal interface and merge all\r
60         // HW dynamic mechanism.\r
61         //\r
62         switch  (pDM_Odm->SupportPlatform)\r
63         {\r
64                 case    ODM_WIN:\r
65                         odm_RSSIMonitorCheckMP(pDM_Odm);\r
66                         break;\r
67 \r
68                 case    ODM_CE:\r
69                         odm_RSSIMonitorCheckCE(pDM_Odm);\r
70                         break;\r
71 \r
72                 case    ODM_AP:\r
73                         odm_RSSIMonitorCheckAP(pDM_Odm);\r
74                         break;          \r
75 \r
76                 case    ODM_ADSL:\r
77                         //odm_DIGAP(pDM_Odm);\r
78                         break;  \r
79         }\r
80         \r
81 }       // odm_RSSIMonitorCheck\r
82 \r
83 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\r
84 VOID\r
85 odm_RSSIDumpToRegister(\r
86         IN      PVOID   pDM_VOID\r
87         )\r
88 {\r
89         PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
90         PADAPTER                Adapter = pDM_Odm->Adapter;\r
91 \r
92         if(pDM_Odm->SupportICType == ODM_RTL8812)\r
93         {\r
94                 PlatformEFIOWrite1Byte(Adapter, rA_RSSIDump_Jaguar, Adapter->RxStats.RxRSSIPercentage[0]);\r
95                 PlatformEFIOWrite1Byte(Adapter, rB_RSSIDump_Jaguar, Adapter->RxStats.RxRSSIPercentage[1]);\r
96 \r
97                 // Rx EVM\r
98                 PlatformEFIOWrite1Byte(Adapter, rS1_RXevmDump_Jaguar, Adapter->RxStats.RxEVMdbm[0]);\r
99                 PlatformEFIOWrite1Byte(Adapter, rS2_RXevmDump_Jaguar, Adapter->RxStats.RxEVMdbm[1]);\r
100 \r
101                 // Rx SNR\r
102                 PlatformEFIOWrite1Byte(Adapter, rA_RXsnrDump_Jaguar, (u1Byte)(Adapter->RxStats.RxSNRdB[0]));\r
103                 PlatformEFIOWrite1Byte(Adapter, rB_RXsnrDump_Jaguar, (u1Byte)(Adapter->RxStats.RxSNRdB[1]));\r
104 \r
105                 // Rx Cfo_Short\r
106                 PlatformEFIOWrite2Byte(Adapter, rA_CfoShortDump_Jaguar, Adapter->RxStats.RxCfoShort[0]);\r
107                 PlatformEFIOWrite2Byte(Adapter, rB_CfoShortDump_Jaguar, Adapter->RxStats.RxCfoShort[1]);\r
108 \r
109                 // Rx Cfo_Tail\r
110                 PlatformEFIOWrite2Byte(Adapter, rA_CfoLongDump_Jaguar, Adapter->RxStats.RxCfoTail[0]);\r
111                 PlatformEFIOWrite2Byte(Adapter, rB_CfoLongDump_Jaguar, Adapter->RxStats.RxCfoTail[1]);\r
112         }\r
113         else if(pDM_Odm->SupportICType == ODM_RTL8192E)\r
114         {\r
115                 PlatformEFIOWrite1Byte(Adapter, rA_RSSIDump_92E, Adapter->RxStats.RxRSSIPercentage[0]);\r
116                 PlatformEFIOWrite1Byte(Adapter, rB_RSSIDump_92E, Adapter->RxStats.RxRSSIPercentage[1]);\r
117                 // Rx EVM\r
118                 PlatformEFIOWrite1Byte(Adapter, rS1_RXevmDump_92E, Adapter->RxStats.RxEVMdbm[0]);\r
119                 PlatformEFIOWrite1Byte(Adapter, rS2_RXevmDump_92E, Adapter->RxStats.RxEVMdbm[1]);\r
120                 // Rx SNR\r
121                 PlatformEFIOWrite1Byte(Adapter, rA_RXsnrDump_92E, (u1Byte)(Adapter->RxStats.RxSNRdB[0]));\r
122                 PlatformEFIOWrite1Byte(Adapter, rB_RXsnrDump_92E, (u1Byte)(Adapter->RxStats.RxSNRdB[1]));\r
123                 // Rx Cfo_Short\r
124                 PlatformEFIOWrite2Byte(Adapter, rA_CfoShortDump_92E, Adapter->RxStats.RxCfoShort[0]);\r
125                 PlatformEFIOWrite2Byte(Adapter, rB_CfoShortDump_92E, Adapter->RxStats.RxCfoShort[1]);\r
126                 // Rx Cfo_Tail\r
127                 PlatformEFIOWrite2Byte(Adapter, rA_CfoLongDump_92E, Adapter->RxStats.RxCfoTail[0]);\r
128                 PlatformEFIOWrite2Byte(Adapter, rB_CfoLongDump_92E, Adapter->RxStats.RxCfoTail[1]);\r
129          }\r
130 }\r
131 #endif\r
132 \r
133 VOID\r
134 odm_RSSIMonitorCheckMP(\r
135         IN      PVOID   pDM_VOID\r
136         )\r
137 {\r
138 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\r
139         PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
140         PADAPTER                Adapter = pDM_Odm->Adapter;\r
141         HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(Adapter);\r
142         PRT_WLAN_STA    pEntry = NULL;\r
143         u1Byte                  i;\r
144         s4Byte                  tmpEntryMaxPWDB=0, tmpEntryMinPWDB=0xff;\r
145         u1Byte                  H2C_Parameter[4] ={0};\r
146         PMGNT_INFO              pMgntInfo = &Adapter->MgntInfo;\r
147         PMGNT_INFO              pDefaultMgntInfo = &Adapter->MgntInfo;\r
148         u8Byte                  curTxOkCnt = 0, curRxOkCnt = 0; \r
149         u1Byte                  STBC_TX = 0;\r
150         BOOLEAN                 FirstConnect;                                                    \r
151         pRA_T                   pRA_Table = &pDM_Odm->DM_RA_Table; \r
152         pDIG_T                  pDM_DigTable = &pDM_Odm->DM_DigTable;\r
153 \r
154 #if (BEAMFORMING_SUPPORT == 1)  \r
155         BEAMFORMING_CAP Beamform_cap = BEAMFORMING_CAP_NONE;\r
156         u1Byte                  TxBF_EN = 0;\r
157 #endif\r
158 \r
159         PADAPTER        pLoopAdapter = GetDefaultAdapter(Adapter);\r
160 \r
161         BOOLEAN         bExtRAInfo = FALSE;\r
162 \r
163         if(pDM_Odm->SupportICType == ODM_RTL8192E || pDM_Odm->SupportICType == ODM_RTL8812 || pDM_Odm->SupportICType == ODM_RTL8821)\r
164                 bExtRAInfo = TRUE;\r
165 \r
166         FirstConnect = (pDM_Odm->bLinked) && (pDM_DigTable->bMediaConnect_0 == FALSE);\r
167         pRA_Table->firstconnect = pHalData->bLinked;                                               \r
168        H2C_Parameter[3] |= FirstConnect << 5;\r
169 \r
170         if(pDM_Odm->SupportICType == ODM_RTL8188E && (pDefaultMgntInfo->CustomerID==RT_CID_819x_HP))\r
171         {\r
172                 if(curRxOkCnt >(curTxOkCnt*6))\r
173                         PlatformEFIOWrite4Byte(Adapter, REG_ARFR0, 0x8f015);\r
174                 else\r
175                         PlatformEFIOWrite4Byte(Adapter, REG_ARFR0, 0xff015);\r
176         }       \r
177 \r
178         if(pDM_Odm->SupportICType == ODM_RTL8812 || pDM_Odm->SupportICType == ODM_RTL8821)\r
179         {\r
180                 if(curRxOkCnt >(curTxOkCnt*6))\r
181                         H2C_Parameter[3]=0x01;\r
182                 else\r
183                         H2C_Parameter[3]=0x00;\r
184         }\r
185 \r
186         while(pLoopAdapter)\r
187         {               \r
188         \r
189                 if(pLoopAdapter != NULL){\r
190                         pMgntInfo = &pLoopAdapter->MgntInfo;                    \r
191                         curTxOkCnt = pLoopAdapter->TxStats.NumTxBytesUnicast - pMgntInfo->lastTxOkCnt;\r
192                         curRxOkCnt = pLoopAdapter->RxStats.NumRxBytesUnicast - pMgntInfo->lastRxOkCnt;\r
193                         pMgntInfo->lastTxOkCnt = curTxOkCnt;\r
194                         pMgntInfo->lastRxOkCnt = curRxOkCnt;                    \r
195                 }\r
196 \r
197                 for(i = 0; i < ASSOCIATE_ENTRY_NUM; i++)\r
198                 {\r
199                 \r
200                         if(IsAPModeExist(pLoopAdapter))\r
201                         {\r
202                                 if(GetFirstExtAdapter(pLoopAdapter) != NULL && \r
203                                         GetFirstExtAdapter(pLoopAdapter) == pLoopAdapter){      \r
204                                         pEntry = AsocEntry_EnumStation(pLoopAdapter, i);                \r
205                                 }\r
206                                 else if(GetFirstGOPort(pLoopAdapter) != NULL && \r
207                                         IsFirstGoAdapter(pLoopAdapter)){\r
208                                         pEntry = AsocEntry_EnumStation(pLoopAdapter, i);                                                \r
209                                 }                               \r
210                         }\r
211                         else\r
212                         {\r
213                                         if(GetDefaultAdapter(pLoopAdapter) == pLoopAdapter){\r
214                                                 pEntry = AsocEntry_EnumStation(pLoopAdapter, i);                                        \r
215                                         }\r
216                         }\r
217 \r
218                 if(pEntry != NULL)\r
219                 {\r
220                         if(pEntry->bAssociated)\r
221                         {\r
222                         \r
223                                 RT_DISP_ADDR(FDM, DM_PWDB, ("pEntry->MacAddr ="), pEntry->MacAddr);\r
224                                 RT_DISP(FDM, DM_PWDB, ("pEntry->rssi = 0x%x(%d)\n", \r
225                                         pEntry->rssi_stat.UndecoratedSmoothedPWDB, pEntry->rssi_stat.UndecoratedSmoothedPWDB));\r
226 \r
227                                 if(bExtRAInfo)\r
228                                 {\r
229 \r
230 #if (BEAMFORMING_SUPPORT == 1)\r
231                                         Beamform_cap = Beamforming_GetEntryBeamCapByMacId(Adapter, pEntry->AssociatedMacId);\r
232                                         if(Beamform_cap & (BEAMFORMER_CAP_HT_EXPLICIT |BEAMFORMER_CAP_VHT_SU))\r
233                                                 TxBF_EN = 1;\r
234                                         else\r
235                                                 TxBF_EN = 0;\r
236         \r
237                                         H2C_Parameter[3] |= TxBF_EN << 6; \r
238                                         \r
239                                         if(TxBF_EN)\r
240                                                 STBC_TX = 0;\r
241                                         else\r
242 #endif\r
243                                         {\r
244                                                 if(IS_WIRELESS_MODE_AC(Adapter))\r
245                                                         STBC_TX = TEST_FLAG(pEntry->VHTInfo.STBC, STBC_VHT_ENABLE_TX);\r
246                                                 else\r
247                                                         STBC_TX = TEST_FLAG(pEntry->HTInfo.STBC, STBC_HT_ENABLE_TX);\r
248                                         }\r
249 \r
250                                         H2C_Parameter[3] |= STBC_TX << 1;\r
251                                 }\r
252 \r
253                                 if(pEntry->rssi_stat.UndecoratedSmoothedPWDB < tmpEntryMinPWDB)\r
254                                         tmpEntryMinPWDB = pEntry->rssi_stat.UndecoratedSmoothedPWDB;\r
255                                 if(pEntry->rssi_stat.UndecoratedSmoothedPWDB > tmpEntryMaxPWDB)\r
256                                         tmpEntryMaxPWDB = pEntry->rssi_stat.UndecoratedSmoothedPWDB;\r
257 \r
258                                 H2C_Parameter[2] = (u1Byte)(pEntry->rssi_stat.UndecoratedSmoothedPWDB & 0xFF);\r
259                                 H2C_Parameter[1] = 0x20;   // fw v12 cmdid 5:use max macid ,for nic ,default macid is 0 ,max macid is 1\r
260                                 H2C_Parameter[0] = (pEntry->AssociatedMacId);\r
261                                 if(bExtRAInfo)\r
262                                         ODM_FillH2CCmd(Adapter, ODM_H2C_RSSI_REPORT, 4, H2C_Parameter);\r
263                                 else\r
264                                         ODM_FillH2CCmd(Adapter, ODM_H2C_RSSI_REPORT, 3, H2C_Parameter);\r
265                         }\r
266                 }\r
267                 else\r
268                 {\r
269                         break;\r
270                 }\r
271         }\r
272 \r
273                 pLoopAdapter = GetNextExtAdapter(pLoopAdapter);\r
274         }\r
275 \r
276         if(tmpEntryMaxPWDB != 0)        // If associated entry is found\r
277         {\r
278                 pHalData->EntryMaxUndecoratedSmoothedPWDB = tmpEntryMaxPWDB;\r
279                 RT_DISP(FDM, DM_PWDB, ("EntryMaxPWDB = 0x%x(%d)\n",     tmpEntryMaxPWDB, tmpEntryMaxPWDB));\r
280         }\r
281         else\r
282         {\r
283                 pHalData->EntryMaxUndecoratedSmoothedPWDB = 0;\r
284         }\r
285         \r
286         if(tmpEntryMinPWDB != 0xff) // If associated entry is found\r
287         {\r
288                 pHalData->EntryMinUndecoratedSmoothedPWDB = tmpEntryMinPWDB;\r
289                 RT_DISP(FDM, DM_PWDB, ("EntryMinPWDB = 0x%x(%d)\n", tmpEntryMinPWDB, tmpEntryMinPWDB));\r
290 \r
291         }\r
292         else\r
293         {\r
294                 pHalData->EntryMinUndecoratedSmoothedPWDB = 0;\r
295         }\r
296 \r
297         // Indicate Rx signal strength to FW.\r
298         if(pHalData->bUseRAMask)\r
299         {\r
300                 if(bExtRAInfo)\r
301                 {\r
302                         PRT_HIGH_THROUGHPUT             pHTInfo = GET_HT_INFO(pDefaultMgntInfo);\r
303                         PRT_VERY_HIGH_THROUGHPUT        pVHTInfo = GET_VHT_INFO(pDefaultMgntInfo);\r
304 \r
305 #if (BEAMFORMING_SUPPORT == 1)\r
306                         \r
307                         Beamform_cap = Beamforming_GetEntryBeamCapByMacId(Adapter, pDefaultMgntInfo->mMacId);\r
308 \r
309                         if(Beamform_cap & (BEAMFORMER_CAP_HT_EXPLICIT |BEAMFORMER_CAP_VHT_SU))\r
310                                 TxBF_EN = 1;\r
311                         else\r
312                                 TxBF_EN = 0;\r
313 \r
314                         H2C_Parameter[3] |= TxBF_EN << 6; \r
315 \r
316                         if(TxBF_EN)\r
317                                 STBC_TX = 0;\r
318                         else\r
319 #endif\r
320                         {\r
321                                 if(IS_WIRELESS_MODE_AC(Adapter))\r
322                                         STBC_TX = TEST_FLAG(pVHTInfo->VhtCurStbc, STBC_VHT_ENABLE_TX);\r
323                                 else\r
324                                         STBC_TX = TEST_FLAG(pHTInfo->HtCurStbc, STBC_HT_ENABLE_TX);\r
325                         }\r
326 \r
327                         H2C_Parameter[3] |= STBC_TX << 1;\r
328                 }\r
329                 \r
330                 H2C_Parameter[2] = (u1Byte)(pHalData->UndecoratedSmoothedPWDB & 0xFF);\r
331                 H2C_Parameter[1] = 0x20;        // fw v12 cmdid 5:use max macid ,for nic ,default macid is 0 ,max macid is 1\r
332                 H2C_Parameter[0] = 0;           // fw v12 cmdid 5:use max macid ,for nic ,default macid is 0 ,max macid is 1\r
333                 if(bExtRAInfo)\r
334                         ODM_FillH2CCmd(Adapter, ODM_H2C_RSSI_REPORT, 4, H2C_Parameter);\r
335                 else\r
336                         ODM_FillH2CCmd(Adapter, ODM_H2C_RSSI_REPORT, 3, H2C_Parameter);\r
337         }\r
338         else\r
339         {\r
340                 PlatformEFIOWrite1Byte(Adapter, 0x4fe, (u1Byte)pHalData->UndecoratedSmoothedPWDB);\r
341         }\r
342 \r
343         if((pDM_Odm->SupportICType == ODM_RTL8812)||(pDM_Odm->SupportICType == ODM_RTL8192E))\r
344                 odm_RSSIDumpToRegister(pDM_Odm);\r
345                 \r
346         {\r
347                 PADAPTER pLoopAdapter = GetDefaultAdapter(Adapter);\r
348                 s4Byte  GlobalRSSI_min = 0xFF, LocalRSSI_Min;\r
349                 BOOLEAN         bLink= FALSE;\r
350                 \r
351                 while(pLoopAdapter)\r
352                 {\r
353                         LocalRSSI_Min = odm_FindMinimumRSSI(pLoopAdapter);\r
354                         //DbgPrint("pHalData->bLinked=%d, LocalRSSI_Min=%d\n", pHalData->bLinked, LocalRSSI_Min);\r
355                         if((LocalRSSI_Min < GlobalRSSI_min) && (LocalRSSI_Min != 0))\r
356                                 GlobalRSSI_min = LocalRSSI_Min;                 \r
357                         \r
358                         if(pHalData->bLinked)\r
359                                 bLink = TRUE;\r
360                         \r
361                         pLoopAdapter = GetNextExtAdapter(pLoopAdapter);\r
362                 }\r
363 \r
364                 pHalData->bLinked = bLink;\r
365                 ODM_CmnInfoUpdate(&pHalData->DM_OutSrc ,ODM_CMNINFO_LINK, (u8Byte)bLink);\r
366                 ODM_CmnInfoUpdate(&pHalData->DM_OutSrc ,ODM_CMNINFO_RSSI_MIN, (u8Byte)GlobalRSSI_min);\r
367                 \r
368         }\r
369         \r
370 #endif  // #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\r
371 }\r
372 \r
373 #if(DM_ODM_SUPPORT_TYPE==ODM_CE)\r
374 //\r
375 //sherry move from DUSC to here 20110517\r
376 //\r
377 static VOID\r
378 FindMinimumRSSI_Dmsp(\r
379         IN      PADAPTER        pAdapter\r
380 )\r
381 {\r
382 #if 0\r
383         HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(pAdapter);\r
384         struct dm_priv  *pdmpriv = &pHalData->dmpriv;\r
385         s32     Rssi_val_min_back_for_mac0;\r
386         BOOLEAN         bGetValueFromBuddyAdapter = dm_DualMacGetParameterFromBuddyAdapter(pAdapter);\r
387         BOOLEAN         bRestoreRssi = _FALSE;\r
388         PADAPTER        BuddyAdapter = pAdapter->BuddyAdapter;\r
389 \r
390         if(pHalData->MacPhyMode92D == DUALMAC_SINGLEPHY)\r
391         {\r
392                 if(BuddyAdapter!= NULL)\r
393                 {\r
394                         if(pHalData->bSlaveOfDMSP)\r
395                         {\r
396                                 //ODM_RT_TRACE(pDM_Odm,COMP_EASY_CONCURRENT,DBG_LOUD,("bSlavecase of dmsp\n"));\r
397                                 BuddyAdapter->DualMacDMSPControl.RssiValMinForAnotherMacOfDMSP = pdmpriv->MinUndecoratedPWDBForDM;\r
398                         }\r
399                         else\r
400                         {\r
401                                 if(bGetValueFromBuddyAdapter)\r
402                                 {\r
403                                         //ODM_RT_TRACE(pDM_Odm,COMP_EASY_CONCURRENT,DBG_LOUD,("get new RSSI\n"));\r
404                                         bRestoreRssi = _TRUE;\r
405                                         Rssi_val_min_back_for_mac0 = pdmpriv->MinUndecoratedPWDBForDM;\r
406                                         pdmpriv->MinUndecoratedPWDBForDM = pAdapter->DualMacDMSPControl.RssiValMinForAnotherMacOfDMSP;\r
407                                 }\r
408                         }\r
409                 }\r
410                 \r
411         }\r
412 \r
413         if(bRestoreRssi)\r
414         {\r
415                 bRestoreRssi = _FALSE;\r
416                 pdmpriv->MinUndecoratedPWDBForDM = Rssi_val_min_back_for_mac0;\r
417         }\r
418 #endif\r
419 }\r
420 \r
421 static void\r
422 FindMinimumRSSI(\r
423 IN      PADAPTER        pAdapter\r
424         )\r
425 {       \r
426         HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(pAdapter);\r
427         struct dm_priv  *pdmpriv = &pHalData->dmpriv;   \r
428         PDM_ODM_T               pDM_Odm = &(pHalData->odmpriv);\r
429 \r
430         //1 1.Determine the minimum RSSI \r
431 \r
432         if((pDM_Odm->bLinked != _TRUE) &&\r
433                 (pdmpriv->EntryMinUndecoratedSmoothedPWDB == 0))\r
434         {\r
435                 pdmpriv->MinUndecoratedPWDBForDM = 0;\r
436                 //ODM_RT_TRACE(pDM_Odm,COMP_BB_POWERSAVING, DBG_LOUD, ("Not connected to any \n"));\r
437         }\r
438         else\r
439         {\r
440                 pdmpriv->MinUndecoratedPWDBForDM = pdmpriv->EntryMinUndecoratedSmoothedPWDB;\r
441         }\r
442 \r
443         //DBG_8192C("%s=>MinUndecoratedPWDBForDM(%d)\n",__FUNCTION__,pdmpriv->MinUndecoratedPWDBForDM);\r
444         //ODM_RT_TRACE(pDM_Odm,COMP_DIG, DBG_LOUD, ("MinUndecoratedPWDBForDM =%d\n",pHalData->MinUndecoratedPWDBForDM));\r
445 }\r
446 #endif\r
447 \r
448 VOID\r
449 odm_RSSIMonitorCheckCE(\r
450         IN              PVOID           pDM_VOID\r
451         )\r
452 {\r
453 #if (DM_ODM_SUPPORT_TYPE == ODM_CE)\r
454         PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
455         PADAPTER        Adapter = pDM_Odm->Adapter;\r
456         HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(Adapter);\r
457         struct dm_priv  *pdmpriv = &pHalData->dmpriv;\r
458         struct dvobj_priv       *pdvobjpriv = adapter_to_dvobj(Adapter);\r
459         int     i;\r
460         int     tmpEntryMaxPWDB=0, tmpEntryMinPWDB=0xff;\r
461         u8      sta_cnt=0;\r
462         u32     UL_DL_STATE = 0, STBC_TX = 0, TxBF_EN = 0;\r
463         u32     PWDB_rssi[NUM_STA]={0};//[0~15]:MACID, [16~31]:PWDB_rssi\r
464         BOOLEAN                 FirstConnect = FALSE;\r
465         pRA_T                   pRA_Table = &pDM_Odm->DM_RA_Table;\r
466 \r
467         if(pDM_Odm->bLinked != _TRUE)\r
468                 return;\r
469 \r
470         #if((RTL8812A_SUPPORT==1)||(RTL8821A_SUPPORT==1))\r
471         if((pDM_Odm->SupportICType == ODM_RTL8812)||(pDM_Odm->SupportICType == ODM_RTL8821))\r
472         {\r
473                 u64     curTxOkCnt = pdvobjpriv->traffic_stat.cur_tx_bytes;\r
474                 u64     curRxOkCnt = pdvobjpriv->traffic_stat.cur_rx_bytes;\r
475 \r
476                 if(curRxOkCnt >(curTxOkCnt*6))\r
477                         UL_DL_STATE = 1;\r
478                 else\r
479                         UL_DL_STATE = 0;\r
480         }\r
481         #endif\r
482 \r
483        FirstConnect = (pDM_Odm->bLinked) && (pRA_Table->firstconnect == FALSE);    \r
484         pRA_Table->firstconnect = pDM_Odm->bLinked;\r
485 \r
486         //if(check_fwstate(&Adapter->mlmepriv, WIFI_AP_STATE|WIFI_ADHOC_STATE|WIFI_ADHOC_MASTER_STATE) == _TRUE)\r
487         {\r
488                 #if 1\r
489                 struct sta_info *psta;\r
490                 \r
491                 for(i=0; i<ODM_ASSOCIATE_ENTRY_NUM; i++) {\r
492                         if (IS_STA_VALID(psta = pDM_Odm->pODM_StaInfo[i]))\r
493                         {\r
494                                         if(IS_MCAST( psta->hwaddr))  //if(psta->mac_id ==1)\r
495                                                  continue;\r
496                                                                 \r
497                                         if(psta->rssi_stat.UndecoratedSmoothedPWDB == (-1))\r
498                                                  continue;\r
499                                                                 \r
500                                         if(psta->rssi_stat.UndecoratedSmoothedPWDB < tmpEntryMinPWDB)\r
501                                                 tmpEntryMinPWDB = psta->rssi_stat.UndecoratedSmoothedPWDB;\r
502 \r
503                                         if(psta->rssi_stat.UndecoratedSmoothedPWDB > tmpEntryMaxPWDB)\r
504                                                 tmpEntryMaxPWDB = psta->rssi_stat.UndecoratedSmoothedPWDB;\r
505 \r
506                                         #if 0\r
507                                         DBG_871X("%s mac_id:%u, mac:"MAC_FMT", rssi:%d\n", __func__,\r
508                                                 psta->mac_id, MAC_ARG(psta->hwaddr), psta->rssi_stat.UndecoratedSmoothedPWDB);\r
509                                         #endif\r
510 \r
511                                         if(psta->rssi_stat.UndecoratedSmoothedPWDB != (-1)) {\r
512 \r
513 #ifdef CONFIG_80211N_HT\r
514                                                 if(pDM_Odm->SupportICType == ODM_RTL8192E || pDM_Odm->SupportICType == ODM_RTL8812)\r
515                                                 {\r
516 #ifdef CONFIG_BEAMFORMING\r
517                                                         BEAMFORMING_CAP Beamform_cap = beamforming_get_entry_beam_cap_by_mac_id(&Adapter->mlmepriv, psta->mac_id);\r
518 \r
519                                                         if(Beamform_cap & (BEAMFORMER_CAP_HT_EXPLICIT |BEAMFORMER_CAP_VHT_SU))\r
520                                                                 TxBF_EN = 1;\r
521                                                         else\r
522                                                                 TxBF_EN = 0;\r
523 \r
524                                                         if (TxBF_EN) {\r
525                                                                 STBC_TX = 0;\r
526                                                         }\r
527                                                         else\r
528 #endif\r
529                                                         {\r
530 #ifdef CONFIG_80211AC_VHT\r
531                                                                 if(IsSupportedVHT(psta->wireless_mode))\r
532                                                                         STBC_TX = TEST_FLAG(psta->vhtpriv.stbc_cap, STBC_VHT_ENABLE_TX);\r
533                                                                 else    \r
534 #endif\r
535                                                                         STBC_TX = TEST_FLAG(psta->htpriv.stbc_cap, STBC_HT_ENABLE_TX);\r
536                                                         }\r
537                                                 }\r
538 #endif\r
539 \r
540                                                 if(pDM_Odm->SupportICType == ODM_RTL8192D)\r
541                                                         PWDB_rssi[sta_cnt++] = (psta->mac_id | (psta->rssi_stat.UndecoratedSmoothedPWDB<<16) | ((Adapter->stapriv.asoc_sta_count+1) << 8));\r
542                                                 else if ((pDM_Odm->SupportICType == ODM_RTL8192E)||(pDM_Odm->SupportICType == ODM_RTL8812)||(pDM_Odm->SupportICType == ODM_RTL8821))\r
543                                                         PWDB_rssi[sta_cnt++] = (((u8)(psta->mac_id&0xFF)) | ((psta->rssi_stat.UndecoratedSmoothedPWDB&0x7F)<<16) |(STBC_TX << 25) | (FirstConnect << 29) | (TxBF_EN << 30));\r
544                                                 else\r
545                                                         PWDB_rssi[sta_cnt++] = (psta->mac_id | (psta->rssi_stat.UndecoratedSmoothedPWDB<<16) );\r
546                                         }\r
547                         }\r
548                 }\r
549                 #else\r
550                 _irqL irqL;\r
551                 _list   *plist, *phead;\r
552                 struct sta_info *psta;\r
553                 struct sta_priv *pstapriv = &Adapter->stapriv;\r
554                 u8 bcast_addr[ETH_ALEN]= {0xff,0xff,0xff,0xff,0xff,0xff};\r
555 \r
556                 _enter_critical_bh(&pstapriv->sta_hash_lock, &irqL);\r
557 \r
558                 for(i=0; i< NUM_STA; i++)\r
559                 {\r
560                         phead = &(pstapriv->sta_hash[i]);\r
561                         plist = get_next(phead);\r
562                 \r
563                         while ((rtw_end_of_queue_search(phead, plist)) == _FALSE)\r
564                         {\r
565                                 psta = LIST_CONTAINOR(plist, struct sta_info, hash_list);\r
566 \r
567                                 plist = get_next(plist);\r
568 \r
569                                 if(_rtw_memcmp(psta->hwaddr, bcast_addr, ETH_ALEN) || \r
570                                         _rtw_memcmp(psta->hwaddr, myid(&Adapter->eeprompriv), ETH_ALEN))\r
571                                         continue;\r
572 \r
573                                 if(psta->state & WIFI_ASOC_STATE)\r
574                                 {\r
575                                         \r
576                                         if(psta->rssi_stat.UndecoratedSmoothedPWDB < tmpEntryMinPWDB)\r
577                                                 tmpEntryMinPWDB = psta->rssi_stat.UndecoratedSmoothedPWDB;\r
578 \r
579                                         if(psta->rssi_stat.UndecoratedSmoothedPWDB > tmpEntryMaxPWDB)\r
580                                                 tmpEntryMaxPWDB = psta->rssi_stat.UndecoratedSmoothedPWDB;\r
581 \r
582                                         if(psta->rssi_stat.UndecoratedSmoothedPWDB != (-1)){\r
583                                                 //printk("%s==> mac_id(%d),rssi(%d)\n",__FUNCTION__,psta->mac_id,psta->rssi_stat.UndecoratedSmoothedPWDB);\r
584                                                 #if(RTL8192D_SUPPORT==1)\r
585                                                 PWDB_rssi[sta_cnt++] = (psta->mac_id | (psta->rssi_stat.UndecoratedSmoothedPWDB<<16) | ((Adapter->stapriv.asoc_sta_count+1) << 8));\r
586                                                 #else\r
587                                                 PWDB_rssi[sta_cnt++] = (psta->mac_id | (psta->rssi_stat.UndecoratedSmoothedPWDB<<16) );\r
588                                                 #endif\r
589                                         }\r
590                                 }\r
591                         \r
592                         }\r
593 \r
594                 }\r
595         \r
596                 _exit_critical_bh(&pstapriv->sta_hash_lock, &irqL);\r
597                 #endif\r
598 \r
599                 //printk("%s==> sta_cnt(%d)\n",__FUNCTION__,sta_cnt);\r
600 \r
601                 for(i=0; i< sta_cnt; i++)\r
602                 {\r
603                         if(PWDB_rssi[i] != (0)){\r
604                                 if(pHalData->fw_ractrl == _TRUE)// Report every sta's RSSI to FW\r
605                                 {\r
606                                         #if(RTL8192D_SUPPORT==1)\r
607                                         if(pDM_Odm->SupportICType == ODM_RTL8192D){\r
608                                                 FillH2CCmd92D(Adapter, H2C_RSSI_REPORT, 3, (u8 *)(&PWDB_rssi[i]));              \r
609                                         }\r
610                                         #endif\r
611                                         \r
612                                         #if((RTL8192C_SUPPORT==1)||(RTL8723A_SUPPORT==1))\r
613                                         if((pDM_Odm->SupportICType == ODM_RTL8192C)||(pDM_Odm->SupportICType == ODM_RTL8723A)){\r
614                                                 rtl8192c_set_rssi_cmd(Adapter, (u8*)&PWDB_rssi[i]);\r
615                                         }\r
616                                         #endif\r
617                                         \r
618                                         #if((RTL8812A_SUPPORT==1)||(RTL8821A_SUPPORT==1))\r
619                                         if((pDM_Odm->SupportICType == ODM_RTL8812)||(pDM_Odm->SupportICType == ODM_RTL8821)){   \r
620                                                 PWDB_rssi[i] |= (UL_DL_STATE << 24);\r
621                                                 rtl8812_set_rssi_cmd(Adapter, (u8 *)(&PWDB_rssi[i]));\r
622                                         }\r
623                                         #endif\r
624                                         #if(RTL8192E_SUPPORT==1)\r
625                                         if(pDM_Odm->SupportICType == ODM_RTL8192E){\r
626                                                 rtl8192e_set_rssi_cmd(Adapter, (u8 *)(&PWDB_rssi[i]));\r
627                                         }\r
628                                         #endif\r
629                                         #if(RTL8723B_SUPPORT==1)\r
630                                         if(pDM_Odm->SupportICType == ODM_RTL8723B){\r
631                                                 rtl8723b_set_rssi_cmd(Adapter, (u8 *)(&PWDB_rssi[i]));\r
632                                         }\r
633                                         #endif\r
634 \r
635                                         #if(RTL8188E_SUPPORT==1)\r
636                                         if(pDM_Odm->SupportICType == ODM_RTL8188E){\r
637                                                 rtl8188e_set_rssi_cmd(Adapter, (u8 *)(&PWDB_rssi[i]));\r
638                                         }\r
639                                         #endif\r
640                                                                                 \r
641                                 }\r
642                                 else{\r
643                                         #if((RTL8188E_SUPPORT==1)&&(RATE_ADAPTIVE_SUPPORT == 1))\r
644                                         if(pDM_Odm->SupportICType == ODM_RTL8188E){\r
645                                                 ODM_RA_SetRSSI_8188E(\r
646                                                 &(pHalData->odmpriv), (PWDB_rssi[i]&0xFF), (u8)((PWDB_rssi[i]>>16) & 0xFF));\r
647                                         }\r
648                                         #endif\r
649                                 }\r
650                         }\r
651                 }               \r
652         }\r
653 \r
654 \r
655 \r
656         if(tmpEntryMaxPWDB != 0)        // If associated entry is found\r
657         {\r
658                 pdmpriv->EntryMaxUndecoratedSmoothedPWDB = tmpEntryMaxPWDB;             \r
659         }\r
660         else\r
661         {\r
662                 pdmpriv->EntryMaxUndecoratedSmoothedPWDB = 0;\r
663         }\r
664 \r
665         if(tmpEntryMinPWDB != 0xff) // If associated entry is found\r
666         {\r
667                 pdmpriv->EntryMinUndecoratedSmoothedPWDB = tmpEntryMinPWDB;             \r
668         }\r
669         else\r
670         {\r
671                 pdmpriv->EntryMinUndecoratedSmoothedPWDB = 0;\r
672         }\r
673 \r
674         FindMinimumRSSI(Adapter);//get pdmpriv->MinUndecoratedPWDBForDM\r
675 \r
676         #if(RTL8192D_SUPPORT==1)\r
677         FindMinimumRSSI_Dmsp(Adapter);\r
678         #endif\r
679         pDM_Odm->RSSI_Min = pdmpriv->MinUndecoratedPWDBForDM;\r
680         //ODM_CmnInfoUpdate(&pHalData->odmpriv ,ODM_CMNINFO_RSSI_MIN, pdmpriv->MinUndecoratedPWDBForDM);\r
681 #endif//if (DM_ODM_SUPPORT_TYPE == ODM_CE)\r
682 }\r
683 \r
684 \r
685 VOID\r
686 odm_RSSIMonitorCheckAP(\r
687         IN              PVOID           pDM_VOID\r
688         )\r
689 {\r
690 #if (DM_ODM_SUPPORT_TYPE == ODM_AP)\r
691 #if defined(CONFIG_RTL_92C_SUPPORT) || defined(CONFIG_RTL_92D_SUPPORT) ||defined(CONFIG_RTL_8812_SUPPORT)||defined(CONFIG_WLAN_HAL_8881A)||defined(CONFIG_WLAN_HAL_8192EE)\r
692         {\r
693                 PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
694                 prtl8192cd_priv priv            = pDM_Odm->priv;                \r
695                 u4Byte i;\r
696                 PSTA_INFO_T pstat;\r
697                 static u1Byte H2C_Parameter[5];\r
698                 u1Byte    TxBF_EN = 0;\r
699                 pBDC_T  pDM_BdcTable = &pDM_Odm->DM_BdcTable;\r
700 \r
701                 if( priv->up_time % 2 )\r
702                         return;\r
703 \r
704                 pDM_BdcTable->num_Txbfee_Client=0;\r
705                 pDM_BdcTable->num_Txbfer_Client=0;\r
706                 //pDM_BdcTable->num_Client=0;\r
707                 \r
708                 for(i=0; i<ODM_ASSOCIATE_ENTRY_NUM; i++)\r
709                 {\r
710                         pstat = pDM_Odm->pODM_StaInfo[i];\r
711                         if(IS_STA_VALID(pstat) )\r
712                         {                       \r
713 #ifdef BEAMFORMING_SUPPORT\r
714                                 BEAMFORMING_CAP Beamform_cap = Beamforming_GetEntryBeamCapByMacId(priv, pstat->aid);\r
715                                 if(Beamform_cap == BEAMFORMER_CAP_HT_EXPLICIT || Beamform_cap == BEAMFORMER_CAP_VHT_SU ||\r
716                                          Beamform_cap == (BEAMFORMER_CAP_HT_EXPLICIT|BEAMFORMEE_CAP_HT_EXPLICIT) ||\r
717                                          Beamform_cap == (BEAMFORMER_CAP_VHT_SU|BEAMFORMEE_CAP_VHT_SU))\r
718                                 {\r
719                                         TxBF_EN = (1<< 6);\r
720                                         pDM_BdcTable->w_BFee_Client[i]=1; //AP act as BFer\r
721                                         pDM_BdcTable->num_Txbfee_Client++;\r
722                                 }\r
723                                 else \r
724                                 {\r
725                                         pDM_BdcTable->w_BFee_Client[i]=0; //AP act as BFer\r
726                                 }\r
727                                 \r
728                                 if((Beamform_cap & BEAMFORMEE_CAP_HT_EXPLICIT) || (Beamform_cap & BEAMFORMEE_CAP_VHT_SU) )\r
729                                 {\r
730                                         pDM_BdcTable->w_BFer_Client[i]=1; //AP act as BFee\r
731                                         pDM_BdcTable->num_Txbfer_Client++;\r
732                                 }\r
733                                 else \r
734                                 {\r
735                                         pDM_BdcTable->w_BFer_Client[i]=0; //AP act as BFer\r
736                                 }\r
737 \r
738                                         \r
739                                 //pDM_BdcTable->num_Client++;\r
740                 \r
741                                 \r
742                                 \r
743 #endif                  \r
744 //#ifdef STA_EXT\r
745 //                              if (GET_CHIP_VER(priv)==VERSION_8812E && REMAP_AID(pstat) < (RTL8812_NUM_STAT - 1))\r
746 //#endif\r
747                                 {\r
748 #ifdef CONFIG_RTL_8812_SUPPORT\r
749 #ifdef STA_EXT\r
750                                         if(REMAP_AID(pstat) < (RTL8812_NUM_STAT - 1))\r
751 #endif                                  \r
752 \r
753                                         if(pDM_Odm->SupportICType == ODM_RTL8812) {\r
754                                                 memset(H2C_Parameter,0,5);                                              \r
755                                                 H2C_Parameter[2] = (u1Byte)(pstat->rssi & 0x7F);\r
756                                                 H2C_Parameter[0] = REMAP_AID(pstat);                            \r
757                                                 if ((priv->pmib->dot11nConfigEntry.dot11nSTBC) && (\r
758                                                         (pstat->ht_cap_buf.ht_cap_info & cpu_to_le16(_HTCAP_RX_STBC_CAP_)\r
759 #ifdef RTK_AC_SUPPORT                   \r
760                                                         || (pstat->vht_cap_buf.vht_cap_info & cpu_to_le32(_VHTCAP_RX_STBC_CAP_))\r
761 #endif\r
762                                                         )))     \r
763                                                         H2C_Parameter[3] |= 2;\r
764                                                 H2C_Parameter[3] |= TxBF_EN ; \r
765                                                 FillH2CCmd8812(pDM_Odm->priv, H2C_8812_RSSI_REPORT, 4, H2C_Parameter);\r
766                                         }\r
767 #endif\r
768                                 }\r
769 //#ifdef STA_EXT\r
770 //                              else if (GET_CHIP_VER(priv)!=VERSION_8812E && REMAP_AID(pstat) < (FW_NUM_STAT - 1)) \r
771 //#endif\r
772                                 {\r
773 #if defined(CONFIG_WLAN_HAL_8881A) || defined(CONFIG_WLAN_HAL_8192EE)\r
774 #ifdef STA_EXT\r
775                                         if(REMAP_AID(pstat) < (RTL8812_NUM_STAT - 1))\r
776 #endif  \r
777                                         if(pDM_Odm->SupportICType == ODM_RTL8881A || pDM_Odm->SupportICType == ODM_RTL8192E) {\r
778 //                                              u1Byte  H2C_Parameter[5] ={0};  \r
779                                                 u1Byte  cmdlen = 3;\r
780                                                 memset(H2C_Parameter, 0, 5);\r
781                                                 H2C_Parameter[2] = (u1Byte)(pstat->rssi & 0xFF);\r
782                                                 H2C_Parameter[0] = REMAP_AID(pstat);\r
783                                                 if(pDM_Odm->SupportICType == ODM_RTL8192E) {\r
784                                                         cmdlen = 4;\r
785                                                         if ((priv->pmib->dot11nConfigEntry.dot11nSTBC) && (pstat->ht_cap_buf.ht_cap_info & cpu_to_le16(_HTCAP_RX_STBC_CAP_)))   \r
786                                                                 H2C_Parameter[3] |= 2;          \r
787                                                          H2C_Parameter[3] |= TxBF_EN; \r
788 \r
789                                                 } \r
790                         GET_HAL_INTERFACE(pDM_Odm->priv)->FillH2CCmdHandler(pDM_Odm->priv, H2C_88XX_RSSI_REPORT, cmdlen, H2C_Parameter);\r
791                                         }\r
792 #endif\r
793                                 \r
794 #if defined(CONFIG_RTL_92C_SUPPORT) || defined(CONFIG_RTL_92D_SUPPORT)  \r
795 #ifdef STA_EXT\r
796                                         if(REMAP_AID(pstat) < (FW_NUM_STAT - 1))\r
797 #endif\r
798                                         if(pDM_Odm->SupportICType == ODM_RTL8192C || pDM_Odm->SupportICType == ODM_RTL8192D) \r
799                                                 add_update_rssi(pDM_Odm->priv, pstat);\r
800 #endif\r
801                                 }\r
802 \r
803                         }               \r
804                 }\r
805         }\r
806 #endif\r
807 #endif\r
808 \r
809 }\r
810 \r
811 \r
812 \r
813 \r
814 \r
815 VOID\r
816 odm_RateAdaptiveMaskInit(\r
817         IN      PVOID   pDM_VOID        \r
818         )\r
819 {\r
820         PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
821         PODM_RATE_ADAPTIVE      pOdmRA = &pDM_Odm->RateAdaptive;\r
822 \r
823 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\r
824         PMGNT_INFO              pMgntInfo = &pDM_Odm->Adapter->MgntInfo;\r
825         HAL_DATA_TYPE   *pHalData = GET_HAL_DATA(pDM_Odm->Adapter);\r
826 \r
827         pMgntInfo->Ratr_State = DM_RATR_STA_INIT;\r
828 \r
829         if (pMgntInfo->DM_Type == DM_Type_ByDriver)\r
830                 pHalData->bUseRAMask = TRUE;\r
831         else\r
832                 pHalData->bUseRAMask = FALSE;   \r
833 \r
834 #elif (DM_ODM_SUPPORT_TYPE == ODM_CE)\r
835         pOdmRA->Type = DM_Type_ByDriver;\r
836         if (pOdmRA->Type == DM_Type_ByDriver)\r
837                 pDM_Odm->bUseRAMask = _TRUE;\r
838         else\r
839                 pDM_Odm->bUseRAMask = _FALSE;   \r
840 #endif\r
841 \r
842         pOdmRA->RATRState = DM_RATR_STA_INIT;\r
843         \r
844 #if(DM_ODM_SUPPORT_TYPE & ODM_WIN)\r
845         if(pDM_Odm->SupportICType == ODM_RTL8812)\r
846                 pOdmRA->LdpcThres = 50;         \r
847         else\r
848                 pOdmRA->LdpcThres = 35;\r
849                 \r
850         pOdmRA->RtsThres = 35;\r
851         \r
852 #elif(DM_ODM_SUPPORT_TYPE & ODM_CE)\r
853         pOdmRA->LdpcThres = 35;\r
854         pOdmRA->bUseLdpc = FALSE;\r
855         \r
856 #else\r
857         pOdmRA->UltraLowRSSIThresh = 9; \r
858         \r
859 #endif\r
860 \r
861         pOdmRA->HighRSSIThresh = 50;\r
862         pOdmRA->LowRSSIThresh = 20;\r
863 }\r
864 /*-----------------------------------------------------------------------------\r
865  * Function:    odm_RefreshRateAdaptiveMask()\r
866  *\r
867  * Overview:    Update rate table mask according to rssi\r
868  *\r
869  * Input:               NONE\r
870  *\r
871  * Output:              NONE\r
872  *\r
873  * Return:              NONE\r
874  *\r
875  * Revised History:\r
876  *      When            Who             Remark\r
877  *      05/27/2009      hpfan   Create Version 0.  \r
878  *\r
879  *---------------------------------------------------------------------------*/\r
880 VOID\r
881 odm_RefreshRateAdaptiveMask(\r
882         IN      PVOID   pDM_VOID\r
883         )\r
884 {\r
885         PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
886         ODM_RT_TRACE(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_TRACE, ("odm_RefreshRateAdaptiveMask()---------->\n")); \r
887         if (!(pDM_Odm->SupportAbility & ODM_BB_RA_MASK))\r
888         {\r
889                 ODM_RT_TRACE(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_TRACE, ("odm_RefreshRateAdaptiveMask(): Return cos not supported\n"));\r
890                 return; \r
891         }\r
892         //\r
893         // 2011/09/29 MH In HW integration first stage, we provide 4 different handle to operate\r
894         // at the same time. In the stage2/3, we need to prive universal interface and merge all\r
895         // HW dynamic mechanism.\r
896         //\r
897         switch  (pDM_Odm->SupportPlatform)\r
898         {\r
899                 case    ODM_WIN:\r
900                         odm_RefreshRateAdaptiveMaskMP(pDM_Odm);\r
901                         break;\r
902 \r
903                 case    ODM_CE:\r
904                         odm_RefreshRateAdaptiveMaskCE(pDM_Odm);\r
905                         break;\r
906 \r
907                 case    ODM_AP:\r
908                 case    ODM_ADSL:\r
909                         odm_RefreshRateAdaptiveMaskAPADSL(pDM_Odm);\r
910                         break;\r
911         }\r
912         \r
913 }\r
914 \r
915 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\r
916 VOID\r
917 odm_RefreshLdpcRtsMP(\r
918         IN      PADAPTER                        pAdapter,\r
919         IN      PDM_ODM_T                       pDM_Odm,\r
920         IN      u1Byte                          mMacId,\r
921         IN      u1Byte                          IOTPeer,\r
922         IN      s4Byte                          UndecoratedSmoothedPWDB \r
923         )\r
924 {\r
925         BOOLEAN                                 bCtlLdpc = FALSE;\r
926         PMGNT_INFO                              pMgntInfo = GetDefaultMgntInfo(pAdapter);\r
927         PODM_RATE_ADAPTIVE              pRA = &pDM_Odm->RateAdaptive;\r
928 \r
929         if(pDM_Odm->SupportICType != ODM_RTL8821 && pDM_Odm->SupportICType != ODM_RTL8812)\r
930                 return;\r
931 \r
932         if((pDM_Odm->SupportICType == ODM_RTL8821) && (pDM_Odm->CutVersion == ODM_CUT_A))\r
933                 bCtlLdpc = TRUE;\r
934         else if(        pDM_Odm->SupportICType == ODM_RTL8812 && \r
935                         IOTPeer == HT_IOT_PEER_REALTEK_JAGUAR_CCUTAP)\r
936                                 bCtlLdpc = TRUE;\r
937 \r
938         if(bCtlLdpc)\r
939         {\r
940                 if(UndecoratedSmoothedPWDB < (pRA->LdpcThres-5))\r
941                         MgntSet_TX_LDPC(pAdapter, mMacId, TRUE);\r
942                 else if(UndecoratedSmoothedPWDB > pRA->LdpcThres)\r
943                         MgntSet_TX_LDPC(pAdapter, mMacId, FALSE);\r
944         }       \r
945 \r
946         if(UndecoratedSmoothedPWDB < (pRA->RtsThres-5))\r
947                 pRA->bLowerRtsRate = TRUE;\r
948         else if(UndecoratedSmoothedPWDB > pRA->RtsThres)\r
949                 pRA->bLowerRtsRate = FALSE;\r
950 }\r
951 #endif\r
952 \r
953 \r
954 VOID\r
955 odm_RefreshRateAdaptiveMaskMP(\r
956         IN              PVOID           pDM_VOID\r
957         )\r
958 {\r
959 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\r
960         PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
961         PADAPTER                                pAdapter         =  pDM_Odm->Adapter;\r
962         PADAPTER                                pTargetAdapter = NULL;\r
963         HAL_DATA_TYPE                   *pHalData = GET_HAL_DATA(pAdapter);\r
964         PMGNT_INFO                              pMgntInfo = GetDefaultMgntInfo(pAdapter);\r
965 \r
966         if(pAdapter->bDriverStopped)\r
967         {\r
968                 ODM_RT_TRACE(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_TRACE, ("<---- odm_RefreshRateAdaptiveMask(): driver is going to unload\n"));\r
969                 return;\r
970         }\r
971 \r
972         if(!pHalData->bUseRAMask)\r
973         {\r
974                 ODM_RT_TRACE(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_LOUD, ("<---- odm_RefreshRateAdaptiveMask(): driver does not control rate adaptive mask\n"));\r
975                 return;\r
976         }\r
977 \r
978         // if default port is connected, update RA table for default port (infrastructure mode only)\r
979         if(pMgntInfo->mAssoc && (!ACTING_AS_AP(pAdapter)))\r
980         {       \r
981                 odm_RefreshLdpcRtsMP(pAdapter, pDM_Odm, pMgntInfo->mMacId,  pMgntInfo->IOTPeer, pHalData->UndecoratedSmoothedPWDB);\r
982                 ODM_RT_TRACE(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_LOUD, ("odm_RefreshRateAdaptiveMask(): Infrasture Mode\n"));\r
983                 if( ODM_RAStateCheck(pDM_Odm, pHalData->UndecoratedSmoothedPWDB, pMgntInfo->bSetTXPowerTrainingByOid, &pMgntInfo->Ratr_State) )\r
984                 {\r
985                         ODM_PRINT_ADDR(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_LOUD, ("Target AP addr : "), pMgntInfo->Bssid);\r
986                         ODM_RT_TRACE(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_LOUD, ("RSSI:%d, RSSI_LEVEL:%d\n", pHalData->UndecoratedSmoothedPWDB, pMgntInfo->Ratr_State));\r
987                         pAdapter->HalFunc.UpdateHalRAMaskHandler(pAdapter, pMgntInfo->mMacId, NULL, pMgntInfo->Ratr_State);\r
988                 }\r
989                 else if(pDM_Odm->bChangeState)\r
990                 {\r
991                         ODM_PRINT_ADDR(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_LOUD, ("Target AP addr : "), pMgntInfo->Bssid);\r
992                         ODM_RT_TRACE(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_LOUD, ("Change Power Training State, bDisablePowerTraining = %d\n", pDM_Odm->bDisablePowerTraining));\r
993                         pAdapter->HalFunc.UpdateHalRAMaskHandler(pAdapter, pMgntInfo->mMacId, NULL, pMgntInfo->Ratr_State);\r
994                 }\r
995         }\r
996 \r
997         //\r
998         // The following part configure AP/VWifi/IBSS rate adaptive mask.\r
999         //\r
1000 \r
1001         if(pMgntInfo->mIbss)    // Target: AP/IBSS peer.\r
1002                 pTargetAdapter = GetDefaultAdapter(pAdapter);\r
1003         else\r
1004                 pTargetAdapter = GetFirstAPAdapter(pAdapter);\r
1005 \r
1006         // if extension port (softap) is started, updaet RA table for more than one clients associate\r
1007         if(pTargetAdapter != NULL)\r
1008         {\r
1009                 int     i;\r
1010                 PRT_WLAN_STA    pEntry;\r
1011 \r
1012                 for(i = 0; i < ODM_ASSOCIATE_ENTRY_NUM; i++)\r
1013                 {\r
1014                         pEntry = AsocEntry_EnumStation(pTargetAdapter, i);\r
1015                         if(NULL != pEntry)\r
1016                         {\r
1017                                 if(pEntry->bAssociated)\r
1018                                 {\r
1019                                         odm_RefreshLdpcRtsMP(pAdapter, pDM_Odm, pEntry->AssociatedMacId, pEntry->IOTPeer, pEntry->rssi_stat.UndecoratedSmoothedPWDB);\r
1020 \r
1021                                         if(ODM_RAStateCheck(pDM_Odm, pEntry->rssi_stat.UndecoratedSmoothedPWDB, pMgntInfo->bSetTXPowerTrainingByOid, &pEntry->Ratr_State) )\r
1022                                         {\r
1023                                                 ODM_PRINT_ADDR(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_LOUD, ("Target STA addr : "), pEntry->MacAddr);\r
1024                                                 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
1025                                                 pAdapter->HalFunc.UpdateHalRAMaskHandler(pTargetAdapter, pEntry->AssociatedMacId, pEntry, pEntry->Ratr_State);\r
1026                                         }\r
1027                                         else if(pDM_Odm->bChangeState)\r
1028                                         {\r
1029                                                 ODM_RT_TRACE(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_LOUD, ("Change Power Training State, bDisablePowerTraining = %d\n", pDM_Odm->bDisablePowerTraining));\r
1030                                                 pAdapter->HalFunc.UpdateHalRAMaskHandler(pAdapter, pMgntInfo->mMacId, NULL, pMgntInfo->Ratr_State);\r
1031                                         }\r
1032                                 }\r
1033                         }\r
1034                 }\r
1035         }\r
1036 \r
1037         if(pMgntInfo->bSetTXPowerTrainingByOid)\r
1038                 pMgntInfo->bSetTXPowerTrainingByOid = FALSE;    \r
1039 #endif  // #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\r
1040 }\r
1041 \r
1042 \r
1043 \r
1044 VOID\r
1045 odm_RefreshRateAdaptiveMaskCE(\r
1046         IN      PVOID   pDM_VOID        \r
1047         )\r
1048 {\r
1049 #if (DM_ODM_SUPPORT_TYPE == ODM_CE)\r
1050         PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
1051         u1Byte  i;\r
1052         PADAPTER        pAdapter         =  pDM_Odm->Adapter;\r
1053         PODM_RATE_ADAPTIVE              pRA = &pDM_Odm->RateAdaptive;\r
1054 \r
1055         if(pAdapter->bDriverStopped)\r
1056         {\r
1057                 ODM_RT_TRACE(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_TRACE, ("<---- odm_RefreshRateAdaptiveMask(): driver is going to unload\n"));\r
1058                 return;\r
1059         }\r
1060 \r
1061         if(!pDM_Odm->bUseRAMask)\r
1062         {\r
1063                 ODM_RT_TRACE(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_LOUD, ("<---- odm_RefreshRateAdaptiveMask(): driver does not control rate adaptive mask\n"));\r
1064                 return;\r
1065         }\r
1066 \r
1067         //printk("==> %s \n",__FUNCTION__);\r
1068 \r
1069         for(i=0; i<ODM_ASSOCIATE_ENTRY_NUM; i++){\r
1070                 PSTA_INFO_T pstat = pDM_Odm->pODM_StaInfo[i];\r
1071                 if(IS_STA_VALID(pstat) ) {\r
1072                         if(IS_MCAST( pstat->hwaddr))  //if(psta->mac_id ==1)\r
1073                                  continue;\r
1074                         if(IS_MCAST( pstat->hwaddr))\r
1075                                 continue;\r
1076 \r
1077                         #if((RTL8812A_SUPPORT==1)||(RTL8821A_SUPPORT==1))\r
1078                         if((pDM_Odm->SupportICType == ODM_RTL8812)||(pDM_Odm->SupportICType == ODM_RTL8821))\r
1079                         {\r
1080                                 if(pstat->rssi_stat.UndecoratedSmoothedPWDB < pRA->LdpcThres)\r
1081                                 {\r
1082                                         pRA->bUseLdpc = TRUE;\r
1083                                         pRA->bLowerRtsRate = TRUE;\r
1084                                         if((pDM_Odm->SupportICType == ODM_RTL8821) && (pDM_Odm->CutVersion == ODM_CUT_A))\r
1085                                                 Set_RA_LDPC_8812(pstat, TRUE);\r
1086                                         //DbgPrint("RSSI=%d, bUseLdpc = TRUE\n", pHalData->UndecoratedSmoothedPWDB);\r
1087                                 }\r
1088                                 else if(pstat->rssi_stat.UndecoratedSmoothedPWDB > (pRA->LdpcThres-5))\r
1089                                 {\r
1090                                         pRA->bUseLdpc = FALSE;\r
1091                                         pRA->bLowerRtsRate = FALSE;\r
1092                                         if((pDM_Odm->SupportICType == ODM_RTL8821) && (pDM_Odm->CutVersion == ODM_CUT_A))\r
1093                                                 Set_RA_LDPC_8812(pstat, FALSE);\r
1094                                         //DbgPrint("RSSI=%d, bUseLdpc = FALSE\n", pHalData->UndecoratedSmoothedPWDB);\r
1095                                 }\r
1096                         }\r
1097                         #endif\r
1098 \r
1099                         if( TRUE == ODM_RAStateCheck(pDM_Odm, pstat->rssi_stat.UndecoratedSmoothedPWDB, FALSE , &pstat->rssi_level) )\r
1100                         {\r
1101                                 ODM_RT_TRACE(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_LOUD, ("RSSI:%d, RSSI_LEVEL:%d\n", pstat->rssi_stat.UndecoratedSmoothedPWDB, pstat->rssi_level));\r
1102                                 //printk("RSSI:%d, RSSI_LEVEL:%d\n", pstat->rssi_stat.UndecoratedSmoothedPWDB, pstat->rssi_level);\r
1103                                 rtw_hal_update_ra_mask(pstat, pstat->rssi_level);\r
1104                         }\r
1105                 \r
1106                 }\r
1107         }                       \r
1108         \r
1109 #endif\r
1110 }\r
1111 \r
1112 VOID\r
1113 odm_RefreshRateAdaptiveMaskAPADSL(\r
1114         IN      PVOID   pDM_VOID\r
1115         )\r
1116 {\r
1117 #if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))\r
1118         PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
1119         struct rtl8192cd_priv *priv = pDM_Odm->priv;\r
1120         struct aid_obj *aidarray;\r
1121         u4Byte i;\r
1122         PSTA_INFO_T pstat;\r
1123 \r
1124         if(priv->up_time % 2)\r
1125                 return; \r
1126 \r
1127         for(i=0; i<ODM_ASSOCIATE_ENTRY_NUM; i++) {\r
1128                 pstat = pDM_Odm->pODM_StaInfo[i];\r
1129 \r
1130                 if(IS_STA_VALID(pstat) )\r
1131                 {                       \r
1132 #if defined(UNIVERSAL_REPEATER) || defined(MBSSID)\r
1133                         aidarray = container_of(pstat, struct aid_obj, station);\r
1134                         priv = aidarray->priv;\r
1135 #endif\r
1136 \r
1137                         if (!priv->pmib->dot11StationConfigEntry.autoRate) \r
1138                                 continue;\r
1139 \r
1140                         if(ODM_RAStateCheck(pDM_Odm, (s4Byte)pstat->rssi, FALSE, &pstat->rssi_level) ) {\r
1141                                 ODM_PRINT_ADDR(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_LOUD, ("Target STA addr : "), pstat->hwaddr);\r
1142                                 ODM_RT_TRACE(pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_LOUD, ("RSSI:%d, RSSI_LEVEL:%d\n", pstat->rssi, pstat->rssi_level));\r
1143 \r
1144 #if defined(CONFIG_PCI_HCI)\r
1145 #ifdef CONFIG_WLAN_HAL\r
1146                                 if (IS_HAL_CHIP(priv)) {\r
1147 #ifdef WDS\r
1148                                         if(!(pstat->state & WIFI_WDS))//if WDS donot setting\r
1149 #endif\r
1150                                                 GET_HAL_INTERFACE(priv)->UpdateHalRAMaskHandler(priv, pstat, pstat->rssi_level);\r
1151                                 } else\r
1152 #endif\r
1153 #ifdef CONFIG_RTL_8812_SUPPORT\r
1154                                 if(GET_CHIP_VER(priv)== VERSION_8812E) {\r
1155                                         UpdateHalRAMask8812(priv, pstat, 3);\r
1156                                 } else\r
1157 #endif\r
1158 #ifdef CONFIG_RTL_88E_SUPPORT\r
1159                                 if (GET_CHIP_VER(priv)==VERSION_8188E) {\r
1160 #ifdef TXREPORT\r
1161                                         add_RATid(priv, pstat);\r
1162 #endif\r
1163                                 } else\r
1164 #endif\r
1165                                 {\r
1166 #if defined(CONFIG_RTL_92D_SUPPORT) || defined(CONFIG_RTL_92C_SUPPORT)\r
1167                                         add_update_RATid(priv, pstat);\r
1168 #endif\r
1169                                 }\r
1170 #elif defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI)\r
1171                                 update_STA_RATid(priv, pstat);\r
1172 #endif\r
1173                         }\r
1174                 }\r
1175         }\r
1176 #endif\r
1177 }\r
1178 \r
1179 \r
1180 \r
1181 // Return Value: BOOLEAN\r
1182 // - TRUE: RATRState is changed.\r
1183 BOOLEAN \r
1184 ODM_RAStateCheck(\r
1185         IN              PVOID                   pDM_VOID,\r
1186         IN              s4Byte                  RSSI,\r
1187         IN              BOOLEAN                 bForceUpdate,\r
1188         OUT             pu1Byte                 pRATRState\r
1189         )\r
1190 {\r
1191         PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
1192         PODM_RATE_ADAPTIVE pRA = &pDM_Odm->RateAdaptive;\r
1193         const u1Byte GoUpGap = 5;\r
1194         u1Byte HighRSSIThreshForRA = pRA->HighRSSIThresh;\r
1195         u1Byte LowRSSIThreshForRA = pRA->LowRSSIThresh;\r
1196         u1Byte RATRState;\r
1197 \r
1198         // Threshold Adjustment: \r
1199         // when RSSI state trends to go up one or two levels, make sure RSSI is high enough.\r
1200         // Here GoUpGap is added to solve the boundary's level alternation issue.\r
1201 #if (DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))\r
1202         u1Byte UltraLowRSSIThreshForRA = pRA->UltraLowRSSIThresh;\r
1203         if(pDM_Odm->SupportICType == ODM_RTL8881A)              \r
1204                 LowRSSIThreshForRA = 30;                // for LDPC / BCC switch\r
1205 #endif\r
1206 \r
1207         switch (*pRATRState)\r
1208         {\r
1209                 case DM_RATR_STA_INIT:\r
1210                 case DM_RATR_STA_HIGH:\r
1211                         break;\r
1212 \r
1213                 case DM_RATR_STA_MIDDLE:\r
1214                         HighRSSIThreshForRA += GoUpGap;\r
1215                         break;\r
1216 \r
1217                 case DM_RATR_STA_LOW:\r
1218                         HighRSSIThreshForRA += GoUpGap;\r
1219                         LowRSSIThreshForRA += GoUpGap;\r
1220                         break;\r
1221                         \r
1222 #if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))\r
1223                 case DM_RATR_STA_ULTRA_LOW:\r
1224                         HighRSSIThreshForRA += GoUpGap;\r
1225                         LowRSSIThreshForRA += GoUpGap;\r
1226                         UltraLowRSSIThreshForRA += GoUpGap;\r
1227                         break;\r
1228 #endif\r
1229 \r
1230                 default: \r
1231                         ODM_RT_ASSERT(pDM_Odm, FALSE, ("wrong rssi level setting %d !", *pRATRState) );\r
1232                         break;\r
1233         }\r
1234 \r
1235         // Decide RATRState by RSSI.\r
1236         if(RSSI > HighRSSIThreshForRA)\r
1237                 RATRState = DM_RATR_STA_HIGH;\r
1238         else if(RSSI > LowRSSIThreshForRA)\r
1239                 RATRState = DM_RATR_STA_MIDDLE;\r
1240 \r
1241 #if(DM_ODM_SUPPORT_TYPE & (ODM_AP|ODM_ADSL))\r
1242         else if(RSSI > UltraLowRSSIThreshForRA)\r
1243                 RATRState = DM_RATR_STA_LOW;\r
1244         else\r
1245                 RATRState = DM_RATR_STA_ULTRA_LOW;\r
1246 #else\r
1247         else\r
1248                 RATRState = DM_RATR_STA_LOW;\r
1249 #endif\r
1250         //printk("==>%s,RATRState:0x%02x ,RSSI:%d \n",__FUNCTION__,RATRState,RSSI);\r
1251 \r
1252         if( *pRATRState!=RATRState || bForceUpdate)\r
1253         {\r
1254                 ODM_RT_TRACE( pDM_Odm, ODM_COMP_RA_MASK, ODM_DBG_LOUD, ("RSSI Level %d -> %d\n", *pRATRState, RATRState) );\r
1255                 *pRATRState = RATRState;\r
1256                 return TRUE;\r
1257         }\r
1258 \r
1259         return FALSE;\r
1260 }\r
1261 \r
1262 #if(DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))\r
1263 VOID\r
1264 odm_RefreshBasicRateMask(\r
1265         IN      PVOID   pDM_VOID\r
1266         )\r
1267 {\r
1268 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\r
1269         PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
1270         PADAPTER                Adapter  =  pDM_Odm->Adapter;\r
1271         static u1Byte           Stage = 0;\r
1272         u1Byte                  CurStage = 0;\r
1273         OCTET_STRING    osRateSet;\r
1274         PMGNT_INFO              pMgntInfo = GetDefaultMgntInfo(Adapter);\r
1275         u1Byte                  RateSet[5] = {MGN_1M, MGN_2M, MGN_5_5M, MGN_11M, MGN_6M};\r
1276 \r
1277         if(pDM_Odm->SupportICType != ODM_RTL8812 && pDM_Odm->SupportICType != ODM_RTL8821 )\r
1278                 return;\r
1279 \r
1280         if(pDM_Odm->bLinked == FALSE)   // unlink Default port information\r
1281                 CurStage = 0;   \r
1282         else if(pDM_Odm->RSSI_Min < 40) // link RSSI  < 40%\r
1283                 CurStage = 1;\r
1284         else if(pDM_Odm->RSSI_Min > 45) // link RSSI > 45%\r
1285                 CurStage = 3;   \r
1286         else\r
1287                 CurStage = 2;                                   // link  25% <= RSSI <= 30%\r
1288 \r
1289         if(CurStage != Stage)\r
1290         {\r
1291                 if(CurStage == 1)\r
1292                 {\r
1293                         FillOctetString(osRateSet, RateSet, 5);\r
1294                         FilterSupportRate(pMgntInfo->mBrates, &osRateSet, FALSE);\r
1295                         Adapter->HalFunc.SetHwRegHandler(Adapter, HW_VAR_BASIC_RATE, (pu1Byte)&osRateSet);\r
1296                 }\r
1297                 else if(CurStage == 3 && (Stage == 1 || Stage == 2))\r
1298                 {\r
1299                         Adapter->HalFunc.SetHwRegHandler( Adapter, HW_VAR_BASIC_RATE, (pu1Byte)(&pMgntInfo->mBrates) );\r
1300                 }\r
1301         }\r
1302         \r
1303         Stage = CurStage;\r
1304 #endif\r
1305 }\r
1306 #endif  //#if(DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))\r
1307 \r
1308 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\r
1309 VOID\r
1310 ODM_DynamicARFBSelect(\r
1311         IN              PVOID           pDM_VOID,\r
1312         IN              u1Byte                  rate,\r
1313         IN              BOOLEAN                 Collision_State \r
1314 )\r
1315 {\r
1316         PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
1317         pRA_T                   pRA_Table = &pDM_Odm->DM_RA_Table;\r
1318 \r
1319         if(pDM_Odm->SupportICType != ODM_RTL8192E)\r
1320                 return;\r
1321 \r
1322         if(Collision_State == pRA_Table->PT_collision_pre)\r
1323                 return;\r
1324 \r
1325         if (rate >= DESC_RATEMCS8  && rate <= DESC_RATEMCS12){\r
1326                 if (Collision_State == 1){\r
1327                         if(rate == DESC_RATEMCS12){\r
1328 \r
1329                                 ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E, 0x0);\r
1330                                 ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E+4, 0x07060501);        \r
1331                         }\r
1332                         else if(rate == DESC_RATEMCS11){\r
1333 \r
1334                                 ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E, 0x0);\r
1335                                 ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E+4, 0x07070605);        \r
1336                         }\r
1337                         else if(rate == DESC_RATEMCS10){\r
1338 \r
1339                                 ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E, 0x0);\r
1340                                 ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E+4, 0x08080706);        \r
1341                         }\r
1342                         else if(rate == DESC_RATEMCS9){\r
1343 \r
1344                                 ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E, 0x0);\r
1345                                 ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E+4, 0x08080707);        \r
1346                         }\r
1347                         else{\r
1348 \r
1349                                 ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E, 0x0);\r
1350                                 ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E+4, 0x09090808);        \r
1351                         }\r
1352                 }\r
1353                 else{   // Collision_State == 0\r
1354                         if(rate == DESC_RATEMCS12){\r
1355 \r
1356                                 ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E, 0x05010000);\r
1357                                 ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E+4, 0x09080706);        \r
1358                         }\r
1359                         else if(rate == DESC_RATEMCS11){\r
1360 \r
1361                                 ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E, 0x06050000);\r
1362                                 ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E+4, 0x09080807);        \r
1363                         }\r
1364                         else if(rate == DESC_RATEMCS10){\r
1365 \r
1366                                 ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E, 0x07060000);\r
1367                                 ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E+4, 0x0a090908);        \r
1368                         }\r
1369                         else if(rate == DESC_RATEMCS9){\r
1370 \r
1371                                 ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E, 0x07070000);\r
1372                                 ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E+4, 0x0a090808);        \r
1373                         }\r
1374                         else{\r
1375 \r
1376                                 ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E, 0x08080000);\r
1377                                 ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E+4, 0x0b0a0909);        \r
1378                         }\r
1379                 }\r
1380         }\r
1381         else{  // MCS13~MCS15,  1SS, G-mode\r
1382                 if (Collision_State == 1){\r
1383                         if(rate == DESC_RATEMCS15){\r
1384 \r
1385                                 ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E, 0x00000000);\r
1386                                 ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E+4, 0x05040302);        \r
1387                         }\r
1388                         else if(rate == DESC_RATEMCS14){\r
1389 \r
1390                                 ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E, 0x00000000);\r
1391                                 ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E+4, 0x06050302);        \r
1392                         }\r
1393                         else if(rate == DESC_RATEMCS13){\r
1394 \r
1395                                 ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E, 0x00000000);\r
1396                                 ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E+4, 0x07060502);        \r
1397                         }\r
1398                         else{\r
1399 \r
1400                                 ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E, 0x00000000);\r
1401                                 ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E+4, 0x06050402);        \r
1402                         }\r
1403                 }\r
1404                 else{   // Collision_State == 0\r
1405                         if(rate == DESC_RATEMCS15){\r
1406 \r
1407                                 ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E, 0x03020000);\r
1408                                 ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E+4, 0x07060504);        \r
1409                         }\r
1410                         else if(rate == DESC_RATEMCS14){\r
1411 \r
1412                                 ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E, 0x03020000);\r
1413                                 ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E+4, 0x08070605);        \r
1414                         }\r
1415                         else if(rate == DESC_RATEMCS13){\r
1416 \r
1417                                 ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E, 0x05020000);\r
1418                                 ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E+4, 0x09080706);        \r
1419                         }\r
1420                         else{\r
1421 \r
1422                                 ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E, 0x04020000);\r
1423                                 ODM_Write4Byte(pDM_Odm, REG_DARFRC_8192E+4, 0x08070605);        \r
1424                         }\r
1425 \r
1426 \r
1427                 }\r
1428 \r
1429         }       \r
1430          pRA_Table->PT_collision_pre = Collision_State; \r
1431 }\r
1432 \r
1433 VOID\r
1434 ODM_RateAdaptiveStateApInit(    \r
1435         IN      PVOID           PADAPTER_VOID,\r
1436         IN      PRT_WLAN_STA    pEntry\r
1437         )\r
1438 {\r
1439         PADAPTER                Adapter = (PADAPTER)PADAPTER_VOID;\r
1440         pEntry->Ratr_State = DM_RATR_STA_INIT;\r
1441 }\r
1442 #endif //#if (DM_ODM_SUPPORT_TYPE == ODM_WIN)\r
1443 \r
1444 \r
1445 #if (DM_ODM_SUPPORT_TYPE == ODM_CE)\r
1446 u4Byte \r
1447 ODM_Get_Rate_Bitmap(\r
1448         IN      PVOID           pDM_VOID,       \r
1449         IN      u4Byte          macid,\r
1450         IN      u4Byte          ra_mask,        \r
1451         IN      u1Byte          rssi_level\r
1452         )\r
1453 {\r
1454         PDM_ODM_T               pDM_Odm = (PDM_ODM_T)pDM_VOID;\r
1455         PSTA_INFO_T     pEntry;\r
1456         u4Byte  rate_bitmap = 0;\r
1457         u1Byte  WirelessMode;\r
1458         //u1Byte        WirelessMode =*(pDM_Odm->pWirelessMode);\r
1459         \r
1460         \r
1461         pEntry = pDM_Odm->pODM_StaInfo[macid];\r
1462         if(!IS_STA_VALID(pEntry))\r
1463                 return ra_mask;\r
1464 \r
1465         WirelessMode = pEntry->wireless_mode;\r
1466         \r
1467         switch(WirelessMode)\r
1468         {\r
1469                 case ODM_WM_B:\r
1470                         if(ra_mask & 0x0000000c)                //11M or 5.5M enable                            \r
1471                                 rate_bitmap = 0x0000000d;\r
1472                         else\r
1473                                 rate_bitmap = 0x0000000f;\r
1474                         break;\r
1475                         \r
1476                 case (ODM_WM_G):\r
1477                 case (ODM_WM_A):\r
1478                         if(rssi_level == DM_RATR_STA_HIGH)\r
1479                                 rate_bitmap = 0x00000f00;\r
1480                         else\r
1481                                 rate_bitmap = 0x00000ff0;\r
1482                         break;\r
1483                         \r
1484                 case (ODM_WM_B|ODM_WM_G):\r
1485                         if(rssi_level == DM_RATR_STA_HIGH)\r
1486                                 rate_bitmap = 0x00000f00;\r
1487                         else if(rssi_level == DM_RATR_STA_MIDDLE)\r
1488                                 rate_bitmap = 0x00000ff0;\r
1489                         else\r
1490                                 rate_bitmap = 0x00000ff5;\r
1491                         break;          \r
1492 \r
1493                 case (ODM_WM_B|ODM_WM_G|ODM_WM_N24G)    :\r
1494                 case (ODM_WM_B|ODM_WM_N24G)     :\r
1495                 case (ODM_WM_G|ODM_WM_N24G)     :\r
1496                 case (ODM_WM_A|ODM_WM_N5G)      :\r
1497                         {                                       \r
1498                                 if (    pDM_Odm->RFType == ODM_1T2R ||pDM_Odm->RFType == ODM_1T1R)\r
1499                                 {\r
1500                                         if(rssi_level == DM_RATR_STA_HIGH)\r
1501                                         {\r
1502                                                 rate_bitmap = 0x000f0000;\r
1503                                         }\r
1504                                         else if(rssi_level == DM_RATR_STA_MIDDLE)\r
1505                                         {\r
1506                                                 rate_bitmap = 0x000ff000;\r
1507                                         }\r
1508                                         else{\r
1509                                                 if (*(pDM_Odm->pBandWidth) == ODM_BW40M)\r
1510                                                         rate_bitmap = 0x000ff015;\r
1511                                                 else\r
1512                                                         rate_bitmap = 0x000ff005;\r
1513                                         }                               \r
1514                                 }\r
1515                                 else\r
1516                                 {\r
1517                                         if(rssi_level == DM_RATR_STA_HIGH)\r
1518                                         {               \r
1519                                                 rate_bitmap = 0x0f8f0000;\r
1520                                         }\r
1521                                         else if(rssi_level == DM_RATR_STA_MIDDLE)\r
1522                                         {\r
1523                                                 rate_bitmap = 0x0f8ff000;\r
1524                                         }\r
1525                                         else\r
1526                                         {\r
1527                                                 if (*(pDM_Odm->pBandWidth) == ODM_BW40M)\r
1528                                                         rate_bitmap = 0x0f8ff015;\r
1529                                                 else\r
1530                                                         rate_bitmap = 0x0f8ff005;\r
1531                                         }                                       \r
1532                                 }\r
1533                         }\r
1534                         break;\r
1535 \r
1536                 case (ODM_WM_AC|ODM_WM_G):\r
1537                         if(rssi_level == 1)\r
1538                                 rate_bitmap = 0xfc3f0000;\r
1539                         else if(rssi_level == 2)\r
1540                                 rate_bitmap = 0xfffff000;\r
1541                         else\r
1542                                 rate_bitmap = 0xffffffff;\r
1543                         break;\r
1544 \r
1545                 case (ODM_WM_AC|ODM_WM_A):\r
1546 \r
1547                         if (pDM_Odm->RFType == RF_1T1R)\r
1548                         {\r
1549                                 if(rssi_level == 1)                             // add by Gary for ac-series\r
1550                                         rate_bitmap = 0x003f8000;\r
1551                                 else if (rssi_level == 2)\r
1552                                         rate_bitmap = 0x003ff000;\r
1553                                 else\r
1554                                         rate_bitmap = 0x003ff010;\r
1555                         }\r
1556                         else\r
1557                         {\r
1558                                 if(rssi_level == 1)                             // add by Gary for ac-series\r
1559                                         rate_bitmap = 0xfe3f8000;       // VHT 2SS MCS3~9\r
1560                                 else if (rssi_level == 2)\r
1561                                         rate_bitmap = 0xfffff000;       // VHT 2SS MCS0~9\r
1562                                 else\r
1563                                         rate_bitmap = 0xfffff010;       // All\r
1564                         }\r
1565                         break;\r
1566                         \r
1567                 default:\r
1568                         if(pDM_Odm->RFType == RF_1T2R)\r
1569                                 rate_bitmap = 0x000fffff;\r
1570                         else\r
1571                                 rate_bitmap = 0x0fffffff;\r
1572                         break;  \r
1573 \r
1574         }\r
1575 \r
1576         //printk("%s ==> rssi_level:0x%02x, WirelessMode:0x%02x, rate_bitmap:0x%08x \n",__FUNCTION__,rssi_level,WirelessMode,rate_bitmap);\r
1577         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
1578 \r
1579         return (ra_mask&rate_bitmap);\r
1580         \r
1581 }       \r
1582 \r
1583 #endif //#if (DM_ODM_SUPPORT_TYPE == ODM_CE)