2 Copyright (c) Realtek Semiconductor Corp. All rights reserved.
8 Implement Rate Adaptive functions for common operations.
12 ---------- --------------- -------------------------------
13 2011-08-12 Page Create.
16 #include "mp_precomp.h"
18 #include "../phydm_precomp.h"
21 #if (RATE_ADAPTIVE_SUPPORT == 1)
22 // Rate adaptive parameters
23 #define RA_RATE_LEVEL 2
26 static u1Byte RETRY_PENALTY[PERENTRY][RETRYSIZE+1] = {{5,4,3,2,0,3},//92 , idx=0
27 {6,5,4,3,0,4},//86 , idx=1
28 {6,5,4,2,0,4},//81 , idx=2
29 {8,7,6,4,0,6},//75 , idx=3
30 #if (DM_ODM_SUPPORT_TYPE == ODM_AP) && \
31 ((DEV_BUS_TYPE == RT_USB_INTERFACE) || (DEV_BUS_TYPE == RT_SDIO_INTERFACE))
32 {10, 9, 7, 6, 0, 8},/*71 , idx=4*/
33 {10, 9, 7, 4, 0, 8},/*66 , idx=5*/
35 {10, 9, 8, 6, 0, 8},/*71 , idx=4*/
36 {10, 9, 8, 4, 0, 8},/*66 , idx=5*/
38 {10,9,8,2,0,8},//62 , idx=6
39 {10,9,8,0,0,8},//59 , idx=7
40 {18,17,16,8,0,16},//53 , idx=8
41 {26,25,24,16,0,24},//50 , idx=9
42 {34,33,32,24,0,32},//47 , idx=0x0a
43 //{34,33,32,16,0,32},//43 , idx=0x0b
44 //{34,33,32,8,0,32},//40 , idx=0x0c
45 //{34,33,28,8,0,32},//37 , idx=0x0d
46 //{34,33,20,8,0,32},//32 , idx=0x0e
47 //{34,32,24,8,0,32},//26 , idx=0x0f
48 //{49,48,32,16,0,48},//20 , idx=0x10
49 //{49,48,24,0,0,48},//17 , idx=0x11
50 //{49,47,16,16,0,48},//15 , idx=0x12
51 //{49,44,16,16,0,48},//12 , idx=0x13
52 //{49,40,16,0,0,48},//9 , idx=0x14
53 {34,31,28,20,0,32},//43 , idx=0x0b
54 {34,31,27,18,0,32},//40 , idx=0x0c
55 {34,31,26,16,0,32},//37 , idx=0x0d
56 {34,30,22,16,0,32},//32 , idx=0x0e
57 {34,30,24,16,0,32},//26 , idx=0x0f
58 {49,46,40,16,0,48},//20 , idx=0x10
59 {49,45,32,0,0,48},//17 , idx=0x11
60 {49,45,22,18,0,48},//15 , idx=0x12
61 #if (DM_ODM_SUPPORT_TYPE == ODM_AP)
62 {49,40,28,18,0,48},//12 , idx=0x13
63 {49,34,20,16,0,48},//9 , idx=0x14
65 {49,40,24,16,0,48},//12 , idx=0x13
66 {49,32,18,12,0,48},//9 , idx=0x14
68 {49,22,18,14,0,48},//6 , idx=0x15
69 {49,16,16,0,0,48}};//3 //3, idx=0x16
71 static u1Byte RETRY_PENALTY_UP[RETRYSIZE+1]={49,44,16,16,0,48}; // 12% for rate up
73 static u1Byte PT_PENALTY[RETRYSIZE+1]={34,31,30,24,0,32};
76 static u1Byte RETRY_PENALTY_IDX[2][RATESIZE] = {{4,4,4,5,4,4,5,7,7,7,8,0x0a, // SS>TH
77 4,4,4,4,6,0x0a,0x0b,0x0d,
78 5,5,7,7,8,0x0b,0x0d,0x0f}, // 0329 R01
79 {4,4,4,5,7,7,9,9,0x0c,0x0e,0x10,0x12, // SS<TH
80 4,4,5,5,6,0x0a,0x11,0x13,
81 9,9,9,9,0x0c,0x0e,0x11,0x13}};
85 #if (DM_ODM_SUPPORT_TYPE & ODM_AP)
86 static u1Byte RETRY_PENALTY_IDX[2][RATESIZE] = {{4,4,4,5,4,4,5,7,7,7,8,0x0a, // SS>TH
87 #if (DEV_BUS_TYPE == RT_USB_INTERFACE) || (DEV_BUS_TYPE == RT_SDIO_INTERFACE)
88 4, 4, 4, 4, 0x0d, 0x0d, 0x0f, 0x0f,
90 4,4,4,4,6,0x0a,0x0b,0x0d,
92 5,5,7,7,8,0x0b,0x0d,0x0f}, // 0329 R01
93 {0x0a,0x0a,0x0a,0x0a,0x0c,0x0c,0x0e,0x10,0x11,0x12,0x12,0x13, // SS<TH
94 0x0e,0x0f,0x10,0x10,0x11,0x14,0x14,0x15,
95 9,9,9,9,0x0c,0x0e,0x11,0x13}};
97 static u1Byte RETRY_PENALTY_UP_IDX[RATESIZE] = {0x10,0x10,0x10,0x10,0x11,0x11,0x12,0x12,0x12,0x13,0x13,0x14, // SS>TH
98 0x13,0x13,0x14,0x14,0x15,0x15,0x15,0x15,
99 0x11,0x11,0x12,0x13,0x13,0x13,0x14,0x15};
101 static u1Byte RSSI_THRESHOLD[RATESIZE] = {0,0,0,0,
102 0,0,0,0,0,0x24,0x26,0x2a,
103 0x13,0x15,0x17,0x18,0x1a,0x1c,0x1d,0x1f,
104 0,0,0,0x1f,0x23,0x28,0x2a,0x2c};
108 /*static u1Byte RETRY_PENALTY_IDX[2][RATESIZE] = {{4,4,4,5,4,4,5,7,7,7,8,0x0a, // SS>TH
109 4,4,4,4,6,0x0a,0x0b,0x0d,
110 5,5,7,7,8,0x0b,0x0d,0x0f}, // 0329 R01
111 {0x0a,0x0a,0x0b,0x0c,0x0a,0x0a,0x0b,0x0c,0x0d,0x10,0x13,0x14, // SS<TH
112 0x0b,0x0c,0x0d,0x0e,0x0f,0x11,0x13,0x15,
113 9,9,9,9,0x0c,0x0e,0x11,0x13}}; */
115 static u1Byte RETRY_PENALTY_IDX[2][RATESIZE] = {{4,4,4,5,4,4,5,7,7,7,8,0x0a, // SS>TH
116 4,4,4,4,6,0x0a,0x0b,0x0d,
117 5,5,7,7,8,0x0b,0x0d,0x0f}, // 0329 R01
118 {0x0a,0x0a,0x0b,0x0c,0x0a,0x0a,0x0b,0x0c,0x0d,0x10,0x13,0x13, // SS<TH
119 0x0b,0x0c,0x0d,0x0e,0x0f,0x11,0x13,0x13,
120 9,9,9,9,0x0c,0x0e,0x11,0x13}};
121 #if (RA_RATE_LEVEL == 0)
122 static u1Byte RETRY_PENALTY_UP_IDX[RATESIZE] = {0x0c,0x0d,0x0d,0x0f,0x0d,0x0e,0x0f,0x0f,0x10,0x12,0x13,0x14, // SS>TH
123 0x0f,0x10,0x10,0x12,0x12,0x13,0x14,0x15,
124 0x11,0x11,0x12,0x13,0x13,0x13,0x14,0x15};
125 #elif (RA_RATE_LEVEL == 1)
126 static u1Byte RETRY_PENALTY_UP_IDX[RATESIZE] = {0x0c,0x0d,0x0d,0x0f,0x0d,0x0e,0x0f,0x0f,0x10,0x12,0x13,0x13, // SS>TH
127 0x0f,0x10,0x10,0x12,0x12,0x13,0x13,0x14,
128 0x11,0x11,0x12,0x13,0x13,0x13,0x13,0x14};
129 #elif (RA_RATE_LEVEL == 2)
130 static u1Byte RETRY_PENALTY_UP_IDX[RATESIZE] = {0x0c,0x0d,0x0d,0x0f,0x0d,0x0e,0x0f,0x0f,0x10,0x12,0x13,0x13, // SS>TH
131 0x0f,0x10,0x10,0x12,0x12,0x12,0x12,0x13,
132 0x11,0x11,0x12,0x12,0x12,0x12,0x12,0x13};
135 static u1Byte RSSI_THRESHOLD[RATESIZE] = {0,0,0,0,
136 0,0,0,0,0,0x24,0x26,0x2a,
137 0x18,0x1a,0x1d,0x1f,0x21,0x27,0x29,0x2a,
138 0,0,0,0x1f,0x23,0x28,0x2a,0x2c};
142 /*static u1Byte RSSI_THRESHOLD[RATESIZE] = {0,0,0,0,
143 0,0,0,0,0,0x24,0x26,0x2a,
144 0x1a,0x1c,0x1e,0x21,0x24,0x2a,0x2b,0x2d,
145 0,0,0,0x1f,0x23,0x28,0x2a,0x2c};*/
146 /*static u2Byte N_THRESHOLD_HIGH[RATESIZE] = {4,4,8,16,
147 24,36,48,72,96,144,192,216,
148 60,80,100,160,240,400,560,640,
149 300,320,480,720,1000,1200,1600,2000};
150 static u2Byte N_THRESHOLD_LOW[RATESIZE] = {2,2,4,8,
151 12,18,24,36,48,72,96,108,
152 30,40,50,80,120,200,280,320,
153 150,160,240,360,500,600,800,1000};*/
154 static u2Byte N_THRESHOLD_HIGH[RATESIZE] = {4,4,8,16,
155 24,36,48,72,96,144,192,216,
156 60,80,100,160,240,400,600,800,
157 300,320,480,720,1000,1200,1600,2000};
158 static u2Byte N_THRESHOLD_LOW[RATESIZE] = {2,2,4,8,
159 12,18,24,36,48,72,96,108,
160 30,40,50,80,120,200,300,400,
161 150,160,240,360,500,600,800,1000};
163 static u1Byte TRYING_NECESSARY[RATESIZE] = {2,2,2,2,
165 4,4,7,10,10,12,12,18,
166 5,7,7,8,11,18,36,60}; // 0329 // 1207
168 static u1Byte POOL_RETRY_TH[RATESIZE] = {30,30,30,30,
169 30,30,25,25,20,15,15,10,
170 30,25,25,20,15,10,10,10,
171 30,25,25,20,15,10,10,10};
174 static u1Byte DROPING_NECESSARY[RATESIZE] = {1,1,1,1,
180 static u4Byte INIT_RATE_FALLBACK_TABLE[16]={0x0f8ff015, // 0: 40M BGN mode
181 0x0f8ff010, // 1: 40M GN mode
182 0x0f8ff005, // 2: BN mode/ 40M BGN mode
183 0x0f8ff000, // 3: N mode
184 0x00000ff5, // 4: BG mode
185 0x00000ff0, // 5: G mode
186 0x0000000d, // 6: B mode
198 static u1Byte PendingForRateUpFail[5]={2,10,24,36,48};
199 static u2Byte DynamicTxRPTTiming[6]={0x186a, 0x30d4, 0x493e, 0x61a8, 0x7a12 ,0x927c}; // 200ms 400 / 600 / 8000 / 1000 -1200ms
201 // End Rate adaptive parameters
203 #if (DM_ODM_SUPPORT_TYPE == ODM_AP) && \
204 ((DEV_BUS_TYPE == RT_USB_INTERFACE) || (DEV_BUS_TYPE == RT_SDIO_INTERFACE))
206 odm_RA_LearnBounding(
207 IN PDM_ODM_T pDM_Odm,
208 IN PODM_RA_INFO_T pRaInfo
212 if (DM_RA_RATE_UP != pRaInfo->RateDirection) {
213 /* Check if previous RA adjustment trend as +++--- or ++++----*/
214 if (((3 == pRaInfo->RateUpCounter && pRaInfo->BoundingLearningTime <= 10)
215 || (4 == pRaInfo->RateUpCounter && pRaInfo->BoundingLearningTime <= 16))
216 && (pRaInfo->RateUpCounter == pRaInfo->RateDownCounter)) {
217 if (1 != pRaInfo->BoundingType) {
218 pRaInfo->BoundingType = 1;
219 pRaInfo->BoundingCounter = 0;
221 pRaInfo->BoundingCounter++;
222 /* Check if previous RA adjustment trend as ++--*/
223 } else if ((2 == pRaInfo->RateUpCounter) && (pRaInfo->BoundingLearningTime <= 7)
224 && (pRaInfo->RateUpCounter == pRaInfo->RateDownCounter)) {
225 if (2 != pRaInfo->BoundingType) {
226 pRaInfo->BoundingType = 2;
227 pRaInfo->BoundingCounter = 0;
229 pRaInfo->BoundingCounter++;
230 /* Check if previous RA adjustment trend as +++++-----*/
231 } else if ((5 == pRaInfo->RateUpCounter) && (pRaInfo->BoundingLearningTime <= 17)
232 && (pRaInfo->RateUpCounter == pRaInfo->RateDownCounter)) {
233 if (3 != pRaInfo->BoundingType) {
234 pRaInfo->BoundingType = 3;
235 pRaInfo->BoundingCounter = 0;
237 pRaInfo->BoundingCounter++;
239 pRaInfo->BoundingType = 0;
242 pRaInfo->RateDownCounter = 0;
243 pRaInfo->RateUpCounter = 0;
244 pRaInfo->BoundingLearningTime = 1;
245 } else if (pRaInfo->BoundingType) {
246 /* Check if RA adjustment trend as +++---++(+) or ++++----++(+)*/
247 if ((1 == pRaInfo->BoundingType) && (1 == pRaInfo->BoundingCounter)
248 && (2 == pRaInfo->RateUpCounter)) {
249 pRaInfo->BoundingType = 0;
250 if (pRaInfo->BoundingLearningTime <= 5)
252 /* Check if RA adjustment trend as ++--++--+(+)*/
253 } else if ((2 == pRaInfo->BoundingType) && (2 == pRaInfo->BoundingCounter)
254 && (1 == pRaInfo->RateUpCounter)) {
255 pRaInfo->BoundingType = 0;
256 if (pRaInfo->BoundingLearningTime <= 2)
258 /* Check if RA adjustment trend as +++++-----++(+)*/
259 } else if ((3 == pRaInfo->BoundingType) && (1 == pRaInfo->BoundingCounter)
260 && (2 == pRaInfo->RateUpCounter)) {
261 pRaInfo->BoundingType = 0;
262 if (pRaInfo->BoundingLearningTime <= 4)
272 odm_SetTxRPTTiming_8188E(
273 IN PDM_ODM_T pDM_Odm,
274 IN PODM_RA_INFO_T pRaInfo,
280 for(idx=0; idx<5; idx++)
281 if(DynamicTxRPTTiming[idx] == pRaInfo->RptTime)
284 if (extend==0) // back to default timing
286 else if (extend==1) {// increase the timing
291 else if (extend==2) {// decrease the timing
295 pRaInfo->RptTime=DynamicTxRPTTiming[idx];
297 ODM_RT_TRACE(pDM_Odm,ODM_COMP_RATE_ADAPTIVE, ODM_DBG_LOUD, ("pRaInfo->RptTime=0x%x\n", pRaInfo->RptTime));
302 IN PDM_ODM_T pDM_Odm,
303 IN PODM_RA_INFO_T pRaInfo
306 u1Byte RateID, LowestRate, HighestRate;
309 ODM_RT_TRACE(pDM_Odm,ODM_COMP_RATE_ADAPTIVE, ODM_DBG_TRACE, ("=====>odm_RateDown_8188E()\n"));
312 ODM_RT_TRACE(pDM_Odm,ODM_COMP_RATE_ADAPTIVE, ODM_DBG_LOUD, ("odm_RateDown_8188E(): pRaInfo is NULL\n"));
315 RateID = pRaInfo->PreRate;
316 LowestRate = pRaInfo->LowestRate;
317 HighestRate = pRaInfo->HighestRate;
319 ODM_RT_TRACE(pDM_Odm,ODM_COMP_RATE_ADAPTIVE, ODM_DBG_TRACE,
320 (" RateID=%d LowestRate=%d HighestRate=%d RateSGI=%d\n",
321 RateID, LowestRate, HighestRate, pRaInfo->RateSGI));
322 if (RateID > HighestRate)
326 else if(pRaInfo->RateSGI)
330 else if (RateID > LowestRate)
333 for (i = RateID - 1; i >= LowestRate; i--) {
334 if (pRaInfo->RAUseRate & BIT(i)) {
335 #if (DM_ODM_SUPPORT_TYPE == ODM_AP) && \
336 ((DEV_BUS_TYPE == RT_USB_INTERFACE) || (DEV_BUS_TYPE == RT_SDIO_INTERFACE))
337 pRaInfo->RateDownCounter++;
338 pRaInfo->RateDirection = DM_RA_RATE_DOWN;
340 /* Learning +(0)-(-)(-)+ and ++(0)--(-)(-)(0)+ after the persistence of learned TX rate expire*/
341 if (0xFF == pRaInfo->RateDownStartTime) {
342 if ((0 == pRaInfo->RateUpCounter) || (pRaInfo->RateUpCounter+2 < pRaInfo->BoundingLearningTime))
343 pRaInfo->RateDownStartTime = 0;
345 pRaInfo->RateDownStartTime = pRaInfo->BoundingLearningTime;
355 else if (RateID <= LowestRate)
360 #if (DM_ODM_SUPPORT_TYPE == ODM_AP) && \
361 ((DEV_BUS_TYPE == RT_USB_INTERFACE) || (DEV_BUS_TYPE == RT_SDIO_INTERFACE))
362 if (pRaInfo->RTY[2] >= 100) {
363 pRaInfo->RAWaitingCounter = 2;
364 pRaInfo->RAPendingCounter += 1;
365 } else if ((0 != pRaInfo->RateDownStartTime) && (0xFF != pRaInfo->RateDownStartTime)) {
366 /* Learning +(0)-(-)(-)+ and ++(0)--(-)(-)(0)+ after the persistence of learned TX rate expire*/
367 if (pRaInfo->RateDownCounter < pRaInfo->RateUpCounter) {
369 } else if (pRaInfo->RateDownCounter == pRaInfo->RateUpCounter) {
370 pRaInfo->RAWaitingCounter = 2;
371 if (1 == pRaInfo->RateUpCounter)
372 pRaInfo->RAPendingCounter += 1;
374 pRaInfo->RAPendingCounter = 2;
375 } else if (pRaInfo->RateDownCounter <= pRaInfo->RateUpCounter+2) {
376 RateID = pRaInfo->PreRate; /* Don't rate down in this tolerant time*/
378 pRaInfo->RAWaitingCounter = 0;
379 pRaInfo->RAPendingCounter = 0;
380 pRaInfo->RateDownStartTime = 0;
384 if (pRaInfo->RAWaitingCounter==1){
385 pRaInfo->RAWaitingCounter+=1;
386 pRaInfo->RAPendingCounter+=1;
388 else if(pRaInfo->RAWaitingCounter==0){
391 pRaInfo->RAWaitingCounter=0;
392 pRaInfo->RAPendingCounter=0;
395 if(pRaInfo->RAPendingCounter>=4)
396 pRaInfo->RAPendingCounter=4;
398 pRaInfo->DecisionRate=RateID;
399 odm_SetTxRPTTiming_8188E(pDM_Odm,pRaInfo, 2);
400 ODM_RT_TRACE(pDM_Odm, ODM_COMP_RATE_ADAPTIVE, ODM_DBG_LOUD, ("Rate down, Decrease RPT Timing\n"));
401 ODM_RT_TRACE(pDM_Odm, ODM_COMP_RATE_ADAPTIVE, ODM_DBG_TRACE, ("RAWaitingCounter %d, RAPendingCounter %d", pRaInfo->RAWaitingCounter, pRaInfo->RAPendingCounter));
402 ODM_RT_TRACE(pDM_Odm, ODM_COMP_RATE_ADAPTIVE, ODM_DBG_LOUD, ("Rate down to RateID %d RateSGI %d\n", RateID, pRaInfo->RateSGI));
403 ODM_RT_TRACE(pDM_Odm, ODM_COMP_RATE_ADAPTIVE, ODM_DBG_TRACE, ("<=====odm_RateDown_8188E()\n"));
409 IN PDM_ODM_T pDM_Odm,
410 IN PODM_RA_INFO_T pRaInfo
413 u1Byte RateID, HighestRate;
416 ODM_RT_TRACE(pDM_Odm,ODM_COMP_RATE_ADAPTIVE, ODM_DBG_TRACE, ("=====>odm_RateUp_8188E() \n"));
419 ODM_RT_TRACE(pDM_Odm,ODM_COMP_RATE_ADAPTIVE, ODM_DBG_LOUD, ("odm_RateUp_8188E(): pRaInfo is NULL\n"));
422 RateID = pRaInfo->PreRate;
423 HighestRate = pRaInfo->HighestRate;
424 ODM_RT_TRACE(pDM_Odm,ODM_COMP_RATE_ADAPTIVE, ODM_DBG_TRACE,
425 (" RateID=%d HighestRate=%d\n",
426 RateID, HighestRate));
427 if (pRaInfo->RAWaitingCounter==1){
428 pRaInfo->RAWaitingCounter=0;
429 pRaInfo->RAPendingCounter=0;
431 else if (pRaInfo->RAWaitingCounter>1){
432 pRaInfo->PreRssiStaRA=pRaInfo->RssiStaRA;
433 #if (DM_ODM_SUPPORT_TYPE == ODM_AP) && \
434 ((DEV_BUS_TYPE == RT_USB_INTERFACE) || (DEV_BUS_TYPE == RT_SDIO_INTERFACE))
435 pRaInfo->RateDownStartTime = 0;
439 odm_SetTxRPTTiming_8188E(pDM_Odm,pRaInfo, 0);
440 ODM_RT_TRACE(pDM_Odm, ODM_COMP_RATE_ADAPTIVE, ODM_DBG_LOUD, ("odm_RateUp_8188E(): default RPT Timing\n"));
442 if (RateID < HighestRate)
444 for (i=RateID+1; i<=HighestRate; i++)
446 if (pRaInfo->RAUseRate & BIT(i))
448 #if (DM_ODM_SUPPORT_TYPE == ODM_AP) && \
449 ((DEV_BUS_TYPE == RT_USB_INTERFACE) || (DEV_BUS_TYPE == RT_SDIO_INTERFACE))
450 if (odm_RA_LearnBounding(pDM_Odm, pRaInfo)) {
451 pRaInfo->RAWaitingCounter = 2;
452 pRaInfo->RAPendingCounter = 1;
455 pRaInfo->RateUpCounter++;
456 pRaInfo->RateDirection = DM_RA_RATE_UP;
463 else if(RateID == HighestRate)
465 if (pRaInfo->SGIEnable && (pRaInfo->RateSGI != 1))
466 pRaInfo->RateSGI = 1;
467 else if((pRaInfo->SGIEnable) !=1 )
468 pRaInfo->RateSGI = 0;
470 else //if((sta_info_ra->Decision_rate) > (sta_info_ra->Highest_rate))
472 RateID = HighestRate;
476 //if(pRaInfo->RAWaitingCounter==10)
477 if (pRaInfo->RAWaitingCounter == (4 + PendingForRateUpFail[pRaInfo->RAPendingCounter])) {
478 pRaInfo->RAWaitingCounter=0;
479 #if (DM_ODM_SUPPORT_TYPE == ODM_AP) && \
480 ((DEV_BUS_TYPE == RT_USB_INTERFACE) || (DEV_BUS_TYPE == RT_SDIO_INTERFACE))
481 /* Mark persistence expiration state*/
482 pRaInfo->RateDownStartTime = 0xFF;
483 /* Clear state to avoid wrong bounding check*/
484 pRaInfo->RateDownCounter = 0;
485 pRaInfo->RateUpCounter = 0;
486 pRaInfo->RateDirection = 0;
490 pRaInfo->RAWaitingCounter++;
492 pRaInfo->DecisionRate=RateID;
493 ODM_RT_TRACE(pDM_Odm,ODM_COMP_RATE_ADAPTIVE, ODM_DBG_LOUD, ("Rate up to RateID %d\n", RateID));
494 ODM_RT_TRACE(pDM_Odm,ODM_COMP_RATE_ADAPTIVE, ODM_DBG_TRACE, ("RAWaitingCounter %d, RAPendingCounter %d",pRaInfo->RAWaitingCounter,pRaInfo->RAPendingCounter));
495 ODM_RT_TRACE(pDM_Odm,ODM_COMP_RATE_ADAPTIVE, ODM_DBG_TRACE, ("<=====odm_RateUp_8188E() \n"));
499 static void odm_ResetRaCounter_8188E( IN PODM_RA_INFO_T pRaInfo){
501 RateID=pRaInfo->DecisionRate;
502 pRaInfo->NscUp=(N_THRESHOLD_HIGH[RateID]+N_THRESHOLD_LOW[RateID])>>1;
503 pRaInfo->NscDown=(N_THRESHOLD_HIGH[RateID]+N_THRESHOLD_LOW[RateID])>>1;
507 odm_RateDecision_8188E(
508 IN PDM_ODM_T pDM_Odm,
509 IN PODM_RA_INFO_T pRaInfo
512 u1Byte RateID = 0, RtyPtID = 0, PenaltyID1 = 0, PenaltyID2 = 0;
514 static u1Byte DynamicTxRPTTimingCounter=0;
516 ODM_RT_TRACE(pDM_Odm,ODM_COMP_RATE_ADAPTIVE, ODM_DBG_TRACE, ("=====>odm_RateDecision_8188E() \n"));
518 if (pRaInfo->Active && (pRaInfo->TOTAL > 0)) // STA used and data packet exits
520 #if (DM_ODM_SUPPORT_TYPE == ODM_AP) && \
521 ((DEV_BUS_TYPE == RT_USB_INTERFACE) || (DEV_BUS_TYPE == RT_SDIO_INTERFACE))
522 if (((pRaInfo->RssiStaRA <= 17) && (pRaInfo->RssiStaRA > pRaInfo->PreRssiStaRA))
523 || ((pRaInfo->PreRssiStaRA <= 17) && (pRaInfo->PreRssiStaRA > pRaInfo->RssiStaRA))) {
524 /* don't reset state in low signal due to the power different between CCK and MCS is large.*/
527 if ( (pRaInfo->RssiStaRA<(pRaInfo->PreRssiStaRA-3))|| (pRaInfo->RssiStaRA>(pRaInfo->PreRssiStaRA+3))){
528 pRaInfo->PreRssiStaRA = pRaInfo->RssiStaRA;
529 pRaInfo->RAWaitingCounter=0;
530 pRaInfo->RAPendingCounter=0;
531 #if (DM_ODM_SUPPORT_TYPE == ODM_AP) && \
532 ((DEV_BUS_TYPE == RT_USB_INTERFACE) || (DEV_BUS_TYPE == RT_SDIO_INTERFACE))
533 pRaInfo->BoundingType = 0;
534 pRaInfo->RateDownStartTime = 0;
538 #if (DM_ODM_SUPPORT_TYPE & ODM_AP)
539 if (0xff != pDM_Odm->priv->pshare->rf_ft_var.txforce) {
540 pRaInfo->PreRate = pDM_Odm->priv->pshare->rf_ft_var.txforce;
541 odm_ResetRaCounter_8188E(pRaInfo);
546 if (pRaInfo->PreRate > pRaInfo->HighestRate)
547 RateID = pRaInfo->HighestRate;
549 RateID = pRaInfo->PreRate;
550 if (pRaInfo->RssiStaRA > RSSI_THRESHOLD[RateID])
554 PenaltyID1 = RETRY_PENALTY_IDX[RtyPtID][RateID]; //TODO by page
556 ODM_RT_TRACE(pDM_Odm,ODM_COMP_RATE_ADAPTIVE, ODM_DBG_TRACE,
557 (" NscDown init is %d\n", pRaInfo->NscDown));
558 //pool_retry=pRaInfo->RTY[2]+pRaInfo->RTY[3]+pRaInfo->RTY[4]+pRaInfo->DROP;
559 pRaInfo->NscDown += pRaInfo->RTY[0] * RETRY_PENALTY[PenaltyID1][0];
560 pRaInfo->NscDown += pRaInfo->RTY[1] * RETRY_PENALTY[PenaltyID1][1];
561 pRaInfo->NscDown += pRaInfo->RTY[2] * RETRY_PENALTY[PenaltyID1][2];
562 pRaInfo->NscDown += pRaInfo->RTY[3] * RETRY_PENALTY[PenaltyID1][3];
563 pRaInfo->NscDown += pRaInfo->RTY[4] * RETRY_PENALTY[PenaltyID1][4];
564 ODM_RT_TRACE(pDM_Odm,ODM_COMP_RATE_ADAPTIVE, ODM_DBG_TRACE,
565 (" NscDown is %d, total*penalty[5] is %d\n",
566 pRaInfo->NscDown, (pRaInfo->TOTAL * RETRY_PENALTY[PenaltyID1][5])));
567 if (pRaInfo->NscDown > (pRaInfo->TOTAL * RETRY_PENALTY[PenaltyID1][5]))
568 pRaInfo->NscDown -= pRaInfo->TOTAL * RETRY_PENALTY[PenaltyID1][5];
573 PenaltyID2 = RETRY_PENALTY_UP_IDX[RateID];
574 ODM_RT_TRACE(pDM_Odm,ODM_COMP_RATE_ADAPTIVE, ODM_DBG_TRACE,
575 (" NscUp init is %d\n", pRaInfo->NscUp));
576 pRaInfo->NscUp += pRaInfo->RTY[0] * RETRY_PENALTY[PenaltyID2][0];
577 pRaInfo->NscUp += pRaInfo->RTY[1] * RETRY_PENALTY[PenaltyID2][1];
578 pRaInfo->NscUp += pRaInfo->RTY[2] * RETRY_PENALTY[PenaltyID2][2];
579 pRaInfo->NscUp += pRaInfo->RTY[3] * RETRY_PENALTY[PenaltyID2][3];
580 pRaInfo->NscUp += pRaInfo->RTY[4] * RETRY_PENALTY[PenaltyID2][4];
581 ODM_RT_TRACE(pDM_Odm,ODM_COMP_RATE_ADAPTIVE, ODM_DBG_TRACE,
582 ("NscUp is %d, total*up[5] is %d\n",
583 pRaInfo->NscUp, (pRaInfo->TOTAL * RETRY_PENALTY[PenaltyID2][5])));
584 if (pRaInfo->NscUp > (pRaInfo->TOTAL * RETRY_PENALTY[PenaltyID2][5]))
585 pRaInfo->NscUp -= pRaInfo->TOTAL * RETRY_PENALTY[PenaltyID2][5];
589 ODM_RT_TRACE(pDM_Odm,ODM_COMP_RATE_ADAPTIVE|ODM_COMP_INIT, ODM_DBG_LOUD,
590 (" RssiStaRa= %d RtyPtID=%d PenaltyID1=0x%x PenaltyID2=0x%x RateID=%d NscDown=%d NscUp=%d SGI=%d\n",
591 pRaInfo->RssiStaRA,RtyPtID, PenaltyID1,PenaltyID2, RateID, pRaInfo->NscDown, pRaInfo->NscUp, pRaInfo->RateSGI));
592 #if (DM_ODM_SUPPORT_TYPE == ODM_AP) && \
593 ((DEV_BUS_TYPE == RT_USB_INTERFACE) || (DEV_BUS_TYPE == RT_SDIO_INTERFACE))
594 if (0xFF != pRaInfo->BoundingLearningTime)
595 pRaInfo->BoundingLearningTime++;
597 if ((pRaInfo->NscDown < N_THRESHOLD_LOW[RateID]) ||(pRaInfo->DROP>DROPING_NECESSARY[RateID]))
598 odm_RateDown_8188E(pDM_Odm,pRaInfo);
599 //else if ((pRaInfo->NscUp > N_THRESHOLD_HIGH[RateID])&&(pool_retry<POOL_RETRY_TH[RateID]))
600 else if (pRaInfo->NscUp > N_THRESHOLD_HIGH[RateID])
601 odm_RateUp_8188E(pDM_Odm,pRaInfo);
602 #if (DM_ODM_SUPPORT_TYPE == ODM_AP) && \
603 ((DEV_BUS_TYPE == RT_USB_INTERFACE) || (DEV_BUS_TYPE == RT_SDIO_INTERFACE))
604 else if ((pRaInfo->RTY[2] >= 100) && (ODM_BW20M == *pDM_Odm->pBandWidth))
605 odm_RateDown_8188E(pDM_Odm, pRaInfo);
608 if ((pRaInfo->DecisionRate)==(pRaInfo->PreRate))
609 DynamicTxRPTTimingCounter+=1;
611 DynamicTxRPTTimingCounter=0;
613 if (DynamicTxRPTTimingCounter>=4) {
614 odm_SetTxRPTTiming_8188E(pDM_Odm,pRaInfo, 1);
615 ODM_RT_TRACE(pDM_Odm,ODM_COMP_RATE_ADAPTIVE, ODM_DBG_LOUD, ("<=====Rate don't change 4 times, Extend RPT Timing\n"));
616 DynamicTxRPTTimingCounter=0;
619 pRaInfo->PreRate = pRaInfo->DecisionRate; //YJ,add,120120
621 odm_ResetRaCounter_8188E( pRaInfo);
623 ODM_RT_TRACE(pDM_Odm,ODM_COMP_RATE_ADAPTIVE, ODM_DBG_TRACE, ("<=====odm_RateDecision_8188E() \n"));
627 odm_ARFBRefresh_8188E(
628 IN PDM_ODM_T pDM_Odm,
629 IN PODM_RA_INFO_T pRaInfo
631 { // Wilson 2011/10/26
635 switch(pRaInfo->RateID){
636 case RATR_INX_WIRELESS_NGB:
637 pRaInfo->RAUseRate = (pRaInfo->RateMask)&0x0f8fe00f;
639 case RATR_INX_WIRELESS_NG:
640 pRaInfo->RAUseRate = (pRaInfo->RateMask)&0x0f8ff010;
642 case RATR_INX_WIRELESS_NB:
643 pRaInfo->RAUseRate = (pRaInfo->RateMask)&0x0f8fe00f;
645 case RATR_INX_WIRELESS_N:
646 pRaInfo->RAUseRate = (pRaInfo->RateMask)&0x0f8ff000;
648 case RATR_INX_WIRELESS_GB:
649 pRaInfo->RAUseRate = (pRaInfo->RateMask)&0x00000fef;
651 case RATR_INX_WIRELESS_G:
652 pRaInfo->RAUseRate = (pRaInfo->RateMask)&0x00000ff0;
654 case RATR_INX_WIRELESS_B:
655 pRaInfo->RAUseRate = (pRaInfo->RateMask)&0x0000000d;
658 MaskFromReg=ODM_Read4Byte(pDM_Odm, REG_ARFR0);
659 pRaInfo->RAUseRate = (pRaInfo->RateMask)&MaskFromReg;
662 MaskFromReg=ODM_Read4Byte(pDM_Odm, REG_ARFR1);
663 pRaInfo->RAUseRate = (pRaInfo->RateMask)&MaskFromReg;
666 MaskFromReg=ODM_Read4Byte(pDM_Odm, REG_ARFR2);
667 pRaInfo->RAUseRate = (pRaInfo->RateMask)&MaskFromReg;
670 MaskFromReg=ODM_Read4Byte(pDM_Odm, REG_ARFR3);
671 pRaInfo->RAUseRate = (pRaInfo->RateMask)&MaskFromReg;
675 pRaInfo->RAUseRate=(pRaInfo->RateMask);
679 if (pRaInfo->RAUseRate){
680 for (i=RATESIZE-1;i>=0;i--)
682 if((pRaInfo->RAUseRate)&BIT(i)){
683 pRaInfo->HighestRate=i;
689 pRaInfo->HighestRate=0;
692 if (pRaInfo->RAUseRate){
693 for (i=0;i<RATESIZE;i++)
695 if((pRaInfo->RAUseRate)&BIT(i))
697 pRaInfo->LowestRate=i;
703 pRaInfo->LowestRate=0;
706 #if POWER_TRAINING_ACTIVE == 1
707 if (pRaInfo->HighestRate >0x13)
709 else if(pRaInfo->HighestRate >0x0b)
711 else if(pRaInfo->HighestRate >0x0b)
715 ODM_RT_TRACE(pDM_Odm,ODM_COMP_RATE_ADAPTIVE, ODM_DBG_LOUD,
716 ("ODM_ARFBRefresh_8188E(): PTModeSS=%d\n", pRaInfo->PTModeSS));
720 if(pRaInfo->DecisionRate > pRaInfo->HighestRate)
721 pRaInfo->DecisionRate = pRaInfo->HighestRate;
723 ODM_RT_TRACE(pDM_Odm,ODM_COMP_RATE_ADAPTIVE, ODM_DBG_LOUD,
724 ("ODM_ARFBRefresh_8188E(): RateID=%d RateMask=%8.8x RAUseRate=%8.8x HighestRate=%d,DecisionRate=%d \n",
725 pRaInfo->RateID, pRaInfo->RateMask, pRaInfo->RAUseRate, pRaInfo->HighestRate,pRaInfo->DecisionRate));
729 #if POWER_TRAINING_ACTIVE == 1
731 odm_PTTryState_8188E(
732 IN PDM_ODM_T pDM_Odm,
733 IN PODM_RA_INFO_T pRaInfo
736 pRaInfo->PTTryState=0;
737 switch (pRaInfo->PTModeSS)
740 if (pRaInfo->DecisionRate>=0x19)
741 pRaInfo->PTTryState=1;
744 if (pRaInfo->DecisionRate>=0x11)
745 pRaInfo->PTTryState=1;
748 if (pRaInfo->DecisionRate>=0x0a)
749 pRaInfo->PTTryState=1;
752 if (pRaInfo->DecisionRate>=0x03)
753 pRaInfo->PTTryState=1;
756 pRaInfo->PTTryState=0;
759 if (pRaInfo->RssiStaRA<48)
763 else if (pRaInfo->PTTryState==1)
765 if ((pRaInfo->PTStopCount>=10)||(pRaInfo->PTPreRssi>pRaInfo->RssiStaRA+5)
766 ||(pRaInfo->PTPreRssi<pRaInfo->RssiStaRA-5)||(pRaInfo->DecisionRate!=pRaInfo->PTPreRate))
768 if (pRaInfo->PTStage==0)
770 else if(pRaInfo->PTStage==1)
775 pRaInfo->PTPreRssi=pRaInfo->RssiStaRA;
776 pRaInfo->PTStopCount=0;
781 pRaInfo->PTStopCount++;
788 pRaInfo->PTPreRate=pRaInfo->DecisionRate;
790 #if(DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_CE))
791 // Disable power training when noisy environment
792 if(pDM_Odm->bDisablePowerTraining)
794 ODM_RT_TRACE(pDM_Odm,ODM_COMP_RA_MASK, ODM_DBG_LOUD,("odm_PTTryState_8188E(): Disable power training when noisy environment\n"));
795 pRaInfo->PTStage = 0;
796 pRaInfo->RAstage = 0;
797 pRaInfo->PTStopCount = 0;
803 odm_PTDecision_8188E(
804 IN PODM_RA_INFO_T pRaInfo
814 stage_BUF=pRaInfo->PTStage;
816 num_total= pRaInfo->TOTAL* PT_PENALTY[5];
819 numsc += pRaInfo->RTY[j] * PT_PENALTY[j];
825 temp_stage= (pRaInfo->PTStage +1)>>1;
827 stage_id=temp_stage-j;
831 pRaInfo->PTSmoothFactor=(pRaInfo->PTSmoothFactor>>1) + (pRaInfo->PTSmoothFactor>>2) + stage_id*16+2;
832 if (pRaInfo->PTSmoothFactor>192)
833 pRaInfo->PTSmoothFactor=192;
834 stage_id =pRaInfo->PTSmoothFactor>>6;
835 temp_stage=stage_id*2;
840 pRaInfo->PTStage=temp_stage;
846 odm_RATxRPTTimerSetting(
847 IN PDM_ODM_T pDM_Odm,
851 ODM_RT_TRACE(pDM_Odm,ODM_COMP_RATE_ADAPTIVE, ODM_DBG_TRACE,(" =====>odm_RATxRPTTimerSetting()\n"));
854 if(pDM_Odm->CurrminRptTime != minRptTime){
855 ODM_RT_TRACE(pDM_Odm,ODM_COMP_RATE_ADAPTIVE, ODM_DBG_LOUD,
856 (" CurrminRptTime =0x%04x minRptTime=0x%04x\n", pDM_Odm->CurrminRptTime, minRptTime));
857 #if(DM_ODM_SUPPORT_TYPE & (ODM_WIN|ODM_AP))
858 ODM_RA_Set_TxRPT_Time(pDM_Odm,minRptTime);
860 rtw_rpt_timer_cfg_cmd(pDM_Odm->Adapter,minRptTime);
862 pDM_Odm->CurrminRptTime = minRptTime;
864 ODM_RT_TRACE(pDM_Odm,ODM_COMP_RATE_ADAPTIVE, ODM_DBG_TRACE,(" <=====odm_RATxRPTTimerSetting()\n"));
873 ODM_RT_TRACE(pDM_Odm,ODM_COMP_RATE_ADAPTIVE, ODM_DBG_LOUD, ("=====>ODM_RASupport_Init()\n"));
875 // 2012/02/14 MH Be noticed, the init must be after IC type is recognized!!!!!
876 if (pDM_Odm->SupportICType == ODM_RTL8188E)
877 pDM_Odm->RaSupport88E = TRUE;
885 IN PDM_ODM_T pDM_Odm,
889 PODM_RA_INFO_T pRaInfo = &pDM_Odm->RAInfo[MacID];
891 u1Byte WirelessMode=0xFF; //invalid value
892 u1Byte max_rate_idx = 0x13; //MCS7
893 if(pDM_Odm->pWirelessMode!=NULL){
894 WirelessMode=*(pDM_Odm->pWirelessMode);
897 if(WirelessMode != 0xFF ){
898 if(WirelessMode & ODM_WM_N24G)
900 else if(WirelessMode & ODM_WM_G)
902 else if(WirelessMode & ODM_WM_B)
906 //printk("%s ==>WirelessMode:0x%08x ,max_raid_idx:0x%02x\n ",__FUNCTION__,WirelessMode,max_rate_idx);
907 ODM_RT_TRACE(pDM_Odm,ODM_COMP_RATE_ADAPTIVE, ODM_DBG_LOUD,
908 ("ODM_RAInfo_Init(): WirelessMode:0x%08x ,max_raid_idx:0x%02x \n",
909 WirelessMode,max_rate_idx));
911 pRaInfo->DecisionRate = max_rate_idx;
912 pRaInfo->PreRate = max_rate_idx;
913 pRaInfo->HighestRate=max_rate_idx;
915 pRaInfo->DecisionRate = 0x13;
916 pRaInfo->PreRate = 0x13;
917 pRaInfo->HighestRate=0x13;
919 pRaInfo->LowestRate=0;
921 pRaInfo->RateMask=0xffffffff;
922 pRaInfo->RssiStaRA=0;
923 pRaInfo->PreRssiStaRA=0;
924 pRaInfo->SGIEnable=0;
925 pRaInfo->RAUseRate=0xffffffff;
926 pRaInfo->NscDown=(N_THRESHOLD_HIGH[0x13]+N_THRESHOLD_LOW[0x13])/2;
927 pRaInfo->NscUp=(N_THRESHOLD_HIGH[0x13]+N_THRESHOLD_LOW[0x13])/2;
929 pRaInfo->Active=1; //Active is not used at present. by page, 110819
930 pRaInfo->RptTime = 0x927c;
938 pRaInfo->RAWaitingCounter=0;
939 pRaInfo->RAPendingCounter=0;
940 #if POWER_TRAINING_ACTIVE == 1
941 pRaInfo->PTActive=1; // Active when this STA is use
942 pRaInfo->PTTryState=0;
943 pRaInfo->PTStage=5; // Need to fill into HW_PWR_STATUS
944 pRaInfo->PTSmoothFactor=192;
945 pRaInfo->PTStopCount=0;
946 pRaInfo->PTPreRate=0;
947 pRaInfo->PTPreRssi=0;
951 #if (DM_ODM_SUPPORT_TYPE == ODM_AP) && \
952 ((DEV_BUS_TYPE == RT_USB_INTERFACE) || (DEV_BUS_TYPE == RT_SDIO_INTERFACE))
953 pRaInfo->RateDownCounter = 0;
954 pRaInfo->RateUpCounter = 0;
955 pRaInfo->RateDirection = 0;
956 pRaInfo->BoundingType = 0;
957 pRaInfo->BoundingCounter = 0;
958 pRaInfo->BoundingLearningTime = 0;
959 pRaInfo->RateDownStartTime = 0;
971 ODM_RT_TRACE(pDM_Odm,ODM_COMP_RATE_ADAPTIVE, ODM_DBG_LOUD, ("=====>\n"));
972 pDM_Odm->CurrminRptTime = 0;
974 for(MacID=0; MacID<ODM_ASSOCIATE_ENTRY_NUM; MacID++)
975 ODM_RAInfo_Init(pDM_Odm,MacID);
977 //Redifine arrays for I-cut NIC
978 if (pDM_Odm->CutVersion == ODM_CUT_I)
980 #if !(DM_ODM_SUPPORT_TYPE & ODM_AP)
983 u1Byte RETRY_PENALTY_IDX_S[2][RATESIZE] = {{4,4,4,5,
984 4,4,5,7,7,7,8,0x0a, // SS>TH
985 4,4,4,4,6,0x0a,0x0b,0x0d,
986 5,5,7,7,8,0x0b,0x0d,0x0f}, // 0329 R01
987 {0x0a,0x0a,0x0b,0x0c,
988 0x0a,0x0a,0x0b,0x0c,0x0d,0x10,0x13,0x13, // SS<TH
989 0x06,0x07,0x08,0x0d,0x0e,0x11,0x11,0x11,
990 9,9,9,9,0x0c,0x0e,0x11,0x13}};
992 u1Byte RETRY_PENALTY_UP_IDX_S[RATESIZE] = {0x0c,0x0d,0x0d,0x0f,
993 0x0d,0x0e,0x0f,0x0f,0x10,0x12,0x13,0x14, // SS>TH
994 0x0b,0x0b,0x11,0x11,0x12,0x12,0x12,0x12,
995 0x11,0x11,0x12,0x13,0x13,0x13,0x14,0x15};
997 for( i=0; i<RATESIZE; i++ )
999 RETRY_PENALTY_IDX[0][i] = RETRY_PENALTY_IDX_S[0][i];
1000 RETRY_PENALTY_IDX[1][i] = RETRY_PENALTY_IDX_S[1][i];
1002 RETRY_PENALTY_UP_IDX[i] = RETRY_PENALTY_UP_IDX_S[i];
1009 #if (DM_ODM_SUPPORT_TYPE == ODM_WIN)//This is for non-I-cut
1011 PADAPTER Adapter = pDM_Odm->Adapter;
1013 //DbgPrint("Adapter->MgntInfo.RegRALvl = %d\n", Adapter->MgntInfo.RegRALvl);
1016 // 2012/09/14 MH Add for different Ra pattern init. For TPLINK case, we
1017 // need to to adjust different RA pattern for middle range RA. 20-30dB degarde
1018 // 88E rate adptve will raise too slow.
1020 if (Adapter->MgntInfo.RegRALvl == 0)
1022 RETRY_PENALTY_UP_IDX[11] = 0x14;
1024 RETRY_PENALTY_UP_IDX[17] = 0x13;
1025 RETRY_PENALTY_UP_IDX[18] = 0x14;
1026 RETRY_PENALTY_UP_IDX[19] = 0x15;
1028 RETRY_PENALTY_UP_IDX[23] = 0x13;
1029 RETRY_PENALTY_UP_IDX[24] = 0x13;
1030 RETRY_PENALTY_UP_IDX[25] = 0x13;
1031 RETRY_PENALTY_UP_IDX[26] = 0x14;
1032 RETRY_PENALTY_UP_IDX[27] = 0x15;
1034 else if (Adapter->MgntInfo.RegRALvl == 1)
1036 RETRY_PENALTY_UP_IDX[17] = 0x13;
1037 RETRY_PENALTY_UP_IDX[18] = 0x13;
1038 RETRY_PENALTY_UP_IDX[19] = 0x14;
1040 RETRY_PENALTY_UP_IDX[23] = 0x12;
1041 RETRY_PENALTY_UP_IDX[24] = 0x13;
1042 RETRY_PENALTY_UP_IDX[25] = 0x13;
1043 RETRY_PENALTY_UP_IDX[26] = 0x13;
1044 RETRY_PENALTY_UP_IDX[27] = 0x14;
1046 else if (Adapter->MgntInfo.RegRALvl == 2)
1048 // Compile flag default is lvl2, we need not to update.
1050 else if (Adapter->MgntInfo.RegRALvl >= 0x80)
1052 u1Byte index = 0, offset = Adapter->MgntInfo.RegRALvl - 0x80;
1054 // Reset to default rate adaptive value.
1055 RETRY_PENALTY_UP_IDX[11] = 0x14;
1057 RETRY_PENALTY_UP_IDX[17] = 0x13;
1058 RETRY_PENALTY_UP_IDX[18] = 0x14;
1059 RETRY_PENALTY_UP_IDX[19] = 0x15;
1061 RETRY_PENALTY_UP_IDX[23] = 0x13;
1062 RETRY_PENALTY_UP_IDX[24] = 0x13;
1063 RETRY_PENALTY_UP_IDX[25] = 0x13;
1064 RETRY_PENALTY_UP_IDX[26] = 0x14;
1065 RETRY_PENALTY_UP_IDX[27] = 0x15;
1067 if (Adapter->MgntInfo.RegRALvl >= 0x90)
1069 offset = Adapter->MgntInfo.RegRALvl - 0x90;
1071 for (index = 0; index < 28; index++)
1073 RETRY_PENALTY_UP_IDX[index] += (offset);
1079 for (index = 0; index < 28; index++)
1081 RETRY_PENALTY_UP_IDX[index] -= (offset);
1094 ODM_RA_GetShortGI_8188E(
1095 IN PDM_ODM_T pDM_Odm,
1099 if((NULL == pDM_Odm) || (MacID >= ASSOCIATE_ENTRY_NUM))
1101 ODM_RT_TRACE(pDM_Odm,ODM_COMP_RATE_ADAPTIVE, ODM_DBG_TRACE,
1102 ("MacID=%d SGI=%d\n", MacID, pDM_Odm->RAInfo[MacID].RateSGI));
1103 return pDM_Odm->RAInfo[MacID].RateSGI;
1107 ODM_RA_GetDecisionRate_8188E(
1108 IN PDM_ODM_T pDM_Odm,
1112 u1Byte DecisionRate = 0;
1114 if((NULL == pDM_Odm) || (MacID >= ASSOCIATE_ENTRY_NUM))
1116 DecisionRate = (pDM_Odm->RAInfo[MacID].DecisionRate);
1117 ODM_RT_TRACE(pDM_Odm,ODM_COMP_RATE_ADAPTIVE, ODM_DBG_TRACE,
1118 (" MacID=%d DecisionRate=0x%x\n", MacID, DecisionRate));
1119 return DecisionRate;
1123 ODM_RA_GetHwPwrStatus_8188E(
1124 IN PDM_ODM_T pDM_Odm,
1129 if((NULL == pDM_Odm) || (MacID >= ASSOCIATE_ENTRY_NUM))
1131 PTStage = (pDM_Odm->RAInfo[MacID].PTStage);
1132 ODM_RT_TRACE(pDM_Odm,ODM_COMP_RATE_ADAPTIVE, ODM_DBG_TRACE,
1133 ("MacID=%d PTStage=0x%x\n", MacID, PTStage));
1138 ODM_RA_UpdateRateInfo_8188E(
1139 IN PDM_ODM_T pDM_Odm,
1146 PODM_RA_INFO_T pRaInfo = NULL;
1148 if((NULL == pDM_Odm) || (MacID >= ASSOCIATE_ENTRY_NUM))
1151 ODM_RT_TRACE(pDM_Odm,ODM_COMP_RATE_ADAPTIVE, ODM_DBG_LOUD,
1152 ("MacID=%d RateID=0x%x RateMask=0x%x SGIEnable=%d\n",
1153 MacID, RateID, RateMask, SGIEnable));
1155 pRaInfo = &(pDM_Odm->RAInfo[MacID]);
1156 pRaInfo->RateID = RateID;
1157 pRaInfo->RateMask = RateMask;
1158 pRaInfo->SGIEnable = SGIEnable;
1159 odm_ARFBRefresh_8188E(pDM_Odm, pRaInfo);
1163 ODM_RA_SetRSSI_8188E(
1164 IN PDM_ODM_T pDM_Odm,
1169 PODM_RA_INFO_T pRaInfo = NULL;
1171 if((NULL == pDM_Odm) || (MacID >= ASSOCIATE_ENTRY_NUM))
1174 ODM_RT_TRACE(pDM_Odm,ODM_COMP_RATE_ADAPTIVE, ODM_DBG_TRACE,
1175 (" MacID=%d Rssi=%d\n", MacID, Rssi));
1177 pRaInfo = &(pDM_Odm->RAInfo[MacID]);
1178 pRaInfo->RssiStaRA = Rssi;
1182 ODM_RA_Set_TxRPT_Time(
1183 IN PDM_ODM_T pDM_Odm,
1184 IN u2Byte minRptTime
1187 #if(DM_ODM_SUPPORT_TYPE & (ODM_AP))
1188 if (minRptTime != 0xffff)
1190 #if defined(CONFIG_PCI_HCI)
1191 ODM_Write2Byte(pDM_Odm, REG_TX_RPT_TIME, minRptTime);
1192 #elif defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI)
1193 notify_tx_report_interval_change(pDM_Odm->priv, minRptTime);
1197 ODM_Write2Byte(pDM_Odm, REG_TX_RPT_TIME, minRptTime);
1204 ODM_RA_TxRPT2Handle_8188E(
1205 IN PDM_ODM_T pDM_Odm,
1206 IN pu1Byte TxRPT_Buf,
1207 IN u2Byte TxRPT_Len,
1208 IN u4Byte MacIDValidEntry0,
1209 IN u4Byte MacIDValidEntry1
1212 PODM_RA_INFO_T pRAInfo = NULL;
1214 pu1Byte pBuffer = NULL;
1215 u4Byte valid = 0, ItemNum = 0;
1216 u2Byte minRptTime = 0x927c;
1218 ODM_RT_TRACE(pDM_Odm,ODM_COMP_RATE_ADAPTIVE, ODM_DBG_LOUD, ("=====>ODM_RA_TxRPT2Handle_8188E(): valid0=%d valid1=%d BufferLength=%d\n",
1219 MacIDValidEntry0, MacIDValidEntry1, TxRPT_Len));
1221 ItemNum = TxRPT_Len >> 3;
1222 pBuffer = TxRPT_Buf;
1228 valid = (1<<MacId) & MacIDValidEntry0;
1230 valid = (1<<(MacId-32)) & MacIDValidEntry1;
1232 if (MacId >= ODM_ASSOCIATE_ENTRY_NUM)
1237 pRAInfo = &(pDM_Odm->RAInfo[MacId]);
1239 pRAInfo->RTY[0] = (u2Byte)GET_TX_REPORT_TYPE1_RERTY_0(pBuffer);
1240 pRAInfo->RTY[1] = (u2Byte)GET_TX_REPORT_TYPE1_RERTY_1(pBuffer);
1241 pRAInfo->RTY[2] = (u2Byte)GET_TX_REPORT_TYPE1_RERTY_2(pBuffer);
1242 pRAInfo->RTY[3] = (u2Byte)GET_TX_REPORT_TYPE1_RERTY_3(pBuffer);
1243 pRAInfo->RTY[4] = (u2Byte)GET_TX_REPORT_TYPE1_RERTY_4(pBuffer);
1244 pRAInfo->DROP = (u2Byte)GET_TX_REPORT_TYPE1_DROP_0(pBuffer);
1246 pRAInfo->TOTAL = pRAInfo->RTY[0] + \
1252 #if defined(TXRETRY_CNT)
1253 extern struct stat_info *get_macidinfo(struct rtl8192cd_priv *priv, unsigned int aid);
1256 struct stat_info *pstat = get_macidinfo(pDM_Odm->priv, MacId);
1258 pstat->cur_tx_ok += pRAInfo->RTY[0];
1259 pstat->cur_tx_retry_pkts += pRAInfo->RTY[1] + pRAInfo->RTY[2] + pRAInfo->RTY[3] + pRAInfo->RTY[4];
1260 pstat->cur_tx_retry_cnt += pRAInfo->RTY[1] + pRAInfo->RTY[2] * 2 + pRAInfo->RTY[3] * 3 + pRAInfo->RTY[4] * 4;
1261 pstat->total_tx_retry_cnt += pstat->cur_tx_retry_cnt;
1262 pstat->total_tx_retry_pkts += pstat->cur_tx_retry_pkts;
1263 pstat->cur_tx_fail += pRAInfo->DROP;
1267 if(pRAInfo->TOTAL != 0)
1269 ODM_RT_TRACE(pDM_Odm,ODM_COMP_RATE_ADAPTIVE, ODM_DBG_LOUD,
1270 ("macid=%d Total=%d R0=%d R1=%d R2=%d R3=%d R4=%d D0=%d valid0=%x valid1=%x\n",
1281 #if POWER_TRAINING_ACTIVE == 1
1282 if (pRAInfo->PTActive){
1283 if(pRAInfo->RAstage<5){
1284 odm_RateDecision_8188E(pDM_Odm,pRAInfo);
1286 else if(pRAInfo->RAstage==5){ // Power training try state
1287 odm_PTTryState_8188E(pDM_Odm, pRAInfo);
1290 odm_PTDecision_8188E(pRAInfo);
1294 if (pRAInfo->RAstage<=5)
1300 odm_RateDecision_8188E(pDM_Odm,pRAInfo);
1303 odm_RateDecision_8188E(pDM_Odm, pRAInfo);
1306 #if (DM_ODM_SUPPORT_TYPE & ODM_AP)
1307 extern void RTL8188E_SetStationTxRateInfo(PDM_ODM_T, PODM_RA_INFO_T, int);
1308 RTL8188E_SetStationTxRateInfo(pDM_Odm, pRAInfo, MacId);
1309 #ifdef DETECT_STA_EXISTANCE
1310 void RTL8188E_DetectSTAExistance(PDM_ODM_T pDM_Odm, PODM_RA_INFO_T pRAInfo, int MacID);
1311 RTL8188E_DetectSTAExistance(pDM_Odm, pRAInfo, MacId);
1315 ODM_RT_TRACE(pDM_Odm, ODM_COMP_INIT, ODM_DBG_LOUD,
1316 ("macid=%d R0=%d R1=%d R2=%d R3=%d R4=%d drop=%d valid0=%x RateID=%d SGI=%d\n",
1325 pRAInfo->DecisionRate,
1328 if(minRptTime > pRAInfo->RptTime)
1329 minRptTime = pRAInfo->RptTime;
1332 ODM_RT_TRACE(pDM_Odm,ODM_COMP_RATE_ADAPTIVE, ODM_DBG_LOUD, (" TOTAL=0!!!!\n"));
1335 pBuffer += TX_RPT2_ITEM_SIZE;
1337 }while(MacId < ItemNum);
1339 odm_RATxRPTTimerSetting(pDM_Odm,minRptTime);
1342 ODM_RT_TRACE(pDM_Odm,ODM_COMP_RATE_ADAPTIVE, ODM_DBG_LOUD, ("<===== ODM_RA_TxRPT2Handle_8188E()\n"));
1348 odm_RATxRPTTimerSetting(
1349 IN PDM_ODM_T pDM_Odm,
1350 IN u2Byte minRptTime
1359 IN PDM_ODM_T pDM_Odm
1367 IN PDM_ODM_T pDM_Odm,
1375 ODM_RAInfo_Init_all(
1376 IN PDM_ODM_T pDM_Odm
1383 ODM_RA_GetShortGI_8188E(
1384 IN PDM_ODM_T pDM_Odm,
1392 ODM_RA_GetDecisionRate_8188E(
1393 IN PDM_ODM_T pDM_Odm,
1400 ODM_RA_GetHwPwrStatus_8188E(
1401 IN PDM_ODM_T pDM_Odm,
1409 ODM_RA_UpdateRateInfo_8188E(
1410 IN PDM_ODM_T pDM_Odm,
1421 ODM_RA_SetRSSI_8188E(
1422 IN PDM_ODM_T pDM_Odm,
1431 ODM_RA_Set_TxRPT_Time(
1432 IN PDM_ODM_T pDM_Odm,
1433 IN u2Byte minRptTime
1440 ODM_RA_TxRPT2Handle_8188E(
1441 IN PDM_ODM_T pDM_Odm,
1442 IN pu1Byte TxRPT_Buf,
1443 IN u2Byte TxRPT_Len,
1444 IN u4Byte MacIDValidEntry0,
1445 IN u4Byte MacIDValidEntry1