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 ************************************************************************
60DESCRIPTION: Called in order to free memory space.
61			Calls the OS free function only if the memory is occupied
62
63INPUT:      pOsContext		-	Handle to OS
64			pMemPtr			-	Pointer to the memory to be free
65			size			-	Size of memory to be free
66
67OUTPUT:
68
69
70RETURN:
71
72************************************************************************/
73void 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 ************************************************************************
84DESCRIPTION: Called in order to free OS timers.
85			Calls the OS timer destroy function only if the timer is not NULL
86
87INPUT:      pOsContext		-	Handle to OS
88			pTimerHandle	-	Pointer to timer handle
89
90OUTPUT:
91
92
93RETURN:
94
95************************************************************************/
96void utils_nullTimerDestroy(void* pOsContext,
97						 void* pTimerHandle)
98{
99	os_timerStop(pOsContext,pTimerHandle);
100	os_timerDestroy(pOsContext, pTimerHandle);
101}
102
103/************************************************************************
104 *                        networkToHostRate							*
105 ************************************************************************
106DESCRIPTION: Translates a network rate (0x02, 0x82, 0x84, etc...) to host rate (1, 2, 3, ....)
107
108INPUT:      rate		-	Network rate
109
110OUTPUT:
111
112
113RETURN:     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
165rate_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 ************************************************************************
229DESCRIPTION: Translates a host rate (1, 2, 3, ....) to network rate (0x02, 0x82, 0x84, etc...)
230
231INPUT:      rate		-	Host rate
232
233OUTPUT:
234
235
236RETURN:     Network rate if the input rate is valid, otherwise returns 0.
237
238************************************************************************/
239UINT8 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***************************************************************************/
299rate_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 ************************************************************************
324DESCRIPTION: Goes over an array of network rates and returns the max basic rate
325
326INPUT:      pRates		-	Rate array
327
328OUTPUT:
329
330
331RETURN:     Max basic rate (in network units)
332
333************************************************************************/
334UINT8 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 ************************************************************************
353DESCRIPTION: Goes over an array of network rates and returns the max active rate
354
355INPUT:      pRates		-	Rate array
356
357OUTPUT:
358
359
360RETURN:     Max active rate (in network units)
361
362************************************************************************/
363UINT8 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 ************************************************************************
382DESCRIPTION: Verify that the input nitwork rate is valid
383
384INPUT:      rate	-	input network rate
385
386OUTPUT:
387
388
389RETURN:     OK if valid, otherwise NOK
390
391************************************************************************/
392TI_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 ************************************************************************
432DESCRIPTION: Translates a host rate (1, 2, 3, ....) to utility rate (2, 4, 11, 22, ....)
433
434INPUT:      rate		-	Host rate
435
436OUTPUT:
437
438
439RETURN:     Utility rate if the input rate is valid, otherwise returns 0.
440
441************************************************************************/
442UINT8 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 ************************************************************************
496DESCRIPTION: Translates a utility rate (2, 4, 11, 22, ....) to host rate (1, 2, 3, ....) to
497
498INPUT:      rate		-	Utility rate
499
500OUTPUT:
501
502
503RETURN:     Host rate if the input rate is valid, otherwise returns 0.
504
505************************************************************************/
506rate_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 ************************************************************************
574DESCRIPTION: Converts bit map to the rates string
575
576INPUT:      suppRatesBitMap		-	bit map of supported rates
577			basicRatesBitMap	-   bit map of basic rates
578
579OUTPUT:		string - network format rates array,
580			len - rates array length
581			firstOFDMrateLoc - the index of first OFDM rate in the rates array.
582
583
584RETURN:     None
585
586************************************************************************/
587void 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 ************************************************************************
695DESCRIPTION: Converts supported rates string to the bit map
696
697INPUT:      string		-	array of rates in the network format
698			len - array length
699
700OUTPUT:		bitMap - bit map of rates.
701
702RETURN:     None
703
704************************************************************************/
705void 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 ************************************************************************
776DESCRIPTION: Converts basic rates string to the bit map
777
778INPUT:      string		-	array of rates in the network format
779			len - array length
780
781OUTPUT:		bitMap - bit map of rates.
782
783RETURN:     None
784
785************************************************************************/
786void 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
841void 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
931int 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}
967int 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
1005int 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
1040rate_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*/
1096UINT8 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
1135rate_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 ************************************************************************
1172DESCRIPTION: Converts hex buffer to string buffer.
1173
1174NOTE:		 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************************************************************************/
1178void 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
1220UINT32 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
1274UINT32 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
1328void	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
1346rate_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 ************************************************************************
1371DESCRIPTION: This function return the Max rate.
1372			 In addition return the matched modulation type
1373
1374INPUT:      rateBitMap		-	The supported basic rates
1375			operationMode   -   Current operation mode, used only to set default rate.
1376
1377
1378OUTPUT:		rate - The max rate from the OFDM allowed rates.
1379			modulation - The modulation of the Max Basic rate.
1380
1381RETURN:     None
1382
1383************************************************************************/
1384void 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 ************************************************************************
1448DESCRIPTION: This function return the Min rate.
1449			 In addition return the matched modulation type
1450
1451INPUT:      rateBitMap		-	The supported basic rates
1452			operationMode   -   Current operation mode, used only to set default rate.
1453
1454
1455OUTPUT:		rate - The min rate from the OFDM allowed rates.
1456			modulation - The modulation of the Min Basic rate.
1457
1458RETURN:     None
1459
1460************************************************************************/
1461void 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
1523UINT8 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/*-----------------------------------------------------------------------------
1547Routine Name:    RateNumberToHost
1548Routine Description:
1549Arguments:
1550Return Value:    None
1551-----------------------------------------------------------------------------*/
1552rate_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
1573RateIndex_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
1596BOOL 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
1611BOOL 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
1633BOOL 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 !!! */
1651void HexDumpData (UINT8 *data, int datalen)
1652{
1653#ifdef TI_DBG
1654int j,dbuflen=0;
1655char dbuf[50];
1656static 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
1680void 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*/
1734BOOL 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****************************************************************************
1784DESCRIPTION:	convert from UINT8 to asci string.
1785				NOTE: the method assume that the convert number is positive.
1786				debug ststus - radix == 16.
1787
1788INPUT:      the number to convert.
1789			the radix of the number.
1790
1791OUTPUT:		the convert string.
1792			on error return empty string.
1793
1794RETURN:     void
1795****************************************************************************/
1796void 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
1824UINT32 getBasicRateMaskForSpecialBGchannel(void)
1825{
1826	return (UINT32)(translateBasicRateValueToMask(BASIC_RATE_SET_1_2_5_5_11, FALSE));
1827}
1828
1829
1830UINT32 getSupportedRateMaskForSpecialBGchannel(void)
1831{
1832	return (UINT32)(translateSupportedRateValueToMask(SUPPORTED_RATE_SET_1_2_5_5_11, FALSE));
1833}
1834
1835
1836/***************************************************************************
1837*							reminder64   					               *
1838****************************************************************************
1839DESCRIPTION:	returns the reminder of a 64 bit number division by a 32
1840                bit number.
1841
1842INPUT:      The dividee (64 bit number to divide)
1843			The divider (32 bit number to divide by)
1844
1845OUTPUT:
1846
1847
1848RETURN:     The reminder
1849****************************************************************************/
1850UINT32 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****************************************************************************
1874DESCRIPTION:	returns TI_STATUS as string
1875****************************************************************************/
1876char* 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
1950profileInfo_t profileInfo;
1951profileInfo_t* pProfileInfo = &profileInfo;
1952
1953void util_initProfile(void)
1954{
1955    pProfileInfo->currentInfoElement = 0;
1956    pProfileInfo->overlap = FALSE;
1957}
1958
1959
1960void 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
1979void 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