Merge branch 'sa1100' into devel
[deliverable/linux.git] / drivers / staging / vt6656 / card.c
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 * Return Value: TRUE if succeeded; FALSE if failed.
96 *
97 */
98 BOOL CARDbSetMediaChannel (PVOID pDeviceHandler, UINT uConnectionChannel)
99 {
100 PSDevice pDevice = (PSDevice) pDeviceHandler;
101 BOOL 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 */
159 static
160 WORD swGetCCKControlRate(PVOID pDeviceHandler, WORD wRateIdx)
161 {
162 PSDevice pDevice = (PSDevice) pDeviceHandler;
163 UINT ui = (UINT)wRateIdx;
164 while (ui > RATE_1M) {
165 if (pDevice->wBasicRate & ((WORD)1 << ui)) {
166 return (WORD)ui;
167 }
168 ui --;
169 }
170 return (WORD)RATE_1M;
171 }
172
173 /*
174 * Description: Get OFDM mode basic rate
175 *
176 * Parameters:
177 * In:
178 * pDevice - The adapter to be set
179 * wRateIdx - Receiving data rate
180 * Out:
181 * none
182 *
183 * Return Value: response Control frame rate
184 *
185 */
186 static
187 WORD swGetOFDMControlRate (PVOID pDeviceHandler, WORD wRateIdx)
188 {
189 PSDevice pDevice = (PSDevice) pDeviceHandler;
190 UINT ui = (UINT)wRateIdx;
191
192 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"BASIC RATE: %X\n", pDevice->wBasicRate);
193
194 if (!CARDbIsOFDMinBasicRate(pDevice)) {
195 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"swGetOFDMControlRate:(NO OFDM) %d\n", wRateIdx);
196 if (wRateIdx > RATE_24M)
197 wRateIdx = RATE_24M;
198 return wRateIdx;
199 }
200 while (ui > RATE_11M) {
201 if (pDevice->wBasicRate & ((WORD)1 << ui)) {
202 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"swGetOFDMControlRate : %d\n", ui);
203 return (WORD)ui;
204 }
205 ui --;
206 }
207 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO"swGetOFDMControlRate: 6M\n");
208 return (WORD)RATE_24M;
209 }
210
211 /*
212 * Description: Caculate TxRate and RsvTime fields for RSPINF in OFDM mode.
213 *
214 * Parameters:
215 * In:
216 * wRate - Tx Rate
217 * byPktType - Tx Packet type
218 * Out:
219 * pbyTxRate - pointer to RSPINF TxRate field
220 * pbyRsvTime - pointer to RSPINF RsvTime field
221 *
222 * Return Value: none
223 *
224 */
225 VOID
226 CARDvCaculateOFDMRParameter (
227 IN WORD wRate,
228 IN BYTE byBBType,
229 OUT PBYTE pbyTxRate,
230 OUT PBYTE pbyRsvTime
231 )
232 {
233 switch (wRate) {
234 case RATE_6M :
235 if (byBBType == BB_TYPE_11A) {//5GHZ
236 *pbyTxRate = 0x9B;
237 *pbyRsvTime = 24;
238 }
239 else {
240 *pbyTxRate = 0x8B;
241 *pbyRsvTime = 30;
242 }
243 break;
244
245 case RATE_9M :
246 if (byBBType == BB_TYPE_11A) {//5GHZ
247 *pbyTxRate = 0x9F;
248 *pbyRsvTime = 16;
249 }
250 else {
251 *pbyTxRate = 0x8F;
252 *pbyRsvTime = 22;
253 }
254 break;
255
256 case RATE_12M :
257 if (byBBType == BB_TYPE_11A) {//5GHZ
258 *pbyTxRate = 0x9A;
259 *pbyRsvTime = 12;
260 }
261 else {
262 *pbyTxRate = 0x8A;
263 *pbyRsvTime = 18;
264 }
265 break;
266
267 case RATE_18M :
268 if (byBBType == BB_TYPE_11A) {//5GHZ
269 *pbyTxRate = 0x9E;
270 *pbyRsvTime = 8;
271 }
272 else {
273 *pbyTxRate = 0x8E;
274 *pbyRsvTime = 14;
275 }
276 break;
277
278 case RATE_36M :
279 if (byBBType == BB_TYPE_11A) {//5GHZ
280 *pbyTxRate = 0x9D;
281 *pbyRsvTime = 4;
282 }
283 else {
284 *pbyTxRate = 0x8D;
285 *pbyRsvTime = 10;
286 }
287 break;
288
289 case RATE_48M :
290 if (byBBType == BB_TYPE_11A) {//5GHZ
291 *pbyTxRate = 0x98;
292 *pbyRsvTime = 4;
293 }
294 else {
295 *pbyTxRate = 0x88;
296 *pbyRsvTime = 10;
297 }
298 break;
299
300 case RATE_54M :
301 if (byBBType == BB_TYPE_11A) {//5GHZ
302 *pbyTxRate = 0x9C;
303 *pbyRsvTime = 4;
304 }
305 else {
306 *pbyTxRate = 0x8C;
307 *pbyRsvTime = 10;
308 }
309 break;
310
311 case RATE_24M :
312 default :
313 if (byBBType == BB_TYPE_11A) {//5GHZ
314 *pbyTxRate = 0x99;
315 *pbyRsvTime = 8;
316 }
317 else {
318 *pbyTxRate = 0x89;
319 *pbyRsvTime = 14;
320 }
321 break;
322 }
323 }
324
325 /*
326 * Description: Set RSPINF
327 *
328 * Parameters:
329 * In:
330 * pDevice - The adapter to be set
331 * Out:
332 * none
333 *
334 * Return Value: None.
335 *
336 */
337 void CARDvSetRSPINF (PVOID pDeviceHandler, BYTE byBBType)
338 {
339 PSDevice pDevice = (PSDevice) pDeviceHandler;
340 BYTE abyServ[4] = {0,0,0,0}; // For CCK
341 BYTE abySignal[4] = {0,0,0,0};
342 WORD awLen[4] = {0,0,0,0};
343 BYTE abyTxRate[9] = {0,0,0,0,0,0,0,0,0}; // For OFDM
344 BYTE abyRsvTime[9] = {0,0,0,0,0,0,0,0,0};
345 BYTE abyData[34];
346 int i;
347
348 //RSPINF_b_1
349 BBvCaculateParameter(pDevice,
350 14,
351 swGetCCKControlRate(pDevice, RATE_1M),
352 PK_TYPE_11B,
353 &awLen[0],
354 &abyServ[0],
355 &abySignal[0]
356 );
357
358 ///RSPINF_b_2
359 BBvCaculateParameter(pDevice,
360 14,
361 swGetCCKControlRate(pDevice, RATE_2M),
362 PK_TYPE_11B,
363 &awLen[1],
364 &abyServ[1],
365 &abySignal[1]
366 );
367
368 //RSPINF_b_5
369 BBvCaculateParameter(pDevice,
370 14,
371 swGetCCKControlRate(pDevice, RATE_5M),
372 PK_TYPE_11B,
373 &awLen[2],
374 &abyServ[2],
375 &abySignal[2]
376 );
377
378 //RSPINF_b_11
379 BBvCaculateParameter(pDevice,
380 14,
381 swGetCCKControlRate(pDevice, RATE_11M),
382 PK_TYPE_11B,
383 &awLen[3],
384 &abyServ[3],
385 &abySignal[3]
386 );
387
388 //RSPINF_a_6
389 CARDvCaculateOFDMRParameter (RATE_6M,
390 byBBType,
391 &abyTxRate[0],
392 &abyRsvTime[0]);
393
394 //RSPINF_a_9
395 CARDvCaculateOFDMRParameter (RATE_9M,
396 byBBType,
397 &abyTxRate[1],
398 &abyRsvTime[1]);
399
400 //RSPINF_a_12
401 CARDvCaculateOFDMRParameter (RATE_12M,
402 byBBType,
403 &abyTxRate[2],
404 &abyRsvTime[2]);
405
406 //RSPINF_a_18
407 CARDvCaculateOFDMRParameter (RATE_18M,
408 byBBType,
409 &abyTxRate[3],
410 &abyRsvTime[3]);
411
412 //RSPINF_a_24
413 CARDvCaculateOFDMRParameter (RATE_24M,
414 byBBType,
415 &abyTxRate[4],
416 &abyRsvTime[4]);
417
418 //RSPINF_a_36
419 CARDvCaculateOFDMRParameter (swGetOFDMControlRate(pDevice, RATE_36M),
420 byBBType,
421 &abyTxRate[5],
422 &abyRsvTime[5]);
423
424 //RSPINF_a_48
425 CARDvCaculateOFDMRParameter (swGetOFDMControlRate(pDevice, RATE_48M),
426 byBBType,
427 &abyTxRate[6],
428 &abyRsvTime[6]);
429
430 //RSPINF_a_54
431 CARDvCaculateOFDMRParameter (swGetOFDMControlRate(pDevice, RATE_54M),
432 byBBType,
433 &abyTxRate[7],
434 &abyRsvTime[7]);
435
436 //RSPINF_a_72
437 CARDvCaculateOFDMRParameter (swGetOFDMControlRate(pDevice, RATE_54M),
438 byBBType,
439 &abyTxRate[8],
440 &abyRsvTime[8]);
441
442 abyData[0] = (BYTE)(awLen[0]&0xFF);
443 abyData[1] = (BYTE)(awLen[0]>>8);
444 abyData[2] = abySignal[0];
445 abyData[3] = abyServ[0];
446
447 abyData[4] = (BYTE)(awLen[1]&0xFF);
448 abyData[5] = (BYTE)(awLen[1]>>8);
449 abyData[6] = abySignal[1];
450 abyData[7] = abyServ[1];
451
452 abyData[8] = (BYTE)(awLen[2]&0xFF);
453 abyData[9] = (BYTE)(awLen[2]>>8);
454 abyData[10] = abySignal[2];
455 abyData[11] = abyServ[2];
456
457 abyData[12] = (BYTE)(awLen[3]&0xFF);
458 abyData[13] = (BYTE)(awLen[3]>>8);
459 abyData[14] = abySignal[3];
460 abyData[15] = abyServ[3];
461
462 for(i=0;i<9;i++) {
463 abyData[16+i*2] = abyTxRate[i];
464 abyData[16+i*2+1] = abyRsvTime[i];
465 }
466
467
468 CONTROLnsRequestOut(pDevice,
469 MESSAGE_TYPE_WRITE,
470 MAC_REG_RSPINF_B_1,
471 MESSAGE_REQUEST_MACREG,
472 34,
473 &abyData[0]);
474
475 }
476
477 /*
478 * Description: Update IFS
479 *
480 * Parameters:
481 * In:
482 * pDevice - The adapter to be set
483 * Out:
484 * none
485 *
486 * Return Value: None.
487 *
488 */
489 void vUpdateIFS (PVOID pDeviceHandler)
490 {
491 PSDevice pDevice = (PSDevice) pDeviceHandler;
492 //Set SIFS, DIFS, EIFS, SlotTime, CwMin
493 BYTE byMaxMin = 0;
494 BYTE byData[4];
495
496 if (pDevice->byPacketType==PK_TYPE_11A) {//0000 0000 0000 0000,11a
497 pDevice->uSlot = C_SLOT_SHORT;
498 pDevice->uSIFS = C_SIFS_A;
499 pDevice->uDIFS = C_SIFS_A + 2*C_SLOT_SHORT;
500 pDevice->uCwMin = C_CWMIN_A;
501 byMaxMin = 4;
502 }
503 else if (pDevice->byPacketType==PK_TYPE_11B) {//0000 0001 0000 0000,11b
504 pDevice->uSlot = C_SLOT_LONG;
505 pDevice->uSIFS = C_SIFS_BG;
506 pDevice->uDIFS = C_SIFS_BG + 2*C_SLOT_LONG;
507 pDevice->uCwMin = C_CWMIN_B;
508 byMaxMin = 5;
509 }
510 else {// PK_TYPE_11GA & PK_TYPE_11GB
511 BYTE byRate = 0;
512 BOOL bOFDMRate = FALSE;
513 UINT ii = 0;
514 PWLAN_IE_SUPP_RATES pItemRates = NULL;
515
516 pDevice->uSIFS = C_SIFS_BG;
517 if (pDevice->bShortSlotTime) {
518 pDevice->uSlot = C_SLOT_SHORT;
519 } else {
520 pDevice->uSlot = C_SLOT_LONG;
521 }
522 pDevice->uDIFS = C_SIFS_BG + 2*pDevice->uSlot;
523
524 pItemRates = (PWLAN_IE_SUPP_RATES)pDevice->sMgmtObj.abyCurrSuppRates;
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 if (bOFDMRate == FALSE) {
533 pItemRates = (PWLAN_IE_SUPP_RATES)pDevice->sMgmtObj.abyCurrExtSuppRates;
534 for (ii = 0; ii < pItemRates->len; ii++) {
535 byRate = (BYTE)(pItemRates->abyRates[ii]&0x7F);
536 if (RATEwGetRateIdx(byRate) > RATE_11M) {
537 bOFDMRate = TRUE;
538 break;
539 }
540 }
541 }
542 if (bOFDMRate == TRUE) {
543 pDevice->uCwMin = C_CWMIN_A;
544 byMaxMin = 4;
545 } else {
546 pDevice->uCwMin = C_CWMIN_B;
547 byMaxMin = 5;
548 }
549 }
550
551 pDevice->uCwMax = C_CWMAX;
552 pDevice->uEIFS = C_EIFS;
553
554 byData[0] = (BYTE)pDevice->uSIFS;
555 byData[1] = (BYTE)pDevice->uDIFS;
556 byData[2] = (BYTE)pDevice->uEIFS;
557 byData[3] = (BYTE)pDevice->uSlot;
558 CONTROLnsRequestOut(pDevice,
559 MESSAGE_TYPE_WRITE,
560 MAC_REG_SIFS,
561 MESSAGE_REQUEST_MACREG,
562 4,
563 &byData[0]);
564
565 byMaxMin |= 0xA0;//1010 1111,C_CWMAX = 1023
566 CONTROLnsRequestOut(pDevice,
567 MESSAGE_TYPE_WRITE,
568 MAC_REG_CWMAXMIN0,
569 MESSAGE_REQUEST_MACREG,
570 1,
571 &byMaxMin);
572 }
573
574 void CARDvUpdateBasicTopRate (PVOID pDeviceHandler)
575 {
576 PSDevice pDevice = (PSDevice) pDeviceHandler;
577 BYTE byTopOFDM = RATE_24M, byTopCCK = RATE_1M;
578 BYTE ii;
579
580 //Determines the highest basic rate.
581 for (ii = RATE_54M; ii >= RATE_6M; ii --) {
582 if ( (pDevice->wBasicRate) & ((WORD)(1<<ii)) ) {
583 byTopOFDM = ii;
584 break;
585 }
586 }
587 pDevice->byTopOFDMBasicRate = byTopOFDM;
588
589 for (ii = RATE_11M;; ii --) {
590 if ( (pDevice->wBasicRate) & ((WORD)(1<<ii)) ) {
591 byTopCCK = ii;
592 break;
593 }
594 if (ii == RATE_1M)
595 break;
596 }
597 pDevice->byTopCCKBasicRate = byTopCCK;
598 }
599
600 /*
601 * Description: Set NIC Tx Basic Rate
602 *
603 * Parameters:
604 * In:
605 * pDevice - The adapter to be set
606 * wBasicRate - Basic Rate to be set
607 * Out:
608 * none
609 *
610 * Return Value: TRUE if succeeded; FALSE if failed.
611 *
612 */
613 BOOL CARDbAddBasicRate (PVOID pDeviceHandler, WORD wRateIdx)
614 {
615 PSDevice pDevice = (PSDevice) pDeviceHandler;
616 WORD wRate = (WORD)(1<<wRateIdx);
617
618 pDevice->wBasicRate |= wRate;
619
620 //Determines the highest basic rate.
621 CARDvUpdateBasicTopRate(pDevice);
622
623 return(TRUE);
624 }
625
626 BOOL CARDbIsOFDMinBasicRate (PVOID pDeviceHandler)
627 {
628 PSDevice pDevice = (PSDevice) pDeviceHandler;
629 int ii;
630
631 for (ii = RATE_54M; ii >= RATE_6M; ii --) {
632 if ((pDevice->wBasicRate) & ((WORD)(1<<ii)))
633 return TRUE;
634 }
635 return FALSE;
636 }
637
638 BYTE CARDbyGetPktType (PVOID pDeviceHandler)
639 {
640 PSDevice pDevice = (PSDevice) pDeviceHandler;
641
642 if (pDevice->byBBType == BB_TYPE_11A || pDevice->byBBType == BB_TYPE_11B) {
643 return (BYTE)pDevice->byBBType;
644 }
645 else if (CARDbIsOFDMinBasicRate(pDevice)) {
646 return PK_TYPE_11GA;
647 }
648 else {
649 return PK_TYPE_11GB;
650 }
651 }
652
653
654 /*
655 * Description: Caculate TSF offset of two TSF input
656 * Get TSF Offset from RxBCN's TSF and local TSF
657 *
658 * Parameters:
659 * In:
660 * pDevice - The adapter to be sync.
661 * qwTSF1 - Rx BCN's TSF
662 * qwTSF2 - Local TSF
663 * Out:
664 * none
665 *
666 * Return Value: TSF Offset value
667 *
668 */
669 QWORD CARDqGetTSFOffset (BYTE byRxRate, QWORD qwTSF1, QWORD qwTSF2)
670 {
671 QWORD qwTSFOffset;
672 WORD wRxBcnTSFOffst = 0;
673
674 HIDWORD(qwTSFOffset) = 0;
675 LODWORD(qwTSFOffset) = 0;
676
677 wRxBcnTSFOffst = cwRXBCNTSFOff[byRxRate%MAX_RATE];
678 (qwTSF2).u.dwLowDword += (DWORD)(wRxBcnTSFOffst);
679 if ((qwTSF2).u.dwLowDword < (DWORD)(wRxBcnTSFOffst)) {
680 (qwTSF2).u.dwHighDword++;
681 }
682 LODWORD(qwTSFOffset) = LODWORD(qwTSF1) - LODWORD(qwTSF2);
683 if (LODWORD(qwTSF1) < LODWORD(qwTSF2)) {
684 // if borrow needed
685 HIDWORD(qwTSFOffset) = HIDWORD(qwTSF1) - HIDWORD(qwTSF2) - 1 ;
686 }
687 else {
688 HIDWORD(qwTSFOffset) = HIDWORD(qwTSF1) - HIDWORD(qwTSF2);
689 };
690 return (qwTSFOffset);
691 }
692
693
694
695 /*
696 * Description: Sync. TSF counter to BSS
697 * Get TSF offset and write to HW
698 *
699 * Parameters:
700 * In:
701 * pDevice - The adapter to be sync.
702 * qwBSSTimestamp - Rx BCN's TSF
703 * qwLocalTSF - Local TSF
704 * Out:
705 * none
706 *
707 * Return Value: none
708 *
709 */
710 void CARDvAdjustTSF (PVOID pDeviceHandler, BYTE byRxRate, QWORD qwBSSTimestamp, QWORD qwLocalTSF)
711 {
712
713 PSDevice pDevice = (PSDevice) pDeviceHandler;
714 QWORD qwTSFOffset;
715 DWORD dwTSFOffset1,dwTSFOffset2;
716 BYTE pbyData[8];
717
718 HIDWORD(qwTSFOffset) = 0;
719 LODWORD(qwTSFOffset) = 0;
720
721 qwTSFOffset = CARDqGetTSFOffset(byRxRate, qwBSSTimestamp, qwLocalTSF);
722 // adjust TSF
723 // HW's TSF add TSF Offset reg
724 dwTSFOffset1 = LODWORD(qwTSFOffset);
725 dwTSFOffset2 = HIDWORD(qwTSFOffset);
726
727
728 pbyData[0] = (BYTE)dwTSFOffset1;
729 pbyData[1] = (BYTE)(dwTSFOffset1>>8);
730 pbyData[2] = (BYTE)(dwTSFOffset1>>16);
731 pbyData[3] = (BYTE)(dwTSFOffset1>>24);
732 pbyData[4] = (BYTE)dwTSFOffset2;
733 pbyData[5] = (BYTE)(dwTSFOffset2>>8);
734 pbyData[6] = (BYTE)(dwTSFOffset2>>16);
735 pbyData[7] = (BYTE)(dwTSFOffset2>>24);
736
737 CONTROLnsRequestOut(pDevice,
738 MESSAGE_TYPE_SET_TSFTBTT,
739 MESSAGE_REQUEST_TSF,
740 0,
741 8,
742 pbyData
743 );
744
745 }
746 /*
747 * Description: Read NIC TSF counter
748 * Get local TSF counter
749 *
750 * Parameters:
751 * In:
752 * pDevice - The adapter to be read
753 * Out:
754 * qwCurrTSF - Current TSF counter
755 *
756 * Return Value: TRUE if success; otherwise FALSE
757 *
758 */
759 BOOL CARDbGetCurrentTSF (PVOID pDeviceHandler, PQWORD pqwCurrTSF)
760 {
761 PSDevice pDevice = (PSDevice) pDeviceHandler;
762
763 LODWORD(*pqwCurrTSF) = LODWORD(pDevice->qwCurrTSF);
764 HIDWORD(*pqwCurrTSF) = HIDWORD(pDevice->qwCurrTSF);
765
766 return(TRUE);
767 }
768
769
770 /*
771 * Description: Clear NIC TSF counter
772 * Clear local TSF counter
773 *
774 * Parameters:
775 * In:
776 * pDevice - The adapter to be read
777 *
778 * Return Value: TRUE if success; otherwise FALSE
779 *
780 */
781 BOOL CARDbClearCurrentTSF(PVOID pDeviceHandler)
782 {
783 PSDevice pDevice = (PSDevice) pDeviceHandler;
784
785 MACvRegBitsOn(pDevice,MAC_REG_TFTCTL,TFTCTL_TSFCNTRST);
786
787 LODWORD(pDevice->qwCurrTSF) = 0;
788 HIDWORD(pDevice->qwCurrTSF) = 0;
789
790 return(TRUE);
791 }
792
793 /*
794 * Description: Read NIC TSF counter
795 * Get NEXTTBTT from adjusted TSF and Beacon Interval
796 *
797 * Parameters:
798 * In:
799 * qwTSF - Current TSF counter
800 * wbeaconInterval - Beacon Interval
801 * Out:
802 * qwCurrTSF - Current TSF counter
803 *
804 * Return Value: TSF value of next Beacon
805 *
806 */
807 QWORD CARDqGetNextTBTT (QWORD qwTSF, WORD wBeaconInterval)
808 {
809
810 UINT uLowNextTBTT;
811 UINT uHighRemain, uLowRemain;
812 UINT uBeaconInterval;
813
814 uBeaconInterval = wBeaconInterval * 1024;
815 // Next TBTT = ((local_current_TSF / beacon_interval) + 1 ) * beacon_interval
816 uLowNextTBTT = (LODWORD(qwTSF) >> 10) << 10;
817 uLowRemain = (uLowNextTBTT) % uBeaconInterval;
818 uHighRemain = ((0x80000000 % uBeaconInterval)* 2 * HIDWORD(qwTSF))
819 % uBeaconInterval;
820 uLowRemain = (uHighRemain + uLowRemain) % uBeaconInterval;
821 uLowRemain = uBeaconInterval - uLowRemain;
822
823 // check if carry when add one beacon interval
824 if ((~uLowNextTBTT) < uLowRemain)
825 HIDWORD(qwTSF) ++ ;
826
827 LODWORD(qwTSF) = uLowNextTBTT + uLowRemain;
828
829 return (qwTSF);
830 }
831
832
833 /*
834 * Description: Set NIC TSF counter for first Beacon time
835 * Get NEXTTBTT from adjusted TSF and Beacon Interval
836 *
837 * Parameters:
838 * In:
839 * dwIoBase - IO Base
840 * wBeaconInterval - Beacon Interval
841 * Out:
842 * none
843 *
844 * Return Value: none
845 *
846 */
847 void CARDvSetFirstNextTBTT (PVOID pDeviceHandler, WORD wBeaconInterval)
848 {
849
850 PSDevice pDevice = (PSDevice) pDeviceHandler;
851 QWORD qwNextTBTT;
852 DWORD dwLoTBTT,dwHiTBTT;
853 BYTE pbyData[8];
854
855 HIDWORD(qwNextTBTT) = 0;
856 LODWORD(qwNextTBTT) = 0;
857 CARDbClearCurrentTSF(pDevice);
858 //CARDbGetCurrentTSF(pDevice, &qwNextTBTT); //Get Local TSF counter
859 qwNextTBTT = CARDqGetNextTBTT(qwNextTBTT, wBeaconInterval);
860 // Set NextTBTT
861
862 dwLoTBTT = LODWORD(qwNextTBTT);
863 dwHiTBTT = HIDWORD(qwNextTBTT);
864
865 pbyData[0] = (BYTE)dwLoTBTT;
866 pbyData[1] = (BYTE)(dwLoTBTT>>8);
867 pbyData[2] = (BYTE)(dwLoTBTT>>16);
868 pbyData[3] = (BYTE)(dwLoTBTT>>24);
869 pbyData[4] = (BYTE)dwHiTBTT;
870 pbyData[5] = (BYTE)(dwHiTBTT>>8);
871 pbyData[6] = (BYTE)(dwHiTBTT>>16);
872 pbyData[7] = (BYTE)(dwHiTBTT>>24);
873
874 CONTROLnsRequestOut(pDevice,
875 MESSAGE_TYPE_SET_TSFTBTT,
876 MESSAGE_REQUEST_TBTT,
877 0,
878 8,
879 pbyData
880 );
881
882 return;
883 }
884
885
886 /*
887 * Description: Sync NIC TSF counter for Beacon time
888 * Get NEXTTBTT and write to HW
889 *
890 * Parameters:
891 * In:
892 * pDevice - The adapter to be set
893 * qwTSF - Current TSF counter
894 * wBeaconInterval - Beacon Interval
895 * Out:
896 * none
897 *
898 * Return Value: none
899 *
900 */
901 void CARDvUpdateNextTBTT (PVOID pDeviceHandler, QWORD qwTSF, 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 */
948 BOOL CARDbRadioPowerOff (PVOID pDeviceHandler)
949 {
950 PSDevice pDevice = (PSDevice) pDeviceHandler;
951 BOOL 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 */
989 BOOL CARDbRadioPowerOn (PVOID pDeviceHandler)
990 {
991 PSDevice pDevice = (PSDevice) pDeviceHandler;
992 BOOL 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
1022 void CARDvSetBSSMode (PVOID 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 -*/
1081 BOOL
1082 CARDbChannelSwitch (
1083 IN PVOID pDeviceHandler,
1084 IN BYTE byMode,
1085 IN BYTE byNewChannel,
1086 IN 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
This page took 0.059459 seconds and 5 git commands to generate.