linux/drivers/net/wireless/ralink/rt2x00/rt2800lib.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0-or-later
   2/*
   3        Copyright (C) 2010 Willow Garage <http://www.willowgarage.com>
   4        Copyright (C) 2010 Ivo van Doorn <IvDoorn@gmail.com>
   5        Copyright (C) 2009 Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
   6        Copyright (C) 2009 Gertjan van Wingerde <gwingerde@gmail.com>
   7
   8        Based on the original rt2800pci.c and rt2800usb.c.
   9          Copyright (C) 2009 Alban Browaeys <prahal@yahoo.com>
  10          Copyright (C) 2009 Felix Fietkau <nbd@openwrt.org>
  11          Copyright (C) 2009 Luis Correia <luis.f.correia@gmail.com>
  12          Copyright (C) 2009 Mattias Nissler <mattias.nissler@gmx.de>
  13          Copyright (C) 2009 Mark Asselstine <asselsm@gmail.com>
  14          Copyright (C) 2009 Xose Vazquez Perez <xose.vazquez@gmail.com>
  15          <http://rt2x00.serialmonkey.com>
  16
  17 */
  18
  19/*
  20        Module: rt2800lib
  21        Abstract: rt2800 generic device routines.
  22 */
  23
  24#include <linux/crc-ccitt.h>
  25#include <linux/kernel.h>
  26#include <linux/module.h>
  27#include <linux/slab.h>
  28
  29#include "rt2x00.h"
  30#include "rt2800lib.h"
  31#include "rt2800.h"
  32
  33static bool modparam_watchdog;
  34module_param_named(watchdog, modparam_watchdog, bool, S_IRUGO);
  35MODULE_PARM_DESC(watchdog, "Enable watchdog to detect tx/rx hangs and reset hardware if detected");
  36
  37/*
  38 * Register access.
  39 * All access to the CSR registers will go through the methods
  40 * rt2800_register_read and rt2800_register_write.
  41 * BBP and RF register require indirect register access,
  42 * and use the CSR registers BBPCSR and RFCSR to achieve this.
  43 * These indirect registers work with busy bits,
  44 * and we will try maximal REGISTER_BUSY_COUNT times to access
  45 * the register while taking a REGISTER_BUSY_DELAY us delay
  46 * between each attampt. When the busy bit is still set at that time,
  47 * the access attempt is considered to have failed,
  48 * and we will print an error.
  49 * The _lock versions must be used if you already hold the csr_mutex
  50 */
  51#define WAIT_FOR_BBP(__dev, __reg) \
  52        rt2800_regbusy_read((__dev), BBP_CSR_CFG, BBP_CSR_CFG_BUSY, (__reg))
  53#define WAIT_FOR_RFCSR(__dev, __reg) \
  54        rt2800_regbusy_read((__dev), RF_CSR_CFG, RF_CSR_CFG_BUSY, (__reg))
  55#define WAIT_FOR_RFCSR_MT7620(__dev, __reg) \
  56        rt2800_regbusy_read((__dev), RF_CSR_CFG, RF_CSR_CFG_BUSY_MT7620, \
  57                            (__reg))
  58#define WAIT_FOR_RF(__dev, __reg) \
  59        rt2800_regbusy_read((__dev), RF_CSR_CFG0, RF_CSR_CFG0_BUSY, (__reg))
  60#define WAIT_FOR_MCU(__dev, __reg) \
  61        rt2800_regbusy_read((__dev), H2M_MAILBOX_CSR, \
  62                            H2M_MAILBOX_CSR_OWNER, (__reg))
  63
  64static inline bool rt2800_is_305x_soc(struct rt2x00_dev *rt2x00dev)
  65{
  66        /* check for rt2872 on SoC */
  67        if (!rt2x00_is_soc(rt2x00dev) ||
  68            !rt2x00_rt(rt2x00dev, RT2872))
  69                return false;
  70
  71        /* we know for sure that these rf chipsets are used on rt305x boards */
  72        if (rt2x00_rf(rt2x00dev, RF3020) ||
  73            rt2x00_rf(rt2x00dev, RF3021) ||
  74            rt2x00_rf(rt2x00dev, RF3022))
  75                return true;
  76
  77        rt2x00_warn(rt2x00dev, "Unknown RF chipset on rt305x\n");
  78        return false;
  79}
  80
  81static void rt2800_bbp_write(struct rt2x00_dev *rt2x00dev,
  82                             const unsigned int word, const u8 value)
  83{
  84        u32 reg;
  85
  86        mutex_lock(&rt2x00dev->csr_mutex);
  87
  88        /*
  89         * Wait until the BBP becomes available, afterwards we
  90         * can safely write the new data into the register.
  91         */
  92        if (WAIT_FOR_BBP(rt2x00dev, &reg)) {
  93                reg = 0;
  94                rt2x00_set_field32(&reg, BBP_CSR_CFG_VALUE, value);
  95                rt2x00_set_field32(&reg, BBP_CSR_CFG_REGNUM, word);
  96                rt2x00_set_field32(&reg, BBP_CSR_CFG_BUSY, 1);
  97                rt2x00_set_field32(&reg, BBP_CSR_CFG_READ_CONTROL, 0);
  98                rt2x00_set_field32(&reg, BBP_CSR_CFG_BBP_RW_MODE, 1);
  99
 100                rt2800_register_write_lock(rt2x00dev, BBP_CSR_CFG, reg);
 101        }
 102
 103        mutex_unlock(&rt2x00dev->csr_mutex);
 104}
 105
 106static u8 rt2800_bbp_read(struct rt2x00_dev *rt2x00dev, const unsigned int word)
 107{
 108        u32 reg;
 109        u8 value;
 110
 111        mutex_lock(&rt2x00dev->csr_mutex);
 112
 113        /*
 114         * Wait until the BBP becomes available, afterwards we
 115         * can safely write the read request into the register.
 116         * After the data has been written, we wait until hardware
 117         * returns the correct value, if at any time the register
 118         * doesn't become available in time, reg will be 0xffffffff
 119         * which means we return 0xff to the caller.
 120         */
 121        if (WAIT_FOR_BBP(rt2x00dev, &reg)) {
 122                reg = 0;
 123                rt2x00_set_field32(&reg, BBP_CSR_CFG_REGNUM, word);
 124                rt2x00_set_field32(&reg, BBP_CSR_CFG_BUSY, 1);
 125                rt2x00_set_field32(&reg, BBP_CSR_CFG_READ_CONTROL, 1);
 126                rt2x00_set_field32(&reg, BBP_CSR_CFG_BBP_RW_MODE, 1);
 127
 128                rt2800_register_write_lock(rt2x00dev, BBP_CSR_CFG, reg);
 129
 130                WAIT_FOR_BBP(rt2x00dev, &reg);
 131        }
 132
 133        value = rt2x00_get_field32(reg, BBP_CSR_CFG_VALUE);
 134
 135        mutex_unlock(&rt2x00dev->csr_mutex);
 136
 137        return value;
 138}
 139
 140static void rt2800_rfcsr_write(struct rt2x00_dev *rt2x00dev,
 141                               const unsigned int word, const u8 value)
 142{
 143        u32 reg;
 144
 145        mutex_lock(&rt2x00dev->csr_mutex);
 146
 147        /*
 148         * Wait until the RFCSR becomes available, afterwards we
 149         * can safely write the new data into the register.
 150         */
 151        switch (rt2x00dev->chip.rt) {
 152        case RT6352:
 153                if (WAIT_FOR_RFCSR_MT7620(rt2x00dev, &reg)) {
 154                        reg = 0;
 155                        rt2x00_set_field32(&reg, RF_CSR_CFG_DATA_MT7620, value);
 156                        rt2x00_set_field32(&reg, RF_CSR_CFG_REGNUM_MT7620,
 157                                           word);
 158                        rt2x00_set_field32(&reg, RF_CSR_CFG_WRITE_MT7620, 1);
 159                        rt2x00_set_field32(&reg, RF_CSR_CFG_BUSY_MT7620, 1);
 160
 161                        rt2800_register_write_lock(rt2x00dev, RF_CSR_CFG, reg);
 162                }
 163                break;
 164
 165        default:
 166                if (WAIT_FOR_RFCSR(rt2x00dev, &reg)) {
 167                        reg = 0;
 168                        rt2x00_set_field32(&reg, RF_CSR_CFG_DATA, value);
 169                        rt2x00_set_field32(&reg, RF_CSR_CFG_REGNUM, word);
 170                        rt2x00_set_field32(&reg, RF_CSR_CFG_WRITE, 1);
 171                        rt2x00_set_field32(&reg, RF_CSR_CFG_BUSY, 1);
 172
 173                        rt2800_register_write_lock(rt2x00dev, RF_CSR_CFG, reg);
 174                }
 175                break;
 176        }
 177
 178        mutex_unlock(&rt2x00dev->csr_mutex);
 179}
 180
 181static void rt2800_rfcsr_write_bank(struct rt2x00_dev *rt2x00dev, const u8 bank,
 182                                    const unsigned int reg, const u8 value)
 183{
 184        rt2800_rfcsr_write(rt2x00dev, (reg | (bank << 6)), value);
 185}
 186
 187static void rt2800_rfcsr_write_chanreg(struct rt2x00_dev *rt2x00dev,
 188                                       const unsigned int reg, const u8 value)
 189{
 190        rt2800_rfcsr_write_bank(rt2x00dev, 4, reg, value);
 191        rt2800_rfcsr_write_bank(rt2x00dev, 6, reg, value);
 192}
 193
 194static void rt2800_rfcsr_write_dccal(struct rt2x00_dev *rt2x00dev,
 195                                     const unsigned int reg, const u8 value)
 196{
 197        rt2800_rfcsr_write_bank(rt2x00dev, 5, reg, value);
 198        rt2800_rfcsr_write_bank(rt2x00dev, 7, reg, value);
 199}
 200
 201static u8 rt2800_rfcsr_read(struct rt2x00_dev *rt2x00dev,
 202                            const unsigned int word)
 203{
 204        u32 reg;
 205        u8 value;
 206
 207        mutex_lock(&rt2x00dev->csr_mutex);
 208
 209        /*
 210         * Wait until the RFCSR becomes available, afterwards we
 211         * can safely write the read request into the register.
 212         * After the data has been written, we wait until hardware
 213         * returns the correct value, if at any time the register
 214         * doesn't become available in time, reg will be 0xffffffff
 215         * which means we return 0xff to the caller.
 216         */
 217        switch (rt2x00dev->chip.rt) {
 218        case RT6352:
 219                if (WAIT_FOR_RFCSR_MT7620(rt2x00dev, &reg)) {
 220                        reg = 0;
 221                        rt2x00_set_field32(&reg, RF_CSR_CFG_REGNUM_MT7620,
 222                                           word);
 223                        rt2x00_set_field32(&reg, RF_CSR_CFG_WRITE_MT7620, 0);
 224                        rt2x00_set_field32(&reg, RF_CSR_CFG_BUSY_MT7620, 1);
 225
 226                        rt2800_register_write_lock(rt2x00dev, RF_CSR_CFG, reg);
 227
 228                        WAIT_FOR_RFCSR_MT7620(rt2x00dev, &reg);
 229                }
 230
 231                value = rt2x00_get_field32(reg, RF_CSR_CFG_DATA_MT7620);
 232                break;
 233
 234        default:
 235                if (WAIT_FOR_RFCSR(rt2x00dev, &reg)) {
 236                        reg = 0;
 237                        rt2x00_set_field32(&reg, RF_CSR_CFG_REGNUM, word);
 238                        rt2x00_set_field32(&reg, RF_CSR_CFG_WRITE, 0);
 239                        rt2x00_set_field32(&reg, RF_CSR_CFG_BUSY, 1);
 240
 241                        rt2800_register_write_lock(rt2x00dev, RF_CSR_CFG, reg);
 242
 243                        WAIT_FOR_RFCSR(rt2x00dev, &reg);
 244                }
 245
 246                value = rt2x00_get_field32(reg, RF_CSR_CFG_DATA);
 247                break;
 248        }
 249
 250        mutex_unlock(&rt2x00dev->csr_mutex);
 251
 252        return value;
 253}
 254
 255static u8 rt2800_rfcsr_read_bank(struct rt2x00_dev *rt2x00dev, const u8 bank,
 256                                 const unsigned int reg)
 257{
 258        return rt2800_rfcsr_read(rt2x00dev, (reg | (bank << 6)));
 259}
 260
 261static void rt2800_rf_write(struct rt2x00_dev *rt2x00dev,
 262                            const unsigned int word, const u32 value)
 263{
 264        u32 reg;
 265
 266        mutex_lock(&rt2x00dev->csr_mutex);
 267
 268        /*
 269         * Wait until the RF becomes available, afterwards we
 270         * can safely write the new data into the register.
 271         */
 272        if (WAIT_FOR_RF(rt2x00dev, &reg)) {
 273                reg = 0;
 274                rt2x00_set_field32(&reg, RF_CSR_CFG0_REG_VALUE_BW, value);
 275                rt2x00_set_field32(&reg, RF_CSR_CFG0_STANDBYMODE, 0);
 276                rt2x00_set_field32(&reg, RF_CSR_CFG0_SEL, 0);
 277                rt2x00_set_field32(&reg, RF_CSR_CFG0_BUSY, 1);
 278
 279                rt2800_register_write_lock(rt2x00dev, RF_CSR_CFG0, reg);
 280                rt2x00_rf_write(rt2x00dev, word, value);
 281        }
 282
 283        mutex_unlock(&rt2x00dev->csr_mutex);
 284}
 285
 286static const unsigned int rt2800_eeprom_map[EEPROM_WORD_COUNT] = {
 287        [EEPROM_CHIP_ID]                = 0x0000,
 288        [EEPROM_VERSION]                = 0x0001,
 289        [EEPROM_MAC_ADDR_0]             = 0x0002,
 290        [EEPROM_MAC_ADDR_1]             = 0x0003,
 291        [EEPROM_MAC_ADDR_2]             = 0x0004,
 292        [EEPROM_NIC_CONF0]              = 0x001a,
 293        [EEPROM_NIC_CONF1]              = 0x001b,
 294        [EEPROM_FREQ]                   = 0x001d,
 295        [EEPROM_LED_AG_CONF]            = 0x001e,
 296        [EEPROM_LED_ACT_CONF]           = 0x001f,
 297        [EEPROM_LED_POLARITY]           = 0x0020,
 298        [EEPROM_NIC_CONF2]              = 0x0021,
 299        [EEPROM_LNA]                    = 0x0022,
 300        [EEPROM_RSSI_BG]                = 0x0023,
 301        [EEPROM_RSSI_BG2]               = 0x0024,
 302        [EEPROM_TXMIXER_GAIN_BG]        = 0x0024, /* overlaps with RSSI_BG2 */
 303        [EEPROM_RSSI_A]                 = 0x0025,
 304        [EEPROM_RSSI_A2]                = 0x0026,
 305        [EEPROM_TXMIXER_GAIN_A]         = 0x0026, /* overlaps with RSSI_A2 */
 306        [EEPROM_EIRP_MAX_TX_POWER]      = 0x0027,
 307        [EEPROM_TXPOWER_DELTA]          = 0x0028,
 308        [EEPROM_TXPOWER_BG1]            = 0x0029,
 309        [EEPROM_TXPOWER_BG2]            = 0x0030,
 310        [EEPROM_TSSI_BOUND_BG1]         = 0x0037,
 311        [EEPROM_TSSI_BOUND_BG2]         = 0x0038,
 312        [EEPROM_TSSI_BOUND_BG3]         = 0x0039,
 313        [EEPROM_TSSI_BOUND_BG4]         = 0x003a,
 314        [EEPROM_TSSI_BOUND_BG5]         = 0x003b,
 315        [EEPROM_TXPOWER_A1]             = 0x003c,
 316        [EEPROM_TXPOWER_A2]             = 0x0053,
 317        [EEPROM_TXPOWER_INIT]           = 0x0068,
 318        [EEPROM_TSSI_BOUND_A1]          = 0x006a,
 319        [EEPROM_TSSI_BOUND_A2]          = 0x006b,
 320        [EEPROM_TSSI_BOUND_A3]          = 0x006c,
 321        [EEPROM_TSSI_BOUND_A4]          = 0x006d,
 322        [EEPROM_TSSI_BOUND_A5]          = 0x006e,
 323        [EEPROM_TXPOWER_BYRATE]         = 0x006f,
 324        [EEPROM_BBP_START]              = 0x0078,
 325};
 326
 327static const unsigned int rt2800_eeprom_map_ext[EEPROM_WORD_COUNT] = {
 328        [EEPROM_CHIP_ID]                = 0x0000,
 329        [EEPROM_VERSION]                = 0x0001,
 330        [EEPROM_MAC_ADDR_0]             = 0x0002,
 331        [EEPROM_MAC_ADDR_1]             = 0x0003,
 332        [EEPROM_MAC_ADDR_2]             = 0x0004,
 333        [EEPROM_NIC_CONF0]              = 0x001a,
 334        [EEPROM_NIC_CONF1]              = 0x001b,
 335        [EEPROM_NIC_CONF2]              = 0x001c,
 336        [EEPROM_EIRP_MAX_TX_POWER]      = 0x0020,
 337        [EEPROM_FREQ]                   = 0x0022,
 338        [EEPROM_LED_AG_CONF]            = 0x0023,
 339        [EEPROM_LED_ACT_CONF]           = 0x0024,
 340        [EEPROM_LED_POLARITY]           = 0x0025,
 341        [EEPROM_LNA]                    = 0x0026,
 342        [EEPROM_EXT_LNA2]               = 0x0027,
 343        [EEPROM_RSSI_BG]                = 0x0028,
 344        [EEPROM_RSSI_BG2]               = 0x0029,
 345        [EEPROM_RSSI_A]                 = 0x002a,
 346        [EEPROM_RSSI_A2]                = 0x002b,
 347        [EEPROM_TXPOWER_BG1]            = 0x0030,
 348        [EEPROM_TXPOWER_BG2]            = 0x0037,
 349        [EEPROM_EXT_TXPOWER_BG3]        = 0x003e,
 350        [EEPROM_TSSI_BOUND_BG1]         = 0x0045,
 351        [EEPROM_TSSI_BOUND_BG2]         = 0x0046,
 352        [EEPROM_TSSI_BOUND_BG3]         = 0x0047,
 353        [EEPROM_TSSI_BOUND_BG4]         = 0x0048,
 354        [EEPROM_TSSI_BOUND_BG5]         = 0x0049,
 355        [EEPROM_TXPOWER_A1]             = 0x004b,
 356        [EEPROM_TXPOWER_A2]             = 0x0065,
 357        [EEPROM_EXT_TXPOWER_A3]         = 0x007f,
 358        [EEPROM_TSSI_BOUND_A1]          = 0x009a,
 359        [EEPROM_TSSI_BOUND_A2]          = 0x009b,
 360        [EEPROM_TSSI_BOUND_A3]          = 0x009c,
 361        [EEPROM_TSSI_BOUND_A4]          = 0x009d,
 362        [EEPROM_TSSI_BOUND_A5]          = 0x009e,
 363        [EEPROM_TXPOWER_BYRATE]         = 0x00a0,
 364};
 365
 366static unsigned int rt2800_eeprom_word_index(struct rt2x00_dev *rt2x00dev,
 367                                             const enum rt2800_eeprom_word word)
 368{
 369        const unsigned int *map;
 370        unsigned int index;
 371
 372        if (WARN_ONCE(word >= EEPROM_WORD_COUNT,
 373                      "%s: invalid EEPROM word %d\n",
 374                      wiphy_name(rt2x00dev->hw->wiphy), word))
 375                return 0;
 376
 377        if (rt2x00_rt(rt2x00dev, RT3593) ||
 378            rt2x00_rt(rt2x00dev, RT3883))
 379                map = rt2800_eeprom_map_ext;
 380        else
 381                map = rt2800_eeprom_map;
 382
 383        index = map[word];
 384
 385        /* Index 0 is valid only for EEPROM_CHIP_ID.
 386         * Otherwise it means that the offset of the
 387         * given word is not initialized in the map,
 388         * or that the field is not usable on the
 389         * actual chipset.
 390         */
 391        WARN_ONCE(word != EEPROM_CHIP_ID && index == 0,
 392                  "%s: invalid access of EEPROM word %d\n",
 393                  wiphy_name(rt2x00dev->hw->wiphy), word);
 394
 395        return index;
 396}
 397
 398static void *rt2800_eeprom_addr(struct rt2x00_dev *rt2x00dev,
 399                                const enum rt2800_eeprom_word word)
 400{
 401        unsigned int index;
 402
 403        index = rt2800_eeprom_word_index(rt2x00dev, word);
 404        return rt2x00_eeprom_addr(rt2x00dev, index);
 405}
 406
 407static u16 rt2800_eeprom_read(struct rt2x00_dev *rt2x00dev,
 408                              const enum rt2800_eeprom_word word)
 409{
 410        unsigned int index;
 411
 412        index = rt2800_eeprom_word_index(rt2x00dev, word);
 413        return rt2x00_eeprom_read(rt2x00dev, index);
 414}
 415
 416static void rt2800_eeprom_write(struct rt2x00_dev *rt2x00dev,
 417                                const enum rt2800_eeprom_word word, u16 data)
 418{
 419        unsigned int index;
 420
 421        index = rt2800_eeprom_word_index(rt2x00dev, word);
 422        rt2x00_eeprom_write(rt2x00dev, index, data);
 423}
 424
 425static u16 rt2800_eeprom_read_from_array(struct rt2x00_dev *rt2x00dev,
 426                                         const enum rt2800_eeprom_word array,
 427                                         unsigned int offset)
 428{
 429        unsigned int index;
 430
 431        index = rt2800_eeprom_word_index(rt2x00dev, array);
 432        return rt2x00_eeprom_read(rt2x00dev, index + offset);
 433}
 434
 435static int rt2800_enable_wlan_rt3290(struct rt2x00_dev *rt2x00dev)
 436{
 437        u32 reg;
 438        int i, count;
 439
 440        reg = rt2800_register_read(rt2x00dev, WLAN_FUN_CTRL);
 441        rt2x00_set_field32(&reg, WLAN_GPIO_OUT_OE_BIT_ALL, 0xff);
 442        rt2x00_set_field32(&reg, FRC_WL_ANT_SET, 1);
 443        rt2x00_set_field32(&reg, WLAN_CLK_EN, 0);
 444        rt2x00_set_field32(&reg, WLAN_EN, 1);
 445        rt2800_register_write(rt2x00dev, WLAN_FUN_CTRL, reg);
 446
 447        udelay(REGISTER_BUSY_DELAY);
 448
 449        count = 0;
 450        do {
 451                /*
 452                 * Check PLL_LD & XTAL_RDY.
 453                 */
 454                for (i = 0; i < REGISTER_BUSY_COUNT; i++) {
 455                        reg = rt2800_register_read(rt2x00dev, CMB_CTRL);
 456                        if (rt2x00_get_field32(reg, PLL_LD) &&
 457                            rt2x00_get_field32(reg, XTAL_RDY))
 458                                break;
 459                        udelay(REGISTER_BUSY_DELAY);
 460                }
 461
 462                if (i >= REGISTER_BUSY_COUNT) {
 463
 464                        if (count >= 10)
 465                                return -EIO;
 466
 467                        rt2800_register_write(rt2x00dev, 0x58, 0x018);
 468                        udelay(REGISTER_BUSY_DELAY);
 469                        rt2800_register_write(rt2x00dev, 0x58, 0x418);
 470                        udelay(REGISTER_BUSY_DELAY);
 471                        rt2800_register_write(rt2x00dev, 0x58, 0x618);
 472                        udelay(REGISTER_BUSY_DELAY);
 473                        count++;
 474                } else {
 475                        count = 0;
 476                }
 477
 478                reg = rt2800_register_read(rt2x00dev, WLAN_FUN_CTRL);
 479                rt2x00_set_field32(&reg, PCIE_APP0_CLK_REQ, 0);
 480                rt2x00_set_field32(&reg, WLAN_CLK_EN, 1);
 481                rt2x00_set_field32(&reg, WLAN_RESET, 1);
 482                rt2800_register_write(rt2x00dev, WLAN_FUN_CTRL, reg);
 483                udelay(10);
 484                rt2x00_set_field32(&reg, WLAN_RESET, 0);
 485                rt2800_register_write(rt2x00dev, WLAN_FUN_CTRL, reg);
 486                udelay(10);
 487                rt2800_register_write(rt2x00dev, INT_SOURCE_CSR, 0x7fffffff);
 488        } while (count != 0);
 489
 490        return 0;
 491}
 492
 493void rt2800_mcu_request(struct rt2x00_dev *rt2x00dev,
 494                        const u8 command, const u8 token,
 495                        const u8 arg0, const u8 arg1)
 496{
 497        u32 reg;
 498
 499        /*
 500         * SOC devices don't support MCU requests.
 501         */
 502        if (rt2x00_is_soc(rt2x00dev))
 503                return;
 504
 505        mutex_lock(&rt2x00dev->csr_mutex);
 506
 507        /*
 508         * Wait until the MCU becomes available, afterwards we
 509         * can safely write the new data into the register.
 510         */
 511        if (WAIT_FOR_MCU(rt2x00dev, &reg)) {
 512                rt2x00_set_field32(&reg, H2M_MAILBOX_CSR_OWNER, 1);
 513                rt2x00_set_field32(&reg, H2M_MAILBOX_CSR_CMD_TOKEN, token);
 514                rt2x00_set_field32(&reg, H2M_MAILBOX_CSR_ARG0, arg0);
 515                rt2x00_set_field32(&reg, H2M_MAILBOX_CSR_ARG1, arg1);
 516                rt2800_register_write_lock(rt2x00dev, H2M_MAILBOX_CSR, reg);
 517
 518                reg = 0;
 519                rt2x00_set_field32(&reg, HOST_CMD_CSR_HOST_COMMAND, command);
 520                rt2800_register_write_lock(rt2x00dev, HOST_CMD_CSR, reg);
 521        }
 522
 523        mutex_unlock(&rt2x00dev->csr_mutex);
 524}
 525EXPORT_SYMBOL_GPL(rt2800_mcu_request);
 526
 527int rt2800_wait_csr_ready(struct rt2x00_dev *rt2x00dev)
 528{
 529        unsigned int i = 0;
 530        u32 reg;
 531
 532        for (i = 0; i < REGISTER_BUSY_COUNT; i++) {
 533                reg = rt2800_register_read(rt2x00dev, MAC_CSR0);
 534                if (reg && reg != ~0)
 535                        return 0;
 536                msleep(1);
 537        }
 538
 539        rt2x00_err(rt2x00dev, "Unstable hardware\n");
 540        return -EBUSY;
 541}
 542EXPORT_SYMBOL_GPL(rt2800_wait_csr_ready);
 543
 544int rt2800_wait_wpdma_ready(struct rt2x00_dev *rt2x00dev)
 545{
 546        unsigned int i;
 547        u32 reg;
 548
 549        /*
 550         * Some devices are really slow to respond here. Wait a whole second
 551         * before timing out.
 552         */
 553        for (i = 0; i < REGISTER_BUSY_COUNT; i++) {
 554                reg = rt2800_register_read(rt2x00dev, WPDMA_GLO_CFG);
 555                if (!rt2x00_get_field32(reg, WPDMA_GLO_CFG_TX_DMA_BUSY) &&
 556                    !rt2x00_get_field32(reg, WPDMA_GLO_CFG_RX_DMA_BUSY))
 557                        return 0;
 558
 559                msleep(10);
 560        }
 561
 562        rt2x00_err(rt2x00dev, "WPDMA TX/RX busy [0x%08x]\n", reg);
 563        return -EACCES;
 564}
 565EXPORT_SYMBOL_GPL(rt2800_wait_wpdma_ready);
 566
 567void rt2800_disable_wpdma(struct rt2x00_dev *rt2x00dev)
 568{
 569        u32 reg;
 570
 571        reg = rt2800_register_read(rt2x00dev, WPDMA_GLO_CFG);
 572        rt2x00_set_field32(&reg, WPDMA_GLO_CFG_ENABLE_TX_DMA, 0);
 573        rt2x00_set_field32(&reg, WPDMA_GLO_CFG_TX_DMA_BUSY, 0);
 574        rt2x00_set_field32(&reg, WPDMA_GLO_CFG_ENABLE_RX_DMA, 0);
 575        rt2x00_set_field32(&reg, WPDMA_GLO_CFG_RX_DMA_BUSY, 0);
 576        rt2x00_set_field32(&reg, WPDMA_GLO_CFG_TX_WRITEBACK_DONE, 1);
 577        rt2800_register_write(rt2x00dev, WPDMA_GLO_CFG, reg);
 578}
 579EXPORT_SYMBOL_GPL(rt2800_disable_wpdma);
 580
 581void rt2800_get_txwi_rxwi_size(struct rt2x00_dev *rt2x00dev,
 582                               unsigned short *txwi_size,
 583                               unsigned short *rxwi_size)
 584{
 585        switch (rt2x00dev->chip.rt) {
 586        case RT3593:
 587        case RT3883:
 588                *txwi_size = TXWI_DESC_SIZE_4WORDS;
 589                *rxwi_size = RXWI_DESC_SIZE_5WORDS;
 590                break;
 591
 592        case RT5592:
 593        case RT6352:
 594                *txwi_size = TXWI_DESC_SIZE_5WORDS;
 595                *rxwi_size = RXWI_DESC_SIZE_6WORDS;
 596                break;
 597
 598        default:
 599                *txwi_size = TXWI_DESC_SIZE_4WORDS;
 600                *rxwi_size = RXWI_DESC_SIZE_4WORDS;
 601                break;
 602        }
 603}
 604EXPORT_SYMBOL_GPL(rt2800_get_txwi_rxwi_size);
 605
 606static bool rt2800_check_firmware_crc(const u8 *data, const size_t len)
 607{
 608        u16 fw_crc;
 609        u16 crc;
 610
 611        /*
 612         * The last 2 bytes in the firmware array are the crc checksum itself,
 613         * this means that we should never pass those 2 bytes to the crc
 614         * algorithm.
 615         */
 616        fw_crc = (data[len - 2] << 8 | data[len - 1]);
 617
 618        /*
 619         * Use the crc ccitt algorithm.
 620         * This will return the same value as the legacy driver which
 621         * used bit ordering reversion on the both the firmware bytes
 622         * before input input as well as on the final output.
 623         * Obviously using crc ccitt directly is much more efficient.
 624         */
 625        crc = crc_ccitt(~0, data, len - 2);
 626
 627        /*
 628         * There is a small difference between the crc-itu-t + bitrev and
 629         * the crc-ccitt crc calculation. In the latter method the 2 bytes
 630         * will be swapped, use swab16 to convert the crc to the correct
 631         * value.
 632         */
 633        crc = swab16(crc);
 634
 635        return fw_crc == crc;
 636}
 637
 638int rt2800_check_firmware(struct rt2x00_dev *rt2x00dev,
 639                          const u8 *data, const size_t len)
 640{
 641        size_t offset = 0;
 642        size_t fw_len;
 643        bool multiple;
 644
 645        /*
 646         * PCI(e) & SOC devices require firmware with a length
 647         * of 8kb. USB devices require firmware files with a length
 648         * of 4kb. Certain USB chipsets however require different firmware,
 649         * which Ralink only provides attached to the original firmware
 650         * file. Thus for USB devices, firmware files have a length
 651         * which is a multiple of 4kb. The firmware for rt3290 chip also
 652         * have a length which is a multiple of 4kb.
 653         */
 654        if (rt2x00_is_usb(rt2x00dev) || rt2x00_rt(rt2x00dev, RT3290))
 655                fw_len = 4096;
 656        else
 657                fw_len = 8192;
 658
 659        multiple = true;
 660        /*
 661         * Validate the firmware length
 662         */
 663        if (len != fw_len && (!multiple || (len % fw_len) != 0))
 664                return FW_BAD_LENGTH;
 665
 666        /*
 667         * Check if the chipset requires one of the upper parts
 668         * of the firmware.
 669         */
 670        if (rt2x00_is_usb(rt2x00dev) &&
 671            !rt2x00_rt(rt2x00dev, RT2860) &&
 672            !rt2x00_rt(rt2x00dev, RT2872) &&
 673            !rt2x00_rt(rt2x00dev, RT3070) &&
 674            ((len / fw_len) == 1))
 675                return FW_BAD_VERSION;
 676
 677        /*
 678         * 8kb firmware files must be checked as if it were
 679         * 2 separate firmware files.
 680         */
 681        while (offset < len) {
 682                if (!rt2800_check_firmware_crc(data + offset, fw_len))
 683                        return FW_BAD_CRC;
 684
 685                offset += fw_len;
 686        }
 687
 688        return FW_OK;
 689}
 690EXPORT_SYMBOL_GPL(rt2800_check_firmware);
 691
 692int rt2800_load_firmware(struct rt2x00_dev *rt2x00dev,
 693                         const u8 *data, const size_t len)
 694{
 695        unsigned int i;
 696        u32 reg;
 697        int retval;
 698
 699        if (rt2x00_rt(rt2x00dev, RT3290)) {
 700                retval = rt2800_enable_wlan_rt3290(rt2x00dev);
 701                if (retval)
 702                        return -EBUSY;
 703        }
 704
 705        /*
 706         * If driver doesn't wake up firmware here,
 707         * rt2800_load_firmware will hang forever when interface is up again.
 708         */
 709        rt2800_register_write(rt2x00dev, AUTOWAKEUP_CFG, 0x00000000);
 710
 711        /*
 712         * Wait for stable hardware.
 713         */
 714        if (rt2800_wait_csr_ready(rt2x00dev))
 715                return -EBUSY;
 716
 717        if (rt2x00_is_pci(rt2x00dev)) {
 718                if (rt2x00_rt(rt2x00dev, RT3290) ||
 719                    rt2x00_rt(rt2x00dev, RT3572) ||
 720                    rt2x00_rt(rt2x00dev, RT5390) ||
 721                    rt2x00_rt(rt2x00dev, RT5392)) {
 722                        reg = rt2800_register_read(rt2x00dev, AUX_CTRL);
 723                        rt2x00_set_field32(&reg, AUX_CTRL_FORCE_PCIE_CLK, 1);
 724                        rt2x00_set_field32(&reg, AUX_CTRL_WAKE_PCIE_EN, 1);
 725                        rt2800_register_write(rt2x00dev, AUX_CTRL, reg);
 726                }
 727                rt2800_register_write(rt2x00dev, PWR_PIN_CFG, 0x00000002);
 728        }
 729
 730        rt2800_disable_wpdma(rt2x00dev);
 731
 732        /*
 733         * Write firmware to the device.
 734         */
 735        rt2800_drv_write_firmware(rt2x00dev, data, len);
 736
 737        /*
 738         * Wait for device to stabilize.
 739         */
 740        for (i = 0; i < REGISTER_BUSY_COUNT; i++) {
 741                reg = rt2800_register_read(rt2x00dev, PBF_SYS_CTRL);
 742                if (rt2x00_get_field32(reg, PBF_SYS_CTRL_READY))
 743                        break;
 744                msleep(1);
 745        }
 746
 747        if (i == REGISTER_BUSY_COUNT) {
 748                rt2x00_err(rt2x00dev, "PBF system register not ready\n");
 749                return -EBUSY;
 750        }
 751
 752        /*
 753         * Disable DMA, will be reenabled later when enabling
 754         * the radio.
 755         */
 756        rt2800_disable_wpdma(rt2x00dev);
 757
 758        /*
 759         * Initialize firmware.
 760         */
 761        rt2800_register_write(rt2x00dev, H2M_BBP_AGENT, 0);
 762        rt2800_register_write(rt2x00dev, H2M_MAILBOX_CSR, 0);
 763        if (rt2x00_is_usb(rt2x00dev)) {
 764                rt2800_register_write(rt2x00dev, H2M_INT_SRC, 0);
 765                rt2800_mcu_request(rt2x00dev, MCU_BOOT_SIGNAL, 0, 0, 0);
 766        }
 767        msleep(1);
 768
 769        return 0;
 770}
 771EXPORT_SYMBOL_GPL(rt2800_load_firmware);
 772
 773void rt2800_write_tx_data(struct queue_entry *entry,
 774                          struct txentry_desc *txdesc)
 775{
 776        __le32 *txwi = rt2800_drv_get_txwi(entry);
 777        u32 word;
 778        int i;
 779
 780        /*
 781         * Initialize TX Info descriptor
 782         */
 783        word = rt2x00_desc_read(txwi, 0);
 784        rt2x00_set_field32(&word, TXWI_W0_FRAG,
 785                           test_bit(ENTRY_TXD_MORE_FRAG, &txdesc->flags));
 786        rt2x00_set_field32(&word, TXWI_W0_MIMO_PS,
 787                           test_bit(ENTRY_TXD_HT_MIMO_PS, &txdesc->flags));
 788        rt2x00_set_field32(&word, TXWI_W0_CF_ACK, 0);
 789        rt2x00_set_field32(&word, TXWI_W0_TS,
 790                           test_bit(ENTRY_TXD_REQ_TIMESTAMP, &txdesc->flags));
 791        rt2x00_set_field32(&word, TXWI_W0_AMPDU,
 792                           test_bit(ENTRY_TXD_HT_AMPDU, &txdesc->flags));
 793        rt2x00_set_field32(&word, TXWI_W0_MPDU_DENSITY,
 794                           txdesc->u.ht.mpdu_density);
 795        rt2x00_set_field32(&word, TXWI_W0_TX_OP, txdesc->u.ht.txop);
 796        rt2x00_set_field32(&word, TXWI_W0_MCS, txdesc->u.ht.mcs);
 797        rt2x00_set_field32(&word, TXWI_W0_BW,
 798                           test_bit(ENTRY_TXD_HT_BW_40, &txdesc->flags));
 799        rt2x00_set_field32(&word, TXWI_W0_SHORT_GI,
 800                           test_bit(ENTRY_TXD_HT_SHORT_GI, &txdesc->flags));
 801        rt2x00_set_field32(&word, TXWI_W0_STBC, txdesc->u.ht.stbc);
 802        rt2x00_set_field32(&word, TXWI_W0_PHYMODE, txdesc->rate_mode);
 803        rt2x00_desc_write(txwi, 0, word);
 804
 805        word = rt2x00_desc_read(txwi, 1);
 806        rt2x00_set_field32(&word, TXWI_W1_ACK,
 807                           test_bit(ENTRY_TXD_ACK, &txdesc->flags));
 808        rt2x00_set_field32(&word, TXWI_W1_NSEQ,
 809                           test_bit(ENTRY_TXD_GENERATE_SEQ, &txdesc->flags));
 810        rt2x00_set_field32(&word, TXWI_W1_BW_WIN_SIZE, txdesc->u.ht.ba_size);
 811        rt2x00_set_field32(&word, TXWI_W1_WIRELESS_CLI_ID,
 812                           test_bit(ENTRY_TXD_ENCRYPT, &txdesc->flags) ?
 813                           txdesc->key_idx : txdesc->u.ht.wcid);
 814        rt2x00_set_field32(&word, TXWI_W1_MPDU_TOTAL_BYTE_COUNT,
 815                           txdesc->length);
 816        rt2x00_set_field32(&word, TXWI_W1_PACKETID_QUEUE, entry->queue->qid);
 817        rt2x00_set_field32(&word, TXWI_W1_PACKETID_ENTRY, (entry->entry_idx % 3) + 1);
 818        rt2x00_desc_write(txwi, 1, word);
 819
 820        /*
 821         * Always write 0 to IV/EIV fields (word 2 and 3), hardware will insert
 822         * the IV from the IVEIV register when TXD_W3_WIV is set to 0.
 823         * When TXD_W3_WIV is set to 1 it will use the IV data
 824         * from the descriptor. The TXWI_W1_WIRELESS_CLI_ID indicates which
 825         * crypto entry in the registers should be used to encrypt the frame.
 826         *
 827         * Nulify all remaining words as well, we don't know how to program them.
 828         */
 829        for (i = 2; i < entry->queue->winfo_size / sizeof(__le32); i++)
 830                _rt2x00_desc_write(txwi, i, 0);
 831}
 832EXPORT_SYMBOL_GPL(rt2800_write_tx_data);
 833
 834static int rt2800_agc_to_rssi(struct rt2x00_dev *rt2x00dev, u32 rxwi_w2)
 835{
 836        s8 rssi0 = rt2x00_get_field32(rxwi_w2, RXWI_W2_RSSI0);
 837        s8 rssi1 = rt2x00_get_field32(rxwi_w2, RXWI_W2_RSSI1);
 838        s8 rssi2 = rt2x00_get_field32(rxwi_w2, RXWI_W2_RSSI2);
 839        u16 eeprom;
 840        u8 offset0;
 841        u8 offset1;
 842        u8 offset2;
 843
 844        if (rt2x00dev->curr_band == NL80211_BAND_2GHZ) {
 845                eeprom = rt2800_eeprom_read(rt2x00dev, EEPROM_RSSI_BG);
 846                offset0 = rt2x00_get_field16(eeprom, EEPROM_RSSI_BG_OFFSET0);
 847                offset1 = rt2x00_get_field16(eeprom, EEPROM_RSSI_BG_OFFSET1);
 848                eeprom = rt2800_eeprom_read(rt2x00dev, EEPROM_RSSI_BG2);
 849                offset2 = rt2x00_get_field16(eeprom, EEPROM_RSSI_BG2_OFFSET2);
 850        } else {
 851                eeprom = rt2800_eeprom_read(rt2x00dev, EEPROM_RSSI_A);
 852                offset0 = rt2x00_get_field16(eeprom, EEPROM_RSSI_A_OFFSET0);
 853                offset1 = rt2x00_get_field16(eeprom, EEPROM_RSSI_A_OFFSET1);
 854                eeprom = rt2800_eeprom_read(rt2x00dev, EEPROM_RSSI_A2);
 855                offset2 = rt2x00_get_field16(eeprom, EEPROM_RSSI_A2_OFFSET2);
 856        }
 857
 858        /*
 859         * Convert the value from the descriptor into the RSSI value
 860         * If the value in the descriptor is 0, it is considered invalid
 861         * and the default (extremely low) rssi value is assumed
 862         */
 863        rssi0 = (rssi0) ? (-12 - offset0 - rt2x00dev->lna_gain - rssi0) : -128;
 864        rssi1 = (rssi1) ? (-12 - offset1 - rt2x00dev->lna_gain - rssi1) : -128;
 865        rssi2 = (rssi2) ? (-12 - offset2 - rt2x00dev->lna_gain - rssi2) : -128;
 866
 867        /*
 868         * mac80211 only accepts a single RSSI value. Calculating the
 869         * average doesn't deliver a fair answer either since -60:-60 would
 870         * be considered equally good as -50:-70 while the second is the one
 871         * which gives less energy...
 872         */
 873        rssi0 = max(rssi0, rssi1);
 874        return (int)max(rssi0, rssi2);
 875}
 876
 877void rt2800_process_rxwi(struct queue_entry *entry,
 878                         struct rxdone_entry_desc *rxdesc)
 879{
 880        __le32 *rxwi = (__le32 *) entry->skb->data;
 881        u32 word;
 882
 883        word = rt2x00_desc_read(rxwi, 0);
 884
 885        rxdesc->cipher = rt2x00_get_field32(word, RXWI_W0_UDF);
 886        rxdesc->size = rt2x00_get_field32(word, RXWI_W0_MPDU_TOTAL_BYTE_COUNT);
 887
 888        word = rt2x00_desc_read(rxwi, 1);
 889
 890        if (rt2x00_get_field32(word, RXWI_W1_SHORT_GI))
 891                rxdesc->enc_flags |= RX_ENC_FLAG_SHORT_GI;
 892
 893        if (rt2x00_get_field32(word, RXWI_W1_BW))
 894                rxdesc->bw = RATE_INFO_BW_40;
 895
 896        /*
 897         * Detect RX rate, always use MCS as signal type.
 898         */
 899        rxdesc->dev_flags |= RXDONE_SIGNAL_MCS;
 900        rxdesc->signal = rt2x00_get_field32(word, RXWI_W1_MCS);
 901        rxdesc->rate_mode = rt2x00_get_field32(word, RXWI_W1_PHYMODE);
 902
 903        /*
 904         * Mask of 0x8 bit to remove the short preamble flag.
 905         */
 906        if (rxdesc->rate_mode == RATE_MODE_CCK)
 907                rxdesc->signal &= ~0x8;
 908
 909        word = rt2x00_desc_read(rxwi, 2);
 910
 911        /*
 912         * Convert descriptor AGC value to RSSI value.
 913         */
 914        rxdesc->rssi = rt2800_agc_to_rssi(entry->queue->rt2x00dev, word);
 915        /*
 916         * Remove RXWI descriptor from start of the buffer.
 917         */
 918        skb_pull(entry->skb, entry->queue->winfo_size);
 919}
 920EXPORT_SYMBOL_GPL(rt2800_process_rxwi);
 921
 922static void rt2800_rate_from_status(struct skb_frame_desc *skbdesc,
 923                                    u32 status, enum nl80211_band band)
 924{
 925        u8 flags = 0;
 926        u8 idx = rt2x00_get_field32(status, TX_STA_FIFO_MCS);
 927
 928        switch (rt2x00_get_field32(status, TX_STA_FIFO_PHYMODE)) {
 929        case RATE_MODE_HT_GREENFIELD:
 930                flags |= IEEE80211_TX_RC_GREEN_FIELD;
 931                /* fall through */
 932        case RATE_MODE_HT_MIX:
 933                flags |= IEEE80211_TX_RC_MCS;
 934                break;
 935        case RATE_MODE_OFDM:
 936                if (band == NL80211_BAND_2GHZ)
 937                        idx += 4;
 938                break;
 939        case RATE_MODE_CCK:
 940                if (idx >= 8)
 941                        idx -= 8;
 942                break;
 943        }
 944
 945        if (rt2x00_get_field32(status, TX_STA_FIFO_BW))
 946                flags |= IEEE80211_TX_RC_40_MHZ_WIDTH;
 947
 948        if (rt2x00_get_field32(status, TX_STA_FIFO_SGI))
 949                flags |= IEEE80211_TX_RC_SHORT_GI;
 950
 951        skbdesc->tx_rate_idx = idx;
 952        skbdesc->tx_rate_flags = flags;
 953}
 954
 955static bool rt2800_txdone_entry_check(struct queue_entry *entry, u32 reg)
 956{
 957        __le32 *txwi;
 958        u32 word;
 959        int wcid, ack, pid;
 960        int tx_wcid, tx_ack, tx_pid, is_agg;
 961
 962        /*
 963         * This frames has returned with an IO error,
 964         * so the status report is not intended for this
 965         * frame.
 966         */
 967        if (test_bit(ENTRY_DATA_IO_FAILED, &entry->flags))
 968                return false;
 969
 970        wcid    = rt2x00_get_field32(reg, TX_STA_FIFO_WCID);
 971        ack     = rt2x00_get_field32(reg, TX_STA_FIFO_TX_ACK_REQUIRED);
 972        pid     = rt2x00_get_field32(reg, TX_STA_FIFO_PID_TYPE);
 973        is_agg  = rt2x00_get_field32(reg, TX_STA_FIFO_TX_AGGRE);
 974
 975        /*
 976         * Validate if this TX status report is intended for
 977         * this entry by comparing the WCID/ACK/PID fields.
 978         */
 979        txwi = rt2800_drv_get_txwi(entry);
 980
 981        word = rt2x00_desc_read(txwi, 1);
 982        tx_wcid = rt2x00_get_field32(word, TXWI_W1_WIRELESS_CLI_ID);
 983        tx_ack  = rt2x00_get_field32(word, TXWI_W1_ACK);
 984        tx_pid  = rt2x00_get_field32(word, TXWI_W1_PACKETID);
 985
 986        if (wcid != tx_wcid || ack != tx_ack || (!is_agg && pid != tx_pid)) {
 987                rt2x00_dbg(entry->queue->rt2x00dev,
 988                           "TX status report missed for queue %d entry %d\n",
 989                           entry->queue->qid, entry->entry_idx);
 990                return false;
 991        }
 992
 993        return true;
 994}
 995
 996void rt2800_txdone_entry(struct queue_entry *entry, u32 status, __le32 *txwi,
 997                         bool match)
 998{
 999        struct rt2x00_dev *rt2x00dev = entry->queue->rt2x00dev;
1000        struct rt2800_drv_data *drv_data = rt2x00dev->drv_data;
1001        struct skb_frame_desc *skbdesc = get_skb_frame_desc(entry->skb);
1002        struct txdone_entry_desc txdesc;
1003        u32 word;
1004        u16 mcs, real_mcs;
1005        int aggr, ampdu, wcid, ack_req;
1006
1007        /*
1008         * Obtain the status about this packet.
1009         */
1010        txdesc.flags = 0;
1011        word = rt2x00_desc_read(txwi, 0);
1012
1013        mcs = rt2x00_get_field32(word, TXWI_W0_MCS);
1014        ampdu = rt2x00_get_field32(word, TXWI_W0_AMPDU);
1015
1016        real_mcs = rt2x00_get_field32(status, TX_STA_FIFO_MCS);
1017        aggr = rt2x00_get_field32(status, TX_STA_FIFO_TX_AGGRE);
1018        wcid = rt2x00_get_field32(status, TX_STA_FIFO_WCID);
1019        ack_req = rt2x00_get_field32(status, TX_STA_FIFO_TX_ACK_REQUIRED);
1020
1021        /*
1022         * If a frame was meant to be sent as a single non-aggregated MPDU
1023         * but ended up in an aggregate the used tx rate doesn't correlate
1024         * with the one specified in the TXWI as the whole aggregate is sent
1025         * with the same rate.
1026         *
1027         * For example: two frames are sent to rt2x00, the first one sets
1028         * AMPDU=1 and requests MCS7 whereas the second frame sets AMDPU=0
1029         * and requests MCS15. If the hw aggregates both frames into one
1030         * AMDPU the tx status for both frames will contain MCS7 although
1031         * the frame was sent successfully.
1032         *
1033         * Hence, replace the requested rate with the real tx rate to not
1034         * confuse the rate control algortihm by providing clearly wrong
1035         * data.
1036         *
1037         * FIXME: if we do not find matching entry, we tell that frame was
1038         * posted without any retries. We need to find a way to fix that
1039         * and provide retry count.
1040         */
1041        if (unlikely((aggr == 1 && ampdu == 0 && real_mcs != mcs)) || !match) {
1042                rt2800_rate_from_status(skbdesc, status, rt2x00dev->curr_band);
1043                mcs = real_mcs;
1044        }
1045
1046        if (aggr == 1 || ampdu == 1)
1047                __set_bit(TXDONE_AMPDU, &txdesc.flags);
1048
1049        if (!ack_req)
1050                __set_bit(TXDONE_NO_ACK_REQ, &txdesc.flags);
1051
1052        /*
1053         * Ralink has a retry mechanism using a global fallback
1054         * table. We setup this fallback table to try the immediate
1055         * lower rate for all rates. In the TX_STA_FIFO, the MCS field
1056         * always contains the MCS used for the last transmission, be
1057         * it successful or not.
1058         */
1059        if (rt2x00_get_field32(status, TX_STA_FIFO_TX_SUCCESS)) {
1060                /*
1061                 * Transmission succeeded. The number of retries is
1062                 * mcs - real_mcs
1063                 */
1064                __set_bit(TXDONE_SUCCESS, &txdesc.flags);
1065                txdesc.retry = ((mcs > real_mcs) ? mcs - real_mcs : 0);
1066        } else {
1067                /*
1068                 * Transmission failed. The number of retries is
1069                 * always 7 in this case (for a total number of 8
1070                 * frames sent).
1071                 */
1072                __set_bit(TXDONE_FAILURE, &txdesc.flags);
1073                txdesc.retry = rt2x00dev->long_retry;
1074        }
1075
1076        /*
1077         * the frame was retried at least once
1078         * -> hw used fallback rates
1079         */
1080        if (txdesc.retry)
1081                __set_bit(TXDONE_FALLBACK, &txdesc.flags);
1082
1083        if (!match) {
1084                /* RCU assures non-null sta will not be freed by mac80211. */
1085                rcu_read_lock();
1086                if (likely(wcid >= WCID_START && wcid <= WCID_END))
1087                        skbdesc->sta = drv_data->wcid_to_sta[wcid - WCID_START];
1088                else
1089                        skbdesc->sta = NULL;
1090                rt2x00lib_txdone_nomatch(entry, &txdesc);
1091                rcu_read_unlock();
1092        } else {
1093                rt2x00lib_txdone(entry, &txdesc);
1094        }
1095}
1096EXPORT_SYMBOL_GPL(rt2800_txdone_entry);
1097
1098void rt2800_txdone(struct rt2x00_dev *rt2x00dev, unsigned int quota)
1099{
1100        struct data_queue *queue;
1101        struct queue_entry *entry;
1102        u32 reg;
1103        u8 qid;
1104        bool match;
1105
1106        while (quota-- > 0 && kfifo_get(&rt2x00dev->txstatus_fifo, &reg)) {
1107                /*
1108                 * TX_STA_FIFO_PID_QUEUE is a 2-bit field, thus qid is
1109                 * guaranteed to be one of the TX QIDs .
1110                 */
1111                qid = rt2x00_get_field32(reg, TX_STA_FIFO_PID_QUEUE);
1112                queue = rt2x00queue_get_tx_queue(rt2x00dev, qid);
1113
1114                if (unlikely(rt2x00queue_empty(queue))) {
1115                        rt2x00_dbg(rt2x00dev, "Got TX status for an empty queue %u, dropping\n",
1116                                   qid);
1117                        break;
1118                }
1119
1120                entry = rt2x00queue_get_entry(queue, Q_INDEX_DONE);
1121
1122                if (unlikely(test_bit(ENTRY_OWNER_DEVICE_DATA, &entry->flags) ||
1123                             !test_bit(ENTRY_DATA_STATUS_PENDING, &entry->flags))) {
1124                        rt2x00_warn(rt2x00dev, "Data pending for entry %u in queue %u\n",
1125                                    entry->entry_idx, qid);
1126                        break;
1127                }
1128
1129                match = rt2800_txdone_entry_check(entry, reg);
1130                rt2800_txdone_entry(entry, reg, rt2800_drv_get_txwi(entry), match);
1131        }
1132}
1133EXPORT_SYMBOL_GPL(rt2800_txdone);
1134
1135static inline bool rt2800_entry_txstatus_timeout(struct rt2x00_dev *rt2x00dev,
1136                                                 struct queue_entry *entry)
1137{
1138        bool ret;
1139        unsigned long tout;
1140
1141        if (!test_bit(ENTRY_DATA_STATUS_PENDING, &entry->flags))
1142                return false;
1143
1144        if (test_bit(DEVICE_STATE_FLUSHING, &rt2x00dev->flags))
1145                tout = msecs_to_jiffies(50);
1146        else
1147                tout = msecs_to_jiffies(2000);
1148
1149        ret = time_after(jiffies, entry->last_action + tout);
1150        if (unlikely(ret))
1151                rt2x00_dbg(entry->queue->rt2x00dev,
1152                           "TX status timeout for entry %d in queue %d\n",
1153                           entry->entry_idx, entry->queue->qid);
1154        return ret;
1155}
1156
1157bool rt2800_txstatus_timeout(struct rt2x00_dev *rt2x00dev)
1158{
1159        struct data_queue *queue;
1160        struct queue_entry *entry;
1161
1162        tx_queue_for_each(rt2x00dev, queue) {
1163                entry = rt2x00queue_get_entry(queue, Q_INDEX_DONE);
1164                if (rt2800_entry_txstatus_timeout(rt2x00dev, entry))
1165                        return true;
1166        }
1167
1168        return false;
1169}
1170EXPORT_SYMBOL_GPL(rt2800_txstatus_timeout);
1171
1172/*
1173 * test if there is an entry in any TX queue for which DMA is done
1174 * but the TX status has not been returned yet
1175 */
1176bool rt2800_txstatus_pending(struct rt2x00_dev *rt2x00dev)
1177{
1178        struct data_queue *queue;
1179
1180        tx_queue_for_each(rt2x00dev, queue) {
1181                if (rt2x00queue_get_entry(queue, Q_INDEX_DMA_DONE) !=
1182                    rt2x00queue_get_entry(queue, Q_INDEX_DONE))
1183                        return true;
1184        }
1185        return false;
1186}
1187EXPORT_SYMBOL_GPL(rt2800_txstatus_pending);
1188
1189void rt2800_txdone_nostatus(struct rt2x00_dev *rt2x00dev)
1190{
1191        struct data_queue *queue;
1192        struct queue_entry *entry;
1193
1194        /*
1195         * Process any trailing TX status reports for IO failures,
1196         * we loop until we find the first non-IO error entry. This
1197         * can either be a frame which is free, is being uploaded,
1198         * or has completed the upload but didn't have an entry
1199         * in the TX_STAT_FIFO register yet.
1200         */
1201        tx_queue_for_each(rt2x00dev, queue) {
1202                while (!rt2x00queue_empty(queue)) {
1203                        entry = rt2x00queue_get_entry(queue, Q_INDEX_DONE);
1204
1205                        if (test_bit(ENTRY_OWNER_DEVICE_DATA, &entry->flags) ||
1206                            !test_bit(ENTRY_DATA_STATUS_PENDING, &entry->flags))
1207                                break;
1208
1209                        if (test_bit(ENTRY_DATA_IO_FAILED, &entry->flags) ||
1210                            rt2800_entry_txstatus_timeout(rt2x00dev, entry))
1211                                rt2x00lib_txdone_noinfo(entry, TXDONE_FAILURE);
1212                        else
1213                                break;
1214                }
1215        }
1216}
1217EXPORT_SYMBOL_GPL(rt2800_txdone_nostatus);
1218
1219static int rt2800_check_hung(struct data_queue *queue)
1220{
1221        unsigned int cur_idx = rt2800_drv_get_dma_done(queue);
1222
1223        if (queue->wd_idx != cur_idx)
1224                queue->wd_count = 0;
1225        else
1226                queue->wd_count++;
1227
1228        return queue->wd_count > 16;
1229}
1230
1231void rt2800_watchdog(struct rt2x00_dev *rt2x00dev)
1232{
1233        struct data_queue *queue;
1234        bool hung_tx = false;
1235        bool hung_rx = false;
1236
1237        if (test_bit(DEVICE_STATE_SCANNING, &rt2x00dev->flags))
1238                return;
1239
1240        queue_for_each(rt2x00dev, queue) {
1241                switch (queue->qid) {
1242                case QID_AC_VO:
1243                case QID_AC_VI:
1244                case QID_AC_BE:
1245                case QID_AC_BK:
1246                case QID_MGMT:
1247                        if (rt2x00queue_empty(queue))
1248                                continue;
1249                        hung_tx = rt2800_check_hung(queue);
1250                        break;
1251                case QID_RX:
1252                        /* For station mode we should reactive at least
1253                         * beacons. TODO: need to find good way detect
1254                         * RX hung for AP mode.
1255                         */
1256                        if (rt2x00dev->intf_sta_count == 0)
1257                                continue;
1258                        hung_rx = rt2800_check_hung(queue);
1259                        break;
1260                default:
1261                        break;
1262                }
1263        }
1264
1265        if (hung_tx)
1266                rt2x00_warn(rt2x00dev, "Watchdog TX hung detected\n");
1267
1268        if (hung_rx)
1269                rt2x00_warn(rt2x00dev, "Watchdog RX hung detected\n");
1270
1271        if (hung_tx || hung_rx)
1272                ieee80211_restart_hw(rt2x00dev->hw);
1273}
1274EXPORT_SYMBOL_GPL(rt2800_watchdog);
1275
1276static unsigned int rt2800_hw_beacon_base(struct rt2x00_dev *rt2x00dev,
1277                                          unsigned int index)
1278{
1279        return HW_BEACON_BASE(index);
1280}
1281
1282static inline u8 rt2800_get_beacon_offset(struct rt2x00_dev *rt2x00dev,
1283                                          unsigned int index)
1284{
1285        return BEACON_BASE_TO_OFFSET(rt2800_hw_beacon_base(rt2x00dev, index));
1286}
1287
1288static void rt2800_update_beacons_setup(struct rt2x00_dev *rt2x00dev)
1289{
1290        struct data_queue *queue = rt2x00dev->bcn;
1291        struct queue_entry *entry;
1292        int i, bcn_num = 0;
1293        u64 off, reg = 0;
1294        u32 bssid_dw1;
1295
1296        /*
1297         * Setup offsets of all active beacons in BCN_OFFSET{0,1} registers.
1298         */
1299        for (i = 0; i < queue->limit; i++) {
1300                entry = &queue->entries[i];
1301                if (!test_bit(ENTRY_BCN_ENABLED, &entry->flags))
1302                        continue;
1303                off = rt2800_get_beacon_offset(rt2x00dev, entry->entry_idx);
1304                reg |= off << (8 * bcn_num);
1305                bcn_num++;
1306        }
1307
1308        rt2800_register_write(rt2x00dev, BCN_OFFSET0, (u32) reg);
1309        rt2800_register_write(rt2x00dev, BCN_OFFSET1, (u32) (reg >> 32));
1310
1311        /*
1312         * H/W sends up to MAC_BSSID_DW1_BSS_BCN_NUM + 1 consecutive beacons.
1313         */
1314        bssid_dw1 = rt2800_register_read(rt2x00dev, MAC_BSSID_DW1);
1315        rt2x00_set_field32(&bssid_dw1, MAC_BSSID_DW1_BSS_BCN_NUM,
1316                           bcn_num > 0 ? bcn_num - 1 : 0);
1317        rt2800_register_write(rt2x00dev, MAC_BSSID_DW1, bssid_dw1);
1318}
1319
1320void rt2800_write_beacon(struct queue_entry *entry, struct txentry_desc *txdesc)
1321{
1322        struct rt2x00_dev *rt2x00dev = entry->queue->rt2x00dev;
1323        struct skb_frame_desc *skbdesc = get_skb_frame_desc(entry->skb);
1324        unsigned int beacon_base;
1325        unsigned int padding_len;
1326        u32 orig_reg, reg;
1327        const int txwi_desc_size = entry->queue->winfo_size;
1328
1329        /*
1330         * Disable beaconing while we are reloading the beacon data,
1331         * otherwise we might be sending out invalid data.
1332         */
1333        reg = rt2800_register_read(rt2x00dev, BCN_TIME_CFG);
1334        orig_reg = reg;
1335        rt2x00_set_field32(&reg, BCN_TIME_CFG_BEACON_GEN, 0);
1336        rt2800_register_write(rt2x00dev, BCN_TIME_CFG, reg);
1337
1338        /*
1339         * Add space for the TXWI in front of the skb.
1340         */
1341        memset(skb_push(entry->skb, txwi_desc_size), 0, txwi_desc_size);
1342
1343        /*
1344         * Register descriptor details in skb frame descriptor.
1345         */
1346        skbdesc->flags |= SKBDESC_DESC_IN_SKB;
1347        skbdesc->desc = entry->skb->data;
1348        skbdesc->desc_len = txwi_desc_size;
1349
1350        /*
1351         * Add the TXWI for the beacon to the skb.
1352         */
1353        rt2800_write_tx_data(entry, txdesc);
1354
1355        /*
1356         * Dump beacon to userspace through debugfs.
1357         */
1358        rt2x00debug_dump_frame(rt2x00dev, DUMP_FRAME_BEACON, entry);
1359
1360        /*
1361         * Write entire beacon with TXWI and padding to register.
1362         */
1363        padding_len = roundup(entry->skb->len, 4) - entry->skb->len;
1364        if (padding_len && skb_pad(entry->skb, padding_len)) {
1365                rt2x00_err(rt2x00dev, "Failure padding beacon, aborting\n");
1366                /* skb freed by skb_pad() on failure */
1367                entry->skb = NULL;
1368                rt2800_register_write(rt2x00dev, BCN_TIME_CFG, orig_reg);
1369                return;
1370        }
1371
1372        beacon_base = rt2800_hw_beacon_base(rt2x00dev, entry->entry_idx);
1373
1374        rt2800_register_multiwrite(rt2x00dev, beacon_base, entry->skb->data,
1375                                   entry->skb->len + padding_len);
1376        __set_bit(ENTRY_BCN_ENABLED, &entry->flags);
1377
1378        /*
1379         * Change global beacons settings.
1380         */
1381        rt2800_update_beacons_setup(rt2x00dev);
1382
1383        /*
1384         * Restore beaconing state.
1385         */
1386        rt2800_register_write(rt2x00dev, BCN_TIME_CFG, orig_reg);
1387
1388        /*
1389         * Clean up beacon skb.
1390         */
1391        dev_kfree_skb_any(entry->skb);
1392        entry->skb = NULL;
1393}
1394EXPORT_SYMBOL_GPL(rt2800_write_beacon);
1395
1396static inline void rt2800_clear_beacon_register(struct rt2x00_dev *rt2x00dev,
1397                                                unsigned int index)
1398{
1399        int i;
1400        const int txwi_desc_size = rt2x00dev->bcn->winfo_size;
1401        unsigned int beacon_base;
1402
1403        beacon_base = rt2800_hw_beacon_base(rt2x00dev, index);
1404
1405        /*
1406         * For the Beacon base registers we only need to clear
1407         * the whole TXWI which (when set to 0) will invalidate
1408         * the entire beacon.
1409         */
1410        for (i = 0; i < txwi_desc_size; i += sizeof(__le32))
1411                rt2800_register_write(rt2x00dev, beacon_base + i, 0);
1412}
1413
1414void rt2800_clear_beacon(struct queue_entry *entry)
1415{
1416        struct rt2x00_dev *rt2x00dev = entry->queue->rt2x00dev;
1417        u32 orig_reg, reg;
1418
1419        /*
1420         * Disable beaconing while we are reloading the beacon data,
1421         * otherwise we might be sending out invalid data.
1422         */
1423        orig_reg = rt2800_register_read(rt2x00dev, BCN_TIME_CFG);
1424        reg = orig_reg;
1425        rt2x00_set_field32(&reg, BCN_TIME_CFG_BEACON_GEN, 0);
1426        rt2800_register_write(rt2x00dev, BCN_TIME_CFG, reg);
1427
1428        /*
1429         * Clear beacon.
1430         */
1431        rt2800_clear_beacon_register(rt2x00dev, entry->entry_idx);
1432        __clear_bit(ENTRY_BCN_ENABLED, &entry->flags);
1433
1434        /*
1435         * Change global beacons settings.
1436         */
1437        rt2800_update_beacons_setup(rt2x00dev);
1438        /*
1439         * Restore beaconing state.
1440         */
1441        rt2800_register_write(rt2x00dev, BCN_TIME_CFG, orig_reg);
1442}
1443EXPORT_SYMBOL_GPL(rt2800_clear_beacon);
1444
1445#ifdef CONFIG_RT2X00_LIB_DEBUGFS
1446const struct rt2x00debug rt2800_rt2x00debug = {
1447        .owner  = THIS_MODULE,
1448        .csr    = {
1449                .read           = rt2800_register_read,
1450                .write          = rt2800_register_write,
1451                .flags          = RT2X00DEBUGFS_OFFSET,
1452                .word_base      = CSR_REG_BASE,
1453                .word_size      = sizeof(u32),
1454                .word_count     = CSR_REG_SIZE / sizeof(u32),
1455        },
1456        .eeprom = {
1457                /* NOTE: The local EEPROM access functions can't
1458                 * be used here, use the generic versions instead.
1459                 */
1460                .read           = rt2x00_eeprom_read,
1461                .write          = rt2x00_eeprom_write,
1462                .word_base      = EEPROM_BASE,
1463                .word_size      = sizeof(u16),
1464                .word_count     = EEPROM_SIZE / sizeof(u16),
1465        },
1466        .bbp    = {
1467                .read           = rt2800_bbp_read,
1468                .write          = rt2800_bbp_write,
1469                .word_base      = BBP_BASE,
1470                .word_size      = sizeof(u8),
1471                .word_count     = BBP_SIZE / sizeof(u8),
1472        },
1473        .rf     = {
1474                .read           = rt2x00_rf_read,
1475                .write          = rt2800_rf_write,
1476                .word_base      = RF_BASE,
1477                .word_size      = sizeof(u32),
1478                .word_count     = RF_SIZE / sizeof(u32),
1479        },
1480        .rfcsr  = {
1481                .read           = rt2800_rfcsr_read,
1482                .write          = rt2800_rfcsr_write,
1483                .word_base      = RFCSR_BASE,
1484                .word_size      = sizeof(u8),
1485                .word_count     = RFCSR_SIZE / sizeof(u8),
1486        },
1487};
1488EXPORT_SYMBOL_GPL(rt2800_rt2x00debug);
1489#endif /* CONFIG_RT2X00_LIB_DEBUGFS */
1490
1491int rt2800_rfkill_poll(struct rt2x00_dev *rt2x00dev)
1492{
1493        u32 reg;
1494
1495        if (rt2x00_rt(rt2x00dev, RT3290)) {
1496                reg = rt2800_register_read(rt2x00dev, WLAN_FUN_CTRL);
1497                return rt2x00_get_field32(reg, WLAN_GPIO_IN_BIT0);
1498        } else {
1499                reg = rt2800_register_read(rt2x00dev, GPIO_CTRL);
1500                return rt2x00_get_field32(reg, GPIO_CTRL_VAL2);
1501        }
1502}
1503EXPORT_SYMBOL_GPL(rt2800_rfkill_poll);
1504
1505#ifdef CONFIG_RT2X00_LIB_LEDS
1506static void rt2800_brightness_set(struct led_classdev *led_cdev,
1507                                  enum led_brightness brightness)
1508{
1509        struct rt2x00_led *led =
1510            container_of(led_cdev, struct rt2x00_led, led_dev);
1511        unsigned int enabled = brightness != LED_OFF;
1512        unsigned int bg_mode =
1513            (enabled && led->rt2x00dev->curr_band == NL80211_BAND_2GHZ);
1514        unsigned int polarity =
1515                rt2x00_get_field16(led->rt2x00dev->led_mcu_reg,
1516                                   EEPROM_FREQ_LED_POLARITY);
1517        unsigned int ledmode =
1518                rt2x00_get_field16(led->rt2x00dev->led_mcu_reg,
1519                                   EEPROM_FREQ_LED_MODE);
1520        u32 reg;
1521
1522        /* Check for SoC (SOC devices don't support MCU requests) */
1523        if (rt2x00_is_soc(led->rt2x00dev)) {
1524                reg = rt2800_register_read(led->rt2x00dev, LED_CFG);
1525
1526                /* Set LED Polarity */
1527                rt2x00_set_field32(&reg, LED_CFG_LED_POLAR, polarity);
1528
1529                /* Set LED Mode */
1530                if (led->type == LED_TYPE_RADIO) {
1531                        rt2x00_set_field32(&reg, LED_CFG_G_LED_MODE,
1532                                           enabled ? 3 : 0);
1533                } else if (led->type == LED_TYPE_ASSOC) {
1534                        rt2x00_set_field32(&reg, LED_CFG_Y_LED_MODE,
1535                                           enabled ? 3 : 0);
1536                } else if (led->type == LED_TYPE_QUALITY) {
1537                        rt2x00_set_field32(&reg, LED_CFG_R_LED_MODE,
1538                                           enabled ? 3 : 0);
1539                }
1540
1541                rt2800_register_write(led->rt2x00dev, LED_CFG, reg);
1542
1543        } else {
1544                if (led->type == LED_TYPE_RADIO) {
1545                        rt2800_mcu_request(led->rt2x00dev, MCU_LED, 0xff, ledmode,
1546                                              enabled ? 0x20 : 0);
1547                } else if (led->type == LED_TYPE_ASSOC) {
1548                        rt2800_mcu_request(led->rt2x00dev, MCU_LED, 0xff, ledmode,
1549                                              enabled ? (bg_mode ? 0x60 : 0xa0) : 0x20);
1550                } else if (led->type == LED_TYPE_QUALITY) {
1551                        /*
1552                         * The brightness is divided into 6 levels (0 - 5),
1553                         * The specs tell us the following levels:
1554                         *      0, 1 ,3, 7, 15, 31
1555                         * to determine the level in a simple way we can simply
1556                         * work with bitshifting:
1557                         *      (1 << level) - 1
1558                         */
1559                        rt2800_mcu_request(led->rt2x00dev, MCU_LED_STRENGTH, 0xff,
1560                                              (1 << brightness / (LED_FULL / 6)) - 1,
1561                                              polarity);
1562                }
1563        }
1564}
1565
1566static void rt2800_init_led(struct rt2x00_dev *rt2x00dev,
1567                     struct rt2x00_led *led, enum led_type type)
1568{
1569        led->rt2x00dev = rt2x00dev;
1570        led->type = type;
1571        led->led_dev.brightness_set = rt2800_brightness_set;
1572        led->flags = LED_INITIALIZED;
1573}
1574#endif /* CONFIG_RT2X00_LIB_LEDS */
1575
1576/*
1577 * Configuration handlers.
1578 */
1579static void rt2800_config_wcid(struct rt2x00_dev *rt2x00dev,
1580                               const u8 *address,
1581                               int wcid)
1582{
1583        struct mac_wcid_entry wcid_entry;
1584        u32 offset;
1585
1586        offset = MAC_WCID_ENTRY(wcid);
1587
1588        memset(&wcid_entry, 0xff, sizeof(wcid_entry));
1589        if (address)
1590                memcpy(wcid_entry.mac, address, ETH_ALEN);
1591
1592        rt2800_register_multiwrite(rt2x00dev, offset,
1593                                      &wcid_entry, sizeof(wcid_entry));
1594}
1595
1596static void rt2800_delete_wcid_attr(struct rt2x00_dev *rt2x00dev, int wcid)
1597{
1598        u32 offset;
1599        offset = MAC_WCID_ATTR_ENTRY(wcid);
1600        rt2800_register_write(rt2x00dev, offset, 0);
1601}
1602
1603static void rt2800_config_wcid_attr_bssidx(struct rt2x00_dev *rt2x00dev,
1604                                           int wcid, u32 bssidx)
1605{
1606        u32 offset = MAC_WCID_ATTR_ENTRY(wcid);
1607        u32 reg;
1608
1609        /*
1610         * The BSS Idx numbers is split in a main value of 3 bits,
1611         * and a extended field for adding one additional bit to the value.
1612         */
1613        reg = rt2800_register_read(rt2x00dev, offset);
1614        rt2x00_set_field32(&reg, MAC_WCID_ATTRIBUTE_BSS_IDX, (bssidx & 0x7));
1615        rt2x00_set_field32(&reg, MAC_WCID_ATTRIBUTE_BSS_IDX_EXT,
1616                           (bssidx & 0x8) >> 3);
1617        rt2800_register_write(rt2x00dev, offset, reg);
1618}
1619
1620static void rt2800_config_wcid_attr_cipher(struct rt2x00_dev *rt2x00dev,
1621                                           struct rt2x00lib_crypto *crypto,
1622                                           struct ieee80211_key_conf *key)
1623{
1624        struct mac_iveiv_entry iveiv_entry;
1625        u32 offset;
1626        u32 reg;
1627
1628        offset = MAC_WCID_ATTR_ENTRY(key->hw_key_idx);
1629
1630        if (crypto->cmd == SET_KEY) {
1631                reg = rt2800_register_read(rt2x00dev, offset);
1632                rt2x00_set_field32(&reg, MAC_WCID_ATTRIBUTE_KEYTAB,
1633                                   !!(key->flags & IEEE80211_KEY_FLAG_PAIRWISE));
1634                /*
1635                 * Both the cipher as the BSS Idx numbers are split in a main
1636                 * value of 3 bits, and a extended field for adding one additional
1637                 * bit to the value.
1638                 */
1639                rt2x00_set_field32(&reg, MAC_WCID_ATTRIBUTE_CIPHER,
1640                                   (crypto->cipher & 0x7));
1641                rt2x00_set_field32(&reg, MAC_WCID_ATTRIBUTE_CIPHER_EXT,
1642                                   (crypto->cipher & 0x8) >> 3);
1643                rt2x00_set_field32(&reg, MAC_WCID_ATTRIBUTE_RX_WIUDF, crypto->cipher);
1644                rt2800_register_write(rt2x00dev, offset, reg);
1645        } else {
1646                /* Delete the cipher without touching the bssidx */
1647                reg = rt2800_register_read(rt2x00dev, offset);
1648                rt2x00_set_field32(&reg, MAC_WCID_ATTRIBUTE_KEYTAB, 0);
1649                rt2x00_set_field32(&reg, MAC_WCID_ATTRIBUTE_CIPHER, 0);
1650                rt2x00_set_field32(&reg, MAC_WCID_ATTRIBUTE_CIPHER_EXT, 0);
1651                rt2x00_set_field32(&reg, MAC_WCID_ATTRIBUTE_RX_WIUDF, 0);
1652                rt2800_register_write(rt2x00dev, offset, reg);
1653        }
1654
1655        offset = MAC_IVEIV_ENTRY(key->hw_key_idx);
1656
1657        if (crypto->cmd == SET_KEY) {
1658                rt2800_register_multiread(rt2x00dev, offset,
1659                                          &iveiv_entry, sizeof(iveiv_entry));
1660                if ((crypto->cipher == CIPHER_TKIP) ||
1661                    (crypto->cipher == CIPHER_TKIP_NO_MIC) ||
1662                    (crypto->cipher == CIPHER_AES))
1663                        iveiv_entry.iv[3] |= 0x20;
1664                iveiv_entry.iv[3] |= key->keyidx << 6;
1665        } else {
1666                memset(&iveiv_entry, 0, sizeof(iveiv_entry));
1667        }
1668
1669        rt2800_register_multiwrite(rt2x00dev, offset,
1670                                   &iveiv_entry, sizeof(iveiv_entry));
1671}
1672
1673int rt2800_config_shared_key(struct rt2x00_dev *rt2x00dev,
1674                             struct rt2x00lib_crypto *crypto,
1675                             struct ieee80211_key_conf *key)
1676{
1677        struct hw_key_entry key_entry;
1678        struct rt2x00_field32 field;
1679        u32 offset;
1680        u32 reg;
1681
1682        if (crypto->cmd == SET_KEY) {
1683                key->hw_key_idx = (4 * crypto->bssidx) + key->keyidx;
1684
1685                memcpy(key_entry.key, crypto->key,
1686                       sizeof(key_entry.key));
1687                memcpy(key_entry.tx_mic, crypto->tx_mic,
1688                       sizeof(key_entry.tx_mic));
1689                memcpy(key_entry.rx_mic, crypto->rx_mic,
1690                       sizeof(key_entry.rx_mic));
1691
1692                offset = SHARED_KEY_ENTRY(key->hw_key_idx);
1693                rt2800_register_multiwrite(rt2x00dev, offset,
1694                                              &key_entry, sizeof(key_entry));
1695        }
1696
1697        /*
1698         * The cipher types are stored over multiple registers
1699         * starting with SHARED_KEY_MODE_BASE each word will have
1700         * 32 bits and contains the cipher types for 2 bssidx each.
1701         * Using the correct defines correctly will cause overhead,
1702         * so just calculate the correct offset.
1703         */
1704        field.bit_offset = 4 * (key->hw_key_idx % 8);
1705        field.bit_mask = 0x7 << field.bit_offset;
1706
1707        offset = SHARED_KEY_MODE_ENTRY(key->hw_key_idx / 8);
1708
1709        reg = rt2800_register_read(rt2x00dev, offset);
1710        rt2x00_set_field32(&reg, field,
1711                           (crypto->cmd == SET_KEY) * crypto->cipher);
1712        rt2800_register_write(rt2x00dev, offset, reg);
1713
1714        /*
1715         * Update WCID information
1716         */
1717        rt2800_config_wcid(rt2x00dev, crypto->address, key->hw_key_idx);
1718        rt2800_config_wcid_attr_bssidx(rt2x00dev, key->hw_key_idx,
1719                                       crypto->bssidx);
1720        rt2800_config_wcid_attr_cipher(rt2x00dev, crypto, key);
1721
1722        return 0;
1723}
1724EXPORT_SYMBOL_GPL(rt2800_config_shared_key);
1725
1726int rt2800_config_pairwise_key(struct rt2x00_dev *rt2x00dev,
1727                               struct rt2x00lib_crypto *crypto,
1728                               struct ieee80211_key_conf *key)
1729{
1730        struct hw_key_entry key_entry;
1731        u32 offset;
1732
1733        if (crypto->cmd == SET_KEY) {
1734                /*
1735                 * Allow key configuration only for STAs that are
1736                 * known by the hw.
1737                 */
1738                if (crypto->wcid > WCID_END)
1739                        return -ENOSPC;
1740                key->hw_key_idx = crypto->wcid;
1741
1742                memcpy(key_entry.key, crypto->key,
1743                       sizeof(key_entry.key));
1744                memcpy(key_entry.tx_mic, crypto->tx_mic,
1745                       sizeof(key_entry.tx_mic));
1746                memcpy(key_entry.rx_mic, crypto->rx_mic,
1747                       sizeof(key_entry.rx_mic));
1748
1749                offset = PAIRWISE_KEY_ENTRY(key->hw_key_idx);
1750                rt2800_register_multiwrite(rt2x00dev, offset,
1751                                              &key_entry, sizeof(key_entry));
1752        }
1753
1754        /*
1755         * Update WCID information
1756         */
1757        rt2800_config_wcid_attr_cipher(rt2x00dev, crypto, key);
1758
1759        return 0;
1760}
1761EXPORT_SYMBOL_GPL(rt2800_config_pairwise_key);
1762
1763static void rt2800_set_max_psdu_len(struct rt2x00_dev *rt2x00dev)
1764{
1765        u8 i, max_psdu;
1766        u32 reg;
1767        struct rt2800_drv_data *drv_data = rt2x00dev->drv_data;
1768
1769        for (i = 0; i < 3; i++)
1770                if (drv_data->ampdu_factor_cnt[i] > 0)
1771                        break;
1772
1773        max_psdu = min(drv_data->max_psdu, i);
1774
1775        reg = rt2800_register_read(rt2x00dev, MAX_LEN_CFG);
1776        rt2x00_set_field32(&reg, MAX_LEN_CFG_MAX_PSDU, max_psdu);
1777        rt2800_register_write(rt2x00dev, MAX_LEN_CFG, reg);
1778}
1779
1780int rt2800_sta_add(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
1781                   struct ieee80211_sta *sta)
1782{
1783        struct rt2x00_dev *rt2x00dev = hw->priv;
1784        struct rt2800_drv_data *drv_data = rt2x00dev->drv_data;
1785        struct rt2x00_sta *sta_priv = sta_to_rt2x00_sta(sta);
1786        int wcid;
1787
1788        /*
1789         * Limit global maximum TX AMPDU length to smallest value of all
1790         * connected stations. In AP mode this can be suboptimal, but we
1791         * do not have a choice if some connected STA is not capable to
1792         * receive the same amount of data like the others.
1793         */
1794        if (sta->ht_cap.ht_supported) {
1795                drv_data->ampdu_factor_cnt[sta->ht_cap.ampdu_factor & 3]++;
1796                rt2800_set_max_psdu_len(rt2x00dev);
1797        }
1798
1799        /*
1800         * Search for the first free WCID entry and return the corresponding
1801         * index.
1802         */
1803        wcid = find_first_zero_bit(drv_data->sta_ids, STA_IDS_SIZE) + WCID_START;
1804
1805        /*
1806         * Store selected wcid even if it is invalid so that we can
1807         * later decide if the STA is uploaded into the hw.
1808         */
1809        sta_priv->wcid = wcid;
1810
1811        /*
1812         * No space left in the device, however, we can still communicate
1813         * with the STA -> No error.
1814         */
1815        if (wcid > WCID_END)
1816                return 0;
1817
1818        __set_bit(wcid - WCID_START, drv_data->sta_ids);
1819        drv_data->wcid_to_sta[wcid - WCID_START] = sta;
1820
1821        /*
1822         * Clean up WCID attributes and write STA address to the device.
1823         */
1824        rt2800_delete_wcid_attr(rt2x00dev, wcid);
1825        rt2800_config_wcid(rt2x00dev, sta->addr, wcid);
1826        rt2800_config_wcid_attr_bssidx(rt2x00dev, wcid,
1827                                       rt2x00lib_get_bssidx(rt2x00dev, vif));
1828        return 0;
1829}
1830EXPORT_SYMBOL_GPL(rt2800_sta_add);
1831
1832int rt2800_sta_remove(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
1833                      struct ieee80211_sta *sta)
1834{
1835        struct rt2x00_dev *rt2x00dev = hw->priv;
1836        struct rt2800_drv_data *drv_data = rt2x00dev->drv_data;
1837        struct rt2x00_sta *sta_priv = sta_to_rt2x00_sta(sta);
1838        int wcid = sta_priv->wcid;
1839
1840        if (sta->ht_cap.ht_supported) {
1841                drv_data->ampdu_factor_cnt[sta->ht_cap.ampdu_factor & 3]--;
1842                rt2800_set_max_psdu_len(rt2x00dev);
1843        }
1844
1845        if (wcid > WCID_END)
1846                return 0;
1847        /*
1848         * Remove WCID entry, no need to clean the attributes as they will
1849         * get renewed when the WCID is reused.
1850         */
1851        rt2800_config_wcid(rt2x00dev, NULL, wcid);
1852        drv_data->wcid_to_sta[wcid - WCID_START] = NULL;
1853        __clear_bit(wcid - WCID_START, drv_data->sta_ids);
1854
1855        return 0;
1856}
1857EXPORT_SYMBOL_GPL(rt2800_sta_remove);
1858
1859void rt2800_pre_reset_hw(struct rt2x00_dev *rt2x00dev)
1860{
1861        struct rt2800_drv_data *drv_data = rt2x00dev->drv_data;
1862        struct data_queue *queue = rt2x00dev->bcn;
1863        struct queue_entry *entry;
1864        int i, wcid;
1865
1866        for (wcid = WCID_START; wcid < WCID_END; wcid++) {
1867                drv_data->wcid_to_sta[wcid - WCID_START] = NULL;
1868                __clear_bit(wcid - WCID_START, drv_data->sta_ids);
1869        }
1870
1871        for (i = 0; i < queue->limit; i++) {
1872                entry = &queue->entries[i];
1873                clear_bit(ENTRY_BCN_ASSIGNED, &entry->flags);
1874        }
1875}
1876EXPORT_SYMBOL_GPL(rt2800_pre_reset_hw);
1877
1878void rt2800_config_filter(struct rt2x00_dev *rt2x00dev,
1879                          const unsigned int filter_flags)
1880{
1881        u32 reg;
1882
1883        /*
1884         * Start configuration steps.
1885         * Note that the version error will always be dropped
1886         * and broadcast frames will always be accepted since
1887         * there is no filter for it at this time.
1888         */
1889        reg = rt2800_register_read(rt2x00dev, RX_FILTER_CFG);
1890        rt2x00_set_field32(&reg, RX_FILTER_CFG_DROP_CRC_ERROR,
1891                           !(filter_flags & FIF_FCSFAIL));
1892        rt2x00_set_field32(&reg, RX_FILTER_CFG_DROP_PHY_ERROR,
1893                           !(filter_flags & FIF_PLCPFAIL));
1894        rt2x00_set_field32(&reg, RX_FILTER_CFG_DROP_NOT_TO_ME,
1895                           !test_bit(CONFIG_MONITORING, &rt2x00dev->flags));
1896        rt2x00_set_field32(&reg, RX_FILTER_CFG_DROP_NOT_MY_BSSD, 0);
1897        rt2x00_set_field32(&reg, RX_FILTER_CFG_DROP_VER_ERROR, 1);
1898        rt2x00_set_field32(&reg, RX_FILTER_CFG_DROP_MULTICAST,
1899                           !(filter_flags & FIF_ALLMULTI));
1900        rt2x00_set_field32(&reg, RX_FILTER_CFG_DROP_BROADCAST, 0);
1901        rt2x00_set_field32(&reg, RX_FILTER_CFG_DROP_DUPLICATE, 1);
1902        rt2x00_set_field32(&reg, RX_FILTER_CFG_DROP_CF_END_ACK,
1903                           !(filter_flags & FIF_CONTROL));
1904        rt2x00_set_field32(&reg, RX_FILTER_CFG_DROP_CF_END,
1905                           !(filter_flags & FIF_CONTROL));
1906        rt2x00_set_field32(&reg, RX_FILTER_CFG_DROP_ACK,
1907                           !(filter_flags & FIF_CONTROL));
1908        rt2x00_set_field32(&reg, RX_FILTER_CFG_DROP_CTS,
1909                           !(filter_flags & FIF_CONTROL));
1910        rt2x00_set_field32(&reg, RX_FILTER_CFG_DROP_RTS,
1911                           !(filter_flags & FIF_CONTROL));
1912        rt2x00_set_field32(&reg, RX_FILTER_CFG_DROP_PSPOLL,
1913                           !(filter_flags & FIF_PSPOLL));
1914        rt2x00_set_field32(&reg, RX_FILTER_CFG_DROP_BA, 0);
1915        rt2x00_set_field32(&reg, RX_FILTER_CFG_DROP_BAR,
1916                           !(filter_flags & FIF_CONTROL));
1917        rt2x00_set_field32(&reg, RX_FILTER_CFG_DROP_CNTL,
1918                           !(filter_flags & FIF_CONTROL));
1919        rt2800_register_write(rt2x00dev, RX_FILTER_CFG, reg);
1920}
1921EXPORT_SYMBOL_GPL(rt2800_config_filter);
1922
1923void rt2800_config_intf(struct rt2x00_dev *rt2x00dev, struct rt2x00_intf *intf,
1924                        struct rt2x00intf_conf *conf, const unsigned int flags)
1925{
1926        u32 reg;
1927        bool update_bssid = false;
1928
1929        if (flags & CONFIG_UPDATE_TYPE) {
1930                /*
1931                 * Enable synchronisation.
1932                 */
1933                reg = rt2800_register_read(rt2x00dev, BCN_TIME_CFG);
1934                rt2x00_set_field32(&reg, BCN_TIME_CFG_TSF_SYNC, conf->sync);
1935                rt2800_register_write(rt2x00dev, BCN_TIME_CFG, reg);
1936
1937                if (conf->sync == TSF_SYNC_AP_NONE) {
1938                        /*
1939                         * Tune beacon queue transmit parameters for AP mode
1940                         */
1941                        reg = rt2800_register_read(rt2x00dev, TBTT_SYNC_CFG);
1942                        rt2x00_set_field32(&reg, TBTT_SYNC_CFG_BCN_CWMIN, 0);
1943                        rt2x00_set_field32(&reg, TBTT_SYNC_CFG_BCN_AIFSN, 1);
1944                        rt2x00_set_field32(&reg, TBTT_SYNC_CFG_BCN_EXP_WIN, 32);
1945                        rt2x00_set_field32(&reg, TBTT_SYNC_CFG_TBTT_ADJUST, 0);
1946                        rt2800_register_write(rt2x00dev, TBTT_SYNC_CFG, reg);
1947                } else {
1948                        reg = rt2800_register_read(rt2x00dev, TBTT_SYNC_CFG);
1949                        rt2x00_set_field32(&reg, TBTT_SYNC_CFG_BCN_CWMIN, 4);
1950                        rt2x00_set_field32(&reg, TBTT_SYNC_CFG_BCN_AIFSN, 2);
1951                        rt2x00_set_field32(&reg, TBTT_SYNC_CFG_BCN_EXP_WIN, 32);
1952                        rt2x00_set_field32(&reg, TBTT_SYNC_CFG_TBTT_ADJUST, 16);
1953                        rt2800_register_write(rt2x00dev, TBTT_SYNC_CFG, reg);
1954                }
1955        }
1956
1957        if (flags & CONFIG_UPDATE_MAC) {
1958                if (flags & CONFIG_UPDATE_TYPE &&
1959                    conf->sync == TSF_SYNC_AP_NONE) {
1960                        /*
1961                         * The BSSID register has to be set to our own mac
1962                         * address in AP mode.
1963                         */
1964                        memcpy(conf->bssid, conf->mac, sizeof(conf->mac));
1965                        update_bssid = true;
1966                }
1967
1968                if (!is_zero_ether_addr((const u8 *)conf->mac)) {
1969                        reg = le32_to_cpu(conf->mac[1]);
1970                        rt2x00_set_field32(&reg, MAC_ADDR_DW1_UNICAST_TO_ME_MASK, 0xff);
1971                        conf->mac[1] = cpu_to_le32(reg);
1972                }
1973
1974                rt2800_register_multiwrite(rt2x00dev, MAC_ADDR_DW0,
1975                                              conf->mac, sizeof(conf->mac));
1976        }
1977
1978        if ((flags & CONFIG_UPDATE_BSSID) || update_bssid) {
1979                if (!is_zero_ether_addr((const u8 *)conf->bssid)) {
1980                        reg = le32_to_cpu(conf->bssid[1]);
1981                        rt2x00_set_field32(&reg, MAC_BSSID_DW1_BSS_ID_MASK, 3);
1982                        rt2x00_set_field32(&reg, MAC_BSSID_DW1_BSS_BCN_NUM, 0);
1983                        conf->bssid[1] = cpu_to_le32(reg);
1984                }
1985
1986                rt2800_register_multiwrite(rt2x00dev, MAC_BSSID_DW0,
1987                                              conf->bssid, sizeof(conf->bssid));
1988        }
1989}
1990EXPORT_SYMBOL_GPL(rt2800_config_intf);
1991
1992static void rt2800_config_ht_opmode(struct rt2x00_dev *rt2x00dev,
1993                                    struct rt2x00lib_erp *erp)
1994{
1995        bool any_sta_nongf = !!(erp->ht_opmode &
1996                                IEEE80211_HT_OP_MODE_NON_GF_STA_PRSNT);
1997        u8 protection = erp->ht_opmode & IEEE80211_HT_OP_MODE_PROTECTION;
1998        u8 mm20_mode, mm40_mode, gf20_mode, gf40_mode;
1999        u16 mm20_rate, mm40_rate, gf20_rate, gf40_rate;
2000        u32 reg;
2001
2002        /* default protection rate for HT20: OFDM 24M */
2003        mm20_rate = gf20_rate = 0x4004;
2004
2005        /* default protection rate for HT40: duplicate OFDM 24M */
2006        mm40_rate = gf40_rate = 0x4084;
2007
2008        switch (protection) {
2009        case IEEE80211_HT_OP_MODE_PROTECTION_NONE:
2010                /*
2011                 * All STAs in this BSS are HT20/40 but there might be
2012                 * STAs not supporting greenfield mode.
2013                 * => Disable protection for HT transmissions.
2014                 */
2015                mm20_mode = mm40_mode = gf20_mode = gf40_mode = 0;
2016
2017                break;
2018        case IEEE80211_HT_OP_MODE_PROTECTION_20MHZ:
2019                /*
2020                 * All STAs in this BSS are HT20 or HT20/40 but there
2021                 * might be STAs not supporting greenfield mode.
2022                 * => Protect all HT40 transmissions.
2023                 */
2024                mm20_mode = gf20_mode = 0;
2025                mm40_mode = gf40_mode = 1;
2026
2027                break;
2028        case IEEE80211_HT_OP_MODE_PROTECTION_NONMEMBER:
2029                /*
2030                 * Nonmember protection:
2031                 * According to 802.11n we _should_ protect all
2032                 * HT transmissions (but we don't have to).
2033                 *
2034                 * But if cts_protection is enabled we _shall_ protect
2035                 * all HT transmissions using a CCK rate.
2036                 *
2037                 * And if any station is non GF we _shall_ protect
2038                 * GF transmissions.
2039                 *
2040                 * We decide to protect everything
2041                 * -> fall through to mixed mode.
2042                 */
2043        case IEEE80211_HT_OP_MODE_PROTECTION_NONHT_MIXED:
2044                /*
2045                 * Legacy STAs are present
2046                 * => Protect all HT transmissions.
2047                 */
2048                mm20_mode = mm40_mode = gf20_mode = gf40_mode = 1;
2049
2050                /*
2051                 * If erp protection is needed we have to protect HT
2052                 * transmissions with CCK 11M long preamble.
2053                 */
2054                if (erp->cts_protection) {
2055                        /* don't duplicate RTS/CTS in CCK mode */
2056                        mm20_rate = mm40_rate = 0x0003;
2057                        gf20_rate = gf40_rate = 0x0003;
2058                }
2059                break;
2060        }
2061
2062        /* check for STAs not supporting greenfield mode */
2063        if (any_sta_nongf)
2064                gf20_mode = gf40_mode = 1;
2065
2066        /* Update HT protection config */
2067        reg = rt2800_register_read(rt2x00dev, MM20_PROT_CFG);
2068        rt2x00_set_field32(&reg, MM20_PROT_CFG_PROTECT_RATE, mm20_rate);
2069        rt2x00_set_field32(&reg, MM20_PROT_CFG_PROTECT_CTRL, mm20_mode);
2070        rt2800_register_write(rt2x00dev, MM20_PROT_CFG, reg);
2071
2072        reg = rt2800_register_read(rt2x00dev, MM40_PROT_CFG);
2073        rt2x00_set_field32(&reg, MM40_PROT_CFG_PROTECT_RATE, mm40_rate);
2074        rt2x00_set_field32(&reg, MM40_PROT_CFG_PROTECT_CTRL, mm40_mode);
2075        rt2800_register_write(rt2x00dev, MM40_PROT_CFG, reg);
2076
2077        reg = rt2800_register_read(rt2x00dev, GF20_PROT_CFG);
2078        rt2x00_set_field32(&reg, GF20_PROT_CFG_PROTECT_RATE, gf20_rate);
2079        rt2x00_set_field32(&reg, GF20_PROT_CFG_PROTECT_CTRL, gf20_mode);
2080        rt2800_register_write(rt2x00dev, GF20_PROT_CFG, reg);
2081
2082        reg = rt2800_register_read(rt2x00dev, GF40_PROT_CFG);
2083        rt2x00_set_field32(&reg, GF40_PROT_CFG_PROTECT_RATE, gf40_rate);
2084        rt2x00_set_field32(&reg, GF40_PROT_CFG_PROTECT_CTRL, gf40_mode);
2085        rt2800_register_write(rt2x00dev, GF40_PROT_CFG, reg);
2086}
2087
2088void rt2800_config_erp(struct rt2x00_dev *rt2x00dev, struct rt2x00lib_erp *erp,
2089                       u32 changed)
2090{
2091        u32 reg;
2092
2093        if (changed & BSS_CHANGED_ERP_PREAMBLE) {
2094                reg = rt2800_register_read(rt2x00dev, AUTO_RSP_CFG);
2095                rt2x00_set_field32(&reg, AUTO_RSP_CFG_AR_PREAMBLE,
2096                                   !!erp->short_preamble);
2097                rt2800_register_write(rt2x00dev, AUTO_RSP_CFG, reg);
2098        }
2099
2100        if (changed & BSS_CHANGED_ERP_CTS_PROT) {
2101                reg = rt2800_register_read(rt2x00dev, OFDM_PROT_CFG);
2102                rt2x00_set_field32(&reg, OFDM_PROT_CFG_PROTECT_CTRL,
2103                                   erp->cts_protection ? 2 : 0);
2104                rt2800_register_write(rt2x00dev, OFDM_PROT_CFG, reg);
2105        }
2106
2107        if (changed & BSS_CHANGED_BASIC_RATES) {
2108                rt2800_register_write(rt2x00dev, LEGACY_BASIC_RATE,
2109                                      0xff0 | erp->basic_rates);
2110                rt2800_register_write(rt2x00dev, HT_BASIC_RATE, 0x00008003);
2111        }
2112
2113        if (changed & BSS_CHANGED_ERP_SLOT) {
2114                reg = rt2800_register_read(rt2x00dev, BKOFF_SLOT_CFG);
2115                rt2x00_set_field32(&reg, BKOFF_SLOT_CFG_SLOT_TIME,
2116                                   erp->slot_time);
2117                rt2800_register_write(rt2x00dev, BKOFF_SLOT_CFG, reg);
2118
2119                reg = rt2800_register_read(rt2x00dev, XIFS_TIME_CFG);
2120                rt2x00_set_field32(&reg, XIFS_TIME_CFG_EIFS, erp->eifs);
2121                rt2800_register_write(rt2x00dev, XIFS_TIME_CFG, reg);
2122        }
2123
2124        if (changed & BSS_CHANGED_BEACON_INT) {
2125                reg = rt2800_register_read(rt2x00dev, BCN_TIME_CFG);
2126                rt2x00_set_field32(&reg, BCN_TIME_CFG_BEACON_INTERVAL,
2127                                   erp->beacon_int * 16);
2128                rt2800_register_write(rt2x00dev, BCN_TIME_CFG, reg);
2129        }
2130
2131        if (changed & BSS_CHANGED_HT)
2132                rt2800_config_ht_opmode(rt2x00dev, erp);
2133}
2134EXPORT_SYMBOL_GPL(rt2800_config_erp);
2135
2136static void rt2800_config_3572bt_ant(struct rt2x00_dev *rt2x00dev)
2137{
2138        u32 reg;
2139        u16 eeprom;
2140        u8 led_ctrl, led_g_mode, led_r_mode;
2141
2142        reg = rt2800_register_read(rt2x00dev, GPIO_SWITCH);
2143        if (rt2x00dev->curr_band == NL80211_BAND_5GHZ) {
2144                rt2x00_set_field32(&reg, GPIO_SWITCH_0, 1);
2145                rt2x00_set_field32(&reg, GPIO_SWITCH_1, 1);
2146        } else {
2147                rt2x00_set_field32(&reg, GPIO_SWITCH_0, 0);
2148                rt2x00_set_field32(&reg, GPIO_SWITCH_1, 0);
2149        }
2150        rt2800_register_write(rt2x00dev, GPIO_SWITCH, reg);
2151
2152        reg = rt2800_register_read(rt2x00dev, LED_CFG);
2153        led_g_mode = rt2x00_get_field32(reg, LED_CFG_LED_POLAR) ? 3 : 0;
2154        led_r_mode = rt2x00_get_field32(reg, LED_CFG_LED_POLAR) ? 0 : 3;
2155        if (led_g_mode != rt2x00_get_field32(reg, LED_CFG_G_LED_MODE) ||
2156            led_r_mode != rt2x00_get_field32(reg, LED_CFG_R_LED_MODE)) {
2157                eeprom = rt2800_eeprom_read(rt2x00dev, EEPROM_FREQ);
2158                led_ctrl = rt2x00_get_field16(eeprom, EEPROM_FREQ_LED_MODE);
2159                if (led_ctrl == 0 || led_ctrl > 0x40) {
2160                        rt2x00_set_field32(&reg, LED_CFG_G_LED_MODE, led_g_mode);
2161                        rt2x00_set_field32(&reg, LED_CFG_R_LED_MODE, led_r_mode);
2162                        rt2800_register_write(rt2x00dev, LED_CFG, reg);
2163                } else {
2164                        rt2800_mcu_request(rt2x00dev, MCU_BAND_SELECT, 0xff,
2165                                           (led_g_mode << 2) | led_r_mode, 1);
2166                }
2167        }
2168}
2169
2170static void rt2800_set_ant_diversity(struct rt2x00_dev *rt2x00dev,
2171                                     enum antenna ant)
2172{
2173        u32 reg;
2174        u8 eesk_pin = (ant == ANTENNA_A) ? 1 : 0;
2175        u8 gpio_bit3 = (ant == ANTENNA_A) ? 0 : 1;
2176
2177        if (rt2x00_is_pci(rt2x00dev)) {
2178                reg = rt2800_register_read(rt2x00dev, E2PROM_CSR);
2179                rt2x00_set_field32(&reg, E2PROM_CSR_DATA_CLOCK, eesk_pin);
2180                rt2800_register_write(rt2x00dev, E2PROM_CSR, reg);
2181        } else if (rt2x00_is_usb(rt2x00dev))
2182                rt2800_mcu_request(rt2x00dev, MCU_ANT_SELECT, 0xff,
2183                                   eesk_pin, 0);
2184
2185        reg = rt2800_register_read(rt2x00dev, GPIO_CTRL);
2186        rt2x00_set_field32(&reg, GPIO_CTRL_DIR3, 0);
2187        rt2x00_set_field32(&reg, GPIO_CTRL_VAL3, gpio_bit3);
2188        rt2800_register_write(rt2x00dev, GPIO_CTRL, reg);
2189}
2190
2191void rt2800_config_ant(struct rt2x00_dev *rt2x00dev, struct antenna_setup *ant)
2192{
2193        u8 r1;
2194        u8 r3;
2195        u16 eeprom;
2196
2197        r1 = rt2800_bbp_read(rt2x00dev, 1);
2198        r3 = rt2800_bbp_read(rt2x00dev, 3);
2199
2200        if (rt2x00_rt(rt2x00dev, RT3572) &&
2201            rt2x00_has_cap_bt_coexist(rt2x00dev))
2202                rt2800_config_3572bt_ant(rt2x00dev);
2203
2204        /*
2205         * Configure the TX antenna.
2206         */
2207        switch (ant->tx_chain_num) {
2208        case 1:
2209                rt2x00_set_field8(&r1, BBP1_TX_ANTENNA, 0);
2210                break;
2211        case 2:
2212                if (rt2x00_rt(rt2x00dev, RT3572) &&
2213                    rt2x00_has_cap_bt_coexist(rt2x00dev))
2214                        rt2x00_set_field8(&r1, BBP1_TX_ANTENNA, 1);
2215                else
2216                        rt2x00_set_field8(&r1, BBP1_TX_ANTENNA, 2);
2217                break;
2218        case 3:
2219                rt2x00_set_field8(&r1, BBP1_TX_ANTENNA, 2);
2220                break;
2221        }
2222
2223        /*
2224         * Configure the RX antenna.
2225         */
2226        switch (ant->rx_chain_num) {
2227        case 1:
2228                if (rt2x00_rt(rt2x00dev, RT3070) ||
2229                    rt2x00_rt(rt2x00dev, RT3090) ||
2230                    rt2x00_rt(rt2x00dev, RT3352) ||
2231                    rt2x00_rt(rt2x00dev, RT3390)) {
2232                        eeprom = rt2800_eeprom_read(rt2x00dev,
2233                                                    EEPROM_NIC_CONF1);
2234                        if (rt2x00_get_field16(eeprom,
2235                                                EEPROM_NIC_CONF1_ANT_DIVERSITY))
2236                                rt2800_set_ant_diversity(rt2x00dev,
2237                                                rt2x00dev->default_ant.rx);
2238                }
2239                rt2x00_set_field8(&r3, BBP3_RX_ANTENNA, 0);
2240                break;
2241        case 2:
2242                if (rt2x00_rt(rt2x00dev, RT3572) &&
2243                    rt2x00_has_cap_bt_coexist(rt2x00dev)) {
2244                        rt2x00_set_field8(&r3, BBP3_RX_ADC, 1);
2245                        rt2x00_set_field8(&r3, BBP3_RX_ANTENNA,
2246                                rt2x00dev->curr_band == NL80211_BAND_5GHZ);
2247                        rt2800_set_ant_diversity(rt2x00dev, ANTENNA_B);
2248                } else {
2249                        rt2x00_set_field8(&r3, BBP3_RX_ANTENNA, 1);
2250                }
2251                break;
2252        case 3:
2253                rt2x00_set_field8(&r3, BBP3_RX_ANTENNA, 2);
2254                break;
2255        }
2256
2257        rt2800_bbp_write(rt2x00dev, 3, r3);
2258        rt2800_bbp_write(rt2x00dev, 1, r1);
2259
2260        if (rt2x00_rt(rt2x00dev, RT3593) ||
2261            rt2x00_rt(rt2x00dev, RT3883)) {
2262                if (ant->rx_chain_num == 1)
2263                        rt2800_bbp_write(rt2x00dev, 86, 0x00);
2264                else
2265                        rt2800_bbp_write(rt2x00dev, 86, 0x46);
2266        }
2267}
2268EXPORT_SYMBOL_GPL(rt2800_config_ant);
2269
2270static void rt2800_config_lna_gain(struct rt2x00_dev *rt2x00dev,
2271                                   struct rt2x00lib_conf *libconf)
2272{
2273        u16 eeprom;
2274        short lna_gain;
2275
2276        if (libconf->rf.channel <= 14) {
2277                eeprom = rt2800_eeprom_read(rt2x00dev, EEPROM_LNA);
2278                lna_gain = rt2x00_get_field16(eeprom, EEPROM_LNA_BG);
2279        } else if (libconf->rf.channel <= 64) {
2280                eeprom = rt2800_eeprom_read(rt2x00dev, EEPROM_LNA);
2281                lna_gain = rt2x00_get_field16(eeprom, EEPROM_LNA_A0);
2282        } else if (libconf->rf.channel <= 128) {
2283                if (rt2x00_rt(rt2x00dev, RT3593) ||
2284                    rt2x00_rt(rt2x00dev, RT3883)) {
2285                        eeprom = rt2800_eeprom_read(rt2x00dev, EEPROM_EXT_LNA2);
2286                        lna_gain = rt2x00_get_field16(eeprom,
2287                                                      EEPROM_EXT_LNA2_A1);
2288                } else {
2289                        eeprom = rt2800_eeprom_read(rt2x00dev, EEPROM_RSSI_BG2);
2290                        lna_gain = rt2x00_get_field16(eeprom,
2291                                                      EEPROM_RSSI_BG2_LNA_A1);
2292                }
2293        } else {
2294                if (rt2x00_rt(rt2x00dev, RT3593) ||
2295                    rt2x00_rt(rt2x00dev, RT3883)) {
2296                        eeprom = rt2800_eeprom_read(rt2x00dev, EEPROM_EXT_LNA2);
2297                        lna_gain = rt2x00_get_field16(eeprom,
2298                                                      EEPROM_EXT_LNA2_A2);
2299                } else {
2300                        eeprom = rt2800_eeprom_read(rt2x00dev, EEPROM_RSSI_A2);
2301                        lna_gain = rt2x00_get_field16(eeprom,
2302                                                      EEPROM_RSSI_A2_LNA_A2);
2303                }
2304        }
2305
2306        rt2x00dev->lna_gain = lna_gain;
2307}
2308
2309static inline bool rt2800_clk_is_20mhz(struct rt2x00_dev *rt2x00dev)
2310{
2311        return clk_get_rate(rt2x00dev->clk) == 20000000;
2312}
2313
2314#define FREQ_OFFSET_BOUND       0x5f
2315
2316static void rt2800_freq_cal_mode1(struct rt2x00_dev *rt2x00dev)
2317{
2318        u8 freq_offset, prev_freq_offset;
2319        u8 rfcsr, prev_rfcsr;
2320
2321        freq_offset = rt2x00_get_field8(rt2x00dev->freq_offset, RFCSR17_CODE);
2322        freq_offset = min_t(u8, freq_offset, FREQ_OFFSET_BOUND);
2323
2324        rfcsr = rt2800_rfcsr_read(rt2x00dev, 17);
2325        prev_rfcsr = rfcsr;
2326
2327        rt2x00_set_field8(&rfcsr, RFCSR17_CODE, freq_offset);
2328        if (rfcsr == prev_rfcsr)
2329                return;
2330
2331        if (rt2x00_is_usb(rt2x00dev)) {
2332                rt2800_mcu_request(rt2x00dev, MCU_FREQ_OFFSET, 0xff,
2333                                   freq_offset, prev_rfcsr);
2334                return;
2335        }
2336
2337        prev_freq_offset = rt2x00_get_field8(prev_rfcsr, RFCSR17_CODE);
2338        while (prev_freq_offset != freq_offset) {
2339                if (prev_freq_offset < freq_offset)
2340                        prev_freq_offset++;
2341                else
2342                        prev_freq_offset--;
2343
2344                rt2x00_set_field8(&rfcsr, RFCSR17_CODE, prev_freq_offset);
2345                rt2800_rfcsr_write(rt2x00dev, 17, rfcsr);
2346
2347                usleep_range(1000, 1500);
2348        }
2349}
2350
2351static void rt2800_config_channel_rf2xxx(struct rt2x00_dev *rt2x00dev,
2352                                         struct ieee80211_conf *conf,
2353                                         struct rf_channel *rf,
2354                                         struct channel_info *info)
2355{
2356        rt2x00_set_field32(&rf->rf4, RF4_FREQ_OFFSET, rt2x00dev->freq_offset);
2357
2358        if (rt2x00dev->default_ant.tx_chain_num == 1)
2359                rt2x00_set_field32(&rf->rf2, RF2_ANTENNA_TX1, 1);
2360
2361        if (rt2x00dev->default_ant.rx_chain_num == 1) {
2362                rt2x00_set_field32(&rf->rf2, RF2_ANTENNA_RX1, 1);
2363                rt2x00_set_field32(&rf->rf2, RF2_ANTENNA_RX2, 1);
2364        } else if (rt2x00dev->default_ant.rx_chain_num == 2)
2365                rt2x00_set_field32(&rf->rf2, RF2_ANTENNA_RX2, 1);
2366
2367        if (rf->channel > 14) {
2368                /*
2369                 * When TX power is below 0, we should increase it by 7 to
2370                 * make it a positive value (Minimum value is -7).
2371                 * However this means that values between 0 and 7 have
2372                 * double meaning, and we should set a 7DBm boost flag.
2373                 */
2374                rt2x00_set_field32(&rf->rf3, RF3_TXPOWER_A_7DBM_BOOST,
2375                                   (info->default_power1 >= 0));
2376
2377                if (info->default_power1 < 0)
2378                        info->default_power1 += 7;
2379
2380                rt2x00_set_field32(&rf->rf3, RF3_TXPOWER_A, info->default_power1);
2381
2382                rt2x00_set_field32(&rf->rf4, RF4_TXPOWER_A_7DBM_BOOST,
2383                                   (info->default_power2 >= 0));
2384
2385                if (info->default_power2 < 0)
2386                        info->default_power2 += 7;
2387
2388                rt2x00_set_field32(&rf->rf4, RF4_TXPOWER_A, info->default_power2);
2389        } else {
2390                rt2x00_set_field32(&rf->rf3, RF3_TXPOWER_G, info->default_power1);
2391                rt2x00_set_field32(&rf->rf4, RF4_TXPOWER_G, info->default_power2);
2392        }
2393
2394        rt2x00_set_field32(&rf->rf4, RF4_HT40, conf_is_ht40(conf));
2395
2396        rt2800_rf_write(rt2x00dev, 1, rf->rf1);
2397        rt2800_rf_write(rt2x00dev, 2, rf->rf2);
2398        rt2800_rf_write(rt2x00dev, 3, rf->rf3 & ~0x00000004);
2399        rt2800_rf_write(rt2x00dev, 4, rf->rf4);
2400
2401        udelay(200);
2402
2403        rt2800_rf_write(rt2x00dev, 1, rf->rf1);
2404        rt2800_rf_write(rt2x00dev, 2, rf->rf2);
2405        rt2800_rf_write(rt2x00dev, 3, rf->rf3 | 0x00000004);
2406        rt2800_rf_write(rt2x00dev, 4, rf->rf4);
2407
2408        udelay(200);
2409
2410        rt2800_rf_write(rt2x00dev, 1, rf->rf1);
2411        rt2800_rf_write(rt2x00dev, 2, rf->rf2);
2412        rt2800_rf_write(rt2x00dev, 3, rf->rf3 & ~0x00000004);
2413        rt2800_rf_write(rt2x00dev, 4, rf->rf4);
2414}
2415
2416static void rt2800_config_channel_rf3xxx(struct rt2x00_dev *rt2x00dev,
2417                                         struct ieee80211_conf *conf,
2418                                         struct rf_channel *rf,
2419                                         struct channel_info *info)
2420{
2421        struct rt2800_drv_data *drv_data = rt2x00dev->drv_data;
2422        u8 rfcsr, calib_tx, calib_rx;
2423
2424        rt2800_rfcsr_write(rt2x00dev, 2, rf->rf1);
2425
2426        rfcsr = rt2800_rfcsr_read(rt2x00dev, 3);
2427        rt2x00_set_field8(&rfcsr, RFCSR3_K, rf->rf3);
2428        rt2800_rfcsr_write(rt2x00dev, 3, rfcsr);
2429
2430        rfcsr = rt2800_rfcsr_read(rt2x00dev, 6);
2431        rt2x00_set_field8(&rfcsr, RFCSR6_R1, rf->rf2);
2432        rt2800_rfcsr_write(rt2x00dev, 6, rfcsr);
2433
2434        rfcsr = rt2800_rfcsr_read(rt2x00dev, 12);
2435        rt2x00_set_field8(&rfcsr, RFCSR12_TX_POWER, info->default_power1);
2436        rt2800_rfcsr_write(rt2x00dev, 12, rfcsr);
2437
2438        rfcsr = rt2800_rfcsr_read(rt2x00dev, 13);
2439        rt2x00_set_field8(&rfcsr, RFCSR13_TX_POWER, info->default_power2);
2440        rt2800_rfcsr_write(rt2x00dev, 13, rfcsr);
2441
2442        rfcsr = rt2800_rfcsr_read(rt2x00dev, 1);
2443        rt2x00_set_field8(&rfcsr, RFCSR1_RX0_PD, 0);
2444        rt2x00_set_field8(&rfcsr, RFCSR1_RX1_PD,
2445                          rt2x00dev->default_ant.rx_chain_num <= 1);
2446        rt2x00_set_field8(&rfcsr, RFCSR1_RX2_PD,
2447                          rt2x00dev->default_ant.rx_chain_num <= 2);
2448        rt2x00_set_field8(&rfcsr, RFCSR1_TX0_PD, 0);
2449        rt2x00_set_field8(&rfcsr, RFCSR1_TX1_PD,
2450                          rt2x00dev->default_ant.tx_chain_num <= 1);
2451        rt2x00_set_field8(&rfcsr, RFCSR1_TX2_PD,
2452                          rt2x00dev->default_ant.tx_chain_num <= 2);
2453        rt2800_rfcsr_write(rt2x00dev, 1, rfcsr);
2454
2455        rfcsr = rt2800_rfcsr_read(rt2x00dev, 23);
2456        rt2x00_set_field8(&rfcsr, RFCSR23_FREQ_OFFSET, rt2x00dev->freq_offset);
2457        rt2800_rfcsr_write(rt2x00dev, 23, rfcsr);
2458
2459        if (rt2x00_rt(rt2x00dev, RT3390)) {
2460                calib_tx = conf_is_ht40(conf) ? 0x68 : 0x4f;
2461                calib_rx = conf_is_ht40(conf) ? 0x6f : 0x4f;
2462        } else {
2463                if (conf_is_ht40(conf)) {
2464                        calib_tx = drv_data->calibration_bw40;
2465                        calib_rx = drv_data->calibration_bw40;
2466                } else {
2467                        calib_tx = drv_data->calibration_bw20;
2468                        calib_rx = drv_data->calibration_bw20;
2469                }
2470        }
2471
2472        rfcsr = rt2800_rfcsr_read(rt2x00dev, 24);
2473        rt2x00_set_field8(&rfcsr, RFCSR24_TX_CALIB, calib_tx);
2474        rt2800_rfcsr_write(rt2x00dev, 24, rfcsr);
2475
2476        rfcsr = rt2800_rfcsr_read(rt2x00dev, 31);
2477        rt2x00_set_field8(&rfcsr, RFCSR31_RX_CALIB, calib_rx);
2478        rt2800_rfcsr_write(rt2x00dev, 31, rfcsr);
2479
2480        rfcsr = rt2800_rfcsr_read(rt2x00dev, 7);
2481        rt2x00_set_field8(&rfcsr, RFCSR7_RF_TUNING, 1);
2482        rt2800_rfcsr_write(rt2x00dev, 7, rfcsr);
2483
2484        rfcsr = rt2800_rfcsr_read(rt2x00dev, 30);
2485        rt2x00_set_field8(&rfcsr, RFCSR30_RF_CALIBRATION, 1);
2486        rt2800_rfcsr_write(rt2x00dev, 30, rfcsr);
2487
2488        usleep_range(1000, 1500);
2489
2490        rt2x00_set_field8(&rfcsr, RFCSR30_RF_CALIBRATION, 0);
2491        rt2800_rfcsr_write(rt2x00dev, 30, rfcsr);
2492}
2493
2494static void rt2800_config_channel_rf3052(struct rt2x00_dev *rt2x00dev,
2495                                         struct ieee80211_conf *conf,
2496                                         struct rf_channel *rf,
2497                                         struct channel_info *info)
2498{
2499        struct rt2800_drv_data *drv_data = rt2x00dev->drv_data;
2500        u8 rfcsr;
2501        u32 reg;
2502
2503        if (rf->channel <= 14) {
2504                rt2800_bbp_write(rt2x00dev, 25, drv_data->bbp25);
2505                rt2800_bbp_write(rt2x00dev, 26, drv_data->bbp26);
2506        } else {
2507                rt2800_bbp_write(rt2x00dev, 25, 0x09);
2508                rt2800_bbp_write(rt2x00dev, 26, 0xff);
2509        }
2510
2511        rt2800_rfcsr_write(rt2x00dev, 2, rf->rf1);
2512        rt2800_rfcsr_write(rt2x00dev, 3, rf->rf3);
2513
2514        rfcsr = rt2800_rfcsr_read(rt2x00dev, 6);
2515        rt2x00_set_field8(&rfcsr, RFCSR6_R1, rf->rf2);
2516        if (rf->channel <= 14)
2517                rt2x00_set_field8(&rfcsr, RFCSR6_TXDIV, 2);
2518        else
2519                rt2x00_set_field8(&rfcsr, RFCSR6_TXDIV, 1);
2520        rt2800_rfcsr_write(rt2x00dev, 6, rfcsr);
2521
2522        rfcsr = rt2800_rfcsr_read(rt2x00dev, 5);
2523        if (rf->channel <= 14)
2524                rt2x00_set_field8(&rfcsr, RFCSR5_R1, 1);
2525        else
2526                rt2x00_set_field8(&rfcsr, RFCSR5_R1, 2);
2527        rt2800_rfcsr_write(rt2x00dev, 5, rfcsr);
2528
2529        rfcsr = rt2800_rfcsr_read(rt2x00dev, 12);
2530        if (rf->channel <= 14) {
2531                rt2x00_set_field8(&rfcsr, RFCSR12_DR0, 3);
2532                rt2x00_set_field8(&rfcsr, RFCSR12_TX_POWER,
2533                                  info->default_power1);
2534        } else {
2535                rt2x00_set_field8(&rfcsr, RFCSR12_DR0, 7);
2536                rt2x00_set_field8(&rfcsr, RFCSR12_TX_POWER,
2537                                (info->default_power1 & 0x3) |
2538                                ((info->default_power1 & 0xC) << 1));
2539        }
2540        rt2800_rfcsr_write(rt2x00dev, 12, rfcsr);
2541
2542        rfcsr = rt2800_rfcsr_read(rt2x00dev, 13);
2543        if (rf->channel <= 14) {
2544                rt2x00_set_field8(&rfcsr, RFCSR13_DR0, 3);
2545                rt2x00_set_field8(&rfcsr, RFCSR13_TX_POWER,
2546                                  info->default_power2);
2547        } else {
2548                rt2x00_set_field8(&rfcsr, RFCSR13_DR0, 7);
2549                rt2x00_set_field8(&rfcsr, RFCSR13_TX_POWER,
2550                                (info->default_power2 & 0x3) |
2551                                ((info->default_power2 & 0xC) << 1));
2552        }
2553        rt2800_rfcsr_write(rt2x00dev, 13, rfcsr);
2554
2555        rfcsr = rt2800_rfcsr_read(rt2x00dev, 1);
2556        rt2x00_set_field8(&rfcsr, RFCSR1_RX0_PD, 0);
2557        rt2x00_set_field8(&rfcsr, RFCSR1_TX0_PD, 0);
2558        rt2x00_set_field8(&rfcsr, RFCSR1_RX1_PD, 0);
2559        rt2x00_set_field8(&rfcsr, RFCSR1_TX1_PD, 0);
2560        rt2x00_set_field8(&rfcsr, RFCSR1_RX2_PD, 0);
2561        rt2x00_set_field8(&rfcsr, RFCSR1_TX2_PD, 0);
2562        if (rt2x00_has_cap_bt_coexist(rt2x00dev)) {
2563                if (rf->channel <= 14) {
2564                        rt2x00_set_field8(&rfcsr, RFCSR1_RX0_PD, 1);
2565                        rt2x00_set_field8(&rfcsr, RFCSR1_TX0_PD, 1);
2566                }
2567                rt2x00_set_field8(&rfcsr, RFCSR1_RX2_PD, 1);
2568                rt2x00_set_field8(&rfcsr, RFCSR1_TX2_PD, 1);
2569        } else {
2570                switch (rt2x00dev->default_ant.tx_chain_num) {
2571                case 1:
2572                        rt2x00_set_field8(&rfcsr, RFCSR1_TX1_PD, 1);
2573                        /* fall through */
2574                case 2:
2575                        rt2x00_set_field8(&rfcsr, RFCSR1_TX2_PD, 1);
2576                        break;
2577                }
2578
2579                switch (rt2x00dev->default_ant.rx_chain_num) {
2580                case 1:
2581                        rt2x00_set_field8(&rfcsr, RFCSR1_RX1_PD, 1);
2582                        /* fall through */
2583                case 2:
2584                        rt2x00_set_field8(&rfcsr, RFCSR1_RX2_PD, 1);
2585                        break;
2586                }
2587        }
2588        rt2800_rfcsr_write(rt2x00dev, 1, rfcsr);
2589
2590        rfcsr = rt2800_rfcsr_read(rt2x00dev, 23);
2591        rt2x00_set_field8(&rfcsr, RFCSR23_FREQ_OFFSET, rt2x00dev->freq_offset);
2592        rt2800_rfcsr_write(rt2x00dev, 23, rfcsr);
2593
2594        if (conf_is_ht40(conf)) {
2595                rt2800_rfcsr_write(rt2x00dev, 24, drv_data->calibration_bw40);
2596                rt2800_rfcsr_write(rt2x00dev, 31, drv_data->calibration_bw40);
2597        } else {
2598                rt2800_rfcsr_write(rt2x00dev, 24, drv_data->calibration_bw20);
2599                rt2800_rfcsr_write(rt2x00dev, 31, drv_data->calibration_bw20);
2600        }
2601
2602        if (rf->channel <= 14) {
2603                rt2800_rfcsr_write(rt2x00dev, 7, 0xd8);
2604                rt2800_rfcsr_write(rt2x00dev, 9, 0xc3);
2605                rt2800_rfcsr_write(rt2x00dev, 10, 0xf1);
2606                rt2800_rfcsr_write(rt2x00dev, 11, 0xb9);
2607                rt2800_rfcsr_write(rt2x00dev, 15, 0x53);
2608                rfcsr = 0x4c;
2609                rt2x00_set_field8(&rfcsr, RFCSR16_TXMIXER_GAIN,
2610                                  drv_data->txmixer_gain_24g);
2611                rt2800_rfcsr_write(rt2x00dev, 16, rfcsr);
2612                rt2800_rfcsr_write(rt2x00dev, 17, 0x23);
2613                rt2800_rfcsr_write(rt2x00dev, 19, 0x93);
2614                rt2800_rfcsr_write(rt2x00dev, 20, 0xb3);
2615                rt2800_rfcsr_write(rt2x00dev, 25, 0x15);
2616                rt2800_rfcsr_write(rt2x00dev, 26, 0x85);
2617                rt2800_rfcsr_write(rt2x00dev, 27, 0x00);
2618                rt2800_rfcsr_write(rt2x00dev, 29, 0x9b);
2619        } else {
2620                rfcsr = rt2800_rfcsr_read(rt2x00dev, 7);
2621                rt2x00_set_field8(&rfcsr, RFCSR7_BIT2, 1);
2622                rt2x00_set_field8(&rfcsr, RFCSR7_BIT3, 0);
2623                rt2x00_set_field8(&rfcsr, RFCSR7_BIT4, 1);
2624                rt2x00_set_field8(&rfcsr, RFCSR7_BITS67, 0);
2625                rt2800_rfcsr_write(rt2x00dev, 7, rfcsr);
2626                rt2800_rfcsr_write(rt2x00dev, 9, 0xc0);
2627                rt2800_rfcsr_write(rt2x00dev, 10, 0xf1);
2628                rt2800_rfcsr_write(rt2x00dev, 11, 0x00);
2629                rt2800_rfcsr_write(rt2x00dev, 15, 0x43);
2630                rfcsr = 0x7a;
2631                rt2x00_set_field8(&rfcsr, RFCSR16_TXMIXER_GAIN,
2632                                  drv_data->txmixer_gain_5g);
2633                rt2800_rfcsr_write(rt2x00dev, 16, rfcsr);
2634                rt2800_rfcsr_write(rt2x00dev, 17, 0x23);
2635                if (rf->channel <= 64) {
2636                        rt2800_rfcsr_write(rt2x00dev, 19, 0xb7);
2637                        rt2800_rfcsr_write(rt2x00dev, 20, 0xf6);
2638                        rt2800_rfcsr_write(rt2x00dev, 25, 0x3d);
2639                } else if (rf->channel <= 128) {
2640                        rt2800_rfcsr_write(rt2x00dev, 19, 0x74);
2641                        rt2800_rfcsr_write(rt2x00dev, 20, 0xf4);
2642                        rt2800_rfcsr_write(rt2x00dev, 25, 0x01);
2643                } else {
2644                        rt2800_rfcsr_write(rt2x00dev, 19, 0x72);
2645                        rt2800_rfcsr_write(rt2x00dev, 20, 0xf3);
2646                        rt2800_rfcsr_write(rt2x00dev, 25, 0x01);
2647                }
2648                rt2800_rfcsr_write(rt2x00dev, 26, 0x87);
2649                rt2800_rfcsr_write(rt2x00dev, 27, 0x01);
2650                rt2800_rfcsr_write(rt2x00dev, 29, 0x9f);
2651        }
2652
2653        reg = rt2800_register_read(rt2x00dev, GPIO_CTRL);
2654        rt2x00_set_field32(&reg, GPIO_CTRL_DIR7, 0);
2655        if (rf->channel <= 14)
2656                rt2x00_set_field32(&reg, GPIO_CTRL_VAL7, 1);
2657        else
2658                rt2x00_set_field32(&reg, GPIO_CTRL_VAL7, 0);
2659        rt2800_register_write(rt2x00dev, GPIO_CTRL, reg);
2660
2661        rfcsr = rt2800_rfcsr_read(rt2x00dev, 7);
2662        rt2x00_set_field8(&rfcsr, RFCSR7_RF_TUNING, 1);
2663        rt2800_rfcsr_write(rt2x00dev, 7, rfcsr);
2664}
2665
2666static void rt2800_config_channel_rf3053(struct rt2x00_dev *rt2x00dev,
2667                                         struct ieee80211_conf *conf,
2668                                         struct rf_channel *rf,
2669                                         struct channel_info *info)
2670{
2671        struct rt2800_drv_data *drv_data = rt2x00dev->drv_data;
2672        u8 txrx_agc_fc;
2673        u8 txrx_h20m;
2674        u8 rfcsr;
2675        u8 bbp;
2676        const bool txbf_enabled = false; /* TODO */
2677
2678        /* TODO: use TX{0,1,2}FinePowerControl values from EEPROM */
2679        bbp = rt2800_bbp_read(rt2x00dev, 109);
2680        rt2x00_set_field8(&bbp, BBP109_TX0_POWER, 0);
2681        rt2x00_set_field8(&bbp, BBP109_TX1_POWER, 0);
2682        rt2800_bbp_write(rt2x00dev, 109, bbp);
2683
2684        bbp = rt2800_bbp_read(rt2x00dev, 110);
2685        rt2x00_set_field8(&bbp, BBP110_TX2_POWER, 0);
2686        rt2800_bbp_write(rt2x00dev, 110, bbp);
2687
2688        if (rf->channel <= 14) {
2689                /* Restore BBP 25 & 26 for 2.4 GHz */
2690                rt2800_bbp_write(rt2x00dev, 25, drv_data->bbp25);
2691                rt2800_bbp_write(rt2x00dev, 26, drv_data->bbp26);
2692        } else {
2693                /* Hard code BBP 25 & 26 for 5GHz */
2694
2695                /* Enable IQ Phase correction */
2696                rt2800_bbp_write(rt2x00dev, 25, 0x09);
2697                /* Setup IQ Phase correction value */
2698                rt2800_bbp_write(rt2x00dev, 26, 0xff);
2699        }
2700
2701        rt2800_rfcsr_write(rt2x00dev, 8, rf->rf1);
2702        rt2800_rfcsr_write(rt2x00dev, 9, rf->rf3 & 0xf);
2703
2704        rfcsr = rt2800_rfcsr_read(rt2x00dev, 11);
2705        rt2x00_set_field8(&rfcsr, RFCSR11_R, (rf->rf2 & 0x3));
2706        rt2800_rfcsr_write(rt2x00dev, 11, rfcsr);
2707
2708        rfcsr = rt2800_rfcsr_read(rt2x00dev, 11);
2709        rt2x00_set_field8(&rfcsr, RFCSR11_PLL_IDOH, 1);
2710        if (rf->channel <= 14)
2711                rt2x00_set_field8(&rfcsr, RFCSR11_PLL_MOD, 1);
2712        else
2713                rt2x00_set_field8(&rfcsr, RFCSR11_PLL_MOD, 2);
2714        rt2800_rfcsr_write(rt2x00dev, 11, rfcsr);
2715
2716        rfcsr = rt2800_rfcsr_read(rt2x00dev, 53);
2717        if (rf->channel <= 14) {
2718                rfcsr = 0;
2719                rt2x00_set_field8(&rfcsr, RFCSR53_TX_POWER,
2720                                  info->default_power1 & 0x1f);
2721        } else {
2722                if (rt2x00_is_usb(rt2x00dev))
2723                        rfcsr = 0x40;
2724
2725                rt2x00_set_field8(&rfcsr, RFCSR53_TX_POWER,
2726                                  ((info->default_power1 & 0x18) << 1) |
2727                                  (info->default_power1 & 7));
2728        }
2729        rt2800_rfcsr_write(rt2x00dev, 53, rfcsr);
2730
2731        rfcsr = rt2800_rfcsr_read(rt2x00dev, 55);
2732        if (rf->channel <= 14) {
2733                rfcsr = 0;
2734                rt2x00_set_field8(&rfcsr, RFCSR55_TX_POWER,
2735                                  info->default_power2 & 0x1f);
2736        } else {
2737                if (rt2x00_is_usb(rt2x00dev))
2738                        rfcsr = 0x40;
2739
2740                rt2x00_set_field8(&rfcsr, RFCSR55_TX_POWER,
2741                                  ((info->default_power2 & 0x18) << 1) |
2742                                  (info->default_power2 & 7));
2743        }
2744        rt2800_rfcsr_write(rt2x00dev, 55, rfcsr);
2745
2746        rfcsr = rt2800_rfcsr_read(rt2x00dev, 54);
2747        if (rf->channel <= 14) {
2748                rfcsr = 0;
2749                rt2x00_set_field8(&rfcsr, RFCSR54_TX_POWER,
2750                                  info->default_power3 & 0x1f);
2751        } else {
2752                if (rt2x00_is_usb(rt2x00dev))
2753                        rfcsr = 0x40;
2754
2755                rt2x00_set_field8(&rfcsr, RFCSR54_TX_POWER,
2756                                  ((info->default_power3 & 0x18) << 1) |
2757                                  (info->default_power3 & 7));
2758        }
2759        rt2800_rfcsr_write(rt2x00dev, 54, rfcsr);
2760
2761        rfcsr = rt2800_rfcsr_read(rt2x00dev, 1);
2762        rt2x00_set_field8(&rfcsr, RFCSR1_RX0_PD, 0);
2763        rt2x00_set_field8(&rfcsr, RFCSR1_TX0_PD, 0);
2764        rt2x00_set_field8(&rfcsr, RFCSR1_RX1_PD, 0);
2765        rt2x00_set_field8(&rfcsr, RFCSR1_TX1_PD, 0);
2766        rt2x00_set_field8(&rfcsr, RFCSR1_RX2_PD, 0);
2767        rt2x00_set_field8(&rfcsr, RFCSR1_TX2_PD, 0);
2768        rt2x00_set_field8(&rfcsr, RFCSR1_RF_BLOCK_EN, 1);
2769        rt2x00_set_field8(&rfcsr, RFCSR1_PLL_PD, 1);
2770
2771        switch (rt2x00dev->default_ant.tx_chain_num) {
2772        case 3:
2773                rt2x00_set_field8(&rfcsr, RFCSR1_TX2_PD, 1);
2774                /* fallthrough */
2775        case 2:
2776                rt2x00_set_field8(&rfcsr, RFCSR1_TX1_PD, 1);
2777                /* fallthrough */
2778        case 1:
2779                rt2x00_set_field8(&rfcsr, RFCSR1_TX0_PD, 1);
2780                break;
2781        }
2782
2783        switch (rt2x00dev->default_ant.rx_chain_num) {
2784        case 3:
2785                rt2x00_set_field8(&rfcsr, RFCSR1_RX2_PD, 1);
2786                /* fallthrough */
2787        case 2:
2788                rt2x00_set_field8(&rfcsr, RFCSR1_RX1_PD, 1);
2789                /* fallthrough */
2790        case 1:
2791                rt2x00_set_field8(&rfcsr, RFCSR1_RX0_PD, 1);
2792                break;
2793        }
2794        rt2800_rfcsr_write(rt2x00dev, 1, rfcsr);
2795
2796        rt2800_freq_cal_mode1(rt2x00dev);
2797
2798        if (conf_is_ht40(conf)) {
2799                txrx_agc_fc = rt2x00_get_field8(drv_data->calibration_bw40,
2800                                                RFCSR24_TX_AGC_FC);
2801                txrx_h20m = rt2x00_get_field8(drv_data->calibration_bw40,
2802                                              RFCSR24_TX_H20M);
2803        } else {
2804                txrx_agc_fc = rt2x00_get_field8(drv_data->calibration_bw20,
2805                                                RFCSR24_TX_AGC_FC);
2806                txrx_h20m = rt2x00_get_field8(drv_data->calibration_bw20,
2807                                              RFCSR24_TX_H20M);
2808        }
2809
2810        /* NOTE: the reference driver does not writes the new value
2811         * back to RFCSR 32
2812         */
2813        rfcsr = rt2800_rfcsr_read(rt2x00dev, 32);
2814        rt2x00_set_field8(&rfcsr, RFCSR32_TX_AGC_FC, txrx_agc_fc);
2815
2816        if (rf->channel <= 14)
2817                rfcsr = 0xa0;
2818        else
2819                rfcsr = 0x80;
2820        rt2800_rfcsr_write(rt2x00dev, 31, rfcsr);
2821
2822        rfcsr = rt2800_rfcsr_read(rt2x00dev, 30);
2823        rt2x00_set_field8(&rfcsr, RFCSR30_TX_H20M, txrx_h20m);
2824        rt2x00_set_field8(&rfcsr, RFCSR30_RX_H20M, txrx_h20m);
2825        rt2800_rfcsr_write(rt2x00dev, 30, rfcsr);
2826
2827        /* Band selection */
2828        rfcsr = rt2800_rfcsr_read(rt2x00dev, 36);
2829        if (rf->channel <= 14)
2830                rt2x00_set_field8(&rfcsr, RFCSR36_RF_BS, 1);
2831        else
2832                rt2x00_set_field8(&rfcsr, RFCSR36_RF_BS, 0);
2833        rt2800_rfcsr_write(rt2x00dev, 36, rfcsr);
2834
2835        rfcsr = rt2800_rfcsr_read(rt2x00dev, 34);
2836        if (rf->channel <= 14)
2837                rfcsr = 0x3c;
2838        else
2839                rfcsr = 0x20;
2840        rt2800_rfcsr_write(rt2x00dev, 34, rfcsr);
2841
2842        rfcsr = rt2800_rfcsr_read(rt2x00dev, 12);
2843        if (rf->channel <= 14)
2844                rfcsr = 0x1a;
2845        else
2846                rfcsr = 0x12;
2847        rt2800_rfcsr_write(rt2x00dev, 12, rfcsr);
2848
2849        rfcsr = rt2800_rfcsr_read(rt2x00dev, 6);
2850        if (rf->channel >= 1 && rf->channel <= 14)
2851                rt2x00_set_field8(&rfcsr, RFCSR6_VCO_IC, 1);
2852        else if (rf->channel >= 36 && rf->channel <= 64)
2853                rt2x00_set_field8(&rfcsr, RFCSR6_VCO_IC, 2);
2854        else if (rf->channel >= 100 && rf->channel <= 128)
2855                rt2x00_set_field8(&rfcsr, RFCSR6_VCO_IC, 2);
2856        else
2857                rt2x00_set_field8(&rfcsr, RFCSR6_VCO_IC, 1);
2858        rt2800_rfcsr_write(rt2x00dev, 6, rfcsr);
2859
2860        rfcsr = rt2800_rfcsr_read(rt2x00dev, 30);
2861        rt2x00_set_field8(&rfcsr, RFCSR30_RX_VCM, 2);
2862        rt2800_rfcsr_write(rt2x00dev, 30, rfcsr);
2863
2864        rt2800_rfcsr_write(rt2x00dev, 46, 0x60);
2865
2866        if (rf->channel <= 14) {
2867                rt2800_rfcsr_write(rt2x00dev, 10, 0xd3);
2868                rt2800_rfcsr_write(rt2x00dev, 13, 0x12);
2869        } else {
2870                rt2800_rfcsr_write(rt2x00dev, 10, 0xd8);
2871                rt2800_rfcsr_write(rt2x00dev, 13, 0x23);
2872        }
2873
2874        rfcsr = rt2800_rfcsr_read(rt2x00dev, 51);
2875        rt2x00_set_field8(&rfcsr, RFCSR51_BITS01, 1);
2876        rt2800_rfcsr_write(rt2x00dev, 51, rfcsr);
2877
2878        rfcsr = rt2800_rfcsr_read(rt2x00dev, 51);
2879        if (rf->channel <= 14) {
2880                rt2x00_set_field8(&rfcsr, RFCSR51_BITS24, 5);
2881                rt2x00_set_field8(&rfcsr, RFCSR51_BITS57, 3);
2882        } else {
2883                rt2x00_set_field8(&rfcsr, RFCSR51_BITS24, 4);
2884                rt2x00_set_field8(&rfcsr, RFCSR51_BITS57, 2);
2885        }
2886        rt2800_rfcsr_write(rt2x00dev, 51, rfcsr);
2887
2888        rfcsr = rt2800_rfcsr_read(rt2x00dev, 49);
2889        if (rf->channel <= 14)
2890                rt2x00_set_field8(&rfcsr, RFCSR49_TX_LO1_IC, 3);
2891        else
2892                rt2x00_set_field8(&rfcsr, RFCSR49_TX_LO1_IC, 2);
2893
2894        if (txbf_enabled)
2895                rt2x00_set_field8(&rfcsr, RFCSR49_TX_DIV, 1);
2896
2897        rt2800_rfcsr_write(rt2x00dev, 49, rfcsr);
2898
2899        rfcsr = rt2800_rfcsr_read(rt2x00dev, 50);
2900        rt2x00_set_field8(&rfcsr, RFCSR50_TX_LO1_EN, 0);
2901        rt2800_rfcsr_write(rt2x00dev, 50, rfcsr);
2902
2903        rfcsr = rt2800_rfcsr_read(rt2x00dev, 57);
2904        if (rf->channel <= 14)
2905                rt2x00_set_field8(&rfcsr, RFCSR57_DRV_CC, 0x1b);
2906        else
2907                rt2x00_set_field8(&rfcsr, RFCSR57_DRV_CC, 0x0f);
2908        rt2800_rfcsr_write(rt2x00dev, 57, rfcsr);
2909
2910        if (rf->channel <= 14) {
2911                rt2800_rfcsr_write(rt2x00dev, 44, 0x93);
2912                rt2800_rfcsr_write(rt2x00dev, 52, 0x45);
2913        } else {
2914                rt2800_rfcsr_write(rt2x00dev, 44, 0x9b);
2915                rt2800_rfcsr_write(rt2x00dev, 52, 0x05);
2916        }
2917
2918        /* Initiate VCO calibration */
2919        rfcsr = rt2800_rfcsr_read(rt2x00dev, 3);
2920        if (rf->channel <= 14) {
2921                rt2x00_set_field8(&rfcsr, RFCSR3_VCOCAL_EN, 1);
2922        } else {
2923                rt2x00_set_field8(&rfcsr, RFCSR3_BIT1, 1);
2924                rt2x00_set_field8(&rfcsr, RFCSR3_BIT2, 1);
2925                rt2x00_set_field8(&rfcsr, RFCSR3_BIT3, 1);
2926                rt2x00_set_field8(&rfcsr, RFCSR3_BIT4, 1);
2927                rt2x00_set_field8(&rfcsr, RFCSR3_BIT5, 1);
2928                rt2x00_set_field8(&rfcsr, RFCSR3_VCOCAL_EN, 1);
2929        }
2930        rt2800_rfcsr_write(rt2x00dev, 3, rfcsr);
2931
2932        if (rf->channel >= 1 && rf->channel <= 14) {
2933                rfcsr = 0x23;
2934                if (txbf_enabled)
2935                        rt2x00_set_field8(&rfcsr, RFCSR39_RX_DIV, 1);
2936                rt2800_rfcsr_write(rt2x00dev, 39, rfcsr);
2937
2938                rt2800_rfcsr_write(rt2x00dev, 45, 0xbb);
2939        } else if (rf->channel >= 36 && rf->channel <= 64) {
2940                rfcsr = 0x36;
2941                if (txbf_enabled)
2942                        rt2x00_set_field8(&rfcsr, RFCSR39_RX_DIV, 1);
2943                rt2800_rfcsr_write(rt2x00dev, 39, 0x36);
2944
2945                rt2800_rfcsr_write(rt2x00dev, 45, 0xeb);
2946        } else if (rf->channel >= 100 && rf->channel <= 128) {
2947                rfcsr = 0x32;
2948                if (txbf_enabled)
2949                        rt2x00_set_field8(&rfcsr, RFCSR39_RX_DIV, 1);
2950                rt2800_rfcsr_write(rt2x00dev, 39, rfcsr);
2951
2952                rt2800_rfcsr_write(rt2x00dev, 45, 0xb3);
2953        } else {
2954                rfcsr = 0x30;
2955                if (txbf_enabled)
2956                        rt2x00_set_field8(&rfcsr, RFCSR39_RX_DIV, 1);
2957                rt2800_rfcsr_write(rt2x00dev, 39, rfcsr);
2958
2959                rt2800_rfcsr_write(rt2x00dev, 45, 0x9b);
2960        }
2961}
2962
2963static void rt2800_config_channel_rf3853(struct rt2x00_dev *rt2x00dev,
2964                                         struct ieee80211_conf *conf,
2965                                         struct rf_channel *rf,
2966                                         struct channel_info *info)
2967{
2968        u8 rfcsr;
2969        u8 bbp;
2970        u8 pwr1, pwr2, pwr3;
2971
2972        const bool txbf_enabled = false; /* TODO */
2973
2974        /* TODO: add band selection */
2975
2976        if (rf->channel <= 14)
2977                rt2800_rfcsr_write(rt2x00dev, 6, 0x40);
2978        else if (rf->channel < 132)
2979                rt2800_rfcsr_write(rt2x00dev, 6, 0x80);
2980        else
2981                rt2800_rfcsr_write(rt2x00dev, 6, 0x40);
2982
2983        rt2800_rfcsr_write(rt2x00dev, 8, rf->rf1);
2984        rt2800_rfcsr_write(rt2x00dev, 9, rf->rf3);
2985
2986        if (rf->channel <= 14)
2987                rt2800_rfcsr_write(rt2x00dev, 11, 0x46);
2988        else
2989                rt2800_rfcsr_write(rt2x00dev, 11, 0x48);
2990
2991        if (rf->channel <= 14)
2992                rt2800_rfcsr_write(rt2x00dev, 12, 0x1a);
2993        else
2994                rt2800_rfcsr_write(rt2x00dev, 12, 0x52);
2995
2996        rt2800_rfcsr_write(rt2x00dev, 13, 0x12);
2997
2998        rfcsr = rt2800_rfcsr_read(rt2x00dev, 1);
2999        rt2x00_set_field8(&rfcsr, RFCSR1_RX0_PD, 0);
3000        rt2x00_set_field8(&rfcsr, RFCSR1_TX0_PD, 0);
3001        rt2x00_set_field8(&rfcsr, RFCSR1_RX1_PD, 0);
3002        rt2x00_set_field8(&rfcsr, RFCSR1_TX1_PD, 0);
3003        rt2x00_set_field8(&rfcsr, RFCSR1_RX2_PD, 0);
3004        rt2x00_set_field8(&rfcsr, RFCSR1_TX2_PD, 0);
3005        rt2x00_set_field8(&rfcsr, RFCSR1_RF_BLOCK_EN, 1);
3006        rt2x00_set_field8(&rfcsr, RFCSR1_PLL_PD, 1);
3007
3008        switch (rt2x00dev->default_ant.tx_chain_num) {
3009        case 3:
3010                rt2x00_set_field8(&rfcsr, RFCSR1_TX2_PD, 1);
3011                /* fallthrough */
3012        case 2:
3013                rt2x00_set_field8(&rfcsr, RFCSR1_TX1_PD, 1);
3014                /* fallthrough */
3015        case 1:
3016                rt2x00_set_field8(&rfcsr, RFCSR1_TX0_PD, 1);
3017                break;
3018        }
3019
3020        switch (rt2x00dev->default_ant.rx_chain_num) {
3021        case 3:
3022                rt2x00_set_field8(&rfcsr, RFCSR1_RX2_PD, 1);
3023                /* fallthrough */
3024        case 2:
3025                rt2x00_set_field8(&rfcsr, RFCSR1_RX1_PD, 1);
3026                /* fallthrough */
3027        case 1:
3028                rt2x00_set_field8(&rfcsr, RFCSR1_RX0_PD, 1);
3029                break;
3030        }
3031        rt2800_rfcsr_write(rt2x00dev, 1, rfcsr);
3032
3033        rt2800_freq_cal_mode1(rt2x00dev);
3034
3035        rfcsr = rt2800_rfcsr_read(rt2x00dev, 30);
3036        if (!conf_is_ht40(conf))
3037                rfcsr &= ~(0x06);
3038        else
3039                rfcsr |= 0x06;
3040        rt2800_rfcsr_write(rt2x00dev, 30, rfcsr);
3041
3042        if (rf->channel <= 14)
3043                rt2800_rfcsr_write(rt2x00dev, 31, 0xa0);
3044        else
3045                rt2800_rfcsr_write(rt2x00dev, 31, 0x80);
3046
3047        if (conf_is_ht40(conf))
3048                rt2800_rfcsr_write(rt2x00dev, 32, 0x80);
3049        else
3050                rt2800_rfcsr_write(rt2x00dev, 32, 0xd8);
3051
3052        if (rf->channel <= 14)
3053                rt2800_rfcsr_write(rt2x00dev, 34, 0x3c);
3054        else
3055                rt2800_rfcsr_write(rt2x00dev, 34, 0x20);
3056
3057        /* loopback RF_BS */
3058        rfcsr = rt2800_rfcsr_read(rt2x00dev, 36);
3059        if (rf->channel <= 14)
3060                rt2x00_set_field8(&rfcsr, RFCSR36_RF_BS, 1);
3061        else
3062                rt2x00_set_field8(&rfcsr, RFCSR36_RF_BS, 0);
3063        rt2800_rfcsr_write(rt2x00dev, 36, rfcsr);
3064
3065        if (rf->channel <= 14)
3066                rfcsr = 0x23;
3067        else if (rf->channel < 100)
3068                rfcsr = 0x36;
3069        else if (rf->channel < 132)
3070                rfcsr = 0x32;
3071        else
3072                rfcsr = 0x30;
3073
3074        if (txbf_enabled)
3075                rfcsr |= 0x40;
3076
3077        rt2800_rfcsr_write(rt2x00dev, 39, rfcsr);
3078
3079        if (rf->channel <= 14)
3080                rt2800_rfcsr_write(rt2x00dev, 44, 0x93);
3081        else
3082                rt2800_rfcsr_write(rt2x00dev, 44, 0x9b);
3083
3084        if (rf->channel <= 14)
3085                rfcsr = 0xbb;
3086        else if (rf->channel < 100)
3087                rfcsr = 0xeb;
3088        else if (rf->channel < 132)
3089                rfcsr = 0xb3;
3090        else
3091                rfcsr = 0x9b;
3092        rt2800_rfcsr_write(rt2x00dev, 45, rfcsr);
3093
3094        if (rf->channel <= 14)
3095                rfcsr = 0x8e;
3096        else
3097                rfcsr = 0x8a;
3098
3099        if (txbf_enabled)
3100                rfcsr |= 0x20;
3101
3102        rt2800_rfcsr_write(rt2x00dev, 49, rfcsr);
3103
3104        rt2800_rfcsr_write(rt2x00dev, 50, 0x86);
3105
3106        rfcsr = rt2800_rfcsr_read(rt2x00dev, 51);
3107        if (rf->channel <= 14)
3108                rt2800_rfcsr_write(rt2x00dev, 51, 0x75);
3109        else
3110                rt2800_rfcsr_write(rt2x00dev, 51, 0x51);
3111
3112        rfcsr = rt2800_rfcsr_read(rt2x00dev, 52);
3113        if (rf->channel <= 14)
3114                rt2800_rfcsr_write(rt2x00dev, 52, 0x45);
3115        else
3116                rt2800_rfcsr_write(rt2x00dev, 52, 0x05);
3117
3118        if (rf->channel <= 14) {
3119                pwr1 = info->default_power1 & 0x1f;
3120                pwr2 = info->default_power2 & 0x1f;
3121                pwr3 = info->default_power3 & 0x1f;
3122        } else {
3123                pwr1 = 0x48 | ((info->default_power1 & 0x18) << 1) |
3124                        (info->default_power1 & 0x7);
3125                pwr2 = 0x48 | ((info->default_power2 & 0x18) << 1) |
3126                        (info->default_power2 & 0x7);
3127                pwr3 = 0x48 | ((info->default_power3 & 0x18) << 1) |
3128                        (info->default_power3 & 0x7);
3129        }
3130
3131        rt2800_rfcsr_write(rt2x00dev, 53, pwr1);
3132        rt2800_rfcsr_write(rt2x00dev, 54, pwr2);
3133        rt2800_rfcsr_write(rt2x00dev, 55, pwr3);
3134
3135        rt2x00_dbg(rt2x00dev, "Channel:%d, pwr1:%02x, pwr2:%02x, pwr3:%02x\n",
3136                   rf->channel, pwr1, pwr2, pwr3);
3137
3138        bbp = (info->default_power1 >> 5) |
3139              ((info->default_power2 & 0xe0) >> 1);
3140        rt2800_bbp_write(rt2x00dev, 109, bbp);
3141
3142        bbp = rt2800_bbp_read(rt2x00dev, 110);
3143        bbp &= 0x0f;
3144        bbp |= (info->default_power3 & 0xe0) >> 1;
3145        rt2800_bbp_write(rt2x00dev, 110, bbp);
3146
3147        rfcsr = rt2800_rfcsr_read(rt2x00dev, 57);
3148        if (rf->channel <= 14)
3149                rt2800_rfcsr_write(rt2x00dev, 57, 0x6e);
3150        else
3151                rt2800_rfcsr_write(rt2x00dev, 57, 0x3e);
3152
3153        /* Enable RF tuning */
3154        rfcsr = rt2800_rfcsr_read(rt2x00dev, 3);
3155        rt2x00_set_field8(&rfcsr, RFCSR3_VCOCAL_EN, 1);
3156        rt2800_rfcsr_write(rt2x00dev, 3, rfcsr);
3157
3158        udelay(2000);
3159
3160        bbp = rt2800_bbp_read(rt2x00dev, 49);
3161        /* clear update flag */
3162        rt2800_bbp_write(rt2x00dev, 49, bbp & 0xfe);
3163        rt2800_bbp_write(rt2x00dev, 49, bbp);
3164
3165        /* TODO: add calibration for TxBF */
3166}
3167
3168#define POWER_BOUND             0x27
3169#define POWER_BOUND_5G          0x2b
3170
3171static void rt2800_config_channel_rf3290(struct rt2x00_dev *rt2x00dev,
3172                                         struct ieee80211_conf *conf,
3173                                         struct rf_channel *rf,
3174                                         struct channel_info *info)
3175{
3176        u8 rfcsr;
3177
3178        rt2800_rfcsr_write(rt2x00dev, 8, rf->rf1);
3179        rt2800_rfcsr_write(rt2x00dev, 9, rf->rf3);
3180        rfcsr = rt2800_rfcsr_read(rt2x00dev, 11);
3181        rt2x00_set_field8(&rfcsr, RFCSR11_R, rf->rf2);
3182        rt2800_rfcsr_write(rt2x00dev, 11, rfcsr);
3183
3184        rfcsr = rt2800_rfcsr_read(rt2x00dev, 49);
3185        if (info->default_power1 > POWER_BOUND)
3186                rt2x00_set_field8(&rfcsr, RFCSR49_TX, POWER_BOUND);
3187        else
3188                rt2x00_set_field8(&rfcsr, RFCSR49_TX, info->default_power1);
3189        rt2800_rfcsr_write(rt2x00dev, 49, rfcsr);
3190
3191        rt2800_freq_cal_mode1(rt2x00dev);
3192
3193        if (rf->channel <= 14) {
3194                if (rf->channel == 6)
3195                        rt2800_bbp_write(rt2x00dev, 68, 0x0c);
3196                else
3197                        rt2800_bbp_write(rt2x00dev, 68, 0x0b);
3198
3199                if (rf->channel >= 1 && rf->channel <= 6)
3200                        rt2800_bbp_write(rt2x00dev, 59, 0x0f);
3201                else if (rf->channel >= 7 && rf->channel <= 11)
3202                        rt2800_bbp_write(rt2x00dev, 59, 0x0e);
3203                else if (rf->channel >= 12 && rf->channel <= 14)
3204                        rt2800_bbp_write(rt2x00dev, 59, 0x0d);
3205        }
3206}
3207
3208static void rt2800_config_channel_rf3322(struct rt2x00_dev *rt2x00dev,
3209                                         struct ieee80211_conf *conf,
3210                                         struct rf_channel *rf,
3211                                         struct channel_info *info)
3212{
3213        u8 rfcsr;
3214
3215        rt2800_rfcsr_write(rt2x00dev, 8, rf->rf1);
3216        rt2800_rfcsr_write(rt2x00dev, 9, rf->rf3);
3217
3218        rt2800_rfcsr_write(rt2x00dev, 11, 0x42);
3219        rt2800_rfcsr_write(rt2x00dev, 12, 0x1c);
3220        rt2800_rfcsr_write(rt2x00dev, 13, 0x00);
3221
3222        if (info->default_power1 > POWER_BOUND)
3223                rt2800_rfcsr_write(rt2x00dev, 47, POWER_BOUND);
3224        else
3225                rt2800_rfcsr_write(rt2x00dev, 47, info->default_power1);
3226
3227        if (info->default_power2 > POWER_BOUND)
3228                rt2800_rfcsr_write(rt2x00dev, 48, POWER_BOUND);
3229        else
3230                rt2800_rfcsr_write(rt2x00dev, 48, info->default_power2);
3231
3232        rt2800_freq_cal_mode1(rt2x00dev);
3233
3234        rfcsr = rt2800_rfcsr_read(rt2x00dev, 1);
3235        rt2x00_set_field8(&rfcsr, RFCSR1_RX0_PD, 1);
3236        rt2x00_set_field8(&rfcsr, RFCSR1_TX0_PD, 1);
3237
3238        if ( rt2x00dev->default_ant.tx_chain_num == 2 )
3239                rt2x00_set_field8(&rfcsr, RFCSR1_TX1_PD, 1);
3240        else
3241                rt2x00_set_field8(&rfcsr, RFCSR1_TX1_PD, 0);
3242
3243        if ( rt2x00dev->default_ant.rx_chain_num == 2 )
3244                rt2x00_set_field8(&rfcsr, RFCSR1_RX1_PD, 1);
3245        else
3246                rt2x00_set_field8(&rfcsr, RFCSR1_RX1_PD, 0);
3247
3248        rt2x00_set_field8(&rfcsr, RFCSR1_RX2_PD, 0);
3249        rt2x00_set_field8(&rfcsr, RFCSR1_TX2_PD, 0);
3250
3251        rt2800_rfcsr_write(rt2x00dev, 1, rfcsr);
3252
3253        rt2800_rfcsr_write(rt2x00dev, 31, 80);
3254}
3255
3256static void rt2800_config_channel_rf53xx(struct rt2x00_dev *rt2x00dev,
3257                                         struct ieee80211_conf *conf,
3258                                         struct rf_channel *rf,
3259                                         struct channel_info *info)
3260{
3261        u8 rfcsr;
3262        int idx = rf->channel-1;
3263
3264        rt2800_rfcsr_write(rt2x00dev, 8, rf->rf1);
3265        rt2800_rfcsr_write(rt2x00dev, 9, rf->rf3);
3266        rfcsr = rt2800_rfcsr_read(rt2x00dev, 11);
3267        rt2x00_set_field8(&rfcsr, RFCSR11_R, rf->rf2);
3268        rt2800_rfcsr_write(rt2x00dev, 11, rfcsr);
3269
3270        rfcsr = rt2800_rfcsr_read(rt2x00dev, 49);
3271        if (info->default_power1 > POWER_BOUND)
3272                rt2x00_set_field8(&rfcsr, RFCSR49_TX, POWER_BOUND);
3273        else
3274                rt2x00_set_field8(&rfcsr, RFCSR49_TX, info->default_power1);
3275        rt2800_rfcsr_write(rt2x00dev, 49, rfcsr);
3276
3277        if (rt2x00_rt(rt2x00dev, RT5392)) {
3278                rfcsr = rt2800_rfcsr_read(rt2x00dev, 50);
3279                if (info->default_power2 > POWER_BOUND)
3280                        rt2x00_set_field8(&rfcsr, RFCSR50_TX, POWER_BOUND);
3281                else
3282                        rt2x00_set_field8(&rfcsr, RFCSR50_TX,
3283                                          info->default_power2);
3284                rt2800_rfcsr_write(rt2x00dev, 50, rfcsr);
3285        }
3286
3287        rfcsr = rt2800_rfcsr_read(rt2x00dev, 1);
3288        if (rt2x00_rt(rt2x00dev, RT5392)) {
3289                rt2x00_set_field8(&rfcsr, RFCSR1_RX1_PD, 1);
3290                rt2x00_set_field8(&rfcsr, RFCSR1_TX1_PD, 1);
3291        }
3292        rt2x00_set_field8(&rfcsr, RFCSR1_RF_BLOCK_EN, 1);
3293        rt2x00_set_field8(&rfcsr, RFCSR1_PLL_PD, 1);
3294        rt2x00_set_field8(&rfcsr, RFCSR1_RX0_PD, 1);
3295        rt2x00_set_field8(&rfcsr, RFCSR1_TX0_PD, 1);
3296        rt2800_rfcsr_write(rt2x00dev, 1, rfcsr);
3297
3298        rt2800_freq_cal_mode1(rt2x00dev);
3299
3300        if (rt2x00_has_cap_bt_coexist(rt2x00dev)) {
3301                if (rt2x00_rt_rev_gte(rt2x00dev, RT5390, REV_RT5390F)) {
3302                        /* r55/r59 value array of channel 1~14 */
3303                        static const char r55_bt_rev[] = {0x83, 0x83,
3304                                0x83, 0x73, 0x73, 0x63, 0x53, 0x53,
3305                                0x53, 0x43, 0x43, 0x43, 0x43, 0x43};
3306                        static const char r59_bt_rev[] = {0x0e, 0x0e,
3307                                0x0e, 0x0e, 0x0e, 0x0b, 0x0a, 0x09,
3308                                0x07, 0x07, 0x07, 0x07, 0x07, 0x07};
3309
3310                        rt2800_rfcsr_write(rt2x00dev, 55,
3311                                           r55_bt_rev[idx]);
3312                        rt2800_rfcsr_write(rt2x00dev, 59,
3313                                           r59_bt_rev[idx]);
3314                } else {
3315                        static const char r59_bt[] = {0x8b, 0x8b, 0x8b,
3316                                0x8b, 0x8b, 0x8b, 0x8b, 0x8a, 0x89,
3317                                0x88, 0x88, 0x86, 0x85, 0x84};
3318
3319                        rt2800_rfcsr_write(rt2x00dev, 59, r59_bt[idx]);
3320                }
3321        } else {
3322                if (rt2x00_rt_rev_gte(rt2x00dev, RT5390, REV_RT5390F)) {
3323                        static const char r55_nonbt_rev[] = {0x23, 0x23,
3324                                0x23, 0x23, 0x13, 0x13, 0x03, 0x03,
3325                                0x03, 0x03, 0x03, 0x03, 0x03, 0x03};
3326                        static const char r59_nonbt_rev[] = {0x07, 0x07,
3327                                0x07, 0x07, 0x07, 0x07, 0x07, 0x07,
3328                                0x07, 0x07, 0x06, 0x05, 0x04, 0x04};
3329
3330                        rt2800_rfcsr_write(rt2x00dev, 55,
3331                                           r55_nonbt_rev[idx]);
3332                        rt2800_rfcsr_write(rt2x00dev, 59,
3333                                           r59_nonbt_rev[idx]);
3334                } else if (rt2x00_rt(rt2x00dev, RT5390) ||
3335                           rt2x00_rt(rt2x00dev, RT5392) ||
3336                           rt2x00_rt(rt2x00dev, RT6352)) {
3337                        static const char r59_non_bt[] = {0x8f, 0x8f,
3338                                0x8f, 0x8f, 0x8f, 0x8f, 0x8f, 0x8d,
3339                                0x8a, 0x88, 0x88, 0x87, 0x87, 0x86};
3340
3341                        rt2800_rfcsr_write(rt2x00dev, 59,
3342                                           r59_non_bt[idx]);
3343                } else if (rt2x00_rt(rt2x00dev, RT5350)) {
3344                        static const char r59_non_bt[] = {0x0b, 0x0b,
3345                                0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0a,
3346                                0x0a, 0x09, 0x08, 0x07, 0x07, 0x06};
3347
3348                        rt2800_rfcsr_write(rt2x00dev, 59,
3349                                           r59_non_bt[idx]);
3350                }
3351        }
3352}
3353
3354static void rt2800_config_channel_rf55xx(struct rt2x00_dev *rt2x00dev,
3355                                         struct ieee80211_conf *conf,
3356                                         struct rf_channel *rf,
3357                                         struct channel_info *info)
3358{
3359        u8 rfcsr, ep_reg;
3360        u32 reg;
3361        int power_bound;
3362
3363        /* TODO */
3364        const bool is_11b = false;
3365        const bool is_type_ep = false;
3366
3367        reg = rt2800_register_read(rt2x00dev, LDO_CFG0);
3368        rt2x00_set_field32(&reg, LDO_CFG0_LDO_CORE_VLEVEL,
3369                           (rf->channel > 14 || conf_is_ht40(conf)) ? 5 : 0);
3370        rt2800_register_write(rt2x00dev, LDO_CFG0, reg);
3371
3372        /* Order of values on rf_channel entry: N, K, mod, R */
3373        rt2800_rfcsr_write(rt2x00dev, 8, rf->rf1 & 0xff);
3374
3375        rfcsr = rt2800_rfcsr_read(rt2x00dev,  9);
3376        rt2x00_set_field8(&rfcsr, RFCSR9_K, rf->rf2 & 0xf);
3377        rt2x00_set_field8(&rfcsr, RFCSR9_N, (rf->rf1 & 0x100) >> 8);
3378        rt2x00_set_field8(&rfcsr, RFCSR9_MOD, ((rf->rf3 - 8) & 0x4) >> 2);
3379        rt2800_rfcsr_write(rt2x00dev, 9, rfcsr);
3380
3381        rfcsr = rt2800_rfcsr_read(rt2x00dev, 11);
3382        rt2x00_set_field8(&rfcsr, RFCSR11_R, rf->rf4 - 1);
3383        rt2x00_set_field8(&rfcsr, RFCSR11_MOD, (rf->rf3 - 8) & 0x3);
3384        rt2800_rfcsr_write(rt2x00dev, 11, rfcsr);
3385
3386        if (rf->channel <= 14) {
3387                rt2800_rfcsr_write(rt2x00dev, 10, 0x90);
3388                /* FIXME: RF11 owerwrite ? */
3389                rt2800_rfcsr_write(rt2x00dev, 11, 0x4A);
3390                rt2800_rfcsr_write(rt2x00dev, 12, 0x52);
3391                rt2800_rfcsr_write(rt2x00dev, 13, 0x42);
3392                rt2800_rfcsr_write(rt2x00dev, 22, 0x40);
3393                rt2800_rfcsr_write(rt2x00dev, 24, 0x4A);
3394                rt2800_rfcsr_write(rt2x00dev, 25, 0x80);
3395                rt2800_rfcsr_write(rt2x00dev, 27, 0x42);
3396                rt2800_rfcsr_write(rt2x00dev, 36, 0x80);
3397                rt2800_rfcsr_write(rt2x00dev, 37, 0x08);
3398                rt2800_rfcsr_write(rt2x00dev, 38, 0x89);
3399                rt2800_rfcsr_write(rt2x00dev, 39, 0x1B);
3400                rt2800_rfcsr_write(rt2x00dev, 40, 0x0D);
3401                rt2800_rfcsr_write(rt2x00dev, 41, 0x9B);
3402                rt2800_rfcsr_write(rt2x00dev, 42, 0xD5);
3403                rt2800_rfcsr_write(rt2x00dev, 43, 0x72);
3404                rt2800_rfcsr_write(rt2x00dev, 44, 0x0E);
3405                rt2800_rfcsr_write(rt2x00dev, 45, 0xA2);
3406                rt2800_rfcsr_write(rt2x00dev, 46, 0x6B);
3407                rt2800_rfcsr_write(rt2x00dev, 48, 0x10);
3408                rt2800_rfcsr_write(rt2x00dev, 51, 0x3E);
3409                rt2800_rfcsr_write(rt2x00dev, 52, 0x48);
3410                rt2800_rfcsr_write(rt2x00dev, 54, 0x38);
3411                rt2800_rfcsr_write(rt2x00dev, 56, 0xA1);
3412                rt2800_rfcsr_write(rt2x00dev, 57, 0x00);
3413                rt2800_rfcsr_write(rt2x00dev, 58, 0x39);
3414                rt2800_rfcsr_write(rt2x00dev, 60, 0x45);
3415                rt2800_rfcsr_write(rt2x00dev, 61, 0x91);
3416                rt2800_rfcsr_write(rt2x00dev, 62, 0x39);
3417
3418                /* TODO RF27 <- tssi */
3419
3420                rfcsr = rf->channel <= 10 ? 0x07 : 0x06;
3421                rt2800_rfcsr_write(rt2x00dev, 23, rfcsr);
3422                rt2800_rfcsr_write(rt2x00dev, 59, rfcsr);
3423
3424                if (is_11b) {
3425                        /* CCK */
3426                        rt2800_rfcsr_write(rt2x00dev, 31, 0xF8);
3427                        rt2800_rfcsr_write(rt2x00dev, 32, 0xC0);
3428                        if (is_type_ep)
3429                                rt2800_rfcsr_write(rt2x00dev, 55, 0x06);
3430                        else
3431                                rt2800_rfcsr_write(rt2x00dev, 55, 0x47);
3432                } else {
3433                        /* OFDM */
3434                        if (is_type_ep)
3435                                rt2800_rfcsr_write(rt2x00dev, 55, 0x03);
3436                        else
3437                                rt2800_rfcsr_write(rt2x00dev, 55, 0x43);
3438                }
3439
3440                power_bound = POWER_BOUND;
3441                ep_reg = 0x2;
3442        } else {
3443                rt2800_rfcsr_write(rt2x00dev, 10, 0x97);
3444                /* FIMXE: RF11 overwrite */
3445                rt2800_rfcsr_write(rt2x00dev, 11, 0x40);
3446                rt2800_rfcsr_write(rt2x00dev, 25, 0xBF);
3447                rt2800_rfcsr_write(rt2x00dev, 27, 0x42);
3448                rt2800_rfcsr_write(rt2x00dev, 36, 0x00);
3449                rt2800_rfcsr_write(rt2x00dev, 37, 0x04);
3450                rt2800_rfcsr_write(rt2x00dev, 38, 0x85);
3451                rt2800_rfcsr_write(rt2x00dev, 40, 0x42);
3452                rt2800_rfcsr_write(rt2x00dev, 41, 0xBB);
3453                rt2800_rfcsr_write(rt2x00dev, 42, 0xD7);
3454                rt2800_rfcsr_write(rt2x00dev, 45, 0x41);
3455                rt2800_rfcsr_write(rt2x00dev, 48, 0x00);
3456                rt2800_rfcsr_write(rt2x00dev, 57, 0x77);
3457                rt2800_rfcsr_write(rt2x00dev, 60, 0x05);
3458                rt2800_rfcsr_write(rt2x00dev, 61, 0x01);
3459
3460                /* TODO RF27 <- tssi */
3461
3462                if (rf->channel >= 36 && rf->channel <= 64) {
3463
3464                        rt2800_rfcsr_write(rt2x00dev, 12, 0x2E);
3465                        rt2800_rfcsr_write(rt2x00dev, 13, 0x22);
3466                        rt2800_rfcsr_write(rt2x00dev, 22, 0x60);
3467                        rt2800_rfcsr_write(rt2x00dev, 23, 0x7F);
3468                        if (rf->channel <= 50)
3469                                rt2800_rfcsr_write(rt2x00dev, 24, 0x09);
3470                        else if (rf->channel >= 52)
3471                                rt2800_rfcsr_write(rt2x00dev, 24, 0x07);
3472                        rt2800_rfcsr_write(rt2x00dev, 39, 0x1C);
3473                        rt2800_rfcsr_write(rt2x00dev, 43, 0x5B);
3474                        rt2800_rfcsr_write(rt2x00dev, 44, 0X40);
3475                        rt2800_rfcsr_write(rt2x00dev, 46, 0X00);
3476                        rt2800_rfcsr_write(rt2x00dev, 51, 0xFE);
3477                        rt2800_rfcsr_write(rt2x00dev, 52, 0x0C);
3478                        rt2800_rfcsr_write(rt2x00dev, 54, 0xF8);
3479                        if (rf->channel <= 50) {
3480                                rt2800_rfcsr_write(rt2x00dev, 55, 0x06),
3481                                rt2800_rfcsr_write(rt2x00dev, 56, 0xD3);
3482                        } else if (rf->channel >= 52) {
3483                                rt2800_rfcsr_write(rt2x00dev, 55, 0x04);
3484                                rt2800_rfcsr_write(rt2x00dev, 56, 0xBB);
3485                        }
3486
3487                        rt2800_rfcsr_write(rt2x00dev, 58, 0x15);
3488                        rt2800_rfcsr_write(rt2x00dev, 59, 0x7F);
3489                        rt2800_rfcsr_write(rt2x00dev, 62, 0x15);
3490
3491                } else if (rf->channel >= 100 && rf->channel <= 165) {
3492
3493                        rt2800_rfcsr_write(rt2x00dev, 12, 0x0E);
3494                        rt2800_rfcsr_write(rt2x00dev, 13, 0x42);
3495                        rt2800_rfcsr_write(rt2x00dev, 22, 0x40);
3496                        if (rf->channel <= 153) {
3497                                rt2800_rfcsr_write(rt2x00dev, 23, 0x3C);
3498                                rt2800_rfcsr_write(rt2x00dev, 24, 0x06);
3499                        } else if (rf->channel >= 155) {
3500                                rt2800_rfcsr_write(rt2x00dev, 23, 0x38);
3501                                rt2800_rfcsr_write(rt2x00dev, 24, 0x05);
3502                        }
3503                        if (rf->channel <= 138) {
3504                                rt2800_rfcsr_write(rt2x00dev, 39, 0x1A);
3505                                rt2800_rfcsr_write(rt2x00dev, 43, 0x3B);
3506                                rt2800_rfcsr_write(rt2x00dev, 44, 0x20);
3507                                rt2800_rfcsr_write(rt2x00dev, 46, 0x18);
3508                        } else if (rf->channel >= 140) {
3509                                rt2800_rfcsr_write(rt2x00dev, 39, 0x18);
3510                                rt2800_rfcsr_write(rt2x00dev, 43, 0x1B);
3511                                rt2800_rfcsr_write(rt2x00dev, 44, 0x10);
3512                                rt2800_rfcsr_write(rt2x00dev, 46, 0X08);
3513                        }
3514                        if (rf->channel <= 124)
3515                                rt2800_rfcsr_write(rt2x00dev, 51, 0xFC);
3516                        else if (rf->channel >= 126)
3517                                rt2800_rfcsr_write(rt2x00dev, 51, 0xEC);
3518                        if (rf->channel <= 138)
3519                                rt2800_rfcsr_write(rt2x00dev, 52, 0x06);
3520                        else if (rf->channel >= 140)
3521                                rt2800_rfcsr_write(rt2x00dev, 52, 0x06);
3522                        rt2800_rfcsr_write(rt2x00dev, 54, 0xEB);
3523                        if (rf->channel <= 138)
3524                                rt2800_rfcsr_write(rt2x00dev, 55, 0x01);
3525                        else if (rf->channel >= 140)
3526                                rt2800_rfcsr_write(rt2x00dev, 55, 0x00);
3527                        if (rf->channel <= 128)
3528                                rt2800_rfcsr_write(rt2x00dev, 56, 0xBB);
3529                        else if (rf->channel >= 130)
3530                                rt2800_rfcsr_write(rt2x00dev, 56, 0xAB);
3531                        if (rf->channel <= 116)
3532                                rt2800_rfcsr_write(rt2x00dev, 58, 0x1D);
3533                        else if (rf->channel >= 118)
3534                                rt2800_rfcsr_write(rt2x00dev, 58, 0x15);
3535                        if (rf->channel <= 138)
3536                                rt2800_rfcsr_write(rt2x00dev, 59, 0x3F);
3537                        else if (rf->channel >= 140)
3538                                rt2800_rfcsr_write(rt2x00dev, 59, 0x7C);
3539                        if (rf->channel <= 116)
3540                                rt2800_rfcsr_write(rt2x00dev, 62, 0x1D);
3541                        else if (rf->channel >= 118)
3542                                rt2800_rfcsr_write(rt2x00dev, 62, 0x15);
3543                }
3544
3545                power_bound = POWER_BOUND_5G;
3546                ep_reg = 0x3;
3547        }
3548
3549        rfcsr = rt2800_rfcsr_read(rt2x00dev, 49);
3550        if (info->default_power1 > power_bound)
3551                rt2x00_set_field8(&rfcsr, RFCSR49_TX, power_bound);
3552        else
3553                rt2x00_set_field8(&rfcsr, RFCSR49_TX, info->default_power1);
3554        if (is_type_ep)
3555                rt2x00_set_field8(&rfcsr, RFCSR49_EP, ep_reg);
3556        rt2800_rfcsr_write(rt2x00dev, 49, rfcsr);
3557
3558        rfcsr = rt2800_rfcsr_read(rt2x00dev, 50);
3559        if (info->default_power2 > power_bound)
3560                rt2x00_set_field8(&rfcsr, RFCSR50_TX, power_bound);
3561        else
3562                rt2x00_set_field8(&rfcsr, RFCSR50_TX, info->default_power2);
3563        if (is_type_ep)
3564                rt2x00_set_field8(&rfcsr, RFCSR50_EP, ep_reg);
3565        rt2800_rfcsr_write(rt2x00dev, 50, rfcsr);
3566
3567        rfcsr = rt2800_rfcsr_read(rt2x00dev, 1);
3568        rt2x00_set_field8(&rfcsr, RFCSR1_RF_BLOCK_EN, 1);
3569        rt2x00_set_field8(&rfcsr, RFCSR1_PLL_PD, 1);
3570
3571        rt2x00_set_field8(&rfcsr, RFCSR1_TX0_PD,
3572                          rt2x00dev->default_ant.tx_chain_num >= 1);
3573        rt2x00_set_field8(&rfcsr, RFCSR1_TX1_PD,
3574                          rt2x00dev->default_ant.tx_chain_num == 2);
3575        rt2x00_set_field8(&rfcsr, RFCSR1_TX2_PD, 0);
3576
3577        rt2x00_set_field8(&rfcsr, RFCSR1_RX0_PD,
3578                          rt2x00dev->default_ant.rx_chain_num >= 1);
3579        rt2x00_set_field8(&rfcsr, RFCSR1_RX1_PD,
3580                          rt2x00dev->default_ant.rx_chain_num == 2);
3581        rt2x00_set_field8(&rfcsr, RFCSR1_RX2_PD, 0);
3582
3583        rt2800_rfcsr_write(rt2x00dev, 1, rfcsr);
3584        rt2800_rfcsr_write(rt2x00dev, 6, 0xe4);
3585
3586        if (conf_is_ht40(conf))
3587                rt2800_rfcsr_write(rt2x00dev, 30, 0x16);
3588        else
3589                rt2800_rfcsr_write(rt2x00dev, 30, 0x10);
3590
3591        if (!is_11b) {
3592                rt2800_rfcsr_write(rt2x00dev, 31, 0x80);
3593                rt2800_rfcsr_write(rt2x00dev, 32, 0x80);
3594        }
3595
3596        /* TODO proper frequency adjustment */
3597        rt2800_freq_cal_mode1(rt2x00dev);
3598
3599        /* TODO merge with others */
3600        rfcsr = rt2800_rfcsr_read(rt2x00dev, 3);
3601        rt2x00_set_field8(&rfcsr, RFCSR3_VCOCAL_EN, 1);
3602        rt2800_rfcsr_write(rt2x00dev, 3, rfcsr);
3603
3604        /* BBP settings */
3605        rt2800_bbp_write(rt2x00dev, 62, 0x37 - rt2x00dev->lna_gain);
3606        rt2800_bbp_write(rt2x00dev, 63, 0x37 - rt2x00dev->lna_gain);
3607        rt2800_bbp_write(rt2x00dev, 64, 0x37 - rt2x00dev->lna_gain);
3608
3609        rt2800_bbp_write(rt2x00dev, 79, (rf->channel <= 14) ? 0x1C : 0x18);
3610        rt2800_bbp_write(rt2x00dev, 80, (rf->channel <= 14) ? 0x0E : 0x08);
3611        rt2800_bbp_write(rt2x00dev, 81, (rf->channel <= 14) ? 0x3A : 0x38);
3612        rt2800_bbp_write(rt2x00dev, 82, (rf->channel <= 14) ? 0x62 : 0x92);
3613
3614        /* GLRT band configuration */
3615        rt2800_bbp_write(rt2x00dev, 195, 128);
3616        rt2800_bbp_write(rt2x00dev, 196, (rf->channel <= 14) ? 0xE0 : 0xF0);
3617        rt2800_bbp_write(rt2x00dev, 195, 129);
3618        rt2800_bbp_write(rt2x00dev, 196, (rf->channel <= 14) ? 0x1F : 0x1E);
3619        rt2800_bbp_write(rt2x00dev, 195, 130);
3620        rt2800_bbp_write(rt2x00dev, 196, (rf->channel <= 14) ? 0x38 : 0x28);
3621        rt2800_bbp_write(rt2x00dev, 195, 131);
3622        rt2800_bbp_write(rt2x00dev, 196, (rf->channel <= 14) ? 0x32 : 0x20);
3623        rt2800_bbp_write(rt2x00dev, 195, 133);
3624        rt2800_bbp_write(rt2x00dev, 196, (rf->channel <= 14) ? 0x28 : 0x7F);
3625        rt2800_bbp_write(rt2x00dev, 195, 124);
3626        rt2800_bbp_write(rt2x00dev, 196, (rf->channel <= 14) ? 0x19 : 0x7F);
3627}
3628
3629static void rt2800_config_channel_rf7620(struct rt2x00_dev *rt2x00dev,
3630                                         struct ieee80211_conf *conf,
3631                                         struct rf_channel *rf,
3632                                         struct channel_info *info)
3633{
3634        struct rt2800_drv_data *drv_data = rt2x00dev->drv_data;
3635        u8 rx_agc_fc, tx_agc_fc;
3636        u8 rfcsr;
3637
3638        /* Frequeny plan setting */
3639        /* Rdiv setting (set 0x03 if Xtal==20)
3640         * R13[1:0]
3641         */
3642        rfcsr = rt2800_rfcsr_read(rt2x00dev, 13);
3643        rt2x00_set_field8(&rfcsr, RFCSR13_RDIV_MT7620,
3644                          rt2800_clk_is_20mhz(rt2x00dev) ? 3 : 0);
3645        rt2800_rfcsr_write(rt2x00dev, 13, rfcsr);
3646
3647        /* N setting
3648         * R20[7:0] in rf->rf1
3649         * R21[0] always 0
3650         */
3651        rfcsr = rt2800_rfcsr_read(rt2x00dev, 20);
3652        rfcsr = (rf->rf1 & 0x00ff);
3653        rt2800_rfcsr_write(rt2x00dev, 20, rfcsr);
3654
3655        rfcsr = rt2800_rfcsr_read(rt2x00dev, 21);
3656        rt2x00_set_field8(&rfcsr, RFCSR21_BIT1, 0);
3657        rt2800_rfcsr_write(rt2x00dev, 21, rfcsr);
3658
3659        /* K setting (always 0)
3660         * R16[3:0] (RF PLL freq selection)
3661         */
3662        rfcsr = rt2800_rfcsr_read(rt2x00dev, 16);
3663        rt2x00_set_field8(&rfcsr, RFCSR16_RF_PLL_FREQ_SEL_MT7620, 0);
3664        rt2800_rfcsr_write(rt2x00dev, 16, rfcsr);
3665
3666        /* D setting (always 0)
3667         * R22[2:0] (D=15, R22[2:0]=<111>)
3668         */
3669        rfcsr = rt2800_rfcsr_read(rt2x00dev, 22);
3670        rt2x00_set_field8(&rfcsr, RFCSR22_FREQPLAN_D_MT7620, 0);
3671        rt2800_rfcsr_write(rt2x00dev, 22, rfcsr);
3672
3673        /* Ksd setting
3674         * Ksd: R17<7:0> in rf->rf2
3675         *      R18<7:0> in rf->rf3
3676         *      R19<1:0> in rf->rf4
3677         */
3678        rfcsr = rt2800_rfcsr_read(rt2x00dev, 17);
3679        rfcsr = rf->rf2;
3680        rt2800_rfcsr_write(rt2x00dev, 17, rfcsr);
3681
3682        rfcsr = rt2800_rfcsr_read(rt2x00dev, 18);
3683        rfcsr = rf->rf3;
3684        rt2800_rfcsr_write(rt2x00dev, 18, rfcsr);
3685
3686        rfcsr = rt2800_rfcsr_read(rt2x00dev, 19);
3687        rt2x00_set_field8(&rfcsr, RFCSR19_K, rf->rf4);
3688        rt2800_rfcsr_write(rt2x00dev, 19, rfcsr);
3689
3690        /* Default: XO=20MHz , SDM mode */
3691        rfcsr = rt2800_rfcsr_read(rt2x00dev, 16);
3692        rt2x00_set_field8(&rfcsr, RFCSR16_SDM_MODE_MT7620, 0x80);
3693        rt2800_rfcsr_write(rt2x00dev, 16, rfcsr);
3694
3695        rfcsr = rt2800_rfcsr_read(rt2x00dev, 21);
3696        rt2x00_set_field8(&rfcsr, RFCSR21_BIT8, 1);
3697        rt2800_rfcsr_write(rt2x00dev, 21, rfcsr);
3698
3699        rfcsr = rt2800_rfcsr_read(rt2x00dev, 1);
3700        rt2x00_set_field8(&rfcsr, RFCSR1_TX2_EN_MT7620,
3701                          rt2x00dev->default_ant.tx_chain_num != 1);
3702        rt2800_rfcsr_write(rt2x00dev, 1, rfcsr);
3703
3704        rfcsr = rt2800_rfcsr_read(rt2x00dev, 2);
3705        rt2x00_set_field8(&rfcsr, RFCSR2_TX2_EN_MT7620,
3706                          rt2x00dev->default_ant.tx_chain_num != 1);
3707        rt2x00_set_field8(&rfcsr, RFCSR2_RX2_EN_MT7620,
3708                          rt2x00dev->default_ant.rx_chain_num != 1);
3709        rt2800_rfcsr_write(rt2x00dev, 2, rfcsr);
3710
3711        rfcsr = rt2800_rfcsr_read(rt2x00dev, 42);
3712        rt2x00_set_field8(&rfcsr, RFCSR42_TX2_EN_MT7620,
3713                          rt2x00dev->default_ant.tx_chain_num != 1);
3714        rt2800_rfcsr_write(rt2x00dev, 42, rfcsr);
3715
3716        /* RF for DC Cal BW */
3717        if (conf_is_ht40(conf)) {
3718                rt2800_rfcsr_write_dccal(rt2x00dev, 6, 0x10);
3719                rt2800_rfcsr_write_dccal(rt2x00dev, 7, 0x10);
3720                rt2800_rfcsr_write_dccal(rt2x00dev, 8, 0x04);
3721                rt2800_rfcsr_write_dccal(rt2x00dev, 58, 0x10);
3722                rt2800_rfcsr_write_dccal(rt2x00dev, 59, 0x10);
3723        } else {
3724                rt2800_rfcsr_write_dccal(rt2x00dev, 6, 0x20);
3725                rt2800_rfcsr_write_dccal(rt2x00dev, 7, 0x20);
3726                rt2800_rfcsr_write_dccal(rt2x00dev, 8, 0x00);
3727                rt2800_rfcsr_write_dccal(rt2x00dev, 58, 0x20);
3728                rt2800_rfcsr_write_dccal(rt2x00dev, 59, 0x20);
3729        }
3730
3731        if (conf_is_ht40(conf)) {
3732                rt2800_rfcsr_write_dccal(rt2x00dev, 58, 0x08);
3733                rt2800_rfcsr_write_dccal(rt2x00dev, 59, 0x08);
3734        } else {
3735                rt2800_rfcsr_write_dccal(rt2x00dev, 58, 0x28);
3736                rt2800_rfcsr_write_dccal(rt2x00dev, 59, 0x28);
3737        }
3738
3739        rfcsr = rt2800_rfcsr_read(rt2x00dev, 28);
3740        rt2x00_set_field8(&rfcsr, RFCSR28_CH11_HT40,
3741                          conf_is_ht40(conf) && (rf->channel == 11));
3742        rt2800_rfcsr_write(rt2x00dev, 28, rfcsr);
3743
3744        if (!test_bit(DEVICE_STATE_SCANNING, &rt2x00dev->flags)) {
3745                if (conf_is_ht40(conf)) {
3746                        rx_agc_fc = drv_data->rx_calibration_bw40;
3747                        tx_agc_fc = drv_data->tx_calibration_bw40;
3748                } else {
3749                        rx_agc_fc = drv_data->rx_calibration_bw20;
3750                        tx_agc_fc = drv_data->tx_calibration_bw20;
3751                }
3752                rfcsr = rt2800_rfcsr_read_bank(rt2x00dev, 5, 6);
3753                rfcsr &= (~0x3F);
3754                rfcsr |= rx_agc_fc;
3755                rt2800_rfcsr_write_bank(rt2x00dev, 5, 6, rfcsr);
3756                rfcsr = rt2800_rfcsr_read_bank(rt2x00dev, 5, 7);
3757                rfcsr &= (~0x3F);
3758                rfcsr |= rx_agc_fc;
3759                rt2800_rfcsr_write_bank(rt2x00dev, 5, 7, rfcsr);
3760                rfcsr = rt2800_rfcsr_read_bank(rt2x00dev, 7, 6);
3761                rfcsr &= (~0x3F);
3762                rfcsr |= rx_agc_fc;
3763                rt2800_rfcsr_write_bank(rt2x00dev, 7, 6, rfcsr);
3764                rfcsr = rt2800_rfcsr_read_bank(rt2x00dev, 7, 7);
3765                rfcsr &= (~0x3F);
3766                rfcsr |= rx_agc_fc;
3767                rt2800_rfcsr_write_bank(rt2x00dev, 7, 7, rfcsr);
3768
3769                rfcsr = rt2800_rfcsr_read_bank(rt2x00dev, 5, 58);
3770                rfcsr &= (~0x3F);
3771                rfcsr |= tx_agc_fc;
3772                rt2800_rfcsr_write_bank(rt2x00dev, 5, 58, rfcsr);
3773                rfcsr = rt2800_rfcsr_read_bank(rt2x00dev, 5, 59);
3774                rfcsr &= (~0x3F);
3775                rfcsr |= tx_agc_fc;
3776                rt2800_rfcsr_write_bank(rt2x00dev, 5, 59, rfcsr);
3777                rfcsr = rt2800_rfcsr_read_bank(rt2x00dev, 7, 58);
3778                rfcsr &= (~0x3F);
3779                rfcsr |= tx_agc_fc;
3780                rt2800_rfcsr_write_bank(rt2x00dev, 7, 58, rfcsr);
3781                rfcsr = rt2800_rfcsr_read_bank(rt2x00dev, 7, 59);
3782                rfcsr &= (~0x3F);
3783                rfcsr |= tx_agc_fc;
3784                rt2800_rfcsr_write_bank(rt2x00dev, 7, 59, rfcsr);
3785        }
3786}
3787
3788static void rt2800_config_alc(struct rt2x00_dev *rt2x00dev,
3789                              struct ieee80211_channel *chan,
3790                              int power_level) {
3791        u16 eeprom, target_power, max_power;
3792        u32 mac_sys_ctrl, mac_status;
3793        u32 reg;
3794        u8 bbp;
3795        int i;
3796
3797        /* hardware unit is 0.5dBm, limited to 23.5dBm */
3798        power_level *= 2;
3799        if (power_level > 0x2f)
3800                power_level = 0x2f;
3801
3802        max_power = chan->max_power * 2;
3803        if (max_power > 0x2f)
3804                max_power = 0x2f;
3805
3806        reg = rt2800_register_read(rt2x00dev, TX_ALC_CFG_0);
3807        rt2x00_set_field32(&reg, TX_ALC_CFG_0_CH_INIT_0, power_level);
3808        rt2x00_set_field32(&reg, TX_ALC_CFG_0_CH_INIT_1, power_level);
3809        rt2x00_set_field32(&reg, TX_ALC_CFG_0_LIMIT_0, max_power);
3810        rt2x00_set_field32(&reg, TX_ALC_CFG_0_LIMIT_1, max_power);
3811
3812        eeprom = rt2800_eeprom_read(rt2x00dev, EEPROM_NIC_CONF1);
3813        if (rt2x00_get_field16(eeprom, EEPROM_NIC_CONF1_INTERNAL_TX_ALC)) {
3814                /* init base power by eeprom target power */
3815                target_power = rt2800_eeprom_read(rt2x00dev,
3816                                                  EEPROM_TXPOWER_INIT);
3817                rt2x00_set_field32(&reg, TX_ALC_CFG_0_CH_INIT_0, target_power);
3818                rt2x00_set_field32(&reg, TX_ALC_CFG_0_CH_INIT_1, target_power);
3819        }
3820        rt2800_register_write(rt2x00dev, TX_ALC_CFG_0, reg);
3821
3822        reg = rt2800_register_read(rt2x00dev, TX_ALC_CFG_1);
3823        rt2x00_set_field32(&reg, TX_ALC_CFG_1_TX_TEMP_COMP, 0);
3824        rt2800_register_write(rt2x00dev, TX_ALC_CFG_1, reg);
3825
3826        /* Save MAC SYS CTRL registers */
3827        mac_sys_ctrl = rt2800_register_read(rt2x00dev, MAC_SYS_CTRL);
3828        /* Disable Tx/Rx */
3829        rt2800_register_write(rt2x00dev, MAC_SYS_CTRL, 0);
3830        /* Check MAC Tx/Rx idle */
3831        for (i = 0; i < 10000; i++) {
3832                mac_status = rt2800_register_read(rt2x00dev, MAC_STATUS_CFG);
3833                if (mac_status & 0x3)
3834                        usleep_range(50, 200);
3835                else
3836                        break;
3837        }
3838
3839        if (i == 10000)
3840                rt2x00_warn(rt2x00dev, "Wait MAC Status to MAX !!!\n");
3841
3842        if (chan->center_freq > 2457) {
3843                bbp = rt2800_bbp_read(rt2x00dev, 30);
3844                bbp = 0x40;
3845                rt2800_bbp_write(rt2x00dev, 30, bbp);
3846                rt2800_rfcsr_write(rt2x00dev, 39, 0);
3847                if (rt2x00_has_cap_external_lna_bg(rt2x00dev))
3848                        rt2800_rfcsr_write(rt2x00dev, 42, 0xfb);
3849                else
3850                        rt2800_rfcsr_write(rt2x00dev, 42, 0x7b);
3851        } else {
3852                bbp = rt2800_bbp_read(rt2x00dev, 30);
3853                bbp = 0x1f;
3854                rt2800_bbp_write(rt2x00dev, 30, bbp);
3855                rt2800_rfcsr_write(rt2x00dev, 39, 0x80);
3856                if (rt2x00_has_cap_external_lna_bg(rt2x00dev))
3857                        rt2800_rfcsr_write(rt2x00dev, 42, 0xdb);
3858                else
3859                        rt2800_rfcsr_write(rt2x00dev, 42, 0x5b);
3860        }
3861        rt2800_register_write(rt2x00dev, MAC_SYS_CTRL, mac_sys_ctrl);
3862
3863        rt2800_vco_calibration(rt2x00dev);
3864}
3865
3866static void rt2800_bbp_write_with_rx_chain(struct rt2x00_dev *rt2x00dev,
3867                                           const unsigned int word,
3868                                           const u8 value)
3869{
3870        u8 chain, reg;
3871
3872        for (chain = 0; chain < rt2x00dev->default_ant.rx_chain_num; chain++) {
3873                reg = rt2800_bbp_read(rt2x00dev, 27);
3874                rt2x00_set_field8(&reg,  BBP27_RX_CHAIN_SEL, chain);
3875                rt2800_bbp_write(rt2x00dev, 27, reg);
3876
3877                rt2800_bbp_write(rt2x00dev, word, value);
3878        }
3879}
3880
3881static void rt2800_iq_calibrate(struct rt2x00_dev *rt2x00dev, int channel)
3882{
3883        u8 cal;
3884
3885        /* TX0 IQ Gain */
3886        rt2800_bbp_write(rt2x00dev, 158, 0x2c);
3887        if (channel <= 14)
3888                cal = rt2x00_eeprom_byte(rt2x00dev, EEPROM_IQ_GAIN_CAL_TX0_2G);
3889        else if (channel >= 36 && channel <= 64)
3890                cal = rt2x00_eeprom_byte(rt2x00dev,
3891                                         EEPROM_IQ_GAIN_CAL_TX0_CH36_TO_CH64_5G);
3892        else if (channel >= 100 && channel <= 138)
3893                cal = rt2x00_eeprom_byte(rt2x00dev,
3894                                         EEPROM_IQ_GAIN_CAL_TX0_CH100_TO_CH138_5G);
3895        else if (channel >= 140 && channel <= 165)
3896                cal = rt2x00_eeprom_byte(rt2x00dev,
3897                                         EEPROM_IQ_GAIN_CAL_TX0_CH140_TO_CH165_5G);
3898        else
3899                cal = 0;
3900        rt2800_bbp_write(rt2x00dev, 159, cal);
3901
3902        /* TX0 IQ Phase */
3903        rt2800_bbp_write(rt2x00dev, 158, 0x2d);
3904        if (channel <= 14)
3905                cal = rt2x00_eeprom_byte(rt2x00dev, EEPROM_IQ_PHASE_CAL_TX0_2G);
3906        else if (channel >= 36 && channel <= 64)
3907                cal = rt2x00_eeprom_byte(rt2x00dev,
3908                                         EEPROM_IQ_PHASE_CAL_TX0_CH36_TO_CH64_5G);
3909        else if (channel >= 100 && channel <= 138)
3910                cal = rt2x00_eeprom_byte(rt2x00dev,
3911                                         EEPROM_IQ_PHASE_CAL_TX0_CH100_TO_CH138_5G);
3912        else if (channel >= 140 && channel <= 165)
3913                cal = rt2x00_eeprom_byte(rt2x00dev,
3914                                         EEPROM_IQ_PHASE_CAL_TX0_CH140_TO_CH165_5G);
3915        else
3916                cal = 0;
3917        rt2800_bbp_write(rt2x00dev, 159, cal);
3918
3919        /* TX1 IQ Gain */
3920        rt2800_bbp_write(rt2x00dev, 158, 0x4a);
3921        if (channel <= 14)
3922                cal = rt2x00_eeprom_byte(rt2x00dev, EEPROM_IQ_GAIN_CAL_TX1_2G);
3923        else if (channel >= 36 && channel <= 64)
3924                cal = rt2x00_eeprom_byte(rt2x00dev,
3925                                         EEPROM_IQ_GAIN_CAL_TX1_CH36_TO_CH64_5G);
3926        else if (channel >= 100 && channel <= 138)
3927                cal = rt2x00_eeprom_byte(rt2x00dev,
3928                                         EEPROM_IQ_GAIN_CAL_TX1_CH100_TO_CH138_5G);
3929        else if (channel >= 140 && channel <= 165)
3930                cal = rt2x00_eeprom_byte(rt2x00dev,
3931                                         EEPROM_IQ_GAIN_CAL_TX1_CH140_TO_CH165_5G);
3932        else
3933                cal = 0;
3934        rt2800_bbp_write(rt2x00dev, 159, cal);
3935
3936        /* TX1 IQ Phase */
3937        rt2800_bbp_write(rt2x00dev, 158, 0x4b);
3938        if (channel <= 14)
3939                cal = rt2x00_eeprom_byte(rt2x00dev, EEPROM_IQ_PHASE_CAL_TX1_2G);
3940        else if (channel >= 36 && channel <= 64)
3941                cal = rt2x00_eeprom_byte(rt2x00dev,
3942                                         EEPROM_IQ_PHASE_CAL_TX1_CH36_TO_CH64_5G);
3943        else if (channel >= 100 && channel <= 138)
3944                cal = rt2x00_eeprom_byte(rt2x00dev,
3945                                         EEPROM_IQ_PHASE_CAL_TX1_CH100_TO_CH138_5G);
3946        else if (channel >= 140 && channel <= 165)
3947                cal = rt2x00_eeprom_byte(rt2x00dev,
3948                                         EEPROM_IQ_PHASE_CAL_TX1_CH140_TO_CH165_5G);
3949        else
3950                cal = 0;
3951        rt2800_bbp_write(rt2x00dev, 159, cal);
3952
3953        /* FIXME: possible RX0, RX1 callibration ? */
3954
3955        /* RF IQ compensation control */
3956        rt2800_bbp_write(rt2x00dev, 158, 0x04);
3957        cal = rt2x00_eeprom_byte(rt2x00dev, EEPROM_RF_IQ_COMPENSATION_CONTROL);
3958        rt2800_bbp_write(rt2x00dev, 159, cal != 0xff ? cal : 0);
3959
3960        /* RF IQ imbalance compensation control */
3961        rt2800_bbp_write(rt2x00dev, 158, 0x03);
3962        cal = rt2x00_eeprom_byte(rt2x00dev,
3963                                 EEPROM_RF_IQ_IMBALANCE_COMPENSATION_CONTROL);
3964        rt2800_bbp_write(rt2x00dev, 159, cal != 0xff ? cal : 0);
3965}
3966
3967static char rt2800_txpower_to_dev(struct rt2x00_dev *rt2x00dev,
3968                                  unsigned int channel,
3969                                  char txpower)
3970{
3971        if (rt2x00_rt(rt2x00dev, RT3593) ||
3972            rt2x00_rt(rt2x00dev, RT3883))
3973                txpower = rt2x00_get_field8(txpower, EEPROM_TXPOWER_ALC);
3974
3975        if (channel <= 14)
3976                return clamp_t(char, txpower, MIN_G_TXPOWER, MAX_G_TXPOWER);
3977
3978        if (rt2x00_rt(rt2x00dev, RT3593) ||
3979            rt2x00_rt(rt2x00dev, RT3883))
3980                return clamp_t(char, txpower, MIN_A_TXPOWER_3593,
3981                               MAX_A_TXPOWER_3593);
3982        else
3983                return clamp_t(char, txpower, MIN_A_TXPOWER, MAX_A_TXPOWER);
3984}
3985
3986static void rt3883_bbp_adjust(struct rt2x00_dev *rt2x00dev,
3987                              struct rf_channel *rf)
3988{
3989        u8 bbp;
3990
3991        bbp = (rf->channel > 14) ? 0x48 : 0x38;
3992        rt2800_bbp_write_with_rx_chain(rt2x00dev, 66, bbp);
3993
3994        rt2800_bbp_write(rt2x00dev, 69, 0x12);
3995
3996        if (rf->channel <= 14) {
3997                rt2800_bbp_write(rt2x00dev, 70, 0x0a);
3998        } else {
3999                /* Disable CCK packet detection */
4000                rt2800_bbp_write(rt2x00dev, 70, 0x00);
4001        }
4002
4003        rt2800_bbp_write(rt2x00dev, 73, 0x10);
4004
4005        if (rf->channel > 14) {
4006                rt2800_bbp_write(rt2x00dev, 62, 0x1d);
4007                rt2800_bbp_write(rt2x00dev, 63, 0x1d);
4008                rt2800_bbp_write(rt2x00dev, 64, 0x1d);
4009        } else {
4010                rt2800_bbp_write(rt2x00dev, 62, 0x2d);
4011                rt2800_bbp_write(rt2x00dev, 63, 0x2d);
4012                rt2800_bbp_write(rt2x00dev, 64, 0x2d);
4013        }
4014}
4015
4016static void rt2800_config_channel(struct rt2x00_dev *rt2x00dev,
4017                                  struct ieee80211_conf *conf,
4018                                  struct rf_channel *rf,
4019                                  struct channel_info *info)
4020{
4021        u32 reg;
4022        u32 tx_pin;
4023        u8 bbp, rfcsr;
4024
4025        info->default_power1 = rt2800_txpower_to_dev(rt2x00dev, rf->channel,
4026                                                     info->default_power1);
4027        info->default_power2 = rt2800_txpower_to_dev(rt2x00dev, rf->channel,
4028                                                     info->default_power2);
4029        if (rt2x00dev->default_ant.tx_chain_num > 2)
4030                info->default_power3 =
4031                        rt2800_txpower_to_dev(rt2x00dev, rf->channel,
4032                                              info->default_power3);
4033
4034        switch (rt2x00dev->chip.rt) {
4035        case RT3883:
4036                rt3883_bbp_adjust(rt2x00dev, rf);
4037                break;
4038        }
4039
4040        switch (rt2x00dev->chip.rf) {
4041        case RF2020:
4042        case RF3020:
4043        case RF3021:
4044        case RF3022:
4045        case RF3320:
4046                rt2800_config_channel_rf3xxx(rt2x00dev, conf, rf, info);
4047                break;
4048        case RF3052:
4049                rt2800_config_channel_rf3052(rt2x00dev, conf, rf, info);
4050                break;
4051        case RF3053:
4052                rt2800_config_channel_rf3053(rt2x00dev, conf, rf, info);
4053                break;
4054        case RF3290:
4055                rt2800_config_channel_rf3290(rt2x00dev, conf, rf, info);
4056                break;
4057        case RF3322:
4058                rt2800_config_channel_rf3322(rt2x00dev, conf, rf, info);
4059                break;
4060        case RF3853:
4061                rt2800_config_channel_rf3853(rt2x00dev, conf, rf, info);
4062                break;
4063        case RF3070:
4064        case RF5350:
4065        case RF5360:
4066        case RF5362:
4067        case RF5370:
4068        case RF5372:
4069        case RF5390:
4070        case RF5392:
4071                rt2800_config_channel_rf53xx(rt2x00dev, conf, rf, info);
4072                break;
4073        case RF5592:
4074                rt2800_config_channel_rf55xx(rt2x00dev, conf, rf, info);
4075                break;
4076        case RF7620:
4077                rt2800_config_channel_rf7620(rt2x00dev, conf, rf, info);
4078                break;
4079        default:
4080                rt2800_config_channel_rf2xxx(rt2x00dev, conf, rf, info);
4081        }
4082
4083        if (rt2x00_rf(rt2x00dev, RF3070) ||
4084            rt2x00_rf(rt2x00dev, RF3290) ||
4085            rt2x00_rf(rt2x00dev, RF3322) ||
4086            rt2x00_rf(rt2x00dev, RF5350) ||
4087            rt2x00_rf(rt2x00dev, RF5360) ||
4088            rt2x00_rf(rt2x00dev, RF5362) ||
4089            rt2x00_rf(rt2x00dev, RF5370) ||
4090            rt2x00_rf(rt2x00dev, RF5372) ||
4091            rt2x00_rf(rt2x00dev, RF5390) ||
4092            rt2x00_rf(rt2x00dev, RF5392)) {
4093                rfcsr = rt2800_rfcsr_read(rt2x00dev, 30);
4094                if (rt2x00_rf(rt2x00dev, RF3322)) {
4095                        rt2x00_set_field8(&rfcsr, RF3322_RFCSR30_TX_H20M,
4096                                          conf_is_ht40(conf));
4097                        rt2x00_set_field8(&rfcsr, RF3322_RFCSR30_RX_H20M,
4098                                          conf_is_ht40(conf));
4099                } else {
4100                        rt2x00_set_field8(&rfcsr, RFCSR30_TX_H20M,
4101                                          conf_is_ht40(conf));
4102                        rt2x00_set_field8(&rfcsr, RFCSR30_RX_H20M,
4103                                          conf_is_ht40(conf));
4104                }
4105                rt2800_rfcsr_write(rt2x00dev, 30, rfcsr);
4106
4107                rfcsr = rt2800_rfcsr_read(rt2x00dev, 3);
4108                rt2x00_set_field8(&rfcsr, RFCSR3_VCOCAL_EN, 1);
4109                rt2800_rfcsr_write(rt2x00dev, 3, rfcsr);
4110        }
4111
4112        /*
4113         * Change BBP settings
4114         */
4115
4116        if (rt2x00_rt(rt2x00dev, RT3352)) {
4117                rt2800_bbp_write(rt2x00dev, 62, 0x37 - rt2x00dev->lna_gain);
4118                rt2800_bbp_write(rt2x00dev, 63, 0x37 - rt2x00dev->lna_gain);
4119                rt2800_bbp_write(rt2x00dev, 64, 0x37 - rt2x00dev->lna_gain);
4120
4121                rt2800_bbp_write(rt2x00dev, 27, 0x0);
4122                rt2800_bbp_write(rt2x00dev, 66, 0x26 + rt2x00dev->lna_gain);
4123                rt2800_bbp_write(rt2x00dev, 27, 0x20);
4124                rt2800_bbp_write(rt2x00dev, 66, 0x26 + rt2x00dev->lna_gain);
4125                rt2800_bbp_write(rt2x00dev, 86, 0x38);
4126                rt2800_bbp_write(rt2x00dev, 83, 0x6a);
4127        } else if (rt2x00_rt(rt2x00dev, RT3593)) {
4128                if (rf->channel > 14) {
4129                        /* Disable CCK Packet detection on 5GHz */
4130                        rt2800_bbp_write(rt2x00dev, 70, 0x00);
4131                } else {
4132                        rt2800_bbp_write(rt2x00dev, 70, 0x0a);
4133                }
4134
4135                if (conf_is_ht40(conf))
4136                        rt2800_bbp_write(rt2x00dev, 105, 0x04);
4137                else
4138                        rt2800_bbp_write(rt2x00dev, 105, 0x34);
4139
4140                rt2800_bbp_write(rt2x00dev, 62, 0x37 - rt2x00dev->lna_gain);
4141                rt2800_bbp_write(rt2x00dev, 63, 0x37 - rt2x00dev->lna_gain);
4142                rt2800_bbp_write(rt2x00dev, 64, 0x37 - rt2x00dev->lna_gain);
4143                rt2800_bbp_write(rt2x00dev, 77, 0x98);
4144        } else if (rt2x00_rt(rt2x00dev, RT3883)) {
4145                rt2800_bbp_write(rt2x00dev, 62, 0x37 - rt2x00dev->lna_gain);
4146                rt2800_bbp_write(rt2x00dev, 63, 0x37 - rt2x00dev->lna_gain);
4147                rt2800_bbp_write(rt2x00dev, 64, 0x37 - rt2x00dev->lna_gain);
4148
4149                if (rt2x00dev->default_ant.rx_chain_num > 1)
4150                        rt2800_bbp_write(rt2x00dev, 86, 0x46);
4151                else
4152                        rt2800_bbp_write(rt2x00dev, 86, 0);
4153        } else {
4154                rt2800_bbp_write(rt2x00dev, 62, 0x37 - rt2x00dev->lna_gain);
4155                rt2800_bbp_write(rt2x00dev, 63, 0x37 - rt2x00dev->lna_gain);
4156                rt2800_bbp_write(rt2x00dev, 64, 0x37 - rt2x00dev->lna_gain);
4157                rt2800_bbp_write(rt2x00dev, 86, 0);
4158        }
4159
4160        if (rf->channel <= 14) {
4161                if (!rt2x00_rt(rt2x00dev, RT5390) &&
4162                    !rt2x00_rt(rt2x00dev, RT5392) &&
4163                    !rt2x00_rt(rt2x00dev, RT6352)) {
4164                        if (rt2x00_has_cap_external_lna_bg(rt2x00dev)) {
4165                                rt2800_bbp_write(rt2x00dev, 82, 0x62);
4166                                rt2800_bbp_write(rt2x00dev, 82, 0x62);
4167                                rt2800_bbp_write(rt2x00dev, 75, 0x46);
4168                        } else {
4169                                if (rt2x00_rt(rt2x00dev, RT3593))
4170                                        rt2800_bbp_write(rt2x00dev, 82, 0x62);
4171                                else
4172                                        rt2800_bbp_write(rt2x00dev, 82, 0x84);
4173                                rt2800_bbp_write(rt2x00dev, 75, 0x50);
4174                        }
4175                        if (rt2x00_rt(rt2x00dev, RT3593) ||
4176                            rt2x00_rt(rt2x00dev, RT3883))
4177                                rt2800_bbp_write(rt2x00dev, 83, 0x8a);
4178                }
4179
4180        } else {
4181                if (rt2x00_rt(rt2x00dev, RT3572))
4182                        rt2800_bbp_write(rt2x00dev, 82, 0x94);
4183                else if (rt2x00_rt(rt2x00dev, RT3593) ||
4184                         rt2x00_rt(rt2x00dev, RT3883))
4185                        rt2800_bbp_write(rt2x00dev, 82, 0x82);
4186                else if (!rt2x00_rt(rt2x00dev, RT6352))
4187                        rt2800_bbp_write(rt2x00dev, 82, 0xf2);
4188
4189                if (rt2x00_rt(rt2x00dev, RT3593) ||
4190                    rt2x00_rt(rt2x00dev, RT3883))
4191                        rt2800_bbp_write(rt2x00dev, 83, 0x9a);
4192
4193                if (rt2x00_has_cap_external_lna_a(rt2x00dev))
4194                        rt2800_bbp_write(rt2x00dev, 75, 0x46);
4195                else
4196                        rt2800_bbp_write(rt2x00dev, 75, 0x50);
4197        }
4198
4199        reg = rt2800_register_read(rt2x00dev, TX_BAND_CFG);
4200        rt2x00_set_field32(&reg, TX_BAND_CFG_HT40_MINUS, conf_is_ht40_minus(conf));
4201        rt2x00_set_field32(&reg, TX_BAND_CFG_A, rf->channel > 14);
4202        rt2x00_set_field32(&reg, TX_BAND_CFG_BG, rf->channel <= 14);
4203        rt2800_register_write(rt2x00dev, TX_BAND_CFG, reg);
4204
4205        if (rt2x00_rt(rt2x00dev, RT3572))
4206                rt2800_rfcsr_write(rt2x00dev, 8, 0);
4207
4208        if (rt2x00_rt(rt2x00dev, RT6352)) {
4209                tx_pin = rt2800_register_read(rt2x00dev, TX_PIN_CFG);
4210                rt2x00_set_field32(&tx_pin, TX_PIN_CFG_RFRX_EN, 1);
4211        } else {
4212                tx_pin = 0;
4213        }
4214
4215        switch (rt2x00dev->default_ant.tx_chain_num) {
4216        case 3:
4217                /* Turn on tertiary PAs */
4218                rt2x00_set_field32(&tx_pin, TX_PIN_CFG_PA_PE_A2_EN,
4219                                   rf->channel > 14);
4220                rt2x00_set_field32(&tx_pin, TX_PIN_CFG_PA_PE_G2_EN,
4221                                   rf->channel <= 14);
4222                /* fall-through */
4223        case 2:
4224                /* Turn on secondary PAs */
4225                rt2x00_set_field32(&tx_pin, TX_PIN_CFG_PA_PE_A1_EN,
4226                                   rf->channel > 14);
4227                rt2x00_set_field32(&tx_pin, TX_PIN_CFG_PA_PE_G1_EN,
4228                                   rf->channel <= 14);
4229                /* fall-through */
4230        case 1:
4231                /* Turn on primary PAs */
4232                rt2x00_set_field32(&tx_pin, TX_PIN_CFG_PA_PE_A0_EN,
4233                                   rf->channel > 14);
4234                if (rt2x00_has_cap_bt_coexist(rt2x00dev))
4235                        rt2x00_set_field32(&tx_pin, TX_PIN_CFG_PA_PE_G0_EN, 1);
4236                else
4237                        rt2x00_set_field32(&tx_pin, TX_PIN_CFG_PA_PE_G0_EN,
4238                                           rf->channel <= 14);
4239                break;
4240        }
4241
4242        switch (rt2x00dev->default_ant.rx_chain_num) {
4243        case 3:
4244                /* Turn on tertiary LNAs */
4245                rt2x00_set_field32(&tx_pin, TX_PIN_CFG_LNA_PE_A2_EN, 1);
4246                rt2x00_set_field32(&tx_pin, TX_PIN_CFG_LNA_PE_G2_EN, 1);
4247                /* fall-through */
4248        case 2:
4249                /* Turn on secondary LNAs */
4250                rt2x00_set_field32(&tx_pin, TX_PIN_CFG_LNA_PE_A1_EN, 1);
4251                rt2x00_set_field32(&tx_pin, TX_PIN_CFG_LNA_PE_G1_EN, 1);
4252                /* fall-through */
4253        case 1:
4254                /* Turn on primary LNAs */
4255                rt2x00_set_field32(&tx_pin, TX_PIN_CFG_LNA_PE_A0_EN, 1);
4256                rt2x00_set_field32(&tx_pin, TX_PIN_CFG_LNA_PE_G0_EN, 1);
4257                break;
4258        }
4259
4260        rt2x00_set_field32(&tx_pin, TX_PIN_CFG_RFTR_EN, 1);
4261        rt2x00_set_field32(&tx_pin, TX_PIN_CFG_TRSW_EN, 1);
4262
4263        rt2800_register_write(rt2x00dev, TX_PIN_CFG, tx_pin);
4264
4265        if (rt2x00_rt(rt2x00dev, RT3572)) {
4266                rt2800_rfcsr_write(rt2x00dev, 8, 0x80);
4267
4268                /* AGC init */
4269                if (rf->channel <= 14)
4270                        reg = 0x1c + (2 * rt2x00dev->lna_gain);
4271                else
4272                        reg = 0x22 + ((rt2x00dev->lna_gain * 5) / 3);
4273
4274                rt2800_bbp_write_with_rx_chain(rt2x00dev, 66, reg);
4275        }
4276
4277        if (rt2x00_rt(rt2x00dev, RT3593)) {
4278                reg = rt2800_register_read(rt2x00dev, GPIO_CTRL);
4279
4280                /* Band selection */
4281                if (rt2x00_is_usb(rt2x00dev) ||
4282                    rt2x00_is_pcie(rt2x00dev)) {
4283                        /* GPIO #8 controls all paths */
4284                        rt2x00_set_field32(&reg, GPIO_CTRL_DIR8, 0);
4285                        if (rf->channel <= 14)
4286                                rt2x00_set_field32(&reg, GPIO_CTRL_VAL8, 1);
4287                        else
4288                                rt2x00_set_field32(&reg, GPIO_CTRL_VAL8, 0);
4289                }
4290
4291                /* LNA PE control. */
4292                if (rt2x00_is_usb(rt2x00dev)) {
4293                        /* GPIO #4 controls PE0 and PE1,
4294                         * GPIO #7 controls PE2
4295                         */
4296                        rt2x00_set_field32(&reg, GPIO_CTRL_DIR4, 0);
4297                        rt2x00_set_field32(&reg, GPIO_CTRL_DIR7, 0);
4298
4299                        rt2x00_set_field32(&reg, GPIO_CTRL_VAL4, 1);
4300                        rt2x00_set_field32(&reg, GPIO_CTRL_VAL7, 1);
4301                } else if (rt2x00_is_pcie(rt2x00dev)) {
4302                        /* GPIO #4 controls PE0, PE1 and PE2 */
4303                        rt2x00_set_field32(&reg, GPIO_CTRL_DIR4, 0);
4304                        rt2x00_set_field32(&reg, GPIO_CTRL_VAL4, 1);
4305                }
4306
4307                rt2800_register_write(rt2x00dev, GPIO_CTRL, reg);
4308
4309                /* AGC init */
4310                if (rf->channel <= 14)
4311                        reg = 0x1c + 2 * rt2x00dev->lna_gain;
4312                else
4313                        reg = 0x22 + ((rt2x00dev->lna_gain * 5) / 3);
4314
4315                rt2800_bbp_write_with_rx_chain(rt2x00dev, 66, reg);
4316
4317                usleep_range(1000, 1500);
4318        }
4319
4320        if (rt2x00_rt(rt2x00dev, RT3883)) {
4321                if (!conf_is_ht40(conf))
4322                        rt2800_bbp_write(rt2x00dev, 105, 0x34);
4323                else
4324                        rt2800_bbp_write(rt2x00dev, 105, 0x04);
4325
4326                /* AGC init */
4327                if (rf->channel <= 14)
4328                        reg = 0x2e + rt2x00dev->lna_gain;
4329                else
4330                        reg = 0x20 + ((rt2x00dev->lna_gain * 5) / 3);
4331
4332                rt2800_bbp_write_with_rx_chain(rt2x00dev, 66, reg);
4333
4334                usleep_range(1000, 1500);
4335        }
4336
4337        if (rt2x00_rt(rt2x00dev, RT5592) || rt2x00_rt(rt2x00dev, RT6352)) {
4338                reg = 0x10;
4339                if (!conf_is_ht40(conf)) {
4340                        if (rt2x00_rt(rt2x00dev, RT6352) &&
4341                            rt2x00_has_cap_external_lna_bg(rt2x00dev)) {
4342                                reg |= 0x5;
4343                        } else {
4344                                reg |= 0xa;
4345                        }
4346                }
4347                rt2800_bbp_write(rt2x00dev, 195, 141);
4348                rt2800_bbp_write(rt2x00dev, 196, reg);
4349
4350                /* AGC init.
4351                 * Despite the vendor driver using different values here for
4352                 * RT6352 chip, we use 0x1c for now. This may have to be changed
4353                 * once TSSI got implemented.
4354                 */
4355                reg = (rf->channel <= 14 ? 0x1c : 0x24) + 2*rt2x00dev->lna_gain;
4356                rt2800_bbp_write_with_rx_chain(rt2x00dev, 66, reg);
4357
4358                rt2800_iq_calibrate(rt2x00dev, rf->channel);
4359        }
4360
4361        bbp = rt2800_bbp_read(rt2x00dev, 4);
4362        rt2x00_set_field8(&bbp, BBP4_BANDWIDTH, 2 * conf_is_ht40(conf));
4363        rt2800_bbp_write(rt2x00dev, 4, bbp);
4364
4365        bbp = rt2800_bbp_read(rt2x00dev, 3);
4366        rt2x00_set_field8(&bbp, BBP3_HT40_MINUS, conf_is_ht40_minus(conf));
4367        rt2800_bbp_write(rt2x00dev, 3, bbp);
4368
4369        if (rt2x00_rt_rev(rt2x00dev, RT2860, REV_RT2860C)) {
4370                if (conf_is_ht40(conf)) {
4371                        rt2800_bbp_write(rt2x00dev, 69, 0x1a);
4372                        rt2800_bbp_write(rt2x00dev, 70, 0x0a);
4373                        rt2800_bbp_write(rt2x00dev, 73, 0x16);
4374                } else {
4375                        rt2800_bbp_write(rt2x00dev, 69, 0x16);
4376                        rt2800_bbp_write(rt2x00dev, 70, 0x08);
4377                        rt2800_bbp_write(rt2x00dev, 73, 0x11);
4378                }
4379        }
4380
4381        usleep_range(1000, 1500);
4382
4383        /*
4384         * Clear channel statistic counters
4385         */
4386        reg = rt2800_register_read(rt2x00dev, CH_IDLE_STA);
4387        reg = rt2800_register_read(rt2x00dev, CH_BUSY_STA);
4388        reg = rt2800_register_read(rt2x00dev, CH_BUSY_STA_SEC);
4389
4390        /*
4391         * Clear update flag
4392         */
4393        if (rt2x00_rt(rt2x00dev, RT3352) ||
4394            rt2x00_rt(rt2x00dev, RT5350)) {
4395                bbp = rt2800_bbp_read(rt2x00dev, 49);
4396                rt2x00_set_field8(&bbp, BBP49_UPDATE_FLAG, 0);
4397                rt2800_bbp_write(rt2x00dev, 49, bbp);
4398        }
4399}
4400
4401static int rt2800_get_gain_calibration_delta(struct rt2x00_dev *rt2x00dev)
4402{
4403        u8 tssi_bounds[9];
4404        u8 current_tssi;
4405        u16 eeprom;
4406        u8 step;
4407        int i;
4408
4409        /*
4410         * First check if temperature compensation is supported.
4411         */
4412        eeprom = rt2800_eeprom_read(rt2x00dev, EEPROM_NIC_CONF1);
4413        if (!rt2x00_get_field16(eeprom, EEPROM_NIC_CONF1_EXTERNAL_TX_ALC))
4414                return 0;
4415
4416        /*
4417         * Read TSSI boundaries for temperature compensation from
4418         * the EEPROM.
4419         *
4420         * Array idx               0    1    2    3    4    5    6    7    8
4421         * Matching Delta value   -4   -3   -2   -1    0   +1   +2   +3   +4
4422         * Example TSSI bounds  0xF0 0xD0 0xB5 0xA0 0x88 0x45 0x25 0x15 0x00
4423         */
4424        if (rt2x00dev->curr_band == NL80211_BAND_2GHZ) {
4425                eeprom = rt2800_eeprom_read(rt2x00dev, EEPROM_TSSI_BOUND_BG1);
4426                tssi_bounds[0] = rt2x00_get_field16(eeprom,
4427                                        EEPROM_TSSI_BOUND_BG1_MINUS4);
4428                tssi_bounds[1] = rt2x00_get_field16(eeprom,
4429                                        EEPROM_TSSI_BOUND_BG1_MINUS3);
4430
4431                eeprom = rt2800_eeprom_read(rt2x00dev, EEPROM_TSSI_BOUND_BG2);
4432                tssi_bounds[2] = rt2x00_get_field16(eeprom,
4433                                        EEPROM_TSSI_BOUND_BG2_MINUS2);
4434                tssi_bounds[3] = rt2x00_get_field16(eeprom,
4435                                        EEPROM_TSSI_BOUND_BG2_MINUS1);
4436
4437                eeprom = rt2800_eeprom_read(rt2x00dev, EEPROM_TSSI_BOUND_BG3);
4438                tssi_bounds[4] = rt2x00_get_field16(eeprom,
4439                                        EEPROM_TSSI_BOUND_BG3_REF);
4440                tssi_bounds[5] = rt2x00_get_field16(eeprom,
4441                                        EEPROM_TSSI_BOUND_BG3_PLUS1);
4442
4443                eeprom = rt2800_eeprom_read(rt2x00dev, EEPROM_TSSI_BOUND_BG4);
4444                tssi_bounds[6] = rt2x00_get_field16(eeprom,
4445                                        EEPROM_TSSI_BOUND_BG4_PLUS2);
4446                tssi_bounds[7] = rt2x00_get_field16(eeprom,
4447                                        EEPROM_TSSI_BOUND_BG4_PLUS3);
4448
4449                eeprom = rt2800_eeprom_read(rt2x00dev, EEPROM_TSSI_BOUND_BG5);
4450                tssi_bounds[8] = rt2x00_get_field16(eeprom,
4451                                        EEPROM_TSSI_BOUND_BG5_PLUS4);
4452
4453                step = rt2x00_get_field16(eeprom,
4454                                          EEPROM_TSSI_BOUND_BG5_AGC_STEP);
4455        } else {
4456                eeprom = rt2800_eeprom_read(rt2x00dev, EEPROM_TSSI_BOUND_A1);
4457                tssi_bounds[0] = rt2x00_get_field16(eeprom,
4458                                        EEPROM_TSSI_BOUND_A1_MINUS4);
4459                tssi_bounds[1] = rt2x00_get_field16(eeprom,
4460                                        EEPROM_TSSI_BOUND_A1_MINUS3);
4461
4462                eeprom = rt2800_eeprom_read(rt2x00dev, EEPROM_TSSI_BOUND_A2);
4463                tssi_bounds[2] = rt2x00_get_field16(eeprom,
4464                                        EEPROM_TSSI_BOUND_A2_MINUS2);
4465                tssi_bounds[3] = rt2x00_get_field16(eeprom,
4466                                        EEPROM_TSSI_BOUND_A2_MINUS1);
4467
4468                eeprom = rt2800_eeprom_read(rt2x00dev, EEPROM_TSSI_BOUND_A3);
4469                tssi_bounds[4] = rt2x00_get_field16(eeprom,
4470                                        EEPROM_TSSI_BOUND_A3_REF);
4471                tssi_bounds[5] = rt2x00_get_field16(eeprom,
4472                                        EEPROM_TSSI_BOUND_A3_PLUS1);
4473
4474                eeprom = rt2800_eeprom_read(rt2x00dev, EEPROM_TSSI_BOUND_A4);
4475                tssi_bounds[6] = rt2x00_get_field16(eeprom,
4476                                        EEPROM_TSSI_BOUND_A4_PLUS2);
4477                tssi_bounds[7] = rt2x00_get_field16(eeprom,
4478                                        EEPROM_TSSI_BOUND_A4_PLUS3);
4479
4480                eeprom = rt2800_eeprom_read(rt2x00dev, EEPROM_TSSI_BOUND_A5);
4481                tssi_bounds[8] = rt2x00_get_field16(eeprom,
4482                                        EEPROM_TSSI_BOUND_A5_PLUS4);
4483
4484                step = rt2x00_get_field16(eeprom,
4485                                          EEPROM_TSSI_BOUND_A5_AGC_STEP);
4486        }
4487
4488        /*
4489         * Check if temperature compensation is supported.
4490         */
4491        if (tssi_bounds[4] == 0xff || step == 0xff)
4492                return 0;
4493
4494        /*
4495         * Read current TSSI (BBP 49).
4496         */
4497        current_tssi = rt2800_bbp_read(rt2x00dev, 49);
4498
4499        /*
4500         * Compare TSSI value (BBP49) with the compensation boundaries
4501         * from the EEPROM and increase or decrease tx power.
4502         */
4503        for (i = 0; i <= 3; i++) {
4504                if (current_tssi > tssi_bounds[i])
4505                        break;
4506        }
4507
4508        if (i == 4) {
4509                for (i = 8; i >= 5; i--) {
4510                        if (current_tssi < tssi_bounds[i])
4511                                break;
4512                }
4513        }
4514
4515        return (i - 4) * step;
4516}
4517
4518static int rt2800_get_txpower_bw_comp(struct rt2x00_dev *rt2x00dev,
4519                                      enum nl80211_band band)
4520{
4521        u16 eeprom;
4522        u8 comp_en;
4523        u8 comp_type;
4524        int comp_value = 0;
4525
4526        eeprom = rt2800_eeprom_read(rt2x00dev, EEPROM_TXPOWER_DELTA);
4527
4528        /*
4529         * HT40 compensation not required.
4530         */
4531        if (eeprom == 0xffff ||
4532            !test_bit(CONFIG_CHANNEL_HT40, &rt2x00dev->flags))
4533                return 0;
4534
4535        if (band == NL80211_BAND_2GHZ) {
4536                comp_en = rt2x00_get_field16(eeprom,
4537                                 EEPROM_TXPOWER_DELTA_ENABLE_2G);
4538                if (comp_en) {
4539                        comp_type = rt2x00_get_field16(eeprom,
4540                                           EEPROM_TXPOWER_DELTA_TYPE_2G);
4541                        comp_value = rt2x00_get_field16(eeprom,
4542                                            EEPROM_TXPOWER_DELTA_VALUE_2G);
4543                        if (!comp_type)
4544                                comp_value = -comp_value;
4545                }
4546        } else {
4547                comp_en = rt2x00_get_field16(eeprom,
4548                                 EEPROM_TXPOWER_DELTA_ENABLE_5G);
4549                if (comp_en) {
4550                        comp_type = rt2x00_get_field16(eeprom,
4551                                           EEPROM_TXPOWER_DELTA_TYPE_5G);
4552                        comp_value = rt2x00_get_field16(eeprom,
4553                                            EEPROM_TXPOWER_DELTA_VALUE_5G);
4554                        if (!comp_type)
4555                                comp_value = -comp_value;
4556                }
4557        }
4558
4559        return comp_value;
4560}
4561
4562static int rt2800_get_txpower_reg_delta(struct rt2x00_dev *rt2x00dev,
4563                                        int power_level, int max_power)
4564{
4565        int delta;
4566
4567        if (rt2x00_has_cap_power_limit(rt2x00dev))
4568                return 0;
4569
4570        /*
4571         * XXX: We don't know the maximum transmit power of our hardware since
4572         * the EEPROM doesn't expose it. We only know that we are calibrated
4573         * to 100% tx power.
4574         *
4575         * Hence, we assume the regulatory limit that cfg80211 calulated for
4576         * the current channel is our maximum and if we are requested to lower
4577         * the value we just reduce our tx power accordingly.
4578         */
4579        delta = power_level - max_power;
4580        return min(delta, 0);
4581}
4582
4583static u8 rt2800_compensate_txpower(struct rt2x00_dev *rt2x00dev, int is_rate_b,
4584                                   enum nl80211_band band, int power_level,
4585                                   u8 txpower, int delta)
4586{
4587        u16 eeprom;
4588        u8 criterion;
4589        u8 eirp_txpower;
4590        u8 eirp_txpower_criterion;
4591        u8 reg_limit;
4592
4593        if (rt2x00_rt(rt2x00dev, RT3593))
4594                return min_t(u8, txpower, 0xc);
4595
4596        if (rt2x00_rt(rt2x00dev, RT3883))
4597                return min_t(u8, txpower, 0xf);
4598
4599        if (rt2x00_has_cap_power_limit(rt2x00dev)) {
4600                /*
4601                 * Check if eirp txpower exceed txpower_limit.
4602                 * We use OFDM 6M as criterion and its eirp txpower
4603                 * is stored at EEPROM_EIRP_MAX_TX_POWER.
4604                 * .11b data rate need add additional 4dbm
4605                 * when calculating eirp txpower.
4606                 */
4607                eeprom = rt2800_eeprom_read_from_array(rt2x00dev,
4608                                                       EEPROM_TXPOWER_BYRATE,
4609                                                       1);
4610                criterion = rt2x00_get_field16(eeprom,
4611                                               EEPROM_TXPOWER_BYRATE_RATE0);
4612
4613                eeprom = rt2800_eeprom_read(rt2x00dev, EEPROM_EIRP_MAX_TX_POWER);
4614
4615                if (band == NL80211_BAND_2GHZ)
4616                        eirp_txpower_criterion = rt2x00_get_field16(eeprom,
4617                                                 EEPROM_EIRP_MAX_TX_POWER_2GHZ);
4618                else
4619                        eirp_txpower_criterion = rt2x00_get_field16(eeprom,
4620                                                 EEPROM_EIRP_MAX_TX_POWER_5GHZ);
4621
4622                eirp_txpower = eirp_txpower_criterion + (txpower - criterion) +
4623                               (is_rate_b ? 4 : 0) + delta;
4624
4625                reg_limit = (eirp_txpower > power_level) ?
4626                                        (eirp_txpower - power_level) : 0;
4627        } else
4628                reg_limit = 0;
4629
4630        txpower = max(0, txpower + delta - reg_limit);
4631        return min_t(u8, txpower, 0xc);
4632}
4633
4634
4635enum {
4636        TX_PWR_CFG_0_IDX,
4637        TX_PWR_CFG_1_IDX,
4638        TX_PWR_CFG_2_IDX,
4639        TX_PWR_CFG_3_IDX,
4640        TX_PWR_CFG_4_IDX,
4641        TX_PWR_CFG_5_IDX,
4642        TX_PWR_CFG_6_IDX,
4643        TX_PWR_CFG_7_IDX,
4644        TX_PWR_CFG_8_IDX,
4645        TX_PWR_CFG_9_IDX,
4646        TX_PWR_CFG_0_EXT_IDX,
4647        TX_PWR_CFG_1_EXT_IDX,
4648        TX_PWR_CFG_2_EXT_IDX,
4649        TX_PWR_CFG_3_EXT_IDX,
4650        TX_PWR_CFG_4_EXT_IDX,
4651        TX_PWR_CFG_IDX_COUNT,
4652};
4653
4654static void rt2800_config_txpower_rt3593(struct rt2x00_dev *rt2x00dev,
4655                                         struct ieee80211_channel *chan,
4656                                         int power_level)
4657{
4658        u8 txpower;
4659        u16 eeprom;
4660        u32 regs[TX_PWR_CFG_IDX_COUNT];
4661        unsigned int offset;
4662        enum nl80211_band band = chan->band;
4663        int delta;
4664        int i;
4665
4666        memset(regs, '\0', sizeof(regs));
4667
4668        /* TODO: adapt TX power reduction from the rt28xx code */
4669
4670        /* calculate temperature compensation delta */
4671        delta = rt2800_get_gain_calibration_delta(rt2x00dev);
4672
4673        if (band == NL80211_BAND_5GHZ)
4674                offset = 16;
4675        else
4676                offset = 0;
4677
4678        if (test_bit(CONFIG_CHANNEL_HT40, &rt2x00dev->flags))
4679                offset += 8;
4680
4681        /* read the next four txpower values */
4682        eeprom = rt2800_eeprom_read_from_array(rt2x00dev, EEPROM_TXPOWER_BYRATE,
4683                                               offset);
4684
4685        /* CCK 1MBS,2MBS */
4686        txpower = rt2x00_get_field16(eeprom, EEPROM_TXPOWER_BYRATE_RATE0);
4687        txpower = rt2800_compensate_txpower(rt2x00dev, 1, band, power_level,
4688                                            txpower, delta);
4689        rt2x00_set_field32(&regs[TX_PWR_CFG_0_IDX],
4690                           TX_PWR_CFG_0_CCK1_CH0, txpower);
4691        rt2x00_set_field32(&regs[TX_PWR_CFG_0_IDX],
4692                           TX_PWR_CFG_0_CCK1_CH1, txpower);
4693        rt2x00_set_field32(&regs[TX_PWR_CFG_0_EXT_IDX],
4694                           TX_PWR_CFG_0_EXT_CCK1_CH2, txpower);
4695
4696        /* CCK 5.5MBS,11MBS */
4697        txpower = rt2x00_get_field16(eeprom, EEPROM_TXPOWER_BYRATE_RATE1);
4698        txpower = rt2800_compensate_txpower(rt2x00dev, 1, band, power_level,
4699                                            txpower, delta);
4700        rt2x00_set_field32(&regs[TX_PWR_CFG_0_IDX],
4701                           TX_PWR_CFG_0_CCK5_CH0, txpower);
4702        rt2x00_set_field32(&regs[TX_PWR_CFG_0_IDX],
4703                           TX_PWR_CFG_0_CCK5_CH1, txpower);
4704        rt2x00_set_field32(&regs[TX_PWR_CFG_0_EXT_IDX],
4705                           TX_PWR_CFG_0_EXT_CCK5_CH2, txpower);
4706
4707        /* OFDM 6MBS,9MBS */
4708        txpower = rt2x00_get_field16(eeprom, EEPROM_TXPOWER_BYRATE_RATE2);
4709        txpower = rt2800_compensate_txpower(rt2x00dev, 0, band, power_level,
4710                                            txpower, delta);
4711        rt2x00_set_field32(&regs[TX_PWR_CFG_0_IDX],
4712                           TX_PWR_CFG_0_OFDM6_CH0, txpower);
4713        rt2x00_set_field32(&regs[TX_PWR_CFG_0_IDX],
4714                           TX_PWR_CFG_0_OFDM6_CH1, txpower);
4715        rt2x00_set_field32(&regs[TX_PWR_CFG_0_EXT_IDX],
4716                           TX_PWR_CFG_0_EXT_OFDM6_CH2, txpower);
4717
4718        /* OFDM 12MBS,18MBS */
4719        txpower = rt2x00_get_field16(eeprom, EEPROM_TXPOWER_BYRATE_RATE3);
4720        txpower = rt2800_compensate_txpower(rt2x00dev, 0, band, power_level,
4721                                            txpower, delta);
4722        rt2x00_set_field32(&regs[TX_PWR_CFG_0_IDX],
4723                           TX_PWR_CFG_0_OFDM12_CH0, txpower);
4724        rt2x00_set_field32(&regs[TX_PWR_CFG_0_IDX],
4725                           TX_PWR_CFG_0_OFDM12_CH1, txpower);
4726        rt2x00_set_field32(&regs[TX_PWR_CFG_0_EXT_IDX],
4727                           TX_PWR_CFG_0_EXT_OFDM12_CH2, txpower);
4728
4729        /* read the next four txpower values */
4730        eeprom = rt2800_eeprom_read_from_array(rt2x00dev, EEPROM_TXPOWER_BYRATE,
4731                                               offset + 1);
4732
4733        /* OFDM 24MBS,36MBS */
4734        txpower = rt2x00_get_field16(eeprom, EEPROM_TXPOWER_BYRATE_RATE0);
4735        txpower = rt2800_compensate_txpower(rt2x00dev, 0, band, power_level,
4736                                            txpower, delta);
4737        rt2x00_set_field32(&regs[TX_PWR_CFG_1_IDX],
4738                           TX_PWR_CFG_1_OFDM24_CH0, txpower);
4739        rt2x00_set_field32(&regs[TX_PWR_CFG_1_IDX],
4740                           TX_PWR_CFG_1_OFDM24_CH1, txpower);
4741        rt2x00_set_field32(&regs[TX_PWR_CFG_1_EXT_IDX],
4742                           TX_PWR_CFG_1_EXT_OFDM24_CH2, txpower);
4743
4744        /* OFDM 48MBS */
4745        txpower = rt2x00_get_field16(eeprom, EEPROM_TXPOWER_BYRATE_RATE1);
4746        txpower = rt2800_compensate_txpower(rt2x00dev, 0, band, power_level,
4747                                            txpower, delta);
4748        rt2x00_set_field32(&regs[TX_PWR_CFG_1_IDX],
4749                           TX_PWR_CFG_1_OFDM48_CH0, txpower);
4750        rt2x00_set_field32(&regs[TX_PWR_CFG_1_IDX],
4751                           TX_PWR_CFG_1_OFDM48_CH1, txpower);
4752        rt2x00_set_field32(&regs[TX_PWR_CFG_1_EXT_IDX],
4753                           TX_PWR_CFG_1_EXT_OFDM48_CH2, txpower);
4754
4755        /* OFDM 54MBS */
4756        txpower = rt2x00_get_field16(eeprom, EEPROM_TXPOWER_BYRATE_RATE2);
4757        txpower = rt2800_compensate_txpower(rt2x00dev, 0, band, power_level,
4758                                            txpower, delta);
4759        rt2x00_set_field32(&regs[TX_PWR_CFG_7_IDX],
4760                           TX_PWR_CFG_7_OFDM54_CH0, txpower);
4761        rt2x00_set_field32(&regs[TX_PWR_CFG_7_IDX],
4762                           TX_PWR_CFG_7_OFDM54_CH1, txpower);
4763        rt2x00_set_field32(&regs[TX_PWR_CFG_7_IDX],
4764                           TX_PWR_CFG_7_OFDM54_CH2, txpower);
4765
4766        /* read the next four txpower values */
4767        eeprom = rt2800_eeprom_read_from_array(rt2x00dev, EEPROM_TXPOWER_BYRATE,
4768                                               offset + 2);
4769
4770        /* MCS 0,1 */
4771        txpower = rt2x00_get_field16(eeprom, EEPROM_TXPOWER_BYRATE_RATE0);
4772        txpower = rt2800_compensate_txpower(rt2x00dev, 0, band, power_level,
4773                                            txpower, delta);
4774        rt2x00_set_field32(&regs[TX_PWR_CFG_1_IDX],
4775                           TX_PWR_CFG_1_MCS0_CH0, txpower);
4776        rt2x00_set_field32(&regs[TX_PWR_CFG_1_IDX],
4777                           TX_PWR_CFG_1_MCS0_CH1, txpower);
4778        rt2x00_set_field32(&regs[TX_PWR_CFG_1_EXT_IDX],
4779                           TX_PWR_CFG_1_EXT_MCS0_CH2, txpower);
4780
4781        /* MCS 2,3 */
4782        txpower = rt2x00_get_field16(eeprom, EEPROM_TXPOWER_BYRATE_RATE1);
4783        txpower = rt2800_compensate_txpower(rt2x00dev, 0, band, power_level,
4784                                            txpower, delta);
4785        rt2x00_set_field32(&regs[TX_PWR_CFG_1_IDX],
4786                           TX_PWR_CFG_1_MCS2_CH0, txpower);
4787        rt2x00_set_field32(&regs[TX_PWR_CFG_1_IDX],
4788                           TX_PWR_CFG_1_MCS2_CH1, txpower);
4789        rt2x00_set_field32(&regs[TX_PWR_CFG_1_EXT_IDX],
4790                           TX_PWR_CFG_1_EXT_MCS2_CH2, txpower);
4791
4792        /* MCS 4,5 */
4793        txpower = rt2x00_get_field16(eeprom, EEPROM_TXPOWER_BYRATE_RATE2);
4794        txpower = rt2800_compensate_txpower(rt2x00dev, 0, band, power_level,
4795                                            txpower, delta);
4796        rt2x00_set_field32(&regs[TX_PWR_CFG_2_IDX],
4797                           TX_PWR_CFG_2_MCS4_CH0, txpower);
4798        rt2x00_set_field32(&regs[TX_PWR_CFG_2_IDX],
4799                           TX_PWR_CFG_2_MCS4_CH1, txpower);
4800        rt2x00_set_field32(&regs[TX_PWR_CFG_2_EXT_IDX],
4801                           TX_PWR_CFG_2_EXT_MCS4_CH2, txpower);
4802
4803        /* MCS 6 */
4804        txpower = rt2x00_get_field16(eeprom, EEPROM_TXPOWER_BYRATE_RATE3);
4805        txpower = rt2800_compensate_txpower(rt2x00dev, 0, band, power_level,
4806                                            txpower, delta);
4807        rt2x00_set_field32(&regs[TX_PWR_CFG_2_IDX],
4808                           TX_PWR_CFG_2_MCS6_CH0, txpower);
4809        rt2x00_set_field32(&regs[TX_PWR_CFG_2_IDX],
4810                           TX_PWR_CFG_2_MCS6_CH1, txpower);
4811        rt2x00_set_field32(&regs[TX_PWR_CFG_2_EXT_IDX],
4812                           TX_PWR_CFG_2_EXT_MCS6_CH2, txpower);
4813
4814        /* read the next four txpower values */
4815        eeprom = rt2800_eeprom_read_from_array(rt2x00dev, EEPROM_TXPOWER_BYRATE,
4816                                               offset + 3);
4817
4818        /* MCS 7 */
4819        txpower = rt2x00_get_field16(eeprom, EEPROM_TXPOWER_BYRATE_RATE0);
4820        txpower = rt2800_compensate_txpower(rt2x00dev, 0, band, power_level,
4821                                            txpower, delta);
4822        rt2x00_set_field32(&regs[TX_PWR_CFG_7_IDX],
4823                           TX_PWR_CFG_7_MCS7_CH0, txpower);
4824        rt2x00_set_field32(&regs[TX_PWR_CFG_7_IDX],
4825                           TX_PWR_CFG_7_MCS7_CH1, txpower);
4826        rt2x00_set_field32(&regs[TX_PWR_CFG_7_IDX],
4827                           TX_PWR_CFG_7_MCS7_CH2, txpower);
4828
4829        /* MCS 8,9 */
4830        txpower = rt2x00_get_field16(eeprom, EEPROM_TXPOWER_BYRATE_RATE1);
4831        txpower = rt2800_compensate_txpower(rt2x00dev, 0, band, power_level,
4832                                            txpower, delta);
4833        rt2x00_set_field32(&regs[TX_PWR_CFG_2_IDX],
4834                           TX_PWR_CFG_2_MCS8_CH0, txpower);
4835        rt2x00_set_field32(&regs[TX_PWR_CFG_2_IDX],
4836                           TX_PWR_CFG_2_MCS8_CH1, txpower);
4837        rt2x00_set_field32(&regs[TX_PWR_CFG_2_EXT_IDX],
4838                           TX_PWR_CFG_2_EXT_MCS8_CH2, txpower);
4839
4840        /* MCS 10,11 */
4841        txpower = rt2x00_get_field16(eeprom, EEPROM_TXPOWER_BYRATE_RATE2);
4842        txpower = rt2800_compensate_txpower(rt2x00dev, 0, band, power_level,
4843                                            txpower, delta);
4844        rt2x00_set_field32(&regs[TX_PWR_CFG_2_IDX],
4845                           TX_PWR_CFG_2_MCS10_CH0, txpower);
4846        rt2x00_set_field32(&regs[TX_PWR_CFG_2_IDX],
4847                           TX_PWR_CFG_2_MCS10_CH1, txpower);
4848        rt2x00_set_field32(&regs[TX_PWR_CFG_2_EXT_IDX],
4849                           TX_PWR_CFG_2_EXT_MCS10_CH2, txpower);
4850
4851        /* MCS 12,13 */
4852        txpower = rt2x00_get_field16(eeprom, EEPROM_TXPOWER_BYRATE_RATE3);
4853        txpower = rt2800_compensate_txpower(rt2x00dev, 0, band, power_level,
4854                                            txpower, delta);
4855        rt2x00_set_field32(&regs[TX_PWR_CFG_3_IDX],
4856                           TX_PWR_CFG_3_MCS12_CH0, txpower);
4857        rt2x00_set_field32(&regs[TX_PWR_CFG_3_IDX],
4858                           TX_PWR_CFG_3_MCS12_CH1, txpower);
4859        rt2x00_set_field32(&regs[TX_PWR_CFG_3_EXT_IDX],
4860                           TX_PWR_CFG_3_EXT_MCS12_CH2, txpower);
4861
4862        /* read the next four txpower values */
4863        eeprom = rt2800_eeprom_read_from_array(rt2x00dev, EEPROM_TXPOWER_BYRATE,
4864                                               offset + 4);
4865
4866        /* MCS 14 */
4867        txpower = rt2x00_get_field16(eeprom, EEPROM_TXPOWER_BYRATE_RATE0);
4868        txpower = rt2800_compensate_txpower(rt2x00dev, 0, band, power_level,
4869                                            txpower, delta);
4870        rt2x00_set_field32(&regs[TX_PWR_CFG_3_IDX],
4871                           TX_PWR_CFG_3_MCS14_CH0, txpower);
4872        rt2x00_set_field32(&regs[TX_PWR_CFG_3_IDX],
4873                           TX_PWR_CFG_3_MCS14_CH1, txpower);
4874        rt2x00_set_field32(&regs[TX_PWR_CFG_3_EXT_IDX],
4875                           TX_PWR_CFG_3_EXT_MCS14_CH2, txpower);
4876
4877        /* MCS 15 */
4878        txpower = rt2x00_get_field16(eeprom, EEPROM_TXPOWER_BYRATE_RATE1);
4879        txpower = rt2800_compensate_txpower(rt2x00dev, 0, band, power_level,
4880                                            txpower, delta);
4881        rt2x00_set_field32(&regs[TX_PWR_CFG_8_IDX],
4882                           TX_PWR_CFG_8_MCS15_CH0, txpower);
4883        rt2x00_set_field32(&regs[TX_PWR_CFG_8_IDX],
4884                           TX_PWR_CFG_8_MCS15_CH1, txpower);
4885        rt2x00_set_field32(&regs[TX_PWR_CFG_8_IDX],
4886                           TX_PWR_CFG_8_MCS15_CH2, txpower);
4887
4888        /* MCS 16,17 */
4889        txpower = rt2x00_get_field16(eeprom, EEPROM_TXPOWER_BYRATE_RATE2);
4890        txpower = rt2800_compensate_txpower(rt2x00dev, 0, band, power_level,
4891                                            txpower, delta);
4892        rt2x00_set_field32(&regs[TX_PWR_CFG_5_IDX],
4893                           TX_PWR_CFG_5_MCS16_CH0, txpower);
4894        rt2x00_set_field32(&regs[TX_PWR_CFG_5_IDX],
4895                           TX_PWR_CFG_5_MCS16_CH1, txpower);
4896        rt2x00_set_field32(&regs[TX_PWR_CFG_5_IDX],
4897                           TX_PWR_CFG_5_MCS16_CH2, txpower);
4898
4899        /* MCS 18,19 */
4900        txpower = rt2x00_get_field16(eeprom, EEPROM_TXPOWER_BYRATE_RATE3);
4901        txpower = rt2800_compensate_txpower(rt2x00dev, 0, band, power_level,
4902                                            txpower, delta);
4903        rt2x00_set_field32(&regs[TX_PWR_CFG_5_IDX],
4904                           TX_PWR_CFG_5_MCS18_CH0, txpower);
4905        rt2x00_set_field32(&regs[TX_PWR_CFG_5_IDX],
4906                           TX_PWR_CFG_5_MCS18_CH1, txpower);
4907        rt2x00_set_field32(&regs[TX_PWR_CFG_5_IDX],
4908                           TX_PWR_CFG_5_MCS18_CH2, txpower);
4909
4910        /* read the next four txpower values */
4911        eeprom = rt2800_eeprom_read_from_array(rt2x00dev, EEPROM_TXPOWER_BYRATE,
4912                                               offset + 5);
4913
4914        /* MCS 20,21 */
4915        txpower = rt2x00_get_field16(eeprom, EEPROM_TXPOWER_BYRATE_RATE0);
4916        txpower = rt2800_compensate_txpower(rt2x00dev, 0, band, power_level,
4917                                            txpower, delta);
4918        rt2x00_set_field32(&regs[TX_PWR_CFG_6_IDX],
4919                           TX_PWR_CFG_6_MCS20_CH0, txpower);
4920        rt2x00_set_field32(&regs[TX_PWR_CFG_6_IDX],
4921                           TX_PWR_CFG_6_MCS20_CH1, txpower);
4922        rt2x00_set_field32(&regs[TX_PWR_CFG_6_IDX],
4923                           TX_PWR_CFG_6_MCS20_CH2, txpower);
4924
4925        /* MCS 22 */
4926        txpower = rt2x00_get_field16(eeprom, EEPROM_TXPOWER_BYRATE_RATE1);
4927        txpower = rt2800_compensate_txpower(rt2x00dev, 0, band, power_level,
4928                                            txpower, delta);
4929        rt2x00_set_field32(&regs[TX_PWR_CFG_6_IDX],
4930                           TX_PWR_CFG_6_MCS22_CH0, txpower);
4931        rt2x00_set_field32(&regs[TX_PWR_CFG_6_IDX],
4932                           TX_PWR_CFG_6_MCS22_CH1, txpower);
4933        rt2x00_set_field32(&regs[TX_PWR_CFG_6_IDX],
4934                           TX_PWR_CFG_6_MCS22_CH2, txpower);
4935
4936        /* MCS 23 */
4937        txpower = rt2x00_get_field16(eeprom, EEPROM_TXPOWER_BYRATE_RATE2);
4938        txpower = rt2800_compensate_txpower(rt2x00dev, 0, band, power_level,
4939                                            txpower, delta);
4940        rt2x00_set_field32(&regs[TX_PWR_CFG_8_IDX],
4941                           TX_PWR_CFG_8_MCS23_CH0, txpower);
4942        rt2x00_set_field32(&regs[TX_PWR_CFG_8_IDX],
4943                           TX_PWR_CFG_8_MCS23_CH1, txpower);
4944        rt2x00_set_field32(&regs[TX_PWR_CFG_8_IDX],
4945                           TX_PWR_CFG_8_MCS23_CH2, txpower);
4946
4947        /* read the next four txpower values */
4948        eeprom = rt2800_eeprom_read_from_array(rt2x00dev, EEPROM_TXPOWER_BYRATE,
4949                                               offset + 6);
4950
4951        /* STBC, MCS 0,1 */
4952        txpower = rt2x00_get_field16(eeprom, EEPROM_TXPOWER_BYRATE_RATE0);
4953        txpower = rt2800_compensate_txpower(rt2x00dev, 0, band, power_level,
4954                                            txpower, delta);
4955        rt2x00_set_field32(&regs[TX_PWR_CFG_3_IDX],
4956                           TX_PWR_CFG_3_STBC0_CH0, txpower);
4957        rt2x00_set_field32(&regs[TX_PWR_CFG_3_IDX],
4958                           TX_PWR_CFG_3_STBC0_CH1, txpower);
4959        rt2x00_set_field32(&regs[TX_PWR_CFG_3_EXT_IDX],
4960                           TX_PWR_CFG_3_EXT_STBC0_CH2, txpower);
4961
4962        /* STBC, MCS 2,3 */
4963        txpower = rt2x00_get_field16(eeprom, EEPROM_TXPOWER_BYRATE_RATE1);
4964        txpower = rt2800_compensate_txpower(rt2x00dev, 0, band, power_level,
4965                                            txpower, delta);
4966        rt2x00_set_field32(&regs[TX_PWR_CFG_3_IDX],
4967                           TX_PWR_CFG_3_STBC2_CH0, txpower);
4968        rt2x00_set_field32(&regs[TX_PWR_CFG_3_IDX],
4969                           TX_PWR_CFG_3_STBC2_CH1, txpower);
4970        rt2x00_set_field32(&regs[TX_PWR_CFG_3_EXT_IDX],
4971                           TX_PWR_CFG_3_EXT_STBC2_CH2, txpower);
4972
4973        /* STBC, MCS 4,5 */
4974        txpower = rt2x00_get_field16(eeprom, EEPROM_TXPOWER_BYRATE_RATE2);
4975        txpower = rt2800_compensate_txpower(rt2x00dev, 0, band, power_level,
4976                                            txpower, delta);
4977        rt2x00_set_field32(&regs[TX_PWR_CFG_4_IDX], TX_PWR_CFG_RATE0, txpower);
4978        rt2x00_set_field32(&regs[TX_PWR_CFG_4_IDX], TX_PWR_CFG_RATE1, txpower);
4979        rt2x00_set_field32(&regs[TX_PWR_CFG_4_EXT_IDX], TX_PWR_CFG_RATE0,
4980                           txpower);
4981
4982        /* STBC, MCS 6 */
4983        txpower = rt2x00_get_field16(eeprom, EEPROM_TXPOWER_BYRATE_RATE3);
4984        txpower = rt2800_compensate_txpower(rt2x00dev, 0, band, power_level,
4985                                            txpower, delta);
4986        rt2x00_set_field32(&regs[TX_PWR_CFG_4_IDX], TX_PWR_CFG_RATE2, txpower);
4987        rt2x00_set_field32(&regs[TX_PWR_CFG_4_IDX], TX_PWR_CFG_RATE3, txpower);
4988        rt2x00_set_field32(&regs[TX_PWR_CFG_4_EXT_IDX], TX_PWR_CFG_RATE2,
4989                           txpower);
4990
4991        /* read the next four txpower values */
4992        eeprom = rt2800_eeprom_read_from_array(rt2x00dev, EEPROM_TXPOWER_BYRATE,
4993                                               offset + 7);
4994
4995        /* STBC, MCS 7 */
4996        txpower = rt2x00_get_field16(eeprom, EEPROM_TXPOWER_BYRATE_RATE0);
4997        txpower = rt2800_compensate_txpower(rt2x00dev, 0, band, power_level,
4998                                            txpower, delta);
4999        rt2x00_set_field32(&regs[TX_PWR_CFG_9_IDX],
5000                           TX_PWR_CFG_9_STBC7_CH0, txpower);
5001        rt2x00_set_field32(&regs[TX_PWR_CFG_9_IDX],
5002                           TX_PWR_CFG_9_STBC7_CH1, txpower);
5003        rt2x00_set_field32(&regs[TX_PWR_CFG_9_IDX],
5004                           TX_PWR_CFG_9_STBC7_CH2, txpower);
5005
5006        rt2800_register_write(rt2x00dev, TX_PWR_CFG_0, regs[TX_PWR_CFG_0_IDX]);
5007        rt2800_register_write(rt2x00dev, TX_PWR_CFG_1, regs[TX_PWR_CFG_1_IDX]);
5008        rt2800_register_write(rt2x00dev, TX_PWR_CFG_2, regs[TX_PWR_CFG_2_IDX]);
5009        rt2800_register_write(rt2x00dev, TX_PWR_CFG_3, regs[TX_PWR_CFG_3_IDX]);
5010        rt2800_register_write(rt2x00dev, TX_PWR_CFG_4, regs[TX_PWR_CFG_4_IDX]);
5011        rt2800_register_write(rt2x00dev, TX_PWR_CFG_5, regs[TX_PWR_CFG_5_IDX]);
5012        rt2800_register_write(rt2x00dev, TX_PWR_CFG_6, regs[TX_PWR_CFG_6_IDX]);
5013        rt2800_register_write(rt2x00dev, TX_PWR_CFG_7, regs[TX_PWR_CFG_7_IDX]);
5014        rt2800_register_write(rt2x00dev, TX_PWR_CFG_8, regs[TX_PWR_CFG_8_IDX]);
5015        rt2800_register_write(rt2x00dev, TX_PWR_CFG_9, regs[TX_PWR_CFG_9_IDX]);
5016
5017        rt2800_register_write(rt2x00dev, TX_PWR_CFG_0_EXT,
5018                              regs[TX_PWR_CFG_0_EXT_IDX]);
5019        rt2800_register_write(rt2x00dev, TX_PWR_CFG_1_EXT,
5020                              regs[TX_PWR_CFG_1_EXT_IDX]);
5021        rt2800_register_write(rt2x00dev, TX_PWR_CFG_2_EXT,
5022                              regs[TX_PWR_CFG_2_EXT_IDX]);
5023        rt2800_register_write(rt2x00dev, TX_PWR_CFG_3_EXT,
5024                              regs[TX_PWR_CFG_3_EXT_IDX]);
5025        rt2800_register_write(rt2x00dev, TX_PWR_CFG_4_EXT,
5026                              regs[TX_PWR_CFG_4_EXT_IDX]);
5027
5028        for (i = 0; i < TX_PWR_CFG_IDX_COUNT; i++)
5029                rt2x00_dbg(rt2x00dev,
5030                           "band:%cGHz, BW:%c0MHz, TX_PWR_CFG_%d%s = %08lx\n",
5031                           (band == NL80211_BAND_5GHZ) ? '5' : '2',
5032                           (test_bit(CONFIG_CHANNEL_HT40, &rt2x00dev->flags)) ?
5033                                                                '4' : '2',
5034                           (i > TX_PWR_CFG_9_IDX) ?
5035                                        (i - TX_PWR_CFG_9_IDX - 1) : i,
5036                           (i > TX_PWR_CFG_9_IDX) ? "_EXT" : "",
5037                           (unsigned long) regs[i]);
5038}
5039
5040static void rt2800_config_txpower_rt6352(struct rt2x00_dev *rt2x00dev,
5041                                         struct ieee80211_channel *chan,
5042                                         int power_level)
5043{
5044        u32 reg, pwreg;
5045        u16 eeprom;
5046        u32 data, gdata;
5047        u8 t, i;
5048        enum nl80211_band band = chan->band;
5049        int delta;
5050
5051        /* Warn user if bw_comp is set in EEPROM */
5052        delta = rt2800_get_txpower_bw_comp(rt2x00dev, band);
5053
5054        if (delta)
5055                rt2x00_warn(rt2x00dev, "ignoring EEPROM HT40 power delta: %d\n",
5056                            delta);
5057
5058        /* populate TX_PWR_CFG_0 up to TX_PWR_CFG_4 from EEPROM for HT20, limit
5059         * value to 0x3f and replace 0x20 by 0x21 as this is what the vendor
5060         * driver does as well, though it looks kinda wrong.
5061         * Maybe some misunderstanding of what a signed 8-bit value is? Maybe
5062         * the hardware has a problem handling 0x20, and as the code initially
5063         * used a fixed offset between HT20 and HT40 rates they had to work-
5064         * around that issue and most likely just forgot about it later on.
5065         * Maybe we should use rt2800_get_txpower_bw_comp() here as well,
5066         * however, the corresponding EEPROM value is not respected by the
5067         * vendor driver, so maybe this is rather being taken care of the
5068         * TXALC and the driver doesn't need to handle it...?
5069         * Though this is all very awkward, just do as they did, as that's what
5070         * board vendors expected when they populated the EEPROM...
5071         */
5072        for (i = 0; i < 5; i++) {
5073                eeprom = rt2800_eeprom_read_from_array(rt2x00dev,
5074                                                       EEPROM_TXPOWER_BYRATE,
5075                                                       i * 2);
5076
5077                data = eeprom;
5078
5079                t = eeprom & 0x3f;
5080                if (t == 32)
5081                        t++;
5082
5083                gdata = t;
5084
5085                t = (eeprom & 0x3f00) >> 8;
5086                if (t == 32)
5087                        t++;
5088
5089                gdata |= (t << 8);
5090
5091                eeprom = rt2800_eeprom_read_from_array(rt2x00dev,
5092                                                       EEPROM_TXPOWER_BYRATE,
5093                                                       (i * 2) + 1);
5094
5095                t = eeprom & 0x3f;
5096                if (t == 32)
5097                        t++;
5098
5099                gdata |= (t << 16);
5100
5101                t = (eeprom & 0x3f00) >> 8;
5102                if (t == 32)
5103                        t++;
5104
5105                gdata |= (t << 24);
5106                data |= (eeprom << 16);
5107
5108                if (!test_bit(CONFIG_CHANNEL_HT40, &rt2x00dev->flags)) {
5109                        /* HT20 */
5110                        if (data != 0xffffffff)
5111                                rt2800_register_write(rt2x00dev,
5112                                                      TX_PWR_CFG_0 + (i * 4),
5113                                                      data);
5114                } else {
5115                        /* HT40 */
5116                        if (gdata != 0xffffffff)
5117                                rt2800_register_write(rt2x00dev,
5118                                                      TX_PWR_CFG_0 + (i * 4),
5119                                                      gdata);
5120                }
5121        }
5122
5123        /* Aparently Ralink ran out of space in the BYRATE calibration section
5124         * of the EERPOM which is copied to the corresponding TX_PWR_CFG_x
5125         * registers. As recent 2T chips use 8-bit instead of 4-bit values for
5126         * power-offsets more space would be needed. Ralink decided to keep the
5127         * EEPROM layout untouched and rather have some shared values covering
5128         * multiple bitrates.
5129         * Populate the registers not covered by the EEPROM in the same way the
5130         * vendor driver does.
5131         */
5132
5133        /* For OFDM 54MBS use value from OFDM 48MBS */
5134        pwreg = 0;
5135        reg = rt2800_register_read(rt2x00dev, TX_PWR_CFG_1);
5136        t = rt2x00_get_field32(reg, TX_PWR_CFG_1B_48MBS);
5137        rt2x00_set_field32(&pwreg, TX_PWR_CFG_7B_54MBS, t);
5138
5139        /* For MCS 7 use value from MCS 6 */
5140        reg = rt2800_register_read(rt2x00dev, TX_PWR_CFG_2);
5141        t = rt2x00_get_field32(reg, TX_PWR_CFG_2B_MCS6_MCS7);
5142        rt2x00_set_field32(&pwreg, TX_PWR_CFG_7B_MCS7, t);
5143        rt2800_register_write(rt2x00dev, TX_PWR_CFG_7, pwreg);
5144
5145        /* For MCS 15 use value from MCS 14 */
5146        pwreg = 0;
5147        reg = rt2800_register_read(rt2x00dev, TX_PWR_CFG_3);
5148        t = rt2x00_get_field32(reg, TX_PWR_CFG_3B_MCS14);
5149        rt2x00_set_field32(&pwreg, TX_PWR_CFG_8B_MCS15, t);
5150        rt2800_register_write(rt2x00dev, TX_PWR_CFG_8, pwreg);
5151
5152        /* For STBC MCS 7 use value from STBC MCS 6 */
5153        pwreg = 0;
5154        reg = rt2800_register_read(rt2x00dev, TX_PWR_CFG_4);
5155        t = rt2x00_get_field32(reg, TX_PWR_CFG_4B_STBC_MCS6);
5156        rt2x00_set_field32(&pwreg, TX_PWR_CFG_9B_STBC_MCS7, t);
5157        rt2800_register_write(rt2x00dev, TX_PWR_CFG_9, pwreg);
5158
5159        rt2800_config_alc(rt2x00dev, chan, power_level);
5160
5161        /* TODO: temperature compensation code! */
5162}
5163
5164/*
5165 * We configure transmit power using MAC TX_PWR_CFG_{0,...,N} registers and
5166 * BBP R1 register. TX_PWR_CFG_X allow to configure per rate TX power values,
5167 * 4 bits for each rate (tune from 0 to 15 dBm). BBP_R1 controls transmit power
5168 * for all rates, but allow to set only 4 discrete values: -12, -6, 0 and 6 dBm.
5169 * Reference per rate transmit power values are located in the EEPROM at
5170 * EEPROM_TXPOWER_BYRATE offset. We adjust them and BBP R1 settings according to
5171 * current conditions (i.e. band, bandwidth, temperature, user settings).
5172 */
5173static void rt2800_config_txpower_rt28xx(struct rt2x00_dev *rt2x00dev,
5174                                         struct ieee80211_channel *chan,
5175                                         int power_level)
5176{
5177        u8 txpower, r1;
5178        u16 eeprom;
5179        u32 reg, offset;
5180        int i, is_rate_b, delta, power_ctrl;
5181        enum nl80211_band band = chan->band;
5182
5183        /*
5184         * Calculate HT40 compensation. For 40MHz we need to add or subtract
5185         * value read from EEPROM (different for 2GHz and for 5GHz).
5186         */
5187        delta = rt2800_get_txpower_bw_comp(rt2x00dev, band);
5188
5189        /*
5190         * Calculate temperature compensation. Depends on measurement of current
5191         * TSSI (Transmitter Signal Strength Indication) we know TX power (due
5192         * to temperature or maybe other factors) is smaller or bigger than
5193         * expected. We adjust it, based on TSSI reference and boundaries values
5194         * provided in EEPROM.
5195         */
5196        switch (rt2x00dev->chip.rt) {
5197        case RT2860:
5198        case RT2872:
5199        case RT2883:
5200        case RT3070:
5201        case RT3071:
5202        case RT3090:
5203        case RT3572:
5204                delta += rt2800_get_gain_calibration_delta(rt2x00dev);
5205                break;
5206        default:
5207                /* TODO: temperature compensation code for other chips. */
5208                break;
5209        }
5210
5211        /*
5212         * Decrease power according to user settings, on devices with unknown
5213         * maximum tx power. For other devices we take user power_level into
5214         * consideration on rt2800_compensate_txpower().
5215         */
5216        delta += rt2800_get_txpower_reg_delta(rt2x00dev, power_level,
5217                                              chan->max_power);
5218
5219        /*
5220         * BBP_R1 controls TX power for all rates, it allow to set the following
5221         * gains -12, -6, 0, +6 dBm by setting values 2, 1, 0, 3 respectively.
5222         *
5223         * TODO: we do not use +6 dBm option to do not increase power beyond
5224         * regulatory limit, however this could be utilized for devices with
5225         * CAPABILITY_POWER_LIMIT.
5226         */
5227        if (delta <= -12) {
5228                power_ctrl = 2;
5229                delta += 12;
5230        } else if (delta <= -6) {
5231                power_ctrl = 1;
5232                delta += 6;
5233        } else {
5234                power_ctrl = 0;
5235        }
5236        r1 = rt2800_bbp_read(rt2x00dev, 1);
5237        rt2x00_set_field8(&r1, BBP1_TX_POWER_CTRL, power_ctrl);
5238        rt2800_bbp_write(rt2x00dev, 1, r1);
5239
5240        offset = TX_PWR_CFG_0;
5241
5242        for (i = 0; i < EEPROM_TXPOWER_BYRATE_SIZE; i += 2) {
5243                /* just to be safe */
5244                if (offset > TX_PWR_CFG_4)
5245                        break;
5246
5247                reg = rt2800_register_read(rt2x00dev, offset);
5248
5249                /* read the next four txpower values */
5250                eeprom = rt2800_eeprom_read_from_array(rt2x00dev,
5251                                                       EEPROM_TXPOWER_BYRATE,
5252                                                       i);
5253
5254                is_rate_b = i ? 0 : 1;
5255                /*
5256                 * TX_PWR_CFG_0: 1MBS, TX_PWR_CFG_1: 24MBS,
5257                 * TX_PWR_CFG_2: MCS4, TX_PWR_CFG_3: MCS12,
5258                 * TX_PWR_CFG_4: unknown
5259                 */
5260                txpower = rt2x00_get_field16(eeprom,
5261                                             EEPROM_TXPOWER_BYRATE_RATE0);
5262                txpower = rt2800_compensate_txpower(rt2x00dev, is_rate_b, band,
5263                                             power_level, txpower, delta);
5264                rt2x00_set_field32(&reg, TX_PWR_CFG_RATE0, txpower);
5265
5266                /*
5267                 * TX_PWR_CFG_0: 2MBS, TX_PWR_CFG_1: 36MBS,
5268                 * TX_PWR_CFG_2: MCS5, TX_PWR_CFG_3: MCS13,
5269                 * TX_PWR_CFG_4: unknown
5270                 */
5271                txpower = rt2x00_get_field16(eeprom,
5272                                             EEPROM_TXPOWER_BYRATE_RATE1);
5273                txpower = rt2800_compensate_txpower(rt2x00dev, is_rate_b, band,
5274                                             power_level, txpower, delta);
5275                rt2x00_set_field32(&reg, TX_PWR_CFG_RATE1, txpower);
5276
5277                /*
5278                 * TX_PWR_CFG_0: 5.5MBS, TX_PWR_CFG_1: 48MBS,
5279                 * TX_PWR_CFG_2: MCS6,  TX_PWR_CFG_3: MCS14,
5280                 * TX_PWR_CFG_4: unknown
5281                 */
5282                txpower = rt2x00_get_field16(eeprom,
5283                                             EEPROM_TXPOWER_BYRATE_RATE2);
5284                txpower = rt2800_compensate_txpower(rt2x00dev, is_rate_b, band,
5285                                             power_level, txpower, delta);
5286                rt2x00_set_field32(&reg, TX_PWR_CFG_RATE2, txpower);
5287
5288                /*
5289                 * TX_PWR_CFG_0: 11MBS, TX_PWR_CFG_1: 54MBS,
5290                 * TX_PWR_CFG_2: MCS7,  TX_PWR_CFG_3: MCS15,
5291                 * TX_PWR_CFG_4: unknown
5292                 */
5293                txpower = rt2x00_get_field16(eeprom,
5294                                             EEPROM_TXPOWER_BYRATE_RATE3);
5295                txpower = rt2800_compensate_txpower(rt2x00dev, is_rate_b, band,
5296                                             power_level, txpower, delta);
5297                rt2x00_set_field32(&reg, TX_PWR_CFG_RATE3, txpower);
5298
5299                /* read the next four txpower values */
5300                eeprom = rt2800_eeprom_read_from_array(rt2x00dev,
5301                                                       EEPROM_TXPOWER_BYRATE,
5302                                                       i + 1);
5303
5304                is_rate_b = 0;
5305                /*
5306                 * TX_PWR_CFG_0: 6MBS, TX_PWR_CFG_1: MCS0,
5307                 * TX_PWR_CFG_2: MCS8, TX_PWR_CFG_3: unknown,
5308                 * TX_PWR_CFG_4: unknown
5309                 */
5310                txpower = rt2x00_get_field16(eeprom,
5311                                             EEPROM_TXPOWER_BYRATE_RATE0);
5312                txpower = rt2800_compensate_txpower(rt2x00dev, is_rate_b, band,
5313                                             power_level, txpower, delta);
5314                rt2x00_set_field32(&reg, TX_PWR_CFG_RATE4, txpower);
5315
5316                /*
5317                 * TX_PWR_CFG_0: 9MBS, TX_PWR_CFG_1: MCS1,
5318                 * TX_PWR_CFG_2: MCS9, TX_PWR_CFG_3: unknown,
5319                 * TX_PWR_CFG_4: unknown
5320                 */
5321                txpower = rt2x00_get_field16(eeprom,
5322                                             EEPROM_TXPOWER_BYRATE_RATE1);
5323                txpower = rt2800_compensate_txpower(rt2x00dev, is_rate_b, band,
5324                                             power_level, txpower, delta);
5325                rt2x00_set_field32(&reg, TX_PWR_CFG_RATE5, txpower);
5326
5327                /*
5328                 * TX_PWR_CFG_0: 12MBS, TX_PWR_CFG_1: MCS2,
5329                 * TX_PWR_CFG_2: MCS10, TX_PWR_CFG_3: unknown,
5330                 * TX_PWR_CFG_4: unknown
5331                 */
5332                txpower = rt2x00_get_field16(eeprom,
5333                                             EEPROM_TXPOWER_BYRATE_RATE2);
5334                txpower = rt2800_compensate_txpower(rt2x00dev, is_rate_b, band,
5335                                             power_level, txpower, delta);
5336                rt2x00_set_field32(&reg, TX_PWR_CFG_RATE6, txpower);
5337
5338                /*
5339                 * TX_PWR_CFG_0: 18MBS, TX_PWR_CFG_1: MCS3,
5340                 * TX_PWR_CFG_2: MCS11, TX_PWR_CFG_3: unknown,
5341                 * TX_PWR_CFG_4: unknown
5342                 */
5343                txpower = rt2x00_get_field16(eeprom,
5344                                             EEPROM_TXPOWER_BYRATE_RATE3);
5345                txpower = rt2800_compensate_txpower(rt2x00dev, is_rate_b, band,
5346                                             power_level, txpower, delta);
5347                rt2x00_set_field32(&reg, TX_PWR_CFG_RATE7, txpower);
5348
5349                rt2800_register_write(rt2x00dev, offset, reg);
5350
5351                /* next TX_PWR_CFG register */
5352                offset += 4;
5353        }
5354}
5355
5356static void rt2800_config_txpower(struct rt2x00_dev *rt2x00dev,
5357                                  struct ieee80211_channel *chan,
5358                                  int power_level)
5359{
5360        if (rt2x00_rt(rt2x00dev, RT3593) ||
5361            rt2x00_rt(rt2x00dev, RT3883))
5362                rt2800_config_txpower_rt3593(rt2x00dev, chan, power_level);
5363        else if (rt2x00_rt(rt2x00dev, RT6352))
5364                rt2800_config_txpower_rt6352(rt2x00dev, chan, power_level);
5365        else
5366                rt2800_config_txpower_rt28xx(rt2x00dev, chan, power_level);
5367}
5368
5369void rt2800_gain_calibration(struct rt2x00_dev *rt2x00dev)
5370{
5371        rt2800_config_txpower(rt2x00dev, rt2x00dev->hw->conf.chandef.chan,
5372                              rt2x00dev->tx_power);
5373}
5374EXPORT_SYMBOL_GPL(rt2800_gain_calibration);
5375
5376void rt2800_vco_calibration(struct rt2x00_dev *rt2x00dev)
5377{
5378        u32     tx_pin;
5379        u8      rfcsr;
5380        unsigned long min_sleep = 0;
5381
5382        /*
5383         * A voltage-controlled oscillator(VCO) is an electronic oscillator
5384         * designed to be controlled in oscillation frequency by a voltage
5385         * input. Maybe the temperature will affect the frequency of
5386         * oscillation to be shifted. The VCO calibration will be called
5387         * periodically to adjust the frequency to be precision.
5388        */
5389
5390        tx_pin = rt2800_register_read(rt2x00dev, TX_PIN_CFG);
5391        tx_pin &= TX_PIN_CFG_PA_PE_DISABLE;
5392        rt2800_register_write(rt2x00dev, TX_PIN_CFG, tx_pin);
5393
5394        switch (rt2x00dev->chip.rf) {
5395        case RF2020:
5396        case RF3020:
5397        case RF3021:
5398        case RF3022:
5399        case RF3320:
5400        case RF3052:
5401                rfcsr = rt2800_rfcsr_read(rt2x00dev, 7);
5402                rt2x00_set_field8(&rfcsr, RFCSR7_RF_TUNING, 1);
5403                rt2800_rfcsr_write(rt2x00dev, 7, rfcsr);
5404                break;
5405        case RF3053:
5406        case RF3070:
5407        case RF3290:
5408        case RF3853:
5409        case RF5350:
5410        case RF5360:
5411        case RF5362:
5412        case RF5370:
5413        case RF5372:
5414        case RF5390:
5415        case RF5392:
5416        case RF5592:
5417                rfcsr = rt2800_rfcsr_read(rt2x00dev, 3);
5418                rt2x00_set_field8(&rfcsr, RFCSR3_VCOCAL_EN, 1);
5419                rt2800_rfcsr_write(rt2x00dev, 3, rfcsr);
5420                min_sleep = 1000;
5421                break;
5422        case RF7620:
5423                rt2800_rfcsr_write(rt2x00dev, 5, 0x40);
5424                rt2800_rfcsr_write(rt2x00dev, 4, 0x0C);
5425                rfcsr = rt2800_rfcsr_read(rt2x00dev, 4);
5426                rt2x00_set_field8(&rfcsr, RFCSR4_VCOCAL_EN, 1);
5427                rt2800_rfcsr_write(rt2x00dev, 4, rfcsr);
5428                min_sleep = 2000;
5429                break;
5430        default:
5431                WARN_ONCE(1, "Not supported RF chipset %x for VCO recalibration",
5432                          rt2x00dev->chip.rf);
5433                return;
5434        }
5435
5436        if (min_sleep > 0)
5437                usleep_range(min_sleep, min_sleep * 2);
5438
5439        tx_pin = rt2800_register_read(rt2x00dev, TX_PIN_CFG);
5440        if (rt2x00dev->rf_channel <= 14) {
5441                switch (rt2x00dev->default_ant.tx_chain_num) {
5442                case 3:
5443                        rt2x00_set_field32(&tx_pin, TX_PIN_CFG_PA_PE_G2_EN, 1);
5444                        /* fall through */
5445                case 2:
5446                        rt2x00_set_field32(&tx_pin, TX_PIN_CFG_PA_PE_G1_EN, 1);
5447                        /* fall through */
5448                case 1:
5449                default:
5450                        rt2x00_set_field32(&tx_pin, TX_PIN_CFG_PA_PE_G0_EN, 1);
5451                        break;
5452                }
5453        } else {
5454                switch (rt2x00dev->default_ant.tx_chain_num) {
5455                case 3:
5456                        rt2x00_set_field32(&tx_pin, TX_PIN_CFG_PA_PE_A2_EN, 1);
5457                        /* fall through */
5458                case 2:
5459                        rt2x00_set_field32(&tx_pin, TX_PIN_CFG_PA_PE_A1_EN, 1);
5460                        /* fall through */
5461                case 1:
5462                default:
5463                        rt2x00_set_field32(&tx_pin, TX_PIN_CFG_PA_PE_A0_EN, 1);
5464                        break;
5465                }
5466        }
5467        rt2800_register_write(rt2x00dev, TX_PIN_CFG, tx_pin);
5468
5469        if (rt2x00_rt(rt2x00dev, RT6352)) {
5470                if (rt2x00dev->default_ant.rx_chain_num == 1) {
5471                        rt2800_bbp_write(rt2x00dev, 91, 0x07);
5472                        rt2800_bbp_write(rt2x00dev, 95, 0x1A);
5473                        rt2800_bbp_write(rt2x00dev, 195, 128);
5474                        rt2800_bbp_write(rt2x00dev, 196, 0xA0);
5475                        rt2800_bbp_write(rt2x00dev, 195, 170);
5476                        rt2800_bbp_write(rt2x00dev, 196, 0x12);
5477                        rt2800_bbp_write(rt2x00dev, 195, 171);
5478                        rt2800_bbp_write(rt2x00dev, 196, 0x10);
5479                } else {
5480                        rt2800_bbp_write(rt2x00dev, 91, 0x06);
5481                        rt2800_bbp_write(rt2x00dev, 95, 0x9A);
5482                        rt2800_bbp_write(rt2x00dev, 195, 128);
5483                        rt2800_bbp_write(rt2x00dev, 196, 0xE0);
5484                        rt2800_bbp_write(rt2x00dev, 195, 170);
5485                        rt2800_bbp_write(rt2x00dev, 196, 0x30);
5486                        rt2800_bbp_write(rt2x00dev, 195, 171);
5487                        rt2800_bbp_write(rt2x00dev, 196, 0x30);
5488                }
5489
5490                if (rt2x00_has_cap_external_lna_bg(rt2x00dev)) {
5491                        rt2800_bbp_write(rt2x00dev, 75, 0x68);
5492                        rt2800_bbp_write(rt2x00dev, 76, 0x4C);
5493                        rt2800_bbp_write(rt2x00dev, 79, 0x1C);
5494                        rt2800_bbp_write(rt2x00dev, 80, 0x0C);
5495                        rt2800_bbp_write(rt2x00dev, 82, 0xB6);
5496                }
5497
5498                /* On 11A, We should delay and wait RF/BBP to be stable
5499                 * and the appropriate time should be 1000 micro seconds
5500                 * 2005/06/05 - On 11G, we also need this delay time.
5501                 * Otherwise it's difficult to pass the WHQL.
5502                 */
5503                usleep_range(1000, 1500);
5504        }
5505}
5506EXPORT_SYMBOL_GPL(rt2800_vco_calibration);
5507
5508static void rt2800_config_retry_limit(struct rt2x00_dev *rt2x00dev,
5509                                      struct rt2x00lib_conf *libconf)
5510{
5511        u32 reg;
5512
5513        reg = rt2800_register_read(rt2x00dev, TX_RTY_CFG);
5514        rt2x00_set_field32(&reg, TX_RTY_CFG_SHORT_RTY_LIMIT,
5515                           libconf->conf->short_frame_max_tx_count);
5516        rt2x00_set_field32(&reg, TX_RTY_CFG_LONG_RTY_LIMIT,
5517                           libconf->conf->long_frame_max_tx_count);
5518        rt2800_register_write(rt2x00dev, TX_RTY_CFG, reg);
5519}
5520
5521static void rt2800_config_ps(struct rt2x00_dev *rt2x00dev,
5522                             struct rt2x00lib_conf *libconf)
5523{
5524        enum dev_state state =
5525            (libconf->conf->flags & IEEE80211_CONF_PS) ?
5526                STATE_SLEEP : STATE_AWAKE;
5527        u32 reg;
5528
5529        if (state == STATE_SLEEP) {
5530                rt2800_register_write(rt2x00dev, AUTOWAKEUP_CFG, 0);
5531
5532                reg = rt2800_register_read(rt2x00dev, AUTOWAKEUP_CFG);
5533                rt2x00_set_field32(&reg, AUTOWAKEUP_CFG_AUTO_LEAD_TIME, 5);
5534                rt2x00_set_field32(&reg, AUTOWAKEUP_CFG_TBCN_BEFORE_WAKE,
5535                                   libconf->conf->listen_interval - 1);
5536                rt2x00_set_field32(&reg, AUTOWAKEUP_CFG_AUTOWAKE, 1);
5537                rt2800_register_write(rt2x00dev, AUTOWAKEUP_CFG, reg);
5538
5539                rt2x00dev->ops->lib->set_device_state(rt2x00dev, state);
5540        } else {
5541                reg = rt2800_register_read(rt2x00dev, AUTOWAKEUP_CFG);
5542                rt2x00_set_field32(&reg, AUTOWAKEUP_CFG_AUTO_LEAD_TIME, 0);
5543                rt2x00_set_field32(&reg, AUTOWAKEUP_CFG_TBCN_BEFORE_WAKE, 0);
5544                rt2x00_set_field32(&reg, AUTOWAKEUP_CFG_AUTOWAKE, 0);
5545                rt2800_register_write(rt2x00dev, AUTOWAKEUP_CFG, reg);
5546
5547                rt2x00dev->ops->lib->set_device_state(rt2x00dev, state);
5548        }
5549}
5550
5551void rt2800_config(struct rt2x00_dev *rt2x00dev,
5552                   struct rt2x00lib_conf *libconf,
5553                   const unsigned int flags)
5554{
5555        /* Always recalculate LNA gain before changing configuration */
5556        rt2800_config_lna_gain(rt2x00dev, libconf);
5557
5558        if (flags & IEEE80211_CONF_CHANGE_CHANNEL) {
5559                rt2800_config_channel(rt2x00dev, libconf->conf,
5560                                      &libconf->rf, &libconf->channel);
5561                rt2800_config_txpower(rt2x00dev, libconf->conf->chandef.chan,
5562                                      libconf->conf->power_level);
5563        }
5564        if (flags & IEEE80211_CONF_CHANGE_POWER)
5565                rt2800_config_txpower(rt2x00dev, libconf->conf->chandef.chan,
5566                                      libconf->conf->power_level);
5567        if (flags & IEEE80211_CONF_CHANGE_RETRY_LIMITS)
5568                rt2800_config_retry_limit(rt2x00dev, libconf);
5569        if (flags & IEEE80211_CONF_CHANGE_PS)
5570                rt2800_config_ps(rt2x00dev, libconf);
5571}
5572EXPORT_SYMBOL_GPL(rt2800_config);
5573
5574/*
5575 * Link tuning
5576 */
5577void rt2800_link_stats(struct rt2x00_dev *rt2x00dev, struct link_qual *qual)
5578{
5579        u32 reg;
5580
5581        /*
5582         * Update FCS error count from register.
5583         */
5584        reg = rt2800_register_read(rt2x00dev, RX_STA_CNT0);
5585        qual->rx_failed = rt2x00_get_field32(reg, RX_STA_CNT0_CRC_ERR);
5586}
5587EXPORT_SYMBOL_GPL(rt2800_link_stats);
5588
5589static u8 rt2800_get_default_vgc(struct rt2x00_dev *rt2x00dev)
5590{
5591        u8 vgc;
5592
5593        if (rt2x00dev->curr_band == NL80211_BAND_2GHZ) {
5594                if (rt2x00_rt(rt2x00dev, RT3070) ||
5595                    rt2x00_rt(rt2x00dev, RT3071) ||
5596                    rt2x00_rt(rt2x00dev, RT3090) ||
5597                    rt2x00_rt(rt2x00dev, RT3290) ||
5598                    rt2x00_rt(rt2x00dev, RT3390) ||
5599                    rt2x00_rt(rt2x00dev, RT3572) ||
5600                    rt2x00_rt(rt2x00dev, RT3593) ||
5601                    rt2x00_rt(rt2x00dev, RT5390) ||
5602                    rt2x00_rt(rt2x00dev, RT5392) ||
5603                    rt2x00_rt(rt2x00dev, RT5592) ||
5604                    rt2x00_rt(rt2x00dev, RT6352))
5605                        vgc = 0x1c + (2 * rt2x00dev->lna_gain);
5606                else
5607                        vgc = 0x2e + rt2x00dev->lna_gain;
5608        } else { /* 5GHZ band */
5609                if (rt2x00_rt(rt2x00dev, RT3593) ||
5610                    rt2x00_rt(rt2x00dev, RT3883))
5611                        vgc = 0x20 + (rt2x00dev->lna_gain * 5) / 3;
5612                else if (rt2x00_rt(rt2x00dev, RT5592))
5613                        vgc = 0x24 + (2 * rt2x00dev->lna_gain);
5614                else {
5615                        if (!test_bit(CONFIG_CHANNEL_HT40, &rt2x00dev->flags))
5616                                vgc = 0x32 + (rt2x00dev->lna_gain * 5) / 3;
5617                        else
5618                                vgc = 0x3a + (rt2x00dev->lna_gain * 5) / 3;
5619                }
5620        }
5621
5622        return vgc;
5623}
5624
5625static inline void rt2800_set_vgc(struct rt2x00_dev *rt2x00dev,
5626                                  struct link_qual *qual, u8 vgc_level)
5627{
5628        if (qual->vgc_level != vgc_level) {
5629                if (rt2x00_rt(rt2x00dev, RT3572) ||
5630                    rt2x00_rt(rt2x00dev, RT3593) ||
5631                    rt2x00_rt(rt2x00dev, RT3883)) {
5632                        rt2800_bbp_write_with_rx_chain(rt2x00dev, 66,
5633                                                       vgc_level);
5634                } else if (rt2x00_rt(rt2x00dev, RT5592)) {
5635                        rt2800_bbp_write(rt2x00dev, 83, qual->rssi > -65 ? 0x4a : 0x7a);
5636                        rt2800_bbp_write_with_rx_chain(rt2x00dev, 66, vgc_level);
5637                } else {
5638                        rt2800_bbp_write(rt2x00dev, 66, vgc_level);
5639                }
5640
5641                qual->vgc_level = vgc_level;
5642                qual->vgc_level_reg = vgc_level;
5643        }
5644}
5645
5646void rt2800_reset_tuner(struct rt2x00_dev *rt2x00dev, struct link_qual *qual)
5647{
5648        rt2800_set_vgc(rt2x00dev, qual, rt2800_get_default_vgc(rt2x00dev));
5649}
5650EXPORT_SYMBOL_GPL(rt2800_reset_tuner);
5651
5652void rt2800_link_tuner(struct rt2x00_dev *rt2x00dev, struct link_qual *qual,
5653                       const u32 count)
5654{
5655        u8 vgc;
5656
5657        if (rt2x00_rt_rev(rt2x00dev, RT2860, REV_RT2860C))
5658                return;
5659
5660        /* When RSSI is better than a certain threshold, increase VGC
5661         * with a chip specific value in order to improve the balance
5662         * between sensibility and noise isolation.
5663         */
5664
5665        vgc = rt2800_get_default_vgc(rt2x00dev);
5666
5667        switch (rt2x00dev->chip.rt) {
5668        case RT3572:
5669        case RT3593:
5670                if (qual->rssi > -65) {
5671                        if (rt2x00dev->curr_band == NL80211_BAND_2GHZ)
5672                                vgc += 0x20;
5673                        else
5674                                vgc += 0x10;
5675                }
5676                break;
5677
5678        case RT3883:
5679                if (qual->rssi > -65)
5680                        vgc += 0x10;
5681                break;
5682
5683        case RT5592:
5684                if (qual->rssi > -65)
5685                        vgc += 0x20;
5686                break;
5687
5688        default:
5689                if (qual->rssi > -80)
5690                        vgc += 0x10;
5691                break;
5692        }
5693
5694        rt2800_set_vgc(rt2x00dev, qual, vgc);
5695}
5696EXPORT_SYMBOL_GPL(rt2800_link_tuner);
5697
5698/*
5699 * Initialization functions.
5700 */
5701static int rt2800_init_registers(struct rt2x00_dev *rt2x00dev)
5702{
5703        struct rt2800_drv_data *drv_data = rt2x00dev->drv_data;
5704        u32 reg;
5705        u16 eeprom;
5706        unsigned int i;
5707        int ret;
5708
5709        rt2800_disable_wpdma(rt2x00dev);
5710
5711        ret = rt2800_drv_init_registers(rt2x00dev);
5712        if (ret)
5713                return ret;
5714
5715        rt2800_register_write(rt2x00dev, LEGACY_BASIC_RATE, 0x0000013f);
5716        rt2800_register_write(rt2x00dev, HT_BASIC_RATE, 0x00008003);
5717
5718        rt2800_register_write(rt2x00dev, MAC_SYS_CTRL, 0x00000000);
5719
5720        reg = rt2800_register_read(rt2x00dev, BCN_TIME_CFG);
5721        rt2x00_set_field32(&reg, BCN_TIME_CFG_BEACON_INTERVAL, 1600);
5722        rt2x00_set_field32(&reg, BCN_TIME_CFG_TSF_TICKING, 0);
5723        rt2x00_set_field32(&reg, BCN_TIME_CFG_TSF_SYNC, 0);
5724        rt2x00_set_field32(&reg, BCN_TIME_CFG_TBTT_ENABLE, 0);
5725        rt2x00_set_field32(&reg, BCN_TIME_CFG_BEACON_GEN, 0);
5726        rt2x00_set_field32(&reg, BCN_TIME_CFG_TX_TIME_COMPENSATE, 0);
5727        rt2800_register_write(rt2x00dev, BCN_TIME_CFG, reg);
5728
5729        rt2800_config_filter(rt2x00dev, FIF_ALLMULTI);
5730
5731        reg = rt2800_register_read(rt2x00dev, BKOFF_SLOT_CFG);
5732        rt2x00_set_field32(&reg, BKOFF_SLOT_CFG_SLOT_TIME, 9);
5733        rt2x00_set_field32(&reg, BKOFF_SLOT_CFG_CC_DELAY_TIME, 2);
5734        rt2800_register_write(rt2x00dev, BKOFF_SLOT_CFG, reg);
5735
5736        if (rt2x00_rt(rt2x00dev, RT3290)) {
5737                reg = rt2800_register_read(rt2x00dev, WLAN_FUN_CTRL);
5738                if (rt2x00_get_field32(reg, WLAN_EN) == 1) {
5739                        rt2x00_set_field32(&reg, PCIE_APP0_CLK_REQ, 1);
5740                        rt2800_register_write(rt2x00dev, WLAN_FUN_CTRL, reg);
5741                }
5742
5743                reg = rt2800_register_read(rt2x00dev, CMB_CTRL);
5744                if (!(rt2x00_get_field32(reg, LDO0_EN) == 1)) {
5745                        rt2x00_set_field32(&reg, LDO0_EN, 1);
5746                        rt2x00_set_field32(&reg, LDO_BGSEL, 3);
5747                        rt2800_register_write(rt2x00dev, CMB_CTRL, reg);
5748                }
5749
5750                reg = rt2800_register_read(rt2x00dev, OSC_CTRL);
5751                rt2x00_set_field32(&reg, OSC_ROSC_EN, 1);
5752                rt2x00_set_field32(&reg, OSC_CAL_REQ, 1);
5753                rt2x00_set_field32(&reg, OSC_REF_CYCLE, 0x27);
5754                rt2800_register_write(rt2x00dev, OSC_CTRL, reg);
5755
5756                reg = rt2800_register_read(rt2x00dev, COEX_CFG0);
5757                rt2x00_set_field32(&reg, COEX_CFG_ANT, 0x5e);
5758                rt2800_register_write(rt2x00dev, COEX_CFG0, reg);
5759
5760                reg = rt2800_register_read(rt2x00dev, COEX_CFG2);
5761                rt2x00_set_field32(&reg, BT_COEX_CFG1, 0x00);
5762                rt2x00_set_field32(&reg, BT_COEX_CFG0, 0x17);
5763                rt2x00_set_field32(&reg, WL_COEX_CFG1, 0x93);
5764                rt2x00_set_field32(&reg, WL_COEX_CFG0, 0x7f);
5765                rt2800_register_write(rt2x00dev, COEX_CFG2, reg);
5766
5767                reg = rt2800_register_read(rt2x00dev, PLL_CTRL);
5768                rt2x00_set_field32(&reg, PLL_CONTROL, 1);
5769                rt2800_register_write(rt2x00dev, PLL_CTRL, reg);
5770        }
5771
5772        if (rt2x00_rt(rt2x00dev, RT3071) ||
5773            rt2x00_rt(rt2x00dev, RT3090) ||
5774            rt2x00_rt(rt2x00dev, RT3290) ||
5775            rt2x00_rt(rt2x00dev, RT3390)) {
5776
5777                if (rt2x00_rt(rt2x00dev, RT3290))
5778                        rt2800_register_write(rt2x00dev, TX_SW_CFG0,
5779                                              0x00000404);
5780                else
5781                        rt2800_register_write(rt2x00dev, TX_SW_CFG0,
5782                                              0x00000400);
5783
5784                rt2800_register_write(rt2x00dev, TX_SW_CFG1, 0x00000000);
5785                if (rt2x00_rt_rev_lt(rt2x00dev, RT3071, REV_RT3071E) ||
5786                    rt2x00_rt_rev_lt(rt2x00dev, RT3090, REV_RT3090E) ||
5787                    rt2x00_rt_rev_lt(rt2x00dev, RT3390, REV_RT3390E)) {
5788                        eeprom = rt2800_eeprom_read(rt2x00dev, EEPROM_NIC_CONF1);
5789                        if (rt2x00_get_field16(eeprom, EEPROM_NIC_CONF1_DAC_TEST))
5790                                rt2800_register_write(rt2x00dev, TX_SW_CFG2,
5791                                                      0x0000002c);
5792                        else
5793                                rt2800_register_write(rt2x00dev, TX_SW_CFG2,
5794                                                      0x0000000f);
5795                } else {
5796                        rt2800_register_write(rt2x00dev, TX_SW_CFG2, 0x00000000);
5797                }
5798        } else if (rt2x00_rt(rt2x00dev, RT3070)) {
5799                rt2800_register_write(rt2x00dev, TX_SW_CFG0, 0x00000400);
5800
5801                if (rt2x00_rt_rev_lt(rt2x00dev, RT3070, REV_RT3070F)) {
5802                        rt2800_register_write(rt2x00dev, TX_SW_CFG1, 0x00000000);
5803                        rt2800_register_write(rt2x00dev, TX_SW_CFG2, 0x0000002c);
5804                } else {
5805                        rt2800_register_write(rt2x00dev, TX_SW_CFG1, 0x00080606);
5806                        rt2800_register_write(rt2x00dev, TX_SW_CFG2, 0x00000000);
5807                }
5808        } else if (rt2800_is_305x_soc(rt2x00dev)) {
5809                rt2800_register_write(rt2x00dev, TX_SW_CFG0, 0x00000400);
5810                rt2800_register_write(rt2x00dev, TX_SW_CFG1, 0x00000000);
5811                rt2800_register_write(rt2x00dev, TX_SW_CFG2, 0x00000030);
5812        } else if (rt2x00_rt(rt2x00dev, RT3352)) {
5813                rt2800_register_write(rt2x00dev, TX_SW_CFG0, 0x00000402);
5814                rt2800_register_write(rt2x00dev, TX_SW_CFG1, 0x00080606);
5815                rt2800_register_write(rt2x00dev, TX_SW_CFG2, 0x00000000);
5816        } else if (rt2x00_rt(rt2x00dev, RT3572)) {
5817                rt2800_register_write(rt2x00dev, TX_SW_CFG0, 0x00000400);
5818                rt2800_register_write(rt2x00dev, TX_SW_CFG1, 0x00080606);
5819        } else if (rt2x00_rt(rt2x00dev, RT3593)) {
5820                rt2800_register_write(rt2x00dev, TX_SW_CFG0, 0x00000402);
5821                rt2800_register_write(rt2x00dev, TX_SW_CFG1, 0x00000000);
5822                if (rt2x00_rt_rev_lt(rt2x00dev, RT3593, REV_RT3593E)) {
5823                        eeprom = rt2800_eeprom_read(rt2x00dev, EEPROM_NIC_CONF1);
5824                        if (rt2x00_get_field16(eeprom,
5825                                               EEPROM_NIC_CONF1_DAC_TEST))
5826                                rt2800_register_write(rt2x00dev, TX_SW_CFG2,
5827                                                      0x0000001f);
5828                        else
5829                                rt2800_register_write(rt2x00dev, TX_SW_CFG2,
5830                                                      0x0000000f);
5831                } else {
5832                        rt2800_register_write(rt2x00dev, TX_SW_CFG2,
5833                                              0x00000000);
5834                }
5835        } else if (rt2x00_rt(rt2x00dev, RT3883)) {
5836                rt2800_register_write(rt2x00dev, TX_SW_CFG0, 0x00000402);
5837                rt2800_register_write(rt2x00dev, TX_SW_CFG1, 0x00000000);
5838                rt2800_register_write(rt2x00dev, TX_SW_CFG2, 0x00040000);
5839                rt2800_register_write(rt2x00dev, TX_TXBF_CFG_0, 0x8000fc21);
5840                rt2800_register_write(rt2x00dev, TX_TXBF_CFG_3, 0x00009c40);
5841        } else if (rt2x00_rt(rt2x00dev, RT5390) ||
5842                   rt2x00_rt(rt2x00dev, RT5392) ||
5843                   rt2x00_rt(rt2x00dev, RT6352)) {
5844                rt2800_register_write(rt2x00dev, TX_SW_CFG0, 0x00000404);
5845                rt2800_register_write(rt2x00dev, TX_SW_CFG1, 0x00080606);
5846                rt2800_register_write(rt2x00dev, TX_SW_CFG2, 0x00000000);
5847        } else if (rt2x00_rt(rt2x00dev, RT5592)) {
5848                rt2800_register_write(rt2x00dev, TX_SW_CFG0, 0x00000404);
5849                rt2800_register_write(rt2x00dev, TX_SW_CFG1, 0x00000000);
5850                rt2800_register_write(rt2x00dev, TX_SW_CFG2, 0x00000000);
5851        } else if (rt2x00_rt(rt2x00dev, RT5350)) {
5852                rt2800_register_write(rt2x00dev, TX_SW_CFG0, 0x00000404);
5853        } else if (rt2x00_rt(rt2x00dev, RT6352)) {
5854                rt2800_register_write(rt2x00dev, TX_SW_CFG0, 0x00000401);
5855                rt2800_register_write(rt2x00dev, TX_SW_CFG1, 0x000C0000);
5856                rt2800_register_write(rt2x00dev, TX_SW_CFG2, 0x00000000);
5857                rt2800_register_write(rt2x00dev, MIMO_PS_CFG, 0x00000002);
5858                rt2800_register_write(rt2x00dev, TX_PIN_CFG, 0x00150F0F);
5859                rt2800_register_write(rt2x00dev, TX_ALC_VGA3, 0x00000000);
5860                rt2800_register_write(rt2x00dev, TX0_BB_GAIN_ATTEN, 0x0);
5861                rt2800_register_write(rt2x00dev, TX1_BB_GAIN_ATTEN, 0x0);
5862                rt2800_register_write(rt2x00dev, TX0_RF_GAIN_ATTEN, 0x6C6C666C);
5863                rt2800_register_write(rt2x00dev, TX1_RF_GAIN_ATTEN, 0x6C6C666C);
5864                rt2800_register_write(rt2x00dev, TX0_RF_GAIN_CORRECT,
5865                                      0x3630363A);
5866                rt2800_register_write(rt2x00dev, TX1_RF_GAIN_CORRECT,
5867                                      0x3630363A);
5868                reg = rt2800_register_read(rt2x00dev, TX_ALC_CFG_1);
5869                rt2x00_set_field32(&reg, TX_ALC_CFG_1_ROS_BUSY_EN, 0);
5870                rt2800_register_write(rt2x00dev, TX_ALC_CFG_1, reg);
5871        } else {
5872                rt2800_register_write(rt2x00dev, TX_SW_CFG0, 0x00000000);
5873                rt2800_register_write(rt2x00dev, TX_SW_CFG1, 0x00080606);
5874        }
5875
5876        reg = rt2800_register_read(rt2x00dev, TX_LINK_CFG);
5877        rt2x00_set_field32(&reg, TX_LINK_CFG_REMOTE_MFB_LIFETIME, 32);
5878        rt2x00_set_field32(&reg, TX_LINK_CFG_MFB_ENABLE, 0);
5879        rt2x00_set_field32(&reg, TX_LINK_CFG_REMOTE_UMFS_ENABLE, 0);
5880        rt2x00_set_field32(&reg, TX_LINK_CFG_TX_MRQ_EN, 0);
5881        rt2x00_set_field32(&reg, TX_LINK_CFG_TX_RDG_EN, 0);
5882        rt2x00_set_field32(&reg, TX_LINK_CFG_TX_CF_ACK_EN, 1);
5883        rt2x00_set_field32(&reg, TX_LINK_CFG_REMOTE_MFB, 0);
5884        rt2x00_set_field32(&reg, TX_LINK_CFG_REMOTE_MFS, 0);
5885        rt2800_register_write(rt2x00dev, TX_LINK_CFG, reg);
5886
5887        reg = rt2800_register_read(rt2x00dev, TX_TIMEOUT_CFG);
5888        rt2x00_set_field32(&reg, TX_TIMEOUT_CFG_MPDU_LIFETIME, 9);
5889        rt2x00_set_field32(&reg, TX_TIMEOUT_CFG_RX_ACK_TIMEOUT, 32);
5890        rt2x00_set_field32(&reg, TX_TIMEOUT_CFG_TX_OP_TIMEOUT, 10);
5891        rt2800_register_write(rt2x00dev, TX_TIMEOUT_CFG, reg);
5892
5893        reg = rt2800_register_read(rt2x00dev, MAX_LEN_CFG);
5894        rt2x00_set_field32(&reg, MAX_LEN_CFG_MAX_MPDU, AGGREGATION_SIZE);
5895        if (rt2x00_is_usb(rt2x00dev)) {
5896                drv_data->max_psdu = 3;
5897        } else if (rt2x00_rt_rev_gte(rt2x00dev, RT2872, REV_RT2872E) ||
5898                   rt2x00_rt(rt2x00dev, RT2883) ||
5899                   rt2x00_rt_rev_lt(rt2x00dev, RT3070, REV_RT3070E)) {
5900                drv_data->max_psdu = 2;
5901        } else {
5902                drv_data->max_psdu = 1;
5903        }
5904        rt2x00_set_field32(&reg, MAX_LEN_CFG_MAX_PSDU, drv_data->max_psdu);
5905        rt2x00_set_field32(&reg, MAX_LEN_CFG_MIN_PSDU, 10);
5906        rt2x00_set_field32(&reg, MAX_LEN_CFG_MIN_MPDU, 10);
5907        rt2800_register_write(rt2x00dev, MAX_LEN_CFG, reg);
5908
5909        reg = rt2800_register_read(rt2x00dev, LED_CFG);
5910        rt2x00_set_field32(&reg, LED_CFG_ON_PERIOD, 70);
5911        rt2x00_set_field32(&reg, LED_CFG_OFF_PERIOD, 30);
5912        rt2x00_set_field32(&reg, LED_CFG_SLOW_BLINK_PERIOD, 3);
5913        rt2x00_set_field32(&reg, LED_CFG_R_LED_MODE, 3);
5914        rt2x00_set_field32(&reg, LED_CFG_G_LED_MODE, 3);
5915        rt2x00_set_field32(&reg, LED_CFG_Y_LED_MODE, 3);
5916        rt2x00_set_field32(&reg, LED_CFG_LED_POLAR, 1);
5917        rt2800_register_write(rt2x00dev, LED_CFG, reg);
5918
5919        rt2800_register_write(rt2x00dev, PBF_MAX_PCNT, 0x1f3fbf9f);
5920
5921        reg = rt2800_register_read(rt2x00dev, TX_RTY_CFG);
5922        rt2x00_set_field32(&reg, TX_RTY_CFG_SHORT_RTY_LIMIT, 2);
5923        rt2x00_set_field32(&reg, TX_RTY_CFG_LONG_RTY_LIMIT, 2);
5924        rt2x00_set_field32(&reg, TX_RTY_CFG_LONG_RTY_THRE, 2000);
5925        rt2x00_set_field32(&reg, TX_RTY_CFG_NON_AGG_RTY_MODE, 0);
5926        rt2x00_set_field32(&reg, TX_RTY_CFG_AGG_RTY_MODE, 0);
5927        rt2x00_set_field32(&reg, TX_RTY_CFG_TX_AUTO_FB_ENABLE, 1);
5928        rt2800_register_write(rt2x00dev, TX_RTY_CFG, reg);
5929
5930        reg = rt2800_register_read(rt2x00dev, AUTO_RSP_CFG);
5931        rt2x00_set_field32(&reg, AUTO_RSP_CFG_AUTORESPONDER, 1);
5932        rt2x00_set_field32(&reg, AUTO_RSP_CFG_BAC_ACK_POLICY, 1);
5933        rt2x00_set_field32(&reg, AUTO_RSP_CFG_CTS_40_MMODE, 1);
5934        rt2x00_set_field32(&reg, AUTO_RSP_CFG_CTS_40_MREF, 0);
5935        rt2x00_set_field32(&reg, AUTO_RSP_CFG_AR_PREAMBLE, 0);
5936        rt2x00_set_field32(&reg, AUTO_RSP_CFG_DUAL_CTS_EN, 0);
5937        rt2x00_set_field32(&reg, AUTO_RSP_CFG_ACK_CTS_PSM_BIT, 0);
5938        rt2800_register_write(rt2x00dev, AUTO_RSP_CFG, reg);
5939
5940        reg = rt2800_register_read(rt2x00dev, CCK_PROT_CFG);
5941        rt2x00_set_field32(&reg, CCK_PROT_CFG_PROTECT_RATE, 3);
5942        rt2x00_set_field32(&reg, CCK_PROT_CFG_PROTECT_CTRL, 0);
5943        rt2x00_set_field32(&reg, CCK_PROT_CFG_PROTECT_NAV_SHORT, 1);
5944        rt2x00_set_field32(&reg, CCK_PROT_CFG_TX_OP_ALLOW_CCK, 1);
5945        rt2x00_set_field32(&reg, CCK_PROT_CFG_TX_OP_ALLOW_OFDM, 1);
5946        rt2x00_set_field32(&reg, CCK_PROT_CFG_TX_OP_ALLOW_MM20, 1);
5947        rt2x00_set_field32(&reg, CCK_PROT_CFG_TX_OP_ALLOW_MM40, 0);
5948        rt2x00_set_field32(&reg, CCK_PROT_CFG_TX_OP_ALLOW_GF20, 1);
5949        rt2x00_set_field32(&reg, CCK_PROT_CFG_TX_OP_ALLOW_GF40, 0);
5950        rt2x00_set_field32(&reg, CCK_PROT_CFG_RTS_TH_EN, 1);
5951        rt2800_register_write(rt2x00dev, CCK_PROT_CFG, reg);
5952
5953        reg = rt2800_register_read(rt2x00dev, OFDM_PROT_CFG);
5954        rt2x00_set_field32(&reg, OFDM_PROT_CFG_PROTECT_RATE, 3);
5955        rt2x00_set_field32(&reg, OFDM_PROT_CFG_PROTECT_CTRL, 0);
5956        rt2x00_set_field32(&reg, OFDM_PROT_CFG_PROTECT_NAV_SHORT, 1);
5957        rt2x00_set_field32(&reg, OFDM_PROT_CFG_TX_OP_ALLOW_CCK, 1);
5958        rt2x00_set_field32(&reg, OFDM_PROT_CFG_TX_OP_ALLOW_OFDM, 1);
5959        rt2x00_set_field32(&reg, OFDM_PROT_CFG_TX_OP_ALLOW_MM20, 1);
5960        rt2x00_set_field32(&reg, OFDM_PROT_CFG_TX_OP_ALLOW_MM40, 0);
5961        rt2x00_set_field32(&reg, OFDM_PROT_CFG_TX_OP_ALLOW_GF20, 1);
5962        rt2x00_set_field32(&reg, OFDM_PROT_CFG_TX_OP_ALLOW_GF40, 0);
5963        rt2x00_set_field32(&reg, OFDM_PROT_CFG_RTS_TH_EN, 1);
5964        rt2800_register_write(rt2x00dev, OFDM_PROT_CFG, reg);
5965
5966        reg = rt2800_register_read(rt2x00dev, MM20_PROT_CFG);
5967        rt2x00_set_field32(&reg, MM20_PROT_CFG_PROTECT_RATE, 0x4004);
5968        rt2x00_set_field32(&reg, MM20_PROT_CFG_PROTECT_CTRL, 1);
5969        rt2x00_set_field32(&reg, MM20_PROT_CFG_PROTECT_NAV_SHORT, 1);
5970        rt2x00_set_field32(&reg, MM20_PROT_CFG_TX_OP_ALLOW_CCK, 0);
5971        rt2x00_set_field32(&reg, MM20_PROT_CFG_TX_OP_ALLOW_OFDM, 1);
5972        rt2x00_set_field32(&reg, MM20_PROT_CFG_TX_OP_ALLOW_MM20, 1);
5973        rt2x00_set_field32(&reg, MM20_PROT_CFG_TX_OP_ALLOW_MM40, 0);
5974        rt2x00_set_field32(&reg, MM20_PROT_CFG_TX_OP_ALLOW_GF20, 1);
5975        rt2x00_set_field32(&reg, MM20_PROT_CFG_TX_OP_ALLOW_GF40, 0);
5976        rt2x00_set_field32(&reg, MM20_PROT_CFG_RTS_TH_EN, 0);
5977        rt2800_register_write(rt2x00dev, MM20_PROT_CFG, reg);
5978
5979        reg = rt2800_register_read(rt2x00dev, MM40_PROT_CFG);
5980        rt2x00_set_field32(&reg, MM40_PROT_CFG_PROTECT_RATE, 0x4084);
5981        rt2x00_set_field32(&reg, MM40_PROT_CFG_PROTECT_CTRL, 1);
5982        rt2x00_set_field32(&reg, MM40_PROT_CFG_PROTECT_NAV_SHORT, 1);
5983        rt2x00_set_field32(&reg, MM40_PROT_CFG_TX_OP_ALLOW_CCK, 0);
5984        rt2x00_set_field32(&reg, MM40_PROT_CFG_TX_OP_ALLOW_OFDM, 1);
5985        rt2x00_set_field32(&reg, MM40_PROT_CFG_TX_OP_ALLOW_MM20, 1);
5986        rt2x00_set_field32(&reg, MM40_PROT_CFG_TX_OP_ALLOW_MM40, 1);
5987        rt2x00_set_field32(&reg, MM40_PROT_CFG_TX_OP_ALLOW_GF20, 1);
5988        rt2x00_set_field32(&reg, MM40_PROT_CFG_TX_OP_ALLOW_GF40, 1);
5989        rt2x00_set_field32(&reg, MM40_PROT_CFG_RTS_TH_EN, 0);
5990        rt2800_register_write(rt2x00dev, MM40_PROT_CFG, reg);
5991
5992        reg = rt2800_register_read(rt2x00dev, GF20_PROT_CFG);
5993        rt2x00_set_field32(&reg, GF20_PROT_CFG_PROTECT_RATE, 0x4004);
5994        rt2x00_set_field32(&reg, GF20_PROT_CFG_PROTECT_CTRL, 1);
5995        rt2x00_set_field32(&reg, GF20_PROT_CFG_PROTECT_NAV_SHORT, 1);
5996        rt2x00_set_field32(&reg, GF20_PROT_CFG_TX_OP_ALLOW_CCK, 0);
5997        rt2x00_set_field32(&reg, GF20_PROT_CFG_TX_OP_ALLOW_OFDM, 1);
5998        rt2x00_set_field32(&reg, GF20_PROT_CFG_TX_OP_ALLOW_MM20, 1);
5999        rt2x00_set_field32(&reg, GF20_PROT_CFG_TX_OP_ALLOW_MM40, 0);
6000        rt2x00_set_field32(&reg, GF20_PROT_CFG_TX_OP_ALLOW_GF20, 1);
6001        rt2x00_set_field32(&reg, GF20_PROT_CFG_TX_OP_ALLOW_GF40, 0);
6002        rt2x00_set_field32(&reg, GF20_PROT_CFG_RTS_TH_EN, 0);
6003        rt2800_register_write(rt2x00dev, GF20_PROT_CFG, reg);
6004
6005        reg = rt2800_register_read(rt2x00dev, GF40_PROT_CFG);
6006        rt2x00_set_field32(&reg, GF40_PROT_CFG_PROTECT_RATE, 0x4084);
6007        rt2x00_set_field32(&reg, GF40_PROT_CFG_PROTECT_CTRL, 1);
6008        rt2x00_set_field32(&reg, GF40_PROT_CFG_PROTECT_NAV_SHORT, 1);
6009        rt2x00_set_field32(&reg, GF40_PROT_CFG_TX_OP_ALLOW_CCK, 0);
6010        rt2x00_set_field32(&reg, GF40_PROT_CFG_TX_OP_ALLOW_OFDM, 1);
6011        rt2x00_set_field32(&reg, GF40_PROT_CFG_TX_OP_ALLOW_MM20, 1);
6012        rt2x00_set_field32(&reg, GF40_PROT_CFG_TX_OP_ALLOW_MM40, 1);
6013        rt2x00_set_field32(&reg, GF40_PROT_CFG_TX_OP_ALLOW_GF20, 1);
6014        rt2x00_set_field32(&reg, GF40_PROT_CFG_TX_OP_ALLOW_GF40, 1);
6015        rt2x00_set_field32(&reg, GF40_PROT_CFG_RTS_TH_EN, 0);
6016        rt2800_register_write(rt2x00dev, GF40_PROT_CFG, reg);
6017
6018        if (rt2x00_is_usb(rt2x00dev)) {
6019                rt2800_register_write(rt2x00dev, PBF_CFG, 0xf40006);
6020
6021                reg = rt2800_register_read(rt2x00dev, WPDMA_GLO_CFG);
6022                rt2x00_set_field32(&reg, WPDMA_GLO_CFG_ENABLE_TX_DMA, 0);
6023                rt2x00_set_field32(&reg, WPDMA_GLO_CFG_TX_DMA_BUSY, 0);
6024                rt2x00_set_field32(&reg, WPDMA_GLO_CFG_ENABLE_RX_DMA, 0);
6025                rt2x00_set_field32(&reg, WPDMA_GLO_CFG_RX_DMA_BUSY, 0);
6026                rt2x00_set_field32(&reg, WPDMA_GLO_CFG_WP_DMA_BURST_SIZE, 3);
6027                rt2x00_set_field32(&reg, WPDMA_GLO_CFG_TX_WRITEBACK_DONE, 0);
6028                rt2x00_set_field32(&reg, WPDMA_GLO_CFG_BIG_ENDIAN, 0);
6029                rt2x00_set_field32(&reg, WPDMA_GLO_CFG_RX_HDR_SCATTER, 0);
6030                rt2x00_set_field32(&reg, WPDMA_GLO_CFG_HDR_SEG_LEN, 0);
6031                rt2800_register_write(rt2x00dev, WPDMA_GLO_CFG, reg);
6032        }
6033
6034        /*
6035         * The legacy driver also sets TXOP_CTRL_CFG_RESERVED_TRUN_EN to 1
6036         * although it is reserved.
6037         */
6038        reg = rt2800_register_read(rt2x00dev, TXOP_CTRL_CFG);
6039        rt2x00_set_field32(&reg, TXOP_CTRL_CFG_TIMEOUT_TRUN_EN, 1);
6040        rt2x00_set_field32(&reg, TXOP_CTRL_CFG_AC_TRUN_EN, 1);
6041        rt2x00_set_field32(&reg, TXOP_CTRL_CFG_TXRATEGRP_TRUN_EN, 1);
6042        rt2x00_set_field32(&reg, TXOP_CTRL_CFG_USER_MODE_TRUN_EN, 1);
6043        rt2x00_set_field32(&reg, TXOP_CTRL_CFG_MIMO_PS_TRUN_EN, 1);
6044        rt2x00_set_field32(&reg, TXOP_CTRL_CFG_RESERVED_TRUN_EN, 1);
6045        rt2x00_set_field32(&reg, TXOP_CTRL_CFG_LSIG_TXOP_EN, 0);
6046        rt2x00_set_field32(&reg, TXOP_CTRL_CFG_EXT_CCA_EN, 0);
6047        rt2x00_set_field32(&reg, TXOP_CTRL_CFG_EXT_CCA_DLY, 88);
6048        rt2x00_set_field32(&reg, TXOP_CTRL_CFG_EXT_CWMIN, 0);
6049        rt2800_register_write(rt2x00dev, TXOP_CTRL_CFG, reg);
6050
6051        reg = rt2x00_rt(rt2x00dev, RT5592) ? 0x00000082 : 0x00000002;
6052        rt2800_register_write(rt2x00dev, TXOP_HLDR_ET, reg);
6053
6054        if (rt2x00_rt(rt2x00dev, RT3883)) {
6055                rt2800_register_write(rt2x00dev, TX_FBK_CFG_3S_0, 0x12111008);
6056                rt2800_register_write(rt2x00dev, TX_FBK_CFG_3S_1, 0x16151413);
6057        }
6058
6059        reg = rt2800_register_read(rt2x00dev, TX_RTS_CFG);
6060        rt2x00_set_field32(&reg, TX_RTS_CFG_AUTO_RTS_RETRY_LIMIT, 7);
6061        rt2x00_set_field32(&reg, TX_RTS_CFG_RTS_THRES,
6062                           IEEE80211_MAX_RTS_THRESHOLD);
6063        rt2x00_set_field32(&reg, TX_RTS_CFG_RTS_FBK_EN, 1);
6064        rt2800_register_write(rt2x00dev, TX_RTS_CFG, reg);
6065
6066        rt2800_register_write(rt2x00dev, EXP_ACK_TIME, 0x002400ca);
6067
6068        /*
6069         * Usually the CCK SIFS time should be set to 10 and the OFDM SIFS
6070         * time should be set to 16. However, the original Ralink driver uses
6071         * 16 for both and indeed using a value of 10 for CCK SIFS results in
6072         * connection problems with 11g + CTS protection. Hence, use the same
6073         * defaults as the Ralink driver: 16 for both, CCK and OFDM SIFS.
6074         */
6075        reg = rt2800_register_read(rt2x00dev, XIFS_TIME_CFG);
6076        rt2x00_set_field32(&reg, XIFS_TIME_CFG_CCKM_SIFS_TIME, 16);
6077        rt2x00_set_field32(&reg, XIFS_TIME_CFG_OFDM_SIFS_TIME, 16);
6078        rt2x00_set_field32(&reg, XIFS_TIME_CFG_OFDM_XIFS_TIME, 4);
6079        rt2x00_set_field32(&reg, XIFS_TIME_CFG_EIFS, 314);
6080        rt2x00_set_field32(&reg, XIFS_TIME_CFG_BB_RXEND_ENABLE, 1);
6081        rt2800_register_write(rt2x00dev, XIFS_TIME_CFG, reg);
6082
6083        rt2800_register_write(rt2x00dev, PWR_PIN_CFG, 0x00000003);
6084
6085        /*
6086         * ASIC will keep garbage value after boot, clear encryption keys.
6087         */
6088        for (i = 0; i < 4; i++)
6089                rt2800_register_write(rt2x00dev, SHARED_KEY_MODE_ENTRY(i), 0);
6090
6091        for (i = 0; i < 256; i++) {
6092                rt2800_config_wcid(rt2x00dev, NULL, i);
6093                rt2800_delete_wcid_attr(rt2x00dev, i);
6094        }
6095
6096        /*
6097         * Clear encryption initialization vectors on start, but keep them
6098         * for watchdog reset. Otherwise we will have wrong IVs and not be
6099         * able to keep connections after reset.
6100         */
6101        if (!test_bit(DEVICE_STATE_RESET, &rt2x00dev->flags))
6102                for (i = 0; i < 256; i++)
6103                        rt2800_register_write(rt2x00dev, MAC_IVEIV_ENTRY(i), 0);
6104
6105        /*
6106         * Clear all beacons
6107         */
6108        for (i = 0; i < 8; i++)
6109                rt2800_clear_beacon_register(rt2x00dev, i);
6110
6111        if (rt2x00_is_usb(rt2x00dev)) {
6112                reg = rt2800_register_read(rt2x00dev, US_CYC_CNT);
6113                rt2x00_set_field32(&reg, US_CYC_CNT_CLOCK_CYCLE, 30);
6114                rt2800_register_write(rt2x00dev, US_CYC_CNT, reg);
6115        } else if (rt2x00_is_pcie(rt2x00dev)) {
6116                reg = rt2800_register_read(rt2x00dev, US_CYC_CNT);
6117                rt2x00_set_field32(&reg, US_CYC_CNT_CLOCK_CYCLE, 125);
6118                rt2800_register_write(rt2x00dev, US_CYC_CNT, reg);
6119        }
6120
6121        reg = rt2800_register_read(rt2x00dev, HT_FBK_CFG0);
6122        rt2x00_set_field32(&reg, HT_FBK_CFG0_HTMCS0FBK, 0);
6123        rt2x00_set_field32(&reg, HT_FBK_CFG0_HTMCS1FBK, 0);
6124        rt2x00_set_field32(&reg, HT_FBK_CFG0_HTMCS2FBK, 1);
6125        rt2x00_set_field32(&reg, HT_FBK_CFG0_HTMCS3FBK, 2);
6126        rt2x00_set_field32(&reg, HT_FBK_CFG0_HTMCS4FBK, 3);
6127        rt2x00_set_field32(&reg, HT_FBK_CFG0_HTMCS5FBK, 4);
6128        rt2x00_set_field32(&reg, HT_FBK_CFG0_HTMCS6FBK, 5);
6129        rt2x00_set_field32(&reg, HT_FBK_CFG0_HTMCS7FBK, 6);
6130        rt2800_register_write(rt2x00dev, HT_FBK_CFG0, reg);
6131
6132        reg = rt2800_register_read(rt2x00dev, HT_FBK_CFG1);
6133        rt2x00_set_field32(&reg, HT_FBK_CFG1_HTMCS8FBK, 8);
6134        rt2x00_set_field32(&reg, HT_FBK_CFG1_HTMCS9FBK, 8);
6135        rt2x00_set_field32(&reg, HT_FBK_CFG1_HTMCS10FBK, 9);
6136        rt2x00_set_field32(&reg, HT_FBK_CFG1_HTMCS11FBK, 10);
6137        rt2x00_set_field32(&reg, HT_FBK_CFG1_HTMCS12FBK, 11);
6138        rt2x00_set_field32(&reg, HT_FBK_CFG1_HTMCS13FBK, 12);
6139        rt2x00_set_field32(&reg, HT_FBK_CFG1_HTMCS14FBK, 13);
6140        rt2x00_set_field32(&reg, HT_FBK_CFG1_HTMCS15FBK, 14);
6141        rt2800_register_write(rt2x00dev, HT_FBK_CFG1, reg);
6142
6143        reg = rt2800_register_read(rt2x00dev, LG_FBK_CFG0);
6144        rt2x00_set_field32(&reg, LG_FBK_CFG0_OFDMMCS0FBK, 8);
6145        rt2x00_set_field32(&reg, LG_FBK_CFG0_OFDMMCS1FBK, 8);
6146        rt2x00_set_field32(&reg, LG_FBK_CFG0_OFDMMCS2FBK, 9);
6147        rt2x00_set_field32(&reg, LG_FBK_CFG0_OFDMMCS3FBK, 10);
6148        rt2x00_set_field32(&reg, LG_FBK_CFG0_OFDMMCS4FBK, 11);
6149        rt2x00_set_field32(&reg, LG_FBK_CFG0_OFDMMCS5FBK, 12);
6150        rt2x00_set_field32(&reg, LG_FBK_CFG0_OFDMMCS6FBK, 13);
6151        rt2x00_set_field32(&reg, LG_FBK_CFG0_OFDMMCS7FBK, 14);
6152        rt2800_register_write(rt2x00dev, LG_FBK_CFG0, reg);
6153
6154        reg = rt2800_register_read(rt2x00dev, LG_FBK_CFG1);
6155        rt2x00_set_field32(&reg, LG_FBK_CFG0_CCKMCS0FBK, 0);
6156        rt2x00_set_field32(&reg, LG_FBK_CFG0_CCKMCS1FBK, 0);
6157        rt2x00_set_field32(&reg, LG_FBK_CFG0_CCKMCS2FBK, 1);
6158        rt2x00_set_field32(&reg, LG_FBK_CFG0_CCKMCS3FBK, 2);
6159        rt2800_register_write(rt2x00dev, LG_FBK_CFG1, reg);
6160
6161        /*
6162         * Do not force the BA window size, we use the TXWI to set it
6163         */
6164        reg = rt2800_register_read(rt2x00dev, AMPDU_BA_WINSIZE);
6165        rt2x00_set_field32(&reg, AMPDU_BA_WINSIZE_FORCE_WINSIZE_ENABLE, 0);
6166        rt2x00_set_field32(&reg, AMPDU_BA_WINSIZE_FORCE_WINSIZE, 0);
6167        rt2800_register_write(rt2x00dev, AMPDU_BA_WINSIZE, reg);
6168
6169        /*
6170         * We must clear the error counters.
6171         * These registers are cleared on read,
6172         * so we may pass a useless variable to store the value.
6173         */
6174        reg = rt2800_register_read(rt2x00dev, RX_STA_CNT0);
6175        reg = rt2800_register_read(rt2x00dev, RX_STA_CNT1);
6176        reg = rt2800_register_read(rt2x00dev, RX_STA_CNT2);
6177        reg = rt2800_register_read(rt2x00dev, TX_STA_CNT0);
6178        reg = rt2800_register_read(rt2x00dev, TX_STA_CNT1);
6179        reg = rt2800_register_read(rt2x00dev, TX_STA_CNT2);
6180
6181        /*
6182         * Setup leadtime for pre tbtt interrupt to 6ms
6183         */
6184        reg = rt2800_register_read(rt2x00dev, INT_TIMER_CFG);
6185        rt2x00_set_field32(&reg, INT_TIMER_CFG_PRE_TBTT_TIMER, 6 << 4);
6186        rt2800_register_write(rt2x00dev, INT_TIMER_CFG, reg);
6187
6188        /*
6189         * Set up channel statistics timer
6190         */
6191        reg = rt2800_register_read(rt2x00dev, CH_TIME_CFG);
6192        rt2x00_set_field32(&reg, CH_TIME_CFG_EIFS_BUSY, 1);
6193        rt2x00_set_field32(&reg, CH_TIME_CFG_NAV_BUSY, 1);
6194        rt2x00_set_field32(&reg, CH_TIME_CFG_RX_BUSY, 1);
6195        rt2x00_set_field32(&reg, CH_TIME_CFG_TX_BUSY, 1);
6196        rt2x00_set_field32(&reg, CH_TIME_CFG_TMR_EN, 1);
6197        rt2800_register_write(rt2x00dev, CH_TIME_CFG, reg);
6198
6199        return 0;
6200}
6201
6202static int rt2800_wait_bbp_rf_ready(struct rt2x00_dev *rt2x00dev)
6203{
6204        unsigned int i;
6205        u32 reg;
6206
6207        for (i = 0; i < REGISTER_BUSY_COUNT; i++) {
6208                reg = rt2800_register_read(rt2x00dev, MAC_STATUS_CFG);
6209                if (!rt2x00_get_field32(reg, MAC_STATUS_CFG_BBP_RF_BUSY))
6210                        return 0;
6211
6212                udelay(REGISTER_BUSY_DELAY);
6213        }
6214
6215        rt2x00_err(rt2x00dev, "BBP/RF register access failed, aborting\n");
6216        return -EACCES;
6217}
6218
6219static int rt2800_wait_bbp_ready(struct rt2x00_dev *rt2x00dev)
6220{
6221        unsigned int i;
6222        u8 value;
6223
6224        /*
6225         * BBP was enabled after firmware was loaded,
6226         * but we need to reactivate it now.
6227         */
6228        rt2800_register_write(rt2x00dev, H2M_BBP_AGENT, 0);
6229        rt2800_register_write(rt2x00dev, H2M_MAILBOX_CSR, 0);
6230        msleep(1);
6231
6232        for (i = 0; i < REGISTER_BUSY_COUNT; i++) {
6233                value = rt2800_bbp_read(rt2x00dev, 0);
6234                if ((value != 0xff) && (value != 0x00))
6235                        return 0;
6236                udelay(REGISTER_BUSY_DELAY);
6237        }
6238
6239        rt2x00_err(rt2x00dev, "BBP register access failed, aborting\n");
6240        return -EACCES;
6241}
6242
6243static void rt2800_bbp4_mac_if_ctrl(struct rt2x00_dev *rt2x00dev)
6244{
6245        u8 value;
6246
6247        value = rt2800_bbp_read(rt2x00dev, 4);
6248        rt2x00_set_field8(&value, BBP4_MAC_IF_CTRL, 1);
6249        rt2800_bbp_write(rt2x00dev, 4, value);
6250}
6251
6252static void rt2800_init_freq_calibration(struct rt2x00_dev *rt2x00dev)
6253{
6254        rt2800_bbp_write(rt2x00dev, 142, 1);
6255        rt2800_bbp_write(rt2x00dev, 143, 57);
6256}
6257
6258static void rt2800_init_bbp_5592_glrt(struct rt2x00_dev *rt2x00dev)
6259{
6260        static const u8 glrt_table[] = {
6261                0xE0, 0x1F, 0X38, 0x32, 0x08, 0x28, 0x19, 0x0A, 0xFF, 0x00, /* 128 ~ 137 */
6262                0x16, 0x10, 0x10, 0x0B, 0x36, 0x2C, 0x26, 0x24, 0x42, 0x36, /* 138 ~ 147 */
6263                0x30, 0x2D, 0x4C, 0x46, 0x3D, 0x40, 0x3E, 0x42, 0x3D, 0x40, /* 148 ~ 157 */
6264                0X3C, 0x34, 0x2C, 0x2F, 0x3C, 0x35, 0x2E, 0x2A, 0x49, 0x41, /* 158 ~ 167 */
6265                0x36, 0x31, 0x30, 0x30, 0x0E, 0x0D, 0x28, 0x21, 0x1C, 0x16, /* 168 ~ 177 */
6266                0x50, 0x4A, 0x43, 0x40, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, /* 178 ~ 187 */
6267                0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 188 ~ 197 */
6268                0x00, 0x00, 0x7D, 0x14, 0x32, 0x2C, 0x36, 0x4C, 0x43, 0x2C, /* 198 ~ 207 */
6269                0x2E, 0x36, 0x30, 0x6E,                                     /* 208 ~ 211 */
6270        };
6271        int i;
6272
6273        for (i = 0; i < ARRAY_SIZE(glrt_table); i++) {
6274                rt2800_bbp_write(rt2x00dev, 195, 128 + i);
6275                rt2800_bbp_write(rt2x00dev, 196, glrt_table[i]);
6276        }
6277};
6278
6279static void rt2800_init_bbp_early(struct rt2x00_dev *rt2x00dev)
6280{
6281        rt2800_bbp_write(rt2x00dev, 65, 0x2C);
6282        rt2800_bbp_write(rt2x00dev, 66, 0x38);
6283        rt2800_bbp_write(rt2x00dev, 68, 0x0B);
6284        rt2800_bbp_write(rt2x00dev, 69, 0x12);
6285        rt2800_bbp_write(rt2x00dev, 70, 0x0a);
6286        rt2800_bbp_write(rt2x00dev, 73, 0x10);
6287        rt2800_bbp_write(rt2x00dev, 81, 0x37);
6288        rt2800_bbp_write(rt2x00dev, 82, 0x62);
6289        rt2800_bbp_write(rt2x00dev, 83, 0x6A);
6290        rt2800_bbp_write(rt2x00dev, 84, 0x99);
6291        rt2800_bbp_write(rt2x00dev, 86, 0x00);
6292        rt2800_bbp_write(rt2x00dev, 91, 0x04);
6293        rt2800_bbp_write(rt2x00dev, 92, 0x00);
6294        rt2800_bbp_write(rt2x00dev, 103, 0x00);
6295        rt2800_bbp_write(rt2x00dev, 105, 0x05);
6296        rt2800_bbp_write(rt2x00dev, 106, 0x35);
6297}
6298
6299static void rt2800_disable_unused_dac_adc(struct rt2x00_dev *rt2x00dev)
6300{
6301        u16 eeprom;
6302        u8 value;
6303
6304        value = rt2800_bbp_read(rt2x00dev, 138);
6305        eeprom = rt2800_eeprom_read(rt2x00dev, EEPROM_NIC_CONF0);
6306        if (rt2x00_get_field16(eeprom, EEPROM_NIC_CONF0_TXPATH) == 1)
6307                value |= 0x20;
6308        if (rt2x00_get_field16(eeprom, EEPROM_NIC_CONF0_RXPATH) == 1)
6309                value &= ~0x02;
6310        rt2800_bbp_write(rt2x00dev, 138, value);
6311}
6312
6313static void rt2800_init_bbp_305x_soc(struct rt2x00_dev *rt2x00dev)
6314{
6315        rt2800_bbp_write(rt2x00dev, 31, 0x08);
6316
6317        rt2800_bbp_write(rt2x00dev, 65, 0x2c);
6318        rt2800_bbp_write(rt2x00dev, 66, 0x38);
6319
6320        rt2800_bbp_write(rt2x00dev, 69, 0x12);
6321        rt2800_bbp_write(rt2x00dev, 73, 0x10);
6322
6323        rt2800_bbp_write(rt2x00dev, 70, 0x0a);
6324
6325        rt2800_bbp_write(rt2x00dev, 78, 0x0e);
6326        rt2800_bbp_write(rt2x00dev, 80, 0x08);
6327
6328        rt2800_bbp_write(rt2x00dev, 82, 0x62);
6329
6330        rt2800_bbp_write(rt2x00dev, 83, 0x6a);
6331
6332        rt2800_bbp_write(rt2x00dev, 84, 0x99);
6333
6334        rt2800_bbp_write(rt2x00dev, 86, 0x00);
6335
6336        rt2800_bbp_write(rt2x00dev, 91, 0x04);
6337
6338        rt2800_bbp_write(rt2x00dev, 92, 0x00);
6339
6340        rt2800_bbp_write(rt2x00dev, 103, 0xc0);
6341
6342        rt2800_bbp_write(rt2x00dev, 105, 0x01);
6343
6344        rt2800_bbp_write(rt2x00dev, 106, 0x35);
6345}
6346
6347static void rt2800_init_bbp_28xx(struct rt2x00_dev *rt2x00dev)
6348{
6349        rt2800_bbp_write(rt2x00dev, 65, 0x2c);
6350        rt2800_bbp_write(rt2x00dev, 66, 0x38);
6351
6352        if (rt2x00_rt_rev(rt2x00dev, RT2860, REV_RT2860C)) {
6353                rt2800_bbp_write(rt2x00dev, 69, 0x16);
6354                rt2800_bbp_write(rt2x00dev, 73, 0x12);
6355        } else {
6356                rt2800_bbp_write(rt2x00dev, 69, 0x12);
6357                rt2800_bbp_write(rt2x00dev, 73, 0x10);
6358        }
6359
6360        rt2800_bbp_write(rt2x00dev, 70, 0x0a);
6361
6362        rt2800_bbp_write(rt2x00dev, 81, 0x37);
6363
6364        rt2800_bbp_write(rt2x00dev, 82, 0x62);
6365
6366        rt2800_bbp_write(rt2x00dev, 83, 0x6a);
6367
6368        if (rt2x00_rt_rev(rt2x00dev, RT2860, REV_RT2860D))
6369                rt2800_bbp_write(rt2x00dev, 84, 0x19);
6370        else
6371                rt2800_bbp_write(rt2x00dev, 84, 0x99);
6372
6373        rt2800_bbp_write(rt2x00dev, 86, 0x00);
6374
6375        rt2800_bbp_write(rt2x00dev, 91, 0x04);
6376
6377        rt2800_bbp_write(rt2x00dev, 92, 0x00);
6378
6379        rt2800_bbp_write(rt2x00dev, 103, 0x00);
6380
6381        rt2800_bbp_write(rt2x00dev, 105, 0x05);
6382
6383        rt2800_bbp_write(rt2x00dev, 106, 0x35);
6384}
6385
6386static void rt2800_init_bbp_30xx(struct rt2x00_dev *rt2x00dev)
6387{
6388        rt2800_bbp_write(rt2x00dev, 65, 0x2c);
6389        rt2800_bbp_write(rt2x00dev, 66, 0x38);
6390
6391        rt2800_bbp_write(rt2x00dev, 69, 0x12);
6392        rt2800_bbp_write(rt2x00dev, 73, 0x10);
6393
6394        rt2800_bbp_write(rt2x00dev, 70, 0x0a);
6395
6396        rt2800_bbp_write(rt2x00dev, 79, 0x13);
6397        rt2800_bbp_write(rt2x00dev, 80, 0x05);
6398        rt2800_bbp_write(rt2x00dev, 81, 0x33);
6399
6400        rt2800_bbp_write(rt2x00dev, 82, 0x62);
6401
6402        rt2800_bbp_write(rt2x00dev, 83, 0x6a);
6403
6404        rt2800_bbp_write(rt2x00dev, 84, 0x99);
6405
6406        rt2800_bbp_write(rt2x00dev, 86, 0x00);
6407
6408        rt2800_bbp_write(rt2x00dev, 91, 0x04);
6409
6410        rt2800_bbp_write(rt2x00dev, 92, 0x00);
6411
6412        if (rt2x00_rt_rev_gte(rt2x00dev, RT3070, REV_RT3070F) ||
6413            rt2x00_rt_rev_gte(rt2x00dev, RT3071, REV_RT3071E) ||
6414            rt2x00_rt_rev_gte(rt2x00dev, RT3090, REV_RT3090E))
6415                rt2800_bbp_write(rt2x00dev, 103, 0xc0);
6416        else
6417                rt2800_bbp_write(rt2x00dev, 103, 0x00);
6418
6419        rt2800_bbp_write(rt2x00dev, 105, 0x05);
6420
6421        rt2800_bbp_write(rt2x00dev, 106, 0x35);
6422
6423        if (rt2x00_rt(rt2x00dev, RT3071) ||
6424            rt2x00_rt(rt2x00dev, RT3090))
6425                rt2800_disable_unused_dac_adc(rt2x00dev);
6426}
6427
6428static void rt2800_init_bbp_3290(struct rt2x00_dev *rt2x00dev)
6429{
6430        u8 value;
6431
6432        rt2800_bbp4_mac_if_ctrl(rt2x00dev);
6433
6434        rt2800_bbp_write(rt2x00dev, 31, 0x08);
6435
6436        rt2800_bbp_write(rt2x00dev, 65, 0x2c);
6437        rt2800_bbp_write(rt2x00dev, 66, 0x38);
6438
6439        rt2800_bbp_write(rt2x00dev, 68, 0x0b);
6440
6441        rt2800_bbp_write(rt2x00dev, 69, 0x12);
6442        rt2800_bbp_write(rt2x00dev, 73, 0x13);
6443        rt2800_bbp_write(rt2x00dev, 75, 0x46);
6444        rt2800_bbp_write(rt2x00dev, 76, 0x28);
6445
6446        rt2800_bbp_write(rt2x00dev, 77, 0x58);
6447
6448        rt2800_bbp_write(rt2x00dev, 70, 0x0a);
6449
6450        rt2800_bbp_write(rt2x00dev, 74, 0x0b);
6451        rt2800_bbp_write(rt2x00dev, 79, 0x18);
6452        rt2800_bbp_write(rt2x00dev, 80, 0x09);
6453        rt2800_bbp_write(rt2x00dev, 81, 0x33);
6454
6455        rt2800_bbp_write(rt2x00dev, 82, 0x62);
6456
6457        rt2800_bbp_write(rt2x00dev, 83, 0x7a);
6458
6459        rt2800_bbp_write(rt2x00dev, 84, 0x9a);
6460
6461        rt2800_bbp_write(rt2x00dev, 86, 0x38);
6462
6463        rt2800_bbp_write(rt2x00dev, 91, 0x04);
6464
6465        rt2800_bbp_write(rt2x00dev, 92, 0x02);
6466
6467        rt2800_bbp_write(rt2x00dev, 103, 0xc0);
6468
6469        rt2800_bbp_write(rt2x00dev, 104, 0x92);
6470
6471        rt2800_bbp_write(rt2x00dev, 105, 0x1c);
6472
6473        rt2800_bbp_write(rt2x00dev, 106, 0x03);
6474
6475        rt2800_bbp_write(rt2x00dev, 128, 0x12);
6476
6477        rt2800_bbp_write(rt2x00dev, 67, 0x24);
6478        rt2800_bbp_write(rt2x00dev, 143, 0x04);
6479        rt2800_bbp_write(rt2x00dev, 142, 0x99);
6480        rt2800_bbp_write(rt2x00dev, 150, 0x30);
6481        rt2800_bbp_write(rt2x00dev, 151, 0x2e);
6482        rt2800_bbp_write(rt2x00dev, 152, 0x20);
6483        rt2800_bbp_write(rt2x00dev, 153, 0x34);
6484        rt2800_bbp_write(rt2x00dev, 154, 0x40);
6485        rt2800_bbp_write(rt2x00dev, 155, 0x3b);
6486        rt2800_bbp_write(rt2x00dev, 253, 0x04);
6487
6488        value = rt2800_bbp_read(rt2x00dev, 47);
6489        rt2x00_set_field8(&value, BBP47_TSSI_ADC6, 1);
6490        rt2800_bbp_write(rt2x00dev, 47, value);
6491
6492        /* Use 5-bit ADC for Acquisition and 8-bit ADC for data */
6493        value = rt2800_bbp_read(rt2x00dev, 3);
6494        rt2x00_set_field8(&value, BBP3_ADC_MODE_SWITCH, 1);
6495        rt2x00_set_field8(&value, BBP3_ADC_INIT_MODE, 1);
6496        rt2800_bbp_write(rt2x00dev, 3, value);
6497}
6498
6499static void rt2800_init_bbp_3352(struct rt2x00_dev *rt2x00dev)
6500{
6501        rt2800_bbp_write(rt2x00dev, 3, 0x00);
6502        rt2800_bbp_write(rt2x00dev, 4, 0x50);
6503
6504        rt2800_bbp_write(rt2x00dev, 31, 0x08);
6505
6506        rt2800_bbp_write(rt2x00dev, 47, 0x48);
6507
6508        rt2800_bbp_write(rt2x00dev, 65, 0x2c);
6509        rt2800_bbp_write(rt2x00dev, 66, 0x38);
6510
6511        rt2800_bbp_write(rt2x00dev, 68, 0x0b);
6512
6513        rt2800_bbp_write(rt2x00dev, 69, 0x12);
6514        rt2800_bbp_write(rt2x00dev, 73, 0x13);
6515        rt2800_bbp_write(rt2x00dev, 75, 0x46);
6516        rt2800_bbp_write(rt2x00dev, 76, 0x28);
6517
6518        rt2800_bbp_write(rt2x00dev, 77, 0x59);
6519
6520        rt2800_bbp_write(rt2x00dev, 70, 0x0a);
6521
6522        rt2800_bbp_write(rt2x00dev, 78, 0x0e);
6523        rt2800_bbp_write(rt2x00dev, 80, 0x08);
6524        rt2800_bbp_write(rt2x00dev, 81, 0x37);
6525
6526        rt2800_bbp_write(rt2x00dev, 82, 0x62);
6527
6528        if (rt2x00_rt(rt2x00dev, RT5350)) {
6529                rt2800_bbp_write(rt2x00dev, 83, 0x7a);
6530                rt2800_bbp_write(rt2x00dev, 84, 0x9a);
6531        } else {
6532                rt2800_bbp_write(rt2x00dev, 83, 0x6a);
6533                rt2800_bbp_write(rt2x00dev, 84, 0x99);
6534        }
6535
6536        rt2800_bbp_write(rt2x00dev, 86, 0x38);
6537
6538        rt2800_bbp_write(rt2x00dev, 88, 0x90);
6539
6540        rt2800_bbp_write(rt2x00dev, 91, 0x04);
6541
6542        rt2800_bbp_write(rt2x00dev, 92, 0x02);
6543
6544        rt2800_bbp_write(rt2x00dev, 103, 0xc0);
6545
6546        rt2800_bbp_write(rt2x00dev, 104, 0x92);
6547
6548        if (rt2x00_rt(rt2x00dev, RT5350)) {
6549                rt2800_bbp_write(rt2x00dev, 105, 0x3c);
6550                rt2800_bbp_write(rt2x00dev, 106, 0x03);
6551        } else {
6552                rt2800_bbp_write(rt2x00dev, 105, 0x34);
6553                rt2800_bbp_write(rt2x00dev, 106, 0x05);
6554        }
6555
6556        rt2800_bbp_write(rt2x00dev, 120, 0x50);
6557
6558        rt2800_bbp_write(rt2x00dev, 137, 0x0f);
6559
6560        rt2800_bbp_write(rt2x00dev, 163, 0xbd);
6561        /* Set ITxBF timeout to 0x9c40=1000msec */
6562        rt2800_bbp_write(rt2x00dev, 179, 0x02);
6563        rt2800_bbp_write(rt2x00dev, 180, 0x00);
6564        rt2800_bbp_write(rt2x00dev, 182, 0x40);
6565        rt2800_bbp_write(rt2x00dev, 180, 0x01);
6566        rt2800_bbp_write(rt2x00dev, 182, 0x9c);
6567        rt2800_bbp_write(rt2x00dev, 179, 0x00);
6568        /* Reprogram the inband interface to put right values in RXWI */
6569        rt2800_bbp_write(rt2x00dev, 142, 0x04);
6570        rt2800_bbp_write(rt2x00dev, 143, 0x3b);
6571        rt2800_bbp_write(rt2x00dev, 142, 0x06);
6572        rt2800_bbp_write(rt2x00dev, 143, 0xa0);
6573        rt2800_bbp_write(rt2x00dev, 142, 0x07);
6574        rt2800_bbp_write(rt2x00dev, 143, 0xa1);
6575        rt2800_bbp_write(rt2x00dev, 142, 0x08);
6576        rt2800_bbp_write(rt2x00dev, 143, 0xa2);
6577
6578        rt2800_bbp_write(rt2x00dev, 148, 0xc8);
6579
6580        if (rt2x00_rt(rt2x00dev, RT5350)) {
6581                /* Antenna Software OFDM */
6582                rt2800_bbp_write(rt2x00dev, 150, 0x40);
6583                /* Antenna Software CCK */
6584                rt2800_bbp_write(rt2x00dev, 151, 0x30);
6585                rt2800_bbp_write(rt2x00dev, 152, 0xa3);
6586                /* Clear previously selected antenna */
6587                rt2800_bbp_write(rt2x00dev, 154, 0);
6588        }
6589}
6590
6591static void rt2800_init_bbp_3390(struct rt2x00_dev *rt2x00dev)
6592{
6593        rt2800_bbp_write(rt2x00dev, 65, 0x2c);
6594        rt2800_bbp_write(rt2x00dev, 66, 0x38);
6595
6596        rt2800_bbp_write(rt2x00dev, 69, 0x12);
6597        rt2800_bbp_write(rt2x00dev, 73, 0x10);
6598
6599        rt2800_bbp_write(rt2x00dev, 70, 0x0a);
6600
6601        rt2800_bbp_write(rt2x00dev, 79, 0x13);
6602        rt2800_bbp_write(rt2x00dev, 80, 0x05);
6603        rt2800_bbp_write(rt2x00dev, 81, 0x33);
6604
6605        rt2800_bbp_write(rt2x00dev, 82, 0x62);
6606
6607        rt2800_bbp_write(rt2x00dev, 83, 0x6a);
6608
6609        rt2800_bbp_write(rt2x00dev, 84, 0x99);
6610
6611        rt2800_bbp_write(rt2x00dev, 86, 0x00);
6612
6613        rt2800_bbp_write(rt2x00dev, 91, 0x04);
6614
6615        rt2800_bbp_write(rt2x00dev, 92, 0x00);
6616
6617        if (rt2x00_rt_rev_gte(rt2x00dev, RT3390, REV_RT3390E))
6618                rt2800_bbp_write(rt2x00dev, 103, 0xc0);
6619        else
6620                rt2800_bbp_write(rt2x00dev, 103, 0x00);
6621
6622        rt2800_bbp_write(rt2x00dev, 105, 0x05);
6623
6624        rt2800_bbp_write(rt2x00dev, 106, 0x35);
6625
6626        rt2800_disable_unused_dac_adc(rt2x00dev);
6627}
6628
6629static void rt2800_init_bbp_3572(struct rt2x00_dev *rt2x00dev)
6630{
6631        rt2800_bbp_write(rt2x00dev, 31, 0x08);
6632
6633        rt2800_bbp_write(rt2x00dev, 65, 0x2c);
6634        rt2800_bbp_write(rt2x00dev, 66, 0x38);
6635
6636        rt2800_bbp_write(rt2x00dev, 69, 0x12);
6637        rt2800_bbp_write(rt2x00dev, 73, 0x10);
6638
6639        rt2800_bbp_write(rt2x00dev, 70, 0x0a);
6640
6641        rt2800_bbp_write(rt2x00dev, 79, 0x13);
6642        rt2800_bbp_write(rt2x00dev, 80, 0x05);
6643        rt2800_bbp_write(rt2x00dev, 81, 0x33);
6644
6645        rt2800_bbp_write(rt2x00dev, 82, 0x62);
6646
6647        rt2800_bbp_write(rt2x00dev, 83, 0x6a);
6648
6649        rt2800_bbp_write(rt2x00dev, 84, 0x99);
6650
6651        rt2800_bbp_write(rt2x00dev, 86, 0x00);
6652
6653        rt2800_bbp_write(rt2x00dev, 91, 0x04);
6654
6655        rt2800_bbp_write(rt2x00dev, 92, 0x00);
6656
6657        rt2800_bbp_write(rt2x00dev, 103, 0xc0);
6658
6659        rt2800_bbp_write(rt2x00dev, 105, 0x05);
6660
6661        rt2800_bbp_write(rt2x00dev, 106, 0x35);
6662
6663        rt2800_disable_unused_dac_adc(rt2x00dev);
6664}
6665
6666static void rt2800_init_bbp_3593(struct rt2x00_dev *rt2x00dev)
6667{
6668        rt2800_init_bbp_early(rt2x00dev);
6669
6670        rt2800_bbp_write(rt2x00dev, 79, 0x13);
6671        rt2800_bbp_write(rt2x00dev, 80, 0x05);
6672        rt2800_bbp_write(rt2x00dev, 81, 0x33);
6673        rt2800_bbp_write(rt2x00dev, 137, 0x0f);
6674
6675        rt2800_bbp_write(rt2x00dev, 84, 0x19);
6676
6677        /* Enable DC filter */
6678        if (rt2x00_rt_rev_gte(rt2x00dev, RT3593, REV_RT3593E))
6679                rt2800_bbp_write(rt2x00dev, 103, 0xc0);
6680}
6681
6682static void rt2800_init_bbp_3883(struct rt2x00_dev *rt2x00dev)
6683{
6684        rt2800_init_bbp_early(rt2x00dev);
6685
6686        rt2800_bbp_write(rt2x00dev, 4, 0x50);
6687        rt2800_bbp_write(rt2x00dev, 47, 0x48);
6688
6689        rt2800_bbp_write(rt2x00dev, 86, 0x46);
6690        rt2800_bbp_write(rt2x00dev, 88, 0x90);
6691
6692        rt2800_bbp_write(rt2x00dev, 92, 0x02);
6693
6694        rt2800_bbp_write(rt2x00dev, 103, 0xc0);
6695        rt2800_bbp_write(rt2x00dev, 104, 0x92);
6696        rt2800_bbp_write(rt2x00dev, 105, 0x34);
6697        rt2800_bbp_write(rt2x00dev, 106, 0x12);
6698        rt2800_bbp_write(rt2x00dev, 120, 0x50);
6699        rt2800_bbp_write(rt2x00dev, 137, 0x0f);
6700        rt2800_bbp_write(rt2x00dev, 163, 0x9d);
6701
6702        /* Set ITxBF timeout to 0x9C40=1000msec */
6703        rt2800_bbp_write(rt2x00dev, 179, 0x02);
6704        rt2800_bbp_write(rt2x00dev, 180, 0x00);
6705        rt2800_bbp_write(rt2x00dev, 182, 0x40);
6706        rt2800_bbp_write(rt2x00dev, 180, 0x01);
6707        rt2800_bbp_write(rt2x00dev, 182, 0x9c);
6708
6709        rt2800_bbp_write(rt2x00dev, 179, 0x00);
6710
6711        /* Reprogram the inband interface to put right values in RXWI */
6712        rt2800_bbp_write(rt2x00dev, 142, 0x04);
6713        rt2800_bbp_write(rt2x00dev, 143, 0x3b);
6714        rt2800_bbp_write(rt2x00dev, 142, 0x06);
6715        rt2800_bbp_write(rt2x00dev, 143, 0xa0);
6716        rt2800_bbp_write(rt2x00dev, 142, 0x07);
6717        rt2800_bbp_write(rt2x00dev, 143, 0xa1);
6718        rt2800_bbp_write(rt2x00dev, 142, 0x08);
6719        rt2800_bbp_write(rt2x00dev, 143, 0xa2);
6720        rt2800_bbp_write(rt2x00dev, 148, 0xc8);
6721}
6722
6723static void rt2800_init_bbp_53xx(struct rt2x00_dev *rt2x00dev)
6724{
6725        int ant, div_mode;
6726        u16 eeprom;
6727        u8 value;
6728
6729        rt2800_bbp4_mac_if_ctrl(rt2x00dev);
6730
6731        rt2800_bbp_write(rt2x00dev, 31, 0x08);
6732
6733        rt2800_bbp_write(rt2x00dev, 65, 0x2c);
6734        rt2800_bbp_write(rt2x00dev, 66, 0x38);
6735
6736        rt2800_bbp_write(rt2x00dev, 68, 0x0b);
6737
6738        rt2800_bbp_write(rt2x00dev, 69, 0x12);
6739        rt2800_bbp_write(rt2x00dev, 73, 0x13);
6740        rt2800_bbp_write(rt2x00dev, 75, 0x46);
6741        rt2800_bbp_write(rt2x00dev, 76, 0x28);
6742
6743        rt2800_bbp_write(rt2x00dev, 77, 0x59);
6744
6745        rt2800_bbp_write(rt2x00dev, 70, 0x0a);
6746
6747        rt2800_bbp_write(rt2x00dev, 79, 0x13);
6748        rt2800_bbp_write(rt2x00dev, 80, 0x05);
6749        rt2800_bbp_write(rt2x00dev, 81, 0x33);
6750
6751        rt2800_bbp_write(rt2x00dev, 82, 0x62);
6752
6753        rt2800_bbp_write(rt2x00dev, 83, 0x7a);
6754
6755        rt2800_bbp_write(rt2x00dev, 84, 0x9a);
6756
6757        rt2800_bbp_write(rt2x00dev, 86, 0x38);
6758
6759        if (rt2x00_rt(rt2x00dev, RT5392))
6760                rt2800_bbp_write(rt2x00dev, 88, 0x90);
6761
6762        rt2800_bbp_write(rt2x00dev, 91, 0x04);
6763
6764        rt2800_bbp_write(rt2x00dev, 92, 0x02);
6765
6766        if (rt2x00_rt(rt2x00dev, RT5392)) {
6767                rt2800_bbp_write(rt2x00dev, 95, 0x9a);
6768                rt2800_bbp_write(rt2x00dev, 98, 0x12);
6769        }
6770
6771        rt2800_bbp_write(rt2x00dev, 103, 0xc0);
6772
6773        rt2800_bbp_write(rt2x00dev, 104, 0x92);
6774
6775        rt2800_bbp_write(rt2x00dev, 105, 0x3c);
6776
6777        if (rt2x00_rt(rt2x00dev, RT5390))
6778                rt2800_bbp_write(rt2x00dev, 106, 0x03);
6779        else if (rt2x00_rt(rt2x00dev, RT5392))
6780                rt2800_bbp_write(rt2x00dev, 106, 0x12);
6781        else
6782                WARN_ON(1);
6783
6784        rt2800_bbp_write(rt2x00dev, 128, 0x12);
6785
6786        if (rt2x00_rt(rt2x00dev, RT5392)) {
6787                rt2800_bbp_write(rt2x00dev, 134, 0xd0);
6788                rt2800_bbp_write(rt2x00dev, 135, 0xf6);
6789        }
6790
6791        rt2800_disable_unused_dac_adc(rt2x00dev);
6792
6793        eeprom = rt2800_eeprom_read(rt2x00dev, EEPROM_NIC_CONF1);
6794        div_mode = rt2x00_get_field16(eeprom,
6795                                      EEPROM_NIC_CONF1_ANT_DIVERSITY);
6796        ant = (div_mode == 3) ? 1 : 0;
6797
6798        /* check if this is a Bluetooth combo card */
6799        if (rt2x00_has_cap_bt_coexist(rt2x00dev)) {
6800                u32 reg;
6801
6802                reg = rt2800_register_read(rt2x00dev, GPIO_CTRL);
6803                rt2x00_set_field32(&reg, GPIO_CTRL_DIR3, 0);
6804                rt2x00_set_field32(&reg, GPIO_CTRL_DIR6, 0);
6805                rt2x00_set_field32(&reg, GPIO_CTRL_VAL3, 0);
6806                rt2x00_set_field32(&reg, GPIO_CTRL_VAL6, 0);
6807                if (ant == 0)
6808                        rt2x00_set_field32(&reg, GPIO_CTRL_VAL3, 1);
6809                else if (ant == 1)
6810                        rt2x00_set_field32(&reg, GPIO_CTRL_VAL6, 1);
6811                rt2800_register_write(rt2x00dev, GPIO_CTRL, reg);
6812        }
6813
6814        /* These chips have hardware RX antenna diversity */
6815        if (rt2x00_rt_rev_gte(rt2x00dev, RT5390, REV_RT5390R) ||
6816            rt2x00_rt_rev_gte(rt2x00dev, RT5390, REV_RT5370G)) {
6817                rt2800_bbp_write(rt2x00dev, 150, 0); /* Disable Antenna Software OFDM */
6818                rt2800_bbp_write(rt2x00dev, 151, 0); /* Disable Antenna Software CCK */
6819                rt2800_bbp_write(rt2x00dev, 154, 0); /* Clear previously selected antenna */
6820        }
6821
6822        value = rt2800_bbp_read(rt2x00dev, 152);
6823        if (ant == 0)
6824                rt2x00_set_field8(&value, BBP152_RX_DEFAULT_ANT, 1);
6825        else
6826                rt2x00_set_field8(&value, BBP152_RX_DEFAULT_ANT, 0);
6827        rt2800_bbp_write(rt2x00dev, 152, value);
6828
6829        rt2800_init_freq_calibration(rt2x00dev);
6830}
6831
6832static void rt2800_init_bbp_5592(struct rt2x00_dev *rt2x00dev)
6833{
6834        int ant, div_mode;
6835        u16 eeprom;
6836        u8 value;
6837
6838        rt2800_init_bbp_early(rt2x00dev);
6839
6840        value = rt2800_bbp_read(rt2x00dev, 105);
6841        rt2x00_set_field8(&value, BBP105_MLD,
6842                          rt2x00dev->default_ant.rx_chain_num == 2);
6843        rt2800_bbp_write(rt2x00dev, 105, value);
6844
6845        rt2800_bbp4_mac_if_ctrl(rt2x00dev);
6846
6847        rt2800_bbp_write(rt2x00dev, 20, 0x06);
6848        rt2800_bbp_write(rt2x00dev, 31, 0x08);
6849        rt2800_bbp_write(rt2x00dev, 65, 0x2C);
6850        rt2800_bbp_write(rt2x00dev, 68, 0xDD);
6851        rt2800_bbp_write(rt2x00dev, 69, 0x1A);
6852        rt2800_bbp_write(rt2x00dev, 70, 0x05);
6853        rt2800_bbp_write(rt2x00dev, 73, 0x13);
6854        rt2800_bbp_write(rt2x00dev, 74, 0x0F);
6855        rt2800_bbp_write(rt2x00dev, 75, 0x4F);
6856        rt2800_bbp_write(rt2x00dev, 76, 0x28);
6857        rt2800_bbp_write(rt2x00dev, 77, 0x59);
6858        rt2800_bbp_write(rt2x00dev, 84, 0x9A);
6859        rt2800_bbp_write(rt2x00dev, 86, 0x38);
6860        rt2800_bbp_write(rt2x00dev, 88, 0x90);
6861        rt2800_bbp_write(rt2x00dev, 91, 0x04);
6862        rt2800_bbp_write(rt2x00dev, 92, 0x02);
6863        rt2800_bbp_write(rt2x00dev, 95, 0x9a);
6864        rt2800_bbp_write(rt2x00dev, 98, 0x12);
6865        rt2800_bbp_write(rt2x00dev, 103, 0xC0);
6866        rt2800_bbp_write(rt2x00dev, 104, 0x92);
6867        /* FIXME BBP105 owerwrite */
6868        rt2800_bbp_write(rt2x00dev, 105, 0x3C);
6869        rt2800_bbp_write(rt2x00dev, 106, 0x35);
6870        rt2800_bbp_write(rt2x00dev, 128, 0x12);
6871        rt2800_bbp_write(rt2x00dev, 134, 0xD0);
6872        rt2800_bbp_write(rt2x00dev, 135, 0xF6);
6873        rt2800_bbp_write(rt2x00dev, 137, 0x0F);
6874
6875        /* Initialize GLRT (Generalized Likehood Radio Test) */
6876        rt2800_init_bbp_5592_glrt(rt2x00dev);
6877
6878        rt2800_bbp4_mac_if_ctrl(rt2x00dev);
6879
6880        eeprom = rt2800_eeprom_read(rt2x00dev, EEPROM_NIC_CONF1);
6881        div_mode = rt2x00_get_field16(eeprom, EEPROM_NIC_CONF1_ANT_DIVERSITY);
6882        ant = (div_mode == 3) ? 1 : 0;
6883        value = rt2800_bbp_read(rt2x00dev, 152);
6884        if (ant == 0) {
6885                /* Main antenna */
6886                rt2x00_set_field8(&value, BBP152_RX_DEFAULT_ANT, 1);
6887        } else {
6888                /* Auxiliary antenna */
6889                rt2x00_set_field8(&value, BBP152_RX_DEFAULT_ANT, 0);
6890        }
6891        rt2800_bbp_write(rt2x00dev, 152, value);
6892
6893        if (rt2x00_rt_rev_gte(rt2x00dev, RT5592, REV_RT5592C)) {
6894                value = rt2800_bbp_read(rt2x00dev, 254);
6895                rt2x00_set_field8(&value, BBP254_BIT7, 1);
6896                rt2800_bbp_write(rt2x00dev, 254, value);
6897        }
6898
6899        rt2800_init_freq_calibration(rt2x00dev);
6900
6901        rt2800_bbp_write(rt2x00dev, 84, 0x19);
6902        if (rt2x00_rt_rev_gte(rt2x00dev, RT5592, REV_RT5592C))
6903                rt2800_bbp_write(rt2x00dev, 103, 0xc0);
6904}
6905
6906static void rt2800_bbp_glrt_write(struct rt2x00_dev *rt2x00dev,
6907                                  const u8 reg, const u8 value)
6908{
6909        rt2800_bbp_write(rt2x00dev, 195, reg);
6910        rt2800_bbp_write(rt2x00dev, 196, value);
6911}
6912
6913static void rt2800_bbp_dcoc_write(struct rt2x00_dev *rt2x00dev,
6914                                  const u8 reg, const u8 value)
6915{
6916        rt2800_bbp_write(rt2x00dev, 158, reg);
6917        rt2800_bbp_write(rt2x00dev, 159, value);
6918}
6919
6920static u8 rt2800_bbp_dcoc_read(struct rt2x00_dev *rt2x00dev, const u8 reg)
6921{
6922        rt2800_bbp_write(rt2x00dev, 158, reg);
6923        return rt2800_bbp_read(rt2x00dev, 159);
6924}
6925
6926static void rt2800_init_bbp_6352(struct rt2x00_dev *rt2x00dev)
6927{
6928        u8 bbp;
6929
6930        /* Apply Maximum Likelihood Detection (MLD) for 2 stream case */
6931        bbp = rt2800_bbp_read(rt2x00dev, 105);
6932        rt2x00_set_field8(&bbp, BBP105_MLD,
6933                          rt2x00dev->default_ant.rx_chain_num == 2);
6934        rt2800_bbp_write(rt2x00dev, 105, bbp);
6935
6936        /* Avoid data loss and CRC errors */
6937        rt2800_bbp4_mac_if_ctrl(rt2x00dev);
6938
6939        /* Fix I/Q swap issue */
6940        bbp = rt2800_bbp_read(rt2x00dev, 1);
6941        bbp |= 0x04;
6942        rt2800_bbp_write(rt2x00dev, 1, bbp);
6943
6944        /* BBP for G band */
6945        rt2800_bbp_write(rt2x00dev, 3, 0x08);
6946        rt2800_bbp_write(rt2x00dev, 4, 0x00); /* rt2800_bbp4_mac_if_ctrl? */
6947        rt2800_bbp_write(rt2x00dev, 6, 0x08);
6948        rt2800_bbp_write(rt2x00dev, 14, 0x09);
6949        rt2800_bbp_write(rt2x00dev, 15, 0xFF);
6950        rt2800_bbp_write(rt2x00dev, 16, 0x01);
6951        rt2800_bbp_write(rt2x00dev, 20, 0x06);
6952        rt2800_bbp_write(rt2x00dev, 21, 0x00);
6953        rt2800_bbp_write(rt2x00dev, 22, 0x00);
6954        rt2800_bbp_write(rt2x00dev, 27, 0x00);
6955        rt2800_bbp_write(rt2x00dev, 28, 0x00);
6956        rt2800_bbp_write(rt2x00dev, 30, 0x00);
6957        rt2800_bbp_write(rt2x00dev, 31, 0x48);
6958        rt2800_bbp_write(rt2x00dev, 47, 0x40);
6959        rt2800_bbp_write(rt2x00dev, 62, 0x00);
6960        rt2800_bbp_write(rt2x00dev, 63, 0x00);
6961        rt2800_bbp_write(rt2x00dev, 64, 0x00);
6962        rt2800_bbp_write(rt2x00dev, 65, 0x2C);
6963        rt2800_bbp_write(rt2x00dev, 66, 0x1C);
6964        rt2800_bbp_write(rt2x00dev, 67, 0x20);
6965        rt2800_bbp_write(rt2x00dev, 68, 0xDD);
6966        rt2800_bbp_write(rt2x00dev, 69, 0x10);
6967        rt2800_bbp_write(rt2x00dev, 70, 0x05);
6968        rt2800_bbp_write(rt2x00dev, 73, 0x18);
6969        rt2800_bbp_write(rt2x00dev, 74, 0x0F);
6970        rt2800_bbp_write(rt2x00dev, 75, 0x60);
6971        rt2800_bbp_write(rt2x00dev, 76, 0x44);
6972        rt2800_bbp_write(rt2x00dev, 77, 0x59);
6973        rt2800_bbp_write(rt2x00dev, 78, 0x1E);
6974        rt2800_bbp_write(rt2x00dev, 79, 0x1C);
6975        rt2800_bbp_write(rt2x00dev, 80, 0x0C);
6976        rt2800_bbp_write(rt2x00dev, 81, 0x3A);
6977        rt2800_bbp_write(rt2x00dev, 82, 0xB6);
6978        rt2800_bbp_write(rt2x00dev, 83, 0x9A);
6979        rt2800_bbp_write(rt2x00dev, 84, 0x9A);
6980        rt2800_bbp_write(rt2x00dev, 86, 0x38);
6981        rt2800_bbp_write(rt2x00dev, 88, 0x90);
6982        rt2800_bbp_write(rt2x00dev, 91, 0x04);
6983        rt2800_bbp_write(rt2x00dev, 92, 0x02);
6984        rt2800_bbp_write(rt2x00dev, 95, 0x9A);
6985        rt2800_bbp_write(rt2x00dev, 96, 0x00);
6986        rt2800_bbp_write(rt2x00dev, 103, 0xC0);
6987        rt2800_bbp_write(rt2x00dev, 104, 0x92);
6988        /* FIXME BBP105 owerwrite */
6989        rt2800_bbp_write(rt2x00dev, 105, 0x3C);
6990        rt2800_bbp_write(rt2x00dev, 106, 0x12);
6991        rt2800_bbp_write(rt2x00dev, 109, 0x00);
6992        rt2800_bbp_write(rt2x00dev, 134, 0x10);
6993        rt2800_bbp_write(rt2x00dev, 135, 0xA6);
6994        rt2800_bbp_write(rt2x00dev, 137, 0x04);
6995        rt2800_bbp_write(rt2x00dev, 142, 0x30);
6996        rt2800_bbp_write(rt2x00dev, 143, 0xF7);
6997        rt2800_bbp_write(rt2x00dev, 160, 0xEC);
6998        rt2800_bbp_write(rt2x00dev, 161, 0xC4);
6999        rt2800_bbp_write(rt2x00dev, 162, 0x77);
7000        rt2800_bbp_write(rt2x00dev, 163, 0xF9);
7001        rt2800_bbp_write(rt2x00dev, 164, 0x00);
7002        rt2800_bbp_write(rt2x00dev, 165, 0x00);
7003        rt2800_bbp_write(rt2x00dev, 186, 0x00);
7004        rt2800_bbp_write(rt2x00dev, 187, 0x00);
7005        rt2800_bbp_write(rt2x00dev, 188, 0x00);
7006        rt2800_bbp_write(rt2x00dev, 186, 0x00);
7007        rt2800_bbp_write(rt2x00dev, 187, 0x01);
7008        rt2800_bbp_write(rt2x00dev, 188, 0x00);
7009        rt2800_bbp_write(rt2x00dev, 189, 0x00);
7010
7011        rt2800_bbp_write(rt2x00dev, 91, 0x06);
7012        rt2800_bbp_write(rt2x00dev, 92, 0x04);
7013        rt2800_bbp_write(rt2x00dev, 93, 0x54);
7014        rt2800_bbp_write(rt2x00dev, 99, 0x50);
7015        rt2800_bbp_write(rt2x00dev, 148, 0x84);
7016        rt2800_bbp_write(rt2x00dev, 167, 0x80);
7017        rt2800_bbp_write(rt2x00dev, 178, 0xFF);
7018        rt2800_bbp_write(rt2x00dev, 106, 0x13);
7019
7020        /* BBP for G band GLRT function (BBP_128 ~ BBP_221) */
7021        rt2800_bbp_glrt_write(rt2x00dev, 0, 0x00);
7022        rt2800_bbp_glrt_write(rt2x00dev, 1, 0x14);
7023        rt2800_bbp_glrt_write(rt2x00dev, 2, 0x20);
7024        rt2800_bbp_glrt_write(rt2x00dev, 3, 0x0A);
7025        rt2800_bbp_glrt_write(rt2x00dev, 10, 0x16);
7026        rt2800_bbp_glrt_write(rt2x00dev, 11, 0x06);
7027        rt2800_bbp_glrt_write(rt2x00dev, 12, 0x02);
7028        rt2800_bbp_glrt_write(rt2x00dev, 13, 0x07);
7029        rt2800_bbp_glrt_write(rt2x00dev, 14, 0x05);
7030        rt2800_bbp_glrt_write(rt2x00dev, 15, 0x09);
7031        rt2800_bbp_glrt_write(rt2x00dev, 16, 0x20);
7032        rt2800_bbp_glrt_write(rt2x00dev, 17, 0x08);
7033        rt2800_bbp_glrt_write(rt2x00dev, 18, 0x4A);
7034        rt2800_bbp_glrt_write(rt2x00dev, 19, 0x00);
7035        rt2800_bbp_glrt_write(rt2x00dev, 20, 0x00);
7036        rt2800_bbp_glrt_write(rt2x00dev, 128, 0xE0);
7037        rt2800_bbp_glrt_write(rt2x00dev, 129, 0x1F);
7038        rt2800_bbp_glrt_write(rt2x00dev, 130, 0x4F);
7039        rt2800_bbp_glrt_write(rt2x00dev, 131, 0x32);
7040        rt2800_bbp_glrt_write(rt2x00dev, 132, 0x08);
7041        rt2800_bbp_glrt_write(rt2x00dev, 133, 0x28);
7042        rt2800_bbp_glrt_write(rt2x00dev, 134, 0x19);
7043        rt2800_bbp_glrt_write(rt2x00dev, 135, 0x0A);
7044        rt2800_bbp_glrt_write(rt2x00dev, 138, 0x16);
7045        rt2800_bbp_glrt_write(rt2x00dev, 139, 0x10);
7046        rt2800_bbp_glrt_write(rt2x00dev, 140, 0x10);
7047        rt2800_bbp_glrt_write(rt2x00dev, 141, 0x1A);
7048        rt2800_bbp_glrt_write(rt2x00dev, 142, 0x36);
7049        rt2800_bbp_glrt_write(rt2x00dev, 143, 0x2C);
7050        rt2800_bbp_glrt_write(rt2x00dev, 144, 0x26);
7051        rt2800_bbp_glrt_write(rt2x00dev, 145, 0x24);
7052        rt2800_bbp_glrt_write(rt2x00dev, 146, 0x42);
7053        rt2800_bbp_glrt_write(rt2x00dev, 147, 0x40);
7054        rt2800_bbp_glrt_write(rt2x00dev, 148, 0x30);
7055        rt2800_bbp_glrt_write(rt2x00dev, 149, 0x29);
7056        rt2800_bbp_glrt_write(rt2x00dev, 150, 0x4C);
7057        rt2800_bbp_glrt_write(rt2x00dev, 151, 0x46);
7058        rt2800_bbp_glrt_write(rt2x00dev, 152, 0x3D);
7059        rt2800_bbp_glrt_write(rt2x00dev, 153, 0x40);
7060        rt2800_bbp_glrt_write(rt2x00dev, 154, 0x3E);
7061        rt2800_bbp_glrt_write(rt2x00dev, 155, 0x38);
7062        rt2800_bbp_glrt_write(rt2x00dev, 156, 0x3D);
7063        rt2800_bbp_glrt_write(rt2x00dev, 157, 0x2F);
7064        rt2800_bbp_glrt_write(rt2x00dev, 158, 0x3C);
7065        rt2800_bbp_glrt_write(rt2x00dev, 159, 0x34);
7066        rt2800_bbp_glrt_write(rt2x00dev, 160, 0x2C);
7067        rt2800_bbp_glrt_write(rt2x00dev, 161, 0x2F);
7068        rt2800_bbp_glrt_write(rt2x00dev, 162, 0x3C);
7069        rt2800_bbp_glrt_write(rt2x00dev, 163, 0x35);
7070        rt2800_bbp_glrt_write(rt2x00dev, 164, 0x2E);
7071        rt2800_bbp_glrt_write(rt2x00dev, 165, 0x2F);
7072        rt2800_bbp_glrt_write(rt2x00dev, 166, 0x49);
7073        rt2800_bbp_glrt_write(rt2x00dev, 167, 0x41);
7074        rt2800_bbp_glrt_write(rt2x00dev, 168, 0x36);
7075        rt2800_bbp_glrt_write(rt2x00dev, 169, 0x39);
7076        rt2800_bbp_glrt_write(rt2x00dev, 170, 0x30);
7077        rt2800_bbp_glrt_write(rt2x00dev, 171, 0x30);
7078        rt2800_bbp_glrt_write(rt2x00dev, 172, 0x0E);
7079        rt2800_bbp_glrt_write(rt2x00dev, 173, 0x0D);
7080        rt2800_bbp_glrt_write(rt2x00dev, 174, 0x28);
7081        rt2800_bbp_glrt_write(rt2x00dev, 175, 0x21);
7082        rt2800_bbp_glrt_write(rt2x00dev, 176, 0x1C);
7083        rt2800_bbp_glrt_write(rt2x00dev, 177, 0x16);
7084        rt2800_bbp_glrt_write(rt2x00dev, 178, 0x50);
7085        rt2800_bbp_glrt_write(rt2x00dev, 179, 0x4A);
7086        rt2800_bbp_glrt_write(rt2x00dev, 180, 0x43);
7087        rt2800_bbp_glrt_write(rt2x00dev, 181, 0x50);
7088        rt2800_bbp_glrt_write(rt2x00dev, 182, 0x10);
7089        rt2800_bbp_glrt_write(rt2x00dev, 183, 0x10);
7090        rt2800_bbp_glrt_write(rt2x00dev, 184, 0x10);
7091        rt2800_bbp_glrt_write(rt2x00dev, 185, 0x10);
7092        rt2800_bbp_glrt_write(rt2x00dev, 200, 0x7D);
7093        rt2800_bbp_glrt_write(rt2x00dev, 201, 0x14);
7094        rt2800_bbp_glrt_write(rt2x00dev, 202, 0x32);
7095        rt2800_bbp_glrt_write(rt2x00dev, 203, 0x2C);
7096        rt2800_bbp_glrt_write(rt2x00dev, 204, 0x36);
7097        rt2800_bbp_glrt_write(rt2x00dev, 205, 0x4C);
7098        rt2800_bbp_glrt_write(rt2x00dev, 206, 0x43);
7099        rt2800_bbp_glrt_write(rt2x00dev, 207, 0x2C);
7100        rt2800_bbp_glrt_write(rt2x00dev, 208, 0x2E);
7101        rt2800_bbp_glrt_write(rt2x00dev, 209, 0x36);
7102        rt2800_bbp_glrt_write(rt2x00dev, 210, 0x30);
7103        rt2800_bbp_glrt_write(rt2x00dev, 211, 0x6E);
7104
7105        /* BBP for G band DCOC function */
7106        rt2800_bbp_dcoc_write(rt2x00dev, 140, 0x0C);
7107        rt2800_bbp_dcoc_write(rt2x00dev, 141, 0x00);
7108        rt2800_bbp_dcoc_write(rt2x00dev, 142, 0x10);
7109        rt2800_bbp_dcoc_write(rt2x00dev, 143, 0x10);
7110        rt2800_bbp_dcoc_write(rt2x00dev, 144, 0x10);
7111        rt2800_bbp_dcoc_write(rt2x00dev, 145, 0x10);
7112        rt2800_bbp_dcoc_write(rt2x00dev, 146, 0x08);
7113        rt2800_bbp_dcoc_write(rt2x00dev, 147, 0x40);
7114        rt2800_bbp_dcoc_write(rt2x00dev, 148, 0x04);
7115        rt2800_bbp_dcoc_write(rt2x00dev, 149, 0x04);
7116        rt2800_bbp_dcoc_write(rt2x00dev, 150, 0x08);
7117        rt2800_bbp_dcoc_write(rt2x00dev, 151, 0x08);
7118        rt2800_bbp_dcoc_write(rt2x00dev, 152, 0x03);
7119        rt2800_bbp_dcoc_write(rt2x00dev, 153, 0x03);
7120        rt2800_bbp_dcoc_write(rt2x00dev, 154, 0x03);
7121        rt2800_bbp_dcoc_write(rt2x00dev, 155, 0x02);
7122        rt2800_bbp_dcoc_write(rt2x00dev, 156, 0x40);
7123        rt2800_bbp_dcoc_write(rt2x00dev, 157, 0x40);
7124        rt2800_bbp_dcoc_write(rt2x00dev, 158, 0x64);
7125        rt2800_bbp_dcoc_write(rt2x00dev, 159, 0x64);
7126
7127        rt2800_bbp4_mac_if_ctrl(rt2x00dev);
7128}
7129
7130static void rt2800_init_bbp(struct rt2x00_dev *rt2x00dev)
7131{
7132        unsigned int i;
7133        u16 eeprom;
7134        u8 reg_id;
7135        u8 value;
7136
7137        if (rt2800_is_305x_soc(rt2x00dev))
7138                rt2800_init_bbp_305x_soc(rt2x00dev);
7139
7140        switch (rt2x00dev->chip.rt) {
7141        case RT2860:
7142        case RT2872:
7143        case RT2883:
7144                rt2800_init_bbp_28xx(rt2x00dev);
7145                break;
7146        case RT3070:
7147        case RT3071:
7148        case RT3090:
7149                rt2800_init_bbp_30xx(rt2x00dev);
7150                break;
7151        case RT3290:
7152                rt2800_init_bbp_3290(rt2x00dev);
7153                break;
7154        case RT3352:
7155        case RT5350:
7156                rt2800_init_bbp_3352(rt2x00dev);
7157                break;
7158        case RT3390:
7159                rt2800_init_bbp_3390(rt2x00dev);
7160                break;
7161        case RT3572:
7162                rt2800_init_bbp_3572(rt2x00dev);
7163                break;
7164        case RT3593:
7165                rt2800_init_bbp_3593(rt2x00dev);
7166                return;
7167        case RT3883:
7168                rt2800_init_bbp_3883(rt2x00dev);
7169                return;
7170        case RT5390:
7171        case RT5392:
7172                rt2800_init_bbp_53xx(rt2x00dev);
7173                break;
7174        case RT5592:
7175                rt2800_init_bbp_5592(rt2x00dev);
7176                return;
7177        case RT6352:
7178                rt2800_init_bbp_6352(rt2x00dev);
7179                break;
7180        }
7181
7182        for (i = 0; i < EEPROM_BBP_SIZE; i++) {
7183                eeprom = rt2800_eeprom_read_from_array(rt2x00dev,
7184                                                       EEPROM_BBP_START, i);
7185
7186                if (eeprom != 0xffff && eeprom != 0x0000) {
7187                        reg_id = rt2x00_get_field16(eeprom, EEPROM_BBP_REG_ID);
7188                        value = rt2x00_get_field16(eeprom, EEPROM_BBP_VALUE);
7189                        rt2800_bbp_write(rt2x00dev, reg_id, value);
7190                }
7191        }
7192}
7193
7194static void rt2800_led_open_drain_enable(struct rt2x00_dev *rt2x00dev)
7195{
7196        u32 reg;
7197
7198        reg = rt2800_register_read(rt2x00dev, OPT_14_CSR);
7199        rt2x00_set_field32(&reg, OPT_14_CSR_BIT0, 1);
7200        rt2800_register_write(rt2x00dev, OPT_14_CSR, reg);
7201}
7202
7203static u8 rt2800_init_rx_filter(struct rt2x00_dev *rt2x00dev, bool bw40,
7204                                u8 filter_target)
7205{
7206        unsigned int i;
7207        u8 bbp;
7208        u8 rfcsr;
7209        u8 passband;
7210        u8 stopband;
7211        u8 overtuned = 0;
7212        u8 rfcsr24 = (bw40) ? 0x27 : 0x07;
7213
7214        rt2800_rfcsr_write(rt2x00dev, 24, rfcsr24);
7215
7216        bbp = rt2800_bbp_read(rt2x00dev, 4);
7217        rt2x00_set_field8(&bbp, BBP4_BANDWIDTH, 2 * bw40);
7218        rt2800_bbp_write(rt2x00dev, 4, bbp);
7219
7220        rfcsr = rt2800_rfcsr_read(rt2x00dev, 31);
7221        rt2x00_set_field8(&rfcsr, RFCSR31_RX_H20M, bw40);
7222        rt2800_rfcsr_write(rt2x00dev, 31, rfcsr);
7223
7224        rfcsr = rt2800_rfcsr_read(rt2x00dev, 22);
7225        rt2x00_set_field8(&rfcsr, RFCSR22_BASEBAND_LOOPBACK, 1);
7226        rt2800_rfcsr_write(rt2x00dev, 22, rfcsr);
7227
7228        /*
7229         * Set power & frequency of passband test tone
7230         */
7231        rt2800_bbp_write(rt2x00dev, 24, 0);
7232
7233        for (i = 0; i < 100; i++) {
7234                rt2800_bbp_write(rt2x00dev, 25, 0x90);
7235                msleep(1);
7236
7237                passband = rt2800_bbp_read(rt2x00dev, 55);
7238                if (passband)
7239                        break;
7240        }
7241
7242        /*
7243         * Set power & frequency of stopband test tone
7244         */
7245        rt2800_bbp_write(rt2x00dev, 24, 0x06);
7246
7247        for (i = 0; i < 100; i++) {
7248                rt2800_bbp_write(rt2x00dev, 25, 0x90);
7249                msleep(1);
7250
7251                stopband = rt2800_bbp_read(rt2x00dev, 55);
7252
7253                if ((passband - stopband) <= filter_target) {
7254                        rfcsr24++;
7255                        overtuned += ((passband - stopband) == filter_target);
7256                } else
7257                        break;
7258
7259                rt2800_rfcsr_write(rt2x00dev, 24, rfcsr24);
7260        }
7261
7262        rfcsr24 -= !!overtuned;
7263
7264        rt2800_rfcsr_write(rt2x00dev, 24, rfcsr24);
7265        return rfcsr24;
7266}
7267
7268static void rt2800_rf_init_calibration(struct rt2x00_dev *rt2x00dev,
7269                                       const unsigned int rf_reg)
7270{
7271        u8 rfcsr;
7272
7273        rfcsr = rt2800_rfcsr_read(rt2x00dev, rf_reg);
7274        rt2x00_set_field8(&rfcsr, FIELD8(0x80), 1);
7275        rt2800_rfcsr_write(rt2x00dev, rf_reg, rfcsr);
7276        msleep(1);
7277        rt2x00_set_field8(&rfcsr, FIELD8(0x80), 0);
7278        rt2800_rfcsr_write(rt2x00dev, rf_reg, rfcsr);
7279}
7280
7281static void rt2800_rx_filter_calibration(struct rt2x00_dev *rt2x00dev)
7282{
7283        struct rt2800_drv_data *drv_data = rt2x00dev->drv_data;
7284        u8 filter_tgt_bw20;
7285        u8 filter_tgt_bw40;
7286        u8 rfcsr, bbp;
7287
7288        /*
7289         * TODO: sync filter_tgt values with vendor driver
7290         */
7291        if (rt2x00_rt(rt2x00dev, RT3070)) {
7292                filter_tgt_bw20 = 0x16;
7293                filter_tgt_bw40 = 0x19;
7294        } else {
7295                filter_tgt_bw20 = 0x13;
7296                filter_tgt_bw40 = 0x15;
7297        }
7298
7299        drv_data->calibration_bw20 =
7300                rt2800_init_rx_filter(rt2x00dev, false, filter_tgt_bw20);
7301        drv_data->calibration_bw40 =
7302                rt2800_init_rx_filter(rt2x00dev, true, filter_tgt_bw40);
7303
7304        /*
7305         * Save BBP 25 & 26 values for later use in channel switching (for 3052)
7306         */
7307        drv_data->bbp25 = rt2800_bbp_read(rt2x00dev, 25);
7308        drv_data->bbp26 = rt2800_bbp_read(rt2x00dev, 26);
7309
7310        /*
7311         * Set back to initial state
7312         */
7313        rt2800_bbp_write(rt2x00dev, 24, 0);
7314
7315        rfcsr = rt2800_rfcsr_read(rt2x00dev, 22);
7316        rt2x00_set_field8(&rfcsr, RFCSR22_BASEBAND_LOOPBACK, 0);
7317        rt2800_rfcsr_write(rt2x00dev, 22, rfcsr);
7318
7319        /*
7320         * Set BBP back to BW20
7321         */
7322        bbp = rt2800_bbp_read(rt2x00dev, 4);
7323        rt2x00_set_field8(&bbp, BBP4_BANDWIDTH, 0);
7324        rt2800_bbp_write(rt2x00dev, 4, bbp);
7325}
7326
7327static void rt2800_normal_mode_setup_3xxx(struct rt2x00_dev *rt2x00dev)
7328{
7329        struct rt2800_drv_data *drv_data = rt2x00dev->drv_data;
7330        u8 min_gain, rfcsr, bbp;
7331        u16 eeprom;
7332
7333        rfcsr = rt2800_rfcsr_read(rt2x00dev, 17);
7334
7335        rt2x00_set_field8(&rfcsr, RFCSR17_TX_LO1_EN, 0);
7336        if (rt2x00_rt(rt2x00dev, RT3070) ||
7337            rt2x00_rt_rev_lt(rt2x00dev, RT3071, REV_RT3071E) ||
7338            rt2x00_rt_rev_lt(rt2x00dev, RT3090, REV_RT3090E) ||
7339            rt2x00_rt_rev_lt(rt2x00dev, RT3390, REV_RT3390E)) {
7340                if (!rt2x00_has_cap_external_lna_bg(rt2x00dev))
7341                        rt2x00_set_field8(&rfcsr, RFCSR17_R, 1);
7342        }
7343
7344        min_gain = rt2x00_rt(rt2x00dev, RT3070) ? 1 : 2;
7345        if (drv_data->txmixer_gain_24g >= min_gain) {
7346                rt2x00_set_field8(&rfcsr, RFCSR17_TXMIXER_GAIN,
7347                                  drv_data->txmixer_gain_24g);
7348        }
7349
7350        rt2800_rfcsr_write(rt2x00dev, 17, rfcsr);
7351
7352        if (rt2x00_rt(rt2x00dev, RT3090)) {
7353                /*  Turn off unused DAC1 and ADC1 to reduce power consumption */
7354                bbp = rt2800_bbp_read(rt2x00dev, 138);
7355                eeprom = rt2800_eeprom_read(rt2x00dev, EEPROM_NIC_CONF0);
7356                if (rt2x00_get_field16(eeprom, EEPROM_NIC_CONF0_RXPATH) == 1)
7357                        rt2x00_set_field8(&bbp, BBP138_RX_ADC1, 0);
7358                if (rt2x00_get_field16(eeprom, EEPROM_NIC_CONF0_TXPATH) == 1)
7359                        rt2x00_set_field8(&bbp, BBP138_TX_DAC1, 1);
7360                rt2800_bbp_write(rt2x00dev, 138, bbp);
7361        }
7362
7363        if (rt2x00_rt(rt2x00dev, RT3070)) {
7364                rfcsr = rt2800_rfcsr_read(rt2x00dev, 27);
7365                if (rt2x00_rt_rev_lt(rt2x00dev, RT3070, REV_RT3070F))
7366                        rt2x00_set_field8(&rfcsr, RFCSR27_R1, 3);
7367                else
7368                        rt2x00_set_field8(&rfcsr, RFCSR27_R1, 0);
7369                rt2x00_set_field8(&rfcsr, RFCSR27_R2, 0);
7370                rt2x00_set_field8(&rfcsr, RFCSR27_R3, 0);
7371                rt2x00_set_field8(&rfcsr, RFCSR27_R4, 0);
7372                rt2800_rfcsr_write(rt2x00dev, 27, rfcsr);
7373        } else if (rt2x00_rt(rt2x00dev, RT3071) ||
7374                   rt2x00_rt(rt2x00dev, RT3090) ||
7375                   rt2x00_rt(rt2x00dev, RT3390)) {
7376                rfcsr = rt2800_rfcsr_read(rt2x00dev, 1);
7377                rt2x00_set_field8(&rfcsr, RFCSR1_RF_BLOCK_EN, 1);
7378                rt2x00_set_field8(&rfcsr, RFCSR1_RX0_PD, 0);
7379                rt2x00_set_field8(&rfcsr, RFCSR1_TX0_PD, 0);
7380                rt2x00_set_field8(&rfcsr, RFCSR1_RX1_PD, 1);
7381                rt2x00_set_field8(&rfcsr, RFCSR1_TX1_PD, 1);
7382                rt2800_rfcsr_write(rt2x00dev, 1, rfcsr);
7383
7384                rfcsr = rt2800_rfcsr_read(rt2x00dev, 15);
7385                rt2x00_set_field8(&rfcsr, RFCSR15_TX_LO2_EN, 0);
7386                rt2800_rfcsr_write(rt2x00dev, 15, rfcsr);
7387
7388                rfcsr = rt2800_rfcsr_read(rt2x00dev, 20);
7389                rt2x00_set_field8(&rfcsr, RFCSR20_RX_LO1_EN, 0);
7390                rt2800_rfcsr_write(rt2x00dev, 20, rfcsr);
7391
7392                rfcsr = rt2800_rfcsr_read(rt2x00dev, 21);
7393                rt2x00_set_field8(&rfcsr, RFCSR21_RX_LO2_EN, 0);
7394                rt2800_rfcsr_write(rt2x00dev, 21, rfcsr);
7395        }
7396}
7397
7398static void rt2800_normal_mode_setup_3593(struct rt2x00_dev *rt2x00dev)
7399{
7400        struct rt2800_drv_data *drv_data = rt2x00dev->drv_data;
7401        u8 rfcsr;
7402        u8 tx_gain;
7403
7404        rfcsr = rt2800_rfcsr_read(rt2x00dev, 50);
7405        rt2x00_set_field8(&rfcsr, RFCSR50_TX_LO2_EN, 0);
7406        rt2800_rfcsr_write(rt2x00dev, 50, rfcsr);
7407
7408        rfcsr = rt2800_rfcsr_read(rt2x00dev, 51);
7409        tx_gain = rt2x00_get_field8(drv_data->txmixer_gain_24g,
7410                                    RFCSR17_TXMIXER_GAIN);
7411        rt2x00_set_field8(&rfcsr, RFCSR51_BITS24, tx_gain);
7412        rt2800_rfcsr_write(rt2x00dev, 51, rfcsr);
7413
7414        rfcsr = rt2800_rfcsr_read(rt2x00dev, 38);
7415        rt2x00_set_field8(&rfcsr, RFCSR38_RX_LO1_EN, 0);
7416        rt2800_rfcsr_write(rt2x00dev, 38, rfcsr);
7417
7418        rfcsr = rt2800_rfcsr_read(rt2x00dev, 39);
7419        rt2x00_set_field8(&rfcsr, RFCSR39_RX_LO2_EN, 0);
7420        rt2800_rfcsr_write(rt2x00dev, 39, rfcsr);
7421
7422        rfcsr = rt2800_rfcsr_read(rt2x00dev, 1);
7423        rt2x00_set_field8(&rfcsr, RFCSR1_RF_BLOCK_EN, 1);
7424        rt2x00_set_field8(&rfcsr, RFCSR1_PLL_PD, 1);
7425        rt2800_rfcsr_write(rt2x00dev, 1, rfcsr);
7426
7427        rfcsr = rt2800_rfcsr_read(rt2x00dev, 30);
7428        rt2x00_set_field8(&rfcsr, RFCSR30_RX_VCM, 2);
7429        rt2800_rfcsr_write(rt2x00dev, 30, rfcsr);
7430
7431        /* TODO: enable stream mode */
7432}
7433
7434static void rt2800_normal_mode_setup_5xxx(struct rt2x00_dev *rt2x00dev)
7435{
7436        u8 reg;
7437        u16 eeprom;
7438
7439        /*  Turn off unused DAC1 and ADC1 to reduce power consumption */
7440        reg = rt2800_bbp_read(rt2x00dev, 138);
7441        eeprom = rt2800_eeprom_read(rt2x00dev, EEPROM_NIC_CONF0);
7442        if (rt2x00_get_field16(eeprom, EEPROM_NIC_CONF0_RXPATH) == 1)
7443                rt2x00_set_field8(&reg, BBP138_RX_ADC1, 0);
7444        if (rt2x00_get_field16(eeprom, EEPROM_NIC_CONF0_TXPATH) == 1)
7445                rt2x00_set_field8(&reg, BBP138_TX_DAC1, 1);
7446        rt2800_bbp_write(rt2x00dev, 138, reg);
7447
7448        reg = rt2800_rfcsr_read(rt2x00dev, 38);
7449        rt2x00_set_field8(&reg, RFCSR38_RX_LO1_EN, 0);
7450        rt2800_rfcsr_write(rt2x00dev, 38, reg);
7451
7452        reg = rt2800_rfcsr_read(rt2x00dev, 39);
7453        rt2x00_set_field8(&reg, RFCSR39_RX_LO2_EN, 0);
7454        rt2800_rfcsr_write(rt2x00dev, 39, reg);
7455
7456        rt2800_bbp4_mac_if_ctrl(rt2x00dev);
7457
7458        reg = rt2800_rfcsr_read(rt2x00dev, 30);
7459        rt2x00_set_field8(&reg, RFCSR30_RX_VCM, 2);
7460        rt2800_rfcsr_write(rt2x00dev, 30, reg);
7461}
7462
7463static void rt2800_init_rfcsr_305x_soc(struct rt2x00_dev *rt2x00dev)
7464{
7465        rt2800_rf_init_calibration(rt2x00dev, 30);
7466
7467        rt2800_rfcsr_write(rt2x00dev, 0, 0x50);
7468        rt2800_rfcsr_write(rt2x00dev, 1, 0x01);
7469        rt2800_rfcsr_write(rt2x00dev, 2, 0xf7);
7470        rt2800_rfcsr_write(rt2x00dev, 3, 0x75);
7471        rt2800_rfcsr_write(rt2x00dev, 4, 0x40);
7472        rt2800_rfcsr_write(rt2x00dev, 5, 0x03);
7473        rt2800_rfcsr_write(rt2x00dev, 6, 0x02);
7474        rt2800_rfcsr_write(rt2x00dev, 7, 0x50);
7475        rt2800_rfcsr_write(rt2x00dev, 8, 0x39);
7476        rt2800_rfcsr_write(rt2x00dev, 9, 0x0f);
7477        rt2800_rfcsr_write(rt2x00dev, 10, 0x60);
7478        rt2800_rfcsr_write(rt2x00dev, 11, 0x21);
7479        rt2800_rfcsr_write(rt2x00dev, 12, 0x75);
7480        rt2800_rfcsr_write(rt2x00dev, 13, 0x75);
7481        rt2800_rfcsr_write(rt2x00dev, 14, 0x90);
7482        rt2800_rfcsr_write(rt2x00dev, 15, 0x58);
7483        rt2800_rfcsr_write(rt2x00dev, 16, 0xb3);
7484        rt2800_rfcsr_write(rt2x00dev, 17, 0x92);
7485        rt2800_rfcsr_write(rt2x00dev, 18, 0x2c);
7486        rt2800_rfcsr_write(rt2x00dev, 19, 0x02);
7487        rt2800_rfcsr_write(rt2x00dev, 20, 0xba);
7488        rt2800_rfcsr_write(rt2x00dev, 21, 0xdb);
7489        rt2800_rfcsr_write(rt2x00dev, 22, 0x00);
7490        rt2800_rfcsr_write(rt2x00dev, 23, 0x31);
7491        rt2800_rfcsr_write(rt2x00dev, 24, 0x08);
7492        rt2800_rfcsr_write(rt2x00dev, 25, 0x01);
7493        rt2800_rfcsr_write(rt2x00dev, 26, 0x25);
7494        rt2800_rfcsr_write(rt2x00dev, 27, 0x23);
7495        rt2800_rfcsr_write(rt2x00dev, 28, 0x13);
7496        rt2800_rfcsr_write(rt2x00dev, 29, 0x83);
7497        rt2800_rfcsr_write(rt2x00dev, 30, 0x00);
7498        rt2800_rfcsr_write(rt2x00dev, 31, 0x00);
7499}
7500
7501static void rt2800_init_rfcsr_30xx(struct rt2x00_dev *rt2x00dev)
7502{
7503        u8 rfcsr;
7504        u16 eeprom;
7505        u32 reg;
7506
7507        /* XXX vendor driver do this only for 3070 */
7508        rt2800_rf_init_calibration(rt2x00dev, 30);
7509
7510        rt2800_rfcsr_write(rt2x00dev, 4, 0x40);
7511        rt2800_rfcsr_write(rt2x00dev, 5, 0x03);
7512        rt2800_rfcsr_write(rt2x00dev, 6, 0x02);
7513        rt2800_rfcsr_write(rt2x00dev, 7, 0x60);
7514        rt2800_rfcsr_write(rt2x00dev, 9, 0x0f);
7515        rt2800_rfcsr_write(rt2x00dev, 10, 0x41);
7516        rt2800_rfcsr_write(rt2x00dev, 11, 0x21);
7517        rt2800_rfcsr_write(rt2x00dev, 12, 0x7b);
7518        rt2800_rfcsr_write(rt2x00dev, 14, 0x90);
7519        rt2800_rfcsr_write(rt2x00dev, 15, 0x58);
7520        rt2800_rfcsr_write(rt2x00dev, 16, 0xb3);
7521        rt2800_rfcsr_write(rt2x00dev, 17, 0x92);
7522        rt2800_rfcsr_write(rt2x00dev, 18, 0x2c);
7523        rt2800_rfcsr_write(rt2x00dev, 19, 0x02);
7524        rt2800_rfcsr_write(rt2x00dev, 20, 0xba);
7525        rt2800_rfcsr_write(rt2x00dev, 21, 0xdb);
7526        rt2800_rfcsr_write(rt2x00dev, 24, 0x16);
7527        rt2800_rfcsr_write(rt2x00dev, 25, 0x03);
7528        rt2800_rfcsr_write(rt2x00dev, 29, 0x1f);
7529
7530        if (rt2x00_rt_rev_lt(rt2x00dev, RT3070, REV_RT3070F)) {
7531                reg = rt2800_register_read(rt2x00dev, LDO_CFG0);
7532                rt2x00_set_field32(&reg, LDO_CFG0_BGSEL, 1);
7533                rt2x00_set_field32(&reg, LDO_CFG0_LDO_CORE_VLEVEL, 3);
7534                rt2800_register_write(rt2x00dev, LDO_CFG0, reg);
7535        } else if (rt2x00_rt(rt2x00dev, RT3071) ||
7536                   rt2x00_rt(rt2x00dev, RT3090)) {
7537                rt2800_rfcsr_write(rt2x00dev, 31, 0x14);
7538
7539                rfcsr = rt2800_rfcsr_read(rt2x00dev, 6);
7540                rt2x00_set_field8(&rfcsr, RFCSR6_R2, 1);
7541                rt2800_rfcsr_write(rt2x00dev, 6, rfcsr);
7542
7543                reg = rt2800_register_read(rt2x00dev, LDO_CFG0);
7544                rt2x00_set_field32(&reg, LDO_CFG0_BGSEL, 1);
7545                if (rt2x00_rt_rev_lt(rt2x00dev, RT3071, REV_RT3071E) ||
7546                    rt2x00_rt_rev_lt(rt2x00dev, RT3090, REV_RT3090E)) {
7547                        eeprom = rt2800_eeprom_read(rt2x00dev, EEPROM_NIC_CONF1);
7548                        if (rt2x00_get_field16(eeprom, EEPROM_NIC_CONF1_DAC_TEST))
7549                                rt2x00_set_field32(&reg, LDO_CFG0_LDO_CORE_VLEVEL, 3);
7550                        else
7551                                rt2x00_set_field32(&reg, LDO_CFG0_LDO_CORE_VLEVEL, 0);
7552                }
7553                rt2800_register_write(rt2x00dev, LDO_CFG0, reg);
7554
7555                reg = rt2800_register_read(rt2x00dev, GPIO_SWITCH);
7556                rt2x00_set_field32(&reg, GPIO_SWITCH_5, 0);
7557                rt2800_register_write(rt2x00dev, GPIO_SWITCH, reg);
7558        }
7559
7560        rt2800_rx_filter_calibration(rt2x00dev);
7561
7562        if (rt2x00_rt_rev_lt(rt2x00dev, RT3070, REV_RT3070F) ||
7563            rt2x00_rt_rev_lt(rt2x00dev, RT3071, REV_RT3071E) ||
7564            rt2x00_rt_rev_lt(rt2x00dev, RT3090, REV_RT3090E))
7565                rt2800_rfcsr_write(rt2x00dev, 27, 0x03);
7566
7567        rt2800_led_open_drain_enable(rt2x00dev);
7568        rt2800_normal_mode_setup_3xxx(rt2x00dev);
7569}
7570
7571static void rt2800_init_rfcsr_3290(struct rt2x00_dev *rt2x00dev)
7572{
7573        u8 rfcsr;
7574
7575        rt2800_rf_init_calibration(rt2x00dev, 2);
7576
7577        rt2800_rfcsr_write(rt2x00dev, 1, 0x0f);
7578        rt2800_rfcsr_write(rt2x00dev, 2, 0x80);
7579        rt2800_rfcsr_write(rt2x00dev, 3, 0x08);
7580        rt2800_rfcsr_write(rt2x00dev, 4, 0x00);
7581        rt2800_rfcsr_write(rt2x00dev, 6, 0xa0);
7582        rt2800_rfcsr_write(rt2x00dev, 8, 0xf3);
7583        rt2800_rfcsr_write(rt2x00dev, 9, 0x02);
7584        rt2800_rfcsr_write(rt2x00dev, 10, 0x53);
7585        rt2800_rfcsr_write(rt2x00dev, 11, 0x4a);
7586        rt2800_rfcsr_write(rt2x00dev, 12, 0x46);
7587        rt2800_rfcsr_write(rt2x00dev, 13, 0x9f);
7588        rt2800_rfcsr_write(rt2x00dev, 18, 0x02);
7589        rt2800_rfcsr_write(rt2x00dev, 22, 0x20);
7590        rt2800_rfcsr_write(rt2x00dev, 25, 0x83);
7591        rt2800_rfcsr_write(rt2x00dev, 26, 0x82);
7592        rt2800_rfcsr_write(rt2x00dev, 27, 0x09);
7593        rt2800_rfcsr_write(rt2x00dev, 29, 0x10);
7594        rt2800_rfcsr_write(rt2x00dev, 30, 0x10);
7595        rt2800_rfcsr_write(rt2x00dev, 31, 0x80);
7596        rt2800_rfcsr_write(rt2x00dev, 32, 0x80);
7597        rt2800_rfcsr_write(rt2x00dev, 33, 0x00);
7598        rt2800_rfcsr_write(rt2x00dev, 34, 0x05);
7599        rt2800_rfcsr_write(rt2x00dev, 35, 0x12);
7600        rt2800_rfcsr_write(rt2x00dev, 36, 0x00);
7601        rt2800_rfcsr_write(rt2x00dev, 38, 0x85);
7602        rt2800_rfcsr_write(rt2x00dev, 39, 0x1b);
7603        rt2800_rfcsr_write(rt2x00dev, 40, 0x0b);
7604        rt2800_rfcsr_write(rt2x00dev, 41, 0xbb);
7605        rt2800_rfcsr_write(rt2x00dev, 42, 0xd5);
7606        rt2800_rfcsr_write(rt2x00dev, 43, 0x7b);
7607        rt2800_rfcsr_write(rt2x00dev, 44, 0x0e);
7608        rt2800_rfcsr_write(rt2x00dev, 45, 0xa2);
7609        rt2800_rfcsr_write(rt2x00dev, 46, 0x73);
7610        rt2800_rfcsr_write(rt2x00dev, 47, 0x00);
7611        rt2800_rfcsr_write(rt2x00dev, 48, 0x10);
7612        rt2800_rfcsr_write(rt2x00dev, 49, 0x98);
7613        rt2800_rfcsr_write(rt2x00dev, 52, 0x38);
7614        rt2800_rfcsr_write(rt2x00dev, 53, 0x00);
7615        rt2800_rfcsr_write(rt2x00dev, 54, 0x78);
7616        rt2800_rfcsr_write(rt2x00dev, 55, 0x43);
7617        rt2800_rfcsr_write(rt2x00dev, 56, 0x02);
7618        rt2800_rfcsr_write(rt2x00dev, 57, 0x80);
7619        rt2800_rfcsr_write(rt2x00dev, 58, 0x7f);
7620        rt2800_rfcsr_write(rt2x00dev, 59, 0x09);
7621        rt2800_rfcsr_write(rt2x00dev, 60, 0x45);
7622        rt2800_rfcsr_write(rt2x00dev, 61, 0xc1);
7623
7624        rfcsr = rt2800_rfcsr_read(rt2x00dev, 29);
7625        rt2x00_set_field8(&rfcsr, RFCSR29_RSSI_GAIN, 3);
7626        rt2800_rfcsr_write(rt2x00dev, 29, rfcsr);
7627
7628        rt2800_led_open_drain_enable(rt2x00dev);
7629        rt2800_normal_mode_setup_3xxx(rt2x00dev);
7630}
7631
7632static void rt2800_init_rfcsr_3352(struct rt2x00_dev *rt2x00dev)
7633{
7634        int tx0_ext_pa = test_bit(CAPABILITY_EXTERNAL_PA_TX0,
7635                                  &rt2x00dev->cap_flags);
7636        int tx1_ext_pa = test_bit(CAPABILITY_EXTERNAL_PA_TX1,
7637                                  &rt2x00dev->cap_flags);
7638        u8 rfcsr;
7639
7640        rt2800_rf_init_calibration(rt2x00dev, 30);
7641
7642        rt2800_rfcsr_write(rt2x00dev, 0, 0xf0);
7643        rt2800_rfcsr_write(rt2x00dev, 1, 0x23);
7644        rt2800_rfcsr_write(rt2x00dev, 2, 0x50);
7645        rt2800_rfcsr_write(rt2x00dev, 3, 0x18);
7646        rt2800_rfcsr_write(rt2x00dev, 4, 0x00);
7647        rt2800_rfcsr_write(rt2x00dev, 5, 0x00);
7648        rt2800_rfcsr_write(rt2x00dev, 6, 0x33);
7649        rt2800_rfcsr_write(rt2x00dev, 7, 0x00);
7650        rt2800_rfcsr_write(rt2x00dev, 8, 0xf1);
7651        rt2800_rfcsr_write(rt2x00dev, 9, 0x02);
7652        rt2800_rfcsr_write(rt2x00dev, 10, 0xd2);
7653        rt2800_rfcsr_write(rt2x00dev, 11, 0x42);
7654        rt2800_rfcsr_write(rt2x00dev, 12, 0x1c);
7655        rt2800_rfcsr_write(rt2x00dev, 13, 0x00);
7656        rt2800_rfcsr_write(rt2x00dev, 14, 0x5a);
7657        rt2800_rfcsr_write(rt2x00dev, 15, 0x00);
7658        rt2800_rfcsr_write(rt2x00dev, 16, 0x01);
7659        rt2800_rfcsr_write(rt2x00dev, 18, 0x45);
7660        rt2800_rfcsr_write(rt2x00dev, 19, 0x02);
7661        rt2800_rfcsr_write(rt2x00dev, 20, 0x00);
7662        rt2800_rfcsr_write(rt2x00dev, 21, 0x00);
7663        rt2800_rfcsr_write(rt2x00dev, 22, 0x00);
7664        rt2800_rfcsr_write(rt2x00dev, 23, 0x00);
7665        rt2800_rfcsr_write(rt2x00dev, 24, 0x00);
7666        rt2800_rfcsr_write(rt2x00dev, 25, 0x80);
7667        rt2800_rfcsr_write(rt2x00dev, 26, 0x00);
7668        rt2800_rfcsr_write(rt2x00dev, 27, 0x03);
7669        rt2800_rfcsr_write(rt2x00dev, 28, 0x03);
7670        rt2800_rfcsr_write(rt2x00dev, 29, 0x00);
7671        rt2800_rfcsr_write(rt2x00dev, 30, 0x10);
7672        rt2800_rfcsr_write(rt2x00dev, 31, 0x80);
7673        rt2800_rfcsr_write(rt2x00dev, 32, 0x80);
7674        rt2800_rfcsr_write(rt2x00dev, 33, 0x00);
7675        rfcsr = 0x01;
7676        if (tx0_ext_pa)
7677                rt2x00_set_field8(&rfcsr, RFCSR34_TX0_EXT_PA, 1);
7678        if (tx1_ext_pa)
7679                rt2x00_set_field8(&rfcsr, RFCSR34_TX1_EXT_PA, 1);
7680        rt2800_rfcsr_write(rt2x00dev, 34, rfcsr);
7681        rt2800_rfcsr_write(rt2x00dev, 35, 0x03);
7682        rt2800_rfcsr_write(rt2x00dev, 36, 0xbd);
7683        rt2800_rfcsr_write(rt2x00dev, 37, 0x3c);
7684        rt2800_rfcsr_write(rt2x00dev, 38, 0x5f);
7685        rt2800_rfcsr_write(rt2x00dev, 39, 0xc5);
7686        rt2800_rfcsr_write(rt2x00dev, 40, 0x33);
7687        rfcsr = 0x52;
7688        if (!tx0_ext_pa) {
7689                rt2x00_set_field8(&rfcsr, RFCSR41_BIT1, 1);
7690                rt2x00_set_field8(&rfcsr, RFCSR41_BIT4, 1);
7691        }
7692        rt2800_rfcsr_write(rt2x00dev, 41, rfcsr);
7693        rfcsr = 0x52;
7694        if (!tx1_ext_pa) {
7695                rt2x00_set_field8(&rfcsr, RFCSR42_BIT1, 1);
7696                rt2x00_set_field8(&rfcsr, RFCSR42_BIT4, 1);
7697        }
7698        rt2800_rfcsr_write(rt2x00dev, 42, rfcsr);
7699        rt2800_rfcsr_write(rt2x00dev, 43, 0xdb);
7700        rt2800_rfcsr_write(rt2x00dev, 44, 0xdb);
7701        rt2800_rfcsr_write(rt2x00dev, 45, 0xdb);
7702        rt2800_rfcsr_write(rt2x00dev, 46, 0xdd);
7703        rt2800_rfcsr_write(rt2x00dev, 47, 0x0d);
7704        rt2800_rfcsr_write(rt2x00dev, 48, 0x14);
7705        rt2800_rfcsr_write(rt2x00dev, 49, 0x00);
7706        rfcsr = 0x2d;
7707        if (tx0_ext_pa)
7708                rt2x00_set_field8(&rfcsr, RFCSR50_TX0_EXT_PA, 1);
7709        if (tx1_ext_pa)
7710                rt2x00_set_field8(&rfcsr, RFCSR50_TX1_EXT_PA, 1);
7711        rt2800_rfcsr_write(rt2x00dev, 50, rfcsr);
7712        rt2800_rfcsr_write(rt2x00dev, 51, (tx0_ext_pa ? 0x52 : 0x7f));
7713        rt2800_rfcsr_write(rt2x00dev, 52, (tx0_ext_pa ? 0xc0 : 0x00));
7714        rt2800_rfcsr_write(rt2x00dev, 53, (tx0_ext_pa ? 0xd2 : 0x52));
7715        rt2800_rfcsr_write(rt2x00dev, 54, (tx0_ext_pa ? 0xc0 : 0x1b));
7716        rt2800_rfcsr_write(rt2x00dev, 55, (tx1_ext_pa ? 0x52 : 0x7f));
7717        rt2800_rfcsr_write(rt2x00dev, 56, (tx1_ext_pa ? 0xc0 : 0x00));
7718        rt2800_rfcsr_write(rt2x00dev, 57, (tx0_ext_pa ? 0x49 : 0x52));
7719        rt2800_rfcsr_write(rt2x00dev, 58, (tx1_ext_pa ? 0xc0 : 0x1b));
7720        rt2800_rfcsr_write(rt2x00dev, 59, 0x00);
7721        rt2800_rfcsr_write(rt2x00dev, 60, 0x00);
7722        rt2800_rfcsr_write(rt2x00dev, 61, 0x00);
7723        rt2800_rfcsr_write(rt2x00dev, 62, 0x00);
7724        rt2800_rfcsr_write(rt2x00dev, 63, 0x00);
7725
7726        rt2800_rx_filter_calibration(rt2x00dev);
7727        rt2800_led_open_drain_enable(rt2x00dev);
7728        rt2800_normal_mode_setup_3xxx(rt2x00dev);
7729}
7730
7731static void rt2800_init_rfcsr_3390(struct rt2x00_dev *rt2x00dev)
7732{
7733        u32 reg;
7734
7735        rt2800_rf_init_calibration(rt2x00dev, 30);
7736
7737        rt2800_rfcsr_write(rt2x00dev, 0, 0xa0);
7738        rt2800_rfcsr_write(rt2x00dev, 1, 0xe1);
7739        rt2800_rfcsr_write(rt2x00dev, 2, 0xf1);
7740        rt2800_rfcsr_write(rt2x00dev, 3, 0x62);
7741        rt2800_rfcsr_write(rt2x00dev, 4, 0x40);
7742        rt2800_rfcsr_write(rt2x00dev, 5, 0x8b);
7743        rt2800_rfcsr_write(rt2x00dev, 6, 0x42);
7744        rt2800_rfcsr_write(rt2x00dev, 7, 0x34);
7745        rt2800_rfcsr_write(rt2x00dev, 8, 0x00);
7746        rt2800_rfcsr_write(rt2x00dev, 9, 0xc0);
7747        rt2800_rfcsr_write(rt2x00dev, 10, 0x61);
7748        rt2800_rfcsr_write(rt2x00dev, 11, 0x21);
7749        rt2800_rfcsr_write(rt2x00dev, 12, 0x3b);
7750        rt2800_rfcsr_write(rt2x00dev, 13, 0xe0);
7751        rt2800_rfcsr_write(rt2x00dev, 14, 0x90);
7752        rt2800_rfcsr_write(rt2x00dev, 15, 0x53);
7753        rt2800_rfcsr_write(rt2x00dev, 16, 0xe0);
7754        rt2800_rfcsr_write(rt2x00dev, 17, 0x94);
7755        rt2800_rfcsr_write(rt2x00dev, 18, 0x5c);
7756        rt2800_rfcsr_write(rt2x00dev, 19, 0x4a);
7757        rt2800_rfcsr_write(rt2x00dev, 20, 0xb2);
7758        rt2800_rfcsr_write(rt2x00dev, 21, 0xf6);
7759        rt2800_rfcsr_write(rt2x00dev, 22, 0x00);
7760        rt2800_rfcsr_write(rt2x00dev, 23, 0x14);
7761        rt2800_rfcsr_write(rt2x00dev, 24, 0x08);
7762        rt2800_rfcsr_write(rt2x00dev, 25, 0x3d);
7763        rt2800_rfcsr_write(rt2x00dev, 26, 0x85);
7764        rt2800_rfcsr_write(rt2x00dev, 27, 0x00);
7765        rt2800_rfcsr_write(rt2x00dev, 28, 0x41);
7766        rt2800_rfcsr_write(rt2x00dev, 29, 0x8f);
7767        rt2800_rfcsr_write(rt2x00dev, 30, 0x20);
7768        rt2800_rfcsr_write(rt2x00dev, 31, 0x0f);
7769
7770        reg = rt2800_register_read(rt2x00dev, GPIO_SWITCH);
7771        rt2x00_set_field32(&reg, GPIO_SWITCH_5, 0);
7772        rt2800_register_write(rt2x00dev, GPIO_SWITCH, reg);
7773
7774        rt2800_rx_filter_calibration(rt2x00dev);
7775
7776        if (rt2x00_rt_rev_lt(rt2x00dev, RT3390, REV_RT3390E))
7777                rt2800_rfcsr_write(rt2x00dev, 27, 0x03);
7778
7779        rt2800_led_open_drain_enable(rt2x00dev);
7780        rt2800_normal_mode_setup_3xxx(rt2x00dev);
7781}
7782
7783static void rt2800_init_rfcsr_3572(struct rt2x00_dev *rt2x00dev)
7784{
7785        u8 rfcsr;
7786        u32 reg;
7787
7788        rt2800_rf_init_calibration(rt2x00dev, 30);
7789
7790        rt2800_rfcsr_write(rt2x00dev, 0, 0x70);
7791        rt2800_rfcsr_write(rt2x00dev, 1, 0x81);
7792        rt2800_rfcsr_write(rt2x00dev, 2, 0xf1);
7793        rt2800_rfcsr_write(rt2x00dev, 3, 0x02);
7794        rt2800_rfcsr_write(rt2x00dev, 4, 0x4c);
7795        rt2800_rfcsr_write(rt2x00dev, 5, 0x05);
7796        rt2800_rfcsr_write(rt2x00dev, 6, 0x4a);
7797        rt2800_rfcsr_write(rt2x00dev, 7, 0xd8);
7798        rt2800_rfcsr_write(rt2x00dev, 9, 0xc3);
7799        rt2800_rfcsr_write(rt2x00dev, 10, 0xf1);
7800        rt2800_rfcsr_write(rt2x00dev, 11, 0xb9);
7801        rt2800_rfcsr_write(rt2x00dev, 12, 0x70);
7802        rt2800_rfcsr_write(rt2x00dev, 13, 0x65);
7803        rt2800_rfcsr_write(rt2x00dev, 14, 0xa0);
7804        rt2800_rfcsr_write(rt2x00dev, 15, 0x53);
7805        rt2800_rfcsr_write(rt2x00dev, 16, 0x4c);
7806        rt2800_rfcsr_write(rt2x00dev, 17, 0x23);
7807        rt2800_rfcsr_write(rt2x00dev, 18, 0xac);
7808        rt2800_rfcsr_write(rt2x00dev, 19, 0x93);
7809        rt2800_rfcsr_write(rt2x00dev, 20, 0xb3);
7810        rt2800_rfcsr_write(rt2x00dev, 21, 0xd0);
7811        rt2800_rfcsr_write(rt2x00dev, 22, 0x00);
7812        rt2800_rfcsr_write(rt2x00dev, 23, 0x3c);
7813        rt2800_rfcsr_write(rt2x00dev, 24, 0x16);
7814        rt2800_rfcsr_write(rt2x00dev, 25, 0x15);
7815        rt2800_rfcsr_write(rt2x00dev, 26, 0x85);
7816        rt2800_rfcsr_write(rt2x00dev, 27, 0x00);
7817        rt2800_rfcsr_write(rt2x00dev, 28, 0x00);
7818        rt2800_rfcsr_write(rt2x00dev, 29, 0x9b);
7819        rt2800_rfcsr_write(rt2x00dev, 30, 0x09);
7820        rt2800_rfcsr_write(rt2x00dev, 31, 0x10);
7821
7822        rfcsr = rt2800_rfcsr_read(rt2x00dev, 6);
7823        rt2x00_set_field8(&rfcsr, RFCSR6_R2, 1);
7824        rt2800_rfcsr_write(rt2x00dev, 6, rfcsr);
7825
7826        reg = rt2800_register_read(rt2x00dev, LDO_CFG0);
7827        rt2x00_set_field32(&reg, LDO_CFG0_LDO_CORE_VLEVEL, 3);
7828        rt2x00_set_field32(&reg, LDO_CFG0_BGSEL, 1);
7829        rt2800_register_write(rt2x00dev, LDO_CFG0, reg);
7830        msleep(1);
7831        reg = rt2800_register_read(rt2x00dev, LDO_CFG0);
7832        rt2x00_set_field32(&reg, LDO_CFG0_LDO_CORE_VLEVEL, 0);
7833        rt2x00_set_field32(&reg, LDO_CFG0_BGSEL, 1);
7834        rt2800_register_write(rt2x00dev, LDO_CFG0, reg);
7835
7836        rt2800_rx_filter_calibration(rt2x00dev);
7837        rt2800_led_open_drain_enable(rt2x00dev);
7838        rt2800_normal_mode_setup_3xxx(rt2x00dev);
7839}
7840
7841static void rt3593_post_bbp_init(struct rt2x00_dev *rt2x00dev)
7842{
7843        u8 bbp;
7844        bool txbf_enabled = false; /* FIXME */
7845
7846        bbp = rt2800_bbp_read(rt2x00dev, 105);
7847        if (rt2x00dev->default_ant.rx_chain_num == 1)
7848                rt2x00_set_field8(&bbp, BBP105_MLD, 0);
7849        else
7850                rt2x00_set_field8(&bbp, BBP105_MLD, 1);
7851        rt2800_bbp_write(rt2x00dev, 105, bbp);
7852
7853        rt2800_bbp4_mac_if_ctrl(rt2x00dev);
7854
7855        rt2800_bbp_write(rt2x00dev, 92, 0x02);
7856        rt2800_bbp_write(rt2x00dev, 82, 0x82);
7857        rt2800_bbp_write(rt2x00dev, 106, 0x05);
7858        rt2800_bbp_write(rt2x00dev, 104, 0x92);
7859        rt2800_bbp_write(rt2x00dev, 88, 0x90);
7860        rt2800_bbp_write(rt2x00dev, 148, 0xc8);
7861        rt2800_bbp_write(rt2x00dev, 47, 0x48);
7862        rt2800_bbp_write(rt2x00dev, 120, 0x50);
7863
7864        if (txbf_enabled)
7865                rt2800_bbp_write(rt2x00dev, 163, 0xbd);
7866        else
7867                rt2800_bbp_write(rt2x00dev, 163, 0x9d);
7868
7869        /* SNR mapping */
7870        rt2800_bbp_write(rt2x00dev, 142, 6);
7871        rt2800_bbp_write(rt2x00dev, 143, 160);
7872        rt2800_bbp_write(rt2x00dev, 142, 7);
7873        rt2800_bbp_write(rt2x00dev, 143, 161);
7874        rt2800_bbp_write(rt2x00dev, 142, 8);
7875        rt2800_bbp_write(rt2x00dev, 143, 162);
7876
7877        /* ADC/DAC control */
7878        rt2800_bbp_write(rt2x00dev, 31, 0x08);
7879
7880        /* RX AGC energy lower bound in log2 */
7881        rt2800_bbp_write(rt2x00dev, 68, 0x0b);
7882
7883        /* FIXME: BBP 105 owerwrite? */
7884        rt2800_bbp_write(rt2x00dev, 105, 0x04);
7885
7886}
7887
7888static void rt2800_init_rfcsr_3593(struct rt2x00_dev *rt2x00dev)
7889{
7890        struct rt2800_drv_data *drv_data = rt2x00dev->drv_data;
7891        u32 reg;
7892        u8 rfcsr;
7893
7894        /* Disable GPIO #4 and #7 function for LAN PE control */
7895        reg = rt2800_register_read(rt2x00dev, GPIO_SWITCH);
7896        rt2x00_set_field32(&reg, GPIO_SWITCH_4, 0);
7897        rt2x00_set_field32(&reg, GPIO_SWITCH_7, 0);
7898        rt2800_register_write(rt2x00dev, GPIO_SWITCH, reg);
7899
7900        /* Initialize default register values */
7901        rt2800_rfcsr_write(rt2x00dev, 1, 0x03);
7902        rt2800_rfcsr_write(rt2x00dev, 3, 0x80);
7903        rt2800_rfcsr_write(rt2x00dev, 5, 0x00);
7904        rt2800_rfcsr_write(rt2x00dev, 6, 0x40);
7905        rt2800_rfcsr_write(rt2x00dev, 8, 0xf1);
7906        rt2800_rfcsr_write(rt2x00dev, 9, 0x02);
7907        rt2800_rfcsr_write(rt2x00dev, 10, 0xd3);
7908        rt2800_rfcsr_write(rt2x00dev, 11, 0x40);
7909        rt2800_rfcsr_write(rt2x00dev, 12, 0x4e);
7910        rt2800_rfcsr_write(rt2x00dev, 13, 0x12);
7911        rt2800_rfcsr_write(rt2x00dev, 18, 0x40);
7912        rt2800_rfcsr_write(rt2x00dev, 22, 0x20);
7913        rt2800_rfcsr_write(rt2x00dev, 30, 0x10);
7914        rt2800_rfcsr_write(rt2x00dev, 31, 0x80);
7915        rt2800_rfcsr_write(rt2x00dev, 32, 0x78);
7916        rt2800_rfcsr_write(rt2x00dev, 33, 0x3b);
7917        rt2800_rfcsr_write(rt2x00dev, 34, 0x3c);
7918        rt2800_rfcsr_write(rt2x00dev, 35, 0xe0);
7919        rt2800_rfcsr_write(rt2x00dev, 38, 0x86);
7920        rt2800_rfcsr_write(rt2x00dev, 39, 0x23);
7921        rt2800_rfcsr_write(rt2x00dev, 44, 0xd3);
7922        rt2800_rfcsr_write(rt2x00dev, 45, 0xbb);
7923        rt2800_rfcsr_write(rt2x00dev, 46, 0x60);
7924        rt2800_rfcsr_write(rt2x00dev, 49, 0x8e);
7925        rt2800_rfcsr_write(rt2x00dev, 50, 0x86);
7926        rt2800_rfcsr_write(rt2x00dev, 51, 0x75);
7927        rt2800_rfcsr_write(rt2x00dev, 52, 0x45);
7928        rt2800_rfcsr_write(rt2x00dev, 53, 0x18);
7929        rt2800_rfcsr_write(rt2x00dev, 54, 0x18);
7930        rt2800_rfcsr_write(rt2x00dev, 55, 0x18);
7931        rt2800_rfcsr_write(rt2x00dev, 56, 0xdb);
7932        rt2800_rfcsr_write(rt2x00dev, 57, 0x6e);
7933
7934        /* Initiate calibration */
7935        /* TODO: use rt2800_rf_init_calibration ? */
7936        rfcsr = rt2800_rfcsr_read(rt2x00dev, 2);
7937        rt2x00_set_field8(&rfcsr, RFCSR2_RESCAL_EN, 1);
7938        rt2800_rfcsr_write(rt2x00dev, 2, rfcsr);
7939
7940        rt2800_freq_cal_mode1(rt2x00dev);
7941
7942        rfcsr = rt2800_rfcsr_read(rt2x00dev, 18);
7943        rt2x00_set_field8(&rfcsr, RFCSR18_XO_TUNE_BYPASS, 1);
7944        rt2800_rfcsr_write(rt2x00dev, 18, rfcsr);
7945
7946        reg = rt2800_register_read(rt2x00dev, LDO_CFG0);
7947        rt2x00_set_field32(&reg, LDO_CFG0_LDO_CORE_VLEVEL, 3);
7948        rt2x00_set_field32(&reg, LDO_CFG0_BGSEL, 1);
7949        rt2800_register_write(rt2x00dev, LDO_CFG0, reg);
7950        usleep_range(1000, 1500);
7951        reg = rt2800_register_read(rt2x00dev, LDO_CFG0);
7952        rt2x00_set_field32(&reg, LDO_CFG0_LDO_CORE_VLEVEL, 0);
7953        rt2800_register_write(rt2x00dev, LDO_CFG0, reg);
7954
7955        /* Set initial values for RX filter calibration */
7956        drv_data->calibration_bw20 = 0x1f;
7957        drv_data->calibration_bw40 = 0x2f;
7958
7959        /* Save BBP 25 & 26 values for later use in channel switching */
7960        drv_data->bbp25 = rt2800_bbp_read(rt2x00dev, 25);
7961        drv_data->bbp26 = rt2800_bbp_read(rt2x00dev, 26);
7962
7963        rt2800_led_open_drain_enable(rt2x00dev);
7964        rt2800_normal_mode_setup_3593(rt2x00dev);
7965
7966        rt3593_post_bbp_init(rt2x00dev);
7967
7968        /* TODO: enable stream mode support */
7969}
7970
7971static void rt2800_init_rfcsr_5350(struct rt2x00_dev *rt2x00dev)
7972{
7973        rt2800_rfcsr_write(rt2x00dev, 0, 0xf0);
7974        rt2800_rfcsr_write(rt2x00dev, 1, 0x23);
7975        rt2800_rfcsr_write(rt2x00dev, 2, 0x50);
7976        rt2800_rfcsr_write(rt2x00dev, 3, 0x08);
7977        rt2800_rfcsr_write(rt2x00dev, 4, 0x49);
7978        rt2800_rfcsr_write(rt2x00dev, 5, 0x10);
7979        rt2800_rfcsr_write(rt2x00dev, 6, 0xe0);
7980        rt2800_rfcsr_write(rt2x00dev, 7, 0x00);
7981        rt2800_rfcsr_write(rt2x00dev, 8, 0xf1);
7982        rt2800_rfcsr_write(rt2x00dev, 9, 0x02);
7983        rt2800_rfcsr_write(rt2x00dev, 10, 0x53);
7984        rt2800_rfcsr_write(rt2x00dev, 11, 0x4a);
7985        rt2800_rfcsr_write(rt2x00dev, 12, 0x46);
7986        if (rt2800_clk_is_20mhz(rt2x00dev))
7987                rt2800_rfcsr_write(rt2x00dev, 13, 0x1f);
7988        else
7989                rt2800_rfcsr_write(rt2x00dev, 13, 0x9f);
7990        rt2800_rfcsr_write(rt2x00dev, 14, 0x00);
7991        rt2800_rfcsr_write(rt2x00dev, 15, 0x00);
7992        rt2800_rfcsr_write(rt2x00dev, 16, 0xc0);
7993        rt2800_rfcsr_write(rt2x00dev, 18, 0x03);
7994        rt2800_rfcsr_write(rt2x00dev, 19, 0x00);
7995        rt2800_rfcsr_write(rt2x00dev, 20, 0x00);
7996        rt2800_rfcsr_write(rt2x00dev, 21, 0x00);
7997        rt2800_rfcsr_write(rt2x00dev, 22, 0x20);
7998        rt2800_rfcsr_write(rt2x00dev, 23, 0x00);
7999        rt2800_rfcsr_write(rt2x00dev, 24, 0x00);
8000        rt2800_rfcsr_write(rt2x00dev, 25, 0x80);
8001        rt2800_rfcsr_write(rt2x00dev, 26, 0x00);
8002        rt2800_rfcsr_write(rt2x00dev, 27, 0x03);
8003        rt2800_rfcsr_write(rt2x00dev, 28, 0x00);
8004        rt2800_rfcsr_write(rt2x00dev, 29, 0xd0);
8005        rt2800_rfcsr_write(rt2x00dev, 30, 0x10);
8006        rt2800_rfcsr_write(rt2x00dev, 31, 0x80);
8007        rt2800_rfcsr_write(rt2x00dev, 32, 0x80);
8008        rt2800_rfcsr_write(rt2x00dev, 33, 0x00);
8009        rt2800_rfcsr_write(rt2x00dev, 34, 0x07);
8010        rt2800_rfcsr_write(rt2x00dev, 35, 0x12);
8011        rt2800_rfcsr_write(rt2x00dev, 36, 0x00);
8012        rt2800_rfcsr_write(rt2x00dev, 37, 0x08);
8013        rt2800_rfcsr_write(rt2x00dev, 38, 0x85);
8014        rt2800_rfcsr_write(rt2x00dev, 39, 0x1b);
8015        rt2800_rfcsr_write(rt2x00dev, 40, 0x0b);
8016        rt2800_rfcsr_write(rt2x00dev, 41, 0xbb);
8017        rt2800_rfcsr_write(rt2x00dev, 42, 0xd5);
8018        rt2800_rfcsr_write(rt2x00dev, 43, 0x9b);
8019        rt2800_rfcsr_write(rt2x00dev, 44, 0x0c);
8020        rt2800_rfcsr_write(rt2x00dev, 45, 0xa6);
8021        rt2800_rfcsr_write(rt2x00dev, 46, 0x73);
8022        rt2800_rfcsr_write(rt2x00dev, 47, 0x00);
8023        rt2800_rfcsr_write(rt2x00dev, 48, 0x10);
8024        rt2800_rfcsr_write(rt2x00dev, 49, 0x80);
8025        rt2800_rfcsr_write(rt2x00dev, 50, 0x00);
8026        rt2800_rfcsr_write(rt2x00dev, 51, 0x00);
8027        rt2800_rfcsr_write(rt2x00dev, 52, 0x38);
8028        rt2800_rfcsr_write(rt2x00dev, 53, 0x00);
8029        rt2800_rfcsr_write(rt2x00dev, 54, 0x38);
8030        rt2800_rfcsr_write(rt2x00dev, 55, 0x43);
8031        rt2800_rfcsr_write(rt2x00dev, 56, 0x82);
8032        rt2800_rfcsr_write(rt2x00dev, 57, 0x00);
8033        rt2800_rfcsr_write(rt2x00dev, 58, 0x39);
8034        rt2800_rfcsr_write(rt2x00dev, 59, 0x0b);
8035        rt2800_rfcsr_write(rt2x00dev, 60, 0x45);
8036        rt2800_rfcsr_write(rt2x00dev, 61, 0xd1);
8037        rt2800_rfcsr_write(rt2x00dev, 62, 0x00);
8038        rt2800_rfcsr_write(rt2x00dev, 63, 0x00);
8039}
8040
8041static void rt2800_init_rfcsr_3883(struct rt2x00_dev *rt2x00dev)
8042{
8043        u8 rfcsr;
8044
8045        /* TODO: get the actual ECO value from the SoC */
8046        const unsigned int eco = 5;
8047
8048        rt2800_rf_init_calibration(rt2x00dev, 2);
8049
8050        rt2800_rfcsr_write(rt2x00dev, 0, 0xe0);
8051        rt2800_rfcsr_write(rt2x00dev, 1, 0x03);
8052        rt2800_rfcsr_write(rt2x00dev, 2, 0x50);
8053        rt2800_rfcsr_write(rt2x00dev, 3, 0x20);
8054        rt2800_rfcsr_write(rt2x00dev, 4, 0x00);
8055        rt2800_rfcsr_write(rt2x00dev, 5, 0x00);
8056        rt2800_rfcsr_write(rt2x00dev, 6, 0x40);
8057        rt2800_rfcsr_write(rt2x00dev, 7, 0x00);
8058        rt2800_rfcsr_write(rt2x00dev, 8, 0x5b);
8059        rt2800_rfcsr_write(rt2x00dev, 9, 0x08);
8060        rt2800_rfcsr_write(rt2x00dev, 10, 0xd3);
8061        rt2800_rfcsr_write(rt2x00dev, 11, 0x48);
8062        rt2800_rfcsr_write(rt2x00dev, 12, 0x1a);
8063        rt2800_rfcsr_write(rt2x00dev, 13, 0x12);
8064        rt2800_rfcsr_write(rt2x00dev, 14, 0x00);
8065        rt2800_rfcsr_write(rt2x00dev, 15, 0x00);
8066        rt2800_rfcsr_write(rt2x00dev, 16, 0x00);
8067
8068        /* RFCSR 17 will be initialized later based on the
8069         * frequency offset stored in the EEPROM
8070         */
8071
8072        rt2800_rfcsr_write(rt2x00dev, 18, 0x40);
8073        rt2800_rfcsr_write(rt2x00dev, 19, 0x00);
8074        rt2800_rfcsr_write(rt2x00dev, 20, 0x00);
8075        rt2800_rfcsr_write(rt2x00dev, 21, 0x00);
8076        rt2800_rfcsr_write(rt2x00dev, 22, 0x20);
8077        rt2800_rfcsr_write(rt2x00dev, 23, 0xc0);
8078        rt2800_rfcsr_write(rt2x00dev, 24, 0x00);
8079        rt2800_rfcsr_write(rt2x00dev, 25, 0x00);
8080        rt2800_rfcsr_write(rt2x00dev, 26, 0x00);
8081        rt2800_rfcsr_write(rt2x00dev, 27, 0x00);
8082        rt2800_rfcsr_write(rt2x00dev, 28, 0x00);
8083        rt2800_rfcsr_write(rt2x00dev, 29, 0x00);
8084        rt2800_rfcsr_write(rt2x00dev, 30, 0x10);
8085        rt2800_rfcsr_write(rt2x00dev, 31, 0x80);
8086        rt2800_rfcsr_write(rt2x00dev, 32, 0x80);
8087        rt2800_rfcsr_write(rt2x00dev, 33, 0x00);
8088        rt2800_rfcsr_write(rt2x00dev, 34, 0x20);
8089        rt2800_rfcsr_write(rt2x00dev, 35, 0x00);
8090        rt2800_rfcsr_write(rt2x00dev, 36, 0x00);
8091        rt2800_rfcsr_write(rt2x00dev, 37, 0x00);
8092        rt2800_rfcsr_write(rt2x00dev, 38, 0x86);
8093        rt2800_rfcsr_write(rt2x00dev, 39, 0x23);
8094        rt2800_rfcsr_write(rt2x00dev, 40, 0x00);
8095        rt2800_rfcsr_write(rt2x00dev, 41, 0x00);
8096        rt2800_rfcsr_write(rt2x00dev, 42, 0x00);
8097        rt2800_rfcsr_write(rt2x00dev, 43, 0x00);
8098        rt2800_rfcsr_write(rt2x00dev, 44, 0x93);
8099        rt2800_rfcsr_write(rt2x00dev, 45, 0xbb);
8100        rt2800_rfcsr_write(rt2x00dev, 46, 0x60);
8101        rt2800_rfcsr_write(rt2x00dev, 47, 0x00);
8102        rt2800_rfcsr_write(rt2x00dev, 48, 0x00);
8103        rt2800_rfcsr_write(rt2x00dev, 49, 0x8e);
8104        rt2800_rfcsr_write(rt2x00dev, 50, 0x86);
8105        rt2800_rfcsr_write(rt2x00dev, 51, 0x51);
8106        rt2800_rfcsr_write(rt2x00dev, 52, 0x05);
8107        rt2800_rfcsr_write(rt2x00dev, 53, 0x76);
8108        rt2800_rfcsr_write(rt2x00dev, 54, 0x76);
8109        rt2800_rfcsr_write(rt2x00dev, 55, 0x76);
8110        rt2800_rfcsr_write(rt2x00dev, 56, 0xdb);
8111        rt2800_rfcsr_write(rt2x00dev, 57, 0x3e);
8112        rt2800_rfcsr_write(rt2x00dev, 58, 0x00);
8113        rt2800_rfcsr_write(rt2x00dev, 59, 0x00);
8114        rt2800_rfcsr_write(rt2x00dev, 60, 0x00);
8115        rt2800_rfcsr_write(rt2x00dev, 61, 0x00);
8116        rt2800_rfcsr_write(rt2x00dev, 62, 0x00);
8117        rt2800_rfcsr_write(rt2x00dev, 63, 0x00);
8118
8119        /* TODO: rx filter calibration? */
8120
8121        rt2800_bbp_write(rt2x00dev, 137, 0x0f);
8122
8123        rt2800_bbp_write(rt2x00dev, 163, 0x9d);
8124
8125        rt2800_bbp_write(rt2x00dev, 105, 0x05);
8126
8127        rt2800_bbp_write(rt2x00dev, 179, 0x02);
8128        rt2800_bbp_write(rt2x00dev, 180, 0x00);
8129        rt2800_bbp_write(rt2x00dev, 182, 0x40);
8130        rt2800_bbp_write(rt2x00dev, 180, 0x01);
8131        rt2800_bbp_write(rt2x00dev, 182, 0x9c);
8132
8133        rt2800_bbp_write(rt2x00dev, 179, 0x00);
8134
8135        rt2800_bbp_write(rt2x00dev, 142, 0x04);
8136        rt2800_bbp_write(rt2x00dev, 143, 0x3b);
8137        rt2800_bbp_write(rt2x00dev, 142, 0x06);
8138        rt2800_bbp_write(rt2x00dev, 143, 0xa0);
8139        rt2800_bbp_write(rt2x00dev, 142, 0x07);
8140        rt2800_bbp_write(rt2x00dev, 143, 0xa1);
8141        rt2800_bbp_write(rt2x00dev, 142, 0x08);
8142        rt2800_bbp_write(rt2x00dev, 143, 0xa2);
8143        rt2800_bbp_write(rt2x00dev, 148, 0xc8);
8144
8145        if (eco == 5) {
8146                rt2800_rfcsr_write(rt2x00dev, 32, 0xd8);
8147                rt2800_rfcsr_write(rt2x00dev, 33, 0x32);
8148        }
8149
8150        rfcsr = rt2800_rfcsr_read(rt2x00dev, 2);
8151        rt2x00_set_field8(&rfcsr, RFCSR2_RESCAL_BP, 0);
8152        rt2x00_set_field8(&rfcsr, RFCSR2_RESCAL_EN, 1);
8153        rt2800_rfcsr_write(rt2x00dev, 2, rfcsr);
8154        msleep(1);
8155        rt2x00_set_field8(&rfcsr, RFCSR2_RESCAL_EN, 0);
8156        rt2800_rfcsr_write(rt2x00dev, 2, rfcsr);
8157
8158        rfcsr = rt2800_rfcsr_read(rt2x00dev, 1);
8159        rt2x00_set_field8(&rfcsr, RFCSR1_RF_BLOCK_EN, 1);
8160        rt2800_rfcsr_write(rt2x00dev, 1, rfcsr);
8161
8162        rfcsr = rt2800_rfcsr_read(rt2x00dev, 6);
8163        rfcsr |= 0xc0;
8164        rt2800_rfcsr_write(rt2x00dev, 6, rfcsr);
8165
8166        rfcsr = rt2800_rfcsr_read(rt2x00dev, 22);
8167        rfcsr |= 0x20;
8168        rt2800_rfcsr_write(rt2x00dev, 22, rfcsr);
8169
8170        rfcsr = rt2800_rfcsr_read(rt2x00dev, 46);
8171        rfcsr |= 0x20;
8172        rt2800_rfcsr_write(rt2x00dev, 46, rfcsr);
8173
8174        rfcsr = rt2800_rfcsr_read(rt2x00dev, 20);
8175        rfcsr &= ~0xee;
8176        rt2800_rfcsr_write(rt2x00dev, 20, rfcsr);
8177}
8178
8179static void rt2800_init_rfcsr_5390(struct rt2x00_dev *rt2x00dev)
8180{
8181        rt2800_rf_init_calibration(rt2x00dev, 2);
8182
8183        rt2800_rfcsr_write(rt2x00dev, 1, 0x0f);
8184        rt2800_rfcsr_write(rt2x00dev, 2, 0x80);
8185        rt2800_rfcsr_write(rt2x00dev, 3, 0x88);
8186        rt2800_rfcsr_write(rt2x00dev, 5, 0x10);
8187        if (rt2x00_rt_rev_gte(rt2x00dev, RT5390, REV_RT5390F))
8188                rt2800_rfcsr_write(rt2x00dev, 6, 0xe0);
8189        else
8190                rt2800_rfcsr_write(rt2x00dev, 6, 0xa0);
8191        rt2800_rfcsr_write(rt2x00dev, 7, 0x00);
8192        rt2800_rfcsr_write(rt2x00dev, 10, 0x53);
8193        rt2800_rfcsr_write(rt2x00dev, 11, 0x4a);
8194        rt2800_rfcsr_write(rt2x00dev, 12, 0x46);
8195        rt2800_rfcsr_write(rt2x00dev, 13, 0x9f);
8196        rt2800_rfcsr_write(rt2x00dev, 14, 0x00);
8197        rt2800_rfcsr_write(rt2x00dev, 15, 0x00);
8198        rt2800_rfcsr_write(rt2x00dev, 16, 0x00);
8199        rt2800_rfcsr_write(rt2x00dev, 18, 0x03);
8200        rt2800_rfcsr_write(rt2x00dev, 19, 0x00);
8201
8202        rt2800_rfcsr_write(rt2x00dev, 20, 0x00);
8203        rt2800_rfcsr_write(rt2x00dev, 21, 0x00);
8204        rt2800_rfcsr_write(rt2x00dev, 22, 0x20);
8205        rt2800_rfcsr_write(rt2x00dev, 23, 0x00);
8206        rt2800_rfcsr_write(rt2x00dev, 24, 0x00);
8207        if (rt2x00_is_usb(rt2x00dev) &&
8208            rt2x00_rt_rev_gte(rt2x00dev, RT5390, REV_RT5390F))
8209                rt2800_rfcsr_write(rt2x00dev, 25, 0x80);
8210        else
8211                rt2800_rfcsr_write(rt2x00dev, 25, 0xc0);
8212        rt2800_rfcsr_write(rt2x00dev, 26, 0x00);
8213        rt2800_rfcsr_write(rt2x00dev, 27, 0x09);
8214        rt2800_rfcsr_write(rt2x00dev, 28, 0x00);
8215        rt2800_rfcsr_write(rt2x00dev, 29, 0x10);
8216
8217        rt2800_rfcsr_write(rt2x00dev, 30, 0x10);
8218        rt2800_rfcsr_write(rt2x00dev, 31, 0x80);
8219        rt2800_rfcsr_write(rt2x00dev, 32, 0x80);
8220        rt2800_rfcsr_write(rt2x00dev, 33, 0x00);
8221        rt2800_rfcsr_write(rt2x00dev, 34, 0x07);
8222        rt2800_rfcsr_write(rt2x00dev, 35, 0x12);
8223        rt2800_rfcsr_write(rt2x00dev, 36, 0x00);
8224        rt2800_rfcsr_write(rt2x00dev, 37, 0x08);
8225        rt2800_rfcsr_write(rt2x00dev, 38, 0x85);
8226        rt2800_rfcsr_write(rt2x00dev, 39, 0x1b);
8227
8228        rt2800_rfcsr_write(rt2x00dev, 40, 0x0b);
8229        rt2800_rfcsr_write(rt2x00dev, 41, 0xbb);
8230        rt2800_rfcsr_write(rt2x00dev, 42, 0xd2);
8231        rt2800_rfcsr_write(rt2x00dev, 43, 0x9a);
8232        rt2800_rfcsr_write(rt2x00dev, 44, 0x0e);
8233        rt2800_rfcsr_write(rt2x00dev, 45, 0xa2);
8234        if (rt2x00_rt_rev_gte(rt2x00dev, RT5390, REV_RT5390F))
8235                rt2800_rfcsr_write(rt2x00dev, 46, 0x73);
8236        else
8237                rt2800_rfcsr_write(rt2x00dev, 46, 0x7b);
8238        rt2800_rfcsr_write(rt2x00dev, 47, 0x00);
8239        rt2800_rfcsr_write(rt2x00dev, 48, 0x10);
8240        rt2800_rfcsr_write(rt2x00dev, 49, 0x94);
8241
8242        rt2800_rfcsr_write(rt2x00dev, 52, 0x38);
8243        if (rt2x00_rt_rev_gte(rt2x00dev, RT5390, REV_RT5390F))
8244                rt2800_rfcsr_write(rt2x00dev, 53, 0x00);
8245        else
8246                rt2800_rfcsr_write(rt2x00dev, 53, 0x84);
8247        rt2800_rfcsr_write(rt2x00dev, 54, 0x78);
8248        rt2800_rfcsr_write(rt2x00dev, 55, 0x44);
8249        if (rt2x00_rt_rev_gte(rt2x00dev, RT5390, REV_RT5390F))
8250                rt2800_rfcsr_write(rt2x00dev, 56, 0x42);
8251        else
8252                rt2800_rfcsr_write(rt2x00dev, 56, 0x22);
8253        rt2800_rfcsr_write(rt2x00dev, 57, 0x80);
8254        rt2800_rfcsr_write(rt2x00dev, 58, 0x7f);
8255        rt2800_rfcsr_write(rt2x00dev, 59, 0x8f);
8256
8257        rt2800_rfcsr_write(rt2x00dev, 60, 0x45);
8258        if (rt2x00_rt_rev_gte(rt2x00dev, RT5390, REV_RT5390F)) {
8259                if (rt2x00_is_usb(rt2x00dev))
8260                        rt2800_rfcsr_write(rt2x00dev, 61, 0xd1);
8261                else
8262                        rt2800_rfcsr_write(rt2x00dev, 61, 0xd5);
8263        } else {
8264                if (rt2x00_is_usb(rt2x00dev))
8265                        rt2800_rfcsr_write(rt2x00dev, 61, 0xdd);
8266                else
8267                        rt2800_rfcsr_write(rt2x00dev, 61, 0xb5);
8268        }
8269        rt2800_rfcsr_write(rt2x00dev, 62, 0x00);
8270        rt2800_rfcsr_write(rt2x00dev, 63, 0x00);
8271
8272        rt2800_normal_mode_setup_5xxx(rt2x00dev);
8273
8274        rt2800_led_open_drain_enable(rt2x00dev);
8275}
8276
8277static void rt2800_init_rfcsr_5392(struct rt2x00_dev *rt2x00dev)
8278{
8279        rt2800_rf_init_calibration(rt2x00dev, 2);
8280
8281        rt2800_rfcsr_write(rt2x00dev, 1, 0x17);
8282        rt2800_rfcsr_write(rt2x00dev, 3, 0x88);
8283        rt2800_rfcsr_write(rt2x00dev, 5, 0x10);
8284        rt2800_rfcsr_write(rt2x00dev, 6, 0xe0);
8285        rt2800_rfcsr_write(rt2x00dev, 7, 0x00);
8286        rt2800_rfcsr_write(rt2x00dev, 10, 0x53);
8287        rt2800_rfcsr_write(rt2x00dev, 11, 0x4a);
8288        rt2800_rfcsr_write(rt2x00dev, 12, 0x46);
8289        rt2800_rfcsr_write(rt2x00dev, 13, 0x9f);
8290        rt2800_rfcsr_write(rt2x00dev, 14, 0x00);
8291        rt2800_rfcsr_write(rt2x00dev, 15, 0x00);
8292        rt2800_rfcsr_write(rt2x00dev, 16, 0x00);
8293        rt2800_rfcsr_write(rt2x00dev, 18, 0x03);
8294        rt2800_rfcsr_write(rt2x00dev, 19, 0x4d);
8295        rt2800_rfcsr_write(rt2x00dev, 20, 0x00);
8296        rt2800_rfcsr_write(rt2x00dev, 21, 0x8d);
8297        rt2800_rfcsr_write(rt2x00dev, 22, 0x20);
8298        rt2800_rfcsr_write(rt2x00dev, 23, 0x0b);
8299        rt2800_rfcsr_write(rt2x00dev, 24, 0x44);
8300        rt2800_rfcsr_write(rt2x00dev, 25, 0x80);
8301        rt2800_rfcsr_write(rt2x00dev, 26, 0x82);
8302        rt2800_rfcsr_write(rt2x00dev, 27, 0x09);
8303        rt2800_rfcsr_write(rt2x00dev, 28, 0x00);
8304        rt2800_rfcsr_write(rt2x00dev, 29, 0x10);
8305        rt2800_rfcsr_write(rt2x00dev, 30, 0x10);
8306        rt2800_rfcsr_write(rt2x00dev, 31, 0x80);
8307        rt2800_rfcsr_write(rt2x00dev, 32, 0x20);
8308        rt2800_rfcsr_write(rt2x00dev, 33, 0xC0);
8309        rt2800_rfcsr_write(rt2x00dev, 34, 0x07);
8310        rt2800_rfcsr_write(rt2x00dev, 35, 0x12);
8311        rt2800_rfcsr_write(rt2x00dev, 36, 0x00);
8312        rt2800_rfcsr_write(rt2x00dev, 37, 0x08);
8313        rt2800_rfcsr_write(rt2x00dev, 38, 0x89);
8314        rt2800_rfcsr_write(rt2x00dev, 39, 0x1b);
8315        rt2800_rfcsr_write(rt2x00dev, 40, 0x0f);
8316        rt2800_rfcsr_write(rt2x00dev, 41, 0xbb);
8317        rt2800_rfcsr_write(rt2x00dev, 42, 0xd5);
8318        rt2800_rfcsr_write(rt2x00dev, 43, 0x9b);
8319        rt2800_rfcsr_write(rt2x00dev, 44, 0x0e);
8320        rt2800_rfcsr_write(rt2x00dev, 45, 0xa2);
8321        rt2800_rfcsr_write(rt2x00dev, 46, 0x73);
8322        rt2800_rfcsr_write(rt2x00dev, 47, 0x0c);
8323        rt2800_rfcsr_write(rt2x00dev, 48, 0x10);
8324        rt2800_rfcsr_write(rt2x00dev, 49, 0x94);
8325        rt2800_rfcsr_write(rt2x00dev, 50, 0x94);
8326        rt2800_rfcsr_write(rt2x00dev, 51, 0x3a);
8327        rt2800_rfcsr_write(rt2x00dev, 52, 0x48);
8328        rt2800_rfcsr_write(rt2x00dev, 53, 0x44);
8329        rt2800_rfcsr_write(rt2x00dev, 54, 0x38);
8330        rt2800_rfcsr_write(rt2x00dev, 55, 0x43);
8331        rt2800_rfcsr_write(rt2x00dev, 56, 0xa1);
8332        rt2800_rfcsr_write(rt2x00dev, 57, 0x00);
8333        rt2800_rfcsr_write(rt2x00dev, 58, 0x39);
8334        rt2800_rfcsr_write(rt2x00dev, 59, 0x07);
8335        rt2800_rfcsr_write(rt2x00dev, 60, 0x45);
8336        rt2800_rfcsr_write(rt2x00dev, 61, 0x91);
8337        rt2800_rfcsr_write(rt2x00dev, 62, 0x39);
8338        rt2800_rfcsr_write(rt2x00dev, 63, 0x07);
8339
8340        rt2800_normal_mode_setup_5xxx(rt2x00dev);
8341
8342        rt2800_led_open_drain_enable(rt2x00dev);
8343}
8344
8345static void rt2800_init_rfcsr_5592(struct rt2x00_dev *rt2x00dev)
8346{
8347        rt2800_rf_init_calibration(rt2x00dev, 30);
8348
8349        rt2800_rfcsr_write(rt2x00dev, 1, 0x3F);
8350        rt2800_rfcsr_write(rt2x00dev, 3, 0x08);
8351        rt2800_rfcsr_write(rt2x00dev, 5, 0x10);
8352        rt2800_rfcsr_write(rt2x00dev, 6, 0xE4);
8353        rt2800_rfcsr_write(rt2x00dev, 7, 0x00);
8354        rt2800_rfcsr_write(rt2x00dev, 14, 0x00);
8355        rt2800_rfcsr_write(rt2x00dev, 15, 0x00);
8356        rt2800_rfcsr_write(rt2x00dev, 16, 0x00);
8357        rt2800_rfcsr_write(rt2x00dev, 18, 0x03);
8358        rt2800_rfcsr_write(rt2x00dev, 19, 0x4D);
8359        rt2800_rfcsr_write(rt2x00dev, 20, 0x10);
8360        rt2800_rfcsr_write(rt2x00dev, 21, 0x8D);
8361        rt2800_rfcsr_write(rt2x00dev, 26, 0x82);
8362        rt2800_rfcsr_write(rt2x00dev, 28, 0x00);
8363        rt2800_rfcsr_write(rt2x00dev, 29, 0x10);
8364        rt2800_rfcsr_write(rt2x00dev, 33, 0xC0);
8365        rt2800_rfcsr_write(rt2x00dev, 34, 0x07);
8366        rt2800_rfcsr_write(rt2x00dev, 35, 0x12);
8367        rt2800_rfcsr_write(rt2x00dev, 47, 0x0C);
8368        rt2800_rfcsr_write(rt2x00dev, 53, 0x22);
8369        rt2800_rfcsr_write(rt2x00dev, 63, 0x07);
8370
8371        rt2800_rfcsr_write(rt2x00dev, 2, 0x80);
8372        msleep(1);
8373
8374        rt2800_freq_cal_mode1(rt2x00dev);
8375
8376        /* Enable DC filter */
8377        if (rt2x00_rt_rev_gte(rt2x00dev, RT5592, REV_RT5592C))
8378                rt2800_bbp_write(rt2x00dev, 103, 0xc0);
8379
8380        rt2800_normal_mode_setup_5xxx(rt2x00dev);
8381
8382        if (rt2x00_rt_rev_lt(rt2x00dev, RT5592, REV_RT5592C))
8383                rt2800_rfcsr_write(rt2x00dev, 27, 0x03);
8384
8385        rt2800_led_open_drain_enable(rt2x00dev);
8386}
8387
8388static void rt2800_bbp_core_soft_reset(struct rt2x00_dev *rt2x00dev,
8389                                       bool set_bw, bool is_ht40)
8390{
8391        u8 bbp_val;
8392
8393        bbp_val = rt2800_bbp_read(rt2x00dev, 21);
8394        bbp_val |= 0x1;
8395        rt2800_bbp_write(rt2x00dev, 21, bbp_val);
8396        usleep_range(100, 200);
8397
8398        if (set_bw) {
8399                bbp_val = rt2800_bbp_read(rt2x00dev, 4);
8400                rt2x00_set_field8(&bbp_val, BBP4_BANDWIDTH, 2 * is_ht40);
8401                rt2800_bbp_write(rt2x00dev, 4, bbp_val);
8402                usleep_range(100, 200);
8403        }
8404
8405        bbp_val = rt2800_bbp_read(rt2x00dev, 21);
8406        bbp_val &= (~0x1);
8407        rt2800_bbp_write(rt2x00dev, 21, bbp_val);
8408        usleep_range(100, 200);
8409}
8410
8411static int rt2800_rf_lp_config(struct rt2x00_dev *rt2x00dev, bool btxcal)
8412{
8413        u8 rf_val;
8414
8415        if (btxcal)
8416                rt2800_register_write(rt2x00dev, RF_CONTROL0, 0x04);
8417        else
8418                rt2800_register_write(rt2x00dev, RF_CONTROL0, 0x02);
8419
8420        rt2800_register_write(rt2x00dev, RF_BYPASS0, 0x06);
8421
8422        rf_val = rt2800_rfcsr_read_bank(rt2x00dev, 5, 17);
8423        rf_val |= 0x80;
8424        rt2800_rfcsr_write_bank(rt2x00dev, 5, 17, rf_val);
8425
8426        if (btxcal) {
8427                rt2800_rfcsr_write_bank(rt2x00dev, 5, 18, 0xC1);
8428                rt2800_rfcsr_write_bank(rt2x00dev, 5, 19, 0x20);
8429                rt2800_rfcsr_write_bank(rt2x00dev, 5, 20, 0x02);
8430                rf_val = rt2800_rfcsr_read_bank(rt2x00dev, 5, 3);
8431                rf_val &= (~0x3F);
8432                rf_val |= 0x3F;
8433                rt2800_rfcsr_write_bank(rt2x00dev, 5, 3, rf_val);
8434                rf_val = rt2800_rfcsr_read_bank(rt2x00dev, 5, 4);
8435                rf_val &= (~0x3F);
8436                rf_val |= 0x3F;
8437                rt2800_rfcsr_write_bank(rt2x00dev, 5, 4, rf_val);
8438                rt2800_rfcsr_write_bank(rt2x00dev, 5, 5, 0x31);
8439        } else {
8440                rt2800_rfcsr_write_bank(rt2x00dev, 5, 18, 0xF1);
8441                rt2800_rfcsr_write_bank(rt2x00dev, 5, 19, 0x18);
8442                rt2800_rfcsr_write_bank(rt2x00dev, 5, 20, 0x02);
8443                rf_val = rt2800_rfcsr_read_bank(rt2x00dev, 5, 3);
8444                rf_val &= (~0x3F);
8445                rf_val |= 0x34;
8446                rt2800_rfcsr_write_bank(rt2x00dev, 5, 3, rf_val);
8447                rf_val = rt2800_rfcsr_read_bank(rt2x00dev, 5, 4);
8448                rf_val &= (~0x3F);
8449                rf_val |= 0x34;
8450                rt2800_rfcsr_write_bank(rt2x00dev, 5, 4, rf_val);
8451        }
8452
8453        return 0;
8454}
8455
8456static char rt2800_lp_tx_filter_bw_cal(struct rt2x00_dev *rt2x00dev)
8457{
8458        unsigned int cnt;
8459        u8 bbp_val;
8460        char cal_val;
8461
8462        rt2800_bbp_dcoc_write(rt2x00dev, 0, 0x82);
8463
8464        cnt = 0;
8465        do {
8466                usleep_range(500, 2000);
8467                bbp_val = rt2800_bbp_read(rt2x00dev, 159);
8468                if (bbp_val == 0x02 || cnt == 20)
8469                        break;
8470
8471                cnt++;
8472        } while (cnt < 20);
8473
8474        bbp_val = rt2800_bbp_dcoc_read(rt2x00dev, 0x39);
8475        cal_val = bbp_val & 0x7F;
8476        if (cal_val >= 0x40)
8477                cal_val -= 128;
8478
8479        return cal_val;
8480}
8481
8482static void rt2800_bw_filter_calibration(struct rt2x00_dev *rt2x00dev,
8483                                         bool btxcal)
8484{
8485        struct rt2800_drv_data *drv_data = rt2x00dev->drv_data;
8486        u8 tx_agc_fc = 0, rx_agc_fc = 0, cmm_agc_fc;
8487        u8 filter_target;
8488        u8 tx_filter_target_20m = 0x09, tx_filter_target_40m = 0x02;
8489        u8 rx_filter_target_20m = 0x27, rx_filter_target_40m = 0x31;
8490        int loop = 0, is_ht40, cnt;
8491        u8 bbp_val, rf_val;
8492        char cal_r32_init, cal_r32_val, cal_diff;
8493        u8 saverfb5r00, saverfb5r01, saverfb5r03, saverfb5r04, saverfb5r05;
8494        u8 saverfb5r06, saverfb5r07;
8495        u8 saverfb5r08, saverfb5r17, saverfb5r18, saverfb5r19, saverfb5r20;
8496        u8 saverfb5r37, saverfb5r38, saverfb5r39, saverfb5r40, saverfb5r41;
8497        u8 saverfb5r42, saverfb5r43, saverfb5r44, saverfb5r45, saverfb5r46;
8498        u8 saverfb5r58, saverfb5r59;
8499        u8 savebbp159r0, savebbp159r2, savebbpr23;
8500        u32 MAC_RF_CONTROL0, MAC_RF_BYPASS0;
8501
8502        /* Save MAC registers */
8503        MAC_RF_CONTROL0 = rt2800_register_read(rt2x00dev, RF_CONTROL0);
8504        MAC_RF_BYPASS0 = rt2800_register_read(rt2x00dev, RF_BYPASS0);
8505
8506        /* save BBP registers */
8507        savebbpr23 = rt2800_bbp_read(rt2x00dev, 23);
8508
8509        savebbp159r0 = rt2800_bbp_dcoc_read(rt2x00dev, 0);
8510        savebbp159r2 = rt2800_bbp_dcoc_read(rt2x00dev, 2);
8511
8512        /* Save RF registers */
8513        saverfb5r00 = rt2800_rfcsr_read_bank(rt2x00dev, 5, 0);
8514        saverfb5r01 = rt2800_rfcsr_read_bank(rt2x00dev, 5, 1);
8515        saverfb5r03 = rt2800_rfcsr_read_bank(rt2x00dev, 5, 3);
8516        saverfb5r04 = rt2800_rfcsr_read_bank(rt2x00dev, 5, 4);
8517        saverfb5r05 = rt2800_rfcsr_read_bank(rt2x00dev, 5, 5);
8518        saverfb5r06 = rt2800_rfcsr_read_bank(rt2x00dev, 5, 6);
8519        saverfb5r07 = rt2800_rfcsr_read_bank(rt2x00dev, 5, 7);
8520        saverfb5r08 = rt2800_rfcsr_read_bank(rt2x00dev, 5, 8);
8521        saverfb5r17 = rt2800_rfcsr_read_bank(rt2x00dev, 5, 17);
8522        saverfb5r18 = rt2800_rfcsr_read_bank(rt2x00dev, 5, 18);
8523        saverfb5r19 = rt2800_rfcsr_read_bank(rt2x00dev, 5, 19);
8524        saverfb5r20 = rt2800_rfcsr_read_bank(rt2x00dev, 5, 20);
8525
8526        saverfb5r37 = rt2800_rfcsr_read_bank(rt2x00dev, 5, 37);
8527        saverfb5r38 = rt2800_rfcsr_read_bank(rt2x00dev, 5, 38);
8528        saverfb5r39 = rt2800_rfcsr_read_bank(rt2x00dev, 5, 39);
8529        saverfb5r40 = rt2800_rfcsr_read_bank(rt2x00dev, 5, 40);
8530        saverfb5r41 = rt2800_rfcsr_read_bank(rt2x00dev, 5, 41);
8531        saverfb5r42 = rt2800_rfcsr_read_bank(rt2x00dev, 5, 42);
8532        saverfb5r43 = rt2800_rfcsr_read_bank(rt2x00dev, 5, 43);
8533        saverfb5r44 = rt2800_rfcsr_read_bank(rt2x00dev, 5, 44);
8534        saverfb5r45 = rt2800_rfcsr_read_bank(rt2x00dev, 5, 45);
8535        saverfb5r46 = rt2800_rfcsr_read_bank(rt2x00dev, 5, 46);
8536
8537        saverfb5r58 = rt2800_rfcsr_read_bank(rt2x00dev, 5, 58);
8538        saverfb5r59 = rt2800_rfcsr_read_bank(rt2x00dev, 5, 59);
8539
8540        rf_val = rt2800_rfcsr_read_bank(rt2x00dev, 5, 0);
8541        rf_val |= 0x3;
8542        rt2800_rfcsr_write_bank(rt2x00dev, 5, 0, rf_val);
8543
8544        rf_val = rt2800_rfcsr_read_bank(rt2x00dev, 5, 1);
8545        rf_val |= 0x1;
8546        rt2800_rfcsr_write_bank(rt2x00dev, 5, 1, rf_val);
8547
8548        cnt = 0;
8549        do {
8550                usleep_range(500, 2000);
8551                rf_val = rt2800_rfcsr_read_bank(rt2x00dev, 5, 1);
8552                if (((rf_val & 0x1) == 0x00) || (cnt == 40))
8553                        break;
8554                cnt++;
8555        } while (cnt < 40);
8556
8557        rf_val = rt2800_rfcsr_read_bank(rt2x00dev, 5, 0);
8558        rf_val &= (~0x3);
8559        rf_val |= 0x1;
8560        rt2800_rfcsr_write_bank(rt2x00dev, 5, 0, rf_val);
8561
8562        /* I-3 */
8563        bbp_val = rt2800_bbp_read(rt2x00dev, 23);
8564        bbp_val &= (~0x1F);
8565        bbp_val |= 0x10;
8566        rt2800_bbp_write(rt2x00dev, 23, bbp_val);
8567
8568        do {
8569                /* I-4,5,6,7,8,9 */
8570                if (loop == 0) {
8571                        is_ht40 = false;
8572
8573                        if (btxcal)
8574                                filter_target = tx_filter_target_20m;
8575                        else
8576                                filter_target = rx_filter_target_20m;
8577                } else {
8578                        is_ht40 = true;
8579
8580                        if (btxcal)
8581                                filter_target = tx_filter_target_40m;
8582                        else
8583                                filter_target = rx_filter_target_40m;
8584                }
8585
8586                rf_val = rt2800_rfcsr_read_bank(rt2x00dev, 5, 8);
8587                rf_val &= (~0x04);
8588                if (loop == 1)
8589                        rf_val |= 0x4;
8590
8591                rt2800_rfcsr_write_bank(rt2x00dev, 5, 8, rf_val);
8592
8593                rt2800_bbp_core_soft_reset(rt2x00dev, true, is_ht40);
8594
8595                rt2800_rf_lp_config(rt2x00dev, btxcal);
8596                if (btxcal) {
8597                        tx_agc_fc = 0;
8598                        rf_val = rt2800_rfcsr_read_bank(rt2x00dev, 5, 58);
8599                        rf_val &= (~0x7F);
8600                        rt2800_rfcsr_write_bank(rt2x00dev, 5, 58, rf_val);
8601                        rf_val = rt2800_rfcsr_read_bank(rt2x00dev, 5, 59);
8602                        rf_val &= (~0x7F);
8603                        rt2800_rfcsr_write_bank(rt2x00dev, 5, 59, rf_val);
8604                } else {
8605                        rx_agc_fc = 0;
8606                        rf_val = rt2800_rfcsr_read_bank(rt2x00dev, 5, 6);
8607                        rf_val &= (~0x7F);
8608                        rt2800_rfcsr_write_bank(rt2x00dev, 5, 6, rf_val);
8609                        rf_val = rt2800_rfcsr_read_bank(rt2x00dev, 5, 7);
8610                        rf_val &= (~0x7F);
8611                        rt2800_rfcsr_write_bank(rt2x00dev, 5, 7, rf_val);
8612                }
8613
8614                usleep_range(1000, 2000);
8615
8616                bbp_val = rt2800_bbp_dcoc_read(rt2x00dev, 2);
8617                bbp_val &= (~0x6);
8618                rt2800_bbp_dcoc_write(rt2x00dev, 2, bbp_val);
8619
8620                rt2800_bbp_core_soft_reset(rt2x00dev, false, is_ht40);
8621
8622                cal_r32_init = rt2800_lp_tx_filter_bw_cal(rt2x00dev);
8623
8624                bbp_val = rt2800_bbp_dcoc_read(rt2x00dev, 2);
8625                bbp_val |= 0x6;
8626                rt2800_bbp_dcoc_write(rt2x00dev, 2, bbp_val);
8627do_cal:
8628                if (btxcal) {
8629                        rf_val = rt2800_rfcsr_read_bank(rt2x00dev, 5, 58);
8630                        rf_val &= (~0x7F);
8631                        rf_val |= tx_agc_fc;
8632                        rt2800_rfcsr_write_bank(rt2x00dev, 5, 58, rf_val);
8633                        rf_val = rt2800_rfcsr_read_bank(rt2x00dev, 5, 59);
8634                        rf_val &= (~0x7F);
8635                        rf_val |= tx_agc_fc;
8636                        rt2800_rfcsr_write_bank(rt2x00dev, 5, 59, rf_val);
8637                } else {
8638                        rf_val = rt2800_rfcsr_read_bank(rt2x00dev, 5, 6);
8639                        rf_val &= (~0x7F);
8640                        rf_val |= rx_agc_fc;
8641                        rt2800_rfcsr_write_bank(rt2x00dev, 5, 6, rf_val);
8642                        rf_val = rt2800_rfcsr_read_bank(rt2x00dev, 5, 7);
8643                        rf_val &= (~0x7F);
8644                        rf_val |= rx_agc_fc;
8645                        rt2800_rfcsr_write_bank(rt2x00dev, 5, 7, rf_val);
8646                }
8647
8648                usleep_range(500, 1000);
8649
8650                rt2800_bbp_core_soft_reset(rt2x00dev, false, is_ht40);
8651
8652                cal_r32_val = rt2800_lp_tx_filter_bw_cal(rt2x00dev);
8653
8654                cal_diff = cal_r32_init - cal_r32_val;
8655
8656                if (btxcal)
8657                        cmm_agc_fc = tx_agc_fc;
8658                else
8659                        cmm_agc_fc = rx_agc_fc;
8660
8661                if (((cal_diff > filter_target) && (cmm_agc_fc == 0)) ||
8662                    ((cal_diff < filter_target) && (cmm_agc_fc == 0x3f))) {
8663                        if (btxcal)
8664                                tx_agc_fc = 0;
8665                        else
8666                                rx_agc_fc = 0;
8667                } else if ((cal_diff <= filter_target) && (cmm_agc_fc < 0x3f)) {
8668                        if (btxcal)
8669                                tx_agc_fc++;
8670                        else
8671                                rx_agc_fc++;
8672                        goto do_cal;
8673                }
8674
8675                if (btxcal) {
8676                        if (loop == 0)
8677                                drv_data->tx_calibration_bw20 = tx_agc_fc;
8678                        else
8679                                drv_data->tx_calibration_bw40 = tx_agc_fc;
8680                } else {
8681                        if (loop == 0)
8682                                drv_data->rx_calibration_bw20 = rx_agc_fc;
8683                        else
8684                                drv_data->rx_calibration_bw40 = rx_agc_fc;
8685                }
8686
8687                loop++;
8688        } while (loop <= 1);
8689
8690        rt2800_rfcsr_write_bank(rt2x00dev, 5, 0, saverfb5r00);
8691        rt2800_rfcsr_write_bank(rt2x00dev, 5, 1, saverfb5r01);
8692        rt2800_rfcsr_write_bank(rt2x00dev, 5, 3, saverfb5r03);
8693        rt2800_rfcsr_write_bank(rt2x00dev, 5, 4, saverfb5r04);
8694        rt2800_rfcsr_write_bank(rt2x00dev, 5, 5, saverfb5r05);
8695        rt2800_rfcsr_write_bank(rt2x00dev, 5, 6, saverfb5r06);
8696        rt2800_rfcsr_write_bank(rt2x00dev, 5, 7, saverfb5r07);
8697        rt2800_rfcsr_write_bank(rt2x00dev, 5, 8, saverfb5r08);
8698        rt2800_rfcsr_write_bank(rt2x00dev, 5, 17, saverfb5r17);
8699        rt2800_rfcsr_write_bank(rt2x00dev, 5, 18, saverfb5r18);
8700        rt2800_rfcsr_write_bank(rt2x00dev, 5, 19, saverfb5r19);
8701        rt2800_rfcsr_write_bank(rt2x00dev, 5, 20, saverfb5r20);
8702
8703        rt2800_rfcsr_write_bank(rt2x00dev, 5, 37, saverfb5r37);
8704        rt2800_rfcsr_write_bank(rt2x00dev, 5, 38, saverfb5r38);
8705        rt2800_rfcsr_write_bank(rt2x00dev, 5, 39, saverfb5r39);
8706        rt2800_rfcsr_write_bank(rt2x00dev, 5, 40, saverfb5r40);
8707        rt2800_rfcsr_write_bank(rt2x00dev, 5, 41, saverfb5r41);
8708        rt2800_rfcsr_write_bank(rt2x00dev, 5, 42, saverfb5r42);
8709        rt2800_rfcsr_write_bank(rt2x00dev, 5, 43, saverfb5r43);
8710        rt2800_rfcsr_write_bank(rt2x00dev, 5, 44, saverfb5r44);
8711        rt2800_rfcsr_write_bank(rt2x00dev, 5, 45, saverfb5r45);
8712        rt2800_rfcsr_write_bank(rt2x00dev, 5, 46, saverfb5r46);
8713
8714        rt2800_rfcsr_write_bank(rt2x00dev, 5, 58, saverfb5r58);
8715        rt2800_rfcsr_write_bank(rt2x00dev, 5, 59, saverfb5r59);
8716
8717        rt2800_bbp_write(rt2x00dev, 23, savebbpr23);
8718
8719        rt2800_bbp_dcoc_write(rt2x00dev, 0, savebbp159r0);
8720        rt2800_bbp_dcoc_write(rt2x00dev, 2, savebbp159r2);
8721
8722        bbp_val = rt2800_bbp_read(rt2x00dev, 4);
8723        rt2x00_set_field8(&bbp_val, BBP4_BANDWIDTH,
8724                          2 * test_bit(CONFIG_CHANNEL_HT40, &rt2x00dev->flags));
8725        rt2800_bbp_write(rt2x00dev, 4, bbp_val);
8726
8727        rt2800_register_write(rt2x00dev, RF_CONTROL0, MAC_RF_CONTROL0);
8728        rt2800_register_write(rt2x00dev, RF_BYPASS0, MAC_RF_BYPASS0);
8729}
8730
8731static void rt2800_init_rfcsr_6352(struct rt2x00_dev *rt2x00dev)
8732{
8733        /* Initialize RF central register to default value */
8734        rt2800_rfcsr_write(rt2x00dev, 0, 0x02);
8735        rt2800_rfcsr_write(rt2x00dev, 1, 0x03);
8736        rt2800_rfcsr_write(rt2x00dev, 2, 0x33);
8737        rt2800_rfcsr_write(rt2x00dev, 3, 0xFF);
8738        rt2800_rfcsr_write(rt2x00dev, 4, 0x0C);
8739        rt2800_rfcsr_write(rt2x00dev, 5, 0x40);
8740        rt2800_rfcsr_write(rt2x00dev, 6, 0x00);
8741        rt2800_rfcsr_write(rt2x00dev, 7, 0x00);
8742        rt2800_rfcsr_write(rt2x00dev, 8, 0x00);
8743        rt2800_rfcsr_write(rt2x00dev, 9, 0x00);
8744        rt2800_rfcsr_write(rt2x00dev, 10, 0x00);
8745        rt2800_rfcsr_write(rt2x00dev, 11, 0x00);
8746        rt2800_rfcsr_write(rt2x00dev, 12, rt2x00dev->freq_offset);
8747        rt2800_rfcsr_write(rt2x00dev, 13, 0x00);
8748        rt2800_rfcsr_write(rt2x00dev, 14, 0x40);
8749        rt2800_rfcsr_write(rt2x00dev, 15, 0x22);
8750        rt2800_rfcsr_write(rt2x00dev, 16, 0x4C);
8751        rt2800_rfcsr_write(rt2x00dev, 17, 0x00);
8752        rt2800_rfcsr_write(rt2x00dev, 18, 0x00);
8753        rt2800_rfcsr_write(rt2x00dev, 19, 0x00);
8754        rt2800_rfcsr_write(rt2x00dev, 20, 0xA0);
8755        rt2800_rfcsr_write(rt2x00dev, 21, 0x12);
8756        rt2800_rfcsr_write(rt2x00dev, 22, 0x07);
8757        rt2800_rfcsr_write(rt2x00dev, 23, 0x13);
8758        rt2800_rfcsr_write(rt2x00dev, 24, 0xFE);
8759        rt2800_rfcsr_write(rt2x00dev, 25, 0x24);
8760        rt2800_rfcsr_write(rt2x00dev, 26, 0x7A);
8761        rt2800_rfcsr_write(rt2x00dev, 27, 0x00);
8762        rt2800_rfcsr_write(rt2x00dev, 28, 0x00);
8763        rt2800_rfcsr_write(rt2x00dev, 29, 0x05);
8764        rt2800_rfcsr_write(rt2x00dev, 30, 0x00);
8765        rt2800_rfcsr_write(rt2x00dev, 31, 0x00);
8766        rt2800_rfcsr_write(rt2x00dev, 32, 0x00);
8767        rt2800_rfcsr_write(rt2x00dev, 33, 0x00);
8768        rt2800_rfcsr_write(rt2x00dev, 34, 0x00);
8769        rt2800_rfcsr_write(rt2x00dev, 35, 0x00);
8770        rt2800_rfcsr_write(rt2x00dev, 36, 0x00);
8771        rt2800_rfcsr_write(rt2x00dev, 37, 0x00);
8772        rt2800_rfcsr_write(rt2x00dev, 38, 0x00);
8773        rt2800_rfcsr_write(rt2x00dev, 39, 0x00);
8774        rt2800_rfcsr_write(rt2x00dev, 40, 0x00);
8775        rt2800_rfcsr_write(rt2x00dev, 41, 0xD0);
8776        rt2800_rfcsr_write(rt2x00dev, 42, 0x5B);
8777        rt2800_rfcsr_write(rt2x00dev, 43, 0x00);
8778
8779        rt2800_rfcsr_write(rt2x00dev, 11, 0x21);
8780        if (rt2800_clk_is_20mhz(rt2x00dev))
8781                rt2800_rfcsr_write(rt2x00dev, 13, 0x03);
8782        else
8783                rt2800_rfcsr_write(rt2x00dev, 13, 0x00);
8784        rt2800_rfcsr_write(rt2x00dev, 14, 0x7C);
8785        rt2800_rfcsr_write(rt2x00dev, 16, 0x80);
8786        rt2800_rfcsr_write(rt2x00dev, 17, 0x99);
8787        rt2800_rfcsr_write(rt2x00dev, 18, 0x99);
8788        rt2800_rfcsr_write(rt2x00dev, 19, 0x09);
8789        rt2800_rfcsr_write(rt2x00dev, 20, 0x50);
8790        rt2800_rfcsr_write(rt2x00dev, 21, 0xB0);
8791        rt2800_rfcsr_write(rt2x00dev, 22, 0x00);
8792        rt2800_rfcsr_write(rt2x00dev, 23, 0x06);
8793        rt2800_rfcsr_write(rt2x00dev, 24, 0x00);
8794        rt2800_rfcsr_write(rt2x00dev, 25, 0x00);
8795        rt2800_rfcsr_write(rt2x00dev, 26, 0x5D);
8796        rt2800_rfcsr_write(rt2x00dev, 27, 0x00);
8797        rt2800_rfcsr_write(rt2x00dev, 28, 0x61);
8798        rt2800_rfcsr_write(rt2x00dev, 29, 0xB5);
8799        rt2800_rfcsr_write(rt2x00dev, 43, 0x02);
8800
8801        rt2800_rfcsr_write(rt2x00dev, 28, 0x62);
8802        rt2800_rfcsr_write(rt2x00dev, 29, 0xAD);
8803        rt2800_rfcsr_write(rt2x00dev, 39, 0x80);
8804
8805        /* Initialize RF channel register to default value */
8806        rt2800_rfcsr_write_chanreg(rt2x00dev, 0, 0x03);
8807        rt2800_rfcsr_write_chanreg(rt2x00dev, 1, 0x00);
8808        rt2800_rfcsr_write_chanreg(rt2x00dev, 2, 0x00);
8809        rt2800_rfcsr_write_chanreg(rt2x00dev, 3, 0x00);
8810        rt2800_rfcsr_write_chanreg(rt2x00dev, 4, 0x00);
8811        rt2800_rfcsr_write_chanreg(rt2x00dev, 5, 0x08);
8812        rt2800_rfcsr_write_chanreg(rt2x00dev, 6, 0x00);
8813        rt2800_rfcsr_write_chanreg(rt2x00dev, 7, 0x51);
8814        rt2800_rfcsr_write_chanreg(rt2x00dev, 8, 0x53);
8815        rt2800_rfcsr_write_chanreg(rt2x00dev, 9, 0x16);
8816        rt2800_rfcsr_write_chanreg(rt2x00dev, 10, 0x61);
8817        rt2800_rfcsr_write_chanreg(rt2x00dev, 11, 0x53);
8818        rt2800_rfcsr_write_chanreg(rt2x00dev, 12, 0x22);
8819        rt2800_rfcsr_write_chanreg(rt2x00dev, 13, 0x3D);
8820        rt2800_rfcsr_write_chanreg(rt2x00dev, 14, 0x06);
8821        rt2800_rfcsr_write_chanreg(rt2x00dev, 15, 0x13);
8822        rt2800_rfcsr_write_chanreg(rt2x00dev, 16, 0x22);
8823        rt2800_rfcsr_write_chanreg(rt2x00dev, 17, 0x27);
8824        rt2800_rfcsr_write_chanreg(rt2x00dev, 18, 0x02);
8825        rt2800_rfcsr_write_chanreg(rt2x00dev, 19, 0xA7);
8826        rt2800_rfcsr_write_chanreg(rt2x00dev, 20, 0x01);
8827        rt2800_rfcsr_write_chanreg(rt2x00dev, 21, 0x52);
8828        rt2800_rfcsr_write_chanreg(rt2x00dev, 22, 0x80);
8829        rt2800_rfcsr_write_chanreg(rt2x00dev, 23, 0xB3);
8830        rt2800_rfcsr_write_chanreg(rt2x00dev, 24, 0x00);
8831        rt2800_rfcsr_write_chanreg(rt2x00dev, 25, 0x00);
8832        rt2800_rfcsr_write_chanreg(rt2x00dev, 26, 0x00);
8833        rt2800_rfcsr_write_chanreg(rt2x00dev, 27, 0x00);
8834        rt2800_rfcsr_write_chanreg(rt2x00dev, 28, 0x5C);
8835        rt2800_rfcsr_write_chanreg(rt2x00dev, 29, 0x6B);
8836        rt2800_rfcsr_write_chanreg(rt2x00dev, 30, 0x6B);
8837        rt2800_rfcsr_write_chanreg(rt2x00dev, 31, 0x31);
8838        rt2800_rfcsr_write_chanreg(rt2x00dev, 32, 0x5D);
8839        rt2800_rfcsr_write_chanreg(rt2x00dev, 33, 0x00);
8840        rt2800_rfcsr_write_chanreg(rt2x00dev, 34, 0xE6);
8841        rt2800_rfcsr_write_chanreg(rt2x00dev, 35, 0x55);
8842        rt2800_rfcsr_write_chanreg(rt2x00dev, 36, 0x00);
8843        rt2800_rfcsr_write_chanreg(rt2x00dev, 37, 0xBB);
8844        rt2800_rfcsr_write_chanreg(rt2x00dev, 38, 0xB3);
8845        rt2800_rfcsr_write_chanreg(rt2x00dev, 39, 0xB3);
8846        rt2800_rfcsr_write_chanreg(rt2x00dev, 40, 0x03);
8847        rt2800_rfcsr_write_chanreg(rt2x00dev, 41, 0x00);
8848        rt2800_rfcsr_write_chanreg(rt2x00dev, 42, 0x00);
8849        rt2800_rfcsr_write_chanreg(rt2x00dev, 43, 0xB3);
8850        rt2800_rfcsr_write_chanreg(rt2x00dev, 44, 0xD3);
8851        rt2800_rfcsr_write_chanreg(rt2x00dev, 45, 0xD5);
8852        rt2800_rfcsr_write_chanreg(rt2x00dev, 46, 0x07);
8853        rt2800_rfcsr_write_chanreg(rt2x00dev, 47, 0x68);
8854        rt2800_rfcsr_write_chanreg(rt2x00dev, 48, 0xEF);
8855        rt2800_rfcsr_write_chanreg(rt2x00dev, 49, 0x1C);
8856        rt2800_rfcsr_write_chanreg(rt2x00dev, 54, 0x07);
8857        rt2800_rfcsr_write_chanreg(rt2x00dev, 55, 0xA8);
8858        rt2800_rfcsr_write_chanreg(rt2x00dev, 56, 0x85);
8859        rt2800_rfcsr_write_chanreg(rt2x00dev, 57, 0x10);
8860        rt2800_rfcsr_write_chanreg(rt2x00dev, 58, 0x07);
8861        rt2800_rfcsr_write_chanreg(rt2x00dev, 59, 0x6A);
8862        rt2800_rfcsr_write_chanreg(rt2x00dev, 60, 0x85);
8863        rt2800_rfcsr_write_chanreg(rt2x00dev, 61, 0x10);
8864        rt2800_rfcsr_write_chanreg(rt2x00dev, 62, 0x1C);
8865        rt2800_rfcsr_write_chanreg(rt2x00dev, 63, 0x00);
8866
8867        rt2800_rfcsr_write_bank(rt2x00dev, 6, 45, 0xC5);
8868
8869        rt2800_rfcsr_write_chanreg(rt2x00dev, 9, 0x47);
8870        rt2800_rfcsr_write_chanreg(rt2x00dev, 10, 0x71);
8871        rt2800_rfcsr_write_chanreg(rt2x00dev, 11, 0x33);
8872        rt2800_rfcsr_write_chanreg(rt2x00dev, 14, 0x0E);
8873        rt2800_rfcsr_write_chanreg(rt2x00dev, 17, 0x23);
8874        rt2800_rfcsr_write_chanreg(rt2x00dev, 19, 0xA4);
8875        rt2800_rfcsr_write_chanreg(rt2x00dev, 20, 0x02);
8876        rt2800_rfcsr_write_chanreg(rt2x00dev, 21, 0x12);
8877        rt2800_rfcsr_write_chanreg(rt2x00dev, 28, 0x1C);
8878        rt2800_rfcsr_write_chanreg(rt2x00dev, 29, 0xEB);
8879        rt2800_rfcsr_write_chanreg(rt2x00dev, 32, 0x7D);
8880        rt2800_rfcsr_write_chanreg(rt2x00dev, 34, 0xD6);
8881        rt2800_rfcsr_write_chanreg(rt2x00dev, 36, 0x08);
8882        rt2800_rfcsr_write_chanreg(rt2x00dev, 38, 0xB4);
8883        rt2800_rfcsr_write_chanreg(rt2x00dev, 43, 0xD3);
8884        rt2800_rfcsr_write_chanreg(rt2x00dev, 44, 0xB3);
8885        rt2800_rfcsr_write_chanreg(rt2x00dev, 45, 0xD5);
8886        rt2800_rfcsr_write_chanreg(rt2x00dev, 46, 0x27);
8887        rt2800_rfcsr_write_bank(rt2x00dev, 4, 47, 0x67);
8888        rt2800_rfcsr_write_bank(rt2x00dev, 6, 47, 0x69);
8889        rt2800_rfcsr_write_chanreg(rt2x00dev, 48, 0xFF);
8890        rt2800_rfcsr_write_bank(rt2x00dev, 4, 54, 0x27);
8891        rt2800_rfcsr_write_bank(rt2x00dev, 6, 54, 0x20);
8892        rt2800_rfcsr_write_chanreg(rt2x00dev, 55, 0x66);
8893        rt2800_rfcsr_write_chanreg(rt2x00dev, 56, 0xFF);
8894        rt2800_rfcsr_write_chanreg(rt2x00dev, 57, 0x1C);
8895        rt2800_rfcsr_write_chanreg(rt2x00dev, 58, 0x20);
8896        rt2800_rfcsr_write_chanreg(rt2x00dev, 59, 0x6B);
8897        rt2800_rfcsr_write_chanreg(rt2x00dev, 60, 0xF7);
8898        rt2800_rfcsr_write_chanreg(rt2x00dev, 61, 0x09);
8899
8900        rt2800_rfcsr_write_chanreg(rt2x00dev, 10, 0x51);
8901        rt2800_rfcsr_write_chanreg(rt2x00dev, 14, 0x06);
8902        rt2800_rfcsr_write_chanreg(rt2x00dev, 19, 0xA7);
8903        rt2800_rfcsr_write_chanreg(rt2x00dev, 28, 0x2C);
8904        rt2800_rfcsr_write_chanreg(rt2x00dev, 55, 0x64);
8905        rt2800_rfcsr_write_chanreg(rt2x00dev, 8, 0x51);
8906        rt2800_rfcsr_write_chanreg(rt2x00dev, 9, 0x36);
8907        rt2800_rfcsr_write_chanreg(rt2x00dev, 11, 0x53);
8908        rt2800_rfcsr_write_chanreg(rt2x00dev, 14, 0x16);
8909
8910        rt2800_rfcsr_write_chanreg(rt2x00dev, 47, 0x6C);
8911        rt2800_rfcsr_write_chanreg(rt2x00dev, 48, 0xFC);
8912        rt2800_rfcsr_write_chanreg(rt2x00dev, 49, 0x1F);
8913        rt2800_rfcsr_write_chanreg(rt2x00dev, 54, 0x27);
8914        rt2800_rfcsr_write_chanreg(rt2x00dev, 55, 0x66);
8915        rt2800_rfcsr_write_chanreg(rt2x00dev, 59, 0x6B);
8916
8917        /* Initialize RF channel register for DRQFN */
8918        rt2800_rfcsr_write_chanreg(rt2x00dev, 43, 0xD3);
8919        rt2800_rfcsr_write_chanreg(rt2x00dev, 44, 0xE3);
8920        rt2800_rfcsr_write_chanreg(rt2x00dev, 45, 0xE5);
8921        rt2800_rfcsr_write_chanreg(rt2x00dev, 47, 0x28);
8922        rt2800_rfcsr_write_chanreg(rt2x00dev, 55, 0x68);
8923        rt2800_rfcsr_write_chanreg(rt2x00dev, 56, 0xF7);
8924        rt2800_rfcsr_write_chanreg(rt2x00dev, 58, 0x02);
8925        rt2800_rfcsr_write_chanreg(rt2x00dev, 60, 0xC7);
8926
8927        /* Initialize RF DC calibration register to default value */
8928        rt2800_rfcsr_write_dccal(rt2x00dev, 0, 0x47);
8929        rt2800_rfcsr_write_dccal(rt2x00dev, 1, 0x00);
8930        rt2800_rfcsr_write_dccal(rt2x00dev, 2, 0x00);
8931        rt2800_rfcsr_write_dccal(rt2x00dev, 3, 0x00);
8932        rt2800_rfcsr_write_dccal(rt2x00dev, 4, 0x00);
8933        rt2800_rfcsr_write_dccal(rt2x00dev, 5, 0x00);
8934        rt2800_rfcsr_write_dccal(rt2x00dev, 6, 0x10);
8935        rt2800_rfcsr_write_dccal(rt2x00dev, 7, 0x10);
8936        rt2800_rfcsr_write_dccal(rt2x00dev, 8, 0x04);
8937        rt2800_rfcsr_write_dccal(rt2x00dev, 9, 0x00);
8938        rt2800_rfcsr_write_dccal(rt2x00dev, 10, 0x07);
8939        rt2800_rfcsr_write_dccal(rt2x00dev, 11, 0x01);
8940        rt2800_rfcsr_write_dccal(rt2x00dev, 12, 0x07);
8941        rt2800_rfcsr_write_dccal(rt2x00dev, 13, 0x07);
8942        rt2800_rfcsr_write_dccal(rt2x00dev, 14, 0x07);
8943        rt2800_rfcsr_write_dccal(rt2x00dev, 15, 0x20);
8944        rt2800_rfcsr_write_dccal(rt2x00dev, 16, 0x22);
8945        rt2800_rfcsr_write_dccal(rt2x00dev, 17, 0x00);
8946        rt2800_rfcsr_write_dccal(rt2x00dev, 18, 0x00);
8947        rt2800_rfcsr_write_dccal(rt2x00dev, 19, 0x00);
8948        rt2800_rfcsr_write_dccal(rt2x00dev, 20, 0x00);
8949        rt2800_rfcsr_write_dccal(rt2x00dev, 21, 0xF1);
8950        rt2800_rfcsr_write_dccal(rt2x00dev, 22, 0x11);
8951        rt2800_rfcsr_write_dccal(rt2x00dev, 23, 0x02);
8952        rt2800_rfcsr_write_dccal(rt2x00dev, 24, 0x41);
8953        rt2800_rfcsr_write_dccal(rt2x00dev, 25, 0x20);
8954        rt2800_rfcsr_write_dccal(rt2x00dev, 26, 0x00);
8955        rt2800_rfcsr_write_dccal(rt2x00dev, 27, 0xD7);
8956        rt2800_rfcsr_write_dccal(rt2x00dev, 28, 0xA2);
8957        rt2800_rfcsr_write_dccal(rt2x00dev, 29, 0x20);
8958        rt2800_rfcsr_write_dccal(rt2x00dev, 30, 0x49);
8959        rt2800_rfcsr_write_dccal(rt2x00dev, 31, 0x20);
8960        rt2800_rfcsr_write_dccal(rt2x00dev, 32, 0x04);
8961        rt2800_rfcsr_write_dccal(rt2x00dev, 33, 0xF1);
8962        rt2800_rfcsr_write_dccal(rt2x00dev, 34, 0xA1);
8963        rt2800_rfcsr_write_dccal(rt2x00dev, 35, 0x01);
8964        rt2800_rfcsr_write_dccal(rt2x00dev, 41, 0x00);
8965        rt2800_rfcsr_write_dccal(rt2x00dev, 42, 0x00);
8966        rt2800_rfcsr_write_dccal(rt2x00dev, 43, 0x00);
8967        rt2800_rfcsr_write_dccal(rt2x00dev, 44, 0x00);
8968        rt2800_rfcsr_write_dccal(rt2x00dev, 45, 0x00);
8969        rt2800_rfcsr_write_dccal(rt2x00dev, 46, 0x00);
8970        rt2800_rfcsr_write_dccal(rt2x00dev, 47, 0x3E);
8971        rt2800_rfcsr_write_dccal(rt2x00dev, 48, 0x3D);
8972        rt2800_rfcsr_write_dccal(rt2x00dev, 49, 0x3E);
8973        rt2800_rfcsr_write_dccal(rt2x00dev, 50, 0x3D);
8974        rt2800_rfcsr_write_dccal(rt2x00dev, 51, 0x3E);
8975        rt2800_rfcsr_write_dccal(rt2x00dev, 52, 0x3D);
8976        rt2800_rfcsr_write_dccal(rt2x00dev, 53, 0x00);
8977        rt2800_rfcsr_write_dccal(rt2x00dev, 54, 0x00);
8978        rt2800_rfcsr_write_dccal(rt2x00dev, 55, 0x00);
8979        rt2800_rfcsr_write_dccal(rt2x00dev, 56, 0x00);
8980        rt2800_rfcsr_write_dccal(rt2x00dev, 57, 0x00);
8981        rt2800_rfcsr_write_dccal(rt2x00dev, 58, 0x10);
8982        rt2800_rfcsr_write_dccal(rt2x00dev, 59, 0x10);
8983        rt2800_rfcsr_write_dccal(rt2x00dev, 60, 0x0A);
8984        rt2800_rfcsr_write_dccal(rt2x00dev, 61, 0x00);
8985        rt2800_rfcsr_write_dccal(rt2x00dev, 62, 0x00);
8986        rt2800_rfcsr_write_dccal(rt2x00dev, 63, 0x00);
8987
8988        rt2800_rfcsr_write_dccal(rt2x00dev, 3, 0x08);
8989        rt2800_rfcsr_write_dccal(rt2x00dev, 4, 0x04);
8990        rt2800_rfcsr_write_dccal(rt2x00dev, 5, 0x20);
8991
8992        rt2800_rfcsr_write_dccal(rt2x00dev, 5, 0x00);
8993        rt2800_rfcsr_write_dccal(rt2x00dev, 17, 0x7C);
8994
8995        rt2800_bw_filter_calibration(rt2x00dev, true);
8996        rt2800_bw_filter_calibration(rt2x00dev, false);
8997}
8998
8999static void rt2800_init_rfcsr(struct rt2x00_dev *rt2x00dev)
9000{
9001        if (rt2800_is_305x_soc(rt2x00dev)) {
9002                rt2800_init_rfcsr_305x_soc(rt2x00dev);
9003                return;
9004        }
9005
9006        switch (rt2x00dev->chip.rt) {
9007        case RT3070:
9008        case RT3071:
9009        case RT3090:
9010                rt2800_init_rfcsr_30xx(rt2x00dev);
9011                break;
9012        case RT3290:
9013                rt2800_init_rfcsr_3290(rt2x00dev);
9014                break;
9015        case RT3352:
9016                rt2800_init_rfcsr_3352(rt2x00dev);
9017                break;
9018        case RT3390:
9019                rt2800_init_rfcsr_3390(rt2x00dev);
9020                break;
9021        case RT3883:
9022                rt2800_init_rfcsr_3883(rt2x00dev);
9023                break;
9024        case RT3572:
9025                rt2800_init_rfcsr_3572(rt2x00dev);
9026                break;
9027        case RT3593:
9028                rt2800_init_rfcsr_3593(rt2x00dev);
9029                break;
9030        case RT5350:
9031                rt2800_init_rfcsr_5350(rt2x00dev);
9032                break;
9033        case RT5390:
9034                rt2800_init_rfcsr_5390(rt2x00dev);
9035                break;
9036        case RT5392:
9037                rt2800_init_rfcsr_5392(rt2x00dev);
9038                break;
9039        case RT5592:
9040                rt2800_init_rfcsr_5592(rt2x00dev);
9041                break;
9042        case RT6352:
9043                rt2800_init_rfcsr_6352(rt2x00dev);
9044                break;
9045        }
9046}
9047
9048int rt2800_enable_radio(struct rt2x00_dev *rt2x00dev)
9049{
9050        u32 reg;
9051        u16 word;
9052
9053        /*
9054         * Initialize MAC registers.
9055         */
9056        if (unlikely(rt2800_wait_wpdma_ready(rt2x00dev) ||
9057                     rt2800_init_registers(rt2x00dev)))
9058                return -EIO;
9059
9060        /*
9061         * Wait BBP/RF to wake up.
9062         */
9063        if (unlikely(rt2800_wait_bbp_rf_ready(rt2x00dev)))
9064                return -EIO;
9065
9066        /*
9067         * Send signal during boot time to initialize firmware.
9068         */
9069        rt2800_register_write(rt2x00dev, H2M_BBP_AGENT, 0);
9070        rt2800_register_write(rt2x00dev, H2M_MAILBOX_CSR, 0);
9071        if (rt2x00_is_usb(rt2x00dev))
9072                rt2800_register_write(rt2x00dev, H2M_INT_SRC, 0);
9073        rt2800_mcu_request(rt2x00dev, MCU_BOOT_SIGNAL, 0, 0, 0);
9074        msleep(1);
9075
9076        /*
9077         * Make sure BBP is up and running.
9078         */
9079        if (unlikely(rt2800_wait_bbp_ready(rt2x00dev)))
9080                return -EIO;
9081
9082        /*
9083         * Initialize BBP/RF registers.
9084         */
9085        rt2800_init_bbp(rt2x00dev);
9086        rt2800_init_rfcsr(rt2x00dev);
9087
9088        if (rt2x00_is_usb(rt2x00dev) &&
9089            (rt2x00_rt(rt2x00dev, RT3070) ||
9090             rt2x00_rt(rt2x00dev, RT3071) ||
9091             rt2x00_rt(rt2x00dev, RT3572))) {
9092                udelay(200);
9093                rt2800_mcu_request(rt2x00dev, MCU_CURRENT, 0, 0, 0);
9094                udelay(10);
9095        }
9096
9097        /*
9098         * Enable RX.
9099         */
9100        reg = rt2800_register_read(rt2x00dev, MAC_SYS_CTRL);
9101        rt2x00_set_field32(&reg, MAC_SYS_CTRL_ENABLE_TX, 1);
9102        rt2x00_set_field32(&reg, MAC_SYS_CTRL_ENABLE_RX, 0);
9103        rt2800_register_write(rt2x00dev, MAC_SYS_CTRL, reg);
9104
9105        udelay(50);
9106
9107        reg = rt2800_register_read(rt2x00dev, WPDMA_GLO_CFG);
9108        rt2x00_set_field32(&reg, WPDMA_GLO_CFG_ENABLE_TX_DMA, 1);
9109        rt2x00_set_field32(&reg, WPDMA_GLO_CFG_ENABLE_RX_DMA, 1);
9110        rt2x00_set_field32(&reg, WPDMA_GLO_CFG_TX_WRITEBACK_DONE, 1);
9111        rt2800_register_write(rt2x00dev, WPDMA_GLO_CFG, reg);
9112
9113        reg = rt2800_register_read(rt2x00dev, MAC_SYS_CTRL);
9114        rt2x00_set_field32(&reg, MAC_SYS_CTRL_ENABLE_TX, 1);
9115        rt2x00_set_field32(&reg, MAC_SYS_CTRL_ENABLE_RX, 1);
9116        rt2800_register_write(rt2x00dev, MAC_SYS_CTRL, reg);
9117
9118        /*
9119         * Initialize LED control
9120         */
9121        word = rt2800_eeprom_read(rt2x00dev, EEPROM_LED_AG_CONF);
9122        rt2800_mcu_request(rt2x00dev, MCU_LED_AG_CONF, 0xff,
9123                           word & 0xff, (word >> 8) & 0xff);
9124
9125        word = rt2800_eeprom_read(rt2x00dev, EEPROM_LED_ACT_CONF);
9126        rt2800_mcu_request(rt2x00dev, MCU_LED_ACT_CONF, 0xff,
9127                           word & 0xff, (word >> 8) & 0xff);
9128
9129        word = rt2800_eeprom_read(rt2x00dev, EEPROM_LED_POLARITY);
9130        rt2800_mcu_request(rt2x00dev, MCU_LED_LED_POLARITY, 0xff,
9131                           word & 0xff, (word >> 8) & 0xff);
9132
9133        return 0;
9134}
9135EXPORT_SYMBOL_GPL(rt2800_enable_radio);
9136
9137void rt2800_disable_radio(struct rt2x00_dev *rt2x00dev)
9138{
9139        u32 reg;
9140
9141        rt2800_disable_wpdma(rt2x00dev);
9142
9143        /* Wait for DMA, ignore error */
9144        rt2800_wait_wpdma_ready(rt2x00dev);
9145
9146        reg = rt2800_register_read(rt2x00dev, MAC_SYS_CTRL);
9147        rt2x00_set_field32(&reg, MAC_SYS_CTRL_ENABLE_TX, 0);
9148        rt2x00_set_field32(&reg, MAC_SYS_CTRL_ENABLE_RX, 0);
9149        rt2800_register_write(rt2x00dev, MAC_SYS_CTRL, reg);
9150}
9151EXPORT_SYMBOL_GPL(rt2800_disable_radio);
9152
9153int rt2800_efuse_detect(struct rt2x00_dev *rt2x00dev)
9154{
9155        u32 reg;
9156        u16 efuse_ctrl_reg;
9157
9158        if (rt2x00_rt(rt2x00dev, RT3290))
9159                efuse_ctrl_reg = EFUSE_CTRL_3290;
9160        else
9161                efuse_ctrl_reg = EFUSE_CTRL;
9162
9163        reg = rt2800_register_read(rt2x00dev, efuse_ctrl_reg);
9164        return rt2x00_get_field32(reg, EFUSE_CTRL_PRESENT);
9165}
9166EXPORT_SYMBOL_GPL(rt2800_efuse_detect);
9167
9168static void rt2800_efuse_read(struct rt2x00_dev *rt2x00dev, unsigned int i)
9169{
9170        u32 reg;
9171        u16 efuse_ctrl_reg;
9172        u16 efuse_data0_reg;
9173        u16 efuse_data1_reg;
9174        u16 efuse_data2_reg;
9175        u16 efuse_data3_reg;
9176
9177        if (rt2x00_rt(rt2x00dev, RT3290)) {
9178                efuse_ctrl_reg = EFUSE_CTRL_3290;
9179                efuse_data0_reg = EFUSE_DATA0_3290;
9180                efuse_data1_reg = EFUSE_DATA1_3290;
9181                efuse_data2_reg = EFUSE_DATA2_3290;
9182                efuse_data3_reg = EFUSE_DATA3_3290;
9183        } else {
9184                efuse_ctrl_reg = EFUSE_CTRL;
9185                efuse_data0_reg = EFUSE_DATA0;
9186                efuse_data1_reg = EFUSE_DATA1;
9187                efuse_data2_reg = EFUSE_DATA2;
9188                efuse_data3_reg = EFUSE_DATA3;
9189        }
9190        mutex_lock(&rt2x00dev->csr_mutex);
9191
9192        reg = rt2800_register_read_lock(rt2x00dev, efuse_ctrl_reg);
9193        rt2x00_set_field32(&reg, EFUSE_CTRL_ADDRESS_IN, i);
9194        rt2x00_set_field32(&reg, EFUSE_CTRL_MODE, 0);
9195        rt2x00_set_field32(&reg, EFUSE_CTRL_KICK, 1);
9196        rt2800_register_write_lock(rt2x00dev, efuse_ctrl_reg, reg);
9197
9198        /* Wait until the EEPROM has been loaded */
9199        rt2800_regbusy_read(rt2x00dev, efuse_ctrl_reg, EFUSE_CTRL_KICK, &reg);
9200        /* Apparently the data is read from end to start */
9201        reg = rt2800_register_read_lock(rt2x00dev, efuse_data3_reg);
9202        /* The returned value is in CPU order, but eeprom is le */
9203        *(u32 *)&rt2x00dev->eeprom[i] = cpu_to_le32(reg);
9204        reg = rt2800_register_read_lock(rt2x00dev, efuse_data2_reg);
9205        *(u32 *)&rt2x00dev->eeprom[i + 2] = cpu_to_le32(reg);
9206        reg = rt2800_register_read_lock(rt2x00dev, efuse_data1_reg);
9207        *(u32 *)&rt2x00dev->eeprom[i + 4] = cpu_to_le32(reg);
9208        reg = rt2800_register_read_lock(rt2x00dev, efuse_data0_reg);
9209        *(u32 *)&rt2x00dev->eeprom[i + 6] = cpu_to_le32(reg);
9210
9211        mutex_unlock(&rt2x00dev->csr_mutex);
9212}
9213
9214int rt2800_read_eeprom_efuse(struct rt2x00_dev *rt2x00dev)
9215{
9216        unsigned int i;
9217
9218        for (i = 0; i < EEPROM_SIZE / sizeof(u16); i += 8)
9219                rt2800_efuse_read(rt2x00dev, i);
9220
9221        return 0;
9222}
9223EXPORT_SYMBOL_GPL(rt2800_read_eeprom_efuse);
9224
9225static u8 rt2800_get_txmixer_gain_24g(struct rt2x00_dev *rt2x00dev)
9226{
9227        u16 word;
9228
9229        if (rt2x00_rt(rt2x00dev, RT3593) ||
9230            rt2x00_rt(rt2x00dev, RT3883))
9231                return 0;
9232
9233        word = rt2800_eeprom_read(rt2x00dev, EEPROM_TXMIXER_GAIN_BG);
9234        if ((word & 0x00ff) != 0x00ff)
9235                return rt2x00_get_field16(word, EEPROM_TXMIXER_GAIN_BG_VAL);
9236
9237        return 0;
9238}
9239
9240static u8 rt2800_get_txmixer_gain_5g(struct rt2x00_dev *rt2x00dev)
9241{
9242        u16 word;
9243
9244        if (rt2x00_rt(rt2x00dev, RT3593) ||
9245            rt2x00_rt(rt2x00dev, RT3883))
9246                return 0;
9247
9248        word = rt2800_eeprom_read(rt2x00dev, EEPROM_TXMIXER_GAIN_A);
9249        if ((word & 0x00ff) != 0x00ff)
9250                return rt2x00_get_field16(word, EEPROM_TXMIXER_GAIN_A_VAL);
9251
9252        return 0;
9253}
9254
9255static int rt2800_validate_eeprom(struct rt2x00_dev *rt2x00dev)
9256{
9257        struct rt2800_drv_data *drv_data = rt2x00dev->drv_data;
9258        u16 word;
9259        u8 *mac;
9260        u8 default_lna_gain;
9261        int retval;
9262
9263        /*
9264         * Read the EEPROM.
9265         */
9266        retval = rt2800_read_eeprom(rt2x00dev);
9267        if (retval)
9268                return retval;
9269
9270        /*
9271         * Start validation of the data that has been read.
9272         */
9273        mac = rt2800_eeprom_addr(rt2x00dev, EEPROM_MAC_ADDR_0);
9274        rt2x00lib_set_mac_address(rt2x00dev, mac);
9275
9276        word = rt2800_eeprom_read(rt2x00dev, EEPROM_NIC_CONF0);
9277        if (word == 0xffff) {
9278                rt2x00_set_field16(&word, EEPROM_NIC_CONF0_RXPATH, 2);
9279                rt2x00_set_field16(&word, EEPROM_NIC_CONF0_TXPATH, 1);
9280                rt2x00_set_field16(&word, EEPROM_NIC_CONF0_RF_TYPE, RF2820);
9281                rt2800_eeprom_write(rt2x00dev, EEPROM_NIC_CONF0, word);
9282                rt2x00_eeprom_dbg(rt2x00dev, "Antenna: 0x%04x\n", word);
9283        } else if (rt2x00_rt(rt2x00dev, RT2860) ||
9284                   rt2x00_rt(rt2x00dev, RT2872)) {
9285                /*
9286                 * There is a max of 2 RX streams for RT28x0 series
9287                 */
9288                if (rt2x00_get_field16(word, EEPROM_NIC_CONF0_RXPATH) > 2)
9289                        rt2x00_set_field16(&word, EEPROM_NIC_CONF0_RXPATH, 2);
9290                rt2800_eeprom_write(rt2x00dev, EEPROM_NIC_CONF0, word);
9291        }
9292
9293        word = rt2800_eeprom_read(rt2x00dev, EEPROM_NIC_CONF1);
9294        if (word == 0xffff) {
9295                rt2x00_set_field16(&word, EEPROM_NIC_CONF1_HW_RADIO, 0);
9296                rt2x00_set_field16(&word, EEPROM_NIC_CONF1_EXTERNAL_TX_ALC, 0);
9297                rt2x00_set_field16(&word, EEPROM_NIC_CONF1_EXTERNAL_LNA_2G, 0);
9298                rt2x00_set_field16(&word, EEPROM_NIC_CONF1_EXTERNAL_LNA_5G, 0);
9299                rt2x00_set_field16(&word, EEPROM_NIC_CONF1_CARDBUS_ACCEL, 0);
9300                rt2x00_set_field16(&word, EEPROM_NIC_CONF1_BW40M_SB_2G, 0);
9301                rt2x00_set_field16(&word, EEPROM_NIC_CONF1_BW40M_SB_5G, 0);
9302                rt2x00_set_field16(&word, EEPROM_NIC_CONF1_WPS_PBC, 0);
9303                rt2x00_set_field16(&word, EEPROM_NIC_CONF1_BW40M_2G, 0);
9304                rt2x00_set_field16(&word, EEPROM_NIC_CONF1_BW40M_5G, 0);
9305                rt2x00_set_field16(&word, EEPROM_NIC_CONF1_BROADBAND_EXT_LNA, 0);
9306                rt2x00_set_field16(&word, EEPROM_NIC_CONF1_ANT_DIVERSITY, 0);
9307                rt2x00_set_field16(&word, EEPROM_NIC_CONF1_INTERNAL_TX_ALC, 0);
9308                rt2x00_set_field16(&word, EEPROM_NIC_CONF1_BT_COEXIST, 0);
9309                rt2x00_set_field16(&word, EEPROM_NIC_CONF1_DAC_TEST, 0);
9310                rt2800_eeprom_write(rt2x00dev, EEPROM_NIC_CONF1, word);
9311                rt2x00_eeprom_dbg(rt2x00dev, "NIC: 0x%04x\n", word);
9312        }
9313
9314        word = rt2800_eeprom_read(rt2x00dev, EEPROM_FREQ);
9315        if ((word & 0x00ff) == 0x00ff) {
9316                rt2x00_set_field16(&word, EEPROM_FREQ_OFFSET, 0);
9317                rt2800_eeprom_write(rt2x00dev, EEPROM_FREQ, word);
9318                rt2x00_eeprom_dbg(rt2x00dev, "Freq: 0x%04x\n", word);
9319        }
9320        if ((word & 0xff00) == 0xff00) {
9321                rt2x00_set_field16(&word, EEPROM_FREQ_LED_MODE,
9322                                   LED_MODE_TXRX_ACTIVITY);
9323                rt2x00_set_field16(&word, EEPROM_FREQ_LED_POLARITY, 0);
9324                rt2800_eeprom_write(rt2x00dev, EEPROM_FREQ, word);
9325                rt2800_eeprom_write(rt2x00dev, EEPROM_LED_AG_CONF, 0x5555);
9326                rt2800_eeprom_write(rt2x00dev, EEPROM_LED_ACT_CONF, 0x2221);
9327                rt2800_eeprom_write(rt2x00dev, EEPROM_LED_POLARITY, 0xa9f8);
9328                rt2x00_eeprom_dbg(rt2x00dev, "Led Mode: 0x%04x\n", word);
9329        }
9330
9331        /*
9332         * During the LNA validation we are going to use
9333         * lna0 as correct value. Note that EEPROM_LNA
9334         * is never validated.
9335         */
9336        word = rt2800_eeprom_read(rt2x00dev, EEPROM_LNA);
9337        default_lna_gain = rt2x00_get_field16(word, EEPROM_LNA_A0);
9338
9339        word = rt2800_eeprom_read(rt2x00dev, EEPROM_RSSI_BG);
9340        if (abs(rt2x00_get_field16(word, EEPROM_RSSI_BG_OFFSET0)) > 10)
9341                rt2x00_set_field16(&word, EEPROM_RSSI_BG_OFFSET0, 0);
9342        if (abs(rt2x00_get_field16(word, EEPROM_RSSI_BG_OFFSET1)) > 10)
9343                rt2x00_set_field16(&word, EEPROM_RSSI_BG_OFFSET1, 0);
9344        rt2800_eeprom_write(rt2x00dev, EEPROM_RSSI_BG, word);
9345
9346        drv_data->txmixer_gain_24g = rt2800_get_txmixer_gain_24g(rt2x00dev);
9347
9348        word = rt2800_eeprom_read(rt2x00dev, EEPROM_RSSI_BG2);
9349        if (abs(rt2x00_get_field16(word, EEPROM_RSSI_BG2_OFFSET2)) > 10)
9350                rt2x00_set_field16(&word, EEPROM_RSSI_BG2_OFFSET2, 0);
9351        if (!rt2x00_rt(rt2x00dev, RT3593) &&
9352            !rt2x00_rt(rt2x00dev, RT3883)) {
9353                if (rt2x00_get_field16(word, EEPROM_RSSI_BG2_LNA_A1) == 0x00 ||
9354                    rt2x00_get_field16(word, EEPROM_RSSI_BG2_LNA_A1) == 0xff)
9355                        rt2x00_set_field16(&word, EEPROM_RSSI_BG2_LNA_A1,
9356                                           default_lna_gain);
9357        }
9358        rt2800_eeprom_write(rt2x00dev, EEPROM_RSSI_BG2, word);
9359
9360        drv_data->txmixer_gain_5g = rt2800_get_txmixer_gain_5g(rt2x00dev);
9361
9362        word = rt2800_eeprom_read(rt2x00dev, EEPROM_RSSI_A);
9363        if (abs(rt2x00_get_field16(word, EEPROM_RSSI_A_OFFSET0)) > 10)
9364                rt2x00_set_field16(&word, EEPROM_RSSI_A_OFFSET0, 0);
9365        if (abs(rt2x00_get_field16(word, EEPROM_RSSI_A_OFFSET1)) > 10)
9366                rt2x00_set_field16(&word, EEPROM_RSSI_A_OFFSET1, 0);
9367        rt2800_eeprom_write(rt2x00dev, EEPROM_RSSI_A, word);
9368
9369        word = rt2800_eeprom_read(rt2x00dev, EEPROM_RSSI_A2);
9370        if (abs(rt2x00_get_field16(word, EEPROM_RSSI_A2_OFFSET2)) > 10)
9371                rt2x00_set_field16(&word, EEPROM_RSSI_A2_OFFSET2, 0);
9372        if (!rt2x00_rt(rt2x00dev, RT3593) &&
9373            !rt2x00_rt(rt2x00dev, RT3883)) {
9374                if (rt2x00_get_field16(word, EEPROM_RSSI_A2_LNA_A2) == 0x00 ||
9375                    rt2x00_get_field16(word, EEPROM_RSSI_A2_LNA_A2) == 0xff)
9376                        rt2x00_set_field16(&word, EEPROM_RSSI_A2_LNA_A2,
9377                                           default_lna_gain);
9378        }
9379        rt2800_eeprom_write(rt2x00dev, EEPROM_RSSI_A2, word);
9380
9381        if (rt2x00_rt(rt2x00dev, RT3593) ||
9382            rt2x00_rt(rt2x00dev, RT3883)) {
9383                word = rt2800_eeprom_read(rt2x00dev, EEPROM_EXT_LNA2);
9384                if (rt2x00_get_field16(word, EEPROM_EXT_LNA2_A1) == 0x00 ||
9385                    rt2x00_get_field16(word, EEPROM_EXT_LNA2_A1) == 0xff)
9386                        rt2x00_set_field16(&word, EEPROM_EXT_LNA2_A1,
9387                                           default_lna_gain);
9388                if (rt2x00_get_field16(word, EEPROM_EXT_LNA2_A2) == 0x00 ||
9389                    rt2x00_get_field16(word, EEPROM_EXT_LNA2_A2) == 0xff)
9390                        rt2x00_set_field16(&word, EEPROM_EXT_LNA2_A1,
9391                                           default_lna_gain);
9392                rt2800_eeprom_write(rt2x00dev, EEPROM_EXT_LNA2, word);
9393        }
9394
9395        return 0;
9396}
9397
9398static int rt2800_init_eeprom(struct rt2x00_dev *rt2x00dev)
9399{
9400        u16 value;
9401        u16 eeprom;
9402        u16 rf;
9403
9404        /*
9405         * Read EEPROM word for configuration.
9406         */
9407        eeprom = rt2800_eeprom_read(rt2x00dev, EEPROM_NIC_CONF0);
9408
9409        /*
9410         * Identify RF chipset by EEPROM value
9411         * RT28xx/RT30xx: defined in "EEPROM_NIC_CONF0_RF_TYPE" field
9412         * RT53xx: defined in "EEPROM_CHIP_ID" field
9413         */
9414        if (rt2x00_rt(rt2x00dev, RT3290) ||
9415            rt2x00_rt(rt2x00dev, RT5390) ||
9416            rt2x00_rt(rt2x00dev, RT5392) ||
9417            rt2x00_rt(rt2x00dev, RT6352))
9418                rf = rt2800_eeprom_read(rt2x00dev, EEPROM_CHIP_ID);
9419        else if (rt2x00_rt(rt2x00dev, RT3352))
9420                rf = RF3322;
9421        else if (rt2x00_rt(rt2x00dev, RT3883))
9422                rf = RF3853;
9423        else if (rt2x00_rt(rt2x00dev, RT5350))
9424                rf = RF5350;
9425        else
9426                rf = rt2x00_get_field16(eeprom, EEPROM_NIC_CONF0_RF_TYPE);
9427
9428        switch (rf) {
9429        case RF2820:
9430        case RF2850:
9431        case RF2720:
9432        case RF2750:
9433        case RF3020:
9434        case RF2020:
9435        case RF3021:
9436        case RF3022:
9437        case RF3052:
9438        case RF3053:
9439        case RF3070:
9440        case RF3290:
9441        case RF3320:
9442        case RF3322:
9443        case RF3853:
9444        case RF5350:
9445        case RF5360:
9446        case RF5362:
9447        case RF5370:
9448        case RF5372:
9449        case RF5390:
9450        case RF5392:
9451        case RF5592:
9452        case RF7620:
9453                break;
9454        default:
9455                rt2x00_err(rt2x00dev, "Invalid RF chipset 0x%04x detected\n",
9456                           rf);
9457                return -ENODEV;
9458        }
9459
9460        rt2x00_set_rf(rt2x00dev, rf);
9461
9462        /*
9463         * Identify default antenna configuration.
9464         */
9465        rt2x00dev->default_ant.tx_chain_num =
9466            rt2x00_get_field16(eeprom, EEPROM_NIC_CONF0_TXPATH);
9467        rt2x00dev->default_ant.rx_chain_num =
9468            rt2x00_get_field16(eeprom, EEPROM_NIC_CONF0_RXPATH);
9469
9470        eeprom = rt2800_eeprom_read(rt2x00dev, EEPROM_NIC_CONF1);
9471
9472        if (rt2x00_rt(rt2x00dev, RT3070) ||
9473            rt2x00_rt(rt2x00dev, RT3090) ||
9474            rt2x00_rt(rt2x00dev, RT3352) ||
9475            rt2x00_rt(rt2x00dev, RT3390)) {
9476                value = rt2x00_get_field16(eeprom,
9477                                EEPROM_NIC_CONF1_ANT_DIVERSITY);
9478                switch (value) {
9479                case 0:
9480                case 1:
9481                case 2:
9482                        rt2x00dev->default_ant.tx = ANTENNA_A;
9483                        rt2x00dev->default_ant.rx = ANTENNA_A;
9484                        break;
9485                case 3:
9486                        rt2x00dev->default_ant.tx = ANTENNA_A;
9487                        rt2x00dev->default_ant.rx = ANTENNA_B;
9488                        break;
9489                }
9490        } else {
9491                rt2x00dev->default_ant.tx = ANTENNA_A;
9492                rt2x00dev->default_ant.rx = ANTENNA_A;
9493        }
9494
9495        /* These chips have hardware RX antenna diversity */
9496        if (rt2x00_rt_rev_gte(rt2x00dev, RT5390, REV_RT5390R) ||
9497            rt2x00_rt_rev_gte(rt2x00dev, RT5390, REV_RT5370G)) {
9498                rt2x00dev->default_ant.tx = ANTENNA_HW_DIVERSITY; /* Unused */
9499                rt2x00dev->default_ant.rx = ANTENNA_HW_DIVERSITY; /* Unused */
9500        }
9501
9502        /*
9503         * Determine external LNA informations.
9504         */
9505        if (rt2x00_get_field16(eeprom, EEPROM_NIC_CONF1_EXTERNAL_LNA_5G))
9506                __set_bit(CAPABILITY_EXTERNAL_LNA_A, &rt2x00dev->cap_flags);
9507        if (rt2x00_get_field16(eeprom, EEPROM_NIC_CONF1_EXTERNAL_LNA_2G))
9508                __set_bit(CAPABILITY_EXTERNAL_LNA_BG, &rt2x00dev->cap_flags);
9509
9510        /*
9511         * Detect if this device has an hardware controlled radio.
9512         */
9513        if (rt2x00_get_field16(eeprom, EEPROM_NIC_CONF1_HW_RADIO))
9514                __set_bit(CAPABILITY_HW_BUTTON, &rt2x00dev->cap_flags);
9515
9516        /*
9517         * Detect if this device has Bluetooth co-existence.
9518         */
9519        if (!rt2x00_rt(rt2x00dev, RT3352) &&
9520            rt2x00_get_field16(eeprom, EEPROM_NIC_CONF1_BT_COEXIST))
9521                __set_bit(CAPABILITY_BT_COEXIST, &rt2x00dev->cap_flags);
9522
9523        /*
9524         * Read frequency offset and RF programming sequence.
9525         */
9526        eeprom = rt2800_eeprom_read(rt2x00dev, EEPROM_FREQ);
9527        rt2x00dev->freq_offset = rt2x00_get_field16(eeprom, EEPROM_FREQ_OFFSET);
9528
9529        /*
9530         * Store led settings, for correct led behaviour.
9531         */
9532#ifdef CONFIG_RT2X00_LIB_LEDS
9533        rt2800_init_led(rt2x00dev, &rt2x00dev->led_radio, LED_TYPE_RADIO);
9534        rt2800_init_led(rt2x00dev, &rt2x00dev->led_assoc, LED_TYPE_ASSOC);
9535        rt2800_init_led(rt2x00dev, &rt2x00dev->led_qual, LED_TYPE_QUALITY);
9536
9537        rt2x00dev->led_mcu_reg = eeprom;
9538#endif /* CONFIG_RT2X00_LIB_LEDS */
9539
9540        /*
9541         * Check if support EIRP tx power limit feature.
9542         */
9543        eeprom = rt2800_eeprom_read(rt2x00dev, EEPROM_EIRP_MAX_TX_POWER);
9544
9545        if (rt2x00_get_field16(eeprom, EEPROM_EIRP_MAX_TX_POWER_2GHZ) <
9546                                        EIRP_MAX_TX_POWER_LIMIT)
9547                __set_bit(CAPABILITY_POWER_LIMIT, &rt2x00dev->cap_flags);
9548
9549        /*
9550         * Detect if device uses internal or external PA
9551         */
9552        eeprom = rt2800_eeprom_read(rt2x00dev, EEPROM_NIC_CONF1);
9553
9554        if (rt2x00_rt(rt2x00dev, RT3352)) {
9555                if (rt2x00_get_field16(eeprom,
9556                    EEPROM_NIC_CONF1_EXTERNAL_TX0_PA_3352))
9557                    __set_bit(CAPABILITY_EXTERNAL_PA_TX0,
9558                              &rt2x00dev->cap_flags);
9559                if (rt2x00_get_field16(eeprom,
9560                    EEPROM_NIC_CONF1_EXTERNAL_TX1_PA_3352))
9561                    __set_bit(CAPABILITY_EXTERNAL_PA_TX1,
9562                              &rt2x00dev->cap_flags);
9563        }
9564
9565        return 0;
9566}
9567
9568/*
9569 * RF value list for rt28xx
9570 * Supports: 2.4 GHz (all) & 5.2 GHz (RF2850 & RF2750)
9571 */
9572static const struct rf_channel rf_vals[] = {
9573        { 1,  0x18402ecc, 0x184c0786, 0x1816b455, 0x1800510b },
9574        { 2,  0x18402ecc, 0x184c0786, 0x18168a55, 0x1800519f },
9575        { 3,  0x18402ecc, 0x184c078a, 0x18168a55, 0x1800518b },
9576        { 4,  0x18402ecc, 0x184c078a, 0x18168a55, 0x1800519f },
9577        { 5,  0x18402ecc, 0x184c078e, 0x18168a55, 0x1800518b },
9578        { 6,  0x18402ecc, 0x184c078e, 0x18168a55, 0x1800519f },
9579        { 7,  0x18402ecc, 0x184c0792, 0x18168a55, 0x1800518b },
9580        { 8,  0x18402ecc, 0x184c0792, 0x18168a55, 0x1800519f },
9581        { 9,  0x18402ecc, 0x184c0796, 0x18168a55, 0x1800518b },
9582        { 10, 0x18402ecc, 0x184c0796, 0x18168a55, 0x1800519f },
9583        { 11, 0x18402ecc, 0x184c079a, 0x18168a55, 0x1800518b },
9584        { 12, 0x18402ecc, 0x184c079a, 0x18168a55, 0x1800519f },
9585        { 13, 0x18402ecc, 0x184c079e, 0x18168a55, 0x1800518b },
9586        { 14, 0x18402ecc, 0x184c07a2, 0x18168a55, 0x18005193 },
9587
9588        /* 802.11 UNI / HyperLan 2 */
9589        { 36, 0x18402ecc, 0x184c099a, 0x18158a55, 0x180ed1a3 },
9590        { 38, 0x18402ecc, 0x184c099e, 0x18158a55, 0x180ed193 },
9591        { 40, 0x18402ec8, 0x184c0682, 0x18158a55, 0x180ed183 },
9592        { 44, 0x18402ec8, 0x184c0682, 0x18158a55, 0x180ed1a3 },
9593        { 46, 0x18402ec8, 0x184c0686, 0x18158a55, 0x180ed18b },
9594        { 48, 0x18402ec8, 0x184c0686, 0x18158a55, 0x180ed19b },
9595        { 52, 0x18402ec8, 0x184c068a, 0x18158a55, 0x180ed193 },
9596        { 54, 0x18402ec8, 0x184c068a, 0x18158a55, 0x180ed1a3 },
9597        { 56, 0x18402ec8, 0x184c068e, 0x18158a55, 0x180ed18b },
9598        { 60, 0x18402ec8, 0x184c0692, 0x18158a55, 0x180ed183 },
9599        { 62, 0x18402ec8, 0x184c0692, 0x18158a55, 0x180ed193 },
9600        { 64, 0x18402ec8, 0x184c0692, 0x18158a55, 0x180ed1a3 },
9601
9602        /* 802.11 HyperLan 2 */
9603        { 100, 0x18402ec8, 0x184c06b2, 0x18178a55, 0x180ed783 },
9604        { 102, 0x18402ec8, 0x184c06b2, 0x18578a55, 0x180ed793 },
9605        { 104, 0x18402ec8, 0x185c06b2, 0x18578a55, 0x180ed1a3 },
9606        { 108, 0x18402ecc, 0x185c0a32, 0x18578a55, 0x180ed193 },
9607        { 110, 0x18402ecc, 0x184c0a36, 0x18178a55, 0x180ed183 },
9608        { 112, 0x18402ecc, 0x184c0a36, 0x18178a55, 0x180ed19b },
9609        { 116, 0x18402ecc, 0x184c0a3a, 0x18178a55, 0x180ed1a3 },
9610        { 118, 0x18402ecc, 0x184c0a3e, 0x18178a55, 0x180ed193 },
9611        { 120, 0x18402ec4, 0x184c0382, 0x18178a55, 0x180ed183 },
9612        { 124, 0x18402ec4, 0x184c0382, 0x18178a55, 0x180ed193 },
9613        { 126, 0x18402ec4, 0x184c0382, 0x18178a55, 0x180ed15b },
9614        { 128, 0x18402ec4, 0x184c0382, 0x18178a55, 0x180ed1a3 },
9615        { 132, 0x18402ec4, 0x184c0386, 0x18178a55, 0x180ed18b },
9616        { 134, 0x18402ec4, 0x184c0386, 0x18178a55, 0x180ed193 },
9617        { 136, 0x18402ec4, 0x184c0386, 0x18178a55, 0x180ed19b },
9618        { 140, 0x18402ec4, 0x184c038a, 0x18178a55, 0x180ed183 },
9619
9620        /* 802.11 UNII */
9621        { 149, 0x18402ec4, 0x184c038a, 0x18178a55, 0x180ed1a7 },
9622        { 151, 0x18402ec4, 0x184c038e, 0x18178a55, 0x180ed187 },
9623        { 153, 0x18402ec4, 0x184c038e, 0x18178a55, 0x180ed18f },
9624        { 157, 0x18402ec4, 0x184c038e, 0x18178a55, 0x180ed19f },
9625        { 159, 0x18402ec4, 0x184c038e, 0x18178a55, 0x180ed1a7 },
9626        { 161, 0x18402ec4, 0x184c0392, 0x18178a55, 0x180ed187 },
9627        { 165, 0x18402ec4, 0x184c0392, 0x18178a55, 0x180ed197 },
9628        { 167, 0x18402ec4, 0x184c03d2, 0x18179855, 0x1815531f },
9629        { 169, 0x18402ec4, 0x184c03d2, 0x18179855, 0x18155327 },
9630        { 171, 0x18402ec4, 0x184c03d6, 0x18179855, 0x18155307 },
9631        { 173, 0x18402ec4, 0x184c03d6, 0x18179855, 0x1815530f },
9632
9633        /* 802.11 Japan */
9634        { 184, 0x15002ccc, 0x1500491e, 0x1509be55, 0x150c0a0b },
9635        { 188, 0x15002ccc, 0x15004922, 0x1509be55, 0x150c0a13 },
9636        { 192, 0x15002ccc, 0x15004926, 0x1509be55, 0x150c0a1b },
9637        { 196, 0x15002ccc, 0x1500492a, 0x1509be55, 0x150c0a23 },
9638        { 208, 0x15002ccc, 0x1500493a, 0x1509be55, 0x150c0a13 },
9639        { 212, 0x15002ccc, 0x1500493e, 0x1509be55, 0x150c0a1b },
9640        { 216, 0x15002ccc, 0x15004982, 0x1509be55, 0x150c0a23 },
9641};
9642
9643/*
9644 * RF value list for rt3xxx
9645 * Supports: 2.4 GHz (all) & 5.2 GHz (RF3052 & RF3053)
9646 */
9647static const struct rf_channel rf_vals_3x[] = {
9648        {1,  241, 2, 2 },
9649        {2,  241, 2, 7 },
9650        {3,  242, 2, 2 },
9651        {4,  242, 2, 7 },
9652        {5,  243, 2, 2 },
9653        {6,  243, 2, 7 },
9654        {7,  244, 2, 2 },
9655        {8,  244, 2, 7 },
9656        {9,  245, 2, 2 },
9657        {10, 245, 2, 7 },
9658        {11, 246, 2, 2 },
9659        {12, 246, 2, 7 },
9660        {13, 247, 2, 2 },
9661        {14, 248, 2, 4 },
9662
9663        /* 802.11 UNI / HyperLan 2 */
9664        {36, 0x56, 0, 4},
9665        {38, 0x56, 0, 6},
9666        {40, 0x56, 0, 8},
9667        {44, 0x57, 0, 0},
9668        {46, 0x57, 0, 2},
9669        {48, 0x57, 0, 4},
9670        {52, 0x57, 0, 8},
9671        {54, 0x57, 0, 10},
9672        {56, 0x58, 0, 0},
9673        {60, 0x58, 0, 4},
9674        {62, 0x58, 0, 6},
9675        {64, 0x58, 0, 8},
9676
9677        /* 802.11 HyperLan 2 */
9678        {100, 0x5b, 0, 8},
9679        {102, 0x5b, 0, 10},
9680        {104, 0x5c, 0, 0},
9681        {108, 0x5c, 0, 4},
9682        {110, 0x5c, 0, 6},
9683        {112, 0x5c, 0, 8},
9684        {116, 0x5d, 0, 0},
9685        {118, 0x5d, 0, 2},
9686        {120, 0x5d, 0, 4},
9687        {124, 0x5d, 0, 8},
9688        {126, 0x5d, 0, 10},
9689        {128, 0x5e, 0, 0},
9690        {132, 0x5e, 0, 4},
9691        {134, 0x5e, 0, 6},
9692        {136, 0x5e, 0, 8},
9693        {140, 0x5f, 0, 0},
9694
9695        /* 802.11 UNII */
9696        {149, 0x5f, 0, 9},
9697        {151, 0x5f, 0, 11},
9698        {153, 0x60, 0, 1},
9699        {157, 0x60, 0, 5},
9700        {159, 0x60, 0, 7},
9701        {161, 0x60, 0, 9},
9702        {165, 0x61, 0, 1},
9703        {167, 0x61, 0, 3},
9704        {169, 0x61, 0, 5},
9705        {171, 0x61, 0, 7},
9706        {173, 0x61, 0, 9},
9707};
9708
9709/*
9710 * RF value list for rt3xxx with Xtal20MHz
9711 * Supports: 2.4 GHz (all) (RF3322)
9712 */
9713static const struct rf_channel rf_vals_3x_xtal20[] = {
9714        {1,    0xE2,     2,  0x14},
9715        {2,    0xE3,     2,  0x14},
9716        {3,    0xE4,     2,  0x14},
9717        {4,    0xE5,     2,  0x14},
9718        {5,    0xE6,     2,  0x14},
9719        {6,    0xE7,     2,  0x14},
9720        {7,    0xE8,     2,  0x14},
9721        {8,    0xE9,     2,  0x14},
9722        {9,    0xEA,     2,  0x14},
9723        {10,   0xEB,     2,  0x14},
9724        {11,   0xEC,     2,  0x14},
9725        {12,   0xED,     2,  0x14},
9726        {13,   0xEE,     2,  0x14},
9727        {14,   0xF0,     2,  0x18},
9728};
9729
9730static const struct rf_channel rf_vals_3853[] = {
9731        {1,  241, 6, 2},
9732        {2,  241, 6, 7},
9733        {3,  242, 6, 2},
9734        {4,  242, 6, 7},
9735        {5,  243, 6, 2},
9736        {6,  243, 6, 7},
9737        {7,  244, 6, 2},
9738        {8,  244, 6, 7},
9739        {9,  245, 6, 2},
9740        {10, 245, 6, 7},
9741        {11, 246, 6, 2},
9742        {12, 246, 6, 7},
9743        {13, 247, 6, 2},
9744        {14, 248, 6, 4},
9745
9746        {36, 0x56, 8, 4},
9747        {38, 0x56, 8, 6},
9748        {40, 0x56, 8, 8},
9749        {44, 0x57, 8, 0},
9750        {46, 0x57, 8, 2},
9751        {48, 0x57, 8, 4},
9752        {52, 0x57, 8, 8},
9753        {54, 0x57, 8, 10},
9754        {56, 0x58, 8, 0},
9755        {60, 0x58, 8, 4},
9756        {62, 0x58, 8, 6},
9757        {64, 0x58, 8, 8},
9758
9759        {100, 0x5b, 8, 8},
9760        {102, 0x5b, 8, 10},
9761        {104, 0x5c, 8, 0},
9762        {108, 0x5c, 8, 4},
9763        {110, 0x5c, 8, 6},
9764        {112, 0x5c, 8, 8},
9765        {114, 0x5c, 8, 10},
9766        {116, 0x5d, 8, 0},
9767        {118, 0x5d, 8, 2},
9768        {120, 0x5d, 8, 4},
9769        {124, 0x5d, 8, 8},
9770        {126, 0x5d, 8, 10},
9771        {128, 0x5e, 8, 0},
9772        {132, 0x5e, 8, 4},
9773        {134, 0x5e, 8, 6},
9774        {136, 0x5e, 8, 8},
9775        {140, 0x5f, 8, 0},
9776
9777        {149, 0x5f, 8, 9},
9778        {151, 0x5f, 8, 11},
9779        {153, 0x60, 8, 1},
9780        {157, 0x60, 8, 5},
9781        {159, 0x60, 8, 7},
9782        {161, 0x60, 8, 9},
9783        {165, 0x61, 8, 1},
9784        {167, 0x61, 8, 3},
9785        {169, 0x61, 8, 5},
9786        {171, 0x61, 8, 7},
9787        {173, 0x61, 8, 9},
9788};
9789
9790static const struct rf_channel rf_vals_5592_xtal20[] = {
9791        /* Channel, N, K, mod, R */
9792        {1, 482, 4, 10, 3},
9793        {2, 483, 4, 10, 3},
9794        {3, 484, 4, 10, 3},
9795        {4, 485, 4, 10, 3},
9796        {5, 486, 4, 10, 3},
9797        {6, 487, 4, 10, 3},
9798        {7, 488, 4, 10, 3},
9799        {8, 489, 4, 10, 3},
9800        {9, 490, 4, 10, 3},
9801        {10, 491, 4, 10, 3},
9802        {11, 492, 4, 10, 3},
9803        {12, 493, 4, 10, 3},
9804        {13, 494, 4, 10, 3},
9805        {14, 496, 8, 10, 3},
9806        {36, 172, 8, 12, 1},
9807        {38, 173, 0, 12, 1},
9808        {40, 173, 4, 12, 1},
9809        {42, 173, 8, 12, 1},
9810        {44, 174, 0, 12, 1},
9811        {46, 174, 4, 12, 1},
9812        {48, 174, 8, 12, 1},
9813        {50, 175, 0, 12, 1},
9814        {52, 175, 4, 12, 1},
9815        {54, 175, 8, 12, 1},
9816        {56, 176, 0, 12, 1},
9817        {58, 176, 4, 12, 1},
9818        {60, 176, 8, 12, 1},
9819        {62, 177, 0, 12, 1},
9820        {64, 177, 4, 12, 1},
9821        {100, 183, 4, 12, 1},
9822        {102, 183, 8, 12, 1},
9823        {104, 184, 0, 12, 1},
9824        {106, 184, 4, 12, 1},
9825        {108, 184, 8, 12, 1},
9826        {110, 185, 0, 12, 1},
9827        {112, 185, 4, 12, 1},
9828        {114, 185, 8, 12, 1},
9829        {116, 186, 0, 12, 1},
9830        {118, 186, 4, 12, 1},
9831        {120, 186, 8, 12, 1},
9832        {122, 187, 0, 12, 1},
9833        {124, 187, 4, 12, 1},
9834        {126, 187, 8, 12, 1},
9835        {128, 188, 0, 12, 1},
9836        {130, 188, 4, 12, 1},
9837        {132, 188, 8, 12, 1},
9838        {134, 189, 0, 12, 1},
9839        {136, 189, 4, 12, 1},
9840        {138, 189, 8, 12, 1},
9841        {140, 190, 0, 12, 1},
9842        {149, 191, 6, 12, 1},
9843        {151, 191, 10, 12, 1},
9844        {153, 192, 2, 12, 1},
9845        {155, 192, 6, 12, 1},
9846        {157, 192, 10, 12, 1},
9847        {159, 193, 2, 12, 1},
9848        {161, 193, 6, 12, 1},
9849        {165, 194, 2, 12, 1},
9850        {184, 164, 0, 12, 1},
9851        {188, 164, 4, 12, 1},
9852        {192, 165, 8, 12, 1},
9853        {196, 166, 0, 12, 1},
9854};
9855
9856static const struct rf_channel rf_vals_5592_xtal40[] = {
9857        /* Channel, N, K, mod, R */
9858        {1, 241, 2, 10, 3},
9859        {2, 241, 7, 10, 3},
9860        {3, 242, 2, 10, 3},
9861        {4, 242, 7, 10, 3},
9862        {5, 243, 2, 10, 3},
9863        {6, 243, 7, 10, 3},
9864        {7, 244, 2, 10, 3},
9865        {8, 244, 7, 10, 3},
9866        {9, 245, 2, 10, 3},
9867        {10, 245, 7, 10, 3},
9868        {11, 246, 2, 10, 3},
9869        {12, 246, 7, 10, 3},
9870        {13, 247, 2, 10, 3},
9871        {14, 248, 4, 10, 3},
9872        {36, 86, 4, 12, 1},
9873        {38, 86, 6, 12, 1},
9874        {40, 86, 8, 12, 1},
9875        {42, 86, 10, 12, 1},
9876        {44, 87, 0, 12, 1},
9877        {46, 87, 2, 12, 1},
9878        {48, 87, 4, 12, 1},
9879        {50, 87, 6, 12, 1},
9880        {52, 87, 8, 12, 1},
9881        {54, 87, 10, 12, 1},
9882        {56, 88, 0, 12, 1},
9883        {58, 88, 2, 12, 1},
9884        {60, 88, 4, 12, 1},
9885        {62, 88, 6, 12, 1},
9886        {64, 88, 8, 12, 1},
9887        {100, 91, 8, 12, 1},
9888        {102, 91, 10, 12, 1},
9889        {104, 92, 0, 12, 1},
9890        {106, 92, 2, 12, 1},
9891        {108, 92, 4, 12, 1},
9892        {110, 92, 6, 12, 1},
9893        {112, 92, 8, 12, 1},
9894        {114, 92, 10, 12, 1},
9895        {116, 93, 0, 12, 1},
9896        {118, 93, 2, 12, 1},
9897        {120, 93, 4, 12, 1},
9898        {122, 93, 6, 12, 1},
9899        {124, 93, 8, 12, 1},
9900        {126, 93, 10, 12, 1},
9901        {128, 94, 0, 12, 1},
9902        {130, 94, 2, 12, 1},
9903        {132, 94, 4, 12, 1},
9904        {134, 94, 6, 12, 1},
9905        {136, 94, 8, 12, 1},
9906        {138, 94, 10, 12, 1},
9907        {140, 95, 0, 12, 1},
9908        {149, 95, 9, 12, 1},
9909        {151, 95, 11, 12, 1},
9910        {153, 96, 1, 12, 1},
9911        {155, 96, 3, 12, 1},
9912        {157, 96, 5, 12, 1},
9913        {159, 96, 7, 12, 1},
9914        {161, 96, 9, 12, 1},
9915        {165, 97, 1, 12, 1},
9916        {184, 82, 0, 12, 1},
9917        {188, 82, 4, 12, 1},
9918        {192, 82, 8, 12, 1},
9919        {196, 83, 0, 12, 1},
9920};
9921
9922static const struct rf_channel rf_vals_7620[] = {
9923        {1, 0x50, 0x99, 0x99, 1},
9924        {2, 0x50, 0x44, 0x44, 2},
9925        {3, 0x50, 0xEE, 0xEE, 2},
9926        {4, 0x50, 0x99, 0x99, 3},
9927        {5, 0x51, 0x44, 0x44, 0},
9928        {6, 0x51, 0xEE, 0xEE, 0},
9929        {7, 0x51, 0x99, 0x99, 1},
9930        {8, 0x51, 0x44, 0x44, 2},
9931        {9, 0x51, 0xEE, 0xEE, 2},
9932        {10, 0x51, 0x99, 0x99, 3},
9933        {11, 0x52, 0x44, 0x44, 0},
9934        {12, 0x52, 0xEE, 0xEE, 0},
9935        {13, 0x52, 0x99, 0x99, 1},
9936        {14, 0x52, 0x33, 0x33, 3},
9937};
9938
9939static int rt2800_probe_hw_mode(struct rt2x00_dev *rt2x00dev)
9940{
9941        struct hw_mode_spec *spec = &rt2x00dev->spec;
9942        struct channel_info *info;
9943        char *default_power1;
9944        char *default_power2;
9945        char *default_power3;
9946        unsigned int i, tx_chains, rx_chains;
9947        u32 reg;
9948
9949        /*
9950         * Disable powersaving as default.
9951         */
9952        rt2x00dev->hw->wiphy->flags &= ~WIPHY_FLAG_PS_ON_BY_DEFAULT;
9953
9954        /*
9955         * Change default retry settings to values corresponding more closely
9956         * to rate[0].count setting of minstrel rate control algorithm.
9957         */
9958        rt2x00dev->hw->wiphy->retry_short = 2;
9959        rt2x00dev->hw->wiphy->retry_long = 2;
9960
9961        /*
9962         * Initialize all hw fields.
9963         */
9964        ieee80211_hw_set(rt2x00dev->hw, REPORTS_TX_ACK_STATUS);
9965        ieee80211_hw_set(rt2x00dev->hw, AMPDU_AGGREGATION);
9966        ieee80211_hw_set(rt2x00dev->hw, PS_NULLFUNC_STACK);
9967        ieee80211_hw_set(rt2x00dev->hw, SIGNAL_DBM);
9968        ieee80211_hw_set(rt2x00dev->hw, SUPPORTS_PS);
9969
9970        /*
9971         * Don't set IEEE80211_HW_HOST_BROADCAST_PS_BUFFERING for USB devices
9972         * unless we are capable of sending the buffered frames out after the
9973         * DTIM transmission using rt2x00lib_beacondone. This will send out
9974         * multicast and broadcast traffic immediately instead of buffering it
9975         * infinitly and thus dropping it after some time.
9976         */
9977        if (!rt2x00_is_usb(rt2x00dev))
9978                ieee80211_hw_set(rt2x00dev->hw, HOST_BROADCAST_PS_BUFFERING);
9979
9980        /* Set MFP if HW crypto is disabled. */
9981        if (rt2800_hwcrypt_disabled(rt2x00dev))
9982                ieee80211_hw_set(rt2x00dev->hw, MFP_CAPABLE);
9983
9984        SET_IEEE80211_DEV(rt2x00dev->hw, rt2x00dev->dev);
9985        SET_IEEE80211_PERM_ADDR(rt2x00dev->hw,
9986                                rt2800_eeprom_addr(rt2x00dev,
9987                                                   EEPROM_MAC_ADDR_0));
9988
9989        /*
9990         * As rt2800 has a global fallback table we cannot specify
9991         * more then one tx rate per frame but since the hw will
9992         * try several rates (based on the fallback table) we should
9993         * initialize max_report_rates to the maximum number of rates
9994         * we are going to try. Otherwise mac80211 will truncate our
9995         * reported tx rates and the rc algortihm will end up with
9996         * incorrect data.
9997         */
9998        rt2x00dev->hw->max_rates = 1;
9999        rt2x00dev->hw->max_report_rates = 7;
10000        rt2x00dev->hw->max_rate_tries = 1;
10001
10002        /*
10003         * Initialize hw_mode information.
10004         */
10005        spec->supported_rates = SUPPORT_RATE_CCK | SUPPORT_RATE_OFDM;
10006
10007        switch (rt2x00dev->chip.rf) {
10008        case RF2720:
10009        case RF2820:
10010                spec->num_channels = 14;
10011                spec->channels = rf_vals;
10012                break;
10013
10014        case RF2750:
10015        case RF2850:
10016                spec->num_channels = ARRAY_SIZE(rf_vals);
10017                spec->channels = rf_vals;
10018                break;
10019
10020        case RF2020:
10021        case RF3020:
10022        case RF3021:
10023        case RF3022:
10024        case RF3070:
10025        case RF3290:
10026        case RF3320:
10027        case RF3322:
10028        case RF5350:
10029        case RF5360:
10030        case RF5362:
10031        case RF5370:
10032        case RF5372:
10033        case RF5390:
10034        case RF5392:
10035                spec->num_channels = 14;
10036                if (rt2800_clk_is_20mhz(rt2x00dev))
10037                        spec->channels = rf_vals_3x_xtal20;
10038                else
10039                        spec->channels = rf_vals_3x;
10040                break;
10041
10042        case RF7620:
10043                spec->num_channels = ARRAY_SIZE(rf_vals_7620);
10044                spec->channels = rf_vals_7620;
10045                break;
10046
10047        case RF3052:
10048        case RF3053:
10049                spec->num_channels = ARRAY_SIZE(rf_vals_3x);
10050                spec->channels = rf_vals_3x;
10051                break;
10052
10053        case RF3853:
10054                spec->num_channels = ARRAY_SIZE(rf_vals_3853);
10055                spec->channels = rf_vals_3853;
10056                break;
10057
10058        case RF5592:
10059                reg = rt2800_register_read(rt2x00dev, MAC_DEBUG_INDEX);
10060                if (rt2x00_get_field32(reg, MAC_DEBUG_INDEX_XTAL)) {
10061                        spec->num_channels = ARRAY_SIZE(rf_vals_5592_xtal40);
10062                        spec->channels = rf_vals_5592_xtal40;
10063                } else {
10064                        spec->num_channels = ARRAY_SIZE(rf_vals_5592_xtal20);
10065                        spec->channels = rf_vals_5592_xtal20;
10066                }
10067                break;
10068        }
10069
10070        if (WARN_ON_ONCE(!spec->channels))
10071                return -ENODEV;
10072
10073        spec->supported_bands = SUPPORT_BAND_2GHZ;
10074        if (spec->num_channels > 14)
10075                spec->supported_bands |= SUPPORT_BAND_5GHZ;
10076
10077        /*
10078         * Initialize HT information.
10079         */
10080        if (!rt2x00_rf(rt2x00dev, RF2020))
10081                spec->ht.ht_supported = true;
10082        else
10083                spec->ht.ht_supported = false;
10084
10085        spec->ht.cap =
10086            IEEE80211_HT_CAP_SUP_WIDTH_20_40 |
10087            IEEE80211_HT_CAP_GRN_FLD |
10088            IEEE80211_HT_CAP_SGI_20 |
10089            IEEE80211_HT_CAP_SGI_40;
10090
10091        tx_chains = rt2x00dev->default_ant.tx_chain_num;
10092        rx_chains = rt2x00dev->default_ant.rx_chain_num;
10093
10094        if (tx_chains >= 2)
10095                spec->ht.cap |= IEEE80211_HT_CAP_TX_STBC;
10096
10097        spec->ht.cap |= rx_chains << IEEE80211_HT_CAP_RX_STBC_SHIFT;
10098
10099        spec->ht.ampdu_factor = (rx_chains > 1) ? 3 : 2;
10100        spec->ht.ampdu_density = 4;
10101        spec->ht.mcs.tx_params = IEEE80211_HT_MCS_TX_DEFINED;
10102        if (tx_chains != rx_chains) {
10103                spec->ht.mcs.tx_params |= IEEE80211_HT_MCS_TX_RX_DIFF;
10104                spec->ht.mcs.tx_params |=
10105                    (tx_chains - 1) << IEEE80211_HT_MCS_TX_MAX_STREAMS_SHIFT;
10106        }
10107
10108        switch (rx_chains) {
10109        case 3:
10110                spec->ht.mcs.rx_mask[2] = 0xff;
10111                /* fall through */
10112        case 2:
10113                spec->ht.mcs.rx_mask[1] = 0xff;
10114                /* fall through */
10115        case 1:
10116                spec->ht.mcs.rx_mask[0] = 0xff;
10117                spec->ht.mcs.rx_mask[4] = 0x1; /* MCS32 */
10118                break;
10119        }
10120
10121        /*
10122         * Create channel information array
10123         */
10124        info = kcalloc(spec->num_channels, sizeof(*info), GFP_KERNEL);
10125        if (!info)
10126                return -ENOMEM;
10127
10128        spec->channels_info = info;
10129
10130        default_power1 = rt2800_eeprom_addr(rt2x00dev, EEPROM_TXPOWER_BG1);
10131        default_power2 = rt2800_eeprom_addr(rt2x00dev, EEPROM_TXPOWER_BG2);
10132
10133        if (rt2x00dev->default_ant.tx_chain_num > 2)
10134                default_power3 = rt2800_eeprom_addr(rt2x00dev,
10135                                                    EEPROM_EXT_TXPOWER_BG3);
10136        else
10137                default_power3 = NULL;
10138
10139        for (i = 0; i < 14; i++) {
10140                info[i].default_power1 = default_power1[i];
10141                info[i].default_power2 = default_power2[i];
10142                if (default_power3)
10143                        info[i].default_power3 = default_power3[i];
10144        }
10145
10146        if (spec->num_channels > 14) {
10147                default_power1 = rt2800_eeprom_addr(rt2x00dev,
10148                                                    EEPROM_TXPOWER_A1);
10149                default_power2 = rt2800_eeprom_addr(rt2x00dev,
10150                                                    EEPROM_TXPOWER_A2);
10151
10152                if (rt2x00dev->default_ant.tx_chain_num > 2)
10153                        default_power3 =
10154                                rt2800_eeprom_addr(rt2x00dev,
10155                                                   EEPROM_EXT_TXPOWER_A3);
10156                else
10157                        default_power3 = NULL;
10158
10159                for (i = 14; i < spec->num_channels; i++) {
10160                        info[i].default_power1 = default_power1[i - 14];
10161                        info[i].default_power2 = default_power2[i - 14];
10162                        if (default_power3)
10163                                info[i].default_power3 = default_power3[i - 14];
10164                }
10165        }
10166
10167        switch (rt2x00dev->chip.rf) {
10168        case RF2020:
10169        case RF3020:
10170        case RF3021:
10171        case RF3022:
10172        case RF3320:
10173        case RF3052:
10174        case RF3053:
10175        case RF3070:
10176        case RF3290:
10177        case RF3853:
10178        case RF5350:
10179        case RF5360:
10180        case RF5362:
10181        case RF5370:
10182        case RF5372:
10183        case RF5390:
10184        case RF5392:
10185        case RF5592:
10186        case RF7620:
10187                __set_bit(CAPABILITY_VCO_RECALIBRATION, &rt2x00dev->cap_flags);
10188                break;
10189        }
10190
10191        return 0;
10192}
10193
10194static int rt2800_probe_rt(struct rt2x00_dev *rt2x00dev)
10195{
10196        u32 reg;
10197        u32 rt;
10198        u32 rev;
10199
10200        if (rt2x00_rt(rt2x00dev, RT3290))
10201                reg = rt2800_register_read(rt2x00dev, MAC_CSR0_3290);
10202        else
10203                reg = rt2800_register_read(rt2x00dev, MAC_CSR0);
10204
10205        rt = rt2x00_get_field32(reg, MAC_CSR0_CHIPSET);
10206        rev = rt2x00_get_field32(reg, MAC_CSR0_REVISION);
10207
10208        switch (rt) {
10209        case RT2860:
10210        case RT2872:
10211        case RT2883:
10212        case RT3070:
10213        case RT3071:
10214        case RT3090:
10215        case RT3290:
10216        case RT3352:
10217        case RT3390:
10218        case RT3572:
10219        case RT3593:
10220        case RT3883:
10221        case RT5350:
10222        case RT5390:
10223        case RT5392:
10224        case RT5592:
10225                break;
10226        default:
10227                rt2x00_err(rt2x00dev, "Invalid RT chipset 0x%04x, rev %04x detected\n",
10228                           rt, rev);
10229                return -ENODEV;
10230        }
10231
10232        if (rt == RT5390 && rt2x00_is_soc(rt2x00dev))
10233                rt = RT6352;
10234
10235        rt2x00_set_rt(rt2x00dev, rt, rev);
10236
10237        return 0;
10238}
10239
10240int rt2800_probe_hw(struct rt2x00_dev *rt2x00dev)
10241{
10242        int retval;
10243        u32 reg;
10244
10245        retval = rt2800_probe_rt(rt2x00dev);
10246        if (retval)
10247                return retval;
10248
10249        /*
10250         * Allocate eeprom data.
10251         */
10252        retval = rt2800_validate_eeprom(rt2x00dev);
10253        if (retval)
10254                return retval;
10255
10256        retval = rt2800_init_eeprom(rt2x00dev);
10257        if (retval)
10258                return retval;
10259
10260        /*
10261         * Enable rfkill polling by setting GPIO direction of the
10262         * rfkill switch GPIO pin correctly.
10263         */
10264        reg = rt2800_register_read(rt2x00dev, GPIO_CTRL);
10265        rt2x00_set_field32(&reg, GPIO_CTRL_DIR2, 1);
10266        rt2800_register_write(rt2x00dev, GPIO_CTRL, reg);
10267
10268        /*
10269         * Initialize hw specifications.
10270         */
10271        retval = rt2800_probe_hw_mode(rt2x00dev);
10272        if (retval)
10273                return retval;
10274
10275        /*
10276         * Set device capabilities.
10277         */
10278        __set_bit(CAPABILITY_CONTROL_FILTERS, &rt2x00dev->cap_flags);
10279        __set_bit(CAPABILITY_CONTROL_FILTER_PSPOLL, &rt2x00dev->cap_flags);
10280        if (!rt2x00_is_usb(rt2x00dev))
10281                __set_bit(CAPABILITY_PRE_TBTT_INTERRUPT, &rt2x00dev->cap_flags);
10282
10283        /*
10284         * Set device requirements.
10285         */
10286        if (!rt2x00_is_soc(rt2x00dev))
10287                __set_bit(REQUIRE_FIRMWARE, &rt2x00dev->cap_flags);
10288        __set_bit(REQUIRE_L2PAD, &rt2x00dev->cap_flags);
10289        __set_bit(REQUIRE_TXSTATUS_FIFO, &rt2x00dev->cap_flags);
10290        if (!rt2800_hwcrypt_disabled(rt2x00dev))
10291                __set_bit(CAPABILITY_HW_CRYPTO, &rt2x00dev->cap_flags);
10292        __set_bit(CAPABILITY_LINK_TUNING, &rt2x00dev->cap_flags);
10293        __set_bit(REQUIRE_HT_TX_DESC, &rt2x00dev->cap_flags);
10294        if (rt2x00_is_usb(rt2x00dev))
10295                __set_bit(REQUIRE_PS_AUTOWAKE, &rt2x00dev->cap_flags);
10296        else {
10297                __set_bit(REQUIRE_DMA, &rt2x00dev->cap_flags);
10298                __set_bit(REQUIRE_TASKLET_CONTEXT, &rt2x00dev->cap_flags);
10299        }
10300
10301        if (modparam_watchdog) {
10302                __set_bit(CAPABILITY_RESTART_HW, &rt2x00dev->cap_flags);
10303                rt2x00dev->link.watchdog_interval = msecs_to_jiffies(100);
10304        } else {
10305                rt2x00dev->link.watchdog_disabled = true;
10306        }
10307
10308        /*
10309         * Set the rssi offset.
10310         */
10311        rt2x00dev->rssi_offset = DEFAULT_RSSI_OFFSET;
10312
10313        return 0;
10314}
10315EXPORT_SYMBOL_GPL(rt2800_probe_hw);
10316
10317/*
10318 * IEEE80211 stack callback functions.
10319 */
10320void rt2800_get_key_seq(struct ieee80211_hw *hw,
10321                        struct ieee80211_key_conf *key,
10322                        struct ieee80211_key_seq *seq)
10323{
10324        struct rt2x00_dev *rt2x00dev = hw->priv;
10325        struct mac_iveiv_entry iveiv_entry;
10326        u32 offset;
10327
10328        if (key->cipher != WLAN_CIPHER_SUITE_TKIP)
10329                return;
10330
10331        offset = MAC_IVEIV_ENTRY(key->hw_key_idx);
10332        rt2800_register_multiread(rt2x00dev, offset,
10333                                      &iveiv_entry, sizeof(iveiv_entry));
10334
10335        memcpy(&seq->tkip.iv16, &iveiv_entry.iv[0], 2);
10336        memcpy(&seq->tkip.iv32, &iveiv_entry.iv[4], 4);
10337}
10338EXPORT_SYMBOL_GPL(rt2800_get_key_seq);
10339
10340int rt2800_set_rts_threshold(struct ieee80211_hw *hw, u32 value)
10341{
10342        struct rt2x00_dev *rt2x00dev = hw->priv;
10343        u32 reg;
10344        bool enabled = (value < IEEE80211_MAX_RTS_THRESHOLD);
10345
10346        reg = rt2800_register_read(rt2x00dev, TX_RTS_CFG);
10347        rt2x00_set_field32(&reg, TX_RTS_CFG_RTS_THRES, value);
10348        rt2800_register_write(rt2x00dev, TX_RTS_CFG, reg);
10349
10350        reg = rt2800_register_read(rt2x00dev, CCK_PROT_CFG);
10351        rt2x00_set_field32(&reg, CCK_PROT_CFG_RTS_TH_EN, enabled);
10352        rt2800_register_write(rt2x00dev, CCK_PROT_CFG, reg);
10353
10354        reg = rt2800_register_read(rt2x00dev, OFDM_PROT_CFG);
10355        rt2x00_set_field32(&reg, OFDM_PROT_CFG_RTS_TH_EN, enabled);
10356        rt2800_register_write(rt2x00dev, OFDM_PROT_CFG, reg);
10357
10358        reg = rt2800_register_read(rt2x00dev, MM20_PROT_CFG);
10359        rt2x00_set_field32(&reg, MM20_PROT_CFG_RTS_TH_EN, enabled);
10360        rt2800_register_write(rt2x00dev, MM20_PROT_CFG, reg);
10361
10362        reg = rt2800_register_read(rt2x00dev, MM40_PROT_CFG);
10363        rt2x00_set_field32(&reg, MM40_PROT_CFG_RTS_TH_EN, enabled);
10364        rt2800_register_write(rt2x00dev, MM40_PROT_CFG, reg);
10365
10366        reg = rt2800_register_read(rt2x00dev, GF20_PROT_CFG);
10367        rt2x00_set_field32(&reg, GF20_PROT_CFG_RTS_TH_EN, enabled);
10368        rt2800_register_write(rt2x00dev, GF20_PROT_CFG, reg);
10369
10370        reg = rt2800_register_read(rt2x00dev, GF40_PROT_CFG);
10371        rt2x00_set_field32(&reg, GF40_PROT_CFG_RTS_TH_EN, enabled);
10372        rt2800_register_write(rt2x00dev, GF40_PROT_CFG, reg);
10373
10374        return 0;
10375}
10376EXPORT_SYMBOL_GPL(rt2800_set_rts_threshold);
10377
10378int rt2800_conf_tx(struct ieee80211_hw *hw,
10379                   struct ieee80211_vif *vif, u16 queue_idx,
10380                   const struct ieee80211_tx_queue_params *params)
10381{
10382        struct rt2x00_dev *rt2x00dev = hw->priv;
10383        struct data_queue *queue;
10384        struct rt2x00_field32 field;
10385        int retval;
10386        u32 reg;
10387        u32 offset;
10388
10389        /*
10390         * First pass the configuration through rt2x00lib, that will
10391         * update the queue settings and validate the input. After that
10392         * we are free to update the registers based on the value
10393         * in the queue parameter.
10394         */
10395        retval = rt2x00mac_conf_tx(hw, vif, queue_idx, params);
10396        if (retval)
10397                return retval;
10398
10399        /*
10400         * We only need to perform additional register initialization
10401         * for WMM queues/
10402         */
10403        if (queue_idx >= 4)
10404                return 0;
10405
10406        queue = rt2x00queue_get_tx_queue(rt2x00dev, queue_idx);
10407
10408        /* Update WMM TXOP register */
10409        offset = WMM_TXOP0_CFG + (sizeof(u32) * (!!(queue_idx & 2)));
10410        field.bit_offset = (queue_idx & 1) * 16;
10411        field.bit_mask = 0xffff << field.bit_offset;
10412
10413        reg = rt2800_register_read(rt2x00dev, offset);
10414        rt2x00_set_field32(&reg, field, queue->txop);
10415        rt2800_register_write(rt2x00dev, offset, reg);
10416
10417        /* Update WMM registers */
10418        field.bit_offset = queue_idx * 4;
10419        field.bit_mask = 0xf << field.bit_offset;
10420
10421        reg = rt2800_register_read(rt2x00dev, WMM_AIFSN_CFG);
10422        rt2x00_set_field32(&reg, field, queue->aifs);
10423        rt2800_register_write(rt2x00dev, WMM_AIFSN_CFG, reg);
10424
10425        reg = rt2800_register_read(rt2x00dev, WMM_CWMIN_CFG);
10426        rt2x00_set_field32(&reg, field, queue->cw_min);
10427        rt2800_register_write(rt2x00dev, WMM_CWMIN_CFG, reg);
10428
10429        reg = rt2800_register_read(rt2x00dev, WMM_CWMAX_CFG);
10430        rt2x00_set_field32(&reg, field, queue->cw_max);
10431        rt2800_register_write(rt2x00dev, WMM_CWMAX_CFG, reg);
10432
10433        /* Update EDCA registers */
10434        offset = EDCA_AC0_CFG + (sizeof(u32) * queue_idx);
10435
10436        reg = rt2800_register_read(rt2x00dev, offset);
10437        rt2x00_set_field32(&reg, EDCA_AC0_CFG_TX_OP, queue->txop);
10438        rt2x00_set_field32(&reg, EDCA_AC0_CFG_AIFSN, queue->aifs);
10439        rt2x00_set_field32(&reg, EDCA_AC0_CFG_CWMIN, queue->cw_min);
10440        rt2x00_set_field32(&reg, EDCA_AC0_CFG_CWMAX, queue->cw_max);
10441        rt2800_register_write(rt2x00dev, offset, reg);
10442
10443        return 0;
10444}
10445EXPORT_SYMBOL_GPL(rt2800_conf_tx);
10446
10447u64 rt2800_get_tsf(struct ieee80211_hw *hw, struct ieee80211_vif *vif)
10448{
10449        struct rt2x00_dev *rt2x00dev = hw->priv;
10450        u64 tsf;
10451        u32 reg;
10452
10453        reg = rt2800_register_read(rt2x00dev, TSF_TIMER_DW1);
10454        tsf = (u64) rt2x00_get_field32(reg, TSF_TIMER_DW1_HIGH_WORD) << 32;
10455        reg = rt2800_register_read(rt2x00dev, TSF_TIMER_DW0);
10456        tsf |= rt2x00_get_field32(reg, TSF_TIMER_DW0_LOW_WORD);
10457
10458        return tsf;
10459}
10460EXPORT_SYMBOL_GPL(rt2800_get_tsf);
10461
10462int rt2800_ampdu_action(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
10463                        struct ieee80211_ampdu_params *params)
10464{
10465        struct ieee80211_sta *sta = params->sta;
10466        enum ieee80211_ampdu_mlme_action action = params->action;
10467        u16 tid = params->tid;
10468        struct rt2x00_sta *sta_priv = (struct rt2x00_sta *)sta->drv_priv;
10469        int ret = 0;
10470
10471        /*
10472         * Don't allow aggregation for stations the hardware isn't aware
10473         * of because tx status reports for frames to an unknown station
10474         * always contain wcid=WCID_END+1 and thus we can't distinguish
10475         * between multiple stations which leads to unwanted situations
10476         * when the hw reorders frames due to aggregation.
10477         */
10478        if (sta_priv->wcid > WCID_END)
10479                return 1;
10480
10481        switch (action) {
10482        case IEEE80211_AMPDU_RX_START:
10483        case IEEE80211_AMPDU_RX_STOP:
10484                /*
10485                 * The hw itself takes care of setting up BlockAck mechanisms.
10486                 * So, we only have to allow mac80211 to nagotiate a BlockAck
10487                 * agreement. Once that is done, the hw will BlockAck incoming
10488                 * AMPDUs without further setup.
10489                 */
10490                break;
10491        case IEEE80211_AMPDU_TX_START:
10492                ieee80211_start_tx_ba_cb_irqsafe(vif, sta->addr, tid);
10493                break;
10494        case IEEE80211_AMPDU_TX_STOP_CONT:
10495        case IEEE80211_AMPDU_TX_STOP_FLUSH:
10496        case IEEE80211_AMPDU_TX_STOP_FLUSH_CONT:
10497                ieee80211_stop_tx_ba_cb_irqsafe(vif, sta->addr, tid);
10498                break;
10499        case IEEE80211_AMPDU_TX_OPERATIONAL:
10500                break;
10501        default:
10502                rt2x00_warn((struct rt2x00_dev *)hw->priv,
10503                            "Unknown AMPDU action\n");
10504        }
10505
10506        return ret;
10507}
10508EXPORT_SYMBOL_GPL(rt2800_ampdu_action);
10509
10510int rt2800_get_survey(struct ieee80211_hw *hw, int idx,
10511                      struct survey_info *survey)
10512{
10513        struct rt2x00_dev *rt2x00dev = hw->priv;
10514        struct ieee80211_conf *conf = &hw->conf;
10515        u32 idle, busy, busy_ext;
10516
10517        if (idx != 0)
10518                return -ENOENT;
10519
10520        survey->channel = conf->chandef.chan;
10521
10522        idle = rt2800_register_read(rt2x00dev, CH_IDLE_STA);
10523        busy = rt2800_register_read(rt2x00dev, CH_BUSY_STA);
10524        busy_ext = rt2800_register_read(rt2x00dev, CH_BUSY_STA_SEC);
10525
10526        if (idle || busy) {
10527                survey->filled = SURVEY_INFO_TIME |
10528                                 SURVEY_INFO_TIME_BUSY |
10529                                 SURVEY_INFO_TIME_EXT_BUSY;
10530
10531                survey->time = (idle + busy) / 1000;
10532                survey->time_busy = busy / 1000;
10533                survey->time_ext_busy = busy_ext / 1000;
10534        }
10535
10536        if (!(hw->conf.flags & IEEE80211_CONF_OFFCHANNEL))
10537                survey->filled |= SURVEY_INFO_IN_USE;
10538
10539        return 0;
10540
10541}
10542EXPORT_SYMBOL_GPL(rt2800_get_survey);
10543
10544MODULE_AUTHOR(DRV_PROJECT ", Bartlomiej Zolnierkiewicz");
10545MODULE_VERSION(DRV_VERSION);
10546MODULE_DESCRIPTION("Ralink RT2800 library");
10547MODULE_LICENSE("GPL");
10548