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