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