a5f8df173135966b7290fff9cf3a062051abdcda
[pandora-kernel.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  *      vnt_set_rspinf - Set RSPINF
24  *      vnt_update_ifs - Update slotTime,SIFS,DIFS, and EIFS
25  *      vnt_update_top_rates - Update BasicTopRate
26  *      vnt_add_basic_rate - Add to BasicRateSet
27  *      CARDbSetBasicRate - Set Basic Tx Rate
28  *      vnt_ofdm_min_rate - Check if any OFDM rate is in BasicRateSet
29  *      CARDvSetLoopbackMode - Set Loopback mode
30  *      CARDbSoftwareReset - Sortware reset NIC
31  *      vnt_get_tsf_offset - Calculate TSFOffset
32  *      vnt_get_current_tsf - Read Current NIC TSF counter
33  *      vnt_get_next_tbtt - Calculate Next Beacon TSF counter
34  *      vnt_reset_next_tbtt - Set NIC Beacon time
35  *      vnt_update_next_tbtt - Sync. NIC Beacon time
36  *      vnt_radio_power_off - Turn Off NIC Radio Power
37  *      vnt_radio_power_on - Turn On NIC Radio Power
38  *      CARDbSetWEPMode - Set NIC Wep mode
39  *      CARDbSetTxPower - Set NIC tx power
40  *
41  * Revision History:
42  *      06-10-2003 Bryan YC Fan:  Re-write codes to support VT3253 spec.
43  *      08-26-2003 Kyle Hsu:      Modify the definition type of dwIoBase.
44  *      09-01-2003 Bryan YC Fan:  Add vnt_update_ifs().
45  *
46  */
47
48 #include "device.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 "usbpipe.h"
57
58 //const u16 cwRXBCNTSFOff[MAX_RATE] =
59 //{17, 34, 96, 192, 34, 23, 17, 11, 8, 5, 4, 3};
60
61 static const u16 cwRXBCNTSFOff[MAX_RATE] =
62 {192, 96, 34, 17, 34, 23, 17, 11, 8, 5, 4, 3};
63
64 /*
65  * Description: Set NIC media channel
66  *
67  * Parameters:
68  *  In:
69  *      pDevice             - The adapter to be set
70  *      connection_channel  - Channel to be set
71  *  Out:
72  *      none
73  */
74 void vnt_set_channel(struct vnt_private *priv, u32 connection_channel)
75 {
76
77         if (connection_channel > CB_MAX_CHANNEL || !connection_channel)
78                 return;
79
80         /* clear NAV */
81         vnt_mac_reg_bits_on(priv, MAC_REG_MACCR, MACCR_CLRNAV);
82
83         /* Set Channel[7] = 0 to tell H/W channel is changing now. */
84         vnt_mac_reg_bits_off(priv, MAC_REG_CHANNEL, 0xb0);
85
86         vnt_control_out(priv, MESSAGE_TYPE_SELECT_CHANNLE,
87                                         connection_channel, 0, 0, NULL);
88
89         vnt_control_out_u8(priv, MESSAGE_REQUEST_MACREG, MAC_REG_CHANNEL,
90                 (u8)(connection_channel|0x80));
91 }
92
93 /*
94  * Description: Get CCK mode basic rate
95  *
96  * Parameters:
97  *  In:
98  *      priv            - The adapter to be set
99  *      rate_idx        - Receiving data rate
100  *  Out:
101  *      none
102  *
103  * Return Value: response Control frame rate
104  *
105  */
106 static u16 vnt_get_cck_rate(struct vnt_private *priv, u16 rate_idx)
107 {
108         u16 ui = rate_idx;
109
110         while (ui > RATE_1M) {
111                 if (priv->wBasicRate & (1 << ui))
112                         return ui;
113                 ui--;
114         }
115
116         return RATE_1M;
117 }
118
119 /*
120  * Description: Get OFDM mode basic rate
121  *
122  * Parameters:
123  *  In:
124  *      priv            - The adapter to be set
125  *      rate_idx        - Receiving data rate
126  *  Out:
127  *      none
128  *
129  * Return Value: response Control frame rate
130  *
131  */
132 static u16 vnt_get_ofdm_rate(struct vnt_private *priv, u16 rate_idx)
133 {
134         u16 ui = rate_idx;
135
136         dev_dbg(&priv->usb->dev, "%s basic rate: %d\n",
137                                         __func__,  priv->wBasicRate);
138
139         if (!vnt_ofdm_min_rate(priv)) {
140                 dev_dbg(&priv->usb->dev, "%s (NO OFDM) %d\n",
141                                                 __func__, rate_idx);
142                 if (rate_idx > RATE_24M)
143                         rate_idx = RATE_24M;
144                 return rate_idx;
145         }
146
147         while (ui > RATE_11M) {
148                 if (priv->wBasicRate & (1 << ui)) {
149                         dev_dbg(&priv->usb->dev, "%s rate: %d\n",
150                                                         __func__, ui);
151                         return ui;
152                 }
153                 ui--;
154         }
155
156         dev_dbg(&priv->usb->dev, "%s basic rate: 24M\n", __func__);
157
158         return RATE_24M;
159 }
160
161 /*
162  * Description: Calculate TxRate and RsvTime fields for RSPINF in OFDM mode.
163  *
164  * Parameters:
165  * In:
166  *      rate    - Tx Rate
167  *      bb_type - Tx Packet type
168  * Out:
169  *      tx_rate - pointer to RSPINF TxRate field
170  *      rsv_time- pointer to RSPINF RsvTime field
171  *
172  * Return Value: none
173  *
174  */
175 static void vnt_calculate_ofdm_rate(u16 rate, u8 bb_type,
176                                         u8 *tx_rate, u8 *rsv_time)
177 {
178
179         switch (rate) {
180         case RATE_6M:
181                 if (bb_type == BB_TYPE_11A) {
182                         *tx_rate = 0x9b;
183                         *rsv_time = 24;
184                 } else {
185                         *tx_rate = 0x8b;
186                         *rsv_time = 30;
187                 }
188                         break;
189         case RATE_9M:
190                 if (bb_type == BB_TYPE_11A) {
191                         *tx_rate = 0x9f;
192                         *rsv_time = 16;
193                 } else {
194                         *tx_rate = 0x8f;
195                         *rsv_time = 22;
196                 }
197                 break;
198         case RATE_12M:
199                 if (bb_type == BB_TYPE_11A) {
200                         *tx_rate = 0x9a;
201                         *rsv_time = 12;
202                 } else {
203                         *tx_rate = 0x8a;
204                         *rsv_time = 18;
205                 }
206                 break;
207         case RATE_18M:
208                 if (bb_type == BB_TYPE_11A) {
209                         *tx_rate = 0x9e;
210                         *rsv_time = 8;
211                 } else {
212                         *tx_rate = 0x8e;
213                         *rsv_time = 14;
214                 }
215                 break;
216         case RATE_36M:
217                 if (bb_type == BB_TYPE_11A) {
218                         *tx_rate = 0x9d;
219                         *rsv_time = 4;
220                 } else {
221                         *tx_rate = 0x8d;
222                         *rsv_time = 10;
223                 }
224                 break;
225         case RATE_48M:
226                 if (bb_type == BB_TYPE_11A) {
227                         *tx_rate = 0x98;
228                         *rsv_time = 4;
229                 } else {
230                         *tx_rate = 0x88;
231                         *rsv_time = 10;
232                 }
233                 break;
234         case RATE_54M:
235                 if (bb_type == BB_TYPE_11A) {
236                         *tx_rate = 0x9c;
237                         *rsv_time = 4;
238                 } else {
239                         *tx_rate = 0x8c;
240                         *rsv_time = 10;
241                 }
242                 break;
243         case RATE_24M:
244         default:
245                 if (bb_type == BB_TYPE_11A) {
246                         *tx_rate = 0x99;
247                         *rsv_time = 8;
248                 } else {
249                         *tx_rate = 0x89;
250                         *rsv_time = 14;
251                 }
252                 break;
253         }
254 }
255
256 /*
257  * Description: Set RSPINF
258  *
259  * Parameters:
260  *  In:
261  *      pDevice             - The adapter to be set
262  *  Out:
263  *      none
264  *
265  * Return Value: None.
266  *
267  */
268
269 void vnt_set_rspinf(struct vnt_private *priv, u8 bb_type)
270 {
271         struct vnt_phy_field phy[4];
272         u8 tx_rate[9] = {0, 0, 0, 0, 0, 0, 0, 0, 0}; /* For OFDM */
273         u8 rsv_time[9] = {0, 0, 0, 0, 0, 0, 0, 0, 0};
274         u8 data[34];
275         int i;
276
277         /*RSPINF_b_1*/
278         vnt_get_phy_field(priv, 14,
279                 vnt_get_cck_rate(priv, RATE_1M), PK_TYPE_11B, &phy[0]);
280
281         /*RSPINF_b_2*/
282         vnt_get_phy_field(priv, 14,
283                 vnt_get_cck_rate(priv, RATE_2M), PK_TYPE_11B, &phy[1]);
284
285         /*RSPINF_b_5*/
286         vnt_get_phy_field(priv, 14,
287                 vnt_get_cck_rate(priv, RATE_5M), PK_TYPE_11B, &phy[2]);
288
289         /*RSPINF_b_11*/
290         vnt_get_phy_field(priv, 14,
291                 vnt_get_cck_rate(priv, RATE_11M), PK_TYPE_11B, &phy[3]);
292
293
294         /*RSPINF_a_6*/
295         vnt_calculate_ofdm_rate(RATE_6M, bb_type, &tx_rate[0], &rsv_time[0]);
296
297         /*RSPINF_a_9*/
298         vnt_calculate_ofdm_rate(RATE_9M, bb_type, &tx_rate[1], &rsv_time[1]);
299
300         /*RSPINF_a_12*/
301         vnt_calculate_ofdm_rate(RATE_12M, bb_type, &tx_rate[2], &rsv_time[2]);
302
303         /*RSPINF_a_18*/
304         vnt_calculate_ofdm_rate(RATE_18M, bb_type, &tx_rate[3], &rsv_time[3]);
305
306         /*RSPINF_a_24*/
307         vnt_calculate_ofdm_rate(RATE_24M, bb_type, &tx_rate[4], &rsv_time[4]);
308
309         /*RSPINF_a_36*/
310         vnt_calculate_ofdm_rate(vnt_get_ofdm_rate(priv, RATE_36M),
311                                         bb_type, &tx_rate[5], &rsv_time[5]);
312
313         /*RSPINF_a_48*/
314         vnt_calculate_ofdm_rate(vnt_get_ofdm_rate(priv, RATE_48M),
315                                         bb_type, &tx_rate[6], &rsv_time[6]);
316
317         /*RSPINF_a_54*/
318         vnt_calculate_ofdm_rate(vnt_get_ofdm_rate(priv, RATE_54M),
319                                         bb_type, &tx_rate[7], &rsv_time[7]);
320
321         /*RSPINF_a_72*/
322         vnt_calculate_ofdm_rate(vnt_get_ofdm_rate(priv, RATE_54M),
323                                         bb_type, &tx_rate[8], &rsv_time[8]);
324
325         put_unaligned(phy[0].len, (u16 *)&data[0]);
326         data[2] = phy[0].signal;
327         data[3] = phy[0].service;
328
329         put_unaligned(phy[1].len, (u16 *)&data[4]);
330         data[6] = phy[1].signal;
331         data[7] = phy[1].service;
332
333         put_unaligned(phy[2].len, (u16 *)&data[8]);
334         data[10] = phy[2].signal;
335         data[11] = phy[2].service;
336
337         put_unaligned(phy[3].len, (u16 *)&data[12]);
338         data[14] = phy[3].signal;
339         data[15] = phy[3].service;
340
341         for (i = 0; i < 9; i++) {
342                 data[16 + i * 2] = tx_rate[i];
343                 data[16 + i * 2 + 1] = rsv_time[i];
344         }
345
346         vnt_control_out(priv, MESSAGE_TYPE_WRITE,
347                 MAC_REG_RSPINF_B_1, MESSAGE_REQUEST_MACREG, 34, &data[0]);
348 }
349
350 /*
351  * Description: Update IFS
352  *
353  * Parameters:
354  *  In:
355  *      priv - The adapter to be set
356  * Out:
357  *      none
358  *
359  * Return Value: None.
360  *
361  */
362 void vnt_update_ifs(struct vnt_private *priv)
363 {
364         u8 max_min = 0;
365         u8 data[4];
366
367         if (priv->byPacketType == PK_TYPE_11A) {
368                 priv->uSlot = C_SLOT_SHORT;
369                 priv->uSIFS = C_SIFS_A;
370                 priv->uDIFS = C_SIFS_A + 2 * C_SLOT_SHORT;
371                 priv->uCwMin = C_CWMIN_A;
372                 max_min = 4;
373         } else if (priv->byPacketType == PK_TYPE_11B) {
374                 priv->uSlot = C_SLOT_LONG;
375                 priv->uSIFS = C_SIFS_BG;
376                 priv->uDIFS = C_SIFS_BG + 2 * C_SLOT_LONG;
377                 priv->uCwMin = C_CWMIN_B;
378                 max_min = 5;
379         } else {/* PK_TYPE_11GA & PK_TYPE_11GB */
380                 bool ofdm_rate = false;
381                 unsigned int ii = 0;
382
383                 priv->uSIFS = C_SIFS_BG;
384
385                 if (priv->bShortSlotTime)
386                         priv->uSlot = C_SLOT_SHORT;
387                 else
388                         priv->uSlot = C_SLOT_LONG;
389
390                 priv->uDIFS = C_SIFS_BG + 2 * priv->uSlot;
391
392                 for (ii = RATE_54M; ii >= RATE_6M; ii--) {
393                         if (priv->wBasicRate & ((u32)(0x1 << ii))) {
394                                 ofdm_rate = true;
395                                 break;
396                         }
397                 }
398
399                 if (ofdm_rate == true) {
400                         priv->uCwMin = C_CWMIN_A;
401                         max_min = 4;
402                 } else {
403                         priv->uCwMin = C_CWMIN_B;
404                         max_min = 5;
405                         }
406         }
407
408         priv->uCwMax = C_CWMAX;
409         priv->uEIFS = C_EIFS;
410
411         data[0] = (u8)priv->uSIFS;
412         data[1] = (u8)priv->uDIFS;
413         data[2] = (u8)priv->uEIFS;
414         data[3] = (u8)priv->uSlot;
415
416         vnt_control_out(priv, MESSAGE_TYPE_WRITE, MAC_REG_SIFS,
417                 MESSAGE_REQUEST_MACREG, 4, &data[0]);
418
419         max_min |= 0xa0;
420
421         vnt_control_out(priv, MESSAGE_TYPE_WRITE, MAC_REG_CWMAXMIN0,
422                 MESSAGE_REQUEST_MACREG, 1, &max_min);
423 }
424
425 void vnt_update_top_rates(struct vnt_private *priv)
426 {
427         u8 top_ofdm = RATE_24M, top_cck = RATE_1M;
428         u8 i;
429
430         /*Determines the highest basic rate.*/
431         for (i = RATE_54M; i >= RATE_6M; i--) {
432                 if (priv->wBasicRate & (u16)(1 << i)) {
433                         top_ofdm = i;
434                         break;
435                 }
436         }
437
438         priv->byTopOFDMBasicRate = top_ofdm;
439
440         for (i = RATE_11M;; i--) {
441                 if (priv->wBasicRate & (u16)(1 << i)) {
442                         top_cck = i;
443                         break;
444                 }
445                 if (i == RATE_1M)
446                         break;
447         }
448
449         priv->byTopCCKBasicRate = top_cck;
450  }
451
452 int vnt_ofdm_min_rate(struct vnt_private *priv)
453 {
454         int ii;
455
456         for (ii = RATE_54M; ii >= RATE_6M; ii--) {
457                 if ((priv->wBasicRate) & ((u16)(1 << ii)))
458                         return true;
459         }
460
461         return false;
462 }
463
464 u8 vnt_get_pkt_type(struct vnt_private *priv)
465 {
466
467         if (priv->byBBType == BB_TYPE_11A || priv->byBBType == BB_TYPE_11B)
468                 return (u8)priv->byBBType;
469         else if (vnt_ofdm_min_rate(priv))
470                 return PK_TYPE_11GA;
471         else
472                 return PK_TYPE_11GB;
473 }
474
475 /*
476  * Description: Calculate TSF offset of two TSF input
477  *              Get TSF Offset from RxBCN's TSF and local TSF
478  *
479  * Parameters:
480  *  In:
481  *      rx_rate - rx rate.
482  *      tsf1    - Rx BCN's TSF
483  *      tsf2    - Local TSF
484  *  Out:
485  *      none
486  *
487  * Return Value: TSF Offset value
488  *
489  */
490 u64 vnt_get_tsf_offset(u8 rx_rate, u64 tsf1, u64 tsf2)
491 {
492         u64 tsf_offset = 0;
493         u16 rx_bcn_offset = 0;
494
495         rx_bcn_offset = cwRXBCNTSFOff[rx_rate % MAX_RATE];
496
497         tsf2 += (u64)rx_bcn_offset;
498
499         tsf_offset = tsf1 - tsf2;
500
501         return tsf_offset;
502 }
503
504 /*
505  * Description: Sync. TSF counter to BSS
506  *              Get TSF offset and write to HW
507  *
508  * Parameters:
509  *  In:
510  *      priv            - The adapter to be sync.
511  *      time_stamp      - Rx BCN's TSF
512  *      local_tsf       - Local TSF
513  *  Out:
514  *      none
515  *
516  * Return Value: none
517  *
518  */
519 void vnt_adjust_tsf(struct vnt_private *priv, u8 rx_rate,
520                 u64 time_stamp, u64 local_tsf)
521 {
522         u64 tsf_offset = 0;
523         u8 data[8];
524
525         tsf_offset = vnt_get_tsf_offset(rx_rate, time_stamp, local_tsf);
526
527         data[0] = (u8)tsf_offset;
528         data[1] = (u8)(tsf_offset >> 8);
529         data[2] = (u8)(tsf_offset >> 16);
530         data[3] = (u8)(tsf_offset >> 24);
531         data[4] = (u8)(tsf_offset >> 32);
532         data[5] = (u8)(tsf_offset >> 40);
533         data[6] = (u8)(tsf_offset >> 48);
534         data[7] = (u8)(tsf_offset >> 56);
535
536         vnt_control_out(priv, MESSAGE_TYPE_SET_TSFTBTT,
537                 MESSAGE_REQUEST_TSF, 0, 8, data);
538 }
539 /*
540  * Description: Read NIC TSF counter
541  *              Get local TSF counter
542  *
543  * Parameters:
544  *  In:
545  *      priv            - The adapter to be read
546  *  Out:
547  *      current_tsf     - Current TSF counter
548  *
549  * Return Value: true if success; otherwise false
550  *
551  */
552 bool vnt_get_current_tsf(struct vnt_private *priv, u64 *current_tsf)
553 {
554
555         *current_tsf = priv->qwCurrTSF;
556
557         return true;
558 }
559
560 /*
561  * Description: Clear NIC TSF counter
562  *              Clear local TSF counter
563  *
564  * Parameters:
565  *  In:
566  *      priv    - The adapter to be read
567  *
568  * Return Value: true if success; otherwise false
569  *
570  */
571 bool vnt_clear_current_tsf(struct vnt_private *priv)
572 {
573
574         vnt_mac_reg_bits_on(priv, MAC_REG_TFTCTL, TFTCTL_TSFCNTRST);
575
576         priv->qwCurrTSF = 0;
577
578         return true;
579 }
580
581 /*
582  * Description: Read NIC TSF counter
583  *              Get NEXTTBTT from adjusted TSF and Beacon Interval
584  *
585  * Parameters:
586  *  In:
587  *      tsf             - Current TSF counter
588  *      beacon_interval - Beacon Interval
589  *  Out:
590  *      tsf             - Current TSF counter
591  *
592  * Return Value: TSF value of next Beacon
593  *
594  */
595 u64 vnt_get_next_tbtt(u64 tsf, u16 beacon_interval)
596 {
597         u32 beacon_int;
598
599         beacon_int = beacon_interval * 1024;
600
601         /* Next TBTT =
602         *       ((local_current_TSF / beacon_interval) + 1) * beacon_interval
603         */
604         if (beacon_int) {
605                 do_div(tsf, beacon_int);
606                 tsf += 1;
607                 tsf *= beacon_int;
608         }
609
610         return tsf;
611 }
612
613 /*
614  * Description: Set NIC TSF counter for first Beacon time
615  *              Get NEXTTBTT from adjusted TSF and Beacon Interval
616  *
617  * Parameters:
618  *  In:
619  *      dwIoBase        - IO Base
620  *      beacon_interval - Beacon Interval
621  *  Out:
622  *      none
623  *
624  * Return Value: none
625  *
626  */
627 void vnt_reset_next_tbtt(struct vnt_private *priv, u16 beacon_interval)
628 {
629         u64 next_tbtt = 0;
630         u8 data[8];
631
632         vnt_clear_current_tsf(priv);
633
634         next_tbtt = vnt_get_next_tbtt(next_tbtt, beacon_interval);
635
636         data[0] = (u8)next_tbtt;
637         data[1] = (u8)(next_tbtt >> 8);
638         data[2] = (u8)(next_tbtt >> 16);
639         data[3] = (u8)(next_tbtt >> 24);
640         data[4] = (u8)(next_tbtt >> 32);
641         data[5] = (u8)(next_tbtt >> 40);
642         data[6] = (u8)(next_tbtt >> 48);
643         data[7] = (u8)(next_tbtt >> 56);
644
645         vnt_control_out(priv, MESSAGE_TYPE_SET_TSFTBTT,
646                 MESSAGE_REQUEST_TBTT, 0, 8, data);
647
648         return;
649 }
650
651 /*
652  * Description: Sync NIC TSF counter for Beacon time
653  *              Get NEXTTBTT and write to HW
654  *
655  * Parameters:
656  *  In:
657  *      priv            - The adapter to be set
658  *      tsf             - Current TSF counter
659  *      beacon_interval - Beacon Interval
660  *  Out:
661  *      none
662  *
663  * Return Value: none
664  *
665  */
666 void vnt_update_next_tbtt(struct vnt_private *priv, u64 tsf,
667                         u16 beacon_interval)
668 {
669         u8 data[8];
670
671         tsf = vnt_get_next_tbtt(tsf, beacon_interval);
672
673         data[0] = (u8)tsf;
674         data[1] = (u8)(tsf >> 8);
675         data[2] = (u8)(tsf >> 16);
676         data[3] = (u8)(tsf >> 24);
677         data[4] = (u8)(tsf >> 32);
678         data[5] = (u8)(tsf >> 40);
679         data[6] = (u8)(tsf >> 48);
680         data[7] = (u8)(tsf >> 56);
681
682         vnt_control_out(priv, MESSAGE_TYPE_SET_TSFTBTT,
683                 MESSAGE_REQUEST_TBTT, 0, 8, data);
684
685         dev_dbg(&priv->usb->dev, "%s TBTT: %8llx\n", __func__, tsf);
686
687         return;
688 }
689
690 /*
691  * Description: Turn off Radio power
692  *
693  * Parameters:
694  *  In:
695  *      priv         - The adapter to be turned off
696  *  Out:
697  *      none
698  *
699  * Return Value: true if success; otherwise false
700  *
701  */
702 int vnt_radio_power_off(struct vnt_private *priv)
703 {
704         int ret = true;
705
706         priv->bRadioOff = true;
707
708         switch (priv->byRFType) {
709         case RF_AL2230:
710         case RF_AL2230S:
711         case RF_AIROHA7230:
712         case RF_VT3226:
713         case RF_VT3226D0:
714         case RF_VT3342A0:
715                 vnt_mac_reg_bits_off(priv, MAC_REG_SOFTPWRCTL,
716                                 (SOFTPWRCTL_SWPE2 | SOFTPWRCTL_SWPE3));
717                 break;
718         }
719
720         vnt_mac_reg_bits_off(priv, MAC_REG_HOSTCR, HOSTCR_RXON);
721
722         BBvSetDeepSleep(priv);
723
724         return ret;
725 }
726
727 /*
728  * Description: Turn on Radio power
729  *
730  * Parameters:
731  *  In:
732  *      priv         - The adapter to be turned on
733  *  Out:
734  *      none
735  *
736  * Return Value: true if success; otherwise false
737  *
738  */
739 int vnt_radio_power_on(struct vnt_private *priv)
740 {
741         int ret = true;
742
743         if (priv->bHWRadioOff == true || priv->bRadioControlOff == true)
744                 return false;
745
746         priv->bRadioOff = false;
747
748         BBvExitDeepSleep(priv);
749
750         vnt_mac_reg_bits_on(priv, MAC_REG_HOSTCR, HOSTCR_RXON);
751
752         switch (priv->byRFType) {
753         case RF_AL2230:
754         case RF_AL2230S:
755         case RF_AIROHA7230:
756         case RF_VT3226:
757         case RF_VT3226D0:
758         case RF_VT3342A0:
759                 vnt_mac_reg_bits_on(priv, MAC_REG_SOFTPWRCTL,
760                         (SOFTPWRCTL_SWPE2 | SOFTPWRCTL_SWPE3));
761                 break;
762         }
763
764         return ret;
765 }
766
767 void vnt_set_bss_mode(struct vnt_private *priv)
768 {
769         if (priv->byRFType == RF_AIROHA7230 && priv->byBBType == BB_TYPE_11A)
770                 vnt_mac_set_bb_type(priv, BB_TYPE_11G);
771         else
772                 vnt_mac_set_bb_type(priv, priv->byBBType);
773
774         priv->byPacketType = vnt_get_pkt_type(priv);
775
776         if (priv->byBBType == BB_TYPE_11A)
777                 vnt_control_out_u8(priv, MESSAGE_REQUEST_BBREG, 0x88, 0x03);
778         else if (priv->byBBType == BB_TYPE_11B)
779                 vnt_control_out_u8(priv, MESSAGE_REQUEST_BBREG, 0x88, 0x02);
780         else if (priv->byBBType == BB_TYPE_11G)
781                 vnt_control_out_u8(priv, MESSAGE_REQUEST_BBREG, 0x88, 0x08);
782
783         vnt_update_ifs(priv);
784         vnt_set_rspinf(priv, (u8)priv->byBBType);
785
786         if (priv->byBBType == BB_TYPE_11A) {
787                 if (priv->byRFType == RF_AIROHA7230) {
788                         priv->abyBBVGA[0] = 0x20;
789
790                         vnt_control_out_u8(priv, MESSAGE_REQUEST_BBREG,
791                                                 0xe7, priv->abyBBVGA[0]);
792                 }
793
794                 priv->abyBBVGA[2] = 0x10;
795                 priv->abyBBVGA[3] = 0x10;
796         } else {
797                 if (priv->byRFType == RF_AIROHA7230) {
798                         priv->abyBBVGA[0] = 0x1c;
799
800                         vnt_control_out_u8(priv, MESSAGE_REQUEST_BBREG,
801                                                 0xe7, priv->abyBBVGA[0]);
802                 }
803
804                 priv->abyBBVGA[2] = 0x0;
805                 priv->abyBBVGA[3] = 0x0;
806         }
807
808         BBvSetVGAGainOffset(priv, priv->abyBBVGA[0]);
809 }