These changes are the raw update to linux-4.4.6-rt14. Kernel sources
[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         vnt_control_out_u8(priv, MESSAGE_REQUEST_BBREG, 0xE7, data);
531
532         /* patch for 3253B0 Baseband with Cardbus module */
533         if (priv->short_slot_time)
534                 priv->bb_rx_conf &= 0xdf; /* 1101 1111 */
535         else
536                 priv->bb_rx_conf |= 0x20; /* 0010 0000 */
537
538         vnt_control_out_u8(priv, MESSAGE_REQUEST_BBREG, 0x0a, priv->bb_rx_conf);
539 }
540
541 /*
542  * Description: vnt_set_deep_sleep
543  *
544  * Parameters:
545  *  In:
546  *      priv    - Device Structure
547  *  Out:
548  *      none
549  *
550  * Return Value: none
551  *
552  */
553 void vnt_set_deep_sleep(struct vnt_private *priv)
554 {
555         vnt_control_out_u8(priv, MESSAGE_REQUEST_BBREG, 0x0c, 0x17);/* CR12 */
556         vnt_control_out_u8(priv, MESSAGE_REQUEST_BBREG, 0x0d, 0xB9);/* CR13 */
557 }
558
559 void vnt_exit_deep_sleep(struct vnt_private *priv)
560 {
561         vnt_control_out_u8(priv, MESSAGE_REQUEST_BBREG, 0x0c, 0x00);/* CR12 */
562         vnt_control_out_u8(priv, MESSAGE_REQUEST_BBREG, 0x0d, 0x01);/* CR13 */
563 }
564
565 void vnt_update_pre_ed_threshold(struct vnt_private *priv, int scanning)
566 {
567         u8 cr_201 = 0x0, cr_206 = 0x0;
568         u8 ed_inx = priv->bb_pre_ed_index;
569
570         switch (priv->rf_type) {
571         case RF_AL2230:
572         case RF_AL2230S:
573         case RF_AIROHA7230:
574                 if (scanning) { /* Max sensitivity */
575                         ed_inx = 0;
576                         cr_206 = 0x30;
577                         break;
578                 }
579
580                 if (priv->bb_pre_ed_rssi <= 45) {
581                         ed_inx = 20;
582                         cr_201 = 0xff;
583                 } else if (priv->bb_pre_ed_rssi <= 46) {
584                         ed_inx = 19;
585                         cr_201 = 0x1a;
586                 } else if (priv->bb_pre_ed_rssi <= 47) {
587                         ed_inx = 18;
588                         cr_201 = 0x15;
589                 } else if (priv->bb_pre_ed_rssi <= 49) {
590                         ed_inx = 17;
591                         cr_201 = 0xe;
592                 } else if (priv->bb_pre_ed_rssi <= 51) {
593                         ed_inx = 16;
594                         cr_201 = 0x9;
595                 } else if (priv->bb_pre_ed_rssi <= 53) {
596                         ed_inx = 15;
597                         cr_201 = 0x6;
598                 } else if (priv->bb_pre_ed_rssi <= 55) {
599                         ed_inx = 14;
600                         cr_201 = 0x3;
601                 } else if (priv->bb_pre_ed_rssi <= 56) {
602                         ed_inx = 13;
603                         cr_201 = 0x2;
604                         cr_206 = 0xa0;
605                 } else if (priv->bb_pre_ed_rssi <= 57) {
606                         ed_inx = 12;
607                         cr_201 = 0x2;
608                         cr_206 = 0x20;
609                 } else if (priv->bb_pre_ed_rssi <= 58) {
610                         ed_inx = 11;
611                         cr_201 = 0x1;
612                         cr_206 = 0xa0;
613                 } else if (priv->bb_pre_ed_rssi <= 59) {
614                         ed_inx = 10;
615                         cr_201 = 0x1;
616                         cr_206 = 0x54;
617                 } else if (priv->bb_pre_ed_rssi <= 60) {
618                         ed_inx = 9;
619                         cr_201 = 0x1;
620                         cr_206 = 0x18;
621                 } else if (priv->bb_pre_ed_rssi <= 61) {
622                         ed_inx = 8;
623                         cr_206 = 0xe3;
624                 } else if (priv->bb_pre_ed_rssi <= 62) {
625                         ed_inx = 7;
626                         cr_206 = 0xb9;
627                 } else if (priv->bb_pre_ed_rssi <= 63) {
628                         ed_inx = 6;
629                         cr_206 = 0x93;
630                 } else if (priv->bb_pre_ed_rssi <= 64) {
631                         ed_inx = 5;
632                         cr_206 = 0x79;
633                 } else if (priv->bb_pre_ed_rssi <= 65) {
634                         ed_inx = 4;
635                         cr_206 = 0x62;
636                 } else if (priv->bb_pre_ed_rssi <= 66) {
637                         ed_inx = 3;
638                         cr_206 = 0x51;
639                 } else if (priv->bb_pre_ed_rssi <= 67) {
640                         ed_inx = 2;
641                         cr_206 = 0x43;
642                 } else if (priv->bb_pre_ed_rssi <= 68) {
643                         ed_inx = 1;
644                         cr_206 = 0x36;
645                 } else {
646                         ed_inx = 0;
647                         cr_206 = 0x30;
648                 }
649                 break;
650
651         case RF_VT3226:
652         case RF_VT3226D0:
653                 if (scanning)   { /* Max sensitivity */
654                         ed_inx = 0;
655                         cr_206 = 0x24;
656                         break;
657                 }
658
659                 if (priv->bb_pre_ed_rssi <= 41) {
660                         ed_inx = 22;
661                         cr_201 = 0xff;
662                 } else if (priv->bb_pre_ed_rssi <= 42) {
663                         ed_inx = 21;
664                         cr_201 = 0x36;
665                 } else if (priv->bb_pre_ed_rssi <= 43) {
666                         ed_inx = 20;
667                         cr_201 = 0x26;
668                 } else if (priv->bb_pre_ed_rssi <= 45) {
669                         ed_inx = 19;
670                         cr_201 = 0x18;
671                 } else if (priv->bb_pre_ed_rssi <= 47) {
672                         ed_inx = 18;
673                         cr_201 = 0x11;
674                 } else if (priv->bb_pre_ed_rssi <= 49) {
675                         ed_inx = 17;
676                         cr_201 = 0xa;
677                 } else if (priv->bb_pre_ed_rssi <= 51) {
678                         ed_inx = 16;
679                         cr_201 = 0x7;
680                 } else if (priv->bb_pre_ed_rssi <= 53) {
681                         ed_inx = 15;
682                         cr_201 = 0x4;
683                 } else if (priv->bb_pre_ed_rssi <= 55) {
684                         ed_inx = 14;
685                         cr_201 = 0x2;
686                         cr_206 = 0xc0;
687                 } else if (priv->bb_pre_ed_rssi <= 56) {
688                         ed_inx = 13;
689                         cr_201 = 0x2;
690                         cr_206 = 0x30;
691                 } else if (priv->bb_pre_ed_rssi <= 57) {
692                         ed_inx = 12;
693                         cr_201 = 0x1;
694                         cr_206 = 0xb0;
695                 } else if (priv->bb_pre_ed_rssi <= 58) {
696                         ed_inx = 11;
697                         cr_201 = 0x1;
698                         cr_206 = 0x70;
699                 } else if (priv->bb_pre_ed_rssi <= 59) {
700                         ed_inx = 10;
701                         cr_201 = 0x1;
702                         cr_206 = 0x30;
703                 } else if (priv->bb_pre_ed_rssi <= 60) {
704                         ed_inx = 9;
705                         cr_206 = 0xea;
706                 } else if (priv->bb_pre_ed_rssi <= 61) {
707                         ed_inx = 8;
708                         cr_206 = 0xc0;
709                 } else if (priv->bb_pre_ed_rssi <= 62) {
710                         ed_inx = 7;
711                         cr_206 = 0x9c;
712                 } else if (priv->bb_pre_ed_rssi <= 63) {
713                         ed_inx = 6;
714                         cr_206 = 0x80;
715                 } else if (priv->bb_pre_ed_rssi <= 64) {
716                         ed_inx = 5;
717                         cr_206 = 0x68;
718                 } else if (priv->bb_pre_ed_rssi <= 65) {
719                         ed_inx = 4;
720                         cr_206 = 0x52;
721                 } else if (priv->bb_pre_ed_rssi <= 66) {
722                         ed_inx = 3;
723                         cr_206 = 0x43;
724                 } else if (priv->bb_pre_ed_rssi <= 67) {
725                         ed_inx = 2;
726                         cr_206 = 0x36;
727                 } else if (priv->bb_pre_ed_rssi <= 68) {
728                         ed_inx = 1;
729                         cr_206 = 0x2d;
730                 } else {
731                         ed_inx = 0;
732                         cr_206 = 0x24;
733                 }
734                 break;
735
736         case RF_VT3342A0:
737                 if (scanning) { /* need Max sensitivity */
738                         ed_inx = 0;
739                         cr_206 = 0x38;
740                         break;
741                 }
742
743                 if (priv->bb_pre_ed_rssi <= 41) {
744                         ed_inx = 20;
745                         cr_201 = 0xff;
746                 } else if (priv->bb_pre_ed_rssi <= 42) {
747                         ed_inx = 19;
748                         cr_201 = 0x36;
749                 } else if (priv->bb_pre_ed_rssi <= 43) {
750                         ed_inx = 18;
751                         cr_201 = 0x26;
752                 } else if (priv->bb_pre_ed_rssi <= 45) {
753                         ed_inx = 17;
754                         cr_201 = 0x18;
755                 } else if (priv->bb_pre_ed_rssi <= 47) {
756                         ed_inx = 16;
757                         cr_201 = 0x11;
758                 } else if (priv->bb_pre_ed_rssi <= 49) {
759                         ed_inx = 15;
760                         cr_201 = 0xa;
761                 } else if (priv->bb_pre_ed_rssi <= 51) {
762                         ed_inx = 14;
763                         cr_201 = 0x7;
764                 } else if (priv->bb_pre_ed_rssi <= 53) {
765                         ed_inx = 13;
766                         cr_201 = 0x4;
767                 } else if (priv->bb_pre_ed_rssi <= 55) {
768                         ed_inx = 12;
769                         cr_201 = 0x2;
770                         cr_206 = 0xc0;
771                 } else if (priv->bb_pre_ed_rssi <= 56) {
772                         ed_inx = 11;
773                         cr_201 = 0x2;
774                         cr_206 = 0x30;
775                 } else if (priv->bb_pre_ed_rssi <= 57) {
776                         ed_inx = 10;
777                         cr_201 = 0x1;
778                         cr_206 = 0xb0;
779                 } else if (priv->bb_pre_ed_rssi <= 58) {
780                         ed_inx = 9;
781                         cr_201 = 0x1;
782                         cr_206 = 0x70;
783                 } else if (priv->bb_pre_ed_rssi <= 59) {
784                         ed_inx = 8;
785                         cr_201 = 0x1;
786                         cr_206 = 0x30;
787                 } else if (priv->bb_pre_ed_rssi <= 60) {
788                         ed_inx = 7;
789                         cr_206 = 0xea;
790                 } else if (priv->bb_pre_ed_rssi <= 61) {
791                         ed_inx = 6;
792                         cr_206 = 0xc0;
793                 } else if (priv->bb_pre_ed_rssi <= 62) {
794                         ed_inx = 5;
795                         cr_206 = 0x9c;
796                 } else if (priv->bb_pre_ed_rssi <= 63) {
797                         ed_inx = 4;
798                         cr_206 = 0x80;
799                 } else if (priv->bb_pre_ed_rssi <= 64) {
800                         ed_inx = 3;
801                         cr_206 = 0x68;
802                 } else if (priv->bb_pre_ed_rssi <= 65) {
803                         ed_inx = 2;
804                         cr_206 = 0x52;
805                 } else if (priv->bb_pre_ed_rssi <= 66) {
806                         ed_inx = 1;
807                         cr_206 = 0x43;
808                 } else {
809                         ed_inx = 0;
810                         cr_206 = 0x38;
811                 }
812                 break;
813         }
814
815         if (ed_inx == priv->bb_pre_ed_index && !scanning)
816                 return;
817
818         priv->bb_pre_ed_index = ed_inx;
819
820         dev_dbg(&priv->usb->dev, "%s bb_pre_ed_rssi %d\n",
821                                         __func__, priv->bb_pre_ed_rssi);
822
823         if (!cr_201 && !cr_206)
824                 return;
825
826         vnt_control_out_u8(priv, MESSAGE_REQUEST_BBREG, 0xc9, cr_201);
827         vnt_control_out_u8(priv, MESSAGE_REQUEST_BBREG, 0xce, cr_206);
828 }
829