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
 814int vnt_rf_table_download(struct vnt_private *priv)
 815{
 816        int ret = 0;
 817        u16 length1 = 0, length2 = 0, length3 = 0;
 818        u8 *addr1 = NULL, *addr2 = NULL, *addr3 = NULL;
 819        u16 length, value;
 820        u8 array[256];
 821
 822        switch (priv->rf_type) {
 823        case RF_AL2230:
 824        case RF_AL2230S:
 825                length1 = CB_AL2230_INIT_SEQ * 3;
 826                length2 = CB_MAX_CHANNEL_24G * 3;
 827                length3 = CB_MAX_CHANNEL_24G * 3;
 828                addr1 = &al2230_init_table[0][0];
 829                addr2 = &al2230_channel_table0[0][0];
 830                addr3 = &al2230_channel_table1[0][0];
 831                break;
 832        case RF_AIROHA7230:
 833                length1 = CB_AL7230_INIT_SEQ * 3;
 834                length2 = CB_MAX_CHANNEL * 3;
 835                length3 = CB_MAX_CHANNEL * 3;
 836                addr1 = &al7230_init_table[0][0];
 837                addr2 = &al7230_channel_table0[0][0];
 838                addr3 = &al7230_channel_table1[0][0];
 839                break;
 840        case RF_VT3226:
 841                length1 = CB_VT3226_INIT_SEQ * 3;
 842                length2 = CB_MAX_CHANNEL_24G * 3;
 843                length3 = CB_MAX_CHANNEL_24G * 3;
 844                addr1 = &vt3226_init_table[0][0];
 845                addr2 = &vt3226_channel_table0[0][0];
 846                addr3 = &vt3226_channel_table1[0][0];
 847                break;
 848        case RF_VT3226D0:
 849                length1 = CB_VT3226_INIT_SEQ * 3;
 850                length2 = CB_MAX_CHANNEL_24G * 3;
 851                length3 = CB_MAX_CHANNEL_24G * 3;
 852                addr1 = &vt3226d0_init_table[0][0];
 853                addr2 = &vt3226_channel_table0[0][0];
 854                addr3 = &vt3226_channel_table1[0][0];
 855                break;
 856        case RF_VT3342A0:
 857                length1 = CB_VT3342_INIT_SEQ * 3;
 858                length2 = CB_MAX_CHANNEL * 3;
 859                length3 = CB_MAX_CHANNEL * 3;
 860                addr1 = &vt3342a0_init_table[0][0];
 861                addr2 = &vt3342_channel_table0[0][0];
 862                addr3 = &vt3342_channel_table1[0][0];
 863                break;
 864        }
 865
 866        /* Init Table */
 867        memcpy(array, addr1, length1);
 868
 869        ret = vnt_control_out(priv, MESSAGE_TYPE_WRITE, 0,
 870                              MESSAGE_REQUEST_RF_INIT, length1, array);
 871        if (ret)
 872                goto end;
 873
 874        /* Channel Table 0 */
 875        value = 0;
 876        while (length2 > 0) {
 877                if (length2 >= 64)
 878                        length = 64;
 879                else
 880                        length = length2;
 881
 882                memcpy(array, addr2, length);
 883
 884                ret = vnt_control_out(priv, MESSAGE_TYPE_WRITE, value,
 885                                      MESSAGE_REQUEST_RF_CH0, length, array);
 886                if (ret)
 887                        goto end;
 888
 889                length2 -= length;
 890                value += length;
 891                addr2 += length;
 892        }
 893
 894        /* Channel table 1 */
 895        value = 0;
 896        while (length3 > 0) {
 897                if (length3 >= 64)
 898                        length = 64;
 899                else
 900                        length = length3;
 901
 902                memcpy(array, addr3, length);
 903
 904                ret = vnt_control_out(priv, MESSAGE_TYPE_WRITE, value,
 905                                      MESSAGE_REQUEST_RF_CH1, length, array);
 906                if (ret)
 907                        goto end;
 908
 909                length3 -= length;
 910                value += length;
 911                addr3 += length;
 912        }
 913
 914        if (priv->rf_type == RF_AIROHA7230) {
 915                length1 = CB_AL7230_INIT_SEQ * 3;
 916                length2 = CB_MAX_CHANNEL * 3;
 917                addr1 = &al7230_init_table_amode[0][0];
 918                addr2 = &al7230_channel_table2[0][0];
 919
 920                memcpy(array, addr1, length1);
 921
 922                /* Init Table 2 */
 923                ret = vnt_control_out(priv, MESSAGE_TYPE_WRITE, 0,
 924                                      MESSAGE_REQUEST_RF_INIT2, length1, array);
 925                if (ret)
 926                        goto end;
 927
 928                /* Channel Table 0 */
 929                value = 0;
 930                while (length2 > 0) {
 931                        if (length2 >= 64)
 932                                length = 64;
 933                        else
 934                                length = length2;
 935
 936                        memcpy(array, addr2, length);
 937
 938                        ret = vnt_control_out(priv, MESSAGE_TYPE_WRITE, value,
 939                                              MESSAGE_REQUEST_RF_CH2, length,
 940                                              array);
 941                        if (ret)
 942                                goto end;
 943
 944                        length2 -= length;
 945                        value += length;
 946                        addr2 += length;
 947                }
 948        }
 949
 950end:
 951        return ret;
 952}
 953