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 55 static 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 73 static 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 90 static 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 107 static 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 126 static 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 145 static 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 204 static 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 263 static 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 322 static 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 336 static 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 350 static 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 367 static 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 384 static 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 401 static 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 417 static 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 476 static 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 */ 536 static 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 */ 606 int 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 */ 624 int 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_18M: 644 case RATE_24M: 645 case RATE_36M: 646 case RATE_48M: 647 case RATE_54M: 648 if (channel > CB_MAX_CHANNEL_24G) 649 power = priv->ofdm_a_pwr_tbl[channel-15]; 650 else 651 power = priv->ofdm_pwr_tbl[channel-1]; 652 break; 653 } 654 655 return vnt_rf_set_txpower(priv, power, rate); 656 } 657 658 static u8 vnt_rf_addpower(struct vnt_private *priv) 659 { 660 s32 rssi = -priv->current_rssi; 661 662 if (!rssi) 663 return 7; 664 665 if (priv->rf_type == RF_VT3226D0) { 666 if (rssi < -70) 667 return 9; 668 else if (rssi < -65) 669 return 7; 670 else if (rssi < -60) 671 return 5; 672 } else { 673 if (rssi < -80) 674 return 9; 675 else if (rssi < -75) 676 return 7; 677 else if (rssi < -70) 678 return 5; 679 } 680 681 return 0; 682 } 683 684 /* Set Tx power by power level and rate */ 685 int vnt_rf_set_txpower(struct vnt_private *priv, u8 power, u32 rate) 686 { 687 u32 power_setting = 0; 688 int ret = true; 689 690 power += vnt_rf_addpower(priv); 691 if (power > VNT_RF_MAX_POWER) 692 power = VNT_RF_MAX_POWER; 693 694 if (priv->power == power) 695 return true; 696 697 priv->power = power; 698 699 switch (priv->rf_type) { 700 case RF_AL2230: 701 if (power >= AL2230_PWR_IDX_LEN) 702 return false; 703 704 ret &= vnt_rf_write_embedded(priv, al2230_power_table[power]); 705 706 if (rate <= RATE_11M) 707 ret &= vnt_rf_write_embedded(priv, 0x0001b400); 708 else 709 ret &= vnt_rf_write_embedded(priv, 0x0005a400); 710 break; 711 case RF_AL2230S: 712 if (power >= AL2230_PWR_IDX_LEN) 713 return false; 714 715 ret &= vnt_rf_write_embedded(priv, al2230_power_table[power]); 716 717 if (rate <= RATE_11M) { 718 ret &= vnt_rf_write_embedded(priv, 0x040c1400); 719 ret &= vnt_rf_write_embedded(priv, 0x00299b00); 720 } else { 721 ret &= vnt_rf_write_embedded(priv, 0x0005a400); 722 ret &= vnt_rf_write_embedded(priv, 0x00099b00); 723 } 724 break; 725 726 case RF_AIROHA7230: 727 if (rate <= RATE_11M) 728 ret &= vnt_rf_write_embedded(priv, 0x111bb900); 729 else 730 ret &= vnt_rf_write_embedded(priv, 0x221bb900); 731 732 if (power >= AL7230_PWR_IDX_LEN) 733 return false; 734 735 /* 736 * 0x080F1B00 for 3 wire control TxGain(D10) 737 * and 0x31 as TX Gain value 738 */ 739 power_setting = 0x080c0b00 | (power << 12); 740 741 ret &= vnt_rf_write_embedded(priv, power_setting); 742 743 break; 744 745 case RF_VT3226: 746 if (power >= VT3226_PWR_IDX_LEN) 747 return false; 748 power_setting = ((0x3f - power) << 20) | (0x17 << 8); 749 750 ret &= vnt_rf_write_embedded(priv, power_setting); 751 752 break; 753 case RF_VT3226D0: 754 if (power >= VT3226_PWR_IDX_LEN) 755 return false; 756 757 if (rate <= RATE_11M) { 758 u16 hw_value = priv->hw->conf.chandef.chan->hw_value; 759 760 power_setting = ((0x3f - power) << 20) | (0xe07 << 8); 761 762 ret &= vnt_rf_write_embedded(priv, power_setting); 763 ret &= vnt_rf_write_embedded(priv, 0x03c6a200); 764 765 dev_dbg(&priv->usb->dev, 766 "%s 11b channel [%d]\n", __func__, hw_value); 767 768 hw_value--; 769 770 if (hw_value < ARRAY_SIZE(vt3226d0_lo_current_table)) 771 ret &= vnt_rf_write_embedded(priv, 772 vt3226d0_lo_current_table[hw_value]); 773 774 ret &= vnt_rf_write_embedded(priv, 0x015C0800); 775 } else { 776 dev_dbg(&priv->usb->dev, 777 "@@@@ vnt_rf_set_txpower> 11G mode\n"); 778 779 power_setting = ((0x3f - power) << 20) | (0x7 << 8); 780 781 ret &= vnt_rf_write_embedded(priv, power_setting); 782 ret &= vnt_rf_write_embedded(priv, 0x00C6A200); 783 ret &= vnt_rf_write_embedded(priv, 0x016BC600); 784 ret &= vnt_rf_write_embedded(priv, 0x00900800); 785 } 786 break; 787 788 case RF_VT3342A0: 789 if (power >= VT3342_PWR_IDX_LEN) 790 return false; 791 792 power_setting = ((0x3f - power) << 20) | (0x27 << 8); 793 794 ret &= vnt_rf_write_embedded(priv, power_setting); 795 796 break; 797 default: 798 break; 799 } 800 return ret; 801 } 802 803 /* Convert rssi to dbm */ 804 void vnt_rf_rssi_to_dbm(struct vnt_private *priv, u8 rssi, long *dbm) 805 { 806 u8 idx = (((rssi & 0xc0) >> 6) & 0x03); 807 long b = (rssi & 0x3f); 808 long a = 0; 809 u8 airoharf[4] = {0, 18, 0, 40}; 810 811 switch (priv->rf_type) { 812 case RF_AL2230: 813 case RF_AL2230S: 814 case RF_AIROHA7230: 815 case RF_VT3226: 816 case RF_VT3226D0: 817 case RF_VT3342A0: 818 a = airoharf[idx]; 819 break; 820 default: 821 break; 822 } 823 824 *dbm = -1 * (a + b * 2); 825 } 826 827 void vnt_rf_table_download(struct vnt_private *priv) 828 { 829 u16 length1 = 0, length2 = 0, length3 = 0; 830 u8 *addr1 = NULL, *addr2 = NULL, *addr3 = NULL; 831 u16 length, value; 832 u8 array[256]; 833 834 switch (priv->rf_type) { 835 case RF_AL2230: 836 case RF_AL2230S: 837 length1 = CB_AL2230_INIT_SEQ * 3; 838 length2 = CB_MAX_CHANNEL_24G * 3; 839 length3 = CB_MAX_CHANNEL_24G * 3; 840 addr1 = &al2230_init_table[0][0]; 841 addr2 = &al2230_channel_table0[0][0]; 842 addr3 = &al2230_channel_table1[0][0]; 843 break; 844 case RF_AIROHA7230: 845 length1 = CB_AL7230_INIT_SEQ * 3; 846 length2 = CB_MAX_CHANNEL * 3; 847 length3 = CB_MAX_CHANNEL * 3; 848 addr1 = &al7230_init_table[0][0]; 849 addr2 = &al7230_channel_table0[0][0]; 850 addr3 = &al7230_channel_table1[0][0]; 851 break; 852 case RF_VT3226: 853 length1 = CB_VT3226_INIT_SEQ * 3; 854 length2 = CB_MAX_CHANNEL_24G * 3; 855 length3 = CB_MAX_CHANNEL_24G * 3; 856 addr1 = &vt3226_init_table[0][0]; 857 addr2 = &vt3226_channel_table0[0][0]; 858 addr3 = &vt3226_channel_table1[0][0]; 859 break; 860 case RF_VT3226D0: 861 length1 = CB_VT3226_INIT_SEQ * 3; 862 length2 = CB_MAX_CHANNEL_24G * 3; 863 length3 = CB_MAX_CHANNEL_24G * 3; 864 addr1 = &vt3226d0_init_table[0][0]; 865 addr2 = &vt3226_channel_table0[0][0]; 866 addr3 = &vt3226_channel_table1[0][0]; 867 break; 868 case RF_VT3342A0: 869 length1 = CB_VT3342_INIT_SEQ * 3; 870 length2 = CB_MAX_CHANNEL * 3; 871 length3 = CB_MAX_CHANNEL * 3; 872 addr1 = &vt3342a0_init_table[0][0]; 873 addr2 = &vt3342_channel_table0[0][0]; 874 addr3 = &vt3342_channel_table1[0][0]; 875 break; 876 } 877 878 /* Init Table */ 879 memcpy(array, addr1, length1); 880 881 vnt_control_out(priv, MESSAGE_TYPE_WRITE, 0, 882 MESSAGE_REQUEST_RF_INIT, length1, array); 883 884 /* Channel Table 0 */ 885 value = 0; 886 while (length2 > 0) { 887 if (length2 >= 64) 888 length = 64; 889 else 890 length = length2; 891 892 memcpy(array, addr2, length); 893 894 vnt_control_out(priv, MESSAGE_TYPE_WRITE, 895 value, MESSAGE_REQUEST_RF_CH0, length, array); 896 897 length2 -= length; 898 value += length; 899 addr2 += length; 900 } 901 902 /* Channel table 1 */ 903 value = 0; 904 while (length3 > 0) { 905 if (length3 >= 64) 906 length = 64; 907 else 908 length = length3; 909 910 memcpy(array, addr3, length); 911 912 vnt_control_out(priv, MESSAGE_TYPE_WRITE, 913 value, MESSAGE_REQUEST_RF_CH1, length, array); 914 915 length3 -= length; 916 value += length; 917 addr3 += length; 918 } 919 920 if (priv->rf_type == RF_AIROHA7230) { 921 length1 = CB_AL7230_INIT_SEQ * 3; 922 length2 = CB_MAX_CHANNEL * 3; 923 addr1 = &(al7230_init_table_amode[0][0]); 924 addr2 = &(al7230_channel_table2[0][0]); 925 926 memcpy(array, addr1, length1); 927 928 /* Init Table 2 */ 929 vnt_control_out(priv, MESSAGE_TYPE_WRITE, 930 0, MESSAGE_REQUEST_RF_INIT2, length1, array); 931 932 /* Channel Table 0 */ 933 value = 0; 934 while (length2 > 0) { 935 if (length2 >= 64) 936 length = 64; 937 else 938 length = length2; 939 940 memcpy(array, addr2, length); 941 942 vnt_control_out(priv, MESSAGE_TYPE_WRITE, 943 value, MESSAGE_REQUEST_RF_CH2, length, array); 944 945 length2 -= length; 946 value += length; 947 addr2 += length; 948 } 949 } 950 } 951