• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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