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