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