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