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