Add the rt linux 4.1.3-rt3 as base
[kvmfornfv.git] / kernel / drivers / staging / vt6656 / baseband.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  *
20  * File: baseband.c
21  *
22  * Purpose: Implement functions to access baseband
23  *
24  * Author: Jerry Chen
25  *
26  * Date: Jun. 5, 2002
27  *
28  * Functions:
29  *      vnt_get_frame_time      - Calculate data frame transmitting time
30  *      vnt_get_phy_field       - Calculate PhyLength, PhyService and Phy
31  *                                Signal parameter for baseband Tx
32  *      vnt_vt3184_init         - VIA VT3184 baseband chip init code
33  *
34  * Revision History:
35  *
36  *
37  */
38
39 #include "mac.h"
40 #include "baseband.h"
41 #include "rf.h"
42 #include "usbpipe.h"
43
44 static u8 vnt_vt3184_agc[] = {
45         0x00, 0x00, 0x02, 0x02, 0x04, 0x04, 0x06, 0x06,
46         0x08, 0x08, 0x0a, 0x0a, 0x0c, 0x0c, 0x0e, 0x0e, /* 0x0f */
47         0x10, 0x10, 0x12, 0x12, 0x14, 0x14, 0x16, 0x16,
48         0x18, 0x18, 0x1a, 0x1a, 0x1c, 0x1c, 0x1e, 0x1e, /* 0x1f */
49         0x20, 0x20, 0x22, 0x22, 0x24, 0x24, 0x26, 0x26,
50         0x28, 0x28, 0x2a, 0x2a, 0x2c, 0x2c, 0x2e, 0x2e, /* 0x2f */
51         0x30, 0x30, 0x32, 0x32, 0x34, 0x34, 0x36, 0x36,
52         0x38, 0x38, 0x3a, 0x3a, 0x3c, 0x3c, 0x3e, 0x3e  /* 0x3f */
53 };
54
55 static u8 vnt_vt3184_al2230[] = {
56         0x31, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00,
57         0x70, 0x45, 0x2a, 0x76, 0x00, 0x00, 0x80, 0x00, /* 0x0f */
58         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
59         0x00, 0x00, 0x00, 0x8e, 0x0a, 0x00, 0x00, 0x00, /* 0x1f */
60         0x00, 0x00, 0x00, 0x00, 0x00, 0x4a, 0x00, 0x00,
61         0x00, 0x00, 0x00, 0x00, 0x00, 0x4a, 0x00, 0x0c, /* 0x2f */
62         0x26, 0x5b, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa,
63         0xff, 0xff, 0x79, 0x00, 0x00, 0x0b, 0x48, 0x04, /* 0x3f */
64         0x00, 0x08, 0x00, 0x08, 0x08, 0x14, 0x05, 0x09,
65         0x00, 0x00, 0x00, 0x00, 0x09, 0x73, 0x00, 0xc5, /* 0x4f */
66         0x00, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
67         0x00, 0xd0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x5f */
68         0xe4, 0x80, 0x00, 0x00, 0x00, 0x00, 0x98, 0x0a,
69         0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x01, 0x00, /* 0x6f */
70         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
71         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x7f */
72         0x8c, 0x01, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00,
73         0x08, 0x00, 0x1f, 0xb7, 0x88, 0x47, 0xaa, 0x00, /* 0x8f */
74         0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xeb,
75         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, /* 0x9f */
76         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00,
77         0x18, 0x00, 0x00, 0x00, 0x00, 0x15, 0x00, 0x18, /* 0xaf */
78         0x38, 0x30, 0x00, 0x00, 0xff, 0x0f, 0xe4, 0xe2,
79         0x00, 0x00, 0x00, 0x03, 0x01, 0x00, 0x00, 0x00, /* 0xbf */
80         0x18, 0x20, 0x07, 0x18, 0xff, 0xff, 0x0e, 0x0a,
81         0x0e, 0x00, 0x82, 0xa7, 0x3c, 0x10, 0x30, 0x05, /* 0xcf */
82         0x40, 0x12, 0x00, 0x00, 0x10, 0x28, 0x80, 0x2a,
83         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xdf */
84         0x00, 0xf3, 0x00, 0x00, 0x00, 0x10, 0x00, 0x12,
85         0x00, 0xf4, 0x00, 0xff, 0x79, 0x20, 0x30, 0x05, /* 0xef */
86         0x00, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
87         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00  /* 0xff */
88 };
89
90 /* {{RobertYu:20060515, new BB setting for VT3226D0 */
91 static u8 vnt_vt3184_vt3226d0[] = {
92         0x31, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00,
93         0x70, 0x45, 0x2a, 0x76, 0x00, 0x00, 0x80, 0x00, /* 0x0f */
94         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
95         0x00, 0x00, 0x00, 0x8e, 0x0a, 0x00, 0x00, 0x00, /* 0x1f */
96         0x00, 0x00, 0x00, 0x00, 0x00, 0x4a, 0x00, 0x00,
97         0x00, 0x00, 0x00, 0x00, 0x00, 0x4a, 0x00, 0x0c, /* 0x2f */
98         0x26, 0x5b, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa,
99         0xff, 0xff, 0x79, 0x00, 0x00, 0x0b, 0x48, 0x04, /* 0x3f */
100         0x00, 0x08, 0x00, 0x08, 0x08, 0x14, 0x05, 0x09,
101         0x00, 0x00, 0x00, 0x00, 0x09, 0x73, 0x00, 0xc5, /* 0x4f */
102         0x00, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
103         0x00, 0xd0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x5f */
104         0xe4, 0x80, 0x00, 0x00, 0x00, 0x00, 0x98, 0x0a,
105         0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x01, 0x00, /* 0x6f */
106         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
107         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0x7f */
108         0x8c, 0x01, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00,
109         0x08, 0x00, 0x1f, 0xb7, 0x88, 0x47, 0xaa, 0x00, /* 0x8f */
110         0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xeb,
111         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, /* 0x9f */
112         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00,
113         0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, /* 0xaf */
114         0x38, 0x30, 0x00, 0x00, 0xff, 0x0f, 0xe4, 0xe2,
115         0x00, 0x00, 0x00, 0x03, 0x01, 0x00, 0x00, 0x00, /* 0xbf */
116         0x18, 0x20, 0x07, 0x18, 0xff, 0xff, 0x10, 0x0a,
117         0x0e, 0x00, 0x84, 0xa7, 0x3c, 0x10, 0x24, 0x05, /* 0xcf */
118         0x40, 0x12, 0x00, 0x00, 0x10, 0x28, 0x80, 0x2a,
119         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 0xdf */
120         0x00, 0xf3, 0x00, 0x00, 0x00, 0x10, 0x00, 0x10,
121         0x00, 0xf4, 0x00, 0xff, 0x79, 0x20, 0x30, 0x08, /* 0xef */
122         0x00, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
123         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00  /* 0xff */
124 };
125
126 static const u16 vnt_frame_time[MAX_RATE] = {
127         10, 20, 55, 110, 24, 36, 48, 72, 96, 144, 192, 216
128 };
129
130 /*
131  * Description: Calculate data frame transmitting time
132  *
133  * Parameters:
134  *  In:
135  *      preamble_type   - Preamble Type
136  *      pkt_type        - PK_TYPE_11A, PK_TYPE_11B, PK_TYPE_11GB, PK_TYPE_11GA
137  *      frame_length    - Baseband Type
138  *      tx_rate         - Tx Rate
139  *  Out:
140  *
141  * Return Value: FrameTime
142  *
143  */
144 unsigned int vnt_get_frame_time(u8 preamble_type, u8 pkt_type,
145         unsigned int frame_length, u16 tx_rate)
146 {
147         unsigned int frame_time;
148         unsigned int preamble;
149         unsigned int tmp;
150         unsigned int rate = 0;
151
152         if (tx_rate > RATE_54M)
153                 return 0;
154
155         rate = (unsigned int)vnt_frame_time[tx_rate];
156
157         if (tx_rate <= 3) {
158                 if (preamble_type == 1)
159                         preamble = 96;
160                 else
161                         preamble = 192;
162
163                 frame_time = (frame_length * 80) / rate;
164                 tmp = (frame_time * rate) / 80;
165
166                 if (frame_length != tmp)
167                         frame_time++;
168
169                 return preamble + frame_time;
170         }
171         frame_time = (frame_length * 8 + 22) / rate;
172         tmp = ((frame_time * rate) - 22) / 8;
173
174         if (frame_length != tmp)
175                 frame_time++;
176
177         frame_time = frame_time * 4;
178
179         if (pkt_type != PK_TYPE_11A)
180                 frame_time += 6;
181         return 20 + frame_time;
182 }
183
184 /*
185  * Description: Calculate Length, Service, and Signal fields of Phy for Tx
186  *
187  * Parameters:
188  *  In:
189  *      priv         - Device Structure
190  *      frame_length   - Tx Frame Length
191  *      tx_rate           - Tx Rate
192  *  Out:
193  *      struct vnt_phy_field *phy
194  *              - pointer to Phy Length field
195  *              - pointer to Phy Service field
196  *              - pointer to Phy Signal field
197  *
198  * Return Value: none
199  *
200  */
201 void vnt_get_phy_field(struct vnt_private *priv, u32 frame_length,
202         u16 tx_rate, u8 pkt_type, struct vnt_phy_field *phy)
203 {
204         u32 bit_count;
205         u32 count = 0;
206         u32 tmp;
207         int ext_bit;
208         u8 preamble_type = priv->preamble_type;
209
210         bit_count = frame_length * 8;
211         ext_bit = false;
212
213         switch (tx_rate) {
214         case RATE_1M:
215                 count = bit_count;
216
217                 phy->signal = 0x00;
218
219                 break;
220         case RATE_2M:
221                 count = bit_count / 2;
222
223                 if (preamble_type == 1)
224                         phy->signal = 0x09;
225                 else
226                         phy->signal = 0x01;
227
228                 break;
229         case RATE_5M:
230                 count = (bit_count * 10) / 55;
231                 tmp = (count * 55) / 10;
232
233                 if (tmp != bit_count)
234                         count++;
235
236                 if (preamble_type == 1)
237                         phy->signal = 0x0a;
238                 else
239                         phy->signal = 0x02;
240
241                 break;
242         case RATE_11M:
243                 count = bit_count / 11;
244                 tmp = count * 11;
245
246                 if (tmp != bit_count) {
247                         count++;
248
249                         if ((bit_count - tmp) <= 3)
250                                 ext_bit = true;
251                 }
252
253                 if (preamble_type == 1)
254                         phy->signal = 0x0b;
255                 else
256                         phy->signal = 0x03;
257
258                 break;
259         case RATE_6M:
260                 if (pkt_type == PK_TYPE_11A)
261                         phy->signal = 0x9b;
262                 else
263                         phy->signal = 0x8b;
264
265                 break;
266         case RATE_9M:
267                 if (pkt_type == PK_TYPE_11A)
268                         phy->signal = 0x9f;
269                 else
270                         phy->signal = 0x8f;
271
272                 break;
273         case RATE_12M:
274                 if (pkt_type == PK_TYPE_11A)
275                         phy->signal = 0x9a;
276                 else
277                         phy->signal = 0x8a;
278
279                 break;
280         case RATE_18M:
281                 if (pkt_type == PK_TYPE_11A)
282                         phy->signal = 0x9e;
283                 else
284                         phy->signal = 0x8e;
285
286                 break;
287         case RATE_24M:
288                 if (pkt_type == PK_TYPE_11A)
289                         phy->signal = 0x99;
290                 else
291                         phy->signal = 0x89;
292
293                 break;
294         case RATE_36M:
295                 if (pkt_type == PK_TYPE_11A)
296                         phy->signal = 0x9d;
297                 else
298                         phy->signal = 0x8d;
299
300                 break;
301         case RATE_48M:
302                 if (pkt_type == PK_TYPE_11A)
303                         phy->signal = 0x98;
304                 else
305                         phy->signal = 0x88;
306
307                 break;
308         case RATE_54M:
309                 if (pkt_type == PK_TYPE_11A)
310                         phy->signal = 0x9c;
311                 else
312                         phy->signal = 0x8c;
313                 break;
314         default:
315                 if (pkt_type == PK_TYPE_11A)
316                         phy->signal = 0x9c;
317                 else
318                         phy->signal = 0x8c;
319                 break;
320         }
321
322         if (pkt_type == PK_TYPE_11B) {
323                 phy->service = 0x00;
324                 if (ext_bit)
325                         phy->service |= 0x80;
326                 phy->len = cpu_to_le16((u16)count);
327         } else {
328                 phy->service = 0x00;
329                 phy->len = cpu_to_le16((u16)frame_length);
330         }
331 }
332
333 /*
334  * Description: Set Antenna mode
335  *
336  * Parameters:
337  *  In:
338  *      priv            - Device Structure
339  *      antenna_mode    - Antenna Mode
340  *  Out:
341  *      none
342  *
343  * Return Value: none
344  *
345  */
346 void vnt_set_antenna_mode(struct vnt_private *priv, u8 antenna_mode)
347 {
348         switch (antenna_mode) {
349         case ANT_TXA:
350         case ANT_TXB:
351                 break;
352         case ANT_RXA:
353                 priv->bb_rx_conf &= 0xFC;
354                 break;
355         case ANT_RXB:
356                 priv->bb_rx_conf &= 0xFE;
357                 priv->bb_rx_conf |= 0x02;
358                 break;
359         }
360
361         vnt_control_out(priv, MESSAGE_TYPE_SET_ANTMD,
362                 (u16)antenna_mode, 0, 0, NULL);
363 }
364
365 /*
366  * Description: Set Antenna mode
367  *
368  * Parameters:
369  *  In:
370  *      pDevice          - Device Structure
371  *      byAntennaMode    - Antenna Mode
372  *  Out:
373  *      none
374  *
375  * Return Value: none
376  *
377  */
378
379 int vnt_vt3184_init(struct vnt_private *priv)
380 {
381         int status;
382         u16 length;
383         u8 *addr;
384         u8 *agc;
385         u16 length_agc;
386         u8 array[256];
387         u8 data;
388
389         status = vnt_control_in(priv, MESSAGE_TYPE_READ, 0,
390                 MESSAGE_REQUEST_EEPROM, EEP_MAX_CONTEXT_SIZE,
391                                                 priv->eeprom);
392         if (status != STATUS_SUCCESS)
393                 return false;
394
395         priv->rf_type = priv->eeprom[EEP_OFS_RFTYPE];
396
397         dev_dbg(&priv->usb->dev, "RF Type %d\n", priv->rf_type);
398
399         if ((priv->rf_type == RF_AL2230) ||
400                                 (priv->rf_type == RF_AL2230S)) {
401                 priv->bb_rx_conf = vnt_vt3184_al2230[10];
402                 length = sizeof(vnt_vt3184_al2230);
403                 addr = vnt_vt3184_al2230;
404                 agc = vnt_vt3184_agc;
405                 length_agc = sizeof(vnt_vt3184_agc);
406
407                 priv->bb_vga[0] = 0x1C;
408                 priv->bb_vga[1] = 0x10;
409                 priv->bb_vga[2] = 0x0;
410                 priv->bb_vga[3] = 0x0;
411
412         } else if (priv->rf_type == RF_AIROHA7230) {
413                 priv->bb_rx_conf = vnt_vt3184_al2230[10];
414                 length = sizeof(vnt_vt3184_al2230);
415                 addr = vnt_vt3184_al2230;
416                 agc = vnt_vt3184_agc;
417                 length_agc = sizeof(vnt_vt3184_agc);
418
419                 addr[0xd7] = 0x06;
420
421                 priv->bb_vga[0] = 0x1c;
422                 priv->bb_vga[1] = 0x10;
423                 priv->bb_vga[2] = 0x0;
424                 priv->bb_vga[3] = 0x0;
425
426         } else if ((priv->rf_type == RF_VT3226) ||
427                         (priv->rf_type == RF_VT3226D0)) {
428                 priv->bb_rx_conf = vnt_vt3184_vt3226d0[10];
429                 length = sizeof(vnt_vt3184_vt3226d0);
430                 addr = vnt_vt3184_vt3226d0;
431                 agc = vnt_vt3184_agc;
432                 length_agc = sizeof(vnt_vt3184_agc);
433
434                 priv->bb_vga[0] = 0x20;
435                 priv->bb_vga[1] = 0x10;
436                 priv->bb_vga[2] = 0x0;
437                 priv->bb_vga[3] = 0x0;
438
439                 /* Fix VT3226 DFC system timing issue */
440                 vnt_mac_reg_bits_on(priv, MAC_REG_SOFTPWRCTL2,
441                                     SOFTPWRCTL_RFLEOPT);
442         } else if (priv->rf_type == RF_VT3342A0) {
443                 priv->bb_rx_conf = vnt_vt3184_vt3226d0[10];
444                 length = sizeof(vnt_vt3184_vt3226d0);
445                 addr = vnt_vt3184_vt3226d0;
446                 agc = vnt_vt3184_agc;
447                 length_agc = sizeof(vnt_vt3184_agc);
448
449                 priv->bb_vga[0] = 0x20;
450                 priv->bb_vga[1] = 0x10;
451                 priv->bb_vga[2] = 0x0;
452                 priv->bb_vga[3] = 0x0;
453
454                 /* Fix VT3226 DFC system timing issue */
455                 vnt_mac_reg_bits_on(priv, MAC_REG_SOFTPWRCTL2,
456                                     SOFTPWRCTL_RFLEOPT);
457         } else {
458                 return true;
459         }
460
461         memcpy(array, addr, length);
462
463         vnt_control_out(priv, MESSAGE_TYPE_WRITE, 0,
464                 MESSAGE_REQUEST_BBREG, length, array);
465
466         memcpy(array, agc, length_agc);
467
468         vnt_control_out(priv, MESSAGE_TYPE_WRITE, 0,
469                 MESSAGE_REQUEST_BBAGC, length_agc, array);
470
471         if ((priv->rf_type == RF_VT3226) ||
472                 (priv->rf_type == RF_VT3342A0)) {
473                 vnt_control_out_u8(priv, MESSAGE_REQUEST_MACREG,
474                                                 MAC_REG_ITRTMSET, 0x23);
475                 vnt_mac_reg_bits_on(priv, MAC_REG_PAPEDELAY, 0x01);
476         } else if (priv->rf_type == RF_VT3226D0) {
477                 vnt_control_out_u8(priv, MESSAGE_REQUEST_MACREG,
478                                                 MAC_REG_ITRTMSET, 0x11);
479                 vnt_mac_reg_bits_on(priv, MAC_REG_PAPEDELAY, 0x01);
480         }
481
482         vnt_control_out_u8(priv, MESSAGE_REQUEST_BBREG, 0x04, 0x7f);
483         vnt_control_out_u8(priv, MESSAGE_REQUEST_BBREG, 0x0d, 0x01);
484
485         vnt_rf_table_download(priv);
486
487         /* Fix for TX USB resets from vendors driver */
488         vnt_control_in(priv, MESSAGE_TYPE_READ, USB_REG4,
489                 MESSAGE_REQUEST_MEM, sizeof(data), &data);
490
491         data |= 0x2;
492
493         vnt_control_out(priv, MESSAGE_TYPE_WRITE, USB_REG4,
494                 MESSAGE_REQUEST_MEM, sizeof(data), &data);
495
496         return true;
497 }
498
499 /*
500  * Description: Set ShortSlotTime mode
501  *
502  * Parameters:
503  *  In:
504  *      priv    - Device Structure
505  *  Out:
506  *      none
507  *
508  * Return Value: none
509  *
510  */
511 void vnt_set_short_slot_time(struct vnt_private *priv)
512 {
513         u8 bb_vga = 0;
514
515         if (priv->short_slot_time)
516                 priv->bb_rx_conf &= 0xdf;
517         else
518                 priv->bb_rx_conf |= 0x20;
519
520         vnt_control_in_u8(priv, MESSAGE_REQUEST_BBREG, 0xe7, &bb_vga);
521
522         if (bb_vga == priv->bb_vga[0])
523                 priv->bb_rx_conf |= 0x20;
524
525         vnt_control_out_u8(priv, MESSAGE_REQUEST_BBREG, 0x0a, priv->bb_rx_conf);
526 }
527
528 void vnt_set_vga_gain_offset(struct vnt_private *priv, u8 data)
529 {
530
531         vnt_control_out_u8(priv, MESSAGE_REQUEST_BBREG, 0xE7, data);
532
533         /* patch for 3253B0 Baseband with Cardbus module */
534         if (priv->short_slot_time)
535                 priv->bb_rx_conf &= 0xdf; /* 1101 1111 */
536         else
537                 priv->bb_rx_conf |= 0x20; /* 0010 0000 */
538
539         vnt_control_out_u8(priv, MESSAGE_REQUEST_BBREG, 0x0a, priv->bb_rx_conf);
540 }
541
542 /*
543  * Description: vnt_set_deep_sleep
544  *
545  * Parameters:
546  *  In:
547  *      priv    - Device Structure
548  *  Out:
549  *      none
550  *
551  * Return Value: none
552  *
553  */
554 void vnt_set_deep_sleep(struct vnt_private *priv)
555 {
556         vnt_control_out_u8(priv, MESSAGE_REQUEST_BBREG, 0x0c, 0x17);/* CR12 */
557         vnt_control_out_u8(priv, MESSAGE_REQUEST_BBREG, 0x0d, 0xB9);/* CR13 */
558 }
559
560 void vnt_exit_deep_sleep(struct vnt_private *priv)
561 {
562         vnt_control_out_u8(priv, MESSAGE_REQUEST_BBREG, 0x0c, 0x00);/* CR12 */
563         vnt_control_out_u8(priv, MESSAGE_REQUEST_BBREG, 0x0d, 0x01);/* CR13 */
564 }
565
566 void vnt_update_pre_ed_threshold(struct vnt_private *priv, int scanning)
567 {
568         u8 cr_201 = 0x0, cr_206 = 0x0;
569         u8 ed_inx = priv->bb_pre_ed_index;
570
571         switch (priv->rf_type) {
572         case RF_AL2230:
573         case RF_AL2230S:
574         case RF_AIROHA7230:
575                 if (scanning) { /* Max sensitivity */
576                         ed_inx = 0;
577                         cr_206 = 0x30;
578                         break;
579                 }
580
581                 if (priv->bb_pre_ed_rssi <= 45) {
582                         ed_inx = 20;
583                         cr_201 = 0xff;
584                 } else if (priv->bb_pre_ed_rssi <= 46) {
585                         ed_inx = 19;
586                         cr_201 = 0x1a;
587                 } else if (priv->bb_pre_ed_rssi <= 47) {
588                         ed_inx = 18;
589                         cr_201 = 0x15;
590                 } else if (priv->bb_pre_ed_rssi <= 49) {
591                         ed_inx = 17;
592                         cr_201 = 0xe;
593                 } else if (priv->bb_pre_ed_rssi <= 51) {
594                         ed_inx = 16;
595                         cr_201 = 0x9;
596                 } else if (priv->bb_pre_ed_rssi <= 53) {
597                         ed_inx = 15;
598                         cr_201 = 0x6;
599                 } else if (priv->bb_pre_ed_rssi <= 55) {
600                         ed_inx = 14;
601                         cr_201 = 0x3;
602                 } else if (priv->bb_pre_ed_rssi <= 56) {
603                         ed_inx = 13;
604                         cr_201 = 0x2;
605                         cr_206 = 0xa0;
606                 } else if (priv->bb_pre_ed_rssi <= 57) {
607                         ed_inx = 12;
608                         cr_201 = 0x2;
609                         cr_206 = 0x20;
610                 } else if (priv->bb_pre_ed_rssi <= 58) {
611                         ed_inx = 11;
612                         cr_201 = 0x1;
613                         cr_206 = 0xa0;
614                 } else if (priv->bb_pre_ed_rssi <= 59) {
615                         ed_inx = 10;
616                         cr_201 = 0x1;
617                         cr_206 = 0x54;
618                 } else if (priv->bb_pre_ed_rssi <= 60) {
619                         ed_inx = 9;
620                         cr_201 = 0x1;
621                         cr_206 = 0x18;
622                 } else if (priv->bb_pre_ed_rssi <= 61) {
623                         ed_inx = 8;
624                         cr_206 = 0xe3;
625                 } else if (priv->bb_pre_ed_rssi <= 62) {
626                         ed_inx = 7;
627                         cr_206 = 0xb9;
628                 } else if (priv->bb_pre_ed_rssi <= 63) {
629                         ed_inx = 6;
630                         cr_206 = 0x93;
631                 } else if (priv->bb_pre_ed_rssi <= 64) {
632                         ed_inx = 5;
633                         cr_206 = 0x79;
634                 } else if (priv->bb_pre_ed_rssi <= 65) {
635                         ed_inx = 4;
636                         cr_206 = 0x62;
637                 } else if (priv->bb_pre_ed_rssi <= 66) {
638                         ed_inx = 3;
639                         cr_206 = 0x51;
640                 } else if (priv->bb_pre_ed_rssi <= 67) {
641                         ed_inx = 2;
642                         cr_206 = 0x43;
643                 } else if (priv->bb_pre_ed_rssi <= 68) {
644                         ed_inx = 1;
645                         cr_206 = 0x36;
646                 } else {
647                         ed_inx = 0;
648                         cr_206 = 0x30;
649                 }
650                 break;
651
652         case RF_VT3226:
653         case RF_VT3226D0:
654                 if (scanning)   { /* Max sensitivity */
655                         ed_inx = 0;
656                         cr_206 = 0x24;
657                         break;
658                 }
659
660                 if (priv->bb_pre_ed_rssi <= 41) {
661                         ed_inx = 22;
662                         cr_201 = 0xff;
663                 } else if (priv->bb_pre_ed_rssi <= 42) {
664                         ed_inx = 21;
665                         cr_201 = 0x36;
666                 } else if (priv->bb_pre_ed_rssi <= 43) {
667                         ed_inx = 20;
668                         cr_201 = 0x26;
669                 } else if (priv->bb_pre_ed_rssi <= 45) {
670                         ed_inx = 19;
671                         cr_201 = 0x18;
672                 } else if (priv->bb_pre_ed_rssi <= 47) {
673                         ed_inx = 18;
674                         cr_201 = 0x11;
675                 } else if (priv->bb_pre_ed_rssi <= 49) {
676                         ed_inx = 17;
677                         cr_201 = 0xa;
678                 } else if (priv->bb_pre_ed_rssi <= 51) {
679                         ed_inx = 16;
680                         cr_201 = 0x7;
681                 } else if (priv->bb_pre_ed_rssi <= 53) {
682                         ed_inx = 15;
683                         cr_201 = 0x4;
684                 } else if (priv->bb_pre_ed_rssi <= 55) {
685                         ed_inx = 14;
686                         cr_201 = 0x2;
687                         cr_206 = 0xc0;
688                 } else if (priv->bb_pre_ed_rssi <= 56) {
689                         ed_inx = 13;
690                         cr_201 = 0x2;
691                         cr_206 = 0x30;
692                 } else if (priv->bb_pre_ed_rssi <= 57) {
693                         ed_inx = 12;
694                         cr_201 = 0x1;
695                         cr_206 = 0xb0;
696                 } else if (priv->bb_pre_ed_rssi <= 58) {
697                         ed_inx = 11;
698                         cr_201 = 0x1;
699                         cr_206 = 0x70;
700                 } else if (priv->bb_pre_ed_rssi <= 59) {
701                         ed_inx = 10;
702                         cr_201 = 0x1;
703                         cr_206 = 0x30;
704                 } else if (priv->bb_pre_ed_rssi <= 60) {
705                         ed_inx = 9;
706                         cr_206 = 0xea;
707                 } else if (priv->bb_pre_ed_rssi <= 61) {
708                         ed_inx = 8;
709                         cr_206 = 0xc0;
710                 } else if (priv->bb_pre_ed_rssi <= 62) {
711                         ed_inx = 7;
712                         cr_206 = 0x9c;
713                 } else if (priv->bb_pre_ed_rssi <= 63) {
714                         ed_inx = 6;
715                         cr_206 = 0x80;
716                 } else if (priv->bb_pre_ed_rssi <= 64) {
717                         ed_inx = 5;
718                         cr_206 = 0x68;
719                 } else if (priv->bb_pre_ed_rssi <= 65) {
720                         ed_inx = 4;
721                         cr_206 = 0x52;
722                 } else if (priv->bb_pre_ed_rssi <= 66) {
723                         ed_inx = 3;
724                         cr_206 = 0x43;
725                 } else if (priv->bb_pre_ed_rssi <= 67) {
726                         ed_inx = 2;
727                         cr_206 = 0x36;
728                 } else if (priv->bb_pre_ed_rssi <= 68) {
729                         ed_inx = 1;
730                         cr_206 = 0x2d;
731                 } else {
732                         ed_inx = 0;
733                         cr_206 = 0x24;
734                 }
735                 break;
736
737         case RF_VT3342A0:
738                 if (scanning) { /* need Max sensitivity */
739                         ed_inx = 0;
740                         cr_206 = 0x38;
741                         break;
742                 }
743
744                 if (priv->bb_pre_ed_rssi <= 41) {
745                         ed_inx = 20;
746                         cr_201 = 0xff;
747                 } else if (priv->bb_pre_ed_rssi <= 42) {
748                         ed_inx = 19;
749                         cr_201 = 0x36;
750                 } else if (priv->bb_pre_ed_rssi <= 43) {
751                         ed_inx = 18;
752                         cr_201 = 0x26;
753                 } else if (priv->bb_pre_ed_rssi <= 45) {
754                         ed_inx = 17;
755                         cr_201 = 0x18;
756                 } else if (priv->bb_pre_ed_rssi <= 47) {
757                         ed_inx = 16;
758                         cr_201 = 0x11;
759                 } else if (priv->bb_pre_ed_rssi <= 49) {
760                         ed_inx = 15;
761                         cr_201 = 0xa;
762                 } else if (priv->bb_pre_ed_rssi <= 51) {
763                         ed_inx = 14;
764                         cr_201 = 0x7;
765                 } else if (priv->bb_pre_ed_rssi <= 53) {
766                         ed_inx = 13;
767                         cr_201 = 0x4;
768                 } else if (priv->bb_pre_ed_rssi <= 55) {
769                         ed_inx = 12;
770                         cr_201 = 0x2;
771                         cr_206 = 0xc0;
772                 } else if (priv->bb_pre_ed_rssi <= 56) {
773                         ed_inx = 11;
774                         cr_201 = 0x2;
775                         cr_206 = 0x30;
776                 } else if (priv->bb_pre_ed_rssi <= 57) {
777                         ed_inx = 10;
778                         cr_201 = 0x1;
779                         cr_206 = 0xb0;
780                 } else if (priv->bb_pre_ed_rssi <= 58) {
781                         ed_inx = 9;
782                         cr_201 = 0x1;
783                         cr_206 = 0x70;
784                 } else if (priv->bb_pre_ed_rssi <= 59) {
785                         ed_inx = 8;
786                         cr_201 = 0x1;
787                         cr_206 = 0x30;
788                 } else if (priv->bb_pre_ed_rssi <= 60) {
789                         ed_inx = 7;
790                         cr_206 = 0xea;
791                 } else if (priv->bb_pre_ed_rssi <= 61) {
792                         ed_inx = 6;
793                         cr_206 = 0xc0;
794                 } else if (priv->bb_pre_ed_rssi <= 62) {
795                         ed_inx = 5;
796                         cr_206 = 0x9c;
797                 } else if (priv->bb_pre_ed_rssi <= 63) {
798                         ed_inx = 4;
799                         cr_206 = 0x80;
800                 } else if (priv->bb_pre_ed_rssi <= 64) {
801                         ed_inx = 3;
802                         cr_206 = 0x68;
803                 } else if (priv->bb_pre_ed_rssi <= 65) {
804                         ed_inx = 2;
805                         cr_206 = 0x52;
806                 } else if (priv->bb_pre_ed_rssi <= 66) {
807                         ed_inx = 1;
808                         cr_206 = 0x43;
809                 } else {
810                         ed_inx = 0;
811                         cr_206 = 0x38;
812                 }
813                 break;
814
815         }
816
817         if (ed_inx == priv->bb_pre_ed_index && !scanning)
818                 return;
819
820         priv->bb_pre_ed_index = ed_inx;
821
822         dev_dbg(&priv->usb->dev, "%s bb_pre_ed_rssi %d\n",
823                                         __func__, priv->bb_pre_ed_rssi);
824
825         if (!cr_201 && !cr_206)
826                 return;
827
828         vnt_control_out_u8(priv, MESSAGE_REQUEST_BBREG, 0xc9, cr_201);
829         vnt_control_out_u8(priv, MESSAGE_REQUEST_BBREG, 0xce, cr_206);
830 }
831