0001
0002
0003
0004 #include "../wifi.h"
0005 #include "../pci.h"
0006 #include "../ps.h"
0007 #include "../core.h"
0008 #include "reg.h"
0009 #include "def.h"
0010 #include "phy.h"
0011 #include "rf.h"
0012 #include "dm.h"
0013 #include "table.h"
0014 #include "sw.h"
0015 #include "hw.h"
0016
0017 #define MAX_RF_IMR_INDEX 12
0018 #define MAX_RF_IMR_INDEX_NORMAL 13
0019 #define RF_REG_NUM_FOR_C_CUT_5G 6
0020 #define RF_REG_NUM_FOR_C_CUT_5G_INTERNALPA 7
0021 #define RF_REG_NUM_FOR_C_CUT_2G 5
0022 #define RF_CHNL_NUM_5G 19
0023 #define RF_CHNL_NUM_5G_40M 17
0024 #define TARGET_CHNL_NUM_5G 221
0025 #define TARGET_CHNL_NUM_2G 14
0026 #define CV_CURVE_CNT 64
0027
0028 static u32 rf_reg_for_5g_swchnl_normal[MAX_RF_IMR_INDEX_NORMAL] = {
0029 0, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x0
0030 };
0031
0032 static u8 rf_reg_for_c_cut_5g[RF_REG_NUM_FOR_C_CUT_5G] = {
0033 RF_SYN_G1, RF_SYN_G2, RF_SYN_G3, RF_SYN_G4, RF_SYN_G5, RF_SYN_G6
0034 };
0035
0036 static u8 rf_reg_for_c_cut_2g[RF_REG_NUM_FOR_C_CUT_2G] = {
0037 RF_SYN_G1, RF_SYN_G2, RF_SYN_G3, RF_SYN_G7, RF_SYN_G8
0038 };
0039
0040 static u8 rf_for_c_cut_5g_internal_pa[RF_REG_NUM_FOR_C_CUT_5G_INTERNALPA] = {
0041 0x0B, 0x48, 0x49, 0x4B, 0x03, 0x04, 0x0E
0042 };
0043
0044 static u32 rf_reg_mask_for_c_cut_2g[RF_REG_NUM_FOR_C_CUT_2G] = {
0045 BIT(19) | BIT(18) | BIT(17) | BIT(14) | BIT(1),
0046 BIT(10) | BIT(9),
0047 BIT(18) | BIT(17) | BIT(16) | BIT(1),
0048 BIT(2) | BIT(1),
0049 BIT(15) | BIT(14) | BIT(13) | BIT(12) | BIT(11)
0050 };
0051
0052 static u8 rf_chnl_5g[RF_CHNL_NUM_5G] = {
0053 36, 40, 44, 48, 52, 56, 60, 64, 100, 104, 108,
0054 112, 116, 120, 124, 128, 132, 136, 140
0055 };
0056
0057 static u8 rf_chnl_5g_40m[RF_CHNL_NUM_5G_40M] = {
0058 38, 42, 46, 50, 54, 58, 62, 102, 106, 110, 114,
0059 118, 122, 126, 130, 134, 138
0060 };
0061 static u32 rf_reg_pram_c_5g[5][RF_REG_NUM_FOR_C_CUT_5G] = {
0062 {0xE43BE, 0xFC638, 0x77C0A, 0xDE471, 0xd7110, 0x8EB04},
0063 {0xE43BE, 0xFC078, 0xF7C1A, 0xE0C71, 0xD7550, 0xAEB04},
0064 {0xE43BF, 0xFF038, 0xF7C0A, 0xDE471, 0xE5550, 0xAEB04},
0065 {0xE43BF, 0xFF079, 0xF7C1A, 0xDE471, 0xE5550, 0xAEB04},
0066 {0xE43BF, 0xFF038, 0xF7C1A, 0xDE471, 0xd7550, 0xAEB04}
0067 };
0068
0069 static u32 rf_reg_param_for_c_cut_2g[3][RF_REG_NUM_FOR_C_CUT_2G] = {
0070 {0x643BC, 0xFC038, 0x77C1A, 0x41289, 0x01840},
0071 {0x643BC, 0xFC038, 0x07C1A, 0x41289, 0x01840},
0072 {0x243BC, 0xFC438, 0x07C1A, 0x4128B, 0x0FC41}
0073 };
0074
0075 static u32 rf_syn_g4_for_c_cut_2g = 0xD1C31 & 0x7FF;
0076
0077 static u32 rf_pram_c_5g_int_pa[3][RF_REG_NUM_FOR_C_CUT_5G_INTERNALPA] = {
0078 {0x01a00, 0x40443, 0x00eb5, 0x89bec, 0x94a12, 0x94a12, 0x94a12},
0079 {0x01800, 0xc0443, 0x00730, 0x896ee, 0x94a52, 0x94a52, 0x94a52},
0080 {0x01800, 0xc0443, 0x00730, 0x896ee, 0x94a12, 0x94a12, 0x94a12}
0081 };
0082
0083
0084 static u32 rf_imr_param_normal[1][3][MAX_RF_IMR_INDEX_NORMAL] = {
0085 {
0086
0087 {
0088 0x70000, 0x00ff0, 0x4400f, 0x00ff0, 0x0, 0x0, 0x0,
0089 0x0, 0x0, 0x64888, 0xe266c, 0x00090, 0x22fff
0090 },
0091
0092 {
0093 0x70000, 0x22880, 0x4470f, 0x55880, 0x00070, 0x88000,
0094 0x0, 0x88080, 0x70000, 0x64a82, 0xe466c, 0x00090,
0095 0x32c9a
0096 },
0097
0098 {
0099 0x70000, 0x44880, 0x4477f, 0x77880, 0x00070, 0x88000,
0100 0x0, 0x880b0, 0x0, 0x64b82, 0xe466c, 0x00090, 0x32c9a
0101 }
0102 }
0103 };
0104
0105 static u32 curveindex_5g[TARGET_CHNL_NUM_5G] = {0};
0106
0107 static u32 curveindex_2g[TARGET_CHNL_NUM_2G] = {0};
0108
0109 static u32 targetchnl_5g[TARGET_CHNL_NUM_5G] = {
0110 25141, 25116, 25091, 25066, 25041,
0111 25016, 24991, 24966, 24941, 24917,
0112 24892, 24867, 24843, 24818, 24794,
0113 24770, 24765, 24721, 24697, 24672,
0114 24648, 24624, 24600, 24576, 24552,
0115 24528, 24504, 24480, 24457, 24433,
0116 24409, 24385, 24362, 24338, 24315,
0117 24291, 24268, 24245, 24221, 24198,
0118 24175, 24151, 24128, 24105, 24082,
0119 24059, 24036, 24013, 23990, 23967,
0120 23945, 23922, 23899, 23876, 23854,
0121 23831, 23809, 23786, 23764, 23741,
0122 23719, 23697, 23674, 23652, 23630,
0123 23608, 23586, 23564, 23541, 23519,
0124 23498, 23476, 23454, 23432, 23410,
0125 23388, 23367, 23345, 23323, 23302,
0126 23280, 23259, 23237, 23216, 23194,
0127 23173, 23152, 23130, 23109, 23088,
0128 23067, 23046, 23025, 23003, 22982,
0129 22962, 22941, 22920, 22899, 22878,
0130 22857, 22837, 22816, 22795, 22775,
0131 22754, 22733, 22713, 22692, 22672,
0132 22652, 22631, 22611, 22591, 22570,
0133 22550, 22530, 22510, 22490, 22469,
0134 22449, 22429, 22409, 22390, 22370,
0135 22350, 22336, 22310, 22290, 22271,
0136 22251, 22231, 22212, 22192, 22173,
0137 22153, 22134, 22114, 22095, 22075,
0138 22056, 22037, 22017, 21998, 21979,
0139 21960, 21941, 21921, 21902, 21883,
0140 21864, 21845, 21826, 21807, 21789,
0141 21770, 21751, 21732, 21713, 21695,
0142 21676, 21657, 21639, 21620, 21602,
0143 21583, 21565, 21546, 21528, 21509,
0144 21491, 21473, 21454, 21436, 21418,
0145 21400, 21381, 21363, 21345, 21327,
0146 21309, 21291, 21273, 21255, 21237,
0147 21219, 21201, 21183, 21166, 21148,
0148 21130, 21112, 21095, 21077, 21059,
0149 21042, 21024, 21007, 20989, 20972,
0150 25679, 25653, 25627, 25601, 25575,
0151 25549, 25523, 25497, 25471, 25446,
0152 25420, 25394, 25369, 25343, 25318,
0153 25292, 25267, 25242, 25216, 25191,
0154 25166
0155 };
0156
0157
0158 static u32 targetchnl_2g[TARGET_CHNL_NUM_2G] = {
0159 26084, 26030, 25976, 25923, 25869, 25816, 25764,
0160 25711, 25658, 25606, 25554, 25502, 25451, 25328
0161 };
0162
0163 static const u8 channel_all[59] = {
0164 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
0165 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58,
0166 60, 62, 64, 100, 102, 104, 106, 108, 110, 112,
0167 114, 116, 118, 120, 122, 124, 126, 128, 130,
0168 132, 134, 136, 138, 140, 149, 151, 153, 155,
0169 157, 159, 161, 163, 165
0170 };
0171
0172 static u32 _rtl92d_phy_calculate_bit_shift(u32 bitmask)
0173 {
0174 u32 i = ffs(bitmask);
0175
0176 return i ? i - 1 : 32;
0177 }
0178
0179 u32 rtl92d_phy_query_bb_reg(struct ieee80211_hw *hw, u32 regaddr, u32 bitmask)
0180 {
0181 struct rtl_priv *rtlpriv = rtl_priv(hw);
0182 struct rtl_hal *rtlhal = rtl_hal(rtlpriv);
0183 u32 returnvalue, originalvalue, bitshift;
0184
0185 rtl_dbg(rtlpriv, COMP_RF, DBG_TRACE, "regaddr(%#x), bitmask(%#x)\n",
0186 regaddr, bitmask);
0187 if (rtlhal->during_mac1init_radioa || rtlhal->during_mac0init_radiob) {
0188 u8 dbi_direct = 0;
0189
0190
0191
0192 if (rtlhal->during_mac1init_radioa)
0193 dbi_direct = BIT(3);
0194 else if (rtlhal->during_mac0init_radiob)
0195 dbi_direct = BIT(3) | BIT(2);
0196 originalvalue = rtl92de_read_dword_dbi(hw, (u16)regaddr,
0197 dbi_direct);
0198 } else {
0199 originalvalue = rtl_read_dword(rtlpriv, regaddr);
0200 }
0201 bitshift = _rtl92d_phy_calculate_bit_shift(bitmask);
0202 returnvalue = (originalvalue & bitmask) >> bitshift;
0203 rtl_dbg(rtlpriv, COMP_RF, DBG_TRACE,
0204 "BBR MASK=0x%x Addr[0x%x]=0x%x\n",
0205 bitmask, regaddr, originalvalue);
0206 return returnvalue;
0207 }
0208
0209 void rtl92d_phy_set_bb_reg(struct ieee80211_hw *hw,
0210 u32 regaddr, u32 bitmask, u32 data)
0211 {
0212 struct rtl_priv *rtlpriv = rtl_priv(hw);
0213 struct rtl_hal *rtlhal = rtl_hal(rtlpriv);
0214 u8 dbi_direct = 0;
0215 u32 originalvalue, bitshift;
0216
0217 rtl_dbg(rtlpriv, COMP_RF, DBG_TRACE,
0218 "regaddr(%#x), bitmask(%#x), data(%#x)\n",
0219 regaddr, bitmask, data);
0220 if (rtlhal->during_mac1init_radioa)
0221 dbi_direct = BIT(3);
0222 else if (rtlhal->during_mac0init_radiob)
0223
0224 dbi_direct = BIT(3) | BIT(2);
0225 if (bitmask != MASKDWORD) {
0226 if (rtlhal->during_mac1init_radioa ||
0227 rtlhal->during_mac0init_radiob)
0228 originalvalue = rtl92de_read_dword_dbi(hw,
0229 (u16) regaddr,
0230 dbi_direct);
0231 else
0232 originalvalue = rtl_read_dword(rtlpriv, regaddr);
0233 bitshift = _rtl92d_phy_calculate_bit_shift(bitmask);
0234 data = ((originalvalue & (~bitmask)) | (data << bitshift));
0235 }
0236 if (rtlhal->during_mac1init_radioa || rtlhal->during_mac0init_radiob)
0237 rtl92de_write_dword_dbi(hw, (u16) regaddr, data, dbi_direct);
0238 else
0239 rtl_write_dword(rtlpriv, regaddr, data);
0240 rtl_dbg(rtlpriv, COMP_RF, DBG_TRACE,
0241 "regaddr(%#x), bitmask(%#x), data(%#x)\n",
0242 regaddr, bitmask, data);
0243 }
0244
0245 static u32 _rtl92d_phy_rf_serial_read(struct ieee80211_hw *hw,
0246 enum radio_path rfpath, u32 offset)
0247 {
0248
0249 struct rtl_priv *rtlpriv = rtl_priv(hw);
0250 struct rtl_phy *rtlphy = &(rtlpriv->phy);
0251 struct bb_reg_def *pphyreg = &rtlphy->phyreg_def[rfpath];
0252 u32 newoffset;
0253 u32 tmplong, tmplong2;
0254 u8 rfpi_enable = 0;
0255 u32 retvalue;
0256
0257 newoffset = offset;
0258 tmplong = rtl_get_bbreg(hw, RFPGA0_XA_HSSIPARAMETER2, MASKDWORD);
0259 if (rfpath == RF90_PATH_A)
0260 tmplong2 = tmplong;
0261 else
0262 tmplong2 = rtl_get_bbreg(hw, pphyreg->rfhssi_para2, MASKDWORD);
0263 tmplong2 = (tmplong2 & (~BLSSIREADADDRESS)) |
0264 (newoffset << 23) | BLSSIREADEDGE;
0265 rtl_set_bbreg(hw, RFPGA0_XA_HSSIPARAMETER2, MASKDWORD,
0266 tmplong & (~BLSSIREADEDGE));
0267 udelay(10);
0268 rtl_set_bbreg(hw, pphyreg->rfhssi_para2, MASKDWORD, tmplong2);
0269 udelay(50);
0270 udelay(50);
0271 rtl_set_bbreg(hw, RFPGA0_XA_HSSIPARAMETER2, MASKDWORD,
0272 tmplong | BLSSIREADEDGE);
0273 udelay(10);
0274 if (rfpath == RF90_PATH_A)
0275 rfpi_enable = (u8) rtl_get_bbreg(hw, RFPGA0_XA_HSSIPARAMETER1,
0276 BIT(8));
0277 else if (rfpath == RF90_PATH_B)
0278 rfpi_enable = (u8) rtl_get_bbreg(hw, RFPGA0_XB_HSSIPARAMETER1,
0279 BIT(8));
0280 if (rfpi_enable)
0281 retvalue = rtl_get_bbreg(hw, pphyreg->rf_rbpi,
0282 BLSSIREADBACKDATA);
0283 else
0284 retvalue = rtl_get_bbreg(hw, pphyreg->rf_rb,
0285 BLSSIREADBACKDATA);
0286 rtl_dbg(rtlpriv, COMP_RF, DBG_TRACE, "RFR-%d Addr[0x%x] = 0x%x\n",
0287 rfpath, pphyreg->rf_rb, retvalue);
0288 return retvalue;
0289 }
0290
0291 static void _rtl92d_phy_rf_serial_write(struct ieee80211_hw *hw,
0292 enum radio_path rfpath,
0293 u32 offset, u32 data)
0294 {
0295 u32 data_and_addr;
0296 u32 newoffset;
0297 struct rtl_priv *rtlpriv = rtl_priv(hw);
0298 struct rtl_phy *rtlphy = &(rtlpriv->phy);
0299 struct bb_reg_def *pphyreg = &rtlphy->phyreg_def[rfpath];
0300
0301 newoffset = offset;
0302
0303 data_and_addr = ((newoffset << 20) | (data & 0x000fffff)) & 0x0fffffff;
0304 rtl_set_bbreg(hw, pphyreg->rf3wire_offset, MASKDWORD, data_and_addr);
0305 rtl_dbg(rtlpriv, COMP_RF, DBG_TRACE, "RFW-%d Addr[0x%x]=0x%x\n",
0306 rfpath, pphyreg->rf3wire_offset, data_and_addr);
0307 }
0308
0309 u32 rtl92d_phy_query_rf_reg(struct ieee80211_hw *hw,
0310 enum radio_path rfpath, u32 regaddr, u32 bitmask)
0311 {
0312 struct rtl_priv *rtlpriv = rtl_priv(hw);
0313 u32 original_value, readback_value, bitshift;
0314
0315 rtl_dbg(rtlpriv, COMP_RF, DBG_TRACE,
0316 "regaddr(%#x), rfpath(%#x), bitmask(%#x)\n",
0317 regaddr, rfpath, bitmask);
0318 spin_lock(&rtlpriv->locks.rf_lock);
0319 original_value = _rtl92d_phy_rf_serial_read(hw, rfpath, regaddr);
0320 bitshift = _rtl92d_phy_calculate_bit_shift(bitmask);
0321 readback_value = (original_value & bitmask) >> bitshift;
0322 spin_unlock(&rtlpriv->locks.rf_lock);
0323 rtl_dbg(rtlpriv, COMP_RF, DBG_TRACE,
0324 "regaddr(%#x), rfpath(%#x), bitmask(%#x), original_value(%#x)\n",
0325 regaddr, rfpath, bitmask, original_value);
0326 return readback_value;
0327 }
0328
0329 void rtl92d_phy_set_rf_reg(struct ieee80211_hw *hw, enum radio_path rfpath,
0330 u32 regaddr, u32 bitmask, u32 data)
0331 {
0332 struct rtl_priv *rtlpriv = rtl_priv(hw);
0333 struct rtl_phy *rtlphy = &(rtlpriv->phy);
0334 u32 original_value, bitshift;
0335
0336 rtl_dbg(rtlpriv, COMP_RF, DBG_TRACE,
0337 "regaddr(%#x), bitmask(%#x), data(%#x), rfpath(%#x)\n",
0338 regaddr, bitmask, data, rfpath);
0339 if (bitmask == 0)
0340 return;
0341 spin_lock(&rtlpriv->locks.rf_lock);
0342 if (rtlphy->rf_mode != RF_OP_BY_FW) {
0343 if (bitmask != RFREG_OFFSET_MASK) {
0344 original_value = _rtl92d_phy_rf_serial_read(hw,
0345 rfpath, regaddr);
0346 bitshift = _rtl92d_phy_calculate_bit_shift(bitmask);
0347 data = ((original_value & (~bitmask)) |
0348 (data << bitshift));
0349 }
0350 _rtl92d_phy_rf_serial_write(hw, rfpath, regaddr, data);
0351 }
0352 spin_unlock(&rtlpriv->locks.rf_lock);
0353 rtl_dbg(rtlpriv, COMP_RF, DBG_TRACE,
0354 "regaddr(%#x), bitmask(%#x), data(%#x), rfpath(%#x)\n",
0355 regaddr, bitmask, data, rfpath);
0356 }
0357
0358 bool rtl92d_phy_mac_config(struct ieee80211_hw *hw)
0359 {
0360 struct rtl_priv *rtlpriv = rtl_priv(hw);
0361 u32 i;
0362 u32 arraylength;
0363 u32 *ptrarray;
0364
0365 rtl_dbg(rtlpriv, COMP_INIT, DBG_TRACE, "Read Rtl819XMACPHY_Array\n");
0366 arraylength = MAC_2T_ARRAYLENGTH;
0367 ptrarray = rtl8192de_mac_2tarray;
0368 rtl_dbg(rtlpriv, COMP_INIT, DBG_TRACE, "Img:Rtl819XMAC_Array\n");
0369 for (i = 0; i < arraylength; i = i + 2)
0370 rtl_write_byte(rtlpriv, ptrarray[i], (u8) ptrarray[i + 1]);
0371 if (rtlpriv->rtlhal.macphymode == SINGLEMAC_SINGLEPHY) {
0372
0373
0374
0375
0376 rtl_write_byte(rtlpriv, REG_MAX_AGGR_NUM, 0x0B);
0377 } else {
0378
0379 rtl_write_byte(rtlpriv, REG_MAX_AGGR_NUM, 0x07);
0380 }
0381 return true;
0382 }
0383
0384 static void _rtl92d_phy_init_bb_rf_register_definition(struct ieee80211_hw *hw)
0385 {
0386 struct rtl_priv *rtlpriv = rtl_priv(hw);
0387 struct rtl_phy *rtlphy = &(rtlpriv->phy);
0388
0389
0390
0391 rtlphy->phyreg_def[RF90_PATH_A].rfintfs = RFPGA0_XAB_RFINTERFACESW;
0392
0393 rtlphy->phyreg_def[RF90_PATH_B].rfintfs = RFPGA0_XAB_RFINTERFACESW;
0394
0395 rtlphy->phyreg_def[RF90_PATH_C].rfintfs = RFPGA0_XCD_RFINTERFACESW;
0396
0397
0398 rtlphy->phyreg_def[RF90_PATH_D].rfintfs = RFPGA0_XCD_RFINTERFACESW;
0399
0400
0401 rtlphy->phyreg_def[RF90_PATH_A].rfintfi = RFPGA0_XAB_RFINTERFACERB;
0402
0403 rtlphy->phyreg_def[RF90_PATH_B].rfintfi = RFPGA0_XAB_RFINTERFACERB;
0404
0405 rtlphy->phyreg_def[RF90_PATH_C].rfintfi = RFPGA0_XCD_RFINTERFACERB;
0406
0407 rtlphy->phyreg_def[RF90_PATH_D].rfintfi = RFPGA0_XCD_RFINTERFACERB;
0408
0409
0410
0411 rtlphy->phyreg_def[RF90_PATH_A].rfintfo = RFPGA0_XA_RFINTERFACEOE;
0412
0413 rtlphy->phyreg_def[RF90_PATH_B].rfintfo = RFPGA0_XB_RFINTERFACEOE;
0414
0415
0416
0417 rtlphy->phyreg_def[RF90_PATH_A].rfintfe = RFPGA0_XA_RFINTERFACEOE;
0418
0419 rtlphy->phyreg_def[RF90_PATH_B].rfintfe = RFPGA0_XB_RFINTERFACEOE;
0420
0421
0422
0423 rtlphy->phyreg_def[RF90_PATH_A].rf3wire_offset =
0424 RFPGA0_XA_LSSIPARAMETER;
0425 rtlphy->phyreg_def[RF90_PATH_B].rf3wire_offset =
0426 RFPGA0_XB_LSSIPARAMETER;
0427
0428
0429
0430 rtlphy->phyreg_def[RF90_PATH_A].rflssi_select = RFPGA0_XAB_RFPARAMETER;
0431 rtlphy->phyreg_def[RF90_PATH_B].rflssi_select = RFPGA0_XAB_RFPARAMETER;
0432 rtlphy->phyreg_def[RF90_PATH_C].rflssi_select = RFPGA0_XCD_RFPARAMETER;
0433 rtlphy->phyreg_def[RF90_PATH_D].rflssi_select = RFPGA0_XCD_RFPARAMETER;
0434
0435
0436
0437 rtlphy->phyreg_def[RF90_PATH_A].rftxgain_stage = RFPGA0_TXGAINSTAGE;
0438
0439 rtlphy->phyreg_def[RF90_PATH_B].rftxgain_stage = RFPGA0_TXGAINSTAGE;
0440
0441 rtlphy->phyreg_def[RF90_PATH_C].rftxgain_stage = RFPGA0_TXGAINSTAGE;
0442
0443 rtlphy->phyreg_def[RF90_PATH_D].rftxgain_stage = RFPGA0_TXGAINSTAGE;
0444
0445
0446
0447 rtlphy->phyreg_def[RF90_PATH_A].rfhssi_para1 = RFPGA0_XA_HSSIPARAMETER1;
0448
0449 rtlphy->phyreg_def[RF90_PATH_B].rfhssi_para1 = RFPGA0_XB_HSSIPARAMETER1;
0450
0451
0452
0453 rtlphy->phyreg_def[RF90_PATH_A].rfhssi_para2 = RFPGA0_XA_HSSIPARAMETER2;
0454
0455 rtlphy->phyreg_def[RF90_PATH_B].rfhssi_para2 = RFPGA0_XB_HSSIPARAMETER2;
0456
0457
0458
0459 rtlphy->phyreg_def[RF90_PATH_A].rfsw_ctrl = RFPGA0_XAB_SWITCHCONTROL;
0460 rtlphy->phyreg_def[RF90_PATH_B].rfsw_ctrl = RFPGA0_XAB_SWITCHCONTROL;
0461 rtlphy->phyreg_def[RF90_PATH_C].rfsw_ctrl = RFPGA0_XCD_SWITCHCONTROL;
0462 rtlphy->phyreg_def[RF90_PATH_D].rfsw_ctrl = RFPGA0_XCD_SWITCHCONTROL;
0463
0464
0465 rtlphy->phyreg_def[RF90_PATH_A].rfagc_control1 = ROFDM0_XAAGCCORE1;
0466 rtlphy->phyreg_def[RF90_PATH_B].rfagc_control1 = ROFDM0_XBAGCCORE1;
0467 rtlphy->phyreg_def[RF90_PATH_C].rfagc_control1 = ROFDM0_XCAGCCORE1;
0468 rtlphy->phyreg_def[RF90_PATH_D].rfagc_control1 = ROFDM0_XDAGCCORE1;
0469
0470
0471 rtlphy->phyreg_def[RF90_PATH_A].rfagc_control2 = ROFDM0_XAAGCCORE2;
0472 rtlphy->phyreg_def[RF90_PATH_B].rfagc_control2 = ROFDM0_XBAGCCORE2;
0473 rtlphy->phyreg_def[RF90_PATH_C].rfagc_control2 = ROFDM0_XCAGCCORE2;
0474 rtlphy->phyreg_def[RF90_PATH_D].rfagc_control2 = ROFDM0_XDAGCCORE2;
0475
0476
0477 rtlphy->phyreg_def[RF90_PATH_A].rfrxiq_imbal = ROFDM0_XARXIQIMBALANCE;
0478 rtlphy->phyreg_def[RF90_PATH_B].rfrxiq_imbal = ROFDM0_XBRXIQIMBALANCE;
0479 rtlphy->phyreg_def[RF90_PATH_C].rfrxiq_imbal = ROFDM0_XCRXIQIMBALANCE;
0480 rtlphy->phyreg_def[RF90_PATH_D].rfrxiq_imbal = ROFDM0_XDRXIQIMBALANCE;
0481
0482
0483 rtlphy->phyreg_def[RF90_PATH_A].rfrx_afe = ROFDM0_XARXAFE;
0484 rtlphy->phyreg_def[RF90_PATH_B].rfrx_afe = ROFDM0_XBRXAFE;
0485 rtlphy->phyreg_def[RF90_PATH_C].rfrx_afe = ROFDM0_XCRXAFE;
0486 rtlphy->phyreg_def[RF90_PATH_D].rfrx_afe = ROFDM0_XDRXAFE;
0487
0488
0489 rtlphy->phyreg_def[RF90_PATH_A].rftxiq_imbal = ROFDM0_XATXIQIMBALANCE;
0490 rtlphy->phyreg_def[RF90_PATH_B].rftxiq_imbal = ROFDM0_XBTXIQIMBALANCE;
0491 rtlphy->phyreg_def[RF90_PATH_C].rftxiq_imbal = ROFDM0_XCTXIQIMBALANCE;
0492 rtlphy->phyreg_def[RF90_PATH_D].rftxiq_imbal = ROFDM0_XDTXIQIMBALANCE;
0493
0494
0495 rtlphy->phyreg_def[RF90_PATH_A].rftx_afe = ROFDM0_XATXAFE;
0496 rtlphy->phyreg_def[RF90_PATH_B].rftx_afe = ROFDM0_XBTXAFE;
0497 rtlphy->phyreg_def[RF90_PATH_C].rftx_afe = ROFDM0_XCTXAFE;
0498 rtlphy->phyreg_def[RF90_PATH_D].rftx_afe = ROFDM0_XDTXAFE;
0499
0500
0501 rtlphy->phyreg_def[RF90_PATH_A].rf_rb = RFPGA0_XA_LSSIREADBACK;
0502 rtlphy->phyreg_def[RF90_PATH_B].rf_rb = RFPGA0_XB_LSSIREADBACK;
0503 rtlphy->phyreg_def[RF90_PATH_C].rf_rb = RFPGA0_XC_LSSIREADBACK;
0504 rtlphy->phyreg_def[RF90_PATH_D].rf_rb = RFPGA0_XD_LSSIREADBACK;
0505
0506
0507 rtlphy->phyreg_def[RF90_PATH_A].rf_rbpi = TRANSCEIVERA_HSPI_READBACK;
0508 rtlphy->phyreg_def[RF90_PATH_B].rf_rbpi = TRANSCEIVERB_HSPI_READBACK;
0509 }
0510
0511 static bool _rtl92d_phy_config_bb_with_headerfile(struct ieee80211_hw *hw,
0512 u8 configtype)
0513 {
0514 int i;
0515 u32 *phy_regarray_table;
0516 u32 *agctab_array_table = NULL;
0517 u32 *agctab_5garray_table;
0518 u16 phy_reg_arraylen, agctab_arraylen = 0, agctab_5garraylen;
0519 struct rtl_priv *rtlpriv = rtl_priv(hw);
0520 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
0521
0522
0523 if (rtlhal->interfaceindex == 0) {
0524 agctab_arraylen = AGCTAB_ARRAYLENGTH;
0525 agctab_array_table = rtl8192de_agctab_array;
0526 rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD,
0527 " ===> phy:MAC0, Rtl819XAGCTAB_Array\n");
0528 } else {
0529 if (rtlhal->current_bandtype == BAND_ON_2_4G) {
0530 agctab_arraylen = AGCTAB_2G_ARRAYLENGTH;
0531 agctab_array_table = rtl8192de_agctab_2garray;
0532 rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD,
0533 " ===> phy:MAC1, Rtl819XAGCTAB_2GArray\n");
0534 } else {
0535 agctab_5garraylen = AGCTAB_5G_ARRAYLENGTH;
0536 agctab_5garray_table = rtl8192de_agctab_5garray;
0537 rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD,
0538 " ===> phy:MAC1, Rtl819XAGCTAB_5GArray\n");
0539
0540 }
0541 }
0542 phy_reg_arraylen = PHY_REG_2T_ARRAYLENGTH;
0543 phy_regarray_table = rtl8192de_phy_reg_2tarray;
0544 rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD,
0545 " ===> phy:Rtl819XPHY_REG_Array_PG\n");
0546 if (configtype == BASEBAND_CONFIG_PHY_REG) {
0547 for (i = 0; i < phy_reg_arraylen; i = i + 2) {
0548 rtl_addr_delay(phy_regarray_table[i]);
0549 rtl_set_bbreg(hw, phy_regarray_table[i], MASKDWORD,
0550 phy_regarray_table[i + 1]);
0551 udelay(1);
0552 rtl_dbg(rtlpriv, COMP_INIT, DBG_TRACE,
0553 "The phy_regarray_table[0] is %x Rtl819XPHY_REGArray[1] is %x\n",
0554 phy_regarray_table[i],
0555 phy_regarray_table[i + 1]);
0556 }
0557 } else if (configtype == BASEBAND_CONFIG_AGC_TAB) {
0558 if (rtlhal->interfaceindex == 0) {
0559 for (i = 0; i < agctab_arraylen; i = i + 2) {
0560 rtl_set_bbreg(hw, agctab_array_table[i],
0561 MASKDWORD,
0562 agctab_array_table[i + 1]);
0563
0564
0565 udelay(1);
0566 rtl_dbg(rtlpriv, COMP_INIT, DBG_TRACE,
0567 "The Rtl819XAGCTAB_Array_Table[0] is %u Rtl819XPHY_REGArray[1] is %u\n",
0568 agctab_array_table[i],
0569 agctab_array_table[i + 1]);
0570 }
0571 rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD,
0572 "Normal Chip, MAC0, load Rtl819XAGCTAB_Array\n");
0573 } else {
0574 if (rtlhal->current_bandtype == BAND_ON_2_4G) {
0575 for (i = 0; i < agctab_arraylen; i = i + 2) {
0576 rtl_set_bbreg(hw, agctab_array_table[i],
0577 MASKDWORD,
0578 agctab_array_table[i + 1]);
0579
0580
0581 udelay(1);
0582 rtl_dbg(rtlpriv, COMP_INIT, DBG_TRACE,
0583 "The Rtl819XAGCTAB_Array_Table[0] is %u Rtl819XPHY_REGArray[1] is %u\n",
0584 agctab_array_table[i],
0585 agctab_array_table[i + 1]);
0586 }
0587 rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD,
0588 "Load Rtl819XAGCTAB_2GArray\n");
0589 } else {
0590 for (i = 0; i < agctab_5garraylen; i = i + 2) {
0591 rtl_set_bbreg(hw,
0592 agctab_5garray_table[i],
0593 MASKDWORD,
0594 agctab_5garray_table[i + 1]);
0595
0596
0597 udelay(1);
0598 rtl_dbg(rtlpriv, COMP_INIT, DBG_TRACE,
0599 "The Rtl819XAGCTAB_5GArray_Table[0] is %u Rtl819XPHY_REGArray[1] is %u\n",
0600 agctab_5garray_table[i],
0601 agctab_5garray_table[i + 1]);
0602 }
0603 rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD,
0604 "Load Rtl819XAGCTAB_5GArray\n");
0605 }
0606 }
0607 }
0608 return true;
0609 }
0610
0611 static void _rtl92d_store_pwrindex_diffrate_offset(struct ieee80211_hw *hw,
0612 u32 regaddr, u32 bitmask,
0613 u32 data)
0614 {
0615 struct rtl_priv *rtlpriv = rtl_priv(hw);
0616 struct rtl_phy *rtlphy = &(rtlpriv->phy);
0617 int index;
0618
0619 if (regaddr == RTXAGC_A_RATE18_06)
0620 index = 0;
0621 else if (regaddr == RTXAGC_A_RATE54_24)
0622 index = 1;
0623 else if (regaddr == RTXAGC_A_CCK1_MCS32)
0624 index = 6;
0625 else if (regaddr == RTXAGC_B_CCK11_A_CCK2_11 && bitmask == 0xffffff00)
0626 index = 7;
0627 else if (regaddr == RTXAGC_A_MCS03_MCS00)
0628 index = 2;
0629 else if (regaddr == RTXAGC_A_MCS07_MCS04)
0630 index = 3;
0631 else if (regaddr == RTXAGC_A_MCS11_MCS08)
0632 index = 4;
0633 else if (regaddr == RTXAGC_A_MCS15_MCS12)
0634 index = 5;
0635 else if (regaddr == RTXAGC_B_RATE18_06)
0636 index = 8;
0637 else if (regaddr == RTXAGC_B_RATE54_24)
0638 index = 9;
0639 else if (regaddr == RTXAGC_B_CCK1_55_MCS32)
0640 index = 14;
0641 else if (regaddr == RTXAGC_B_CCK11_A_CCK2_11 && bitmask == 0x000000ff)
0642 index = 15;
0643 else if (regaddr == RTXAGC_B_MCS03_MCS00)
0644 index = 10;
0645 else if (regaddr == RTXAGC_B_MCS07_MCS04)
0646 index = 11;
0647 else if (regaddr == RTXAGC_B_MCS11_MCS08)
0648 index = 12;
0649 else if (regaddr == RTXAGC_B_MCS15_MCS12)
0650 index = 13;
0651 else
0652 return;
0653
0654 rtlphy->mcs_offset[rtlphy->pwrgroup_cnt][index] = data;
0655 rtl_dbg(rtlpriv, COMP_INIT, DBG_TRACE,
0656 "MCSTxPowerLevelOriginalOffset[%d][%d] = 0x%x\n",
0657 rtlphy->pwrgroup_cnt, index,
0658 rtlphy->mcs_offset[rtlphy->pwrgroup_cnt][index]);
0659 if (index == 13)
0660 rtlphy->pwrgroup_cnt++;
0661 }
0662
0663 static bool _rtl92d_phy_config_bb_with_pgheaderfile(struct ieee80211_hw *hw,
0664 u8 configtype)
0665 {
0666 struct rtl_priv *rtlpriv = rtl_priv(hw);
0667 int i;
0668 u32 *phy_regarray_table_pg;
0669 u16 phy_regarray_pg_len;
0670
0671 phy_regarray_pg_len = PHY_REG_ARRAY_PG_LENGTH;
0672 phy_regarray_table_pg = rtl8192de_phy_reg_array_pg;
0673 if (configtype == BASEBAND_CONFIG_PHY_REG) {
0674 for (i = 0; i < phy_regarray_pg_len; i = i + 3) {
0675 rtl_addr_delay(phy_regarray_table_pg[i]);
0676 _rtl92d_store_pwrindex_diffrate_offset(hw,
0677 phy_regarray_table_pg[i],
0678 phy_regarray_table_pg[i + 1],
0679 phy_regarray_table_pg[i + 2]);
0680 }
0681 } else {
0682 rtl_dbg(rtlpriv, COMP_SEND, DBG_TRACE,
0683 "configtype != BaseBand_Config_PHY_REG\n");
0684 }
0685 return true;
0686 }
0687
0688 static bool _rtl92d_phy_bb_config(struct ieee80211_hw *hw)
0689 {
0690 struct rtl_priv *rtlpriv = rtl_priv(hw);
0691 struct rtl_phy *rtlphy = &(rtlpriv->phy);
0692 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
0693 bool rtstatus;
0694
0695 rtl_dbg(rtlpriv, COMP_INIT, DBG_TRACE, "==>\n");
0696 rtstatus = _rtl92d_phy_config_bb_with_headerfile(hw,
0697 BASEBAND_CONFIG_PHY_REG);
0698 if (!rtstatus) {
0699 pr_err("Write BB Reg Fail!!\n");
0700 return false;
0701 }
0702
0703
0704
0705
0706
0707
0708 if (rtlefuse->autoload_failflag == false) {
0709 rtlphy->pwrgroup_cnt = 0;
0710 rtstatus = _rtl92d_phy_config_bb_with_pgheaderfile(hw,
0711 BASEBAND_CONFIG_PHY_REG);
0712 }
0713 if (!rtstatus) {
0714 pr_err("BB_PG Reg Fail!!\n");
0715 return false;
0716 }
0717 rtstatus = _rtl92d_phy_config_bb_with_headerfile(hw,
0718 BASEBAND_CONFIG_AGC_TAB);
0719 if (!rtstatus) {
0720 pr_err("AGC Table Fail\n");
0721 return false;
0722 }
0723 rtlphy->cck_high_power = (bool) (rtl_get_bbreg(hw,
0724 RFPGA0_XA_HSSIPARAMETER2, 0x200));
0725
0726 return true;
0727 }
0728
0729 bool rtl92d_phy_bb_config(struct ieee80211_hw *hw)
0730 {
0731 struct rtl_priv *rtlpriv = rtl_priv(hw);
0732 u16 regval;
0733 u32 regvaldw;
0734 u8 value;
0735
0736 _rtl92d_phy_init_bb_rf_register_definition(hw);
0737 regval = rtl_read_word(rtlpriv, REG_SYS_FUNC_EN);
0738 rtl_write_word(rtlpriv, REG_SYS_FUNC_EN,
0739 regval | BIT(13) | BIT(0) | BIT(1));
0740 rtl_write_byte(rtlpriv, REG_AFE_PLL_CTRL, 0x83);
0741 rtl_write_byte(rtlpriv, REG_AFE_PLL_CTRL + 1, 0xdb);
0742
0743 value = rtl_read_byte(rtlpriv, REG_RF_CTRL);
0744 rtl_write_byte(rtlpriv, REG_RF_CTRL, value | RF_EN | RF_RSTB |
0745 RF_SDMRSTB);
0746 rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN, FEN_PPLL | FEN_PCIEA |
0747 FEN_DIO_PCIE | FEN_BB_GLB_RSTN | FEN_BBRSTB);
0748 rtl_write_byte(rtlpriv, REG_AFE_XTAL_CTRL + 1, 0x80);
0749 if (!(IS_92D_SINGLEPHY(rtlpriv->rtlhal.version))) {
0750 regvaldw = rtl_read_dword(rtlpriv, REG_LEDCFG0);
0751 rtl_write_dword(rtlpriv, REG_LEDCFG0, regvaldw | BIT(23));
0752 }
0753
0754 return _rtl92d_phy_bb_config(hw);
0755 }
0756
0757 bool rtl92d_phy_rf_config(struct ieee80211_hw *hw)
0758 {
0759 return rtl92d_phy_rf6052_config(hw);
0760 }
0761
0762 bool rtl92d_phy_config_rf_with_headerfile(struct ieee80211_hw *hw,
0763 enum rf_content content,
0764 enum radio_path rfpath)
0765 {
0766 int i;
0767 u32 *radioa_array_table;
0768 u32 *radiob_array_table;
0769 u16 radioa_arraylen, radiob_arraylen;
0770 struct rtl_priv *rtlpriv = rtl_priv(hw);
0771
0772 radioa_arraylen = RADIOA_2T_ARRAYLENGTH;
0773 radioa_array_table = rtl8192de_radioa_2tarray;
0774 radiob_arraylen = RADIOB_2T_ARRAYLENGTH;
0775 radiob_array_table = rtl8192de_radiob_2tarray;
0776 if (rtlpriv->efuse.internal_pa_5g[0]) {
0777 radioa_arraylen = RADIOA_2T_INT_PA_ARRAYLENGTH;
0778 radioa_array_table = rtl8192de_radioa_2t_int_paarray;
0779 }
0780 if (rtlpriv->efuse.internal_pa_5g[1]) {
0781 radiob_arraylen = RADIOB_2T_INT_PA_ARRAYLENGTH;
0782 radiob_array_table = rtl8192de_radiob_2t_int_paarray;
0783 }
0784 rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD,
0785 "PHY_ConfigRFWithHeaderFile() Radio_A:Rtl819XRadioA_1TArray\n");
0786 rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD,
0787 "PHY_ConfigRFWithHeaderFile() Radio_B:Rtl819XRadioB_1TArray\n");
0788 rtl_dbg(rtlpriv, COMP_INIT, DBG_TRACE, "Radio No %x\n", rfpath);
0789
0790
0791
0792
0793 if ((content == radiob_txt) && (rfpath == RF90_PATH_A)) {
0794 rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD,
0795 " ===> althougth Path A, we load radiob.txt\n");
0796 radioa_arraylen = radiob_arraylen;
0797 radioa_array_table = radiob_array_table;
0798 }
0799 switch (rfpath) {
0800 case RF90_PATH_A:
0801 for (i = 0; i < radioa_arraylen; i = i + 2) {
0802 rtl_rfreg_delay(hw, rfpath, radioa_array_table[i],
0803 RFREG_OFFSET_MASK,
0804 radioa_array_table[i + 1]);
0805 }
0806 break;
0807 case RF90_PATH_B:
0808 for (i = 0; i < radiob_arraylen; i = i + 2) {
0809 rtl_rfreg_delay(hw, rfpath, radiob_array_table[i],
0810 RFREG_OFFSET_MASK,
0811 radiob_array_table[i + 1]);
0812 }
0813 break;
0814 case RF90_PATH_C:
0815 case RF90_PATH_D:
0816 pr_err("switch case %#x not processed\n", rfpath);
0817 break;
0818 }
0819 return true;
0820 }
0821
0822 void rtl92d_phy_get_hw_reg_originalvalue(struct ieee80211_hw *hw)
0823 {
0824 struct rtl_priv *rtlpriv = rtl_priv(hw);
0825 struct rtl_phy *rtlphy = &(rtlpriv->phy);
0826
0827 rtlphy->default_initialgain[0] =
0828 (u8) rtl_get_bbreg(hw, ROFDM0_XAAGCCORE1, MASKBYTE0);
0829 rtlphy->default_initialgain[1] =
0830 (u8) rtl_get_bbreg(hw, ROFDM0_XBAGCCORE1, MASKBYTE0);
0831 rtlphy->default_initialgain[2] =
0832 (u8) rtl_get_bbreg(hw, ROFDM0_XCAGCCORE1, MASKBYTE0);
0833 rtlphy->default_initialgain[3] =
0834 (u8) rtl_get_bbreg(hw, ROFDM0_XDAGCCORE1, MASKBYTE0);
0835 rtl_dbg(rtlpriv, COMP_INIT, DBG_TRACE,
0836 "Default initial gain (c50=0x%x, c58=0x%x, c60=0x%x, c68=0x%x\n",
0837 rtlphy->default_initialgain[0],
0838 rtlphy->default_initialgain[1],
0839 rtlphy->default_initialgain[2],
0840 rtlphy->default_initialgain[3]);
0841 rtlphy->framesync = (u8)rtl_get_bbreg(hw, ROFDM0_RXDETECTOR3,
0842 MASKBYTE0);
0843 rtlphy->framesync_c34 = rtl_get_bbreg(hw, ROFDM0_RXDETECTOR2,
0844 MASKDWORD);
0845 rtl_dbg(rtlpriv, COMP_INIT, DBG_TRACE,
0846 "Default framesync (0x%x) = 0x%x\n",
0847 ROFDM0_RXDETECTOR3, rtlphy->framesync);
0848 }
0849
0850 static void _rtl92d_get_txpower_index(struct ieee80211_hw *hw, u8 channel,
0851 u8 *cckpowerlevel, u8 *ofdmpowerlevel)
0852 {
0853 struct rtl_priv *rtlpriv = rtl_priv(hw);
0854 struct rtl_phy *rtlphy = &(rtlpriv->phy);
0855 struct rtl_hal *rtlhal = &(rtlpriv->rtlhal);
0856 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
0857 u8 index = (channel - 1);
0858
0859
0860 if (rtlhal->current_bandtype == BAND_ON_2_4G) {
0861
0862 cckpowerlevel[RF90_PATH_A] =
0863 rtlefuse->txpwrlevel_cck[RF90_PATH_A][index];
0864
0865 cckpowerlevel[RF90_PATH_B] =
0866 rtlefuse->txpwrlevel_cck[RF90_PATH_B][index];
0867 } else {
0868 cckpowerlevel[RF90_PATH_A] = 0;
0869 cckpowerlevel[RF90_PATH_B] = 0;
0870 }
0871
0872 if (rtlphy->rf_type == RF_1T2R || rtlphy->rf_type == RF_1T1R) {
0873
0874 ofdmpowerlevel[RF90_PATH_A] =
0875 rtlefuse->txpwrlevel_ht40_1s[RF90_PATH_A][index];
0876 ofdmpowerlevel[RF90_PATH_B] =
0877 rtlefuse->txpwrlevel_ht40_1s[RF90_PATH_B][index];
0878 } else if (rtlphy->rf_type == RF_2T2R) {
0879
0880 ofdmpowerlevel[RF90_PATH_A] =
0881 rtlefuse->txpwrlevel_ht40_2s[RF90_PATH_A][index];
0882 ofdmpowerlevel[RF90_PATH_B] =
0883 rtlefuse->txpwrlevel_ht40_2s[RF90_PATH_B][index];
0884 }
0885 }
0886
0887 static void _rtl92d_ccxpower_index_check(struct ieee80211_hw *hw,
0888 u8 channel, u8 *cckpowerlevel, u8 *ofdmpowerlevel)
0889 {
0890 struct rtl_priv *rtlpriv = rtl_priv(hw);
0891 struct rtl_phy *rtlphy = &(rtlpriv->phy);
0892
0893 rtlphy->cur_cck_txpwridx = cckpowerlevel[0];
0894 rtlphy->cur_ofdm24g_txpwridx = ofdmpowerlevel[0];
0895 }
0896
0897 static u8 _rtl92c_phy_get_rightchnlplace(u8 chnl)
0898 {
0899 u8 place = chnl;
0900
0901 if (chnl > 14) {
0902 for (place = 14; place < ARRAY_SIZE(channel5g); place++) {
0903 if (channel5g[place] == chnl) {
0904 place++;
0905 break;
0906 }
0907 }
0908 }
0909 return place;
0910 }
0911
0912 void rtl92d_phy_set_txpower_level(struct ieee80211_hw *hw, u8 channel)
0913 {
0914 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
0915 struct rtl_priv *rtlpriv = rtl_priv(hw);
0916 u8 cckpowerlevel[2], ofdmpowerlevel[2];
0917
0918 if (!rtlefuse->txpwr_fromeprom)
0919 return;
0920 channel = _rtl92c_phy_get_rightchnlplace(channel);
0921 _rtl92d_get_txpower_index(hw, channel, &cckpowerlevel[0],
0922 &ofdmpowerlevel[0]);
0923 if (rtlpriv->rtlhal.current_bandtype == BAND_ON_2_4G)
0924 _rtl92d_ccxpower_index_check(hw, channel, &cckpowerlevel[0],
0925 &ofdmpowerlevel[0]);
0926 if (rtlpriv->rtlhal.current_bandtype == BAND_ON_2_4G)
0927 rtl92d_phy_rf6052_set_cck_txpower(hw, &cckpowerlevel[0]);
0928 rtl92d_phy_rf6052_set_ofdm_txpower(hw, &ofdmpowerlevel[0], channel);
0929 }
0930
0931 void rtl92d_phy_set_bw_mode(struct ieee80211_hw *hw,
0932 enum nl80211_channel_type ch_type)
0933 {
0934 struct rtl_priv *rtlpriv = rtl_priv(hw);
0935 struct rtl_phy *rtlphy = &(rtlpriv->phy);
0936 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
0937 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
0938 unsigned long flag = 0;
0939 u8 reg_prsr_rsc;
0940 u8 reg_bw_opmode;
0941
0942 if (rtlphy->set_bwmode_inprogress)
0943 return;
0944 if ((is_hal_stop(rtlhal)) || (RT_CANNOT_IO(hw))) {
0945 rtl_dbg(rtlpriv, COMP_ERR, DBG_WARNING,
0946 "FALSE driver sleep or unload\n");
0947 return;
0948 }
0949 rtlphy->set_bwmode_inprogress = true;
0950 rtl_dbg(rtlpriv, COMP_SCAN, DBG_TRACE, "Switch to %s bandwidth\n",
0951 rtlphy->current_chan_bw == HT_CHANNEL_WIDTH_20 ?
0952 "20MHz" : "40MHz");
0953 reg_bw_opmode = rtl_read_byte(rtlpriv, REG_BWOPMODE);
0954 reg_prsr_rsc = rtl_read_byte(rtlpriv, REG_RRSR + 2);
0955 switch (rtlphy->current_chan_bw) {
0956 case HT_CHANNEL_WIDTH_20:
0957 reg_bw_opmode |= BW_OPMODE_20MHZ;
0958 rtl_write_byte(rtlpriv, REG_BWOPMODE, reg_bw_opmode);
0959 break;
0960 case HT_CHANNEL_WIDTH_20_40:
0961 reg_bw_opmode &= ~BW_OPMODE_20MHZ;
0962 rtl_write_byte(rtlpriv, REG_BWOPMODE, reg_bw_opmode);
0963
0964 reg_prsr_rsc = (reg_prsr_rsc & 0x90) |
0965 (mac->cur_40_prime_sc << 5);
0966 rtl_write_byte(rtlpriv, REG_RRSR + 2, reg_prsr_rsc);
0967 break;
0968 default:
0969 pr_err("unknown bandwidth: %#X\n",
0970 rtlphy->current_chan_bw);
0971 break;
0972 }
0973 switch (rtlphy->current_chan_bw) {
0974 case HT_CHANNEL_WIDTH_20:
0975 rtl_set_bbreg(hw, RFPGA0_RFMOD, BRFMOD, 0x0);
0976 rtl_set_bbreg(hw, RFPGA1_RFMOD, BRFMOD, 0x0);
0977
0978 rtl_set_bbreg(hw, RFPGA0_ANALOGPARAMETER2, BIT(10) |
0979 BIT(11), 3);
0980 break;
0981 case HT_CHANNEL_WIDTH_20_40:
0982 rtl_set_bbreg(hw, RFPGA0_RFMOD, BRFMOD, 0x1);
0983 rtl_set_bbreg(hw, RFPGA1_RFMOD, BRFMOD, 0x1);
0984
0985
0986 if (rtlhal->current_bandtype == BAND_ON_2_4G) {
0987 rtl92d_acquire_cckandrw_pagea_ctl(hw, &flag);
0988 rtl_set_bbreg(hw, RCCK0_SYSTEM, BCCKSIDEBAND,
0989 (mac->cur_40_prime_sc >> 1));
0990 rtl92d_release_cckandrw_pagea_ctl(hw, &flag);
0991 }
0992 rtl_set_bbreg(hw, ROFDM1_LSTF, 0xC00, mac->cur_40_prime_sc);
0993
0994 rtl_set_bbreg(hw, RFPGA0_ANALOGPARAMETER2, BIT(10) |
0995 BIT(11), 0);
0996 rtl_set_bbreg(hw, 0x818, (BIT(26) | BIT(27)),
0997 (mac->cur_40_prime_sc ==
0998 HAL_PRIME_CHNL_OFFSET_LOWER) ? 2 : 1);
0999 break;
1000 default:
1001 pr_err("unknown bandwidth: %#X\n",
1002 rtlphy->current_chan_bw);
1003 break;
1004
1005 }
1006 rtl92d_phy_rf6052_set_bandwidth(hw, rtlphy->current_chan_bw);
1007 rtlphy->set_bwmode_inprogress = false;
1008 rtl_dbg(rtlpriv, COMP_SCAN, DBG_TRACE, "<==\n");
1009 }
1010
1011 static void _rtl92d_phy_stop_trx_before_changeband(struct ieee80211_hw *hw)
1012 {
1013 rtl_set_bbreg(hw, RFPGA0_RFMOD, BCCKEN, 0);
1014 rtl_set_bbreg(hw, RFPGA0_RFMOD, BOFDMEN, 0);
1015 rtl_set_bbreg(hw, ROFDM0_TRXPATHENABLE, MASKBYTE0, 0x00);
1016 rtl_set_bbreg(hw, ROFDM1_TRXPATHENABLE, BDWORD, 0x0);
1017 }
1018
1019 static void rtl92d_phy_switch_wirelessband(struct ieee80211_hw *hw, u8 band)
1020 {
1021 struct rtl_priv *rtlpriv = rtl_priv(hw);
1022 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
1023 u8 value8;
1024
1025 rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD, "==>\n");
1026 rtlhal->bandset = band;
1027 rtlhal->current_bandtype = band;
1028 if (IS_92D_SINGLEPHY(rtlhal->version))
1029 rtlhal->bandset = BAND_ON_BOTH;
1030
1031 _rtl92d_phy_stop_trx_before_changeband(hw);
1032
1033 if (rtlhal->current_bandtype == BAND_ON_2_4G) {
1034
1035 rtl_dbg(rtlpriv, COMP_CMD, DBG_DMESG, "====>2.4G\n");
1036 if (rtlhal->interfaceindex == 1)
1037 _rtl92d_phy_config_bb_with_headerfile(hw,
1038 BASEBAND_CONFIG_AGC_TAB);
1039 } else {
1040
1041 rtl_dbg(rtlpriv, COMP_CMD, DBG_DMESG, "====>5G\n");
1042 if (rtlhal->interfaceindex == 1)
1043 _rtl92d_phy_config_bb_with_headerfile(hw,
1044 BASEBAND_CONFIG_AGC_TAB);
1045 }
1046 rtl92d_update_bbrf_configuration(hw);
1047 if (rtlhal->current_bandtype == BAND_ON_2_4G)
1048 rtl_set_bbreg(hw, RFPGA0_RFMOD, BCCKEN, 0x1);
1049 rtl_set_bbreg(hw, RFPGA0_RFMOD, BOFDMEN, 0x1);
1050
1051
1052
1053 rtlhal->reloadtxpowerindex = true;
1054
1055 if (rtlhal->current_bandtype == BAND_ON_2_4G) {
1056 value8 = rtl_read_byte(rtlpriv, (rtlhal->interfaceindex ==
1057 0 ? REG_MAC0 : REG_MAC1));
1058 value8 |= BIT(1);
1059 rtl_write_byte(rtlpriv, (rtlhal->interfaceindex ==
1060 0 ? REG_MAC0 : REG_MAC1), value8);
1061 } else {
1062 value8 = rtl_read_byte(rtlpriv, (rtlhal->interfaceindex ==
1063 0 ? REG_MAC0 : REG_MAC1));
1064 value8 &= (~BIT(1));
1065 rtl_write_byte(rtlpriv, (rtlhal->interfaceindex ==
1066 0 ? REG_MAC0 : REG_MAC1), value8);
1067 }
1068 mdelay(1);
1069 rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD, "<==Switch Band OK\n");
1070 }
1071
1072 static void _rtl92d_phy_reload_imr_setting(struct ieee80211_hw *hw,
1073 u8 channel, u8 rfpath)
1074 {
1075 struct rtl_priv *rtlpriv = rtl_priv(hw);
1076 u32 imr_num = MAX_RF_IMR_INDEX;
1077 u32 rfmask = RFREG_OFFSET_MASK;
1078 u8 group, i;
1079 unsigned long flag = 0;
1080
1081 rtl_dbg(rtlpriv, COMP_CMD, DBG_LOUD, "====>path %d\n", rfpath);
1082 if (rtlpriv->rtlhal.current_bandtype == BAND_ON_5G) {
1083 rtl_dbg(rtlpriv, COMP_CMD, DBG_LOUD, "====>5G\n");
1084 rtl_set_bbreg(hw, RFPGA0_RFMOD, BIT(25) | BIT(24), 0);
1085 rtl_set_bbreg(hw, RFPGA0_ANALOGPARAMETER4, 0x00f00000, 0xf);
1086
1087 if (channel > 99)
1088 rtl_set_bbreg(hw, ROFDM1_CFOTRACKING, BIT(13) |
1089 BIT(14), 2);
1090 else
1091 rtl_set_bbreg(hw, ROFDM1_CFOTRACKING, BIT(13) |
1092 BIT(14), 1);
1093
1094 group = channel <= 64 ? 1 : 2;
1095 imr_num = MAX_RF_IMR_INDEX_NORMAL;
1096 for (i = 0; i < imr_num; i++)
1097 rtl_set_rfreg(hw, (enum radio_path)rfpath,
1098 rf_reg_for_5g_swchnl_normal[i], rfmask,
1099 rf_imr_param_normal[0][group][i]);
1100 rtl_set_bbreg(hw, RFPGA0_ANALOGPARAMETER4, 0x00f00000, 0);
1101 rtl_set_bbreg(hw, RFPGA0_RFMOD, BOFDMEN, 1);
1102 } else {
1103
1104 rtl_dbg(rtlpriv, COMP_SCAN, DBG_LOUD,
1105 "Load RF IMR parameters for G band. IMR already setting %d\n",
1106 rtlpriv->rtlhal.load_imrandiqk_setting_for2g);
1107 rtl_dbg(rtlpriv, COMP_CMD, DBG_LOUD, "====>2.4G\n");
1108 if (!rtlpriv->rtlhal.load_imrandiqk_setting_for2g) {
1109 rtl_dbg(rtlpriv, COMP_SCAN, DBG_LOUD,
1110 "Load RF IMR parameters for G band. %d\n",
1111 rfpath);
1112 rtl92d_acquire_cckandrw_pagea_ctl(hw, &flag);
1113 rtl_set_bbreg(hw, RFPGA0_RFMOD, BIT(25) | BIT(24), 0);
1114 rtl_set_bbreg(hw, RFPGA0_ANALOGPARAMETER4,
1115 0x00f00000, 0xf);
1116 imr_num = MAX_RF_IMR_INDEX_NORMAL;
1117 for (i = 0; i < imr_num; i++) {
1118 rtl_set_rfreg(hw, (enum radio_path)rfpath,
1119 rf_reg_for_5g_swchnl_normal[i],
1120 RFREG_OFFSET_MASK,
1121 rf_imr_param_normal[0][0][i]);
1122 }
1123 rtl_set_bbreg(hw, RFPGA0_ANALOGPARAMETER4,
1124 0x00f00000, 0);
1125 rtl_set_bbreg(hw, RFPGA0_RFMOD, BOFDMEN | BCCKEN, 3);
1126 rtl92d_release_cckandrw_pagea_ctl(hw, &flag);
1127 }
1128 }
1129 rtl_dbg(rtlpriv, COMP_CMD, DBG_LOUD, "<====\n");
1130 }
1131
1132 static void _rtl92d_phy_enable_rf_env(struct ieee80211_hw *hw,
1133 u8 rfpath, u32 *pu4_regval)
1134 {
1135 struct rtl_priv *rtlpriv = rtl_priv(hw);
1136 struct rtl_phy *rtlphy = &(rtlpriv->phy);
1137 struct bb_reg_def *pphyreg = &rtlphy->phyreg_def[rfpath];
1138
1139 rtl_dbg(rtlpriv, COMP_RF, DBG_LOUD, "====>\n");
1140
1141 switch (rfpath) {
1142 case RF90_PATH_A:
1143 case RF90_PATH_C:
1144 *pu4_regval = rtl_get_bbreg(hw, pphyreg->rfintfs, BRFSI_RFENV);
1145 break;
1146 case RF90_PATH_B:
1147 case RF90_PATH_D:
1148 *pu4_regval =
1149 rtl_get_bbreg(hw, pphyreg->rfintfs, BRFSI_RFENV << 16);
1150 break;
1151 }
1152
1153 rtl_set_bbreg(hw, pphyreg->rfintfe, BRFSI_RFENV << 16, 0x1);
1154 udelay(1);
1155
1156 rtl_set_bbreg(hw, pphyreg->rfintfo, BRFSI_RFENV, 0x1);
1157 udelay(1);
1158
1159
1160 rtl_set_bbreg(hw, pphyreg->rfhssi_para2, B3WIREADDRESSLENGTH, 0x0);
1161 udelay(1);
1162
1163 rtl_set_bbreg(hw, pphyreg->rfhssi_para2, B3WIREDATALENGTH, 0x0);
1164 udelay(1);
1165 rtl_dbg(rtlpriv, COMP_RF, DBG_LOUD, "<====\n");
1166 }
1167
1168 static void _rtl92d_phy_restore_rf_env(struct ieee80211_hw *hw, u8 rfpath,
1169 u32 *pu4_regval)
1170 {
1171 struct rtl_priv *rtlpriv = rtl_priv(hw);
1172 struct rtl_phy *rtlphy = &(rtlpriv->phy);
1173 struct bb_reg_def *pphyreg = &rtlphy->phyreg_def[rfpath];
1174
1175 rtl_dbg(rtlpriv, COMP_RF, DBG_LOUD, "=====>\n");
1176
1177 switch (rfpath) {
1178 case RF90_PATH_A:
1179 case RF90_PATH_C:
1180 rtl_set_bbreg(hw, pphyreg->rfintfs, BRFSI_RFENV, *pu4_regval);
1181 break;
1182 case RF90_PATH_B:
1183 case RF90_PATH_D:
1184 rtl_set_bbreg(hw, pphyreg->rfintfs, BRFSI_RFENV << 16,
1185 *pu4_regval);
1186 break;
1187 }
1188 rtl_dbg(rtlpriv, COMP_RF, DBG_LOUD, "<=====\n");
1189 }
1190
1191 static void _rtl92d_phy_switch_rf_setting(struct ieee80211_hw *hw, u8 channel)
1192 {
1193 struct rtl_priv *rtlpriv = rtl_priv(hw);
1194 struct rtl_phy *rtlphy = &(rtlpriv->phy);
1195 struct rtl_hal *rtlhal = &(rtlpriv->rtlhal);
1196 u8 path = rtlhal->current_bandtype ==
1197 BAND_ON_5G ? RF90_PATH_A : RF90_PATH_B;
1198 u8 index = 0, i = 0, rfpath = RF90_PATH_A;
1199 bool need_pwr_down = false, internal_pa = false;
1200 u32 u4regvalue, mask = 0x1C000, value = 0, u4tmp, u4tmp2;
1201
1202 rtl_dbg(rtlpriv, COMP_CMD, DBG_LOUD, "====>\n");
1203
1204 if (rtlhal->current_bandtype == BAND_ON_5G) {
1205 rtl_dbg(rtlpriv, COMP_CMD, DBG_LOUD, "====>5G\n");
1206 u4tmp = curveindex_5g[channel - 1];
1207 RTPRINT(rtlpriv, FINIT, INIT_IQK,
1208 "ver 1 set RF-A, 5G, 0x28 = 0x%x !!\n", u4tmp);
1209 for (i = 0; i < RF_CHNL_NUM_5G; i++) {
1210 if (channel == rf_chnl_5g[i] && channel <= 140)
1211 index = 0;
1212 }
1213 for (i = 0; i < RF_CHNL_NUM_5G_40M; i++) {
1214 if (channel == rf_chnl_5g_40m[i] && channel <= 140)
1215 index = 1;
1216 }
1217 if (channel == 149 || channel == 155 || channel == 161)
1218 index = 2;
1219 else if (channel == 151 || channel == 153 || channel == 163
1220 || channel == 165)
1221 index = 3;
1222 else if (channel == 157 || channel == 159)
1223 index = 4;
1224
1225 if (rtlhal->macphymode == DUALMAC_DUALPHY
1226 && rtlhal->interfaceindex == 1) {
1227 need_pwr_down = rtl92d_phy_enable_anotherphy(hw, false);
1228 rtlhal->during_mac1init_radioa = true;
1229
1230 if (need_pwr_down)
1231 _rtl92d_phy_enable_rf_env(hw, path,
1232 &u4regvalue);
1233 }
1234 for (i = 0; i < RF_REG_NUM_FOR_C_CUT_5G; i++) {
1235 if (i == 0 && (rtlhal->macphymode == DUALMAC_DUALPHY)) {
1236 rtl_set_rfreg(hw, (enum radio_path)path,
1237 rf_reg_for_c_cut_5g[i],
1238 RFREG_OFFSET_MASK, 0xE439D);
1239 } else if (rf_reg_for_c_cut_5g[i] == RF_SYN_G4) {
1240 u4tmp2 = (rf_reg_pram_c_5g[index][i] &
1241 0x7FF) | (u4tmp << 11);
1242 if (channel == 36)
1243 u4tmp2 &= ~(BIT(7) | BIT(6));
1244 rtl_set_rfreg(hw, (enum radio_path)path,
1245 rf_reg_for_c_cut_5g[i],
1246 RFREG_OFFSET_MASK, u4tmp2);
1247 } else {
1248 rtl_set_rfreg(hw, (enum radio_path)path,
1249 rf_reg_for_c_cut_5g[i],
1250 RFREG_OFFSET_MASK,
1251 rf_reg_pram_c_5g[index][i]);
1252 }
1253 rtl_dbg(rtlpriv, COMP_RF, DBG_TRACE,
1254 "offset 0x%x value 0x%x path %d index %d readback 0x%x\n",
1255 rf_reg_for_c_cut_5g[i],
1256 rf_reg_pram_c_5g[index][i],
1257 path, index,
1258 rtl_get_rfreg(hw, (enum radio_path)path,
1259 rf_reg_for_c_cut_5g[i],
1260 RFREG_OFFSET_MASK));
1261 }
1262 if (need_pwr_down)
1263 _rtl92d_phy_restore_rf_env(hw, path, &u4regvalue);
1264 if (rtlhal->during_mac1init_radioa)
1265 rtl92d_phy_powerdown_anotherphy(hw, false);
1266 if (channel < 149)
1267 value = 0x07;
1268 else if (channel >= 149)
1269 value = 0x02;
1270 if (channel >= 36 && channel <= 64)
1271 index = 0;
1272 else if (channel >= 100 && channel <= 140)
1273 index = 1;
1274 else
1275 index = 2;
1276 for (rfpath = RF90_PATH_A; rfpath < rtlphy->num_total_rfpath;
1277 rfpath++) {
1278 if (rtlhal->macphymode == DUALMAC_DUALPHY &&
1279 rtlhal->interfaceindex == 1)
1280 internal_pa = rtlpriv->efuse.internal_pa_5g[1];
1281 else
1282 internal_pa =
1283 rtlpriv->efuse.internal_pa_5g[rfpath];
1284 if (internal_pa) {
1285 for (i = 0;
1286 i < RF_REG_NUM_FOR_C_CUT_5G_INTERNALPA;
1287 i++) {
1288 rtl_set_rfreg(hw, rfpath,
1289 rf_for_c_cut_5g_internal_pa[i],
1290 RFREG_OFFSET_MASK,
1291 rf_pram_c_5g_int_pa[index][i]);
1292 rtl_dbg(rtlpriv, COMP_RF, DBG_LOUD,
1293 "offset 0x%x value 0x%x path %d index %d\n",
1294 rf_for_c_cut_5g_internal_pa[i],
1295 rf_pram_c_5g_int_pa[index][i],
1296 rfpath, index);
1297 }
1298 } else {
1299 rtl_set_rfreg(hw, (enum radio_path)rfpath, 0x0B,
1300 mask, value);
1301 }
1302 }
1303 } else if (rtlhal->current_bandtype == BAND_ON_2_4G) {
1304 rtl_dbg(rtlpriv, COMP_CMD, DBG_LOUD, "====>2.4G\n");
1305 u4tmp = curveindex_2g[channel - 1];
1306 RTPRINT(rtlpriv, FINIT, INIT_IQK,
1307 "ver 3 set RF-B, 2G, 0x28 = 0x%x !!\n", u4tmp);
1308 if (channel == 1 || channel == 2 || channel == 4 || channel == 9
1309 || channel == 10 || channel == 11 || channel == 12)
1310 index = 0;
1311 else if (channel == 3 || channel == 13 || channel == 14)
1312 index = 1;
1313 else if (channel >= 5 && channel <= 8)
1314 index = 2;
1315 if (rtlhal->macphymode == DUALMAC_DUALPHY) {
1316 path = RF90_PATH_A;
1317 if (rtlhal->interfaceindex == 0) {
1318 need_pwr_down =
1319 rtl92d_phy_enable_anotherphy(hw, true);
1320 rtlhal->during_mac0init_radiob = true;
1321
1322 if (need_pwr_down)
1323 _rtl92d_phy_enable_rf_env(hw, path,
1324 &u4regvalue);
1325 }
1326 }
1327 for (i = 0; i < RF_REG_NUM_FOR_C_CUT_2G; i++) {
1328 if (rf_reg_for_c_cut_2g[i] == RF_SYN_G7)
1329 rtl_set_rfreg(hw, (enum radio_path)path,
1330 rf_reg_for_c_cut_2g[i],
1331 RFREG_OFFSET_MASK,
1332 (rf_reg_param_for_c_cut_2g[index][i] |
1333 BIT(17)));
1334 else
1335 rtl_set_rfreg(hw, (enum radio_path)path,
1336 rf_reg_for_c_cut_2g[i],
1337 RFREG_OFFSET_MASK,
1338 rf_reg_param_for_c_cut_2g
1339 [index][i]);
1340 rtl_dbg(rtlpriv, COMP_RF, DBG_TRACE,
1341 "offset 0x%x value 0x%x mak 0x%x path %d index %d readback 0x%x\n",
1342 rf_reg_for_c_cut_2g[i],
1343 rf_reg_param_for_c_cut_2g[index][i],
1344 rf_reg_mask_for_c_cut_2g[i], path, index,
1345 rtl_get_rfreg(hw, (enum radio_path)path,
1346 rf_reg_for_c_cut_2g[i],
1347 RFREG_OFFSET_MASK));
1348 }
1349 RTPRINT(rtlpriv, FINIT, INIT_IQK,
1350 "cosa ver 3 set RF-B, 2G, 0x28 = 0x%x !!\n",
1351 rf_syn_g4_for_c_cut_2g | (u4tmp << 11));
1352
1353 rtl_set_rfreg(hw, (enum radio_path)path, RF_SYN_G4,
1354 RFREG_OFFSET_MASK,
1355 rf_syn_g4_for_c_cut_2g | (u4tmp << 11));
1356 if (need_pwr_down)
1357 _rtl92d_phy_restore_rf_env(hw, path, &u4regvalue);
1358 if (rtlhal->during_mac0init_radiob)
1359 rtl92d_phy_powerdown_anotherphy(hw, true);
1360 }
1361 rtl_dbg(rtlpriv, COMP_CMD, DBG_LOUD, "<====\n");
1362 }
1363
1364 u8 rtl92d_get_rightchnlplace_for_iqk(u8 chnl)
1365 {
1366 u8 place;
1367
1368 if (chnl > 14) {
1369 for (place = 14; place < ARRAY_SIZE(channel_all); place++) {
1370 if (channel_all[place] == chnl)
1371 return place - 13;
1372 }
1373 }
1374
1375 return 0;
1376 }
1377
1378 #define MAX_TOLERANCE 5
1379 #define IQK_DELAY_TIME 1
1380 #define MAX_TOLERANCE_92D 3
1381
1382
1383 static u8 _rtl92d_phy_patha_iqk(struct ieee80211_hw *hw, bool configpathb)
1384 {
1385 struct rtl_priv *rtlpriv = rtl_priv(hw);
1386 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
1387 u32 regeac, rege94, rege9c, regea4;
1388 u8 result = 0;
1389
1390 RTPRINT(rtlpriv, FINIT, INIT_IQK, "Path A IQK!\n");
1391
1392 RTPRINT(rtlpriv, FINIT, INIT_IQK, "Path-A IQK setting!\n");
1393 if (rtlhal->interfaceindex == 0) {
1394 rtl_set_bbreg(hw, 0xe30, MASKDWORD, 0x10008c1f);
1395 rtl_set_bbreg(hw, 0xe34, MASKDWORD, 0x10008c1f);
1396 } else {
1397 rtl_set_bbreg(hw, 0xe30, MASKDWORD, 0x10008c22);
1398 rtl_set_bbreg(hw, 0xe34, MASKDWORD, 0x10008c22);
1399 }
1400 rtl_set_bbreg(hw, 0xe38, MASKDWORD, 0x82140102);
1401 rtl_set_bbreg(hw, 0xe3c, MASKDWORD, 0x28160206);
1402
1403 if (configpathb) {
1404 rtl_set_bbreg(hw, 0xe50, MASKDWORD, 0x10008c22);
1405 rtl_set_bbreg(hw, 0xe54, MASKDWORD, 0x10008c22);
1406 rtl_set_bbreg(hw, 0xe58, MASKDWORD, 0x82140102);
1407 rtl_set_bbreg(hw, 0xe5c, MASKDWORD, 0x28160206);
1408 }
1409
1410 RTPRINT(rtlpriv, FINIT, INIT_IQK, "LO calibration setting!\n");
1411 rtl_set_bbreg(hw, 0xe4c, MASKDWORD, 0x00462911);
1412
1413 RTPRINT(rtlpriv, FINIT, INIT_IQK, "One shot, path A LOK & IQK!\n");
1414 rtl_set_bbreg(hw, 0xe48, MASKDWORD, 0xf9000000);
1415 rtl_set_bbreg(hw, 0xe48, MASKDWORD, 0xf8000000);
1416
1417 RTPRINT(rtlpriv, FINIT, INIT_IQK,
1418 "Delay %d ms for One shot, path A LOK & IQK\n",
1419 IQK_DELAY_TIME);
1420 mdelay(IQK_DELAY_TIME);
1421
1422 regeac = rtl_get_bbreg(hw, 0xeac, MASKDWORD);
1423 RTPRINT(rtlpriv, FINIT, INIT_IQK, "0xeac = 0x%x\n", regeac);
1424 rege94 = rtl_get_bbreg(hw, 0xe94, MASKDWORD);
1425 RTPRINT(rtlpriv, FINIT, INIT_IQK, "0xe94 = 0x%x\n", rege94);
1426 rege9c = rtl_get_bbreg(hw, 0xe9c, MASKDWORD);
1427 RTPRINT(rtlpriv, FINIT, INIT_IQK, "0xe9c = 0x%x\n", rege9c);
1428 regea4 = rtl_get_bbreg(hw, 0xea4, MASKDWORD);
1429 RTPRINT(rtlpriv, FINIT, INIT_IQK, "0xea4 = 0x%x\n", regea4);
1430 if (!(regeac & BIT(28)) && (((rege94 & 0x03FF0000) >> 16) != 0x142) &&
1431 (((rege9c & 0x03FF0000) >> 16) != 0x42))
1432 result |= 0x01;
1433 else
1434 return result;
1435
1436 if (!(regeac & BIT(27)) && (((regea4 & 0x03FF0000) >> 16) != 0x132) &&
1437 (((regeac & 0x03FF0000) >> 16) != 0x36))
1438 result |= 0x02;
1439 else
1440 RTPRINT(rtlpriv, FINIT, INIT_IQK, "Path A Rx IQK fail!!\n");
1441 return result;
1442 }
1443
1444
1445 static u8 _rtl92d_phy_patha_iqk_5g_normal(struct ieee80211_hw *hw,
1446 bool configpathb)
1447 {
1448 struct rtl_priv *rtlpriv = rtl_priv(hw);
1449 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
1450 struct rtl_phy *rtlphy = &(rtlpriv->phy);
1451 u32 regeac, rege94, rege9c, regea4;
1452 u8 result = 0;
1453 u8 i;
1454 u8 retrycount = 2;
1455 u32 TXOKBIT = BIT(28), RXOKBIT = BIT(27);
1456
1457 if (rtlhal->interfaceindex == 1) {
1458 TXOKBIT = BIT(31);
1459 RXOKBIT = BIT(30);
1460 }
1461 RTPRINT(rtlpriv, FINIT, INIT_IQK, "Path A IQK!\n");
1462
1463 RTPRINT(rtlpriv, FINIT, INIT_IQK, "Path-A IQK setting!\n");
1464 rtl_set_bbreg(hw, 0xe30, MASKDWORD, 0x18008c1f);
1465 rtl_set_bbreg(hw, 0xe34, MASKDWORD, 0x18008c1f);
1466 rtl_set_bbreg(hw, 0xe38, MASKDWORD, 0x82140307);
1467 rtl_set_bbreg(hw, 0xe3c, MASKDWORD, 0x68160960);
1468
1469 if (configpathb) {
1470 rtl_set_bbreg(hw, 0xe50, MASKDWORD, 0x18008c2f);
1471 rtl_set_bbreg(hw, 0xe54, MASKDWORD, 0x18008c2f);
1472 rtl_set_bbreg(hw, 0xe58, MASKDWORD, 0x82110000);
1473 rtl_set_bbreg(hw, 0xe5c, MASKDWORD, 0x68110000);
1474 }
1475
1476 RTPRINT(rtlpriv, FINIT, INIT_IQK, "LO calibration setting!\n");
1477 rtl_set_bbreg(hw, 0xe4c, MASKDWORD, 0x00462911);
1478
1479 rtl_set_bbreg(hw, RFPGA0_XAB_RFINTERFACESW, MASKDWORD, 0x07000f60);
1480 rtl_set_bbreg(hw, RFPGA0_XA_RFINTERFACEOE, MASKDWORD, 0x66e60e30);
1481 for (i = 0; i < retrycount; i++) {
1482
1483 RTPRINT(rtlpriv, FINIT, INIT_IQK,
1484 "One shot, path A LOK & IQK!\n");
1485 rtl_set_bbreg(hw, 0xe48, MASKDWORD, 0xf9000000);
1486 rtl_set_bbreg(hw, 0xe48, MASKDWORD, 0xf8000000);
1487
1488 RTPRINT(rtlpriv, FINIT, INIT_IQK,
1489 "Delay %d ms for One shot, path A LOK & IQK.\n",
1490 IQK_DELAY_TIME);
1491 mdelay(IQK_DELAY_TIME * 10);
1492
1493 regeac = rtl_get_bbreg(hw, 0xeac, MASKDWORD);
1494 RTPRINT(rtlpriv, FINIT, INIT_IQK, "0xeac = 0x%x\n", regeac);
1495 rege94 = rtl_get_bbreg(hw, 0xe94, MASKDWORD);
1496 RTPRINT(rtlpriv, FINIT, INIT_IQK, "0xe94 = 0x%x\n", rege94);
1497 rege9c = rtl_get_bbreg(hw, 0xe9c, MASKDWORD);
1498 RTPRINT(rtlpriv, FINIT, INIT_IQK, "0xe9c = 0x%x\n", rege9c);
1499 regea4 = rtl_get_bbreg(hw, 0xea4, MASKDWORD);
1500 RTPRINT(rtlpriv, FINIT, INIT_IQK, "0xea4 = 0x%x\n", regea4);
1501 if (!(regeac & TXOKBIT) &&
1502 (((rege94 & 0x03FF0000) >> 16) != 0x142)) {
1503 result |= 0x01;
1504 } else {
1505 RTPRINT(rtlpriv, FINIT, INIT_IQK,
1506 "Path A Tx IQK fail!!\n");
1507 continue;
1508 }
1509
1510
1511 if (!(regeac & RXOKBIT) &&
1512 (((regea4 & 0x03FF0000) >> 16) != 0x132)) {
1513 result |= 0x02;
1514 break;
1515 } else {
1516 RTPRINT(rtlpriv, FINIT, INIT_IQK,
1517 "Path A Rx IQK fail!!\n");
1518 }
1519 }
1520
1521 rtl_set_bbreg(hw, RFPGA0_XAB_RFINTERFACESW, MASKDWORD,
1522 rtlphy->iqk_bb_backup[0]);
1523 rtl_set_bbreg(hw, RFPGA0_XA_RFINTERFACEOE, MASKDWORD,
1524 rtlphy->iqk_bb_backup[1]);
1525 return result;
1526 }
1527
1528
1529 static u8 _rtl92d_phy_pathb_iqk(struct ieee80211_hw *hw)
1530 {
1531 struct rtl_priv *rtlpriv = rtl_priv(hw);
1532 u32 regeac, regeb4, regebc, regec4, regecc;
1533 u8 result = 0;
1534
1535 RTPRINT(rtlpriv, FINIT, INIT_IQK, "Path B IQK!\n");
1536
1537 RTPRINT(rtlpriv, FINIT, INIT_IQK, "One shot, path A LOK & IQK!\n");
1538 rtl_set_bbreg(hw, 0xe60, MASKDWORD, 0x00000002);
1539 rtl_set_bbreg(hw, 0xe60, MASKDWORD, 0x00000000);
1540
1541 RTPRINT(rtlpriv, FINIT, INIT_IQK,
1542 "Delay %d ms for One shot, path B LOK & IQK\n", IQK_DELAY_TIME);
1543 mdelay(IQK_DELAY_TIME);
1544
1545 regeac = rtl_get_bbreg(hw, 0xeac, MASKDWORD);
1546 RTPRINT(rtlpriv, FINIT, INIT_IQK, "0xeac = 0x%x\n", regeac);
1547 regeb4 = rtl_get_bbreg(hw, 0xeb4, MASKDWORD);
1548 RTPRINT(rtlpriv, FINIT, INIT_IQK, "0xeb4 = 0x%x\n", regeb4);
1549 regebc = rtl_get_bbreg(hw, 0xebc, MASKDWORD);
1550 RTPRINT(rtlpriv, FINIT, INIT_IQK, "0xebc = 0x%x\n", regebc);
1551 regec4 = rtl_get_bbreg(hw, 0xec4, MASKDWORD);
1552 RTPRINT(rtlpriv, FINIT, INIT_IQK, "0xec4 = 0x%x\n", regec4);
1553 regecc = rtl_get_bbreg(hw, 0xecc, MASKDWORD);
1554 RTPRINT(rtlpriv, FINIT, INIT_IQK, "0xecc = 0x%x\n", regecc);
1555 if (!(regeac & BIT(31)) && (((regeb4 & 0x03FF0000) >> 16) != 0x142) &&
1556 (((regebc & 0x03FF0000) >> 16) != 0x42))
1557 result |= 0x01;
1558 else
1559 return result;
1560 if (!(regeac & BIT(30)) && (((regec4 & 0x03FF0000) >> 16) != 0x132) &&
1561 (((regecc & 0x03FF0000) >> 16) != 0x36))
1562 result |= 0x02;
1563 else
1564 RTPRINT(rtlpriv, FINIT, INIT_IQK, "Path B Rx IQK fail!!\n");
1565 return result;
1566 }
1567
1568
1569 static u8 _rtl92d_phy_pathb_iqk_5g_normal(struct ieee80211_hw *hw)
1570 {
1571 struct rtl_priv *rtlpriv = rtl_priv(hw);
1572 struct rtl_phy *rtlphy = &(rtlpriv->phy);
1573 u32 regeac, regeb4, regebc, regec4, regecc;
1574 u8 result = 0;
1575 u8 i;
1576 u8 retrycount = 2;
1577
1578 RTPRINT(rtlpriv, FINIT, INIT_IQK, "Path B IQK!\n");
1579
1580 RTPRINT(rtlpriv, FINIT, INIT_IQK, "Path-A IQK setting!\n");
1581 rtl_set_bbreg(hw, 0xe30, MASKDWORD, 0x18008c1f);
1582 rtl_set_bbreg(hw, 0xe34, MASKDWORD, 0x18008c1f);
1583 rtl_set_bbreg(hw, 0xe38, MASKDWORD, 0x82110000);
1584 rtl_set_bbreg(hw, 0xe3c, MASKDWORD, 0x68110000);
1585
1586
1587 rtl_set_bbreg(hw, 0xe50, MASKDWORD, 0x18008c2f);
1588 rtl_set_bbreg(hw, 0xe54, MASKDWORD, 0x18008c2f);
1589 rtl_set_bbreg(hw, 0xe58, MASKDWORD, 0x82140307);
1590 rtl_set_bbreg(hw, 0xe5c, MASKDWORD, 0x68160960);
1591
1592
1593 RTPRINT(rtlpriv, FINIT, INIT_IQK, "LO calibration setting!\n");
1594 rtl_set_bbreg(hw, 0xe4c, MASKDWORD, 0x00462911);
1595
1596
1597 rtl_set_bbreg(hw, RFPGA0_XAB_RFINTERFACESW, MASKDWORD, 0x0f600700);
1598 rtl_set_bbreg(hw, RFPGA0_XB_RFINTERFACEOE, MASKDWORD, 0x061f0d30);
1599
1600 for (i = 0; i < retrycount; i++) {
1601
1602 RTPRINT(rtlpriv, FINIT, INIT_IQK,
1603 "One shot, path A LOK & IQK!\n");
1604 rtl_set_bbreg(hw, 0xe48, MASKDWORD, 0xfa000000);
1605 rtl_set_bbreg(hw, 0xe48, MASKDWORD, 0xf8000000);
1606
1607
1608 RTPRINT(rtlpriv, FINIT, INIT_IQK,
1609 "Delay %d ms for One shot, path B LOK & IQK.\n", 10);
1610 mdelay(IQK_DELAY_TIME * 10);
1611
1612
1613 regeac = rtl_get_bbreg(hw, 0xeac, MASKDWORD);
1614 RTPRINT(rtlpriv, FINIT, INIT_IQK, "0xeac = 0x%x\n", regeac);
1615 regeb4 = rtl_get_bbreg(hw, 0xeb4, MASKDWORD);
1616 RTPRINT(rtlpriv, FINIT, INIT_IQK, "0xeb4 = 0x%x\n", regeb4);
1617 regebc = rtl_get_bbreg(hw, 0xebc, MASKDWORD);
1618 RTPRINT(rtlpriv, FINIT, INIT_IQK, "0xebc = 0x%x\n", regebc);
1619 regec4 = rtl_get_bbreg(hw, 0xec4, MASKDWORD);
1620 RTPRINT(rtlpriv, FINIT, INIT_IQK, "0xec4 = 0x%x\n", regec4);
1621 regecc = rtl_get_bbreg(hw, 0xecc, MASKDWORD);
1622 RTPRINT(rtlpriv, FINIT, INIT_IQK, "0xecc = 0x%x\n", regecc);
1623 if (!(regeac & BIT(31)) &&
1624 (((regeb4 & 0x03FF0000) >> 16) != 0x142))
1625 result |= 0x01;
1626 else
1627 continue;
1628 if (!(regeac & BIT(30)) &&
1629 (((regec4 & 0x03FF0000) >> 16) != 0x132)) {
1630 result |= 0x02;
1631 break;
1632 } else {
1633 RTPRINT(rtlpriv, FINIT, INIT_IQK,
1634 "Path B Rx IQK fail!!\n");
1635 }
1636 }
1637
1638
1639 rtl_set_bbreg(hw, RFPGA0_XAB_RFINTERFACESW, MASKDWORD,
1640 rtlphy->iqk_bb_backup[0]);
1641 rtl_set_bbreg(hw, RFPGA0_XB_RFINTERFACEOE, MASKDWORD,
1642 rtlphy->iqk_bb_backup[2]);
1643 return result;
1644 }
1645
1646 static void _rtl92d_phy_save_adda_registers(struct ieee80211_hw *hw,
1647 u32 *adda_reg, u32 *adda_backup,
1648 u32 regnum)
1649 {
1650 struct rtl_priv *rtlpriv = rtl_priv(hw);
1651 u32 i;
1652
1653 RTPRINT(rtlpriv, FINIT, INIT_IQK, "Save ADDA parameters.\n");
1654 for (i = 0; i < regnum; i++)
1655 adda_backup[i] = rtl_get_bbreg(hw, adda_reg[i], MASKDWORD);
1656 }
1657
1658 static void _rtl92d_phy_save_mac_registers(struct ieee80211_hw *hw,
1659 u32 *macreg, u32 *macbackup)
1660 {
1661 struct rtl_priv *rtlpriv = rtl_priv(hw);
1662 u32 i;
1663
1664 RTPRINT(rtlpriv, FINIT, INIT_IQK, "Save MAC parameters.\n");
1665 for (i = 0; i < (IQK_MAC_REG_NUM - 1); i++)
1666 macbackup[i] = rtl_read_byte(rtlpriv, macreg[i]);
1667 macbackup[i] = rtl_read_dword(rtlpriv, macreg[i]);
1668 }
1669
1670 static void _rtl92d_phy_reload_adda_registers(struct ieee80211_hw *hw,
1671 u32 *adda_reg, u32 *adda_backup,
1672 u32 regnum)
1673 {
1674 struct rtl_priv *rtlpriv = rtl_priv(hw);
1675 u32 i;
1676
1677 RTPRINT(rtlpriv, FINIT, INIT_IQK,
1678 "Reload ADDA power saving parameters !\n");
1679 for (i = 0; i < regnum; i++)
1680 rtl_set_bbreg(hw, adda_reg[i], MASKDWORD, adda_backup[i]);
1681 }
1682
1683 static void _rtl92d_phy_reload_mac_registers(struct ieee80211_hw *hw,
1684 u32 *macreg, u32 *macbackup)
1685 {
1686 struct rtl_priv *rtlpriv = rtl_priv(hw);
1687 u32 i;
1688
1689 RTPRINT(rtlpriv, FINIT, INIT_IQK, "Reload MAC parameters !\n");
1690 for (i = 0; i < (IQK_MAC_REG_NUM - 1); i++)
1691 rtl_write_byte(rtlpriv, macreg[i], (u8) macbackup[i]);
1692 rtl_write_byte(rtlpriv, macreg[i], macbackup[i]);
1693 }
1694
1695 static void _rtl92d_phy_path_adda_on(struct ieee80211_hw *hw,
1696 u32 *adda_reg, bool patha_on, bool is2t)
1697 {
1698 struct rtl_priv *rtlpriv = rtl_priv(hw);
1699 u32 pathon;
1700 u32 i;
1701
1702 RTPRINT(rtlpriv, FINIT, INIT_IQK, "ADDA ON.\n");
1703 pathon = patha_on ? 0x04db25a4 : 0x0b1b25a4;
1704 if (patha_on)
1705 pathon = rtlpriv->rtlhal.interfaceindex == 0 ?
1706 0x04db25a4 : 0x0b1b25a4;
1707 for (i = 0; i < IQK_ADDA_REG_NUM; i++)
1708 rtl_set_bbreg(hw, adda_reg[i], MASKDWORD, pathon);
1709 }
1710
1711 static void _rtl92d_phy_mac_setting_calibration(struct ieee80211_hw *hw,
1712 u32 *macreg, u32 *macbackup)
1713 {
1714 struct rtl_priv *rtlpriv = rtl_priv(hw);
1715 u32 i;
1716
1717 RTPRINT(rtlpriv, FINIT, INIT_IQK, "MAC settings for Calibration.\n");
1718 rtl_write_byte(rtlpriv, macreg[0], 0x3F);
1719
1720 for (i = 1; i < (IQK_MAC_REG_NUM - 1); i++)
1721 rtl_write_byte(rtlpriv, macreg[i], (u8)(macbackup[i] &
1722 (~BIT(3))));
1723 rtl_write_byte(rtlpriv, macreg[i], (u8) (macbackup[i] & (~BIT(5))));
1724 }
1725
1726 static void _rtl92d_phy_patha_standby(struct ieee80211_hw *hw)
1727 {
1728 struct rtl_priv *rtlpriv = rtl_priv(hw);
1729 RTPRINT(rtlpriv, FINIT, INIT_IQK, "Path-A standby mode!\n");
1730
1731 rtl_set_bbreg(hw, 0xe28, MASKDWORD, 0x0);
1732 rtl_set_bbreg(hw, RFPGA0_XA_LSSIPARAMETER, MASKDWORD, 0x00010000);
1733 rtl_set_bbreg(hw, 0xe28, MASKDWORD, 0x80800000);
1734 }
1735
1736 static void _rtl92d_phy_pimode_switch(struct ieee80211_hw *hw, bool pi_mode)
1737 {
1738 struct rtl_priv *rtlpriv = rtl_priv(hw);
1739 u32 mode;
1740
1741 RTPRINT(rtlpriv, FINIT, INIT_IQK,
1742 "BB Switch to %s mode!\n", pi_mode ? "PI" : "SI");
1743 mode = pi_mode ? 0x01000100 : 0x01000000;
1744 rtl_set_bbreg(hw, 0x820, MASKDWORD, mode);
1745 rtl_set_bbreg(hw, 0x828, MASKDWORD, mode);
1746 }
1747
1748 static void _rtl92d_phy_iq_calibrate(struct ieee80211_hw *hw, long result[][8],
1749 u8 t, bool is2t)
1750 {
1751 struct rtl_priv *rtlpriv = rtl_priv(hw);
1752 struct rtl_phy *rtlphy = &(rtlpriv->phy);
1753 u32 i;
1754 u8 patha_ok, pathb_ok;
1755 static u32 adda_reg[IQK_ADDA_REG_NUM] = {
1756 RFPGA0_XCD_SWITCHCONTROL, 0xe6c, 0xe70, 0xe74,
1757 0xe78, 0xe7c, 0xe80, 0xe84,
1758 0xe88, 0xe8c, 0xed0, 0xed4,
1759 0xed8, 0xedc, 0xee0, 0xeec
1760 };
1761 static u32 iqk_mac_reg[IQK_MAC_REG_NUM] = {
1762 0x522, 0x550, 0x551, 0x040
1763 };
1764 static u32 iqk_bb_reg[IQK_BB_REG_NUM] = {
1765 RFPGA0_XAB_RFINTERFACESW, RFPGA0_XA_RFINTERFACEOE,
1766 RFPGA0_XB_RFINTERFACEOE, ROFDM0_TRMUXPAR,
1767 RFPGA0_XCD_RFINTERFACESW, ROFDM0_TRXPATHENABLE,
1768 RFPGA0_RFMOD, RFPGA0_ANALOGPARAMETER4,
1769 ROFDM0_XAAGCCORE1, ROFDM0_XBAGCCORE1
1770 };
1771 const u32 retrycount = 2;
1772 u32 bbvalue;
1773
1774 RTPRINT(rtlpriv, FINIT, INIT_IQK, "IQK for 2.4G :Start!!!\n");
1775 if (t == 0) {
1776 bbvalue = rtl_get_bbreg(hw, RFPGA0_RFMOD, MASKDWORD);
1777 RTPRINT(rtlpriv, FINIT, INIT_IQK, "==>0x%08x\n", bbvalue);
1778 RTPRINT(rtlpriv, FINIT, INIT_IQK, "IQ Calibration for %s\n",
1779 is2t ? "2T2R" : "1T1R");
1780
1781
1782 _rtl92d_phy_save_adda_registers(hw, adda_reg,
1783 rtlphy->adda_backup, IQK_ADDA_REG_NUM);
1784 _rtl92d_phy_save_mac_registers(hw, iqk_mac_reg,
1785 rtlphy->iqk_mac_backup);
1786 _rtl92d_phy_save_adda_registers(hw, iqk_bb_reg,
1787 rtlphy->iqk_bb_backup, IQK_BB_REG_NUM);
1788 }
1789 _rtl92d_phy_path_adda_on(hw, adda_reg, true, is2t);
1790 if (t == 0)
1791 rtlphy->rfpi_enable = (u8) rtl_get_bbreg(hw,
1792 RFPGA0_XA_HSSIPARAMETER1, BIT(8));
1793
1794
1795 if (!rtlphy->rfpi_enable)
1796 _rtl92d_phy_pimode_switch(hw, true);
1797
1798 rtl_set_bbreg(hw, RFPGA0_RFMOD, BIT(24), 0x00);
1799 rtl_set_bbreg(hw, ROFDM0_TRXPATHENABLE, MASKDWORD, 0x03a05600);
1800 rtl_set_bbreg(hw, ROFDM0_TRMUXPAR, MASKDWORD, 0x000800e4);
1801 rtl_set_bbreg(hw, RFPGA0_XCD_RFINTERFACESW, MASKDWORD, 0x22204000);
1802 rtl_set_bbreg(hw, RFPGA0_ANALOGPARAMETER4, 0xf00000, 0x0f);
1803 if (is2t) {
1804 rtl_set_bbreg(hw, RFPGA0_XA_LSSIPARAMETER, MASKDWORD,
1805 0x00010000);
1806 rtl_set_bbreg(hw, RFPGA0_XB_LSSIPARAMETER, MASKDWORD,
1807 0x00010000);
1808 }
1809
1810 _rtl92d_phy_mac_setting_calibration(hw, iqk_mac_reg,
1811 rtlphy->iqk_mac_backup);
1812
1813 rtl_set_bbreg(hw, 0xb68, MASKDWORD, 0x0f600000);
1814 if (is2t)
1815 rtl_set_bbreg(hw, 0xb6c, MASKDWORD, 0x0f600000);
1816
1817 RTPRINT(rtlpriv, FINIT, INIT_IQK, "IQK setting!\n");
1818 rtl_set_bbreg(hw, 0xe28, MASKDWORD, 0x80800000);
1819 rtl_set_bbreg(hw, 0xe40, MASKDWORD, 0x01007c00);
1820 rtl_set_bbreg(hw, 0xe44, MASKDWORD, 0x01004800);
1821 for (i = 0; i < retrycount; i++) {
1822 patha_ok = _rtl92d_phy_patha_iqk(hw, is2t);
1823 if (patha_ok == 0x03) {
1824 RTPRINT(rtlpriv, FINIT, INIT_IQK,
1825 "Path A IQK Success!!\n");
1826 result[t][0] = (rtl_get_bbreg(hw, 0xe94, MASKDWORD) &
1827 0x3FF0000) >> 16;
1828 result[t][1] = (rtl_get_bbreg(hw, 0xe9c, MASKDWORD) &
1829 0x3FF0000) >> 16;
1830 result[t][2] = (rtl_get_bbreg(hw, 0xea4, MASKDWORD) &
1831 0x3FF0000) >> 16;
1832 result[t][3] = (rtl_get_bbreg(hw, 0xeac, MASKDWORD) &
1833 0x3FF0000) >> 16;
1834 break;
1835 } else if (i == (retrycount - 1) && patha_ok == 0x01) {
1836
1837 RTPRINT(rtlpriv, FINIT, INIT_IQK,
1838 "Path A IQK Only Tx Success!!\n");
1839
1840 result[t][0] = (rtl_get_bbreg(hw, 0xe94, MASKDWORD) &
1841 0x3FF0000) >> 16;
1842 result[t][1] = (rtl_get_bbreg(hw, 0xe9c, MASKDWORD) &
1843 0x3FF0000) >> 16;
1844 }
1845 }
1846 if (0x00 == patha_ok)
1847 RTPRINT(rtlpriv, FINIT, INIT_IQK, "Path A IQK failed!!\n");
1848 if (is2t) {
1849 _rtl92d_phy_patha_standby(hw);
1850
1851 _rtl92d_phy_path_adda_on(hw, adda_reg, false, is2t);
1852 for (i = 0; i < retrycount; i++) {
1853 pathb_ok = _rtl92d_phy_pathb_iqk(hw);
1854 if (pathb_ok == 0x03) {
1855 RTPRINT(rtlpriv, FINIT, INIT_IQK,
1856 "Path B IQK Success!!\n");
1857 result[t][4] = (rtl_get_bbreg(hw, 0xeb4,
1858 MASKDWORD) & 0x3FF0000) >> 16;
1859 result[t][5] = (rtl_get_bbreg(hw, 0xebc,
1860 MASKDWORD) & 0x3FF0000) >> 16;
1861 result[t][6] = (rtl_get_bbreg(hw, 0xec4,
1862 MASKDWORD) & 0x3FF0000) >> 16;
1863 result[t][7] = (rtl_get_bbreg(hw, 0xecc,
1864 MASKDWORD) & 0x3FF0000) >> 16;
1865 break;
1866 } else if (i == (retrycount - 1) && pathb_ok == 0x01) {
1867
1868 RTPRINT(rtlpriv, FINIT, INIT_IQK,
1869 "Path B Only Tx IQK Success!!\n");
1870 result[t][4] = (rtl_get_bbreg(hw, 0xeb4,
1871 MASKDWORD) & 0x3FF0000) >> 16;
1872 result[t][5] = (rtl_get_bbreg(hw, 0xebc,
1873 MASKDWORD) & 0x3FF0000) >> 16;
1874 }
1875 }
1876 if (0x00 == pathb_ok)
1877 RTPRINT(rtlpriv, FINIT, INIT_IQK,
1878 "Path B IQK failed!!\n");
1879 }
1880
1881
1882 RTPRINT(rtlpriv, FINIT, INIT_IQK,
1883 "IQK:Back to BB mode, load original value!\n");
1884
1885 rtl_set_bbreg(hw, 0xe28, MASKDWORD, 0);
1886 if (t != 0) {
1887
1888 if (!rtlphy->rfpi_enable)
1889 _rtl92d_phy_pimode_switch(hw, false);
1890
1891 _rtl92d_phy_reload_adda_registers(hw, adda_reg,
1892 rtlphy->adda_backup, IQK_ADDA_REG_NUM);
1893
1894 _rtl92d_phy_reload_mac_registers(hw, iqk_mac_reg,
1895 rtlphy->iqk_mac_backup);
1896 if (is2t)
1897 _rtl92d_phy_reload_adda_registers(hw, iqk_bb_reg,
1898 rtlphy->iqk_bb_backup,
1899 IQK_BB_REG_NUM);
1900 else
1901 _rtl92d_phy_reload_adda_registers(hw, iqk_bb_reg,
1902 rtlphy->iqk_bb_backup,
1903 IQK_BB_REG_NUM - 1);
1904
1905 rtl_set_bbreg(hw, 0xe30, MASKDWORD, 0x01008c00);
1906 rtl_set_bbreg(hw, 0xe34, MASKDWORD, 0x01008c00);
1907 }
1908 RTPRINT(rtlpriv, FINIT, INIT_IQK, "<==\n");
1909 }
1910
1911 static void _rtl92d_phy_iq_calibrate_5g_normal(struct ieee80211_hw *hw,
1912 long result[][8], u8 t)
1913 {
1914 struct rtl_priv *rtlpriv = rtl_priv(hw);
1915 struct rtl_phy *rtlphy = &(rtlpriv->phy);
1916 struct rtl_hal *rtlhal = &(rtlpriv->rtlhal);
1917 u8 patha_ok, pathb_ok;
1918 static u32 adda_reg[IQK_ADDA_REG_NUM] = {
1919 RFPGA0_XCD_SWITCHCONTROL, 0xe6c, 0xe70, 0xe74,
1920 0xe78, 0xe7c, 0xe80, 0xe84,
1921 0xe88, 0xe8c, 0xed0, 0xed4,
1922 0xed8, 0xedc, 0xee0, 0xeec
1923 };
1924 static u32 iqk_mac_reg[IQK_MAC_REG_NUM] = {
1925 0x522, 0x550, 0x551, 0x040
1926 };
1927 static u32 iqk_bb_reg[IQK_BB_REG_NUM] = {
1928 RFPGA0_XAB_RFINTERFACESW, RFPGA0_XA_RFINTERFACEOE,
1929 RFPGA0_XB_RFINTERFACEOE, ROFDM0_TRMUXPAR,
1930 RFPGA0_XCD_RFINTERFACESW, ROFDM0_TRXPATHENABLE,
1931 RFPGA0_RFMOD, RFPGA0_ANALOGPARAMETER4,
1932 ROFDM0_XAAGCCORE1, ROFDM0_XBAGCCORE1
1933 };
1934 u32 bbvalue;
1935 bool is2t = IS_92D_SINGLEPHY(rtlhal->version);
1936
1937
1938
1939
1940 RTPRINT(rtlpriv, FINIT, INIT_IQK, "IQK for 5G NORMAL:Start!!!\n");
1941 mdelay(IQK_DELAY_TIME * 20);
1942 if (t == 0) {
1943 bbvalue = rtl_get_bbreg(hw, RFPGA0_RFMOD, MASKDWORD);
1944 RTPRINT(rtlpriv, FINIT, INIT_IQK, "==>0x%08x\n", bbvalue);
1945 RTPRINT(rtlpriv, FINIT, INIT_IQK, "IQ Calibration for %s\n",
1946 is2t ? "2T2R" : "1T1R");
1947
1948 _rtl92d_phy_save_adda_registers(hw, adda_reg,
1949 rtlphy->adda_backup,
1950 IQK_ADDA_REG_NUM);
1951 _rtl92d_phy_save_mac_registers(hw, iqk_mac_reg,
1952 rtlphy->iqk_mac_backup);
1953 if (is2t)
1954 _rtl92d_phy_save_adda_registers(hw, iqk_bb_reg,
1955 rtlphy->iqk_bb_backup,
1956 IQK_BB_REG_NUM);
1957 else
1958 _rtl92d_phy_save_adda_registers(hw, iqk_bb_reg,
1959 rtlphy->iqk_bb_backup,
1960 IQK_BB_REG_NUM - 1);
1961 }
1962 _rtl92d_phy_path_adda_on(hw, adda_reg, true, is2t);
1963
1964 _rtl92d_phy_mac_setting_calibration(hw, iqk_mac_reg,
1965 rtlphy->iqk_mac_backup);
1966 if (t == 0)
1967 rtlphy->rfpi_enable = (u8) rtl_get_bbreg(hw,
1968 RFPGA0_XA_HSSIPARAMETER1, BIT(8));
1969
1970 if (!rtlphy->rfpi_enable)
1971 _rtl92d_phy_pimode_switch(hw, true);
1972 rtl_set_bbreg(hw, RFPGA0_RFMOD, BIT(24), 0x00);
1973 rtl_set_bbreg(hw, ROFDM0_TRXPATHENABLE, MASKDWORD, 0x03a05600);
1974 rtl_set_bbreg(hw, ROFDM0_TRMUXPAR, MASKDWORD, 0x000800e4);
1975 rtl_set_bbreg(hw, RFPGA0_XCD_RFINTERFACESW, MASKDWORD, 0x22208000);
1976 rtl_set_bbreg(hw, RFPGA0_ANALOGPARAMETER4, 0xf00000, 0x0f);
1977
1978
1979 rtl_set_bbreg(hw, 0xb68, MASKDWORD, 0x0f600000);
1980 if (is2t)
1981 rtl_set_bbreg(hw, 0xb6c, MASKDWORD, 0x0f600000);
1982
1983 RTPRINT(rtlpriv, FINIT, INIT_IQK, "IQK setting!\n");
1984 rtl_set_bbreg(hw, 0xe28, MASKDWORD, 0x80800000);
1985 rtl_set_bbreg(hw, 0xe40, MASKDWORD, 0x10007c00);
1986 rtl_set_bbreg(hw, 0xe44, MASKDWORD, 0x01004800);
1987 patha_ok = _rtl92d_phy_patha_iqk_5g_normal(hw, is2t);
1988 if (patha_ok == 0x03) {
1989 RTPRINT(rtlpriv, FINIT, INIT_IQK, "Path A IQK Success!!\n");
1990 result[t][0] = (rtl_get_bbreg(hw, 0xe94, MASKDWORD) &
1991 0x3FF0000) >> 16;
1992 result[t][1] = (rtl_get_bbreg(hw, 0xe9c, MASKDWORD) &
1993 0x3FF0000) >> 16;
1994 result[t][2] = (rtl_get_bbreg(hw, 0xea4, MASKDWORD) &
1995 0x3FF0000) >> 16;
1996 result[t][3] = (rtl_get_bbreg(hw, 0xeac, MASKDWORD) &
1997 0x3FF0000) >> 16;
1998 } else if (patha_ok == 0x01) {
1999 RTPRINT(rtlpriv, FINIT, INIT_IQK,
2000 "Path A IQK Only Tx Success!!\n");
2001
2002 result[t][0] = (rtl_get_bbreg(hw, 0xe94, MASKDWORD) &
2003 0x3FF0000) >> 16;
2004 result[t][1] = (rtl_get_bbreg(hw, 0xe9c, MASKDWORD) &
2005 0x3FF0000) >> 16;
2006 } else {
2007 RTPRINT(rtlpriv, FINIT, INIT_IQK, "Path A IQK Fail!!\n");
2008 }
2009 if (is2t) {
2010
2011
2012 _rtl92d_phy_path_adda_on(hw, adda_reg, false, is2t);
2013 pathb_ok = _rtl92d_phy_pathb_iqk_5g_normal(hw);
2014 if (pathb_ok == 0x03) {
2015 RTPRINT(rtlpriv, FINIT, INIT_IQK,
2016 "Path B IQK Success!!\n");
2017 result[t][4] = (rtl_get_bbreg(hw, 0xeb4, MASKDWORD) &
2018 0x3FF0000) >> 16;
2019 result[t][5] = (rtl_get_bbreg(hw, 0xebc, MASKDWORD) &
2020 0x3FF0000) >> 16;
2021 result[t][6] = (rtl_get_bbreg(hw, 0xec4, MASKDWORD) &
2022 0x3FF0000) >> 16;
2023 result[t][7] = (rtl_get_bbreg(hw, 0xecc, MASKDWORD) &
2024 0x3FF0000) >> 16;
2025 } else if (pathb_ok == 0x01) {
2026 RTPRINT(rtlpriv, FINIT, INIT_IQK,
2027 "Path B Only Tx IQK Success!!\n");
2028 result[t][4] = (rtl_get_bbreg(hw, 0xeb4, MASKDWORD) &
2029 0x3FF0000) >> 16;
2030 result[t][5] = (rtl_get_bbreg(hw, 0xebc, MASKDWORD) &
2031 0x3FF0000) >> 16;
2032 } else {
2033 RTPRINT(rtlpriv, FINIT, INIT_IQK,
2034 "Path B IQK failed!!\n");
2035 }
2036 }
2037
2038
2039 RTPRINT(rtlpriv, FINIT, INIT_IQK,
2040 "IQK:Back to BB mode, load original value!\n");
2041 rtl_set_bbreg(hw, 0xe28, MASKDWORD, 0);
2042 if (t != 0) {
2043 if (is2t)
2044 _rtl92d_phy_reload_adda_registers(hw, iqk_bb_reg,
2045 rtlphy->iqk_bb_backup,
2046 IQK_BB_REG_NUM);
2047 else
2048 _rtl92d_phy_reload_adda_registers(hw, iqk_bb_reg,
2049 rtlphy->iqk_bb_backup,
2050 IQK_BB_REG_NUM - 1);
2051
2052 _rtl92d_phy_reload_mac_registers(hw, iqk_mac_reg,
2053 rtlphy->iqk_mac_backup);
2054
2055 if (!rtlphy->rfpi_enable)
2056 _rtl92d_phy_pimode_switch(hw, false);
2057
2058 _rtl92d_phy_reload_adda_registers(hw, adda_reg,
2059 rtlphy->adda_backup,
2060 IQK_ADDA_REG_NUM);
2061 }
2062 RTPRINT(rtlpriv, FINIT, INIT_IQK, "<==\n");
2063 }
2064
2065 static bool _rtl92d_phy_simularity_compare(struct ieee80211_hw *hw,
2066 long result[][8], u8 c1, u8 c2)
2067 {
2068 struct rtl_priv *rtlpriv = rtl_priv(hw);
2069 struct rtl_hal *rtlhal = &(rtlpriv->rtlhal);
2070 u32 i, j, diff, sim_bitmap, bound;
2071 u8 final_candidate[2] = {0xFF, 0xFF};
2072 bool bresult = true;
2073 bool is2t = IS_92D_SINGLEPHY(rtlhal->version);
2074
2075 if (is2t)
2076 bound = 8;
2077 else
2078 bound = 4;
2079 sim_bitmap = 0;
2080 for (i = 0; i < bound; i++) {
2081 diff = (result[c1][i] > result[c2][i]) ? (result[c1][i] -
2082 result[c2][i]) : (result[c2][i] - result[c1][i]);
2083 if (diff > MAX_TOLERANCE_92D) {
2084 if ((i == 2 || i == 6) && !sim_bitmap) {
2085 if (result[c1][i] + result[c1][i + 1] == 0)
2086 final_candidate[(i / 4)] = c2;
2087 else if (result[c2][i] + result[c2][i + 1] == 0)
2088 final_candidate[(i / 4)] = c1;
2089 else
2090 sim_bitmap = sim_bitmap | (1 << i);
2091 } else {
2092 sim_bitmap = sim_bitmap | (1 << i);
2093 }
2094 }
2095 }
2096 if (sim_bitmap == 0) {
2097 for (i = 0; i < (bound / 4); i++) {
2098 if (final_candidate[i] != 0xFF) {
2099 for (j = i * 4; j < (i + 1) * 4 - 2; j++)
2100 result[3][j] =
2101 result[final_candidate[i]][j];
2102 bresult = false;
2103 }
2104 }
2105 return bresult;
2106 }
2107 if (!(sim_bitmap & 0x0F)) {
2108 for (i = 0; i < 4; i++)
2109 result[3][i] = result[c1][i];
2110 } else if (!(sim_bitmap & 0x03)) {
2111 for (i = 0; i < 2; i++)
2112 result[3][i] = result[c1][i];
2113 }
2114 if (!(sim_bitmap & 0xF0) && is2t) {
2115 for (i = 4; i < 8; i++)
2116 result[3][i] = result[c1][i];
2117 } else if (!(sim_bitmap & 0x30)) {
2118 for (i = 4; i < 6; i++)
2119 result[3][i] = result[c1][i];
2120 }
2121 return false;
2122 }
2123
2124 static void _rtl92d_phy_patha_fill_iqk_matrix(struct ieee80211_hw *hw,
2125 bool iqk_ok, long result[][8],
2126 u8 final_candidate, bool txonly)
2127 {
2128 struct rtl_priv *rtlpriv = rtl_priv(hw);
2129 struct rtl_hal *rtlhal = &(rtlpriv->rtlhal);
2130 u32 oldval_0, val_x, tx0_a, reg;
2131 long val_y, tx0_c;
2132 bool is2t = IS_92D_SINGLEPHY(rtlhal->version) ||
2133 rtlhal->macphymode == DUALMAC_DUALPHY;
2134
2135 RTPRINT(rtlpriv, FINIT, INIT_IQK,
2136 "Path A IQ Calibration %s !\n", iqk_ok ? "Success" : "Failed");
2137 if (final_candidate == 0xFF) {
2138 return;
2139 } else if (iqk_ok) {
2140 oldval_0 = (rtl_get_bbreg(hw, ROFDM0_XATXIQIMBALANCE,
2141 MASKDWORD) >> 22) & 0x3FF;
2142 val_x = result[final_candidate][0];
2143 if ((val_x & 0x00000200) != 0)
2144 val_x = val_x | 0xFFFFFC00;
2145 tx0_a = (val_x * oldval_0) >> 8;
2146 RTPRINT(rtlpriv, FINIT, INIT_IQK,
2147 "X = 0x%x, tx0_a = 0x%x, oldval_0 0x%x\n",
2148 val_x, tx0_a, oldval_0);
2149 rtl_set_bbreg(hw, ROFDM0_XATXIQIMBALANCE, 0x3FF, tx0_a);
2150 rtl_set_bbreg(hw, ROFDM0_ECCATHRESHOLD, BIT(24),
2151 ((val_x * oldval_0 >> 7) & 0x1));
2152 val_y = result[final_candidate][1];
2153 if ((val_y & 0x00000200) != 0)
2154 val_y = val_y | 0xFFFFFC00;
2155
2156 if (rtlhal->interfaceindex == 1 &&
2157 rtlhal->current_bandtype == BAND_ON_5G)
2158 val_y += 3;
2159 tx0_c = (val_y * oldval_0) >> 8;
2160 RTPRINT(rtlpriv, FINIT, INIT_IQK,
2161 "Y = 0x%lx, tx0_c = 0x%lx\n",
2162 val_y, tx0_c);
2163 rtl_set_bbreg(hw, ROFDM0_XCTXAFE, 0xF0000000,
2164 ((tx0_c & 0x3C0) >> 6));
2165 rtl_set_bbreg(hw, ROFDM0_XATXIQIMBALANCE, 0x003F0000,
2166 (tx0_c & 0x3F));
2167 if (is2t)
2168 rtl_set_bbreg(hw, ROFDM0_ECCATHRESHOLD, BIT(26),
2169 ((val_y * oldval_0 >> 7) & 0x1));
2170 RTPRINT(rtlpriv, FINIT, INIT_IQK, "0xC80 = 0x%x\n",
2171 rtl_get_bbreg(hw, ROFDM0_XATXIQIMBALANCE,
2172 MASKDWORD));
2173 if (txonly) {
2174 RTPRINT(rtlpriv, FINIT, INIT_IQK, "only Tx OK\n");
2175 return;
2176 }
2177 reg = result[final_candidate][2];
2178 rtl_set_bbreg(hw, ROFDM0_XARXIQIMBALANCE, 0x3FF, reg);
2179 reg = result[final_candidate][3] & 0x3F;
2180 rtl_set_bbreg(hw, ROFDM0_XARXIQIMBALANCE, 0xFC00, reg);
2181 reg = (result[final_candidate][3] >> 6) & 0xF;
2182 rtl_set_bbreg(hw, 0xca0, 0xF0000000, reg);
2183 }
2184 }
2185
2186 static void _rtl92d_phy_pathb_fill_iqk_matrix(struct ieee80211_hw *hw,
2187 bool iqk_ok, long result[][8], u8 final_candidate, bool txonly)
2188 {
2189 struct rtl_priv *rtlpriv = rtl_priv(hw);
2190 struct rtl_hal *rtlhal = &(rtlpriv->rtlhal);
2191 u32 oldval_1, val_x, tx1_a, reg;
2192 long val_y, tx1_c;
2193
2194 RTPRINT(rtlpriv, FINIT, INIT_IQK, "Path B IQ Calibration %s !\n",
2195 iqk_ok ? "Success" : "Failed");
2196 if (final_candidate == 0xFF) {
2197 return;
2198 } else if (iqk_ok) {
2199 oldval_1 = (rtl_get_bbreg(hw, ROFDM0_XBTXIQIMBALANCE,
2200 MASKDWORD) >> 22) & 0x3FF;
2201 val_x = result[final_candidate][4];
2202 if ((val_x & 0x00000200) != 0)
2203 val_x = val_x | 0xFFFFFC00;
2204 tx1_a = (val_x * oldval_1) >> 8;
2205 RTPRINT(rtlpriv, FINIT, INIT_IQK, "X = 0x%x, tx1_a = 0x%x\n",
2206 val_x, tx1_a);
2207 rtl_set_bbreg(hw, ROFDM0_XBTXIQIMBALANCE, 0x3FF, tx1_a);
2208 rtl_set_bbreg(hw, ROFDM0_ECCATHRESHOLD, BIT(28),
2209 ((val_x * oldval_1 >> 7) & 0x1));
2210 val_y = result[final_candidate][5];
2211 if ((val_y & 0x00000200) != 0)
2212 val_y = val_y | 0xFFFFFC00;
2213 if (rtlhal->current_bandtype == BAND_ON_5G)
2214 val_y += 3;
2215 tx1_c = (val_y * oldval_1) >> 8;
2216 RTPRINT(rtlpriv, FINIT, INIT_IQK, "Y = 0x%lx, tx1_c = 0x%lx\n",
2217 val_y, tx1_c);
2218 rtl_set_bbreg(hw, ROFDM0_XDTXAFE, 0xF0000000,
2219 ((tx1_c & 0x3C0) >> 6));
2220 rtl_set_bbreg(hw, ROFDM0_XBTXIQIMBALANCE, 0x003F0000,
2221 (tx1_c & 0x3F));
2222 rtl_set_bbreg(hw, ROFDM0_ECCATHRESHOLD, BIT(30),
2223 ((val_y * oldval_1 >> 7) & 0x1));
2224 if (txonly)
2225 return;
2226 reg = result[final_candidate][6];
2227 rtl_set_bbreg(hw, ROFDM0_XBRXIQIMBALANCE, 0x3FF, reg);
2228 reg = result[final_candidate][7] & 0x3F;
2229 rtl_set_bbreg(hw, ROFDM0_XBRXIQIMBALANCE, 0xFC00, reg);
2230 reg = (result[final_candidate][7] >> 6) & 0xF;
2231 rtl_set_bbreg(hw, ROFDM0_AGCRSSITABLE, 0x0000F000, reg);
2232 }
2233 }
2234
2235 void rtl92d_phy_iq_calibrate(struct ieee80211_hw *hw)
2236 {
2237 struct rtl_priv *rtlpriv = rtl_priv(hw);
2238 struct rtl_phy *rtlphy = &(rtlpriv->phy);
2239 struct rtl_hal *rtlhal = &(rtlpriv->rtlhal);
2240 long result[4][8];
2241 u8 i, final_candidate, indexforchannel;
2242 bool patha_ok, pathb_ok;
2243 long rege94, rege9c, regea4, regeac, regeb4;
2244 long regebc, regec4, regecc, regtmp = 0;
2245 bool is12simular, is13simular, is23simular;
2246 unsigned long flag = 0;
2247
2248 RTPRINT(rtlpriv, FINIT, INIT_IQK,
2249 "IQK:Start!!!channel %d\n", rtlphy->current_channel);
2250 for (i = 0; i < 8; i++) {
2251 result[0][i] = 0;
2252 result[1][i] = 0;
2253 result[2][i] = 0;
2254 result[3][i] = 0;
2255 }
2256 final_candidate = 0xff;
2257 patha_ok = false;
2258 pathb_ok = false;
2259 is12simular = false;
2260 is23simular = false;
2261 is13simular = false;
2262 RTPRINT(rtlpriv, FINIT, INIT_IQK,
2263 "IQK !!!currentband %d\n", rtlhal->current_bandtype);
2264 rtl92d_acquire_cckandrw_pagea_ctl(hw, &flag);
2265 for (i = 0; i < 3; i++) {
2266 if (rtlhal->current_bandtype == BAND_ON_5G) {
2267 _rtl92d_phy_iq_calibrate_5g_normal(hw, result, i);
2268 } else if (rtlhal->current_bandtype == BAND_ON_2_4G) {
2269 if (IS_92D_SINGLEPHY(rtlhal->version))
2270 _rtl92d_phy_iq_calibrate(hw, result, i, true);
2271 else
2272 _rtl92d_phy_iq_calibrate(hw, result, i, false);
2273 }
2274 if (i == 1) {
2275 is12simular = _rtl92d_phy_simularity_compare(hw, result,
2276 0, 1);
2277 if (is12simular) {
2278 final_candidate = 0;
2279 break;
2280 }
2281 }
2282 if (i == 2) {
2283 is13simular = _rtl92d_phy_simularity_compare(hw, result,
2284 0, 2);
2285 if (is13simular) {
2286 final_candidate = 0;
2287 break;
2288 }
2289 is23simular = _rtl92d_phy_simularity_compare(hw, result,
2290 1, 2);
2291 if (is23simular) {
2292 final_candidate = 1;
2293 } else {
2294 for (i = 0; i < 8; i++)
2295 regtmp += result[3][i];
2296
2297 if (regtmp != 0)
2298 final_candidate = 3;
2299 else
2300 final_candidate = 0xFF;
2301 }
2302 }
2303 }
2304 rtl92d_release_cckandrw_pagea_ctl(hw, &flag);
2305 for (i = 0; i < 4; i++) {
2306 rege94 = result[i][0];
2307 rege9c = result[i][1];
2308 regea4 = result[i][2];
2309 regeac = result[i][3];
2310 regeb4 = result[i][4];
2311 regebc = result[i][5];
2312 regec4 = result[i][6];
2313 regecc = result[i][7];
2314 RTPRINT(rtlpriv, FINIT, INIT_IQK,
2315 "IQK: rege94=%lx rege9c=%lx regea4=%lx regeac=%lx regeb4=%lx regebc=%lx regec4=%lx regecc=%lx\n",
2316 rege94, rege9c, regea4, regeac, regeb4, regebc, regec4,
2317 regecc);
2318 }
2319 if (final_candidate != 0xff) {
2320 rtlphy->reg_e94 = rege94 = result[final_candidate][0];
2321 rtlphy->reg_e9c = rege9c = result[final_candidate][1];
2322 regea4 = result[final_candidate][2];
2323 regeac = result[final_candidate][3];
2324 rtlphy->reg_eb4 = regeb4 = result[final_candidate][4];
2325 rtlphy->reg_ebc = regebc = result[final_candidate][5];
2326 regec4 = result[final_candidate][6];
2327 regecc = result[final_candidate][7];
2328 RTPRINT(rtlpriv, FINIT, INIT_IQK,
2329 "IQK: final_candidate is %x\n", final_candidate);
2330 RTPRINT(rtlpriv, FINIT, INIT_IQK,
2331 "IQK: rege94=%lx rege9c=%lx regea4=%lx regeac=%lx regeb4=%lx regebc=%lx regec4=%lx regecc=%lx\n",
2332 rege94, rege9c, regea4, regeac, regeb4, regebc, regec4,
2333 regecc);
2334 patha_ok = pathb_ok = true;
2335 } else {
2336 rtlphy->reg_e94 = rtlphy->reg_eb4 = 0x100;
2337 rtlphy->reg_e9c = rtlphy->reg_ebc = 0x0;
2338 }
2339 if ((rege94 != 0) )
2340 _rtl92d_phy_patha_fill_iqk_matrix(hw, patha_ok, result,
2341 final_candidate, (regea4 == 0));
2342 if (IS_92D_SINGLEPHY(rtlhal->version)) {
2343 if ((regeb4 != 0) )
2344 _rtl92d_phy_pathb_fill_iqk_matrix(hw, pathb_ok, result,
2345 final_candidate, (regec4 == 0));
2346 }
2347 if (final_candidate != 0xFF) {
2348 indexforchannel = rtl92d_get_rightchnlplace_for_iqk(
2349 rtlphy->current_channel);
2350
2351 for (i = 0; i < IQK_MATRIX_REG_NUM; i++)
2352 rtlphy->iqk_matrix[indexforchannel].
2353 value[0][i] = result[final_candidate][i];
2354 rtlphy->iqk_matrix[indexforchannel].iqk_done =
2355 true;
2356
2357 rtl_dbg(rtlpriv, COMP_SCAN | COMP_MLME, DBG_LOUD,
2358 "IQK OK indexforchannel %d\n", indexforchannel);
2359 }
2360 }
2361
2362 void rtl92d_phy_reload_iqk_setting(struct ieee80211_hw *hw, u8 channel)
2363 {
2364 struct rtl_priv *rtlpriv = rtl_priv(hw);
2365 struct rtl_phy *rtlphy = &(rtlpriv->phy);
2366 struct rtl_hal *rtlhal = &(rtlpriv->rtlhal);
2367 u8 indexforchannel;
2368
2369 rtl_dbg(rtlpriv, COMP_CMD, DBG_LOUD, "channel %d\n", channel);
2370
2371 indexforchannel = rtl92d_get_rightchnlplace_for_iqk(channel);
2372 rtl_dbg(rtlpriv, COMP_CMD, DBG_LOUD, "indexforchannel %d done %d\n",
2373 indexforchannel,
2374 rtlphy->iqk_matrix[indexforchannel].iqk_done);
2375 if (0 && !rtlphy->iqk_matrix[indexforchannel].iqk_done &&
2376 rtlphy->need_iqk) {
2377
2378 rtl_dbg(rtlpriv, COMP_SCAN | COMP_INIT, DBG_LOUD,
2379 "Do IQK Matrix reg for channel:%d....\n", channel);
2380 rtl92d_phy_iq_calibrate(hw);
2381 } else {
2382
2383
2384 if (((!rtlhal->load_imrandiqk_setting_for2g) &&
2385 indexforchannel == 0) || indexforchannel > 0) {
2386 rtl_dbg(rtlpriv, COMP_SCAN, DBG_LOUD,
2387 "Just Read IQK Matrix reg for channel:%d....\n",
2388 channel);
2389 _rtl92d_phy_patha_fill_iqk_matrix(hw, true,
2390 rtlphy->iqk_matrix[
2391 indexforchannel].value, 0,
2392 (rtlphy->iqk_matrix[
2393 indexforchannel].value[0][2] == 0));
2394 if (IS_92D_SINGLEPHY(rtlhal->version)) {
2395 if ((rtlphy->iqk_matrix[
2396 indexforchannel].value[0][4] != 0)
2397 )
2398 _rtl92d_phy_pathb_fill_iqk_matrix(hw,
2399 true,
2400 rtlphy->iqk_matrix[
2401 indexforchannel].value, 0,
2402 (rtlphy->iqk_matrix[
2403 indexforchannel].value[0][6]
2404 == 0));
2405 }
2406 }
2407 }
2408 rtlphy->need_iqk = false;
2409 rtl_dbg(rtlpriv, COMP_CMD, DBG_LOUD, "<====\n");
2410 }
2411
2412 static u32 _rtl92d_phy_get_abs(u32 val1, u32 val2)
2413 {
2414 u32 ret;
2415
2416 if (val1 >= val2)
2417 ret = val1 - val2;
2418 else
2419 ret = val2 - val1;
2420 return ret;
2421 }
2422
2423 static bool _rtl92d_is_legal_5g_channel(struct ieee80211_hw *hw, u8 channel)
2424 {
2425
2426 int i;
2427
2428 for (i = 0; i < ARRAY_SIZE(channel5g); i++)
2429 if (channel == channel5g[i])
2430 return true;
2431 return false;
2432 }
2433
2434 static void _rtl92d_phy_calc_curvindex(struct ieee80211_hw *hw,
2435 u32 *targetchnl, u32 * curvecount_val,
2436 bool is5g, u32 *curveindex)
2437 {
2438 struct rtl_priv *rtlpriv = rtl_priv(hw);
2439 u32 smallest_abs_val = 0xffffffff, u4tmp;
2440 u8 i, j;
2441 u8 chnl_num = is5g ? TARGET_CHNL_NUM_5G : TARGET_CHNL_NUM_2G;
2442
2443 for (i = 0; i < chnl_num; i++) {
2444 if (is5g && !_rtl92d_is_legal_5g_channel(hw, i + 1))
2445 continue;
2446 curveindex[i] = 0;
2447 for (j = 0; j < (CV_CURVE_CNT * 2); j++) {
2448 u4tmp = _rtl92d_phy_get_abs(targetchnl[i],
2449 curvecount_val[j]);
2450
2451 if (u4tmp < smallest_abs_val) {
2452 curveindex[i] = j;
2453 smallest_abs_val = u4tmp;
2454 }
2455 }
2456 smallest_abs_val = 0xffffffff;
2457 RTPRINT(rtlpriv, FINIT, INIT_IQK, "curveindex[%d] = %x\n",
2458 i, curveindex[i]);
2459 }
2460 }
2461
2462 static void _rtl92d_phy_reload_lck_setting(struct ieee80211_hw *hw,
2463 u8 channel)
2464 {
2465 struct rtl_priv *rtlpriv = rtl_priv(hw);
2466 u8 erfpath = rtlpriv->rtlhal.current_bandtype ==
2467 BAND_ON_5G ? RF90_PATH_A :
2468 IS_92D_SINGLEPHY(rtlpriv->rtlhal.version) ?
2469 RF90_PATH_B : RF90_PATH_A;
2470 u32 u4tmp = 0, u4regvalue = 0;
2471 bool bneed_powerdown_radio = false;
2472
2473 rtl_dbg(rtlpriv, COMP_CMD, DBG_LOUD, "path %d\n", erfpath);
2474 RTPRINT(rtlpriv, FINIT, INIT_IQK, "band type = %d\n",
2475 rtlpriv->rtlhal.current_bandtype);
2476 RTPRINT(rtlpriv, FINIT, INIT_IQK, "channel = %d\n", channel);
2477 if (rtlpriv->rtlhal.current_bandtype == BAND_ON_5G) {
2478 u4tmp = curveindex_5g[channel-1];
2479 RTPRINT(rtlpriv, FINIT, INIT_IQK,
2480 "ver 1 set RF-A, 5G, 0x28 = 0x%x !!\n", u4tmp);
2481 if (rtlpriv->rtlhal.macphymode == DUALMAC_DUALPHY &&
2482 rtlpriv->rtlhal.interfaceindex == 1) {
2483 bneed_powerdown_radio =
2484 rtl92d_phy_enable_anotherphy(hw, false);
2485 rtlpriv->rtlhal.during_mac1init_radioa = true;
2486
2487 if (bneed_powerdown_radio)
2488 _rtl92d_phy_enable_rf_env(hw, erfpath,
2489 &u4regvalue);
2490 }
2491 rtl_set_rfreg(hw, erfpath, RF_SYN_G4, 0x3f800, u4tmp);
2492 if (bneed_powerdown_radio)
2493 _rtl92d_phy_restore_rf_env(hw, erfpath, &u4regvalue);
2494 if (rtlpriv->rtlhal.during_mac1init_radioa)
2495 rtl92d_phy_powerdown_anotherphy(hw, false);
2496 } else if (rtlpriv->rtlhal.current_bandtype == BAND_ON_2_4G) {
2497 u4tmp = curveindex_2g[channel-1];
2498 RTPRINT(rtlpriv, FINIT, INIT_IQK,
2499 "ver 3 set RF-B, 2G, 0x28 = 0x%x !!\n", u4tmp);
2500 if (rtlpriv->rtlhal.macphymode == DUALMAC_DUALPHY &&
2501 rtlpriv->rtlhal.interfaceindex == 0) {
2502 bneed_powerdown_radio =
2503 rtl92d_phy_enable_anotherphy(hw, true);
2504 rtlpriv->rtlhal.during_mac0init_radiob = true;
2505 if (bneed_powerdown_radio)
2506 _rtl92d_phy_enable_rf_env(hw, erfpath,
2507 &u4regvalue);
2508 }
2509 rtl_set_rfreg(hw, erfpath, RF_SYN_G4, 0x3f800, u4tmp);
2510 RTPRINT(rtlpriv, FINIT, INIT_IQK,
2511 "ver 3 set RF-B, 2G, 0x28 = 0x%x !!\n",
2512 rtl_get_rfreg(hw, erfpath, RF_SYN_G4, 0x3f800));
2513 if (bneed_powerdown_radio)
2514 _rtl92d_phy_restore_rf_env(hw, erfpath, &u4regvalue);
2515 if (rtlpriv->rtlhal.during_mac0init_radiob)
2516 rtl92d_phy_powerdown_anotherphy(hw, true);
2517 }
2518 rtl_dbg(rtlpriv, COMP_CMD, DBG_LOUD, "<====\n");
2519 }
2520
2521 static void _rtl92d_phy_lc_calibrate_sw(struct ieee80211_hw *hw, bool is2t)
2522 {
2523 struct rtl_priv *rtlpriv = rtl_priv(hw);
2524 struct rtl_hal *rtlhal = &(rtlpriv->rtlhal);
2525 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
2526 u8 tmpreg, index, rf_mode[2];
2527 u8 path = is2t ? 2 : 1;
2528 u8 i;
2529 u32 u4tmp, offset;
2530 u32 curvecount_val[CV_CURVE_CNT * 2] = {0};
2531 u16 timeout = 800, timecount = 0;
2532
2533
2534 tmpreg = rtl_read_byte(rtlpriv, 0xd03);
2535
2536
2537 if ((tmpreg & 0x70) != 0)
2538 rtl_write_byte(rtlpriv, 0xd03, tmpreg & 0x8F);
2539 else
2540 rtl_write_byte(rtlpriv, REG_TXPAUSE, 0xFF);
2541 rtl_set_bbreg(hw, RFPGA0_ANALOGPARAMETER4, 0xF00000, 0x0F);
2542 for (index = 0; index < path; index++) {
2543
2544 offset = index == 0 ? ROFDM0_XAAGCCORE1 : ROFDM0_XBAGCCORE1;
2545 rf_mode[index] = rtl_read_byte(rtlpriv, offset);
2546
2547 rtl_set_rfreg(hw, (enum radio_path)index, RF_AC,
2548 RFREG_OFFSET_MASK, 0x010000);
2549 if (rtlpci->init_ready) {
2550
2551 rtl_set_rfreg(hw, (enum radio_path)index, RF_SYN_G7,
2552 BIT(17), 0x0);
2553
2554 rtl_set_rfreg(hw, (enum radio_path)index, RF_CHNLBW,
2555 0x08000, 0x01);
2556 }
2557 u4tmp = rtl_get_rfreg(hw, (enum radio_path)index, RF_SYN_G6,
2558 RFREG_OFFSET_MASK);
2559 while ((!(u4tmp & BIT(11))) && timecount <= timeout) {
2560 mdelay(50);
2561 timecount += 50;
2562 u4tmp = rtl_get_rfreg(hw, (enum radio_path)index,
2563 RF_SYN_G6, RFREG_OFFSET_MASK);
2564 }
2565 RTPRINT(rtlpriv, FINIT, INIT_IQK,
2566 "PHY_LCK finish delay for %d ms=2\n", timecount);
2567 rtl_get_rfreg(hw, index, RF_SYN_G4, RFREG_OFFSET_MASK);
2568 if (index == 0 && rtlhal->interfaceindex == 0) {
2569 RTPRINT(rtlpriv, FINIT, INIT_IQK,
2570 "path-A / 5G LCK\n");
2571 } else {
2572 RTPRINT(rtlpriv, FINIT, INIT_IQK,
2573 "path-B / 2.4G LCK\n");
2574 }
2575 memset(curvecount_val, 0, sizeof(curvecount_val));
2576
2577 rtl_set_rfreg(hw, (enum radio_path)index, RF_CHNLBW,
2578 0x08000, 0x0);
2579 RTPRINT(rtlpriv, FINIT, INIT_IQK, "set RF 0x18[15] = 0\n");
2580
2581 for (i = 0; i < CV_CURVE_CNT; i++) {
2582 u32 readval = 0, readval2 = 0;
2583 rtl_set_rfreg(hw, (enum radio_path)index, 0x3F,
2584 0x7f, i);
2585
2586 rtl_set_rfreg(hw, (enum radio_path)index, 0x4D,
2587 RFREG_OFFSET_MASK, 0x0);
2588 readval = rtl_get_rfreg(hw, (enum radio_path)index,
2589 0x4F, RFREG_OFFSET_MASK);
2590 curvecount_val[2 * i + 1] = (readval & 0xfffe0) >> 5;
2591
2592
2593 readval2 = rtl_get_rfreg(hw, (enum radio_path)index,
2594 0x50, 0xffc00);
2595 curvecount_val[2 * i] = (((readval & 0x1F) << 10) |
2596 readval2);
2597 }
2598 if (index == 0 && rtlhal->interfaceindex == 0)
2599 _rtl92d_phy_calc_curvindex(hw, targetchnl_5g,
2600 curvecount_val,
2601 true, curveindex_5g);
2602 else
2603 _rtl92d_phy_calc_curvindex(hw, targetchnl_2g,
2604 curvecount_val,
2605 false, curveindex_2g);
2606
2607 rtl_set_rfreg(hw, (enum radio_path)index, RF_SYN_G7,
2608 BIT(17), 0x1);
2609 }
2610
2611
2612 for (index = 0; index < path; index++) {
2613 offset = index == 0 ? ROFDM0_XAAGCCORE1 : ROFDM0_XBAGCCORE1;
2614 rtl_write_byte(rtlpriv, offset, 0x50);
2615 rtl_write_byte(rtlpriv, offset, rf_mode[index]);
2616 }
2617 if ((tmpreg & 0x70) != 0)
2618 rtl_write_byte(rtlpriv, 0xd03, tmpreg);
2619 else
2620 rtl_write_byte(rtlpriv, REG_TXPAUSE, 0x00);
2621 rtl_set_bbreg(hw, RFPGA0_ANALOGPARAMETER4, 0xF00000, 0x00);
2622 _rtl92d_phy_reload_lck_setting(hw, rtlpriv->phy.current_channel);
2623 }
2624
2625 static void _rtl92d_phy_lc_calibrate(struct ieee80211_hw *hw, bool is2t)
2626 {
2627 struct rtl_priv *rtlpriv = rtl_priv(hw);
2628
2629 RTPRINT(rtlpriv, FINIT, INIT_IQK, "cosa PHY_LCK ver=2\n");
2630 _rtl92d_phy_lc_calibrate_sw(hw, is2t);
2631 }
2632
2633 void rtl92d_phy_lc_calibrate(struct ieee80211_hw *hw)
2634 {
2635 struct rtl_priv *rtlpriv = rtl_priv(hw);
2636 struct rtl_phy *rtlphy = &(rtlpriv->phy);
2637 struct rtl_hal *rtlhal = &(rtlpriv->rtlhal);
2638 u32 timeout = 2000, timecount = 0;
2639
2640 while (rtlpriv->mac80211.act_scanning && timecount < timeout) {
2641 udelay(50);
2642 timecount += 50;
2643 }
2644
2645 rtlphy->lck_inprogress = true;
2646 RTPRINT(rtlpriv, FINIT, INIT_IQK,
2647 "LCK:Start!!! currentband %x delay %d ms\n",
2648 rtlhal->current_bandtype, timecount);
2649 if (IS_92D_SINGLEPHY(rtlhal->version)) {
2650 _rtl92d_phy_lc_calibrate(hw, true);
2651 } else {
2652
2653 _rtl92d_phy_lc_calibrate(hw, false);
2654 }
2655 rtlphy->lck_inprogress = false;
2656 RTPRINT(rtlpriv, FINIT, INIT_IQK, "LCK:Finish!!!\n");
2657 }
2658
2659 void rtl92d_phy_ap_calibrate(struct ieee80211_hw *hw, s8 delta)
2660 {
2661 return;
2662 }
2663
2664 static bool _rtl92d_phy_set_sw_chnl_cmdarray(struct swchnlcmd *cmdtable,
2665 u32 cmdtableidx, u32 cmdtablesz, enum swchnlcmd_id cmdid,
2666 u32 para1, u32 para2, u32 msdelay)
2667 {
2668 struct swchnlcmd *pcmd;
2669
2670 if (cmdtable == NULL) {
2671 WARN_ONCE(true, "rtl8192de: cmdtable cannot be NULL\n");
2672 return false;
2673 }
2674 if (cmdtableidx >= cmdtablesz)
2675 return false;
2676
2677 pcmd = cmdtable + cmdtableidx;
2678 pcmd->cmdid = cmdid;
2679 pcmd->para1 = para1;
2680 pcmd->para2 = para2;
2681 pcmd->msdelay = msdelay;
2682 return true;
2683 }
2684
2685 void rtl92d_phy_reset_iqk_result(struct ieee80211_hw *hw)
2686 {
2687 struct rtl_priv *rtlpriv = rtl_priv(hw);
2688 struct rtl_phy *rtlphy = &(rtlpriv->phy);
2689 u8 i;
2690
2691 rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD,
2692 "settings regs %zu default regs %d\n",
2693 ARRAY_SIZE(rtlphy->iqk_matrix),
2694 IQK_MATRIX_REG_NUM);
2695
2696 for (i = 0; i < IQK_MATRIX_SETTINGS_NUM; i++) {
2697 rtlphy->iqk_matrix[i].value[0][0] = 0x100;
2698 rtlphy->iqk_matrix[i].value[0][2] = 0x100;
2699 rtlphy->iqk_matrix[i].value[0][4] = 0x100;
2700 rtlphy->iqk_matrix[i].value[0][6] = 0x100;
2701 rtlphy->iqk_matrix[i].value[0][1] = 0x0;
2702 rtlphy->iqk_matrix[i].value[0][3] = 0x0;
2703 rtlphy->iqk_matrix[i].value[0][5] = 0x0;
2704 rtlphy->iqk_matrix[i].value[0][7] = 0x0;
2705 rtlphy->iqk_matrix[i].iqk_done = false;
2706 }
2707 }
2708
2709 static bool _rtl92d_phy_sw_chnl_step_by_step(struct ieee80211_hw *hw,
2710 u8 channel, u8 *stage, u8 *step,
2711 u32 *delay)
2712 {
2713 struct rtl_priv *rtlpriv = rtl_priv(hw);
2714 struct rtl_phy *rtlphy = &(rtlpriv->phy);
2715 struct swchnlcmd precommoncmd[MAX_PRECMD_CNT];
2716 u32 precommoncmdcnt;
2717 struct swchnlcmd postcommoncmd[MAX_POSTCMD_CNT];
2718 u32 postcommoncmdcnt;
2719 struct swchnlcmd rfdependcmd[MAX_RFDEPENDCMD_CNT];
2720 u32 rfdependcmdcnt;
2721 struct swchnlcmd *currentcmd = NULL;
2722 u8 rfpath;
2723 u8 num_total_rfpath = rtlphy->num_total_rfpath;
2724
2725 precommoncmdcnt = 0;
2726 _rtl92d_phy_set_sw_chnl_cmdarray(precommoncmd, precommoncmdcnt++,
2727 MAX_PRECMD_CNT,
2728 CMDID_SET_TXPOWEROWER_LEVEL, 0, 0, 0);
2729 _rtl92d_phy_set_sw_chnl_cmdarray(precommoncmd, precommoncmdcnt++,
2730 MAX_PRECMD_CNT, CMDID_END, 0, 0, 0);
2731 postcommoncmdcnt = 0;
2732 _rtl92d_phy_set_sw_chnl_cmdarray(postcommoncmd, postcommoncmdcnt++,
2733 MAX_POSTCMD_CNT, CMDID_END, 0, 0, 0);
2734 rfdependcmdcnt = 0;
2735 _rtl92d_phy_set_sw_chnl_cmdarray(rfdependcmd, rfdependcmdcnt++,
2736 MAX_RFDEPENDCMD_CNT, CMDID_RF_WRITEREG,
2737 RF_CHNLBW, channel, 0);
2738 _rtl92d_phy_set_sw_chnl_cmdarray(rfdependcmd, rfdependcmdcnt++,
2739 MAX_RFDEPENDCMD_CNT, CMDID_END,
2740 0, 0, 0);
2741
2742 do {
2743 switch (*stage) {
2744 case 0:
2745 currentcmd = &precommoncmd[*step];
2746 break;
2747 case 1:
2748 currentcmd = &rfdependcmd[*step];
2749 break;
2750 case 2:
2751 currentcmd = &postcommoncmd[*step];
2752 break;
2753 }
2754 if (currentcmd->cmdid == CMDID_END) {
2755 if ((*stage) == 2) {
2756 return true;
2757 } else {
2758 (*stage)++;
2759 (*step) = 0;
2760 continue;
2761 }
2762 }
2763 switch (currentcmd->cmdid) {
2764 case CMDID_SET_TXPOWEROWER_LEVEL:
2765 rtl92d_phy_set_txpower_level(hw, channel);
2766 break;
2767 case CMDID_WRITEPORT_ULONG:
2768 rtl_write_dword(rtlpriv, currentcmd->para1,
2769 currentcmd->para2);
2770 break;
2771 case CMDID_WRITEPORT_USHORT:
2772 rtl_write_word(rtlpriv, currentcmd->para1,
2773 (u16)currentcmd->para2);
2774 break;
2775 case CMDID_WRITEPORT_UCHAR:
2776 rtl_write_byte(rtlpriv, currentcmd->para1,
2777 (u8)currentcmd->para2);
2778 break;
2779 case CMDID_RF_WRITEREG:
2780 for (rfpath = 0; rfpath < num_total_rfpath; rfpath++) {
2781 rtlphy->rfreg_chnlval[rfpath] =
2782 ((rtlphy->rfreg_chnlval[rfpath] &
2783 0xffffff00) | currentcmd->para2);
2784 if (rtlpriv->rtlhal.current_bandtype ==
2785 BAND_ON_5G) {
2786 if (currentcmd->para2 > 99)
2787 rtlphy->rfreg_chnlval[rfpath] =
2788 rtlphy->rfreg_chnlval
2789 [rfpath] | (BIT(18));
2790 else
2791 rtlphy->rfreg_chnlval[rfpath] =
2792 rtlphy->rfreg_chnlval
2793 [rfpath] & (~BIT(18));
2794 rtlphy->rfreg_chnlval[rfpath] |=
2795 (BIT(16) | BIT(8));
2796 } else {
2797 rtlphy->rfreg_chnlval[rfpath] &=
2798 ~(BIT(8) | BIT(16) | BIT(18));
2799 }
2800 rtl_set_rfreg(hw, (enum radio_path)rfpath,
2801 currentcmd->para1,
2802 RFREG_OFFSET_MASK,
2803 rtlphy->rfreg_chnlval[rfpath]);
2804 _rtl92d_phy_reload_imr_setting(hw, channel,
2805 rfpath);
2806 }
2807 _rtl92d_phy_switch_rf_setting(hw, channel);
2808
2809 rtl92d_phy_reload_iqk_setting(hw, channel);
2810 break;
2811 default:
2812 pr_err("switch case %#x not processed\n",
2813 currentcmd->cmdid);
2814 break;
2815 }
2816 break;
2817 } while (true);
2818 (*delay) = currentcmd->msdelay;
2819 (*step)++;
2820 return false;
2821 }
2822
2823 u8 rtl92d_phy_sw_chnl(struct ieee80211_hw *hw)
2824 {
2825 struct rtl_priv *rtlpriv = rtl_priv(hw);
2826 struct rtl_phy *rtlphy = &(rtlpriv->phy);
2827 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
2828 u32 delay;
2829 u32 timeout = 1000, timecount = 0;
2830 u8 channel = rtlphy->current_channel;
2831 u32 ret_value;
2832
2833 if (rtlphy->sw_chnl_inprogress)
2834 return 0;
2835 if (rtlphy->set_bwmode_inprogress)
2836 return 0;
2837
2838 if ((is_hal_stop(rtlhal)) || (RT_CANNOT_IO(hw))) {
2839 rtl_dbg(rtlpriv, COMP_CHAN, DBG_LOUD,
2840 "sw_chnl_inprogress false driver sleep or unload\n");
2841 return 0;
2842 }
2843 while (rtlphy->lck_inprogress && timecount < timeout) {
2844 mdelay(50);
2845 timecount += 50;
2846 }
2847 if (rtlhal->macphymode == SINGLEMAC_SINGLEPHY &&
2848 rtlhal->bandset == BAND_ON_BOTH) {
2849 ret_value = rtl_get_bbreg(hw, RFPGA0_XAB_RFPARAMETER,
2850 MASKDWORD);
2851 if (rtlphy->current_channel > 14 && !(ret_value & BIT(0)))
2852 rtl92d_phy_switch_wirelessband(hw, BAND_ON_5G);
2853 else if (rtlphy->current_channel <= 14 && (ret_value & BIT(0)))
2854 rtl92d_phy_switch_wirelessband(hw, BAND_ON_2_4G);
2855 }
2856 switch (rtlhal->current_bandtype) {
2857 case BAND_ON_5G:
2858
2859
2860 if (WARN_ONCE(channel <= 14, "rtl8192de: 5G but channel<=14\n"))
2861 return 0;
2862 break;
2863 case BAND_ON_2_4G:
2864
2865
2866 if (WARN_ONCE(channel > 14, "rtl8192de: 2G but channel>14\n"))
2867 return 0;
2868 break;
2869 default:
2870 WARN_ONCE(true, "rtl8192de: Invalid WirelessMode(%#x)!!\n",
2871 rtlpriv->mac80211.mode);
2872 break;
2873 }
2874 rtlphy->sw_chnl_inprogress = true;
2875 if (channel == 0)
2876 channel = 1;
2877 rtlphy->sw_chnl_stage = 0;
2878 rtlphy->sw_chnl_step = 0;
2879 rtl_dbg(rtlpriv, COMP_SCAN, DBG_TRACE,
2880 "switch to channel%d\n", rtlphy->current_channel);
2881
2882 do {
2883 if (!rtlphy->sw_chnl_inprogress)
2884 break;
2885 if (!_rtl92d_phy_sw_chnl_step_by_step(hw,
2886 rtlphy->current_channel,
2887 &rtlphy->sw_chnl_stage, &rtlphy->sw_chnl_step, &delay)) {
2888 if (delay > 0)
2889 mdelay(delay);
2890 else
2891 continue;
2892 } else {
2893 rtlphy->sw_chnl_inprogress = false;
2894 }
2895 break;
2896 } while (true);
2897 rtl_dbg(rtlpriv, COMP_SCAN, DBG_TRACE, "<==\n");
2898 rtlphy->sw_chnl_inprogress = false;
2899 return 1;
2900 }
2901
2902 static void rtl92d_phy_set_io(struct ieee80211_hw *hw)
2903 {
2904 struct rtl_priv *rtlpriv = rtl_priv(hw);
2905 struct dig_t *de_digtable = &rtlpriv->dm_digtable;
2906 struct rtl_phy *rtlphy = &(rtlpriv->phy);
2907
2908 rtl_dbg(rtlpriv, COMP_CMD, DBG_TRACE,
2909 "--->Cmd(%#x), set_io_inprogress(%d)\n",
2910 rtlphy->current_io_type, rtlphy->set_io_inprogress);
2911 switch (rtlphy->current_io_type) {
2912 case IO_CMD_RESUME_DM_BY_SCAN:
2913 de_digtable->cur_igvalue = rtlphy->initgain_backup.xaagccore1;
2914 rtl92d_dm_write_dig(hw);
2915 rtl92d_phy_set_txpower_level(hw, rtlphy->current_channel);
2916 break;
2917 case IO_CMD_PAUSE_DM_BY_SCAN:
2918 rtlphy->initgain_backup.xaagccore1 = de_digtable->cur_igvalue;
2919 de_digtable->cur_igvalue = 0x37;
2920 rtl92d_dm_write_dig(hw);
2921 break;
2922 default:
2923 pr_err("switch case %#x not processed\n",
2924 rtlphy->current_io_type);
2925 break;
2926 }
2927 rtlphy->set_io_inprogress = false;
2928 rtl_dbg(rtlpriv, COMP_CMD, DBG_TRACE, "<---(%#x)\n",
2929 rtlphy->current_io_type);
2930 }
2931
2932 bool rtl92d_phy_set_io_cmd(struct ieee80211_hw *hw, enum io_type iotype)
2933 {
2934 struct rtl_priv *rtlpriv = rtl_priv(hw);
2935 struct rtl_phy *rtlphy = &(rtlpriv->phy);
2936 bool postprocessing = false;
2937
2938 rtl_dbg(rtlpriv, COMP_CMD, DBG_TRACE,
2939 "-->IO Cmd(%#x), set_io_inprogress(%d)\n",
2940 iotype, rtlphy->set_io_inprogress);
2941 do {
2942 switch (iotype) {
2943 case IO_CMD_RESUME_DM_BY_SCAN:
2944 rtl_dbg(rtlpriv, COMP_CMD, DBG_TRACE,
2945 "[IO CMD] Resume DM after scan\n");
2946 postprocessing = true;
2947 break;
2948 case IO_CMD_PAUSE_DM_BY_SCAN:
2949 rtl_dbg(rtlpriv, COMP_CMD, DBG_TRACE,
2950 "[IO CMD] Pause DM before scan\n");
2951 postprocessing = true;
2952 break;
2953 default:
2954 pr_err("switch case %#x not processed\n",
2955 iotype);
2956 break;
2957 }
2958 } while (false);
2959 if (postprocessing && !rtlphy->set_io_inprogress) {
2960 rtlphy->set_io_inprogress = true;
2961 rtlphy->current_io_type = iotype;
2962 } else {
2963 return false;
2964 }
2965 rtl92d_phy_set_io(hw);
2966 rtl_dbg(rtlpriv, COMP_CMD, DBG_TRACE, "<--IO Type(%#x)\n", iotype);
2967 return true;
2968 }
2969
2970 static void _rtl92d_phy_set_rfon(struct ieee80211_hw *hw)
2971 {
2972 struct rtl_priv *rtlpriv = rtl_priv(hw);
2973
2974
2975
2976 if (rtlpriv->rtlhal.macphymode == SINGLEMAC_SINGLEPHY)
2977 rtl_write_byte(rtlpriv, REG_SPS0_CTRL, 0x2b);
2978
2979 rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN, 0xE3);
2980
2981
2982 rtl_write_byte(rtlpriv, REG_APSD_CTRL, 0x00);
2983
2984
2985 rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN, 0xE2);
2986 rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN, 0xE3);
2987
2988 rtl_write_byte(rtlpriv, REG_TXPAUSE, 0x00);
2989 }
2990
2991 static void _rtl92d_phy_set_rfsleep(struct ieee80211_hw *hw)
2992 {
2993 struct rtl_priv *rtlpriv = rtl_priv(hw);
2994 u32 u4btmp;
2995 u8 delay = 5;
2996
2997
2998 rtl_write_byte(rtlpriv, REG_TXPAUSE, 0xFF);
2999
3000 rtl_set_rfreg(hw, RF90_PATH_A, 0x00, RFREG_OFFSET_MASK, 0x00);
3001
3002 rtl_write_byte(rtlpriv, REG_APSD_CTRL, 0x40);
3003
3004
3005
3006
3007
3008 u4btmp = rtl_get_rfreg(hw, RF90_PATH_A, 0, RFREG_OFFSET_MASK);
3009 while (u4btmp != 0 && delay > 0) {
3010 rtl_write_byte(rtlpriv, REG_APSD_CTRL, 0x0);
3011 rtl_set_rfreg(hw, RF90_PATH_A, 0x00, RFREG_OFFSET_MASK, 0x00);
3012 rtl_write_byte(rtlpriv, REG_APSD_CTRL, 0x40);
3013 u4btmp = rtl_get_rfreg(hw, RF90_PATH_A, 0, RFREG_OFFSET_MASK);
3014 delay--;
3015 }
3016 if (delay == 0) {
3017
3018 rtl_write_byte(rtlpriv, REG_APSD_CTRL, 0x00);
3019
3020 rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN, 0xE2);
3021 rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN, 0xE3);
3022 rtl_write_byte(rtlpriv, REG_TXPAUSE, 0x00);
3023 rtl_dbg(rtlpriv, COMP_POWER, DBG_LOUD,
3024 "Fail !!! Switch RF timeout\n");
3025 return;
3026 }
3027
3028 rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN, 0xE2);
3029
3030 if (rtlpriv->rtlhal.macphymode == SINGLEMAC_SINGLEPHY)
3031 rtl_write_byte(rtlpriv, REG_SPS0_CTRL, 0x22);
3032
3033 }
3034
3035 bool rtl92d_phy_set_rf_power_state(struct ieee80211_hw *hw,
3036 enum rf_pwrstate rfpwr_state)
3037 {
3038
3039 bool bresult = true;
3040 struct rtl_priv *rtlpriv = rtl_priv(hw);
3041 struct rtl_pci_priv *pcipriv = rtl_pcipriv(hw);
3042 struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
3043 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
3044 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
3045 u8 i, queue_id;
3046 struct rtl8192_tx_ring *ring = NULL;
3047
3048 if (rfpwr_state == ppsc->rfpwr_state)
3049 return false;
3050 switch (rfpwr_state) {
3051 case ERFON:
3052 if ((ppsc->rfpwr_state == ERFOFF) &&
3053 RT_IN_PS_LEVEL(ppsc, RT_RF_OFF_LEVL_HALT_NIC)) {
3054 bool rtstatus;
3055 u32 initializecount = 0;
3056 do {
3057 initializecount++;
3058 rtl_dbg(rtlpriv, COMP_RF, DBG_DMESG,
3059 "IPS Set eRf nic enable\n");
3060 rtstatus = rtl_ps_enable_nic(hw);
3061 } while (!rtstatus && (initializecount < 10));
3062
3063 RT_CLEAR_PS_LEVEL(ppsc,
3064 RT_RF_OFF_LEVL_HALT_NIC);
3065 } else {
3066 rtl_dbg(rtlpriv, COMP_POWER, DBG_DMESG,
3067 "awake, slept:%d ms state_inap:%x\n",
3068 jiffies_to_msecs(jiffies -
3069 ppsc->last_sleep_jiffies),
3070 rtlpriv->psc.state_inap);
3071 ppsc->last_awake_jiffies = jiffies;
3072 _rtl92d_phy_set_rfon(hw);
3073 }
3074
3075 if (mac->link_state == MAC80211_LINKED)
3076 rtlpriv->cfg->ops->led_control(hw,
3077 LED_CTL_LINK);
3078 else
3079 rtlpriv->cfg->ops->led_control(hw,
3080 LED_CTL_NO_LINK);
3081 break;
3082 case ERFOFF:
3083 if (ppsc->reg_rfps_level & RT_RF_OFF_LEVL_HALT_NIC) {
3084 rtl_dbg(rtlpriv, COMP_RF, DBG_DMESG,
3085 "IPS Set eRf nic disable\n");
3086 rtl_ps_disable_nic(hw);
3087 RT_SET_PS_LEVEL(ppsc, RT_RF_OFF_LEVL_HALT_NIC);
3088 } else {
3089 if (ppsc->rfoff_reason == RF_CHANGE_BY_IPS)
3090 rtlpriv->cfg->ops->led_control(hw,
3091 LED_CTL_NO_LINK);
3092 else
3093 rtlpriv->cfg->ops->led_control(hw,
3094 LED_CTL_POWER_OFF);
3095 }
3096 break;
3097 case ERFSLEEP:
3098 if (ppsc->rfpwr_state == ERFOFF)
3099 return false;
3100
3101 for (queue_id = 0, i = 0;
3102 queue_id < RTL_PCI_MAX_TX_QUEUE_COUNT;) {
3103 ring = &pcipriv->dev.tx_ring[queue_id];
3104 if (skb_queue_len(&ring->queue) == 0 ||
3105 queue_id == BEACON_QUEUE) {
3106 queue_id++;
3107 continue;
3108 } else if (rtlpci->pdev->current_state != PCI_D0) {
3109 rtl_dbg(rtlpriv, COMP_POWER, DBG_LOUD,
3110 "eRf Off/Sleep: %d times TcbBusyQueue[%d] !=0 but lower power state!\n",
3111 i + 1, queue_id);
3112 break;
3113 } else {
3114 rtl_dbg(rtlpriv, COMP_ERR, DBG_WARNING,
3115 "eRf Off/Sleep: %d times TcbBusyQueue[%d] =%d before doze!\n",
3116 i + 1, queue_id,
3117 skb_queue_len(&ring->queue));
3118 udelay(10);
3119 i++;
3120 }
3121
3122 if (i >= MAX_DOZE_WAITING_TIMES_9x) {
3123 rtl_dbg(rtlpriv, COMP_ERR, DBG_WARNING,
3124 "ERFOFF: %d times TcbBusyQueue[%d] = %d !\n",
3125 MAX_DOZE_WAITING_TIMES_9x, queue_id,
3126 skb_queue_len(&ring->queue));
3127 break;
3128 }
3129 }
3130 rtl_dbg(rtlpriv, COMP_POWER, DBG_DMESG,
3131 "Set rfsleep awakened:%d ms\n",
3132 jiffies_to_msecs(jiffies - ppsc->last_awake_jiffies));
3133 rtl_dbg(rtlpriv, COMP_POWER, DBG_DMESG,
3134 "sleep awakened:%d ms state_inap:%x\n",
3135 jiffies_to_msecs(jiffies -
3136 ppsc->last_awake_jiffies),
3137 rtlpriv->psc.state_inap);
3138 ppsc->last_sleep_jiffies = jiffies;
3139 _rtl92d_phy_set_rfsleep(hw);
3140 break;
3141 default:
3142 pr_err("switch case %#x not processed\n",
3143 rfpwr_state);
3144 bresult = false;
3145 break;
3146 }
3147 if (bresult)
3148 ppsc->rfpwr_state = rfpwr_state;
3149 return bresult;
3150 }
3151
3152 void rtl92d_phy_config_macphymode(struct ieee80211_hw *hw)
3153 {
3154 struct rtl_priv *rtlpriv = rtl_priv(hw);
3155 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
3156 u8 offset = REG_MAC_PHY_CTRL_NORMAL;
3157
3158 switch (rtlhal->macphymode) {
3159 case DUALMAC_DUALPHY:
3160 rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD,
3161 "MacPhyMode: DUALMAC_DUALPHY\n");
3162 rtl_write_byte(rtlpriv, offset, 0xF3);
3163 break;
3164 case SINGLEMAC_SINGLEPHY:
3165 rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD,
3166 "MacPhyMode: SINGLEMAC_SINGLEPHY\n");
3167 rtl_write_byte(rtlpriv, offset, 0xF4);
3168 break;
3169 case DUALMAC_SINGLEPHY:
3170 rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD,
3171 "MacPhyMode: DUALMAC_SINGLEPHY\n");
3172 rtl_write_byte(rtlpriv, offset, 0xF1);
3173 break;
3174 }
3175 }
3176
3177 void rtl92d_phy_config_macphymode_info(struct ieee80211_hw *hw)
3178 {
3179 struct rtl_priv *rtlpriv = rtl_priv(hw);
3180 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
3181 struct rtl_phy *rtlphy = &(rtlpriv->phy);
3182
3183 switch (rtlhal->macphymode) {
3184 case DUALMAC_SINGLEPHY:
3185 rtlphy->rf_type = RF_2T2R;
3186 rtlhal->version |= RF_TYPE_2T2R;
3187 rtlhal->bandset = BAND_ON_BOTH;
3188 rtlhal->current_bandtype = BAND_ON_2_4G;
3189 break;
3190
3191 case SINGLEMAC_SINGLEPHY:
3192 rtlphy->rf_type = RF_2T2R;
3193 rtlhal->version |= RF_TYPE_2T2R;
3194 rtlhal->bandset = BAND_ON_BOTH;
3195 rtlhal->current_bandtype = BAND_ON_2_4G;
3196 break;
3197
3198 case DUALMAC_DUALPHY:
3199 rtlphy->rf_type = RF_1T1R;
3200 rtlhal->version &= RF_TYPE_1T1R;
3201
3202 if (rtlhal->interfaceindex == 0) {
3203 rtlhal->bandset = BAND_ON_5G;
3204 rtlhal->current_bandtype = BAND_ON_5G;
3205 } else {
3206 rtlhal->bandset = BAND_ON_2_4G;
3207 rtlhal->current_bandtype = BAND_ON_2_4G;
3208 }
3209 break;
3210 default:
3211 break;
3212 }
3213 }
3214
3215 u8 rtl92d_get_chnlgroup_fromarray(u8 chnl)
3216 {
3217 u8 group;
3218
3219 if (channel_all[chnl] <= 3)
3220 group = 0;
3221 else if (channel_all[chnl] <= 9)
3222 group = 1;
3223 else if (channel_all[chnl] <= 14)
3224 group = 2;
3225 else if (channel_all[chnl] <= 44)
3226 group = 3;
3227 else if (channel_all[chnl] <= 54)
3228 group = 4;
3229 else if (channel_all[chnl] <= 64)
3230 group = 5;
3231 else if (channel_all[chnl] <= 112)
3232 group = 6;
3233 else if (channel_all[chnl] <= 126)
3234 group = 7;
3235 else if (channel_all[chnl] <= 140)
3236 group = 8;
3237 else if (channel_all[chnl] <= 153)
3238 group = 9;
3239 else if (channel_all[chnl] <= 159)
3240 group = 10;
3241 else
3242 group = 11;
3243 return group;
3244 }
3245
3246 void rtl92d_phy_set_poweron(struct ieee80211_hw *hw)
3247 {
3248 struct rtl_priv *rtlpriv = rtl_priv(hw);
3249 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
3250 unsigned long flags;
3251 u8 value8;
3252 u16 i;
3253 u32 mac_reg = (rtlhal->interfaceindex == 0 ? REG_MAC0 : REG_MAC1);
3254
3255
3256 if (rtlhal->current_bandtype == BAND_ON_2_4G) {
3257 value8 = rtl_read_byte(rtlpriv, mac_reg);
3258 value8 |= BIT(1);
3259 rtl_write_byte(rtlpriv, mac_reg, value8);
3260 } else {
3261 value8 = rtl_read_byte(rtlpriv, mac_reg);
3262 value8 &= (~BIT(1));
3263 rtl_write_byte(rtlpriv, mac_reg, value8);
3264 }
3265
3266 if (rtlhal->macphymode == SINGLEMAC_SINGLEPHY) {
3267 value8 = rtl_read_byte(rtlpriv, REG_MAC0);
3268 rtl_write_byte(rtlpriv, REG_MAC0, value8 | MAC0_ON);
3269 } else {
3270 spin_lock_irqsave(&globalmutex_power, flags);
3271 if (rtlhal->interfaceindex == 0) {
3272 value8 = rtl_read_byte(rtlpriv, REG_MAC0);
3273 rtl_write_byte(rtlpriv, REG_MAC0, value8 | MAC0_ON);
3274 } else {
3275 value8 = rtl_read_byte(rtlpriv, REG_MAC1);
3276 rtl_write_byte(rtlpriv, REG_MAC1, value8 | MAC1_ON);
3277 }
3278 value8 = rtl_read_byte(rtlpriv, REG_POWER_OFF_IN_PROCESS);
3279 spin_unlock_irqrestore(&globalmutex_power, flags);
3280 for (i = 0; i < 200; i++) {
3281 if ((value8 & BIT(7)) == 0) {
3282 break;
3283 } else {
3284 udelay(500);
3285 spin_lock_irqsave(&globalmutex_power, flags);
3286 value8 = rtl_read_byte(rtlpriv,
3287 REG_POWER_OFF_IN_PROCESS);
3288 spin_unlock_irqrestore(&globalmutex_power,
3289 flags);
3290 }
3291 }
3292 if (i == 200)
3293 WARN_ONCE(true, "rtl8192de: Another mac power off over time\n");
3294 }
3295 }
3296
3297 void rtl92d_phy_config_maccoexist_rfpage(struct ieee80211_hw *hw)
3298 {
3299 struct rtl_priv *rtlpriv = rtl_priv(hw);
3300
3301 switch (rtlpriv->rtlhal.macphymode) {
3302 case DUALMAC_DUALPHY:
3303 rtl_write_byte(rtlpriv, REG_DMC, 0x0);
3304 rtl_write_byte(rtlpriv, REG_RX_PKT_LIMIT, 0x08);
3305 rtl_write_word(rtlpriv, REG_TRXFF_BNDY + 2, 0x13ff);
3306 break;
3307 case DUALMAC_SINGLEPHY:
3308 rtl_write_byte(rtlpriv, REG_DMC, 0xf8);
3309 rtl_write_byte(rtlpriv, REG_RX_PKT_LIMIT, 0x08);
3310 rtl_write_word(rtlpriv, REG_TRXFF_BNDY + 2, 0x13ff);
3311 break;
3312 case SINGLEMAC_SINGLEPHY:
3313 rtl_write_byte(rtlpriv, REG_DMC, 0x0);
3314 rtl_write_byte(rtlpriv, REG_RX_PKT_LIMIT, 0x10);
3315 rtl_write_word(rtlpriv, (REG_TRXFF_BNDY + 2), 0x27FF);
3316 break;
3317 default:
3318 break;
3319 }
3320 }
3321
3322 void rtl92d_update_bbrf_configuration(struct ieee80211_hw *hw)
3323 {
3324 struct rtl_priv *rtlpriv = rtl_priv(hw);
3325 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
3326 struct rtl_phy *rtlphy = &(rtlpriv->phy);
3327 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw));
3328 u8 rfpath, i;
3329
3330 rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD, "==>\n");
3331
3332 if (rtlhal->current_bandtype == BAND_ON_2_4G) {
3333
3334 rtl_set_bbreg(hw, RFPGA0_XAB_RFPARAMETER, BIT(0), 0x0);
3335 rtl_set_bbreg(hw, RFPGA0_XAB_RFPARAMETER, BIT(15), 0x0);
3336 if (rtlhal->macphymode != DUALMAC_DUALPHY) {
3337 rtl_set_bbreg(hw, RFPGA0_XAB_RFPARAMETER, BIT(16), 0x0);
3338 rtl_set_bbreg(hw, RFPGA0_XAB_RFPARAMETER, BIT(31), 0x0);
3339 }
3340
3341 rtl_set_bbreg(hw, ROFDM0_AGCRSSITABLE, BIT(6) | BIT(7), 0x0);
3342
3343 rtl_set_bbreg(hw, ROFDM1_CFOTRACKING, BIT(14) | BIT(13), 0x0);
3344
3345 rtl_set_bbreg(hw, 0xB30, 0x00F00000, 0xa);
3346
3347 rtl_set_bbreg(hw, ROFDM0_XATXIQIMBALANCE, MASKDWORD,
3348 0x40000100);
3349 rtl_set_bbreg(hw, ROFDM0_XBTXIQIMBALANCE, MASKDWORD,
3350 0x40000100);
3351 if (rtlhal->macphymode == DUALMAC_DUALPHY) {
3352 rtl_set_bbreg(hw, RFPGA0_XAB_RFINTERFACESW,
3353 BIT(10) | BIT(6) | BIT(5),
3354 ((rtlefuse->eeprom_c9 & BIT(3)) >> 3) |
3355 (rtlefuse->eeprom_c9 & BIT(1)) |
3356 ((rtlefuse->eeprom_cc & BIT(1)) << 4));
3357 rtl_set_bbreg(hw, RFPGA0_XA_RFINTERFACEOE,
3358 BIT(10) | BIT(6) | BIT(5),
3359 ((rtlefuse->eeprom_c9 & BIT(2)) >> 2) |
3360 ((rtlefuse->eeprom_c9 & BIT(0)) << 1) |
3361 ((rtlefuse->eeprom_cc & BIT(0)) << 5));
3362 rtl_set_bbreg(hw, RFPGA0_XAB_RFPARAMETER, BIT(15), 0);
3363 } else {
3364 rtl_set_bbreg(hw, RFPGA0_XAB_RFINTERFACESW,
3365 BIT(26) | BIT(22) | BIT(21) | BIT(10) |
3366 BIT(6) | BIT(5),
3367 ((rtlefuse->eeprom_c9 & BIT(3)) >> 3) |
3368 (rtlefuse->eeprom_c9 & BIT(1)) |
3369 ((rtlefuse->eeprom_cc & BIT(1)) << 4) |
3370 ((rtlefuse->eeprom_c9 & BIT(7)) << 9) |
3371 ((rtlefuse->eeprom_c9 & BIT(5)) << 12) |
3372 ((rtlefuse->eeprom_cc & BIT(3)) << 18));
3373 rtl_set_bbreg(hw, RFPGA0_XA_RFINTERFACEOE,
3374 BIT(10) | BIT(6) | BIT(5),
3375 ((rtlefuse->eeprom_c9 & BIT(2)) >> 2) |
3376 ((rtlefuse->eeprom_c9 & BIT(0)) << 1) |
3377 ((rtlefuse->eeprom_cc & BIT(0)) << 5));
3378 rtl_set_bbreg(hw, RFPGA0_XB_RFINTERFACEOE,
3379 BIT(10) | BIT(6) | BIT(5),
3380 ((rtlefuse->eeprom_c9 & BIT(6)) >> 6) |
3381 ((rtlefuse->eeprom_c9 & BIT(4)) >> 3) |
3382 ((rtlefuse->eeprom_cc & BIT(2)) << 3));
3383 rtl_set_bbreg(hw, RFPGA0_XAB_RFPARAMETER,
3384 BIT(31) | BIT(15), 0);
3385 }
3386
3387 } else {
3388
3389 rtl_set_bbreg(hw, RFPGA0_XAB_RFPARAMETER, BIT(0), 0x1);
3390 rtl_set_bbreg(hw, RFPGA0_XAB_RFPARAMETER, BIT(15), 0x1);
3391 if (rtlhal->macphymode != DUALMAC_DUALPHY) {
3392 rtl_set_bbreg(hw, RFPGA0_XAB_RFPARAMETER, BIT(16), 0x1);
3393 rtl_set_bbreg(hw, RFPGA0_XAB_RFPARAMETER, BIT(31), 0x1);
3394 }
3395
3396 rtl_set_bbreg(hw, ROFDM0_AGCRSSITABLE, BIT(6) | BIT(7), 0x1);
3397
3398 rtl_set_bbreg(hw, ROFDM1_CFOTRACKING, BIT(14) | BIT(13), 0x1);
3399
3400 rtl_set_bbreg(hw, 0xB30, 0x00F00000, 0x0);
3401
3402 if (rtlefuse->internal_pa_5g[0])
3403 rtl_set_bbreg(hw, ROFDM0_XATXIQIMBALANCE, MASKDWORD,
3404 0x2d4000b5);
3405 else
3406 rtl_set_bbreg(hw, ROFDM0_XATXIQIMBALANCE, MASKDWORD,
3407 0x20000080);
3408 if (rtlefuse->internal_pa_5g[1])
3409 rtl_set_bbreg(hw, ROFDM0_XBTXIQIMBALANCE, MASKDWORD,
3410 0x2d4000b5);
3411 else
3412 rtl_set_bbreg(hw, ROFDM0_XBTXIQIMBALANCE, MASKDWORD,
3413 0x20000080);
3414 if (rtlhal->macphymode == DUALMAC_DUALPHY) {
3415 rtl_set_bbreg(hw, RFPGA0_XAB_RFINTERFACESW,
3416 BIT(10) | BIT(6) | BIT(5),
3417 (rtlefuse->eeprom_cc & BIT(5)));
3418 rtl_set_bbreg(hw, RFPGA0_XA_RFINTERFACEOE, BIT(10),
3419 ((rtlefuse->eeprom_cc & BIT(4)) >> 4));
3420 rtl_set_bbreg(hw, RFPGA0_XAB_RFPARAMETER, BIT(15),
3421 (rtlefuse->eeprom_cc & BIT(4)) >> 4);
3422 } else {
3423 rtl_set_bbreg(hw, RFPGA0_XAB_RFINTERFACESW,
3424 BIT(26) | BIT(22) | BIT(21) | BIT(10) |
3425 BIT(6) | BIT(5),
3426 (rtlefuse->eeprom_cc & BIT(5)) |
3427 ((rtlefuse->eeprom_cc & BIT(7)) << 14));
3428 rtl_set_bbreg(hw, RFPGA0_XA_RFINTERFACEOE, BIT(10),
3429 ((rtlefuse->eeprom_cc & BIT(4)) >> 4));
3430 rtl_set_bbreg(hw, RFPGA0_XB_RFINTERFACEOE, BIT(10),
3431 ((rtlefuse->eeprom_cc & BIT(6)) >> 6));
3432 rtl_set_bbreg(hw, RFPGA0_XAB_RFPARAMETER,
3433 BIT(31) | BIT(15),
3434 ((rtlefuse->eeprom_cc & BIT(4)) >> 4) |
3435 ((rtlefuse->eeprom_cc & BIT(6)) << 10));
3436 }
3437 }
3438
3439 rtl_set_bbreg(hw, ROFDM0_XARXIQIMBALANCE, MASKDWORD, 0x40000100);
3440 rtl_set_bbreg(hw, ROFDM0_XBRXIQIMBALANCE, MASKDWORD, 0x40000100);
3441 rtl_set_bbreg(hw, ROFDM0_XCTXAFE, 0xF0000000, 0x00);
3442 rtl_set_bbreg(hw, ROFDM0_ECCATHRESHOLD, BIT(30) | BIT(28) |
3443 BIT(26) | BIT(24), 0x00);
3444 rtl_set_bbreg(hw, ROFDM0_XDTXAFE, 0xF0000000, 0x00);
3445 rtl_set_bbreg(hw, 0xca0, 0xF0000000, 0x00);
3446 rtl_set_bbreg(hw, ROFDM0_AGCRSSITABLE, 0x0000F000, 0x00);
3447
3448
3449 for (rfpath = RF90_PATH_A; rfpath < rtlphy->num_total_rfpath;
3450 rfpath++) {
3451 if (rtlhal->current_bandtype == BAND_ON_2_4G) {
3452
3453 rtl_set_rfreg(hw, rfpath, RF_CHNLBW, BIT(8) | BIT(16) |
3454 BIT(18), 0);
3455
3456 rtl_set_rfreg(hw, (enum radio_path)rfpath, 0x0B,
3457 0x1c000, 0x07);
3458 } else {
3459
3460 rtl_set_rfreg(hw, rfpath, RF_CHNLBW, BIT(8) |
3461 BIT(16) | BIT(18),
3462 (BIT(16) | BIT(8)) >> 8);
3463 }
3464 }
3465
3466
3467 if (rtlphy->rf_type == RF_1T1R) {
3468
3469 rtl_set_bbreg(hw, ROFDM0_TRXPATHENABLE, MASKBYTE0, 0x11);
3470 rtl_set_bbreg(hw, ROFDM1_TRXPATHENABLE, BDWORD, 0x1);
3471
3472
3473 if (rtlhal->interfaceindex == 0) {
3474 rtl_set_bbreg(hw, RFPGA0_ADDALLOCKEN, BIT(12) |
3475 BIT(13), 0x3);
3476 } else {
3477 rtl92d_phy_enable_anotherphy(hw, false);
3478 rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD,
3479 "MAC1 use DBI to update 0x888\n");
3480
3481 rtl92de_write_dword_dbi(hw, RFPGA0_ADDALLOCKEN,
3482 rtl92de_read_dword_dbi(hw,
3483 RFPGA0_ADDALLOCKEN,
3484 BIT(3)) | BIT(12) | BIT(13),
3485 BIT(3));
3486 rtl92d_phy_powerdown_anotherphy(hw, false);
3487 }
3488 } else {
3489
3490
3491 rtl_set_bbreg(hw, ROFDM0_TRXPATHENABLE, MASKBYTE0, 0x33);
3492 rtl_set_bbreg(hw, ROFDM1_TRXPATHENABLE, BDWORD, 0x3);
3493
3494 rtl_set_bbreg(hw, RFPGA0_ADDALLOCKEN, BIT(12) | BIT(13), 0);
3495 }
3496 for (rfpath = RF90_PATH_A; rfpath < rtlphy->num_total_rfpath;
3497 rfpath++) {
3498 rtlphy->rfreg_chnlval[rfpath] = rtl_get_rfreg(hw, rfpath,
3499 RF_CHNLBW, RFREG_OFFSET_MASK);
3500 rtlphy->reg_rf3c[rfpath] = rtl_get_rfreg(hw, rfpath, 0x3C,
3501 RFREG_OFFSET_MASK);
3502 }
3503 for (i = 0; i < 2; i++)
3504 rtl_dbg(rtlpriv, COMP_RF, DBG_LOUD, "RF 0x18 = 0x%x\n",
3505 rtlphy->rfreg_chnlval[i]);
3506 rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD, "<==\n");
3507
3508 }
3509
3510 bool rtl92d_phy_check_poweroff(struct ieee80211_hw *hw)
3511 {
3512 struct rtl_priv *rtlpriv = rtl_priv(hw);
3513 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
3514 u8 u1btmp;
3515 unsigned long flags;
3516
3517 if (rtlhal->macphymode == SINGLEMAC_SINGLEPHY) {
3518 u1btmp = rtl_read_byte(rtlpriv, REG_MAC0);
3519 rtl_write_byte(rtlpriv, REG_MAC0, u1btmp & (~MAC0_ON));
3520 return true;
3521 }
3522 spin_lock_irqsave(&globalmutex_power, flags);
3523 if (rtlhal->interfaceindex == 0) {
3524 u1btmp = rtl_read_byte(rtlpriv, REG_MAC0);
3525 rtl_write_byte(rtlpriv, REG_MAC0, u1btmp & (~MAC0_ON));
3526 u1btmp = rtl_read_byte(rtlpriv, REG_MAC1);
3527 u1btmp &= MAC1_ON;
3528 } else {
3529 u1btmp = rtl_read_byte(rtlpriv, REG_MAC1);
3530 rtl_write_byte(rtlpriv, REG_MAC1, u1btmp & (~MAC1_ON));
3531 u1btmp = rtl_read_byte(rtlpriv, REG_MAC0);
3532 u1btmp &= MAC0_ON;
3533 }
3534 if (u1btmp) {
3535 spin_unlock_irqrestore(&globalmutex_power, flags);
3536 return false;
3537 }
3538 u1btmp = rtl_read_byte(rtlpriv, REG_POWER_OFF_IN_PROCESS);
3539 u1btmp |= BIT(7);
3540 rtl_write_byte(rtlpriv, REG_POWER_OFF_IN_PROCESS, u1btmp);
3541 spin_unlock_irqrestore(&globalmutex_power, flags);
3542 return true;
3543 }