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