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