linux/drivers/net/wireless/realtek/rtlwifi/rtl8192ee/phy.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0
   2/* Copyright(c) 2009-2014  Realtek Corporation.*/
   3
   4#include "../wifi.h"
   5#include "../pci.h"
   6#include "../ps.h"
   7#include "reg.h"
   8#include "def.h"
   9#include "phy.h"
  10#include "rf.h"
  11#include "dm.h"
  12#include "table.h"
  13
  14static u32 _rtl92ee_phy_rf_serial_read(struct ieee80211_hw *hw,
  15                                       enum radio_path rfpath, u32 offset);
  16static void _rtl92ee_phy_rf_serial_write(struct ieee80211_hw *hw,
  17                                         enum radio_path rfpath, u32 offset,
  18                                         u32 data);
  19static u32 _rtl92ee_phy_calculate_bit_shift(u32 bitmask);
  20static bool _rtl92ee_phy_bb8192ee_config_parafile(struct ieee80211_hw *hw);
  21static bool _rtl92ee_phy_config_mac_with_headerfile(struct ieee80211_hw *hw);
  22static bool phy_config_bb_with_hdr_file(struct ieee80211_hw *hw,
  23                                        u8 configtype);
  24static bool phy_config_bb_with_pghdrfile(struct ieee80211_hw *hw,
  25                                         u8 configtype);
  26static void phy_init_bb_rf_register_def(struct ieee80211_hw *hw);
  27static bool _rtl92ee_phy_set_sw_chnl_cmdarray(struct swchnlcmd *cmdtable,
  28                                              u32 cmdtableidx, u32 cmdtablesz,
  29                                              enum swchnlcmd_id cmdid,
  30                                              u32 para1, u32 para2,
  31                                              u32 msdelay);
  32static bool _rtl92ee_phy_sw_chnl_step_by_step(struct ieee80211_hw *hw,
  33                                              u8 channel, u8 *stage,
  34                                              u8 *step, u32 *delay);
  35static long _rtl92ee_phy_txpwr_idx_to_dbm(struct ieee80211_hw *hw,
  36                                          enum wireless_mode wirelessmode,
  37                                          u8 txpwridx);
  38static void rtl92ee_phy_set_rf_on(struct ieee80211_hw *hw);
  39static void rtl92ee_phy_set_io(struct ieee80211_hw *hw);
  40
  41u32 rtl92ee_phy_query_bb_reg(struct ieee80211_hw *hw, u32 regaddr, u32 bitmask)
  42{
  43        struct rtl_priv *rtlpriv = rtl_priv(hw);
  44        u32 returnvalue, originalvalue, bitshift;
  45
  46        rtl_dbg(rtlpriv, COMP_RF, DBG_TRACE,
  47                "regaddr(%#x), bitmask(%#x)\n", regaddr, bitmask);
  48        originalvalue = rtl_read_dword(rtlpriv, regaddr);
  49        bitshift = _rtl92ee_phy_calculate_bit_shift(bitmask);
  50        returnvalue = (originalvalue & bitmask) >> bitshift;
  51
  52        rtl_dbg(rtlpriv, COMP_RF, DBG_TRACE,
  53                "BBR MASK=0x%x Addr[0x%x]=0x%x\n",
  54                bitmask, regaddr, originalvalue);
  55
  56        return returnvalue;
  57}
  58
  59void rtl92ee_phy_set_bb_reg(struct ieee80211_hw *hw, u32 regaddr,
  60                            u32 bitmask, u32 data)
  61{
  62        struct rtl_priv *rtlpriv = rtl_priv(hw);
  63        u32 originalvalue, bitshift;
  64
  65        rtl_dbg(rtlpriv, COMP_RF, DBG_TRACE,
  66                "regaddr(%#x), bitmask(%#x), data(%#x)\n",
  67                regaddr, bitmask, data);
  68
  69        if (bitmask != MASKDWORD) {
  70                originalvalue = rtl_read_dword(rtlpriv, regaddr);
  71                bitshift = _rtl92ee_phy_calculate_bit_shift(bitmask);
  72                data = ((originalvalue & (~bitmask)) | (data << bitshift));
  73        }
  74
  75        rtl_write_dword(rtlpriv, regaddr, data);
  76
  77        rtl_dbg(rtlpriv, COMP_RF, DBG_TRACE,
  78                "regaddr(%#x), bitmask(%#x), data(%#x)\n",
  79                regaddr, bitmask, data);
  80}
  81
  82u32 rtl92ee_phy_query_rf_reg(struct ieee80211_hw *hw,
  83                             enum radio_path rfpath, u32 regaddr, u32 bitmask)
  84{
  85        struct rtl_priv *rtlpriv = rtl_priv(hw);
  86        u32 original_value, readback_value, bitshift;
  87
  88        rtl_dbg(rtlpriv, COMP_RF, DBG_TRACE,
  89                "regaddr(%#x), rfpath(%#x), bitmask(%#x)\n",
  90                regaddr, rfpath, bitmask);
  91
  92        spin_lock(&rtlpriv->locks.rf_lock);
  93
  94        original_value = _rtl92ee_phy_rf_serial_read(hw , rfpath, regaddr);
  95        bitshift = _rtl92ee_phy_calculate_bit_shift(bitmask);
  96        readback_value = (original_value & bitmask) >> bitshift;
  97
  98        spin_unlock(&rtlpriv->locks.rf_lock);
  99
 100        rtl_dbg(rtlpriv, COMP_RF, DBG_TRACE,
 101                "regaddr(%#x),rfpath(%#x),bitmask(%#x),original_value(%#x)\n",
 102                regaddr, rfpath, bitmask, original_value);
 103
 104        return readback_value;
 105}
 106
 107void rtl92ee_phy_set_rf_reg(struct ieee80211_hw *hw,
 108                            enum radio_path rfpath,
 109                            u32 addr, u32 bitmask, u32 data)
 110{
 111        struct rtl_priv *rtlpriv = rtl_priv(hw);
 112        u32 original_value, bitshift;
 113
 114        rtl_dbg(rtlpriv, COMP_RF, DBG_TRACE,
 115                "regaddr(%#x), bitmask(%#x), data(%#x), rfpath(%#x)\n",
 116                addr, bitmask, data, rfpath);
 117
 118        spin_lock(&rtlpriv->locks.rf_lock);
 119
 120        if (bitmask != RFREG_OFFSET_MASK) {
 121                original_value = _rtl92ee_phy_rf_serial_read(hw, rfpath, addr);
 122                bitshift = _rtl92ee_phy_calculate_bit_shift(bitmask);
 123                data = (original_value & (~bitmask)) | (data << bitshift);
 124        }
 125
 126        _rtl92ee_phy_rf_serial_write(hw, rfpath, addr, data);
 127
 128        spin_unlock(&rtlpriv->locks.rf_lock);
 129
 130        rtl_dbg(rtlpriv, COMP_RF, DBG_TRACE,
 131                "regaddr(%#x), bitmask(%#x), data(%#x), rfpath(%#x)\n",
 132                addr, bitmask, data, rfpath);
 133}
 134
 135static u32 _rtl92ee_phy_rf_serial_read(struct ieee80211_hw *hw,
 136                                       enum radio_path rfpath, u32 offset)
 137{
 138        struct rtl_priv *rtlpriv = rtl_priv(hw);
 139        struct rtl_phy *rtlphy = &rtlpriv->phy;
 140        struct bb_reg_def *pphyreg = &rtlphy->phyreg_def[rfpath];
 141        u32 newoffset;
 142        u32 tmplong, tmplong2;
 143        u8 rfpi_enable = 0;
 144        u32 retvalue;
 145
 146        offset &= 0xff;
 147        newoffset = offset;
 148        if (RT_CANNOT_IO(hw)) {
 149                pr_err("return all one\n");
 150                return 0xFFFFFFFF;
 151        }
 152        tmplong = rtl_get_bbreg(hw, RFPGA0_XA_HSSIPARAMETER2, MASKDWORD);
 153        if (rfpath == RF90_PATH_A)
 154                tmplong2 = tmplong;
 155        else
 156                tmplong2 = rtl_get_bbreg(hw, pphyreg->rfhssi_para2, MASKDWORD);
 157        tmplong2 = (tmplong2 & (~BLSSIREADADDRESS)) |
 158                   (newoffset << 23) | BLSSIREADEDGE;
 159        rtl_set_bbreg(hw, RFPGA0_XA_HSSIPARAMETER2, MASKDWORD,
 160                      tmplong & (~BLSSIREADEDGE));
 161        rtl_set_bbreg(hw, pphyreg->rfhssi_para2, MASKDWORD, tmplong2);
 162        udelay(20);
 163        if (rfpath == RF90_PATH_A)
 164                rfpi_enable = (u8)rtl_get_bbreg(hw, RFPGA0_XA_HSSIPARAMETER1,
 165                                                BIT(8));
 166        else if (rfpath == RF90_PATH_B)
 167                rfpi_enable = (u8)rtl_get_bbreg(hw, RFPGA0_XB_HSSIPARAMETER1,
 168                                                BIT(8));
 169        if (rfpi_enable)
 170                retvalue = rtl_get_bbreg(hw, pphyreg->rf_rbpi,
 171                                         BLSSIREADBACKDATA);
 172        else
 173                retvalue = rtl_get_bbreg(hw, pphyreg->rf_rb,
 174                                         BLSSIREADBACKDATA);
 175        rtl_dbg(rtlpriv, COMP_RF, DBG_TRACE,
 176                "RFR-%d Addr[0x%x]=0x%x\n",
 177                rfpath, pphyreg->rf_rb, retvalue);
 178        return retvalue;
 179}
 180
 181static void _rtl92ee_phy_rf_serial_write(struct ieee80211_hw *hw,
 182                                         enum radio_path rfpath, u32 offset,
 183                                         u32 data)
 184{
 185        u32 data_and_addr;
 186        u32 newoffset;
 187        struct rtl_priv *rtlpriv = rtl_priv(hw);
 188        struct rtl_phy *rtlphy = &rtlpriv->phy;
 189        struct bb_reg_def *pphyreg = &rtlphy->phyreg_def[rfpath];
 190
 191        if (RT_CANNOT_IO(hw)) {
 192                pr_err("stop\n");
 193                return;
 194        }
 195        offset &= 0xff;
 196        newoffset = offset;
 197        data_and_addr = ((newoffset << 20) | (data & 0x000fffff)) & 0x0fffffff;
 198        rtl_set_bbreg(hw, pphyreg->rf3wire_offset, MASKDWORD, data_and_addr);
 199        rtl_dbg(rtlpriv, COMP_RF, DBG_TRACE,
 200                "RFW-%d Addr[0x%x]=0x%x\n", rfpath,
 201                pphyreg->rf3wire_offset, data_and_addr);
 202}
 203
 204static u32 _rtl92ee_phy_calculate_bit_shift(u32 bitmask)
 205{
 206        u32 i = ffs(bitmask);
 207
 208        return i ? i - 1 : 32;
 209}
 210
 211bool rtl92ee_phy_mac_config(struct ieee80211_hw *hw)
 212{
 213        return _rtl92ee_phy_config_mac_with_headerfile(hw);
 214}
 215
 216bool rtl92ee_phy_bb_config(struct ieee80211_hw *hw)
 217{
 218        struct rtl_priv *rtlpriv = rtl_priv(hw);
 219        bool rtstatus = true;
 220        u16 regval;
 221        u32 tmp;
 222        u8 crystal_cap;
 223
 224        phy_init_bb_rf_register_def(hw);
 225        regval = rtl_read_word(rtlpriv, REG_SYS_FUNC_EN);
 226        rtl_write_word(rtlpriv, REG_SYS_FUNC_EN,
 227                       regval | BIT(13) | BIT(0) | BIT(1));
 228
 229        rtl_write_byte(rtlpriv, REG_RF_CTRL, RF_EN | RF_RSTB | RF_SDMRSTB);
 230        rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN,
 231                       FEN_PPLL | FEN_PCIEA | FEN_DIO_PCIE |
 232                       FEN_BB_GLB_RSTN | FEN_BBRSTB);
 233
 234        rtl_write_byte(rtlpriv, REG_AFE_XTAL_CTRL + 1, 0x80);
 235
 236        tmp = rtl_read_dword(rtlpriv, 0x4c);
 237        rtl_write_dword(rtlpriv, 0x4c, tmp | BIT(23));
 238
 239        rtstatus = _rtl92ee_phy_bb8192ee_config_parafile(hw);
 240
 241        crystal_cap = rtlpriv->efuse.eeprom_crystalcap & 0x3F;
 242        rtl_set_bbreg(hw, REG_MAC_PHY_CTRL, 0xFFF000,
 243                      (crystal_cap | (crystal_cap << 6)));
 244        return rtstatus;
 245}
 246
 247bool rtl92ee_phy_rf_config(struct ieee80211_hw *hw)
 248{
 249        return rtl92ee_phy_rf6052_config(hw);
 250}
 251
 252static bool _check_condition(struct ieee80211_hw *hw,
 253                             const u32  condition)
 254{
 255        struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
 256        struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
 257        u32 _board = rtlefuse->board_type; /*need efuse define*/
 258        u32 _interface = rtlhal->interface;
 259        u32 _platform = 0x08;/*SupportPlatform */
 260        u32 cond = condition;
 261
 262        if (condition == 0xCDCDCDCD)
 263                return true;
 264
 265        cond = condition & 0xFF;
 266        if ((_board != cond) && (cond != 0xFF))
 267                return false;
 268
 269        cond = condition & 0xFF00;
 270        cond = cond >> 8;
 271        if ((_interface & cond) == 0 && cond != 0x07)
 272                return false;
 273
 274        cond = condition & 0xFF0000;
 275        cond = cond >> 16;
 276        if ((_platform & cond) == 0 && cond != 0x0F)
 277                return false;
 278
 279        return true;
 280}
 281
 282static void _rtl92ee_config_rf_reg(struct ieee80211_hw *hw, u32 addr, u32 data,
 283                                   enum radio_path rfpath, u32 regaddr)
 284{
 285        if (addr == 0xfe || addr == 0xffe) {
 286                mdelay(50);
 287        } else {
 288                rtl_set_rfreg(hw, rfpath, regaddr, RFREG_OFFSET_MASK, data);
 289                udelay(1);
 290
 291                if (addr == 0xb6) {
 292                        u32 getvalue;
 293                        u8 count = 0;
 294
 295                        getvalue = rtl_get_rfreg(hw, rfpath, addr, MASKDWORD);
 296                        udelay(1);
 297
 298                        while ((getvalue >> 8) != (data >> 8)) {
 299                                count++;
 300                                rtl_set_rfreg(hw, rfpath, regaddr,
 301                                              RFREG_OFFSET_MASK, data);
 302                                udelay(1);
 303                                getvalue = rtl_get_rfreg(hw, rfpath, addr,
 304                                                         MASKDWORD);
 305                                if (count > 5)
 306                                        break;
 307                        }
 308                }
 309
 310                if (addr == 0xb2) {
 311                        u32 getvalue;
 312                        u8 count = 0;
 313
 314                        getvalue = rtl_get_rfreg(hw, rfpath, addr, MASKDWORD);
 315                        udelay(1);
 316
 317                        while (getvalue != data) {
 318                                count++;
 319                                rtl_set_rfreg(hw, rfpath, regaddr,
 320                                              RFREG_OFFSET_MASK, data);
 321                                udelay(1);
 322                                rtl_set_rfreg(hw, rfpath, 0x18,
 323                                              RFREG_OFFSET_MASK, 0x0fc07);
 324                                udelay(1);
 325                                getvalue = rtl_get_rfreg(hw, rfpath, addr,
 326                                                         MASKDWORD);
 327                                if (count > 5)
 328                                        break;
 329                        }
 330                }
 331        }
 332}
 333
 334static void _rtl92ee_config_rf_radio_a(struct ieee80211_hw *hw,
 335                                       u32 addr, u32 data)
 336{
 337        u32 content = 0x1000; /*RF Content: radio_a_txt*/
 338        u32 maskforphyset = (u32)(content & 0xE000);
 339
 340        _rtl92ee_config_rf_reg(hw, addr, data, RF90_PATH_A,
 341                               addr | maskforphyset);
 342}
 343
 344static void _rtl92ee_config_rf_radio_b(struct ieee80211_hw *hw,
 345                                       u32 addr, u32 data)
 346{
 347        u32 content = 0x1001; /*RF Content: radio_b_txt*/
 348        u32 maskforphyset = (u32)(content & 0xE000);
 349
 350        _rtl92ee_config_rf_reg(hw, addr, data, RF90_PATH_B,
 351                               addr | maskforphyset);
 352}
 353
 354static void _rtl92ee_config_bb_reg(struct ieee80211_hw *hw,
 355                                   u32 addr, u32 data)
 356{
 357        if (addr == 0xfe)
 358                mdelay(50);
 359        else if (addr == 0xfd)
 360                mdelay(5);
 361        else if (addr == 0xfc)
 362                mdelay(1);
 363        else if (addr == 0xfb)
 364                udelay(50);
 365        else if (addr == 0xfa)
 366                udelay(5);
 367        else if (addr == 0xf9)
 368                udelay(1);
 369        else
 370                rtl_set_bbreg(hw, addr, MASKDWORD , data);
 371
 372        udelay(1);
 373}
 374
 375static void _rtl92ee_phy_init_tx_power_by_rate(struct ieee80211_hw *hw)
 376{
 377        struct rtl_priv *rtlpriv = rtl_priv(hw);
 378        struct rtl_phy *rtlphy = &rtlpriv->phy;
 379
 380        u8 band = BAND_ON_2_4G, rf = 0, txnum = 0, sec = 0;
 381
 382        for (; band <= BAND_ON_5G; ++band)
 383                for (; rf < TX_PWR_BY_RATE_NUM_RF; ++rf)
 384                        for (; txnum < TX_PWR_BY_RATE_NUM_RF; ++txnum)
 385                                for (; sec < TX_PWR_BY_RATE_NUM_SECTION; ++sec)
 386                                        rtlphy->tx_power_by_rate_offset
 387                                             [band][rf][txnum][sec] = 0;
 388}
 389
 390static void _rtl92ee_phy_set_txpower_by_rate_base(struct ieee80211_hw *hw,
 391                                                  u8 band, u8 path,
 392                                                  u8 rate_section, u8 txnum,
 393                                                  u8 value)
 394{
 395        struct rtl_priv *rtlpriv = rtl_priv(hw);
 396        struct rtl_phy *rtlphy = &rtlpriv->phy;
 397
 398        if (path > RF90_PATH_D) {
 399                rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD,
 400                        "Invalid Rf Path %d\n", path);
 401                return;
 402        }
 403
 404        if (band == BAND_ON_2_4G) {
 405                switch (rate_section) {
 406                case CCK:
 407                        rtlphy->txpwr_by_rate_base_24g[path][txnum][0] = value;
 408                        break;
 409                case OFDM:
 410                        rtlphy->txpwr_by_rate_base_24g[path][txnum][1] = value;
 411                        break;
 412                case HT_MCS0_MCS7:
 413                        rtlphy->txpwr_by_rate_base_24g[path][txnum][2] = value;
 414                        break;
 415                case HT_MCS8_MCS15:
 416                        rtlphy->txpwr_by_rate_base_24g[path][txnum][3] = value;
 417                        break;
 418                default:
 419                        rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD,
 420                                "Invalid RateSection %d in 2.4G,Rf %d,%dTx\n",
 421                                rate_section, path, txnum);
 422                        break;
 423                }
 424        } else {
 425                rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD,
 426                        "Invalid Band %d\n", band);
 427        }
 428}
 429
 430static u8 _rtl92ee_phy_get_txpower_by_rate_base(struct ieee80211_hw *hw,
 431                                                u8 band, u8 path, u8 txnum,
 432                                                u8 rate_section)
 433{
 434        struct rtl_priv *rtlpriv = rtl_priv(hw);
 435        struct rtl_phy *rtlphy = &rtlpriv->phy;
 436        u8 value = 0;
 437
 438        if (path > RF90_PATH_D) {
 439                rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD,
 440                        "Invalid Rf Path %d\n", path);
 441                return 0;
 442        }
 443
 444        if (band == BAND_ON_2_4G) {
 445                switch (rate_section) {
 446                case CCK:
 447                        value = rtlphy->txpwr_by_rate_base_24g[path][txnum][0];
 448                        break;
 449                case OFDM:
 450                        value = rtlphy->txpwr_by_rate_base_24g[path][txnum][1];
 451                        break;
 452                case HT_MCS0_MCS7:
 453                        value = rtlphy->txpwr_by_rate_base_24g[path][txnum][2];
 454                        break;
 455                case HT_MCS8_MCS15:
 456                        value = rtlphy->txpwr_by_rate_base_24g[path][txnum][3];
 457                        break;
 458                default:
 459                        rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD,
 460                                "Invalid RateSection %d in 2.4G,Rf %d,%dTx\n",
 461                                rate_section, path, txnum);
 462                        break;
 463                }
 464        } else {
 465                rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD,
 466                        "Invalid Band %d()\n", band);
 467        }
 468        return value;
 469}
 470
 471static void _rtl92ee_phy_store_txpower_by_rate_base(struct ieee80211_hw *hw)
 472{
 473        struct rtl_priv *rtlpriv = rtl_priv(hw);
 474        struct rtl_phy *rtlphy = &rtlpriv->phy;
 475        u16 raw = 0;
 476        u8 base = 0, path = 0;
 477
 478        for (path = RF90_PATH_A; path <= RF90_PATH_B; ++path) {
 479                if (path == RF90_PATH_A) {
 480                        raw = (u16)(rtlphy->tx_power_by_rate_offset
 481                                    [BAND_ON_2_4G][path][RF_1TX][3] >> 24) &
 482                                    0xFF;
 483                        base = (raw >> 4) * 10 + (raw & 0xF);
 484                        _rtl92ee_phy_set_txpower_by_rate_base(hw, BAND_ON_2_4G,
 485                                                              path, CCK, RF_1TX,
 486                                                              base);
 487                } else if (path == RF90_PATH_B) {
 488                        raw = (u16)(rtlphy->tx_power_by_rate_offset
 489                                    [BAND_ON_2_4G][path][RF_1TX][3] >> 0) &
 490                                    0xFF;
 491                        base = (raw >> 4) * 10 + (raw & 0xF);
 492                        _rtl92ee_phy_set_txpower_by_rate_base(hw, BAND_ON_2_4G,
 493                                                              path, CCK, RF_1TX,
 494                                                              base);
 495                }
 496                raw = (u16)(rtlphy->tx_power_by_rate_offset
 497                            [BAND_ON_2_4G][path][RF_1TX][1] >> 24) & 0xFF;
 498                base = (raw >> 4) * 10 + (raw & 0xF);
 499                _rtl92ee_phy_set_txpower_by_rate_base(hw, BAND_ON_2_4G, path,
 500                                                      OFDM, RF_1TX, base);
 501
 502                raw = (u16)(rtlphy->tx_power_by_rate_offset
 503                            [BAND_ON_2_4G][path][RF_1TX][5] >> 24) & 0xFF;
 504                base = (raw >> 4) * 10 + (raw & 0xF);
 505                _rtl92ee_phy_set_txpower_by_rate_base(hw, BAND_ON_2_4G, path,
 506                                                      HT_MCS0_MCS7, RF_1TX,
 507                                                      base);
 508
 509                raw = (u16)(rtlphy->tx_power_by_rate_offset
 510                            [BAND_ON_2_4G][path][RF_2TX][7] >> 24) & 0xFF;
 511                base = (raw >> 4) * 10 + (raw & 0xF);
 512                _rtl92ee_phy_set_txpower_by_rate_base(hw, BAND_ON_2_4G, path,
 513                                                      HT_MCS8_MCS15, RF_2TX,
 514                                                      base);
 515        }
 516}
 517
 518static void _phy_convert_txpower_dbm_to_relative_value(u32 *data, u8 start,
 519                                                       u8 end, u8 base)
 520{
 521        s8 i = 0;
 522        u8 tmp = 0;
 523        u32 temp_data = 0;
 524
 525        for (i = 3; i >= 0; --i) {
 526                if (i >= start && i <= end) {
 527                        /* Get the exact value */
 528                        tmp = (u8)(*data >> (i * 8)) & 0xF;
 529                        tmp += ((u8)((*data >> (i * 8 + 4)) & 0xF)) * 10;
 530
 531                        /* Change the value to a relative value */
 532                        tmp = (tmp > base) ? tmp - base : base - tmp;
 533                } else {
 534                        tmp = (u8)(*data >> (i * 8)) & 0xFF;
 535                }
 536                temp_data <<= 8;
 537                temp_data |= tmp;
 538        }
 539        *data = temp_data;
 540}
 541
 542static void phy_convert_txpwr_dbm_to_rel_val(struct ieee80211_hw *hw)
 543{
 544        struct rtl_priv *rtlpriv = rtl_priv(hw);
 545        struct rtl_phy *rtlphy = &rtlpriv->phy;
 546        u8 base = 0, rf = 0, band = BAND_ON_2_4G;
 547
 548        for (rf = RF90_PATH_A; rf <= RF90_PATH_B; ++rf) {
 549                if (rf == RF90_PATH_A) {
 550                        base = _rtl92ee_phy_get_txpower_by_rate_base(hw, band,
 551                                                                     rf, RF_1TX,
 552                                                                     CCK);
 553                        _phy_convert_txpower_dbm_to_relative_value(
 554                                &rtlphy->tx_power_by_rate_offset
 555                                [band][rf][RF_1TX][2],
 556                                1, 1, base);
 557                        _phy_convert_txpower_dbm_to_relative_value(
 558                                &rtlphy->tx_power_by_rate_offset
 559                                [band][rf][RF_1TX][3],
 560                                1, 3, base);
 561                } else if (rf == RF90_PATH_B) {
 562                        base = _rtl92ee_phy_get_txpower_by_rate_base(hw, band,
 563                                                                     rf, RF_1TX,
 564                                                                     CCK);
 565                        _phy_convert_txpower_dbm_to_relative_value(
 566                                &rtlphy->tx_power_by_rate_offset
 567                                [band][rf][RF_1TX][3],
 568                                0, 0, base);
 569                        _phy_convert_txpower_dbm_to_relative_value(
 570                                &rtlphy->tx_power_by_rate_offset
 571                                [band][rf][RF_1TX][2],
 572                                1, 3, base);
 573                }
 574                base = _rtl92ee_phy_get_txpower_by_rate_base(hw, band, rf,
 575                                                             RF_1TX, OFDM);
 576                _phy_convert_txpower_dbm_to_relative_value(
 577                        &rtlphy->tx_power_by_rate_offset[band][rf][RF_1TX][0],
 578                        0, 3, base);
 579                _phy_convert_txpower_dbm_to_relative_value(
 580                        &rtlphy->tx_power_by_rate_offset[band][rf][RF_1TX][1],
 581                        0, 3, base);
 582
 583                base = _rtl92ee_phy_get_txpower_by_rate_base(hw, band, rf,
 584                                                             RF_1TX,
 585                                                             HT_MCS0_MCS7);
 586                _phy_convert_txpower_dbm_to_relative_value(
 587                        &rtlphy->tx_power_by_rate_offset[band][rf][RF_1TX][4],
 588                        0, 3, base);
 589                _phy_convert_txpower_dbm_to_relative_value(
 590                        &rtlphy->tx_power_by_rate_offset[band][rf][RF_1TX][5],
 591                        0, 3, base);
 592
 593                base = _rtl92ee_phy_get_txpower_by_rate_base(hw, band, rf,
 594                                                             RF_2TX,
 595                                                             HT_MCS8_MCS15);
 596                _phy_convert_txpower_dbm_to_relative_value(
 597                        &rtlphy->tx_power_by_rate_offset[band][rf][RF_2TX][6],
 598                        0, 3, base);
 599
 600                _phy_convert_txpower_dbm_to_relative_value(
 601                        &rtlphy->tx_power_by_rate_offset[band][rf][RF_2TX][7],
 602                        0, 3, base);
 603        }
 604
 605        rtl_dbg(rtlpriv, COMP_POWER, DBG_TRACE,
 606                "<==%s\n", __func__);
 607}
 608
 609static void _rtl92ee_phy_txpower_by_rate_configuration(struct ieee80211_hw *hw)
 610{
 611        _rtl92ee_phy_store_txpower_by_rate_base(hw);
 612        phy_convert_txpwr_dbm_to_rel_val(hw);
 613}
 614
 615static bool _rtl92ee_phy_bb8192ee_config_parafile(struct ieee80211_hw *hw)
 616{
 617        struct rtl_priv *rtlpriv = rtl_priv(hw);
 618        struct rtl_phy *rtlphy = &rtlpriv->phy;
 619        struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
 620        bool rtstatus;
 621
 622        rtstatus = phy_config_bb_with_hdr_file(hw, BASEBAND_CONFIG_PHY_REG);
 623        if (!rtstatus) {
 624                pr_err("Write BB Reg Fail!!\n");
 625                return false;
 626        }
 627
 628        _rtl92ee_phy_init_tx_power_by_rate(hw);
 629        if (!rtlefuse->autoload_failflag) {
 630                rtlphy->pwrgroup_cnt = 0;
 631                rtstatus =
 632                  phy_config_bb_with_pghdrfile(hw, BASEBAND_CONFIG_PHY_REG);
 633        }
 634        _rtl92ee_phy_txpower_by_rate_configuration(hw);
 635        if (!rtstatus) {
 636                pr_err("BB_PG Reg Fail!!\n");
 637                return false;
 638        }
 639        rtstatus = phy_config_bb_with_hdr_file(hw, BASEBAND_CONFIG_AGC_TAB);
 640        if (!rtstatus) {
 641                pr_err("AGC Table Fail\n");
 642                return false;
 643        }
 644        rtlphy->cck_high_power = (bool)(rtl_get_bbreg(hw,
 645                                                      RFPGA0_XA_HSSIPARAMETER2,
 646                                                      0x200));
 647
 648        return true;
 649}
 650
 651static bool _rtl92ee_phy_config_mac_with_headerfile(struct ieee80211_hw *hw)
 652{
 653        struct rtl_priv *rtlpriv = rtl_priv(hw);
 654        u32 i;
 655        u32 arraylength;
 656        u32 *ptrarray;
 657
 658        rtl_dbg(rtlpriv, COMP_INIT, DBG_TRACE, "Read Rtl8192EMACPHY_Array\n");
 659        arraylength = RTL8192EE_MAC_ARRAY_LEN;
 660        ptrarray = RTL8192EE_MAC_ARRAY;
 661        rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD,
 662                "Img:RTL8192EE_MAC_ARRAY LEN %d\n", arraylength);
 663        for (i = 0; i < arraylength; i = i + 2)
 664                rtl_write_byte(rtlpriv, ptrarray[i], (u8)ptrarray[i + 1]);
 665        return true;
 666}
 667
 668#define READ_NEXT_PAIR(v1, v2, i) \
 669        do { \
 670                i += 2; \
 671                v1 = array[i]; \
 672                v2 = array[i+1]; \
 673        } while (0)
 674
 675static bool phy_config_bb_with_hdr_file(struct ieee80211_hw *hw,
 676                                        u8 configtype)
 677{
 678        int i;
 679        u32 *array;
 680        u16 len;
 681        struct rtl_priv *rtlpriv = rtl_priv(hw);
 682        u32 v1 = 0, v2 = 0;
 683
 684        if (configtype == BASEBAND_CONFIG_PHY_REG) {
 685                len = RTL8192EE_PHY_REG_ARRAY_LEN;
 686                array = RTL8192EE_PHY_REG_ARRAY;
 687
 688                for (i = 0; i < len; i = i + 2) {
 689                        v1 = array[i];
 690                        v2 = array[i+1];
 691                        if (v1 < 0xcdcdcdcd) {
 692                                _rtl92ee_config_bb_reg(hw, v1, v2);
 693                        } else {/*This line is the start line of branch.*/
 694                                /* to protect READ_NEXT_PAIR not overrun */
 695                                if (i >= len - 2)
 696                                        break;
 697
 698                                if (!_check_condition(hw , array[i])) {
 699                                        /*Discard the following pairs*/
 700                                        READ_NEXT_PAIR(v1, v2, i);
 701                                        while (v2 != 0xDEAD &&
 702                                               v2 != 0xCDEF &&
 703                                               v2 != 0xCDCD && i < len - 2) {
 704                                                READ_NEXT_PAIR(v1, v2, i);
 705                                        }
 706                                        i -= 2; /* prevent from for-loop += 2*/
 707                                } else {
 708                                        /* Configure matched pairs and
 709                                         * skip to end of if-else.
 710                                         */
 711                                        READ_NEXT_PAIR(v1, v2, i);
 712                                        while (v2 != 0xDEAD &&
 713                                               v2 != 0xCDEF &&
 714                                               v2 != 0xCDCD && i < len - 2) {
 715                                                _rtl92ee_config_bb_reg(hw, v1,
 716                                                                       v2);
 717                                                READ_NEXT_PAIR(v1, v2, i);
 718                                        }
 719
 720                                        while (v2 != 0xDEAD && i < len - 2)
 721                                                READ_NEXT_PAIR(v1, v2, i);
 722                                }
 723                        }
 724                }
 725        } else if (configtype == BASEBAND_CONFIG_AGC_TAB) {
 726                len = RTL8192EE_AGC_TAB_ARRAY_LEN;
 727                array = RTL8192EE_AGC_TAB_ARRAY;
 728
 729                for (i = 0; i < len; i = i + 2) {
 730                        v1 = array[i];
 731                        v2 = array[i+1];
 732                        if (v1 < 0xCDCDCDCD) {
 733                                rtl_set_bbreg(hw, array[i], MASKDWORD,
 734                                              array[i + 1]);
 735                                udelay(1);
 736                                continue;
 737                    } else{/*This line is the start line of branch.*/
 738                          /* to protect READ_NEXT_PAIR not overrun */
 739                                if (i >= len - 2)
 740                                        break;
 741
 742                                if (!_check_condition(hw , array[i])) {
 743                                        /*Discard the following pairs*/
 744                                        READ_NEXT_PAIR(v1, v2, i);
 745                                        while (v2 != 0xDEAD &&
 746                                               v2 != 0xCDEF &&
 747                                               v2 != 0xCDCD &&
 748                                               i < len - 2) {
 749                                                READ_NEXT_PAIR(v1, v2, i);
 750                                        }
 751                                        i -= 2; /* prevent from for-loop += 2*/
 752                                } else {
 753                                        /* Configure matched pairs and
 754                                         * skip to end of if-else.
 755                                         */
 756                                        READ_NEXT_PAIR(v1, v2, i);
 757                                        while (v2 != 0xDEAD &&
 758                                               v2 != 0xCDEF &&
 759                                               v2 != 0xCDCD &&
 760                                               i < len - 2) {
 761                                                rtl_set_bbreg(hw,
 762                                                              array[i],
 763                                                              MASKDWORD,
 764                                                              array[i + 1]);
 765                                                udelay(1);
 766                                                READ_NEXT_PAIR(v1 , v2 , i);
 767                                        }
 768
 769                                        while (v2 != 0xDEAD &&
 770                                               i < len - 2) {
 771                                                READ_NEXT_PAIR(v1 , v2 , i);
 772                                        }
 773                                }
 774                        }
 775                        rtl_dbg(rtlpriv, COMP_INIT, DBG_TRACE,
 776                                "The agctab_array_table[0] is %x Rtl818EEPHY_REGArray[1] is %x\n",
 777                                array[i],
 778                                array[i + 1]);
 779                }
 780        }
 781        return true;
 782}
 783
 784static u8 _rtl92ee_get_rate_section_index(u32 regaddr)
 785{
 786        u8 index = 0;
 787
 788        switch (regaddr) {
 789        case RTXAGC_A_RATE18_06:
 790        case RTXAGC_B_RATE18_06:
 791                index = 0;
 792                break;
 793        case RTXAGC_A_RATE54_24:
 794        case RTXAGC_B_RATE54_24:
 795                index = 1;
 796                break;
 797        case RTXAGC_A_CCK1_MCS32:
 798        case RTXAGC_B_CCK1_55_MCS32:
 799                index = 2;
 800                break;
 801        case RTXAGC_B_CCK11_A_CCK2_11:
 802                index = 3;
 803                break;
 804        case RTXAGC_A_MCS03_MCS00:
 805        case RTXAGC_B_MCS03_MCS00:
 806                index = 4;
 807                break;
 808        case RTXAGC_A_MCS07_MCS04:
 809        case RTXAGC_B_MCS07_MCS04:
 810                index = 5;
 811                break;
 812        case RTXAGC_A_MCS11_MCS08:
 813        case RTXAGC_B_MCS11_MCS08:
 814                index = 6;
 815                break;
 816        case RTXAGC_A_MCS15_MCS12:
 817        case RTXAGC_B_MCS15_MCS12:
 818                index = 7;
 819                break;
 820        default:
 821                regaddr &= 0xFFF;
 822                if (regaddr >= 0xC20 && regaddr <= 0xC4C)
 823                        index = (u8)((regaddr - 0xC20) / 4);
 824                else if (regaddr >= 0xE20 && regaddr <= 0xE4C)
 825                        index = (u8)((regaddr - 0xE20) / 4);
 826                break;
 827        }
 828        return index;
 829}
 830
 831static void _rtl92ee_store_tx_power_by_rate(struct ieee80211_hw *hw,
 832                                            enum band_type band,
 833                                            enum radio_path rfpath,
 834                                            u32 txnum, u32 regaddr,
 835                                            u32 bitmask, u32 data)
 836{
 837        struct rtl_priv *rtlpriv = rtl_priv(hw);
 838        struct rtl_phy *rtlphy = &rtlpriv->phy;
 839        u8 section = _rtl92ee_get_rate_section_index(regaddr);
 840
 841        if (band != BAND_ON_2_4G && band != BAND_ON_5G) {
 842                rtl_dbg(rtlpriv, FPHY, PHY_TXPWR, "Invalid Band %d\n", band);
 843                return;
 844        }
 845
 846        if (rfpath > MAX_RF_PATH - 1) {
 847                rtl_dbg(rtlpriv, FPHY, PHY_TXPWR,
 848                        "Invalid RfPath %d\n", rfpath);
 849                return;
 850        }
 851        if (txnum > MAX_RF_PATH - 1) {
 852                rtl_dbg(rtlpriv, FPHY, PHY_TXPWR, "Invalid TxNum %d\n", txnum);
 853                return;
 854        }
 855
 856        rtlphy->tx_power_by_rate_offset[band][rfpath][txnum][section] = data;
 857}
 858
 859static bool phy_config_bb_with_pghdrfile(struct ieee80211_hw *hw,
 860                                         u8 configtype)
 861{
 862        struct rtl_priv *rtlpriv = rtl_priv(hw);
 863        int i;
 864        u32 *phy_regarray_table_pg;
 865        u16 phy_regarray_pg_len;
 866        u32 v1 = 0, v2 = 0, v3 = 0, v4 = 0, v5 = 0, v6 = 0;
 867
 868        phy_regarray_pg_len = RTL8192EE_PHY_REG_ARRAY_PG_LEN;
 869        phy_regarray_table_pg = RTL8192EE_PHY_REG_ARRAY_PG;
 870
 871        if (configtype == BASEBAND_CONFIG_PHY_REG) {
 872                for (i = 0; i < phy_regarray_pg_len; i = i + 6) {
 873                        v1 = phy_regarray_table_pg[i];
 874                        v2 = phy_regarray_table_pg[i+1];
 875                        v3 = phy_regarray_table_pg[i+2];
 876                        v4 = phy_regarray_table_pg[i+3];
 877                        v5 = phy_regarray_table_pg[i+4];
 878                        v6 = phy_regarray_table_pg[i+5];
 879
 880                        if (v1 < 0xcdcdcdcd) {
 881                                _rtl92ee_store_tx_power_by_rate(hw, v1, v2, v3,
 882                                                                v4, v5, v6);
 883                                continue;
 884                        }
 885                }
 886        } else {
 887                rtl_dbg(rtlpriv, COMP_SEND, DBG_TRACE,
 888                        "configtype != BaseBand_Config_PHY_REG\n");
 889        }
 890        return true;
 891}
 892
 893#define READ_NEXT_RF_PAIR(v1, v2, i) \
 894        do { \
 895                i += 2; \
 896                v1 = array[i]; \
 897                v2 = array[i+1]; \
 898        } while (0)
 899
 900bool rtl92ee_phy_config_rf_with_headerfile(struct ieee80211_hw  *hw,
 901                                           enum radio_path rfpath)
 902{
 903        struct rtl_priv *rtlpriv = rtl_priv(hw);
 904        int i;
 905        u32 *array;
 906        u16 len;
 907        u32 v1 = 0, v2 = 0;
 908
 909        switch (rfpath) {
 910        case RF90_PATH_A:
 911                len = RTL8192EE_RADIOA_ARRAY_LEN;
 912                array = RTL8192EE_RADIOA_ARRAY;
 913                rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD,
 914                        "Radio_A:RTL8192EE_RADIOA_ARRAY %d\n", len);
 915                rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD, "Radio No %x\n", rfpath);
 916                for (i = 0; i < len; i = i + 2) {
 917                        v1 = array[i];
 918                        v2 = array[i+1];
 919                        if (v1 < 0xcdcdcdcd) {
 920                                _rtl92ee_config_rf_radio_a(hw, v1, v2);
 921                                continue;
 922                        } else {/*This line is the start line of branch.*/
 923                                /* to protect READ_NEXT_PAIR not overrun */
 924                                if (i >= len - 2)
 925                                        break;
 926
 927                                if (!_check_condition(hw , array[i])) {
 928                                        /*Discard the following pairs*/
 929                                        READ_NEXT_RF_PAIR(v1, v2, i);
 930                                        while (v2 != 0xDEAD &&
 931                                               v2 != 0xCDEF &&
 932                                               v2 != 0xCDCD && i < len - 2) {
 933                                                READ_NEXT_RF_PAIR(v1, v2, i);
 934                                        }
 935                                        i -= 2; /* prevent from for-loop += 2*/
 936                                } else {
 937                                        /* Configure matched pairs and
 938                                         * skip to end of if-else.
 939                                         */
 940                                        READ_NEXT_RF_PAIR(v1, v2, i);
 941                                        while (v2 != 0xDEAD &&
 942                                               v2 != 0xCDEF &&
 943                                               v2 != 0xCDCD && i < len - 2) {
 944                                                _rtl92ee_config_rf_radio_a(hw,
 945                                                                           v1,
 946                                                                           v2);
 947                                                READ_NEXT_RF_PAIR(v1, v2, i);
 948                                        }
 949
 950                                        while (v2 != 0xDEAD && i < len - 2)
 951                                                READ_NEXT_RF_PAIR(v1, v2, i);
 952                                }
 953                        }
 954                }
 955                break;
 956
 957        case RF90_PATH_B:
 958                len = RTL8192EE_RADIOB_ARRAY_LEN;
 959                array = RTL8192EE_RADIOB_ARRAY;
 960                rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD,
 961                        "Radio_A:RTL8192EE_RADIOB_ARRAY %d\n", len);
 962                rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD, "Radio No %x\n", rfpath);
 963                for (i = 0; i < len; i = i + 2) {
 964                        v1 = array[i];
 965                        v2 = array[i+1];
 966                        if (v1 < 0xcdcdcdcd) {
 967                                _rtl92ee_config_rf_radio_b(hw, v1, v2);
 968                                continue;
 969                        } else {/*This line is the start line of branch.*/
 970                                /* to protect READ_NEXT_PAIR not overrun */
 971                                if (i >= len - 2)
 972                                        break;
 973
 974                                if (!_check_condition(hw , array[i])) {
 975                                        /*Discard the following pairs*/
 976                                        READ_NEXT_RF_PAIR(v1, v2, i);
 977                                        while (v2 != 0xDEAD &&
 978                                               v2 != 0xCDEF &&
 979                                               v2 != 0xCDCD && i < len - 2) {
 980                                                READ_NEXT_RF_PAIR(v1, v2, i);
 981                                        }
 982                                        i -= 2; /* prevent from for-loop += 2*/
 983                                } else {
 984                                        /* Configure matched pairs and
 985                                         * skip to end of if-else.
 986                                         */
 987                                        READ_NEXT_RF_PAIR(v1, v2, i);
 988                                        while (v2 != 0xDEAD &&
 989                                               v2 != 0xCDEF &&
 990                                               v2 != 0xCDCD && i < len - 2) {
 991                                                _rtl92ee_config_rf_radio_b(hw,
 992                                                                           v1,
 993                                                                           v2);
 994                                                READ_NEXT_RF_PAIR(v1, v2, i);
 995                                        }
 996
 997                                        while (v2 != 0xDEAD && i < len - 2)
 998                                                READ_NEXT_RF_PAIR(v1, v2, i);
 999                                }
1000                        }
1001                }
1002                break;
1003        case RF90_PATH_C:
1004        case RF90_PATH_D:
1005                break;
1006        }
1007        return true;
1008}
1009
1010void rtl92ee_phy_get_hw_reg_originalvalue(struct ieee80211_hw *hw)
1011{
1012        struct rtl_priv *rtlpriv = rtl_priv(hw);
1013        struct rtl_phy *rtlphy = &rtlpriv->phy;
1014
1015        rtlphy->default_initialgain[0] =
1016                (u8)rtl_get_bbreg(hw, ROFDM0_XAAGCCORE1, MASKBYTE0);
1017        rtlphy->default_initialgain[1] =
1018                (u8)rtl_get_bbreg(hw, ROFDM0_XBAGCCORE1, MASKBYTE0);
1019        rtlphy->default_initialgain[2] =
1020                (u8)rtl_get_bbreg(hw, ROFDM0_XCAGCCORE1, MASKBYTE0);
1021        rtlphy->default_initialgain[3] =
1022                (u8)rtl_get_bbreg(hw, ROFDM0_XDAGCCORE1, MASKBYTE0);
1023
1024        rtl_dbg(rtlpriv, COMP_INIT, DBG_TRACE,
1025                "Default initial gain (c50=0x%x, c58=0x%x, c60=0x%x, c68=0x%x\n",
1026                rtlphy->default_initialgain[0],
1027                rtlphy->default_initialgain[1],
1028                rtlphy->default_initialgain[2],
1029                rtlphy->default_initialgain[3]);
1030
1031        rtlphy->framesync = (u8)rtl_get_bbreg(hw,
1032                                              ROFDM0_RXDETECTOR3, MASKBYTE0);
1033        rtlphy->framesync_c34 = rtl_get_bbreg(hw,
1034                                              ROFDM0_RXDETECTOR2, MASKDWORD);
1035
1036        rtl_dbg(rtlpriv, COMP_INIT, DBG_TRACE,
1037                "Default framesync (0x%x) = 0x%x\n",
1038                ROFDM0_RXDETECTOR3, rtlphy->framesync);
1039}
1040
1041static void phy_init_bb_rf_register_def(struct ieee80211_hw *hw)
1042{
1043        struct rtl_priv *rtlpriv = rtl_priv(hw);
1044        struct rtl_phy *rtlphy = &rtlpriv->phy;
1045
1046        rtlphy->phyreg_def[RF90_PATH_A].rfintfs = RFPGA0_XAB_RFINTERFACESW;
1047        rtlphy->phyreg_def[RF90_PATH_B].rfintfs = RFPGA0_XAB_RFINTERFACESW;
1048
1049        rtlphy->phyreg_def[RF90_PATH_A].rfintfo = RFPGA0_XA_RFINTERFACEOE;
1050        rtlphy->phyreg_def[RF90_PATH_B].rfintfo = RFPGA0_XB_RFINTERFACEOE;
1051
1052        rtlphy->phyreg_def[RF90_PATH_A].rfintfe = RFPGA0_XA_RFINTERFACEOE;
1053        rtlphy->phyreg_def[RF90_PATH_B].rfintfe = RFPGA0_XB_RFINTERFACEOE;
1054
1055        rtlphy->phyreg_def[RF90_PATH_A].rf3wire_offset =
1056                                                        RFPGA0_XA_LSSIPARAMETER;
1057        rtlphy->phyreg_def[RF90_PATH_B].rf3wire_offset =
1058                                                        RFPGA0_XB_LSSIPARAMETER;
1059
1060        rtlphy->phyreg_def[RF90_PATH_A].rfhssi_para2 = RFPGA0_XA_HSSIPARAMETER2;
1061        rtlphy->phyreg_def[RF90_PATH_B].rfhssi_para2 = RFPGA0_XB_HSSIPARAMETER2;
1062
1063        rtlphy->phyreg_def[RF90_PATH_A].rf_rb = RFPGA0_XA_LSSIREADBACK;
1064        rtlphy->phyreg_def[RF90_PATH_B].rf_rb = RFPGA0_XB_LSSIREADBACK;
1065
1066        rtlphy->phyreg_def[RF90_PATH_A].rf_rbpi = TRANSCEIVEA_HSPI_READBACK;
1067        rtlphy->phyreg_def[RF90_PATH_B].rf_rbpi = TRANSCEIVEB_HSPI_READBACK;
1068}
1069
1070void rtl92ee_phy_get_txpower_level(struct ieee80211_hw *hw, long *powerlevel)
1071{
1072        struct rtl_priv *rtlpriv = rtl_priv(hw);
1073        struct rtl_phy *rtlphy = &rtlpriv->phy;
1074        u8 txpwr_level;
1075        long txpwr_dbm;
1076
1077        txpwr_level = rtlphy->cur_cck_txpwridx;
1078        txpwr_dbm = _rtl92ee_phy_txpwr_idx_to_dbm(hw, WIRELESS_MODE_B,
1079                                                  txpwr_level);
1080        txpwr_level = rtlphy->cur_ofdm24g_txpwridx;
1081        if (_rtl92ee_phy_txpwr_idx_to_dbm(hw, WIRELESS_MODE_G, txpwr_level) >
1082            txpwr_dbm)
1083                txpwr_dbm = _rtl92ee_phy_txpwr_idx_to_dbm(hw, WIRELESS_MODE_G,
1084                                                          txpwr_level);
1085        txpwr_level = rtlphy->cur_ofdm24g_txpwridx;
1086        if (_rtl92ee_phy_txpwr_idx_to_dbm(hw, WIRELESS_MODE_N_24G,
1087                                          txpwr_level) > txpwr_dbm)
1088                txpwr_dbm = _rtl92ee_phy_txpwr_idx_to_dbm(hw,
1089                                                          WIRELESS_MODE_N_24G,
1090                                                          txpwr_level);
1091        *powerlevel = txpwr_dbm;
1092}
1093
1094static u8 _rtl92ee_phy_get_ratesection_intxpower_byrate(enum radio_path path,
1095                                                        u8 rate)
1096{
1097        u8 rate_section = 0;
1098
1099        switch (rate) {
1100        case DESC92C_RATE1M:
1101                rate_section = 2;
1102                break;
1103        case DESC92C_RATE2M:
1104        case DESC92C_RATE5_5M:
1105                if (path == RF90_PATH_A)
1106                        rate_section = 3;
1107                else if (path == RF90_PATH_B)
1108                        rate_section = 2;
1109                break;
1110        case DESC92C_RATE11M:
1111                rate_section = 3;
1112                break;
1113        case DESC92C_RATE6M:
1114        case DESC92C_RATE9M:
1115        case DESC92C_RATE12M:
1116        case DESC92C_RATE18M:
1117                rate_section = 0;
1118                break;
1119        case DESC92C_RATE24M:
1120        case DESC92C_RATE36M:
1121        case DESC92C_RATE48M:
1122        case DESC92C_RATE54M:
1123                rate_section = 1;
1124                break;
1125        case DESC92C_RATEMCS0:
1126        case DESC92C_RATEMCS1:
1127        case DESC92C_RATEMCS2:
1128        case DESC92C_RATEMCS3:
1129                rate_section = 4;
1130                break;
1131        case DESC92C_RATEMCS4:
1132        case DESC92C_RATEMCS5:
1133        case DESC92C_RATEMCS6:
1134        case DESC92C_RATEMCS7:
1135                rate_section = 5;
1136                break;
1137        case DESC92C_RATEMCS8:
1138        case DESC92C_RATEMCS9:
1139        case DESC92C_RATEMCS10:
1140        case DESC92C_RATEMCS11:
1141                rate_section = 6;
1142                break;
1143        case DESC92C_RATEMCS12:
1144        case DESC92C_RATEMCS13:
1145        case DESC92C_RATEMCS14:
1146        case DESC92C_RATEMCS15:
1147                rate_section = 7;
1148                break;
1149        default:
1150                WARN_ONCE(true, "rtl8192ee: Rate_Section is Illegal\n");
1151                break;
1152        }
1153        return rate_section;
1154}
1155
1156static u8 _rtl92ee_get_txpower_by_rate(struct ieee80211_hw *hw,
1157                                       enum band_type band,
1158                                       enum radio_path rf, u8 rate)
1159{
1160        struct rtl_priv *rtlpriv = rtl_priv(hw);
1161        struct rtl_phy *rtlphy = &rtlpriv->phy;
1162        u8 shift = 0, sec, tx_num;
1163        s8 diff = 0;
1164
1165        sec = _rtl92ee_phy_get_ratesection_intxpower_byrate(rf, rate);
1166        tx_num = RF_TX_NUM_NONIMPLEMENT;
1167
1168        if (tx_num == RF_TX_NUM_NONIMPLEMENT) {
1169                if ((rate >= DESC92C_RATEMCS8 && rate <= DESC92C_RATEMCS15))
1170                        tx_num = RF_2TX;
1171                else
1172                        tx_num = RF_1TX;
1173        }
1174
1175        switch (rate) {
1176        case DESC92C_RATE1M:
1177        case DESC92C_RATE6M:
1178        case DESC92C_RATE24M:
1179        case DESC92C_RATEMCS0:
1180        case DESC92C_RATEMCS4:
1181        case DESC92C_RATEMCS8:
1182        case DESC92C_RATEMCS12:
1183                shift = 0;
1184                break;
1185        case DESC92C_RATE2M:
1186        case DESC92C_RATE9M:
1187        case DESC92C_RATE36M:
1188        case DESC92C_RATEMCS1:
1189        case DESC92C_RATEMCS5:
1190        case DESC92C_RATEMCS9:
1191        case DESC92C_RATEMCS13:
1192                shift = 8;
1193                break;
1194        case DESC92C_RATE5_5M:
1195        case DESC92C_RATE12M:
1196        case DESC92C_RATE48M:
1197        case DESC92C_RATEMCS2:
1198        case DESC92C_RATEMCS6:
1199        case DESC92C_RATEMCS10:
1200        case DESC92C_RATEMCS14:
1201                shift = 16;
1202                break;
1203        case DESC92C_RATE11M:
1204        case DESC92C_RATE18M:
1205        case DESC92C_RATE54M:
1206        case DESC92C_RATEMCS3:
1207        case DESC92C_RATEMCS7:
1208        case DESC92C_RATEMCS11:
1209        case DESC92C_RATEMCS15:
1210                shift = 24;
1211                break;
1212        default:
1213                WARN_ONCE(true, "rtl8192ee: Rate_Section is Illegal\n");
1214                break;
1215        }
1216
1217        diff = (u8)(rtlphy->tx_power_by_rate_offset[band][rf][tx_num][sec] >>
1218                    shift) & 0xff;
1219
1220        return  diff;
1221}
1222
1223static u8 _rtl92ee_get_txpower_index(struct ieee80211_hw *hw,
1224                                     enum radio_path rfpath, u8 rate,
1225                                     u8 bw, u8 channel)
1226{
1227        struct rtl_priv *rtlpriv = rtl_priv(hw);
1228        struct rtl_efuse *rtlefuse = rtl_efuse(rtlpriv);
1229        u8 index = (channel - 1);
1230        u8 tx_power = 0;
1231        u8 diff = 0;
1232
1233        if (channel < 1 || channel > 14) {
1234                index = 0;
1235                rtl_dbg(rtlpriv, COMP_POWER_TRACKING, DBG_DMESG,
1236                        "Illegal channel!!\n");
1237        }
1238
1239        if (IS_CCK_RATE((s8)rate))
1240                tx_power = rtlefuse->txpwrlevel_cck[rfpath][index];
1241        else if (DESC92C_RATE6M <= rate)
1242                tx_power = rtlefuse->txpwrlevel_ht40_1s[rfpath][index];
1243
1244        /* OFDM-1T*/
1245        if (DESC92C_RATE6M <= rate && rate <= DESC92C_RATE54M &&
1246            !IS_CCK_RATE((s8)rate))
1247                tx_power += rtlefuse->txpwr_legacyhtdiff[rfpath][TX_1S];
1248
1249        /* BW20-1S, BW20-2S */
1250        if (bw == HT_CHANNEL_WIDTH_20) {
1251                if (DESC92C_RATEMCS0 <= rate && rate <= DESC92C_RATEMCS15)
1252                        tx_power += rtlefuse->txpwr_ht20diff[rfpath][TX_1S];
1253                if (DESC92C_RATEMCS8 <= rate && rate <= DESC92C_RATEMCS15)
1254                        tx_power += rtlefuse->txpwr_ht20diff[rfpath][TX_2S];
1255        } else if (bw == HT_CHANNEL_WIDTH_20_40) {/* BW40-1S, BW40-2S */
1256                if (DESC92C_RATEMCS0 <= rate && rate <= DESC92C_RATEMCS15)
1257                        tx_power += rtlefuse->txpwr_ht40diff[rfpath][TX_1S];
1258                if (DESC92C_RATEMCS8 <= rate && rate <= DESC92C_RATEMCS15)
1259                        tx_power += rtlefuse->txpwr_ht40diff[rfpath][TX_2S];
1260        }
1261
1262        if (rtlefuse->eeprom_regulatory != 2)
1263                diff = _rtl92ee_get_txpower_by_rate(hw, BAND_ON_2_4G,
1264                                                    rfpath, rate);
1265
1266        tx_power += diff;
1267
1268        if (tx_power > MAX_POWER_INDEX)
1269                tx_power = MAX_POWER_INDEX;
1270
1271        return tx_power;
1272}
1273
1274static void _rtl92ee_set_txpower_index(struct ieee80211_hw *hw, u8 pwr_idx,
1275                                       enum radio_path rfpath, u8 rate)
1276{
1277        struct rtl_priv *rtlpriv = rtl_priv(hw);
1278
1279        if (rfpath == RF90_PATH_A) {
1280                switch (rate) {
1281                case DESC92C_RATE1M:
1282                        rtl_set_bbreg(hw, RTXAGC_A_CCK1_MCS32, MASKBYTE1,
1283                                      pwr_idx);
1284                        break;
1285                case DESC92C_RATE2M:
1286                        rtl_set_bbreg(hw, RTXAGC_B_CCK11_A_CCK2_11, MASKBYTE1,
1287                                      pwr_idx);
1288                        break;
1289                case DESC92C_RATE5_5M:
1290                        rtl_set_bbreg(hw, RTXAGC_B_CCK11_A_CCK2_11, MASKBYTE2,
1291                                      pwr_idx);
1292                        break;
1293                case DESC92C_RATE11M:
1294                        rtl_set_bbreg(hw, RTXAGC_B_CCK11_A_CCK2_11, MASKBYTE3,
1295                                      pwr_idx);
1296                        break;
1297                case DESC92C_RATE6M:
1298                        rtl_set_bbreg(hw, RTXAGC_A_RATE18_06, MASKBYTE0,
1299                                      pwr_idx);
1300                        break;
1301                case DESC92C_RATE9M:
1302                        rtl_set_bbreg(hw, RTXAGC_A_RATE18_06, MASKBYTE1,
1303                                      pwr_idx);
1304                        break;
1305                case DESC92C_RATE12M:
1306                        rtl_set_bbreg(hw, RTXAGC_A_RATE18_06, MASKBYTE2,
1307                                      pwr_idx);
1308                        break;
1309                case DESC92C_RATE18M:
1310                        rtl_set_bbreg(hw, RTXAGC_A_RATE18_06, MASKBYTE3,
1311                                      pwr_idx);
1312                        break;
1313                case DESC92C_RATE24M:
1314                        rtl_set_bbreg(hw, RTXAGC_A_RATE54_24, MASKBYTE0,
1315                                      pwr_idx);
1316                        break;
1317                case DESC92C_RATE36M:
1318                        rtl_set_bbreg(hw, RTXAGC_A_RATE54_24, MASKBYTE1,
1319                                      pwr_idx);
1320                        break;
1321                case DESC92C_RATE48M:
1322                        rtl_set_bbreg(hw, RTXAGC_A_RATE54_24, MASKBYTE2,
1323                                      pwr_idx);
1324                        break;
1325                case DESC92C_RATE54M:
1326                        rtl_set_bbreg(hw, RTXAGC_A_RATE54_24, MASKBYTE3,
1327                                      pwr_idx);
1328                        break;
1329                case DESC92C_RATEMCS0:
1330                        rtl_set_bbreg(hw, RTXAGC_A_MCS03_MCS00, MASKBYTE0,
1331                                      pwr_idx);
1332                        break;
1333                case DESC92C_RATEMCS1:
1334                        rtl_set_bbreg(hw, RTXAGC_A_MCS03_MCS00, MASKBYTE1,
1335                                      pwr_idx);
1336                        break;
1337                case DESC92C_RATEMCS2:
1338                        rtl_set_bbreg(hw, RTXAGC_A_MCS03_MCS00, MASKBYTE2,
1339                                      pwr_idx);
1340                        break;
1341                case DESC92C_RATEMCS3:
1342                        rtl_set_bbreg(hw, RTXAGC_A_MCS03_MCS00, MASKBYTE3,
1343                                      pwr_idx);
1344                        break;
1345                case DESC92C_RATEMCS4:
1346                        rtl_set_bbreg(hw, RTXAGC_A_MCS07_MCS04, MASKBYTE0,
1347                                      pwr_idx);
1348                        break;
1349                case DESC92C_RATEMCS5:
1350                        rtl_set_bbreg(hw, RTXAGC_A_MCS07_MCS04, MASKBYTE1,
1351                                      pwr_idx);
1352                        break;
1353                case DESC92C_RATEMCS6:
1354                        rtl_set_bbreg(hw, RTXAGC_A_MCS07_MCS04, MASKBYTE2,
1355                                      pwr_idx);
1356                        break;
1357                case DESC92C_RATEMCS7:
1358                        rtl_set_bbreg(hw, RTXAGC_A_MCS07_MCS04, MASKBYTE3,
1359                                      pwr_idx);
1360                        break;
1361                case DESC92C_RATEMCS8:
1362                        rtl_set_bbreg(hw, RTXAGC_A_MCS11_MCS08, MASKBYTE0,
1363                                      pwr_idx);
1364                        break;
1365                case DESC92C_RATEMCS9:
1366                        rtl_set_bbreg(hw, RTXAGC_A_MCS11_MCS08, MASKBYTE1,
1367                                      pwr_idx);
1368                        break;
1369                case DESC92C_RATEMCS10:
1370                        rtl_set_bbreg(hw, RTXAGC_A_MCS11_MCS08, MASKBYTE2,
1371                                      pwr_idx);
1372                        break;
1373                case DESC92C_RATEMCS11:
1374                        rtl_set_bbreg(hw, RTXAGC_A_MCS11_MCS08, MASKBYTE3,
1375                                      pwr_idx);
1376                        break;
1377                case DESC92C_RATEMCS12:
1378                        rtl_set_bbreg(hw, RTXAGC_A_MCS15_MCS12, MASKBYTE0,
1379                                      pwr_idx);
1380                        break;
1381                case DESC92C_RATEMCS13:
1382                        rtl_set_bbreg(hw, RTXAGC_A_MCS15_MCS12, MASKBYTE1,
1383                                      pwr_idx);
1384                        break;
1385                case DESC92C_RATEMCS14:
1386                        rtl_set_bbreg(hw, RTXAGC_A_MCS15_MCS12, MASKBYTE2,
1387                                      pwr_idx);
1388                        break;
1389                case DESC92C_RATEMCS15:
1390                        rtl_set_bbreg(hw, RTXAGC_A_MCS15_MCS12, MASKBYTE3,
1391                                      pwr_idx);
1392                        break;
1393                default:
1394                        rtl_dbg(rtlpriv, COMP_POWER, DBG_LOUD,
1395                                "Invalid Rate!!\n");
1396                        break;
1397                }
1398        } else if (rfpath == RF90_PATH_B) {
1399                switch (rate) {
1400                case DESC92C_RATE1M:
1401                        rtl_set_bbreg(hw, RTXAGC_B_CCK1_55_MCS32, MASKBYTE1,
1402                                      pwr_idx);
1403                        break;
1404                case DESC92C_RATE2M:
1405                        rtl_set_bbreg(hw, RTXAGC_B_CCK1_55_MCS32, MASKBYTE2,
1406                                      pwr_idx);
1407                        break;
1408                case DESC92C_RATE5_5M:
1409                        rtl_set_bbreg(hw, RTXAGC_B_CCK1_55_MCS32, MASKBYTE3,
1410                                      pwr_idx);
1411                        break;
1412                case DESC92C_RATE11M:
1413                        rtl_set_bbreg(hw, RTXAGC_B_CCK11_A_CCK2_11, MASKBYTE0,
1414                                      pwr_idx);
1415                        break;
1416                case DESC92C_RATE6M:
1417                        rtl_set_bbreg(hw, RTXAGC_B_RATE18_06, MASKBYTE0,
1418                                      pwr_idx);
1419                        break;
1420                case DESC92C_RATE9M:
1421                        rtl_set_bbreg(hw, RTXAGC_B_RATE18_06, MASKBYTE1,
1422                                      pwr_idx);
1423                        break;
1424                case DESC92C_RATE12M:
1425                        rtl_set_bbreg(hw, RTXAGC_B_RATE18_06, MASKBYTE2,
1426                                      pwr_idx);
1427                        break;
1428                case DESC92C_RATE18M:
1429                        rtl_set_bbreg(hw, RTXAGC_B_RATE18_06, MASKBYTE3,
1430                                      pwr_idx);
1431                        break;
1432                case DESC92C_RATE24M:
1433                        rtl_set_bbreg(hw, RTXAGC_B_RATE54_24, MASKBYTE0,
1434                                      pwr_idx);
1435                        break;
1436                case DESC92C_RATE36M:
1437                        rtl_set_bbreg(hw, RTXAGC_B_RATE54_24, MASKBYTE1,
1438                                      pwr_idx);
1439                        break;
1440                case DESC92C_RATE48M:
1441                        rtl_set_bbreg(hw, RTXAGC_B_RATE54_24, MASKBYTE2,
1442                                      pwr_idx);
1443                        break;
1444                case DESC92C_RATE54M:
1445                        rtl_set_bbreg(hw, RTXAGC_B_RATE54_24, MASKBYTE3,
1446                                      pwr_idx);
1447                        break;
1448                case DESC92C_RATEMCS0:
1449                        rtl_set_bbreg(hw, RTXAGC_B_MCS03_MCS00, MASKBYTE0,
1450                                      pwr_idx);
1451                        break;
1452                case DESC92C_RATEMCS1:
1453                        rtl_set_bbreg(hw, RTXAGC_B_MCS03_MCS00, MASKBYTE1,
1454                                      pwr_idx);
1455                        break;
1456                case DESC92C_RATEMCS2:
1457                        rtl_set_bbreg(hw, RTXAGC_B_MCS03_MCS00, MASKBYTE2,
1458                                      pwr_idx);
1459                        break;
1460                case DESC92C_RATEMCS3:
1461                        rtl_set_bbreg(hw, RTXAGC_B_MCS03_MCS00, MASKBYTE3,
1462                                      pwr_idx);
1463                        break;
1464                case DESC92C_RATEMCS4:
1465                        rtl_set_bbreg(hw, RTXAGC_B_MCS07_MCS04, MASKBYTE0,
1466                                      pwr_idx);
1467                        break;
1468                case DESC92C_RATEMCS5:
1469                        rtl_set_bbreg(hw, RTXAGC_B_MCS07_MCS04, MASKBYTE1,
1470                                      pwr_idx);
1471                        break;
1472                case DESC92C_RATEMCS6:
1473                        rtl_set_bbreg(hw, RTXAGC_B_MCS07_MCS04, MASKBYTE2,
1474                                      pwr_idx);
1475                        break;
1476                case DESC92C_RATEMCS7:
1477                        rtl_set_bbreg(hw, RTXAGC_B_MCS07_MCS04, MASKBYTE3,
1478                                      pwr_idx);
1479                        break;
1480                case DESC92C_RATEMCS8:
1481                        rtl_set_bbreg(hw, RTXAGC_B_MCS11_MCS08, MASKBYTE0,
1482                                      pwr_idx);
1483                        break;
1484                case DESC92C_RATEMCS9:
1485                        rtl_set_bbreg(hw, RTXAGC_B_MCS11_MCS08, MASKBYTE1,
1486                                      pwr_idx);
1487                        break;
1488                case DESC92C_RATEMCS10:
1489                        rtl_set_bbreg(hw, RTXAGC_B_MCS11_MCS08, MASKBYTE2,
1490                                      pwr_idx);
1491                        break;
1492                case DESC92C_RATEMCS11:
1493                        rtl_set_bbreg(hw, RTXAGC_B_MCS11_MCS08, MASKBYTE3,
1494                                      pwr_idx);
1495                        break;
1496                case DESC92C_RATEMCS12:
1497                        rtl_set_bbreg(hw, RTXAGC_B_MCS15_MCS12, MASKBYTE0,
1498                                      pwr_idx);
1499                        break;
1500                case DESC92C_RATEMCS13:
1501                        rtl_set_bbreg(hw, RTXAGC_B_MCS15_MCS12, MASKBYTE1,
1502                                      pwr_idx);
1503                        break;
1504                case DESC92C_RATEMCS14:
1505                        rtl_set_bbreg(hw, RTXAGC_B_MCS15_MCS12, MASKBYTE2,
1506                                      pwr_idx);
1507                        break;
1508                case DESC92C_RATEMCS15:
1509                        rtl_set_bbreg(hw, RTXAGC_B_MCS15_MCS12, MASKBYTE3,
1510                                      pwr_idx);
1511                        break;
1512                default:
1513                        rtl_dbg(rtlpriv, COMP_POWER, DBG_LOUD,
1514                                "Invalid Rate!!\n");
1515                        break;
1516                }
1517        } else {
1518                rtl_dbg(rtlpriv, COMP_POWER, DBG_LOUD, "Invalid RFPath!!\n");
1519        }
1520}
1521
1522static void phy_set_txpower_index_by_rate_array(struct ieee80211_hw *hw,
1523                                                enum radio_path rfpath, u8 bw,
1524                                                u8 channel, u8 *rates, u8 size)
1525{
1526        u8 i;
1527        u8 power_index;
1528
1529        for (i = 0; i < size; i++) {
1530                power_index = _rtl92ee_get_txpower_index(hw, rfpath, rates[i],
1531                                                         bw, channel);
1532                _rtl92ee_set_txpower_index(hw, power_index, rfpath, rates[i]);
1533        }
1534}
1535
1536static void phy_set_txpower_index_by_rate_section(struct ieee80211_hw *hw,
1537                                                  enum radio_path rfpath,
1538                                                  u8 channel,
1539                                                  enum rate_section section)
1540{
1541        struct rtl_priv *rtlpriv = rtl_priv(hw);
1542        struct rtl_hal *rtlhal = rtl_hal(rtlpriv);
1543        struct rtl_phy *rtlphy = &rtlpriv->phy;
1544
1545        if (section == CCK) {
1546                u8 cck_rates[] = {DESC92C_RATE1M, DESC92C_RATE2M,
1547                                  DESC92C_RATE5_5M, DESC92C_RATE11M};
1548                if (rtlhal->current_bandtype == BAND_ON_2_4G)
1549                        phy_set_txpower_index_by_rate_array(hw, rfpath,
1550                                                        rtlphy->current_chan_bw,
1551                                                        channel, cck_rates, 4);
1552        } else if (section == OFDM) {
1553                u8 ofdm_rates[] = {DESC92C_RATE6M, DESC92C_RATE9M,
1554                                   DESC92C_RATE12M, DESC92C_RATE18M,
1555                                   DESC92C_RATE24M, DESC92C_RATE36M,
1556                                   DESC92C_RATE48M, DESC92C_RATE54M};
1557                phy_set_txpower_index_by_rate_array(hw, rfpath,
1558                                                    rtlphy->current_chan_bw,
1559                                                    channel, ofdm_rates, 8);
1560        } else if (section == HT_MCS0_MCS7) {
1561                u8 ht_rates1t[]  = {DESC92C_RATEMCS0, DESC92C_RATEMCS1,
1562                                    DESC92C_RATEMCS2, DESC92C_RATEMCS3,
1563                                    DESC92C_RATEMCS4, DESC92C_RATEMCS5,
1564                                    DESC92C_RATEMCS6, DESC92C_RATEMCS7};
1565                phy_set_txpower_index_by_rate_array(hw, rfpath,
1566                                                    rtlphy->current_chan_bw,
1567                                                    channel, ht_rates1t, 8);
1568        } else if (section == HT_MCS8_MCS15) {
1569                u8 ht_rates2t[]  = {DESC92C_RATEMCS8, DESC92C_RATEMCS9,
1570                                    DESC92C_RATEMCS10, DESC92C_RATEMCS11,
1571                                    DESC92C_RATEMCS12, DESC92C_RATEMCS13,
1572                                    DESC92C_RATEMCS14, DESC92C_RATEMCS15};
1573                phy_set_txpower_index_by_rate_array(hw, rfpath,
1574                                                    rtlphy->current_chan_bw,
1575                                                    channel, ht_rates2t, 8);
1576        } else
1577                rtl_dbg(rtlpriv, FPHY, PHY_TXPWR,
1578                        "Invalid RateSection %d\n", section);
1579}
1580
1581void rtl92ee_phy_set_txpower_level(struct ieee80211_hw *hw, u8 channel)
1582{
1583        struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
1584        struct rtl_phy *rtlphy = &rtl_priv(hw)->phy;
1585        enum radio_path rfpath;
1586
1587        if (!rtlefuse->txpwr_fromeprom)
1588                return;
1589        for (rfpath = RF90_PATH_A; rfpath < rtlphy->num_total_rfpath;
1590             rfpath++) {
1591                phy_set_txpower_index_by_rate_section(hw, rfpath,
1592                                                      channel, CCK);
1593                phy_set_txpower_index_by_rate_section(hw, rfpath,
1594                                                      channel, OFDM);
1595                phy_set_txpower_index_by_rate_section(hw, rfpath,
1596                                                      channel,
1597                                                      HT_MCS0_MCS7);
1598
1599                if (rtlphy->num_total_rfpath >= 2)
1600                        phy_set_txpower_index_by_rate_section(hw,
1601                                                              rfpath, channel,
1602                                                              HT_MCS8_MCS15);
1603        }
1604}
1605
1606static long _rtl92ee_phy_txpwr_idx_to_dbm(struct ieee80211_hw *hw,
1607                                          enum wireless_mode wirelessmode,
1608                                          u8 txpwridx)
1609{
1610        long offset;
1611        long pwrout_dbm;
1612
1613        switch (wirelessmode) {
1614        case WIRELESS_MODE_B:
1615                offset = -7;
1616                break;
1617        case WIRELESS_MODE_G:
1618        case WIRELESS_MODE_N_24G:
1619                offset = -8;
1620                break;
1621        default:
1622                offset = -8;
1623                break;
1624        }
1625        pwrout_dbm = txpwridx / 2 + offset;
1626        return pwrout_dbm;
1627}
1628
1629void rtl92ee_phy_scan_operation_backup(struct ieee80211_hw *hw, u8 operation)
1630{
1631        struct rtl_priv *rtlpriv = rtl_priv(hw);
1632        struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
1633        enum io_type iotype;
1634
1635        if (!is_hal_stop(rtlhal)) {
1636                switch (operation) {
1637                case SCAN_OPT_BACKUP_BAND0:
1638                        iotype = IO_CMD_PAUSE_BAND0_DM_BY_SCAN;
1639                        rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_IO_CMD,
1640                                                      (u8 *)&iotype);
1641
1642                        break;
1643                case SCAN_OPT_RESTORE:
1644                        iotype = IO_CMD_RESUME_DM_BY_SCAN;
1645                        rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_IO_CMD,
1646                                                      (u8 *)&iotype);
1647                        break;
1648                default:
1649                        pr_err("Unknown Scan Backup operation.\n");
1650                        break;
1651                }
1652        }
1653}
1654
1655void rtl92ee_phy_set_bw_mode_callback(struct ieee80211_hw *hw)
1656{
1657        struct rtl_priv *rtlpriv = rtl_priv(hw);
1658        struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
1659        struct rtl_phy *rtlphy = &rtlpriv->phy;
1660        struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
1661        u8 reg_bw_opmode;
1662        u8 reg_prsr_rsc;
1663
1664        rtl_dbg(rtlpriv, COMP_SCAN, DBG_TRACE,
1665                "Switch to %s bandwidth\n",
1666                rtlphy->current_chan_bw == HT_CHANNEL_WIDTH_20 ?
1667                "20MHz" : "40MHz");
1668
1669        if (is_hal_stop(rtlhal)) {
1670                rtlphy->set_bwmode_inprogress = false;
1671                return;
1672        }
1673
1674        reg_bw_opmode = rtl_read_byte(rtlpriv, REG_BWOPMODE);
1675        reg_prsr_rsc = rtl_read_byte(rtlpriv, REG_RRSR + 2);
1676
1677        switch (rtlphy->current_chan_bw) {
1678        case HT_CHANNEL_WIDTH_20:
1679                reg_bw_opmode |= BW_OPMODE_20MHZ;
1680                rtl_write_byte(rtlpriv, REG_BWOPMODE, reg_bw_opmode);
1681                break;
1682        case HT_CHANNEL_WIDTH_20_40:
1683                reg_bw_opmode &= ~BW_OPMODE_20MHZ;
1684                rtl_write_byte(rtlpriv, REG_BWOPMODE, reg_bw_opmode);
1685                reg_prsr_rsc = (reg_prsr_rsc & 0x90) |
1686                               (mac->cur_40_prime_sc << 5);
1687                rtl_write_byte(rtlpriv, REG_RRSR + 2, reg_prsr_rsc);
1688                break;
1689        default:
1690                pr_err("unknown bandwidth: %#X\n",
1691                       rtlphy->current_chan_bw);
1692                break;
1693        }
1694
1695        switch (rtlphy->current_chan_bw) {
1696        case HT_CHANNEL_WIDTH_20:
1697                rtl_set_bbreg(hw, RFPGA0_RFMOD, BRFMOD, 0x0);
1698                rtl_set_bbreg(hw, RFPGA1_RFMOD, BRFMOD, 0x0);
1699                rtl_set_bbreg(hw, ROFDM0_TXPSEUDONOISEWGT,
1700                              (BIT(31) | BIT(30)), 0);
1701                break;
1702        case HT_CHANNEL_WIDTH_20_40:
1703                rtl_set_bbreg(hw, RFPGA0_RFMOD, BRFMOD, 0x1);
1704                rtl_set_bbreg(hw, RFPGA1_RFMOD, BRFMOD, 0x1);
1705                rtl_set_bbreg(hw, RCCK0_SYSTEM, BCCK_SIDEBAND,
1706                              (mac->cur_40_prime_sc >> 1));
1707                rtl_set_bbreg(hw, ROFDM1_LSTF, 0xC00,
1708                              mac->cur_40_prime_sc);
1709
1710                rtl_set_bbreg(hw, 0x818, (BIT(26) | BIT(27)),
1711                              (mac->cur_40_prime_sc ==
1712                               HAL_PRIME_CHNL_OFFSET_LOWER) ? 2 : 1);
1713                break;
1714        default:
1715                pr_err("unknown bandwidth: %#X\n",
1716                       rtlphy->current_chan_bw);
1717                break;
1718        }
1719        rtl92ee_phy_rf6052_set_bandwidth(hw, rtlphy->current_chan_bw);
1720        rtlphy->set_bwmode_inprogress = false;
1721        rtl_dbg(rtlpriv, COMP_SCAN, DBG_LOUD, "\n");
1722}
1723
1724void rtl92ee_phy_set_bw_mode(struct ieee80211_hw *hw,
1725                             enum nl80211_channel_type ch_type)
1726{
1727        struct rtl_priv *rtlpriv = rtl_priv(hw);
1728        struct rtl_phy *rtlphy = &rtlpriv->phy;
1729        struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
1730        u8 tmp_bw = rtlphy->current_chan_bw;
1731
1732        if (rtlphy->set_bwmode_inprogress)
1733                return;
1734        rtlphy->set_bwmode_inprogress = true;
1735        if ((!is_hal_stop(rtlhal)) && !(RT_CANNOT_IO(hw))) {
1736                rtl92ee_phy_set_bw_mode_callback(hw);
1737        } else {
1738                rtl_dbg(rtlpriv, COMP_ERR, DBG_WARNING,
1739                        "false driver sleep or unload\n");
1740                rtlphy->set_bwmode_inprogress = false;
1741                rtlphy->current_chan_bw = tmp_bw;
1742        }
1743}
1744
1745void rtl92ee_phy_sw_chnl_callback(struct ieee80211_hw *hw)
1746{
1747        struct rtl_priv *rtlpriv = rtl_priv(hw);
1748        struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
1749        struct rtl_phy *rtlphy = &rtlpriv->phy;
1750        u32 delay;
1751
1752        rtl_dbg(rtlpriv, COMP_SCAN, DBG_TRACE,
1753                "switch to channel%d\n", rtlphy->current_channel);
1754        if (is_hal_stop(rtlhal))
1755                return;
1756        do {
1757                if (!rtlphy->sw_chnl_inprogress)
1758                        break;
1759                if (!_rtl92ee_phy_sw_chnl_step_by_step
1760                    (hw, rtlphy->current_channel, &rtlphy->sw_chnl_stage,
1761                     &rtlphy->sw_chnl_step, &delay)) {
1762                        if (delay > 0)
1763                                mdelay(delay);
1764                        else
1765                                continue;
1766                } else {
1767                        rtlphy->sw_chnl_inprogress = false;
1768                }
1769                break;
1770        } while (true);
1771        rtl_dbg(rtlpriv, COMP_SCAN, DBG_TRACE, "\n");
1772}
1773
1774u8 rtl92ee_phy_sw_chnl(struct ieee80211_hw *hw)
1775{
1776        struct rtl_priv *rtlpriv = rtl_priv(hw);
1777        struct rtl_phy *rtlphy = &rtlpriv->phy;
1778        struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
1779
1780        if (rtlphy->sw_chnl_inprogress)
1781                return 0;
1782        if (rtlphy->set_bwmode_inprogress)
1783                return 0;
1784        WARN_ONCE((rtlphy->current_channel > 14),
1785                  "rtl8192ee: WIRELESS_MODE_G but channel>14");
1786        rtlphy->sw_chnl_inprogress = true;
1787        rtlphy->sw_chnl_stage = 0;
1788        rtlphy->sw_chnl_step = 0;
1789        if (!(is_hal_stop(rtlhal)) && !(RT_CANNOT_IO(hw))) {
1790                rtl92ee_phy_sw_chnl_callback(hw);
1791                rtl_dbg(rtlpriv, COMP_CHAN, DBG_LOUD,
1792                        "sw_chnl_inprogress false schedule workitem current channel %d\n",
1793                        rtlphy->current_channel);
1794                rtlphy->sw_chnl_inprogress = false;
1795        } else {
1796                rtl_dbg(rtlpriv, COMP_CHAN, DBG_LOUD,
1797                        "sw_chnl_inprogress false driver sleep or unload\n");
1798                rtlphy->sw_chnl_inprogress = false;
1799        }
1800        return 1;
1801}
1802
1803static bool _rtl92ee_phy_sw_chnl_step_by_step(struct ieee80211_hw *hw,
1804                                              u8 channel, u8 *stage, u8 *step,
1805                                              u32 *delay)
1806{
1807        struct rtl_priv *rtlpriv = rtl_priv(hw);
1808        struct rtl_phy *rtlphy = &rtlpriv->phy;
1809        struct swchnlcmd precommoncmd[MAX_PRECMD_CNT];
1810        u32 precommoncmdcnt;
1811        struct swchnlcmd postcommoncmd[MAX_POSTCMD_CNT];
1812        u32 postcommoncmdcnt;
1813        struct swchnlcmd rfdependcmd[MAX_RFDEPENDCMD_CNT];
1814        u32 rfdependcmdcnt;
1815        struct swchnlcmd *currentcmd = NULL;
1816        u8 rfpath;
1817        u8 num_total_rfpath = rtlphy->num_total_rfpath;
1818
1819        precommoncmdcnt = 0;
1820        _rtl92ee_phy_set_sw_chnl_cmdarray(precommoncmd, precommoncmdcnt++,
1821                                          MAX_PRECMD_CNT,
1822                                          CMDID_SET_TXPOWEROWER_LEVEL, 0, 0, 0);
1823        _rtl92ee_phy_set_sw_chnl_cmdarray(precommoncmd, precommoncmdcnt++,
1824                                          MAX_PRECMD_CNT, CMDID_END, 0, 0, 0);
1825
1826        postcommoncmdcnt = 0;
1827
1828        _rtl92ee_phy_set_sw_chnl_cmdarray(postcommoncmd, postcommoncmdcnt++,
1829                                          MAX_POSTCMD_CNT, CMDID_END, 0, 0, 0);
1830
1831        rfdependcmdcnt = 0;
1832
1833        WARN_ONCE((channel < 1 || channel > 14),
1834                  "rtl8192ee: illegal channel for Zebra: %d\n", channel);
1835
1836        _rtl92ee_phy_set_sw_chnl_cmdarray(rfdependcmd, rfdependcmdcnt++,
1837                                          MAX_RFDEPENDCMD_CNT,
1838                                          CMDID_RF_WRITEREG,
1839                                          RF_CHNLBW, channel, 10);
1840
1841        _rtl92ee_phy_set_sw_chnl_cmdarray(rfdependcmd, rfdependcmdcnt++,
1842                                          MAX_RFDEPENDCMD_CNT, CMDID_END,
1843                                          0, 0, 0);
1844
1845        do {
1846                switch (*stage) {
1847                case 0:
1848                        currentcmd = &precommoncmd[*step];
1849                        break;
1850                case 1:
1851                        currentcmd = &rfdependcmd[*step];
1852                        break;
1853                case 2:
1854                        currentcmd = &postcommoncmd[*step];
1855                        break;
1856                default:
1857                        pr_err("Invalid 'stage' = %d, Check it!\n",
1858                               *stage);
1859                        return true;
1860                }
1861
1862                if (currentcmd->cmdid == CMDID_END) {
1863                        if ((*stage) == 2)
1864                                return true;
1865                        (*stage)++;
1866                        (*step) = 0;
1867                        continue;
1868                }
1869
1870                switch (currentcmd->cmdid) {
1871                case CMDID_SET_TXPOWEROWER_LEVEL:
1872                        rtl92ee_phy_set_txpower_level(hw, channel);
1873                        break;
1874                case CMDID_WRITEPORT_ULONG:
1875                        rtl_write_dword(rtlpriv, currentcmd->para1,
1876                                        currentcmd->para2);
1877                        break;
1878                case CMDID_WRITEPORT_USHORT:
1879                        rtl_write_word(rtlpriv, currentcmd->para1,
1880                                       (u16)currentcmd->para2);
1881                        break;
1882                case CMDID_WRITEPORT_UCHAR:
1883                        rtl_write_byte(rtlpriv, currentcmd->para1,
1884                                       (u8)currentcmd->para2);
1885                        break;
1886                case CMDID_RF_WRITEREG:
1887                        for (rfpath = 0; rfpath < num_total_rfpath; rfpath++) {
1888                                rtlphy->rfreg_chnlval[rfpath] =
1889                                        ((rtlphy->rfreg_chnlval[rfpath] &
1890                                          0xfffff00) | currentcmd->para2);
1891
1892                                rtl_set_rfreg(hw, (enum radio_path)rfpath,
1893                                              currentcmd->para1,
1894                                              0x3ff,
1895                                              rtlphy->rfreg_chnlval[rfpath]);
1896                        }
1897                        break;
1898                default:
1899                        rtl_dbg(rtlpriv, COMP_ERR, DBG_LOUD,
1900                                "switch case %#x not processed\n",
1901                                currentcmd->cmdid);
1902                        break;
1903                }
1904
1905                break;
1906        } while (true);
1907
1908        (*delay) = currentcmd->msdelay;
1909        (*step)++;
1910        return false;
1911}
1912
1913static bool _rtl92ee_phy_set_sw_chnl_cmdarray(struct swchnlcmd *cmdtable,
1914                                              u32 cmdtableidx, u32 cmdtablesz,
1915                                              enum swchnlcmd_id cmdid,
1916                                              u32 para1, u32 para2, u32 msdelay)
1917{
1918        struct swchnlcmd *pcmd;
1919
1920        if (cmdtable == NULL) {
1921                WARN_ONCE(true, "rtl8192ee: cmdtable cannot be NULL.\n");
1922                return false;
1923        }
1924
1925        if (cmdtableidx >= cmdtablesz)
1926                return false;
1927
1928        pcmd = cmdtable + cmdtableidx;
1929        pcmd->cmdid = cmdid;
1930        pcmd->para1 = para1;
1931        pcmd->para2 = para2;
1932        pcmd->msdelay = msdelay;
1933        return true;
1934}
1935
1936static u8 _rtl92ee_phy_path_a_iqk(struct ieee80211_hw *hw, bool config_pathb)
1937{
1938        u32 reg_eac, reg_e94, reg_e9c;
1939        u8 result = 0x00;
1940        /* path-A IQK setting */
1941        /* PA/PAD controlled by 0x0 */
1942        rtl_set_bbreg(hw, RFPGA0_IQK, MASKDWORD, 0x00000000);
1943        rtl_set_rfreg(hw, RF90_PATH_A, 0xdf, RFREG_OFFSET_MASK, 0x180);
1944        rtl_set_bbreg(hw, RFPGA0_IQK, MASKDWORD, 0x80800000);
1945
1946        rtl_set_bbreg(hw, RTX_IQK_TONE_A, MASKDWORD, 0x18008c1c);
1947        rtl_set_bbreg(hw, RRX_IQK_TONE_A, MASKDWORD, 0x38008c1c);
1948        rtl_set_bbreg(hw, RTX_IQK_TONE_B, MASKDWORD, 0x38008c1c);
1949        rtl_set_bbreg(hw, RRX_IQK_TONE_B, MASKDWORD, 0x38008c1c);
1950
1951        rtl_set_bbreg(hw, RTX_IQK_PI_A, MASKDWORD, 0x82140303);
1952        rtl_set_bbreg(hw, RRX_IQK_PI_A, MASKDWORD, 0x68160000);
1953
1954        /*LO calibration setting*/
1955        rtl_set_bbreg(hw, RIQK_AGC_RSP, MASKDWORD, 0x00462911);
1956
1957        /*One shot, path A LOK & IQK*/
1958        rtl_set_bbreg(hw, RIQK_AGC_PTS, MASKDWORD, 0xf9000000);
1959        rtl_set_bbreg(hw, RIQK_AGC_PTS, MASKDWORD, 0xf8000000);
1960
1961        mdelay(IQK_DELAY_TIME);
1962
1963        reg_eac = rtl_get_bbreg(hw, 0xeac, MASKDWORD);
1964        reg_e94 = rtl_get_bbreg(hw, 0xe94, MASKDWORD);
1965        reg_e9c = rtl_get_bbreg(hw, 0xe9c, MASKDWORD);
1966
1967        if (!(reg_eac & BIT(28)) &&
1968            (((reg_e94 & 0x03FF0000) >> 16) != 0x142) &&
1969            (((reg_e9c & 0x03FF0000) >> 16) != 0x42))
1970                result |= 0x01;
1971        else
1972                return result;
1973
1974        return result;
1975}
1976
1977static u8 _rtl92ee_phy_path_b_iqk(struct ieee80211_hw *hw)
1978{
1979        u32 reg_eac, reg_eb4, reg_ebc;
1980        u8 result = 0x00;
1981
1982        /* PA/PAD controlled by 0x0 */
1983        rtl_set_bbreg(hw, RFPGA0_IQK, MASKDWORD, 0x00000000);
1984        rtl_set_rfreg(hw, RF90_PATH_B, 0xdf, RFREG_OFFSET_MASK, 0x180);
1985        rtl_set_bbreg(hw, RFPGA0_IQK, MASKDWORD, 0x80800000);
1986
1987        rtl_set_bbreg(hw, 0xe28, MASKDWORD, 0x00000000);
1988        rtl_set_bbreg(hw, 0xe28, MASKDWORD, 0x80800000);
1989
1990        rtl_set_bbreg(hw, RTX_IQK_TONE_A, MASKDWORD, 0x38008c1c);
1991        rtl_set_bbreg(hw, RRX_IQK_TONE_A, MASKDWORD, 0x38008c1c);
1992        rtl_set_bbreg(hw, RTX_IQK_TONE_B, MASKDWORD, 0x18008c1c);
1993        rtl_set_bbreg(hw, RRX_IQK_TONE_B, MASKDWORD, 0x38008c1c);
1994
1995        rtl_set_bbreg(hw, RTX_IQK_PI_B, MASKDWORD, 0x821403e2);
1996        rtl_set_bbreg(hw, RRX_IQK_PI_B, MASKDWORD, 0x68160000);
1997
1998        /* LO calibration setting */
1999        rtl_set_bbreg(hw, RIQK_AGC_RSP, MASKDWORD, 0x00462911);
2000
2001        /*One shot, path B LOK & IQK*/
2002        rtl_set_bbreg(hw, RIQK_AGC_PTS, MASKDWORD, 0xfa000000);
2003        rtl_set_bbreg(hw, RIQK_AGC_PTS, MASKDWORD, 0xf8000000);
2004
2005        mdelay(IQK_DELAY_TIME);
2006
2007        reg_eac = rtl_get_bbreg(hw, 0xeac, MASKDWORD);
2008        reg_eb4 = rtl_get_bbreg(hw, 0xeb4, MASKDWORD);
2009        reg_ebc = rtl_get_bbreg(hw, 0xebc, MASKDWORD);
2010
2011        if (!(reg_eac & BIT(31)) &&
2012            (((reg_eb4 & 0x03FF0000) >> 16) != 0x142) &&
2013            (((reg_ebc & 0x03FF0000) >> 16) != 0x42))
2014                result |= 0x01;
2015        else
2016                return result;
2017
2018        return result;
2019}
2020
2021static u8 _rtl92ee_phy_path_a_rx_iqk(struct ieee80211_hw *hw, bool config_pathb)
2022{
2023        u32 reg_eac, reg_e94, reg_e9c, reg_ea4 , u32temp;
2024        u8 result = 0x00;
2025
2026        /*Get TXIMR Setting*/
2027        /*Modify RX IQK mode table*/
2028        rtl_set_bbreg(hw, RFPGA0_IQK, MASKDWORD, 0x00000000);
2029
2030        rtl_set_rfreg(hw, RF90_PATH_A, RF_WE_LUT, RFREG_OFFSET_MASK, 0x800a0);
2031        rtl_set_rfreg(hw, RF90_PATH_A, RF_RCK_OS, RFREG_OFFSET_MASK, 0x30000);
2032        rtl_set_rfreg(hw, RF90_PATH_A, RF_TXPA_G1, RFREG_OFFSET_MASK, 0x0000f);
2033        rtl_set_rfreg(hw, RF90_PATH_A, RF_TXPA_G2, RFREG_OFFSET_MASK, 0xf117b);
2034
2035        /*PA/PAD control by 0x56, and set = 0x0*/
2036        rtl_set_rfreg(hw, RF90_PATH_A, 0xdf, RFREG_OFFSET_MASK, 0x980);
2037        rtl_set_rfreg(hw, RF90_PATH_A, 0x56, RFREG_OFFSET_MASK, 0x51000);
2038
2039        /*enter IQK mode*/
2040        rtl_set_bbreg(hw, RFPGA0_IQK, MASKDWORD, 0x80800000);
2041
2042        /*IQK Setting*/
2043        rtl_set_bbreg(hw, RTX_IQK, MASKDWORD, 0x01007c00);
2044        rtl_set_bbreg(hw, RRX_IQK, MASKDWORD, 0x01004800);
2045
2046        /*path a IQK setting*/
2047        rtl_set_bbreg(hw, RTX_IQK_TONE_A, MASKDWORD, 0x18008c1c);
2048        rtl_set_bbreg(hw, RRX_IQK_TONE_A, MASKDWORD, 0x38008c1c);
2049        rtl_set_bbreg(hw, RTX_IQK_TONE_B, MASKDWORD, 0x38008c1c);
2050        rtl_set_bbreg(hw, RRX_IQK_TONE_B, MASKDWORD, 0x38008c1c);
2051
2052        rtl_set_bbreg(hw, RTX_IQK_PI_A, MASKDWORD, 0x82160c1f);
2053        rtl_set_bbreg(hw, RRX_IQK_PI_A, MASKDWORD, 0x68160c1f);
2054
2055        /*LO calibration Setting*/
2056        rtl_set_bbreg(hw, RIQK_AGC_RSP, MASKDWORD, 0x0046a911);
2057
2058        /*one shot,path A LOK & iqk*/
2059        rtl_set_bbreg(hw, RIQK_AGC_PTS, MASKDWORD, 0xfa000000);
2060        rtl_set_bbreg(hw, RIQK_AGC_PTS, MASKDWORD, 0xf8000000);
2061
2062        mdelay(IQK_DELAY_TIME);
2063
2064        /* Check failed */
2065        reg_eac = rtl_get_bbreg(hw, RRX_POWER_AFTER_IQK_A_2, MASKDWORD);
2066        reg_e94 = rtl_get_bbreg(hw, RTX_POWER_BEFORE_IQK_A, MASKDWORD);
2067        reg_e9c = rtl_get_bbreg(hw, RTX_POWER_AFTER_IQK_A, MASKDWORD);
2068
2069        if (!(reg_eac & BIT(28)) &&
2070            (((reg_e94 & 0x03FF0000) >> 16) != 0x142) &&
2071            (((reg_e9c & 0x03FF0000) >> 16) != 0x42)) {
2072                result |= 0x01;
2073        } else {
2074                /*      PA/PAD controlled by 0x0 */
2075                rtl_set_bbreg(hw, RFPGA0_IQK, MASKDWORD, 0x00000000);
2076                rtl_set_rfreg(hw, RF90_PATH_A, 0xdf, RFREG_OFFSET_MASK, 0x180);
2077                return result;
2078        }
2079
2080        u32temp = 0x80007C00 | (reg_e94 & 0x3FF0000)  |
2081                  ((reg_e9c & 0x3FF0000) >> 16);
2082        rtl_set_bbreg(hw, RTX_IQK, MASKDWORD, u32temp);
2083        /*RX IQK*/
2084        /*Modify RX IQK mode table*/
2085        rtl_set_bbreg(hw, RFPGA0_IQK, MASKDWORD, 0x00000000);
2086
2087        rtl_set_rfreg(hw, RF90_PATH_A, RF_WE_LUT, RFREG_OFFSET_MASK, 0x800a0);
2088
2089        rtl_set_rfreg(hw, RF90_PATH_A, RF_RCK_OS, RFREG_OFFSET_MASK, 0x30000);
2090        rtl_set_rfreg(hw, RF90_PATH_A, RF_TXPA_G1, RFREG_OFFSET_MASK, 0x0000f);
2091        rtl_set_rfreg(hw, RF90_PATH_A, RF_TXPA_G2, RFREG_OFFSET_MASK, 0xf7ffa);
2092
2093        /*PA/PAD control by 0x56, and set = 0x0*/
2094        rtl_set_rfreg(hw, RF90_PATH_A, 0xdf, RFREG_OFFSET_MASK, 0x980);
2095        rtl_set_rfreg(hw, RF90_PATH_A, 0x56, RFREG_OFFSET_MASK, 0x51000);
2096
2097        /*enter IQK mode*/
2098        rtl_set_bbreg(hw, RFPGA0_IQK, MASKDWORD, 0x80800000);
2099
2100        /*IQK Setting*/
2101        rtl_set_bbreg(hw, RRX_IQK, MASKDWORD, 0x01004800);
2102
2103        /*path a IQK setting*/
2104        rtl_set_bbreg(hw, RTX_IQK_TONE_A, MASKDWORD, 0x38008c1c);
2105        rtl_set_bbreg(hw, RRX_IQK_TONE_A, MASKDWORD, 0x18008c1c);
2106        rtl_set_bbreg(hw, RTX_IQK_TONE_B, MASKDWORD, 0x38008c1c);
2107        rtl_set_bbreg(hw, RRX_IQK_TONE_B, MASKDWORD, 0x38008c1c);
2108
2109        rtl_set_bbreg(hw, RTX_IQK_PI_A, MASKDWORD, 0x82160c1f);
2110        rtl_set_bbreg(hw, RRX_IQK_PI_A, MASKDWORD, 0x28160c1f);
2111
2112        /*LO calibration Setting*/
2113        rtl_set_bbreg(hw, RIQK_AGC_RSP, MASKDWORD, 0x0046a891);
2114        /*one shot,path A LOK & iqk*/
2115        rtl_set_bbreg(hw, RIQK_AGC_PTS, MASKDWORD, 0xfa000000);
2116        rtl_set_bbreg(hw, RIQK_AGC_PTS, MASKDWORD, 0xf8000000);
2117
2118        mdelay(IQK_DELAY_TIME);
2119        /*Check failed*/
2120        reg_eac = rtl_get_bbreg(hw, RRX_POWER_AFTER_IQK_A_2, MASKDWORD);
2121        reg_ea4 = rtl_get_bbreg(hw, RRX_POWER_BEFORE_IQK_A_2, MASKDWORD);
2122
2123        /*PA/PAD controlled by 0x0*/
2124        /*leave IQK mode*/
2125        rtl_set_bbreg(hw, RFPGA0_IQK, MASKDWORD, 0x00000000);
2126        rtl_set_rfreg(hw, RF90_PATH_A, 0xdf, RFREG_OFFSET_MASK, 0x180);
2127        /*if Tx is OK, check whether Rx is OK*/
2128        if (!(reg_eac & BIT(27)) &&
2129            (((reg_ea4 & 0x03FF0000) >> 16) != 0x132) &&
2130            (((reg_eac & 0x03FF0000) >> 16) != 0x36))
2131                result |= 0x02;
2132
2133        return result;
2134}
2135
2136static u8 _rtl92ee_phy_path_b_rx_iqk(struct ieee80211_hw *hw, bool config_pathb)
2137{
2138        struct rtl_priv *rtlpriv = rtl_priv(hw);
2139        u32 reg_eac, reg_eb4, reg_ebc, reg_ecc, reg_ec4, u32temp;
2140        u8 result = 0x00;
2141
2142        /*Get TXIMR Setting*/
2143        /*Modify RX IQK mode table*/
2144        rtl_set_bbreg(hw, RFPGA0_IQK, MASKDWORD, 0x00000000);
2145
2146        rtl_set_rfreg(hw, RF90_PATH_B, RF_WE_LUT, RFREG_OFFSET_MASK, 0x800a0);
2147        rtl_set_rfreg(hw, RF90_PATH_B, RF_RCK_OS, RFREG_OFFSET_MASK, 0x30000);
2148        rtl_set_rfreg(hw, RF90_PATH_B, RF_TXPA_G1, RFREG_OFFSET_MASK, 0x0000f);
2149        rtl_set_rfreg(hw, RF90_PATH_B, RF_TXPA_G2, RFREG_OFFSET_MASK, 0xf117b);
2150
2151        /*PA/PAD all off*/
2152        rtl_set_rfreg(hw, RF90_PATH_B, 0xdf, RFREG_OFFSET_MASK, 0x980);
2153        rtl_set_rfreg(hw, RF90_PATH_B, 0x56, RFREG_OFFSET_MASK, 0x51000);
2154
2155        rtl_set_bbreg(hw, RFPGA0_IQK, MASKDWORD, 0x80800000);
2156
2157        /*IQK Setting*/
2158        rtl_set_bbreg(hw, RTX_IQK, MASKDWORD, 0x01007c00);
2159        rtl_set_bbreg(hw, RRX_IQK, MASKDWORD, 0x01004800);
2160
2161        /*path a IQK setting*/
2162        rtl_set_bbreg(hw, RTX_IQK_TONE_A, MASKDWORD, 0x38008c1c);
2163        rtl_set_bbreg(hw, RRX_IQK_TONE_A, MASKDWORD, 0x38008c1c);
2164        rtl_set_bbreg(hw, RTX_IQK_TONE_B, MASKDWORD, 0x18008c1c);
2165        rtl_set_bbreg(hw, RRX_IQK_TONE_B, MASKDWORD, 0x38008c1c);
2166
2167        rtl_set_bbreg(hw, RTX_IQK_PI_B, MASKDWORD, 0x82160c1f);
2168        rtl_set_bbreg(hw, RRX_IQK_PI_B, MASKDWORD, 0x68160c1f);
2169
2170        /*LO calibration Setting*/
2171        rtl_set_bbreg(hw, RIQK_AGC_RSP, MASKDWORD, 0x0046a911);
2172
2173        /*one shot,path A LOK & iqk*/
2174        rtl_set_bbreg(hw, RIQK_AGC_PTS, MASKDWORD, 0xfa000000);
2175        rtl_set_bbreg(hw, RIQK_AGC_PTS, MASKDWORD, 0xf8000000);
2176
2177        mdelay(IQK_DELAY_TIME);
2178
2179        /* Check failed */
2180        reg_eac = rtl_get_bbreg(hw, RRX_POWER_AFTER_IQK_A_2, MASKDWORD);
2181        reg_eb4 = rtl_get_bbreg(hw, RTX_POWER_BEFORE_IQK_B, MASKDWORD);
2182        reg_ebc = rtl_get_bbreg(hw, RTX_POWER_AFTER_IQK_B, MASKDWORD);
2183
2184        if (!(reg_eac & BIT(31)) &&
2185            (((reg_eb4 & 0x03FF0000) >> 16) != 0x142) &&
2186            (((reg_ebc & 0x03FF0000) >> 16) != 0x42)) {
2187                result |= 0x01;
2188        } else {
2189                /*      PA/PAD controlled by 0x0 */
2190                rtl_set_bbreg(hw, RFPGA0_IQK, MASKDWORD, 0x00000000);
2191                rtl_set_rfreg(hw, RF90_PATH_B, 0xdf, RFREG_OFFSET_MASK, 0x180);
2192                return result;
2193        }
2194
2195        u32temp = 0x80007C00 | (reg_eb4 & 0x3FF0000) |
2196                  ((reg_ebc & 0x3FF0000) >> 16);
2197        rtl_set_bbreg(hw, RTX_IQK, MASKDWORD, u32temp);
2198        /*RX IQK*/
2199        /*Modify RX IQK mode table*/
2200        rtl_set_bbreg(hw, RFPGA0_IQK, MASKDWORD, 0x00000000);
2201        rtl_set_rfreg(hw, RF90_PATH_B, RF_WE_LUT, RFREG_OFFSET_MASK, 0x800a0);
2202
2203        rtl_set_rfreg(hw, RF90_PATH_B, RF_RCK_OS, RFREG_OFFSET_MASK, 0x30000);
2204        rtl_set_rfreg(hw, RF90_PATH_B, RF_TXPA_G1, RFREG_OFFSET_MASK, 0x0000f);
2205        rtl_set_rfreg(hw, RF90_PATH_B, RF_TXPA_G2, RFREG_OFFSET_MASK, 0xf7ffa);
2206
2207        /*PA/PAD all off*/
2208        rtl_set_rfreg(hw, RF90_PATH_B, 0xdf, RFREG_OFFSET_MASK, 0x980);
2209        rtl_set_rfreg(hw, RF90_PATH_B, 0x56, RFREG_OFFSET_MASK, 0x51000);
2210
2211        /*enter IQK mode*/
2212        rtl_set_bbreg(hw, RFPGA0_IQK, MASKDWORD, 0x80800000);
2213
2214        /*IQK Setting*/
2215        rtl_set_bbreg(hw, RRX_IQK, MASKDWORD, 0x01004800);
2216
2217        /*path b IQK setting*/
2218        rtl_set_bbreg(hw, RTX_IQK_TONE_A, MASKDWORD, 0x38008c1c);
2219        rtl_set_bbreg(hw, RRX_IQK_TONE_A, MASKDWORD, 0x38008c1c);
2220        rtl_set_bbreg(hw, RTX_IQK_TONE_B, MASKDWORD, 0x38008c1c);
2221        rtl_set_bbreg(hw, RRX_IQK_TONE_B, MASKDWORD, 0x18008c1c);
2222
2223        rtl_set_bbreg(hw, RTX_IQK_PI_B, MASKDWORD, 0x82160c1f);
2224        rtl_set_bbreg(hw, RRX_IQK_PI_B, MASKDWORD, 0x28160c1f);
2225
2226        /*LO calibration Setting*/
2227        rtl_set_bbreg(hw, RIQK_AGC_RSP, MASKDWORD, 0x0046a891);
2228        /*one shot,path A LOK & iqk*/
2229        rtl_set_bbreg(hw, RIQK_AGC_PTS, MASKDWORD, 0xfa000000);
2230        rtl_set_bbreg(hw, RIQK_AGC_PTS, MASKDWORD, 0xf8000000);
2231
2232        mdelay(IQK_DELAY_TIME);
2233        /*Check failed*/
2234        reg_eac = rtl_get_bbreg(hw, RRX_POWER_AFTER_IQK_A_2, MASKDWORD);
2235        reg_ec4 = rtl_get_bbreg(hw, RRX_POWER_BEFORE_IQK_B_2, MASKDWORD);
2236        reg_ecc = rtl_get_bbreg(hw, RRX_POWER_AFTER_IQK_B_2, MASKDWORD);
2237        /*PA/PAD controlled by 0x0*/
2238        /*leave IQK mode*/
2239        rtl_set_bbreg(hw, RFPGA0_IQK, MASKDWORD, 0x00000000);
2240        rtl_set_rfreg(hw, RF90_PATH_B, 0xdf, RFREG_OFFSET_MASK, 0x180);
2241        /*if Tx is OK, check whether Rx is OK*/
2242        if (!(reg_eac & BIT(30)) &&
2243            (((reg_ec4 & 0x03FF0000) >> 16) != 0x132) &&
2244            (((reg_ecc & 0x03FF0000) >> 16) != 0x36))
2245                result |= 0x02;
2246        else
2247                rtl_dbg(rtlpriv, COMP_RF, DBG_LOUD, "Path B Rx IQK fail!!\n");
2248
2249        return result;
2250}
2251
2252static void _rtl92ee_phy_path_a_fill_iqk_matrix(struct ieee80211_hw *hw,
2253                                                bool b_iqk_ok, long result[][8],
2254                                                u8 final_candidate,
2255                                                bool btxonly)
2256{
2257        u32 oldval_0, x, tx0_a, reg;
2258        long y, tx0_c;
2259
2260        if (final_candidate == 0xFF) {
2261                return;
2262        } else if (b_iqk_ok) {
2263                oldval_0 = (rtl_get_bbreg(hw, ROFDM0_XATXIQIMBALANCE,
2264                                          MASKDWORD) >> 22) & 0x3FF;
2265                x = result[final_candidate][0];
2266                if ((x & 0x00000200) != 0)
2267                        x = x | 0xFFFFFC00;
2268                tx0_a = (x * oldval_0) >> 8;
2269                rtl_set_bbreg(hw, ROFDM0_XATXIQIMBALANCE, 0x3FF, tx0_a);
2270                rtl_set_bbreg(hw, ROFDM0_ECCATHRESHOLD, BIT(31),
2271                              ((x * oldval_0 >> 7) & 0x1));
2272                y = result[final_candidate][1];
2273                if ((y & 0x00000200) != 0)
2274                        y = y | 0xFFFFFC00;
2275                tx0_c = (y * oldval_0) >> 8;
2276                rtl_set_bbreg(hw, ROFDM0_XCTXAFE, 0xF0000000,
2277                              ((tx0_c & 0x3C0) >> 6));
2278                rtl_set_bbreg(hw, ROFDM0_XATXIQIMBALANCE, 0x003F0000,
2279                              (tx0_c & 0x3F));
2280                rtl_set_bbreg(hw, ROFDM0_ECCATHRESHOLD, BIT(29),
2281                              ((y * oldval_0 >> 7) & 0x1));
2282
2283                if (btxonly)
2284                        return;
2285
2286                reg = result[final_candidate][2];
2287                rtl_set_bbreg(hw, ROFDM0_XARXIQIMBALANCE, 0x3FF, reg);
2288
2289                reg = result[final_candidate][3] & 0x3F;
2290                rtl_set_bbreg(hw, ROFDM0_XARXIQIMBALANCE, 0xFC00, reg);
2291
2292                reg = (result[final_candidate][3] >> 6) & 0xF;
2293                rtl_set_bbreg(hw, ROFDM0_RXIQEXTANTA, 0xF0000000, reg);
2294        }
2295}
2296
2297static void _rtl92ee_phy_path_b_fill_iqk_matrix(struct ieee80211_hw *hw,
2298                                                bool b_iqk_ok, long result[][8],
2299                                                u8 final_candidate,
2300                                                bool btxonly)
2301{
2302        u32 oldval_1, x, tx1_a, reg;
2303        long y, tx1_c;
2304
2305        if (final_candidate == 0xFF) {
2306                return;
2307        } else if (b_iqk_ok) {
2308                oldval_1 = (rtl_get_bbreg(hw, ROFDM0_XATXIQIMBALANCE,
2309                                          MASKDWORD) >> 22) & 0x3FF;
2310                x = result[final_candidate][4];
2311                if ((x & 0x00000200) != 0)
2312                        x = x | 0xFFFFFC00;
2313                tx1_a = (x * oldval_1) >> 8;
2314                rtl_set_bbreg(hw, ROFDM0_XATXIQIMBALANCE, 0x3FF, tx1_a);
2315                rtl_set_bbreg(hw, ROFDM0_ECCATHRESHOLD, BIT(27),
2316                              ((x * oldval_1 >> 7) & 0x1));
2317                y = result[final_candidate][5];
2318                if ((y & 0x00000200) != 0)
2319                        y = y | 0xFFFFFC00;
2320                tx1_c = (y * oldval_1) >> 8;
2321                rtl_set_bbreg(hw, ROFDM0_XDTXAFE, 0xF0000000,
2322                              ((tx1_c & 0x3C0) >> 6));
2323                rtl_set_bbreg(hw, ROFDM0_XBTXIQIMBALANCE, 0x003F0000,
2324                              (tx1_c & 0x3F));
2325                rtl_set_bbreg(hw, ROFDM0_ECCATHRESHOLD, BIT(25),
2326                              ((y * oldval_1 >> 7) & 0x1));
2327
2328                if (btxonly)
2329                        return;
2330
2331                reg = result[final_candidate][6];
2332                rtl_set_bbreg(hw, ROFDM0_XBRXIQIMBALANCE, 0x3FF, reg);
2333
2334                reg = result[final_candidate][7] & 0x3F;
2335                rtl_set_bbreg(hw, ROFDM0_XBRXIQIMBALANCE, 0xFC00, reg);
2336
2337                reg = (result[final_candidate][7] >> 6) & 0xF;
2338                rtl_set_bbreg(hw, ROFDM0_AGCRSSITABLE, 0xF0000000, reg);
2339        }
2340}
2341
2342static void _rtl92ee_phy_save_adda_registers(struct ieee80211_hw *hw,
2343                                             u32 *addareg, u32 *addabackup,
2344                                             u32 registernum)
2345{
2346        u32 i;
2347
2348        for (i = 0; i < registernum; i++)
2349                addabackup[i] = rtl_get_bbreg(hw, addareg[i], MASKDWORD);
2350}
2351
2352static void _rtl92ee_phy_save_mac_registers(struct ieee80211_hw *hw,
2353                                            u32 *macreg, u32 *macbackup)
2354{
2355        struct rtl_priv *rtlpriv = rtl_priv(hw);
2356        u32 i;
2357
2358        for (i = 0; i < (IQK_MAC_REG_NUM - 1); i++)
2359                macbackup[i] = rtl_read_byte(rtlpriv, macreg[i]);
2360
2361        macbackup[i] = rtl_read_dword(rtlpriv, macreg[i]);
2362}
2363
2364static void _rtl92ee_phy_reload_adda_registers(struct ieee80211_hw *hw,
2365                                               u32 *addareg, u32 *addabackup,
2366                                               u32 regiesternum)
2367{
2368        u32 i;
2369
2370        for (i = 0; i < regiesternum; i++)
2371                rtl_set_bbreg(hw, addareg[i], MASKDWORD, addabackup[i]);
2372}
2373
2374static void _rtl92ee_phy_reload_mac_registers(struct ieee80211_hw *hw,
2375                                              u32 *macreg, u32 *macbackup)
2376{
2377        struct rtl_priv *rtlpriv = rtl_priv(hw);
2378        u32 i;
2379
2380        for (i = 0; i < (IQK_MAC_REG_NUM - 1); i++)
2381                rtl_write_byte(rtlpriv, macreg[i], (u8)macbackup[i]);
2382        rtl_write_dword(rtlpriv, macreg[i], macbackup[i]);
2383}
2384
2385static void _rtl92ee_phy_path_adda_on(struct ieee80211_hw *hw, u32 *addareg,
2386                                      bool is_patha_on, bool is2t)
2387{
2388        u32 i;
2389
2390        for (i = 0; i < IQK_ADDA_REG_NUM; i++)
2391                rtl_set_bbreg(hw, addareg[i], MASKDWORD, 0x0fc01616);
2392}
2393
2394static void _rtl92ee_phy_mac_setting_calibration(struct ieee80211_hw *hw,
2395                                                 u32 *macreg, u32 *macbackup)
2396{
2397        rtl_set_bbreg(hw, 0x520, 0x00ff0000, 0xff);
2398}
2399
2400static void _rtl92ee_phy_path_a_standby(struct ieee80211_hw *hw)
2401{
2402        rtl_set_bbreg(hw, 0xe28, MASKDWORD, 0x0);
2403        rtl_set_rfreg(hw, RF90_PATH_A, 0, RFREG_OFFSET_MASK, 0x10000);
2404        rtl_set_bbreg(hw, 0xe28, MASKDWORD, 0x80800000);
2405}
2406
2407static bool _rtl92ee_phy_simularity_compare(struct ieee80211_hw *hw,
2408                                            long result[][8], u8 c1, u8 c2)
2409{
2410        u32 i, j, diff, simularity_bitmap, bound;
2411
2412        u8 final_candidate[2] = { 0xFF, 0xFF };
2413        bool bresult = true/*, is2t = true*/;
2414        s32 tmp1, tmp2;
2415
2416        bound = 8;
2417
2418        simularity_bitmap = 0;
2419
2420        for (i = 0; i < bound; i++) {
2421                if ((i == 1) || (i == 3) || (i == 5) || (i == 7)) {
2422                        if ((result[c1][i] & 0x00000200) != 0)
2423                                tmp1 = result[c1][i] | 0xFFFFFC00;
2424                        else
2425                                tmp1 = result[c1][i];
2426
2427                        if ((result[c2][i] & 0x00000200) != 0)
2428                                tmp2 = result[c2][i] | 0xFFFFFC00;
2429                        else
2430                                tmp2 = result[c2][i];
2431                } else {
2432                        tmp1 = result[c1][i];
2433                        tmp2 = result[c2][i];
2434                }
2435
2436                diff = (tmp1 > tmp2) ? (tmp1 - tmp2) : (tmp2 - tmp1);
2437
2438                if (diff > MAX_TOLERANCE) {
2439                        if ((i == 2 || i == 6) && !simularity_bitmap) {
2440                                if (result[c1][i] + result[c1][i + 1] == 0)
2441                                        final_candidate[(i / 4)] = c2;
2442                                else if (result[c2][i] + result[c2][i + 1] == 0)
2443                                        final_candidate[(i / 4)] = c1;
2444                                else
2445                                        simularity_bitmap |= (1 << i);
2446                        } else {
2447                                simularity_bitmap |= (1 << i);
2448                        }
2449                }
2450        }
2451
2452        if (simularity_bitmap == 0) {
2453                for (i = 0; i < (bound / 4); i++) {
2454                        if (final_candidate[i] != 0xFF) {
2455                                for (j = i * 4; j < (i + 1) * 4 - 2; j++)
2456                                        result[3][j] =
2457                                                result[final_candidate[i]][j];
2458                                bresult = false;
2459                        }
2460                }
2461                return bresult;
2462        }
2463        if (!(simularity_bitmap & 0x03)) {/*path A TX OK*/
2464                for (i = 0; i < 2; i++)
2465                        result[3][i] = result[c1][i];
2466        }
2467        if (!(simularity_bitmap & 0x0c)) {/*path A RX OK*/
2468                for (i = 2; i < 4; i++)
2469                        result[3][i] = result[c1][i];
2470        }
2471        if (!(simularity_bitmap & 0x30)) {/*path B TX OK*/
2472                for (i = 4; i < 6; i++)
2473                        result[3][i] = result[c1][i];
2474        }
2475        if (!(simularity_bitmap & 0xc0)) {/*path B RX OK*/
2476                for (i = 6; i < 8; i++)
2477                        result[3][i] = result[c1][i];
2478        }
2479        return false;
2480}
2481
2482static void _rtl92ee_phy_iq_calibrate(struct ieee80211_hw *hw,
2483                                      long result[][8], u8 t, bool is2t)
2484{
2485        struct rtl_priv *rtlpriv = rtl_priv(hw);
2486        struct rtl_phy *rtlphy = &rtlpriv->phy;
2487        u32 i;
2488        u8 patha_ok, pathb_ok;
2489        u8 tmp_0xc50 = (u8)rtl_get_bbreg(hw, 0xc50, MASKBYTE0);
2490        u8 tmp_0xc58 = (u8)rtl_get_bbreg(hw, 0xc58, MASKBYTE0);
2491        u32 adda_reg[IQK_ADDA_REG_NUM] = {
2492                0x85c, 0xe6c, 0xe70, 0xe74,
2493                0xe78, 0xe7c, 0xe80, 0xe84,
2494                0xe88, 0xe8c, 0xed0, 0xed4,
2495                0xed8, 0xedc, 0xee0, 0xeec
2496        };
2497        u32 iqk_mac_reg[IQK_MAC_REG_NUM] = {
2498                0x522, 0x550, 0x551, 0x040
2499        };
2500        u32 iqk_bb_reg[IQK_BB_REG_NUM] = {
2501                ROFDM0_TRXPATHENABLE, ROFDM0_TRMUXPAR,
2502                RFPGA0_XCD_RFINTERFACESW, 0xb68, 0xb6c,
2503                0x870, 0x860,
2504                0x864, 0x800
2505        };
2506        const u32 retrycount = 2;
2507
2508        if (t == 0) {
2509                _rtl92ee_phy_save_adda_registers(hw, adda_reg,
2510                                                 rtlphy->adda_backup,
2511                                                 IQK_ADDA_REG_NUM);
2512                _rtl92ee_phy_save_mac_registers(hw, iqk_mac_reg,
2513                                                rtlphy->iqk_mac_backup);
2514                _rtl92ee_phy_save_adda_registers(hw, iqk_bb_reg,
2515                                                 rtlphy->iqk_bb_backup,
2516                                                 IQK_BB_REG_NUM);
2517        }
2518
2519        _rtl92ee_phy_path_adda_on(hw, adda_reg, true, is2t);
2520
2521        /*BB setting*/
2522        rtl_set_bbreg(hw, RFPGA0_RFMOD, BIT(24), 0x00);
2523        rtl_set_bbreg(hw, ROFDM0_TRXPATHENABLE, MASKDWORD, 0x03a05600);
2524        rtl_set_bbreg(hw, ROFDM0_TRMUXPAR, MASKDWORD, 0x000800e4);
2525        rtl_set_bbreg(hw, RFPGA0_XCD_RFINTERFACESW, MASKDWORD, 0x22208200);
2526
2527        rtl_set_bbreg(hw, RFPGA0_XAB_RFINTERFACESW, BIT(10), 0x01);
2528        rtl_set_bbreg(hw, RFPGA0_XAB_RFINTERFACESW, BIT(26), 0x01);
2529        rtl_set_bbreg(hw, RFPGA0_XA_RFINTERFACEOE, BIT(10), 0x01);
2530        rtl_set_bbreg(hw, RFPGA0_XB_RFINTERFACEOE, BIT(10), 0x01);
2531
2532        _rtl92ee_phy_mac_setting_calibration(hw, iqk_mac_reg,
2533                                             rtlphy->iqk_mac_backup);
2534        /* Page B init*/
2535        /* IQ calibration setting*/
2536        rtl_set_bbreg(hw, RFPGA0_IQK, MASKDWORD, 0x80800000);
2537        rtl_set_bbreg(hw, RTX_IQK, MASKDWORD, 0x01007c00);
2538        rtl_set_bbreg(hw, RRX_IQK, MASKDWORD, 0x01004800);
2539
2540        for (i = 0 ; i < retrycount ; i++) {
2541                patha_ok = _rtl92ee_phy_path_a_iqk(hw, is2t);
2542
2543                if (patha_ok == 0x01) {
2544                        rtl_dbg(rtlpriv, COMP_RF, DBG_LOUD,
2545                                "Path A Tx IQK Success!!\n");
2546                        result[t][0] = (rtl_get_bbreg(hw,
2547                                                      RTX_POWER_BEFORE_IQK_A,
2548                                                      MASKDWORD) & 0x3FF0000)
2549                                                      >> 16;
2550                        result[t][1] = (rtl_get_bbreg(hw, RTX_POWER_AFTER_IQK_A,
2551                                                      MASKDWORD) & 0x3FF0000)
2552                                                      >> 16;
2553                        break;
2554                }
2555                rtl_dbg(rtlpriv, COMP_RF, DBG_LOUD,
2556                        "Path A Tx IQK Fail!!, ret = 0x%x\n",
2557                        patha_ok);
2558        }
2559
2560        for (i = 0 ; i < retrycount ; i++) {
2561                patha_ok = _rtl92ee_phy_path_a_rx_iqk(hw, is2t);
2562
2563                if (patha_ok == 0x03) {
2564                        rtl_dbg(rtlpriv, COMP_RF, DBG_LOUD,
2565                                "Path A Rx IQK Success!!\n");
2566                        result[t][2] = (rtl_get_bbreg(hw,
2567                                                      RRX_POWER_BEFORE_IQK_A_2,
2568                                                      MASKDWORD) & 0x3FF0000)
2569                                                      >> 16;
2570                        result[t][3] = (rtl_get_bbreg(hw,
2571                                                      RRX_POWER_AFTER_IQK_A_2,
2572                                                      MASKDWORD) & 0x3FF0000)
2573                                                      >> 16;
2574                        break;
2575                }
2576                rtl_dbg(rtlpriv, COMP_RF, DBG_LOUD,
2577                        "Path A Rx IQK Fail!!, ret = 0x%x\n",
2578                        patha_ok);
2579        }
2580
2581        if (0x00 == patha_ok)
2582                rtl_dbg(rtlpriv, COMP_RF, DBG_LOUD,
2583                        "Path A IQK failed!!, ret = 0\n");
2584        if (is2t) {
2585                _rtl92ee_phy_path_a_standby(hw);
2586                /* Turn Path B ADDA on */
2587                _rtl92ee_phy_path_adda_on(hw, adda_reg, false, is2t);
2588
2589                /* IQ calibration setting */
2590                rtl_set_bbreg(hw, RFPGA0_IQK, MASKDWORD, 0x80800000);
2591                rtl_set_bbreg(hw, RTX_IQK, MASKDWORD, 0x01007c00);
2592                rtl_set_bbreg(hw, RRX_IQK, MASKDWORD, 0x01004800);
2593
2594                for (i = 0 ; i < retrycount ; i++) {
2595                        pathb_ok = _rtl92ee_phy_path_b_iqk(hw);
2596                        if (pathb_ok == 0x01) {
2597                                rtl_dbg(rtlpriv, COMP_RF, DBG_LOUD,
2598                                        "Path B Tx IQK Success!!\n");
2599                                result[t][4] = (rtl_get_bbreg(hw,
2600                                                        RTX_POWER_BEFORE_IQK_B,
2601                                                        MASKDWORD) & 0x3FF0000)
2602                                                        >> 16;
2603                                result[t][5] = (rtl_get_bbreg(hw,
2604                                                        RTX_POWER_AFTER_IQK_B,
2605                                                        MASKDWORD) & 0x3FF0000)
2606                                                        >> 16;
2607                                break;
2608                        }
2609                        rtl_dbg(rtlpriv, COMP_RF, DBG_LOUD,
2610                                "Path B Tx IQK Fail!!, ret = 0x%x\n",
2611                                pathb_ok);
2612                }
2613
2614                for (i = 0 ; i < retrycount ; i++) {
2615                        pathb_ok = _rtl92ee_phy_path_b_rx_iqk(hw, is2t);
2616                        if (pathb_ok == 0x03) {
2617                                rtl_dbg(rtlpriv, COMP_RF, DBG_LOUD,
2618                                        "Path B Rx IQK Success!!\n");
2619                                result[t][6] = (rtl_get_bbreg(hw,
2620                                                       RRX_POWER_BEFORE_IQK_B_2,
2621                                                       MASKDWORD) & 0x3FF0000)
2622                                                       >> 16;
2623                                result[t][7] = (rtl_get_bbreg(hw,
2624                                                       RRX_POWER_AFTER_IQK_B_2,
2625                                                       MASKDWORD) & 0x3FF0000)
2626                                                       >> 16;
2627                                break;
2628                        }
2629                        rtl_dbg(rtlpriv, COMP_RF, DBG_LOUD,
2630                                "Path B Rx IQK Fail!!, ret = 0x%x\n",
2631                                pathb_ok);
2632                }
2633
2634                if (0x00 == pathb_ok)
2635                        rtl_dbg(rtlpriv, COMP_RF, DBG_LOUD,
2636                                "Path B IQK failed!!, ret = 0\n");
2637        }
2638        /* Back to BB mode, load original value */
2639        rtl_dbg(rtlpriv, COMP_RF, DBG_LOUD,
2640                "IQK:Back to BB mode, load original value!\n");
2641        rtl_set_bbreg(hw, RFPGA0_IQK, MASKDWORD, 0);
2642
2643        if (t != 0) {
2644                /* Reload ADDA power saving parameters */
2645                _rtl92ee_phy_reload_adda_registers(hw, adda_reg,
2646                                                   rtlphy->adda_backup,
2647                                                   IQK_ADDA_REG_NUM);
2648
2649                /* Reload MAC parameters */
2650                _rtl92ee_phy_reload_mac_registers(hw, iqk_mac_reg,
2651                                                  rtlphy->iqk_mac_backup);
2652
2653                _rtl92ee_phy_reload_adda_registers(hw, iqk_bb_reg,
2654                                                   rtlphy->iqk_bb_backup,
2655                                                   IQK_BB_REG_NUM);
2656
2657                /* Restore RX initial gain */
2658                rtl_set_bbreg(hw, 0xc50, MASKBYTE0, 0x50);
2659                rtl_set_bbreg(hw, 0xc50, MASKBYTE0, tmp_0xc50);
2660                if (is2t) {
2661                        rtl_set_bbreg(hw, 0xc50, MASKBYTE0, 0x50);
2662                        rtl_set_bbreg(hw, 0xc58, MASKBYTE0, tmp_0xc58);
2663                }
2664
2665                /* load 0xe30 IQC default value */
2666                rtl_set_bbreg(hw, RTX_IQK_TONE_A, MASKDWORD, 0x01008c00);
2667                rtl_set_bbreg(hw, RRX_IQK_TONE_A, MASKDWORD, 0x01008c00);
2668        }
2669}
2670
2671static void _rtl92ee_phy_lc_calibrate(struct ieee80211_hw *hw, bool is2t)
2672{
2673        u8 tmpreg;
2674        u32 rf_a_mode = 0, rf_b_mode = 0, lc_cal;
2675        struct rtl_priv *rtlpriv = rtl_priv(hw);
2676
2677        tmpreg = rtl_read_byte(rtlpriv, 0xd03);
2678
2679        if ((tmpreg & 0x70) != 0)
2680                rtl_write_byte(rtlpriv, 0xd03, tmpreg & 0x8F);
2681        else
2682                rtl_write_byte(rtlpriv, REG_TXPAUSE, 0xFF);
2683
2684        if ((tmpreg & 0x70) != 0) {
2685                rf_a_mode = rtl_get_rfreg(hw, RF90_PATH_A, 0x00, MASK12BITS);
2686
2687                if (is2t)
2688                        rf_b_mode = rtl_get_rfreg(hw, RF90_PATH_B, 0x00,
2689                                                  MASK12BITS);
2690
2691                rtl_set_rfreg(hw, RF90_PATH_A, 0x00, MASK12BITS,
2692                              (rf_a_mode & 0x8FFFF) | 0x10000);
2693
2694                if (is2t)
2695                        rtl_set_rfreg(hw, RF90_PATH_B, 0x00, MASK12BITS,
2696                                      (rf_b_mode & 0x8FFFF) | 0x10000);
2697        }
2698        lc_cal = rtl_get_rfreg(hw, RF90_PATH_A, 0x18, MASK12BITS);
2699
2700        rtl_set_rfreg(hw, RF90_PATH_A, 0x18, MASK12BITS, lc_cal | 0x08000);
2701
2702        mdelay(100);
2703
2704        if ((tmpreg & 0x70) != 0) {
2705                rtl_write_byte(rtlpriv, 0xd03, tmpreg);
2706                rtl_set_rfreg(hw, RF90_PATH_A, 0x00, MASK12BITS, rf_a_mode);
2707
2708                if (is2t)
2709                        rtl_set_rfreg(hw, RF90_PATH_B, 0x00, MASK12BITS,
2710                                      rf_b_mode);
2711        } else {
2712                rtl_write_byte(rtlpriv, REG_TXPAUSE, 0x00);
2713        }
2714}
2715
2716static void _rtl92ee_phy_set_rfpath_switch(struct ieee80211_hw *hw,
2717                                           bool bmain, bool is2t)
2718{
2719        struct rtl_priv *rtlpriv = rtl_priv(hw);
2720        struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
2721        struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
2722
2723        rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD, "\n");
2724
2725        if (is_hal_stop(rtlhal)) {
2726                u8 u1btmp;
2727
2728                u1btmp = rtl_read_byte(rtlpriv, REG_LEDCFG0);
2729                rtl_write_byte(rtlpriv, REG_LEDCFG0, u1btmp | BIT(7));
2730                rtl_set_bbreg(hw, RFPGA0_XAB_RFPARAMETER, BIT(13), 0x01);
2731        }
2732        if (is2t) {
2733                if (bmain)
2734                        rtl_set_bbreg(hw, RFPGA0_XB_RFINTERFACEOE,
2735                                      BIT(5) | BIT(6), 0x1);
2736                else
2737                        rtl_set_bbreg(hw, RFPGA0_XB_RFINTERFACEOE,
2738                                      BIT(5) | BIT(6), 0x2);
2739        } else {
2740                rtl_set_bbreg(hw, RFPGA0_XAB_RFINTERFACESW, BIT(8) | BIT(9), 0);
2741                rtl_set_bbreg(hw, 0x914, MASKLWORD, 0x0201);
2742
2743                /* We use the RF definition of MAIN and AUX,
2744                 * left antenna and right antenna repectively.
2745                 * Default output at AUX.
2746                 */
2747                if (bmain) {
2748                        rtl_set_bbreg(hw, RFPGA0_XA_RFINTERFACEOE,
2749                                      BIT(14) | BIT(13) | BIT(12), 0);
2750                        rtl_set_bbreg(hw, RFPGA0_XB_RFINTERFACEOE,
2751                                      BIT(5) | BIT(4) | BIT(3), 0);
2752                        if (rtlefuse->antenna_div_type == CGCS_RX_HW_ANTDIV)
2753                                rtl_set_bbreg(hw, RCONFIG_RAM64x16, BIT(31), 0);
2754                } else {
2755                        rtl_set_bbreg(hw, RFPGA0_XA_RFINTERFACEOE,
2756                                      BIT(14) | BIT(13) | BIT(12), 1);
2757                        rtl_set_bbreg(hw, RFPGA0_XB_RFINTERFACEOE,
2758                                      BIT(5) | BIT(4) | BIT(3), 1);
2759                        if (rtlefuse->antenna_div_type == CGCS_RX_HW_ANTDIV)
2760                                rtl_set_bbreg(hw, RCONFIG_RAM64x16, BIT(31), 1);
2761                }
2762        }
2763}
2764
2765#undef IQK_ADDA_REG_NUM
2766#undef IQK_DELAY_TIME
2767
2768static u8 rtl92ee_get_rightchnlplace_for_iqk(u8 chnl)
2769{
2770        u8 channel_all[59] = {
2771                1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
2772                36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58,
2773                60, 62, 64, 100, 102, 104, 106, 108, 110, 112,
2774                114, 116, 118, 120, 122, 124, 126, 128, 130,
2775                132, 134, 136, 138, 140, 149, 151, 153, 155,
2776                157, 159, 161, 163, 165
2777        };
2778        u8 place = chnl;
2779
2780        if (chnl > 14) {
2781                for (place = 14; place < sizeof(channel_all); place++) {
2782                        if (channel_all[place] == chnl)
2783                                return place - 13;
2784                }
2785        }
2786
2787        return 0;
2788}
2789
2790void rtl92ee_phy_iq_calibrate(struct ieee80211_hw *hw, bool b_recovery)
2791{
2792        struct rtl_priv *rtlpriv = rtl_priv(hw);
2793        struct rtl_phy *rtlphy = &rtlpriv->phy;
2794        long result[4][8];
2795        u8 i, final_candidate;
2796        bool b_patha_ok, b_pathb_ok;
2797        long reg_e94, reg_e9c, reg_ea4;
2798        long reg_eb4, reg_ebc, reg_ec4;
2799        bool is12simular, is13simular, is23simular;
2800        u8 idx;
2801        u32 iqk_bb_reg[IQK_BB_REG_NUM] = {
2802                ROFDM0_XARXIQIMBALANCE,
2803                ROFDM0_XBRXIQIMBALANCE,
2804                ROFDM0_ECCATHRESHOLD,
2805                ROFDM0_AGCRSSITABLE,
2806                ROFDM0_XATXIQIMBALANCE,
2807                ROFDM0_XBTXIQIMBALANCE,
2808                ROFDM0_XCTXAFE,
2809                ROFDM0_XDTXAFE,
2810                ROFDM0_RXIQEXTANTA
2811        };
2812
2813        if (b_recovery) {
2814                _rtl92ee_phy_reload_adda_registers(hw, iqk_bb_reg,
2815                                                   rtlphy->iqk_bb_backup, 9);
2816                return;
2817        }
2818
2819        for (i = 0; i < 8; i++) {
2820                result[0][i] = 0;
2821                result[1][i] = 0;
2822                result[2][i] = 0;
2823
2824                if ((i == 0) || (i == 2) || (i == 4)  || (i == 6))
2825                        result[3][i] = 0x100;
2826                else
2827                        result[3][i] = 0;
2828        }
2829        final_candidate = 0xff;
2830        b_patha_ok = false;
2831        b_pathb_ok = false;
2832        is12simular = false;
2833        is23simular = false;
2834        is13simular = false;
2835        for (i = 0; i < 3; i++) {
2836                _rtl92ee_phy_iq_calibrate(hw, result, i, true);
2837                if (i == 1) {
2838                        is12simular = _rtl92ee_phy_simularity_compare(hw,
2839                                                                      result,
2840                                                                      0, 1);
2841                        if (is12simular) {
2842                                final_candidate = 0;
2843                                break;
2844                        }
2845                }
2846
2847                if (i == 2) {
2848                        is13simular = _rtl92ee_phy_simularity_compare(hw,
2849                                                                      result,
2850                                                                      0, 2);
2851                        if (is13simular) {
2852                                final_candidate = 0;
2853                                break;
2854                        }
2855                        is23simular = _rtl92ee_phy_simularity_compare(hw,
2856                                                                      result,
2857                                                                      1, 2);
2858                        if (is23simular)
2859                                final_candidate = 1;
2860                        else
2861                                final_candidate = 3;
2862                }
2863        }
2864
2865        reg_e94 = result[3][0];
2866        reg_e9c = result[3][1];
2867        reg_ea4 = result[3][2];
2868        reg_eb4 = result[3][4];
2869        reg_ebc = result[3][5];
2870        reg_ec4 = result[3][6];
2871
2872        if (final_candidate != 0xff) {
2873                reg_e94 = result[final_candidate][0];
2874                rtlphy->reg_e94 = reg_e94;
2875                reg_e9c = result[final_candidate][1];
2876                rtlphy->reg_e9c = reg_e9c;
2877                reg_ea4 = result[final_candidate][2];
2878                reg_eb4 = result[final_candidate][4];
2879                rtlphy->reg_eb4 = reg_eb4;
2880                reg_ebc = result[final_candidate][5];
2881                rtlphy->reg_ebc = reg_ebc;
2882                reg_ec4 = result[final_candidate][6];
2883                b_patha_ok = true;
2884                b_pathb_ok = true;
2885        } else {
2886                rtlphy->reg_e94 = 0x100;
2887                rtlphy->reg_eb4 = 0x100;
2888                rtlphy->reg_e9c = 0x0;
2889                rtlphy->reg_ebc = 0x0;
2890        }
2891
2892        if (reg_e94 != 0)
2893                _rtl92ee_phy_path_a_fill_iqk_matrix(hw, b_patha_ok, result,
2894                                                    final_candidate,
2895                                                    (reg_ea4 == 0));
2896
2897        _rtl92ee_phy_path_b_fill_iqk_matrix(hw, b_pathb_ok, result,
2898                                            final_candidate,
2899                                            (reg_ec4 == 0));
2900
2901        idx = rtl92ee_get_rightchnlplace_for_iqk(rtlphy->current_channel);
2902
2903        /* To Fix BSOD when final_candidate is 0xff */
2904        if (final_candidate < 4) {
2905                for (i = 0; i < IQK_MATRIX_REG_NUM; i++)
2906                        rtlphy->iqk_matrix[idx].value[0][i] =
2907                                result[final_candidate][i];
2908
2909                rtlphy->iqk_matrix[idx].iqk_done = true;
2910        }
2911        _rtl92ee_phy_save_adda_registers(hw, iqk_bb_reg,
2912                                         rtlphy->iqk_bb_backup, 9);
2913}
2914
2915void rtl92ee_phy_lc_calibrate(struct ieee80211_hw *hw)
2916{
2917        struct rtl_priv *rtlpriv = rtl_priv(hw);
2918        struct rtl_phy *rtlphy = &rtlpriv->phy;
2919        struct rtl_hal *rtlhal = &rtlpriv->rtlhal;
2920        u32 timeout = 2000, timecount = 0;
2921
2922        while (rtlpriv->mac80211.act_scanning && timecount < timeout) {
2923                udelay(50);
2924                timecount += 50;
2925        }
2926
2927        rtlphy->lck_inprogress = true;
2928        RTPRINT(rtlpriv, FINIT, INIT_IQK,
2929                "LCK:Start!!! currentband %x delay %d ms\n",
2930                 rtlhal->current_bandtype, timecount);
2931
2932        _rtl92ee_phy_lc_calibrate(hw, false);
2933
2934        rtlphy->lck_inprogress = false;
2935}
2936
2937void rtl92ee_phy_ap_calibrate(struct ieee80211_hw *hw, s8 delta)
2938{
2939}
2940
2941void rtl92ee_phy_set_rfpath_switch(struct ieee80211_hw *hw, bool bmain)
2942{
2943        _rtl92ee_phy_set_rfpath_switch(hw, bmain, false);
2944}
2945
2946bool rtl92ee_phy_set_io_cmd(struct ieee80211_hw *hw, enum io_type iotype)
2947{
2948        struct rtl_priv *rtlpriv = rtl_priv(hw);
2949        struct rtl_phy *rtlphy = &rtlpriv->phy;
2950        bool postprocessing = false;
2951
2952        rtl_dbg(rtlpriv, COMP_CMD, DBG_TRACE,
2953                "-->IO Cmd(%#x), set_io_inprogress(%d)\n",
2954                iotype, rtlphy->set_io_inprogress);
2955        do {
2956                switch (iotype) {
2957                case IO_CMD_RESUME_DM_BY_SCAN:
2958                        rtl_dbg(rtlpriv, COMP_CMD, DBG_TRACE,
2959                                "[IO CMD] Resume DM after scan.\n");
2960                        postprocessing = true;
2961                        break;
2962                case IO_CMD_PAUSE_BAND0_DM_BY_SCAN:
2963                        rtl_dbg(rtlpriv, COMP_CMD, DBG_TRACE,
2964                                "[IO CMD] Pause DM before scan.\n");
2965                        postprocessing = true;
2966                        break;
2967                default:
2968                        rtl_dbg(rtlpriv, COMP_ERR, DBG_LOUD,
2969                                "switch case %#x not processed\n", iotype);
2970                        break;
2971                }
2972        } while (false);
2973        if (postprocessing && !rtlphy->set_io_inprogress) {
2974                rtlphy->set_io_inprogress = true;
2975                rtlphy->current_io_type = iotype;
2976        } else {
2977                return false;
2978        }
2979        rtl92ee_phy_set_io(hw);
2980        rtl_dbg(rtlpriv, COMP_CMD, DBG_TRACE, "IO Type(%#x)\n", iotype);
2981        return true;
2982}
2983
2984static void rtl92ee_phy_set_io(struct ieee80211_hw *hw)
2985{
2986        struct rtl_priv *rtlpriv = rtl_priv(hw);
2987        struct rtl_phy *rtlphy = &rtlpriv->phy;
2988        struct dig_t *dm_dig = &rtlpriv->dm_digtable;
2989
2990        rtl_dbg(rtlpriv, COMP_CMD, DBG_TRACE,
2991                "--->Cmd(%#x), set_io_inprogress(%d)\n",
2992                rtlphy->current_io_type, rtlphy->set_io_inprogress);
2993        switch (rtlphy->current_io_type) {
2994        case IO_CMD_RESUME_DM_BY_SCAN:
2995                rtl92ee_dm_write_dig(hw, rtlphy->initgain_backup.xaagccore1);
2996                rtl92ee_dm_write_cck_cca_thres(hw, rtlphy->initgain_backup.cca);
2997                rtl_dbg(rtlpriv, COMP_CMD, DBG_TRACE, "no set txpower\n");
2998                rtl92ee_phy_set_txpower_level(hw, rtlphy->current_channel);
2999                break;
3000        case IO_CMD_PAUSE_BAND0_DM_BY_SCAN:
3001                /* 8192eebt */
3002                rtlphy->initgain_backup.xaagccore1 = dm_dig->cur_igvalue;
3003                rtl92ee_dm_write_dig(hw, 0x17);
3004                rtlphy->initgain_backup.cca = dm_dig->cur_cck_cca_thres;
3005                rtl92ee_dm_write_cck_cca_thres(hw, 0x40);
3006                break;
3007        default:
3008                rtl_dbg(rtlpriv, COMP_ERR, DBG_LOUD,
3009                        "switch case %#x not processed\n",
3010                        rtlphy->current_io_type);
3011                break;
3012        }
3013        rtlphy->set_io_inprogress = false;
3014        rtl_dbg(rtlpriv, COMP_CMD, DBG_TRACE,
3015                "(%#x)\n", rtlphy->current_io_type);
3016}
3017
3018static void rtl92ee_phy_set_rf_on(struct ieee80211_hw *hw)
3019{
3020        struct rtl_priv *rtlpriv = rtl_priv(hw);
3021
3022        rtl_write_byte(rtlpriv, REG_SPS0_CTRL, 0x2b);
3023        rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN, 0xE3);
3024        /*rtl_write_byte(rtlpriv, REG_APSD_CTRL, 0x00);*/
3025        rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN, 0xE2);
3026        rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN, 0xE3);
3027        rtl_write_byte(rtlpriv, REG_TXPAUSE, 0x00);
3028}
3029
3030static void _rtl92ee_phy_set_rf_sleep(struct ieee80211_hw *hw)
3031{
3032        struct rtl_priv *rtlpriv = rtl_priv(hw);
3033
3034        rtl_write_byte(rtlpriv, REG_TXPAUSE, 0xFF);
3035        rtl_set_rfreg(hw, RF90_PATH_A, 0x00, RFREG_OFFSET_MASK, 0x00);
3036
3037        rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN, 0xE2);
3038        rtl_write_byte(rtlpriv, REG_SPS0_CTRL, 0x22);
3039}
3040
3041static bool _rtl92ee_phy_set_rf_power_state(struct ieee80211_hw *hw,
3042                                            enum rf_pwrstate rfpwr_state)
3043{
3044        struct rtl_priv *rtlpriv = rtl_priv(hw);
3045        struct rtl_pci_priv *pcipriv = rtl_pcipriv(hw);
3046        struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
3047        struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
3048        bool bresult = true;
3049        u8 i, queue_id;
3050        struct rtl8192_tx_ring *ring = NULL;
3051
3052        switch (rfpwr_state) {
3053        case ERFON:
3054                if ((ppsc->rfpwr_state == ERFOFF) &&
3055                    RT_IN_PS_LEVEL(ppsc, RT_RF_OFF_LEVL_HALT_NIC)) {
3056                        bool rtstatus;
3057                        u32 initializecount = 0;
3058
3059                        do {
3060                                initializecount++;
3061                                rtl_dbg(rtlpriv, COMP_RF, DBG_DMESG,
3062                                        "IPS Set eRf nic enable\n");
3063                                rtstatus = rtl_ps_enable_nic(hw);
3064                        } while (!rtstatus && (initializecount < 10));
3065                        RT_CLEAR_PS_LEVEL(ppsc, RT_RF_OFF_LEVL_HALT_NIC);
3066                } else {
3067                        rtl_dbg(rtlpriv, COMP_RF, DBG_DMESG,
3068                                "Set ERFON sleeping:%d ms\n",
3069                                jiffies_to_msecs(jiffies -
3070                                                 ppsc->last_sleep_jiffies));
3071                        ppsc->last_awake_jiffies = jiffies;
3072                        rtl92ee_phy_set_rf_on(hw);
3073                }
3074                if (mac->link_state == MAC80211_LINKED)
3075                        rtlpriv->cfg->ops->led_control(hw, LED_CTL_LINK);
3076                else
3077                        rtlpriv->cfg->ops->led_control(hw, LED_CTL_NO_LINK);
3078                break;
3079        case ERFOFF:
3080                for (queue_id = 0, i = 0;
3081                     queue_id < RTL_PCI_MAX_TX_QUEUE_COUNT;) {
3082                        ring = &pcipriv->dev.tx_ring[queue_id];
3083                        if (queue_id == BEACON_QUEUE ||
3084                            skb_queue_len(&ring->queue) == 0) {
3085                                queue_id++;
3086                                continue;
3087                        } else {
3088                                rtl_dbg(rtlpriv, COMP_ERR, DBG_WARNING,
3089                                        "eRf Off/Sleep: %d times TcbBusyQueue[%d] =%d before doze!\n",
3090                                        (i + 1), queue_id,
3091                                        skb_queue_len(&ring->queue));
3092
3093                                udelay(10);
3094                                i++;
3095                        }
3096                        if (i >= MAX_DOZE_WAITING_TIMES_9x) {
3097                                rtl_dbg(rtlpriv, COMP_ERR, DBG_WARNING,
3098                                        "\n ERFSLEEP: %d times TcbBusyQueue[%d] = %d !\n",
3099                                        MAX_DOZE_WAITING_TIMES_9x,
3100                                        queue_id,
3101                                        skb_queue_len(&ring->queue));
3102                                break;
3103                        }
3104                }
3105
3106                if (ppsc->reg_rfps_level & RT_RF_OFF_LEVL_HALT_NIC) {
3107                        rtl_dbg(rtlpriv, COMP_RF, DBG_DMESG,
3108                                "IPS Set eRf nic disable\n");
3109                        rtl_ps_disable_nic(hw);
3110                        RT_SET_PS_LEVEL(ppsc, RT_RF_OFF_LEVL_HALT_NIC);
3111                } else {
3112                        if (ppsc->rfoff_reason == RF_CHANGE_BY_IPS) {
3113                                rtlpriv->cfg->ops->led_control(hw,
3114                                                        LED_CTL_NO_LINK);
3115                        } else {
3116                                rtlpriv->cfg->ops->led_control(hw,
3117                                                        LED_CTL_POWER_OFF);
3118                        }
3119                }
3120                break;
3121        case ERFSLEEP:
3122                if (ppsc->rfpwr_state == ERFOFF)
3123                        break;
3124                for (queue_id = 0, i = 0;
3125                     queue_id < RTL_PCI_MAX_TX_QUEUE_COUNT;) {
3126                        ring = &pcipriv->dev.tx_ring[queue_id];
3127                        if (skb_queue_len(&ring->queue) == 0) {
3128                                queue_id++;
3129                                continue;
3130                        } else {
3131                                rtl_dbg(rtlpriv, COMP_ERR, DBG_WARNING,
3132                                        "eRf Off/Sleep: %d times TcbBusyQueue[%d] =%d before doze!\n",
3133                                        (i + 1), queue_id,
3134                                        skb_queue_len(&ring->queue));
3135                                udelay(10);
3136                                i++;
3137                        }
3138                        if (i >= MAX_DOZE_WAITING_TIMES_9x) {
3139                                rtl_dbg(rtlpriv, COMP_ERR, DBG_WARNING,
3140                                        "\n ERFSLEEP: %d times TcbBusyQueue[%d] = %d !\n",
3141                                        MAX_DOZE_WAITING_TIMES_9x,
3142                                        queue_id,
3143                                        skb_queue_len(&ring->queue));
3144                                break;
3145                        }
3146                }
3147                rtl_dbg(rtlpriv, COMP_RF, DBG_DMESG,
3148                        "Set ERFSLEEP awaked:%d ms\n",
3149                        jiffies_to_msecs(jiffies -
3150                                         ppsc->last_awake_jiffies));
3151                ppsc->last_sleep_jiffies = jiffies;
3152                _rtl92ee_phy_set_rf_sleep(hw);
3153                break;
3154        default:
3155                rtl_dbg(rtlpriv, COMP_ERR, DBG_LOUD,
3156                        "switch case %#x not processed\n", rfpwr_state);
3157                bresult = false;
3158                break;
3159        }
3160        if (bresult)
3161                ppsc->rfpwr_state = rfpwr_state;
3162        return bresult;
3163}
3164
3165bool rtl92ee_phy_set_rf_power_state(struct ieee80211_hw *hw,
3166                                    enum rf_pwrstate rfpwr_state)
3167{
3168        struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
3169
3170        bool bresult = false;
3171
3172        if (rfpwr_state == ppsc->rfpwr_state)
3173                return bresult;
3174        bresult = _rtl92ee_phy_set_rf_power_state(hw, rfpwr_state);
3175        return bresult;
3176}
3177