1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
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 "vntwifi.h"
55#include "power.h"
56#include "key.h"
57#include "rc4.h"
58#include "country.h"
59#include "channel.h"
60
61
62
63
64static int msglevel = MSG_LEVEL_INFO;
65
66#define C_SIFS_A 16
67#define C_SIFS_BG 10
68
69#define C_EIFS 80
70
71#define C_SLOT_SHORT 9
72#define C_SLOT_LONG 20
73
74#define C_CWMIN_A 15
75#define C_CWMIN_B 31
76
77#define C_CWMAX 1023
78
79#define WAIT_BEACON_TX_DOWN_TMO 3
80
81
82static unsigned char abyDefaultSuppRatesG[] = {WLAN_EID_SUPP_RATES, 8, 0x02, 0x04, 0x0B, 0x16, 0x24, 0x30, 0x48, 0x6C};
83
84static unsigned char abyDefaultExtSuppRatesG[] = {WLAN_EID_EXTSUPP_RATES, 4, 0x0C, 0x12, 0x18, 0x60};
85
86static unsigned char abyDefaultSuppRatesA[] = {WLAN_EID_SUPP_RATES, 8, 0x0C, 0x12, 0x18, 0x24, 0x30, 0x48, 0x60, 0x6C};
87
88static unsigned char abyDefaultSuppRatesB[] = {WLAN_EID_SUPP_RATES, 4, 0x02, 0x04, 0x0B, 0x16};
89
90
91
92const unsigned short cwRXBCNTSFOff[MAX_RATE] =
93{17, 17, 17, 17, 34, 23, 17, 11, 8, 5, 4, 3};
94
95
96
97static
98void
99s_vCalculateOFDMRParameter(
100 unsigned char byRate,
101 CARD_PHY_TYPE ePHYType,
102 unsigned char *pbyTxRate,
103 unsigned char *pbyRsvTime
104);
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122static
123void
124s_vCalculateOFDMRParameter(
125 unsigned char byRate,
126 CARD_PHY_TYPE ePHYType,
127 unsigned char *pbyTxRate,
128 unsigned char *pbyRsvTime
129)
130{
131 switch (byRate) {
132 case RATE_6M:
133 if (ePHYType == PHY_TYPE_11A) {
134 *pbyTxRate = 0x9B;
135 *pbyRsvTime = 44;
136 } else {
137 *pbyTxRate = 0x8B;
138 *pbyRsvTime = 50;
139 }
140 break;
141
142 case RATE_9M:
143 if (ePHYType == PHY_TYPE_11A) {
144 *pbyTxRate = 0x9F;
145 *pbyRsvTime = 36;
146 } else {
147 *pbyTxRate = 0x8F;
148 *pbyRsvTime = 42;
149 }
150 break;
151
152 case RATE_12M:
153 if (ePHYType == PHY_TYPE_11A) {
154 *pbyTxRate = 0x9A;
155 *pbyRsvTime = 32;
156 } else {
157 *pbyTxRate = 0x8A;
158 *pbyRsvTime = 38;
159 }
160 break;
161
162 case RATE_18M:
163 if (ePHYType == PHY_TYPE_11A) {
164 *pbyTxRate = 0x9E;
165 *pbyRsvTime = 28;
166 } else {
167 *pbyTxRate = 0x8E;
168 *pbyRsvTime = 34;
169 }
170 break;
171
172 case RATE_36M:
173 if (ePHYType == PHY_TYPE_11A) {
174 *pbyTxRate = 0x9D;
175 *pbyRsvTime = 24;
176 } else {
177 *pbyTxRate = 0x8D;
178 *pbyRsvTime = 30;
179 }
180 break;
181
182 case RATE_48M:
183 if (ePHYType == PHY_TYPE_11A) {
184 *pbyTxRate = 0x98;
185 *pbyRsvTime = 24;
186 } else {
187 *pbyTxRate = 0x88;
188 *pbyRsvTime = 30;
189 }
190 break;
191
192 case RATE_54M:
193 if (ePHYType == PHY_TYPE_11A) {
194 *pbyTxRate = 0x9C;
195 *pbyRsvTime = 24;
196 } else {
197 *pbyTxRate = 0x8C;
198 *pbyRsvTime = 30;
199 }
200 break;
201
202 case RATE_24M:
203 default:
204 if (ePHYType == PHY_TYPE_11A) {
205 *pbyTxRate = 0x99;
206 *pbyRsvTime = 28;
207 } else {
208 *pbyTxRate = 0x89;
209 *pbyRsvTime = 34;
210 }
211 break;
212 }
213}
214
215
216
217
218
219
220
221
222
223
224
225
226
227static
228void
229s_vSetRSPINF(PSDevice pDevice, CARD_PHY_TYPE ePHYType, void *pvSupportRateIEs, void *pvExtSupportRateIEs)
230{
231 unsigned char byServ = 0, bySignal = 0;
232 unsigned short wLen = 0;
233 unsigned char byTxRate = 0, byRsvTime = 0;
234
235
236 MACvSelectPage1(pDevice->PortOffset);
237
238
239 BBvCalculateParameter(pDevice,
240 14,
241 VNTWIFIbyGetACKTxRate(RATE_1M, pvSupportRateIEs, pvExtSupportRateIEs),
242 PK_TYPE_11B,
243 &wLen,
244 &byServ,
245 &bySignal
246);
247
248 VNSvOutPortD(pDevice->PortOffset + MAC_REG_RSPINF_B_1, MAKEDWORD(wLen, MAKEWORD(bySignal, byServ)));
249
250 BBvCalculateParameter(pDevice,
251 14,
252 VNTWIFIbyGetACKTxRate(RATE_2M, pvSupportRateIEs, pvExtSupportRateIEs),
253 PK_TYPE_11B,
254 &wLen,
255 &byServ,
256 &bySignal
257);
258
259 VNSvOutPortD(pDevice->PortOffset + MAC_REG_RSPINF_B_2, MAKEDWORD(wLen, MAKEWORD(bySignal, byServ)));
260
261 BBvCalculateParameter(pDevice,
262 14,
263 VNTWIFIbyGetACKTxRate(RATE_5M, pvSupportRateIEs, pvExtSupportRateIEs),
264 PK_TYPE_11B,
265 &wLen,
266 &byServ,
267 &bySignal
268);
269
270 VNSvOutPortD(pDevice->PortOffset + MAC_REG_RSPINF_B_5, MAKEDWORD(wLen, MAKEWORD(bySignal, byServ)));
271
272 BBvCalculateParameter(pDevice,
273 14,
274 VNTWIFIbyGetACKTxRate(RATE_11M, pvSupportRateIEs, pvExtSupportRateIEs),
275 PK_TYPE_11B,
276 &wLen,
277 &byServ,
278 &bySignal
279);
280
281 VNSvOutPortD(pDevice->PortOffset + MAC_REG_RSPINF_B_11, MAKEDWORD(wLen, MAKEWORD(bySignal, byServ)));
282
283 s_vCalculateOFDMRParameter(RATE_6M,
284 ePHYType,
285 &byTxRate,
286 &byRsvTime);
287 VNSvOutPortW(pDevice->PortOffset + MAC_REG_RSPINF_A_6, MAKEWORD(byTxRate, byRsvTime));
288
289 s_vCalculateOFDMRParameter(RATE_9M,
290 ePHYType,
291 &byTxRate,
292 &byRsvTime);
293 VNSvOutPortW(pDevice->PortOffset + MAC_REG_RSPINF_A_9, MAKEWORD(byTxRate, byRsvTime));
294
295 s_vCalculateOFDMRParameter(RATE_12M,
296 ePHYType,
297 &byTxRate,
298 &byRsvTime);
299 VNSvOutPortW(pDevice->PortOffset + MAC_REG_RSPINF_A_12, MAKEWORD(byTxRate, byRsvTime));
300
301 s_vCalculateOFDMRParameter(RATE_18M,
302 ePHYType,
303 &byTxRate,
304 &byRsvTime);
305 VNSvOutPortW(pDevice->PortOffset + MAC_REG_RSPINF_A_18, MAKEWORD(byTxRate, byRsvTime));
306
307 s_vCalculateOFDMRParameter(RATE_24M,
308 ePHYType,
309 &byTxRate,
310 &byRsvTime);
311 VNSvOutPortW(pDevice->PortOffset + MAC_REG_RSPINF_A_24, MAKEWORD(byTxRate, byRsvTime));
312
313 s_vCalculateOFDMRParameter(
314 VNTWIFIbyGetACKTxRate(RATE_36M, pvSupportRateIEs, pvExtSupportRateIEs),
315 ePHYType,
316 &byTxRate,
317 &byRsvTime);
318 VNSvOutPortW(pDevice->PortOffset + MAC_REG_RSPINF_A_36, MAKEWORD(byTxRate, byRsvTime));
319
320 s_vCalculateOFDMRParameter(
321 VNTWIFIbyGetACKTxRate(RATE_48M, pvSupportRateIEs, pvExtSupportRateIEs),
322 ePHYType,
323 &byTxRate,
324 &byRsvTime);
325 VNSvOutPortW(pDevice->PortOffset + MAC_REG_RSPINF_A_48, MAKEWORD(byTxRate, byRsvTime));
326
327 s_vCalculateOFDMRParameter(
328 VNTWIFIbyGetACKTxRate(RATE_54M, pvSupportRateIEs, pvExtSupportRateIEs),
329 ePHYType,
330 &byTxRate,
331 &byRsvTime);
332 VNSvOutPortW(pDevice->PortOffset + MAC_REG_RSPINF_A_54, MAKEWORD(byTxRate, byRsvTime));
333
334 VNSvOutPortW(pDevice->PortOffset + MAC_REG_RSPINF_A_72, MAKEWORD(byTxRate, byRsvTime));
335
336 MACvSelectPage0(pDevice->PortOffset);
337}
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383bool CARDbIsShortPreamble(void *pDeviceHandler)
384{
385 PSDevice pDevice = (PSDevice) pDeviceHandler;
386 if (pDevice->byPreambleType == 0) {
387 return false;
388 }
389 return true;
390}
391
392
393
394
395
396
397
398
399
400
401
402
403
404bool CARDbIsShorSlotTime(void *pDeviceHandler)
405{
406 PSDevice pDevice = (PSDevice) pDeviceHandler;
407 return pDevice->bShortSlotTime;
408}
409
410
411
412
413
414
415
416
417
418
419
420
421
422bool CARDbSetPhyParameter(void *pDeviceHandler, CARD_PHY_TYPE ePHYType, unsigned short wCapInfo, unsigned char byERPField, void *pvSupportRateIEs, void *pvExtSupportRateIEs)
423{
424 PSDevice pDevice = (PSDevice) pDeviceHandler;
425 unsigned char byCWMaxMin = 0;
426 unsigned char bySlot = 0;
427 unsigned char bySIFS = 0;
428 unsigned char byDIFS = 0;
429 unsigned char byData;
430
431 PWLAN_IE_SUPP_RATES pSupportRates = (PWLAN_IE_SUPP_RATES) pvSupportRateIEs;
432 PWLAN_IE_SUPP_RATES pExtSupportRates = (PWLAN_IE_SUPP_RATES) pvExtSupportRateIEs;
433
434
435 if (ePHYType == PHY_TYPE_11A) {
436 if (pSupportRates == NULL) {
437 pSupportRates = (PWLAN_IE_SUPP_RATES) abyDefaultSuppRatesA;
438 }
439 if (pDevice->byRFType == RF_AIROHA7230) {
440
441 MACvSetBBType(pDevice->PortOffset, BB_TYPE_11G);
442 pDevice->abyBBVGA[0] = 0x20;
443 pDevice->abyBBVGA[2] = 0x10;
444 pDevice->abyBBVGA[3] = 0x10;
445 BBbReadEmbedded(pDevice->PortOffset, 0xE7, &byData);
446 if (byData == 0x1C) {
447 BBbWriteEmbedded(pDevice->PortOffset, 0xE7, pDevice->abyBBVGA[0]);
448 }
449 } else if (pDevice->byRFType == RF_UW2452) {
450 MACvSetBBType(pDevice->PortOffset, BB_TYPE_11A);
451 pDevice->abyBBVGA[0] = 0x18;
452 BBbReadEmbedded(pDevice->PortOffset, 0xE7, &byData);
453 if (byData == 0x14) {
454 BBbWriteEmbedded(pDevice->PortOffset, 0xE7, pDevice->abyBBVGA[0]);
455 BBbWriteEmbedded(pDevice->PortOffset, 0xE1, 0x57);
456 }
457 } else {
458 MACvSetBBType(pDevice->PortOffset, BB_TYPE_11A);
459 }
460 BBbWriteEmbedded(pDevice->PortOffset, 0x88, 0x03);
461 bySlot = C_SLOT_SHORT;
462 bySIFS = C_SIFS_A;
463 byDIFS = C_SIFS_A + 2*C_SLOT_SHORT;
464 byCWMaxMin = 0xA4;
465 } else if (ePHYType == PHY_TYPE_11B) {
466 if (pSupportRates == NULL) {
467 pSupportRates = (PWLAN_IE_SUPP_RATES) abyDefaultSuppRatesB;
468 }
469 MACvSetBBType(pDevice->PortOffset, BB_TYPE_11B);
470 if (pDevice->byRFType == RF_AIROHA7230) {
471 pDevice->abyBBVGA[0] = 0x1C;
472 pDevice->abyBBVGA[2] = 0x00;
473 pDevice->abyBBVGA[3] = 0x00;
474 BBbReadEmbedded(pDevice->PortOffset, 0xE7, &byData);
475 if (byData == 0x20) {
476 BBbWriteEmbedded(pDevice->PortOffset, 0xE7, pDevice->abyBBVGA[0]);
477 }
478 } else if (pDevice->byRFType == RF_UW2452) {
479 pDevice->abyBBVGA[0] = 0x14;
480 BBbReadEmbedded(pDevice->PortOffset, 0xE7, &byData);
481 if (byData == 0x18) {
482 BBbWriteEmbedded(pDevice->PortOffset, 0xE7, pDevice->abyBBVGA[0]);
483 BBbWriteEmbedded(pDevice->PortOffset, 0xE1, 0xD3);
484 }
485 }
486 BBbWriteEmbedded(pDevice->PortOffset, 0x88, 0x02);
487 bySlot = C_SLOT_LONG;
488 bySIFS = C_SIFS_BG;
489 byDIFS = C_SIFS_BG + 2*C_SLOT_LONG;
490 byCWMaxMin = 0xA5;
491 } else {
492 if (pSupportRates == NULL) {
493 pSupportRates = (PWLAN_IE_SUPP_RATES) abyDefaultSuppRatesG;
494 pExtSupportRates = (PWLAN_IE_SUPP_RATES) abyDefaultExtSuppRatesG;
495 }
496 MACvSetBBType(pDevice->PortOffset, BB_TYPE_11G);
497 if (pDevice->byRFType == RF_AIROHA7230) {
498 pDevice->abyBBVGA[0] = 0x1C;
499 pDevice->abyBBVGA[2] = 0x00;
500 pDevice->abyBBVGA[3] = 0x00;
501 BBbReadEmbedded(pDevice->PortOffset, 0xE7, &byData);
502 if (byData == 0x20) {
503 BBbWriteEmbedded(pDevice->PortOffset, 0xE7, pDevice->abyBBVGA[0]);
504 }
505 } else if (pDevice->byRFType == RF_UW2452) {
506 pDevice->abyBBVGA[0] = 0x14;
507 BBbReadEmbedded(pDevice->PortOffset, 0xE7, &byData);
508 if (byData == 0x18) {
509 BBbWriteEmbedded(pDevice->PortOffset, 0xE7, pDevice->abyBBVGA[0]);
510 BBbWriteEmbedded(pDevice->PortOffset, 0xE1, 0xD3);
511 }
512 }
513 BBbWriteEmbedded(pDevice->PortOffset, 0x88, 0x08);
514 bySIFS = C_SIFS_BG;
515 if (VNTWIFIbIsShortSlotTime(wCapInfo)) {
516 bySlot = C_SLOT_SHORT;
517 byDIFS = C_SIFS_BG + 2*C_SLOT_SHORT;
518 } else {
519 bySlot = C_SLOT_LONG;
520 byDIFS = C_SIFS_BG + 2*C_SLOT_LONG;
521 }
522 if (VNTWIFIbyGetMaxSupportRate(pSupportRates, pExtSupportRates) > RATE_11M) {
523 byCWMaxMin = 0xA4;
524 } else {
525 byCWMaxMin = 0xA5;
526 }
527 if (pDevice->bProtectMode != VNTWIFIbIsProtectMode(byERPField)) {
528 pDevice->bProtectMode = VNTWIFIbIsProtectMode(byERPField);
529 if (pDevice->bProtectMode) {
530 MACvEnableProtectMD(pDevice->PortOffset);
531 } else {
532 MACvDisableProtectMD(pDevice->PortOffset);
533 }
534 }
535 if (pDevice->bBarkerPreambleMd != VNTWIFIbIsBarkerMode(byERPField)) {
536 pDevice->bBarkerPreambleMd = VNTWIFIbIsBarkerMode(byERPField);
537 if (pDevice->bBarkerPreambleMd) {
538 MACvEnableBarkerPreambleMd(pDevice->PortOffset);
539 } else {
540 MACvDisableBarkerPreambleMd(pDevice->PortOffset);
541 }
542 }
543 }
544
545 if (pDevice->byRFType == RF_RFMD2959) {
546
547
548 bySIFS -= 3;
549 byDIFS -= 3;
550
551
552
553 }
554
555 if (pDevice->bySIFS != bySIFS) {
556 pDevice->bySIFS = bySIFS;
557 VNSvOutPortB(pDevice->PortOffset + MAC_REG_SIFS, pDevice->bySIFS);
558 }
559 if (pDevice->byDIFS != byDIFS) {
560 pDevice->byDIFS = byDIFS;
561 VNSvOutPortB(pDevice->PortOffset + MAC_REG_DIFS, pDevice->byDIFS);
562 }
563 if (pDevice->byEIFS != C_EIFS) {
564 pDevice->byEIFS = C_EIFS;
565 VNSvOutPortB(pDevice->PortOffset + MAC_REG_EIFS, pDevice->byEIFS);
566 }
567 if (pDevice->bySlot != bySlot) {
568 pDevice->bySlot = bySlot;
569 VNSvOutPortB(pDevice->PortOffset + MAC_REG_SLOT, pDevice->bySlot);
570 if (pDevice->bySlot == C_SLOT_SHORT) {
571 pDevice->bShortSlotTime = true;
572 } else {
573 pDevice->bShortSlotTime = false;
574 }
575 BBvSetShortSlotTime(pDevice);
576 }
577 if (pDevice->byCWMaxMin != byCWMaxMin) {
578 pDevice->byCWMaxMin = byCWMaxMin;
579 VNSvOutPortB(pDevice->PortOffset + MAC_REG_CWMAXMIN0, pDevice->byCWMaxMin);
580 }
581 if (VNTWIFIbIsShortPreamble(wCapInfo)) {
582 pDevice->byPreambleType = pDevice->byShortPreamble;
583 } else {
584 pDevice->byPreambleType = 0;
585 }
586 s_vSetRSPINF(pDevice, ePHYType, pSupportRates, pExtSupportRates);
587 pDevice->eCurrentPHYType = ePHYType;
588
589 return true;
590}
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608bool CARDbUpdateTSF(void *pDeviceHandler, unsigned char byRxRate, QWORD qwBSSTimestamp, QWORD qwLocalTSF)
609{
610 PSDevice pDevice = (PSDevice) pDeviceHandler;
611 QWORD qwTSFOffset;
612
613 HIDWORD(qwTSFOffset) = 0;
614 LODWORD(qwTSFOffset) = 0;
615
616 if ((HIDWORD(qwBSSTimestamp) != HIDWORD(qwLocalTSF)) ||
617 (LODWORD(qwBSSTimestamp) != LODWORD(qwLocalTSF))) {
618 qwTSFOffset = CARDqGetTSFOffset(byRxRate, qwBSSTimestamp, qwLocalTSF);
619
620
621 VNSvOutPortD(pDevice->PortOffset + MAC_REG_TSFOFST, LODWORD(qwTSFOffset));
622 VNSvOutPortD(pDevice->PortOffset + MAC_REG_TSFOFST + 4, HIDWORD(qwTSFOffset));
623 MACvRegBitsOn(pDevice->PortOffset, MAC_REG_TFTCTL, TFTCTL_TSFSYNCEN);
624 }
625 return true;
626}
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642bool CARDbSetBeaconPeriod(void *pDeviceHandler, unsigned short wBeaconInterval)
643{
644 PSDevice pDevice = (PSDevice) pDeviceHandler;
645 unsigned int uBeaconInterval = 0;
646 unsigned int uLowNextTBTT = 0;
647 unsigned int uHighRemain = 0;
648 unsigned int uLowRemain = 0;
649 QWORD qwNextTBTT;
650
651 HIDWORD(qwNextTBTT) = 0;
652 LODWORD(qwNextTBTT) = 0;
653 CARDbGetCurrentTSF(pDevice->PortOffset, &qwNextTBTT);
654 uBeaconInterval = wBeaconInterval * 1024;
655
656 uLowNextTBTT = (LODWORD(qwNextTBTT) >> 10) << 10;
657 uLowRemain = (uLowNextTBTT) % uBeaconInterval;
658
659 uHighRemain = (((0xffffffff % uBeaconInterval) + 1) * HIDWORD(qwNextTBTT))
660 % uBeaconInterval;
661 uLowRemain = (uHighRemain + uLowRemain) % uBeaconInterval;
662 uLowRemain = uBeaconInterval - uLowRemain;
663
664
665 if ((~uLowNextTBTT) < uLowRemain) {
666 HIDWORD(qwNextTBTT)++;
667 }
668 LODWORD(qwNextTBTT) = uLowNextTBTT + uLowRemain;
669
670
671 VNSvOutPortW(pDevice->PortOffset + MAC_REG_BI, wBeaconInterval);
672 pDevice->wBeaconInterval = wBeaconInterval;
673
674 VNSvOutPortD(pDevice->PortOffset + MAC_REG_NEXTTBTT, LODWORD(qwNextTBTT));
675 VNSvOutPortD(pDevice->PortOffset + MAC_REG_NEXTTBTT + 4, HIDWORD(qwNextTBTT));
676 MACvRegBitsOn(pDevice->PortOffset, MAC_REG_TFTCTL, TFTCTL_TBTTSYNCEN);
677
678 return true;
679}
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694bool CARDbStopTxPacket(void *pDeviceHandler, CARD_PKT_TYPE ePktType)
695{
696 PSDevice pDevice = (PSDevice) pDeviceHandler;
697
698 if (ePktType == PKT_TYPE_802_11_ALL) {
699 pDevice->bStopBeacon = true;
700 pDevice->bStopTx0Pkt = true;
701 pDevice->bStopDataPkt = true;
702 } else if (ePktType == PKT_TYPE_802_11_BCN) {
703 pDevice->bStopBeacon = true;
704 } else if (ePktType == PKT_TYPE_802_11_MNG) {
705 pDevice->bStopTx0Pkt = true;
706 } else if (ePktType == PKT_TYPE_802_11_DATA) {
707 pDevice->bStopDataPkt = true;
708 }
709
710 if (pDevice->bStopBeacon == true) {
711 if (pDevice->bIsBeaconBufReadySet == true) {
712 if (pDevice->cbBeaconBufReadySetCnt < WAIT_BEACON_TX_DOWN_TMO) {
713 pDevice->cbBeaconBufReadySetCnt++;
714 return false;
715 }
716 }
717 pDevice->bIsBeaconBufReadySet = false;
718 pDevice->cbBeaconBufReadySetCnt = 0;
719 MACvRegBitsOff(pDevice->PortOffset, MAC_REG_TCR, TCR_AUTOBCNTX);
720 }
721
722 if (pDevice->bStopTx0Pkt == true) {
723 if (pDevice->iTDUsed[TYPE_TXDMA0] != 0) {
724 return false;
725 }
726 }
727
728 if (pDevice->bStopDataPkt == true) {
729 if (pDevice->iTDUsed[TYPE_AC0DMA] != 0) {
730 return false;
731 }
732 }
733
734 return true;
735}
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750bool CARDbStartTxPacket(void *pDeviceHandler, CARD_PKT_TYPE ePktType)
751{
752 PSDevice pDevice = (PSDevice) pDeviceHandler;
753
754 if (ePktType == PKT_TYPE_802_11_ALL) {
755 pDevice->bStopBeacon = false;
756 pDevice->bStopTx0Pkt = false;
757 pDevice->bStopDataPkt = false;
758 } else if (ePktType == PKT_TYPE_802_11_BCN) {
759 pDevice->bStopBeacon = false;
760 } else if (ePktType == PKT_TYPE_802_11_MNG) {
761 pDevice->bStopTx0Pkt = false;
762 } else if (ePktType == PKT_TYPE_802_11_DATA) {
763 pDevice->bStopDataPkt = false;
764 }
765
766 if ((pDevice->bStopBeacon == false) &&
767 (pDevice->bBeaconBufReady == true) &&
768 (pDevice->eOPMode == OP_MODE_ADHOC)) {
769 MACvRegBitsOn(pDevice->PortOffset, MAC_REG_TCR, TCR_AUTOBCNTX);
770 }
771
772 return true;
773}
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789bool CARDbSetBSSID(void *pDeviceHandler, unsigned char *pbyBSSID, CARD_OP_MODE eOPMode)
790{
791 PSDevice pDevice = (PSDevice) pDeviceHandler;
792
793 MACvWriteBSSIDAddress(pDevice->PortOffset, pbyBSSID);
794 memcpy(pDevice->abyBSSID, pbyBSSID, WLAN_BSSID_LEN);
795 if (eOPMode == OP_MODE_ADHOC) {
796 MACvRegBitsOn(pDevice->PortOffset, MAC_REG_HOSTCR, HOSTCR_ADHOC);
797 } else {
798 MACvRegBitsOff(pDevice->PortOffset, MAC_REG_HOSTCR, HOSTCR_ADHOC);
799 }
800 if (eOPMode == OP_MODE_AP) {
801 MACvRegBitsOn(pDevice->PortOffset, MAC_REG_HOSTCR, HOSTCR_AP);
802 } else {
803 MACvRegBitsOff(pDevice->PortOffset, MAC_REG_HOSTCR, HOSTCR_AP);
804 }
805 if (eOPMode == OP_MODE_UNKNOWN) {
806 MACvRegBitsOff(pDevice->PortOffset, MAC_REG_RCR, RCR_BSSID);
807 pDevice->bBSSIDFilter = false;
808 pDevice->byRxMode &= ~RCR_BSSID;
809 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "wcmd: rx_mode = %x\n", pDevice->byRxMode);
810 } else {
811 if (is_zero_ether_addr(pDevice->abyBSSID) == false) {
812 MACvRegBitsOn(pDevice->PortOffset, MAC_REG_RCR, RCR_BSSID);
813 pDevice->bBSSIDFilter = true;
814 pDevice->byRxMode |= RCR_BSSID;
815 }
816 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "wmgr: rx_mode = %x\n", pDevice->byRxMode);
817 }
818
819 pDevice->eOPMode = eOPMode;
820 return true;
821}
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854bool CARDbSetTxDataRate(
855 void *pDeviceHandler,
856 unsigned short wDataRate
857)
858{
859 PSDevice pDevice = (PSDevice) pDeviceHandler;
860
861 pDevice->wCurrentRate = wDataRate;
862 return true;
863}
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879bool
880CARDbPowerDown(
881 void *pDeviceHandler
882)
883{
884 PSDevice pDevice = (PSDevice)pDeviceHandler;
885 unsigned int uIdx;
886
887
888 if (MACbIsRegBitsOn(pDevice->PortOffset, MAC_REG_PSCTL, PSCTL_PS))
889 return true;
890
891
892 MACvRegBitsOn(pDevice->PortOffset, MAC_REG_PSCTL, PSCTL_PSEN);
893
894
895
896 for (uIdx = 0; uIdx < TYPE_MAXTD; uIdx++) {
897 if (pDevice->iTDUsed[uIdx] != 0)
898 return false;
899 }
900
901 MACvRegBitsOn(pDevice->PortOffset, MAC_REG_PSCTL, PSCTL_GO2DOZE);
902 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Go to Doze ZZZZZZZZZZZZZZZ\n");
903 return true;
904}
905
906
907
908
909
910
911
912
913
914
915
916
917
918bool CARDbRadioPowerOff(void *pDeviceHandler)
919{
920 PSDevice pDevice = (PSDevice)pDeviceHandler;
921 bool bResult = true;
922
923 if (pDevice->bRadioOff == true)
924 return true;
925
926 switch (pDevice->byRFType) {
927 case RF_RFMD2959:
928 MACvWordRegBitsOff(pDevice->PortOffset, MAC_REG_SOFTPWRCTL, SOFTPWRCTL_TXPEINV);
929 MACvWordRegBitsOn(pDevice->PortOffset, MAC_REG_SOFTPWRCTL, SOFTPWRCTL_SWPE1);
930 break;
931
932 case RF_AIROHA:
933 case RF_AL2230S:
934 case RF_AIROHA7230:
935 MACvWordRegBitsOff(pDevice->PortOffset, MAC_REG_SOFTPWRCTL, SOFTPWRCTL_SWPE2);
936 MACvWordRegBitsOff(pDevice->PortOffset, MAC_REG_SOFTPWRCTL, SOFTPWRCTL_SWPE3);
937 break;
938
939 }
940
941 MACvRegBitsOff(pDevice->PortOffset, MAC_REG_HOSTCR, HOSTCR_RXON);
942
943 BBvSetDeepSleep(pDevice->PortOffset, pDevice->byLocalID);
944
945 pDevice->bRadioOff = true;
946
947 printk("chester power off\n");
948 MACvRegBitsOn(pDevice->PortOffset, MAC_REG_GPIOCTL0, LED_ACTSET);
949 return bResult;
950}
951
952
953
954
955
956
957
958
959
960
961
962
963
964bool CARDbRadioPowerOn(void *pDeviceHandler)
965{
966 PSDevice pDevice = (PSDevice) pDeviceHandler;
967 bool bResult = true;
968 printk("chester power on\n");
969 if (pDevice->bRadioControlOff == true) {
970 if (pDevice->bHWRadioOff == true) printk("chester bHWRadioOff\n");
971 if (pDevice->bRadioControlOff == true) printk("chester bRadioControlOff\n");
972 return false; }
973
974 if (pDevice->bRadioOff == false) {
975 printk("chester pbRadioOff\n");
976 return true; }
977
978 BBvExitDeepSleep(pDevice->PortOffset, pDevice->byLocalID);
979
980 MACvRegBitsOn(pDevice->PortOffset, MAC_REG_HOSTCR, HOSTCR_RXON);
981
982 switch (pDevice->byRFType) {
983 case RF_RFMD2959:
984 MACvWordRegBitsOn(pDevice->PortOffset, MAC_REG_SOFTPWRCTL, SOFTPWRCTL_TXPEINV);
985 MACvWordRegBitsOff(pDevice->PortOffset, MAC_REG_SOFTPWRCTL, SOFTPWRCTL_SWPE1);
986 break;
987
988 case RF_AIROHA:
989 case RF_AL2230S:
990 case RF_AIROHA7230:
991 MACvWordRegBitsOn(pDevice->PortOffset, MAC_REG_SOFTPWRCTL, (SOFTPWRCTL_SWPE2 |
992 SOFTPWRCTL_SWPE3));
993 break;
994
995 }
996
997 pDevice->bRadioOff = false;
998
999 printk("chester power on\n");
1000 MACvRegBitsOff(pDevice->PortOffset, MAC_REG_GPIOCTL0, LED_ACTSET);
1001 return bResult;
1002}
1003
1004bool CARDbRemoveKey(void *pDeviceHandler, unsigned char *pbyBSSID)
1005{
1006 PSDevice pDevice = (PSDevice) pDeviceHandler;
1007
1008 KeybRemoveAllKey(&(pDevice->sKey), pbyBSSID, pDevice->PortOffset);
1009 return true;
1010}
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028bool
1029CARDbAdd_PMKID_Candidate(
1030 void *pDeviceHandler,
1031 unsigned char *pbyBSSID,
1032 bool bRSNCapExist,
1033 unsigned short wRSNCap
1034)
1035{
1036 PSDevice pDevice = (PSDevice) pDeviceHandler;
1037 PPMKID_CANDIDATE pCandidateList;
1038 unsigned int ii = 0;
1039
1040 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "bAdd_PMKID_Candidate START: (%d)\n", (int)pDevice->gsPMKIDCandidate.NumCandidates);
1041
1042 if (pDevice->gsPMKIDCandidate.NumCandidates >= MAX_PMKIDLIST) {
1043 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "vFlush_PMKID_Candidate: 3\n");
1044 memset(&pDevice->gsPMKIDCandidate, 0, sizeof(SPMKIDCandidateEvent));
1045 }
1046
1047 for (ii = 0; ii < 6; ii++) {
1048 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "%02X ", *(pbyBSSID + ii));
1049 }
1050 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "\n");
1051
1052
1053 for (ii = 0; ii < pDevice->gsPMKIDCandidate.NumCandidates; ii++) {
1054 pCandidateList = &pDevice->gsPMKIDCandidate.CandidateList[ii];
1055 if (!memcmp(pCandidateList->BSSID, pbyBSSID, ETH_ALEN)) {
1056 if (bRSNCapExist && (wRSNCap & BIT0)) {
1057 pCandidateList->Flags |= NDIS_802_11_PMKID_CANDIDATE_PREAUTH_ENABLED;
1058 } else {
1059 pCandidateList->Flags &= ~(NDIS_802_11_PMKID_CANDIDATE_PREAUTH_ENABLED);
1060 }
1061 return true;
1062 }
1063 }
1064
1065
1066 pCandidateList = &pDevice->gsPMKIDCandidate.CandidateList[pDevice->gsPMKIDCandidate.NumCandidates];
1067 if (bRSNCapExist && (wRSNCap & BIT0)) {
1068 pCandidateList->Flags |= NDIS_802_11_PMKID_CANDIDATE_PREAUTH_ENABLED;
1069 } else {
1070 pCandidateList->Flags &= ~(NDIS_802_11_PMKID_CANDIDATE_PREAUTH_ENABLED);
1071 }
1072 memcpy(pCandidateList->BSSID, pbyBSSID, ETH_ALEN);
1073 pDevice->gsPMKIDCandidate.NumCandidates++;
1074 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "NumCandidates:%d\n", (int)pDevice->gsPMKIDCandidate.NumCandidates);
1075 return true;
1076}
1077
1078void *
1079CARDpGetCurrentAddress(
1080 void *pDeviceHandler
1081)
1082{
1083 PSDevice pDevice = (PSDevice) pDeviceHandler;
1084
1085 return pDevice->abyCurrentNetAddr;
1086}
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102bool
1103CARDbStartMeasure(
1104 void *pDeviceHandler,
1105 void *pvMeasureEIDs,
1106 unsigned int uNumOfMeasureEIDs
1107)
1108{
1109 PSDevice pDevice = (PSDevice) pDeviceHandler;
1110 PWLAN_IE_MEASURE_REQ pEID = (PWLAN_IE_MEASURE_REQ) pvMeasureEIDs;
1111 QWORD qwCurrTSF;
1112 QWORD qwStartTSF;
1113 bool bExpired = true;
1114 unsigned short wDuration = 0;
1115
1116 if ((pEID == NULL) ||
1117 (uNumOfMeasureEIDs == 0)) {
1118 return true;
1119 }
1120 CARDbGetCurrentTSF(pDevice->PortOffset, &qwCurrTSF);
1121 if (pDevice->bMeasureInProgress == true) {
1122 pDevice->bMeasureInProgress = false;
1123 VNSvOutPortB(pDevice->PortOffset + MAC_REG_RCR, pDevice->byOrgRCR);
1124 MACvSelectPage1(pDevice->PortOffset);
1125 VNSvOutPortD(pDevice->PortOffset + MAC_REG_MAR0, pDevice->dwOrgMAR0);
1126 VNSvOutPortD(pDevice->PortOffset + MAC_REG_MAR4, pDevice->dwOrgMAR4);
1127
1128 MACvRegBitsOff(pDevice->PortOffset, MAC_REG_MSRCTL, MSRCTL_EN);
1129 MACvSelectPage0(pDevice->PortOffset);
1130 set_channel(pDevice, pDevice->byOrgChannel);
1131 MACvSelectPage1(pDevice->PortOffset);
1132 MACvRegBitsOn(pDevice->PortOffset, MAC_REG_MSRCTL+1, MSRCTL1_TXPAUSE);
1133 MACvSelectPage0(pDevice->PortOffset);
1134 }
1135 pDevice->uNumOfMeasureEIDs = uNumOfMeasureEIDs;
1136
1137 do {
1138 pDevice->pCurrMeasureEID = pEID;
1139 pEID++;
1140 pDevice->uNumOfMeasureEIDs--;
1141
1142 if (pDevice->byLocalID > REV_ID_VT3253_B1) {
1143 HIDWORD(qwStartTSF) = HIDWORD(*((PQWORD)(pDevice->pCurrMeasureEID->sReq.abyStartTime)));
1144 LODWORD(qwStartTSF) = LODWORD(*((PQWORD)(pDevice->pCurrMeasureEID->sReq.abyStartTime)));
1145 wDuration = *((unsigned short *)(pDevice->pCurrMeasureEID->sReq.abyDuration));
1146 wDuration += 1;
1147
1148 if ((LODWORD(qwStartTSF) == 0) && (HIDWORD(qwStartTSF) == 0)) {
1149
1150 LODWORD(qwStartTSF) = LODWORD(qwCurrTSF) + 2048;
1151 HIDWORD(qwStartTSF) = HIDWORD(qwCurrTSF);
1152 if (LODWORD(qwCurrTSF) > LODWORD(qwStartTSF)) {
1153 HIDWORD(qwStartTSF)++;
1154 }
1155 bExpired = false;
1156 break;
1157 } else {
1158
1159 if (LODWORD(qwStartTSF) < 1024) {
1160 HIDWORD(qwStartTSF)--;
1161 }
1162 LODWORD(qwStartTSF) -= 1024;
1163 }
1164
1165 if ((HIDWORD(qwCurrTSF) < HIDWORD(qwStartTSF)) ||
1166 ((HIDWORD(qwCurrTSF) == HIDWORD(qwStartTSF)) &&
1167 (LODWORD(qwCurrTSF) < LODWORD(qwStartTSF)))
1168) {
1169 bExpired = false;
1170 break;
1171 }
1172 VNTWIFIbMeasureReport(pDevice->pMgmt,
1173 false,
1174 pDevice->pCurrMeasureEID,
1175 MEASURE_MODE_LATE,
1176 pDevice->byBasicMap,
1177 pDevice->byCCAFraction,
1178 pDevice->abyRPIs
1179 );
1180 } else {
1181
1182 VNTWIFIbMeasureReport(pDevice->pMgmt,
1183 false,
1184 pDevice->pCurrMeasureEID,
1185 MEASURE_MODE_INCAPABLE,
1186 pDevice->byBasicMap,
1187 pDevice->byCCAFraction,
1188 pDevice->abyRPIs
1189 );
1190 }
1191 } while (pDevice->uNumOfMeasureEIDs != 0);
1192
1193 if (!bExpired) {
1194 MACvSelectPage1(pDevice->PortOffset);
1195 VNSvOutPortD(pDevice->PortOffset + MAC_REG_MSRSTART, LODWORD(qwStartTSF));
1196 VNSvOutPortD(pDevice->PortOffset + MAC_REG_MSRSTART + 4, HIDWORD(qwStartTSF));
1197 VNSvOutPortW(pDevice->PortOffset + MAC_REG_MSRDURATION, wDuration);
1198 MACvRegBitsOn(pDevice->PortOffset, MAC_REG_MSRCTL, MSRCTL_EN);
1199 MACvSelectPage0(pDevice->PortOffset);
1200 } else {
1201
1202 VNTWIFIbMeasureReport(pDevice->pMgmt,
1203 true,
1204 NULL,
1205 0,
1206 pDevice->byBasicMap,
1207 pDevice->byCCAFraction,
1208 pDevice->abyRPIs
1209 );
1210 }
1211 return true;
1212}
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228bool
1229CARDbChannelSwitch(
1230 void *pDeviceHandler,
1231 unsigned char byMode,
1232 unsigned char byNewChannel,
1233 unsigned char byCount
1234)
1235{
1236 PSDevice pDevice = (PSDevice) pDeviceHandler;
1237 bool bResult = true;
1238
1239 if (byCount == 0) {
1240 bResult = set_channel(pDevice, byNewChannel);
1241 VNTWIFIbChannelSwitch(pDevice->pMgmt, byNewChannel);
1242 MACvSelectPage1(pDevice->PortOffset);
1243 MACvRegBitsOn(pDevice->PortOffset, MAC_REG_MSRCTL+1, MSRCTL1_TXPAUSE);
1244 MACvSelectPage0(pDevice->PortOffset);
1245 return bResult;
1246 }
1247 pDevice->byChannelSwitchCount = byCount;
1248 pDevice->byNewChannel = byNewChannel;
1249 pDevice->bChannelSwitch = true;
1250 if (byMode == 1) {
1251 bResult = CARDbStopTxPacket(pDevice, PKT_TYPE_802_11_ALL);
1252 }
1253 return bResult;
1254}
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270bool
1271CARDbSetQuiet(
1272 void *pDeviceHandler,
1273 bool bResetQuiet,
1274 unsigned char byQuietCount,
1275 unsigned char byQuietPeriod,
1276 unsigned short wQuietDuration,
1277 unsigned short wQuietOffset
1278)
1279{
1280 PSDevice pDevice = (PSDevice) pDeviceHandler;
1281 unsigned int ii = 0;
1282
1283 if (bResetQuiet) {
1284 MACvRegBitsOff(pDevice->PortOffset, MAC_REG_MSRCTL, (MSRCTL_QUIETTXCHK | MSRCTL_QUIETEN));
1285 for (ii = 0; ii < MAX_QUIET_COUNT; ii++) {
1286 pDevice->sQuiet[ii].bEnable = false;
1287 }
1288 pDevice->uQuietEnqueue = 0;
1289 pDevice->bEnableFirstQuiet = false;
1290 pDevice->bQuietEnable = false;
1291 pDevice->byQuietStartCount = byQuietCount;
1292 }
1293 if (pDevice->sQuiet[pDevice->uQuietEnqueue].bEnable == false) {
1294 pDevice->sQuiet[pDevice->uQuietEnqueue].bEnable = true;
1295 pDevice->sQuiet[pDevice->uQuietEnqueue].byPeriod = byQuietPeriod;
1296 pDevice->sQuiet[pDevice->uQuietEnqueue].wDuration = wQuietDuration;
1297 pDevice->sQuiet[pDevice->uQuietEnqueue].dwStartTime = (unsigned long) byQuietCount;
1298 pDevice->sQuiet[pDevice->uQuietEnqueue].dwStartTime *= pDevice->wBeaconInterval;
1299 pDevice->sQuiet[pDevice->uQuietEnqueue].dwStartTime += wQuietOffset;
1300 pDevice->uQuietEnqueue++;
1301 pDevice->uQuietEnqueue %= MAX_QUIET_COUNT;
1302 if (pDevice->byQuietStartCount < byQuietCount) {
1303 pDevice->byQuietStartCount = byQuietCount;
1304 }
1305 } else {
1306
1307 }
1308 return true;
1309}
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326bool
1327CARDbStartQuiet(
1328 void *pDeviceHandler
1329)
1330{
1331 PSDevice pDevice = (PSDevice) pDeviceHandler;
1332 unsigned int ii = 0;
1333 unsigned long dwStartTime = 0xFFFFFFFF;
1334 unsigned int uCurrentQuietIndex = 0;
1335 unsigned long dwNextTime = 0;
1336 unsigned long dwGap = 0;
1337 unsigned long dwDuration = 0;
1338
1339 for (ii = 0; ii < MAX_QUIET_COUNT; ii++) {
1340 if ((pDevice->sQuiet[ii].bEnable == true) &&
1341 (dwStartTime > pDevice->sQuiet[ii].dwStartTime)) {
1342 dwStartTime = pDevice->sQuiet[ii].dwStartTime;
1343 uCurrentQuietIndex = ii;
1344 }
1345 }
1346 if (dwStartTime == 0xFFFFFFFF) {
1347
1348 pDevice->bQuietEnable = false;
1349 MACvRegBitsOff(pDevice->PortOffset, MAC_REG_MSRCTL, (MSRCTL_QUIETTXCHK | MSRCTL_QUIETEN));
1350 } else {
1351 if (pDevice->bQuietEnable == false) {
1352
1353 pDevice->byQuietStartCount--;
1354 dwNextTime = pDevice->sQuiet[uCurrentQuietIndex].dwStartTime;
1355 dwNextTime %= pDevice->wBeaconInterval;
1356 MACvSelectPage1(pDevice->PortOffset);
1357 VNSvOutPortW(pDevice->PortOffset + MAC_REG_QUIETINIT, (unsigned short) dwNextTime);
1358 VNSvOutPortW(pDevice->PortOffset + MAC_REG_QUIETDUR, (unsigned short) pDevice->sQuiet[uCurrentQuietIndex].wDuration);
1359 if (pDevice->byQuietStartCount == 0) {
1360 pDevice->bEnableFirstQuiet = false;
1361 MACvRegBitsOn(pDevice->PortOffset, MAC_REG_MSRCTL, (MSRCTL_QUIETTXCHK | MSRCTL_QUIETEN));
1362 } else {
1363 pDevice->bEnableFirstQuiet = true;
1364 }
1365 MACvSelectPage0(pDevice->PortOffset);
1366 } else {
1367 if (pDevice->dwCurrentQuietEndTime > pDevice->sQuiet[uCurrentQuietIndex].dwStartTime) {
1368
1369 dwGap = pDevice->dwCurrentQuietEndTime - pDevice->sQuiet[uCurrentQuietIndex].dwStartTime;
1370 if (dwGap >= pDevice->sQuiet[uCurrentQuietIndex].wDuration) {
1371
1372 return false;
1373 }
1374 dwDuration = pDevice->sQuiet[uCurrentQuietIndex].wDuration - dwGap;
1375 dwGap = 0;
1376 } else {
1377 dwGap = pDevice->sQuiet[uCurrentQuietIndex].dwStartTime - pDevice->dwCurrentQuietEndTime;
1378 dwDuration = pDevice->sQuiet[uCurrentQuietIndex].wDuration;
1379 }
1380
1381 MACvSelectPage1(pDevice->PortOffset);
1382 VNSvOutPortW(pDevice->PortOffset + MAC_REG_QUIETGAP, (unsigned short) dwGap);
1383 VNSvOutPortW(pDevice->PortOffset + MAC_REG_QUIETDUR, (unsigned short) dwDuration);
1384 MACvRegBitsOn(pDevice->PortOffset, MAC_REG_MSRCTL, MSRCTL_QUIETRPT);
1385 MACvSelectPage0(pDevice->PortOffset);
1386 }
1387 pDevice->bQuietEnable = true;
1388 pDevice->dwCurrentQuietEndTime = pDevice->sQuiet[uCurrentQuietIndex].dwStartTime;
1389 pDevice->dwCurrentQuietEndTime += pDevice->sQuiet[uCurrentQuietIndex].wDuration;
1390 if (pDevice->sQuiet[uCurrentQuietIndex].byPeriod == 0) {
1391
1392 pDevice->sQuiet[uCurrentQuietIndex].bEnable = false;
1393 } else {
1394
1395 dwNextTime = (unsigned long) pDevice->sQuiet[uCurrentQuietIndex].byPeriod;
1396 dwNextTime *= pDevice->wBeaconInterval;
1397 pDevice->sQuiet[uCurrentQuietIndex].dwStartTime = dwNextTime;
1398 }
1399 if (pDevice->dwCurrentQuietEndTime > 0x80010000) {
1400
1401 for (ii = 0; ii < MAX_QUIET_COUNT; ii++) {
1402 if (pDevice->sQuiet[ii].bEnable == true) {
1403 pDevice->sQuiet[ii].dwStartTime -= 0x80000000;
1404 }
1405 }
1406 pDevice->dwCurrentQuietEndTime -= 0x80000000;
1407 }
1408 }
1409 return true;
1410}
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426void
1427CARDvSetPowerConstraint(
1428 void *pDeviceHandler,
1429 unsigned char byChannel,
1430 char byPower
1431)
1432{
1433 PSDevice pDevice = (PSDevice) pDeviceHandler;
1434
1435 if (byChannel > CB_MAX_CHANNEL_24G) {
1436 if (pDevice->bCountryInfo5G == true) {
1437 pDevice->abyLocalPwr[byChannel] = pDevice->abyRegPwr[byChannel] - byPower;
1438 }
1439 } else {
1440 if (pDevice->bCountryInfo24G == true) {
1441 pDevice->abyLocalPwr[byChannel] = pDevice->abyRegPwr[byChannel] - byPower;
1442 }
1443 }
1444}
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460void
1461CARDvGetPowerCapability(
1462 void *pDeviceHandler,
1463 unsigned char *pbyMinPower,
1464 unsigned char *pbyMaxPower
1465)
1466{
1467 PSDevice pDevice = (PSDevice) pDeviceHandler;
1468 unsigned char byDec = 0;
1469
1470 *pbyMaxPower = pDevice->abyOFDMDefaultPwr[pDevice->byCurrentCh];
1471 byDec = pDevice->abyOFDMPwrTbl[pDevice->byCurrentCh];
1472 if (pDevice->byRFType == RF_UW2452) {
1473 byDec *= 3;
1474 byDec >>= 1;
1475 } else {
1476 byDec <<= 1;
1477 }
1478 *pbyMinPower = pDevice->abyOFDMDefaultPwr[pDevice->byCurrentCh] - byDec;
1479}
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495char
1496CARDbyGetTransmitPower(
1497 void *pDeviceHandler
1498)
1499{
1500 PSDevice pDevice = (PSDevice) pDeviceHandler;
1501
1502 return pDevice->byCurPwrdBm;
1503}
1504
1505
1506void
1507CARDvSafeResetTx(
1508 void *pDeviceHandler
1509)
1510{
1511 PSDevice pDevice = (PSDevice) pDeviceHandler;
1512 unsigned int uu;
1513 PSTxDesc pCurrTD;
1514
1515
1516 pDevice->apTailTD[0] = pDevice->apCurrTD[0] = &(pDevice->apTD0Rings[0]);
1517 pDevice->apTailTD[1] = pDevice->apCurrTD[1] = &(pDevice->apTD1Rings[0]);
1518
1519 for (uu = 0; uu < TYPE_MAXTD; uu++)
1520 pDevice->iTDUsed[uu] = 0;
1521
1522 for (uu = 0; uu < pDevice->sOpts.nTxDescs[0]; uu++) {
1523 pCurrTD = &(pDevice->apTD0Rings[uu]);
1524 pCurrTD->m_td0TD0.f1Owner = OWNED_BY_HOST;
1525
1526 }
1527 for (uu = 0; uu < pDevice->sOpts.nTxDescs[1]; uu++) {
1528 pCurrTD = &(pDevice->apTD1Rings[uu]);
1529 pCurrTD->m_td0TD0.f1Owner = OWNED_BY_HOST;
1530
1531 }
1532
1533
1534 MACvSetCurrTXDescAddr(TYPE_TXDMA0, pDevice->PortOffset,
1535 (pDevice->td0_pool_dma));
1536
1537 MACvSetCurrTXDescAddr(TYPE_AC0DMA, pDevice->PortOffset,
1538 (pDevice->td1_pool_dma));
1539
1540
1541 MACvSetCurrBCNTxDescAddr(pDevice->PortOffset,
1542 (pDevice->tx_beacon_dma));
1543}
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559void
1560CARDvSafeResetRx(
1561 void *pDeviceHandler
1562)
1563{
1564 PSDevice pDevice = (PSDevice) pDeviceHandler;
1565 unsigned int uu;
1566 PSRxDesc pDesc;
1567
1568
1569 pDevice->pCurrRD[0] = &(pDevice->aRD0Ring[0]);
1570 pDevice->pCurrRD[1] = &(pDevice->aRD1Ring[0]);
1571
1572
1573 for (uu = 0; uu < pDevice->sOpts.nRxDescs0; uu++) {
1574 pDesc = &(pDevice->aRD0Ring[uu]);
1575 pDesc->m_rd0RD0.wResCount = (unsigned short)(pDevice->rx_buf_sz);
1576 pDesc->m_rd0RD0.f1Owner = OWNED_BY_NIC;
1577 pDesc->m_rd1RD1.wReqCount = (unsigned short)(pDevice->rx_buf_sz);
1578 }
1579
1580
1581 for (uu = 0; uu < pDevice->sOpts.nRxDescs1; uu++) {
1582 pDesc = &(pDevice->aRD1Ring[uu]);
1583 pDesc->m_rd0RD0.wResCount = (unsigned short)(pDevice->rx_buf_sz);
1584 pDesc->m_rd0RD0.f1Owner = OWNED_BY_NIC;
1585 pDesc->m_rd1RD1.wReqCount = (unsigned short)(pDevice->rx_buf_sz);
1586 }
1587
1588 pDevice->cbDFCB = CB_MAX_RX_FRAG;
1589 pDevice->cbFreeDFCB = pDevice->cbDFCB;
1590
1591
1592 MACvRx0PerPktMode(pDevice->PortOffset);
1593 MACvRx1PerPktMode(pDevice->PortOffset);
1594
1595 MACvSetCurrRx0DescAddr(pDevice->PortOffset,
1596 pDevice->rd0_pool_dma);
1597
1598 MACvSetCurrRx1DescAddr(pDevice->PortOffset,
1599 pDevice->rd1_pool_dma);
1600}
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615unsigned short CARDwGetCCKControlRate(void *pDeviceHandler, unsigned short wRateIdx)
1616{
1617 PSDevice pDevice = (PSDevice) pDeviceHandler;
1618 unsigned int ui = (unsigned int) wRateIdx;
1619
1620 while (ui > RATE_1M) {
1621 if (pDevice->wBasicRate & ((unsigned short)1 << ui)) {
1622 return (unsigned short)ui;
1623 }
1624 ui--;
1625 }
1626 return (unsigned short)RATE_1M;
1627}
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642unsigned short CARDwGetOFDMControlRate(void *pDeviceHandler, unsigned short wRateIdx)
1643{
1644 PSDevice pDevice = (PSDevice) pDeviceHandler;
1645 unsigned int ui = (unsigned int) wRateIdx;
1646
1647 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "BASIC RATE: %X\n", pDevice->wBasicRate);
1648
1649 if (!CARDbIsOFDMinBasicRate((void *)pDevice)) {
1650 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "CARDwGetOFDMControlRate:(NO OFDM) %d\n", wRateIdx);
1651 if (wRateIdx > RATE_24M)
1652 wRateIdx = RATE_24M;
1653 return wRateIdx;
1654 }
1655 while (ui > RATE_11M) {
1656 if (pDevice->wBasicRate & ((unsigned short)1 << ui)) {
1657 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "CARDwGetOFDMControlRate : %d\n", ui);
1658 return (unsigned short)ui;
1659 }
1660 ui--;
1661 }
1662 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "CARDwGetOFDMControlRate: 6M\n");
1663 return (unsigned short)RATE_24M;
1664}
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678void CARDvSetRSPINF(void *pDeviceHandler, CARD_PHY_TYPE ePHYType)
1679{
1680 PSDevice pDevice = (PSDevice) pDeviceHandler;
1681 unsigned char byServ = 0x00, bySignal = 0x00;
1682 unsigned short wLen = 0x0000;
1683 unsigned char byTxRate, byRsvTime;
1684
1685
1686 MACvSelectPage1(pDevice->PortOffset);
1687
1688
1689 BBvCalculateParameter(pDevice,
1690 14,
1691 CARDwGetCCKControlRate((void *)pDevice, RATE_1M),
1692 PK_TYPE_11B,
1693 &wLen,
1694 &byServ,
1695 &bySignal
1696);
1697
1698 VNSvOutPortD(pDevice->PortOffset + MAC_REG_RSPINF_B_1, MAKEDWORD(wLen, MAKEWORD(bySignal, byServ)));
1699
1700 BBvCalculateParameter(pDevice,
1701 14,
1702 CARDwGetCCKControlRate((void *)pDevice, RATE_2M),
1703 PK_TYPE_11B,
1704 &wLen,
1705 &byServ,
1706 &bySignal
1707);
1708
1709 VNSvOutPortD(pDevice->PortOffset + MAC_REG_RSPINF_B_2, MAKEDWORD(wLen, MAKEWORD(bySignal, byServ)));
1710
1711 BBvCalculateParameter(pDevice,
1712 14,
1713 CARDwGetCCKControlRate((void *)pDevice, RATE_5M),
1714 PK_TYPE_11B,
1715 &wLen,
1716 &byServ,
1717 &bySignal
1718);
1719
1720 VNSvOutPortD(pDevice->PortOffset + MAC_REG_RSPINF_B_5, MAKEDWORD(wLen, MAKEWORD(bySignal, byServ)));
1721
1722 BBvCalculateParameter(pDevice,
1723 14,
1724 CARDwGetCCKControlRate((void *)pDevice, RATE_11M),
1725 PK_TYPE_11B,
1726 &wLen,
1727 &byServ,
1728 &bySignal
1729);
1730
1731 VNSvOutPortD(pDevice->PortOffset + MAC_REG_RSPINF_B_11, MAKEDWORD(wLen, MAKEWORD(bySignal, byServ)));
1732
1733 s_vCalculateOFDMRParameter(RATE_6M,
1734 ePHYType,
1735 &byTxRate,
1736 &byRsvTime);
1737 VNSvOutPortW(pDevice->PortOffset + MAC_REG_RSPINF_A_6, MAKEWORD(byTxRate, byRsvTime));
1738
1739 s_vCalculateOFDMRParameter(RATE_9M,
1740 ePHYType,
1741 &byTxRate,
1742 &byRsvTime);
1743 VNSvOutPortW(pDevice->PortOffset + MAC_REG_RSPINF_A_9, MAKEWORD(byTxRate, byRsvTime));
1744
1745 s_vCalculateOFDMRParameter(RATE_12M,
1746 ePHYType,
1747 &byTxRate,
1748 &byRsvTime);
1749 VNSvOutPortW(pDevice->PortOffset + MAC_REG_RSPINF_A_12, MAKEWORD(byTxRate, byRsvTime));
1750
1751 s_vCalculateOFDMRParameter(RATE_18M,
1752 ePHYType,
1753 &byTxRate,
1754 &byRsvTime);
1755 VNSvOutPortW(pDevice->PortOffset + MAC_REG_RSPINF_A_18, MAKEWORD(byTxRate, byRsvTime));
1756
1757 s_vCalculateOFDMRParameter(RATE_24M,
1758 ePHYType,
1759 &byTxRate,
1760 &byRsvTime);
1761 VNSvOutPortW(pDevice->PortOffset + MAC_REG_RSPINF_A_24, MAKEWORD(byTxRate, byRsvTime));
1762
1763 s_vCalculateOFDMRParameter(CARDwGetOFDMControlRate((void *)pDevice, RATE_36M),
1764 ePHYType,
1765 &byTxRate,
1766 &byRsvTime);
1767 VNSvOutPortW(pDevice->PortOffset + MAC_REG_RSPINF_A_36, MAKEWORD(byTxRate, byRsvTime));
1768
1769 s_vCalculateOFDMRParameter(CARDwGetOFDMControlRate((void *)pDevice, RATE_48M),
1770 ePHYType,
1771 &byTxRate,
1772 &byRsvTime);
1773 VNSvOutPortW(pDevice->PortOffset + MAC_REG_RSPINF_A_48, MAKEWORD(byTxRate, byRsvTime));
1774
1775 s_vCalculateOFDMRParameter(CARDwGetOFDMControlRate((void *)pDevice, RATE_54M),
1776 ePHYType,
1777 &byTxRate,
1778 &byRsvTime);
1779 VNSvOutPortW(pDevice->PortOffset + MAC_REG_RSPINF_A_54, MAKEWORD(byTxRate, byRsvTime));
1780
1781
1782 s_vCalculateOFDMRParameter(CARDwGetOFDMControlRate((void *)pDevice, RATE_54M),
1783 ePHYType,
1784 &byTxRate,
1785 &byRsvTime);
1786 VNSvOutPortW(pDevice->PortOffset + MAC_REG_RSPINF_A_72, MAKEWORD(byTxRate, byRsvTime));
1787
1788 MACvSelectPage0(pDevice->PortOffset);
1789}
1790
1791
1792
1793
1794
1795
1796
1797
1798
1799
1800
1801
1802
1803void vUpdateIFS(void *pDeviceHandler)
1804{
1805
1806 PSDevice pDevice = (PSDevice) pDeviceHandler;
1807
1808 unsigned char byMaxMin = 0;
1809 if (pDevice->byPacketType == PK_TYPE_11A) {
1810 pDevice->uSlot = C_SLOT_SHORT;
1811 pDevice->uSIFS = C_SIFS_A;
1812 pDevice->uDIFS = C_SIFS_A + 2*C_SLOT_SHORT;
1813 pDevice->uCwMin = C_CWMIN_A;
1814 byMaxMin = 4;
1815 } else if (pDevice->byPacketType == PK_TYPE_11B) {
1816 pDevice->uSlot = C_SLOT_LONG;
1817 pDevice->uSIFS = C_SIFS_BG;
1818 pDevice->uDIFS = C_SIFS_BG + 2*C_SLOT_LONG;
1819 pDevice->uCwMin = C_CWMIN_B;
1820 byMaxMin = 5;
1821 } else {
1822 pDevice->uSIFS = C_SIFS_BG;
1823 if (pDevice->bShortSlotTime) {
1824 pDevice->uSlot = C_SLOT_SHORT;
1825 } else {
1826 pDevice->uSlot = C_SLOT_LONG;
1827 }
1828 pDevice->uDIFS = C_SIFS_BG + 2*pDevice->uSlot;
1829 if (pDevice->wBasicRate & 0x0150) {
1830 pDevice->uCwMin = C_CWMIN_A;
1831 byMaxMin = 4;
1832 } else {
1833 pDevice->uCwMin = C_CWMIN_B;
1834 byMaxMin = 5;
1835 }
1836 }
1837
1838 pDevice->uCwMax = C_CWMAX;
1839 pDevice->uEIFS = C_EIFS;
1840 if (pDevice->byRFType == RF_RFMD2959) {
1841
1842 VNSvOutPortB(pDevice->PortOffset + MAC_REG_SIFS, (unsigned char)(pDevice->uSIFS - 3));
1843 VNSvOutPortB(pDevice->PortOffset + MAC_REG_DIFS, (unsigned char)(pDevice->uDIFS - 3));
1844 } else {
1845 VNSvOutPortB(pDevice->PortOffset + MAC_REG_SIFS, (unsigned char)pDevice->uSIFS);
1846 VNSvOutPortB(pDevice->PortOffset + MAC_REG_DIFS, (unsigned char)pDevice->uDIFS);
1847 }
1848 VNSvOutPortB(pDevice->PortOffset + MAC_REG_EIFS, (unsigned char)pDevice->uEIFS);
1849 VNSvOutPortB(pDevice->PortOffset + MAC_REG_SLOT, (unsigned char)pDevice->uSlot);
1850 byMaxMin |= 0xA0;
1851 VNSvOutPortB(pDevice->PortOffset + MAC_REG_CWMAXMIN0, (unsigned char)byMaxMin);
1852}
1853
1854void CARDvUpdateBasicTopRate(void *pDeviceHandler)
1855{
1856 PSDevice pDevice = (PSDevice) pDeviceHandler;
1857 unsigned char byTopOFDM = RATE_24M, byTopCCK = RATE_1M;
1858 unsigned char ii;
1859
1860
1861 for (ii = RATE_54M; ii >= RATE_6M; ii--) {
1862 if ((pDevice->wBasicRate) & ((unsigned short)(1<<ii))) {
1863 byTopOFDM = ii;
1864 break;
1865 }
1866 }
1867 pDevice->byTopOFDMBasicRate = byTopOFDM;
1868
1869 for (ii = RATE_11M;; ii--) {
1870 if ((pDevice->wBasicRate) & ((unsigned short)(1<<ii))) {
1871 byTopCCK = ii;
1872 break;
1873 }
1874 if (ii == RATE_1M)
1875 break;
1876 }
1877 pDevice->byTopCCKBasicRate = byTopCCK;
1878}
1879
1880
1881
1882
1883
1884
1885
1886
1887
1888
1889
1890
1891
1892
1893bool CARDbAddBasicRate(void *pDeviceHandler, unsigned short wRateIdx)
1894{
1895 PSDevice pDevice = (PSDevice) pDeviceHandler;
1896 unsigned short wRate = (unsigned short)(1<<wRateIdx);
1897
1898 pDevice->wBasicRate |= wRate;
1899
1900
1901 CARDvUpdateBasicTopRate((void *)pDevice);
1902
1903 return true;
1904}
1905
1906bool CARDbIsOFDMinBasicRate(void *pDeviceHandler)
1907{
1908 PSDevice pDevice = (PSDevice)pDeviceHandler;
1909 int ii;
1910
1911 for (ii = RATE_54M; ii >= RATE_6M; ii--) {
1912 if ((pDevice->wBasicRate) & ((unsigned short)(1 << ii)))
1913 return true;
1914 }
1915 return false;
1916}
1917
1918unsigned char CARDbyGetPktType(void *pDeviceHandler)
1919{
1920 PSDevice pDevice = (PSDevice) pDeviceHandler;
1921
1922 if (pDevice->byBBType == BB_TYPE_11A || pDevice->byBBType == BB_TYPE_11B) {
1923 return (unsigned char)pDevice->byBBType;
1924 } else if (CARDbIsOFDMinBasicRate((void *)pDevice)) {
1925 return PK_TYPE_11GA;
1926 } else {
1927 return PK_TYPE_11GB;
1928 }
1929}
1930
1931
1932
1933
1934
1935
1936
1937
1938
1939
1940
1941
1942
1943
1944void CARDvSetLoopbackMode(unsigned long dwIoBase, unsigned short wLoopbackMode)
1945{
1946 switch (wLoopbackMode) {
1947 case CARD_LB_NONE:
1948 case CARD_LB_MAC:
1949 case CARD_LB_PHY:
1950 break;
1951 default:
1952 ASSERT(false);
1953 break;
1954 }
1955
1956 MACvSetLoopbackMode(dwIoBase, LOBYTE(wLoopbackMode));
1957
1958}
1959
1960
1961
1962
1963
1964
1965
1966
1967
1968
1969
1970
1971
1972bool CARDbSoftwareReset(void *pDeviceHandler)
1973{
1974 PSDevice pDevice = (PSDevice) pDeviceHandler;
1975
1976
1977 if (!MACbSafeSoftwareReset(pDevice->PortOffset))
1978 return false;
1979
1980 return true;
1981}
1982
1983
1984
1985
1986
1987
1988
1989
1990
1991
1992
1993
1994
1995
1996
1997
1998QWORD CARDqGetTSFOffset(unsigned char byRxRate, QWORD qwTSF1, QWORD qwTSF2)
1999{
2000 QWORD qwTSFOffset;
2001 unsigned short wRxBcnTSFOffst = 0;
2002
2003 HIDWORD(qwTSFOffset) = 0;
2004 LODWORD(qwTSFOffset) = 0;
2005 wRxBcnTSFOffst = cwRXBCNTSFOff[byRxRate%MAX_RATE];
2006 (qwTSF2).u.dwLowDword += (unsigned long)(wRxBcnTSFOffst);
2007 if ((qwTSF2).u.dwLowDword < (unsigned long)(wRxBcnTSFOffst)) {
2008 (qwTSF2).u.dwHighDword++;
2009 }
2010 LODWORD(qwTSFOffset) = LODWORD(qwTSF1) - LODWORD(qwTSF2);
2011 if (LODWORD(qwTSF1) < LODWORD(qwTSF2)) {
2012
2013 HIDWORD(qwTSFOffset) = HIDWORD(qwTSF1) - HIDWORD(qwTSF2) - 1;
2014 } else {
2015 HIDWORD(qwTSFOffset) = HIDWORD(qwTSF1) - HIDWORD(qwTSF2);
2016 }
2017 return qwTSFOffset;
2018}
2019
2020
2021
2022
2023
2024
2025
2026
2027
2028
2029
2030
2031
2032
2033bool CARDbGetCurrentTSF(unsigned long dwIoBase, PQWORD pqwCurrTSF)
2034{
2035 unsigned short ww;
2036 unsigned char byData;
2037
2038 MACvRegBitsOn(dwIoBase, MAC_REG_TFTCTL, TFTCTL_TSFCNTRRD);
2039 for (ww = 0; ww < W_MAX_TIMEOUT; ww++) {
2040 VNSvInPortB(dwIoBase + MAC_REG_TFTCTL, &byData);
2041 if (!(byData & TFTCTL_TSFCNTRRD))
2042 break;
2043 }
2044 if (ww == W_MAX_TIMEOUT)
2045 return false;
2046 VNSvInPortD(dwIoBase + MAC_REG_TSFCNTR, &LODWORD(*pqwCurrTSF));
2047 VNSvInPortD(dwIoBase + MAC_REG_TSFCNTR + 4, &HIDWORD(*pqwCurrTSF));
2048
2049 return true;
2050}
2051
2052
2053
2054
2055
2056
2057
2058
2059
2060
2061
2062
2063
2064
2065
2066QWORD CARDqGetNextTBTT(QWORD qwTSF, unsigned short wBeaconInterval)
2067{
2068 unsigned int uLowNextTBTT;
2069 unsigned int uHighRemain, uLowRemain;
2070 unsigned int uBeaconInterval;
2071
2072 uBeaconInterval = wBeaconInterval * 1024;
2073
2074 uLowNextTBTT = (LODWORD(qwTSF) >> 10) << 10;
2075
2076 uLowRemain = (uLowNextTBTT) % uBeaconInterval;
2077
2078
2079
2080 uHighRemain = (((0xffffffff % uBeaconInterval) + 1) * HIDWORD(qwTSF))
2081 % uBeaconInterval;
2082 uLowRemain = (uHighRemain + uLowRemain) % uBeaconInterval;
2083 uLowRemain = uBeaconInterval - uLowRemain;
2084
2085
2086 if ((~uLowNextTBTT) < uLowRemain)
2087 HIDWORD(qwTSF)++;
2088
2089 LODWORD(qwTSF) = uLowNextTBTT + uLowRemain;
2090
2091 return qwTSF;
2092}
2093
2094
2095
2096
2097
2098
2099
2100
2101
2102
2103
2104
2105
2106
2107
2108void CARDvSetFirstNextTBTT(unsigned long dwIoBase, unsigned short wBeaconInterval)
2109{
2110 QWORD qwNextTBTT;
2111
2112 HIDWORD(qwNextTBTT) = 0;
2113 LODWORD(qwNextTBTT) = 0;
2114 CARDbGetCurrentTSF(dwIoBase, &qwNextTBTT);
2115 qwNextTBTT = CARDqGetNextTBTT(qwNextTBTT, wBeaconInterval);
2116
2117 VNSvOutPortD(dwIoBase + MAC_REG_NEXTTBTT, LODWORD(qwNextTBTT));
2118 VNSvOutPortD(dwIoBase + MAC_REG_NEXTTBTT + 4, HIDWORD(qwNextTBTT));
2119 MACvRegBitsOn(dwIoBase, MAC_REG_TFTCTL, TFTCTL_TBTTSYNCEN);
2120
2121 return;
2122}
2123
2124
2125
2126
2127
2128
2129
2130
2131
2132
2133
2134
2135
2136
2137
2138
2139void CARDvUpdateNextTBTT(unsigned long dwIoBase, QWORD qwTSF, unsigned short wBeaconInterval)
2140{
2141 qwTSF = CARDqGetNextTBTT(qwTSF, wBeaconInterval);
2142
2143 VNSvOutPortD(dwIoBase + MAC_REG_NEXTTBTT, LODWORD(qwTSF));
2144 VNSvOutPortD(dwIoBase + MAC_REG_NEXTTBTT + 4, HIDWORD(qwTSF));
2145 MACvRegBitsOn(dwIoBase, MAC_REG_TFTCTL, TFTCTL_TBTTSYNCEN);
2146 DBG_PRT(MSG_LEVEL_DEBUG, KERN_INFO "Card:Update Next TBTT[%8xh:%8xh] \n",
2147 (unsigned int) HIDWORD(qwTSF), (unsigned int) LODWORD(qwTSF));
2148
2149 return;
2150}
2151