root/drivers/staging/vt6656/rf.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. vnt_rf_write_embedded
  2. vnt_rf_setpower
  3. vnt_rf_addpower
  4. vnt_rf_set_txpower
  5. vnt_rf_rssi_to_dbm
  6. vnt_rf_table_download

   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 
  41 static 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 
  59 static 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 
  76 static 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 
  93 static 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 
 112 static 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 
 131 static 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 
 190 static 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 
 249 static 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 
 308 static 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 
 322 static 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 
 336 static 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 
 353 static 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 
 370 static 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 
 387 static 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 
 403 static 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 
 462 static 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 */
 522 static 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  */
 592 int 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 */
 610 int 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 
 645 static 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 */
 672 int 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 */
 791 void 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 
 814 int 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 
 950 end:
 951         return ret;
 952 }

/* [<][>][^][v][top][bottom][index][help] */