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