1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35#include "mac.h"
36#include "baseband.h"
37#include "rf.h"
38#include "usbpipe.h"
39
40static u8 vnt_vt3184_agc[] = {
41 0x00, 0x00, 0x02, 0x02, 0x04, 0x04, 0x06, 0x06,
42 0x08, 0x08, 0x0a, 0x0a, 0x0c, 0x0c, 0x0e, 0x0e,
43 0x10, 0x10, 0x12, 0x12, 0x14, 0x14, 0x16, 0x16,
44 0x18, 0x18, 0x1a, 0x1a, 0x1c, 0x1c, 0x1e, 0x1e,
45 0x20, 0x20, 0x22, 0x22, 0x24, 0x24, 0x26, 0x26,
46 0x28, 0x28, 0x2a, 0x2a, 0x2c, 0x2c, 0x2e, 0x2e,
47 0x30, 0x30, 0x32, 0x32, 0x34, 0x34, 0x36, 0x36,
48 0x38, 0x38, 0x3a, 0x3a, 0x3c, 0x3c, 0x3e, 0x3e
49};
50
51static u8 vnt_vt3184_al2230[] = {
52 0x31, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00,
53 0x70, 0x45, 0x2a, 0x76, 0x00, 0x00, 0x80, 0x00,
54 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
55 0x00, 0x00, 0x00, 0x8e, 0x0a, 0x00, 0x00, 0x00,
56 0x00, 0x00, 0x00, 0x00, 0x00, 0x4a, 0x00, 0x00,
57 0x00, 0x00, 0x00, 0x00, 0x00, 0x4a, 0x00, 0x0c,
58 0x26, 0x5b, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa,
59 0xff, 0xff, 0x79, 0x00, 0x00, 0x0b, 0x48, 0x04,
60 0x00, 0x08, 0x00, 0x08, 0x08, 0x14, 0x05, 0x09,
61 0x00, 0x00, 0x00, 0x00, 0x09, 0x73, 0x00, 0xc5,
62 0x00, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
63 0x00, 0xd0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
64 0xe4, 0x80, 0x00, 0x00, 0x00, 0x00, 0x98, 0x0a,
65 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x01, 0x00,
66 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
67 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
68 0x8c, 0x01, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00,
69 0x08, 0x00, 0x1f, 0xb7, 0x88, 0x47, 0xaa, 0x00,
70 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xeb,
71 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
72 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00,
73 0x18, 0x00, 0x00, 0x00, 0x00, 0x15, 0x00, 0x18,
74 0x38, 0x30, 0x00, 0x00, 0xff, 0x0f, 0xe4, 0xe2,
75 0x00, 0x00, 0x00, 0x03, 0x01, 0x00, 0x00, 0x00,
76 0x18, 0x20, 0x07, 0x18, 0xff, 0xff, 0x0e, 0x0a,
77 0x0e, 0x00, 0x82, 0xa7, 0x3c, 0x10, 0x30, 0x05,
78 0x40, 0x12, 0x00, 0x00, 0x10, 0x28, 0x80, 0x2a,
79 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
80 0x00, 0xf3, 0x00, 0x00, 0x00, 0x10, 0x00, 0x12,
81 0x00, 0xf4, 0x00, 0xff, 0x79, 0x20, 0x30, 0x05,
82 0x00, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
83 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
84};
85
86
87static u8 vnt_vt3184_vt3226d0[] = {
88 0x31, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00,
89 0x70, 0x45, 0x2a, 0x76, 0x00, 0x00, 0x80, 0x00,
90 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
91 0x00, 0x00, 0x00, 0x8e, 0x0a, 0x00, 0x00, 0x00,
92 0x00, 0x00, 0x00, 0x00, 0x00, 0x4a, 0x00, 0x00,
93 0x00, 0x00, 0x00, 0x00, 0x00, 0x4a, 0x00, 0x0c,
94 0x26, 0x5b, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa,
95 0xff, 0xff, 0x79, 0x00, 0x00, 0x0b, 0x48, 0x04,
96 0x00, 0x08, 0x00, 0x08, 0x08, 0x14, 0x05, 0x09,
97 0x00, 0x00, 0x00, 0x00, 0x09, 0x73, 0x00, 0xc5,
98 0x00, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
99 0x00, 0xd0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
100 0xe4, 0x80, 0x00, 0x00, 0x00, 0x00, 0x98, 0x0a,
101 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x01, 0x00,
102 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
103 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
104 0x8c, 0x01, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00,
105 0x08, 0x00, 0x1f, 0xb7, 0x88, 0x47, 0xaa, 0x00,
106 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xeb,
107 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
108 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00,
109 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18,
110 0x38, 0x30, 0x00, 0x00, 0xff, 0x0f, 0xe4, 0xe2,
111 0x00, 0x00, 0x00, 0x03, 0x01, 0x00, 0x00, 0x00,
112 0x18, 0x20, 0x07, 0x18, 0xff, 0xff, 0x10, 0x0a,
113 0x0e, 0x00, 0x84, 0xa7, 0x3c, 0x10, 0x24, 0x05,
114 0x40, 0x12, 0x00, 0x00, 0x10, 0x28, 0x80, 0x2a,
115 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
116 0x00, 0xf3, 0x00, 0x00, 0x00, 0x10, 0x00, 0x10,
117 0x00, 0xf4, 0x00, 0xff, 0x79, 0x20, 0x30, 0x08,
118 0x00, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
119 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
120};
121
122static const u16 vnt_frame_time[MAX_RATE] = {
123 10, 20, 55, 110, 24, 36, 48, 72, 96, 144, 192, 216
124};
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140unsigned 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
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197void 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
331
332
333
334
335
336
337
338
339
340
341
342void 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
363
364
365
366
367
368
369
370
371
372
373
374
375int 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
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
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
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
497
498
499
500
501
502
503
504
505
506
507void 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
524void 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
529 if (priv->short_slot_time)
530 priv->bb_rx_conf &= 0xdf;
531 else
532 priv->bb_rx_conf |= 0x20;
533
534 vnt_control_out_u8(priv, MESSAGE_REQUEST_BBREG, 0x0a, priv->bb_rx_conf);
535}
536
537
538
539
540
541
542
543
544
545
546
547
548
549void vnt_set_deep_sleep(struct vnt_private *priv)
550{
551 vnt_control_out_u8(priv, MESSAGE_REQUEST_BBREG, 0x0c, 0x17);
552 vnt_control_out_u8(priv, MESSAGE_REQUEST_BBREG, 0x0d, 0xB9);
553}
554
555void vnt_exit_deep_sleep(struct vnt_private *priv)
556{
557 vnt_control_out_u8(priv, MESSAGE_REQUEST_BBREG, 0x0c, 0x00);
558 vnt_control_out_u8(priv, MESSAGE_REQUEST_BBREG, 0x0d, 0x01);
559}
560
561void 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) {
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) {
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) {
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
826