linux/drivers/staging/vt6656/rf.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0+
   2/*
   3 * Copyright (c) 1996, 2003 VIA Networking Technologies, Inc.
   4 * All rights reserved.
   5 *
   6 * File: rf.c
   7 *
   8 * Purpose: rf function code
   9 *
  10 * Author: Jerry Chen
  11 *
  12 * Date: Feb. 19, 2004
  13 *
  14 * Functions:
  15 *      vnt_rf_write_embedded   - Embedded write RF register via MAC
  16 *
  17 * Revision History:
  18 *      RF_VT3226: RobertYu:20051111, VT3226C0 and before
  19 *      RF_VT3226D0: RobertYu:20051228
  20 *      RF_VT3342A0: RobertYu:20060609
  21 *
  22 */
  23
  24#include "mac.h"
  25#include "rf.h"
  26#include "baseband.h"
  27#include "usbpipe.h"
  28
  29#define CB_AL2230_INIT_SEQ    15
  30#define AL2230_PWR_IDX_LEN    64
  31
  32#define CB_AL7230_INIT_SEQ    16
  33#define AL7230_PWR_IDX_LEN    64
  34
  35#define CB_VT3226_INIT_SEQ    11
  36#define VT3226_PWR_IDX_LEN    64
  37
  38#define CB_VT3342_INIT_SEQ    13
  39#define VT3342_PWR_IDX_LEN    64
  40
  41static u8 al2230_init_table[CB_AL2230_INIT_SEQ][3] = {
  42        {0x03, 0xf7, 0x90},
  43        {0x03, 0x33, 0x31},
  44        {0x01, 0xb8, 0x02},
  45        {0x00, 0xff, 0xf3},
  46        {0x00, 0x05, 0xa4},
  47        {0x0f, 0x4d, 0xc5},
  48        {0x08, 0x05, 0xb6},
  49        {0x01, 0x47, 0xc7},
  50        {0x00, 0x06, 0x88},
  51        {0x04, 0x03, 0xb9},
  52        {0x00, 0xdb, 0xba},
  53        {0x00, 0x09, 0x9b},
  54        {0x0b, 0xdf, 0xfc},
  55        {0x00, 0x00, 0x0d},
  56        {0x00, 0x58, 0x0f}
  57};
  58
  59static u8 al2230_channel_table0[CB_MAX_CHANNEL_24G][3] = {
  60        {0x03, 0xf7, 0x90},
  61        {0x03, 0xf7, 0x90},
  62        {0x03, 0xe7, 0x90},
  63        {0x03, 0xe7, 0x90},
  64        {0x03, 0xf7, 0xa0},
  65        {0x03, 0xf7, 0xa0},
  66        {0x03, 0xe7, 0xa0},
  67        {0x03, 0xe7, 0xa0},
  68        {0x03, 0xf7, 0xb0},
  69        {0x03, 0xf7, 0xb0},
  70        {0x03, 0xe7, 0xb0},
  71        {0x03, 0xe7, 0xb0},
  72        {0x03, 0xf7, 0xc0},
  73        {0x03, 0xe7, 0xc0}
  74};
  75
  76static u8 al2230_channel_table1[CB_MAX_CHANNEL_24G][3] = {
  77        {0x03, 0x33, 0x31},
  78        {0x0b, 0x33, 0x31},
  79        {0x03, 0x33, 0x31},
  80        {0x0b, 0x33, 0x31},
  81        {0x03, 0x33, 0x31},
  82        {0x0b, 0x33, 0x31},
  83        {0x03, 0x33, 0x31},
  84        {0x0b, 0x33, 0x31},
  85        {0x03, 0x33, 0x31},
  86        {0x0b, 0x33, 0x31},
  87        {0x03, 0x33, 0x31},
  88        {0x0b, 0x33, 0x31},
  89        {0x03, 0x33, 0x31},
  90        {0x06, 0x66, 0x61}
  91};
  92
  93static u8 al7230_init_table[CB_AL7230_INIT_SEQ][3] = {
  94        {0x20, 0x37, 0x90},
  95        {0x13, 0x33, 0x31},
  96        {0x84, 0x1f, 0xf2},
  97        {0x3f, 0xdf, 0xa3},
  98        {0x7f, 0xd7, 0x84},
  99        {0x80, 0x2b, 0x55},
 100        {0x56, 0xaf, 0x36},
 101        {0xce, 0x02, 0x07},
 102        {0x6e, 0xbc, 0x98},
 103        {0x22, 0x1b, 0xb9},
 104        {0xe0, 0x00, 0x0a},
 105        {0x08, 0x03, 0x1b},
 106        {0x00, 0x0a, 0x3c},
 107        {0xff, 0xff, 0xfd},
 108        {0x00, 0x00, 0x0e},
 109        {0x1a, 0xba, 0x8f}
 110};
 111
 112static u8 al7230_init_table_amode[CB_AL7230_INIT_SEQ][3] = {
 113        {0x2f, 0xf5, 0x20},
 114        {0x00, 0x00, 0x01},
 115        {0x45, 0x1f, 0xe2},
 116        {0x5f, 0xdf, 0xa3},
 117        {0x6f, 0xd7, 0x84},
 118        {0x85, 0x3f, 0x55},
 119        {0x56, 0xaf, 0x36},
 120        {0xce, 0x02, 0x07},
 121        {0x6e, 0xbc, 0x98},
 122        {0x22, 0x1b, 0xb9},
 123        {0xe0, 0x60, 0x0a},
 124        {0x08, 0x03, 0x1b},
 125        {0x00, 0x14, 0x7c},
 126        {0xff, 0xff, 0xfd},
 127        {0x00, 0x00, 0x0e},
 128        {0x12, 0xba, 0xcf}
 129};
 130
 131static u8 al7230_channel_table0[CB_MAX_CHANNEL][3] = {
 132        {0x20, 0x37, 0x90},
 133        {0x20, 0x37, 0x90},
 134        {0x20, 0x37, 0x90},
 135        {0x20, 0x37, 0x90},
 136        {0x20, 0x37, 0xa0},
 137        {0x20, 0x37, 0xa0},
 138        {0x20, 0x37, 0xa0},
 139        {0x20, 0x37, 0xa0},
 140        {0x20, 0x37, 0xb0},
 141        {0x20, 0x37, 0xb0},
 142        {0x20, 0x37, 0xb0},
 143        {0x20, 0x37, 0xb0},
 144        {0x20, 0x37, 0xc0},
 145        {0x20, 0x37, 0xc0},
 146        {0x0f, 0xf5, 0x20}, /* channel 15 Tf = 4915MHz */
 147        {0x2f, 0xf5, 0x20},
 148        {0x0f, 0xf5, 0x20},
 149        {0x0f, 0xf5, 0x20},
 150        {0x2f, 0xf5, 0x20},
 151        {0x0f, 0xf5, 0x20},
 152        {0x2f, 0xf5, 0x30},
 153        {0x2f, 0xf5, 0x30},
 154        {0x0f, 0xf5, 0x40},
 155        {0x2f, 0xf5, 0x40},
 156        {0x0f, 0xf5, 0x40},
 157        {0x0f, 0xf5, 0x40},
 158        {0x2f, 0xf5, 0x40},
 159        {0x2f, 0xf5, 0x50},
 160        {0x2f, 0xf5, 0x60},
 161        {0x2f, 0xf5, 0x60},
 162        {0x2f, 0xf5, 0x70},
 163        {0x2f, 0xf5, 0x70},
 164        {0x2f, 0xf5, 0x70},
 165        {0x2f, 0xf5, 0x70},
 166        {0x2f, 0xf5, 0x70},
 167        {0x2f, 0xf5, 0x70},
 168        {0x2f, 0xf5, 0x80},
 169        {0x2f, 0xf5, 0x80},
 170        {0x2f, 0xf5, 0x80},
 171        {0x2f, 0xf5, 0x90},
 172        {0x2f, 0xf5, 0xc0},
 173        {0x2f, 0xf5, 0xc0},
 174        {0x2f, 0xf5, 0xc0},
 175        {0x2f, 0xf5, 0xd0},
 176        {0x2f, 0xf5, 0xd0},
 177        {0x2f, 0xf5, 0xd0},
 178        {0x2f, 0xf5, 0xe0},
 179        {0x2f, 0xf5, 0xe0},
 180        {0x2f, 0xf5, 0xe0},
 181        {0x2f, 0xf5, 0xf0},
 182        {0x2f, 0xf5, 0xf0},
 183        {0x2f, 0xf6, 0x00},
 184        {0x2f, 0xf6, 0x00},
 185        {0x2f, 0xf6, 0x00},
 186        {0x2f, 0xf6, 0x10},
 187        {0x2f, 0xf6, 0x10}
 188};
 189
 190static u8 al7230_channel_table1[CB_MAX_CHANNEL][3] = {
 191        {0x13, 0x33, 0x31},
 192        {0x1b, 0x33, 0x31},
 193        {0x03, 0x33, 0x31},
 194        {0x0b, 0x33, 0x31},
 195        {0x13, 0x33, 0x31},
 196        {0x1b, 0x33, 0x31},
 197        {0x03, 0x33, 0x31},
 198        {0x0b, 0x33, 0x31},
 199        {0x13, 0x33, 0x31},
 200        {0x1b, 0x33, 0x31},
 201        {0x03, 0x33, 0x31},
 202        {0x0b, 0x33, 0x31},
 203        {0x13, 0x33, 0x31},
 204        {0x06, 0x66, 0x61},
 205        {0x1d, 0x55, 0x51}, /* channel = 15, Tf = 4915MHz */
 206        {0x00, 0x00, 0x01},
 207        {0x02, 0xaa, 0xa1},
 208        {0x08, 0x00, 0x01},
 209        {0x0a, 0xaa, 0xa1},
 210        {0x0d, 0x55, 0x51},
 211        {0x15, 0x55, 0x51},
 212        {0x00, 0x00, 0x01},
 213        {0x1d, 0x55, 0x51},
 214        {0x00, 0x00, 0x01},
 215        {0x02, 0xaa, 0xa1},
 216        {0x08, 0x00, 0x01},
 217        {0x0a, 0xaa, 0xa1},
 218        {0x15, 0x55, 0x51},
 219        {0x05, 0x55, 0x51},
 220        {0x0a, 0xaa, 0xa1},
 221        {0x10, 0x00, 0x01},
 222        {0x15, 0x55, 0x51},
 223        {0x1a, 0xaa, 0xa1},
 224        {0x00, 0x00, 0x01},
 225        {0x05, 0x55, 0x51},
 226        {0x0a, 0xaa, 0xa1},
 227        {0x15, 0x55, 0x51},
 228        {0x00, 0x00, 0x01},
 229        {0x0a, 0xaa, 0xa1},
 230        {0x15, 0x55, 0x51},
 231        {0x15, 0x55, 0x51},
 232        {0x00, 0x00, 0x01},
 233        {0x0a, 0xaa, 0xa1},
 234        {0x15, 0x55, 0x51},
 235        {0x00, 0x00, 0x01},
 236        {0x0a, 0xaa, 0xa1},
 237        {0x15, 0x55, 0x51},
 238        {0x00, 0x00, 0x01},
 239        {0x0a, 0xaa, 0xa1},
 240        {0x15, 0x55, 0x51},
 241        {0x00, 0x00, 0x01},
 242        {0x18, 0x00, 0x01},
 243        {0x02, 0xaa, 0xa1},
 244        {0x0d, 0x55, 0x51},
 245        {0x18, 0x00, 0x01},
 246        {0x02, 0xaa, 0xb1}
 247};
 248
 249static u8 al7230_channel_table2[CB_MAX_CHANNEL][3] = {
 250        {0x7f, 0xd7, 0x84},
 251        {0x7f, 0xd7, 0x84},
 252        {0x7f, 0xd7, 0x84},
 253        {0x7f, 0xd7, 0x84},
 254        {0x7f, 0xd7, 0x84},
 255        {0x7f, 0xd7, 0x84},
 256        {0x7f, 0xd7, 0x84},
 257        {0x7f, 0xd7, 0x84},
 258        {0x7f, 0xd7, 0x84},
 259        {0x7f, 0xd7, 0x84},
 260        {0x7f, 0xd7, 0x84},
 261        {0x7f, 0xd7, 0x84},
 262        {0x7f, 0xd7, 0x84},
 263        {0x7f, 0xd7, 0x84},
 264        {0x7f, 0xd7, 0x84}, /* channel = 15 Tf = 4915MHz */
 265        {0x6f, 0xd7, 0x84},
 266        {0x7f, 0xd7, 0x84},
 267        {0x7f, 0xd7, 0x84},
 268        {0x7f, 0xd7, 0x84},
 269        {0x7f, 0xd7, 0x84},
 270        {0x7f, 0xd7, 0x84},
 271        {0x6f, 0xd7, 0x84},
 272        {0x7f, 0xd7, 0x84},
 273        {0x6f, 0xd7, 0x84},
 274        {0x7f, 0xd7, 0x84},
 275        {0x7f, 0xd7, 0x84},
 276        {0x7f, 0xd7, 0x84},
 277        {0x7f, 0xd7, 0x84},
 278        {0x7f, 0xd7, 0x84},
 279        {0x7f, 0xd7, 0x84},
 280        {0x7f, 0xd7, 0x84},
 281        {0x7f, 0xd7, 0x84},
 282        {0x7f, 0xd7, 0x84},
 283        {0x6f, 0xd7, 0x84},
 284        {0x7f, 0xd7, 0x84},
 285        {0x7f, 0xd7, 0x84},
 286        {0x7f, 0xd7, 0x84},
 287        {0x6f, 0xd7, 0x84},
 288        {0x7f, 0xd7, 0x84},
 289        {0x7f, 0xd7, 0x84},
 290        {0x7f, 0xd7, 0x84},
 291        {0x6f, 0xd7, 0x84},
 292        {0x7f, 0xd7, 0x84},
 293        {0x7f, 0xd7, 0x84},
 294        {0x6f, 0xd7, 0x84},
 295        {0x7f, 0xd7, 0x84},
 296        {0x7f, 0xd7, 0x84},
 297        {0x6f, 0xd7, 0x84},
 298        {0x7f, 0xd7, 0x84},
 299        {0x7f, 0xd7, 0x84},
 300        {0x6f, 0xd7, 0x84},
 301        {0x7f, 0xd7, 0x84},
 302        {0x7f, 0xd7, 0x84},
 303        {0x7f, 0xd7, 0x84},
 304        {0x7f, 0xd7, 0x84},
 305        {0x7f, 0xd7, 0x84}
 306};
 307
 308static u8 vt3226_init_table[CB_VT3226_INIT_SEQ][3] = {
 309        {0x03, 0xff, 0x80},
 310        {0x02, 0x82, 0xa1},
 311        {0x03, 0xc6, 0xa2},
 312        {0x01, 0x97, 0x93},
 313        {0x03, 0x66, 0x64},
 314        {0x00, 0x61, 0xa5},
 315        {0x01, 0x7b, 0xd6},
 316        {0x00, 0x80, 0x17},
 317        {0x03, 0xf8, 0x08},
 318        {0x00, 0x02, 0x39},
 319        {0x02, 0x00, 0x2a}
 320};
 321
 322static u8 vt3226d0_init_table[CB_VT3226_INIT_SEQ][3] = {
 323        {0x03, 0xff, 0x80},
 324        {0x03, 0x02, 0x21},
 325        {0x03, 0xc6, 0xa2},
 326        {0x01, 0x97, 0x93},
 327        {0x03, 0x66, 0x64},
 328        {0x00, 0x71, 0xa5},
 329        {0x01, 0x15, 0xc6},
 330        {0x01, 0x2e, 0x07},
 331        {0x00, 0x58, 0x08},
 332        {0x00, 0x02, 0x79},
 333        {0x02, 0x01, 0xaa}
 334};
 335
 336static u8 vt3226_channel_table0[CB_MAX_CHANNEL_24G][3] = {
 337        {0x01, 0x97, 0x83},
 338        {0x01, 0x97, 0x83},
 339        {0x01, 0x97, 0x93},
 340        {0x01, 0x97, 0x93},
 341        {0x01, 0x97, 0x93},
 342        {0x01, 0x97, 0x93},
 343        {0x01, 0x97, 0xa3},
 344        {0x01, 0x97, 0xa3},
 345        {0x01, 0x97, 0xa3},
 346        {0x01, 0x97, 0xa3},
 347        {0x01, 0x97, 0xb3},
 348        {0x01, 0x97, 0xb3},
 349        {0x01, 0x97, 0xb3},
 350        {0x03, 0x37, 0xc3}
 351};
 352
 353static u8 vt3226_channel_table1[CB_MAX_CHANNEL_24G][3] = {
 354        {0x02, 0x66, 0x64},
 355        {0x03, 0x66, 0x64},
 356        {0x00, 0x66, 0x64},
 357        {0x01, 0x66, 0x64},
 358        {0x02, 0x66, 0x64},
 359        {0x03, 0x66, 0x64},
 360        {0x00, 0x66, 0x64},
 361        {0x01, 0x66, 0x64},
 362        {0x02, 0x66, 0x64},
 363        {0x03, 0x66, 0x64},
 364        {0x00, 0x66, 0x64},
 365        {0x01, 0x66, 0x64},
 366        {0x02, 0x66, 0x64},
 367        {0x00, 0xcc, 0xc4}
 368};
 369
 370static const u32 vt3226d0_lo_current_table[CB_MAX_CHANNEL_24G] = {
 371        0x0135c600,
 372        0x0135c600,
 373        0x0235c600,
 374        0x0235c600,
 375        0x0235c600,
 376        0x0335c600,
 377        0x0335c600,
 378        0x0335c600,
 379        0x0335c600,
 380        0x0335c600,
 381        0x0335c600,
 382        0x0335c600,
 383        0x0335c600,
 384        0x0135c600
 385};
 386
 387static u8 vt3342a0_init_table[CB_VT3342_INIT_SEQ][3] = { /* 11b/g mode */
 388        {0x03, 0xff, 0x80},
 389        {0x02, 0x08, 0x81},
 390        {0x00, 0xc6, 0x02},
 391        {0x03, 0xc5, 0x13},
 392        {0x00, 0xee, 0xe4},
 393        {0x00, 0x71, 0xa5},
 394        {0x01, 0x75, 0x46},
 395        {0x01, 0x40, 0x27},
 396        {0x01, 0x54, 0x08},
 397        {0x00, 0x01, 0x69},
 398        {0x02, 0x00, 0xaa},
 399        {0x00, 0x08, 0xcb},
 400        {0x01, 0x70, 0x0c}
 401};
 402
 403static u8 vt3342_channel_table0[CB_MAX_CHANNEL][3] = {
 404        {0x02, 0x05, 0x03},
 405        {0x01, 0x15, 0x03},
 406        {0x03, 0xc5, 0x03},
 407        {0x02, 0x65, 0x03},
 408        {0x01, 0x15, 0x13},
 409        {0x03, 0xc5, 0x13},
 410        {0x02, 0x05, 0x13},
 411        {0x01, 0x15, 0x13},
 412        {0x03, 0xc5, 0x13},
 413        {0x02, 0x65, 0x13},
 414        {0x01, 0x15, 0x23},
 415        {0x03, 0xc5, 0x23},
 416        {0x02, 0x05, 0x23},
 417        {0x00, 0xd5, 0x23},
 418        {0x01, 0x15, 0x13}, /* channel = 15 Tf = 4915MHz */
 419        {0x01, 0x15, 0x13},
 420        {0x01, 0x15, 0x13},
 421        {0x01, 0x15, 0x13},
 422        {0x01, 0x15, 0x13},
 423        {0x01, 0x15, 0x13},
 424        {0x01, 0x15, 0x13},
 425        {0x01, 0x15, 0x13},
 426        {0x01, 0x15, 0x13},
 427        {0x01, 0x15, 0x13},
 428        {0x01, 0x15, 0x13},
 429        {0x01, 0x15, 0x13},
 430        {0x01, 0x15, 0x13},
 431        {0x01, 0x15, 0x13},
 432        {0x01, 0x15, 0x13},
 433        {0x01, 0x55, 0x63},
 434        {0x01, 0x55, 0x63},
 435        {0x02, 0xa5, 0x63},
 436        {0x02, 0xa5, 0x63},
 437        {0x00, 0x05, 0x73},
 438        {0x00, 0x05, 0x73},
 439        {0x01, 0x55, 0x73},
 440        {0x02, 0xa5, 0x73},
 441        {0x00, 0x05, 0x83},
 442        {0x01, 0x55, 0x83},
 443        {0x02, 0xa5, 0x83},
 444        {0x02, 0xa5, 0x83},
 445        {0x02, 0xa5, 0x83},
 446        {0x02, 0xa5, 0x83},
 447        {0x02, 0xa5, 0x83},
 448        {0x02, 0xa5, 0x83},
 449        {0x02, 0xa5, 0x83},
 450        {0x02, 0xa5, 0x83},
 451        {0x02, 0xa5, 0x83},
 452        {0x02, 0xa5, 0x83},
 453        {0x02, 0xa5, 0x83},
 454        {0x02, 0xa5, 0x83},
 455        {0x00, 0x05, 0xF3},
 456        {0x01, 0x56, 0x03},
 457        {0x02, 0xa6, 0x03},
 458        {0x00, 0x06, 0x03},
 459        {0x00, 0x06, 0x03}
 460};
 461
 462static u8 vt3342_channel_table1[CB_MAX_CHANNEL][3] = {
 463        {0x01, 0x99, 0x94},
 464        {0x02, 0x44, 0x44},
 465        {0x02, 0xee, 0xe4},
 466        {0x03, 0x99, 0x94},
 467        {0x00, 0x44, 0x44},
 468        {0x00, 0xee, 0xe4},
 469        {0x01, 0x99, 0x94},
 470        {0x02, 0x44, 0x44},
 471        {0x02, 0xee, 0xe4},
 472        {0x03, 0x99, 0x94},
 473        {0x00, 0x44, 0x44},
 474        {0x00, 0xee, 0xe4},
 475        {0x01, 0x99, 0x94},
 476        {0x03, 0x33, 0x34},
 477        {0x00, 0x44, 0x44}, /* channel = 15 Tf = 4915MHz */
 478        {0x00, 0x44, 0x44},
 479        {0x00, 0x44, 0x44},
 480        {0x00, 0x44, 0x44},
 481        {0x00, 0x44, 0x44},
 482        {0x00, 0x44, 0x44},
 483        {0x00, 0x44, 0x44},
 484        {0x00, 0x44, 0x44},
 485        {0x00, 0x44, 0x44},
 486        {0x00, 0x44, 0x44},
 487        {0x00, 0x44, 0x44},
 488        {0x00, 0x44, 0x44},
 489        {0x00, 0x44, 0x44},
 490        {0x00, 0x44, 0x44},
 491        {0x00, 0x44, 0x44},
 492        {0x01, 0x55, 0x54},
 493        {0x01, 0x55, 0x54},
 494        {0x02, 0xaa, 0xa4},
 495        {0x02, 0xaa, 0xa4},
 496        {0x00, 0x00, 0x04},
 497        {0x00, 0x00, 0x04},
 498        {0x01, 0x55, 0x54},
 499        {0x02, 0xaa, 0xa4},
 500        {0x00, 0x00, 0x04},
 501        {0x01, 0x55, 0x54},
 502        {0x02, 0xaa, 0xa4},
 503        {0x02, 0xaa, 0xa4},
 504        {0x02, 0xaa, 0xa4},
 505        {0x02, 0xaa, 0xa4},
 506        {0x02, 0xaa, 0xa4},
 507        {0x02, 0xaa, 0xa4},
 508        {0x02, 0xaa, 0xa4},
 509        {0x02, 0xaa, 0xa4},
 510        {0x02, 0xaa, 0xa4},
 511        {0x02, 0xaa, 0xa4},
 512        {0x02, 0xaa, 0xa4},
 513        {0x02, 0xaa, 0xa4},
 514        {0x03, 0x00, 0x04},
 515        {0x00, 0x55, 0x54},
 516        {0x01, 0xaa, 0xa4},
 517        {0x03, 0x00, 0x04},
 518        {0x03, 0x00, 0x04}
 519};
 520
 521/* Power Table */
 522static const u32 al2230_power_table[AL2230_PWR_IDX_LEN] = {
 523        0x04040900,
 524        0x04041900,
 525        0x04042900,
 526        0x04043900,
 527        0x04044900,
 528        0x04045900,
 529        0x04046900,
 530        0x04047900,
 531        0x04048900,
 532        0x04049900,
 533        0x0404a900,
 534        0x0404b900,
 535        0x0404c900,
 536        0x0404d900,
 537        0x0404e900,
 538        0x0404f900,
 539        0x04050900,
 540        0x04051900,
 541        0x04052900,
 542        0x04053900,
 543        0x04054900,
 544        0x04055900,
 545        0x04056900,
 546        0x04057900,
 547        0x04058900,
 548        0x04059900,
 549        0x0405a900,
 550        0x0405b900,
 551        0x0405c900,
 552        0x0405d900,
 553        0x0405e900,
 554        0x0405f900,
 555        0x04060900,
 556        0x04061900,
 557        0x04062900,
 558        0x04063900,
 559        0x04064900,
 560        0x04065900,
 561        0x04066900,
 562        0x04067900,
 563        0x04068900,
 564        0x04069900,
 565        0x0406a900,
 566        0x0406b900,
 567        0x0406c900,
 568        0x0406d900,
 569        0x0406e900,
 570        0x0406f900,
 571        0x04070900,
 572        0x04071900,
 573        0x04072900,
 574        0x04073900,
 575        0x04074900,
 576        0x04075900,
 577        0x04076900,
 578        0x04077900,
 579        0x04078900,
 580        0x04079900,
 581        0x0407a900,
 582        0x0407b900,
 583        0x0407c900,
 584        0x0407d900,
 585        0x0407e900,
 586        0x0407f900
 587};
 588
 589/*
 590 * Description: Write to IF/RF, by embedded programming
 591 */
 592int vnt_rf_write_embedded(struct vnt_private *priv, u32 data)
 593{
 594        u8 reg_data[4];
 595
 596        data |= (VNT_RF_REG_LEN << 3) | IFREGCTL_REGW;
 597
 598        reg_data[0] = (u8)data;
 599        reg_data[1] = (u8)(data >> 8);
 600        reg_data[2] = (u8)(data >> 16);
 601        reg_data[3] = (u8)(data >> 24);
 602
 603        vnt_control_out(priv, MESSAGE_TYPE_WRITE_IFRF,
 604                        0, 0, ARRAY_SIZE(reg_data), reg_data);
 605
 606        return true;
 607}
 608
 609/* Set Tx power by rate and channel number */
 610int vnt_rf_setpower(struct vnt_private *priv, u32 rate, u32 channel)
 611{
 612        u8 power = priv->cck_pwr;
 613
 614        if (channel == 0)
 615                return -EINVAL;
 616
 617        switch (rate) {
 618        case RATE_1M:
 619        case RATE_2M:
 620        case RATE_5M:
 621        case RATE_11M:
 622                channel--;
 623
 624                if (channel < sizeof(priv->cck_pwr_tbl))
 625                        power = priv->cck_pwr_tbl[channel];
 626                break;
 627        case RATE_6M:
 628        case RATE_9M:
 629        case RATE_12M:
 630        case RATE_18M:
 631        case RATE_24M:
 632        case RATE_36M:
 633        case RATE_48M:
 634        case RATE_54M:
 635                if (channel > CB_MAX_CHANNEL_24G)
 636                        power = priv->ofdm_a_pwr_tbl[channel - 15];
 637                else
 638                        power = priv->ofdm_pwr_tbl[channel - 1];
 639                break;
 640        }
 641
 642        return vnt_rf_set_txpower(priv, power, rate);
 643}
 644
 645static u8 vnt_rf_addpower(struct vnt_private *priv)
 646{
 647        s32 rssi = -priv->current_rssi;
 648
 649        if (!rssi)
 650                return 7;
 651
 652        if (priv->rf_type == RF_VT3226D0) {
 653                if (rssi < -70)
 654                        return 9;
 655                else if (rssi < -65)
 656                        return 7;
 657                else if (rssi < -60)
 658                        return 5;
 659        } else {
 660                if (rssi < -80)
 661                        return 9;
 662                else if (rssi < -75)
 663                        return 7;
 664                else if (rssi < -70)
 665                        return 5;
 666        }
 667
 668        return 0;
 669}
 670
 671/* Set Tx power by power level and rate */
 672int vnt_rf_set_txpower(struct vnt_private *priv, u8 power, u32 rate)
 673{
 674        u32 power_setting = 0;
 675        int ret = true;
 676
 677        power += vnt_rf_addpower(priv);
 678        if (power > VNT_RF_MAX_POWER)
 679                power = VNT_RF_MAX_POWER;
 680
 681        if (priv->power == power)
 682                return true;
 683
 684        priv->power = power;
 685
 686        switch (priv->rf_type) {
 687        case RF_AL2230:
 688                if (power >= AL2230_PWR_IDX_LEN)
 689                        return false;
 690
 691                ret &= vnt_rf_write_embedded(priv, al2230_power_table[power]);
 692
 693                if (rate <= RATE_11M)
 694                        ret &= vnt_rf_write_embedded(priv, 0x0001b400);
 695                else
 696                        ret &= vnt_rf_write_embedded(priv, 0x0005a400);
 697                break;
 698        case RF_AL2230S:
 699                if (power >= AL2230_PWR_IDX_LEN)
 700                        return false;
 701
 702                ret &= vnt_rf_write_embedded(priv, al2230_power_table[power]);
 703
 704                if (rate <= RATE_11M) {
 705                        ret &= vnt_rf_write_embedded(priv, 0x040c1400);
 706                        ret &= vnt_rf_write_embedded(priv, 0x00299b00);
 707                } else {
 708                        ret &= vnt_rf_write_embedded(priv, 0x0005a400);
 709                        ret &= vnt_rf_write_embedded(priv, 0x00099b00);
 710                }
 711                break;
 712
 713        case RF_AIROHA7230:
 714                if (rate <= RATE_11M)
 715                        ret &= vnt_rf_write_embedded(priv, 0x111bb900);
 716                else
 717                        ret &= vnt_rf_write_embedded(priv, 0x221bb900);
 718
 719                if (power >= AL7230_PWR_IDX_LEN)
 720                        return false;
 721
 722                /*
 723                 * 0x080F1B00 for 3 wire control TxGain(D10)
 724                 * and 0x31 as TX Gain value
 725                 */
 726                power_setting = 0x080c0b00 | (power << 12);
 727
 728                ret &= vnt_rf_write_embedded(priv, power_setting);
 729
 730                break;
 731
 732        case RF_VT3226:
 733                if (power >= VT3226_PWR_IDX_LEN)
 734                        return false;
 735                power_setting = ((0x3f - power) << 20) | (0x17 << 8);
 736
 737                ret &= vnt_rf_write_embedded(priv, power_setting);
 738
 739                break;
 740        case RF_VT3226D0:
 741                if (power >= VT3226_PWR_IDX_LEN)
 742                        return false;
 743
 744                if (rate <= RATE_11M) {
 745                        u16 hw_value = priv->hw->conf.chandef.chan->hw_value;
 746
 747                        power_setting = ((0x3f - power) << 20) | (0xe07 << 8);
 748
 749                        ret &= vnt_rf_write_embedded(priv, power_setting);
 750                        ret &= vnt_rf_write_embedded(priv, 0x03c6a200);
 751
 752                        dev_dbg(&priv->usb->dev,
 753                                "%s 11b channel [%d]\n", __func__, hw_value);
 754
 755                        hw_value--;
 756
 757                        if (hw_value < ARRAY_SIZE(vt3226d0_lo_current_table))
 758                                ret &= vnt_rf_write_embedded(priv,
 759                                        vt3226d0_lo_current_table[hw_value]);
 760
 761                        ret &= vnt_rf_write_embedded(priv, 0x015C0800);
 762                } else {
 763                        dev_dbg(&priv->usb->dev,
 764                                "@@@@ %s> 11G mode\n", __func__);
 765
 766                        power_setting = ((0x3f - power) << 20) | (0x7 << 8);
 767
 768                        ret &= vnt_rf_write_embedded(priv, power_setting);
 769                        ret &= vnt_rf_write_embedded(priv, 0x00C6A200);
 770                        ret &= vnt_rf_write_embedded(priv, 0x016BC600);
 771                        ret &= vnt_rf_write_embedded(priv, 0x00900800);
 772                }
 773                break;
 774
 775        case RF_VT3342A0:
 776                if (power >= VT3342_PWR_IDX_LEN)
 777                        return false;
 778
 779                power_setting =  ((0x3f - power) << 20) | (0x27 << 8);
 780
 781                ret &= vnt_rf_write_embedded(priv, power_setting);
 782
 783                break;
 784        default:
 785                break;
 786        }
 787        return ret;
 788}
 789
 790/* Convert rssi to dbm */
 791void vnt_rf_rssi_to_dbm(struct vnt_private *priv, u8 rssi, long *dbm)
 792{
 793        u8 idx = ((rssi & 0xc0) >> 6) & 0x03;
 794        long b = rssi & 0x3f;
 795        long a = 0;
 796        u8 airoharf[4] = {0, 18, 0, 40};
 797
 798        switch (priv->rf_type) {
 799        case RF_AL2230:
 800        case RF_AL2230S:
 801        case RF_AIROHA7230:
 802        case RF_VT3226:
 803        case RF_VT3226D0:
 804        case RF_VT3342A0:
 805                a = airoharf[idx];
 806                break;
 807        default:
 808                break;
 809        }
 810
 811        *dbm = -1 * (a + b * 2);
 812}
 813
 814void vnt_rf_table_download(struct vnt_private *priv)
 815{
 816        u16 length1 = 0, length2 = 0, length3 = 0;
 817        u8 *addr1 = NULL, *addr2 = NULL, *addr3 = NULL;
 818        u16 length, value;
 819        u8 array[256];
 820
 821        switch (priv->rf_type) {
 822        case RF_AL2230:
 823        case RF_AL2230S:
 824                length1 = CB_AL2230_INIT_SEQ * 3;
 825                length2 = CB_MAX_CHANNEL_24G * 3;
 826                length3 = CB_MAX_CHANNEL_24G * 3;
 827                addr1 = &al2230_init_table[0][0];
 828                addr2 = &al2230_channel_table0[0][0];
 829                addr3 = &al2230_channel_table1[0][0];
 830                break;
 831        case RF_AIROHA7230:
 832                length1 = CB_AL7230_INIT_SEQ * 3;
 833                length2 = CB_MAX_CHANNEL * 3;
 834                length3 = CB_MAX_CHANNEL * 3;
 835                addr1 = &al7230_init_table[0][0];
 836                addr2 = &al7230_channel_table0[0][0];
 837                addr3 = &al7230_channel_table1[0][0];
 838                break;
 839        case RF_VT3226:
 840                length1 = CB_VT3226_INIT_SEQ * 3;
 841                length2 = CB_MAX_CHANNEL_24G * 3;
 842                length3 = CB_MAX_CHANNEL_24G * 3;
 843                addr1 = &vt3226_init_table[0][0];
 844                addr2 = &vt3226_channel_table0[0][0];
 845                addr3 = &vt3226_channel_table1[0][0];
 846                break;
 847        case RF_VT3226D0:
 848                length1 = CB_VT3226_INIT_SEQ * 3;
 849                length2 = CB_MAX_CHANNEL_24G * 3;
 850                length3 = CB_MAX_CHANNEL_24G * 3;
 851                addr1 = &vt3226d0_init_table[0][0];
 852                addr2 = &vt3226_channel_table0[0][0];
 853                addr3 = &vt3226_channel_table1[0][0];
 854                break;
 855        case RF_VT3342A0:
 856                length1 = CB_VT3342_INIT_SEQ * 3;
 857                length2 = CB_MAX_CHANNEL * 3;
 858                length3 = CB_MAX_CHANNEL * 3;
 859                addr1 = &vt3342a0_init_table[0][0];
 860                addr2 = &vt3342_channel_table0[0][0];
 861                addr3 = &vt3342_channel_table1[0][0];
 862                break;
 863        }
 864
 865        /* Init Table */
 866        memcpy(array, addr1, length1);
 867
 868        vnt_control_out(priv, MESSAGE_TYPE_WRITE, 0,
 869                        MESSAGE_REQUEST_RF_INIT, length1, array);
 870
 871        /* Channel Table 0 */
 872        value = 0;
 873        while (length2 > 0) {
 874                if (length2 >= 64)
 875                        length = 64;
 876                else
 877                        length = length2;
 878
 879                memcpy(array, addr2, length);
 880
 881                vnt_control_out(priv, MESSAGE_TYPE_WRITE,
 882                                value, MESSAGE_REQUEST_RF_CH0, length, array);
 883
 884                length2 -= length;
 885                value += length;
 886                addr2 += length;
 887        }
 888
 889        /* Channel table 1 */
 890        value = 0;
 891        while (length3 > 0) {
 892                if (length3 >= 64)
 893                        length = 64;
 894                else
 895                        length = length3;
 896
 897                memcpy(array, addr3, length);
 898
 899                vnt_control_out(priv, MESSAGE_TYPE_WRITE,
 900                                value, MESSAGE_REQUEST_RF_CH1, length, array);
 901
 902                length3 -= length;
 903                value += length;
 904                addr3 += length;
 905        }
 906
 907        if (priv->rf_type == RF_AIROHA7230) {
 908                length1 = CB_AL7230_INIT_SEQ * 3;
 909                length2 = CB_MAX_CHANNEL * 3;
 910                addr1 = &al7230_init_table_amode[0][0];
 911                addr2 = &al7230_channel_table2[0][0];
 912
 913                memcpy(array, addr1, length1);
 914
 915                /* Init Table 2 */
 916                vnt_control_out(priv, MESSAGE_TYPE_WRITE,
 917                                0, MESSAGE_REQUEST_RF_INIT2, length1, array);
 918
 919                /* Channel Table 0 */
 920                value = 0;
 921                while (length2 > 0) {
 922                        if (length2 >= 64)
 923                                length = 64;
 924                        else
 925                                length = length2;
 926
 927                        memcpy(array, addr2, length);
 928
 929                        vnt_control_out(priv, MESSAGE_TYPE_WRITE,
 930                                        value, MESSAGE_REQUEST_RF_CH2,
 931                                        length, array);
 932
 933                        length2 -= length;
 934                        value += length;
 935                        addr2 += length;
 936                }
 937        }
 938}
 939