Home | History | Annotate | Download | only in utils
      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 ************************************************************************/
     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 ************************************************************************/
     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 
    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 ************************************************************************/
    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 ***************************************************************************/
    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 ************************************************************************/
    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 ************************************************************************/
    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 ************************************************************************/
    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 ************************************************************************/
    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 ************************************************************************/
    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 ************************************************************************/
    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 ************************************************************************/
    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 ************************************************************************/
    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 
    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 
    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 }
    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 
   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 
   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 */
   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 
   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 ************************************************************************/
   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 
   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 
   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 
   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 
   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 ************************************************************************/
   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 ************************************************************************/
   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 
   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 -----------------------------------------------------------------------------*/
   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 
   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 
   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 
   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 
   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 !!! */
   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 
   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 */
   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 ****************************************************************************/
   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 
   1824 UINT32 getBasicRateMaskForSpecialBGchannel(void)
   1825 {
   1826 	return (UINT32)(translateBasicRateValueToMask(BASIC_RATE_SET_1_2_5_5_11, FALSE));
   1827 }
   1828 
   1829 
   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 ****************************************************************************/
   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 ****************************************************************************/
   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 
   1953 void util_initProfile(void)
   1954 {
   1955     pProfileInfo->currentInfoElement = 0;
   1956     pProfileInfo->overlap = FALSE;
   1957 }
   1958 
   1959 
   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 
   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