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