1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36#include "ttype.h"
37#include "tmacro.h"
38#include "mac.h"
39#include "80211mgr.h"
40#include "bssdb.h"
41#include "datarate.h"
42#include "card.h"
43#include "baseband.h"
44#include "srom.h"
45#include "rf.h"
46
47
48
49
50
51
52
53
54
55
56
57
58static int msglevel =MSG_LEVEL_INFO;
59const BYTE acbyIERate[MAX_RATE] =
60{0x02, 0x04, 0x0B, 0x16, 0x0C, 0x12, 0x18, 0x24, 0x30, 0x48, 0x60, 0x6C};
61
62#define AUTORATE_TXOK_CNT 0x0400
63#define AUTORATE_TXFAIL_CNT 0x0064
64#define AUTORATE_TIMEOUT 10
65
66
67
68void s_vResetCounter(PKnownNodeDB psNodeDBTable);
69
70void s_vResetCounter(PKnownNodeDB psNodeDBTable)
71{
72 BYTE ii;
73
74
75 for(ii=0;ii<=MAX_RATE;ii++) {
76 psNodeDBTable->uTxOk[ii] = 0;
77 psNodeDBTable->uTxFail[ii] = 0;
78 }
79}
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101BYTE
102DATARATEbyGetRateIdx (
103 BYTE byRate
104 )
105{
106 BYTE ii;
107
108
109 byRate = byRate & 0x7F;
110
111 for (ii = 0; ii < MAX_RATE; ii ++) {
112 if (acbyIERate[ii] == byRate)
113 return ii;
114 }
115 return 0;
116}
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135#define AUTORATE_TXCNT_THRESHOLD 20
136#define AUTORATE_INC_THRESHOLD 30
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155WORD
156RATEwGetRateIdx(
157 BYTE byRate
158 )
159{
160 WORD ii;
161
162
163 byRate = byRate & 0x7F;
164
165 for (ii = 0; ii < MAX_RATE; ii ++) {
166 if (acbyIERate[ii] == byRate)
167 return ii;
168 }
169 return 0;
170}
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191void RATEvParseMaxRate(
192 void *pDeviceHandler,
193 PWLAN_IE_SUPP_RATES pItemRates,
194 PWLAN_IE_SUPP_RATES pItemExtRates,
195 BOOL bUpdateBasicRate,
196 PWORD pwMaxBasicRate,
197 PWORD pwMaxSuppRate,
198 PWORD pwSuppRate,
199 PBYTE pbyTopCCKRate,
200 PBYTE pbyTopOFDMRate
201 )
202{
203PSDevice pDevice = (PSDevice) pDeviceHandler;
204unsigned int ii;
205BYTE byHighSuppRate = 0;
206BYTE byRate = 0;
207WORD wOldBasicRate = pDevice->wBasicRate;
208unsigned int uRateLen;
209
210
211 if (pItemRates == NULL)
212 return;
213
214 *pwSuppRate = 0;
215 uRateLen = pItemRates->len;
216
217 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"ParseMaxRate Len: %d\n", uRateLen);
218 if (pDevice->byBBType != BB_TYPE_11B) {
219 if (uRateLen > WLAN_RATES_MAXLEN)
220 uRateLen = WLAN_RATES_MAXLEN;
221 } else {
222 if (uRateLen > WLAN_RATES_MAXLEN_11B)
223 uRateLen = WLAN_RATES_MAXLEN_11B;
224 }
225
226 for (ii = 0; ii < uRateLen; ii++) {
227 byRate = (BYTE)(pItemRates->abyRates[ii]);
228 if (WLAN_MGMT_IS_BASICRATE(byRate) &&
229 (bUpdateBasicRate == TRUE)) {
230
231 CARDbAddBasicRate((void *)pDevice, RATEwGetRateIdx(byRate));
232 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"ParseMaxRate AddBasicRate: %d\n", RATEwGetRateIdx(byRate));
233 }
234 byRate = (BYTE)(pItemRates->abyRates[ii]&0x7F);
235 if (byHighSuppRate == 0)
236 byHighSuppRate = byRate;
237 if (byRate > byHighSuppRate)
238 byHighSuppRate = byRate;
239 *pwSuppRate |= (1<<RATEwGetRateIdx(byRate));
240 }
241 if ((pItemExtRates != NULL) && (pItemExtRates->byElementID == WLAN_EID_EXTSUPP_RATES) &&
242 (pDevice->byBBType != BB_TYPE_11B)) {
243
244 unsigned int uExtRateLen = pItemExtRates->len;
245
246 if (uExtRateLen > WLAN_RATES_MAXLEN)
247 uExtRateLen = WLAN_RATES_MAXLEN;
248
249 for (ii = 0; ii < uExtRateLen ; ii++) {
250 byRate = (BYTE)(pItemExtRates->abyRates[ii]);
251
252 if (WLAN_MGMT_IS_BASICRATE(pItemExtRates->abyRates[ii])) {
253
254 CARDbAddBasicRate((void *)pDevice, RATEwGetRateIdx(byRate));
255 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"ParseMaxRate AddBasicRate: %d\n", RATEwGetRateIdx(byRate));
256 }
257 byRate = (BYTE)(pItemExtRates->abyRates[ii]&0x7F);
258 if (byHighSuppRate == 0)
259 byHighSuppRate = byRate;
260 if (byRate > byHighSuppRate)
261 byHighSuppRate = byRate;
262 *pwSuppRate |= (1<<RATEwGetRateIdx(byRate));
263
264 }
265 }
266
267 if ((pDevice->byPacketType == PK_TYPE_11GB)
268 && CARDbIsOFDMinBasicRate((void *)pDevice)) {
269 pDevice->byPacketType = PK_TYPE_11GA;
270 }
271
272 *pbyTopCCKRate = pDevice->byTopCCKBasicRate;
273 *pbyTopOFDMRate = pDevice->byTopOFDMBasicRate;
274 *pwMaxSuppRate = RATEwGetRateIdx(byHighSuppRate);
275 if ((pDevice->byPacketType==PK_TYPE_11B) || (pDevice->byPacketType==PK_TYPE_11GB))
276 *pwMaxBasicRate = pDevice->byTopCCKBasicRate;
277 else
278 *pwMaxBasicRate = pDevice->byTopOFDMBasicRate;
279 if (wOldBasicRate != pDevice->wBasicRate)
280 CARDvSetRSPINF((void *)pDevice, pDevice->byBBType);
281
282 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Exit ParseMaxRate\n");
283}
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301#define AUTORATE_TXCNT_THRESHOLD 20
302#define AUTORATE_INC_THRESHOLD 30
303
304void
305RATEvTxRateFallBack(
306 void *pDeviceHandler,
307 PKnownNodeDB psNodeDBTable
308 )
309{
310PSDevice pDevice = (PSDevice) pDeviceHandler;
311PSMgmtObject pMgmt = &(pDevice->sMgmtObj);
312#if 1
313WORD wIdxDownRate = 0;
314unsigned int ii;
315BOOL bAutoRate[MAX_RATE] = {TRUE,TRUE,TRUE,TRUE,FALSE,FALSE,TRUE,TRUE,TRUE,TRUE,TRUE,TRUE};
316DWORD dwThroughputTbl[MAX_RATE] = {10, 20, 55, 110, 60, 90, 120, 180, 240, 360, 480, 540};
317DWORD dwThroughput = 0;
318WORD wIdxUpRate = 0;
319DWORD dwTxDiff = 0;
320
321 if (pMgmt->eScanState != WMAC_NO_SCANNING) {
322
323 return;
324 }
325 psNodeDBTable->uTimeCount ++;
326
327 if (psNodeDBTable->uTxFail[MAX_RATE] > psNodeDBTable->uTxOk[MAX_RATE])
328 dwTxDiff = psNodeDBTable->uTxFail[MAX_RATE] - psNodeDBTable->uTxOk[MAX_RATE];
329
330 if ((psNodeDBTable->uTxOk[MAX_RATE] < AUTORATE_TXOK_CNT) &&
331 (dwTxDiff < AUTORATE_TXFAIL_CNT) &&
332 (psNodeDBTable->uTimeCount < AUTORATE_TIMEOUT)) {
333 return;
334 }
335
336 if (psNodeDBTable->uTimeCount >= AUTORATE_TIMEOUT) {
337 psNodeDBTable->uTimeCount = 0;
338 }
339
340 for(ii=0;ii<MAX_RATE;ii++) {
341 if (psNodeDBTable->wSuppRate & (0x0001<<ii)) {
342 if (bAutoRate[ii] == TRUE) {
343 wIdxUpRate = (WORD) ii;
344 }
345 } else {
346 bAutoRate[ii] = FALSE;
347 }
348 }
349
350 for(ii=0;ii<=psNodeDBTable->wTxDataRate;ii++) {
351 if ( (psNodeDBTable->uTxOk[ii] != 0) ||
352 (psNodeDBTable->uTxFail[ii] != 0) ) {
353 dwThroughputTbl[ii] *= psNodeDBTable->uTxOk[ii];
354 if (ii < RATE_11M) {
355 psNodeDBTable->uTxFail[ii] *= 4;
356 }
357 dwThroughputTbl[ii] /= (psNodeDBTable->uTxOk[ii] + psNodeDBTable->uTxFail[ii]);
358 }
359 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Rate %d,Ok: %d, Fail:%d, Throughput:%d\n",
360 ii, (int)psNodeDBTable->uTxOk[ii], (int)psNodeDBTable->uTxFail[ii], (int)dwThroughputTbl[ii]);
361 }
362 dwThroughput = dwThroughputTbl[psNodeDBTable->wTxDataRate];
363
364 wIdxDownRate = psNodeDBTable->wTxDataRate;
365 for(ii = psNodeDBTable->wTxDataRate; ii > 0;) {
366 ii--;
367 if ( (dwThroughputTbl[ii] > dwThroughput) &&
368 (bAutoRate[ii]==TRUE) ) {
369 dwThroughput = dwThroughputTbl[ii];
370 wIdxDownRate = (WORD) ii;
371 }
372 }
373 psNodeDBTable->wTxDataRate = wIdxDownRate;
374 if (psNodeDBTable->uTxOk[MAX_RATE]) {
375 if (psNodeDBTable->uTxOk[MAX_RATE] >
376 (psNodeDBTable->uTxFail[MAX_RATE] * 4) ) {
377 psNodeDBTable->wTxDataRate = wIdxUpRate;
378 }
379 }else {
380 if (psNodeDBTable->uTxFail[MAX_RATE] == 0)
381 psNodeDBTable->wTxDataRate = wIdxUpRate;
382 }
383
384 if (pDevice->byBBType == BB_TYPE_11A) {
385 if (psNodeDBTable->wTxDataRate <= RATE_11M)
386 psNodeDBTable->wTxDataRate = RATE_6M;
387 }
388 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"uTxOk[MAX_RATE] %d, uTxFail[MAX_RATE]:%d\n",(int)psNodeDBTable->uTxOk[MAX_RATE], (int)psNodeDBTable->uTxFail[MAX_RATE]);
389 s_vResetCounter(psNodeDBTable);
390 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Rate: %d, U:%d, D:%d\n", (int)psNodeDBTable->wTxDataRate, (int)wIdxUpRate, (int)wIdxDownRate);
391 return;
392#else
393WORD wIdxUpRate = 0;
394BOOL bAutoRate[MAX_RATE] = {TRUE,TRUE,TRUE,TRUE,FALSE,FALSE,TRUE,TRUE,TRUE,TRUE,TRUE,TRUE};
395unsigned int ii;
396long ldBm;
397
398 if (pMgmt->eScanState != WMAC_NO_SCANNING) {
399
400 return;
401 }
402
403 for(ii=0;ii<MAX_RATE;ii++) {
404 if (psNodeDBTable->wSuppRate & (0x0001<<ii)) {
405 if (bAutoRate[ii] == TRUE) {
406 wIdxUpRate = (WORD) ii;
407 }
408 } else {
409 bAutoRate[ii] = FALSE;
410 }
411 }
412
413 RFvRSSITodBm(pDevice, (BYTE)(pDevice->uCurrRSSI), &ldBm);
414
415 if (ldBm > -55) {
416 if ( psNodeDBTable->wSuppRate & (0x0001<<RATE_54M) )
417 {
418 psNodeDBTable->wTxDataRate = RATE_54M;
419 }
420 else{
421 psNodeDBTable->wTxDataRate = RATE_11M;
422 }
423 }
424
425if (wIdxUpRate == RATE_54M ) {
426 if (ldBm > -56 )
427 psNodeDBTable->wTxDataRate = RATE_54M;
428 else if (ldBm > -61 )
429 psNodeDBTable->wTxDataRate = RATE_48M;
430 else if (ldBm > -66 )
431 psNodeDBTable->wTxDataRate = RATE_36M;
432 else if (ldBm > -72 )
433 psNodeDBTable->wTxDataRate = RATE_24M;
434 else if (ldBm > -80 )
435 psNodeDBTable->wTxDataRate = RATE_5M;
436 else {
437 psNodeDBTable->wTxDataRate = RATE_1M;
438
439 }
440 }
441 else {
442 if (ldBm > -65 )
443 psNodeDBTable->wTxDataRate = RATE_11M;
444 else if (ldBm > -75 )
445 psNodeDBTable->wTxDataRate = RATE_5M;
446 else
447 psNodeDBTable->wTxDataRate = RATE_1M;
448 }
449
450 return;
451#endif
452}
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467BYTE
468RATEuSetIE (
469 PWLAN_IE_SUPP_RATES pSrcRates,
470 PWLAN_IE_SUPP_RATES pDstRates,
471 unsigned int uRateLen
472 )
473{
474 unsigned int ii, uu, uRateCnt = 0;
475
476 if ((pSrcRates == NULL) || (pDstRates == NULL))
477 return 0;
478
479 if (pSrcRates->len == 0)
480 return 0;
481
482 for (ii = 0; ii < uRateLen; ii++) {
483 for (uu = 0; uu < pSrcRates->len; uu++) {
484 if ((pSrcRates->abyRates[uu] & 0x7F) == acbyIERate[ii]) {
485 pDstRates->abyRates[uRateCnt ++] = pSrcRates->abyRates[uu];
486 break;
487 }
488 }
489 }
490 return (BYTE)uRateCnt;
491}
492
493