linux/drivers/net/wireless/realtek/rtlwifi/rtl8192de/phy.c
<<
>>
Prefs
   1/******************************************************************************
   2 *
   3 * Copyright(c) 2009-2012  Realtek Corporation.
   4 *
   5 * This program is free software; you can redistribute it and/or modify it
   6 * under the terms of version 2 of the GNU General Public License as
   7 * published by the Free Software Foundation.
   8 *
   9 * This program is distributed in the hope that it will be useful, but WITHOUT
  10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  11 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
  12 * more details.
  13 *
  14 * The full GNU General Public License is included in this distribution in the
  15 * file called LICENSE.
  16 *
  17 * Contact Information:
  18 * wlanfae <wlanfae@realtek.com>
  19 * Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park,
  20 * Hsinchu 300, Taiwan.
  21 *
  22 * Larry Finger <Larry.Finger@lwfinger.net>
  23 *
  24 *****************************************************************************/
  25
  26#include "../wifi.h"
  27#include "../pci.h"
  28#include "../ps.h"
  29#include "../core.h"
  30#include "reg.h"
  31#include "def.h"
  32#include "phy.h"
  33#include "rf.h"
  34#include "dm.h"
  35#include "table.h"
  36#include "sw.h"
  37#include "hw.h"
  38
  39#define MAX_RF_IMR_INDEX                        12
  40#define MAX_RF_IMR_INDEX_NORMAL                 13
  41#define RF_REG_NUM_FOR_C_CUT_5G                 6
  42#define RF_REG_NUM_FOR_C_CUT_5G_INTERNALPA      7
  43#define RF_REG_NUM_FOR_C_CUT_2G                 5
  44#define RF_CHNL_NUM_5G                          19
  45#define RF_CHNL_NUM_5G_40M                      17
  46#define TARGET_CHNL_NUM_5G                      221
  47#define TARGET_CHNL_NUM_2G                      14
  48#define CV_CURVE_CNT                            64
  49
  50static u32 rf_reg_for_5g_swchnl_normal[MAX_RF_IMR_INDEX_NORMAL] = {
  51        0, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x0
  52};
  53
  54static u8 rf_reg_for_c_cut_5g[RF_REG_NUM_FOR_C_CUT_5G] = {
  55        RF_SYN_G1, RF_SYN_G2, RF_SYN_G3, RF_SYN_G4, RF_SYN_G5, RF_SYN_G6
  56};
  57
  58static u8 rf_reg_for_c_cut_2g[RF_REG_NUM_FOR_C_CUT_2G] = {
  59        RF_SYN_G1, RF_SYN_G2, RF_SYN_G3, RF_SYN_G7, RF_SYN_G8
  60};
  61
  62static u8 rf_for_c_cut_5g_internal_pa[RF_REG_NUM_FOR_C_CUT_5G_INTERNALPA] = {
  63        0x0B, 0x48, 0x49, 0x4B, 0x03, 0x04, 0x0E
  64};
  65
  66static u32 rf_reg_mask_for_c_cut_2g[RF_REG_NUM_FOR_C_CUT_2G] = {
  67        BIT(19) | BIT(18) | BIT(17) | BIT(14) | BIT(1),
  68        BIT(10) | BIT(9),
  69        BIT(18) | BIT(17) | BIT(16) | BIT(1),
  70        BIT(2) | BIT(1),
  71        BIT(15) | BIT(14) | BIT(13) | BIT(12) | BIT(11)
  72};
  73
  74static u8 rf_chnl_5g[RF_CHNL_NUM_5G] = {
  75        36, 40, 44, 48, 52, 56, 60, 64, 100, 104, 108,
  76        112, 116, 120, 124, 128, 132, 136, 140
  77};
  78
  79static u8 rf_chnl_5g_40m[RF_CHNL_NUM_5G_40M] = {
  80        38, 42, 46, 50, 54, 58, 62, 102, 106, 110, 114,
  81        118, 122, 126, 130, 134, 138
  82};
  83static u32 rf_reg_pram_c_5g[5][RF_REG_NUM_FOR_C_CUT_5G] = {
  84        {0xE43BE, 0xFC638, 0x77C0A, 0xDE471, 0xd7110, 0x8EB04},
  85        {0xE43BE, 0xFC078, 0xF7C1A, 0xE0C71, 0xD7550, 0xAEB04},
  86        {0xE43BF, 0xFF038, 0xF7C0A, 0xDE471, 0xE5550, 0xAEB04},
  87        {0xE43BF, 0xFF079, 0xF7C1A, 0xDE471, 0xE5550, 0xAEB04},
  88        {0xE43BF, 0xFF038, 0xF7C1A, 0xDE471, 0xd7550, 0xAEB04}
  89};
  90
  91static u32 rf_reg_param_for_c_cut_2g[3][RF_REG_NUM_FOR_C_CUT_2G] = {
  92        {0x643BC, 0xFC038, 0x77C1A, 0x41289, 0x01840},
  93        {0x643BC, 0xFC038, 0x07C1A, 0x41289, 0x01840},
  94        {0x243BC, 0xFC438, 0x07C1A, 0x4128B, 0x0FC41}
  95};
  96
  97static u32 rf_syn_g4_for_c_cut_2g = 0xD1C31 & 0x7FF;
  98
  99static u32 rf_pram_c_5g_int_pa[3][RF_REG_NUM_FOR_C_CUT_5G_INTERNALPA] = {
 100        {0x01a00, 0x40443, 0x00eb5, 0x89bec, 0x94a12, 0x94a12, 0x94a12},
 101        {0x01800, 0xc0443, 0x00730, 0x896ee, 0x94a52, 0x94a52, 0x94a52},
 102        {0x01800, 0xc0443, 0x00730, 0x896ee, 0x94a12, 0x94a12, 0x94a12}
 103};
 104
 105/* [mode][patha+b][reg] */
 106static u32 rf_imr_param_normal[1][3][MAX_RF_IMR_INDEX_NORMAL] = {
 107        {
 108                /* channel 1-14. */
 109                {
 110                        0x70000, 0x00ff0, 0x4400f, 0x00ff0, 0x0, 0x0, 0x0,
 111                        0x0, 0x0, 0x64888, 0xe266c, 0x00090, 0x22fff
 112                },
 113                /* path 36-64 */
 114                {
 115                        0x70000, 0x22880, 0x4470f, 0x55880, 0x00070, 0x88000,
 116                        0x0, 0x88080, 0x70000, 0x64a82, 0xe466c, 0x00090,
 117                        0x32c9a
 118                },
 119                /* 100 -165 */
 120                {
 121                        0x70000, 0x44880, 0x4477f, 0x77880, 0x00070, 0x88000,
 122                        0x0, 0x880b0, 0x0, 0x64b82, 0xe466c, 0x00090, 0x32c9a
 123                }
 124        }
 125};
 126
 127static u32 curveindex_5g[TARGET_CHNL_NUM_5G] = {0};
 128
 129static u32 curveindex_2g[TARGET_CHNL_NUM_2G] = {0};
 130
 131static u32 targetchnl_5g[TARGET_CHNL_NUM_5G] = {
 132        25141, 25116, 25091, 25066, 25041,
 133        25016, 24991, 24966, 24941, 24917,
 134        24892, 24867, 24843, 24818, 24794,
 135        24770, 24765, 24721, 24697, 24672,
 136        24648, 24624, 24600, 24576, 24552,
 137        24528, 24504, 24480, 24457, 24433,
 138        24409, 24385, 24362, 24338, 24315,
 139        24291, 24268, 24245, 24221, 24198,
 140        24175, 24151, 24128, 24105, 24082,
 141        24059, 24036, 24013, 23990, 23967,
 142        23945, 23922, 23899, 23876, 23854,
 143        23831, 23809, 23786, 23764, 23741,
 144        23719, 23697, 23674, 23652, 23630,
 145        23608, 23586, 23564, 23541, 23519,
 146        23498, 23476, 23454, 23432, 23410,
 147        23388, 23367, 23345, 23323, 23302,
 148        23280, 23259, 23237, 23216, 23194,
 149        23173, 23152, 23130, 23109, 23088,
 150        23067, 23046, 23025, 23003, 22982,
 151        22962, 22941, 22920, 22899, 22878,
 152        22857, 22837, 22816, 22795, 22775,
 153        22754, 22733, 22713, 22692, 22672,
 154        22652, 22631, 22611, 22591, 22570,
 155        22550, 22530, 22510, 22490, 22469,
 156        22449, 22429, 22409, 22390, 22370,
 157        22350, 22336, 22310, 22290, 22271,
 158        22251, 22231, 22212, 22192, 22173,
 159        22153, 22134, 22114, 22095, 22075,
 160        22056, 22037, 22017, 21998, 21979,
 161        21960, 21941, 21921, 21902, 21883,
 162        21864, 21845, 21826, 21807, 21789,
 163        21770, 21751, 21732, 21713, 21695,
 164        21676, 21657, 21639, 21620, 21602,
 165        21583, 21565, 21546, 21528, 21509,
 166        21491, 21473, 21454, 21436, 21418,
 167        21400, 21381, 21363, 21345, 21327,
 168        21309, 21291, 21273, 21255, 21237,
 169        21219, 21201, 21183, 21166, 21148,
 170        21130, 21112, 21095, 21077, 21059,
 171        21042, 21024, 21007, 20989, 20972,
 172        25679, 25653, 25627, 25601, 25575,
 173        25549, 25523, 25497, 25471, 25446,
 174        25420, 25394, 25369, 25343, 25318,
 175        25292, 25267, 25242, 25216, 25191,
 176        25166
 177};
 178
 179/* channel 1~14 */
 180static u32 targetchnl_2g[TARGET_CHNL_NUM_2G] = {
 181        26084, 26030, 25976, 25923, 25869, 25816, 25764,
 182        25711, 25658, 25606, 25554, 25502, 25451, 25328
 183};
 184
 185static u32 _rtl92d_phy_calculate_bit_shift(u32 bitmask)
 186{
 187        u32 i;
 188
 189        for (i = 0; i <= 31; i++) {
 190                if (((bitmask >> i) & 0x1) == 1)
 191                        break;
 192        }
 193
 194        return i;
 195}
 196
 197u32 rtl92d_phy_query_bb_reg(struct ieee80211_hw *hw, u32 regaddr, u32 bitmask)
 198{
 199        struct rtl_priv *rtlpriv = rtl_priv(hw);
 200        struct rtl_hal *rtlhal = rtl_hal(rtlpriv);
 201        u32 returnvalue, originalvalue, bitshift;
 202
 203        RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE, "regaddr(%#x), bitmask(%#x)\n",
 204                 regaddr, bitmask);
 205        if (rtlhal->during_mac1init_radioa || rtlhal->during_mac0init_radiob) {
 206                u8 dbi_direct = 0;
 207
 208                /* mac1 use phy0 read radio_b. */
 209                /* mac0 use phy1 read radio_b. */
 210                if (rtlhal->during_mac1init_radioa)
 211                        dbi_direct = BIT(3);
 212                else if (rtlhal->during_mac0init_radiob)
 213                        dbi_direct = BIT(3) | BIT(2);
 214                originalvalue = rtl92de_read_dword_dbi(hw, (u16)regaddr,
 215                        dbi_direct);
 216        } else {
 217                originalvalue = rtl_read_dword(rtlpriv, regaddr);
 218        }
 219        bitshift = _rtl92d_phy_calculate_bit_shift(bitmask);
 220        returnvalue = (originalvalue & bitmask) >> bitshift;
 221        RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE,
 222                 "BBR MASK=0x%x Addr[0x%x]=0x%x\n",
 223                 bitmask, regaddr, originalvalue);
 224        return returnvalue;
 225}
 226
 227void rtl92d_phy_set_bb_reg(struct ieee80211_hw *hw,
 228                           u32 regaddr, u32 bitmask, u32 data)
 229{
 230        struct rtl_priv *rtlpriv = rtl_priv(hw);
 231        struct rtl_hal *rtlhal = rtl_hal(rtlpriv);
 232        u8 dbi_direct = 0;
 233        u32 originalvalue, bitshift;
 234
 235        RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE,
 236                 "regaddr(%#x), bitmask(%#x), data(%#x)\n",
 237                 regaddr, bitmask, data);
 238        if (rtlhal->during_mac1init_radioa)
 239                dbi_direct = BIT(3);
 240        else if (rtlhal->during_mac0init_radiob)
 241                /* mac0 use phy1 write radio_b. */
 242                dbi_direct = BIT(3) | BIT(2);
 243        if (bitmask != MASKDWORD) {
 244                if (rtlhal->during_mac1init_radioa ||
 245                    rtlhal->during_mac0init_radiob)
 246                        originalvalue = rtl92de_read_dword_dbi(hw,
 247                                        (u16) regaddr,
 248                                        dbi_direct);
 249                else
 250                        originalvalue = rtl_read_dword(rtlpriv, regaddr);
 251                bitshift = _rtl92d_phy_calculate_bit_shift(bitmask);
 252                data = ((originalvalue & (~bitmask)) | (data << bitshift));
 253        }
 254        if (rtlhal->during_mac1init_radioa || rtlhal->during_mac0init_radiob)
 255                rtl92de_write_dword_dbi(hw, (u16) regaddr, data, dbi_direct);
 256        else
 257                rtl_write_dword(rtlpriv, regaddr, data);
 258        RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE,
 259                 "regaddr(%#x), bitmask(%#x), data(%#x)\n",
 260                 regaddr, bitmask, data);
 261}
 262
 263static u32 _rtl92d_phy_rf_serial_read(struct ieee80211_hw *hw,
 264                                      enum radio_path rfpath, u32 offset)
 265{
 266
 267        struct rtl_priv *rtlpriv = rtl_priv(hw);
 268        struct rtl_phy *rtlphy = &(rtlpriv->phy);
 269        struct bb_reg_def *pphyreg = &rtlphy->phyreg_def[rfpath];
 270        u32 newoffset;
 271        u32 tmplong, tmplong2;
 272        u8 rfpi_enable = 0;
 273        u32 retvalue;
 274
 275        newoffset = offset;
 276        tmplong = rtl_get_bbreg(hw, RFPGA0_XA_HSSIPARAMETER2, MASKDWORD);
 277        if (rfpath == RF90_PATH_A)
 278                tmplong2 = tmplong;
 279        else
 280                tmplong2 = rtl_get_bbreg(hw, pphyreg->rfhssi_para2, MASKDWORD);
 281        tmplong2 = (tmplong2 & (~BLSSIREADADDRESS)) |
 282                (newoffset << 23) | BLSSIREADEDGE;
 283        rtl_set_bbreg(hw, RFPGA0_XA_HSSIPARAMETER2, MASKDWORD,
 284                tmplong & (~BLSSIREADEDGE));
 285        udelay(10);
 286        rtl_set_bbreg(hw, pphyreg->rfhssi_para2, MASKDWORD, tmplong2);
 287        udelay(50);
 288        udelay(50);
 289        rtl_set_bbreg(hw, RFPGA0_XA_HSSIPARAMETER2, MASKDWORD,
 290                tmplong | BLSSIREADEDGE);
 291        udelay(10);
 292        if (rfpath == RF90_PATH_A)
 293                rfpi_enable = (u8) rtl_get_bbreg(hw, RFPGA0_XA_HSSIPARAMETER1,
 294                              BIT(8));
 295        else if (rfpath == RF90_PATH_B)
 296                rfpi_enable = (u8) rtl_get_bbreg(hw, RFPGA0_XB_HSSIPARAMETER1,
 297                              BIT(8));
 298        if (rfpi_enable)
 299                retvalue = rtl_get_bbreg(hw, pphyreg->rf_rbpi,
 300                        BLSSIREADBACKDATA);
 301        else
 302                retvalue = rtl_get_bbreg(hw, pphyreg->rf_rb,
 303                        BLSSIREADBACKDATA);
 304        RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE, "RFR-%d Addr[0x%x] = 0x%x\n",
 305                 rfpath, pphyreg->rf_rb, retvalue);
 306        return retvalue;
 307}
 308
 309static void _rtl92d_phy_rf_serial_write(struct ieee80211_hw *hw,
 310                                        enum radio_path rfpath,
 311                                        u32 offset, u32 data)
 312{
 313        u32 data_and_addr;
 314        u32 newoffset;
 315        struct rtl_priv *rtlpriv = rtl_priv(hw);
 316        struct rtl_phy *rtlphy = &(rtlpriv->phy);
 317        struct bb_reg_def *pphyreg = &rtlphy->phyreg_def[rfpath];
 318
 319        newoffset = offset;
 320        /* T65 RF */
 321        data_and_addr = ((newoffset << 20) | (data & 0x000fffff)) & 0x0fffffff;
 322        rtl_set_bbreg(hw, pphyreg->rf3wire_offset, MASKDWORD, data_and_addr);
 323        RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE, "RFW-%d Addr[0x%x]=0x%x\n",
 324                 rfpath, pphyreg->rf3wire_offset, data_and_addr);
 325}
 326
 327u32 rtl92d_phy_query_rf_reg(struct ieee80211_hw *hw,
 328                            enum radio_path rfpath, u32 regaddr, u32 bitmask)
 329{
 330        struct rtl_priv *rtlpriv = rtl_priv(hw);
 331        u32 original_value, readback_value, bitshift;
 332        unsigned long flags;
 333
 334        RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE,
 335                 "regaddr(%#x), rfpath(%#x), bitmask(%#x)\n",
 336                 regaddr, rfpath, bitmask);
 337        spin_lock_irqsave(&rtlpriv->locks.rf_lock, flags);
 338        original_value = _rtl92d_phy_rf_serial_read(hw, rfpath, regaddr);
 339        bitshift = _rtl92d_phy_calculate_bit_shift(bitmask);
 340        readback_value = (original_value & bitmask) >> bitshift;
 341        spin_unlock_irqrestore(&rtlpriv->locks.rf_lock, flags);
 342        RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE,
 343                 "regaddr(%#x), rfpath(%#x), bitmask(%#x), original_value(%#x)\n",
 344                 regaddr, rfpath, bitmask, original_value);
 345        return readback_value;
 346}
 347
 348void rtl92d_phy_set_rf_reg(struct ieee80211_hw *hw, enum radio_path rfpath,
 349        u32 regaddr, u32 bitmask, u32 data)
 350{
 351        struct rtl_priv *rtlpriv = rtl_priv(hw);
 352        struct rtl_phy *rtlphy = &(rtlpriv->phy);
 353        u32 original_value, bitshift;
 354        unsigned long flags;
 355
 356        RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE,
 357                 "regaddr(%#x), bitmask(%#x), data(%#x), rfpath(%#x)\n",
 358                 regaddr, bitmask, data, rfpath);
 359        if (bitmask == 0)
 360                return;
 361        spin_lock_irqsave(&rtlpriv->locks.rf_lock, flags);
 362        if (rtlphy->rf_mode != RF_OP_BY_FW) {
 363                if (bitmask != RFREG_OFFSET_MASK) {
 364                        original_value = _rtl92d_phy_rf_serial_read(hw,
 365                                rfpath, regaddr);
 366                        bitshift = _rtl92d_phy_calculate_bit_shift(bitmask);
 367                        data = ((original_value & (~bitmask)) |
 368                                (data << bitshift));
 369                }
 370                _rtl92d_phy_rf_serial_write(hw, rfpath, regaddr, data);
 371        }
 372        spin_unlock_irqrestore(&rtlpriv->locks.rf_lock, flags);
 373        RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE,
 374                 "regaddr(%#x), bitmask(%#x), data(%#x), rfpath(%#x)\n",
 375                 regaddr, bitmask, data, rfpath);
 376}
 377
 378bool rtl92d_phy_mac_config(struct ieee80211_hw *hw)
 379{
 380        struct rtl_priv *rtlpriv = rtl_priv(hw);
 381        u32 i;
 382        u32 arraylength;
 383        u32 *ptrarray;
 384
 385        RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, "Read Rtl819XMACPHY_Array\n");
 386        arraylength = MAC_2T_ARRAYLENGTH;
 387        ptrarray = rtl8192de_mac_2tarray;
 388        RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, "Img:Rtl819XMAC_Array\n");
 389        for (i = 0; i < arraylength; i = i + 2)
 390                rtl_write_byte(rtlpriv, ptrarray[i], (u8) ptrarray[i + 1]);
 391        if (rtlpriv->rtlhal.macphymode == SINGLEMAC_SINGLEPHY) {
 392                /* improve 2-stream TX EVM */
 393                /* rtl_write_byte(rtlpriv, 0x14,0x71); */
 394                /* AMPDU aggregation number 9 */
 395                /* rtl_write_word(rtlpriv, REG_MAX_AGGR_NUM, MAX_AGGR_NUM); */
 396                rtl_write_byte(rtlpriv, REG_MAX_AGGR_NUM, 0x0B);
 397        } else {
 398                /* 92D need to test to decide the num. */
 399                rtl_write_byte(rtlpriv, REG_MAX_AGGR_NUM, 0x07);
 400        }
 401        return true;
 402}
 403
 404static void _rtl92d_phy_init_bb_rf_register_definition(struct ieee80211_hw *hw)
 405{
 406        struct rtl_priv *rtlpriv = rtl_priv(hw);
 407        struct rtl_phy *rtlphy = &(rtlpriv->phy);
 408
 409        /* RF Interface Sowrtware Control */
 410        /* 16 LSBs if read 32-bit from 0x870 */
 411        rtlphy->phyreg_def[RF90_PATH_A].rfintfs = RFPGA0_XAB_RFINTERFACESW;
 412        /* 16 MSBs if read 32-bit from 0x870 (16-bit for 0x872) */
 413        rtlphy->phyreg_def[RF90_PATH_B].rfintfs = RFPGA0_XAB_RFINTERFACESW;
 414        /* 16 LSBs if read 32-bit from 0x874 */
 415        rtlphy->phyreg_def[RF90_PATH_C].rfintfs = RFPGA0_XCD_RFINTERFACESW;
 416        /* 16 MSBs if read 32-bit from 0x874 (16-bit for 0x876) */
 417
 418        rtlphy->phyreg_def[RF90_PATH_D].rfintfs = RFPGA0_XCD_RFINTERFACESW;
 419        /* RF Interface Readback Value */
 420        /* 16 LSBs if read 32-bit from 0x8E0 */
 421        rtlphy->phyreg_def[RF90_PATH_A].rfintfi = RFPGA0_XAB_RFINTERFACERB;
 422        /* 16 MSBs if read 32-bit from 0x8E0 (16-bit for 0x8E2) */
 423        rtlphy->phyreg_def[RF90_PATH_B].rfintfi = RFPGA0_XAB_RFINTERFACERB;
 424        /* 16 LSBs if read 32-bit from 0x8E4 */
 425        rtlphy->phyreg_def[RF90_PATH_C].rfintfi = RFPGA0_XCD_RFINTERFACERB;
 426        /* 16 MSBs if read 32-bit from 0x8E4 (16-bit for 0x8E6) */
 427        rtlphy->phyreg_def[RF90_PATH_D].rfintfi = RFPGA0_XCD_RFINTERFACERB;
 428
 429        /* RF Interface Output (and Enable) */
 430        /* 16 LSBs if read 32-bit from 0x860 */
 431        rtlphy->phyreg_def[RF90_PATH_A].rfintfo = RFPGA0_XA_RFINTERFACEOE;
 432        /* 16 LSBs if read 32-bit from 0x864 */
 433        rtlphy->phyreg_def[RF90_PATH_B].rfintfo = RFPGA0_XB_RFINTERFACEOE;
 434
 435        /* RF Interface (Output and)  Enable */
 436        /* 16 MSBs if read 32-bit from 0x860 (16-bit for 0x862) */
 437        rtlphy->phyreg_def[RF90_PATH_A].rfintfe = RFPGA0_XA_RFINTERFACEOE;
 438        /* 16 MSBs if read 32-bit from 0x864 (16-bit for 0x866) */
 439        rtlphy->phyreg_def[RF90_PATH_B].rfintfe = RFPGA0_XB_RFINTERFACEOE;
 440
 441        /* Addr of LSSI. Wirte RF register by driver */
 442        /* LSSI Parameter */
 443        rtlphy->phyreg_def[RF90_PATH_A].rf3wire_offset =
 444                                 RFPGA0_XA_LSSIPARAMETER;
 445        rtlphy->phyreg_def[RF90_PATH_B].rf3wire_offset =
 446                                 RFPGA0_XB_LSSIPARAMETER;
 447
 448        /* RF parameter */
 449        /* BB Band Select */
 450        rtlphy->phyreg_def[RF90_PATH_A].rflssi_select = RFPGA0_XAB_RFPARAMETER;
 451        rtlphy->phyreg_def[RF90_PATH_B].rflssi_select = RFPGA0_XAB_RFPARAMETER;
 452        rtlphy->phyreg_def[RF90_PATH_C].rflssi_select = RFPGA0_XCD_RFPARAMETER;
 453        rtlphy->phyreg_def[RF90_PATH_D].rflssi_select = RFPGA0_XCD_RFPARAMETER;
 454
 455        /* Tx AGC Gain Stage (same for all path. Should we remove this?) */
 456        /* Tx gain stage */
 457        rtlphy->phyreg_def[RF90_PATH_A].rftxgain_stage = RFPGA0_TXGAINSTAGE;
 458        /* Tx gain stage */
 459        rtlphy->phyreg_def[RF90_PATH_B].rftxgain_stage = RFPGA0_TXGAINSTAGE;
 460        /* Tx gain stage */
 461        rtlphy->phyreg_def[RF90_PATH_C].rftxgain_stage = RFPGA0_TXGAINSTAGE;
 462        /* Tx gain stage */
 463        rtlphy->phyreg_def[RF90_PATH_D].rftxgain_stage = RFPGA0_TXGAINSTAGE;
 464
 465        /* Tranceiver A~D HSSI Parameter-1 */
 466        /* wire control parameter1 */
 467        rtlphy->phyreg_def[RF90_PATH_A].rfhssi_para1 = RFPGA0_XA_HSSIPARAMETER1;
 468        /* wire control parameter1 */
 469        rtlphy->phyreg_def[RF90_PATH_B].rfhssi_para1 = RFPGA0_XB_HSSIPARAMETER1;
 470
 471        /* Tranceiver A~D HSSI Parameter-2 */
 472        /* wire control parameter2 */
 473        rtlphy->phyreg_def[RF90_PATH_A].rfhssi_para2 = RFPGA0_XA_HSSIPARAMETER2;
 474        /* wire control parameter2 */
 475        rtlphy->phyreg_def[RF90_PATH_B].rfhssi_para2 = RFPGA0_XB_HSSIPARAMETER2;
 476
 477        /* RF switch Control */
 478        /* TR/Ant switch control */
 479        rtlphy->phyreg_def[RF90_PATH_A].rfsw_ctrl = RFPGA0_XAB_SWITCHCONTROL;
 480        rtlphy->phyreg_def[RF90_PATH_B].rfsw_ctrl = RFPGA0_XAB_SWITCHCONTROL;
 481        rtlphy->phyreg_def[RF90_PATH_C].rfsw_ctrl = RFPGA0_XCD_SWITCHCONTROL;
 482        rtlphy->phyreg_def[RF90_PATH_D].rfsw_ctrl = RFPGA0_XCD_SWITCHCONTROL;
 483
 484        /* AGC control 1 */
 485        rtlphy->phyreg_def[RF90_PATH_A].rfagc_control1 = ROFDM0_XAAGCCORE1;
 486        rtlphy->phyreg_def[RF90_PATH_B].rfagc_control1 = ROFDM0_XBAGCCORE1;
 487        rtlphy->phyreg_def[RF90_PATH_C].rfagc_control1 = ROFDM0_XCAGCCORE1;
 488        rtlphy->phyreg_def[RF90_PATH_D].rfagc_control1 = ROFDM0_XDAGCCORE1;
 489
 490        /* AGC control 2  */
 491        rtlphy->phyreg_def[RF90_PATH_A].rfagc_control2 = ROFDM0_XAAGCCORE2;
 492        rtlphy->phyreg_def[RF90_PATH_B].rfagc_control2 = ROFDM0_XBAGCCORE2;
 493        rtlphy->phyreg_def[RF90_PATH_C].rfagc_control2 = ROFDM0_XCAGCCORE2;
 494        rtlphy->phyreg_def[RF90_PATH_D].rfagc_control2 = ROFDM0_XDAGCCORE2;
 495
 496        /* RX AFE control 1 */
 497        rtlphy->phyreg_def[RF90_PATH_A].rfrxiq_imbal = ROFDM0_XARXIQIMBALANCE;
 498        rtlphy->phyreg_def[RF90_PATH_B].rfrxiq_imbal = ROFDM0_XBRXIQIMBALANCE;
 499        rtlphy->phyreg_def[RF90_PATH_C].rfrxiq_imbal = ROFDM0_XCRXIQIMBALANCE;
 500        rtlphy->phyreg_def[RF90_PATH_D].rfrxiq_imbal = ROFDM0_XDRXIQIMBALANCE;
 501
 502        /*RX AFE control 1 */
 503        rtlphy->phyreg_def[RF90_PATH_A].rfrx_afe = ROFDM0_XARXAFE;
 504        rtlphy->phyreg_def[RF90_PATH_B].rfrx_afe = ROFDM0_XBRXAFE;
 505        rtlphy->phyreg_def[RF90_PATH_C].rfrx_afe = ROFDM0_XCRXAFE;
 506        rtlphy->phyreg_def[RF90_PATH_D].rfrx_afe = ROFDM0_XDRXAFE;
 507
 508        /* Tx AFE control 1 */
 509        rtlphy->phyreg_def[RF90_PATH_A].rftxiq_imbal = ROFDM0_XATxIQIMBALANCE;
 510        rtlphy->phyreg_def[RF90_PATH_B].rftxiq_imbal = ROFDM0_XBTxIQIMBALANCE;
 511        rtlphy->phyreg_def[RF90_PATH_C].rftxiq_imbal = ROFDM0_XCTxIQIMBALANCE;
 512        rtlphy->phyreg_def[RF90_PATH_D].rftxiq_imbal = ROFDM0_XDTxIQIMBALANCE;
 513
 514        /* Tx AFE control 2 */
 515        rtlphy->phyreg_def[RF90_PATH_A].rftx_afe = ROFDM0_XATxAFE;
 516        rtlphy->phyreg_def[RF90_PATH_B].rftx_afe = ROFDM0_XBTxAFE;
 517        rtlphy->phyreg_def[RF90_PATH_C].rftx_afe = ROFDM0_XCTxAFE;
 518        rtlphy->phyreg_def[RF90_PATH_D].rftx_afe = ROFDM0_XDTxAFE;
 519
 520        /* Tranceiver LSSI Readback SI mode */
 521        rtlphy->phyreg_def[RF90_PATH_A].rf_rb = RFPGA0_XA_LSSIREADBACK;
 522        rtlphy->phyreg_def[RF90_PATH_B].rf_rb = RFPGA0_XB_LSSIREADBACK;
 523        rtlphy->phyreg_def[RF90_PATH_C].rf_rb = RFPGA0_XC_LSSIREADBACK;
 524        rtlphy->phyreg_def[RF90_PATH_D].rf_rb = RFPGA0_XD_LSSIREADBACK;
 525
 526        /* Tranceiver LSSI Readback PI mode */
 527        rtlphy->phyreg_def[RF90_PATH_A].rf_rbpi = TRANSCEIVERA_HSPI_READBACK;
 528        rtlphy->phyreg_def[RF90_PATH_B].rf_rbpi = TRANSCEIVERB_HSPI_READBACK;
 529}
 530
 531static bool _rtl92d_phy_config_bb_with_headerfile(struct ieee80211_hw *hw,
 532        u8 configtype)
 533{
 534        int i;
 535        u32 *phy_regarray_table;
 536        u32 *agctab_array_table = NULL;
 537        u32 *agctab_5garray_table;
 538        u16 phy_reg_arraylen, agctab_arraylen = 0, agctab_5garraylen;
 539        struct rtl_priv *rtlpriv = rtl_priv(hw);
 540        struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
 541
 542        /* Normal chip,Mac0 use AGC_TAB.txt for 2G and 5G band. */
 543        if (rtlhal->interfaceindex == 0) {
 544                agctab_arraylen = AGCTAB_ARRAYLENGTH;
 545                agctab_array_table = rtl8192de_agctab_array;
 546                RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
 547                         " ===> phy:MAC0, Rtl819XAGCTAB_Array\n");
 548        } else {
 549                if (rtlhal->current_bandtype == BAND_ON_2_4G) {
 550                        agctab_arraylen = AGCTAB_2G_ARRAYLENGTH;
 551                        agctab_array_table = rtl8192de_agctab_2garray;
 552                        RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
 553                                 " ===> phy:MAC1, Rtl819XAGCTAB_2GArray\n");
 554                } else {
 555                        agctab_5garraylen = AGCTAB_5G_ARRAYLENGTH;
 556                        agctab_5garray_table = rtl8192de_agctab_5garray;
 557                        RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
 558                                 " ===> phy:MAC1, Rtl819XAGCTAB_5GArray\n");
 559
 560                }
 561        }
 562        phy_reg_arraylen = PHY_REG_2T_ARRAYLENGTH;
 563        phy_regarray_table = rtl8192de_phy_reg_2tarray;
 564        RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
 565                 " ===> phy:Rtl819XPHY_REG_Array_PG\n");
 566        if (configtype == BASEBAND_CONFIG_PHY_REG) {
 567                for (i = 0; i < phy_reg_arraylen; i = i + 2) {
 568                        rtl_addr_delay(phy_regarray_table[i]);
 569                        rtl_set_bbreg(hw, phy_regarray_table[i], MASKDWORD,
 570                                      phy_regarray_table[i + 1]);
 571                        udelay(1);
 572                        RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
 573                                 "The phy_regarray_table[0] is %x Rtl819XPHY_REGArray[1] is %x\n",
 574                                 phy_regarray_table[i],
 575                                 phy_regarray_table[i + 1]);
 576                }
 577        } else if (configtype == BASEBAND_CONFIG_AGC_TAB) {
 578                if (rtlhal->interfaceindex == 0) {
 579                        for (i = 0; i < agctab_arraylen; i = i + 2) {
 580                                rtl_set_bbreg(hw, agctab_array_table[i],
 581                                        MASKDWORD,
 582                                        agctab_array_table[i + 1]);
 583                                /* Add 1us delay between BB/RF register
 584                                 * setting. */
 585                                udelay(1);
 586                                RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
 587                                         "The Rtl819XAGCTAB_Array_Table[0] is %u Rtl819XPHY_REGArray[1] is %u\n",
 588                                         agctab_array_table[i],
 589                                         agctab_array_table[i + 1]);
 590                        }
 591                        RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
 592                                 "Normal Chip, MAC0, load Rtl819XAGCTAB_Array\n");
 593                } else {
 594                        if (rtlhal->current_bandtype == BAND_ON_2_4G) {
 595                                for (i = 0; i < agctab_arraylen; i = i + 2) {
 596                                        rtl_set_bbreg(hw, agctab_array_table[i],
 597                                                MASKDWORD,
 598                                                agctab_array_table[i + 1]);
 599                                        /* Add 1us delay between BB/RF register
 600                                         * setting. */
 601                                        udelay(1);
 602                                        RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
 603                                                 "The Rtl819XAGCTAB_Array_Table[0] is %u Rtl819XPHY_REGArray[1] is %u\n",
 604                                                 agctab_array_table[i],
 605                                                 agctab_array_table[i + 1]);
 606                                }
 607                                RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
 608                                         "Load Rtl819XAGCTAB_2GArray\n");
 609                        } else {
 610                                for (i = 0; i < agctab_5garraylen; i = i + 2) {
 611                                        rtl_set_bbreg(hw,
 612                                                agctab_5garray_table[i],
 613                                                MASKDWORD,
 614                                                agctab_5garray_table[i + 1]);
 615                                        /* Add 1us delay between BB/RF registeri
 616                                         * setting. */
 617                                        udelay(1);
 618                                        RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
 619                                                 "The Rtl819XAGCTAB_5GArray_Table[0] is %u Rtl819XPHY_REGArray[1] is %u\n",
 620                                                 agctab_5garray_table[i],
 621                                                 agctab_5garray_table[i + 1]);
 622                                }
 623                                RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
 624                                         "Load Rtl819XAGCTAB_5GArray\n");
 625                        }
 626                }
 627        }
 628        return true;
 629}
 630
 631static void _rtl92d_store_pwrindex_diffrate_offset(struct ieee80211_hw *hw,
 632                                                   u32 regaddr, u32 bitmask,
 633                                                   u32 data)
 634{
 635        struct rtl_priv *rtlpriv = rtl_priv(hw);
 636        struct rtl_phy *rtlphy = &(rtlpriv->phy);
 637        int index;
 638
 639        if (regaddr == RTXAGC_A_RATE18_06)
 640                index = 0;
 641        else if (regaddr == RTXAGC_A_RATE54_24)
 642                index = 1;
 643        else if (regaddr == RTXAGC_A_CCK1_MCS32)
 644                index = 6;
 645        else if (regaddr == RTXAGC_B_CCK11_A_CCK2_11 && bitmask == 0xffffff00)
 646                index = 7;
 647        else if (regaddr == RTXAGC_A_MCS03_MCS00)
 648                index = 2;
 649        else if (regaddr == RTXAGC_A_MCS07_MCS04)
 650                index = 3;
 651        else if (regaddr == RTXAGC_A_MCS11_MCS08)
 652                index = 4;
 653        else if (regaddr == RTXAGC_A_MCS15_MCS12)
 654                index = 5;
 655        else if (regaddr == RTXAGC_B_RATE18_06)
 656                index = 8;
 657        else if (regaddr == RTXAGC_B_RATE54_24)
 658                index = 9;
 659        else if (regaddr == RTXAGC_B_CCK1_55_MCS32)
 660                index = 14;
 661        else if (regaddr == RTXAGC_B_CCK11_A_CCK2_11 && bitmask == 0x000000ff)
 662                index = 15;
 663        else if (regaddr == RTXAGC_B_MCS03_MCS00)
 664                index = 10;
 665        else if (regaddr == RTXAGC_B_MCS07_MCS04)
 666                index = 11;
 667        else if (regaddr == RTXAGC_B_MCS11_MCS08)
 668                index = 12;
 669        else if (regaddr == RTXAGC_B_MCS15_MCS12)
 670                index = 13;
 671        else
 672                return;
 673
 674        rtlphy->mcs_offset[rtlphy->pwrgroup_cnt][index] = data;
 675        RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
 676                 "MCSTxPowerLevelOriginalOffset[%d][%d] = 0x%x\n",
 677                 rtlphy->pwrgroup_cnt, index,
 678                 rtlphy->mcs_offset[rtlphy->pwrgroup_cnt][index]);
 679        if (index == 13)
 680                rtlphy->pwrgroup_cnt++;
 681}
 682
 683static bool _rtl92d_phy_config_bb_with_pgheaderfile(struct ieee80211_hw *hw,
 684        u8 configtype)
 685{
 686        struct rtl_priv *rtlpriv = rtl_priv(hw);
 687        int i;
 688        u32 *phy_regarray_table_pg;
 689        u16 phy_regarray_pg_len;
 690
 691        phy_regarray_pg_len = PHY_REG_ARRAY_PG_LENGTH;
 692        phy_regarray_table_pg = rtl8192de_phy_reg_array_pg;
 693        if (configtype == BASEBAND_CONFIG_PHY_REG) {
 694                for (i = 0; i < phy_regarray_pg_len; i = i + 3) {
 695                        rtl_addr_delay(phy_regarray_table_pg[i]);
 696                        _rtl92d_store_pwrindex_diffrate_offset(hw,
 697                                phy_regarray_table_pg[i],
 698                                phy_regarray_table_pg[i + 1],
 699                                phy_regarray_table_pg[i + 2]);
 700                }
 701        } else {
 702                RT_TRACE(rtlpriv, COMP_SEND, DBG_TRACE,
 703                         "configtype != BaseBand_Config_PHY_REG\n");
 704        }
 705        return true;
 706}
 707
 708static bool _rtl92d_phy_bb_config(struct ieee80211_hw *hw)
 709{
 710        struct rtl_priv *rtlpriv = rtl_priv(hw);
 711        struct rtl_phy *rtlphy = &(rtlpriv->phy);
 712        struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
 713        bool rtstatus = true;
 714
 715        RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, "==>\n");
 716        rtstatus = _rtl92d_phy_config_bb_with_headerfile(hw,
 717                BASEBAND_CONFIG_PHY_REG);
 718        if (!rtstatus) {
 719                pr_err("Write BB Reg Fail!!\n");
 720                return false;
 721        }
 722
 723        /* if (rtlphy->rf_type == RF_1T2R) {
 724         *      _rtl92c_phy_bb_config_1t(hw);
 725         *     RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, "Config to 1T!!\n");
 726         *} */
 727
 728        if (rtlefuse->autoload_failflag == false) {
 729                rtlphy->pwrgroup_cnt = 0;
 730                rtstatus = _rtl92d_phy_config_bb_with_pgheaderfile(hw,
 731                        BASEBAND_CONFIG_PHY_REG);
 732        }
 733        if (!rtstatus) {
 734                pr_err("BB_PG Reg Fail!!\n");
 735                return false;
 736        }
 737        rtstatus = _rtl92d_phy_config_bb_with_headerfile(hw,
 738                BASEBAND_CONFIG_AGC_TAB);
 739        if (!rtstatus) {
 740                pr_err("AGC Table Fail\n");
 741                return false;
 742        }
 743        rtlphy->cck_high_power = (bool) (rtl_get_bbreg(hw,
 744                RFPGA0_XA_HSSIPARAMETER2, 0x200));
 745
 746        return true;
 747}
 748
 749bool rtl92d_phy_bb_config(struct ieee80211_hw *hw)
 750{
 751        struct rtl_priv *rtlpriv = rtl_priv(hw);
 752        u16 regval;
 753        u32 regvaldw;
 754        u8 value;
 755
 756        _rtl92d_phy_init_bb_rf_register_definition(hw);
 757        regval = rtl_read_word(rtlpriv, REG_SYS_FUNC_EN);
 758        rtl_write_word(rtlpriv, REG_SYS_FUNC_EN,
 759                       regval | BIT(13) | BIT(0) | BIT(1));
 760        rtl_write_byte(rtlpriv, REG_AFE_PLL_CTRL, 0x83);
 761        rtl_write_byte(rtlpriv, REG_AFE_PLL_CTRL + 1, 0xdb);
 762        /* 0x1f bit7 bit6 represent for mac0/mac1 driver ready */
 763        value = rtl_read_byte(rtlpriv, REG_RF_CTRL);
 764        rtl_write_byte(rtlpriv, REG_RF_CTRL, value | RF_EN | RF_RSTB |
 765                RF_SDMRSTB);
 766        rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN, FEN_PPLL | FEN_PCIEA |
 767                FEN_DIO_PCIE | FEN_BB_GLB_RSTn | FEN_BBRSTB);
 768        rtl_write_byte(rtlpriv, REG_AFE_XTAL_CTRL + 1, 0x80);
 769        if (!(IS_92D_SINGLEPHY(rtlpriv->rtlhal.version))) {
 770                regvaldw = rtl_read_dword(rtlpriv, REG_LEDCFG0);
 771                rtl_write_dword(rtlpriv, REG_LEDCFG0, regvaldw | BIT(23));
 772        }
 773
 774        return _rtl92d_phy_bb_config(hw);
 775}
 776
 777bool rtl92d_phy_rf_config(struct ieee80211_hw *hw)
 778{
 779        return rtl92d_phy_rf6052_config(hw);
 780}
 781
 782bool rtl92d_phy_config_rf_with_headerfile(struct ieee80211_hw *hw,
 783                                          enum rf_content content,
 784                                          enum radio_path rfpath)
 785{
 786        int i;
 787        u32 *radioa_array_table;
 788        u32 *radiob_array_table;
 789        u16 radioa_arraylen, radiob_arraylen;
 790        struct rtl_priv *rtlpriv = rtl_priv(hw);
 791
 792        radioa_arraylen = RADIOA_2T_ARRAYLENGTH;
 793        radioa_array_table = rtl8192de_radioa_2tarray;
 794        radiob_arraylen = RADIOB_2T_ARRAYLENGTH;
 795        radiob_array_table = rtl8192de_radiob_2tarray;
 796        if (rtlpriv->efuse.internal_pa_5g[0]) {
 797                radioa_arraylen = RADIOA_2T_INT_PA_ARRAYLENGTH;
 798                radioa_array_table = rtl8192de_radioa_2t_int_paarray;
 799        }
 800        if (rtlpriv->efuse.internal_pa_5g[1]) {
 801                radiob_arraylen = RADIOB_2T_INT_PA_ARRAYLENGTH;
 802                radiob_array_table = rtl8192de_radiob_2t_int_paarray;
 803        }
 804        RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
 805                 "PHY_ConfigRFWithHeaderFile() Radio_A:Rtl819XRadioA_1TArray\n");
 806        RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
 807                 "PHY_ConfigRFWithHeaderFile() Radio_B:Rtl819XRadioB_1TArray\n");
 808        RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, "Radio No %x\n", rfpath);
 809
 810        /* this only happens when DMDP, mac0 start on 2.4G,
 811         * mac1 start on 5G, mac 0 has to set phy0&phy1
 812         * pathA or mac1 has to set phy0&phy1 pathA */
 813        if ((content == radiob_txt) && (rfpath == RF90_PATH_A)) {
 814                RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
 815                         " ===> althougth Path A, we load radiob.txt\n");
 816                radioa_arraylen = radiob_arraylen;
 817                radioa_array_table = radiob_array_table;
 818        }
 819        switch (rfpath) {
 820        case RF90_PATH_A:
 821                for (i = 0; i < radioa_arraylen; i = i + 2) {
 822                        rtl_rfreg_delay(hw, rfpath, radioa_array_table[i],
 823                                        RFREG_OFFSET_MASK,
 824                                        radioa_array_table[i + 1]);
 825                }
 826                break;
 827        case RF90_PATH_B:
 828                for (i = 0; i < radiob_arraylen; i = i + 2) {
 829                        rtl_rfreg_delay(hw, rfpath, radiob_array_table[i],
 830                                        RFREG_OFFSET_MASK,
 831                                        radiob_array_table[i + 1]);
 832                }
 833                break;
 834        case RF90_PATH_C:
 835        case RF90_PATH_D:
 836                pr_err("switch case %#x not processed\n", rfpath);
 837                break;
 838        }
 839        return true;
 840}
 841
 842void rtl92d_phy_get_hw_reg_originalvalue(struct ieee80211_hw *hw)
 843{
 844        struct rtl_priv *rtlpriv = rtl_priv(hw);
 845        struct rtl_phy *rtlphy = &(rtlpriv->phy);
 846
 847        rtlphy->default_initialgain[0] =
 848            (u8) rtl_get_bbreg(hw, ROFDM0_XAAGCCORE1, MASKBYTE0);
 849        rtlphy->default_initialgain[1] =
 850            (u8) rtl_get_bbreg(hw, ROFDM0_XBAGCCORE1, MASKBYTE0);
 851        rtlphy->default_initialgain[2] =
 852            (u8) rtl_get_bbreg(hw, ROFDM0_XCAGCCORE1, MASKBYTE0);
 853        rtlphy->default_initialgain[3] =
 854            (u8) rtl_get_bbreg(hw, ROFDM0_XDAGCCORE1, MASKBYTE0);
 855        RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
 856                 "Default initial gain (c50=0x%x, c58=0x%x, c60=0x%x, c68=0x%x\n",
 857                 rtlphy->default_initialgain[0],
 858                 rtlphy->default_initialgain[1],
 859                 rtlphy->default_initialgain[2],
 860                 rtlphy->default_initialgain[3]);
 861        rtlphy->framesync = (u8)rtl_get_bbreg(hw, ROFDM0_RXDETECTOR3,
 862                                              MASKBYTE0);
 863        rtlphy->framesync_c34 = rtl_get_bbreg(hw, ROFDM0_RXDETECTOR2,
 864                                              MASKDWORD);
 865        RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE,
 866                 "Default framesync (0x%x) = 0x%x\n",
 867                 ROFDM0_RXDETECTOR3, rtlphy->framesync);
 868}
 869
 870static void _rtl92d_get_txpower_index(struct ieee80211_hw *hw, u8 channel,
 871        u8 *cckpowerlevel, u8 *ofdmpowerlevel)
 872{
 873        struct rtl_priv *rtlpriv = rtl_priv(hw);
 874        struct rtl_phy *rtlphy = &(rtlpriv->phy);
 875        struct rtl_hal *rtlhal = &(rtlpriv->rtlhal);
 876        struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
 877        u8 index = (channel - 1);
 878
 879        /* 1. CCK */
 880        if (rtlhal->current_bandtype == BAND_ON_2_4G) {
 881                /* RF-A */
 882                cckpowerlevel[RF90_PATH_A] =
 883                                 rtlefuse->txpwrlevel_cck[RF90_PATH_A][index];
 884                /* RF-B */
 885                cckpowerlevel[RF90_PATH_B] =
 886                                 rtlefuse->txpwrlevel_cck[RF90_PATH_B][index];
 887        } else {
 888                cckpowerlevel[RF90_PATH_A] = 0;
 889                cckpowerlevel[RF90_PATH_B] = 0;
 890        }
 891        /* 2. OFDM for 1S or 2S */
 892        if (rtlphy->rf_type == RF_1T2R || rtlphy->rf_type == RF_1T1R) {
 893                /*  Read HT 40 OFDM TX power */
 894                ofdmpowerlevel[RF90_PATH_A] =
 895                    rtlefuse->txpwrlevel_ht40_1s[RF90_PATH_A][index];
 896                ofdmpowerlevel[RF90_PATH_B] =
 897                    rtlefuse->txpwrlevel_ht40_1s[RF90_PATH_B][index];
 898        } else if (rtlphy->rf_type == RF_2T2R) {
 899                /* Read HT 40 OFDM TX power */
 900                ofdmpowerlevel[RF90_PATH_A] =
 901                    rtlefuse->txpwrlevel_ht40_2s[RF90_PATH_A][index];
 902                ofdmpowerlevel[RF90_PATH_B] =
 903                    rtlefuse->txpwrlevel_ht40_2s[RF90_PATH_B][index];
 904        }
 905}
 906
 907static void _rtl92d_ccxpower_index_check(struct ieee80211_hw *hw,
 908        u8 channel, u8 *cckpowerlevel, u8 *ofdmpowerlevel)
 909{
 910        struct rtl_priv *rtlpriv = rtl_priv(hw);
 911        struct rtl_phy *rtlphy = &(rtlpriv->phy);
 912
 913        rtlphy->cur_cck_txpwridx = cckpowerlevel[0];
 914        rtlphy->cur_ofdm24g_txpwridx = ofdmpowerlevel[0];
 915}
 916
 917static u8 _rtl92c_phy_get_rightchnlplace(u8 chnl)
 918{
 919        u8 place = chnl;
 920
 921        if (chnl > 14) {
 922                for (place = 14; place < sizeof(channel5g); place++) {
 923                        if (channel5g[place] == chnl) {
 924                                place++;
 925                                break;
 926                        }
 927                }
 928        }
 929        return place;
 930}
 931
 932void rtl92d_phy_set_txpower_level(struct ieee80211_hw *hw, u8 channel)
 933{
 934        struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
 935        struct rtl_priv *rtlpriv = rtl_priv(hw);
 936        u8 cckpowerlevel[2], ofdmpowerlevel[2];
 937
 938        if (!rtlefuse->txpwr_fromeprom)
 939                return;
 940        channel = _rtl92c_phy_get_rightchnlplace(channel);
 941        _rtl92d_get_txpower_index(hw, channel, &cckpowerlevel[0],
 942                &ofdmpowerlevel[0]);
 943        if (rtlpriv->rtlhal.current_bandtype == BAND_ON_2_4G)
 944                _rtl92d_ccxpower_index_check(hw, channel, &cckpowerlevel[0],
 945                                &ofdmpowerlevel[0]);
 946        if (rtlpriv->rtlhal.current_bandtype == BAND_ON_2_4G)
 947                rtl92d_phy_rf6052_set_cck_txpower(hw, &cckpowerlevel[0]);
 948        rtl92d_phy_rf6052_set_ofdm_txpower(hw, &ofdmpowerlevel[0], channel);
 949}
 950
 951void rtl92d_phy_set_bw_mode(struct ieee80211_hw *hw,
 952                            enum nl80211_channel_type ch_type)
 953{
 954        struct rtl_priv *rtlpriv = rtl_priv(hw);
 955        struct rtl_phy *rtlphy = &(rtlpriv->phy);
 956        struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
 957        struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
 958        unsigned long flag = 0;
 959        u8 reg_prsr_rsc;
 960        u8 reg_bw_opmode;
 961
 962        if (rtlphy->set_bwmode_inprogress)
 963                return;
 964        if ((is_hal_stop(rtlhal)) || (RT_CANNOT_IO(hw))) {
 965                RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
 966                         "FALSE driver sleep or unload\n");
 967                return;
 968        }
 969        rtlphy->set_bwmode_inprogress = true;
 970        RT_TRACE(rtlpriv, COMP_SCAN, DBG_TRACE, "Switch to %s bandwidth\n",
 971                 rtlphy->current_chan_bw == HT_CHANNEL_WIDTH_20 ?
 972                 "20MHz" : "40MHz");
 973        reg_bw_opmode = rtl_read_byte(rtlpriv, REG_BWOPMODE);
 974        reg_prsr_rsc = rtl_read_byte(rtlpriv, REG_RRSR + 2);
 975        switch (rtlphy->current_chan_bw) {
 976        case HT_CHANNEL_WIDTH_20:
 977                reg_bw_opmode |= BW_OPMODE_20MHZ;
 978                rtl_write_byte(rtlpriv, REG_BWOPMODE, reg_bw_opmode);
 979                break;
 980        case HT_CHANNEL_WIDTH_20_40:
 981                reg_bw_opmode &= ~BW_OPMODE_20MHZ;
 982                rtl_write_byte(rtlpriv, REG_BWOPMODE, reg_bw_opmode);
 983
 984                reg_prsr_rsc = (reg_prsr_rsc & 0x90) |
 985                        (mac->cur_40_prime_sc << 5);
 986                rtl_write_byte(rtlpriv, REG_RRSR + 2, reg_prsr_rsc);
 987                break;
 988        default:
 989                pr_err("unknown bandwidth: %#X\n",
 990                       rtlphy->current_chan_bw);
 991                break;
 992        }
 993        switch (rtlphy->current_chan_bw) {
 994        case HT_CHANNEL_WIDTH_20:
 995                rtl_set_bbreg(hw, RFPGA0_RFMOD, BRFMOD, 0x0);
 996                rtl_set_bbreg(hw, RFPGA1_RFMOD, BRFMOD, 0x0);
 997                /* SET BIT10 BIT11  for receive cck */
 998                rtl_set_bbreg(hw, RFPGA0_ANALOGPARAMETER2, BIT(10) |
 999                              BIT(11), 3);
1000                break;
1001        case HT_CHANNEL_WIDTH_20_40:
1002                rtl_set_bbreg(hw, RFPGA0_RFMOD, BRFMOD, 0x1);
1003                rtl_set_bbreg(hw, RFPGA1_RFMOD, BRFMOD, 0x1);
1004                /* Set Control channel to upper or lower.
1005                 * These settings are required only for 40MHz */
1006                if (rtlhal->current_bandtype == BAND_ON_2_4G) {
1007                        rtl92d_acquire_cckandrw_pagea_ctl(hw, &flag);
1008                        rtl_set_bbreg(hw, RCCK0_SYSTEM, BCCKSIDEBAND,
1009                                (mac->cur_40_prime_sc >> 1));
1010                        rtl92d_release_cckandrw_pagea_ctl(hw, &flag);
1011                }
1012                rtl_set_bbreg(hw, ROFDM1_LSTF, 0xC00, mac->cur_40_prime_sc);
1013                /* SET BIT10 BIT11  for receive cck */
1014                rtl_set_bbreg(hw, RFPGA0_ANALOGPARAMETER2, BIT(10) |
1015                              BIT(11), 0);
1016                rtl_set_bbreg(hw, 0x818, (BIT(26) | BIT(27)),
1017                        (mac->cur_40_prime_sc ==
1018                        HAL_PRIME_CHNL_OFFSET_LOWER) ? 2 : 1);
1019                break;
1020        default:
1021                pr_err("unknown bandwidth: %#X\n",
1022                       rtlphy->current_chan_bw);
1023                break;
1024
1025        }
1026        rtl92d_phy_rf6052_set_bandwidth(hw, rtlphy->current_chan_bw);
1027        rtlphy->set_bwmode_inprogress = false;
1028        RT_TRACE(rtlpriv, COMP_SCAN, DBG_TRACE, "<==\n");
1029}
1030
1031static void _rtl92d_phy_stop_trx_before_changeband(struct ieee80211_hw *hw)
1032{
1033        rtl_set_bbreg(hw, RFPGA0_RFMOD, BCCKEN, 0);
1034        rtl_set_bbreg(hw, RFPGA0_RFMOD, BOFDMEN, 0);
1035        rtl_set_bbreg(hw, ROFDM0_TRXPATHENABLE, MASKBYTE0, 0x00);
1036        rtl_set_bbreg(hw, ROFDM1_TRXPATHENABLE, BDWORD, 0x0);
1037}
1038
1039static void rtl92d_phy_switch_wirelessband(struct ieee80211_hw *hw, u8 band)
1040{
1041        struct rtl_priv *rtlpriv = rtl_priv(hw);
1042        struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
1043        u8 value8;
1044
1045        RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "==>\n");
1046        rtlhal->bandset = band;
1047        rtlhal->current_bandtype = band;
1048        if (IS_92D_SINGLEPHY(rtlhal->version))
1049                rtlhal->bandset = BAND_ON_BOTH;
1050        /* stop RX/Tx */
1051        _rtl92d_phy_stop_trx_before_changeband(hw);
1052        /* reconfig BB/RF according to wireless mode */
1053        if (rtlhal->current_bandtype == BAND_ON_2_4G) {
1054                /* BB & RF Config */
1055                RT_TRACE(rtlpriv, COMP_CMD, DBG_DMESG, "====>2.4G\n");
1056                if (rtlhal->interfaceindex == 1)
1057                        _rtl92d_phy_config_bb_with_headerfile(hw,
1058                                BASEBAND_CONFIG_AGC_TAB);
1059        } else {
1060                /* 5G band */
1061                RT_TRACE(rtlpriv, COMP_CMD, DBG_DMESG, "====>5G\n");
1062                if (rtlhal->interfaceindex == 1)
1063                        _rtl92d_phy_config_bb_with_headerfile(hw,
1064                                BASEBAND_CONFIG_AGC_TAB);
1065        }
1066        rtl92d_update_bbrf_configuration(hw);
1067        if (rtlhal->current_bandtype == BAND_ON_2_4G)
1068                rtl_set_bbreg(hw, RFPGA0_RFMOD, BCCKEN, 0x1);
1069        rtl_set_bbreg(hw, RFPGA0_RFMOD, BOFDMEN, 0x1);
1070
1071        /* 20M BW. */
1072        /* rtl_set_bbreg(hw, RFPGA0_ANALOGPARAMETER2, BIT(10), 1); */
1073        rtlhal->reloadtxpowerindex = true;
1074        /* notice fw know band status  0x81[1]/0x53[1] = 0: 5G, 1: 2G */
1075        if (rtlhal->current_bandtype == BAND_ON_2_4G) {
1076                value8 = rtl_read_byte(rtlpriv, (rtlhal->interfaceindex ==
1077                        0 ? REG_MAC0 : REG_MAC1));
1078                value8 |= BIT(1);
1079                rtl_write_byte(rtlpriv, (rtlhal->interfaceindex ==
1080                        0 ? REG_MAC0 : REG_MAC1), value8);
1081        } else {
1082                value8 = rtl_read_byte(rtlpriv, (rtlhal->interfaceindex ==
1083                        0 ? REG_MAC0 : REG_MAC1));
1084                value8 &= (~BIT(1));
1085                rtl_write_byte(rtlpriv, (rtlhal->interfaceindex ==
1086                        0 ? REG_MAC0 : REG_MAC1), value8);
1087        }
1088        mdelay(1);
1089        RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "<==Switch Band OK\n");
1090}
1091
1092static void _rtl92d_phy_reload_imr_setting(struct ieee80211_hw *hw,
1093        u8 channel, u8 rfpath)
1094{
1095        struct rtl_priv *rtlpriv = rtl_priv(hw);
1096        u32 imr_num = MAX_RF_IMR_INDEX;
1097        u32 rfmask = RFREG_OFFSET_MASK;
1098        u8 group, i;
1099        unsigned long flag = 0;
1100
1101        RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD, "====>path %d\n", rfpath);
1102        if (rtlpriv->rtlhal.current_bandtype == BAND_ON_5G) {
1103                RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD, "====>5G\n");
1104                rtl_set_bbreg(hw, RFPGA0_RFMOD, BIT(25) | BIT(24), 0);
1105                rtl_set_bbreg(hw, RFPGA0_ANALOGPARAMETER4, 0x00f00000, 0xf);
1106                /* fc area 0xd2c */
1107                if (channel > 99)
1108                        rtl_set_bbreg(hw, ROFDM1_CFOTRACKING, BIT(13) |
1109                                      BIT(14), 2);
1110                else
1111                        rtl_set_bbreg(hw, ROFDM1_CFOTRACKING, BIT(13) |
1112                                      BIT(14), 1);
1113                /* leave 0 for channel1-14. */
1114                group = channel <= 64 ? 1 : 2;
1115                imr_num = MAX_RF_IMR_INDEX_NORMAL;
1116                for (i = 0; i < imr_num; i++)
1117                        rtl_set_rfreg(hw, (enum radio_path)rfpath,
1118                                      rf_reg_for_5g_swchnl_normal[i], rfmask,
1119                                      rf_imr_param_normal[0][group][i]);
1120                rtl_set_bbreg(hw, RFPGA0_ANALOGPARAMETER4, 0x00f00000, 0);
1121                rtl_set_bbreg(hw, RFPGA0_RFMOD, BOFDMEN, 1);
1122        } else {
1123                /* G band. */
1124                RT_TRACE(rtlpriv, COMP_SCAN, DBG_LOUD,
1125                         "Load RF IMR parameters for G band. IMR already setting %d\n",
1126                         rtlpriv->rtlhal.load_imrandiqk_setting_for2g);
1127                RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD, "====>2.4G\n");
1128                if (!rtlpriv->rtlhal.load_imrandiqk_setting_for2g) {
1129                        RT_TRACE(rtlpriv, COMP_SCAN, DBG_LOUD,
1130                                 "Load RF IMR parameters for G band. %d\n",
1131                                 rfpath);
1132                        rtl92d_acquire_cckandrw_pagea_ctl(hw, &flag);
1133                        rtl_set_bbreg(hw, RFPGA0_RFMOD, BIT(25) | BIT(24), 0);
1134                        rtl_set_bbreg(hw, RFPGA0_ANALOGPARAMETER4,
1135                                      0x00f00000, 0xf);
1136                        imr_num = MAX_RF_IMR_INDEX_NORMAL;
1137                        for (i = 0; i < imr_num; i++) {
1138                                rtl_set_rfreg(hw, (enum radio_path)rfpath,
1139                                              rf_reg_for_5g_swchnl_normal[i],
1140                                              RFREG_OFFSET_MASK,
1141                                              rf_imr_param_normal[0][0][i]);
1142                        }
1143                        rtl_set_bbreg(hw, RFPGA0_ANALOGPARAMETER4,
1144                                      0x00f00000, 0);
1145                        rtl_set_bbreg(hw, RFPGA0_RFMOD, BOFDMEN | BCCKEN, 3);
1146                        rtl92d_release_cckandrw_pagea_ctl(hw, &flag);
1147                }
1148        }
1149        RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD, "<====\n");
1150}
1151
1152static void _rtl92d_phy_enable_rf_env(struct ieee80211_hw *hw,
1153        u8 rfpath, u32 *pu4_regval)
1154{
1155        struct rtl_priv *rtlpriv = rtl_priv(hw);
1156        struct rtl_phy *rtlphy = &(rtlpriv->phy);
1157        struct bb_reg_def *pphyreg = &rtlphy->phyreg_def[rfpath];
1158
1159        RT_TRACE(rtlpriv, COMP_RF, DBG_LOUD, "====>\n");
1160        /*----Store original RFENV control type----*/
1161        switch (rfpath) {
1162        case RF90_PATH_A:
1163        case RF90_PATH_C:
1164                *pu4_regval = rtl_get_bbreg(hw, pphyreg->rfintfs, BRFSI_RFENV);
1165                break;
1166        case RF90_PATH_B:
1167        case RF90_PATH_D:
1168                *pu4_regval =
1169                    rtl_get_bbreg(hw, pphyreg->rfintfs, BRFSI_RFENV << 16);
1170                break;
1171        }
1172        /*----Set RF_ENV enable----*/
1173        rtl_set_bbreg(hw, pphyreg->rfintfe, BRFSI_RFENV << 16, 0x1);
1174        udelay(1);
1175        /*----Set RF_ENV output high----*/
1176        rtl_set_bbreg(hw, pphyreg->rfintfo, BRFSI_RFENV, 0x1);
1177        udelay(1);
1178        /* Set bit number of Address and Data for RF register */
1179        /* Set 1 to 4 bits for 8255 */
1180        rtl_set_bbreg(hw, pphyreg->rfhssi_para2, B3WIREADDRESSLENGTH, 0x0);
1181        udelay(1);
1182        /*Set 0 to 12 bits for 8255 */
1183        rtl_set_bbreg(hw, pphyreg->rfhssi_para2, B3WIREDATALENGTH, 0x0);
1184        udelay(1);
1185        RT_TRACE(rtlpriv, COMP_RF, DBG_LOUD, "<====\n");
1186}
1187
1188static void _rtl92d_phy_restore_rf_env(struct ieee80211_hw *hw, u8 rfpath,
1189                                       u32 *pu4_regval)
1190{
1191        struct rtl_priv *rtlpriv = rtl_priv(hw);
1192        struct rtl_phy *rtlphy = &(rtlpriv->phy);
1193        struct bb_reg_def *pphyreg = &rtlphy->phyreg_def[rfpath];
1194
1195        RT_TRACE(rtlpriv, COMP_RF, DBG_LOUD, "=====>\n");
1196        /*----Restore RFENV control type----*/
1197        switch (rfpath) {
1198        case RF90_PATH_A:
1199        case RF90_PATH_C:
1200                rtl_set_bbreg(hw, pphyreg->rfintfs, BRFSI_RFENV, *pu4_regval);
1201                break;
1202        case RF90_PATH_B:
1203        case RF90_PATH_D:
1204                rtl_set_bbreg(hw, pphyreg->rfintfs, BRFSI_RFENV << 16,
1205                              *pu4_regval);
1206                break;
1207        }
1208        RT_TRACE(rtlpriv, COMP_RF, DBG_LOUD, "<=====\n");
1209}
1210
1211static void _rtl92d_phy_switch_rf_setting(struct ieee80211_hw *hw, u8 channel)
1212{
1213        struct rtl_priv *rtlpriv = rtl_priv(hw);
1214        struct rtl_phy *rtlphy = &(rtlpriv->phy);
1215        struct rtl_hal *rtlhal = &(rtlpriv->rtlhal);
1216        u8 path = rtlhal->current_bandtype ==
1217            BAND_ON_5G ? RF90_PATH_A : RF90_PATH_B;
1218        u8 index = 0, i = 0, rfpath = RF90_PATH_A;
1219        bool need_pwr_down = false, internal_pa = false;
1220        u32 u4regvalue, mask = 0x1C000, value = 0, u4tmp, u4tmp2;
1221
1222        RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD, "====>\n");
1223        /* config path A for 5G */
1224        if (rtlhal->current_bandtype == BAND_ON_5G) {
1225                RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD, "====>5G\n");
1226                u4tmp = curveindex_5g[channel - 1];
1227                RTPRINT(rtlpriv, FINIT, INIT_IQK,
1228                        "ver 1 set RF-A, 5G, 0x28 = 0x%x !!\n", u4tmp);
1229                for (i = 0; i < RF_CHNL_NUM_5G; i++) {
1230                        if (channel == rf_chnl_5g[i] && channel <= 140)
1231                                index = 0;
1232                }
1233                for (i = 0; i < RF_CHNL_NUM_5G_40M; i++) {
1234                        if (channel == rf_chnl_5g_40m[i] && channel <= 140)
1235                                index = 1;
1236                }
1237                if (channel == 149 || channel == 155 || channel == 161)
1238                        index = 2;
1239                else if (channel == 151 || channel == 153 || channel == 163
1240                         || channel == 165)
1241                        index = 3;
1242                else if (channel == 157 || channel == 159)
1243                        index = 4;
1244
1245                if (rtlhal->macphymode == DUALMAC_DUALPHY
1246                    && rtlhal->interfaceindex == 1) {
1247                        need_pwr_down = rtl92d_phy_enable_anotherphy(hw, false);
1248                        rtlhal->during_mac1init_radioa = true;
1249                        /* asume no this case */
1250                        if (need_pwr_down)
1251                                _rtl92d_phy_enable_rf_env(hw, path,
1252                                                          &u4regvalue);
1253                }
1254                for (i = 0; i < RF_REG_NUM_FOR_C_CUT_5G; i++) {
1255                        if (i == 0 && (rtlhal->macphymode == DUALMAC_DUALPHY)) {
1256                                rtl_set_rfreg(hw, (enum radio_path)path,
1257                                              rf_reg_for_c_cut_5g[i],
1258                                              RFREG_OFFSET_MASK, 0xE439D);
1259                        } else if (rf_reg_for_c_cut_5g[i] == RF_SYN_G4) {
1260                                u4tmp2 = (rf_reg_pram_c_5g[index][i] &
1261                                     0x7FF) | (u4tmp << 11);
1262                                if (channel == 36)
1263                                        u4tmp2 &= ~(BIT(7) | BIT(6));
1264                                rtl_set_rfreg(hw, (enum radio_path)path,
1265                                              rf_reg_for_c_cut_5g[i],
1266                                              RFREG_OFFSET_MASK, u4tmp2);
1267                        } else {
1268                                rtl_set_rfreg(hw, (enum radio_path)path,
1269                                              rf_reg_for_c_cut_5g[i],
1270                                              RFREG_OFFSET_MASK,
1271                                              rf_reg_pram_c_5g[index][i]);
1272                        }
1273                        RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE,
1274                                 "offset 0x%x value 0x%x path %d index %d readback 0x%x\n",
1275                                 rf_reg_for_c_cut_5g[i],
1276                                 rf_reg_pram_c_5g[index][i],
1277                                 path, index,
1278                                 rtl_get_rfreg(hw, (enum radio_path)path,
1279                                               rf_reg_for_c_cut_5g[i],
1280                                               RFREG_OFFSET_MASK));
1281                }
1282                if (need_pwr_down)
1283                        _rtl92d_phy_restore_rf_env(hw, path, &u4regvalue);
1284                if (rtlhal->during_mac1init_radioa)
1285                        rtl92d_phy_powerdown_anotherphy(hw, false);
1286                if (channel < 149)
1287                        value = 0x07;
1288                else if (channel >= 149)
1289                        value = 0x02;
1290                if (channel >= 36 && channel <= 64)
1291                        index = 0;
1292                else if (channel >= 100 && channel <= 140)
1293                        index = 1;
1294                else
1295                        index = 2;
1296                for (rfpath = RF90_PATH_A; rfpath < rtlphy->num_total_rfpath;
1297                        rfpath++) {
1298                        if (rtlhal->macphymode == DUALMAC_DUALPHY &&
1299                                rtlhal->interfaceindex == 1)    /* MAC 1 5G */
1300                                internal_pa = rtlpriv->efuse.internal_pa_5g[1];
1301                        else
1302                                internal_pa =
1303                                         rtlpriv->efuse.internal_pa_5g[rfpath];
1304                        if (internal_pa) {
1305                                for (i = 0;
1306                                     i < RF_REG_NUM_FOR_C_CUT_5G_INTERNALPA;
1307                                     i++) {
1308                                        rtl_set_rfreg(hw, rfpath,
1309                                                rf_for_c_cut_5g_internal_pa[i],
1310                                                RFREG_OFFSET_MASK,
1311                                                rf_pram_c_5g_int_pa[index][i]);
1312                                        RT_TRACE(rtlpriv, COMP_RF, DBG_LOUD,
1313                                                 "offset 0x%x value 0x%x path %d index %d\n",
1314                                                 rf_for_c_cut_5g_internal_pa[i],
1315                                                 rf_pram_c_5g_int_pa[index][i],
1316                                                 rfpath, index);
1317                                }
1318                        } else {
1319                                rtl_set_rfreg(hw, (enum radio_path)rfpath, 0x0B,
1320                                              mask, value);
1321                        }
1322                }
1323        } else if (rtlhal->current_bandtype == BAND_ON_2_4G) {
1324                RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD, "====>2.4G\n");
1325                u4tmp = curveindex_2g[channel - 1];
1326                RTPRINT(rtlpriv, FINIT, INIT_IQK,
1327                        "ver 3 set RF-B, 2G, 0x28 = 0x%x !!\n", u4tmp);
1328                if (channel == 1 || channel == 2 || channel == 4 || channel == 9
1329                    || channel == 10 || channel == 11 || channel == 12)
1330                        index = 0;
1331                else if (channel == 3 || channel == 13 || channel == 14)
1332                        index = 1;
1333                else if (channel >= 5 && channel <= 8)
1334                        index = 2;
1335                if (rtlhal->macphymode == DUALMAC_DUALPHY) {
1336                        path = RF90_PATH_A;
1337                        if (rtlhal->interfaceindex == 0) {
1338                                need_pwr_down =
1339                                         rtl92d_phy_enable_anotherphy(hw, true);
1340                                rtlhal->during_mac0init_radiob = true;
1341
1342                                if (need_pwr_down)
1343                                        _rtl92d_phy_enable_rf_env(hw, path,
1344                                                                  &u4regvalue);
1345                        }
1346                }
1347                for (i = 0; i < RF_REG_NUM_FOR_C_CUT_2G; i++) {
1348                        if (rf_reg_for_c_cut_2g[i] == RF_SYN_G7)
1349                                rtl_set_rfreg(hw, (enum radio_path)path,
1350                                        rf_reg_for_c_cut_2g[i],
1351                                        RFREG_OFFSET_MASK,
1352                                        (rf_reg_param_for_c_cut_2g[index][i] |
1353                                        BIT(17)));
1354                        else
1355                                rtl_set_rfreg(hw, (enum radio_path)path,
1356                                              rf_reg_for_c_cut_2g[i],
1357                                              RFREG_OFFSET_MASK,
1358                                              rf_reg_param_for_c_cut_2g
1359                                              [index][i]);
1360                        RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE,
1361                                 "offset 0x%x value 0x%x mak 0x%x path %d index %d readback 0x%x\n",
1362                                 rf_reg_for_c_cut_2g[i],
1363                                 rf_reg_param_for_c_cut_2g[index][i],
1364                                 rf_reg_mask_for_c_cut_2g[i], path, index,
1365                                 rtl_get_rfreg(hw, (enum radio_path)path,
1366                                               rf_reg_for_c_cut_2g[i],
1367                                               RFREG_OFFSET_MASK));
1368                }
1369                RTPRINT(rtlpriv, FINIT, INIT_IQK,
1370                        "cosa ver 3 set RF-B, 2G, 0x28 = 0x%x !!\n",
1371                        rf_syn_g4_for_c_cut_2g | (u4tmp << 11));
1372
1373                rtl_set_rfreg(hw, (enum radio_path)path, RF_SYN_G4,
1374                              RFREG_OFFSET_MASK,
1375                              rf_syn_g4_for_c_cut_2g | (u4tmp << 11));
1376                if (need_pwr_down)
1377                        _rtl92d_phy_restore_rf_env(hw, path, &u4regvalue);
1378                if (rtlhal->during_mac0init_radiob)
1379                        rtl92d_phy_powerdown_anotherphy(hw, true);
1380        }
1381        RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD, "<====\n");
1382}
1383
1384u8 rtl92d_get_rightchnlplace_for_iqk(u8 chnl)
1385{
1386        u8 channel_all[59] = {
1387                1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
1388                36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58,
1389                60, 62, 64, 100, 102, 104, 106, 108, 110, 112,
1390                114, 116, 118, 120, 122, 124, 126, 128, 130,
1391                132, 134, 136, 138, 140, 149, 151, 153, 155,
1392                157, 159, 161, 163, 165
1393        };
1394        u8 place = chnl;
1395
1396        if (chnl > 14) {
1397                for (place = 14; place < sizeof(channel_all); place++) {
1398                        if (channel_all[place] == chnl)
1399                                return place - 13;
1400                }
1401        }
1402
1403        return 0;
1404}
1405
1406#define MAX_TOLERANCE           5
1407#define IQK_DELAY_TIME          1       /* ms */
1408#define MAX_TOLERANCE_92D       3
1409
1410/* bit0 = 1 => Tx OK, bit1 = 1 => Rx OK */
1411static u8 _rtl92d_phy_patha_iqk(struct ieee80211_hw *hw, bool configpathb)
1412{
1413        struct rtl_priv *rtlpriv = rtl_priv(hw);
1414        struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
1415        u32 regeac, rege94, rege9c, regea4;
1416        u8 result = 0;
1417
1418        RTPRINT(rtlpriv, FINIT, INIT_IQK,  "Path A IQK!\n");
1419        /* path-A IQK setting */
1420        RTPRINT(rtlpriv, FINIT, INIT_IQK,  "Path-A IQK setting!\n");
1421        if (rtlhal->interfaceindex == 0) {
1422                rtl_set_bbreg(hw, 0xe30, MASKDWORD, 0x10008c1f);
1423                rtl_set_bbreg(hw, 0xe34, MASKDWORD, 0x10008c1f);
1424        } else {
1425                rtl_set_bbreg(hw, 0xe30, MASKDWORD, 0x10008c22);
1426                rtl_set_bbreg(hw, 0xe34, MASKDWORD, 0x10008c22);
1427        }
1428        rtl_set_bbreg(hw, 0xe38, MASKDWORD, 0x82140102);
1429        rtl_set_bbreg(hw, 0xe3c, MASKDWORD, 0x28160206);
1430        /* path-B IQK setting */
1431        if (configpathb) {
1432                rtl_set_bbreg(hw, 0xe50, MASKDWORD, 0x10008c22);
1433                rtl_set_bbreg(hw, 0xe54, MASKDWORD, 0x10008c22);
1434                rtl_set_bbreg(hw, 0xe58, MASKDWORD, 0x82140102);
1435                rtl_set_bbreg(hw, 0xe5c, MASKDWORD, 0x28160206);
1436        }
1437        /* LO calibration setting */
1438        RTPRINT(rtlpriv, FINIT, INIT_IQK,  "LO calibration setting!\n");
1439        rtl_set_bbreg(hw, 0xe4c, MASKDWORD, 0x00462911);
1440        /* One shot, path A LOK & IQK */
1441        RTPRINT(rtlpriv, FINIT, INIT_IQK,  "One shot, path A LOK & IQK!\n");
1442        rtl_set_bbreg(hw, 0xe48, MASKDWORD, 0xf9000000);
1443        rtl_set_bbreg(hw, 0xe48, MASKDWORD, 0xf8000000);
1444        /* delay x ms */
1445        RTPRINT(rtlpriv, FINIT, INIT_IQK,
1446                "Delay %d ms for One shot, path A LOK & IQK\n",
1447                IQK_DELAY_TIME);
1448        mdelay(IQK_DELAY_TIME);
1449        /* Check failed */
1450        regeac = rtl_get_bbreg(hw, 0xeac, MASKDWORD);
1451        RTPRINT(rtlpriv, FINIT, INIT_IQK,  "0xeac = 0x%x\n", regeac);
1452        rege94 = rtl_get_bbreg(hw, 0xe94, MASKDWORD);
1453        RTPRINT(rtlpriv, FINIT, INIT_IQK,  "0xe94 = 0x%x\n", rege94);
1454        rege9c = rtl_get_bbreg(hw, 0xe9c, MASKDWORD);
1455        RTPRINT(rtlpriv, FINIT, INIT_IQK,  "0xe9c = 0x%x\n", rege9c);
1456        regea4 = rtl_get_bbreg(hw, 0xea4, MASKDWORD);
1457        RTPRINT(rtlpriv, FINIT, INIT_IQK,  "0xea4 = 0x%x\n", regea4);
1458        if (!(regeac & BIT(28)) && (((rege94 & 0x03FF0000) >> 16) != 0x142) &&
1459            (((rege9c & 0x03FF0000) >> 16) != 0x42))
1460                result |= 0x01;
1461        else                    /* if Tx not OK, ignore Rx */
1462                return result;
1463        /* if Tx is OK, check whether Rx is OK */
1464        if (!(regeac & BIT(27)) && (((regea4 & 0x03FF0000) >> 16) != 0x132) &&
1465            (((regeac & 0x03FF0000) >> 16) != 0x36))
1466                result |= 0x02;
1467        else
1468                RTPRINT(rtlpriv, FINIT, INIT_IQK,  "Path A Rx IQK fail!!\n");
1469        return result;
1470}
1471
1472/* bit0 = 1 => Tx OK, bit1 = 1 => Rx OK */
1473static u8 _rtl92d_phy_patha_iqk_5g_normal(struct ieee80211_hw *hw,
1474                                          bool configpathb)
1475{
1476        struct rtl_priv *rtlpriv = rtl_priv(hw);
1477        struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
1478        struct rtl_phy *rtlphy = &(rtlpriv->phy);
1479        u32 regeac, rege94, rege9c, regea4;
1480        u8 result = 0;
1481        u8 i;
1482        u8 retrycount = 2;
1483        u32 TxOKBit = BIT(28), RxOKBit = BIT(27);
1484
1485        if (rtlhal->interfaceindex == 1) {      /* PHY1 */
1486                TxOKBit = BIT(31);
1487                RxOKBit = BIT(30);
1488        }
1489        RTPRINT(rtlpriv, FINIT, INIT_IQK,  "Path A IQK!\n");
1490        /* path-A IQK setting */
1491        RTPRINT(rtlpriv, FINIT, INIT_IQK,  "Path-A IQK setting!\n");
1492        rtl_set_bbreg(hw, 0xe30, MASKDWORD, 0x18008c1f);
1493        rtl_set_bbreg(hw, 0xe34, MASKDWORD, 0x18008c1f);
1494        rtl_set_bbreg(hw, 0xe38, MASKDWORD, 0x82140307);
1495        rtl_set_bbreg(hw, 0xe3c, MASKDWORD, 0x68160960);
1496        /* path-B IQK setting */
1497        if (configpathb) {
1498                rtl_set_bbreg(hw, 0xe50, MASKDWORD, 0x18008c2f);
1499                rtl_set_bbreg(hw, 0xe54, MASKDWORD, 0x18008c2f);
1500                rtl_set_bbreg(hw, 0xe58, MASKDWORD, 0x82110000);
1501                rtl_set_bbreg(hw, 0xe5c, MASKDWORD, 0x68110000);
1502        }
1503        /* LO calibration setting */
1504        RTPRINT(rtlpriv, FINIT, INIT_IQK,  "LO calibration setting!\n");
1505        rtl_set_bbreg(hw, 0xe4c, MASKDWORD, 0x00462911);
1506        /* path-A PA on */
1507        rtl_set_bbreg(hw, RFPGA0_XAB_RFINTERFACESW, MASKDWORD, 0x07000f60);
1508        rtl_set_bbreg(hw, RFPGA0_XA_RFINTERFACEOE, MASKDWORD, 0x66e60e30);
1509        for (i = 0; i < retrycount; i++) {
1510                /* One shot, path A LOK & IQK */
1511                RTPRINT(rtlpriv, FINIT, INIT_IQK,
1512                        "One shot, path A LOK & IQK!\n");
1513                rtl_set_bbreg(hw, 0xe48, MASKDWORD, 0xf9000000);
1514                rtl_set_bbreg(hw, 0xe48, MASKDWORD, 0xf8000000);
1515                /* delay x ms */
1516                RTPRINT(rtlpriv, FINIT, INIT_IQK,
1517                        "Delay %d ms for One shot, path A LOK & IQK.\n",
1518                        IQK_DELAY_TIME);
1519                mdelay(IQK_DELAY_TIME * 10);
1520                /* Check failed */
1521                regeac = rtl_get_bbreg(hw, 0xeac, MASKDWORD);
1522                RTPRINT(rtlpriv, FINIT, INIT_IQK,  "0xeac = 0x%x\n", regeac);
1523                rege94 = rtl_get_bbreg(hw, 0xe94, MASKDWORD);
1524                RTPRINT(rtlpriv, FINIT, INIT_IQK,  "0xe94 = 0x%x\n", rege94);
1525                rege9c = rtl_get_bbreg(hw, 0xe9c, MASKDWORD);
1526                RTPRINT(rtlpriv, FINIT, INIT_IQK,  "0xe9c = 0x%x\n", rege9c);
1527                regea4 = rtl_get_bbreg(hw, 0xea4, MASKDWORD);
1528                RTPRINT(rtlpriv, FINIT, INIT_IQK,  "0xea4 = 0x%x\n", regea4);
1529                if (!(regeac & TxOKBit) &&
1530                     (((rege94 & 0x03FF0000) >> 16) != 0x142)) {
1531                        result |= 0x01;
1532                } else { /* if Tx not OK, ignore Rx */
1533                        RTPRINT(rtlpriv, FINIT, INIT_IQK,
1534                                "Path A Tx IQK fail!!\n");
1535                        continue;
1536                }
1537
1538                /* if Tx is OK, check whether Rx is OK */
1539                if (!(regeac & RxOKBit) &&
1540                    (((regea4 & 0x03FF0000) >> 16) != 0x132)) {
1541                        result |= 0x02;
1542                        break;
1543                } else {
1544                        RTPRINT(rtlpriv, FINIT, INIT_IQK,
1545                                "Path A Rx IQK fail!!\n");
1546                }
1547        }
1548        /* path A PA off */
1549        rtl_set_bbreg(hw, RFPGA0_XAB_RFINTERFACESW, MASKDWORD,
1550                      rtlphy->iqk_bb_backup[0]);
1551        rtl_set_bbreg(hw, RFPGA0_XA_RFINTERFACEOE, MASKDWORD,
1552                      rtlphy->iqk_bb_backup[1]);
1553        return result;
1554}
1555
1556/* bit0 = 1 => Tx OK, bit1 = 1 => Rx OK */
1557static u8 _rtl92d_phy_pathb_iqk(struct ieee80211_hw *hw)
1558{
1559        struct rtl_priv *rtlpriv = rtl_priv(hw);
1560        u32 regeac, regeb4, regebc, regec4, regecc;
1561        u8 result = 0;
1562
1563        RTPRINT(rtlpriv, FINIT, INIT_IQK,  "Path B IQK!\n");
1564        /* One shot, path B LOK & IQK */
1565        RTPRINT(rtlpriv, FINIT, INIT_IQK,  "One shot, path A LOK & IQK!\n");
1566        rtl_set_bbreg(hw, 0xe60, MASKDWORD, 0x00000002);
1567        rtl_set_bbreg(hw, 0xe60, MASKDWORD, 0x00000000);
1568        /* delay x ms  */
1569        RTPRINT(rtlpriv, FINIT, INIT_IQK,
1570                "Delay %d ms for One shot, path B LOK & IQK\n", IQK_DELAY_TIME);
1571        mdelay(IQK_DELAY_TIME);
1572        /* Check failed */
1573        regeac = rtl_get_bbreg(hw, 0xeac, MASKDWORD);
1574        RTPRINT(rtlpriv, FINIT, INIT_IQK,  "0xeac = 0x%x\n", regeac);
1575        regeb4 = rtl_get_bbreg(hw, 0xeb4, MASKDWORD);
1576        RTPRINT(rtlpriv, FINIT, INIT_IQK,  "0xeb4 = 0x%x\n", regeb4);
1577        regebc = rtl_get_bbreg(hw, 0xebc, MASKDWORD);
1578        RTPRINT(rtlpriv, FINIT, INIT_IQK,  "0xebc = 0x%x\n", regebc);
1579        regec4 = rtl_get_bbreg(hw, 0xec4, MASKDWORD);
1580        RTPRINT(rtlpriv, FINIT, INIT_IQK,  "0xec4 = 0x%x\n", regec4);
1581        regecc = rtl_get_bbreg(hw, 0xecc, MASKDWORD);
1582        RTPRINT(rtlpriv, FINIT, INIT_IQK,  "0xecc = 0x%x\n", regecc);
1583        if (!(regeac & BIT(31)) && (((regeb4 & 0x03FF0000) >> 16) != 0x142) &&
1584            (((regebc & 0x03FF0000) >> 16) != 0x42))
1585                result |= 0x01;
1586        else
1587                return result;
1588        if (!(regeac & BIT(30)) && (((regec4 & 0x03FF0000) >> 16) != 0x132) &&
1589            (((regecc & 0x03FF0000) >> 16) != 0x36))
1590                result |= 0x02;
1591        else
1592                RTPRINT(rtlpriv, FINIT, INIT_IQK,  "Path B Rx IQK fail!!\n");
1593        return result;
1594}
1595
1596/* bit0 = 1 => Tx OK, bit1 = 1 => Rx OK */
1597static u8 _rtl92d_phy_pathb_iqk_5g_normal(struct ieee80211_hw *hw)
1598{
1599        struct rtl_priv *rtlpriv = rtl_priv(hw);
1600        struct rtl_phy *rtlphy = &(rtlpriv->phy);
1601        u32 regeac, regeb4, regebc, regec4, regecc;
1602        u8 result = 0;
1603        u8 i;
1604        u8 retrycount = 2;
1605
1606        RTPRINT(rtlpriv, FINIT, INIT_IQK,  "Path B IQK!\n");
1607        /* path-A IQK setting */
1608        RTPRINT(rtlpriv, FINIT, INIT_IQK,  "Path-A IQK setting!\n");
1609        rtl_set_bbreg(hw, 0xe30, MASKDWORD, 0x18008c1f);
1610        rtl_set_bbreg(hw, 0xe34, MASKDWORD, 0x18008c1f);
1611        rtl_set_bbreg(hw, 0xe38, MASKDWORD, 0x82110000);
1612        rtl_set_bbreg(hw, 0xe3c, MASKDWORD, 0x68110000);
1613
1614        /* path-B IQK setting */
1615        rtl_set_bbreg(hw, 0xe50, MASKDWORD, 0x18008c2f);
1616        rtl_set_bbreg(hw, 0xe54, MASKDWORD, 0x18008c2f);
1617        rtl_set_bbreg(hw, 0xe58, MASKDWORD, 0x82140307);
1618        rtl_set_bbreg(hw, 0xe5c, MASKDWORD, 0x68160960);
1619
1620        /* LO calibration setting */
1621        RTPRINT(rtlpriv, FINIT, INIT_IQK,  "LO calibration setting!\n");
1622        rtl_set_bbreg(hw, 0xe4c, MASKDWORD, 0x00462911);
1623
1624        /* path-B PA on */
1625        rtl_set_bbreg(hw, RFPGA0_XAB_RFINTERFACESW, MASKDWORD, 0x0f600700);
1626        rtl_set_bbreg(hw, RFPGA0_XB_RFINTERFACEOE, MASKDWORD, 0x061f0d30);
1627
1628        for (i = 0; i < retrycount; i++) {
1629                /* One shot, path B LOK & IQK */
1630                RTPRINT(rtlpriv, FINIT, INIT_IQK,
1631                        "One shot, path A LOK & IQK!\n");
1632                rtl_set_bbreg(hw, 0xe48, MASKDWORD, 0xfa000000);
1633                rtl_set_bbreg(hw, 0xe48, MASKDWORD, 0xf8000000);
1634
1635                /* delay x ms */
1636                RTPRINT(rtlpriv, FINIT, INIT_IQK,
1637                        "Delay %d ms for One shot, path B LOK & IQK.\n", 10);
1638                mdelay(IQK_DELAY_TIME * 10);
1639
1640                /* Check failed */
1641                regeac = rtl_get_bbreg(hw, 0xeac, MASKDWORD);
1642                RTPRINT(rtlpriv, FINIT, INIT_IQK,  "0xeac = 0x%x\n", regeac);
1643                regeb4 = rtl_get_bbreg(hw, 0xeb4, MASKDWORD);
1644                RTPRINT(rtlpriv, FINIT, INIT_IQK,  "0xeb4 = 0x%x\n", regeb4);
1645                regebc = rtl_get_bbreg(hw, 0xebc, MASKDWORD);
1646                RTPRINT(rtlpriv, FINIT, INIT_IQK,  "0xebc = 0x%x\n", regebc);
1647                regec4 = rtl_get_bbreg(hw, 0xec4, MASKDWORD);
1648                RTPRINT(rtlpriv, FINIT, INIT_IQK,  "0xec4 = 0x%x\n", regec4);
1649                regecc = rtl_get_bbreg(hw, 0xecc, MASKDWORD);
1650                RTPRINT(rtlpriv, FINIT, INIT_IQK,  "0xecc = 0x%x\n", regecc);
1651                if (!(regeac & BIT(31)) &&
1652                    (((regeb4 & 0x03FF0000) >> 16) != 0x142))
1653                        result |= 0x01;
1654                else
1655                        continue;
1656                if (!(regeac & BIT(30)) &&
1657                    (((regec4 & 0x03FF0000) >> 16) != 0x132)) {
1658                        result |= 0x02;
1659                        break;
1660                } else {
1661                        RTPRINT(rtlpriv, FINIT, INIT_IQK,
1662                                "Path B Rx IQK fail!!\n");
1663                }
1664        }
1665
1666        /* path B PA off */
1667        rtl_set_bbreg(hw, RFPGA0_XAB_RFINTERFACESW, MASKDWORD,
1668                      rtlphy->iqk_bb_backup[0]);
1669        rtl_set_bbreg(hw, RFPGA0_XB_RFINTERFACEOE, MASKDWORD,
1670                      rtlphy->iqk_bb_backup[2]);
1671        return result;
1672}
1673
1674static void _rtl92d_phy_save_adda_registers(struct ieee80211_hw *hw,
1675                                            u32 *adda_reg, u32 *adda_backup,
1676                                            u32 regnum)
1677{
1678        struct rtl_priv *rtlpriv = rtl_priv(hw);
1679        u32 i;
1680
1681        RTPRINT(rtlpriv, FINIT, INIT_IQK,  "Save ADDA parameters.\n");
1682        for (i = 0; i < regnum; i++)
1683                adda_backup[i] = rtl_get_bbreg(hw, adda_reg[i], MASKDWORD);
1684}
1685
1686static void _rtl92d_phy_save_mac_registers(struct ieee80211_hw *hw,
1687        u32 *macreg, u32 *macbackup)
1688{
1689        struct rtl_priv *rtlpriv = rtl_priv(hw);
1690        u32 i;
1691
1692        RTPRINT(rtlpriv, FINIT, INIT_IQK,  "Save MAC parameters.\n");
1693        for (i = 0; i < (IQK_MAC_REG_NUM - 1); i++)
1694                macbackup[i] = rtl_read_byte(rtlpriv, macreg[i]);
1695        macbackup[i] = rtl_read_dword(rtlpriv, macreg[i]);
1696}
1697
1698static void _rtl92d_phy_reload_adda_registers(struct ieee80211_hw *hw,
1699                                              u32 *adda_reg, u32 *adda_backup,
1700                                              u32 regnum)
1701{
1702        struct rtl_priv *rtlpriv = rtl_priv(hw);
1703        u32 i;
1704
1705        RTPRINT(rtlpriv, FINIT, INIT_IQK,
1706                "Reload ADDA power saving parameters !\n");
1707        for (i = 0; i < regnum; i++)
1708                rtl_set_bbreg(hw, adda_reg[i], MASKDWORD, adda_backup[i]);
1709}
1710
1711static void _rtl92d_phy_reload_mac_registers(struct ieee80211_hw *hw,
1712                                             u32 *macreg, u32 *macbackup)
1713{
1714        struct rtl_priv *rtlpriv = rtl_priv(hw);
1715        u32 i;
1716
1717        RTPRINT(rtlpriv, FINIT, INIT_IQK,  "Reload MAC parameters !\n");
1718        for (i = 0; i < (IQK_MAC_REG_NUM - 1); i++)
1719                rtl_write_byte(rtlpriv, macreg[i], (u8) macbackup[i]);
1720        rtl_write_byte(rtlpriv, macreg[i], macbackup[i]);
1721}
1722
1723static void _rtl92d_phy_path_adda_on(struct ieee80211_hw *hw,
1724                u32 *adda_reg, bool patha_on, bool is2t)
1725{
1726        struct rtl_priv *rtlpriv = rtl_priv(hw);
1727        u32 pathon;
1728        u32 i;
1729
1730        RTPRINT(rtlpriv, FINIT, INIT_IQK,  "ADDA ON.\n");
1731        pathon = patha_on ? 0x04db25a4 : 0x0b1b25a4;
1732        if (patha_on)
1733                pathon = rtlpriv->rtlhal.interfaceindex == 0 ?
1734                    0x04db25a4 : 0x0b1b25a4;
1735        for (i = 0; i < IQK_ADDA_REG_NUM; i++)
1736                rtl_set_bbreg(hw, adda_reg[i], MASKDWORD, pathon);
1737}
1738
1739static void _rtl92d_phy_mac_setting_calibration(struct ieee80211_hw *hw,
1740                                                u32 *macreg, u32 *macbackup)
1741{
1742        struct rtl_priv *rtlpriv = rtl_priv(hw);
1743        u32 i;
1744
1745        RTPRINT(rtlpriv, FINIT, INIT_IQK,  "MAC settings for Calibration.\n");
1746        rtl_write_byte(rtlpriv, macreg[0], 0x3F);
1747
1748        for (i = 1; i < (IQK_MAC_REG_NUM - 1); i++)
1749                rtl_write_byte(rtlpriv, macreg[i], (u8)(macbackup[i] &
1750                               (~BIT(3))));
1751        rtl_write_byte(rtlpriv, macreg[i], (u8) (macbackup[i] & (~BIT(5))));
1752}
1753
1754static void _rtl92d_phy_patha_standby(struct ieee80211_hw *hw)
1755{
1756        struct rtl_priv *rtlpriv = rtl_priv(hw);
1757        RTPRINT(rtlpriv, FINIT, INIT_IQK,  "Path-A standby mode!\n");
1758
1759        rtl_set_bbreg(hw, 0xe28, MASKDWORD, 0x0);
1760        rtl_set_bbreg(hw, RFPGA0_XA_LSSIPARAMETER, MASKDWORD, 0x00010000);
1761        rtl_set_bbreg(hw, 0xe28, MASKDWORD, 0x80800000);
1762}
1763
1764static void _rtl92d_phy_pimode_switch(struct ieee80211_hw *hw, bool pi_mode)
1765{
1766        struct rtl_priv *rtlpriv = rtl_priv(hw);
1767        u32 mode;
1768
1769        RTPRINT(rtlpriv, FINIT, INIT_IQK,
1770                "BB Switch to %s mode!\n", pi_mode ? "PI" : "SI");
1771        mode = pi_mode ? 0x01000100 : 0x01000000;
1772        rtl_set_bbreg(hw, 0x820, MASKDWORD, mode);
1773        rtl_set_bbreg(hw, 0x828, MASKDWORD, mode);
1774}
1775
1776static void _rtl92d_phy_iq_calibrate(struct ieee80211_hw *hw, long result[][8],
1777                                     u8 t, bool is2t)
1778{
1779        struct rtl_priv *rtlpriv = rtl_priv(hw);
1780        struct rtl_phy *rtlphy = &(rtlpriv->phy);
1781        u32 i;
1782        u8 patha_ok, pathb_ok;
1783        static u32 adda_reg[IQK_ADDA_REG_NUM] = {
1784                RFPGA0_XCD_SWITCHCONTROL, 0xe6c, 0xe70, 0xe74,
1785                0xe78, 0xe7c, 0xe80, 0xe84,
1786                0xe88, 0xe8c, 0xed0, 0xed4,
1787                0xed8, 0xedc, 0xee0, 0xeec
1788        };
1789        static u32 iqk_mac_reg[IQK_MAC_REG_NUM] = {
1790                0x522, 0x550, 0x551, 0x040
1791        };
1792        static u32 iqk_bb_reg[IQK_BB_REG_NUM] = {
1793                RFPGA0_XAB_RFINTERFACESW, RFPGA0_XA_RFINTERFACEOE,
1794                RFPGA0_XB_RFINTERFACEOE, ROFDM0_TRMUXPAR,
1795                RFPGA0_XCD_RFINTERFACESW, ROFDM0_TRXPATHENABLE,
1796                RFPGA0_RFMOD, RFPGA0_ANALOGPARAMETER4,
1797                ROFDM0_XAAGCCORE1, ROFDM0_XBAGCCORE1
1798        };
1799        const u32 retrycount = 2;
1800        u32 bbvalue;
1801
1802        RTPRINT(rtlpriv, FINIT, INIT_IQK,  "IQK for 2.4G :Start!!!\n");
1803        if (t == 0) {
1804                bbvalue = rtl_get_bbreg(hw, RFPGA0_RFMOD, MASKDWORD);
1805                RTPRINT(rtlpriv, FINIT, INIT_IQK,  "==>0x%08x\n", bbvalue);
1806                RTPRINT(rtlpriv, FINIT, INIT_IQK, "IQ Calibration for %s\n",
1807                        is2t ? "2T2R" : "1T1R");
1808
1809                /*  Save ADDA parameters, turn Path A ADDA on */
1810                _rtl92d_phy_save_adda_registers(hw, adda_reg,
1811                        rtlphy->adda_backup, IQK_ADDA_REG_NUM);
1812                _rtl92d_phy_save_mac_registers(hw, iqk_mac_reg,
1813                        rtlphy->iqk_mac_backup);
1814                _rtl92d_phy_save_adda_registers(hw, iqk_bb_reg,
1815                        rtlphy->iqk_bb_backup, IQK_BB_REG_NUM);
1816        }
1817        _rtl92d_phy_path_adda_on(hw, adda_reg, true, is2t);
1818        if (t == 0)
1819                rtlphy->rfpi_enable = (u8) rtl_get_bbreg(hw,
1820                                RFPGA0_XA_HSSIPARAMETER1, BIT(8));
1821
1822        /*  Switch BB to PI mode to do IQ Calibration. */
1823        if (!rtlphy->rfpi_enable)
1824                _rtl92d_phy_pimode_switch(hw, true);
1825
1826        rtl_set_bbreg(hw, RFPGA0_RFMOD, BIT(24), 0x00);
1827        rtl_set_bbreg(hw, ROFDM0_TRXPATHENABLE, MASKDWORD, 0x03a05600);
1828        rtl_set_bbreg(hw, ROFDM0_TRMUXPAR, MASKDWORD, 0x000800e4);
1829        rtl_set_bbreg(hw, RFPGA0_XCD_RFINTERFACESW, MASKDWORD, 0x22204000);
1830        rtl_set_bbreg(hw, RFPGA0_ANALOGPARAMETER4, 0xf00000, 0x0f);
1831        if (is2t) {
1832                rtl_set_bbreg(hw, RFPGA0_XA_LSSIPARAMETER, MASKDWORD,
1833                              0x00010000);
1834                rtl_set_bbreg(hw, RFPGA0_XB_LSSIPARAMETER, MASKDWORD,
1835                              0x00010000);
1836        }
1837        /* MAC settings */
1838        _rtl92d_phy_mac_setting_calibration(hw, iqk_mac_reg,
1839                                            rtlphy->iqk_mac_backup);
1840        /* Page B init */
1841        rtl_set_bbreg(hw, 0xb68, MASKDWORD, 0x0f600000);
1842        if (is2t)
1843                rtl_set_bbreg(hw, 0xb6c, MASKDWORD, 0x0f600000);
1844        /* IQ calibration setting */
1845        RTPRINT(rtlpriv, FINIT, INIT_IQK,  "IQK setting!\n");
1846        rtl_set_bbreg(hw, 0xe28, MASKDWORD, 0x80800000);
1847        rtl_set_bbreg(hw, 0xe40, MASKDWORD, 0x01007c00);
1848        rtl_set_bbreg(hw, 0xe44, MASKDWORD, 0x01004800);
1849        for (i = 0; i < retrycount; i++) {
1850                patha_ok = _rtl92d_phy_patha_iqk(hw, is2t);
1851                if (patha_ok == 0x03) {
1852                        RTPRINT(rtlpriv, FINIT, INIT_IQK,
1853                                "Path A IQK Success!!\n");
1854                        result[t][0] = (rtl_get_bbreg(hw, 0xe94, MASKDWORD) &
1855                                        0x3FF0000) >> 16;
1856                        result[t][1] = (rtl_get_bbreg(hw, 0xe9c, MASKDWORD) &
1857                                        0x3FF0000) >> 16;
1858                        result[t][2] = (rtl_get_bbreg(hw, 0xea4, MASKDWORD) &
1859                                        0x3FF0000) >> 16;
1860                        result[t][3] = (rtl_get_bbreg(hw, 0xeac, MASKDWORD) &
1861                                        0x3FF0000) >> 16;
1862                        break;
1863                } else if (i == (retrycount - 1) && patha_ok == 0x01) {
1864                        /* Tx IQK OK */
1865                        RTPRINT(rtlpriv, FINIT, INIT_IQK,
1866                                "Path A IQK Only  Tx Success!!\n");
1867
1868                        result[t][0] = (rtl_get_bbreg(hw, 0xe94, MASKDWORD) &
1869                                        0x3FF0000) >> 16;
1870                        result[t][1] = (rtl_get_bbreg(hw, 0xe9c, MASKDWORD) &
1871                                        0x3FF0000) >> 16;
1872                }
1873        }
1874        if (0x00 == patha_ok)
1875                RTPRINT(rtlpriv, FINIT, INIT_IQK,  "Path A IQK failed!!\n");
1876        if (is2t) {
1877                _rtl92d_phy_patha_standby(hw);
1878                /* Turn Path B ADDA on */
1879                _rtl92d_phy_path_adda_on(hw, adda_reg, false, is2t);
1880                for (i = 0; i < retrycount; i++) {
1881                        pathb_ok = _rtl92d_phy_pathb_iqk(hw);
1882                        if (pathb_ok == 0x03) {
1883                                RTPRINT(rtlpriv, FINIT, INIT_IQK,
1884                                        "Path B IQK Success!!\n");
1885                                result[t][4] = (rtl_get_bbreg(hw, 0xeb4,
1886                                               MASKDWORD) & 0x3FF0000) >> 16;
1887                                result[t][5] = (rtl_get_bbreg(hw, 0xebc,
1888                                               MASKDWORD) & 0x3FF0000) >> 16;
1889                                result[t][6] = (rtl_get_bbreg(hw, 0xec4,
1890                                               MASKDWORD) & 0x3FF0000) >> 16;
1891                                result[t][7] = (rtl_get_bbreg(hw, 0xecc,
1892                                               MASKDWORD) & 0x3FF0000) >> 16;
1893                                break;
1894                        } else if (i == (retrycount - 1) && pathb_ok == 0x01) {
1895                                /* Tx IQK OK */
1896                                RTPRINT(rtlpriv, FINIT, INIT_IQK,
1897                                        "Path B Only Tx IQK Success!!\n");
1898                                result[t][4] = (rtl_get_bbreg(hw, 0xeb4,
1899                                               MASKDWORD) & 0x3FF0000) >> 16;
1900                                result[t][5] = (rtl_get_bbreg(hw, 0xebc,
1901                                               MASKDWORD) & 0x3FF0000) >> 16;
1902                        }
1903                }
1904                if (0x00 == pathb_ok)
1905                        RTPRINT(rtlpriv, FINIT, INIT_IQK,
1906                                "Path B IQK failed!!\n");
1907        }
1908
1909        /* Back to BB mode, load original value */
1910        RTPRINT(rtlpriv, FINIT, INIT_IQK,
1911                "IQK:Back to BB mode, load original value!\n");
1912
1913        rtl_set_bbreg(hw, 0xe28, MASKDWORD, 0);
1914        if (t != 0) {
1915                /* Switch back BB to SI mode after finish IQ Calibration. */
1916                if (!rtlphy->rfpi_enable)
1917                        _rtl92d_phy_pimode_switch(hw, false);
1918                /* Reload ADDA power saving parameters */
1919                _rtl92d_phy_reload_adda_registers(hw, adda_reg,
1920                                rtlphy->adda_backup, IQK_ADDA_REG_NUM);
1921                /* Reload MAC parameters */
1922                _rtl92d_phy_reload_mac_registers(hw, iqk_mac_reg,
1923                                        rtlphy->iqk_mac_backup);
1924                if (is2t)
1925                        _rtl92d_phy_reload_adda_registers(hw, iqk_bb_reg,
1926                                                          rtlphy->iqk_bb_backup,
1927                                                          IQK_BB_REG_NUM);
1928                else
1929                        _rtl92d_phy_reload_adda_registers(hw, iqk_bb_reg,
1930                                                          rtlphy->iqk_bb_backup,
1931                                                          IQK_BB_REG_NUM - 1);
1932                /* load 0xe30 IQC default value */
1933                rtl_set_bbreg(hw, 0xe30, MASKDWORD, 0x01008c00);
1934                rtl_set_bbreg(hw, 0xe34, MASKDWORD, 0x01008c00);
1935        }
1936        RTPRINT(rtlpriv, FINIT, INIT_IQK,  "<==\n");
1937}
1938
1939static void _rtl92d_phy_iq_calibrate_5g_normal(struct ieee80211_hw *hw,
1940                                               long result[][8], u8 t)
1941{
1942        struct rtl_priv *rtlpriv = rtl_priv(hw);
1943        struct rtl_phy *rtlphy = &(rtlpriv->phy);
1944        struct rtl_hal *rtlhal = &(rtlpriv->rtlhal);
1945        u8 patha_ok, pathb_ok;
1946        static u32 adda_reg[IQK_ADDA_REG_NUM] = {
1947                RFPGA0_XCD_SWITCHCONTROL, 0xe6c, 0xe70, 0xe74,
1948                0xe78, 0xe7c, 0xe80, 0xe84,
1949                0xe88, 0xe8c, 0xed0, 0xed4,
1950                0xed8, 0xedc, 0xee0, 0xeec
1951        };
1952        static u32 iqk_mac_reg[IQK_MAC_REG_NUM] = {
1953                0x522, 0x550, 0x551, 0x040
1954        };
1955        static u32 iqk_bb_reg[IQK_BB_REG_NUM] = {
1956                RFPGA0_XAB_RFINTERFACESW, RFPGA0_XA_RFINTERFACEOE,
1957                RFPGA0_XB_RFINTERFACEOE, ROFDM0_TRMUXPAR,
1958                RFPGA0_XCD_RFINTERFACESW, ROFDM0_TRXPATHENABLE,
1959                RFPGA0_RFMOD, RFPGA0_ANALOGPARAMETER4,
1960                ROFDM0_XAAGCCORE1, ROFDM0_XBAGCCORE1
1961        };
1962        u32 bbvalue;
1963        bool is2t = IS_92D_SINGLEPHY(rtlhal->version);
1964
1965        /* Note: IQ calibration must be performed after loading
1966         * PHY_REG.txt , and radio_a, radio_b.txt */
1967
1968        RTPRINT(rtlpriv, FINIT, INIT_IQK,  "IQK for 5G NORMAL:Start!!!\n");
1969        mdelay(IQK_DELAY_TIME * 20);
1970        if (t == 0) {
1971                bbvalue = rtl_get_bbreg(hw, RFPGA0_RFMOD, MASKDWORD);
1972                RTPRINT(rtlpriv, FINIT, INIT_IQK,  "==>0x%08x\n", bbvalue);
1973                RTPRINT(rtlpriv, FINIT, INIT_IQK, "IQ Calibration for %s\n",
1974                        is2t ? "2T2R" : "1T1R");
1975                /* Save ADDA parameters, turn Path A ADDA on */
1976                _rtl92d_phy_save_adda_registers(hw, adda_reg,
1977                                                rtlphy->adda_backup,
1978                                                IQK_ADDA_REG_NUM);
1979                _rtl92d_phy_save_mac_registers(hw, iqk_mac_reg,
1980                                               rtlphy->iqk_mac_backup);
1981                if (is2t)
1982                        _rtl92d_phy_save_adda_registers(hw, iqk_bb_reg,
1983                                                        rtlphy->iqk_bb_backup,
1984                                                        IQK_BB_REG_NUM);
1985                else
1986                        _rtl92d_phy_save_adda_registers(hw, iqk_bb_reg,
1987                                                        rtlphy->iqk_bb_backup,
1988                                                        IQK_BB_REG_NUM - 1);
1989        }
1990        _rtl92d_phy_path_adda_on(hw, adda_reg, true, is2t);
1991        /* MAC settings */
1992        _rtl92d_phy_mac_setting_calibration(hw, iqk_mac_reg,
1993                        rtlphy->iqk_mac_backup);
1994        if (t == 0)
1995                rtlphy->rfpi_enable = (u8) rtl_get_bbreg(hw,
1996                        RFPGA0_XA_HSSIPARAMETER1, BIT(8));
1997        /*  Switch BB to PI mode to do IQ Calibration. */
1998        if (!rtlphy->rfpi_enable)
1999                _rtl92d_phy_pimode_switch(hw, true);
2000        rtl_set_bbreg(hw, RFPGA0_RFMOD, BIT(24), 0x00);
2001        rtl_set_bbreg(hw, ROFDM0_TRXPATHENABLE, MASKDWORD, 0x03a05600);
2002        rtl_set_bbreg(hw, ROFDM0_TRMUXPAR, MASKDWORD, 0x000800e4);
2003        rtl_set_bbreg(hw, RFPGA0_XCD_RFINTERFACESW, MASKDWORD, 0x22208000);
2004        rtl_set_bbreg(hw, RFPGA0_ANALOGPARAMETER4, 0xf00000, 0x0f);
2005
2006        /* Page B init */
2007        rtl_set_bbreg(hw, 0xb68, MASKDWORD, 0x0f600000);
2008        if (is2t)
2009                rtl_set_bbreg(hw, 0xb6c, MASKDWORD, 0x0f600000);
2010        /* IQ calibration setting  */
2011        RTPRINT(rtlpriv, FINIT, INIT_IQK,  "IQK setting!\n");
2012        rtl_set_bbreg(hw, 0xe28, MASKDWORD, 0x80800000);
2013        rtl_set_bbreg(hw, 0xe40, MASKDWORD, 0x10007c00);
2014        rtl_set_bbreg(hw, 0xe44, MASKDWORD, 0x01004800);
2015        patha_ok = _rtl92d_phy_patha_iqk_5g_normal(hw, is2t);
2016        if (patha_ok == 0x03) {
2017                RTPRINT(rtlpriv, FINIT, INIT_IQK,  "Path A IQK Success!!\n");
2018                result[t][0] = (rtl_get_bbreg(hw, 0xe94, MASKDWORD) &
2019                                0x3FF0000) >> 16;
2020                result[t][1] = (rtl_get_bbreg(hw, 0xe9c, MASKDWORD) &
2021                                0x3FF0000) >> 16;
2022                result[t][2] = (rtl_get_bbreg(hw, 0xea4, MASKDWORD) &
2023                                0x3FF0000) >> 16;
2024                result[t][3] = (rtl_get_bbreg(hw, 0xeac, MASKDWORD) &
2025                                0x3FF0000) >> 16;
2026        } else if (patha_ok == 0x01) {  /* Tx IQK OK */
2027                RTPRINT(rtlpriv, FINIT, INIT_IQK,
2028                        "Path A IQK Only  Tx Success!!\n");
2029
2030                result[t][0] = (rtl_get_bbreg(hw, 0xe94, MASKDWORD) &
2031                                0x3FF0000) >> 16;
2032                result[t][1] = (rtl_get_bbreg(hw, 0xe9c, MASKDWORD) &
2033                                0x3FF0000) >> 16;
2034        } else {
2035                RTPRINT(rtlpriv, FINIT, INIT_IQK,  "Path A IQK Fail!!\n");
2036        }
2037        if (is2t) {
2038                /* _rtl92d_phy_patha_standby(hw); */
2039                /* Turn Path B ADDA on  */
2040                _rtl92d_phy_path_adda_on(hw, adda_reg, false, is2t);
2041                pathb_ok = _rtl92d_phy_pathb_iqk_5g_normal(hw);
2042                if (pathb_ok == 0x03) {
2043                        RTPRINT(rtlpriv, FINIT, INIT_IQK,
2044                                "Path B IQK Success!!\n");
2045                        result[t][4] = (rtl_get_bbreg(hw, 0xeb4, MASKDWORD) &
2046                             0x3FF0000) >> 16;
2047                        result[t][5] = (rtl_get_bbreg(hw, 0xebc, MASKDWORD) &
2048                             0x3FF0000) >> 16;
2049                        result[t][6] = (rtl_get_bbreg(hw, 0xec4, MASKDWORD) &
2050                             0x3FF0000) >> 16;
2051                        result[t][7] = (rtl_get_bbreg(hw, 0xecc, MASKDWORD) &
2052                             0x3FF0000) >> 16;
2053                } else if (pathb_ok == 0x01) { /* Tx IQK OK */
2054                        RTPRINT(rtlpriv, FINIT, INIT_IQK,
2055                                "Path B Only Tx IQK Success!!\n");
2056                        result[t][4] = (rtl_get_bbreg(hw, 0xeb4, MASKDWORD) &
2057                             0x3FF0000) >> 16;
2058                        result[t][5] = (rtl_get_bbreg(hw, 0xebc, MASKDWORD) &
2059                             0x3FF0000) >> 16;
2060                } else {
2061                        RTPRINT(rtlpriv, FINIT, INIT_IQK,
2062                                "Path B IQK failed!!\n");
2063                }
2064        }
2065
2066        /* Back to BB mode, load original value */
2067        RTPRINT(rtlpriv, FINIT, INIT_IQK,
2068                "IQK:Back to BB mode, load original value!\n");
2069        rtl_set_bbreg(hw, 0xe28, MASKDWORD, 0);
2070        if (t != 0) {
2071                if (is2t)
2072                        _rtl92d_phy_reload_adda_registers(hw, iqk_bb_reg,
2073                                                          rtlphy->iqk_bb_backup,
2074                                                          IQK_BB_REG_NUM);
2075                else
2076                        _rtl92d_phy_reload_adda_registers(hw, iqk_bb_reg,
2077                                                          rtlphy->iqk_bb_backup,
2078                                                          IQK_BB_REG_NUM - 1);
2079                /* Reload MAC parameters */
2080                _rtl92d_phy_reload_mac_registers(hw, iqk_mac_reg,
2081                                rtlphy->iqk_mac_backup);
2082                /*  Switch back BB to SI mode after finish IQ Calibration. */
2083                if (!rtlphy->rfpi_enable)
2084                        _rtl92d_phy_pimode_switch(hw, false);
2085                /* Reload ADDA power saving parameters */
2086                _rtl92d_phy_reload_adda_registers(hw, adda_reg,
2087                                                  rtlphy->adda_backup,
2088                                                  IQK_ADDA_REG_NUM);
2089        }
2090        RTPRINT(rtlpriv, FINIT, INIT_IQK,  "<==\n");
2091}
2092
2093static bool _rtl92d_phy_simularity_compare(struct ieee80211_hw *hw,
2094        long result[][8], u8 c1, u8 c2)
2095{
2096        struct rtl_priv *rtlpriv = rtl_priv(hw);
2097        struct rtl_hal *rtlhal = &(rtlpriv->rtlhal);
2098        u32 i, j, diff, sim_bitmap, bound;
2099        u8 final_candidate[2] = {0xFF, 0xFF};   /* for path A and path B */
2100        bool bresult = true;
2101        bool is2t = IS_92D_SINGLEPHY(rtlhal->version);
2102
2103        if (is2t)
2104                bound = 8;
2105        else
2106                bound = 4;
2107        sim_bitmap = 0;
2108        for (i = 0; i < bound; i++) {
2109                diff = (result[c1][i] > result[c2][i]) ? (result[c1][i] -
2110                       result[c2][i]) : (result[c2][i] - result[c1][i]);
2111                if (diff > MAX_TOLERANCE_92D) {
2112                        if ((i == 2 || i == 6) && !sim_bitmap) {
2113                                if (result[c1][i] + result[c1][i + 1] == 0)
2114                                        final_candidate[(i / 4)] = c2;
2115                                else if (result[c2][i] + result[c2][i + 1] == 0)
2116                                        final_candidate[(i / 4)] = c1;
2117                                else
2118                                        sim_bitmap = sim_bitmap | (1 << i);
2119                        } else {
2120                                sim_bitmap = sim_bitmap | (1 << i);
2121                        }
2122                }
2123        }
2124        if (sim_bitmap == 0) {
2125                for (i = 0; i < (bound / 4); i++) {
2126                        if (final_candidate[i] != 0xFF) {
2127                                for (j = i * 4; j < (i + 1) * 4 - 2; j++)
2128                                        result[3][j] =
2129                                                 result[final_candidate[i]][j];
2130                                bresult = false;
2131                        }
2132                }
2133                return bresult;
2134        }
2135        if (!(sim_bitmap & 0x0F)) { /* path A OK */
2136                for (i = 0; i < 4; i++)
2137                        result[3][i] = result[c1][i];
2138        } else if (!(sim_bitmap & 0x03)) { /* path A, Tx OK */
2139                for (i = 0; i < 2; i++)
2140                        result[3][i] = result[c1][i];
2141        }
2142        if (!(sim_bitmap & 0xF0) && is2t) { /* path B OK */
2143                for (i = 4; i < 8; i++)
2144                        result[3][i] = result[c1][i];
2145        } else if (!(sim_bitmap & 0x30)) { /* path B, Tx OK */
2146                for (i = 4; i < 6; i++)
2147                        result[3][i] = result[c1][i];
2148        }
2149        return false;
2150}
2151
2152static void _rtl92d_phy_patha_fill_iqk_matrix(struct ieee80211_hw *hw,
2153                                              bool iqk_ok, long result[][8],
2154                                              u8 final_candidate, bool txonly)
2155{
2156        struct rtl_priv *rtlpriv = rtl_priv(hw);
2157        struct rtl_hal *rtlhal = &(rtlpriv->rtlhal);
2158        u32 oldval_0, val_x, tx0_a, reg;
2159        long val_y, tx0_c;
2160        bool is2t = IS_92D_SINGLEPHY(rtlhal->version) ||
2161            rtlhal->macphymode == DUALMAC_DUALPHY;
2162
2163        RTPRINT(rtlpriv, FINIT, INIT_IQK,
2164                "Path A IQ Calibration %s !\n", iqk_ok ? "Success" : "Failed");
2165        if (final_candidate == 0xFF) {
2166                return;
2167        } else if (iqk_ok) {
2168                oldval_0 = (rtl_get_bbreg(hw, ROFDM0_XATxIQIMBALANCE,
2169                        MASKDWORD) >> 22) & 0x3FF;      /* OFDM0_D */
2170                val_x = result[final_candidate][0];
2171                if ((val_x & 0x00000200) != 0)
2172                        val_x = val_x | 0xFFFFFC00;
2173                tx0_a = (val_x * oldval_0) >> 8;
2174                RTPRINT(rtlpriv, FINIT, INIT_IQK,
2175                        "X = 0x%x, tx0_a = 0x%x, oldval_0 0x%x\n",
2176                        val_x, tx0_a, oldval_0);
2177                rtl_set_bbreg(hw, ROFDM0_XATxIQIMBALANCE, 0x3FF, tx0_a);
2178                rtl_set_bbreg(hw, ROFDM0_ECCATHRESHOLD, BIT(24),
2179                              ((val_x * oldval_0 >> 7) & 0x1));
2180                val_y = result[final_candidate][1];
2181                if ((val_y & 0x00000200) != 0)
2182                        val_y = val_y | 0xFFFFFC00;
2183                /* path B IQK result + 3 */
2184                if (rtlhal->interfaceindex == 1 &&
2185                        rtlhal->current_bandtype == BAND_ON_5G)
2186                        val_y += 3;
2187                tx0_c = (val_y * oldval_0) >> 8;
2188                RTPRINT(rtlpriv, FINIT, INIT_IQK,
2189                        "Y = 0x%lx, tx0_c = 0x%lx\n",
2190                        val_y, tx0_c);
2191                rtl_set_bbreg(hw, ROFDM0_XCTxAFE, 0xF0000000,
2192                              ((tx0_c & 0x3C0) >> 6));
2193                rtl_set_bbreg(hw, ROFDM0_XATxIQIMBALANCE, 0x003F0000,
2194                              (tx0_c & 0x3F));
2195                if (is2t)
2196                        rtl_set_bbreg(hw, ROFDM0_ECCATHRESHOLD, BIT(26),
2197                                      ((val_y * oldval_0 >> 7) & 0x1));
2198                RTPRINT(rtlpriv, FINIT, INIT_IQK, "0xC80 = 0x%x\n",
2199                        rtl_get_bbreg(hw, ROFDM0_XATxIQIMBALANCE,
2200                                      MASKDWORD));
2201                if (txonly) {
2202                        RTPRINT(rtlpriv, FINIT, INIT_IQK,  "only Tx OK\n");
2203                        return;
2204                }
2205                reg = result[final_candidate][2];
2206                rtl_set_bbreg(hw, ROFDM0_XARXIQIMBALANCE, 0x3FF, reg);
2207                reg = result[final_candidate][3] & 0x3F;
2208                rtl_set_bbreg(hw, ROFDM0_XARXIQIMBALANCE, 0xFC00, reg);
2209                reg = (result[final_candidate][3] >> 6) & 0xF;
2210                rtl_set_bbreg(hw, 0xca0, 0xF0000000, reg);
2211        }
2212}
2213
2214static void _rtl92d_phy_pathb_fill_iqk_matrix(struct ieee80211_hw *hw,
2215        bool iqk_ok, long result[][8], u8 final_candidate, bool txonly)
2216{
2217        struct rtl_priv *rtlpriv = rtl_priv(hw);
2218        struct rtl_hal *rtlhal = &(rtlpriv->rtlhal);
2219        u32 oldval_1, val_x, tx1_a, reg;
2220        long val_y, tx1_c;
2221
2222        RTPRINT(rtlpriv, FINIT, INIT_IQK, "Path B IQ Calibration %s !\n",
2223                iqk_ok ? "Success" : "Failed");
2224        if (final_candidate == 0xFF) {
2225                return;
2226        } else if (iqk_ok) {
2227                oldval_1 = (rtl_get_bbreg(hw, ROFDM0_XBTxIQIMBALANCE,
2228                                          MASKDWORD) >> 22) & 0x3FF;
2229                val_x = result[final_candidate][4];
2230                if ((val_x & 0x00000200) != 0)
2231                        val_x = val_x | 0xFFFFFC00;
2232                tx1_a = (val_x * oldval_1) >> 8;
2233                RTPRINT(rtlpriv, FINIT, INIT_IQK, "X = 0x%x, tx1_a = 0x%x\n",
2234                        val_x, tx1_a);
2235                rtl_set_bbreg(hw, ROFDM0_XBTxIQIMBALANCE, 0x3FF, tx1_a);
2236                rtl_set_bbreg(hw, ROFDM0_ECCATHRESHOLD, BIT(28),
2237                              ((val_x * oldval_1 >> 7) & 0x1));
2238                val_y = result[final_candidate][5];
2239                if ((val_y & 0x00000200) != 0)
2240                        val_y = val_y | 0xFFFFFC00;
2241                if (rtlhal->current_bandtype == BAND_ON_5G)
2242                        val_y += 3;
2243                tx1_c = (val_y * oldval_1) >> 8;
2244                RTPRINT(rtlpriv, FINIT, INIT_IQK, "Y = 0x%lx, tx1_c = 0x%lx\n",
2245                        val_y, tx1_c);
2246                rtl_set_bbreg(hw, ROFDM0_XDTxAFE, 0xF0000000,
2247                              ((tx1_c & 0x3C0) >> 6));
2248                rtl_set_bbreg(hw, ROFDM0_XBTxIQIMBALANCE, 0x003F0000,
2249                              (tx1_c & 0x3F));
2250                rtl_set_bbreg(hw, ROFDM0_ECCATHRESHOLD, BIT(30),
2251                              ((val_y * oldval_1 >> 7) & 0x1));
2252                if (txonly)
2253                        return;
2254                reg = result[final_candidate][6];
2255                rtl_set_bbreg(hw, ROFDM0_XBRXIQIMBALANCE, 0x3FF, reg);
2256                reg = result[final_candidate][7] & 0x3F;
2257                rtl_set_bbreg(hw, ROFDM0_XBRXIQIMBALANCE, 0xFC00, reg);
2258                reg = (result[final_candidate][7] >> 6) & 0xF;
2259                rtl_set_bbreg(hw, ROFDM0_AGCRSSITABLE, 0x0000F000, reg);
2260        }
2261}
2262
2263void rtl92d_phy_iq_calibrate(struct ieee80211_hw *hw)
2264{
2265        struct rtl_priv *rtlpriv = rtl_priv(hw);
2266        struct rtl_phy *rtlphy = &(rtlpriv->phy);
2267        struct rtl_hal *rtlhal = &(rtlpriv->rtlhal);
2268        long result[4][8];
2269        u8 i, final_candidate, indexforchannel;
2270        bool patha_ok, pathb_ok;
2271        long rege94, rege9c, regea4, regeac, regeb4;
2272        long regebc, regec4, regecc, regtmp = 0;
2273        bool is12simular, is13simular, is23simular;
2274        unsigned long flag = 0;
2275
2276        RTPRINT(rtlpriv, FINIT, INIT_IQK,
2277                "IQK:Start!!!channel %d\n", rtlphy->current_channel);
2278        for (i = 0; i < 8; i++) {
2279                result[0][i] = 0;
2280                result[1][i] = 0;
2281                result[2][i] = 0;
2282                result[3][i] = 0;
2283        }
2284        final_candidate = 0xff;
2285        patha_ok = false;
2286        pathb_ok = false;
2287        is12simular = false;
2288        is23simular = false;
2289        is13simular = false;
2290        RTPRINT(rtlpriv, FINIT, INIT_IQK,
2291                "IQK !!!currentband %d\n", rtlhal->current_bandtype);
2292        rtl92d_acquire_cckandrw_pagea_ctl(hw, &flag);
2293        for (i = 0; i < 3; i++) {
2294                if (rtlhal->current_bandtype == BAND_ON_5G) {
2295                        _rtl92d_phy_iq_calibrate_5g_normal(hw, result, i);
2296                } else if (rtlhal->current_bandtype == BAND_ON_2_4G) {
2297                        if (IS_92D_SINGLEPHY(rtlhal->version))
2298                                _rtl92d_phy_iq_calibrate(hw, result, i, true);
2299                        else
2300                                _rtl92d_phy_iq_calibrate(hw, result, i, false);
2301                }
2302                if (i == 1) {
2303                        is12simular = _rtl92d_phy_simularity_compare(hw, result,
2304                                                                     0, 1);
2305                        if (is12simular) {
2306                                final_candidate = 0;
2307                                break;
2308                        }
2309                }
2310                if (i == 2) {
2311                        is13simular = _rtl92d_phy_simularity_compare(hw, result,
2312                                                                     0, 2);
2313                        if (is13simular) {
2314                                final_candidate = 0;
2315                                break;
2316                        }
2317                        is23simular = _rtl92d_phy_simularity_compare(hw, result,
2318                                                                     1, 2);
2319                        if (is23simular) {
2320                                final_candidate = 1;
2321                        } else {
2322                                for (i = 0; i < 8; i++)
2323                                        regtmp += result[3][i];
2324
2325                                if (regtmp != 0)
2326                                        final_candidate = 3;
2327                                else
2328                                        final_candidate = 0xFF;
2329                        }
2330                }
2331        }
2332        rtl92d_release_cckandrw_pagea_ctl(hw, &flag);
2333        for (i = 0; i < 4; i++) {
2334                rege94 = result[i][0];
2335                rege9c = result[i][1];
2336                regea4 = result[i][2];
2337                regeac = result[i][3];
2338                regeb4 = result[i][4];
2339                regebc = result[i][5];
2340                regec4 = result[i][6];
2341                regecc = result[i][7];
2342                RTPRINT(rtlpriv, FINIT, INIT_IQK,
2343                        "IQK: rege94=%lx rege9c=%lx regea4=%lx regeac=%lx regeb4=%lx regebc=%lx regec4=%lx regecc=%lx\n",
2344                        rege94, rege9c, regea4, regeac, regeb4, regebc, regec4,
2345                        regecc);
2346        }
2347        if (final_candidate != 0xff) {
2348                rtlphy->reg_e94 = rege94 = result[final_candidate][0];
2349                rtlphy->reg_e9c = rege9c = result[final_candidate][1];
2350                regea4 = result[final_candidate][2];
2351                regeac = result[final_candidate][3];
2352                rtlphy->reg_eb4 = regeb4 = result[final_candidate][4];
2353                rtlphy->reg_ebc = regebc = result[final_candidate][5];
2354                regec4 = result[final_candidate][6];
2355                regecc = result[final_candidate][7];
2356                RTPRINT(rtlpriv, FINIT, INIT_IQK,
2357                        "IQK: final_candidate is %x\n", final_candidate);
2358                RTPRINT(rtlpriv, FINIT, INIT_IQK,
2359                        "IQK: rege94=%lx rege9c=%lx regea4=%lx regeac=%lx regeb4=%lx regebc=%lx regec4=%lx regecc=%lx\n",
2360                        rege94, rege9c, regea4, regeac, regeb4, regebc, regec4,
2361                        regecc);
2362                patha_ok = pathb_ok = true;
2363        } else {
2364                rtlphy->reg_e94 = rtlphy->reg_eb4 = 0x100; /* X default value */
2365                rtlphy->reg_e9c = rtlphy->reg_ebc = 0x0;   /* Y default value */
2366        }
2367        if ((rege94 != 0) /*&&(regea4 != 0) */)
2368                _rtl92d_phy_patha_fill_iqk_matrix(hw, patha_ok, result,
2369                                final_candidate, (regea4 == 0));
2370        if (IS_92D_SINGLEPHY(rtlhal->version)) {
2371                if ((regeb4 != 0) /*&&(regec4 != 0) */)
2372                        _rtl92d_phy_pathb_fill_iqk_matrix(hw, pathb_ok, result,
2373                                                final_candidate, (regec4 == 0));
2374        }
2375        if (final_candidate != 0xFF) {
2376                indexforchannel = rtl92d_get_rightchnlplace_for_iqk(
2377                                  rtlphy->current_channel);
2378
2379                for (i = 0; i < IQK_MATRIX_REG_NUM; i++)
2380                        rtlphy->iqk_matrix[indexforchannel].
2381                                value[0][i] = result[final_candidate][i];
2382                rtlphy->iqk_matrix[indexforchannel].iqk_done =
2383                        true;
2384
2385                RT_TRACE(rtlpriv, COMP_SCAN | COMP_MLME, DBG_LOUD,
2386                         "IQK OK indexforchannel %d\n", indexforchannel);
2387        }
2388}
2389
2390void rtl92d_phy_reload_iqk_setting(struct ieee80211_hw *hw, u8 channel)
2391{
2392        struct rtl_priv *rtlpriv = rtl_priv(hw);
2393        struct rtl_phy *rtlphy = &(rtlpriv->phy);
2394        struct rtl_hal *rtlhal = &(rtlpriv->rtlhal);
2395        u8 indexforchannel;
2396
2397        RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD, "channel %d\n", channel);
2398        /*------Do IQK for normal chip and test chip 5G band------- */
2399        indexforchannel = rtl92d_get_rightchnlplace_for_iqk(channel);
2400        RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD, "indexforchannel %d done %d\n",
2401                 indexforchannel,
2402                 rtlphy->iqk_matrix[indexforchannel].iqk_done);
2403        if (0 && !rtlphy->iqk_matrix[indexforchannel].iqk_done &&
2404                rtlphy->need_iqk) {
2405                /* Re Do IQK. */
2406                RT_TRACE(rtlpriv, COMP_SCAN | COMP_INIT, DBG_LOUD,
2407                         "Do IQK Matrix reg for channel:%d....\n", channel);
2408                rtl92d_phy_iq_calibrate(hw);
2409        } else {
2410                /* Just load the value. */
2411                /* 2G band just load once. */
2412                if (((!rtlhal->load_imrandiqk_setting_for2g) &&
2413                    indexforchannel == 0) || indexforchannel > 0) {
2414                        RT_TRACE(rtlpriv, COMP_SCAN, DBG_LOUD,
2415                                 "Just Read IQK Matrix reg for channel:%d....\n",
2416                                 channel);
2417                        if ((rtlphy->iqk_matrix[indexforchannel].
2418                             value[0] != NULL)
2419                                /*&&(regea4 != 0) */)
2420                                _rtl92d_phy_patha_fill_iqk_matrix(hw, true,
2421                                        rtlphy->iqk_matrix[
2422                                        indexforchannel].value, 0,
2423                                        (rtlphy->iqk_matrix[
2424                                        indexforchannel].value[0][2] == 0));
2425                        if (IS_92D_SINGLEPHY(rtlhal->version)) {
2426                                if ((rtlphy->iqk_matrix[
2427                                        indexforchannel].value[0][4] != 0)
2428                                        /*&&(regec4 != 0) */)
2429                                        _rtl92d_phy_pathb_fill_iqk_matrix(hw,
2430                                                true,
2431                                                rtlphy->iqk_matrix[
2432                                                indexforchannel].value, 0,
2433                                                (rtlphy->iqk_matrix[
2434                                                indexforchannel].value[0][6]
2435                                                == 0));
2436                        }
2437                }
2438        }
2439        rtlphy->need_iqk = false;
2440        RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD, "<====\n");
2441}
2442
2443static u32 _rtl92d_phy_get_abs(u32 val1, u32 val2)
2444{
2445        u32 ret;
2446
2447        if (val1 >= val2)
2448                ret = val1 - val2;
2449        else
2450                ret = val2 - val1;
2451        return ret;
2452}
2453
2454static bool _rtl92d_is_legal_5g_channel(struct ieee80211_hw *hw, u8 channel)
2455{
2456
2457        int i;
2458
2459        for (i = 0; i < sizeof(channel5g); i++)
2460                if (channel == channel5g[i])
2461                        return true;
2462        return false;
2463}
2464
2465static void _rtl92d_phy_calc_curvindex(struct ieee80211_hw *hw,
2466                                       u32 *targetchnl, u32 * curvecount_val,
2467                                       bool is5g, u32 *curveindex)
2468{
2469        struct rtl_priv *rtlpriv = rtl_priv(hw);
2470        u32 smallest_abs_val = 0xffffffff, u4tmp;
2471        u8 i, j;
2472        u8 chnl_num = is5g ? TARGET_CHNL_NUM_5G : TARGET_CHNL_NUM_2G;
2473
2474        for (i = 0; i < chnl_num; i++) {
2475                if (is5g && !_rtl92d_is_legal_5g_channel(hw, i + 1))
2476                        continue;
2477                curveindex[i] = 0;
2478                for (j = 0; j < (CV_CURVE_CNT * 2); j++) {
2479                        u4tmp = _rtl92d_phy_get_abs(targetchnl[i],
2480                                curvecount_val[j]);
2481
2482                        if (u4tmp < smallest_abs_val) {
2483                                curveindex[i] = j;
2484                                smallest_abs_val = u4tmp;
2485                        }
2486                }
2487                smallest_abs_val = 0xffffffff;
2488                RTPRINT(rtlpriv, FINIT, INIT_IQK, "curveindex[%d] = %x\n",
2489                        i, curveindex[i]);
2490        }
2491}
2492
2493static void _rtl92d_phy_reload_lck_setting(struct ieee80211_hw *hw,
2494                u8 channel)
2495{
2496        struct rtl_priv *rtlpriv = rtl_priv(hw);
2497        u8 erfpath = rtlpriv->rtlhal.current_bandtype ==
2498                BAND_ON_5G ? RF90_PATH_A :
2499                IS_92D_SINGLEPHY(rtlpriv->rtlhal.version) ?
2500                RF90_PATH_B : RF90_PATH_A;
2501        u32 u4tmp = 0, u4regvalue = 0;
2502        bool bneed_powerdown_radio = false;
2503
2504        RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD, "path %d\n", erfpath);
2505        RTPRINT(rtlpriv, FINIT, INIT_IQK, "band type = %d\n",
2506                rtlpriv->rtlhal.current_bandtype);
2507        RTPRINT(rtlpriv, FINIT, INIT_IQK,  "channel = %d\n", channel);
2508        if (rtlpriv->rtlhal.current_bandtype == BAND_ON_5G) {/* Path-A for 5G */
2509                u4tmp = curveindex_5g[channel-1];
2510                RTPRINT(rtlpriv, FINIT, INIT_IQK,
2511                        "ver 1 set RF-A, 5G,    0x28 = 0x%x !!\n", u4tmp);
2512                if (rtlpriv->rtlhal.macphymode == DUALMAC_DUALPHY &&
2513                        rtlpriv->rtlhal.interfaceindex == 1) {
2514                        bneed_powerdown_radio =
2515                                rtl92d_phy_enable_anotherphy(hw, false);
2516                        rtlpriv->rtlhal.during_mac1init_radioa = true;
2517                        /* asume no this case */
2518                        if (bneed_powerdown_radio)
2519                                _rtl92d_phy_enable_rf_env(hw, erfpath,
2520                                                          &u4regvalue);
2521                }
2522                rtl_set_rfreg(hw, erfpath, RF_SYN_G4, 0x3f800, u4tmp);
2523                if (bneed_powerdown_radio)
2524                        _rtl92d_phy_restore_rf_env(hw, erfpath, &u4regvalue);
2525                if (rtlpriv->rtlhal.during_mac1init_radioa)
2526                        rtl92d_phy_powerdown_anotherphy(hw, false);
2527        } else if (rtlpriv->rtlhal.current_bandtype == BAND_ON_2_4G) {
2528                u4tmp = curveindex_2g[channel-1];
2529                RTPRINT(rtlpriv, FINIT, INIT_IQK,
2530                        "ver 3 set RF-B, 2G, 0x28 = 0x%x !!\n", u4tmp);
2531                if (rtlpriv->rtlhal.macphymode == DUALMAC_DUALPHY &&
2532                        rtlpriv->rtlhal.interfaceindex == 0) {
2533                        bneed_powerdown_radio =
2534                                rtl92d_phy_enable_anotherphy(hw, true);
2535                        rtlpriv->rtlhal.during_mac0init_radiob = true;
2536                        if (bneed_powerdown_radio)
2537                                _rtl92d_phy_enable_rf_env(hw, erfpath,
2538                                                          &u4regvalue);
2539                }
2540                rtl_set_rfreg(hw, erfpath, RF_SYN_G4, 0x3f800, u4tmp);
2541                RTPRINT(rtlpriv, FINIT, INIT_IQK,
2542                        "ver 3 set RF-B, 2G, 0x28 = 0x%x !!\n",
2543                        rtl_get_rfreg(hw,  erfpath, RF_SYN_G4, 0x3f800));
2544                if (bneed_powerdown_radio)
2545                        _rtl92d_phy_restore_rf_env(hw, erfpath, &u4regvalue);
2546                if (rtlpriv->rtlhal.during_mac0init_radiob)
2547                        rtl92d_phy_powerdown_anotherphy(hw, true);
2548        }
2549        RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD, "<====\n");
2550}
2551
2552static void _rtl92d_phy_lc_calibrate_sw(struct ieee80211_hw *hw, bool is2t)
2553{
2554        struct rtl_priv *rtlpriv = rtl_priv(hw);
2555        struct rtl_hal *rtlhal = &(rtlpriv->rtlhal);
2556        struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
2557        u8 tmpreg, index, rf_mode[2];
2558        u8 path = is2t ? 2 : 1;
2559        u8 i;
2560        u32 u4tmp, offset;
2561        u32 curvecount_val[CV_CURVE_CNT * 2] = {0};
2562        u16 timeout = 800, timecount = 0;
2563
2564        /* Check continuous TX and Packet TX */
2565        tmpreg = rtl_read_byte(rtlpriv, 0xd03);
2566        /* if Deal with contisuous TX case, disable all continuous TX */
2567        /* if Deal with Packet TX case, block all queues */
2568        if ((tmpreg & 0x70) != 0)
2569                rtl_write_byte(rtlpriv, 0xd03, tmpreg & 0x8F);
2570        else
2571                rtl_write_byte(rtlpriv, REG_TXPAUSE, 0xFF);
2572        rtl_set_bbreg(hw, RFPGA0_ANALOGPARAMETER4, 0xF00000, 0x0F);
2573        for (index = 0; index < path; index++) {
2574                /* 1. Read original RF mode */
2575                offset = index == 0 ? ROFDM0_XAAGCCORE1 : ROFDM0_XBAGCCORE1;
2576                rf_mode[index] = rtl_read_byte(rtlpriv, offset);
2577                /* 2. Set RF mode = standby mode */
2578                rtl_set_rfreg(hw, (enum radio_path)index, RF_AC,
2579                              RFREG_OFFSET_MASK, 0x010000);
2580                if (rtlpci->init_ready) {
2581                        /* switch CV-curve control by LC-calibration */
2582                        rtl_set_rfreg(hw, (enum radio_path)index, RF_SYN_G7,
2583                                      BIT(17), 0x0);
2584                        /* 4. Set LC calibration begin */
2585                        rtl_set_rfreg(hw, (enum radio_path)index, RF_CHNLBW,
2586                                      0x08000, 0x01);
2587                }
2588                u4tmp = rtl_get_rfreg(hw, (enum radio_path)index, RF_SYN_G6,
2589                                  RFREG_OFFSET_MASK);
2590                while ((!(u4tmp & BIT(11))) && timecount <= timeout) {
2591                        mdelay(50);
2592                        timecount += 50;
2593                        u4tmp = rtl_get_rfreg(hw, (enum radio_path)index,
2594                                              RF_SYN_G6, RFREG_OFFSET_MASK);
2595                }
2596                RTPRINT(rtlpriv, FINIT, INIT_IQK,
2597                        "PHY_LCK finish delay for %d ms=2\n", timecount);
2598                u4tmp = rtl_get_rfreg(hw, index, RF_SYN_G4, RFREG_OFFSET_MASK);
2599                if (index == 0 && rtlhal->interfaceindex == 0) {
2600                        RTPRINT(rtlpriv, FINIT, INIT_IQK,
2601                                "path-A / 5G LCK\n");
2602                } else {
2603                        RTPRINT(rtlpriv, FINIT, INIT_IQK,
2604                                "path-B / 2.4G LCK\n");
2605                }
2606                memset(&curvecount_val[0], 0, CV_CURVE_CNT * 2);
2607                /* Set LC calibration off */
2608                rtl_set_rfreg(hw, (enum radio_path)index, RF_CHNLBW,
2609                              0x08000, 0x0);
2610                RTPRINT(rtlpriv, FINIT, INIT_IQK,  "set RF 0x18[15] = 0\n");
2611                /* save Curve-counting number */
2612                for (i = 0; i < CV_CURVE_CNT; i++) {
2613                        u32 readval = 0, readval2 = 0;
2614                        rtl_set_rfreg(hw, (enum radio_path)index, 0x3F,
2615                                      0x7f, i);
2616
2617                        rtl_set_rfreg(hw, (enum radio_path)index, 0x4D,
2618                                RFREG_OFFSET_MASK, 0x0);
2619                        readval = rtl_get_rfreg(hw, (enum radio_path)index,
2620                                          0x4F, RFREG_OFFSET_MASK);
2621                        curvecount_val[2 * i + 1] = (readval & 0xfffe0) >> 5;
2622                        /* reg 0x4f [4:0] */
2623                        /* reg 0x50 [19:10] */
2624                        readval2 = rtl_get_rfreg(hw, (enum radio_path)index,
2625                                                 0x50, 0xffc00);
2626                        curvecount_val[2 * i] = (((readval & 0x1F) << 10) |
2627                                                 readval2);
2628                }
2629                if (index == 0 && rtlhal->interfaceindex == 0)
2630                        _rtl92d_phy_calc_curvindex(hw, targetchnl_5g,
2631                                                   curvecount_val,
2632                                                   true, curveindex_5g);
2633                else
2634                        _rtl92d_phy_calc_curvindex(hw, targetchnl_2g,
2635                                                   curvecount_val,
2636                                                   false, curveindex_2g);
2637                /* switch CV-curve control mode */
2638                rtl_set_rfreg(hw, (enum radio_path)index, RF_SYN_G7,
2639                              BIT(17), 0x1);
2640        }
2641
2642        /* Restore original situation  */
2643        for (index = 0; index < path; index++) {
2644                offset = index == 0 ? ROFDM0_XAAGCCORE1 : ROFDM0_XBAGCCORE1;
2645                rtl_write_byte(rtlpriv, offset, 0x50);
2646                rtl_write_byte(rtlpriv, offset, rf_mode[index]);
2647        }
2648        if ((tmpreg & 0x70) != 0)
2649                rtl_write_byte(rtlpriv, 0xd03, tmpreg);
2650        else /*Deal with Packet TX case */
2651                rtl_write_byte(rtlpriv, REG_TXPAUSE, 0x00);
2652        rtl_set_bbreg(hw, RFPGA0_ANALOGPARAMETER4, 0xF00000, 0x00);
2653        _rtl92d_phy_reload_lck_setting(hw, rtlpriv->phy.current_channel);
2654}
2655
2656static void _rtl92d_phy_lc_calibrate(struct ieee80211_hw *hw, bool is2t)
2657{
2658        struct rtl_priv *rtlpriv = rtl_priv(hw);
2659
2660        RTPRINT(rtlpriv, FINIT, INIT_IQK,  "cosa PHY_LCK ver=2\n");
2661        _rtl92d_phy_lc_calibrate_sw(hw, is2t);
2662}
2663
2664void rtl92d_phy_lc_calibrate(struct ieee80211_hw *hw)
2665{
2666        struct rtl_priv *rtlpriv = rtl_priv(hw);
2667        struct rtl_phy *rtlphy = &(rtlpriv->phy);
2668        struct rtl_hal *rtlhal = &(rtlpriv->rtlhal);
2669        u32 timeout = 2000, timecount = 0;
2670
2671        while (rtlpriv->mac80211.act_scanning && timecount < timeout) {
2672                udelay(50);
2673                timecount += 50;
2674        }
2675
2676        rtlphy->lck_inprogress = true;
2677        RTPRINT(rtlpriv, FINIT, INIT_IQK,
2678                "LCK:Start!!! currentband %x delay %d ms\n",
2679                rtlhal->current_bandtype, timecount);
2680        if (IS_92D_SINGLEPHY(rtlhal->version)) {
2681                _rtl92d_phy_lc_calibrate(hw, true);
2682        } else {
2683                /* For 1T1R */
2684                _rtl92d_phy_lc_calibrate(hw, false);
2685        }
2686        rtlphy->lck_inprogress = false;
2687        RTPRINT(rtlpriv, FINIT, INIT_IQK,  "LCK:Finish!!!\n");
2688}
2689
2690void rtl92d_phy_ap_calibrate(struct ieee80211_hw *hw, s8 delta)
2691{
2692        return;
2693}
2694
2695static bool _rtl92d_phy_set_sw_chnl_cmdarray(struct swchnlcmd *cmdtable,
2696                u32 cmdtableidx, u32 cmdtablesz, enum swchnlcmd_id cmdid,
2697                u32 para1, u32 para2, u32 msdelay)
2698{
2699        struct swchnlcmd *pcmd;
2700
2701        if (cmdtable == NULL) {
2702                WARN_ONCE(true, "rtl8192de: cmdtable cannot be NULL\n");
2703                return false;
2704        }
2705        if (cmdtableidx >= cmdtablesz)
2706                return false;
2707
2708        pcmd = cmdtable + cmdtableidx;
2709        pcmd->cmdid = cmdid;
2710        pcmd->para1 = para1;
2711        pcmd->para2 = para2;
2712        pcmd->msdelay = msdelay;
2713        return true;
2714}
2715
2716void rtl92d_phy_reset_iqk_result(struct ieee80211_hw *hw)
2717{
2718        struct rtl_priv *rtlpriv = rtl_priv(hw);
2719        struct rtl_phy *rtlphy = &(rtlpriv->phy);
2720        u8 i;
2721
2722        RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
2723                 "settings regs %d default regs %d\n",
2724                 (int)(sizeof(rtlphy->iqk_matrix) /
2725                       sizeof(struct iqk_matrix_regs)),
2726                 IQK_MATRIX_REG_NUM);
2727        /* 0xe94, 0xe9c, 0xea4, 0xeac, 0xeb4, 0xebc, 0xec4, 0xecc */
2728        for (i = 0; i < IQK_MATRIX_SETTINGS_NUM; i++) {
2729                rtlphy->iqk_matrix[i].value[0][0] = 0x100;
2730                rtlphy->iqk_matrix[i].value[0][2] = 0x100;
2731                rtlphy->iqk_matrix[i].value[0][4] = 0x100;
2732                rtlphy->iqk_matrix[i].value[0][6] = 0x100;
2733                rtlphy->iqk_matrix[i].value[0][1] = 0x0;
2734                rtlphy->iqk_matrix[i].value[0][3] = 0x0;
2735                rtlphy->iqk_matrix[i].value[0][5] = 0x0;
2736                rtlphy->iqk_matrix[i].value[0][7] = 0x0;
2737                rtlphy->iqk_matrix[i].iqk_done = false;
2738        }
2739}
2740
2741static bool _rtl92d_phy_sw_chnl_step_by_step(struct ieee80211_hw *hw,
2742                                             u8 channel, u8 *stage, u8 *step,
2743                                             u32 *delay)
2744{
2745        struct rtl_priv *rtlpriv = rtl_priv(hw);
2746        struct rtl_phy *rtlphy = &(rtlpriv->phy);
2747        struct swchnlcmd precommoncmd[MAX_PRECMD_CNT];
2748        u32 precommoncmdcnt;
2749        struct swchnlcmd postcommoncmd[MAX_POSTCMD_CNT];
2750        u32 postcommoncmdcnt;
2751        struct swchnlcmd rfdependcmd[MAX_RFDEPENDCMD_CNT];
2752        u32 rfdependcmdcnt;
2753        struct swchnlcmd *currentcmd = NULL;
2754        u8 rfpath;
2755        u8 num_total_rfpath = rtlphy->num_total_rfpath;
2756
2757        precommoncmdcnt = 0;
2758        _rtl92d_phy_set_sw_chnl_cmdarray(precommoncmd, precommoncmdcnt++,
2759                                         MAX_PRECMD_CNT,
2760                                         CMDID_SET_TXPOWEROWER_LEVEL, 0, 0, 0);
2761        _rtl92d_phy_set_sw_chnl_cmdarray(precommoncmd, precommoncmdcnt++,
2762                                         MAX_PRECMD_CNT, CMDID_END, 0, 0, 0);
2763        postcommoncmdcnt = 0;
2764        _rtl92d_phy_set_sw_chnl_cmdarray(postcommoncmd, postcommoncmdcnt++,
2765                                         MAX_POSTCMD_CNT, CMDID_END, 0, 0, 0);
2766        rfdependcmdcnt = 0;
2767        _rtl92d_phy_set_sw_chnl_cmdarray(rfdependcmd, rfdependcmdcnt++,
2768                                         MAX_RFDEPENDCMD_CNT, CMDID_RF_WRITEREG,
2769                                         RF_CHNLBW, channel, 0);
2770        _rtl92d_phy_set_sw_chnl_cmdarray(rfdependcmd, rfdependcmdcnt++,
2771                                         MAX_RFDEPENDCMD_CNT, CMDID_END,
2772                                         0, 0, 0);
2773
2774        do {
2775                switch (*stage) {
2776                case 0:
2777                        currentcmd = &precommoncmd[*step];
2778                        break;
2779                case 1:
2780                        currentcmd = &rfdependcmd[*step];
2781                        break;
2782                case 2:
2783                        currentcmd = &postcommoncmd[*step];
2784                        break;
2785                }
2786                if (currentcmd->cmdid == CMDID_END) {
2787                        if ((*stage) == 2) {
2788                                return true;
2789                        } else {
2790                                (*stage)++;
2791                                (*step) = 0;
2792                                continue;
2793                        }
2794                }
2795                switch (currentcmd->cmdid) {
2796                case CMDID_SET_TXPOWEROWER_LEVEL:
2797                        rtl92d_phy_set_txpower_level(hw, channel);
2798                        break;
2799                case CMDID_WRITEPORT_ULONG:
2800                        rtl_write_dword(rtlpriv, currentcmd->para1,
2801                                        currentcmd->para2);
2802                        break;
2803                case CMDID_WRITEPORT_USHORT:
2804                        rtl_write_word(rtlpriv, currentcmd->para1,
2805                                       (u16)currentcmd->para2);
2806                        break;
2807                case CMDID_WRITEPORT_UCHAR:
2808                        rtl_write_byte(rtlpriv, currentcmd->para1,
2809                                       (u8)currentcmd->para2);
2810                        break;
2811                case CMDID_RF_WRITEREG:
2812                        for (rfpath = 0; rfpath < num_total_rfpath; rfpath++) {
2813                                rtlphy->rfreg_chnlval[rfpath] =
2814                                        ((rtlphy->rfreg_chnlval[rfpath] &
2815                                        0xffffff00) | currentcmd->para2);
2816                                if (rtlpriv->rtlhal.current_bandtype ==
2817                                    BAND_ON_5G) {
2818                                        if (currentcmd->para2 > 99)
2819                                                rtlphy->rfreg_chnlval[rfpath] =
2820                                                    rtlphy->rfreg_chnlval
2821                                                    [rfpath] | (BIT(18));
2822                                        else
2823                                                rtlphy->rfreg_chnlval[rfpath] =
2824                                                    rtlphy->rfreg_chnlval
2825                                                    [rfpath] & (~BIT(18));
2826                                        rtlphy->rfreg_chnlval[rfpath] |=
2827                                                 (BIT(16) | BIT(8));
2828                                } else {
2829                                        rtlphy->rfreg_chnlval[rfpath] &=
2830                                                ~(BIT(8) | BIT(16) | BIT(18));
2831                                }
2832                                rtl_set_rfreg(hw, (enum radio_path)rfpath,
2833                                              currentcmd->para1,
2834                                              RFREG_OFFSET_MASK,
2835                                              rtlphy->rfreg_chnlval[rfpath]);
2836                                _rtl92d_phy_reload_imr_setting(hw, channel,
2837                                                               rfpath);
2838                        }
2839                        _rtl92d_phy_switch_rf_setting(hw, channel);
2840                        /* do IQK when all parameters are ready */
2841                        rtl92d_phy_reload_iqk_setting(hw, channel);
2842                        break;
2843                default:
2844                        pr_err("switch case %#x not processed\n",
2845                               currentcmd->cmdid);
2846                        break;
2847                }
2848                break;
2849        } while (true);
2850        (*delay) = currentcmd->msdelay;
2851        (*step)++;
2852        return false;
2853}
2854
2855u8 rtl92d_phy_sw_chnl(struct ieee80211_hw *hw)
2856{
2857        struct rtl_priv *rtlpriv = rtl_priv(hw);
2858        struct rtl_phy *rtlphy = &(rtlpriv->phy);
2859        struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
2860        u32 delay;
2861        u32 timeout = 1000, timecount = 0;
2862        u8 channel = rtlphy->current_channel;
2863        u32 ret_value;
2864
2865        if (rtlphy->sw_chnl_inprogress)
2866                return 0;
2867        if (rtlphy->set_bwmode_inprogress)
2868                return 0;
2869
2870        if ((is_hal_stop(rtlhal)) || (RT_CANNOT_IO(hw))) {
2871                RT_TRACE(rtlpriv, COMP_CHAN, DBG_LOUD,
2872                         "sw_chnl_inprogress false driver sleep or unload\n");
2873                return 0;
2874        }
2875        while (rtlphy->lck_inprogress && timecount < timeout) {
2876                mdelay(50);
2877                timecount += 50;
2878        }
2879        if (rtlhal->macphymode == SINGLEMAC_SINGLEPHY &&
2880            rtlhal->bandset == BAND_ON_BOTH) {
2881                ret_value = rtl_get_bbreg(hw, RFPGA0_XAB_RFPARAMETER,
2882                                          MASKDWORD);
2883                if (rtlphy->current_channel > 14 && !(ret_value & BIT(0)))
2884                        rtl92d_phy_switch_wirelessband(hw, BAND_ON_5G);
2885                else if (rtlphy->current_channel <= 14 && (ret_value & BIT(0)))
2886                        rtl92d_phy_switch_wirelessband(hw, BAND_ON_2_4G);
2887        }
2888        switch (rtlhal->current_bandtype) {
2889        case BAND_ON_5G:
2890                /* Get first channel error when change between
2891                 * 5G and 2.4G band. */
2892                if (channel <= 14)
2893                        return 0;
2894                WARN_ONCE((channel <= 14), "rtl8192de: 5G but channel<=14\n");
2895                break;
2896        case BAND_ON_2_4G:
2897                /* Get first channel error when change between
2898                 * 5G and 2.4G band. */
2899                if (channel > 14)
2900                        return 0;
2901                WARN_ONCE((channel > 14), "rtl8192de: 2G but channel>14\n");
2902                break;
2903        default:
2904                WARN_ONCE(true, "rtl8192de: Invalid WirelessMode(%#x)!!\n",
2905                          rtlpriv->mac80211.mode);
2906                break;
2907        }
2908        rtlphy->sw_chnl_inprogress = true;
2909        if (channel == 0)
2910                channel = 1;
2911        rtlphy->sw_chnl_stage = 0;
2912        rtlphy->sw_chnl_step = 0;
2913        RT_TRACE(rtlpriv, COMP_SCAN, DBG_TRACE,
2914                 "switch to channel%d\n", rtlphy->current_channel);
2915
2916        do {
2917                if (!rtlphy->sw_chnl_inprogress)
2918                        break;
2919                if (!_rtl92d_phy_sw_chnl_step_by_step(hw,
2920                                                      rtlphy->current_channel,
2921                    &rtlphy->sw_chnl_stage, &rtlphy->sw_chnl_step, &delay)) {
2922                        if (delay > 0)
2923                                mdelay(delay);
2924                        else
2925                                continue;
2926                } else {
2927                        rtlphy->sw_chnl_inprogress = false;
2928                }
2929                break;
2930        } while (true);
2931        RT_TRACE(rtlpriv, COMP_SCAN, DBG_TRACE, "<==\n");
2932        rtlphy->sw_chnl_inprogress = false;
2933        return 1;
2934}
2935
2936static void rtl92d_phy_set_io(struct ieee80211_hw *hw)
2937{
2938        struct rtl_priv *rtlpriv = rtl_priv(hw);
2939        struct dig_t *de_digtable = &rtlpriv->dm_digtable;
2940        struct rtl_phy *rtlphy = &(rtlpriv->phy);
2941
2942        RT_TRACE(rtlpriv, COMP_CMD, DBG_TRACE,
2943                 "--->Cmd(%#x), set_io_inprogress(%d)\n",
2944                 rtlphy->current_io_type, rtlphy->set_io_inprogress);
2945        switch (rtlphy->current_io_type) {
2946        case IO_CMD_RESUME_DM_BY_SCAN:
2947                de_digtable->cur_igvalue = rtlphy->initgain_backup.xaagccore1;
2948                rtl92d_dm_write_dig(hw);
2949                rtl92d_phy_set_txpower_level(hw, rtlphy->current_channel);
2950                break;
2951        case IO_CMD_PAUSE_DM_BY_SCAN:
2952                rtlphy->initgain_backup.xaagccore1 = de_digtable->cur_igvalue;
2953                de_digtable->cur_igvalue = 0x37;
2954                rtl92d_dm_write_dig(hw);
2955                break;
2956        default:
2957                pr_err("switch case %#x not processed\n",
2958                       rtlphy->current_io_type);
2959                break;
2960        }
2961        rtlphy->set_io_inprogress = false;
2962        RT_TRACE(rtlpriv, COMP_CMD, DBG_TRACE, "<---(%#x)\n",
2963                 rtlphy->current_io_type);
2964}
2965
2966bool rtl92d_phy_set_io_cmd(struct ieee80211_hw *hw, enum io_type iotype)
2967{
2968        struct rtl_priv *rtlpriv = rtl_priv(hw);
2969        struct rtl_phy *rtlphy = &(rtlpriv->phy);
2970        bool postprocessing = false;
2971
2972        RT_TRACE(rtlpriv, COMP_CMD, DBG_TRACE,
2973                 "-->IO Cmd(%#x), set_io_inprogress(%d)\n",
2974                 iotype, rtlphy->set_io_inprogress);
2975        do {
2976                switch (iotype) {
2977                case IO_CMD_RESUME_DM_BY_SCAN:
2978                        RT_TRACE(rtlpriv, COMP_CMD, DBG_TRACE,
2979                                 "[IO CMD] Resume DM after scan\n");
2980                        postprocessing = true;
2981                        break;
2982                case IO_CMD_PAUSE_DM_BY_SCAN:
2983                        RT_TRACE(rtlpriv, COMP_CMD, DBG_TRACE,
2984                                 "[IO CMD] Pause DM before scan\n");
2985                        postprocessing = true;
2986                        break;
2987                default:
2988                        pr_err("switch case %#x not processed\n",
2989                               iotype);
2990                        break;
2991                }
2992        } while (false);
2993        if (postprocessing && !rtlphy->set_io_inprogress) {
2994                rtlphy->set_io_inprogress = true;
2995                rtlphy->current_io_type = iotype;
2996        } else {
2997                return false;
2998        }
2999        rtl92d_phy_set_io(hw);
3000        RT_TRACE(rtlpriv, COMP_CMD, DBG_TRACE, "<--IO Type(%#x)\n", iotype);
3001        return true;
3002}
3003
3004static void _rtl92d_phy_set_rfon(struct ieee80211_hw *hw)
3005{
3006        struct rtl_priv *rtlpriv = rtl_priv(hw);
3007
3008        /* a.  SYS_CLKR 0x08[11] = 1  restore MAC clock */
3009        /* b.  SPS_CTRL 0x11[7:0] = 0x2b */
3010        if (rtlpriv->rtlhal.macphymode == SINGLEMAC_SINGLEPHY)
3011                rtl_write_byte(rtlpriv, REG_SPS0_CTRL, 0x2b);
3012        /* c.  For PCIE: SYS_FUNC_EN 0x02[7:0] = 0xE3 enable BB TRX function */
3013        rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN, 0xE3);
3014        /* RF_ON_EXCEP(d~g): */
3015        /* d.  APSD_CTRL 0x600[7:0] = 0x00 */
3016        rtl_write_byte(rtlpriv, REG_APSD_CTRL, 0x00);
3017        /* e.  SYS_FUNC_EN 0x02[7:0] = 0xE2  reset BB TRX function again */
3018        /* f.  SYS_FUNC_EN 0x02[7:0] = 0xE3  enable BB TRX function*/
3019        rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN, 0xE2);
3020        rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN, 0xE3);
3021        /* g.   txpause 0x522[7:0] = 0x00  enable mac tx queue */
3022        rtl_write_byte(rtlpriv, REG_TXPAUSE, 0x00);
3023}
3024
3025static void _rtl92d_phy_set_rfsleep(struct ieee80211_hw *hw)
3026{
3027        struct rtl_priv *rtlpriv = rtl_priv(hw);
3028        u32 u4btmp;
3029        u8 delay = 5;
3030
3031        /* a.   TXPAUSE 0x522[7:0] = 0xFF  Pause MAC TX queue  */
3032        rtl_write_byte(rtlpriv, REG_TXPAUSE, 0xFF);
3033        /* b.   RF path 0 offset 0x00 = 0x00  disable RF  */
3034        rtl_set_rfreg(hw, RF90_PATH_A, 0x00, RFREG_OFFSET_MASK, 0x00);
3035        /* c.   APSD_CTRL 0x600[7:0] = 0x40 */
3036        rtl_write_byte(rtlpriv, REG_APSD_CTRL, 0x40);
3037        /* d. APSD_CTRL 0x600[7:0] = 0x00
3038         * APSD_CTRL 0x600[7:0] = 0x00
3039         * RF path 0 offset 0x00 = 0x00
3040         * APSD_CTRL 0x600[7:0] = 0x40
3041         * */
3042        u4btmp = rtl_get_rfreg(hw, RF90_PATH_A, 0, RFREG_OFFSET_MASK);
3043        while (u4btmp != 0 && delay > 0) {
3044                rtl_write_byte(rtlpriv, REG_APSD_CTRL, 0x0);
3045                rtl_set_rfreg(hw, RF90_PATH_A, 0x00, RFREG_OFFSET_MASK, 0x00);
3046                rtl_write_byte(rtlpriv, REG_APSD_CTRL, 0x40);
3047                u4btmp = rtl_get_rfreg(hw, RF90_PATH_A, 0, RFREG_OFFSET_MASK);
3048                delay--;
3049        }
3050        if (delay == 0) {
3051                /* Jump out the LPS turn off sequence to RF_ON_EXCEP */
3052                rtl_write_byte(rtlpriv, REG_APSD_CTRL, 0x00);
3053
3054                rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN, 0xE2);
3055                rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN, 0xE3);
3056                rtl_write_byte(rtlpriv, REG_TXPAUSE, 0x00);
3057                RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD,
3058                         "Fail !!! Switch RF timeout\n");
3059                return;
3060        }
3061        /* e.   For PCIE: SYS_FUNC_EN 0x02[7:0] = 0xE2 reset BB TRX function */
3062        rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN, 0xE2);
3063        /* f.   SPS_CTRL 0x11[7:0] = 0x22 */
3064        if (rtlpriv->rtlhal.macphymode == SINGLEMAC_SINGLEPHY)
3065                rtl_write_byte(rtlpriv, REG_SPS0_CTRL, 0x22);
3066        /* g.    SYS_CLKR 0x08[11] = 0  gated MAC clock */
3067}
3068
3069bool rtl92d_phy_set_rf_power_state(struct ieee80211_hw *hw,
3070                                   enum rf_pwrstate rfpwr_state)
3071{
3072
3073        bool bresult = true;
3074        struct rtl_priv *rtlpriv = rtl_priv(hw);
3075        struct rtl_pci_priv *pcipriv = rtl_pcipriv(hw);
3076        struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
3077        struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
3078        struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
3079        u8 i, queue_id;
3080        struct rtl8192_tx_ring *ring = NULL;
3081
3082        if (rfpwr_state == ppsc->rfpwr_state)
3083                return false;
3084        switch (rfpwr_state) {
3085        case ERFON:
3086                if ((ppsc->rfpwr_state == ERFOFF) &&
3087                    RT_IN_PS_LEVEL(ppsc, RT_RF_OFF_LEVL_HALT_NIC)) {
3088                        bool rtstatus;
3089                        u32 InitializeCount = 0;
3090                        do {
3091                                InitializeCount++;
3092                                RT_TRACE(rtlpriv, COMP_RF, DBG_DMESG,
3093                                         "IPS Set eRf nic enable\n");
3094                                rtstatus = rtl_ps_enable_nic(hw);
3095                        } while (!rtstatus && (InitializeCount < 10));
3096
3097                        RT_CLEAR_PS_LEVEL(ppsc,
3098                                          RT_RF_OFF_LEVL_HALT_NIC);
3099                } else {
3100                        RT_TRACE(rtlpriv, COMP_POWER, DBG_DMESG,
3101                                 "awake, sleeped:%d ms state_inap:%x\n",
3102                                 jiffies_to_msecs(jiffies -
3103                                                  ppsc->last_sleep_jiffies),
3104                                 rtlpriv->psc.state_inap);
3105                        ppsc->last_awake_jiffies = jiffies;
3106                        _rtl92d_phy_set_rfon(hw);
3107                }
3108
3109                if (mac->link_state == MAC80211_LINKED)
3110                        rtlpriv->cfg->ops->led_control(hw,
3111                                         LED_CTL_LINK);
3112                else
3113                        rtlpriv->cfg->ops->led_control(hw,
3114                                         LED_CTL_NO_LINK);
3115                break;
3116        case ERFOFF:
3117                if (ppsc->reg_rfps_level & RT_RF_OFF_LEVL_HALT_NIC) {
3118                        RT_TRACE(rtlpriv, COMP_RF, DBG_DMESG,
3119                                 "IPS Set eRf nic disable\n");
3120                        rtl_ps_disable_nic(hw);
3121                        RT_SET_PS_LEVEL(ppsc, RT_RF_OFF_LEVL_HALT_NIC);
3122                } else {
3123                        if (ppsc->rfoff_reason == RF_CHANGE_BY_IPS)
3124                                rtlpriv->cfg->ops->led_control(hw,
3125                                                 LED_CTL_NO_LINK);
3126                        else
3127                                rtlpriv->cfg->ops->led_control(hw,
3128                                                 LED_CTL_POWER_OFF);
3129                }
3130                break;
3131        case ERFSLEEP:
3132                if (ppsc->rfpwr_state == ERFOFF)
3133                        return false;
3134
3135                for (queue_id = 0, i = 0;
3136                     queue_id < RTL_PCI_MAX_TX_QUEUE_COUNT;) {
3137                        ring = &pcipriv->dev.tx_ring[queue_id];
3138                        if (skb_queue_len(&ring->queue) == 0 ||
3139                            queue_id == BEACON_QUEUE) {
3140                                queue_id++;
3141                                continue;
3142                        } else if (rtlpci->pdev->current_state != PCI_D0) {
3143                                RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD,
3144                                         "eRf Off/Sleep: %d times TcbBusyQueue[%d] !=0 but lower power state!\n",
3145                                         i + 1, queue_id);
3146                                break;
3147                        } else {
3148                                RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
3149                                         "eRf Off/Sleep: %d times TcbBusyQueue[%d] =%d before doze!\n",
3150                                         i + 1, queue_id,
3151                                         skb_queue_len(&ring->queue));
3152                                udelay(10);
3153                                i++;
3154                        }
3155
3156                        if (i >= MAX_DOZE_WAITING_TIMES_9x) {
3157                                RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
3158                                         "ERFOFF: %d times TcbBusyQueue[%d] = %d !\n",
3159                                         MAX_DOZE_WAITING_TIMES_9x, queue_id,
3160                                         skb_queue_len(&ring->queue));
3161                                break;
3162                        }
3163                }
3164                RT_TRACE(rtlpriv, COMP_POWER, DBG_DMESG,
3165                         "Set rfsleep awaked:%d ms\n",
3166                         jiffies_to_msecs(jiffies - ppsc->last_awake_jiffies));
3167                RT_TRACE(rtlpriv, COMP_POWER, DBG_DMESG,
3168                         "sleep awaked:%d ms state_inap:%x\n",
3169                         jiffies_to_msecs(jiffies -
3170                                          ppsc->last_awake_jiffies),
3171                         rtlpriv->psc.state_inap);
3172                ppsc->last_sleep_jiffies = jiffies;
3173                _rtl92d_phy_set_rfsleep(hw);
3174                break;
3175        default:
3176                pr_err("switch case %#x not processed\n",
3177                       rfpwr_state);
3178                bresult = false;
3179                break;
3180        }
3181        if (bresult)
3182                ppsc->rfpwr_state = rfpwr_state;
3183        return bresult;
3184}
3185
3186void rtl92d_phy_config_macphymode(struct ieee80211_hw *hw)
3187{
3188        struct rtl_priv *rtlpriv = rtl_priv(hw);
3189        struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
3190        u8 offset = REG_MAC_PHY_CTRL_NORMAL;
3191
3192        switch (rtlhal->macphymode) {
3193        case DUALMAC_DUALPHY:
3194                RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
3195                         "MacPhyMode: DUALMAC_DUALPHY\n");
3196                rtl_write_byte(rtlpriv, offset, 0xF3);
3197                break;
3198        case SINGLEMAC_SINGLEPHY:
3199                RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
3200                         "MacPhyMode: SINGLEMAC_SINGLEPHY\n");
3201                rtl_write_byte(rtlpriv, offset, 0xF4);
3202                break;
3203        case DUALMAC_SINGLEPHY:
3204                RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
3205                         "MacPhyMode: DUALMAC_SINGLEPHY\n");
3206                rtl_write_byte(rtlpriv, offset, 0xF1);
3207                break;
3208        }
3209}
3210
3211void rtl92d_phy_config_macphymode_info(struct ieee80211_hw *hw)
3212{
3213        struct rtl_priv *rtlpriv = rtl_priv(hw);
3214        struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
3215        struct rtl_phy *rtlphy = &(rtlpriv->phy);
3216
3217        switch (rtlhal->macphymode) {
3218        case DUALMAC_SINGLEPHY:
3219                rtlphy->rf_type = RF_2T2R;
3220                rtlhal->version |= RF_TYPE_2T2R;
3221                rtlhal->bandset = BAND_ON_BOTH;
3222                rtlhal->current_bandtype = BAND_ON_2_4G;
3223                break;
3224
3225        case SINGLEMAC_SINGLEPHY:
3226                rtlphy->rf_type = RF_2T2R;
3227                rtlhal->version |= RF_TYPE_2T2R;
3228                rtlhal->bandset = BAND_ON_BOTH;
3229                rtlhal->current_bandtype = BAND_ON_2_4G;
3230                break;
3231
3232        case DUALMAC_DUALPHY:
3233                rtlphy->rf_type = RF_1T1R;
3234                rtlhal->version &= RF_TYPE_1T1R;
3235                /* Now we let MAC0 run on 5G band. */
3236                if (rtlhal->interfaceindex == 0) {
3237                        rtlhal->bandset = BAND_ON_5G;
3238                        rtlhal->current_bandtype = BAND_ON_5G;
3239                } else {
3240                        rtlhal->bandset = BAND_ON_2_4G;
3241                        rtlhal->current_bandtype = BAND_ON_2_4G;
3242                }
3243                break;
3244        default:
3245                break;
3246        }
3247}
3248
3249u8 rtl92d_get_chnlgroup_fromarray(u8 chnl)
3250{
3251        u8 group;
3252        u8 channel_info[59] = {
3253                1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
3254                36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56,
3255                58, 60, 62, 64, 100, 102, 104, 106, 108,
3256                110, 112, 114, 116, 118, 120, 122, 124,
3257                126, 128, 130, 132, 134, 136, 138, 140,
3258                149, 151, 153, 155, 157, 159, 161, 163,
3259                165
3260        };
3261
3262        if (channel_info[chnl] <= 3)
3263                group = 0;
3264        else if (channel_info[chnl] <= 9)
3265                group = 1;
3266        else if (channel_info[chnl] <= 14)
3267                group = 2;
3268        else if (channel_info[chnl] <= 44)
3269                group = 3;
3270        else if (channel_info[chnl] <= 54)
3271                group = 4;
3272        else if (channel_info[chnl] <= 64)
3273                group = 5;
3274        else if (channel_info[chnl] <= 112)
3275                group = 6;
3276        else if (channel_info[chnl] <= 126)
3277                group = 7;
3278        else if (channel_info[chnl] <= 140)
3279                group = 8;
3280        else if (channel_info[chnl] <= 153)
3281                group = 9;
3282        else if (channel_info[chnl] <= 159)
3283                group = 10;
3284        else
3285                group = 11;
3286        return group;
3287}
3288
3289void rtl92d_phy_set_poweron(struct ieee80211_hw *hw)
3290{
3291        struct rtl_priv *rtlpriv = rtl_priv(hw);
3292        struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
3293        unsigned long flags;
3294        u8 value8;
3295        u16 i;
3296        u32 mac_reg = (rtlhal->interfaceindex == 0 ? REG_MAC0 : REG_MAC1);
3297
3298        /* notice fw know band status  0x81[1]/0x53[1] = 0: 5G, 1: 2G */
3299        if (rtlhal->current_bandtype == BAND_ON_2_4G) {
3300                value8 = rtl_read_byte(rtlpriv, mac_reg);
3301                value8 |= BIT(1);
3302                rtl_write_byte(rtlpriv, mac_reg, value8);
3303        } else {
3304                value8 = rtl_read_byte(rtlpriv, mac_reg);
3305                value8 &= (~BIT(1));
3306                rtl_write_byte(rtlpriv, mac_reg, value8);
3307        }
3308
3309        if (rtlhal->macphymode == SINGLEMAC_SINGLEPHY) {
3310                value8 = rtl_read_byte(rtlpriv, REG_MAC0);
3311                rtl_write_byte(rtlpriv, REG_MAC0, value8 | MAC0_ON);
3312        } else {
3313                spin_lock_irqsave(&globalmutex_power, flags);
3314                if (rtlhal->interfaceindex == 0) {
3315                        value8 = rtl_read_byte(rtlpriv, REG_MAC0);
3316                        rtl_write_byte(rtlpriv, REG_MAC0, value8 | MAC0_ON);
3317                } else {
3318                        value8 = rtl_read_byte(rtlpriv, REG_MAC1);
3319                        rtl_write_byte(rtlpriv, REG_MAC1, value8 | MAC1_ON);
3320                }
3321                value8 = rtl_read_byte(rtlpriv, REG_POWER_OFF_IN_PROCESS);
3322                spin_unlock_irqrestore(&globalmutex_power, flags);
3323                for (i = 0; i < 200; i++) {
3324                        if ((value8 & BIT(7)) == 0) {
3325                                break;
3326                        } else {
3327                                udelay(500);
3328                                spin_lock_irqsave(&globalmutex_power, flags);
3329                                value8 = rtl_read_byte(rtlpriv,
3330                                                    REG_POWER_OFF_IN_PROCESS);
3331                                spin_unlock_irqrestore(&globalmutex_power,
3332                                                       flags);
3333                        }
3334                }
3335                if (i == 200)
3336                        WARN_ONCE(true, "rtl8192de: Another mac power off over time\n");
3337        }
3338}
3339
3340void rtl92d_phy_config_maccoexist_rfpage(struct ieee80211_hw *hw)
3341{
3342        struct rtl_priv *rtlpriv = rtl_priv(hw);
3343
3344        switch (rtlpriv->rtlhal.macphymode) {
3345        case DUALMAC_DUALPHY:
3346                rtl_write_byte(rtlpriv, REG_DMC, 0x0);
3347                rtl_write_byte(rtlpriv, REG_RX_PKT_LIMIT, 0x08);
3348                rtl_write_word(rtlpriv, REG_TRXFF_BNDY + 2, 0x13ff);
3349                break;
3350        case DUALMAC_SINGLEPHY:
3351                rtl_write_byte(rtlpriv, REG_DMC, 0xf8);
3352                rtl_write_byte(rtlpriv, REG_RX_PKT_LIMIT, 0x08);
3353                rtl_write_word(rtlpriv, REG_TRXFF_BNDY + 2, 0x13ff);
3354                break;
3355        case SINGLEMAC_SINGLEPHY:
3356                rtl_write_byte(rtlpriv, REG_DMC, 0x0);
3357                rtl_write_byte(rtlpriv, REG_RX_PKT_LIMIT, 0x10);
3358                rtl_write_word(rtlpriv, (REG_TRXFF_BNDY + 2), 0x27FF);
3359                break;
3360        default:
3361                break;
3362        }
3363}
3364
3365void rtl92d_update_bbrf_configuration(struct ieee80211_hw *hw)
3366{
3367        struct rtl_priv *rtlpriv = rtl_priv(hw);
3368        struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
3369        struct rtl_phy *rtlphy = &(rtlpriv->phy);
3370        struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
3371        u8 rfpath, i;
3372
3373        RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "==>\n");
3374        /* r_select_5G for path_A/B 0 for 2.4G, 1 for 5G */
3375        if (rtlhal->current_bandtype == BAND_ON_2_4G) {
3376                /* r_select_5G for path_A/B,0x878 */
3377                rtl_set_bbreg(hw, RFPGA0_XAB_RFPARAMETER, BIT(0), 0x0);
3378                rtl_set_bbreg(hw, RFPGA0_XAB_RFPARAMETER, BIT(15), 0x0);
3379                if (rtlhal->macphymode != DUALMAC_DUALPHY) {
3380                        rtl_set_bbreg(hw, RFPGA0_XAB_RFPARAMETER, BIT(16), 0x0);
3381                        rtl_set_bbreg(hw, RFPGA0_XAB_RFPARAMETER, BIT(31), 0x0);
3382                }
3383                /* rssi_table_select:index 0 for 2.4G.1~3 for 5G,0xc78 */
3384                rtl_set_bbreg(hw, ROFDM0_AGCRSSITABLE, BIT(6) | BIT(7), 0x0);
3385                /* fc_area  0xd2c */
3386                rtl_set_bbreg(hw, ROFDM1_CFOTRACKING, BIT(14) | BIT(13), 0x0);
3387                /* 5G LAN ON */
3388                rtl_set_bbreg(hw, 0xB30, 0x00F00000, 0xa);
3389                /* TX BB gain shift*1,Just for testchip,0xc80,0xc88 */
3390                rtl_set_bbreg(hw, ROFDM0_XATxIQIMBALANCE, MASKDWORD,
3391                              0x40000100);
3392                rtl_set_bbreg(hw, ROFDM0_XBTxIQIMBALANCE, MASKDWORD,
3393                              0x40000100);
3394                if (rtlhal->macphymode == DUALMAC_DUALPHY) {
3395                        rtl_set_bbreg(hw, RFPGA0_XAB_RFINTERFACESW,
3396                                      BIT(10) | BIT(6) | BIT(5),
3397                                      ((rtlefuse->eeprom_c9 & BIT(3)) >> 3) |
3398                                      (rtlefuse->eeprom_c9 & BIT(1)) |
3399                                      ((rtlefuse->eeprom_cc & BIT(1)) << 4));
3400                        rtl_set_bbreg(hw, RFPGA0_XA_RFINTERFACEOE,
3401                                      BIT(10) | BIT(6) | BIT(5),
3402                                      ((rtlefuse->eeprom_c9 & BIT(2)) >> 2) |
3403                                      ((rtlefuse->eeprom_c9 & BIT(0)) << 1) |
3404                                      ((rtlefuse->eeprom_cc & BIT(0)) << 5));
3405                        rtl_set_bbreg(hw, RFPGA0_XAB_RFPARAMETER, BIT(15), 0);
3406                } else {
3407                        rtl_set_bbreg(hw, RFPGA0_XAB_RFINTERFACESW,
3408                                      BIT(26) | BIT(22) | BIT(21) | BIT(10) |
3409                                      BIT(6) | BIT(5),
3410                                      ((rtlefuse->eeprom_c9 & BIT(3)) >> 3) |
3411                                      (rtlefuse->eeprom_c9 & BIT(1)) |
3412                                      ((rtlefuse->eeprom_cc & BIT(1)) << 4) |
3413                                      ((rtlefuse->eeprom_c9 & BIT(7)) << 9) |
3414                                      ((rtlefuse->eeprom_c9 & BIT(5)) << 12) |
3415                                      ((rtlefuse->eeprom_cc & BIT(3)) << 18));
3416                        rtl_set_bbreg(hw, RFPGA0_XA_RFINTERFACEOE,
3417                                      BIT(10) | BIT(6) | BIT(5),
3418                                      ((rtlefuse->eeprom_c9 & BIT(2)) >> 2) |
3419                                      ((rtlefuse->eeprom_c9 & BIT(0)) << 1) |
3420                                      ((rtlefuse->eeprom_cc & BIT(0)) << 5));
3421                        rtl_set_bbreg(hw, RFPGA0_XB_RFINTERFACEOE,
3422                                      BIT(10) | BIT(6) | BIT(5),
3423                                      ((rtlefuse->eeprom_c9 & BIT(6)) >> 6) |
3424                                      ((rtlefuse->eeprom_c9 & BIT(4)) >> 3) |
3425                                      ((rtlefuse->eeprom_cc & BIT(2)) << 3));
3426                        rtl_set_bbreg(hw, RFPGA0_XAB_RFPARAMETER,
3427                                      BIT(31) | BIT(15), 0);
3428                }
3429                /* 1.5V_LDO */
3430        } else {
3431                /* r_select_5G for path_A/B */
3432                rtl_set_bbreg(hw, RFPGA0_XAB_RFPARAMETER, BIT(0), 0x1);
3433                rtl_set_bbreg(hw, RFPGA0_XAB_RFPARAMETER, BIT(15), 0x1);
3434                if (rtlhal->macphymode != DUALMAC_DUALPHY) {
3435                        rtl_set_bbreg(hw, RFPGA0_XAB_RFPARAMETER, BIT(16), 0x1);
3436                        rtl_set_bbreg(hw, RFPGA0_XAB_RFPARAMETER, BIT(31), 0x1);
3437                }
3438                /* rssi_table_select:index 0 for 2.4G.1~3 for 5G */
3439                rtl_set_bbreg(hw, ROFDM0_AGCRSSITABLE, BIT(6) | BIT(7), 0x1);
3440                /* fc_area */
3441                rtl_set_bbreg(hw, ROFDM1_CFOTRACKING, BIT(14) | BIT(13), 0x1);
3442                /* 5G LAN ON */
3443                rtl_set_bbreg(hw, 0xB30, 0x00F00000, 0x0);
3444                /* TX BB gain shift,Just for testchip,0xc80,0xc88 */
3445                if (rtlefuse->internal_pa_5g[0])
3446                        rtl_set_bbreg(hw, ROFDM0_XATxIQIMBALANCE, MASKDWORD,
3447                                      0x2d4000b5);
3448                else
3449                        rtl_set_bbreg(hw, ROFDM0_XATxIQIMBALANCE, MASKDWORD,
3450                                      0x20000080);
3451                if (rtlefuse->internal_pa_5g[1])
3452                        rtl_set_bbreg(hw, ROFDM0_XBTxIQIMBALANCE, MASKDWORD,
3453                                      0x2d4000b5);
3454                else
3455                        rtl_set_bbreg(hw, ROFDM0_XBTxIQIMBALANCE, MASKDWORD,
3456                                      0x20000080);
3457                if (rtlhal->macphymode == DUALMAC_DUALPHY) {
3458                        rtl_set_bbreg(hw, RFPGA0_XAB_RFINTERFACESW,
3459                                      BIT(10) | BIT(6) | BIT(5),
3460                                      (rtlefuse->eeprom_cc & BIT(5)));
3461                        rtl_set_bbreg(hw, RFPGA0_XA_RFINTERFACEOE, BIT(10),
3462                                      ((rtlefuse->eeprom_cc & BIT(4)) >> 4));
3463                        rtl_set_bbreg(hw, RFPGA0_XAB_RFPARAMETER, BIT(15),
3464                                      (rtlefuse->eeprom_cc & BIT(4)) >> 4);
3465                } else {
3466                        rtl_set_bbreg(hw, RFPGA0_XAB_RFINTERFACESW,
3467                                      BIT(26) | BIT(22) | BIT(21) | BIT(10) |
3468                                      BIT(6) | BIT(5),
3469                                      (rtlefuse->eeprom_cc & BIT(5)) |
3470                                      ((rtlefuse->eeprom_cc & BIT(7)) << 14));
3471                        rtl_set_bbreg(hw, RFPGA0_XA_RFINTERFACEOE, BIT(10),
3472                                      ((rtlefuse->eeprom_cc & BIT(4)) >> 4));
3473                        rtl_set_bbreg(hw, RFPGA0_XB_RFINTERFACEOE, BIT(10),
3474                                      ((rtlefuse->eeprom_cc & BIT(6)) >> 6));
3475                        rtl_set_bbreg(hw, RFPGA0_XAB_RFPARAMETER,
3476                                      BIT(31) | BIT(15),
3477                                      ((rtlefuse->eeprom_cc & BIT(4)) >> 4) |
3478                                      ((rtlefuse->eeprom_cc & BIT(6)) << 10));
3479                }
3480        }
3481        /* update IQK related settings */
3482        rtl_set_bbreg(hw, ROFDM0_XARXIQIMBALANCE, MASKDWORD, 0x40000100);
3483        rtl_set_bbreg(hw, ROFDM0_XBRXIQIMBALANCE, MASKDWORD, 0x40000100);
3484        rtl_set_bbreg(hw, ROFDM0_XCTxAFE, 0xF0000000, 0x00);
3485        rtl_set_bbreg(hw, ROFDM0_ECCATHRESHOLD, BIT(30) | BIT(28) |
3486                      BIT(26) | BIT(24), 0x00);
3487        rtl_set_bbreg(hw, ROFDM0_XDTxAFE, 0xF0000000, 0x00);
3488        rtl_set_bbreg(hw, 0xca0, 0xF0000000, 0x00);
3489        rtl_set_bbreg(hw, ROFDM0_AGCRSSITABLE, 0x0000F000, 0x00);
3490
3491        /* Update RF */
3492        for (rfpath = RF90_PATH_A; rfpath < rtlphy->num_total_rfpath;
3493             rfpath++) {
3494                if (rtlhal->current_bandtype == BAND_ON_2_4G) {
3495                        /* MOD_AG for RF path_A 0x18 BIT8,BIT16 */
3496                        rtl_set_rfreg(hw, rfpath, RF_CHNLBW, BIT(8) | BIT(16) |
3497                                      BIT(18), 0);
3498                        /* RF0x0b[16:14] =3b'111 */
3499                        rtl_set_rfreg(hw, (enum radio_path)rfpath, 0x0B,
3500                                      0x1c000, 0x07);
3501                } else {
3502                        /* MOD_AG for RF path_A 0x18 BIT8,BIT16 */
3503                        rtl_set_rfreg(hw, rfpath, RF_CHNLBW, BIT(8) |
3504                                      BIT(16) | BIT(18),
3505                                      (BIT(16) | BIT(8)) >> 8);
3506                }
3507        }
3508        /* Update for all band. */
3509        /* DMDP */
3510        if (rtlphy->rf_type == RF_1T1R) {
3511                /* Use antenna 0,0xc04,0xd04 */
3512                rtl_set_bbreg(hw, ROFDM0_TRXPATHENABLE, MASKBYTE0, 0x11);
3513                rtl_set_bbreg(hw, ROFDM1_TRXPATHENABLE, BDWORD, 0x1);
3514
3515                /* enable ad/da clock1 for dual-phy reg0x888 */
3516                if (rtlhal->interfaceindex == 0) {
3517                        rtl_set_bbreg(hw, RFPGA0_ADDALLOCKEN, BIT(12) |
3518                                      BIT(13), 0x3);
3519                } else {
3520                        rtl92d_phy_enable_anotherphy(hw, false);
3521                        RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD,
3522                                 "MAC1 use DBI to update 0x888\n");
3523                        /* 0x888 */
3524                        rtl92de_write_dword_dbi(hw, RFPGA0_ADDALLOCKEN,
3525                                                rtl92de_read_dword_dbi(hw,
3526                                                RFPGA0_ADDALLOCKEN,
3527                                                BIT(3)) | BIT(12) | BIT(13),
3528                                                BIT(3));
3529                        rtl92d_phy_powerdown_anotherphy(hw, false);
3530                }
3531        } else {
3532                /* Single PHY */
3533                /* Use antenna 0 & 1,0xc04,0xd04 */
3534                rtl_set_bbreg(hw, ROFDM0_TRXPATHENABLE, MASKBYTE0, 0x33);
3535                rtl_set_bbreg(hw, ROFDM1_TRXPATHENABLE, BDWORD, 0x3);
3536                /* disable ad/da clock1,0x888 */
3537                rtl_set_bbreg(hw, RFPGA0_ADDALLOCKEN, BIT(12) | BIT(13), 0);
3538        }
3539        for (rfpath = RF90_PATH_A; rfpath < rtlphy->num_total_rfpath;
3540             rfpath++) {
3541                rtlphy->rfreg_chnlval[rfpath] = rtl_get_rfreg(hw, rfpath,
3542                                                RF_CHNLBW, RFREG_OFFSET_MASK);
3543                rtlphy->reg_rf3c[rfpath] = rtl_get_rfreg(hw, rfpath, 0x3C,
3544                        RFREG_OFFSET_MASK);
3545        }
3546        for (i = 0; i < 2; i++)
3547                RT_TRACE(rtlpriv, COMP_RF, DBG_LOUD, "RF 0x18 = 0x%x\n",
3548                         rtlphy->rfreg_chnlval[i]);
3549        RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "<==\n");
3550
3551}
3552
3553bool rtl92d_phy_check_poweroff(struct ieee80211_hw *hw)
3554{
3555        struct rtl_priv *rtlpriv = rtl_priv(hw);
3556        struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
3557        u8 u1btmp;
3558        unsigned long flags;
3559
3560        if (rtlhal->macphymode == SINGLEMAC_SINGLEPHY) {
3561                u1btmp = rtl_read_byte(rtlpriv, REG_MAC0);
3562                rtl_write_byte(rtlpriv, REG_MAC0, u1btmp & (~MAC0_ON));
3563                return true;
3564        }
3565        spin_lock_irqsave(&globalmutex_power, flags);
3566        if (rtlhal->interfaceindex == 0) {
3567                u1btmp = rtl_read_byte(rtlpriv, REG_MAC0);
3568                rtl_write_byte(rtlpriv, REG_MAC0, u1btmp & (~MAC0_ON));
3569                u1btmp = rtl_read_byte(rtlpriv, REG_MAC1);
3570                u1btmp &= MAC1_ON;
3571        } else {
3572                u1btmp = rtl_read_byte(rtlpriv, REG_MAC1);
3573                rtl_write_byte(rtlpriv, REG_MAC1, u1btmp & (~MAC1_ON));
3574                u1btmp = rtl_read_byte(rtlpriv, REG_MAC0);
3575                u1btmp &= MAC0_ON;
3576        }
3577        if (u1btmp) {
3578                spin_unlock_irqrestore(&globalmutex_power, flags);
3579                return false;
3580        }
3581        u1btmp = rtl_read_byte(rtlpriv, REG_POWER_OFF_IN_PROCESS);
3582        u1btmp |= BIT(7);
3583        rtl_write_byte(rtlpriv, REG_POWER_OFF_IN_PROCESS, u1btmp);
3584        spin_unlock_irqrestore(&globalmutex_power, flags);
3585        return true;
3586}
3587