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