Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

at v4.5 825 lines 20 kB view raw
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 40static 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 51static 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 */ 87static 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 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 * 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 */ 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 * 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 */ 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 * 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 */ 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 * 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 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 /* 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 */ 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 /* 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 */ 549void 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 555void 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 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) { /* 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