1 // SPDX-License-Identifier: GPL-2.0 2 /* Copyright(c) 2024 Realtek Corporation.*/ 3 4 #include "../wifi.h" 5 #include "../ps.h" 6 #include "../core.h" 7 #include "../efuse.h" 8 #include "../usb.h" 9 #include "../rtl8192d/reg.h" 10 #include "../rtl8192d/def.h" 11 #include "../rtl8192d/phy_common.h" 12 #include "../rtl8192d/rf_common.h" 13 #include "phy.h" 14 #include "rf.h" 15 #include "table.h" 16 17 #define MAX_RF_IMR_INDEX 12 18 #define MAX_RF_IMR_INDEX_NORMAL 13 19 #define RF_REG_NUM_FOR_C_CUT_5G 6 20 #define RF_REG_NUM_FOR_C_CUT_5G_INTERNALPA 7 21 #define RF_REG_NUM_FOR_C_CUT_2G 5 22 #define RF_CHNL_NUM_5G 19 23 #define RF_CHNL_NUM_5G_40M 17 24 #define CV_CURVE_CNT 64 25 26 static const u32 rf_reg_for_5g_swchnl_normal[MAX_RF_IMR_INDEX_NORMAL] = { 27 0, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x0 28 }; 29 30 static const u8 rf_reg_for_c_cut_5g[RF_REG_NUM_FOR_C_CUT_5G] = { 31 RF_SYN_G1, RF_SYN_G2, RF_SYN_G3, RF_SYN_G4, RF_SYN_G5, RF_SYN_G6 32 }; 33 34 static const u8 rf_reg_for_c_cut_2g[RF_REG_NUM_FOR_C_CUT_2G] = { 35 RF_SYN_G1, RF_SYN_G2, RF_SYN_G3, RF_SYN_G7, RF_SYN_G8 36 }; 37 38 static const u8 rf_for_c_cut_5g_internal_pa[RF_REG_NUM_FOR_C_CUT_5G_INTERNALPA] = { 39 0x0B, 0x48, 0x49, 0x4B, 0x03, 0x04, 0x0E 40 }; 41 42 static const u32 rf_reg_mask_for_c_cut_2g[RF_REG_NUM_FOR_C_CUT_2G] = { 43 BIT(19) | BIT(18) | BIT(17) | BIT(14) | BIT(1), 44 BIT(10) | BIT(9), 45 BIT(18) | BIT(17) | BIT(16) | BIT(1), 46 BIT(2) | BIT(1), 47 BIT(15) | BIT(14) | BIT(13) | BIT(12) | BIT(11) 48 }; 49 50 static const u8 rf_chnl_5g[RF_CHNL_NUM_5G] = { 51 36, 40, 44, 48, 52, 56, 60, 64, 100, 104, 108, 52 112, 116, 120, 124, 128, 132, 136, 140 53 }; 54 55 static const u8 rf_chnl_5g_40m[RF_CHNL_NUM_5G_40M] = { 56 38, 42, 46, 50, 54, 58, 62, 102, 106, 110, 114, 57 118, 122, 126, 130, 134, 138 58 }; 59 60 static const u32 rf_reg_pram_c_5g[5][RF_REG_NUM_FOR_C_CUT_5G] = { 61 {0xE43BE, 0xFC638, 0x77C0A, 0xDE471, 0xd7110, 0x8EB04}, 62 {0xE43BE, 0xFC078, 0xF7C1A, 0xE0C71, 0xD7550, 0xAEB04}, 63 {0xE43BF, 0xFF038, 0xF7C0A, 0xDE471, 0xE5550, 0xAEB04}, 64 {0xE43BF, 0xFF079, 0xF7C1A, 0xDE471, 0xE5550, 0xAEB04}, 65 {0xE43BF, 0xFF038, 0xF7C1A, 0xDE471, 0xd7550, 0xAEB04} 66 }; 67 68 static const u32 rf_reg_param_for_c_cut_2g[3][RF_REG_NUM_FOR_C_CUT_2G] = { 69 {0x643BC, 0xFC038, 0x77C1A, 0x41289, 0x01840}, 70 {0x643BC, 0xFC038, 0x07C1A, 0x41289, 0x01840}, 71 {0x243BC, 0xFC438, 0x07C1A, 0x4128B, 0x0FC41} 72 }; 73 74 static const u32 rf_syn_g4_for_c_cut_2g = 0xD1C31 & 0x7FF; 75 76 static const u32 rf_pram_c_5g_int_pa[3][RF_REG_NUM_FOR_C_CUT_5G_INTERNALPA] = { 77 {0x01a00, 0x40443, 0x00eb5, 0x89bec, 0x94a12, 0x94a12, 0x94a12}, 78 {0x01800, 0xc0443, 0x00730, 0x896ee, 0x94a52, 0x94a52, 0x94a52}, 79 {0x01800, 0xc0443, 0x00730, 0x896ee, 0x94a12, 0x94a12, 0x94a12} 80 }; 81 82 /* [patha+b][reg] */ 83 static const u32 rf_imr_param_normal[3][MAX_RF_IMR_INDEX_NORMAL] = { 84 /* channels 1-14. */ 85 { 86 0x70000, 0x00ff0, 0x4400f, 0x00ff0, 0x0, 0x0, 0x0, 87 0x0, 0x0, 0x64888, 0xe266c, 0x00090, 0x22fff 88 }, 89 /* channels 36-64 */ 90 { 91 0x70000, 0x22880, 0x4470f, 0x55880, 0x00070, 0x88000, 92 0x0, 0x88080, 0x70000, 0x64a82, 0xe466c, 0x00090, 93 0x32c9a 94 }, 95 /* channels 100-165 */ 96 { 97 0x70000, 0x44880, 0x4477f, 0x77880, 0x00070, 0x88000, 98 0x0, 0x880b0, 0x0, 0x64b82, 0xe466c, 0x00090, 0x32c9a 99 } 100 }; 101 102 static const u32 targetchnl_5g[TARGET_CHNL_NUM_5G] = { 103 25141, 25116, 25091, 25066, 25041, 104 25016, 24991, 24966, 24941, 24917, 105 24892, 24867, 24843, 24818, 24794, 106 24770, 24765, 24721, 24697, 24672, 107 24648, 24624, 24600, 24576, 24552, 108 24528, 24504, 24480, 24457, 24433, 109 24409, 24385, 24362, 24338, 24315, 110 24291, 24268, 24245, 24221, 24198, 111 24175, 24151, 24128, 24105, 24082, 112 24059, 24036, 24013, 23990, 23967, 113 23945, 23922, 23899, 23876, 23854, 114 23831, 23809, 23786, 23764, 23741, 115 23719, 23697, 23674, 23652, 23630, 116 23608, 23586, 23564, 23541, 23519, 117 23498, 23476, 23454, 23432, 23410, 118 23388, 23367, 23345, 23323, 23302, 119 23280, 23259, 23237, 23216, 23194, 120 23173, 23152, 23130, 23109, 23088, 121 23067, 23046, 23025, 23003, 22982, 122 22962, 22941, 22920, 22899, 22878, 123 22857, 22837, 22816, 22795, 22775, 124 22754, 22733, 22713, 22692, 22672, 125 22652, 22631, 22611, 22591, 22570, 126 22550, 22530, 22510, 22490, 22469, 127 22449, 22429, 22409, 22390, 22370, 128 22350, 22336, 22310, 22290, 22271, 129 22251, 22231, 22212, 22192, 22173, 130 22153, 22134, 22114, 22095, 22075, 131 22056, 22037, 22017, 21998, 21979, 132 21960, 21941, 21921, 21902, 21883, 133 21864, 21845, 21826, 21807, 21789, 134 21770, 21751, 21732, 21713, 21695, 135 21676, 21657, 21639, 21620, 21602, 136 21583, 21565, 21546, 21528, 21509, 137 21491, 21473, 21454, 21436, 21418, 138 21400, 21381, 21363, 21345, 21327, 139 21309, 21291, 21273, 21255, 21237, 140 21219, 21201, 21183, 21166, 21148, 141 21130, 21112, 21095, 21077, 21059, 142 21042, 21024, 21007, 20989, 20972, 143 25679, 25653, 25627, 25601, 25575, 144 25549, 25523, 25497, 25471, 25446, 145 25420, 25394, 25369, 25343, 25318, 146 25292, 25267, 25242, 25216, 25191, 147 25166 148 }; 149 150 /* channel 1~14 */ 151 static const u32 targetchnl_2g[TARGET_CHNL_NUM_2G] = { 152 26084, 26030, 25976, 25923, 25869, 25816, 25764, 153 25711, 25658, 25606, 25554, 25502, 25451, 25328 154 }; 155 156 u32 rtl92du_phy_query_bb_reg(struct ieee80211_hw *hw, u32 regaddr, u32 bitmask) 157 { 158 struct rtl_priv *rtlpriv = rtl_priv(hw); 159 struct rtl_hal *rtlhal = rtl_hal(rtlpriv); 160 u32 returnvalue, originalvalue, bitshift; 161 162 rtl_dbg(rtlpriv, COMP_RF, DBG_TRACE, "regaddr(%#x), bitmask(%#x)\n", 163 regaddr, bitmask); 164 165 if (rtlhal->during_mac1init_radioa) 166 regaddr |= MAC1_ACCESS_PHY0; 167 else if (rtlhal->during_mac0init_radiob) 168 regaddr |= MAC0_ACCESS_PHY1; 169 170 originalvalue = rtl_read_dword(rtlpriv, regaddr); 171 bitshift = calculate_bit_shift(bitmask); 172 returnvalue = (originalvalue & bitmask) >> bitshift; 173 rtl_dbg(rtlpriv, COMP_RF, DBG_TRACE, 174 "BBR MASK=0x%x Addr[0x%x]=0x%x\n", 175 bitmask, regaddr, originalvalue); 176 return returnvalue; 177 } 178 179 void rtl92du_phy_set_bb_reg(struct ieee80211_hw *hw, 180 u32 regaddr, u32 bitmask, u32 data) 181 { 182 struct rtl_priv *rtlpriv = rtl_priv(hw); 183 struct rtl_hal *rtlhal = rtl_hal(rtlpriv); 184 u32 originalvalue, bitshift; 185 186 rtl_dbg(rtlpriv, COMP_RF, DBG_TRACE, 187 "regaddr(%#x), bitmask(%#x), data(%#x)\n", 188 regaddr, bitmask, data); 189 190 if (rtlhal->during_mac1init_radioa) 191 regaddr |= MAC1_ACCESS_PHY0; 192 else if (rtlhal->during_mac0init_radiob) 193 regaddr |= MAC0_ACCESS_PHY1; 194 195 if (bitmask != MASKDWORD) { 196 originalvalue = rtl_read_dword(rtlpriv, regaddr); 197 bitshift = calculate_bit_shift(bitmask); 198 data = (originalvalue & (~bitmask)) | 199 ((data << bitshift) & bitmask); 200 } 201 202 rtl_write_dword(rtlpriv, regaddr, data); 203 rtl_dbg(rtlpriv, COMP_RF, DBG_TRACE, 204 "regaddr(%#x), bitmask(%#x), data(%#x)\n", 205 regaddr, bitmask, data); 206 } 207 208 /* To avoid miswrite Reg0x800 for 92D */ 209 static void rtl92du_phy_set_bb_reg_1byte(struct ieee80211_hw *hw, 210 u32 regaddr, u32 bitmask, u32 data) 211 { 212 struct rtl_priv *rtlpriv = rtl_priv(hw); 213 u32 originalvalue, bitshift, offset; 214 u8 value; 215 216 /* BitMask only support bit0~bit7 or bit8~bit15, bit16~bit23, 217 * bit24~bit31, should be in 1 byte scale; 218 */ 219 bitshift = calculate_bit_shift(bitmask); 220 offset = bitshift / 8; 221 222 originalvalue = rtl_read_dword(rtlpriv, regaddr); 223 data = (originalvalue & (~bitmask)) | ((data << bitshift) & bitmask); 224 225 value = data >> (8 * offset); 226 227 rtl_write_byte(rtlpriv, regaddr + offset, value); 228 } 229 230 bool rtl92du_phy_mac_config(struct ieee80211_hw *hw) 231 { 232 struct rtl_priv *rtlpriv = rtl_priv(hw); 233 u32 arraylength; 234 const u32 *ptrarray; 235 u32 i; 236 237 rtl_dbg(rtlpriv, COMP_INIT, DBG_TRACE, "Read Rtl819XMACPHY_Array\n"); 238 239 arraylength = MAC_2T_ARRAYLENGTH; 240 ptrarray = rtl8192du_mac_2tarray; 241 242 for (i = 0; i < arraylength; i = i + 2) 243 rtl_write_byte(rtlpriv, ptrarray[i], (u8)ptrarray[i + 1]); 244 245 if (rtlpriv->rtlhal.macphymode == SINGLEMAC_SINGLEPHY) { 246 /* improve 2-stream TX EVM */ 247 /* rtl_write_byte(rtlpriv, 0x14,0x71); */ 248 /* AMPDU aggregation number 9 */ 249 /* rtl_write_word(rtlpriv, REG_MAX_AGGR_NUM, MAX_AGGR_NUM); */ 250 rtl_write_byte(rtlpriv, REG_MAX_AGGR_NUM, 0x0B); 251 } else { 252 /* 92D need to test to decide the num. */ 253 rtl_write_byte(rtlpriv, REG_MAX_AGGR_NUM, 0x07); 254 } 255 256 return true; 257 } 258 259 static bool _rtl92du_phy_config_bb(struct ieee80211_hw *hw, u8 configtype) 260 { 261 struct rtl_priv *rtlpriv = rtl_priv(hw); 262 struct rtl_hal *rtlhal = rtl_hal(rtlpriv); 263 u16 phy_reg_arraylen, agctab_arraylen = 0; 264 const u32 *agctab_array_table = NULL; 265 const u32 *phy_regarray_table; 266 int i; 267 268 /* Normal chip, Mac0 use AGC_TAB.txt for 2G and 5G band. */ 269 if (rtlhal->interfaceindex == 0) { 270 agctab_arraylen = AGCTAB_ARRAYLENGTH; 271 agctab_array_table = rtl8192du_agctab_array; 272 rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD, 273 " ===> phy:MAC0, Rtl819XAGCTAB_Array\n"); 274 } else { 275 if (rtlhal->current_bandtype == BAND_ON_2_4G) { 276 agctab_arraylen = AGCTAB_2G_ARRAYLENGTH; 277 agctab_array_table = rtl8192du_agctab_2garray; 278 rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD, 279 " ===> phy:MAC1, Rtl819XAGCTAB_2GArray\n"); 280 } else { 281 agctab_arraylen = AGCTAB_5G_ARRAYLENGTH; 282 agctab_array_table = rtl8192du_agctab_5garray; 283 rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD, 284 " ===> phy:MAC1, Rtl819XAGCTAB_5GArray\n"); 285 } 286 } 287 phy_reg_arraylen = PHY_REG_2T_ARRAYLENGTH; 288 phy_regarray_table = rtl8192du_phy_reg_2tarray; 289 rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD, 290 " ===> phy:Rtl819XPHY_REG_Array_PG\n"); 291 292 if (configtype == BASEBAND_CONFIG_PHY_REG) { 293 for (i = 0; i < phy_reg_arraylen; i = i + 2) { 294 rtl_addr_delay(phy_regarray_table[i]); 295 rtl_set_bbreg(hw, phy_regarray_table[i], MASKDWORD, 296 phy_regarray_table[i + 1]); 297 udelay(1); 298 rtl_dbg(rtlpriv, COMP_INIT, DBG_TRACE, 299 "The phy_regarray_table[0] is %x Rtl819XPHY_REGArray[1] is %x\n", 300 phy_regarray_table[i], 301 phy_regarray_table[i + 1]); 302 } 303 } else if (configtype == BASEBAND_CONFIG_AGC_TAB) { 304 for (i = 0; i < agctab_arraylen; i = i + 2) { 305 rtl_set_bbreg(hw, agctab_array_table[i], 306 MASKDWORD, agctab_array_table[i + 1]); 307 308 /* Add 1us delay between BB/RF register setting. */ 309 udelay(1); 310 311 rtl_dbg(rtlpriv, COMP_INIT, DBG_TRACE, 312 "AGC table %u %u\n", 313 agctab_array_table[i], 314 agctab_array_table[i + 1]); 315 } 316 rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD, 317 "Normal Chip, loaded AGC table\n"); 318 } 319 return true; 320 } 321 322 static bool _rtl92du_phy_config_bb_pg(struct ieee80211_hw *hw, u8 configtype) 323 { 324 struct rtl_priv *rtlpriv = rtl_priv(hw); 325 const u32 *phy_regarray_table_pg; 326 u16 phy_regarray_pg_len; 327 int i; 328 329 phy_regarray_pg_len = PHY_REG_ARRAY_PG_LENGTH; 330 phy_regarray_table_pg = rtl8192du_phy_reg_array_pg; 331 332 if (configtype == BASEBAND_CONFIG_PHY_REG) { 333 for (i = 0; i < phy_regarray_pg_len; i = i + 3) { 334 rtl_addr_delay(phy_regarray_table_pg[i]); 335 rtl92d_store_pwrindex_diffrate_offset(hw, 336 phy_regarray_table_pg[i], 337 phy_regarray_table_pg[i + 1], 338 phy_regarray_table_pg[i + 2]); 339 } 340 } else { 341 rtl_dbg(rtlpriv, COMP_SEND, DBG_TRACE, 342 "configtype != BaseBand_Config_PHY_REG\n"); 343 } 344 return true; 345 } 346 347 static bool _rtl92du_phy_bb_config(struct ieee80211_hw *hw) 348 { 349 struct rtl_priv *rtlpriv = rtl_priv(hw); 350 struct rtl_efuse *rtlefuse = rtl_efuse(rtlpriv); 351 struct rtl_phy *rtlphy = &rtlpriv->phy; 352 bool ret; 353 354 rtl_dbg(rtlpriv, COMP_INIT, DBG_TRACE, "==>\n"); 355 ret = _rtl92du_phy_config_bb(hw, BASEBAND_CONFIG_PHY_REG); 356 if (!ret) { 357 pr_err("Write BB Reg Fail!!\n"); 358 return false; 359 } 360 361 if (!rtlefuse->autoload_failflag) { 362 rtlphy->pwrgroup_cnt = 0; 363 ret = _rtl92du_phy_config_bb_pg(hw, BASEBAND_CONFIG_PHY_REG); 364 } 365 if (!ret) { 366 pr_err("BB_PG Reg Fail!!\n"); 367 return false; 368 } 369 370 ret = _rtl92du_phy_config_bb(hw, BASEBAND_CONFIG_AGC_TAB); 371 if (!ret) { 372 pr_err("AGC Table Fail\n"); 373 return false; 374 } 375 376 rtlphy->cck_high_power = (bool)rtl_get_bbreg(hw, 377 RFPGA0_XA_HSSIPARAMETER2, 378 0x200); 379 380 return true; 381 } 382 383 bool rtl92du_phy_bb_config(struct ieee80211_hw *hw) 384 { 385 struct rtl_priv *rtlpriv = rtl_priv(hw); 386 struct rtl_hal *rtlhal = rtl_hal(rtlpriv); 387 bool rtstatus; 388 u32 regvaldw; 389 u16 regval; 390 u8 value; 391 392 rtl92d_phy_init_bb_rf_register_definition(hw); 393 394 regval = rtl_read_word(rtlpriv, REG_SYS_FUNC_EN); 395 rtl_write_word(rtlpriv, REG_SYS_FUNC_EN, 396 regval | BIT(13) | BIT(0) | BIT(1)); 397 398 rtl_write_byte(rtlpriv, REG_AFE_PLL_CTRL, 0x83); 399 rtl_write_byte(rtlpriv, REG_AFE_PLL_CTRL + 1, 0xdb); 400 401 /* 0x1f bit7 bit6 represent for mac0/mac1 driver ready */ 402 value = rtl_read_byte(rtlpriv, REG_RF_CTRL); 403 rtl_write_byte(rtlpriv, REG_RF_CTRL, value | RF_EN | RF_RSTB | 404 RF_SDMRSTB); 405 406 value = FEN_BB_GLB_RSTN | FEN_BBRSTB; 407 if (rtlhal->interface == INTF_PCI) 408 value |= FEN_PPLL | FEN_PCIEA | FEN_DIO_PCIE; 409 else if (rtlhal->interface == INTF_USB) 410 value |= FEN_USBA | FEN_USBD; 411 rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN, value); 412 413 regvaldw = rtl_read_dword(rtlpriv, RFPGA0_XCD_RFPARAMETER); 414 regvaldw &= ~BIT(31); 415 rtl_write_dword(rtlpriv, RFPGA0_XCD_RFPARAMETER, regvaldw); 416 417 /* To Fix MAC loopback mode fail. */ 418 rtl_write_byte(rtlpriv, REG_LDOHCI12_CTRL, 0x0f); 419 rtl_write_byte(rtlpriv, 0x15, 0xe9); 420 421 rtl_write_byte(rtlpriv, REG_AFE_XTAL_CTRL + 1, 0x80); 422 if (!(IS_92D_SINGLEPHY(rtlpriv->rtlhal.version)) && 423 rtlhal->interface == INTF_PCI) { 424 regvaldw = rtl_read_dword(rtlpriv, REG_LEDCFG0); 425 rtl_write_dword(rtlpriv, REG_LEDCFG0, regvaldw | BIT(23)); 426 } 427 428 rtstatus = _rtl92du_phy_bb_config(hw); 429 430 /* Crystal calibration */ 431 rtl_set_bbreg(hw, REG_AFE_XTAL_CTRL, 0xf0, 432 rtlpriv->efuse.crystalcap & 0x0f); 433 rtl_set_bbreg(hw, REG_AFE_PLL_CTRL, 0xf0000000, 434 (rtlpriv->efuse.crystalcap & 0xf0) >> 4); 435 436 return rtstatus; 437 } 438 439 bool rtl92du_phy_rf_config(struct ieee80211_hw *hw) 440 { 441 return rtl92du_phy_rf6052_config(hw); 442 } 443 444 bool rtl92du_phy_config_rf_with_headerfile(struct ieee80211_hw *hw, 445 enum rf_content content, 446 enum radio_path rfpath) 447 { 448 struct rtl_priv *rtlpriv = rtl_priv(hw); 449 u16 radioa_arraylen, radiob_arraylen; 450 const u32 *radioa_array_table; 451 const u32 *radiob_array_table; 452 int i; 453 454 radioa_arraylen = RADIOA_2T_ARRAYLENGTH; 455 radioa_array_table = rtl8192du_radioa_2tarray; 456 radiob_arraylen = RADIOB_2T_ARRAYLENGTH; 457 radiob_array_table = rtl8192du_radiob_2tarray; 458 if (rtlpriv->efuse.internal_pa_5g[0]) { 459 radioa_arraylen = RADIOA_2T_INT_PA_ARRAYLENGTH; 460 radioa_array_table = rtl8192du_radioa_2t_int_paarray; 461 } 462 if (rtlpriv->efuse.internal_pa_5g[1]) { 463 radiob_arraylen = RADIOB_2T_INT_PA_ARRAYLENGTH; 464 radiob_array_table = rtl8192du_radiob_2t_int_paarray; 465 } 466 rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD, 467 "PHY_ConfigRFWithHeaderFile() Radio_A:Rtl819XRadioA_1TArray\n"); 468 rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD, 469 "PHY_ConfigRFWithHeaderFile() Radio_B:Rtl819XRadioB_1TArray\n"); 470 rtl_dbg(rtlpriv, COMP_INIT, DBG_TRACE, "Radio No %x\n", rfpath); 471 472 /* this only happens when DMDP, mac0 start on 2.4G, 473 * mac1 start on 5G, mac 0 has to set phy0 & phy1 474 * pathA or mac1 has to set phy0 & phy1 pathA 475 */ 476 if (content == radiob_txt && rfpath == RF90_PATH_A) { 477 rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD, 478 " ===> althougth Path A, we load radiob.txt\n"); 479 radioa_arraylen = radiob_arraylen; 480 radioa_array_table = radiob_array_table; 481 } 482 483 switch (rfpath) { 484 case RF90_PATH_A: 485 for (i = 0; i < radioa_arraylen; i = i + 2) { 486 rtl_rfreg_delay(hw, rfpath, radioa_array_table[i], 487 RFREG_OFFSET_MASK, 488 radioa_array_table[i + 1]); 489 } 490 break; 491 case RF90_PATH_B: 492 for (i = 0; i < radiob_arraylen; i = i + 2) { 493 rtl_rfreg_delay(hw, rfpath, radiob_array_table[i], 494 RFREG_OFFSET_MASK, 495 radiob_array_table[i + 1]); 496 } 497 break; 498 case RF90_PATH_C: 499 case RF90_PATH_D: 500 pr_err("switch case %#x not processed\n", rfpath); 501 break; 502 } 503 504 return true; 505 } 506 507 void rtl92du_phy_set_bw_mode(struct ieee80211_hw *hw, 508 enum nl80211_channel_type ch_type) 509 { 510 struct rtl_priv *rtlpriv = rtl_priv(hw); 511 struct rtl_hal *rtlhal = rtl_hal(rtlpriv); 512 struct rtl_phy *rtlphy = &rtlpriv->phy; 513 struct rtl_mac *mac = rtl_mac(rtlpriv); 514 u8 reg_bw_opmode; 515 u8 reg_prsr_rsc; 516 517 if (rtlphy->set_bwmode_inprogress) 518 return; 519 520 if ((is_hal_stop(rtlhal)) || (RT_CANNOT_IO(hw))) { 521 rtl_dbg(rtlpriv, COMP_ERR, DBG_WARNING, 522 "FALSE driver sleep or unload\n"); 523 return; 524 } 525 526 rtlphy->set_bwmode_inprogress = true; 527 528 rtl_dbg(rtlpriv, COMP_SCAN, DBG_TRACE, "Switch to %s bandwidth\n", 529 rtlphy->current_chan_bw == HT_CHANNEL_WIDTH_20 ? 530 "20MHz" : "40MHz"); 531 532 reg_bw_opmode = rtl_read_byte(rtlpriv, REG_BWOPMODE); 533 reg_prsr_rsc = rtl_read_byte(rtlpriv, REG_RRSR + 2); 534 535 switch (rtlphy->current_chan_bw) { 536 case HT_CHANNEL_WIDTH_20: 537 reg_bw_opmode |= BW_OPMODE_20MHZ; 538 rtl_write_byte(rtlpriv, REG_BWOPMODE, reg_bw_opmode); 539 break; 540 case HT_CHANNEL_WIDTH_20_40: 541 reg_bw_opmode &= ~BW_OPMODE_20MHZ; 542 rtl_write_byte(rtlpriv, REG_BWOPMODE, reg_bw_opmode); 543 544 reg_prsr_rsc = (reg_prsr_rsc & 0x90) | 545 (mac->cur_40_prime_sc << 5); 546 rtl_write_byte(rtlpriv, REG_RRSR + 2, reg_prsr_rsc); 547 break; 548 default: 549 pr_err("unknown bandwidth: %#X\n", 550 rtlphy->current_chan_bw); 551 break; 552 } 553 554 switch (rtlphy->current_chan_bw) { 555 case HT_CHANNEL_WIDTH_20: 556 rtl92du_phy_set_bb_reg_1byte(hw, RFPGA0_RFMOD, BRFMOD, 0x0); 557 rtl_set_bbreg(hw, RFPGA1_RFMOD, BRFMOD, 0x0); 558 /* SET BIT10 BIT11 for receive cck */ 559 rtl_set_bbreg(hw, RFPGA0_ANALOGPARAMETER2, BIT(10) | BIT(11), 3); 560 break; 561 case HT_CHANNEL_WIDTH_20_40: 562 rtl92du_phy_set_bb_reg_1byte(hw, RFPGA0_RFMOD, BRFMOD, 0x1); 563 rtl_set_bbreg(hw, RFPGA1_RFMOD, BRFMOD, 0x1); 564 /* Set Control channel to upper or lower. 565 * These settings are required only for 40MHz 566 */ 567 if (rtlhal->current_bandtype == BAND_ON_2_4G) 568 rtl_set_bbreg(hw, RCCK0_SYSTEM, BCCKSIDEBAND, 569 mac->cur_40_prime_sc >> 1); 570 rtl_set_bbreg(hw, ROFDM1_LSTF, 0xC00, mac->cur_40_prime_sc); 571 /* SET BIT10 BIT11 for receive cck */ 572 rtl_set_bbreg(hw, RFPGA0_ANALOGPARAMETER2, 573 BIT(10) | BIT(11), 0); 574 rtl_set_bbreg(hw, 0x818, BIT(26) | BIT(27), 575 mac->cur_40_prime_sc == 576 HAL_PRIME_CHNL_OFFSET_LOWER ? 2 : 1); 577 break; 578 default: 579 pr_err("unknown bandwidth: %#X\n", 580 rtlphy->current_chan_bw); 581 break; 582 } 583 584 rtl92d_phy_rf6052_set_bandwidth(hw, rtlphy->current_chan_bw); 585 586 rtlphy->set_bwmode_inprogress = false; 587 rtl_dbg(rtlpriv, COMP_SCAN, DBG_TRACE, "<==\n"); 588 } 589 590 static void _rtl92du_phy_stop_trx_before_changeband(struct ieee80211_hw *hw) 591 { 592 rtl92du_phy_set_bb_reg_1byte(hw, RFPGA0_RFMOD, BCCKEN | BOFDMEN, 0); 593 rtl_set_bbreg(hw, ROFDM0_TRXPATHENABLE, MASKBYTE0, 0x00); 594 rtl_set_bbreg(hw, ROFDM1_TRXPATHENABLE, BDWORD, 0x0); 595 } 596 597 static void rtl92du_phy_switch_wirelessband(struct ieee80211_hw *hw, u8 band) 598 { 599 struct rtl_priv *rtlpriv = rtl_priv(hw); 600 struct rtl_hal *rtlhal = rtl_hal(rtlpriv); 601 u16 basic_rates; 602 u32 reg_mac; 603 u8 value8; 604 605 rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD, "==>\n"); 606 rtlhal->bandset = band; 607 rtlhal->current_bandtype = band; 608 if (IS_92D_SINGLEPHY(rtlhal->version)) 609 rtlhal->bandset = BAND_ON_BOTH; 610 611 /* stop RX/Tx */ 612 _rtl92du_phy_stop_trx_before_changeband(hw); 613 614 /* reconfig BB/RF according to wireless mode */ 615 if (rtlhal->current_bandtype == BAND_ON_2_4G) 616 /* BB & RF Config */ 617 rtl_dbg(rtlpriv, COMP_CMD, DBG_DMESG, "====>2.4G\n"); 618 else 619 /* 5G band */ 620 rtl_dbg(rtlpriv, COMP_CMD, DBG_DMESG, "====>5G\n"); 621 622 if (rtlhal->interfaceindex == 1) 623 _rtl92du_phy_config_bb(hw, BASEBAND_CONFIG_AGC_TAB); 624 625 rtl92du_update_bbrf_configuration(hw); 626 627 basic_rates = RRSR_6M | RRSR_12M | RRSR_24M; 628 if (rtlhal->current_bandtype == BAND_ON_2_4G) 629 basic_rates |= RRSR_1M | RRSR_2M | RRSR_5_5M | RRSR_11M; 630 rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_BASIC_RATE, 631 (u8 *)&basic_rates); 632 633 rtl92du_phy_set_bb_reg_1byte(hw, RFPGA0_RFMOD, BCCKEN | BOFDMEN, 0x3); 634 635 /* 20M BW. */ 636 /* rtl_set_bbreg(hw, RFPGA0_ANALOGPARAMETER2, BIT(10), 1); */ 637 rtlhal->reloadtxpowerindex = true; 638 639 reg_mac = rtlhal->interfaceindex == 0 ? REG_MAC0 : REG_MAC1; 640 641 /* notice fw know band status 0x81[1]/0x53[1] = 0: 5G, 1: 2G */ 642 if (rtlhal->current_bandtype == BAND_ON_2_4G) { 643 value8 = rtl_read_byte(rtlpriv, reg_mac); 644 value8 |= BIT(1); 645 rtl_write_byte(rtlpriv, reg_mac, value8); 646 } else { 647 value8 = rtl_read_byte(rtlpriv, reg_mac); 648 value8 &= ~BIT(1); 649 rtl_write_byte(rtlpriv, reg_mac, value8); 650 } 651 mdelay(1); 652 rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD, "<==Switch Band OK\n"); 653 } 654 655 static void _rtl92du_phy_reload_imr_setting(struct ieee80211_hw *hw, 656 u8 channel, u8 rfpath) 657 { 658 struct rtl_usb *rtlusb = rtl_usbdev(rtl_usbpriv(hw)); 659 struct rtl_priv *rtlpriv = rtl_priv(hw); 660 u8 group, i; 661 662 if (rtlusb->udev->speed != USB_SPEED_HIGH) 663 return; 664 665 rtl_dbg(rtlpriv, COMP_CMD, DBG_LOUD, "====>path %d\n", rfpath); 666 if (rtlpriv->rtlhal.current_bandtype == BAND_ON_5G) { 667 rtl_dbg(rtlpriv, COMP_CMD, DBG_LOUD, "====>5G\n"); 668 rtl92du_phy_set_bb_reg_1byte(hw, RFPGA0_RFMOD, 669 BOFDMEN | BCCKEN, 0); 670 rtl_set_bbreg(hw, RFPGA0_ANALOGPARAMETER4, 0x00f00000, 0xf); 671 672 /* fc area 0xd2c */ 673 if (channel >= 149) 674 rtl_set_bbreg(hw, ROFDM1_CFOTRACKING, BIT(13) | 675 BIT(14), 2); 676 else 677 rtl_set_bbreg(hw, ROFDM1_CFOTRACKING, BIT(13) | 678 BIT(14), 1); 679 680 /* leave 0 for channel1-14. */ 681 group = channel <= 64 ? 1 : 2; 682 for (i = 0; i < MAX_RF_IMR_INDEX_NORMAL; i++) 683 rtl_set_rfreg(hw, (enum radio_path)rfpath, 684 rf_reg_for_5g_swchnl_normal[i], 685 RFREG_OFFSET_MASK, 686 rf_imr_param_normal[group][i]); 687 688 rtl_set_bbreg(hw, RFPGA0_ANALOGPARAMETER4, 0x00f00000, 0); 689 rtl92du_phy_set_bb_reg_1byte(hw, RFPGA0_RFMOD, 690 BOFDMEN | BCCKEN, 3); 691 } else { 692 /* G band. */ 693 rtl_dbg(rtlpriv, COMP_SCAN, DBG_LOUD, 694 "Load RF IMR parameters for G band. IMR already setting %d\n", 695 rtlpriv->rtlhal.load_imrandiqk_setting_for2g); 696 rtl_dbg(rtlpriv, COMP_CMD, DBG_LOUD, "====>2.4G\n"); 697 698 if (!rtlpriv->rtlhal.load_imrandiqk_setting_for2g) { 699 rtl_dbg(rtlpriv, COMP_SCAN, DBG_LOUD, 700 "Load RF IMR parameters for G band. %d\n", 701 rfpath); 702 rtl92du_phy_set_bb_reg_1byte(hw, RFPGA0_RFMOD, 703 BOFDMEN | BCCKEN, 0); 704 rtl_set_bbreg(hw, RFPGA0_ANALOGPARAMETER4, 705 0x00f00000, 0xf); 706 707 for (i = 0; i < MAX_RF_IMR_INDEX_NORMAL; i++) { 708 rtl_set_rfreg(hw, (enum radio_path)rfpath, 709 rf_reg_for_5g_swchnl_normal[i], 710 RFREG_OFFSET_MASK, 711 rf_imr_param_normal[0][i]); 712 } 713 714 rtl_set_bbreg(hw, RFPGA0_ANALOGPARAMETER4, 715 0x00f00000, 0); 716 rtl92du_phy_set_bb_reg_1byte(hw, RFPGA0_RFMOD, 717 BOFDMEN | BCCKEN, 3); 718 } 719 } 720 rtl_dbg(rtlpriv, COMP_CMD, DBG_LOUD, "<====\n"); 721 } 722 723 static void _rtl92du_phy_switch_rf_setting(struct ieee80211_hw *hw, u8 channel) 724 { 725 struct rtl_usb *rtlusb = rtl_usbdev(rtl_usbpriv(hw)); 726 struct rtl_priv *rtlpriv = rtl_priv(hw); 727 struct rtl_hal *rtlhal = &rtlpriv->rtlhal; 728 struct rtl_phy *rtlphy = &rtlpriv->phy; 729 u8 path = rtlhal->current_bandtype == BAND_ON_5G ? RF90_PATH_A 730 : RF90_PATH_B; 731 u32 u4regvalue, mask = 0x1C000, value = 0, u4tmp, u4tmp2; 732 bool need_pwr_down = false, internal_pa = false; 733 u32 regb30 = rtl_get_bbreg(hw, 0xb30, BIT(27)); 734 u8 index = 0, i, rfpath; 735 736 if (rtlusb->udev->speed != USB_SPEED_HIGH) 737 return; 738 739 rtl_dbg(rtlpriv, COMP_CMD, DBG_LOUD, "====>\n"); 740 /* config path A for 5G */ 741 if (rtlhal->current_bandtype == BAND_ON_5G) { 742 rtl_dbg(rtlpriv, COMP_CMD, DBG_LOUD, "====>5G\n"); 743 u4tmp = rtlpriv->curveindex_5g[channel - 1]; 744 RTPRINT(rtlpriv, FINIT, INIT_IQK, 745 "ver 1 set RF-A, 5G, 0x28 = 0x%x !!\n", u4tmp); 746 747 for (i = 0; i < RF_CHNL_NUM_5G; i++) { 748 if (channel == rf_chnl_5g[i] && channel <= 140) 749 index = 0; 750 } 751 for (i = 0; i < RF_CHNL_NUM_5G_40M; i++) { 752 if (channel == rf_chnl_5g_40m[i] && channel <= 140) 753 index = 1; 754 } 755 if (channel == 149 || channel == 155 || channel == 161) 756 index = 2; 757 else if (channel == 151 || channel == 153 || channel == 163 || 758 channel == 165) 759 index = 3; 760 else if (channel == 157 || channel == 159) 761 index = 4; 762 763 if (rtlhal->macphymode == DUALMAC_DUALPHY && 764 rtlhal->interfaceindex == 1) { 765 need_pwr_down = rtl92du_phy_enable_anotherphy(hw, false); 766 rtlhal->during_mac1init_radioa = true; 767 /* asume no this case */ 768 if (need_pwr_down) 769 rtl92d_phy_enable_rf_env(hw, path, 770 &u4regvalue); 771 } 772 773 /* DMDP, if band = 5G, Mac0 need to set PHY1 when regB30[27]=1 */ 774 if (regb30 && rtlhal->interfaceindex == 0) { 775 need_pwr_down = rtl92du_phy_enable_anotherphy(hw, true); 776 rtlhal->during_mac0init_radiob = true; 777 if (need_pwr_down) 778 rtl92d_phy_enable_rf_env(hw, path, 779 &u4regvalue); 780 } 781 782 for (i = 0; i < RF_REG_NUM_FOR_C_CUT_5G; i++) { 783 if (i == 0 && rtlhal->macphymode == DUALMAC_DUALPHY) { 784 rtl_set_rfreg(hw, (enum radio_path)path, 785 rf_reg_for_c_cut_5g[i], 786 RFREG_OFFSET_MASK, 0xE439D); 787 } else if (rf_reg_for_c_cut_5g[i] == RF_SYN_G4) { 788 u4tmp2 = (rf_reg_pram_c_5g[index][i] & 789 0x7FF) | (u4tmp << 11); 790 if (channel == 36) 791 u4tmp2 &= ~(BIT(7) | BIT(6)); 792 rtl_set_rfreg(hw, (enum radio_path)path, 793 rf_reg_for_c_cut_5g[i], 794 RFREG_OFFSET_MASK, u4tmp2); 795 } else { 796 rtl_set_rfreg(hw, (enum radio_path)path, 797 rf_reg_for_c_cut_5g[i], 798 RFREG_OFFSET_MASK, 799 rf_reg_pram_c_5g[index][i]); 800 } 801 rtl_dbg(rtlpriv, COMP_RF, DBG_TRACE, 802 "offset 0x%x value 0x%x path %d index %d readback 0x%x\n", 803 rf_reg_for_c_cut_5g[i], 804 rf_reg_pram_c_5g[index][i], 805 path, index, 806 rtl_get_rfreg(hw, (enum radio_path)path, 807 rf_reg_for_c_cut_5g[i], 808 RFREG_OFFSET_MASK)); 809 } 810 if (rtlhal->macphymode == DUALMAC_DUALPHY && 811 rtlhal->interfaceindex == 1) { 812 if (need_pwr_down) 813 rtl92d_phy_restore_rf_env(hw, path, &u4regvalue); 814 815 rtl92du_phy_powerdown_anotherphy(hw, false); 816 } 817 818 if (regb30 && rtlhal->interfaceindex == 0) { 819 if (need_pwr_down) 820 rtl92d_phy_restore_rf_env(hw, path, &u4regvalue); 821 822 rtl92du_phy_powerdown_anotherphy(hw, true); 823 } 824 825 if (channel < 149) 826 value = 0x07; 827 else if (channel >= 149) 828 value = 0x02; 829 if (channel >= 36 && channel <= 64) 830 index = 0; 831 else if (channel >= 100 && channel <= 140) 832 index = 1; 833 else 834 index = 2; 835 836 for (rfpath = RF90_PATH_A; rfpath < rtlphy->num_total_rfpath; 837 rfpath++) { 838 if (rtlhal->macphymode == DUALMAC_DUALPHY && 839 rtlhal->interfaceindex == 1) /* MAC 1 5G */ 840 internal_pa = rtlpriv->efuse.internal_pa_5g[1]; 841 else 842 internal_pa = 843 rtlpriv->efuse.internal_pa_5g[rfpath]; 844 845 if (internal_pa) { 846 for (i = 0; 847 i < RF_REG_NUM_FOR_C_CUT_5G_INTERNALPA; 848 i++) { 849 if (rf_for_c_cut_5g_internal_pa[i] == 0x03 && 850 channel >= 36 && channel <= 64) 851 rtl_set_rfreg(hw, rfpath, 852 rf_for_c_cut_5g_internal_pa[i], 853 RFREG_OFFSET_MASK, 854 0x7bdef); 855 else 856 rtl_set_rfreg(hw, rfpath, 857 rf_for_c_cut_5g_internal_pa[i], 858 RFREG_OFFSET_MASK, 859 rf_pram_c_5g_int_pa[index][i]); 860 rtl_dbg(rtlpriv, COMP_RF, DBG_LOUD, 861 "offset 0x%x value 0x%x path %d index %d\n", 862 rf_for_c_cut_5g_internal_pa[i], 863 rf_pram_c_5g_int_pa[index][i], 864 rfpath, index); 865 } 866 } else { 867 rtl_set_rfreg(hw, (enum radio_path)rfpath, RF_TXPA_AG, 868 mask, value); 869 } 870 } 871 } else if (rtlhal->current_bandtype == BAND_ON_2_4G) { 872 rtl_dbg(rtlpriv, COMP_CMD, DBG_LOUD, "====>2.4G\n"); 873 u4tmp = rtlpriv->curveindex_2g[channel - 1]; 874 RTPRINT(rtlpriv, FINIT, INIT_IQK, 875 "ver 3 set RF-B, 2G, 0x28 = 0x%x !!\n", u4tmp); 876 877 if (channel == 1 || channel == 2 || channel == 4 || 878 channel == 9 || channel == 10 || channel == 11 || 879 channel == 12) 880 index = 0; 881 else if (channel == 3 || channel == 13 || channel == 14) 882 index = 1; 883 else if (channel >= 5 && channel <= 8) 884 index = 2; 885 886 if (rtlhal->macphymode == DUALMAC_DUALPHY) { 887 path = RF90_PATH_A; 888 if (rtlhal->interfaceindex == 0) { 889 need_pwr_down = 890 rtl92du_phy_enable_anotherphy(hw, true); 891 rtlhal->during_mac0init_radiob = true; 892 893 if (need_pwr_down) 894 rtl92d_phy_enable_rf_env(hw, path, 895 &u4regvalue); 896 } 897 898 /* DMDP, if band = 2G, MAC1 need to set PHY0 when regB30[27]=1 */ 899 if (regb30 && rtlhal->interfaceindex == 1) { 900 need_pwr_down = 901 rtl92du_phy_enable_anotherphy(hw, false); 902 rtlhal->during_mac1init_radioa = true; 903 904 if (need_pwr_down) 905 rtl92d_phy_enable_rf_env(hw, path, 906 &u4regvalue); 907 } 908 } 909 910 for (i = 0; i < RF_REG_NUM_FOR_C_CUT_2G; i++) { 911 if (rf_reg_for_c_cut_2g[i] == RF_SYN_G7) 912 rtl_set_rfreg(hw, (enum radio_path)path, 913 rf_reg_for_c_cut_2g[i], 914 RFREG_OFFSET_MASK, 915 rf_reg_param_for_c_cut_2g[index][i] | 916 BIT(17)); 917 else 918 rtl_set_rfreg(hw, (enum radio_path)path, 919 rf_reg_for_c_cut_2g[i], 920 RFREG_OFFSET_MASK, 921 rf_reg_param_for_c_cut_2g 922 [index][i]); 923 924 rtl_dbg(rtlpriv, COMP_RF, DBG_TRACE, 925 "offset 0x%x value 0x%x mak 0x%x path %d index %d readback 0x%x\n", 926 rf_reg_for_c_cut_2g[i], 927 rf_reg_param_for_c_cut_2g[index][i], 928 rf_reg_mask_for_c_cut_2g[i], path, index, 929 rtl_get_rfreg(hw, (enum radio_path)path, 930 rf_reg_for_c_cut_2g[i], 931 RFREG_OFFSET_MASK)); 932 } 933 RTPRINT(rtlpriv, FINIT, INIT_IQK, 934 "cosa ver 3 set RF-B, 2G, 0x28 = 0x%x !!\n", 935 rf_syn_g4_for_c_cut_2g | (u4tmp << 11)); 936 937 rtl_set_rfreg(hw, (enum radio_path)path, RF_SYN_G4, 938 RFREG_OFFSET_MASK, 939 rf_syn_g4_for_c_cut_2g | (u4tmp << 11)); 940 941 if (rtlhal->macphymode == DUALMAC_DUALPHY && 942 rtlhal->interfaceindex == 0) { 943 if (need_pwr_down) 944 rtl92d_phy_restore_rf_env(hw, path, &u4regvalue); 945 946 rtl92du_phy_powerdown_anotherphy(hw, true); 947 } 948 949 if (regb30 && rtlhal->interfaceindex == 1) { 950 if (need_pwr_down) 951 rtl92d_phy_restore_rf_env(hw, path, &u4regvalue); 952 953 rtl92du_phy_powerdown_anotherphy(hw, false); 954 } 955 } 956 rtl_dbg(rtlpriv, COMP_CMD, DBG_LOUD, "<====\n"); 957 } 958 959 /* bit0 = 1 => Tx OK, bit1 = 1 => Rx OK */ 960 static u8 _rtl92du_phy_patha_iqk(struct ieee80211_hw *hw, bool configpathb) 961 { 962 struct rtl_priv *rtlpriv = rtl_priv(hw); 963 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw)); 964 u32 regeac, rege94, rege9c, regea4; 965 u8 result = 0; 966 967 RTPRINT(rtlpriv, FINIT, INIT_IQK, "Path-A IQK setting!\n"); 968 969 if (rtlhal->interfaceindex == 0) { 970 rtl_set_bbreg(hw, RTX_IQK_TONE_A, MASKDWORD, 0x10008c1f); 971 rtl_set_bbreg(hw, RRX_IQK_TONE_A, MASKDWORD, 0x10008c1f); 972 } else { 973 rtl_set_bbreg(hw, RTX_IQK_TONE_A, MASKDWORD, 0x10008c22); 974 rtl_set_bbreg(hw, RRX_IQK_TONE_A, MASKDWORD, 0x10008c22); 975 } 976 rtl_set_bbreg(hw, RTX_IQK_PI_A, MASKDWORD, 0x82140102); 977 rtl_set_bbreg(hw, RRX_IQK_PI_A, MASKDWORD, 978 configpathb ? 0x28160202 : 0x28160502); 979 /* path-B IQK setting */ 980 if (configpathb) { 981 rtl_set_bbreg(hw, RTX_IQK_TONE_B, MASKDWORD, 0x10008c22); 982 rtl_set_bbreg(hw, RRX_IQK_TONE_B, MASKDWORD, 0x10008c22); 983 rtl_set_bbreg(hw, RTX_IQK_PI_B, MASKDWORD, 0x82140102); 984 rtl_set_bbreg(hw, RRX_IQK_PI_B, MASKDWORD, 0x28160206); 985 } 986 987 /* LO calibration setting */ 988 RTPRINT(rtlpriv, FINIT, INIT_IQK, "LO calibration setting!\n"); 989 rtl_set_bbreg(hw, RIQK_AGC_RSP, MASKDWORD, 0x00462911); 990 991 /* One shot, path A LOK & IQK */ 992 RTPRINT(rtlpriv, FINIT, INIT_IQK, "One shot, path A LOK & IQK!\n"); 993 rtl_set_bbreg(hw, RIQK_AGC_PTS, MASKDWORD, 0xf9000000); 994 rtl_set_bbreg(hw, RIQK_AGC_PTS, MASKDWORD, 0xf8000000); 995 996 RTPRINT(rtlpriv, FINIT, INIT_IQK, 997 "Delay %d ms for One shot, path A LOK & IQK\n", 998 IQK_DELAY_TIME); 999 mdelay(IQK_DELAY_TIME); 1000 1001 /* Check failed */ 1002 regeac = rtl_get_bbreg(hw, RRX_POWER_AFTER_IQK_A_2, MASKDWORD); 1003 RTPRINT(rtlpriv, FINIT, INIT_IQK, "0xeac = 0x%x\n", regeac); 1004 rege94 = rtl_get_bbreg(hw, RTX_POWER_BEFORE_IQK_A, MASKDWORD); 1005 RTPRINT(rtlpriv, FINIT, INIT_IQK, "0xe94 = 0x%x\n", rege94); 1006 rege9c = rtl_get_bbreg(hw, RTX_POWER_AFTER_IQK_A, MASKDWORD); 1007 RTPRINT(rtlpriv, FINIT, INIT_IQK, "0xe9c = 0x%x\n", rege9c); 1008 regea4 = rtl_get_bbreg(hw, RRX_POWER_BEFORE_IQK_A_2, MASKDWORD); 1009 RTPRINT(rtlpriv, FINIT, INIT_IQK, "0xea4 = 0x%x\n", regea4); 1010 1011 if (!(regeac & BIT(28)) && 1012 (((rege94 & 0x03FF0000) >> 16) != 0x142) && 1013 (((rege9c & 0x03FF0000) >> 16) != 0x42)) 1014 result |= 0x01; 1015 else /* if Tx not OK, ignore Rx */ 1016 return result; 1017 1018 /* if Tx is OK, check whether Rx is OK */ 1019 if (!(regeac & BIT(27)) && 1020 (((regea4 & 0x03FF0000) >> 16) != 0x132) && 1021 (((regeac & 0x03FF0000) >> 16) != 0x36)) 1022 result |= 0x02; 1023 else 1024 RTPRINT(rtlpriv, FINIT, INIT_IQK, "Path A Rx IQK fail!!\n"); 1025 1026 return result; 1027 } 1028 1029 /* bit0 = 1 => Tx OK, bit1 = 1 => Rx OK */ 1030 static u8 _rtl92du_phy_patha_iqk_5g_normal(struct ieee80211_hw *hw, 1031 bool configpathb) 1032 { 1033 struct rtl_priv *rtlpriv = rtl_priv(hw); 1034 struct rtl_hal *rtlhal = rtl_hal(rtlpriv); 1035 struct rtl_phy *rtlphy = &rtlpriv->phy; 1036 u32 TXOKBIT = BIT(28), RXOKBIT = BIT(27); 1037 u32 regeac, rege94, rege9c, regea4; 1038 u8 timeout = 20, timecount = 0; 1039 u8 retrycount = 2; 1040 u8 result = 0; 1041 u8 i; 1042 1043 if (rtlhal->interfaceindex == 1) { /* PHY1 */ 1044 TXOKBIT = BIT(31); 1045 RXOKBIT = BIT(30); 1046 } 1047 1048 RTPRINT(rtlpriv, FINIT, INIT_IQK, "Path-A IQK setting!\n"); 1049 rtl_set_bbreg(hw, RTX_IQK_TONE_A, MASKDWORD, 0x18008c1f); 1050 rtl_set_bbreg(hw, RRX_IQK_TONE_A, MASKDWORD, 0x18008c1f); 1051 rtl_set_bbreg(hw, RTX_IQK_PI_A, MASKDWORD, 0x82140307); 1052 rtl_set_bbreg(hw, RRX_IQK_PI_A, MASKDWORD, 0x68160960); 1053 /* path-B IQK setting */ 1054 if (configpathb) { 1055 rtl_set_bbreg(hw, RTX_IQK_TONE_B, MASKDWORD, 0x18008c2f); 1056 rtl_set_bbreg(hw, RRX_IQK_TONE_B, MASKDWORD, 0x18008c2f); 1057 rtl_set_bbreg(hw, RTX_IQK_PI_B, MASKDWORD, 0x82110000); 1058 rtl_set_bbreg(hw, RRX_IQK_PI_B, MASKDWORD, 0x68110000); 1059 } 1060 1061 /* LO calibration setting */ 1062 RTPRINT(rtlpriv, FINIT, INIT_IQK, "LO calibration setting!\n"); 1063 rtl_set_bbreg(hw, RIQK_AGC_RSP, MASKDWORD, 0x00462911); 1064 1065 /* path-A PA on */ 1066 rtl_set_bbreg(hw, RFPGA0_XAB_RFINTERFACESW, MASKDWORD, 0x07000f60); 1067 rtl_set_bbreg(hw, RFPGA0_XA_RFINTERFACEOE, MASKDWORD, 0x66e60e30); 1068 1069 for (i = 0; i < retrycount; i++) { 1070 /* One shot, path A LOK & IQK */ 1071 RTPRINT(rtlpriv, FINIT, INIT_IQK, 1072 "One shot, path A LOK & IQK!\n"); 1073 rtl_set_bbreg(hw, RIQK_AGC_PTS, MASKDWORD, 0xf9000000); 1074 rtl_set_bbreg(hw, RIQK_AGC_PTS, MASKDWORD, 0xf8000000); 1075 1076 RTPRINT(rtlpriv, FINIT, INIT_IQK, 1077 "Delay %d ms for One shot, path A LOK & IQK.\n", 1078 IQK_DELAY_TIME); 1079 mdelay(IQK_DELAY_TIME * 10); 1080 1081 while (timecount < timeout && 1082 rtl_get_bbreg(hw, RRX_POWER_AFTER_IQK_A_2, BIT(26)) == 0) { 1083 udelay(IQK_DELAY_TIME * 1000 * 2); 1084 timecount++; 1085 } 1086 1087 timecount = 0; 1088 while (timecount < timeout && 1089 rtl_get_bbreg(hw, RRX_POWER_BEFORE_IQK_A_2, MASK_IQK_RESULT) == 0) { 1090 udelay(IQK_DELAY_TIME * 1000 * 2); 1091 timecount++; 1092 } 1093 1094 /* Check failed */ 1095 regeac = rtl_get_bbreg(hw, RRX_POWER_AFTER_IQK_A_2, MASKDWORD); 1096 RTPRINT(rtlpriv, FINIT, INIT_IQK, "0xeac = 0x%x\n", regeac); 1097 rege94 = rtl_get_bbreg(hw, RTX_POWER_BEFORE_IQK_A, MASKDWORD); 1098 RTPRINT(rtlpriv, FINIT, INIT_IQK, "0xe94 = 0x%x\n", rege94); 1099 rege9c = rtl_get_bbreg(hw, RTX_POWER_AFTER_IQK_A, MASKDWORD); 1100 RTPRINT(rtlpriv, FINIT, INIT_IQK, "0xe9c = 0x%x\n", rege9c); 1101 regea4 = rtl_get_bbreg(hw, RRX_POWER_BEFORE_IQK_A_2, MASKDWORD); 1102 RTPRINT(rtlpriv, FINIT, INIT_IQK, "0xea4 = 0x%x\n", regea4); 1103 1104 if (!(regeac & TXOKBIT) && 1105 (((rege94 & 0x03FF0000) >> 16) != 0x142)) { 1106 result |= 0x01; 1107 } else { /* if Tx not OK, ignore Rx */ 1108 RTPRINT(rtlpriv, FINIT, INIT_IQK, 1109 "Path A Tx IQK fail!!\n"); 1110 continue; 1111 } 1112 1113 /* if Tx is OK, check whether Rx is OK */ 1114 if (!(regeac & RXOKBIT) && 1115 (((regea4 & 0x03FF0000) >> 16) != 0x132)) { 1116 result |= 0x02; 1117 break; 1118 } 1119 RTPRINT(rtlpriv, FINIT, INIT_IQK, "Path A Rx IQK fail!!\n"); 1120 } 1121 1122 /* path A PA off */ 1123 rtl_set_bbreg(hw, RFPGA0_XAB_RFINTERFACESW, MASKDWORD, 1124 rtlphy->iqk_bb_backup[0]); 1125 rtl_set_bbreg(hw, RFPGA0_XA_RFINTERFACEOE, MASKDWORD, 1126 rtlphy->iqk_bb_backup[1]); 1127 1128 if (!(result & 0x01)) /* Tx IQK fail */ 1129 rtl_set_bbreg(hw, RTX_IQK_TONE_A, MASKDWORD, 0x19008c00); 1130 1131 if (!(result & 0x02)) { /* Rx IQK fail */ 1132 rtl_set_bbreg(hw, ROFDM0_XARXIQIMBALANCE, MASKDWORD, 0x40000100); 1133 rtl_set_bbreg(hw, RRX_IQK_TONE_A, MASKDWORD, 0x19008c00); 1134 1135 RTPRINT(rtlpriv, FINIT, INIT_IQK, 1136 "Path A Rx IQK fail!! 0xe34 = %#x\n", 1137 rtl_get_bbreg(hw, RRX_IQK_TONE_A, MASKDWORD)); 1138 } 1139 1140 return result; 1141 } 1142 1143 /* bit0 = 1 => Tx OK, bit1 = 1 => Rx OK */ 1144 static u8 _rtl92du_phy_pathb_iqk(struct ieee80211_hw *hw) 1145 { 1146 struct rtl_priv *rtlpriv = rtl_priv(hw); 1147 u32 regeac, regeb4, regebc, regec4, regecc; 1148 u8 result = 0; 1149 1150 RTPRINT(rtlpriv, FINIT, INIT_IQK, "One shot, path B LOK & IQK!\n"); 1151 rtl_set_bbreg(hw, RIQK_AGC_CONT, MASKDWORD, 0x00000002); 1152 rtl_set_bbreg(hw, RIQK_AGC_CONT, MASKDWORD, 0x00000000); 1153 1154 RTPRINT(rtlpriv, FINIT, INIT_IQK, 1155 "Delay %d ms for One shot, path B LOK & IQK\n", IQK_DELAY_TIME); 1156 mdelay(IQK_DELAY_TIME); 1157 1158 /* Check failed */ 1159 regeac = rtl_get_bbreg(hw, RRX_POWER_AFTER_IQK_A_2, MASKDWORD); 1160 RTPRINT(rtlpriv, FINIT, INIT_IQK, "0xeac = 0x%x\n", regeac); 1161 regeb4 = rtl_get_bbreg(hw, RTX_POWER_BEFORE_IQK_B, MASKDWORD); 1162 RTPRINT(rtlpriv, FINIT, INIT_IQK, "0xeb4 = 0x%x\n", regeb4); 1163 regebc = rtl_get_bbreg(hw, RTX_POWER_AFTER_IQK_B, MASKDWORD); 1164 RTPRINT(rtlpriv, FINIT, INIT_IQK, "0xebc = 0x%x\n", regebc); 1165 regec4 = rtl_get_bbreg(hw, RRX_POWER_BEFORE_IQK_B_2, MASKDWORD); 1166 RTPRINT(rtlpriv, FINIT, INIT_IQK, "0xec4 = 0x%x\n", regec4); 1167 regecc = rtl_get_bbreg(hw, RRX_POWER_AFTER_IQK_B_2, MASKDWORD); 1168 RTPRINT(rtlpriv, FINIT, INIT_IQK, "0xecc = 0x%x\n", regecc); 1169 1170 if (!(regeac & BIT(31)) && 1171 (((regeb4 & 0x03FF0000) >> 16) != 0x142) && 1172 (((regebc & 0x03FF0000) >> 16) != 0x42)) 1173 result |= 0x01; 1174 else 1175 return result; 1176 1177 if (!(regeac & BIT(30)) && 1178 (((regec4 & 0x03FF0000) >> 16) != 0x132) && 1179 (((regecc & 0x03FF0000) >> 16) != 0x36)) 1180 result |= 0x02; 1181 else 1182 RTPRINT(rtlpriv, FINIT, INIT_IQK, "Path B Rx IQK fail!!\n"); 1183 1184 return result; 1185 } 1186 1187 /* bit0 = 1 => Tx OK, bit1 = 1 => Rx OK */ 1188 static u8 _rtl92du_phy_pathb_iqk_5g_normal(struct ieee80211_hw *hw) 1189 { 1190 struct rtl_priv *rtlpriv = rtl_priv(hw); 1191 struct rtl_phy *rtlphy = &rtlpriv->phy; 1192 u32 regeac, regeb4, regebc, regec4, regecc; 1193 u8 timeout = 20, timecount = 0; 1194 u8 retrycount = 2; 1195 u8 result = 0; 1196 u8 i; 1197 1198 RTPRINT(rtlpriv, FINIT, INIT_IQK, "Path-B IQK setting!\n"); 1199 rtl_set_bbreg(hw, RTX_IQK_TONE_A, MASKDWORD, 0x18008c1f); 1200 rtl_set_bbreg(hw, RRX_IQK_TONE_A, MASKDWORD, 0x18008c1f); 1201 rtl_set_bbreg(hw, RTX_IQK_PI_A, MASKDWORD, 0x82110000); 1202 rtl_set_bbreg(hw, RRX_IQK_PI_A, MASKDWORD, 0x68110000); 1203 1204 /* path-B IQK setting */ 1205 rtl_set_bbreg(hw, RTX_IQK_TONE_B, MASKDWORD, 0x18008c2f); 1206 rtl_set_bbreg(hw, RRX_IQK_TONE_B, MASKDWORD, 0x18008c2f); 1207 rtl_set_bbreg(hw, RTX_IQK_PI_B, MASKDWORD, 0x82140307); 1208 rtl_set_bbreg(hw, RRX_IQK_PI_B, MASKDWORD, 0x68160960); 1209 1210 /* LO calibration setting */ 1211 RTPRINT(rtlpriv, FINIT, INIT_IQK, "LO calibration setting!\n"); 1212 rtl_set_bbreg(hw, RIQK_AGC_RSP, MASKDWORD, 0x00462911); 1213 1214 /* path-B PA on */ 1215 rtl_set_bbreg(hw, RFPGA0_XAB_RFINTERFACESW, MASKDWORD, 0x0f600700); 1216 rtl_set_bbreg(hw, RFPGA0_XB_RFINTERFACEOE, MASKDWORD, 0x061f0d30); 1217 1218 for (i = 0; i < retrycount; i++) { 1219 /* One shot, path B LOK & IQK */ 1220 RTPRINT(rtlpriv, FINIT, INIT_IQK, 1221 "One shot, path A LOK & IQK!\n"); 1222 rtl_set_bbreg(hw, RIQK_AGC_PTS, MASKDWORD, 0xfa000000); 1223 rtl_set_bbreg(hw, RIQK_AGC_PTS, MASKDWORD, 0xf8000000); 1224 1225 RTPRINT(rtlpriv, FINIT, INIT_IQK, 1226 "Delay %d ms for One shot, path B LOK & IQK.\n", 10); 1227 mdelay(IQK_DELAY_TIME * 10); 1228 1229 while (timecount < timeout && 1230 rtl_get_bbreg(hw, RRX_POWER_AFTER_IQK_A_2, BIT(29)) == 0) { 1231 udelay(IQK_DELAY_TIME * 1000 * 2); 1232 timecount++; 1233 } 1234 1235 timecount = 0; 1236 while (timecount < timeout && 1237 rtl_get_bbreg(hw, RRX_POWER_BEFORE_IQK_B_2, MASK_IQK_RESULT) == 0) { 1238 udelay(IQK_DELAY_TIME * 1000 * 2); 1239 timecount++; 1240 } 1241 1242 /* Check failed */ 1243 regeac = rtl_get_bbreg(hw, RRX_POWER_AFTER_IQK_A_2, MASKDWORD); 1244 RTPRINT(rtlpriv, FINIT, INIT_IQK, "0xeac = 0x%x\n", regeac); 1245 regeb4 = rtl_get_bbreg(hw, RTX_POWER_BEFORE_IQK_B, MASKDWORD); 1246 RTPRINT(rtlpriv, FINIT, INIT_IQK, "0xeb4 = 0x%x\n", regeb4); 1247 regebc = rtl_get_bbreg(hw, RTX_POWER_AFTER_IQK_B, MASKDWORD); 1248 RTPRINT(rtlpriv, FINIT, INIT_IQK, "0xebc = 0x%x\n", regebc); 1249 regec4 = rtl_get_bbreg(hw, RRX_POWER_BEFORE_IQK_B_2, MASKDWORD); 1250 RTPRINT(rtlpriv, FINIT, INIT_IQK, "0xec4 = 0x%x\n", regec4); 1251 regecc = rtl_get_bbreg(hw, RRX_POWER_AFTER_IQK_B_2, MASKDWORD); 1252 RTPRINT(rtlpriv, FINIT, INIT_IQK, "0xecc = 0x%x\n", regecc); 1253 1254 if (!(regeac & BIT(31)) && 1255 (((regeb4 & 0x03FF0000) >> 16) != 0x142)) 1256 result |= 0x01; 1257 else 1258 continue; 1259 1260 if (!(regeac & BIT(30)) && 1261 (((regec4 & 0x03FF0000) >> 16) != 0x132)) { 1262 result |= 0x02; 1263 break; 1264 } 1265 1266 RTPRINT(rtlpriv, FINIT, INIT_IQK, "Path B Rx IQK fail!!\n"); 1267 } 1268 1269 /* path B PA off */ 1270 rtl_set_bbreg(hw, RFPGA0_XAB_RFINTERFACESW, MASKDWORD, 1271 rtlphy->iqk_bb_backup[0]); 1272 rtl_set_bbreg(hw, RFPGA0_XB_RFINTERFACEOE, MASKDWORD, 1273 rtlphy->iqk_bb_backup[2]); 1274 1275 if (!(result & 0x01)) 1276 rtl_set_bbreg(hw, RTX_IQK_TONE_B, MASKDWORD, 0x19008c00); 1277 1278 if (!(result & 0x02)) { 1279 rtl_set_bbreg(hw, ROFDM0_XBRXIQIMBALANCE, MASKDWORD, 0x40000100); 1280 rtl_set_bbreg(hw, RRX_IQK_TONE_B, MASKDWORD, 0x19008c00); 1281 1282 RTPRINT(rtlpriv, FINIT, INIT_IQK, 1283 "Path B Rx IQK fail!! 0xe54 = %#x\n", 1284 rtl_get_bbreg(hw, RRX_IQK_TONE_B, MASKDWORD)); 1285 } 1286 1287 return result; 1288 } 1289 1290 static void _rtl92du_phy_reload_adda_registers(struct ieee80211_hw *hw, 1291 const u32 *adda_reg, 1292 u32 *adda_backup, u32 regnum) 1293 { 1294 struct rtl_priv *rtlpriv = rtl_priv(hw); 1295 u32 i; 1296 1297 RTPRINT(rtlpriv, FINIT, INIT_IQK, 1298 "Reload ADDA power saving parameters !\n"); 1299 for (i = 0; i < regnum; i++) { 1300 /* path-A/B BB to initial gain */ 1301 if (adda_reg[i] == ROFDM0_XAAGCCORE1 || 1302 adda_reg[i] == ROFDM0_XBAGCCORE1) 1303 rtl_set_bbreg(hw, adda_reg[i], MASKDWORD, 0x50); 1304 1305 rtl_set_bbreg(hw, adda_reg[i], MASKDWORD, adda_backup[i]); 1306 } 1307 } 1308 1309 static void _rtl92du_phy_reload_mac_registers(struct ieee80211_hw *hw, 1310 const u32 *macreg, u32 *macbackup) 1311 { 1312 struct rtl_priv *rtlpriv = rtl_priv(hw); 1313 u32 i; 1314 1315 RTPRINT(rtlpriv, FINIT, INIT_IQK, "Reload MAC parameters !\n"); 1316 for (i = 0; i < (IQK_MAC_REG_NUM - 1); i++) 1317 rtl_write_byte(rtlpriv, macreg[i], (u8)macbackup[i]); 1318 rtl_write_dword(rtlpriv, macreg[i], macbackup[i]); 1319 } 1320 1321 static void _rtl92du_phy_patha_standby(struct ieee80211_hw *hw) 1322 { 1323 struct rtl_priv *rtlpriv = rtl_priv(hw); 1324 1325 RTPRINT(rtlpriv, FINIT, INIT_IQK, "Path-A standby mode!\n"); 1326 1327 rtl_set_bbreg(hw, RFPGA0_IQK, MASKH3BYTES, 0x0); 1328 rtl_set_bbreg(hw, RFPGA0_XA_LSSIPARAMETER, MASKDWORD, 0x00010000); 1329 rtl_set_bbreg(hw, RFPGA0_IQK, MASKH3BYTES, 0x808000); 1330 } 1331 1332 static void _rtl92du_phy_pimode_switch(struct ieee80211_hw *hw, bool pi_mode) 1333 { 1334 struct rtl_priv *rtlpriv = rtl_priv(hw); 1335 u32 mode; 1336 1337 RTPRINT(rtlpriv, FINIT, INIT_IQK, 1338 "BB Switch to %s mode!\n", pi_mode ? "PI" : "SI"); 1339 mode = pi_mode ? 0x01000100 : 0x01000000; 1340 rtl_set_bbreg(hw, RFPGA0_XA_HSSIPARAMETER1, MASKDWORD, mode); 1341 rtl_set_bbreg(hw, RFPGA0_XB_HSSIPARAMETER1, MASKDWORD, mode); 1342 } 1343 1344 static void _rtl92du_phy_iq_calibrate(struct ieee80211_hw *hw, long result[][8], 1345 u8 t, bool is2t) 1346 { 1347 static const u32 adda_reg[IQK_ADDA_REG_NUM] = { 1348 RFPGA0_XCD_SWITCHCONTROL, RBLUE_TOOTH, RRX_WAIT_CCA, 1349 RTX_CCK_RFON, RTX_CCK_BBON, RTX_OFDM_RFON, RTX_OFDM_BBON, 1350 RTX_TO_RX, RTX_TO_TX, RRX_CCK, RRX_OFDM, RRX_WAIT_RIFS, 1351 RRX_TO_RX, RSTANDBY, RSLEEP, RPMPD_ANAEN 1352 }; 1353 static const u32 iqk_mac_reg[IQK_MAC_REG_NUM] = { 1354 REG_TXPAUSE, REG_BCN_CTRL, REG_BCN_CTRL_1, REG_GPIO_MUXCFG 1355 }; 1356 static const u32 iqk_bb_reg[IQK_BB_REG_NUM] = { 1357 RFPGA0_XAB_RFINTERFACESW, RFPGA0_XA_RFINTERFACEOE, 1358 RFPGA0_XB_RFINTERFACEOE, ROFDM0_TRMUXPAR, 1359 RFPGA0_XCD_RFINTERFACESW, ROFDM0_TRXPATHENABLE, 1360 RFPGA0_RFMOD, RFPGA0_ANALOGPARAMETER4, 1361 ROFDM0_XAAGCCORE1, ROFDM0_XBAGCCORE1 1362 }; 1363 struct rtl_priv *rtlpriv = rtl_priv(hw); 1364 struct rtl_phy *rtlphy = &rtlpriv->phy; 1365 const u32 retrycount = 2; 1366 u8 patha_ok, pathb_ok; 1367 u32 bbvalue; 1368 u32 i; 1369 1370 RTPRINT(rtlpriv, FINIT, INIT_IQK, "IQK for 2.4G :Start!!!\n"); 1371 if (t == 0) { 1372 bbvalue = rtl_get_bbreg(hw, RFPGA0_RFMOD, MASKDWORD); 1373 RTPRINT(rtlpriv, FINIT, INIT_IQK, "==>0x%08x\n", bbvalue); 1374 RTPRINT(rtlpriv, FINIT, INIT_IQK, "IQ Calibration for %s\n", 1375 is2t ? "2T2R" : "1T1R"); 1376 1377 /* Save ADDA parameters, turn Path A ADDA on */ 1378 rtl92d_phy_save_adda_registers(hw, adda_reg, 1379 rtlphy->adda_backup, 1380 IQK_ADDA_REG_NUM); 1381 rtl92d_phy_save_mac_registers(hw, iqk_mac_reg, 1382 rtlphy->iqk_mac_backup); 1383 rtl92d_phy_save_adda_registers(hw, iqk_bb_reg, 1384 rtlphy->iqk_bb_backup, 1385 IQK_BB_REG_NUM); 1386 } 1387 rtl92d_phy_path_adda_on(hw, adda_reg, true, is2t); 1388 1389 rtl_set_bbreg(hw, RPDP_ANTA, MASKDWORD, 0x01017038); 1390 1391 if (t == 0) 1392 rtlphy->rfpi_enable = (u8)rtl_get_bbreg(hw, 1393 RFPGA0_XA_HSSIPARAMETER1, BIT(8)); 1394 1395 /* Switch BB to PI mode to do IQ Calibration. */ 1396 if (!rtlphy->rfpi_enable) 1397 _rtl92du_phy_pimode_switch(hw, true); 1398 1399 rtl92du_phy_set_bb_reg_1byte(hw, RFPGA0_RFMOD, BCCKEN, 0x00); 1400 rtl_set_bbreg(hw, ROFDM0_TRXPATHENABLE, MASKDWORD, 0x03a05600); 1401 rtl_set_bbreg(hw, ROFDM0_TRMUXPAR, MASKDWORD, 0x000800e4); 1402 rtl_set_bbreg(hw, RFPGA0_XCD_RFINTERFACESW, MASKDWORD, 0x22204000); 1403 rtl_set_bbreg(hw, RFPGA0_ANALOGPARAMETER4, 0xf00000, 0x0f); 1404 if (is2t) { 1405 rtl_set_bbreg(hw, RFPGA0_XA_LSSIPARAMETER, MASKDWORD, 1406 0x00010000); 1407 rtl_set_bbreg(hw, RFPGA0_XB_LSSIPARAMETER, MASKDWORD, 1408 0x00010000); 1409 } 1410 1411 /* MAC settings */ 1412 rtl92d_phy_mac_setting_calibration(hw, iqk_mac_reg, 1413 rtlphy->iqk_mac_backup); 1414 1415 /* Page B init */ 1416 rtl_set_bbreg(hw, RCONFIG_ANTA, MASKDWORD, 0x0f600000); 1417 if (is2t) 1418 rtl_set_bbreg(hw, RCONFIG_ANTB, MASKDWORD, 0x0f600000); 1419 1420 /* IQ calibration setting */ 1421 RTPRINT(rtlpriv, FINIT, INIT_IQK, "IQK setting!\n"); 1422 rtl_set_bbreg(hw, RFPGA0_IQK, MASKH3BYTES, 0x808000); 1423 rtl_set_bbreg(hw, RTX_IQK, MASKDWORD, 0x01007c00); 1424 rtl_set_bbreg(hw, RRX_IQK, MASKDWORD, 0x01004800); 1425 1426 for (i = 0; i < retrycount; i++) { 1427 patha_ok = _rtl92du_phy_patha_iqk(hw, is2t); 1428 if (patha_ok == 0x03) { 1429 RTPRINT(rtlpriv, FINIT, INIT_IQK, 1430 "Path A IQK Success!!\n"); 1431 result[t][0] = rtl_get_bbreg(hw, RTX_POWER_BEFORE_IQK_A, 1432 MASK_IQK_RESULT); 1433 result[t][1] = rtl_get_bbreg(hw, RTX_POWER_AFTER_IQK_A, 1434 MASK_IQK_RESULT); 1435 result[t][2] = rtl_get_bbreg(hw, RRX_POWER_BEFORE_IQK_A_2, 1436 MASK_IQK_RESULT); 1437 result[t][3] = rtl_get_bbreg(hw, RRX_POWER_AFTER_IQK_A_2, 1438 MASK_IQK_RESULT); 1439 break; 1440 } else if (i == (retrycount - 1) && patha_ok == 0x01) { 1441 /* Tx IQK OK */ 1442 RTPRINT(rtlpriv, FINIT, INIT_IQK, 1443 "Path A IQK Only Tx Success!!\n"); 1444 1445 result[t][0] = rtl_get_bbreg(hw, RTX_POWER_BEFORE_IQK_A, 1446 MASK_IQK_RESULT); 1447 result[t][1] = rtl_get_bbreg(hw, RTX_POWER_AFTER_IQK_A, 1448 MASK_IQK_RESULT); 1449 } 1450 } 1451 if (patha_ok == 0x00) 1452 RTPRINT(rtlpriv, FINIT, INIT_IQK, "Path A IQK failed!!\n"); 1453 1454 if (is2t) { 1455 _rtl92du_phy_patha_standby(hw); 1456 /* Turn Path B ADDA on */ 1457 rtl92d_phy_path_adda_on(hw, adda_reg, false, is2t); 1458 1459 for (i = 0; i < retrycount; i++) { 1460 pathb_ok = _rtl92du_phy_pathb_iqk(hw); 1461 if (pathb_ok == 0x03) { 1462 RTPRINT(rtlpriv, FINIT, INIT_IQK, 1463 "Path B IQK Success!!\n"); 1464 result[t][4] = rtl_get_bbreg(hw, RTX_POWER_BEFORE_IQK_B, 1465 MASK_IQK_RESULT); 1466 result[t][5] = rtl_get_bbreg(hw, RTX_POWER_AFTER_IQK_B, 1467 MASK_IQK_RESULT); 1468 result[t][6] = rtl_get_bbreg(hw, RRX_POWER_BEFORE_IQK_B_2, 1469 MASK_IQK_RESULT); 1470 result[t][7] = rtl_get_bbreg(hw, RRX_POWER_AFTER_IQK_B_2, 1471 MASK_IQK_RESULT); 1472 break; 1473 } else if (i == (retrycount - 1) && pathb_ok == 0x01) { 1474 /* Tx IQK OK */ 1475 RTPRINT(rtlpriv, FINIT, INIT_IQK, 1476 "Path B Only Tx IQK Success!!\n"); 1477 result[t][4] = rtl_get_bbreg(hw, RTX_POWER_BEFORE_IQK_B, 1478 MASK_IQK_RESULT); 1479 result[t][5] = rtl_get_bbreg(hw, RTX_POWER_AFTER_IQK_B, 1480 MASK_IQK_RESULT); 1481 } 1482 } 1483 if (pathb_ok == 0x00) 1484 RTPRINT(rtlpriv, FINIT, INIT_IQK, 1485 "Path B IQK failed!!\n"); 1486 } 1487 1488 /* Back to BB mode, load original value */ 1489 RTPRINT(rtlpriv, FINIT, INIT_IQK, 1490 "IQK:Back to BB mode, load original value!\n"); 1491 1492 rtl_set_bbreg(hw, RFPGA0_IQK, MASKH3BYTES, 0x000000); 1493 1494 if (t != 0) { 1495 /* Switch back BB to SI mode after finish IQ Calibration. */ 1496 if (!rtlphy->rfpi_enable) 1497 _rtl92du_phy_pimode_switch(hw, false); 1498 1499 /* Reload ADDA power saving parameters */ 1500 _rtl92du_phy_reload_adda_registers(hw, adda_reg, 1501 rtlphy->adda_backup, 1502 IQK_ADDA_REG_NUM); 1503 1504 /* Reload MAC parameters */ 1505 _rtl92du_phy_reload_mac_registers(hw, iqk_mac_reg, 1506 rtlphy->iqk_mac_backup); 1507 1508 if (is2t) 1509 _rtl92du_phy_reload_adda_registers(hw, iqk_bb_reg, 1510 rtlphy->iqk_bb_backup, 1511 IQK_BB_REG_NUM); 1512 else 1513 _rtl92du_phy_reload_adda_registers(hw, iqk_bb_reg, 1514 rtlphy->iqk_bb_backup, 1515 IQK_BB_REG_NUM - 1); 1516 1517 /* load 0xe30 IQC default value */ 1518 rtl_set_bbreg(hw, RTX_IQK_TONE_A, MASKDWORD, 0x01008c00); 1519 rtl_set_bbreg(hw, RRX_IQK_TONE_A, MASKDWORD, 0x01008c00); 1520 } 1521 RTPRINT(rtlpriv, FINIT, INIT_IQK, "<==\n"); 1522 } 1523 1524 static void _rtl92du_phy_iq_calibrate_5g_normal(struct ieee80211_hw *hw, 1525 long result[][8], u8 t) 1526 { 1527 static const u32 adda_reg[IQK_ADDA_REG_NUM] = { 1528 RFPGA0_XCD_SWITCHCONTROL, RBLUE_TOOTH, RRX_WAIT_CCA, 1529 RTX_CCK_RFON, RTX_CCK_BBON, RTX_OFDM_RFON, RTX_OFDM_BBON, 1530 RTX_TO_RX, RTX_TO_TX, RRX_CCK, RRX_OFDM, RRX_WAIT_RIFS, 1531 RRX_TO_RX, RSTANDBY, RSLEEP, RPMPD_ANAEN 1532 }; 1533 static const u32 iqk_mac_reg[IQK_MAC_REG_NUM] = { 1534 REG_TXPAUSE, REG_BCN_CTRL, REG_BCN_CTRL_1, REG_GPIO_MUXCFG 1535 }; 1536 static const u32 iqk_bb_reg[IQK_BB_REG_NUM] = { 1537 RFPGA0_XAB_RFINTERFACESW, RFPGA0_XA_RFINTERFACEOE, 1538 RFPGA0_XB_RFINTERFACEOE, ROFDM0_TRMUXPAR, 1539 RFPGA0_XCD_RFINTERFACESW, ROFDM0_TRXPATHENABLE, 1540 RFPGA0_RFMOD, RFPGA0_ANALOGPARAMETER4, 1541 ROFDM0_XAAGCCORE1, ROFDM0_XBAGCCORE1 1542 }; 1543 struct rtl_priv *rtlpriv = rtl_priv(hw); 1544 struct rtl_phy *rtlphy = &rtlpriv->phy; 1545 struct rtl_hal *rtlhal = &rtlpriv->rtlhal; 1546 bool is2t = IS_92D_SINGLEPHY(rtlhal->version); 1547 u8 patha_ok, pathb_ok; 1548 bool rf_path_div; 1549 u32 bbvalue; 1550 1551 /* Note: IQ calibration must be performed after loading 1552 * PHY_REG.txt , and radio_a, radio_b.txt 1553 */ 1554 1555 RTPRINT(rtlpriv, FINIT, INIT_IQK, "IQK for 5G NORMAL:Start!!!\n"); 1556 1557 mdelay(IQK_DELAY_TIME * 20); 1558 1559 if (t == 0) { 1560 bbvalue = rtl_get_bbreg(hw, RFPGA0_RFMOD, MASKDWORD); 1561 RTPRINT(rtlpriv, FINIT, INIT_IQK, "==>0x%08x\n", bbvalue); 1562 RTPRINT(rtlpriv, FINIT, INIT_IQK, "IQ Calibration for %s\n", 1563 is2t ? "2T2R" : "1T1R"); 1564 1565 /* Save ADDA parameters, turn Path A ADDA on */ 1566 rtl92d_phy_save_adda_registers(hw, adda_reg, 1567 rtlphy->adda_backup, 1568 IQK_ADDA_REG_NUM); 1569 rtl92d_phy_save_mac_registers(hw, iqk_mac_reg, 1570 rtlphy->iqk_mac_backup); 1571 if (is2t) 1572 rtl92d_phy_save_adda_registers(hw, iqk_bb_reg, 1573 rtlphy->iqk_bb_backup, 1574 IQK_BB_REG_NUM); 1575 else 1576 rtl92d_phy_save_adda_registers(hw, iqk_bb_reg, 1577 rtlphy->iqk_bb_backup, 1578 IQK_BB_REG_NUM - 1); 1579 } 1580 1581 rf_path_div = rtl_get_bbreg(hw, 0xb30, BIT(27)); 1582 rtl92d_phy_path_adda_on(hw, adda_reg, !rf_path_div, is2t); 1583 1584 if (t == 0) 1585 rtlphy->rfpi_enable = rtl_get_bbreg(hw, 1586 RFPGA0_XA_HSSIPARAMETER1, 1587 BIT(8)); 1588 1589 /* Switch BB to PI mode to do IQ Calibration. */ 1590 if (!rtlphy->rfpi_enable) 1591 _rtl92du_phy_pimode_switch(hw, true); 1592 1593 /* MAC settings */ 1594 rtl92d_phy_mac_setting_calibration(hw, iqk_mac_reg, 1595 rtlphy->iqk_mac_backup); 1596 1597 rtl92du_phy_set_bb_reg_1byte(hw, RFPGA0_RFMOD, BCCKEN, 0x00); 1598 rtl_set_bbreg(hw, ROFDM0_TRXPATHENABLE, MASKDWORD, 0x03a05600); 1599 rtl_set_bbreg(hw, ROFDM0_TRMUXPAR, MASKDWORD, 0x000800e4); 1600 rtl_set_bbreg(hw, RFPGA0_XCD_RFINTERFACESW, MASKDWORD, 0x22208000); 1601 rtl_set_bbreg(hw, RFPGA0_ANALOGPARAMETER4, 0xf00000, 0x0f); 1602 1603 /* Page A AP setting for IQK */ 1604 rtl_set_bbreg(hw, RPDP_ANTA, MASKDWORD, 0); 1605 rtl_set_bbreg(hw, RCONFIG_ANTA, MASKDWORD, 0x20000000); 1606 if (is2t) { 1607 /* Page B AP setting for IQK */ 1608 rtl_set_bbreg(hw, RPDP_ANTB, MASKDWORD, 0); 1609 rtl_set_bbreg(hw, RCONFIG_ANTB, MASKDWORD, 0x20000000); 1610 } 1611 1612 /* IQ calibration setting */ 1613 RTPRINT(rtlpriv, FINIT, INIT_IQK, "IQK setting!\n"); 1614 rtl_set_bbreg(hw, RFPGA0_IQK, MASKH3BYTES, 0x808000); 1615 rtl_set_bbreg(hw, RTX_IQK, MASKDWORD, 0x10007c00); 1616 rtl_set_bbreg(hw, RRX_IQK, MASKDWORD, 0x01004800); 1617 1618 patha_ok = _rtl92du_phy_patha_iqk_5g_normal(hw, is2t); 1619 if (patha_ok == 0x03) { 1620 RTPRINT(rtlpriv, FINIT, INIT_IQK, "Path A IQK Success!!\n"); 1621 result[t][0] = rtl_get_bbreg(hw, RTX_POWER_BEFORE_IQK_A, 1622 MASK_IQK_RESULT); 1623 result[t][1] = rtl_get_bbreg(hw, RTX_POWER_AFTER_IQK_A, 1624 MASK_IQK_RESULT); 1625 result[t][2] = rtl_get_bbreg(hw, RRX_POWER_BEFORE_IQK_A_2, 1626 MASK_IQK_RESULT); 1627 result[t][3] = rtl_get_bbreg(hw, RRX_POWER_AFTER_IQK_A_2, 1628 MASK_IQK_RESULT); 1629 } else if (patha_ok == 0x01) { /* Tx IQK OK */ 1630 RTPRINT(rtlpriv, FINIT, INIT_IQK, 1631 "Path A IQK Only Tx Success!!\n"); 1632 1633 result[t][0] = rtl_get_bbreg(hw, RTX_POWER_BEFORE_IQK_A, 1634 MASK_IQK_RESULT); 1635 result[t][1] = rtl_get_bbreg(hw, RTX_POWER_AFTER_IQK_A, 1636 MASK_IQK_RESULT); 1637 } else { 1638 rtl_set_bbreg(hw, RFPGA0_IQK, MASKH3BYTES, 0x000000); 1639 RTPRINT(rtlpriv, FINIT, INIT_IQK, "0xe70 = %#x\n", 1640 rtl_get_bbreg(hw, RRX_WAIT_CCA, MASKDWORD)); 1641 RTPRINT(rtlpriv, FINIT, INIT_IQK, "RF path A 0x0 = %#x\n", 1642 rtl_get_rfreg(hw, RF90_PATH_A, RF_AC, RFREG_OFFSET_MASK)); 1643 rtl_set_bbreg(hw, RFPGA0_IQK, MASKH3BYTES, 0x808000); 1644 RTPRINT(rtlpriv, FINIT, INIT_IQK, "Path A IQK Fail!!\n"); 1645 } 1646 1647 if (is2t) { 1648 /* _rtl92d_phy_patha_standby(hw); */ 1649 /* Turn Path B ADDA on */ 1650 rtl92d_phy_path_adda_on(hw, adda_reg, false, is2t); 1651 1652 pathb_ok = _rtl92du_phy_pathb_iqk_5g_normal(hw); 1653 if (pathb_ok == 0x03) { 1654 RTPRINT(rtlpriv, FINIT, INIT_IQK, 1655 "Path B IQK Success!!\n"); 1656 result[t][4] = rtl_get_bbreg(hw, RTX_POWER_BEFORE_IQK_B, 1657 MASK_IQK_RESULT); 1658 result[t][5] = rtl_get_bbreg(hw, RTX_POWER_AFTER_IQK_B, 1659 MASK_IQK_RESULT); 1660 result[t][6] = rtl_get_bbreg(hw, RRX_POWER_BEFORE_IQK_B_2, 1661 MASK_IQK_RESULT); 1662 result[t][7] = rtl_get_bbreg(hw, RRX_POWER_AFTER_IQK_B_2, 1663 MASK_IQK_RESULT); 1664 } else if (pathb_ok == 0x01) { /* Tx IQK OK */ 1665 RTPRINT(rtlpriv, FINIT, INIT_IQK, 1666 "Path B Only Tx IQK Success!!\n"); 1667 result[t][4] = rtl_get_bbreg(hw, RTX_POWER_BEFORE_IQK_B, 1668 MASK_IQK_RESULT); 1669 result[t][5] = rtl_get_bbreg(hw, RTX_POWER_AFTER_IQK_B, 1670 MASK_IQK_RESULT); 1671 } else { 1672 RTPRINT(rtlpriv, FINIT, INIT_IQK, 1673 "Path B IQK failed!!\n"); 1674 } 1675 } 1676 1677 /* Back to BB mode, load original value */ 1678 RTPRINT(rtlpriv, FINIT, INIT_IQK, 1679 "IQK:Back to BB mode, load original value!\n"); 1680 rtl_set_bbreg(hw, RFPGA0_IQK, MASKH3BYTES, 0); 1681 1682 if (is2t) 1683 _rtl92du_phy_reload_adda_registers(hw, iqk_bb_reg, 1684 rtlphy->iqk_bb_backup, 1685 IQK_BB_REG_NUM); 1686 else 1687 _rtl92du_phy_reload_adda_registers(hw, iqk_bb_reg, 1688 rtlphy->iqk_bb_backup, 1689 IQK_BB_REG_NUM - 1); 1690 1691 /* path A IQ path to DP block */ 1692 rtl_set_bbreg(hw, RPDP_ANTA, MASKDWORD, 0x010170b8); 1693 if (is2t) /* path B IQ path to DP block */ 1694 rtl_set_bbreg(hw, RPDP_ANTB, MASKDWORD, 0x010170b8); 1695 1696 /* Reload MAC parameters */ 1697 _rtl92du_phy_reload_mac_registers(hw, iqk_mac_reg, 1698 rtlphy->iqk_mac_backup); 1699 1700 /* Switch back BB to SI mode after finish IQ Calibration. */ 1701 if (!rtlphy->rfpi_enable) 1702 _rtl92du_phy_pimode_switch(hw, false); 1703 1704 /* Reload ADDA power saving parameters */ 1705 _rtl92du_phy_reload_adda_registers(hw, adda_reg, 1706 rtlphy->adda_backup, 1707 IQK_ADDA_REG_NUM); 1708 1709 RTPRINT(rtlpriv, FINIT, INIT_IQK, "<==\n"); 1710 } 1711 1712 static bool _rtl92du_phy_simularity_compare(struct ieee80211_hw *hw, 1713 long result[][8], u8 c1, u8 c2) 1714 { 1715 struct rtl_priv *rtlpriv = rtl_priv(hw); 1716 struct rtl_hal *rtlhal = &rtlpriv->rtlhal; 1717 u32 i, j, diff, sim_bitmap, bound, u4temp = 0; 1718 u8 final_candidate[2] = {0xFF, 0xFF}; /* for path A and path B */ 1719 bool is2t = IS_92D_SINGLEPHY(rtlhal->version); 1720 bool bresult = true; 1721 1722 if (is2t) 1723 bound = 8; 1724 else 1725 bound = 4; 1726 1727 sim_bitmap = 0; 1728 1729 for (i = 0; i < bound; i++) { 1730 diff = abs_diff(result[c1][i], result[c2][i]); 1731 1732 if (diff > MAX_TOLERANCE_92D) { 1733 if ((i == 2 || i == 6) && !sim_bitmap) { 1734 if (result[c1][i] + result[c1][i + 1] == 0) 1735 final_candidate[(i / 4)] = c2; 1736 else if (result[c2][i] + result[c2][i + 1] == 0) 1737 final_candidate[(i / 4)] = c1; 1738 else 1739 sim_bitmap = sim_bitmap | (1 << i); 1740 } else { 1741 sim_bitmap = sim_bitmap | (1 << i); 1742 } 1743 } 1744 } 1745 1746 if (sim_bitmap == 0) { 1747 for (i = 0; i < (bound / 4); i++) { 1748 if (final_candidate[i] != 0xFF) { 1749 for (j = i * 4; j < (i + 1) * 4 - 2; j++) 1750 result[3][j] = 1751 result[final_candidate[i]][j]; 1752 bresult = false; 1753 } 1754 } 1755 1756 for (i = 0; i < bound; i++) 1757 u4temp += result[c1][i] + result[c2][i]; 1758 1759 if (u4temp == 0) /* IQK fail for c1 & c2 */ 1760 bresult = false; 1761 1762 return bresult; 1763 } 1764 1765 if (!(sim_bitmap & 0x0F)) { /* path A OK */ 1766 for (i = 0; i < 4; i++) 1767 result[3][i] = result[c1][i]; 1768 } else if (!(sim_bitmap & 0x03)) { /* path A, Tx OK */ 1769 for (i = 0; i < 2; i++) 1770 result[3][i] = result[c1][i]; 1771 } 1772 1773 if (!(sim_bitmap & 0xF0) && is2t) { /* path B OK */ 1774 for (i = 4; i < 8; i++) 1775 result[3][i] = result[c1][i]; 1776 } else if (!(sim_bitmap & 0x30)) { /* path B, Tx OK */ 1777 for (i = 4; i < 6; i++) 1778 result[3][i] = result[c1][i]; 1779 } 1780 1781 return false; 1782 } 1783 1784 static void _rtl92du_phy_patha_fill_iqk_matrix_5g_normal(struct ieee80211_hw *hw, 1785 bool iqk_ok, 1786 long result[][8], 1787 u8 final_candidate, 1788 bool txonly) 1789 { 1790 struct rtl_priv *rtlpriv = rtl_priv(hw); 1791 struct rtl_hal *rtlhal = &rtlpriv->rtlhal; 1792 u32 val_x, reg; 1793 int val_y; 1794 1795 RTPRINT(rtlpriv, FINIT, INIT_IQK, 1796 "Path A IQ Calibration %s !\n", iqk_ok ? "Success" : "Failed"); 1797 if (iqk_ok && final_candidate != 0xFF) { 1798 val_x = result[final_candidate][0]; 1799 if ((val_x & 0x00000200) != 0) 1800 val_x = val_x | 0xFFFFFC00; 1801 1802 RTPRINT(rtlpriv, FINIT, INIT_IQK, "X = 0x%x\n", val_x); 1803 rtl_set_bbreg(hw, RTX_IQK_TONE_A, 0x3FF0000, val_x); 1804 rtl_set_bbreg(hw, ROFDM0_ECCATHRESHOLD, BIT(24), 0); 1805 1806 val_y = result[final_candidate][1]; 1807 if ((val_y & 0x00000200) != 0) 1808 val_y = val_y | 0xFFFFFC00; 1809 1810 /* path B IQK result + 3 */ 1811 if (rtlhal->current_bandtype == BAND_ON_5G) 1812 val_y += 3; 1813 1814 RTPRINT(rtlpriv, FINIT, INIT_IQK, "Y = 0x%x\n", val_y); 1815 1816 rtl_set_bbreg(hw, RTX_IQK_TONE_A, 0x3FF, val_y); 1817 rtl_set_bbreg(hw, ROFDM0_ECCATHRESHOLD, BIT(26), 0); 1818 1819 RTPRINT(rtlpriv, FINIT, INIT_IQK, "0xe30 = 0x%x\n", 1820 rtl_get_bbreg(hw, RTX_IQK_TONE_A, MASKDWORD)); 1821 1822 if (txonly) { 1823 RTPRINT(rtlpriv, FINIT, INIT_IQK, "only Tx OK\n"); 1824 return; 1825 } 1826 1827 reg = result[final_candidate][2]; 1828 rtl_set_bbreg(hw, ROFDM0_XARXIQIMBALANCE, 0x3FF, reg); 1829 reg = result[final_candidate][3] & 0x3F; 1830 rtl_set_bbreg(hw, ROFDM0_XARXIQIMBALANCE, 0xFC00, reg); 1831 reg = (result[final_candidate][3] >> 6) & 0xF; 1832 rtl_set_bbreg(hw, ROFDM0_RXIQEXTANTA, 0xF0000000, reg); 1833 } else { 1834 RTPRINT(rtlpriv, FINIT, INIT_IQK, 1835 "%s: Tx/Rx fail restore default value\n", __func__); 1836 1837 rtl_set_bbreg(hw, RTX_IQK_TONE_A, MASKDWORD, 0x19008c00); 1838 rtl_set_bbreg(hw, ROFDM0_XARXIQIMBALANCE, MASKDWORD, 0x40000100); 1839 rtl_set_bbreg(hw, RRX_IQK_TONE_A, MASKDWORD, 0x19008c00); 1840 } 1841 } 1842 1843 static void _rtl92du_phy_patha_fill_iqk_matrix(struct ieee80211_hw *hw, 1844 bool iqk_ok, long result[][8], 1845 u8 final_candidate, bool txonly) 1846 { 1847 struct rtl_priv *rtlpriv = rtl_priv(hw); 1848 struct rtl_hal *rtlhal = &rtlpriv->rtlhal; 1849 u32 oldval_0, val_x, tx0_a, reg; 1850 long val_y, tx0_c; 1851 bool is2t = IS_92D_SINGLEPHY(rtlhal->version) || 1852 rtlhal->macphymode == DUALMAC_DUALPHY; 1853 1854 if (rtlhal->current_bandtype == BAND_ON_5G) { 1855 _rtl92du_phy_patha_fill_iqk_matrix_5g_normal(hw, iqk_ok, result, 1856 final_candidate, 1857 txonly); 1858 return; 1859 } 1860 1861 RTPRINT(rtlpriv, FINIT, INIT_IQK, 1862 "Path A IQ Calibration %s !\n", iqk_ok ? "Success" : "Failed"); 1863 if (final_candidate == 0xFF || !iqk_ok) 1864 return; 1865 1866 /* OFDM0_D */ 1867 oldval_0 = rtl_get_bbreg(hw, ROFDM0_XATXIQIMBALANCE, 0xffc00000); 1868 1869 val_x = result[final_candidate][0]; 1870 if ((val_x & 0x00000200) != 0) 1871 val_x = val_x | 0xFFFFFC00; 1872 1873 tx0_a = (val_x * oldval_0) >> 8; 1874 RTPRINT(rtlpriv, FINIT, INIT_IQK, 1875 "X = 0x%x, tx0_a = 0x%x, oldval_0 0x%x\n", 1876 val_x, tx0_a, oldval_0); 1877 rtl_set_bbreg(hw, ROFDM0_XATXIQIMBALANCE, 0x3FF, tx0_a); 1878 rtl_set_bbreg(hw, ROFDM0_ECCATHRESHOLD, BIT(24), 1879 ((val_x * oldval_0 >> 7) & 0x1)); 1880 1881 val_y = result[final_candidate][1]; 1882 if ((val_y & 0x00000200) != 0) 1883 val_y = val_y | 0xFFFFFC00; 1884 1885 /* path B IQK result + 3 */ 1886 if (rtlhal->interfaceindex == 1 && 1887 rtlhal->current_bandtype == BAND_ON_5G) 1888 val_y += 3; 1889 1890 tx0_c = (val_y * oldval_0) >> 8; 1891 RTPRINT(rtlpriv, FINIT, INIT_IQK, 1892 "Y = 0x%lx, tx0_c = 0x%lx\n", 1893 val_y, tx0_c); 1894 1895 rtl_set_bbreg(hw, ROFDM0_XCTXAFE, 0xF0000000, (tx0_c & 0x3C0) >> 6); 1896 rtl_set_bbreg(hw, ROFDM0_XATXIQIMBALANCE, 0x003F0000, tx0_c & 0x3F); 1897 if (is2t) 1898 rtl_set_bbreg(hw, ROFDM0_ECCATHRESHOLD, BIT(26), 1899 (val_y * oldval_0 >> 7) & 0x1); 1900 1901 RTPRINT(rtlpriv, FINIT, INIT_IQK, "0xC80 = 0x%x\n", 1902 rtl_get_bbreg(hw, ROFDM0_XATXIQIMBALANCE, 1903 MASKDWORD)); 1904 1905 if (txonly) { 1906 RTPRINT(rtlpriv, FINIT, INIT_IQK, "only Tx OK\n"); 1907 return; 1908 } 1909 1910 reg = result[final_candidate][2]; 1911 rtl_set_bbreg(hw, ROFDM0_XARXIQIMBALANCE, 0x3FF, reg); 1912 reg = result[final_candidate][3] & 0x3F; 1913 rtl_set_bbreg(hw, ROFDM0_XARXIQIMBALANCE, 0xFC00, reg); 1914 reg = (result[final_candidate][3] >> 6) & 0xF; 1915 rtl_set_bbreg(hw, ROFDM0_RXIQEXTANTA, 0xF0000000, reg); 1916 } 1917 1918 static void _rtl92du_phy_pathb_fill_iqk_matrix_5g_normal(struct ieee80211_hw *hw, 1919 bool iqk_ok, 1920 long result[][8], 1921 u8 final_candidate, 1922 bool txonly) 1923 { 1924 struct rtl_priv *rtlpriv = rtl_priv(hw); 1925 struct rtl_hal *rtlhal = &rtlpriv->rtlhal; 1926 u32 val_x, reg; 1927 int val_y; 1928 1929 RTPRINT(rtlpriv, FINIT, INIT_IQK, 1930 "Path B IQ Calibration %s !\n", iqk_ok ? "Success" : "Failed"); 1931 if (iqk_ok && final_candidate != 0xFF) { 1932 val_x = result[final_candidate][4]; 1933 if ((val_x & 0x00000200) != 0) 1934 val_x = val_x | 0xFFFFFC00; 1935 1936 RTPRINT(rtlpriv, FINIT, INIT_IQK, "X = 0x%x\n", val_x); 1937 rtl_set_bbreg(hw, RTX_IQK_TONE_B, 0x3FF0000, val_x); 1938 rtl_set_bbreg(hw, ROFDM0_ECCATHRESHOLD, BIT(28), 0); 1939 1940 val_y = result[final_candidate][5]; 1941 if ((val_y & 0x00000200) != 0) 1942 val_y = val_y | 0xFFFFFC00; 1943 1944 /* path B IQK result + 3 */ 1945 if (rtlhal->current_bandtype == BAND_ON_5G) 1946 val_y += 3; 1947 1948 RTPRINT(rtlpriv, FINIT, INIT_IQK, "Y = 0x%x\n", val_y); 1949 1950 rtl_set_bbreg(hw, RTX_IQK_TONE_B, 0x3FF, val_y); 1951 rtl_set_bbreg(hw, ROFDM0_ECCATHRESHOLD, BIT(30), 0); 1952 1953 RTPRINT(rtlpriv, FINIT, INIT_IQK, "0xe50 = 0x%x\n", 1954 rtl_get_bbreg(hw, RTX_IQK_TONE_B, MASKDWORD)); 1955 1956 if (txonly) { 1957 RTPRINT(rtlpriv, FINIT, INIT_IQK, "only Tx OK\n"); 1958 return; 1959 } 1960 1961 reg = result[final_candidate][6]; 1962 rtl_set_bbreg(hw, ROFDM0_XBRXIQIMBALANCE, 0x3FF, reg); 1963 reg = result[final_candidate][7] & 0x3F; 1964 rtl_set_bbreg(hw, ROFDM0_XBRXIQIMBALANCE, 0xFC00, reg); 1965 reg = (result[final_candidate][7] >> 6) & 0xF; 1966 rtl_set_bbreg(hw, ROFDM0_AGCRSSITABLE, 0x0000F000, reg); 1967 } else { 1968 RTPRINT(rtlpriv, FINIT, INIT_IQK, 1969 "%s: Tx/Rx fail restore default value\n", __func__); 1970 1971 rtl_set_bbreg(hw, RTX_IQK_TONE_B, MASKDWORD, 0x19008c00); 1972 rtl_set_bbreg(hw, ROFDM0_XBRXIQIMBALANCE, MASKDWORD, 0x40000100); 1973 rtl_set_bbreg(hw, RRX_IQK_TONE_B, MASKDWORD, 0x19008c00); 1974 } 1975 } 1976 1977 static void _rtl92du_phy_pathb_fill_iqk_matrix(struct ieee80211_hw *hw, 1978 bool iqk_ok, long result[][8], 1979 u8 final_candidate, bool txonly) 1980 { 1981 struct rtl_priv *rtlpriv = rtl_priv(hw); 1982 struct rtl_hal *rtlhal = &rtlpriv->rtlhal; 1983 u32 oldval_1, val_x, tx1_a, reg; 1984 long val_y, tx1_c; 1985 1986 if (rtlhal->current_bandtype == BAND_ON_5G) { 1987 _rtl92du_phy_pathb_fill_iqk_matrix_5g_normal(hw, iqk_ok, result, 1988 final_candidate, 1989 txonly); 1990 return; 1991 } 1992 1993 RTPRINT(rtlpriv, FINIT, INIT_IQK, "Path B IQ Calibration %s !\n", 1994 iqk_ok ? "Success" : "Failed"); 1995 1996 if (final_candidate == 0xFF || !iqk_ok) 1997 return; 1998 1999 oldval_1 = rtl_get_bbreg(hw, ROFDM0_XBTXIQIMBALANCE, 0xffc00000); 2000 2001 val_x = result[final_candidate][4]; 2002 if ((val_x & 0x00000200) != 0) 2003 val_x = val_x | 0xFFFFFC00; 2004 2005 tx1_a = (val_x * oldval_1) >> 8; 2006 RTPRINT(rtlpriv, FINIT, INIT_IQK, "X = 0x%x, tx1_a = 0x%x\n", 2007 val_x, tx1_a); 2008 rtl_set_bbreg(hw, ROFDM0_XBTXIQIMBALANCE, 0x3FF, tx1_a); 2009 rtl_set_bbreg(hw, ROFDM0_ECCATHRESHOLD, BIT(28), 2010 (val_x * oldval_1 >> 7) & 0x1); 2011 2012 val_y = result[final_candidate][5]; 2013 if ((val_y & 0x00000200) != 0) 2014 val_y = val_y | 0xFFFFFC00; 2015 2016 if (rtlhal->current_bandtype == BAND_ON_5G) 2017 val_y += 3; 2018 2019 tx1_c = (val_y * oldval_1) >> 8; 2020 RTPRINT(rtlpriv, FINIT, INIT_IQK, "Y = 0x%lx, tx1_c = 0x%lx\n", 2021 val_y, tx1_c); 2022 2023 rtl_set_bbreg(hw, ROFDM0_XDTXAFE, 0xF0000000, (tx1_c & 0x3C0) >> 6); 2024 rtl_set_bbreg(hw, ROFDM0_XBTXIQIMBALANCE, 0x003F0000, tx1_c & 0x3F); 2025 rtl_set_bbreg(hw, ROFDM0_ECCATHRESHOLD, BIT(30), 2026 (val_y * oldval_1 >> 7) & 0x1); 2027 2028 if (txonly) 2029 return; 2030 2031 reg = result[final_candidate][6]; 2032 rtl_set_bbreg(hw, ROFDM0_XBRXIQIMBALANCE, 0x3FF, reg); 2033 reg = result[final_candidate][7] & 0x3F; 2034 rtl_set_bbreg(hw, ROFDM0_XBRXIQIMBALANCE, 0xFC00, reg); 2035 reg = (result[final_candidate][7] >> 6) & 0xF; 2036 rtl_set_bbreg(hw, ROFDM0_AGCRSSITABLE, 0x0000F000, reg); 2037 } 2038 2039 void rtl92du_phy_iq_calibrate(struct ieee80211_hw *hw) 2040 { 2041 long rege94, rege9c, regea4, regeac, regeb4; 2042 bool is12simular, is13simular, is23simular; 2043 struct rtl_priv *rtlpriv = rtl_priv(hw); 2044 struct rtl_hal *rtlhal = &rtlpriv->rtlhal; 2045 long regebc, regec4, regecc, regtmp = 0; 2046 struct rtl_phy *rtlphy = &rtlpriv->phy; 2047 u8 i, final_candidate, indexforchannel; 2048 bool patha_ok, pathb_ok; 2049 long result[4][8] = {}; 2050 2051 RTPRINT(rtlpriv, FINIT, INIT_IQK, 2052 "IQK:Start!!!channel %d\n", rtlphy->current_channel); 2053 2054 final_candidate = 0xff; 2055 patha_ok = false; 2056 pathb_ok = false; 2057 is12simular = false; 2058 is23simular = false; 2059 is13simular = false; 2060 RTPRINT(rtlpriv, FINIT, INIT_IQK, 2061 "IQK !!!currentband %d\n", rtlhal->current_bandtype); 2062 2063 for (i = 0; i < 3; i++) { 2064 if (rtlhal->current_bandtype == BAND_ON_5G) { 2065 _rtl92du_phy_iq_calibrate_5g_normal(hw, result, i); 2066 } else if (rtlhal->current_bandtype == BAND_ON_2_4G) { 2067 if (IS_92D_SINGLEPHY(rtlhal->version)) 2068 _rtl92du_phy_iq_calibrate(hw, result, i, true); 2069 else 2070 _rtl92du_phy_iq_calibrate(hw, result, i, false); 2071 } 2072 2073 if (i == 1) { 2074 is12simular = _rtl92du_phy_simularity_compare(hw, result, 2075 0, 1); 2076 if (is12simular) { 2077 final_candidate = 0; 2078 break; 2079 } 2080 } 2081 2082 if (i == 2) { 2083 is13simular = _rtl92du_phy_simularity_compare(hw, result, 2084 0, 2); 2085 if (is13simular) { 2086 final_candidate = 0; 2087 break; 2088 } 2089 2090 is23simular = _rtl92du_phy_simularity_compare(hw, result, 2091 1, 2); 2092 if (is23simular) { 2093 final_candidate = 1; 2094 } else { 2095 for (i = 0; i < 8; i++) 2096 regtmp += result[3][i]; 2097 2098 if (regtmp != 0) 2099 final_candidate = 3; 2100 else 2101 final_candidate = 0xFF; 2102 } 2103 } 2104 } 2105 2106 for (i = 0; i < 4; i++) { 2107 rege94 = result[i][0]; 2108 rege9c = result[i][1]; 2109 regea4 = result[i][2]; 2110 regeac = result[i][3]; 2111 regeb4 = result[i][4]; 2112 regebc = result[i][5]; 2113 regec4 = result[i][6]; 2114 regecc = result[i][7]; 2115 RTPRINT(rtlpriv, FINIT, INIT_IQK, 2116 "IQK: rege94=%lx rege9c=%lx regea4=%lx regeac=%lx regeb4=%lx regebc=%lx regec4=%lx regecc=%lx\n", 2117 rege94, rege9c, regea4, regeac, regeb4, regebc, regec4, 2118 regecc); 2119 } 2120 2121 if (final_candidate != 0xff) { 2122 rege94 = result[final_candidate][0]; 2123 rtlphy->reg_e94 = rege94; 2124 rege9c = result[final_candidate][1]; 2125 rtlphy->reg_e9c = rege9c; 2126 regea4 = result[final_candidate][2]; 2127 regeac = result[final_candidate][3]; 2128 regeb4 = result[final_candidate][4]; 2129 rtlphy->reg_eb4 = regeb4; 2130 regebc = result[final_candidate][5]; 2131 rtlphy->reg_ebc = regebc; 2132 regec4 = result[final_candidate][6]; 2133 regecc = result[final_candidate][7]; 2134 2135 RTPRINT(rtlpriv, FINIT, INIT_IQK, 2136 "IQK: final_candidate is %x\n", final_candidate); 2137 RTPRINT(rtlpriv, FINIT, INIT_IQK, 2138 "IQK: rege94=%lx rege9c=%lx regea4=%lx regeac=%lx regeb4=%lx regebc=%lx regec4=%lx regecc=%lx\n", 2139 rege94, rege9c, regea4, regeac, regeb4, regebc, regec4, 2140 regecc); 2141 2142 patha_ok = true; 2143 pathb_ok = true; 2144 } else { 2145 rtlphy->reg_e94 = 0x100; 2146 rtlphy->reg_eb4 = 0x100; /* X default value */ 2147 rtlphy->reg_e9c = 0x0; 2148 rtlphy->reg_ebc = 0x0; /* Y default value */ 2149 } 2150 if (rege94 != 0 /*&& regea4 != 0*/) 2151 _rtl92du_phy_patha_fill_iqk_matrix(hw, patha_ok, result, 2152 final_candidate, 2153 regea4 == 0); 2154 if (IS_92D_SINGLEPHY(rtlhal->version) && 2155 regeb4 != 0 /*&& regec4 != 0*/) 2156 _rtl92du_phy_pathb_fill_iqk_matrix(hw, pathb_ok, result, 2157 final_candidate, 2158 regec4 == 0); 2159 2160 if (final_candidate != 0xFF) { 2161 indexforchannel = 2162 rtl92d_get_rightchnlplace_for_iqk(rtlphy->current_channel); 2163 2164 for (i = 0; i < IQK_MATRIX_REG_NUM; i++) 2165 rtlphy->iqk_matrix[indexforchannel].value[0][i] = 2166 result[final_candidate][i]; 2167 2168 rtlphy->iqk_matrix[indexforchannel].iqk_done = true; 2169 2170 rtl_dbg(rtlpriv, COMP_SCAN | COMP_MLME, DBG_LOUD, 2171 "IQK OK indexforchannel %d\n", indexforchannel); 2172 } 2173 } 2174 2175 void rtl92du_phy_reload_iqk_setting(struct ieee80211_hw *hw, u8 channel) 2176 { 2177 struct rtl_priv *rtlpriv = rtl_priv(hw); 2178 struct rtl_hal *rtlhal = &rtlpriv->rtlhal; 2179 struct rtl_phy *rtlphy = &rtlpriv->phy; 2180 struct rtl_mac *mac = rtl_mac(rtlpriv); 2181 u8 indexforchannel; 2182 bool need_iqk; 2183 2184 rtl_dbg(rtlpriv, COMP_CMD, DBG_LOUD, "channel %d\n", channel); 2185 /*------Do IQK for normal chip and test chip 5G band------- */ 2186 2187 indexforchannel = rtl92d_get_rightchnlplace_for_iqk(channel); 2188 rtl_dbg(rtlpriv, COMP_CMD, DBG_LOUD, "indexforchannel %d done %d\n", 2189 indexforchannel, 2190 rtlphy->iqk_matrix[indexforchannel].iqk_done); 2191 2192 /* We need to do IQK if we're about to connect to a network on 5 GHz. 2193 * On 5 GHz a channel switch outside of scanning happens only before 2194 * connecting. 2195 */ 2196 need_iqk = !mac->act_scanning; 2197 2198 if (!rtlphy->iqk_matrix[indexforchannel].iqk_done && need_iqk) { 2199 rtl_dbg(rtlpriv, COMP_SCAN | COMP_INIT, DBG_LOUD, 2200 "Do IQK Matrix reg for channel:%d....\n", channel); 2201 rtl92du_phy_iq_calibrate(hw); 2202 return; 2203 } 2204 2205 /* Just load the value. */ 2206 /* 2G band just load once. */ 2207 if ((!rtlhal->load_imrandiqk_setting_for2g && indexforchannel == 0) || 2208 indexforchannel > 0) { 2209 rtl_dbg(rtlpriv, COMP_SCAN, DBG_LOUD, 2210 "Just Read IQK Matrix reg for channel:%d....\n", 2211 channel); 2212 2213 if (rtlphy->iqk_matrix[indexforchannel].value[0][0] != 0) 2214 _rtl92du_phy_patha_fill_iqk_matrix(hw, true, 2215 rtlphy->iqk_matrix[indexforchannel].value, 0, 2216 rtlphy->iqk_matrix[indexforchannel].value[0][2] == 0); 2217 2218 if (IS_92D_SINGLEPHY(rtlhal->version) && 2219 rtlphy->iqk_matrix[indexforchannel].value[0][4] != 0) 2220 _rtl92du_phy_pathb_fill_iqk_matrix(hw, true, 2221 rtlphy->iqk_matrix[indexforchannel].value, 0, 2222 rtlphy->iqk_matrix[indexforchannel].value[0][6] == 0); 2223 } 2224 rtl_dbg(rtlpriv, COMP_CMD, DBG_LOUD, "<====\n"); 2225 } 2226 2227 static void _rtl92du_phy_reload_lck_setting(struct ieee80211_hw *hw, u8 channel) 2228 { 2229 struct rtl_priv *rtlpriv = rtl_priv(hw); 2230 struct rtl_hal *rtlhal = &rtlpriv->rtlhal; 2231 u8 erfpath = rtlhal->current_bandtype == BAND_ON_5G ? RF90_PATH_A : 2232 IS_92D_SINGLEPHY(rtlhal->version) ? RF90_PATH_B : RF90_PATH_A; 2233 bool bneed_powerdown_radio = false; 2234 u32 u4tmp, u4regvalue; 2235 2236 rtl_dbg(rtlpriv, COMP_CMD, DBG_LOUD, "path %d\n", erfpath); 2237 RTPRINT(rtlpriv, FINIT, INIT_IQK, "band type = %d\n", 2238 rtlpriv->rtlhal.current_bandtype); 2239 RTPRINT(rtlpriv, FINIT, INIT_IQK, "channel = %d\n", channel); 2240 2241 if (rtlpriv->rtlhal.current_bandtype == BAND_ON_5G) {/* Path-A for 5G */ 2242 u4tmp = rtlpriv->curveindex_5g[channel - 1]; 2243 RTPRINT(rtlpriv, FINIT, INIT_IQK, 2244 "ver 1 set RF-A, 5G, 0x28 = 0x%x !!\n", u4tmp); 2245 2246 if (rtlpriv->rtlhal.macphymode == DUALMAC_DUALPHY && 2247 rtlpriv->rtlhal.interfaceindex == 1) { 2248 bneed_powerdown_radio = 2249 rtl92du_phy_enable_anotherphy(hw, false); 2250 rtlpriv->rtlhal.during_mac1init_radioa = true; 2251 /* asume no this case */ 2252 if (bneed_powerdown_radio) 2253 rtl92d_phy_enable_rf_env(hw, erfpath, 2254 &u4regvalue); 2255 } 2256 2257 rtl_set_rfreg(hw, erfpath, RF_SYN_G4, 0x3f800, u4tmp); 2258 2259 if (bneed_powerdown_radio) { 2260 rtl92d_phy_restore_rf_env(hw, erfpath, &u4regvalue); 2261 rtl92du_phy_powerdown_anotherphy(hw, false); 2262 } 2263 } else if (rtlpriv->rtlhal.current_bandtype == BAND_ON_2_4G) { 2264 u4tmp = rtlpriv->curveindex_2g[channel - 1]; 2265 RTPRINT(rtlpriv, FINIT, INIT_IQK, 2266 "ver 3 set RF-B, 2G, 0x28 = 0x%x !!\n", u4tmp); 2267 2268 if (rtlpriv->rtlhal.macphymode == DUALMAC_DUALPHY && 2269 rtlpriv->rtlhal.interfaceindex == 0) { 2270 bneed_powerdown_radio = 2271 rtl92du_phy_enable_anotherphy(hw, true); 2272 rtlpriv->rtlhal.during_mac0init_radiob = true; 2273 if (bneed_powerdown_radio) 2274 rtl92d_phy_enable_rf_env(hw, erfpath, 2275 &u4regvalue); 2276 } 2277 2278 rtl_set_rfreg(hw, erfpath, RF_SYN_G4, 0x3f800, u4tmp); 2279 2280 RTPRINT(rtlpriv, FINIT, INIT_IQK, 2281 "ver 3 set RF-B, 2G, 0x28 = 0x%x !!\n", 2282 rtl_get_rfreg(hw, erfpath, RF_SYN_G4, 0x3f800)); 2283 2284 if (bneed_powerdown_radio) { 2285 rtl92d_phy_restore_rf_env(hw, erfpath, &u4regvalue); 2286 rtl92du_phy_powerdown_anotherphy(hw, true); 2287 } 2288 } 2289 rtl_dbg(rtlpriv, COMP_CMD, DBG_LOUD, "<====\n"); 2290 } 2291 2292 static void _rtl92du_phy_lc_calibrate_sw(struct ieee80211_hw *hw, bool is2t) 2293 { 2294 struct rtl_priv *rtlpriv = rtl_priv(hw); 2295 struct rtl_hal *rtlhal = &rtlpriv->rtlhal; 2296 u32 curvecount_val[CV_CURVE_CNT * 2]; 2297 u16 timeout = 800, timecount = 0; 2298 u32 u4tmp, offset, rf_syn_g4[2]; 2299 u8 tmpreg, index, rf_mode[2]; 2300 u8 path = is2t ? 2 : 1; 2301 u8 i; 2302 2303 /* Check continuous TX and Packet TX */ 2304 tmpreg = rtl_read_byte(rtlpriv, 0xd03); 2305 if ((tmpreg & 0x70) != 0) 2306 /* if Deal with contisuous TX case, disable all continuous TX */ 2307 rtl_write_byte(rtlpriv, 0xd03, tmpreg & 0x8F); 2308 else 2309 /* if Deal with Packet TX case, block all queues */ 2310 rtl_write_byte(rtlpriv, REG_TXPAUSE, 0xFF); 2311 2312 rtl_set_bbreg(hw, RFPGA0_ANALOGPARAMETER4, 0xF00000, 0x0F); 2313 2314 for (index = 0; index < path; index++) { 2315 /* 1. Read original RF mode */ 2316 offset = index == 0 ? ROFDM0_XAAGCCORE1 : ROFDM0_XBAGCCORE1; 2317 rf_mode[index] = rtl_read_byte(rtlpriv, offset); 2318 2319 /* 2. Set RF mode = standby mode */ 2320 rtl_set_rfreg(hw, (enum radio_path)index, RF_AC, 2321 RFREG_OFFSET_MASK, 0x010000); 2322 2323 rf_syn_g4[index] = rtl_get_rfreg(hw, index, RF_SYN_G4, 2324 RFREG_OFFSET_MASK); 2325 rtl_set_rfreg(hw, index, RF_SYN_G4, 0x700, 0x7); 2326 2327 /* switch CV-curve control by LC-calibration */ 2328 rtl_set_rfreg(hw, (enum radio_path)index, RF_SYN_G7, 2329 BIT(17), 0x0); 2330 2331 /* 4. Set LC calibration begin */ 2332 rtl_set_rfreg(hw, (enum radio_path)index, RF_CHNLBW, 2333 0x08000, 0x01); 2334 } 2335 2336 for (index = 0; index < path; index++) { 2337 u4tmp = rtl_get_rfreg(hw, (enum radio_path)index, RF_SYN_G6, 2338 RFREG_OFFSET_MASK); 2339 2340 while ((!(u4tmp & BIT(11))) && timecount <= timeout) { 2341 mdelay(50); 2342 timecount += 50; 2343 u4tmp = rtl_get_rfreg(hw, (enum radio_path)index, 2344 RF_SYN_G6, RFREG_OFFSET_MASK); 2345 } 2346 RTPRINT(rtlpriv, FINIT, INIT_IQK, 2347 "PHY_LCK finish delay for %d ms=2\n", timecount); 2348 } 2349 2350 if ((tmpreg & 0x70) != 0) 2351 rtl_write_byte(rtlpriv, 0xd03, tmpreg); 2352 else /* Deal with Packet TX case */ 2353 rtl_write_byte(rtlpriv, REG_TXPAUSE, 0x00); 2354 2355 rtl_set_bbreg(hw, RFPGA0_ANALOGPARAMETER4, 0xF00000, 0x00); 2356 2357 for (index = 0; index < path; index++) { 2358 rtl_get_rfreg(hw, index, RF_SYN_G4, RFREG_OFFSET_MASK); 2359 2360 if (index == 0 && rtlhal->interfaceindex == 0) { 2361 RTPRINT(rtlpriv, FINIT, INIT_IQK, 2362 "path-A / 5G LCK\n"); 2363 } else { 2364 RTPRINT(rtlpriv, FINIT, INIT_IQK, 2365 "path-B / 2.4G LCK\n"); 2366 } 2367 2368 memset(curvecount_val, 0, sizeof(curvecount_val)); 2369 2370 /* Set LC calibration off */ 2371 rtl_set_rfreg(hw, (enum radio_path)index, RF_CHNLBW, 2372 0x08000, 0x0); 2373 2374 RTPRINT(rtlpriv, FINIT, INIT_IQK, "set RF 0x18[15] = 0\n"); 2375 2376 /* save Curve-counting number */ 2377 for (i = 0; i < CV_CURVE_CNT; i++) { 2378 u32 readval = 0, readval2 = 0; 2379 2380 rtl_set_rfreg(hw, (enum radio_path)index, 0x3F, 2381 0x7f, i); 2382 2383 rtl_set_rfreg(hw, (enum radio_path)index, 0x4D, 2384 RFREG_OFFSET_MASK, 0x0); 2385 2386 readval = rtl_get_rfreg(hw, (enum radio_path)index, 2387 0x4F, RFREG_OFFSET_MASK); 2388 curvecount_val[2 * i + 1] = (readval & 0xfffe0) >> 5; 2389 2390 /* reg 0x4f [4:0] */ 2391 /* reg 0x50 [19:10] */ 2392 readval2 = rtl_get_rfreg(hw, (enum radio_path)index, 2393 0x50, 0xffc00); 2394 curvecount_val[2 * i] = (((readval & 0x1F) << 10) | 2395 readval2); 2396 } 2397 2398 if (index == 0 && rtlhal->interfaceindex == 0) 2399 rtl92d_phy_calc_curvindex(hw, targetchnl_5g, 2400 curvecount_val, 2401 true, rtlpriv->curveindex_5g); 2402 else 2403 rtl92d_phy_calc_curvindex(hw, targetchnl_2g, 2404 curvecount_val, 2405 false, rtlpriv->curveindex_2g); 2406 2407 /* switch CV-curve control mode */ 2408 rtl_set_rfreg(hw, (enum radio_path)index, RF_SYN_G7, 2409 BIT(17), 0x1); 2410 } 2411 2412 /* Restore original situation */ 2413 for (index = 0; index < path; index++) { 2414 rtl_set_rfreg(hw, index, RF_SYN_G4, RFREG_OFFSET_MASK, 2415 rf_syn_g4[index]); 2416 2417 offset = index == 0 ? ROFDM0_XAAGCCORE1 : ROFDM0_XBAGCCORE1; 2418 rtl_write_byte(rtlpriv, offset, 0x50); 2419 rtl_write_byte(rtlpriv, offset, rf_mode[index]); 2420 } 2421 2422 _rtl92du_phy_reload_lck_setting(hw, rtlpriv->phy.current_channel); 2423 } 2424 2425 void rtl92du_phy_lc_calibrate(struct ieee80211_hw *hw, bool is2t) 2426 { 2427 struct rtl_priv *rtlpriv = rtl_priv(hw); 2428 struct rtl_hal *rtlhal = &rtlpriv->rtlhal; 2429 struct rtl_phy *rtlphy = &rtlpriv->phy; 2430 u32 timeout = 2000, timecount = 0; 2431 2432 while (rtlpriv->mac80211.act_scanning && timecount < timeout) { 2433 udelay(50); 2434 timecount += 50; 2435 } 2436 2437 rtlphy->lck_inprogress = true; 2438 RTPRINT(rtlpriv, FINIT, INIT_IQK, 2439 "LCK:Start!!! currentband %x delay %d ms\n", 2440 rtlhal->current_bandtype, timecount); 2441 2442 _rtl92du_phy_lc_calibrate_sw(hw, is2t); 2443 2444 rtlphy->lck_inprogress = false; 2445 RTPRINT(rtlpriv, FINIT, INIT_IQK, "LCK:Finish!!!\n"); 2446 } 2447 2448 void rtl92du_phy_ap_calibrate(struct ieee80211_hw *hw, s8 delta) 2449 { 2450 /* Nothing to do. */ 2451 } 2452 2453 u8 rtl92du_phy_sw_chnl(struct ieee80211_hw *hw) 2454 { 2455 struct rtl_priv *rtlpriv = rtl_priv(hw); 2456 struct rtl_hal *rtlhal = rtl_hal(rtlpriv); 2457 struct rtl_phy *rtlphy = &rtlpriv->phy; 2458 u8 num_total_rfpath = rtlphy->num_total_rfpath; 2459 u8 channel = rtlphy->current_channel; 2460 u32 timeout = 1000, timecount = 0; 2461 u32 ret_value; 2462 u8 rfpath; 2463 2464 if (rtlphy->sw_chnl_inprogress) 2465 return 0; 2466 if (rtlphy->set_bwmode_inprogress) 2467 return 0; 2468 2469 if ((is_hal_stop(rtlhal)) || (RT_CANNOT_IO(hw))) { 2470 rtl_dbg(rtlpriv, COMP_CHAN, DBG_LOUD, 2471 "sw_chnl_inprogress false driver sleep or unload\n"); 2472 return 0; 2473 } 2474 2475 while (rtlphy->lck_inprogress && timecount < timeout) { 2476 mdelay(50); 2477 timecount += 50; 2478 } 2479 2480 if (rtlhal->macphymode == SINGLEMAC_SINGLEPHY && 2481 rtlhal->bandset == BAND_ON_BOTH) { 2482 ret_value = rtl_get_bbreg(hw, RFPGA0_XAB_RFPARAMETER, 2483 MASKDWORD); 2484 if (rtlphy->current_channel > 14 && !(ret_value & BIT(0))) 2485 rtl92du_phy_switch_wirelessband(hw, BAND_ON_5G); 2486 else if (rtlphy->current_channel <= 14 && (ret_value & BIT(0))) 2487 rtl92du_phy_switch_wirelessband(hw, BAND_ON_2_4G); 2488 } 2489 2490 switch (rtlhal->current_bandtype) { 2491 case BAND_ON_5G: 2492 /* Get first channel error when change between 2493 * 5G and 2.4G band. 2494 */ 2495 if (WARN_ONCE(channel <= 14, "rtl8192du: 5G but channel<=14\n")) 2496 return 0; 2497 break; 2498 case BAND_ON_2_4G: 2499 /* Get first channel error when change between 2500 * 5G and 2.4G band. 2501 */ 2502 if (WARN_ONCE(channel > 14, "rtl8192du: 2G but channel>14\n")) 2503 return 0; 2504 break; 2505 default: 2506 WARN_ONCE(true, "rtl8192du: Invalid WirelessMode(%#x)!!\n", 2507 rtlpriv->mac80211.mode); 2508 break; 2509 } 2510 2511 rtlphy->sw_chnl_inprogress = true; 2512 2513 rtl_dbg(rtlpriv, COMP_SCAN, DBG_TRACE, 2514 "switch to channel%d\n", rtlphy->current_channel); 2515 2516 rtl92d_phy_set_txpower_level(hw, channel); 2517 2518 for (rfpath = 0; rfpath < num_total_rfpath; rfpath++) { 2519 u32p_replace_bits(&rtlphy->rfreg_chnlval[rfpath], 2520 channel, 0xff); 2521 2522 if (rtlpriv->rtlhal.current_bandtype == BAND_ON_5G) { 2523 if (channel > 99) 2524 rtlphy->rfreg_chnlval[rfpath] |= (BIT(18)); 2525 else 2526 rtlphy->rfreg_chnlval[rfpath] &= ~BIT(18); 2527 rtlphy->rfreg_chnlval[rfpath] |= (BIT(16) | BIT(8)); 2528 } else { 2529 rtlphy->rfreg_chnlval[rfpath] &= 2530 ~(BIT(8) | BIT(16) | BIT(18)); 2531 } 2532 rtl_set_rfreg(hw, rfpath, RF_CHNLBW, RFREG_OFFSET_MASK, 2533 rtlphy->rfreg_chnlval[rfpath]); 2534 2535 _rtl92du_phy_reload_imr_setting(hw, channel, rfpath); 2536 } 2537 2538 _rtl92du_phy_switch_rf_setting(hw, channel); 2539 2540 /* do IQK when all parameters are ready */ 2541 rtl92du_phy_reload_iqk_setting(hw, channel); 2542 2543 rtl_dbg(rtlpriv, COMP_SCAN, DBG_TRACE, "<==\n"); 2544 rtlphy->sw_chnl_inprogress = false; 2545 return 1; 2546 } 2547 2548 static void _rtl92du_phy_set_rfon(struct ieee80211_hw *hw) 2549 { 2550 struct rtl_priv *rtlpriv = rtl_priv(hw); 2551 2552 /* a. SYS_CLKR 0x08[11] = 1 restore MAC clock */ 2553 /* b. SPS_CTRL 0x11[7:0] = 0x2b */ 2554 if (rtlpriv->rtlhal.macphymode == SINGLEMAC_SINGLEPHY) 2555 rtl_write_byte(rtlpriv, REG_SPS0_CTRL, 0x2b); 2556 2557 /* c. For PCIE: SYS_FUNC_EN 0x02[7:0] = 0xE3 enable BB TRX function */ 2558 rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN, 0xE3); 2559 2560 /* RF_ON_EXCEP(d~g): */ 2561 /* d. APSD_CTRL 0x600[7:0] = 0x00 */ 2562 rtl_write_byte(rtlpriv, REG_APSD_CTRL, 0x00); 2563 2564 /* e. SYS_FUNC_EN 0x02[7:0] = 0xE2 reset BB TRX function again */ 2565 /* f. SYS_FUNC_EN 0x02[7:0] = 0xE3 enable BB TRX function*/ 2566 rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN, 0xE2); 2567 rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN, 0xE3); 2568 2569 /* g. txpause 0x522[7:0] = 0x00 enable mac tx queue */ 2570 rtl_write_byte(rtlpriv, REG_TXPAUSE, 0x00); 2571 } 2572 2573 static void _rtl92du_phy_set_rfsleep(struct ieee80211_hw *hw) 2574 { 2575 struct rtl_priv *rtlpriv = rtl_priv(hw); 2576 u32 u4btmp; 2577 u8 retry = 5; 2578 2579 /* a. TXPAUSE 0x522[7:0] = 0xFF Pause MAC TX queue */ 2580 rtl_write_byte(rtlpriv, REG_TXPAUSE, 0xFF); 2581 2582 /* b. RF path 0 offset 0x00 = 0x00 disable RF */ 2583 rtl_set_rfreg(hw, RF90_PATH_A, 0x00, RFREG_OFFSET_MASK, 0x00); 2584 2585 /* c. APSD_CTRL 0x600[7:0] = 0x40 */ 2586 rtl_write_byte(rtlpriv, REG_APSD_CTRL, 0x40); 2587 2588 /* d. APSD_CTRL 0x600[7:0] = 0x00 2589 * APSD_CTRL 0x600[7:0] = 0x00 2590 * RF path 0 offset 0x00 = 0x00 2591 * APSD_CTRL 0x600[7:0] = 0x40 2592 */ 2593 u4btmp = rtl_get_rfreg(hw, RF90_PATH_A, 0, RFREG_OFFSET_MASK); 2594 while (u4btmp != 0 && retry > 0) { 2595 rtl_write_byte(rtlpriv, REG_APSD_CTRL, 0x0); 2596 rtl_set_rfreg(hw, RF90_PATH_A, 0x00, RFREG_OFFSET_MASK, 0x00); 2597 rtl_write_byte(rtlpriv, REG_APSD_CTRL, 0x40); 2598 u4btmp = rtl_get_rfreg(hw, RF90_PATH_A, 0, RFREG_OFFSET_MASK); 2599 retry--; 2600 } 2601 if (retry == 0) { 2602 /* Jump out the LPS turn off sequence to RF_ON_EXCEP */ 2603 rtl_write_byte(rtlpriv, REG_APSD_CTRL, 0x00); 2604 2605 rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN, 0xE2); 2606 rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN, 0xE3); 2607 rtl_write_byte(rtlpriv, REG_TXPAUSE, 0x00); 2608 rtl_dbg(rtlpriv, COMP_POWER, DBG_LOUD, 2609 "Fail !!! Switch RF timeout\n"); 2610 return; 2611 } 2612 2613 /* e. For PCIE: SYS_FUNC_EN 0x02[7:0] = 0xE2 reset BB TRX function */ 2614 rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN, 0xE2); 2615 2616 /* f. SPS_CTRL 0x11[7:0] = 0x22 */ 2617 if (rtlpriv->rtlhal.macphymode == SINGLEMAC_SINGLEPHY) 2618 rtl_write_byte(rtlpriv, REG_SPS0_CTRL, 0x22); 2619 } 2620 2621 bool rtl92du_phy_set_rf_power_state(struct ieee80211_hw *hw, 2622 enum rf_pwrstate rfpwr_state) 2623 { 2624 struct rtl_priv *rtlpriv = rtl_priv(hw); 2625 struct rtl_ps_ctl *ppsc = rtl_psc(rtlpriv); 2626 struct rtl_mac *mac = rtl_mac(rtlpriv); 2627 bool bresult = true; 2628 2629 if (rfpwr_state == ppsc->rfpwr_state) 2630 return false; 2631 2632 switch (rfpwr_state) { 2633 case ERFON: 2634 if (ppsc->rfpwr_state == ERFOFF && 2635 RT_IN_PS_LEVEL(ppsc, RT_RF_OFF_LEVL_HALT_NIC)) { 2636 u32 initializecount = 0; 2637 bool rtstatus; 2638 2639 do { 2640 initializecount++; 2641 rtl_dbg(rtlpriv, COMP_RF, DBG_DMESG, 2642 "IPS Set eRf nic enable\n"); 2643 rtstatus = rtl_ps_enable_nic(hw); 2644 } while (!rtstatus && (initializecount < 10)); 2645 2646 RT_CLEAR_PS_LEVEL(ppsc, 2647 RT_RF_OFF_LEVL_HALT_NIC); 2648 } else { 2649 rtl_dbg(rtlpriv, COMP_POWER, DBG_DMESG, 2650 "awake, slept:%d ms state_inap:%x\n", 2651 jiffies_to_msecs(jiffies - 2652 ppsc->last_sleep_jiffies), 2653 rtlpriv->psc.state_inap); 2654 ppsc->last_awake_jiffies = jiffies; 2655 _rtl92du_phy_set_rfon(hw); 2656 } 2657 2658 if (mac->link_state == MAC80211_LINKED) 2659 rtlpriv->cfg->ops->led_control(hw, LED_CTL_LINK); 2660 else 2661 rtlpriv->cfg->ops->led_control(hw, LED_CTL_NO_LINK); 2662 break; 2663 case ERFOFF: 2664 if (ppsc->reg_rfps_level & RT_RF_OFF_LEVL_HALT_NIC) { 2665 rtl_dbg(rtlpriv, COMP_RF, DBG_DMESG, 2666 "IPS Set eRf nic disable\n"); 2667 rtl_ps_disable_nic(hw); 2668 RT_SET_PS_LEVEL(ppsc, RT_RF_OFF_LEVL_HALT_NIC); 2669 } else { 2670 if (ppsc->rfoff_reason == RF_CHANGE_BY_IPS) 2671 rtlpriv->cfg->ops->led_control(hw, LED_CTL_NO_LINK); 2672 else 2673 rtlpriv->cfg->ops->led_control(hw, LED_CTL_POWER_OFF); 2674 } 2675 break; 2676 case ERFSLEEP: 2677 if (ppsc->rfpwr_state == ERFOFF) 2678 return false; 2679 2680 rtl_dbg(rtlpriv, COMP_POWER, DBG_DMESG, 2681 "sleep awakened:%d ms state_inap:%x\n", 2682 jiffies_to_msecs(jiffies - 2683 ppsc->last_awake_jiffies), 2684 rtlpriv->psc.state_inap); 2685 ppsc->last_sleep_jiffies = jiffies; 2686 _rtl92du_phy_set_rfsleep(hw); 2687 break; 2688 default: 2689 pr_err("switch case %#x not processed\n", 2690 rfpwr_state); 2691 return false; 2692 } 2693 2694 if (bresult) 2695 ppsc->rfpwr_state = rfpwr_state; 2696 2697 return bresult; 2698 } 2699 2700 void rtl92du_phy_set_poweron(struct ieee80211_hw *hw) 2701 { 2702 struct rtl_priv *rtlpriv = rtl_priv(hw); 2703 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw)); 2704 u32 mac_reg = (rtlhal->interfaceindex == 0 ? REG_MAC0 : REG_MAC1); 2705 u8 value8; 2706 u16 i; 2707 2708 /* notice fw know band status 0x81[1]/0x53[1] = 0: 5G, 1: 2G */ 2709 if (rtlhal->current_bandtype == BAND_ON_2_4G) { 2710 value8 = rtl_read_byte(rtlpriv, mac_reg); 2711 value8 |= BIT(1); 2712 rtl_write_byte(rtlpriv, mac_reg, value8); 2713 } else { 2714 value8 = rtl_read_byte(rtlpriv, mac_reg); 2715 value8 &= ~BIT(1); 2716 rtl_write_byte(rtlpriv, mac_reg, value8); 2717 } 2718 2719 if (rtlhal->macphymode == SINGLEMAC_SINGLEPHY) { 2720 value8 = rtl_read_byte(rtlpriv, REG_MAC0); 2721 rtl_write_byte(rtlpriv, REG_MAC0, value8 | MAC0_ON); 2722 } else { 2723 mutex_lock(rtlpriv->mutex_for_power_on_off); 2724 if (rtlhal->interfaceindex == 0) { 2725 value8 = rtl_read_byte(rtlpriv, REG_MAC0); 2726 rtl_write_byte(rtlpriv, REG_MAC0, value8 | MAC0_ON); 2727 } else { 2728 value8 = rtl_read_byte(rtlpriv, REG_MAC1); 2729 rtl_write_byte(rtlpriv, REG_MAC1, value8 | MAC1_ON); 2730 } 2731 value8 = rtl_read_byte(rtlpriv, REG_POWER_OFF_IN_PROCESS); 2732 mutex_unlock(rtlpriv->mutex_for_power_on_off); 2733 2734 for (i = 0; i < 200; i++) { 2735 if ((value8 & BIT(7)) == 0) 2736 break; 2737 2738 udelay(500); 2739 mutex_lock(rtlpriv->mutex_for_power_on_off); 2740 value8 = rtl_read_byte(rtlpriv, 2741 REG_POWER_OFF_IN_PROCESS); 2742 mutex_unlock(rtlpriv->mutex_for_power_on_off); 2743 } 2744 if (i == 200) 2745 WARN_ONCE(true, "rtl8192du: Another mac power off over time\n"); 2746 } 2747 } 2748 2749 void rtl92du_update_bbrf_configuration(struct ieee80211_hw *hw) 2750 { 2751 struct rtl_priv *rtlpriv = rtl_priv(hw); 2752 struct rtl_efuse *rtlefuse = rtl_efuse(rtlpriv); 2753 struct rtl_hal *rtlhal = rtl_hal(rtlpriv); 2754 struct rtl_phy *rtlphy = &rtlpriv->phy; 2755 u8 rfpath, i; 2756 2757 rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD, "==>\n"); 2758 /* r_select_5G for path_A/B 0 for 2.4G, 1 for 5G */ 2759 if (rtlhal->current_bandtype == BAND_ON_2_4G) { 2760 /* r_select_5G for path_A/B, 0x878 */ 2761 rtl_set_bbreg(hw, RFPGA0_XAB_RFPARAMETER, BIT(0), 0x0); 2762 rtl_set_bbreg(hw, RFPGA0_XAB_RFPARAMETER, BIT(15), 0x0); 2763 if (rtlhal->macphymode != DUALMAC_DUALPHY) { 2764 rtl_set_bbreg(hw, RFPGA0_XAB_RFPARAMETER, BIT(16), 0x0); 2765 rtl_set_bbreg(hw, RFPGA0_XAB_RFPARAMETER, BIT(31), 0x0); 2766 } 2767 2768 /* rssi_table_select: index 0 for 2.4G. 1~3 for 5G, 0xc78 */ 2769 rtl_set_bbreg(hw, ROFDM0_AGCRSSITABLE, BIT(6) | BIT(7), 0x0); 2770 2771 /* fc_area 0xd2c */ 2772 rtl_set_bbreg(hw, ROFDM1_CFOTRACKING, BIT(14) | BIT(13), 0x0); 2773 2774 /* 5G LAN ON */ 2775 rtl_set_bbreg(hw, 0xB30, 0x00F00000, 0xa); 2776 2777 /* TX BB gain shift*1, Just for testchip, 0xc80, 0xc88 */ 2778 rtl_set_bbreg(hw, ROFDM0_XATXIQIMBALANCE, MASKDWORD, 0x40000100); 2779 rtl_set_bbreg(hw, ROFDM0_XBTXIQIMBALANCE, MASKDWORD, 0x40000100); 2780 if (rtlhal->macphymode == DUALMAC_DUALPHY) { 2781 rtl_set_bbreg(hw, RFPGA0_XAB_RFINTERFACESW, 2782 BIT(10) | BIT(6) | BIT(5), 2783 ((rtlefuse->eeprom_c9 & BIT(3)) >> 3) | 2784 (rtlefuse->eeprom_c9 & BIT(1)) | 2785 ((rtlefuse->eeprom_cc & BIT(1)) << 4)); 2786 rtl_set_bbreg(hw, RFPGA0_XA_RFINTERFACEOE, 2787 BIT(10) | BIT(6) | BIT(5), 2788 ((rtlefuse->eeprom_c9 & BIT(2)) >> 2) | 2789 ((rtlefuse->eeprom_c9 & BIT(0)) << 1) | 2790 ((rtlefuse->eeprom_cc & BIT(0)) << 5)); 2791 rtl_set_bbreg(hw, RFPGA0_XAB_RFPARAMETER, BIT(15), 0); 2792 2793 rtl_set_bbreg(hw, RPDP_ANTA, MASKDWORD, 0x01017038); 2794 rtl_set_bbreg(hw, RCONFIG_ANTA, MASKDWORD, 0x0f600000); 2795 } else { 2796 rtl_set_bbreg(hw, RFPGA0_XAB_RFINTERFACESW, 2797 BIT(26) | BIT(22) | BIT(21) | BIT(10) | 2798 BIT(6) | BIT(5), 2799 ((rtlefuse->eeprom_c9 & BIT(3)) >> 3) | 2800 (rtlefuse->eeprom_c9 & BIT(1)) | 2801 ((rtlefuse->eeprom_cc & BIT(1)) << 4) | 2802 ((rtlefuse->eeprom_c9 & BIT(7)) << 9) | 2803 ((rtlefuse->eeprom_c9 & BIT(5)) << 12) | 2804 ((rtlefuse->eeprom_cc & BIT(3)) << 18)); 2805 rtl_set_bbreg(hw, RFPGA0_XA_RFINTERFACEOE, 2806 BIT(10) | BIT(6) | BIT(5), 2807 ((rtlefuse->eeprom_c9 & BIT(2)) >> 2) | 2808 ((rtlefuse->eeprom_c9 & BIT(0)) << 1) | 2809 ((rtlefuse->eeprom_cc & BIT(0)) << 5)); 2810 rtl_set_bbreg(hw, RFPGA0_XB_RFINTERFACEOE, 2811 BIT(10) | BIT(6) | BIT(5), 2812 ((rtlefuse->eeprom_c9 & BIT(6)) >> 6) | 2813 ((rtlefuse->eeprom_c9 & BIT(4)) >> 3) | 2814 ((rtlefuse->eeprom_cc & BIT(2)) << 3)); 2815 rtl_set_bbreg(hw, RFPGA0_XAB_RFPARAMETER, 2816 BIT(31) | BIT(15), 0); 2817 2818 rtl_set_bbreg(hw, RPDP_ANTA, MASKDWORD, 0x01017038); 2819 rtl_set_bbreg(hw, RPDP_ANTB, MASKDWORD, 0x01017038); 2820 rtl_set_bbreg(hw, RCONFIG_ANTA, MASKDWORD, 0x0f600000); 2821 rtl_set_bbreg(hw, RCONFIG_ANTB, MASKDWORD, 0x0f600000); 2822 } 2823 /* 1.5V_LDO */ 2824 } else { 2825 /* r_select_5G for path_A/B */ 2826 rtl_set_bbreg(hw, RFPGA0_XAB_RFPARAMETER, BIT(0), 0x1); 2827 rtl_set_bbreg(hw, RFPGA0_XAB_RFPARAMETER, BIT(15), 0x1); 2828 if (rtlhal->macphymode != DUALMAC_DUALPHY) { 2829 rtl_set_bbreg(hw, RFPGA0_XAB_RFPARAMETER, BIT(16), 0x1); 2830 rtl_set_bbreg(hw, RFPGA0_XAB_RFPARAMETER, BIT(31), 0x1); 2831 } 2832 2833 /* rssi_table_select: index 0 for 2.4G. 1~3 for 5G */ 2834 rtl_set_bbreg(hw, ROFDM0_AGCRSSITABLE, BIT(6) | BIT(7), 0x1); 2835 2836 /* fc_area */ 2837 rtl_set_bbreg(hw, ROFDM1_CFOTRACKING, BIT(14) | BIT(13), 0x1); 2838 2839 /* 5G LAN ON */ 2840 rtl_set_bbreg(hw, 0xB30, 0x00F00000, 0x0); 2841 2842 /* TX BB gain shift, Just for testchip, 0xc80, 0xc88 */ 2843 if (rtlefuse->internal_pa_5g[rtlhal->interfaceindex]) 2844 rtl_set_bbreg(hw, ROFDM0_XATXIQIMBALANCE, MASKDWORD, 2845 0x2d4000b5); 2846 else 2847 rtl_set_bbreg(hw, ROFDM0_XATXIQIMBALANCE, MASKDWORD, 2848 0x20000080); 2849 2850 if (rtlhal->macphymode != DUALMAC_DUALPHY) { 2851 if (rtlefuse->internal_pa_5g[1]) 2852 rtl_set_bbreg(hw, ROFDM0_XBTXIQIMBALANCE, 2853 MASKDWORD, 0x2d4000b5); 2854 else 2855 rtl_set_bbreg(hw, ROFDM0_XBTXIQIMBALANCE, 2856 MASKDWORD, 0x20000080); 2857 } 2858 2859 rtl_set_bbreg(hw, 0xB30, BIT(27), 0); 2860 2861 if (rtlhal->macphymode == DUALMAC_DUALPHY) { 2862 rtl_set_bbreg(hw, RFPGA0_XAB_RFINTERFACESW, 2863 BIT(10) | BIT(6) | BIT(5), 2864 (rtlefuse->eeprom_cc & BIT(5))); 2865 rtl_set_bbreg(hw, RFPGA0_XA_RFINTERFACEOE, BIT(10), 2866 ((rtlefuse->eeprom_cc & BIT(4)) >> 4)); 2867 rtl_set_bbreg(hw, RFPGA0_XAB_RFPARAMETER, BIT(15), 2868 (rtlefuse->eeprom_cc & BIT(4)) >> 4); 2869 2870 rtl_set_bbreg(hw, RPDP_ANTA, MASKDWORD, 0x01017098); 2871 rtl_set_bbreg(hw, RCONFIG_ANTA, MASKDWORD, 0x20000000); 2872 } else { 2873 rtl_set_bbreg(hw, RFPGA0_XAB_RFINTERFACESW, 2874 BIT(26) | BIT(22) | BIT(21) | BIT(10) | 2875 BIT(6) | BIT(5), 2876 (rtlefuse->eeprom_cc & BIT(5)) | 2877 ((rtlefuse->eeprom_cc & BIT(7)) << 14)); 2878 rtl_set_bbreg(hw, RFPGA0_XA_RFINTERFACEOE, BIT(10), 2879 ((rtlefuse->eeprom_cc & BIT(4)) >> 4)); 2880 rtl_set_bbreg(hw, RFPGA0_XB_RFINTERFACEOE, BIT(10), 2881 ((rtlefuse->eeprom_cc & BIT(6)) >> 6)); 2882 rtl_set_bbreg(hw, RFPGA0_XAB_RFPARAMETER, 2883 BIT(31) | BIT(15), 2884 ((rtlefuse->eeprom_cc & BIT(4)) >> 4) | 2885 ((rtlefuse->eeprom_cc & BIT(6)) << 10)); 2886 2887 rtl_set_bbreg(hw, RPDP_ANTA, MASKDWORD, 0x01017098); 2888 rtl_set_bbreg(hw, RPDP_ANTB, MASKDWORD, 0x01017098); 2889 rtl_set_bbreg(hw, RCONFIG_ANTA, MASKDWORD, 0x20000000); 2890 rtl_set_bbreg(hw, RCONFIG_ANTB, MASKDWORD, 0x20000000); 2891 } 2892 } 2893 2894 /* update IQK related settings */ 2895 rtl_set_bbreg(hw, ROFDM0_XARXIQIMBALANCE, MASKDWORD, 0x40000100); 2896 rtl_set_bbreg(hw, ROFDM0_XBRXIQIMBALANCE, MASKDWORD, 0x40000100); 2897 rtl_set_bbreg(hw, ROFDM0_XCTXAFE, 0xF0000000, 0x00); 2898 rtl_set_bbreg(hw, ROFDM0_ECCATHRESHOLD, BIT(30) | BIT(28) | 2899 BIT(26) | BIT(24), 0x00); 2900 rtl_set_bbreg(hw, ROFDM0_XDTXAFE, 0xF0000000, 0x00); 2901 rtl_set_bbreg(hw, ROFDM0_RXIQEXTANTA, 0xF0000000, 0x00); 2902 rtl_set_bbreg(hw, ROFDM0_AGCRSSITABLE, 0x0000F000, 0x00); 2903 2904 /* Update RF */ 2905 for (rfpath = RF90_PATH_A; rfpath < rtlphy->num_total_rfpath; 2906 rfpath++) { 2907 if (rtlhal->current_bandtype == BAND_ON_2_4G) { 2908 /* MOD_AG for RF path_A 0x18 BIT8,BIT16 */ 2909 rtl_set_rfreg(hw, rfpath, RF_CHNLBW, BIT(8) | BIT(16) | 2910 BIT(18) | 0xff, 1); 2911 2912 /* RF0x0b[16:14] =3b'111 */ 2913 rtl_set_rfreg(hw, (enum radio_path)rfpath, 0x0B, 2914 0x1c000, 0x07); 2915 } else { 2916 /* MOD_AG for RF path_A 0x18 BIT8,BIT16 */ 2917 rtl_set_rfreg(hw, RF90_PATH_A, RF_CHNLBW, RFREG_OFFSET_MASK, 2918 0x97524); 2919 } 2920 2921 /* Set right channel on RF reg0x18 for another mac. */ 2922 if (rtlhal->interfaceindex == 0 && rtlhal->bandset == BAND_ON_2_4G) { 2923 /* Set MAC1 default channel if MAC1 not up. */ 2924 if (!(rtl_read_byte(rtlpriv, REG_MAC1) & MAC1_ON)) { 2925 rtl92du_phy_enable_anotherphy(hw, true); 2926 rtlhal->during_mac0init_radiob = true; 2927 rtl_set_rfreg(hw, RF90_PATH_A, RF_CHNLBW, 2928 RFREG_OFFSET_MASK, 0x97524); 2929 rtl92du_phy_powerdown_anotherphy(hw, true); 2930 } 2931 } else if (rtlhal->interfaceindex == 1 && rtlhal->bandset == BAND_ON_5G) { 2932 /* Set MAC0 default channel */ 2933 if (!(rtl_read_byte(rtlpriv, REG_MAC0) & MAC0_ON)) { 2934 rtl92du_phy_enable_anotherphy(hw, false); 2935 rtlhal->during_mac1init_radioa = true; 2936 rtl_set_rfreg(hw, RF90_PATH_A, RF_CHNLBW, 2937 RFREG_OFFSET_MASK, 0x87401); 2938 rtl92du_phy_powerdown_anotherphy(hw, false); 2939 } 2940 } 2941 } 2942 2943 /* Update for all band. */ 2944 /* DMDP */ 2945 if (rtlphy->rf_type == RF_1T1R) { 2946 /* Use antenna 0, 0xc04, 0xd04 */ 2947 rtl_set_bbreg(hw, ROFDM0_TRXPATHENABLE, MASKBYTE0, 0x11); 2948 rtl_set_bbreg(hw, ROFDM1_TRXPATHENABLE, BDWORD, 0x1); 2949 2950 /* enable ad/da clock1 for dual-phy reg0x888 */ 2951 if (rtlhal->interfaceindex == 0) { 2952 rtl_set_bbreg(hw, RFPGA0_ADDALLOCKEN, BIT(12) | 2953 BIT(13), 0x3); 2954 } else if (rtl92du_phy_enable_anotherphy(hw, false)) { 2955 rtlhal->during_mac1init_radioa = true; 2956 rtl_set_bbreg(hw, RFPGA0_ADDALLOCKEN, 2957 BIT(12) | BIT(13), 0x3); 2958 rtl92du_phy_powerdown_anotherphy(hw, false); 2959 } 2960 2961 rtl_set_bbreg(hw, ROFDM1_LSTF, BIT(19) | BIT(20), 0x0); 2962 } else { 2963 /* Single PHY */ 2964 /* Use antenna 0 & 1, 0xc04, 0xd04 */ 2965 rtl_set_bbreg(hw, ROFDM0_TRXPATHENABLE, MASKBYTE0, 0x33); 2966 rtl_set_bbreg(hw, ROFDM1_TRXPATHENABLE, BDWORD, 0x3); 2967 /* disable ad/da clock1,0x888 */ 2968 rtl_set_bbreg(hw, RFPGA0_ADDALLOCKEN, BIT(12) | BIT(13), 0); 2969 2970 rtl_set_bbreg(hw, ROFDM1_LSTF, BIT(19) | BIT(20), 0x1); 2971 } 2972 2973 for (rfpath = RF90_PATH_A; rfpath < rtlphy->num_total_rfpath; 2974 rfpath++) { 2975 rtlphy->rfreg_chnlval[rfpath] = rtl_get_rfreg(hw, rfpath, 2976 RF_CHNLBW, 2977 RFREG_OFFSET_MASK); 2978 rtlphy->reg_rf3c[rfpath] = rtl_get_rfreg(hw, rfpath, 0x3C, 2979 RFREG_OFFSET_MASK); 2980 } 2981 2982 for (i = 0; i < 2; i++) 2983 rtl_dbg(rtlpriv, COMP_RF, DBG_LOUD, "RF 0x18 = 0x%x\n", 2984 rtlphy->rfreg_chnlval[i]); 2985 2986 rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD, "<==\n"); 2987 } 2988 2989 bool rtl92du_phy_check_poweroff(struct ieee80211_hw *hw) 2990 { 2991 struct rtl_priv *rtlpriv = rtl_priv(hw); 2992 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw)); 2993 u8 u1btmp; 2994 2995 if (rtlhal->macphymode == SINGLEMAC_SINGLEPHY) { 2996 u1btmp = rtl_read_byte(rtlpriv, REG_MAC0); 2997 rtl_write_byte(rtlpriv, REG_MAC0, u1btmp & ~MAC0_ON); 2998 return true; 2999 } 3000 3001 mutex_lock(rtlpriv->mutex_for_power_on_off); 3002 if (rtlhal->interfaceindex == 0) { 3003 u1btmp = rtl_read_byte(rtlpriv, REG_MAC0); 3004 rtl_write_byte(rtlpriv, REG_MAC0, u1btmp & ~MAC0_ON); 3005 u1btmp = rtl_read_byte(rtlpriv, REG_MAC1); 3006 u1btmp &= MAC1_ON; 3007 } else { 3008 u1btmp = rtl_read_byte(rtlpriv, REG_MAC1); 3009 rtl_write_byte(rtlpriv, REG_MAC1, u1btmp & ~MAC1_ON); 3010 u1btmp = rtl_read_byte(rtlpriv, REG_MAC0); 3011 u1btmp &= MAC0_ON; 3012 } 3013 if (u1btmp) { 3014 mutex_unlock(rtlpriv->mutex_for_power_on_off); 3015 return false; 3016 } 3017 u1btmp = rtl_read_byte(rtlpriv, REG_POWER_OFF_IN_PROCESS); 3018 u1btmp |= BIT(7); 3019 rtl_write_byte(rtlpriv, REG_POWER_OFF_IN_PROCESS, u1btmp); 3020 mutex_unlock(rtlpriv->mutex_for_power_on_off); 3021 3022 return true; 3023 } 3024 3025 void rtl92du_phy_init_pa_bias(struct ieee80211_hw *hw) 3026 { 3027 struct rtl_priv *rtlpriv = rtl_priv(hw); 3028 struct rtl_hal *rtlhal = rtl_hal(rtlpriv); 3029 bool is_single_mac = rtlhal->macphymode == SINGLEMAC_SINGLEPHY; 3030 enum radio_path rf_path; 3031 u8 val8; 3032 3033 read_efuse_byte(hw, 0x3FA, &val8); 3034 3035 rtl_dbg(rtlpriv, COMP_RF, DBG_TRACE, "%s: 0x3FA %#x\n", 3036 __func__, val8); 3037 3038 if (!(val8 & BIT(0)) && (is_single_mac || rtlhal->interfaceindex == 0)) { 3039 rtl_set_rfreg(hw, RF90_PATH_A, RF_CHNLBW, RFREG_OFFSET_MASK, 0x07401); 3040 rtl_set_rfreg(hw, RF90_PATH_A, RF_AC, RFREG_OFFSET_MASK, 0x70000); 3041 rtl_set_rfreg(hw, RF90_PATH_A, RF_IPA, RFREG_OFFSET_MASK, 0x0F425); 3042 rtl_set_rfreg(hw, RF90_PATH_A, RF_IPA, RFREG_OFFSET_MASK, 0x4F425); 3043 rtl_set_rfreg(hw, RF90_PATH_A, RF_IPA, RFREG_OFFSET_MASK, 0x8F425); 3044 3045 /* Back to RX Mode */ 3046 rtl_set_rfreg(hw, RF90_PATH_A, RF_AC, RFREG_OFFSET_MASK, 0x30000); 3047 3048 rtl_dbg(rtlpriv, COMP_RF, DBG_TRACE, "2G PA BIAS path A\n"); 3049 } 3050 3051 if (!(val8 & BIT(1)) && (is_single_mac || rtlhal->interfaceindex == 1)) { 3052 rf_path = rtlhal->interfaceindex == 1 ? RF90_PATH_A : RF90_PATH_B; 3053 3054 rtl_set_rfreg(hw, rf_path, RF_CHNLBW, RFREG_OFFSET_MASK, 0x07401); 3055 rtl_set_rfreg(hw, rf_path, RF_AC, RFREG_OFFSET_MASK, 0x70000); 3056 rtl_set_rfreg(hw, rf_path, RF_IPA, RFREG_OFFSET_MASK, 0x0F425); 3057 rtl_set_rfreg(hw, rf_path, RF_IPA, RFREG_OFFSET_MASK, 0x4F425); 3058 rtl_set_rfreg(hw, rf_path, RF_IPA, RFREG_OFFSET_MASK, 0x8F425); 3059 3060 /* Back to RX Mode */ 3061 rtl_set_rfreg(hw, rf_path, RF_AC, RFREG_OFFSET_MASK, 0x30000); 3062 3063 rtl_dbg(rtlpriv, COMP_RF, DBG_TRACE, "2G PA BIAS path B\n"); 3064 } 3065 3066 if (!(val8 & BIT(2)) && (is_single_mac || rtlhal->interfaceindex == 0)) { 3067 /* 5GL_channel */ 3068 rtl_set_rfreg(hw, RF90_PATH_A, RF_CHNLBW, RFREG_OFFSET_MASK, 0x17524); 3069 rtl_set_rfreg(hw, RF90_PATH_A, RF_AC, RFREG_OFFSET_MASK, 0x70000); 3070 rtl_set_rfreg(hw, RF90_PATH_A, RF_IPA, RFREG_OFFSET_MASK, 0x0F496); 3071 rtl_set_rfreg(hw, RF90_PATH_A, RF_IPA, RFREG_OFFSET_MASK, 0x4F496); 3072 rtl_set_rfreg(hw, RF90_PATH_A, RF_IPA, RFREG_OFFSET_MASK, 0x8F496); 3073 3074 /* 5GM_channel */ 3075 rtl_set_rfreg(hw, RF90_PATH_A, RF_CHNLBW, RFREG_OFFSET_MASK, 0x37564); 3076 rtl_set_rfreg(hw, RF90_PATH_A, RF_AC, RFREG_OFFSET_MASK, 0x70000); 3077 rtl_set_rfreg(hw, RF90_PATH_A, RF_IPA, RFREG_OFFSET_MASK, 0x0F496); 3078 rtl_set_rfreg(hw, RF90_PATH_A, RF_IPA, RFREG_OFFSET_MASK, 0x4F496); 3079 rtl_set_rfreg(hw, RF90_PATH_A, RF_IPA, RFREG_OFFSET_MASK, 0x8F496); 3080 3081 /* 5GH_channel */ 3082 rtl_set_rfreg(hw, RF90_PATH_A, RF_CHNLBW, RFREG_OFFSET_MASK, 0x57595); 3083 rtl_set_rfreg(hw, RF90_PATH_A, RF_AC, RFREG_OFFSET_MASK, 0x70000); 3084 rtl_set_rfreg(hw, RF90_PATH_A, RF_IPA, RFREG_OFFSET_MASK, 0x0F496); 3085 rtl_set_rfreg(hw, RF90_PATH_A, RF_IPA, RFREG_OFFSET_MASK, 0x4F496); 3086 rtl_set_rfreg(hw, RF90_PATH_A, RF_IPA, RFREG_OFFSET_MASK, 0x8F496); 3087 3088 /* Back to RX Mode */ 3089 rtl_set_rfreg(hw, RF90_PATH_A, RF_AC, RFREG_OFFSET_MASK, 0x30000); 3090 3091 rtl_dbg(rtlpriv, COMP_RF, DBG_TRACE, "5G PA BIAS path A\n"); 3092 } 3093 3094 if (!(val8 & BIT(3)) && (is_single_mac || rtlhal->interfaceindex == 1)) { 3095 rf_path = rtlhal->interfaceindex == 1 ? RF90_PATH_A : RF90_PATH_B; 3096 3097 /* 5GL_channel */ 3098 rtl_set_rfreg(hw, rf_path, RF_CHNLBW, RFREG_OFFSET_MASK, 0x17524); 3099 rtl_set_rfreg(hw, rf_path, RF_AC, RFREG_OFFSET_MASK, 0x70000); 3100 rtl_set_rfreg(hw, rf_path, RF_IPA, RFREG_OFFSET_MASK, 0x0F496); 3101 rtl_set_rfreg(hw, rf_path, RF_IPA, RFREG_OFFSET_MASK, 0x4F496); 3102 rtl_set_rfreg(hw, rf_path, RF_IPA, RFREG_OFFSET_MASK, 0x8F496); 3103 3104 /* 5GM_channel */ 3105 rtl_set_rfreg(hw, rf_path, RF_CHNLBW, RFREG_OFFSET_MASK, 0x37564); 3106 rtl_set_rfreg(hw, rf_path, RF_AC, RFREG_OFFSET_MASK, 0x70000); 3107 rtl_set_rfreg(hw, rf_path, RF_IPA, RFREG_OFFSET_MASK, 0x0F496); 3108 rtl_set_rfreg(hw, rf_path, RF_IPA, RFREG_OFFSET_MASK, 0x4F496); 3109 rtl_set_rfreg(hw, rf_path, RF_IPA, RFREG_OFFSET_MASK, 0x8F496); 3110 3111 /* 5GH_channel */ 3112 rtl_set_rfreg(hw, rf_path, RF_CHNLBW, RFREG_OFFSET_MASK, 0x57595); 3113 rtl_set_rfreg(hw, rf_path, RF_AC, RFREG_OFFSET_MASK, 0x70000); 3114 rtl_set_rfreg(hw, rf_path, RF_IPA, RFREG_OFFSET_MASK, 0x0F496); 3115 rtl_set_rfreg(hw, rf_path, RF_IPA, RFREG_OFFSET_MASK, 0x4F496); 3116 rtl_set_rfreg(hw, rf_path, RF_IPA, RFREG_OFFSET_MASK, 0x8F496); 3117 3118 /* Back to RX Mode */ 3119 rtl_set_rfreg(hw, rf_path, RF_AC, RFREG_OFFSET_MASK, 0x30000); 3120 3121 rtl_dbg(rtlpriv, COMP_RF, DBG_TRACE, "5G PA BIAS path B\n"); 3122 } 3123 } 3124