This source file includes following definitions.
- vnt_get_frame_time
- vnt_get_phy_field
- vnt_set_antenna_mode
- vnt_vt3184_init
- vnt_set_short_slot_time
- vnt_set_vga_gain_offset
- vnt_set_deep_sleep
- vnt_exit_deep_sleep
- vnt_update_pre_ed_threshold
   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 #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, 
  33         0x10, 0x10, 0x12, 0x12, 0x14, 0x14, 0x16, 0x16,
  34         0x18, 0x18, 0x1a, 0x1a, 0x1c, 0x1c, 0x1e, 0x1e, 
  35         0x20, 0x20, 0x22, 0x22, 0x24, 0x24, 0x26, 0x26,
  36         0x28, 0x28, 0x2a, 0x2a, 0x2c, 0x2c, 0x2e, 0x2e, 
  37         0x30, 0x30, 0x32, 0x32, 0x34, 0x34, 0x36, 0x36,
  38         0x38, 0x38, 0x3a, 0x3a, 0x3c, 0x3c, 0x3e, 0x3e  
  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, 
  44         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  45         0x00, 0x00, 0x00, 0x8e, 0x0a, 0x00, 0x00, 0x00, 
  46         0x00, 0x00, 0x00, 0x00, 0x00, 0x4a, 0x00, 0x00,
  47         0x00, 0x00, 0x00, 0x00, 0x00, 0x4a, 0x00, 0x0c, 
  48         0x26, 0x5b, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa,
  49         0xff, 0xff, 0x79, 0x00, 0x00, 0x0b, 0x48, 0x04, 
  50         0x00, 0x08, 0x00, 0x08, 0x08, 0x14, 0x05, 0x09,
  51         0x00, 0x00, 0x00, 0x00, 0x09, 0x73, 0x00, 0xc5, 
  52         0x00, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  53         0x00, 0xd0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  54         0xe4, 0x80, 0x00, 0x00, 0x00, 0x00, 0x98, 0x0a,
  55         0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x01, 0x00, 
  56         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  57         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  58         0x8c, 0x01, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00,
  59         0x08, 0x00, 0x1f, 0xb7, 0x88, 0x47, 0xaa, 0x00, 
  60         0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xeb,
  61         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
  62         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00,
  63         0x18, 0x00, 0x00, 0x00, 0x00, 0x15, 0x00, 0x18, 
  64         0x38, 0x30, 0x00, 0x00, 0xff, 0x0f, 0xe4, 0xe2,
  65         0x00, 0x00, 0x00, 0x03, 0x01, 0x00, 0x00, 0x00, 
  66         0x18, 0x20, 0x07, 0x18, 0xff, 0xff, 0x0e, 0x0a,
  67         0x0e, 0x00, 0x82, 0xa7, 0x3c, 0x10, 0x30, 0x05, 
  68         0x40, 0x12, 0x00, 0x00, 0x10, 0x28, 0x80, 0x2a,
  69         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  70         0x00, 0xf3, 0x00, 0x00, 0x00, 0x10, 0x00, 0x12,
  71         0x00, 0xf4, 0x00, 0xff, 0x79, 0x20, 0x30, 0x05, 
  72         0x00, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  73         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00  
  74 };
  75 
  76 
  77 static u8 vnt_vt3184_vt3226d0[] = {
  78         0x31, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00,
  79         0x70, 0x45, 0x2a, 0x76, 0x00, 0x00, 0x80, 0x00, 
  80         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  81         0x00, 0x00, 0x00, 0x8e, 0x0a, 0x00, 0x00, 0x00, 
  82         0x00, 0x00, 0x00, 0x00, 0x00, 0x4a, 0x00, 0x00,
  83         0x00, 0x00, 0x00, 0x00, 0x00, 0x4a, 0x00, 0x0c, 
  84         0x26, 0x5b, 0x00, 0x00, 0x00, 0x00, 0xaa, 0xaa,
  85         0xff, 0xff, 0x79, 0x00, 0x00, 0x0b, 0x48, 0x04, 
  86         0x00, 0x08, 0x00, 0x08, 0x08, 0x14, 0x05, 0x09,
  87         0x00, 0x00, 0x00, 0x00, 0x09, 0x73, 0x00, 0xc5, 
  88         0x00, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  89         0x00, 0xd0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  90         0xe4, 0x80, 0x00, 0x00, 0x00, 0x00, 0x98, 0x0a,
  91         0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x01, 0x00, 
  92         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  93         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  94         0x8c, 0x01, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00,
  95         0x08, 0x00, 0x1f, 0xb7, 0x88, 0x47, 0xaa, 0x00, 
  96         0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xeb,
  97         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 
  98         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00,
  99         0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 
 100         0x38, 0x30, 0x00, 0x00, 0xff, 0x0f, 0xe4, 0xe2,
 101         0x00, 0x00, 0x00, 0x03, 0x01, 0x00, 0x00, 0x00, 
 102         0x18, 0x20, 0x07, 0x18, 0xff, 0xff, 0x10, 0x0a,
 103         0x0e, 0x00, 0x84, 0xa7, 0x3c, 0x10, 0x24, 0x05, 
 104         0x40, 0x12, 0x00, 0x00, 0x10, 0x28, 0x80, 0x2a,
 105         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
 106         0x00, 0xf3, 0x00, 0x00, 0x00, 0x10, 0x00, 0x10,
 107         0x00, 0xf4, 0x00, 0xff, 0x79, 0x20, 0x30, 0x08, 
 108         0x00, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 109         0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00  
 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 
 118 
 119 
 120 
 121 
 122 
 123 
 124 
 125 
 126 
 127 
 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 
 172 
 173 
 174 
 175 
 176 
 177 
 178 
 179 
 180 
 181 
 182 
 183 
 184 
 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 
 321 
 322 
 323 
 324 
 325 
 326 
 327 
 328 
 329 
 330 
 331 
 332 int 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         return vnt_control_out(priv, MESSAGE_TYPE_SET_ANTMD,
 348                                (u16)antenna_mode, 0, 0, NULL);
 349 }
 350 
 351 
 352 
 353 
 354 
 355 
 356 
 357 
 358 
 359 
 360 
 361 
 362 
 363 
 364 
 365 int vnt_vt3184_init(struct vnt_private *priv)
 366 {
 367         int ret = 0;
 368         u16 length;
 369         u8 *addr;
 370         u8 *agc;
 371         u16 length_agc;
 372         u8 array[256];
 373         u8 data;
 374 
 375         ret = vnt_control_in(priv, MESSAGE_TYPE_READ, 0, MESSAGE_REQUEST_EEPROM,
 376                              EEP_MAX_CONTEXT_SIZE, priv->eeprom);
 377         if (ret)
 378                 goto end;
 379 
 380         priv->rf_type = priv->eeprom[EEP_OFS_RFTYPE];
 381 
 382         dev_dbg(&priv->usb->dev, "RF Type %d\n", priv->rf_type);
 383 
 384         if ((priv->rf_type == RF_AL2230) ||
 385             (priv->rf_type == RF_AL2230S)) {
 386                 priv->bb_rx_conf = vnt_vt3184_al2230[10];
 387                 length = sizeof(vnt_vt3184_al2230);
 388                 addr = vnt_vt3184_al2230;
 389                 agc = vnt_vt3184_agc;
 390                 length_agc = sizeof(vnt_vt3184_agc);
 391 
 392                 priv->bb_vga[0] = 0x1C;
 393                 priv->bb_vga[1] = 0x10;
 394                 priv->bb_vga[2] = 0x0;
 395                 priv->bb_vga[3] = 0x0;
 396 
 397         } else if (priv->rf_type == RF_AIROHA7230) {
 398                 priv->bb_rx_conf = vnt_vt3184_al2230[10];
 399                 length = sizeof(vnt_vt3184_al2230);
 400                 addr = vnt_vt3184_al2230;
 401                 agc = vnt_vt3184_agc;
 402                 length_agc = sizeof(vnt_vt3184_agc);
 403 
 404                 addr[0xd7] = 0x06;
 405 
 406                 priv->bb_vga[0] = 0x1c;
 407                 priv->bb_vga[1] = 0x10;
 408                 priv->bb_vga[2] = 0x0;
 409                 priv->bb_vga[3] = 0x0;
 410 
 411         } else if ((priv->rf_type == RF_VT3226) ||
 412                         (priv->rf_type == RF_VT3226D0)) {
 413                 priv->bb_rx_conf = vnt_vt3184_vt3226d0[10];
 414                 length = sizeof(vnt_vt3184_vt3226d0);
 415                 addr = vnt_vt3184_vt3226d0;
 416                 agc = vnt_vt3184_agc;
 417                 length_agc = sizeof(vnt_vt3184_agc);
 418 
 419                 priv->bb_vga[0] = 0x20;
 420                 priv->bb_vga[1] = 0x10;
 421                 priv->bb_vga[2] = 0x0;
 422                 priv->bb_vga[3] = 0x0;
 423 
 424                 
 425                 ret = vnt_mac_reg_bits_on(priv, MAC_REG_SOFTPWRCTL2,
 426                                           SOFTPWRCTL_RFLEOPT);
 427                 if (ret)
 428                         goto end;
 429         } else if (priv->rf_type == RF_VT3342A0) {
 430                 priv->bb_rx_conf = vnt_vt3184_vt3226d0[10];
 431                 length = sizeof(vnt_vt3184_vt3226d0);
 432                 addr = vnt_vt3184_vt3226d0;
 433                 agc = vnt_vt3184_agc;
 434                 length_agc = sizeof(vnt_vt3184_agc);
 435 
 436                 priv->bb_vga[0] = 0x20;
 437                 priv->bb_vga[1] = 0x10;
 438                 priv->bb_vga[2] = 0x0;
 439                 priv->bb_vga[3] = 0x0;
 440 
 441                 
 442                 ret = vnt_mac_reg_bits_on(priv, MAC_REG_SOFTPWRCTL2,
 443                                           SOFTPWRCTL_RFLEOPT);
 444                 if (ret)
 445                         goto end;
 446         } else {
 447                 goto end;
 448         }
 449 
 450         memcpy(array, addr, length);
 451 
 452         ret = vnt_control_out_blocks(priv, VNT_REG_BLOCK_SIZE,
 453                                      MESSAGE_REQUEST_BBREG, length, array);
 454         if (ret)
 455                 goto end;
 456 
 457         memcpy(array, agc, length_agc);
 458 
 459         ret = vnt_control_out(priv, MESSAGE_TYPE_WRITE, 0,
 460                               MESSAGE_REQUEST_BBAGC, length_agc, array);
 461         if (ret)
 462                 goto end;
 463 
 464         if ((priv->rf_type == RF_VT3226) ||
 465             (priv->rf_type == RF_VT3342A0)) {
 466                 ret = vnt_control_out_u8(priv, MESSAGE_REQUEST_MACREG,
 467                                          MAC_REG_ITRTMSET, 0x23);
 468                 if (ret)
 469                         goto end;
 470 
 471                 ret = vnt_mac_reg_bits_on(priv, MAC_REG_PAPEDELAY, 0x01);
 472                 if (ret)
 473                         goto end;
 474         } else if (priv->rf_type == RF_VT3226D0) {
 475                 ret = vnt_control_out_u8(priv, MESSAGE_REQUEST_MACREG,
 476                                          MAC_REG_ITRTMSET, 0x11);
 477                 if (ret)
 478                         goto end;
 479 
 480                 ret = vnt_mac_reg_bits_on(priv, MAC_REG_PAPEDELAY, 0x01);
 481                 if (ret)
 482                         goto end;
 483         }
 484 
 485         ret = vnt_control_out_u8(priv, MESSAGE_REQUEST_BBREG, 0x04, 0x7f);
 486         if (ret)
 487                 goto end;
 488 
 489         ret = vnt_control_out_u8(priv, MESSAGE_REQUEST_BBREG, 0x0d, 0x01);
 490         if (ret)
 491                 goto end;
 492 
 493         ret = vnt_rf_table_download(priv);
 494         if (ret)
 495                 goto end;
 496 
 497         
 498         ret = vnt_control_in(priv, MESSAGE_TYPE_READ, USB_REG4,
 499                              MESSAGE_REQUEST_MEM, sizeof(data), &data);
 500         if (ret)
 501                 goto end;
 502 
 503         data |= 0x2;
 504 
 505         ret = vnt_control_out(priv, MESSAGE_TYPE_WRITE, USB_REG4,
 506                               MESSAGE_REQUEST_MEM, sizeof(data), &data);
 507 
 508 end:
 509         return ret;
 510 }
 511 
 512 
 513 
 514 
 515 
 516 
 517 
 518 
 519 
 520 
 521 
 522 
 523 
 524 int vnt_set_short_slot_time(struct vnt_private *priv)
 525 {
 526         int ret = 0;
 527         u8 bb_vga = 0;
 528 
 529         if (priv->short_slot_time)
 530                 priv->bb_rx_conf &= 0xdf;
 531         else
 532                 priv->bb_rx_conf |= 0x20;
 533 
 534         ret = vnt_control_in_u8(priv, MESSAGE_REQUEST_BBREG, 0xe7, &bb_vga);
 535         if (ret)
 536                 goto end;
 537 
 538         if (bb_vga == priv->bb_vga[0])
 539                 priv->bb_rx_conf |= 0x20;
 540 
 541         ret = vnt_control_out_u8(priv, MESSAGE_REQUEST_BBREG, 0x0a,
 542                                  priv->bb_rx_conf);
 543 
 544 end:
 545         return ret;
 546 }
 547 
 548 void vnt_set_vga_gain_offset(struct vnt_private *priv, u8 data)
 549 {
 550         vnt_control_out_u8(priv, MESSAGE_REQUEST_BBREG, 0xE7, data);
 551 
 552         
 553         if (priv->short_slot_time)
 554                 priv->bb_rx_conf &= 0xdf; 
 555         else
 556                 priv->bb_rx_conf |= 0x20; 
 557 
 558         vnt_control_out_u8(priv, MESSAGE_REQUEST_BBREG, 0x0a, priv->bb_rx_conf);
 559 }
 560 
 561 
 562 
 563 
 564 
 565 
 566 
 567 
 568 
 569 
 570 
 571 
 572 
 573 int vnt_set_deep_sleep(struct vnt_private *priv)
 574 {
 575         int ret = 0;
 576 
 577         
 578         ret = vnt_control_out_u8(priv, MESSAGE_REQUEST_BBREG, 0x0c, 0x17);
 579         if (ret)
 580                 return ret;
 581 
 582         
 583         return vnt_control_out_u8(priv, MESSAGE_REQUEST_BBREG, 0x0d, 0xB9);
 584 }
 585 
 586 int vnt_exit_deep_sleep(struct vnt_private *priv)
 587 {
 588         int ret = 0;
 589 
 590         
 591         ret = vnt_control_out_u8(priv, MESSAGE_REQUEST_BBREG, 0x0c, 0x00);
 592         if (ret)
 593                 return ret;
 594 
 595         
 596         return vnt_control_out_u8(priv, MESSAGE_REQUEST_BBREG, 0x0d, 0x01);
 597 }
 598 
 599 void vnt_update_pre_ed_threshold(struct vnt_private *priv, int scanning)
 600 {
 601         u8 cr_201 = 0x0, cr_206 = 0x0;
 602         u8 ed_inx = priv->bb_pre_ed_index;
 603 
 604         switch (priv->rf_type) {
 605         case RF_AL2230:
 606         case RF_AL2230S:
 607         case RF_AIROHA7230:
 608                 if (scanning) { 
 609                         ed_inx = 0;
 610                         cr_206 = 0x30;
 611                         break;
 612                 }
 613 
 614                 if (priv->bb_pre_ed_rssi <= 45) {
 615                         ed_inx = 20;
 616                         cr_201 = 0xff;
 617                 } else if (priv->bb_pre_ed_rssi <= 46) {
 618                         ed_inx = 19;
 619                         cr_201 = 0x1a;
 620                 } else if (priv->bb_pre_ed_rssi <= 47) {
 621                         ed_inx = 18;
 622                         cr_201 = 0x15;
 623                 } else if (priv->bb_pre_ed_rssi <= 49) {
 624                         ed_inx = 17;
 625                         cr_201 = 0xe;
 626                 } else if (priv->bb_pre_ed_rssi <= 51) {
 627                         ed_inx = 16;
 628                         cr_201 = 0x9;
 629                 } else if (priv->bb_pre_ed_rssi <= 53) {
 630                         ed_inx = 15;
 631                         cr_201 = 0x6;
 632                 } else if (priv->bb_pre_ed_rssi <= 55) {
 633                         ed_inx = 14;
 634                         cr_201 = 0x3;
 635                 } else if (priv->bb_pre_ed_rssi <= 56) {
 636                         ed_inx = 13;
 637                         cr_201 = 0x2;
 638                         cr_206 = 0xa0;
 639                 } else if (priv->bb_pre_ed_rssi <= 57) {
 640                         ed_inx = 12;
 641                         cr_201 = 0x2;
 642                         cr_206 = 0x20;
 643                 } else if (priv->bb_pre_ed_rssi <= 58) {
 644                         ed_inx = 11;
 645                         cr_201 = 0x1;
 646                         cr_206 = 0xa0;
 647                 } else if (priv->bb_pre_ed_rssi <= 59) {
 648                         ed_inx = 10;
 649                         cr_201 = 0x1;
 650                         cr_206 = 0x54;
 651                 } else if (priv->bb_pre_ed_rssi <= 60) {
 652                         ed_inx = 9;
 653                         cr_201 = 0x1;
 654                         cr_206 = 0x18;
 655                 } else if (priv->bb_pre_ed_rssi <= 61) {
 656                         ed_inx = 8;
 657                         cr_206 = 0xe3;
 658                 } else if (priv->bb_pre_ed_rssi <= 62) {
 659                         ed_inx = 7;
 660                         cr_206 = 0xb9;
 661                 } else if (priv->bb_pre_ed_rssi <= 63) {
 662                         ed_inx = 6;
 663                         cr_206 = 0x93;
 664                 } else if (priv->bb_pre_ed_rssi <= 64) {
 665                         ed_inx = 5;
 666                         cr_206 = 0x79;
 667                 } else if (priv->bb_pre_ed_rssi <= 65) {
 668                         ed_inx = 4;
 669                         cr_206 = 0x62;
 670                 } else if (priv->bb_pre_ed_rssi <= 66) {
 671                         ed_inx = 3;
 672                         cr_206 = 0x51;
 673                 } else if (priv->bb_pre_ed_rssi <= 67) {
 674                         ed_inx = 2;
 675                         cr_206 = 0x43;
 676                 } else if (priv->bb_pre_ed_rssi <= 68) {
 677                         ed_inx = 1;
 678                         cr_206 = 0x36;
 679                 } else {
 680                         ed_inx = 0;
 681                         cr_206 = 0x30;
 682                 }
 683                 break;
 684 
 685         case RF_VT3226:
 686         case RF_VT3226D0:
 687                 if (scanning)   { 
 688                         ed_inx = 0;
 689                         cr_206 = 0x24;
 690                         break;
 691                 }
 692 
 693                 if (priv->bb_pre_ed_rssi <= 41) {
 694                         ed_inx = 22;
 695                         cr_201 = 0xff;
 696                 } else if (priv->bb_pre_ed_rssi <= 42) {
 697                         ed_inx = 21;
 698                         cr_201 = 0x36;
 699                 } else if (priv->bb_pre_ed_rssi <= 43) {
 700                         ed_inx = 20;
 701                         cr_201 = 0x26;
 702                 } else if (priv->bb_pre_ed_rssi <= 45) {
 703                         ed_inx = 19;
 704                         cr_201 = 0x18;
 705                 } else if (priv->bb_pre_ed_rssi <= 47) {
 706                         ed_inx = 18;
 707                         cr_201 = 0x11;
 708                 } else if (priv->bb_pre_ed_rssi <= 49) {
 709                         ed_inx = 17;
 710                         cr_201 = 0xa;
 711                 } else if (priv->bb_pre_ed_rssi <= 51) {
 712                         ed_inx = 16;
 713                         cr_201 = 0x7;
 714                 } else if (priv->bb_pre_ed_rssi <= 53) {
 715                         ed_inx = 15;
 716                         cr_201 = 0x4;
 717                 } else if (priv->bb_pre_ed_rssi <= 55) {
 718                         ed_inx = 14;
 719                         cr_201 = 0x2;
 720                         cr_206 = 0xc0;
 721                 } else if (priv->bb_pre_ed_rssi <= 56) {
 722                         ed_inx = 13;
 723                         cr_201 = 0x2;
 724                         cr_206 = 0x30;
 725                 } else if (priv->bb_pre_ed_rssi <= 57) {
 726                         ed_inx = 12;
 727                         cr_201 = 0x1;
 728                         cr_206 = 0xb0;
 729                 } else if (priv->bb_pre_ed_rssi <= 58) {
 730                         ed_inx = 11;
 731                         cr_201 = 0x1;
 732                         cr_206 = 0x70;
 733                 } else if (priv->bb_pre_ed_rssi <= 59) {
 734                         ed_inx = 10;
 735                         cr_201 = 0x1;
 736                         cr_206 = 0x30;
 737                 } else if (priv->bb_pre_ed_rssi <= 60) {
 738                         ed_inx = 9;
 739                         cr_206 = 0xea;
 740                 } else if (priv->bb_pre_ed_rssi <= 61) {
 741                         ed_inx = 8;
 742                         cr_206 = 0xc0;
 743                 } else if (priv->bb_pre_ed_rssi <= 62) {
 744                         ed_inx = 7;
 745                         cr_206 = 0x9c;
 746                 } else if (priv->bb_pre_ed_rssi <= 63) {
 747                         ed_inx = 6;
 748                         cr_206 = 0x80;
 749                 } else if (priv->bb_pre_ed_rssi <= 64) {
 750                         ed_inx = 5;
 751                         cr_206 = 0x68;
 752                 } else if (priv->bb_pre_ed_rssi <= 65) {
 753                         ed_inx = 4;
 754                         cr_206 = 0x52;
 755                 } else if (priv->bb_pre_ed_rssi <= 66) {
 756                         ed_inx = 3;
 757                         cr_206 = 0x43;
 758                 } else if (priv->bb_pre_ed_rssi <= 67) {
 759                         ed_inx = 2;
 760                         cr_206 = 0x36;
 761                 } else if (priv->bb_pre_ed_rssi <= 68) {
 762                         ed_inx = 1;
 763                         cr_206 = 0x2d;
 764                 } else {
 765                         ed_inx = 0;
 766                         cr_206 = 0x24;
 767                 }
 768                 break;
 769 
 770         case RF_VT3342A0:
 771                 if (scanning) { 
 772                         ed_inx = 0;
 773                         cr_206 = 0x38;
 774                         break;
 775                 }
 776 
 777                 if (priv->bb_pre_ed_rssi <= 41) {
 778                         ed_inx = 20;
 779                         cr_201 = 0xff;
 780                 } else if (priv->bb_pre_ed_rssi <= 42) {
 781                         ed_inx = 19;
 782                         cr_201 = 0x36;
 783                 } else if (priv->bb_pre_ed_rssi <= 43) {
 784                         ed_inx = 18;
 785                         cr_201 = 0x26;
 786                 } else if (priv->bb_pre_ed_rssi <= 45) {
 787                         ed_inx = 17;
 788                         cr_201 = 0x18;
 789                 } else if (priv->bb_pre_ed_rssi <= 47) {
 790                         ed_inx = 16;
 791                         cr_201 = 0x11;
 792                 } else if (priv->bb_pre_ed_rssi <= 49) {
 793                         ed_inx = 15;
 794                         cr_201 = 0xa;
 795                 } else if (priv->bb_pre_ed_rssi <= 51) {
 796                         ed_inx = 14;
 797                         cr_201 = 0x7;
 798                 } else if (priv->bb_pre_ed_rssi <= 53) {
 799                         ed_inx = 13;
 800                         cr_201 = 0x4;
 801                 } else if (priv->bb_pre_ed_rssi <= 55) {
 802                         ed_inx = 12;
 803                         cr_201 = 0x2;
 804                         cr_206 = 0xc0;
 805                 } else if (priv->bb_pre_ed_rssi <= 56) {
 806                         ed_inx = 11;
 807                         cr_201 = 0x2;
 808                         cr_206 = 0x30;
 809                 } else if (priv->bb_pre_ed_rssi <= 57) {
 810                         ed_inx = 10;
 811                         cr_201 = 0x1;
 812                         cr_206 = 0xb0;
 813                 } else if (priv->bb_pre_ed_rssi <= 58) {
 814                         ed_inx = 9;
 815                         cr_201 = 0x1;
 816                         cr_206 = 0x70;
 817                 } else if (priv->bb_pre_ed_rssi <= 59) {
 818                         ed_inx = 8;
 819                         cr_201 = 0x1;
 820                         cr_206 = 0x30;
 821                 } else if (priv->bb_pre_ed_rssi <= 60) {
 822                         ed_inx = 7;
 823                         cr_206 = 0xea;
 824                 } else if (priv->bb_pre_ed_rssi <= 61) {
 825                         ed_inx = 6;
 826                         cr_206 = 0xc0;
 827                 } else if (priv->bb_pre_ed_rssi <= 62) {
 828                         ed_inx = 5;
 829                         cr_206 = 0x9c;
 830                 } else if (priv->bb_pre_ed_rssi <= 63) {
 831                         ed_inx = 4;
 832                         cr_206 = 0x80;
 833                 } else if (priv->bb_pre_ed_rssi <= 64) {
 834                         ed_inx = 3;
 835                         cr_206 = 0x68;
 836                 } else if (priv->bb_pre_ed_rssi <= 65) {
 837                         ed_inx = 2;
 838                         cr_206 = 0x52;
 839                 } else if (priv->bb_pre_ed_rssi <= 66) {
 840                         ed_inx = 1;
 841                         cr_206 = 0x43;
 842                 } else {
 843                         ed_inx = 0;
 844                         cr_206 = 0x38;
 845                 }
 846                 break;
 847         }
 848 
 849         if (ed_inx == priv->bb_pre_ed_index && !scanning)
 850                 return;
 851 
 852         priv->bb_pre_ed_index = ed_inx;
 853 
 854         dev_dbg(&priv->usb->dev, "%s bb_pre_ed_rssi %d\n",
 855                 __func__, priv->bb_pre_ed_rssi);
 856 
 857         if (!cr_201 && !cr_206)
 858                 return;
 859 
 860         vnt_control_out_u8(priv, MESSAGE_REQUEST_BBREG, 0xc9, cr_201);
 861         vnt_control_out_u8(priv, MESSAGE_REQUEST_BBREG, 0xce, cr_206);
 862 }
 863