1 /* 2 * Copyright (c) 1996, 2003 VIA Networking Technologies, Inc. 3 * All rights reserved. 4 * 5 * This program is free software; you can redistribute it and/or modify 6 * it under the terms of the GNU General Public License as published by 7 * the Free Software Foundation; either version 2 of the License, or 8 * (at your option) any later version. 9 * 10 * This program is distributed in the hope that it will be useful, 11 * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 * GNU General Public License for more details. 14 * 15 * You should have received a copy of the GNU General Public License along 16 * with this program; if not, write to the Free Software Foundation, Inc., 17 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. 18 * 19 * File: card.c 20 * Purpose: Provide functions to setup NIC operation mode 21 * Functions: 22 * s_vSafeResetTx - Rest Tx 23 * CARDvSetRSPINF - Set RSPINF 24 * vUpdateIFS - Update slotTime,SIFS,DIFS, and EIFS 25 * CARDvUpdateBasicTopRate - Update BasicTopRate 26 * CARDbAddBasicRate - Add to BasicRateSet 27 * CARDbSetBasicRate - Set Basic Tx Rate 28 * CARDbIsOFDMinBasicRate - Check if any OFDM rate is in BasicRateSet 29 * CARDvSetLoopbackMode - Set Loopback mode 30 * CARDbSoftwareReset - Sortware reset NIC 31 * CARDqGetTSFOffset - Caculate TSFOffset 32 * CARDbGetCurrentTSF - Read Current NIC TSF counter 33 * CARDqGetNextTBTT - Caculate Next Beacon TSF counter 34 * CARDvSetFirstNextTBTT - Set NIC Beacon time 35 * CARDvUpdateNextTBTT - Sync. NIC Beacon time 36 * CARDbRadioPowerOff - Turn Off NIC Radio Power 37 * CARDbRadioPowerOn - Turn On NIC Radio Power 38 * CARDbSetWEPMode - Set NIC Wep mode 39 * CARDbSetTxPower - Set NIC tx power 40 * 41 * Revision History: 42 * 06-10-2003 Bryan YC Fan: Re-write codes to support VT3253 spec. 43 * 08-26-2003 Kyle Hsu: Modify the defination type of dwIoBase. 44 * 09-01-2003 Bryan YC Fan: Add vUpdateIFS(). 45 * 46 */ 47 48 #include "tmacro.h" 49 #include "card.h" 50 #include "baseband.h" 51 #include "mac.h" 52 #include "desc.h" 53 #include "rf.h" 54 #include "power.h" 55 #include "key.h" 56 #include "rc4.h" 57 #include "country.h" 58 #include "datarate.h" 59 #include "rndis.h" 60 #include "control.h" 61 62 /*--------------------- Static Definitions -------------------------*/ 63 64 //static int msglevel =MSG_LEVEL_DEBUG; 65 static int msglevel =MSG_LEVEL_INFO; 66 67 68 /*--------------------- Static Definitions -------------------------*/ 69 #define CB_TXPOWER_LEVEL 6 70 71 /*--------------------- Static Classes ----------------------------*/ 72 73 /*--------------------- Static Variables --------------------------*/ 74 //const WORD cwRXBCNTSFOff[MAX_RATE] = 75 //{17, 34, 96, 192, 34, 23, 17, 11, 8, 5, 4, 3}; 76 77 const WORD cwRXBCNTSFOff[MAX_RATE] = 78 {192, 96, 34, 17, 34, 23, 17, 11, 8, 5, 4, 3}; 79 80 /*--------------------- Static Functions --------------------------*/ 81 82 /*--------------------- Export Variables --------------------------*/ 83 84 /*--------------------- Export Functions --------------------------*/ 85 /* 86 * Description: Set NIC media channel 87 * 88 * Parameters: 89 * In: 90 * pDevice - The adapter to be set 91 * uConnectionChannel - Channel to be set 92 * Out: 93 * none 94 */ 95 void CARDbSetMediaChannel(void *pDeviceHandler, unsigned int uConnectionChannel) 96 { 97 PSDevice pDevice = (PSDevice) pDeviceHandler; 98 99 if (pDevice->byBBType == BB_TYPE_11A) { // 15 ~ 38 100 if ((uConnectionChannel < (CB_MAX_CHANNEL_24G+1)) || (uConnectionChannel > CB_MAX_CHANNEL)) 101 uConnectionChannel = (CB_MAX_CHANNEL_24G+1); 102 } else { 103 if ((uConnectionChannel > CB_MAX_CHANNEL_24G) || (uConnectionChannel == 0)) // 1 ~ 14 104 uConnectionChannel = 1; 105 } 106 107 // clear NAV 108 MACvRegBitsOn(pDevice, MAC_REG_MACCR, MACCR_CLRNAV); 109 110 // Set Channel[7] = 0 to tell H/W channel is changing now. 111 MACvRegBitsOff(pDevice, MAC_REG_CHANNEL, 0x80); 112 113 //if (pMgmt->uCurrChannel == uConnectionChannel) 114 // return bResult; 115 116 CONTROLnsRequestOut(pDevice, 117 MESSAGE_TYPE_SELECT_CHANNLE, 118 (WORD) uConnectionChannel, 119 0, 120 0, 121 NULL 122 ); 123 124 //{{ RobertYu: 20041202 125 //// TX_PE will reserve 3 us for MAX2829 A mode only, it is for better TX throughput 126 127 if (pDevice->byBBType == BB_TYPE_11A) { 128 pDevice->byCurPwr = 0xFF; 129 RFbRawSetPower(pDevice, pDevice->abyOFDMAPwrTbl[uConnectionChannel-15], RATE_54M); 130 } else if (pDevice->byBBType == BB_TYPE_11G) { 131 pDevice->byCurPwr = 0xFF; 132 RFbRawSetPower(pDevice, pDevice->abyOFDMPwrTbl[uConnectionChannel-1], RATE_54M); 133 } else { 134 pDevice->byCurPwr = 0xFF; 135 RFbRawSetPower(pDevice, pDevice->abyCCKPwrTbl[uConnectionChannel-1], RATE_1M); 136 } 137 ControlvWriteByte(pDevice,MESSAGE_REQUEST_MACREG,MAC_REG_CHANNEL,(BYTE)(uConnectionChannel|0x80)); 138 } 139 140 /* 141 * Description: Get CCK mode basic rate 142 * 143 * Parameters: 144 * In: 145 * pDevice - The adapter to be set 146 * wRateIdx - Receiving data rate 147 * Out: 148 * none 149 * 150 * Return Value: response Control frame rate 151 * 152 */ 153 static WORD swGetCCKControlRate(void *pDeviceHandler, WORD wRateIdx) 154 { 155 PSDevice pDevice = (PSDevice) pDeviceHandler; 156 unsigned int ui = (unsigned int)wRateIdx; 157 while (ui > RATE_1M) { 158 if (pDevice->wBasicRate & ((WORD)1 << ui)) { 159 return (WORD)ui; 160 } 161 ui --; 162 } 163 return (WORD)RATE_1M; 164 } 165 166 /* 167 * Description: Get OFDM mode basic rate 168 * 169 * Parameters: 170 * In: 171 * pDevice - The adapter to be set 172 * wRateIdx - Receiving data rate 173 * Out: 174 * none 175 * 176 * Return Value: response Control frame rate 177 * 178 */ 179 static WORD swGetOFDMControlRate(void *pDeviceHandler, WORD wRateIdx) 180 { 181 PSDevice pDevice = (PSDevice) pDeviceHandler; 182 unsigned int ui = (unsigned int)wRateIdx; 183 184 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"BASIC RATE: %X\n", pDevice->wBasicRate); 185 186 if (!CARDbIsOFDMinBasicRate(pDevice)) { 187 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"swGetOFDMControlRate:(NO OFDM) %d\n", wRateIdx); 188 if (wRateIdx > RATE_24M) 189 wRateIdx = RATE_24M; 190 return wRateIdx; 191 } 192 while (ui > RATE_11M) { 193 if (pDevice->wBasicRate & ((WORD)1 << ui)) { 194 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"swGetOFDMControlRate : %d\n", ui); 195 return (WORD)ui; 196 } 197 ui --; 198 } 199 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"swGetOFDMControlRate: 6M\n"); 200 return (WORD)RATE_24M; 201 } 202 203 /* 204 * Description: Caculate TxRate and RsvTime fields for RSPINF in OFDM mode. 205 * 206 * Parameters: 207 * In: 208 * wRate - Tx Rate 209 * byPktType - Tx Packet type 210 * Out: 211 * pbyTxRate - pointer to RSPINF TxRate field 212 * pbyRsvTime - pointer to RSPINF RsvTime field 213 * 214 * Return Value: none 215 * 216 */ 217 void 218 CARDvCaculateOFDMRParameter ( 219 WORD wRate, 220 BYTE byBBType, 221 PBYTE pbyTxRate, 222 PBYTE pbyRsvTime 223 ) 224 { 225 switch (wRate) { 226 case RATE_6M : 227 if (byBBType == BB_TYPE_11A) {//5GHZ 228 *pbyTxRate = 0x9B; 229 *pbyRsvTime = 24; 230 } 231 else { 232 *pbyTxRate = 0x8B; 233 *pbyRsvTime = 30; 234 } 235 break; 236 237 case RATE_9M : 238 if (byBBType == BB_TYPE_11A) {//5GHZ 239 *pbyTxRate = 0x9F; 240 *pbyRsvTime = 16; 241 } 242 else { 243 *pbyTxRate = 0x8F; 244 *pbyRsvTime = 22; 245 } 246 break; 247 248 case RATE_12M : 249 if (byBBType == BB_TYPE_11A) {//5GHZ 250 *pbyTxRate = 0x9A; 251 *pbyRsvTime = 12; 252 } 253 else { 254 *pbyTxRate = 0x8A; 255 *pbyRsvTime = 18; 256 } 257 break; 258 259 case RATE_18M : 260 if (byBBType == BB_TYPE_11A) {//5GHZ 261 *pbyTxRate = 0x9E; 262 *pbyRsvTime = 8; 263 } 264 else { 265 *pbyTxRate = 0x8E; 266 *pbyRsvTime = 14; 267 } 268 break; 269 270 case RATE_36M : 271 if (byBBType == BB_TYPE_11A) {//5GHZ 272 *pbyTxRate = 0x9D; 273 *pbyRsvTime = 4; 274 } 275 else { 276 *pbyTxRate = 0x8D; 277 *pbyRsvTime = 10; 278 } 279 break; 280 281 case RATE_48M : 282 if (byBBType == BB_TYPE_11A) {//5GHZ 283 *pbyTxRate = 0x98; 284 *pbyRsvTime = 4; 285 } 286 else { 287 *pbyTxRate = 0x88; 288 *pbyRsvTime = 10; 289 } 290 break; 291 292 case RATE_54M : 293 if (byBBType == BB_TYPE_11A) {//5GHZ 294 *pbyTxRate = 0x9C; 295 *pbyRsvTime = 4; 296 } 297 else { 298 *pbyTxRate = 0x8C; 299 *pbyRsvTime = 10; 300 } 301 break; 302 303 case RATE_24M : 304 default : 305 if (byBBType == BB_TYPE_11A) {//5GHZ 306 *pbyTxRate = 0x99; 307 *pbyRsvTime = 8; 308 } 309 else { 310 *pbyTxRate = 0x89; 311 *pbyRsvTime = 14; 312 } 313 break; 314 } 315 } 316 317 /* 318 * Description: Set RSPINF 319 * 320 * Parameters: 321 * In: 322 * pDevice - The adapter to be set 323 * Out: 324 * none 325 * 326 * Return Value: None. 327 * 328 */ 329 void CARDvSetRSPINF(void *pDeviceHandler, BYTE byBBType) 330 { 331 PSDevice pDevice = (PSDevice) pDeviceHandler; 332 BYTE abyServ[4] = {0,0,0,0}; // For CCK 333 BYTE abySignal[4] = {0,0,0,0}; 334 WORD awLen[4] = {0,0,0,0}; 335 BYTE abyTxRate[9] = {0,0,0,0,0,0,0,0,0}; // For OFDM 336 BYTE abyRsvTime[9] = {0,0,0,0,0,0,0,0,0}; 337 BYTE abyData[34]; 338 int i; 339 340 //RSPINF_b_1 341 BBvCaculateParameter(pDevice, 342 14, 343 swGetCCKControlRate(pDevice, RATE_1M), 344 PK_TYPE_11B, 345 &awLen[0], 346 &abyServ[0], 347 &abySignal[0] 348 ); 349 350 ///RSPINF_b_2 351 BBvCaculateParameter(pDevice, 352 14, 353 swGetCCKControlRate(pDevice, RATE_2M), 354 PK_TYPE_11B, 355 &awLen[1], 356 &abyServ[1], 357 &abySignal[1] 358 ); 359 360 //RSPINF_b_5 361 BBvCaculateParameter(pDevice, 362 14, 363 swGetCCKControlRate(pDevice, RATE_5M), 364 PK_TYPE_11B, 365 &awLen[2], 366 &abyServ[2], 367 &abySignal[2] 368 ); 369 370 //RSPINF_b_11 371 BBvCaculateParameter(pDevice, 372 14, 373 swGetCCKControlRate(pDevice, RATE_11M), 374 PK_TYPE_11B, 375 &awLen[3], 376 &abyServ[3], 377 &abySignal[3] 378 ); 379 380 //RSPINF_a_6 381 CARDvCaculateOFDMRParameter (RATE_6M, 382 byBBType, 383 &abyTxRate[0], 384 &abyRsvTime[0]); 385 386 //RSPINF_a_9 387 CARDvCaculateOFDMRParameter (RATE_9M, 388 byBBType, 389 &abyTxRate[1], 390 &abyRsvTime[1]); 391 392 //RSPINF_a_12 393 CARDvCaculateOFDMRParameter (RATE_12M, 394 byBBType, 395 &abyTxRate[2], 396 &abyRsvTime[2]); 397 398 //RSPINF_a_18 399 CARDvCaculateOFDMRParameter (RATE_18M, 400 byBBType, 401 &abyTxRate[3], 402 &abyRsvTime[3]); 403 404 //RSPINF_a_24 405 CARDvCaculateOFDMRParameter (RATE_24M, 406 byBBType, 407 &abyTxRate[4], 408 &abyRsvTime[4]); 409 410 //RSPINF_a_36 411 CARDvCaculateOFDMRParameter (swGetOFDMControlRate(pDevice, RATE_36M), 412 byBBType, 413 &abyTxRate[5], 414 &abyRsvTime[5]); 415 416 //RSPINF_a_48 417 CARDvCaculateOFDMRParameter (swGetOFDMControlRate(pDevice, RATE_48M), 418 byBBType, 419 &abyTxRate[6], 420 &abyRsvTime[6]); 421 422 //RSPINF_a_54 423 CARDvCaculateOFDMRParameter (swGetOFDMControlRate(pDevice, RATE_54M), 424 byBBType, 425 &abyTxRate[7], 426 &abyRsvTime[7]); 427 428 //RSPINF_a_72 429 CARDvCaculateOFDMRParameter (swGetOFDMControlRate(pDevice, RATE_54M), 430 byBBType, 431 &abyTxRate[8], 432 &abyRsvTime[8]); 433 434 abyData[0] = (BYTE)(awLen[0]&0xFF); 435 abyData[1] = (BYTE)(awLen[0]>>8); 436 abyData[2] = abySignal[0]; 437 abyData[3] = abyServ[0]; 438 439 abyData[4] = (BYTE)(awLen[1]&0xFF); 440 abyData[5] = (BYTE)(awLen[1]>>8); 441 abyData[6] = abySignal[1]; 442 abyData[7] = abyServ[1]; 443 444 abyData[8] = (BYTE)(awLen[2]&0xFF); 445 abyData[9] = (BYTE)(awLen[2]>>8); 446 abyData[10] = abySignal[2]; 447 abyData[11] = abyServ[2]; 448 449 abyData[12] = (BYTE)(awLen[3]&0xFF); 450 abyData[13] = (BYTE)(awLen[3]>>8); 451 abyData[14] = abySignal[3]; 452 abyData[15] = abyServ[3]; 453 454 for (i = 0; i < 9; i++) { 455 abyData[16+i*2] = abyTxRate[i]; 456 abyData[16+i*2+1] = abyRsvTime[i]; 457 } 458 459 CONTROLnsRequestOut(pDevice, 460 MESSAGE_TYPE_WRITE, 461 MAC_REG_RSPINF_B_1, 462 MESSAGE_REQUEST_MACREG, 463 34, 464 &abyData[0]); 465 466 } 467 468 /* 469 * Description: Update IFS 470 * 471 * Parameters: 472 * In: 473 * pDevice - The adapter to be set 474 * Out: 475 * none 476 * 477 * Return Value: None. 478 * 479 */ 480 void vUpdateIFS(void *pDeviceHandler) 481 { 482 PSDevice pDevice = (PSDevice) pDeviceHandler; 483 //Set SIFS, DIFS, EIFS, SlotTime, CwMin 484 BYTE byMaxMin = 0; 485 BYTE byData[4]; 486 487 if (pDevice->byPacketType==PK_TYPE_11A) {//0000 0000 0000 0000,11a 488 pDevice->uSlot = C_SLOT_SHORT; 489 pDevice->uSIFS = C_SIFS_A; 490 pDevice->uDIFS = C_SIFS_A + 2*C_SLOT_SHORT; 491 pDevice->uCwMin = C_CWMIN_A; 492 byMaxMin = 4; 493 } 494 else if (pDevice->byPacketType==PK_TYPE_11B) {//0000 0001 0000 0000,11b 495 pDevice->uSlot = C_SLOT_LONG; 496 pDevice->uSIFS = C_SIFS_BG; 497 pDevice->uDIFS = C_SIFS_BG + 2*C_SLOT_LONG; 498 pDevice->uCwMin = C_CWMIN_B; 499 byMaxMin = 5; 500 } 501 else {// PK_TYPE_11GA & PK_TYPE_11GB 502 BYTE byRate = 0; 503 BOOL bOFDMRate = FALSE; 504 unsigned int ii = 0; 505 PWLAN_IE_SUPP_RATES pItemRates = NULL; 506 507 pDevice->uSIFS = C_SIFS_BG; 508 if (pDevice->bShortSlotTime) { 509 pDevice->uSlot = C_SLOT_SHORT; 510 } else { 511 pDevice->uSlot = C_SLOT_LONG; 512 } 513 pDevice->uDIFS = C_SIFS_BG + 2*pDevice->uSlot; 514 515 pItemRates = (PWLAN_IE_SUPP_RATES)pDevice->sMgmtObj.abyCurrSuppRates; 516 for (ii = 0; ii < pItemRates->len; ii++) { 517 byRate = (BYTE)(pItemRates->abyRates[ii]&0x7F); 518 if (RATEwGetRateIdx(byRate) > RATE_11M) { 519 bOFDMRate = TRUE; 520 break; 521 } 522 } 523 if (bOFDMRate == FALSE) { 524 pItemRates = (PWLAN_IE_SUPP_RATES)pDevice->sMgmtObj.abyCurrExtSuppRates; 525 for (ii = 0; ii < pItemRates->len; ii++) { 526 byRate = (BYTE)(pItemRates->abyRates[ii]&0x7F); 527 if (RATEwGetRateIdx(byRate) > RATE_11M) { 528 bOFDMRate = TRUE; 529 break; 530 } 531 } 532 } 533 if (bOFDMRate == TRUE) { 534 pDevice->uCwMin = C_CWMIN_A; 535 byMaxMin = 4; 536 } else { 537 pDevice->uCwMin = C_CWMIN_B; 538 byMaxMin = 5; 539 } 540 } 541 542 pDevice->uCwMax = C_CWMAX; 543 pDevice->uEIFS = C_EIFS; 544 545 byData[0] = (BYTE)pDevice->uSIFS; 546 byData[1] = (BYTE)pDevice->uDIFS; 547 byData[2] = (BYTE)pDevice->uEIFS; 548 byData[3] = (BYTE)pDevice->uSlot; 549 CONTROLnsRequestOut(pDevice, 550 MESSAGE_TYPE_WRITE, 551 MAC_REG_SIFS, 552 MESSAGE_REQUEST_MACREG, 553 4, 554 &byData[0]); 555 556 byMaxMin |= 0xA0;//1010 1111,C_CWMAX = 1023 557 CONTROLnsRequestOut(pDevice, 558 MESSAGE_TYPE_WRITE, 559 MAC_REG_CWMAXMIN0, 560 MESSAGE_REQUEST_MACREG, 561 1, 562 &byMaxMin); 563 } 564 565 void CARDvUpdateBasicTopRate(void *pDeviceHandler) 566 { 567 PSDevice pDevice = (PSDevice) pDeviceHandler; 568 BYTE byTopOFDM = RATE_24M, byTopCCK = RATE_1M; 569 BYTE ii; 570 571 //Determines the highest basic rate. 572 for (ii = RATE_54M; ii >= RATE_6M; ii --) { 573 if ( (pDevice->wBasicRate) & ((WORD)(1<<ii)) ) { 574 byTopOFDM = ii; 575 break; 576 } 577 } 578 pDevice->byTopOFDMBasicRate = byTopOFDM; 579 580 for (ii = RATE_11M;; ii --) { 581 if ( (pDevice->wBasicRate) & ((WORD)(1<<ii)) ) { 582 byTopCCK = ii; 583 break; 584 } 585 if (ii == RATE_1M) 586 break; 587 } 588 pDevice->byTopCCKBasicRate = byTopCCK; 589 } 590 591 /* 592 * Description: Set NIC Tx Basic Rate 593 * 594 * Parameters: 595 * In: 596 * pDevice - The adapter to be set 597 * wBasicRate - Basic Rate to be set 598 * Out: 599 * none 600 * 601 * Return Value: TRUE if succeeded; FALSE if failed. 602 * 603 */ 604 void CARDbAddBasicRate(void *pDeviceHandler, WORD wRateIdx) 605 { 606 PSDevice pDevice = (PSDevice) pDeviceHandler; 607 WORD wRate = (WORD)(1<<wRateIdx); 608 609 pDevice->wBasicRate |= wRate; 610 611 //Determines the highest basic rate. 612 CARDvUpdateBasicTopRate(pDevice); 613 } 614 615 BOOL CARDbIsOFDMinBasicRate(void *pDeviceHandler) 616 { 617 PSDevice pDevice = (PSDevice) pDeviceHandler; 618 int ii; 619 620 for (ii = RATE_54M; ii >= RATE_6M; ii --) { 621 if ((pDevice->wBasicRate) & ((WORD)(1<<ii))) 622 return TRUE; 623 } 624 return FALSE; 625 } 626 627 BYTE CARDbyGetPktType(void *pDeviceHandler) 628 { 629 PSDevice pDevice = (PSDevice) pDeviceHandler; 630 631 if (pDevice->byBBType == BB_TYPE_11A || pDevice->byBBType == BB_TYPE_11B) { 632 return (BYTE)pDevice->byBBType; 633 } 634 else if (CARDbIsOFDMinBasicRate(pDevice)) { 635 return PK_TYPE_11GA; 636 } 637 else { 638 return PK_TYPE_11GB; 639 } 640 } 641 642 643 /* 644 * Description: Caculate TSF offset of two TSF input 645 * Get TSF Offset from RxBCN's TSF and local TSF 646 * 647 * Parameters: 648 * In: 649 * pDevice - The adapter to be sync. 650 * qwTSF1 - Rx BCN's TSF 651 * qwTSF2 - Local TSF 652 * Out: 653 * none 654 * 655 * Return Value: TSF Offset value 656 * 657 */ 658 QWORD CARDqGetTSFOffset (BYTE byRxRate, QWORD qwTSF1, QWORD qwTSF2) 659 { 660 QWORD qwTSFOffset; 661 WORD wRxBcnTSFOffst = 0; 662 663 HIDWORD(qwTSFOffset) = 0; 664 LODWORD(qwTSFOffset) = 0; 665 666 wRxBcnTSFOffst = cwRXBCNTSFOff[byRxRate%MAX_RATE]; 667 (qwTSF2).u.dwLowDword += (DWORD)(wRxBcnTSFOffst); 668 if ((qwTSF2).u.dwLowDword < (DWORD)(wRxBcnTSFOffst)) { 669 (qwTSF2).u.dwHighDword++; 670 } 671 LODWORD(qwTSFOffset) = LODWORD(qwTSF1) - LODWORD(qwTSF2); 672 if (LODWORD(qwTSF1) < LODWORD(qwTSF2)) { 673 // if borrow needed 674 HIDWORD(qwTSFOffset) = HIDWORD(qwTSF1) - HIDWORD(qwTSF2) - 1 ; 675 } 676 else { 677 HIDWORD(qwTSFOffset) = HIDWORD(qwTSF1) - HIDWORD(qwTSF2); 678 }; 679 return (qwTSFOffset); 680 } 681 682 683 684 /* 685 * Description: Sync. TSF counter to BSS 686 * Get TSF offset and write to HW 687 * 688 * Parameters: 689 * In: 690 * pDevice - The adapter to be sync. 691 * qwBSSTimestamp - Rx BCN's TSF 692 * qwLocalTSF - Local TSF 693 * Out: 694 * none 695 * 696 * Return Value: none 697 * 698 */ 699 void CARDvAdjustTSF(void *pDeviceHandler, BYTE byRxRate, 700 QWORD qwBSSTimestamp, QWORD qwLocalTSF) 701 { 702 703 PSDevice pDevice = (PSDevice) pDeviceHandler; 704 QWORD qwTSFOffset; 705 DWORD dwTSFOffset1,dwTSFOffset2; 706 BYTE pbyData[8]; 707 708 HIDWORD(qwTSFOffset) = 0; 709 LODWORD(qwTSFOffset) = 0; 710 711 qwTSFOffset = CARDqGetTSFOffset(byRxRate, qwBSSTimestamp, qwLocalTSF); 712 // adjust TSF 713 // HW's TSF add TSF Offset reg 714 dwTSFOffset1 = LODWORD(qwTSFOffset); 715 dwTSFOffset2 = HIDWORD(qwTSFOffset); 716 717 718 pbyData[0] = (BYTE)dwTSFOffset1; 719 pbyData[1] = (BYTE)(dwTSFOffset1>>8); 720 pbyData[2] = (BYTE)(dwTSFOffset1>>16); 721 pbyData[3] = (BYTE)(dwTSFOffset1>>24); 722 pbyData[4] = (BYTE)dwTSFOffset2; 723 pbyData[5] = (BYTE)(dwTSFOffset2>>8); 724 pbyData[6] = (BYTE)(dwTSFOffset2>>16); 725 pbyData[7] = (BYTE)(dwTSFOffset2>>24); 726 727 CONTROLnsRequestOut(pDevice, 728 MESSAGE_TYPE_SET_TSFTBTT, 729 MESSAGE_REQUEST_TSF, 730 0, 731 8, 732 pbyData 733 ); 734 735 } 736 /* 737 * Description: Read NIC TSF counter 738 * Get local TSF counter 739 * 740 * Parameters: 741 * In: 742 * pDevice - The adapter to be read 743 * Out: 744 * qwCurrTSF - Current TSF counter 745 * 746 * Return Value: TRUE if success; otherwise FALSE 747 * 748 */ 749 BOOL CARDbGetCurrentTSF(void *pDeviceHandler, PQWORD pqwCurrTSF) 750 { 751 PSDevice pDevice = (PSDevice) pDeviceHandler; 752 753 LODWORD(*pqwCurrTSF) = LODWORD(pDevice->qwCurrTSF); 754 HIDWORD(*pqwCurrTSF) = HIDWORD(pDevice->qwCurrTSF); 755 756 return(TRUE); 757 } 758 759 760 /* 761 * Description: Clear NIC TSF counter 762 * Clear local TSF counter 763 * 764 * Parameters: 765 * In: 766 * pDevice - The adapter to be read 767 * 768 * Return Value: TRUE if success; otherwise FALSE 769 * 770 */ 771 BOOL CARDbClearCurrentTSF(void *pDeviceHandler) 772 { 773 PSDevice pDevice = (PSDevice) pDeviceHandler; 774 775 MACvRegBitsOn(pDevice,MAC_REG_TFTCTL,TFTCTL_TSFCNTRST); 776 777 LODWORD(pDevice->qwCurrTSF) = 0; 778 HIDWORD(pDevice->qwCurrTSF) = 0; 779 780 return(TRUE); 781 } 782 783 /* 784 * Description: Read NIC TSF counter 785 * Get NEXTTBTT from adjusted TSF and Beacon Interval 786 * 787 * Parameters: 788 * In: 789 * qwTSF - Current TSF counter 790 * wbeaconInterval - Beacon Interval 791 * Out: 792 * qwCurrTSF - Current TSF counter 793 * 794 * Return Value: TSF value of next Beacon 795 * 796 */ 797 QWORD CARDqGetNextTBTT (QWORD qwTSF, WORD wBeaconInterval) 798 { 799 800 unsigned int uLowNextTBTT; 801 unsigned int uHighRemain, uLowRemain; 802 unsigned int uBeaconInterval; 803 804 uBeaconInterval = wBeaconInterval * 1024; 805 // Next TBTT = ((local_current_TSF / beacon_interval) + 1 ) * beacon_interval 806 uLowNextTBTT = (LODWORD(qwTSF) >> 10) << 10; 807 uLowRemain = (uLowNextTBTT) % uBeaconInterval; 808 uHighRemain = ((0x80000000 % uBeaconInterval)* 2 * HIDWORD(qwTSF)) 809 % uBeaconInterval; 810 uLowRemain = (uHighRemain + uLowRemain) % uBeaconInterval; 811 uLowRemain = uBeaconInterval - uLowRemain; 812 813 // check if carry when add one beacon interval 814 if ((~uLowNextTBTT) < uLowRemain) 815 HIDWORD(qwTSF) ++ ; 816 817 LODWORD(qwTSF) = uLowNextTBTT + uLowRemain; 818 819 return (qwTSF); 820 } 821 822 823 /* 824 * Description: Set NIC TSF counter for first Beacon time 825 * Get NEXTTBTT from adjusted TSF and Beacon Interval 826 * 827 * Parameters: 828 * In: 829 * dwIoBase - IO Base 830 * wBeaconInterval - Beacon Interval 831 * Out: 832 * none 833 * 834 * Return Value: none 835 * 836 */ 837 void CARDvSetFirstNextTBTT(void *pDeviceHandler, WORD wBeaconInterval) 838 { 839 840 PSDevice pDevice = (PSDevice) pDeviceHandler; 841 QWORD qwNextTBTT; 842 DWORD dwLoTBTT,dwHiTBTT; 843 BYTE pbyData[8]; 844 845 HIDWORD(qwNextTBTT) = 0; 846 LODWORD(qwNextTBTT) = 0; 847 CARDbClearCurrentTSF(pDevice); 848 //CARDbGetCurrentTSF(pDevice, &qwNextTBTT); //Get Local TSF counter 849 qwNextTBTT = CARDqGetNextTBTT(qwNextTBTT, wBeaconInterval); 850 // Set NextTBTT 851 852 dwLoTBTT = LODWORD(qwNextTBTT); 853 dwHiTBTT = HIDWORD(qwNextTBTT); 854 855 pbyData[0] = (BYTE)dwLoTBTT; 856 pbyData[1] = (BYTE)(dwLoTBTT>>8); 857 pbyData[2] = (BYTE)(dwLoTBTT>>16); 858 pbyData[3] = (BYTE)(dwLoTBTT>>24); 859 pbyData[4] = (BYTE)dwHiTBTT; 860 pbyData[5] = (BYTE)(dwHiTBTT>>8); 861 pbyData[6] = (BYTE)(dwHiTBTT>>16); 862 pbyData[7] = (BYTE)(dwHiTBTT>>24); 863 864 CONTROLnsRequestOut(pDevice, 865 MESSAGE_TYPE_SET_TSFTBTT, 866 MESSAGE_REQUEST_TBTT, 867 0, 868 8, 869 pbyData 870 ); 871 872 return; 873 } 874 875 876 /* 877 * Description: Sync NIC TSF counter for Beacon time 878 * Get NEXTTBTT and write to HW 879 * 880 * Parameters: 881 * In: 882 * pDevice - The adapter to be set 883 * qwTSF - Current TSF counter 884 * wBeaconInterval - Beacon Interval 885 * Out: 886 * none 887 * 888 * Return Value: none 889 * 890 */ 891 void CARDvUpdateNextTBTT(void *pDeviceHandler, QWORD qwTSF, 892 WORD wBeaconInterval) 893 { 894 PSDevice pDevice = (PSDevice) pDeviceHandler; 895 DWORD dwLoTBTT,dwHiTBTT; 896 BYTE pbyData[8]; 897 898 qwTSF = CARDqGetNextTBTT(qwTSF, wBeaconInterval); 899 900 // Set NextTBTT 901 dwLoTBTT = LODWORD(qwTSF); 902 dwHiTBTT = HIDWORD(qwTSF); 903 904 pbyData[0] = (BYTE)dwLoTBTT; 905 pbyData[1] = (BYTE)(dwLoTBTT>>8); 906 pbyData[2] = (BYTE)(dwLoTBTT>>16); 907 pbyData[3] = (BYTE)(dwLoTBTT>>24); 908 pbyData[4] = (BYTE)dwHiTBTT; 909 pbyData[5] = (BYTE)(dwHiTBTT>>8); 910 pbyData[6] = (BYTE)(dwHiTBTT>>16); 911 pbyData[7] = (BYTE)(dwHiTBTT>>24); 912 913 CONTROLnsRequestOut(pDevice, 914 MESSAGE_TYPE_SET_TSFTBTT, 915 MESSAGE_REQUEST_TBTT, 916 0, 917 8, 918 pbyData 919 ); 920 921 922 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"Card:Update Next TBTT[%8xh:%8xh] \n",(int)HIDWORD(qwTSF), (int)LODWORD(qwTSF)); 923 924 return; 925 } 926 927 /* 928 * Description: Turn off Radio power 929 * 930 * Parameters: 931 * In: 932 * pDevice - The adapter to be turned off 933 * Out: 934 * none 935 * 936 * Return Value: TRUE if success; otherwise FALSE 937 * 938 */ 939 BOOL CARDbRadioPowerOff(void *pDeviceHandler) 940 { 941 PSDevice pDevice = (PSDevice) pDeviceHandler; 942 BOOL bResult = TRUE; 943 944 //if (pDevice->bRadioOff == TRUE) 945 // return TRUE; 946 947 pDevice->bRadioOff = TRUE; 948 949 switch (pDevice->byRFType) { 950 case RF_AL2230: 951 case RF_AL2230S: 952 case RF_AIROHA7230: 953 case RF_VT3226: //RobertYu:20051111 954 case RF_VT3226D0: 955 case RF_VT3342A0: //RobertYu:20060609 956 MACvRegBitsOff(pDevice, MAC_REG_SOFTPWRCTL, (SOFTPWRCTL_SWPE2 | SOFTPWRCTL_SWPE3)); 957 break; 958 } 959 960 MACvRegBitsOff(pDevice, MAC_REG_HOSTCR, HOSTCR_RXON); 961 962 BBvSetDeepSleep(pDevice); 963 964 return bResult; 965 } 966 967 968 /* 969 * Description: Turn on Radio power 970 * 971 * Parameters: 972 * In: 973 * pDevice - The adapter to be turned on 974 * Out: 975 * none 976 * 977 * Return Value: TRUE if success; otherwise FALSE 978 * 979 */ 980 BOOL CARDbRadioPowerOn(void *pDeviceHandler) 981 { 982 PSDevice pDevice = (PSDevice) pDeviceHandler; 983 BOOL bResult = TRUE; 984 985 986 if ((pDevice->bHWRadioOff == TRUE) || (pDevice->bRadioControlOff == TRUE)) { 987 return FALSE; 988 } 989 990 //if (pDevice->bRadioOff == FALSE) 991 // return TRUE; 992 993 pDevice->bRadioOff = FALSE; 994 995 BBvExitDeepSleep(pDevice); 996 997 MACvRegBitsOn(pDevice, MAC_REG_HOSTCR, HOSTCR_RXON); 998 999 switch (pDevice->byRFType) { 1000 case RF_AL2230: 1001 case RF_AL2230S: 1002 case RF_AIROHA7230: 1003 case RF_VT3226: //RobertYu:20051111 1004 case RF_VT3226D0: 1005 case RF_VT3342A0: //RobertYu:20060609 1006 MACvRegBitsOn(pDevice, MAC_REG_SOFTPWRCTL, (SOFTPWRCTL_SWPE2 | SOFTPWRCTL_SWPE3)); 1007 break; 1008 } 1009 1010 return bResult; 1011 } 1012 1013 void CARDvSetBSSMode(void *pDeviceHandler) 1014 { 1015 PSDevice pDevice = (PSDevice) pDeviceHandler; 1016 // Set BB and packet type at the same time.//{{RobertYu:20050222, AL7230 have two TX PA output, only connet to b/g now 1017 // so in 11a mode need to set the MAC Reg0x4C to 11b/g mode to turn on PA 1018 if( (pDevice->byRFType == RF_AIROHA7230 ) && (pDevice->byBBType == BB_TYPE_11A) ) 1019 { 1020 MACvSetBBType(pDevice, BB_TYPE_11G); 1021 } 1022 else 1023 { 1024 MACvSetBBType(pDevice, pDevice->byBBType); 1025 } 1026 pDevice->byPacketType = CARDbyGetPktType(pDevice); 1027 1028 if (pDevice->byBBType == BB_TYPE_11A) { 1029 ControlvWriteByte(pDevice, MESSAGE_REQUEST_BBREG, 0x88, 0x03); 1030 } else if (pDevice->byBBType == BB_TYPE_11B) { 1031 ControlvWriteByte(pDevice, MESSAGE_REQUEST_BBREG, 0x88, 0x02); 1032 } else if (pDevice->byBBType == BB_TYPE_11G) { 1033 ControlvWriteByte(pDevice, MESSAGE_REQUEST_BBREG, 0x88, 0x08); 1034 } 1035 1036 vUpdateIFS(pDevice); 1037 CARDvSetRSPINF(pDevice, (BYTE)pDevice->byBBType); 1038 1039 if ( pDevice->byBBType == BB_TYPE_11A ) { 1040 //request by Jack 2005-04-26 1041 if (pDevice->byRFType == RF_AIROHA7230) { 1042 pDevice->abyBBVGA[0] = 0x20; 1043 ControlvWriteByte(pDevice, MESSAGE_REQUEST_BBREG, 0xE7, pDevice->abyBBVGA[0]); 1044 } 1045 pDevice->abyBBVGA[2] = 0x10; 1046 pDevice->abyBBVGA[3] = 0x10; 1047 } else { 1048 //request by Jack 2005-04-26 1049 if (pDevice->byRFType == RF_AIROHA7230) { 1050 pDevice->abyBBVGA[0] = 0x1C; 1051 ControlvWriteByte(pDevice, MESSAGE_REQUEST_BBREG, 0xE7, pDevice->abyBBVGA[0]); 1052 } 1053 pDevice->abyBBVGA[2] = 0x0; 1054 pDevice->abyBBVGA[3] = 0x0; 1055 } 1056 } 1057 1058 /* 1059 * 1060 * Description: 1061 * Do Channel Switch defined in 802.11h 1062 * 1063 * Parameters: 1064 * In: 1065 * hDeviceContext - device structure point 1066 * Out: 1067 * none 1068 * 1069 * Return Value: none. 1070 * 1071 -*/ 1072 BOOL 1073 CARDbChannelSwitch ( 1074 void *pDeviceHandler, 1075 BYTE byMode, 1076 BYTE byNewChannel, 1077 BYTE byCount 1078 ) 1079 { 1080 PSDevice pDevice = (PSDevice) pDeviceHandler; 1081 BOOL bResult = TRUE; 1082 1083 if (byCount == 0) { 1084 pDevice->sMgmtObj.uCurrChannel = byNewChannel; 1085 CARDbSetMediaChannel(pDevice, byNewChannel); 1086 1087 return bResult; 1088 } 1089 pDevice->byChannelSwitchCount = byCount; 1090 pDevice->byNewChannel = byNewChannel; 1091 pDevice->bChannelSwitch = TRUE; 1092 1093 if (byMode == 1) { 1094 //bResult=CARDbStopTxPacket(pDevice, PKT_TYPE_802_11_ALL); 1095 pDevice->bStopDataPkt = TRUE; 1096 } 1097 return bResult; 1098 } 1099 1100 1101 1102 1103 1104 1105