1 /** \file utils.c
2 * \brief General utilities implementation
3 *
4 * \see utils.h
5 */
6 /****************************************************************************
7 **+-----------------------------------------------------------------------+**
8 **| |**
9 **| Copyright(c) 1998 - 2008 Texas Instruments. All rights reserved. |**
10 **| All rights reserved. |**
11 **| |**
12 **| Redistribution and use in source and binary forms, with or without |**
13 **| modification, are permitted provided that the following conditions |**
14 **| are met: |**
15 **| |**
16 **| * Redistributions of source code must retain the above copyright |**
17 **| notice, this list of conditions and the following disclaimer. |**
18 **| * Redistributions in binary form must reproduce the above copyright |**
19 **| notice, this list of conditions and the following disclaimer in |**
20 **| the documentation and/or other materials provided with the |**
21 **| distribution. |**
22 **| * Neither the name Texas Instruments nor the names of its |**
23 **| contributors may be used to endorse or promote products derived |**
24 **| from this software without specific prior written permission. |**
25 **| |**
26 **| THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |**
27 **| "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |**
28 **| LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |**
29 **| A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |**
30 **| OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |**
31 **| SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |**
32 **| LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |**
33 **| DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |**
34 **| THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |**
35 **| (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |**
36 **| OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |**
37 **| |**
38 **+-----------------------------------------------------------------------+**
39 ****************************************************************************/
40
41 /****************************************************************************/
42 /* */
43 /* MODULE: utils.c */
44 /* PURPOSE: General utilities implementation */
45 /***************************************************************************/
46 #include "osTIType.h"
47 #include "osApi.h"
48 #include "report.h"
49 #include "commonTypes.h"
50 #include "utils.h"
51 #include "802_11Defs.h"
52
53 #define NUM_OF_NIBBLES_IN_BYTE (2)
54 #define NIBBLE_SIZE_IN_BITS (4)
55 #define NIBBLE_MASK (0xF)
56
57 /************************************************************************
58 * utils_nullMemoryFree *
59 ************************************************************************
60 DESCRIPTION: Called in order to free memory space.
61 Calls the OS free function only if the memory is occupied
62
63 INPUT: pOsContext - Handle to OS
64 pMemPtr - Pointer to the memory to be free
65 size - Size of memory to be free
66
67 OUTPUT:
68
69
70 RETURN:
71
72 ************************************************************************/
utils_nullMemoryFree(void * pOsContext,void * pMemPtr,unsigned long size)73 void utils_nullMemoryFree(void* pOsContext,
74 void* pMemPtr,
75 unsigned long size)
76 {
77 if (pMemPtr != NULL)
78 os_memoryFree(pOsContext, pMemPtr, size);
79 }
80
81 /************************************************************************
82 * utils_nullTimerDestroy *
83 ************************************************************************
84 DESCRIPTION: Called in order to free OS timers.
85 Calls the OS timer destroy function only if the timer is not NULL
86
87 INPUT: pOsContext - Handle to OS
88 pTimerHandle - Pointer to timer handle
89
90 OUTPUT:
91
92
93 RETURN:
94
95 ************************************************************************/
utils_nullTimerDestroy(void * pOsContext,void * pTimerHandle)96 void utils_nullTimerDestroy(void* pOsContext,
97 void* pTimerHandle)
98 {
99 os_timerStop(pOsContext,pTimerHandle);
100 os_timerDestroy(pOsContext, pTimerHandle);
101 }
102
103 /************************************************************************
104 * networkToHostRate *
105 ************************************************************************
106 DESCRIPTION: Translates a network rate (0x02, 0x82, 0x84, etc...) to host rate (1, 2, 3, ....)
107
108 INPUT: rate - Network rate
109
110 OUTPUT:
111
112
113 RETURN: Host rate if the input rate is valid, otherwise returns 0.
114
115 ************************************************************************/
116
117 #define NET_BASIC_MASK 0x80
118 #define NET_RATE_1M (0x02)
119 #define NET_RATE_2M (0x04)
120 #define NET_RATE_5_5M (0x0B)
121 #define NET_RATE_11M (0x16)
122 #define NET_RATE_22M (0x2C)
123 #define NET_RATE_6M (0x0C)
124 #define NET_RATE_9M (0x12)
125 #define NET_RATE_12M (0x18)
126 #define NET_RATE_18M (0x24)
127 #define NET_RATE_24M (0x30)
128 #define NET_RATE_36M (0x48)
129 #define NET_RATE_48M (0x60)
130 #define NET_RATE_54M (0x6C)
131
132 /*#define ONLY_802_11_A*/
133 /*#ifdef ONLY_802_11_A
134 #undef NET_RATE_1M
135 #undef NET_RATE_2M
136 #undef NET_RATE_5_5M
137 #undef NET_RATE_11M
138 #undef NET_RATE_22M
139 #define NET_RATE_1M (NET_RATE_6M)
140 #define NET_RATE_2M (NET_RATE_12M)
141 #define NET_RATE_5_5M (NET_RATE_24M)
142 #define NET_RATE_11M (NET_RATE_54M)
143 #define NET_RATE_22M (NET_RATE_48M)
144 #endif
145 */
146
147 #define NET_RATE_1M_BASIC (NET_RATE_1M | NET_BASIC_MASK)
148 #define NET_RATE_2M_BASIC (NET_RATE_2M | NET_BASIC_MASK)
149 #define NET_RATE_5_5M_BASIC (NET_RATE_5_5M | NET_BASIC_MASK)
150 #define NET_RATE_11M_BASIC (NET_RATE_11M | NET_BASIC_MASK)
151 #define NET_RATE_22M_BASIC (NET_RATE_22M | NET_BASIC_MASK)
152 #define NET_RATE_6M_BASIC (NET_RATE_6M | NET_BASIC_MASK)
153 #define NET_RATE_9M_BASIC (NET_RATE_9M | NET_BASIC_MASK)
154 #define NET_RATE_12M_BASIC (NET_RATE_12M | NET_BASIC_MASK)
155 #define NET_RATE_18M_BASIC (NET_RATE_18M | NET_BASIC_MASK)
156 #define NET_RATE_24M_BASIC (NET_RATE_24M | NET_BASIC_MASK)
157 #define NET_RATE_36M_BASIC (NET_RATE_36M | NET_BASIC_MASK)
158 #define NET_RATE_48M_BASIC (NET_RATE_48M | NET_BASIC_MASK)
159 #define NET_RATE_54M_BASIC (NET_RATE_54M | NET_BASIC_MASK)
160
161
162 #define FIRST_VALID_CHAR 32
163
164
networkToHostRate(UINT8 rate)165 rate_e networkToHostRate(UINT8 rate)
166 {
167 switch (rate)
168 {
169 case NET_RATE_1M:
170 case NET_RATE_1M_BASIC:
171 return DRV_RATE_1M;
172
173 case NET_RATE_2M:
174 case NET_RATE_2M_BASIC:
175 return DRV_RATE_2M;
176
177 case NET_RATE_5_5M:
178 case NET_RATE_5_5M_BASIC:
179 return DRV_RATE_5_5M;
180
181 case NET_RATE_11M:
182 case NET_RATE_11M_BASIC:
183 return DRV_RATE_11M;
184
185 case NET_RATE_22M:
186 case NET_RATE_22M_BASIC:
187 return DRV_RATE_22M;
188
189 case NET_RATE_6M:
190 case NET_RATE_6M_BASIC:
191 return DRV_RATE_6M;
192
193 case NET_RATE_9M:
194 case NET_RATE_9M_BASIC:
195 return DRV_RATE_9M;
196
197 case NET_RATE_12M:
198 case NET_RATE_12M_BASIC:
199 return DRV_RATE_12M;
200
201 case NET_RATE_18M:
202 case NET_RATE_18M_BASIC:
203 return DRV_RATE_18M;
204
205 case NET_RATE_24M:
206 case NET_RATE_24M_BASIC:
207 return DRV_RATE_24M;
208
209 case NET_RATE_36M:
210 case NET_RATE_36M_BASIC:
211 return DRV_RATE_36M;
212
213 case NET_RATE_48M:
214 case NET_RATE_48M_BASIC:
215 return DRV_RATE_48M;
216
217 case NET_RATE_54M:
218 case NET_RATE_54M_BASIC:
219 return DRV_RATE_54M;
220
221 default:
222 return DRV_RATE_INVALID;
223 }
224 }
225
226 /************************************************************************
227 * hostToNetworkRate *
228 ************************************************************************
229 DESCRIPTION: Translates a host rate (1, 2, 3, ....) to network rate (0x02, 0x82, 0x84, etc...)
230
231 INPUT: rate - Host rate
232
233 OUTPUT:
234
235
236 RETURN: Network rate if the input rate is valid, otherwise returns 0.
237
238 ************************************************************************/
hostToNetworkRate(rate_e rate)239 UINT8 hostToNetworkRate(rate_e rate)
240 {
241 switch (rate)
242 {
243 case DRV_RATE_1M:
244 return NET_RATE_1M;
245
246 case DRV_RATE_2M:
247 return NET_RATE_2M;
248
249 case DRV_RATE_5_5M:
250 return NET_RATE_5_5M;
251
252 case DRV_RATE_11M:
253 return NET_RATE_11M;
254
255 case DRV_RATE_22M:
256 return NET_RATE_22M;
257
258 case DRV_RATE_6M:
259 return NET_RATE_6M;
260
261 case DRV_RATE_9M:
262 return NET_RATE_9M;
263
264 case DRV_RATE_12M:
265 return NET_RATE_12M;
266
267 case DRV_RATE_18M:
268 return NET_RATE_18M;
269
270 case DRV_RATE_24M:
271 return NET_RATE_24M;
272
273 case DRV_RATE_36M:
274 return NET_RATE_36M;
275
276 case DRV_RATE_48M:
277 return NET_RATE_48M;
278
279 case DRV_RATE_54M:
280 return NET_RATE_54M;
281
282 default:
283 return 0;
284 }
285 }
286
287
288 /***************************************************************************
289 * getMaxActiveRatefromBitmap *
290 ****************************************************************************
291 * DESCRIPTION:
292 *
293 * INPUTS: hCtrlData - the object
294 *
295 * OUTPUT:
296 *
297 * RETURNS:
298 ***************************************************************************/
getMaxRatefromBitmap(UINT32 ratesBitMap)299 rate_e getMaxRatefromBitmap(UINT32 ratesBitMap)
300 {
301 rate_e rate = DRV_RATE_1M;
302
303 if(ratesBitMap & DRV_RATE_MASK_1_BARKER) rate = DRV_RATE_1M;
304 if(ratesBitMap & DRV_RATE_MASK_2_BARKER) rate = DRV_RATE_2M;
305 if(ratesBitMap & DRV_RATE_MASK_5_5_CCK) rate = DRV_RATE_5_5M;
306 if(ratesBitMap & DRV_RATE_MASK_11_CCK) rate = DRV_RATE_11M;
307 if(ratesBitMap & DRV_RATE_MASK_22_PBCC) rate = DRV_RATE_22M;
308 if(ratesBitMap & DRV_RATE_MASK_6_OFDM) rate = DRV_RATE_6M;
309 if(ratesBitMap & DRV_RATE_MASK_9_OFDM) rate = DRV_RATE_9M;
310 if(ratesBitMap & DRV_RATE_MASK_12_OFDM) rate = DRV_RATE_12M;
311 if(ratesBitMap & DRV_RATE_MASK_18_OFDM) rate = DRV_RATE_18M;
312 if(ratesBitMap & DRV_RATE_MASK_24_OFDM) rate = DRV_RATE_24M;
313 if(ratesBitMap & DRV_RATE_MASK_36_OFDM) rate = DRV_RATE_36M;
314 if(ratesBitMap & DRV_RATE_MASK_48_OFDM) rate = DRV_RATE_48M;
315 if(ratesBitMap & DRV_RATE_MASK_54_OFDM) rate = DRV_RATE_54M;
316
317 return rate;
318 }
319
320
321 /************************************************************************
322 * getMaxBasicRate *
323 ************************************************************************
324 DESCRIPTION: Goes over an array of network rates and returns the max basic rate
325
326 INPUT: pRates - Rate array
327
328 OUTPUT:
329
330
331 RETURN: Max basic rate (in network units)
332
333 ************************************************************************/
getMaxBasicRatefromString(UINT8 * ratesString,UINT8 len,UINT8 maxRate)334 UINT8 getMaxBasicRatefromString(UINT8 *ratesString, UINT8 len, UINT8 maxRate)
335 {
336 UINT8 i;
337
338 for (i = 0; i < len; i++)
339 {
340 if ((IS_BASIC_RATE(ratesString[i])) &&
341 (validateNetworkRate(ratesString[i]) == OK))
342 {
343 maxRate = MAX(ratesString[i], maxRate);
344 }
345 }
346
347 return maxRate;
348 }
349
350 /************************************************************************
351 * getMaxActiveRate *
352 ************************************************************************
353 DESCRIPTION: Goes over an array of network rates and returns the max active rate
354
355 INPUT: pRates - Rate array
356
357 OUTPUT:
358
359
360 RETURN: Max active rate (in network units)
361
362 ************************************************************************/
getMaxActiveRatefromString(UINT8 * ratesString,UINT8 len,UINT8 maxRate)363 UINT8 getMaxActiveRatefromString(UINT8 *ratesString, UINT8 len, UINT8 maxRate)
364 {
365 UINT8 i;
366
367 for (i = 0; i < len; i++)
368 {
369 if ((IS_ACTIVE_RATE(ratesString[i])) &&
370 (validateNetworkRate(ratesString[i]) == OK))
371 {
372 maxRate = MAX(ratesString[i], maxRate);
373 }
374 }
375
376 return maxRate;
377 }
378
379 /************************************************************************
380 * validateNetworkRate *
381 ************************************************************************
382 DESCRIPTION: Verify that the input nitwork rate is valid
383
384 INPUT: rate - input network rate
385
386 OUTPUT:
387
388
389 RETURN: OK if valid, otherwise NOK
390
391 ************************************************************************/
validateNetworkRate(UINT8 rate)392 TI_STATUS validateNetworkRate(UINT8 rate)
393 {
394 switch (rate)
395 {
396 case NET_RATE_1M:
397 case NET_RATE_1M_BASIC:
398 case NET_RATE_2M:
399 case NET_RATE_2M_BASIC:
400 case NET_RATE_5_5M:
401 case NET_RATE_5_5M_BASIC:
402 case NET_RATE_11M:
403 case NET_RATE_11M_BASIC:
404 case NET_RATE_22M:
405 case NET_RATE_22M_BASIC:
406 case NET_RATE_6M:
407 case NET_RATE_6M_BASIC:
408 case NET_RATE_9M:
409 case NET_RATE_9M_BASIC:
410 case NET_RATE_12M:
411 case NET_RATE_12M_BASIC:
412 case NET_RATE_18M:
413 case NET_RATE_18M_BASIC:
414 case NET_RATE_24M:
415 case NET_RATE_24M_BASIC:
416 case NET_RATE_36M:
417 case NET_RATE_36M_BASIC:
418 case NET_RATE_48M:
419 case NET_RATE_48M_BASIC:
420 case NET_RATE_54M:
421 case NET_RATE_54M_BASIC:
422 return OK;
423
424 default:
425 return NOK;
426 }
427 }
428
429 /************************************************************************
430 * hostToUtilityRate *
431 ************************************************************************
432 DESCRIPTION: Translates a host rate (1, 2, 3, ....) to utility rate (2, 4, 11, 22, ....)
433
434 INPUT: rate - Host rate
435
436 OUTPUT:
437
438
439 RETURN: Utility rate if the input rate is valid, otherwise returns 0.
440
441 ************************************************************************/
hostToUtilityRate(rate_e rate)442 UINT8 hostToUtilityRate(rate_e rate)
443 {
444 switch (rate)
445 {
446 case DRV_RATE_AUTO:
447 return 0;
448
449 case DRV_RATE_1M:
450 return NET_RATE_1M;
451
452 case DRV_RATE_2M:
453 return NET_RATE_2M;
454
455 case DRV_RATE_5_5M:
456 return NET_RATE_5_5M;
457
458 case DRV_RATE_11M:
459 return NET_RATE_11M;
460
461 case DRV_RATE_22M:
462 return NET_RATE_22M;
463
464 case DRV_RATE_6M:
465 return NET_RATE_6M;
466
467 case DRV_RATE_9M:
468 return NET_RATE_9M;
469
470 case DRV_RATE_12M:
471 return NET_RATE_12M;
472
473 case DRV_RATE_18M:
474 return NET_RATE_18M;
475
476 case DRV_RATE_24M:
477 return NET_RATE_24M;
478
479 case DRV_RATE_36M:
480 return NET_RATE_36M;
481
482 case DRV_RATE_48M:
483 return NET_RATE_48M;
484
485 case DRV_RATE_54M:
486 return NET_RATE_54M;
487
488 default:
489 return 0;
490 }
491 }
492
493 /************************************************************************
494 * utilityToHostRate *
495 ************************************************************************
496 DESCRIPTION: Translates a utility rate (2, 4, 11, 22, ....) to host rate (1, 2, 3, ....) to
497
498 INPUT: rate - Utility rate
499
500 OUTPUT:
501
502
503 RETURN: Host rate if the input rate is valid, otherwise returns 0.
504
505 ************************************************************************/
utilityToHostRate(UINT8 rate)506 rate_e utilityToHostRate(UINT8 rate)
507 {
508 switch (rate)
509 {
510 case 0:
511 return DRV_RATE_AUTO;
512
513 case NET_RATE_1M:
514 case NET_RATE_1M_BASIC:
515 return DRV_RATE_1M;
516
517 case NET_RATE_2M:
518 case NET_RATE_2M_BASIC:
519 return DRV_RATE_2M;
520
521 case NET_RATE_5_5M:
522 case NET_RATE_5_5M_BASIC:
523 return DRV_RATE_5_5M;
524
525 case NET_RATE_11M:
526 case NET_RATE_11M_BASIC:
527 return DRV_RATE_11M;
528
529 case NET_RATE_22M:
530 case NET_RATE_22M_BASIC:
531 return DRV_RATE_22M;
532
533 case NET_RATE_6M:
534 case NET_RATE_6M_BASIC:
535 return DRV_RATE_6M;
536
537 case NET_RATE_9M:
538 case NET_RATE_9M_BASIC:
539 return DRV_RATE_9M;
540
541 case NET_RATE_12M:
542 case NET_RATE_12M_BASIC:
543 return DRV_RATE_12M;
544
545 case NET_RATE_18M:
546 case NET_RATE_18M_BASIC:
547 return DRV_RATE_18M;
548
549 case NET_RATE_24M:
550 case NET_RATE_24M_BASIC:
551 return DRV_RATE_24M;
552
553 case NET_RATE_36M:
554 case NET_RATE_36M_BASIC:
555 return DRV_RATE_36M;
556
557 case NET_RATE_48M:
558 case NET_RATE_48M_BASIC:
559 return DRV_RATE_48M;
560
561 case NET_RATE_54M:
562 case NET_RATE_54M_BASIC:
563 return DRV_RATE_54M;
564
565 default:
566 return DRV_RATE_AUTO;
567 }
568 }
569
570
571 /************************************************************************
572 * bitMapToNetworkStringRates *
573 ************************************************************************
574 DESCRIPTION: Converts bit map to the rates string
575
576 INPUT: suppRatesBitMap - bit map of supported rates
577 basicRatesBitMap - bit map of basic rates
578
579 OUTPUT: string - network format rates array,
580 len - rates array length
581 firstOFDMrateLoc - the index of first OFDM rate in the rates array.
582
583
584 RETURN: None
585
586 ************************************************************************/
bitMapToNetworkStringRates(UINT32 suppRatesBitMap,UINT32 basicRatesBitMap,UINT8 * string,UINT32 * len,UINT32 * firstOFDMrateLoc)587 void bitMapToNetworkStringRates(UINT32 suppRatesBitMap, UINT32 basicRatesBitMap,
588 UINT8 *string, UINT32 *len,
589 UINT32 *firstOFDMrateLoc)
590 {
591
592 UINT32 i = 0;
593
594 if(suppRatesBitMap & DRV_RATE_MASK_1_BARKER)
595 {
596 if(basicRatesBitMap & DRV_RATE_MASK_1_BARKER)
597 string[i++] = NET_RATE_1M_BASIC;
598 else
599 string[i++] = NET_RATE_1M;
600 }
601 if(suppRatesBitMap & DRV_RATE_MASK_2_BARKER)
602 {
603 if(basicRatesBitMap & DRV_RATE_MASK_2_BARKER)
604 string[i++] = NET_RATE_2M_BASIC;
605 else
606 string[i++] = NET_RATE_2M;
607 }
608 if(suppRatesBitMap & DRV_RATE_MASK_5_5_CCK)
609 {
610 if(basicRatesBitMap & DRV_RATE_MASK_5_5_CCK)
611 string[i++] = NET_RATE_5_5M_BASIC;
612 else
613 string[i++] = NET_RATE_5_5M;
614 }
615 if(suppRatesBitMap & DRV_RATE_MASK_11_CCK)
616 {
617 if(basicRatesBitMap & DRV_RATE_MASK_11_CCK)
618 string[i++] = NET_RATE_11M_BASIC;
619 else
620 string[i++] = NET_RATE_11M;
621 }
622 if(suppRatesBitMap & DRV_RATE_MASK_22_PBCC)
623 {
624 if(basicRatesBitMap & DRV_RATE_MASK_22_PBCC)
625 string[i++] = NET_RATE_22M_BASIC;
626 else
627 string[i++] = NET_RATE_22M;
628 }
629
630 *firstOFDMrateLoc = i;
631
632 if(suppRatesBitMap & DRV_RATE_MASK_6_OFDM)
633 {
634 if(basicRatesBitMap & DRV_RATE_MASK_6_OFDM)
635 string[i++] = NET_RATE_6M_BASIC;
636 else
637 string[i++] = NET_RATE_6M;
638 }
639 if(suppRatesBitMap & DRV_RATE_MASK_9_OFDM)
640 {
641 if(basicRatesBitMap & DRV_RATE_MASK_9_OFDM)
642 string[i++] = NET_RATE_9M_BASIC;
643 else
644 string[i++] = NET_RATE_9M;
645 }
646 if(suppRatesBitMap & DRV_RATE_MASK_12_OFDM)
647 {
648 if(basicRatesBitMap & DRV_RATE_MASK_12_OFDM)
649 string[i++] = NET_RATE_12M_BASIC;
650 else
651 string[i++] = NET_RATE_12M;
652 }
653 if(suppRatesBitMap & DRV_RATE_MASK_18_OFDM)
654 {
655 if(basicRatesBitMap & DRV_RATE_MASK_18_OFDM)
656 string[i++] = NET_RATE_18M_BASIC;
657 else
658 string[i++] = NET_RATE_18M;
659 }
660 if(suppRatesBitMap & DRV_RATE_MASK_24_OFDM)
661 {
662 if(basicRatesBitMap & DRV_RATE_MASK_24_OFDM)
663 string[i++] = NET_RATE_24M_BASIC;
664 else
665 string[i++] = NET_RATE_24M;
666 }
667 if(suppRatesBitMap & DRV_RATE_MASK_36_OFDM)
668 {
669 if(basicRatesBitMap & DRV_RATE_MASK_36_OFDM)
670 string[i++] = NET_RATE_36M_BASIC;
671 else
672 string[i++] = NET_RATE_36M;
673 }
674 if(suppRatesBitMap & DRV_RATE_MASK_48_OFDM)
675 {
676 if(basicRatesBitMap & DRV_RATE_MASK_48_OFDM)
677 string[i++] = NET_RATE_48M_BASIC;
678 else
679 string[i++] = NET_RATE_48M;
680 }
681 if(suppRatesBitMap & DRV_RATE_MASK_54_OFDM)
682 {
683 if(basicRatesBitMap & DRV_RATE_MASK_54_OFDM)
684 string[i++] = NET_RATE_54M_BASIC;
685 else
686 string[i++] = NET_RATE_54M;
687 }
688
689 *len = i;
690 }
691
692 /************************************************************************
693 * networkStringToBitMapSuppRates *
694 ************************************************************************
695 DESCRIPTION: Converts supported rates string to the bit map
696
697 INPUT: string - array of rates in the network format
698 len - array length
699
700 OUTPUT: bitMap - bit map of rates.
701
702 RETURN: None
703
704 ************************************************************************/
networkStringToBitMapSuppRates(UINT32 * bitMap,UINT8 * string,UINT32 len)705 void networkStringToBitMapSuppRates(UINT32 *bitMap, UINT8 *string, UINT32 len)
706 {
707 UINT32 i;
708
709 *bitMap = 0;
710
711 for(i=0; i<len; i++)
712 {
713 switch(string[i])
714 {
715 case NET_RATE_1M:
716 case NET_RATE_1M_BASIC:
717 *bitMap |= DRV_RATE_MASK_1_BARKER;
718 break;
719 case NET_RATE_2M:
720 case NET_RATE_2M_BASIC:
721 *bitMap |= DRV_RATE_MASK_2_BARKER;
722 break;
723 case NET_RATE_5_5M:
724 case NET_RATE_5_5M_BASIC:
725 *bitMap |= DRV_RATE_MASK_5_5_CCK;
726 break;
727 case NET_RATE_11M:
728 case NET_RATE_11M_BASIC:
729 *bitMap |= DRV_RATE_MASK_11_CCK;
730 break;
731 case NET_RATE_22M:
732 case NET_RATE_22M_BASIC:
733 *bitMap |= DRV_RATE_MASK_22_PBCC;
734 break;
735 case NET_RATE_6M:
736 case NET_RATE_6M_BASIC:
737 *bitMap |= DRV_RATE_MASK_6_OFDM;
738 break;
739 case NET_RATE_9M:
740 case NET_RATE_9M_BASIC:
741 *bitMap |= DRV_RATE_MASK_9_OFDM;
742 break;
743 case NET_RATE_12M:
744 case NET_RATE_12M_BASIC:
745 *bitMap |= DRV_RATE_MASK_12_OFDM;
746 break;
747 case NET_RATE_18M:
748 case NET_RATE_18M_BASIC:
749 *bitMap |= DRV_RATE_MASK_18_OFDM;
750 break;
751 case NET_RATE_24M:
752 case NET_RATE_24M_BASIC:
753 *bitMap |= DRV_RATE_MASK_24_OFDM;
754 break;
755 case NET_RATE_36M:
756 case NET_RATE_36M_BASIC:
757 *bitMap |= DRV_RATE_MASK_36_OFDM;
758 break;
759 case NET_RATE_48M:
760 case NET_RATE_48M_BASIC:
761 *bitMap |= DRV_RATE_MASK_48_OFDM;
762 break;
763 case NET_RATE_54M:
764 case NET_RATE_54M_BASIC:
765 *bitMap |= DRV_RATE_MASK_54_OFDM;
766 break;
767 default:
768 break;
769 }
770 }
771 }
772
773 /************************************************************************
774 * networkStringToBitMapBasicRates *
775 ************************************************************************
776 DESCRIPTION: Converts basic rates string to the bit map
777
778 INPUT: string - array of rates in the network format
779 len - array length
780
781 OUTPUT: bitMap - bit map of rates.
782
783 RETURN: None
784
785 ************************************************************************/
networkStringToBitMapBasicRates(UINT32 * bitMap,UINT8 * string,UINT32 len)786 void networkStringToBitMapBasicRates(UINT32 *bitMap, UINT8 *string, UINT32 len)
787 {
788 UINT32 i;
789
790 *bitMap = 0;
791
792 for(i=0; i<len; i++)
793 {
794 switch(string[i])
795 {
796 case NET_RATE_1M_BASIC:
797 *bitMap |= DRV_RATE_MASK_1_BARKER;
798 break;
799 case NET_RATE_2M_BASIC:
800 *bitMap |= DRV_RATE_MASK_2_BARKER;
801 break;
802 case NET_RATE_5_5M_BASIC:
803 *bitMap |= DRV_RATE_MASK_5_5_CCK;
804 break;
805 case NET_RATE_11M_BASIC:
806 *bitMap |= DRV_RATE_MASK_11_CCK;
807 break;
808 case NET_RATE_22M_BASIC:
809 *bitMap |= DRV_RATE_MASK_22_PBCC;
810 break;
811 case NET_RATE_6M_BASIC:
812 *bitMap |= DRV_RATE_MASK_6_OFDM;
813 break;
814 case NET_RATE_9M_BASIC:
815 *bitMap |= DRV_RATE_MASK_9_OFDM;
816 break;
817 case NET_RATE_12M_BASIC:
818 *bitMap |= DRV_RATE_MASK_12_OFDM;
819 break;
820 case NET_RATE_18M_BASIC:
821 *bitMap |= DRV_RATE_MASK_18_OFDM;
822 break;
823 case NET_RATE_24M_BASIC:
824 *bitMap |= DRV_RATE_MASK_24_OFDM;
825 break;
826 case NET_RATE_36M_BASIC:
827 *bitMap |= DRV_RATE_MASK_36_OFDM;
828 break;
829 case NET_RATE_48M_BASIC:
830 *bitMap |= DRV_RATE_MASK_48_OFDM;
831 break;
832 case NET_RATE_54M_BASIC:
833 *bitMap |= DRV_RATE_MASK_54_OFDM;
834 break;
835 default:
836 break;
837 }
838 }
839 }
840
validateRates(UINT32 * pBasicRateMask,UINT32 * pSuppRateMask,UINT32 * pTxRate,modulationType_e * modulation,BOOL dot11a)841 void validateRates(UINT32 *pBasicRateMask, UINT32 *pSuppRateMask,
842 UINT32 *pTxRate, modulationType_e *modulation, BOOL dot11a)
843 {
844 rate_e maxSuppRate;
845
846 /* Make sure that the basic rate set is included in the supported rate set */
847 (*pBasicRateMask) &= (*pSuppRateMask);
848
849 /* Ignore modulation in the Tx rate. */
850 switch (*pTxRate)
851 {
852 case REG_RATE_AUTO_BIT:
853 *pTxRate = DRV_RATE_AUTO;
854 break;
855
856 case REG_RATE_1M_BIT:
857 *pTxRate = DRV_RATE_1M;
858 break;
859
860 case REG_RATE_2M_BIT:
861 *pTxRate = DRV_RATE_2M;
862 break;
863
864 case REG_RATE_5_5M_CCK_BIT:
865 *pTxRate = DRV_RATE_5_5M;
866 break;
867
868 case REG_RATE_11M_CCK_BIT:
869 *pTxRate = DRV_RATE_11M;
870 break;
871
872 case REG_RATE_22M_PBCC_BIT:
873 *pTxRate = DRV_RATE_22M;
874 break;
875
876 case REG_RATE_6M_OFDM_BIT:
877 *pTxRate = DRV_RATE_6M;
878 break;
879 case REG_RATE_9M_OFDM_BIT:
880 *pTxRate = DRV_RATE_9M;
881 break;
882 case REG_RATE_12M_OFDM_BIT:
883 *pTxRate = DRV_RATE_12M;
884 break;
885 case REG_RATE_18M_OFDM_BIT:
886 *pTxRate = DRV_RATE_18M;
887 break;
888 case REG_RATE_24M_OFDM_BIT:
889 *pTxRate = DRV_RATE_24M;
890 break;
891 case REG_RATE_36M_OFDM_BIT:
892 *pTxRate = DRV_RATE_36M;
893 break;
894 case REG_RATE_48M_OFDM_BIT:
895 *pTxRate = DRV_RATE_48M;
896 break;
897 case REG_RATE_54M_OFDM_BIT:
898 *pTxRate = DRV_RATE_54M;
899 break;
900 default:
901 *pTxRate = DRV_RATE_AUTO;
902 break;
903 }
904
905 /* Make sure that in dot11a mode the desired tx rate is OFDM rate */
906 if(dot11a)
907 if((*pTxRate < DRV_RATE_6M) && (*pTxRate != DRV_RATE_AUTO))
908 *pTxRate = DRV_RATE_6M;
909
910 /* Make sure that the Tx rate is less or equsl to the max supported rate */
911 maxSuppRate = calculateMaxSupportedRate(pSuppRateMask);
912 if(maxSuppRate == DRV_RATE_INVALID)
913 {
914 if(dot11a)
915 *pTxRate = DRV_RATE_6M;
916 else
917 *pTxRate = DRV_RATE_1M;
918 }
919 else if(*pTxRate > (UINT32)maxSuppRate)
920 *pTxRate = (UINT32)maxSuppRate;
921
922 /* Handle desired modulation */
923 if(maxSuppRate == DRV_RATE_22M)
924 *modulation = DRV_MODULATION_PBCC;
925 else if(maxSuppRate < DRV_RATE_22M)
926 *modulation = DRV_MODULATION_CCK;
927 else
928 *modulation = DRV_MODULATION_OFDM;
929 }
930
ConvertHwBitRateToAppRate(UINT32 HwRate,rate_e * AppRate)931 int ConvertHwBitRateToAppRate(UINT32 HwRate,rate_e *AppRate)
932 {
933 rate_e Rate = DRV_RATE_AUTO;
934 int Stt = OK;
935
936 switch (HwRate)
937 {
938 /*
939 * The handle for 5.5/11/22 PBCC was removed !!!
940 */
941
942 case HW_BIT_RATE_1MBPS: Rate = DRV_RATE_1M; break;
943 case HW_BIT_RATE_2MBPS: Rate = DRV_RATE_2M; break;
944 case HW_BIT_RATE_5_5MBPS: Rate = DRV_RATE_5_5M; break;
945 case HW_BIT_RATE_6MBPS: Rate = DRV_RATE_6M; break;
946 case HW_BIT_RATE_9MBPS: Rate = DRV_RATE_9M; break;
947 case HW_BIT_RATE_11MBPS: Rate = DRV_RATE_11M; break;
948 case HW_BIT_RATE_12MBPS: Rate = DRV_RATE_12M; break;
949 case HW_BIT_RATE_18MBPS: Rate = DRV_RATE_18M; break;
950 case HW_BIT_RATE_22MBPS: Rate = DRV_RATE_22M; break;
951 case HW_BIT_RATE_24MBPS: Rate = DRV_RATE_24M; break;
952 case HW_BIT_RATE_36MBPS: Rate = DRV_RATE_36M; break;
953 case HW_BIT_RATE_48MBPS: Rate = DRV_RATE_48M; break;
954 case HW_BIT_RATE_54MBPS: Rate = DRV_RATE_54M; break;
955 default:
956 Stt = NOK;
957 break;
958 }
959
960 if (Stt == OK)
961 *AppRate = Rate;
962 else
963 *AppRate = DRV_RATE_1M;
964
965 return (Stt);
966 }
ConvertAppRateToHwBitMapRate(UINT32 AppRate,UINT32 * HwRate)967 int ConvertAppRateToHwBitMapRate(UINT32 AppRate, UINT32 *HwRate)
968 {
969 UINT32 Rate = 0;
970 int Stt = OK;
971
972 switch (AppRate)
973 {
974 /* when rateAdaptaion in FW */
975 case DRV_RATE_AUTO: Rate = 0; break;
976
977 case DRV_RATE_1M: Rate = HW_BIT_RATE_1MBPS; break;
978 case DRV_RATE_2M: Rate = HW_BIT_RATE_2MBPS; break;
979 case DRV_RATE_5_5M: Rate = HW_BIT_RATE_5_5MBPS; break;
980 case DRV_RATE_11M: Rate = HW_BIT_RATE_11MBPS; break;
981 case DRV_RATE_22M: Rate = HW_BIT_RATE_22MBPS; break;
982 case DRV_RATE_6M: Rate = HW_BIT_RATE_6MBPS; break;
983 case DRV_RATE_9M: Rate = HW_BIT_RATE_9MBPS; break;
984 case DRV_RATE_12M: Rate = HW_BIT_RATE_12MBPS; break;
985 case DRV_RATE_18M: Rate = HW_BIT_RATE_18MBPS; break;
986 case DRV_RATE_24M: Rate = HW_BIT_RATE_24MBPS; break;
987 case DRV_RATE_36M: Rate = HW_BIT_RATE_36MBPS; break;
988 case DRV_RATE_48M: Rate = HW_BIT_RATE_48MBPS; break;
989 case DRV_RATE_54M: Rate = HW_BIT_RATE_54MBPS; break;
990 default:
991 Stt = NOK;
992 break;
993 }
994
995 if (Stt == OK)
996 *HwRate = Rate;
997 else
998 *HwRate = HW_BIT_RATE_1MBPS;
999
1000
1001
1002 return (Stt);
1003 }
1004
ConvertAppRatesToBitmap(UINT16 AppRatesBitmap,UINT32 * HwRatesBitmap)1005 int ConvertAppRatesToBitmap(UINT16 AppRatesBitmap, UINT32 *HwRatesBitmap)
1006 {
1007 UINT16 RatesBitmap = 0;
1008
1009 if (AppRatesBitmap & DRV_RATE_MASK_1_BARKER) RatesBitmap |= HW_BIT_RATE_1MBPS;
1010 if (AppRatesBitmap & DRV_RATE_MASK_2_BARKER) RatesBitmap |= HW_BIT_RATE_2MBPS;
1011 if (AppRatesBitmap & DRV_RATE_MASK_5_5_CCK) RatesBitmap |= HW_BIT_RATE_5_5MBPS;
1012 if (AppRatesBitmap & DRV_RATE_MASK_11_CCK) RatesBitmap |= HW_BIT_RATE_11MBPS;
1013 if (AppRatesBitmap & DRV_RATE_MASK_22_PBCC) RatesBitmap |= HW_BIT_RATE_22MBPS;
1014 if (AppRatesBitmap & DRV_RATE_MASK_6_OFDM) RatesBitmap |= HW_BIT_RATE_6MBPS;
1015 if (AppRatesBitmap & DRV_RATE_MASK_9_OFDM) RatesBitmap |= HW_BIT_RATE_9MBPS;
1016 if (AppRatesBitmap & DRV_RATE_MASK_12_OFDM) RatesBitmap |= HW_BIT_RATE_12MBPS;
1017 if (AppRatesBitmap & DRV_RATE_MASK_18_OFDM) RatesBitmap |= HW_BIT_RATE_18MBPS;
1018 if (AppRatesBitmap & DRV_RATE_MASK_24_OFDM) RatesBitmap |= HW_BIT_RATE_24MBPS;
1019 if (AppRatesBitmap & DRV_RATE_MASK_36_OFDM) RatesBitmap |= HW_BIT_RATE_36MBPS;
1020 if (AppRatesBitmap & DRV_RATE_MASK_48_OFDM) RatesBitmap |= HW_BIT_RATE_48MBPS;
1021 if (AppRatesBitmap & DRV_RATE_MASK_54_OFDM) RatesBitmap |= HW_BIT_RATE_54MBPS;
1022
1023
1024 *HwRatesBitmap = RatesBitmap;
1025
1026 return (OK);
1027 }
1028
1029 /*
1030 * ----------------------------------------------------------------------------
1031 * Function : ConvertHwRateToDrvRate
1032 *
1033 * Input :
1034 * Output :
1035 * Process : convert rate from Hw rate to Drv rate
1036 * Note(s) :
1037 * -----------------------------------------------------------------------------
1038 */
1039
ConvertHwRateToDrvRate(UINT8 HwRate,BOOL bOFDMMudulation)1040 rate_e ConvertHwRateToDrvRate(UINT8 HwRate, BOOL bOFDMMudulation)
1041 {
1042 /*
1043 * This special case is done because of identical values of HW_RATE_1M & RATE_12MBPS
1044 * These values are Hw oriented and can't be changed. The way for distinguishing
1045 * between them is using the modulation of the packet
1046 */
1047 if ( (HwRate == RATE_12MBPS) && (bOFDMMudulation) )
1048 {
1049 return DRV_RATE_12M;
1050 }
1051
1052 switch (HwRate)
1053 {
1054 case RATE_1MBPS: return DRV_RATE_1M;
1055
1056 case RATE_2MBPS: return DRV_RATE_2M;
1057
1058 case RATE_5_5MBPS: return DRV_RATE_5_5M;
1059
1060 case RATE_6MBPS: return DRV_RATE_6M;
1061
1062 case RATE_9MBPS: return DRV_RATE_9M;
1063
1064 case RATE_11MBPS: return DRV_RATE_11M;
1065
1066 /* RATE_12MBPS is covered on the top */
1067
1068 case RATE_18MBPS: return DRV_RATE_18M;
1069
1070 case RATE_22MBPS: return DRV_RATE_22M;
1071
1072 case RATE_24MBPS: return DRV_RATE_24M;
1073
1074 case RATE_36MBPS: return DRV_RATE_36M;
1075
1076 case RATE_48MBPS: return DRV_RATE_48M;
1077
1078 case RATE_54MBPS: return DRV_RATE_54M;
1079
1080 default:
1081 /* Return error indication */
1082 return DRV_RATE_AUTO;
1083 }
1084 }
1085
1086 /*
1087 * ----------------------------------------------------------------------------
1088 * Function : ConvertHwRateToDrvRate
1089 *
1090 * Input :
1091 * Output :
1092 * Process : convert rate from Drv rate to Hw rate
1093 * Note(s) :
1094 * -----------------------------------------------------------------------------
1095 */
ConvertDrvRate2HwRate(rate_e eRate)1096 UINT8 ConvertDrvRate2HwRate(rate_e eRate)
1097 {
1098 switch(eRate)
1099 {
1100 case DRV_RATE_1M: return RATE_1MBPS;
1101
1102 case DRV_RATE_2M: return RATE_2MBPS;
1103
1104 case DRV_RATE_5_5M: return RATE_5_5MBPS;
1105
1106 case DRV_RATE_11M: return RATE_11MBPS;
1107
1108 case DRV_RATE_22M: return RATE_22MBPS;
1109
1110 case DRV_RATE_6M: return RATE_6MBPS;
1111
1112 case DRV_RATE_9M: return RATE_9MBPS;
1113
1114 case DRV_RATE_12M: return RATE_12MBPS;
1115
1116 case DRV_RATE_18M: return RATE_18MBPS;
1117
1118 case DRV_RATE_24M: return RATE_24MBPS;
1119
1120 case DRV_RATE_36M: return RATE_36MBPS;
1121
1122 case DRV_RATE_48M: return RATE_48MBPS;
1123
1124 case DRV_RATE_54M: return RATE_54MBPS;
1125
1126 default:
1127 WLAN_OS_REPORT(("ERROR: ConvertDrvRate2HwRate: Invalid input Rate = %d\n ", eRate));
1128 return 0;
1129 }
1130 }
1131
1132
1133
1134
calculateMaxSupportedRate(UINT32 * pSuppRateMask)1135 rate_e calculateMaxSupportedRate(UINT32 *pSuppRateMask)
1136 {
1137 if((*pSuppRateMask) & DRV_RATE_MASK_54_OFDM)
1138 return DRV_RATE_54M;
1139 if((*pSuppRateMask) & DRV_RATE_MASK_48_OFDM)
1140 return DRV_RATE_48M;
1141 if((*pSuppRateMask) & DRV_RATE_MASK_36_OFDM)
1142 return DRV_RATE_36M;
1143 if((*pSuppRateMask) & DRV_RATE_MASK_24_OFDM)
1144 return DRV_RATE_24M;
1145 if((*pSuppRateMask) & DRV_RATE_MASK_22_PBCC)
1146 return DRV_RATE_22M;
1147 if((*pSuppRateMask) & DRV_RATE_MASK_18_OFDM)
1148 return DRV_RATE_18M;
1149 if((*pSuppRateMask) & DRV_RATE_MASK_12_OFDM)
1150 return DRV_RATE_12M;
1151 if((*pSuppRateMask) & DRV_RATE_MASK_11_CCK)
1152 return DRV_RATE_11M;
1153 if((*pSuppRateMask) & DRV_RATE_MASK_9_OFDM)
1154 return DRV_RATE_9M;
1155 if((*pSuppRateMask) & DRV_RATE_MASK_6_OFDM)
1156 return DRV_RATE_6M;
1157 if((*pSuppRateMask) & DRV_RATE_MASK_5_5_CCK)
1158 return DRV_RATE_5_5M;
1159 if((*pSuppRateMask) & DRV_RATE_MASK_2_BARKER)
1160 return DRV_RATE_2M;
1161 if((*pSuppRateMask) & DRV_RATE_MASK_1_BARKER)
1162 return DRV_RATE_1M;
1163
1164 return DRV_RATE_INVALID;
1165 }
1166
1167
1168
1169 /************************************************************************
1170 * hex_to_string *
1171 ************************************************************************
1172 DESCRIPTION: Converts hex buffer to string buffer.
1173
1174 NOTE: 1. The caller has to make sure that the pString size is at
1175 lease: ((Size * 2) + 1)
1176 2. A string terminator is inserted into lase char of the string
1177 ************************************************************************/
convert_hex_to_string(tiUINT8 * pBuffer,char * pString,tiUINT8 Size)1178 void convert_hex_to_string(tiUINT8 *pBuffer, char *pString, tiUINT8 Size)
1179 {
1180 int index;
1181 unsigned char temp_nibble;
1182
1183 /* Go over pBuffer and convert it to chars */
1184 for (index = 0; index < Size; index++)
1185 {
1186 /* First nibble */
1187 temp_nibble = (pBuffer[index] & 0x0F);
1188 if (temp_nibble <= 9)
1189 {
1190 pString[(index << 1) + 1] = temp_nibble + '0';
1191 }
1192 else
1193 {
1194 pString[(index << 1) + 1] = temp_nibble - 10 + 'A';
1195 }
1196
1197 /* Second nibble */
1198 temp_nibble = ((pBuffer[index] & 0xF0) >> 4);
1199 if (temp_nibble <= 9)
1200 {
1201 pString[(index << 1)] = temp_nibble + '0';
1202 }
1203 else
1204 {
1205 pString[(index << 1)] = temp_nibble - 10 + 'A';
1206 }
1207 }
1208
1209 /* Put string terminator */
1210 pString[(Size * 2)] = 0;
1211 }
1212
1213
1214
1215
1216
1217
1218
1219
translateBasicRateValueToMask(UINT32 value,BOOL dot11a)1220 UINT32 translateBasicRateValueToMask(UINT32 value, BOOL dot11a)
1221 {
1222 if(!dot11a)
1223 {
1224 switch(value)
1225 {
1226 case BASIC_RATE_SET_1_2:
1227 return DRV_RATE_MASK_1_BARKER | DRV_RATE_MASK_2_BARKER;
1228 case BASIC_RATE_SET_1_2_5_5_11:
1229 return DRV_RATE_MASK_1_BARKER | DRV_RATE_MASK_2_BARKER | DRV_RATE_MASK_5_5_CCK | DRV_RATE_MASK_11_CCK;
1230 case BASIC_RATE_SET_UP_TO_12:
1231 return DRV_RATE_MASK_1_BARKER | DRV_RATE_MASK_2_BARKER | DRV_RATE_MASK_5_5_CCK | DRV_RATE_MASK_11_CCK | DRV_RATE_MASK_6_OFDM | DRV_RATE_MASK_9_OFDM | DRV_RATE_MASK_12_OFDM;
1232 case BASIC_RATE_SET_UP_TO_18:
1233 return DRV_RATE_MASK_1_BARKER | DRV_RATE_MASK_2_BARKER | DRV_RATE_MASK_5_5_CCK | DRV_RATE_MASK_11_CCK | DRV_RATE_MASK_6_OFDM | DRV_RATE_MASK_9_OFDM | DRV_RATE_MASK_12_OFDM | DRV_RATE_MASK_18_OFDM;
1234 case BASIC_RATE_SET_UP_TO_24:
1235 return DRV_RATE_MASK_1_BARKER | DRV_RATE_MASK_2_BARKER | DRV_RATE_MASK_5_5_CCK | DRV_RATE_MASK_11_CCK | DRV_RATE_MASK_6_OFDM | DRV_RATE_MASK_9_OFDM | DRV_RATE_MASK_12_OFDM | DRV_RATE_MASK_18_OFDM | DRV_RATE_MASK_24_OFDM;
1236 case BASIC_RATE_SET_UP_TO_36:
1237 return DRV_RATE_MASK_1_BARKER | DRV_RATE_MASK_2_BARKER | DRV_RATE_MASK_5_5_CCK | DRV_RATE_MASK_11_CCK | DRV_RATE_MASK_6_OFDM | DRV_RATE_MASK_9_OFDM | DRV_RATE_MASK_12_OFDM | DRV_RATE_MASK_18_OFDM | DRV_RATE_MASK_24_OFDM | DRV_RATE_MASK_36_OFDM;
1238 case BASIC_RATE_SET_UP_TO_48:
1239 return DRV_RATE_MASK_1_BARKER | DRV_RATE_MASK_2_BARKER | DRV_RATE_MASK_5_5_CCK | DRV_RATE_MASK_11_CCK | DRV_RATE_MASK_6_OFDM | DRV_RATE_MASK_9_OFDM | DRV_RATE_MASK_12_OFDM | DRV_RATE_MASK_18_OFDM | DRV_RATE_MASK_24_OFDM | DRV_RATE_MASK_36_OFDM | DRV_RATE_MASK_48_OFDM;
1240 case BASIC_RATE_SET_UP_TO_54:
1241 return DRV_RATE_MASK_1_BARKER | DRV_RATE_MASK_2_BARKER | DRV_RATE_MASK_5_5_CCK | DRV_RATE_MASK_11_CCK | DRV_RATE_MASK_6_OFDM | DRV_RATE_MASK_9_OFDM | DRV_RATE_MASK_12_OFDM | DRV_RATE_MASK_18_OFDM | DRV_RATE_MASK_24_OFDM | DRV_RATE_MASK_36_OFDM | DRV_RATE_MASK_48_OFDM | DRV_RATE_MASK_54_OFDM;
1242 case BASIC_RATE_SET_6_12_24:
1243 return DRV_RATE_MASK_6_OFDM | DRV_RATE_MASK_12_OFDM | DRV_RATE_MASK_24_OFDM;
1244 case BASIC_RATE_SET_1_2_5_5_6_11_12_24:
1245 return DRV_RATE_MASK_1_BARKER | DRV_RATE_MASK_2_BARKER | DRV_RATE_MASK_5_5_CCK | DRV_RATE_MASK_11_CCK | DRV_RATE_MASK_6_OFDM | DRV_RATE_MASK_12_OFDM | DRV_RATE_MASK_24_OFDM;
1246 default:
1247 return DRV_RATE_MASK_1_BARKER | DRV_RATE_MASK_2_BARKER;
1248 }
1249 }
1250 else
1251 {
1252 switch(value)
1253 {
1254 case BASIC_RATE_SET_UP_TO_12:
1255 return DRV_RATE_MASK_6_OFDM | DRV_RATE_MASK_9_OFDM | DRV_RATE_MASK_12_OFDM;
1256 case BASIC_RATE_SET_UP_TO_18:
1257 return DRV_RATE_MASK_6_OFDM | DRV_RATE_MASK_9_OFDM | DRV_RATE_MASK_12_OFDM | DRV_RATE_MASK_18_OFDM;
1258 case BASIC_RATE_SET_UP_TO_24:
1259 return DRV_RATE_MASK_6_OFDM | DRV_RATE_MASK_9_OFDM | DRV_RATE_MASK_12_OFDM | DRV_RATE_MASK_18_OFDM | DRV_RATE_MASK_24_OFDM;
1260 case BASIC_RATE_SET_UP_TO_36:
1261 return DRV_RATE_MASK_6_OFDM | DRV_RATE_MASK_9_OFDM | DRV_RATE_MASK_12_OFDM | DRV_RATE_MASK_18_OFDM | DRV_RATE_MASK_24_OFDM | DRV_RATE_MASK_36_OFDM;
1262 case BASIC_RATE_SET_UP_TO_48:
1263 return DRV_RATE_MASK_6_OFDM | DRV_RATE_MASK_9_OFDM | DRV_RATE_MASK_12_OFDM | DRV_RATE_MASK_18_OFDM | DRV_RATE_MASK_24_OFDM | DRV_RATE_MASK_36_OFDM | DRV_RATE_MASK_48_OFDM;
1264 case BASIC_RATE_SET_UP_TO_54:
1265 return DRV_RATE_MASK_6_OFDM | DRV_RATE_MASK_9_OFDM | DRV_RATE_MASK_12_OFDM | DRV_RATE_MASK_18_OFDM | DRV_RATE_MASK_24_OFDM | DRV_RATE_MASK_36_OFDM | DRV_RATE_MASK_48_OFDM | DRV_RATE_MASK_54_OFDM;
1266 case BASIC_RATE_SET_6_12_24:
1267 return DRV_RATE_MASK_6_OFDM | DRV_RATE_MASK_12_OFDM | DRV_RATE_MASK_24_OFDM;
1268 default:
1269 return DRV_RATE_MASK_6_OFDM | DRV_RATE_MASK_12_OFDM | DRV_RATE_MASK_24_OFDM;
1270 }
1271 }
1272 }
1273
translateSupportedRateValueToMask(UINT32 value,BOOL dot11a)1274 UINT32 translateSupportedRateValueToMask(UINT32 value, BOOL dot11a)
1275 {
1276 if(!dot11a)
1277 {
1278 switch(value)
1279 {
1280 case SUPPORTED_RATE_SET_1_2:
1281 return DRV_RATE_MASK_1_BARKER | DRV_RATE_MASK_2_BARKER;
1282 case SUPPORTED_RATE_SET_1_2_5_5_11:
1283 return DRV_RATE_MASK_1_BARKER | DRV_RATE_MASK_2_BARKER | DRV_RATE_MASK_5_5_CCK | DRV_RATE_MASK_11_CCK;
1284 case SUPPORTED_RATE_SET_1_2_5_5_11_22:
1285 return DRV_RATE_MASK_1_BARKER | DRV_RATE_MASK_2_BARKER | DRV_RATE_MASK_5_5_CCK | DRV_RATE_MASK_11_CCK | DRV_RATE_MASK_22_PBCC;
1286 case SUPPORTED_RATE_SET_UP_TO_18:
1287 return DRV_RATE_MASK_1_BARKER | DRV_RATE_MASK_2_BARKER | DRV_RATE_MASK_5_5_CCK | DRV_RATE_MASK_11_CCK | DRV_RATE_MASK_6_OFDM | DRV_RATE_MASK_9_OFDM | DRV_RATE_MASK_12_OFDM | DRV_RATE_MASK_18_OFDM;
1288 case SUPPORTED_RATE_SET_UP_TO_24:
1289 return DRV_RATE_MASK_1_BARKER | DRV_RATE_MASK_2_BARKER | DRV_RATE_MASK_5_5_CCK | DRV_RATE_MASK_11_CCK | DRV_RATE_MASK_6_OFDM | DRV_RATE_MASK_9_OFDM | DRV_RATE_MASK_12_OFDM | DRV_RATE_MASK_18_OFDM | DRV_RATE_MASK_24_OFDM;
1290 case SUPPORTED_RATE_SET_UP_TO_36:
1291 return DRV_RATE_MASK_1_BARKER | DRV_RATE_MASK_2_BARKER | DRV_RATE_MASK_5_5_CCK | DRV_RATE_MASK_11_CCK | DRV_RATE_MASK_6_OFDM | DRV_RATE_MASK_9_OFDM | DRV_RATE_MASK_12_OFDM | DRV_RATE_MASK_18_OFDM | DRV_RATE_MASK_24_OFDM | DRV_RATE_MASK_36_OFDM;
1292 case SUPPORTED_RATE_SET_UP_TO_48:
1293 return DRV_RATE_MASK_1_BARKER | DRV_RATE_MASK_2_BARKER | DRV_RATE_MASK_5_5_CCK | DRV_RATE_MASK_11_CCK | DRV_RATE_MASK_6_OFDM | DRV_RATE_MASK_9_OFDM | DRV_RATE_MASK_12_OFDM | DRV_RATE_MASK_18_OFDM | DRV_RATE_MASK_24_OFDM | DRV_RATE_MASK_36_OFDM | DRV_RATE_MASK_48_OFDM;
1294 case SUPPORTED_RATE_SET_UP_TO_54:
1295 return DRV_RATE_MASK_1_BARKER | DRV_RATE_MASK_2_BARKER | DRV_RATE_MASK_5_5_CCK | DRV_RATE_MASK_11_CCK | DRV_RATE_MASK_6_OFDM | DRV_RATE_MASK_9_OFDM | DRV_RATE_MASK_12_OFDM | DRV_RATE_MASK_18_OFDM | DRV_RATE_MASK_24_OFDM | DRV_RATE_MASK_36_OFDM | DRV_RATE_MASK_48_OFDM | DRV_RATE_MASK_54_OFDM;
1296 case SUPPORTED_RATE_SET_ALL:
1297 return DRV_RATE_MASK_1_BARKER | DRV_RATE_MASK_2_BARKER | DRV_RATE_MASK_5_5_CCK | DRV_RATE_MASK_11_CCK | DRV_RATE_MASK_22_PBCC | DRV_RATE_MASK_6_OFDM | DRV_RATE_MASK_9_OFDM | DRV_RATE_MASK_12_OFDM | DRV_RATE_MASK_18_OFDM | DRV_RATE_MASK_24_OFDM | DRV_RATE_MASK_36_OFDM | DRV_RATE_MASK_48_OFDM | DRV_RATE_MASK_54_OFDM;
1298 case SUPPORTED_RATE_SET_ALL_OFDM:
1299 return DRV_RATE_MASK_6_OFDM | DRV_RATE_MASK_9_OFDM | DRV_RATE_MASK_12_OFDM | DRV_RATE_MASK_18_OFDM | DRV_RATE_MASK_24_OFDM | DRV_RATE_MASK_36_OFDM | DRV_RATE_MASK_48_OFDM | DRV_RATE_MASK_54_OFDM;
1300 default:
1301 return DRV_RATE_MASK_1_BARKER | DRV_RATE_MASK_2_BARKER | DRV_RATE_MASK_5_5_CCK | DRV_RATE_MASK_11_CCK | DRV_RATE_MASK_22_PBCC | DRV_RATE_MASK_6_OFDM | DRV_RATE_MASK_9_OFDM | DRV_RATE_MASK_12_OFDM | DRV_RATE_MASK_18_OFDM | DRV_RATE_MASK_24_OFDM | DRV_RATE_MASK_36_OFDM | DRV_RATE_MASK_48_OFDM | DRV_RATE_MASK_54_OFDM;
1302 }
1303 }
1304 else
1305 {
1306 switch(value)
1307 {
1308 case SUPPORTED_RATE_SET_UP_TO_18:
1309 return DRV_RATE_MASK_6_OFDM | DRV_RATE_MASK_9_OFDM | DRV_RATE_MASK_12_OFDM | DRV_RATE_MASK_18_OFDM;
1310 case SUPPORTED_RATE_SET_UP_TO_24:
1311 return DRV_RATE_MASK_6_OFDM | DRV_RATE_MASK_9_OFDM | DRV_RATE_MASK_12_OFDM | DRV_RATE_MASK_18_OFDM | DRV_RATE_MASK_24_OFDM;
1312 case SUPPORTED_RATE_SET_UP_TO_36:
1313 return DRV_RATE_MASK_6_OFDM | DRV_RATE_MASK_9_OFDM | DRV_RATE_MASK_12_OFDM | DRV_RATE_MASK_18_OFDM | DRV_RATE_MASK_24_OFDM | DRV_RATE_MASK_36_OFDM;
1314 case SUPPORTED_RATE_SET_UP_TO_48:
1315 return DRV_RATE_MASK_6_OFDM | DRV_RATE_MASK_9_OFDM | DRV_RATE_MASK_12_OFDM | DRV_RATE_MASK_18_OFDM | DRV_RATE_MASK_24_OFDM | DRV_RATE_MASK_36_OFDM | DRV_RATE_MASK_48_OFDM;
1316 case SUPPORTED_RATE_SET_UP_TO_54:
1317 return DRV_RATE_MASK_6_OFDM | DRV_RATE_MASK_9_OFDM | DRV_RATE_MASK_12_OFDM | DRV_RATE_MASK_18_OFDM | DRV_RATE_MASK_24_OFDM | DRV_RATE_MASK_36_OFDM | DRV_RATE_MASK_48_OFDM | DRV_RATE_MASK_54_OFDM;
1318
1319 case SUPPORTED_RATE_SET_ALL:
1320 case SUPPORTED_RATE_SET_ALL_OFDM:
1321 return DRV_RATE_MASK_6_OFDM | DRV_RATE_MASK_9_OFDM | DRV_RATE_MASK_12_OFDM | DRV_RATE_MASK_18_OFDM | DRV_RATE_MASK_24_OFDM | DRV_RATE_MASK_36_OFDM | DRV_RATE_MASK_48_OFDM | DRV_RATE_MASK_54_OFDM;
1322 default:
1323 return DRV_RATE_MASK_6_OFDM | DRV_RATE_MASK_9_OFDM | DRV_RATE_MASK_12_OFDM | DRV_RATE_MASK_18_OFDM | DRV_RATE_MASK_24_OFDM | DRV_RATE_MASK_36_OFDM | DRV_RATE_MASK_48_OFDM | DRV_RATE_MASK_54_OFDM;
1324 }
1325 }
1326 }
1327
validateRatesVsBand(UINT32 * supportedMask,UINT32 * basicMask,BOOL dot11a)1328 void validateRatesVsBand(UINT32 *supportedMask, UINT32 *basicMask, BOOL dot11a)
1329 {
1330 if(dot11a)
1331 *supportedMask &= ~(DRV_RATE_MASK_1_BARKER | DRV_RATE_MASK_2_BARKER | DRV_RATE_MASK_5_5_CCK | DRV_RATE_MASK_11_CCK | DRV_RATE_MASK_22_PBCC);
1332
1333 *basicMask &= *supportedMask;
1334
1335 if(*basicMask == 0)
1336 {
1337 if(dot11a)
1338 *basicMask = DRV_RATE_MASK_6_OFDM | DRV_RATE_MASK_12_OFDM | DRV_RATE_MASK_24_OFDM;
1339 else
1340 *basicMask = DRV_RATE_MASK_1_BARKER | DRV_RATE_MASK_2_BARKER;
1341 }
1342
1343 }
1344
1345
findMaxActiveRate(UINT32 ratesBitMap)1346 rate_e findMaxActiveRate( UINT32 ratesBitMap)
1347 {
1348 rate_e rate = DRV_RATE_1M;
1349
1350 if(ratesBitMap & DRV_RATE_MASK_1_BARKER) rate = DRV_RATE_1M;
1351 if(ratesBitMap & DRV_RATE_MASK_2_BARKER) rate = DRV_RATE_2M;
1352 if(ratesBitMap & DRV_RATE_MASK_5_5_CCK) rate = DRV_RATE_5_5M;
1353 if(ratesBitMap & DRV_RATE_MASK_11_CCK) rate = DRV_RATE_11M;
1354 if(ratesBitMap & DRV_RATE_MASK_22_PBCC) rate = DRV_RATE_22M;
1355 if(ratesBitMap & DRV_RATE_MASK_6_OFDM) rate = DRV_RATE_6M;
1356 if(ratesBitMap & DRV_RATE_MASK_9_OFDM) rate = DRV_RATE_9M;
1357 if(ratesBitMap & DRV_RATE_MASK_12_OFDM) rate = DRV_RATE_12M;
1358 if(ratesBitMap & DRV_RATE_MASK_18_OFDM) rate = DRV_RATE_18M;
1359 if(ratesBitMap & DRV_RATE_MASK_24_OFDM) rate = DRV_RATE_24M;
1360 if(ratesBitMap & DRV_RATE_MASK_36_OFDM) rate = DRV_RATE_36M;
1361 if(ratesBitMap & DRV_RATE_MASK_48_OFDM) rate = DRV_RATE_48M;
1362 if(ratesBitMap & DRV_RATE_MASK_54_OFDM) rate = DRV_RATE_54M;
1363
1364 return rate;
1365 }
1366
1367
1368 /************************************************************************
1369 * getMaxRate *
1370 ************************************************************************
1371 DESCRIPTION: This function return the Max rate.
1372 In addition return the matched modulation type
1373
1374 INPUT: rateBitMap - The supported basic rates
1375 operationMode - Current operation mode, used only to set default rate.
1376
1377
1378 OUTPUT: rate - The max rate from the OFDM allowed rates.
1379 modulation - The modulation of the Max Basic rate.
1380
1381 RETURN: None
1382
1383 ************************************************************************/
getMaxRate(UINT32 ratesBitMap,rate_e * rate,modulationType_e * modulation,dot11mode_e operationMode)1384 void getMaxRate(UINT32 ratesBitMap, rate_e *rate, modulationType_e *modulation, dot11mode_e operationMode)
1385 {
1386 rate_e maxRate = DRV_RATE_INVALID;
1387
1388 /* find max rate */
1389 if(ratesBitMap & DRV_RATE_MASK_1_BARKER) maxRate = DRV_RATE_1M;
1390 if(ratesBitMap & DRV_RATE_MASK_2_BARKER) maxRate = DRV_RATE_2M;
1391 if(ratesBitMap & DRV_RATE_MASK_5_5_CCK) maxRate = DRV_RATE_5_5M;
1392 if(ratesBitMap & DRV_RATE_MASK_11_CCK) maxRate = DRV_RATE_11M;
1393
1394 /* Ctrl and Mgmt frames should not be transmitted at 22Mbps PBCC */
1395 /*if(ratesBitMap & DRV_RATE_MASK_22_PBCC) maxRate = DRV_RATE_22M;*/
1396
1397 if(ratesBitMap & DRV_RATE_MASK_6_OFDM) maxRate = DRV_RATE_6M;
1398 if(ratesBitMap & DRV_RATE_MASK_9_OFDM) maxRate = DRV_RATE_9M;
1399 if(ratesBitMap & DRV_RATE_MASK_12_OFDM) maxRate = DRV_RATE_12M;
1400 if(ratesBitMap & DRV_RATE_MASK_18_OFDM) maxRate = DRV_RATE_18M;
1401 if(ratesBitMap & DRV_RATE_MASK_24_OFDM) maxRate = DRV_RATE_24M;
1402 if(ratesBitMap & DRV_RATE_MASK_36_OFDM) maxRate = DRV_RATE_36M;
1403 if(ratesBitMap & DRV_RATE_MASK_48_OFDM) maxRate = DRV_RATE_48M;
1404 if(ratesBitMap & DRV_RATE_MASK_54_OFDM) maxRate = DRV_RATE_54M;
1405
1406 if(maxRate == DRV_RATE_INVALID)
1407 {
1408 /* No rate is supported */
1409 WLAN_OS_REPORT((" Error; The rate Bit field does not support any available rate\n"));
1410
1411 if(operationMode == DOT11_A_MODE)
1412 {
1413 /* Default value for A band is 6M */
1414 maxRate = DRV_RATE_6M;
1415 }
1416 else
1417 {
1418 /* Default value for B/G band is 2M */
1419 maxRate = DRV_RATE_2M;
1420 }
1421 }
1422
1423 /* Return the Max rate */
1424 *rate = maxRate;
1425
1426 /* Return the matched modulation type */
1427 if(maxRate >= DRV_RATE_6M)
1428 {
1429 *modulation = DRV_MODULATION_OFDM;
1430 }
1431 else
1432 if(maxRate >= DRV_RATE_5_5M)
1433 {
1434 *modulation = DRV_MODULATION_CCK;
1435 }
1436 else
1437 {
1438 *modulation = DRV_MODULATION_QPSK;
1439 }
1440
1441 return;
1442
1443 }
1444
1445 /************************************************************************
1446 * getMinRate *
1447 ************************************************************************
1448 DESCRIPTION: This function return the Min rate.
1449 In addition return the matched modulation type
1450
1451 INPUT: rateBitMap - The supported basic rates
1452 operationMode - Current operation mode, used only to set default rate.
1453
1454
1455 OUTPUT: rate - The min rate from the OFDM allowed rates.
1456 modulation - The modulation of the Min Basic rate.
1457
1458 RETURN: None
1459
1460 ************************************************************************/
getMinRate(UINT32 ratesBitMap,rate_e * rate,modulationType_e * modulation,dot11mode_e operationMode)1461 void getMinRate(UINT32 ratesBitMap, rate_e *rate, modulationType_e *modulation, dot11mode_e operationMode)
1462 {
1463 rate_e minRate = DRV_RATE_INVALID;
1464
1465 /* find min rate */
1466 if(ratesBitMap & DRV_RATE_MASK_54_OFDM) minRate = DRV_RATE_54M;
1467 if(ratesBitMap & DRV_RATE_MASK_48_OFDM) minRate = DRV_RATE_48M;
1468 if(ratesBitMap & DRV_RATE_MASK_36_OFDM) minRate = DRV_RATE_36M;
1469 if(ratesBitMap & DRV_RATE_MASK_24_OFDM) minRate = DRV_RATE_24M;
1470 if(ratesBitMap & DRV_RATE_MASK_18_OFDM) minRate = DRV_RATE_18M;
1471 if(ratesBitMap & DRV_RATE_MASK_12_OFDM) minRate = DRV_RATE_12M;
1472 if(ratesBitMap & DRV_RATE_MASK_9_OFDM) minRate = DRV_RATE_9M;
1473 if(ratesBitMap & DRV_RATE_MASK_6_OFDM) minRate = DRV_RATE_6M;
1474
1475 /* Ctrl and Mgmt frames should not be transmitted at 22Mbps PBCC */
1476 /*if(ratesBitMap & DRV_RATE_MASK_22_PBCC) minRate = DRV_RATE_22M;*/
1477
1478 if(ratesBitMap & DRV_RATE_MASK_11_CCK) minRate = DRV_RATE_11M;
1479 if(ratesBitMap & DRV_RATE_MASK_5_5_CCK) minRate = DRV_RATE_5_5M;
1480 if(ratesBitMap & DRV_RATE_MASK_2_BARKER) minRate = DRV_RATE_2M;
1481 if(ratesBitMap & DRV_RATE_MASK_1_BARKER) minRate = DRV_RATE_1M;
1482
1483 if(minRate == DRV_RATE_INVALID)
1484 {
1485 /* No rate is supported */
1486 WLAN_OS_REPORT((" Error; The rate Bit field does not support any available rate\n"));
1487
1488 if(operationMode == DOT11_A_MODE)
1489 {
1490 /* Default value for A band is 6M */
1491 minRate = DRV_RATE_6M;
1492 }
1493 else
1494 {
1495 /* Default value for B/G band is 2M */
1496 minRate = DRV_RATE_2M;
1497 }
1498 }
1499
1500 /* Return the Max rate */
1501 *rate = minRate;
1502
1503 /* Return the matched modulation type */
1504 if(minRate >= DRV_RATE_6M)
1505 {
1506 *modulation = DRV_MODULATION_OFDM;
1507 }
1508 else
1509 if(minRate >= DRV_RATE_5_5M)
1510 {
1511 *modulation = DRV_MODULATION_CCK;
1512 }
1513 else
1514 {
1515 *modulation = DRV_MODULATION_QPSK;
1516 }
1517
1518 return;
1519
1520 }
1521
1522
hostRateToNumber(rate_e rate)1523 UINT8 hostRateToNumber(rate_e rate)
1524 {
1525 switch (rate)
1526 {
1527 case DRV_RATE_1M: return 1;
1528 case DRV_RATE_2M: return 2;
1529 case DRV_RATE_5_5M: return 5;
1530 case DRV_RATE_11M: return 11;
1531 case DRV_RATE_22M: return 22;
1532 case DRV_RATE_6M: return 6;
1533 case DRV_RATE_9M: return 9;
1534 case DRV_RATE_12M: return 12;
1535 case DRV_RATE_18M: return 18;
1536 case DRV_RATE_24M: return 24;
1537 case DRV_RATE_36M: return 36;
1538 case DRV_RATE_48M: return 48;
1539 case DRV_RATE_54M: return 54;
1540
1541 default:
1542 return 0;
1543 }
1544 }
1545
1546 /*-----------------------------------------------------------------------------
1547 Routine Name: RateNumberToHost
1548 Routine Description:
1549 Arguments:
1550 Return Value: None
1551 -----------------------------------------------------------------------------*/
RateNumberToHost(UINT8 rateIn)1552 rate_e RateNumberToHost(UINT8 rateIn)
1553 {
1554 switch(rateIn)
1555 {
1556 case 0x1: return DRV_RATE_1M;
1557 case 0x2: return DRV_RATE_2M;
1558 case 0x5: return DRV_RATE_5_5M;
1559 case 0xB: return DRV_RATE_11M;
1560 case 0x16: return DRV_RATE_22M;
1561 case 0x6: return DRV_RATE_6M;
1562 case 0x9: return DRV_RATE_9M;
1563 case 0xC: return DRV_RATE_12M;
1564 case 0x12: return DRV_RATE_18M;
1565 case 0x18: return DRV_RATE_24M;
1566 case 0x24: return DRV_RATE_36M;
1567 case 0x30: return DRV_RATE_48M;
1568 case 0x36: return DRV_RATE_54M;
1569 default: return DRV_RATE_6M;
1570 }
1571 }
1572
rateNumberToIndex(UINT8 uRate)1573 RateIndex_e rateNumberToIndex(UINT8 uRate)
1574 {
1575 switch(uRate)
1576 {
1577 case 1: return RATE_INDEX_1MBPS;
1578 case 2: return RATE_INDEX_2MBPS;
1579 case 5: return RATE_INDEX_5_5MBPS;
1580 case 6: return RATE_INDEX_6MBPS;
1581 case 9: return RATE_INDEX_9MBPS;
1582 case 11: return RATE_INDEX_11MBPS;
1583 case 12: return RATE_INDEX_12MBPS;
1584 case 18: return RATE_INDEX_18MBPS;
1585 case 22: return RATE_INDEX_22MBPS;
1586 case 24: return RATE_INDEX_24MBPS;
1587 case 36: return RATE_INDEX_36MBPS;
1588 case 48: return RATE_INDEX_48MBPS;
1589 case 54: return RATE_INDEX_54MBPS;
1590 default:
1591 return INVALID_RATE_INDEX;
1592 }
1593 }
1594
1595
utils_isAnySSID(ssid_t * pSsid)1596 BOOL utils_isAnySSID(ssid_t *pSsid)
1597 {
1598 if (pSsid == NULL)
1599 {
1600 return TRUE;
1601 }
1602
1603 if (pSsid->len == 0)
1604 {
1605 return TRUE;
1606 }
1607
1608 return FALSE;
1609 }
1610
utils_isJunkSSID(ssid_t * pSsid)1611 BOOL utils_isJunkSSID(ssid_t *pSsid)
1612 {
1613 if (pSsid == NULL)
1614 {
1615 return TRUE;
1616 }
1617
1618 if (pSsid->len > 2)
1619 {
1620 unsigned char *ssidString = (unsigned char *)pSsid->ssidString;
1621 if ((ssidString[0] < FIRST_VALID_CHAR) &&
1622 (ssidString[1] < FIRST_VALID_CHAR) &&
1623 (ssidString[2] < FIRST_VALID_CHAR))
1624 {
1625 return TRUE;
1626 }
1627 }
1628
1629 return FALSE;
1630 }
1631
1632
utils_isIESSID_Broadcast(dot11_SSID_t * pIESsid)1633 BOOL utils_isIESSID_Broadcast(dot11_SSID_t *pIESsid)
1634 {
1635 if ((pIESsid == NULL) || (pIESsid->hdr.eleLen==0))
1636 {
1637 return TRUE;
1638 }
1639
1640 /* According to 802.11, Broadcast SSID should be with length 0,
1641 however, different vendors use invalid chanrs for Broadcast SSID. */
1642 if (pIESsid->serviceSetId[0] < FIRST_VALID_CHAR)
1643 {
1644 return TRUE;
1645 }
1646
1647 return FALSE;
1648 }
1649
1650 /* HEX DUMP for BDs !!! Debug code only !!! */
HexDumpData(UINT8 * data,int datalen)1651 void HexDumpData (UINT8 *data, int datalen)
1652 {
1653 #ifdef TI_DBG
1654 int j,dbuflen=0;
1655 char dbuf[50];
1656 static char hexdigits[16] = "0123456789ABCDEF";
1657
1658 for(j=0; j < datalen;)
1659 {
1660 /* Add a byte to the line*/
1661 dbuf[dbuflen] = hexdigits[(data[j] >> 4)&0x0f];
1662 dbuf[dbuflen+1] = hexdigits[data[j] & 0x0f];
1663 dbuf[dbuflen+2] = ' ';
1664 dbuf[dbuflen+3] = '\0';
1665 dbuflen += 3;
1666 j++;
1667 if((j % 16) == 0)
1668 {
1669 /* Dump a line every 16 hex digits*/
1670 WLAN_OS_REPORT(("%04.4x %s\n", j-16, dbuf));
1671 dbuflen = 0;
1672 }
1673 }
1674 /* Flush if something has left in the line*/
1675 if(dbuflen)
1676 WLAN_OS_REPORT(("%04.4x %s\n", j & 0xfff0, dbuf));
1677 #endif
1678 }
1679
msduContentDump(mem_MSDU_T * pMsdu,char * str)1680 void msduContentDump (mem_MSDU_T* pMsdu, char *str)
1681 {
1682 INT32 msduLen;
1683 mem_BD_T* pCurrBd;
1684
1685 WLAN_OS_REPORT(("%s\n", str));
1686
1687 WLAN_OS_REPORT(("totalLen = %d\n", pMsdu->dataLen));
1688 WLAN_OS_REPORT(("headerLen = %d\n", pMsdu->headerLen));
1689
1690 msduLen = pMsdu->dataLen;
1691 pCurrBd = pMsdu->firstBDPtr;
1692
1693 while ((msduLen >= 0)&&(pCurrBd!=NULL))
1694 {
1695 WLAN_OS_REPORT(("\nBdLen = %d\n", pCurrBd->length));
1696
1697 HexDumpData((UINT8*)(pCurrBd->data+pCurrBd->dataOffset), pCurrBd->length);
1698
1699 msduLen -= pCurrBd->length;
1700 pCurrBd = pCurrBd->nextBDPtr;
1701 }
1702
1703 }
1704
1705
1706 /**
1707 *
1708 * parseIeBuffer - Parse a required information element.
1709 *
1710 * \b Description:
1711 *
1712 * Parse an required information element
1713 * and returns a pointer to the IE.
1714 * If given a matching buffer as well, returns a pointer to the first IE
1715 * that matches the IE ID and the given buffer.
1716 *
1717 * \b ARGS:
1718 *
1719 * I - hOs - pointer to OS context
1720 * I - pIeBuffer - pointer to the IE buffer \n
1721 * I - length - the length of the whole buffer
1722 * I - desiredIeId - the desired IE ID
1723 * O - pDesiredIe - a pointer to the desired IE
1724 * I - pMatchBuffer - a matching buffer in the IE buffer. Optional, if not required a NULL can be given.
1725 * I - matchBufferLen - the matching buffer length. Optional, if not required zero can be given.
1726 *
1727 *
1728 * \b RETURNS:
1729 *
1730 * TRUE if IE pointer was found, FALSE on failure.
1731 *
1732 * \sa
1733 */
parseIeBuffer(TI_HANDLE hOs,UINT8 * pIeBuffer,UINT16 length,UINT8 desiredIeId,UINT8 ** pDesiredIe,UINT8 * pMatchBuffer,UINT8 matchBufferLen)1734 BOOL parseIeBuffer(TI_HANDLE hOs, UINT8 *pIeBuffer, UINT16 length, UINT8 desiredIeId, UINT8 **pDesiredIe, UINT8 *pMatchBuffer, UINT8 matchBufferLen)
1735 {
1736
1737 dot11_eleHdr_t *eleHdr;
1738 UINT8 *pCurIe;
1739
1740
1741 if (pDesiredIe!=NULL)
1742 {
1743 *pDesiredIe = NULL;
1744 }
1745
1746 if ((pIeBuffer == NULL) || (length==0))
1747 {
1748 return FALSE;
1749 }
1750
1751 pCurIe = pIeBuffer;
1752
1753 while (length>0)
1754 {
1755 eleHdr = (dot11_eleHdr_t*)pCurIe;
1756
1757 if (length<(eleHdr->eleLen+2))
1758 {
1759 return FALSE;
1760 }
1761
1762 if (eleHdr->eleId == desiredIeId)
1763 {
1764 if ((matchBufferLen==0) || (pMatchBuffer == NULL) ||
1765 (!os_memoryCompare(hOs, &pCurIe[2], pMatchBuffer, matchBufferLen)))
1766 {
1767 if (pDesiredIe!=NULL)
1768 {
1769 *pDesiredIe = (UINT8*)eleHdr;
1770 }
1771 return TRUE;
1772 }
1773
1774 }
1775 length -= eleHdr->eleLen+2;
1776 pCurIe += eleHdr->eleLen+2;
1777 }
1778 return FALSE;
1779 }
1780
1781 /***************************************************************************
1782 * TiWlanIntToStr *
1783 ****************************************************************************
1784 DESCRIPTION: convert from UINT8 to asci string.
1785 NOTE: the method assume that the convert number is positive.
1786 debug ststus - radix == 16.
1787
1788 INPUT: the number to convert.
1789 the radix of the number.
1790
1791 OUTPUT: the convert string.
1792 on error return empty string.
1793
1794 RETURN: void
1795 ****************************************************************************/
TiWlanIntToStr(UINT8 theNumber,char * theString,UINT8 theRadix)1796 void TiWlanIntToStr(UINT8 theNumber , char *theString , UINT8 theRadix)
1797 {
1798 int nibbleIndex;
1799 UINT8 temp , factor;
1800
1801 for (nibbleIndex = 0 ; nibbleIndex < NUM_OF_NIBBLES_IN_BYTE ; ++nibbleIndex)
1802 {
1803 temp = theNumber;
1804 if ((nibbleIndex % NUM_OF_NIBBLES_IN_BYTE) == 0) /* if the upper nibble */
1805 {
1806 temp >>= NIBBLE_SIZE_IN_BITS;
1807 }
1808 temp &= NIBBLE_MASK;
1809
1810 if (temp < 10)
1811 {
1812 factor = 0x30;
1813 }
1814 else
1815 {
1816 factor = 0x37;
1817 }
1818 theString[nibbleIndex] = temp + factor;
1819 }
1820 theString[nibbleIndex] = '\0';
1821 }
1822
1823
getBasicRateMaskForSpecialBGchannel(void)1824 UINT32 getBasicRateMaskForSpecialBGchannel(void)
1825 {
1826 return (UINT32)(translateBasicRateValueToMask(BASIC_RATE_SET_1_2_5_5_11, FALSE));
1827 }
1828
1829
getSupportedRateMaskForSpecialBGchannel(void)1830 UINT32 getSupportedRateMaskForSpecialBGchannel(void)
1831 {
1832 return (UINT32)(translateSupportedRateValueToMask(SUPPORTED_RATE_SET_1_2_5_5_11, FALSE));
1833 }
1834
1835
1836 /***************************************************************************
1837 * reminder64 *
1838 ****************************************************************************
1839 DESCRIPTION: returns the reminder of a 64 bit number division by a 32
1840 bit number.
1841
1842 INPUT: The dividee (64 bit number to divide)
1843 The divider (32 bit number to divide by)
1844
1845 OUTPUT:
1846
1847
1848 RETURN: The reminder
1849 ****************************************************************************/
reminder64(UINT64 dividee,UINT32 divider)1850 UINT32 reminder64( UINT64 dividee, UINT32 divider )
1851 {
1852 UINT32 divideeHigh, divideeLow, partA, partB, mod28n, mod24n, mod16n, partA8n, mod8n, mod4n;
1853
1854 divideeHigh = INT64_HIGHER( dividee );
1855 divideeLow = INT64_LOWER( dividee );
1856
1857 mod8n = 256 % divider;
1858 mod4n = 16 % divider;
1859
1860 partA = (mod4n * (divideeHigh % divider)) % divider;
1861 partA8n = (partA * mod4n) % divider;
1862 mod16n = (partA8n * mod8n) % divider;
1863 mod24n = (mod8n * mod16n) % divider;
1864 mod28n = (mod4n * mod24n) % divider;
1865
1866 partB = (mod4n * mod28n) % divider;
1867 return ( partB + (divideeLow % divider)) % divider;
1868 }
1869
1870
1871 /***************************************************************************
1872 * print_TI_STATUS *
1873 ****************************************************************************
1874 DESCRIPTION: returns TI_STATUS as string
1875 ****************************************************************************/
convertTI_STATUS_toString(TI_STATUS status)1876 char* convertTI_STATUS_toString(TI_STATUS status)
1877 {
1878 switch (status)
1879 {
1880 case OK: return "OK";
1881 case NOK: return "NOK";
1882 case PARAM_NOT_SUPPORTED: return "PARAM_NOT_SUPPORTED";
1883 case PARAM_VALUE_NOT_VALID: return "PARAM_VALUE_NOT_VALID";
1884 case CONFIGURATION_NOT_VALID: return "CONFIGURATION_NOT_VALID";
1885 case NO_SITE_SELECTED_YET: return "NO_SITE_SELECTED_YET";
1886 case RE_SCAN_NEEDED: return "RE_SCAN_NEEDED";
1887 case EXTERNAL_SET_PARAM_DENIED : return "EXTERNAL_SET_PARAM_DENIED";
1888 case EXTERNAL_GET_PARAM_DENIED : return "EXTERNAL_GET_PARAM_DENIED";
1889 case PARAM_MODULE_NUMBER_INVALID : return "PARAM_MODULE_NUMBER_INVALID";
1890 case STATION_IS_NOT_RUNNING : return "STATION_IS_NOT_RUNNING";
1891 case CARD_IS_NOT_INSTALLED : return "CARD_IS_NOT_INSTALLED";
1892 case RX_MIC_FAILURE_ERROR : return "RX_MIC_FAILURE_ERROR";
1893 case RX_DECRYPT_FAILURE : return "RX_DECRYPT_FAILURE";
1894 case RX_STATUS_FAILURE : return "RX_STATUS_FAILURE";
1895 case TX_QUEUE_SELECTED_OK : return "TX_QUEUE_SELECTED_OK";
1896 case NO_TX_QUEUE_SELECTED : return "NO_TX_QUEUE_SELECTED";
1897 case TX_STATUS_PENDING : return "TX_STATUS_PENDING";
1898 case TX_STATUS_NO_RESOURCES : return "TX_STATUS_NO_RESOURCES";
1899 case TX_STATUS_FAILURE : return "TX_STATUS_FAILURE";
1900 case TX_STATUS_OK : return "TX_STATUS_OK";
1901 case MAKE_CONCATENATION : return "MAKE_CONCATENATION";
1902 case SEND_ONE_MSDU : return "SEND_ONE_MSDU";
1903 case DO_NOT_SEND_MSDU : return "DO_NOT_SEND_MSDU";
1904 case FOUR_X_DISABLE : return "FOUR_X_DISABLE";
1905 case NO_COUNTRY : return "NO_COUNTRY";
1906 case SCAN_ALREADY_IN_PROGRESS : return "SCAN_ALREADY_IN_PROGRESS";
1907 case NO_SCAN_IN_PROGRESS : return "NO_SCAN_IN_PROGRESS";
1908 case TX_POWER_SET_SAME_VALUE : return "TX_POWER_SET_SAME_VALUE";
1909 case CHANNEL_CHANGED : return "CHANNEL_CHANGED";
1910 case SUPPORT_IMMEDIATE_MEASUREMENT_ONLY : return "SUPPORT_IMMEDIATE_MEASUREMENT_ONLY";
1911 case MEASUREMENT_TYPE_NOT_SUPPORT : return "MEASUREMENT_TYPE_NOT_SUPPORT";
1912 case MEASUREMENT_CAN_NOT_EXECUTED_IN_PARALLEL : return "MEASUREMENT_CAN_NOT_EXECUTED_IN_PARALLEL";
1913 case MEASUREMENT_REQUEST_IGNORED : return "MEASUREMENT_REQUEST_IGNORED";
1914 case CANNOT_SET_MEASUREMENT_PARAM_WHEN_ACTIVATED : return "CANNOT_SET_MEASUREMENT_PARAM_WHEN_ACTIVATED";
1915 case CANNOT_SET_CHANNEL_THAT_IS_NOT_SUPPORTED : return "CANNOT_SET_CHANNEL_THAT_IS_NOT_SUPPORTED";
1916 case STATUS_BAD_KEY_PARAM : return "STATUS_BAD_KEY_PARAM";
1917 case STATUS_RX_MIC_FAIL : return "STATUS_RX_MIC_FAIL";
1918 case STATUS_FIRST_PRIMARY_SITE_SET : return "STATUS_FIRST_PRIMARY_SITE_SET";
1919 case POWER_SAVE_802_11_SUCCESS : return "POWER_SAVE_802_11_SUCCESS";
1920 case POWER_SAVE_802_11_FAIL : return "POWER_SAVE_802_11_FAIL";
1921 case POWER_SAVE_802_11_NOT_ALLOWED : return "POWER_SAVE_802_11_NOT_ALLOWED";
1922 case PENDING : return "PENDING";
1923 case SEND_COMPLETE_SUCCESS : return "SEND_COMPLETE_SUCCESS";
1924 case SEND_COMPLETE_RETRY_EXCEEDED : return "SEND_COMPLETE_RETRY_EXCEEDED";
1925 case SEND_COMPLETE_LIFETIME_EXCEEDED : return "SEND_COMPLETE_LIFETIME_EXCEEDED";
1926 case SEND_COMPLETE_NO_LINK : return "SEND_COMPLETE_NO_LINK";
1927 case SEND_COMPLETE_MAC_CRASHED : return "SEND_COMPLETE_MAC_CRASHED";
1928 case POWER_SAVE_802_11_IS_CURRENT : return "POWER_SAVE_802_11_IS_CURRENT";
1929 case SEND_PACKET_XFER_DONE : return "SEND_PACKET_XFER_DONE";
1930 case SEND_PACKET_SUCCESS : return "SEND_PACKET_SUCCESS";
1931 case SEND_PACKET_PENDING : return "SEND_PACKET_PENDING";
1932 case SEND_PACKET_BUSY : return "SEND_PACKET_BUSY";
1933 case SEND_PACKET_ERROR : return "SEND_PACKET_ERROR";
1934 case TNETWIF_NONE : return "TNETWIF_NONE";
1935 case TNETWIF_OK : return "TNETWIF_OK";
1936 case TNETWIF_COMPLETE : return "TNETWIF_COMPLETE";
1937 case TNETWIF_PENDING : return "TNETWIF_PENDING";
1938 case TNETWIF_ERROR : return "TNETWIF_ERROR";
1939 case TNETWIF_MORE : return "TNETWIF_MORE";
1940 default:
1941 WLAN_OS_REPORT(("%s No matching for TI_STATUS = %d , please add me !!!\n",__FUNCTION__ ,status));
1942 return "UnKnown";
1943 }
1944
1945 }
1946
1947
1948
1949 #if UTIL_DEBUG_PROFILE
1950 profileInfo_t profileInfo;
1951 profileInfo_t* pProfileInfo = &profileInfo;
1952
util_initProfile(void)1953 void util_initProfile(void)
1954 {
1955 pProfileInfo->currentInfoElement = 0;
1956 pProfileInfo->overlap = FALSE;
1957 }
1958
1959
util_recordProfile(UINT32 theTIWlanModuleLogName,UINT32 theEvent,UINT32 theParam_1,UINT32 theParam_2)1960 void util_recordProfile(UINT32 theTIWlanModuleLogName,
1961 UINT32 theEvent,
1962 UINT32 theParam_1,
1963 UINT32 theParam_2)
1964 {
1965 pProfileInfo->profileInfoElement[pProfileInfo->currentInfoElement].timeStamp = os_timeStampUs(NULL);
1966 pProfileInfo->profileInfoElement[pProfileInfo->currentInfoElement].TIWlanModuleLogName = theTIWlanModuleLogName;
1967 pProfileInfo->profileInfoElement[pProfileInfo->currentInfoElement].Event = theEvent;
1968 pProfileInfo->profileInfoElement[pProfileInfo->currentInfoElement].Param_1 = theParam_1;
1969 pProfileInfo->profileInfoElement[pProfileInfo->currentInfoElement].Param_2 = theParam_2;
1970
1971 ++pProfileInfo->currentInfoElement;
1972 if (pProfileInfo->currentInfoElement == PROFILE_BUFFER_SIZE)
1973 {
1974 pProfileInfo->overlap = TRUE;
1975 pProfileInfo->currentInfoElement = 0;
1976 }
1977 }
1978
util_printProfile(void)1979 void util_printProfile(void)
1980 {
1981 UINT32 index;
1982 UINT32 count;
1983 UINT32 elemCount;
1984
1985 if (pProfileInfo->overlap == TRUE)
1986 {
1987 elemCount = PROFILE_BUFFER_SIZE;
1988 index = pProfileInfo->currentInfoElement;
1989 }
1990 else
1991 {
1992 elemCount = pProfileInfo->currentInfoElement;
1993 index = 0;
1994 }
1995
1996 WLAN_OS_REPORT(("\nPrint profiling log (%d elements):\n",elemCount));
1997
1998 for (count = 0 ; count < elemCount ; ++count)
1999 {
2000 WLAN_OS_REPORT(("%d - %d.%06d 0x%04X - 0x%08X: 0x%08X 0x%08X\n",
2001 index,
2002 pProfileInfo->profileInfoElement[index].timeStamp/1000000,
2003 pProfileInfo->profileInfoElement[index].timeStamp%1000000,
2004 pProfileInfo->profileInfoElement[index].TIWlanModuleLogName,
2005 pProfileInfo->profileInfoElement[index].Event,
2006 pProfileInfo->profileInfoElement[index].Param_1,
2007 pProfileInfo->profileInfoElement[index].Param_2));
2008 ++index;
2009 }
2010
2011 WLAN_OS_REPORT(("\n\n"));
2012
2013 util_initProfile();
2014 }
2015
2016
2017
2018 #endif /* UTIL_DEBUG_PROFILE */
2019