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