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