1 // SPDX-License-Identifier: GPL-2.0 2 /* Copyright(c) 2009-2010 Realtek Corporation.*/ 3 4 #include "../wifi.h" 5 #include "../pci.h" 6 #include "../ps.h" 7 #include "reg.h" 8 #include "def.h" 9 #include "phy.h" 10 #include "rf.h" 11 #include "dm.h" 12 #include "table.h" 13 #include "trx.h" 14 #include "../btcoexist/halbt_precomp.h" 15 #include "hw.h" 16 #include "../efuse.h" 17 18 #define READ_NEXT_PAIR(array_table, v1, v2, i) \ 19 do { \ 20 i += 2; \ 21 v1 = array_table[i]; \ 22 v2 = array_table[i+1]; \ 23 } while (0) 24 25 static u32 _rtl8821ae_phy_rf_serial_read(struct ieee80211_hw *hw, 26 enum radio_path rfpath, u32 offset); 27 static void _rtl8821ae_phy_rf_serial_write(struct ieee80211_hw *hw, 28 enum radio_path rfpath, u32 offset, 29 u32 data); 30 static u32 _rtl8821ae_phy_calculate_bit_shift(u32 bitmask); 31 static bool _rtl8821ae_phy_bb8821a_config_parafile(struct ieee80211_hw *hw); 32 /*static bool _rtl8812ae_phy_config_mac_with_headerfile(struct ieee80211_hw *hw);*/ 33 static bool _rtl8821ae_phy_config_mac_with_headerfile(struct ieee80211_hw *hw); 34 static bool _rtl8821ae_phy_config_bb_with_headerfile(struct ieee80211_hw *hw, 35 u8 configtype); 36 static bool _rtl8821ae_phy_config_bb_with_pgheaderfile(struct ieee80211_hw *hw, 37 u8 configtype); 38 static void phy_init_bb_rf_register_definition(struct ieee80211_hw *hw); 39 40 static long _rtl8821ae_phy_txpwr_idx_to_dbm(struct ieee80211_hw *hw, 41 enum wireless_mode wirelessmode, 42 u8 txpwridx); 43 static void rtl8821ae_phy_set_rf_on(struct ieee80211_hw *hw); 44 static void rtl8821ae_phy_set_io(struct ieee80211_hw *hw); 45 46 static void rtl8812ae_fixspur(struct ieee80211_hw *hw, 47 enum ht_channel_width band_width, u8 channel) 48 { 49 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw)); 50 51 /*C cut Item12 ADC FIFO CLOCK*/ 52 if (IS_VENDOR_8812A_C_CUT(rtlhal->version)) { 53 if (band_width == HT_CHANNEL_WIDTH_20_40 && channel == 11) 54 rtl_set_bbreg(hw, RRFMOD, 0xC00, 0x3); 55 /* 0x8AC[11:10] = 2'b11*/ 56 else 57 rtl_set_bbreg(hw, RRFMOD, 0xC00, 0x2); 58 /* 0x8AC[11:10] = 2'b10*/ 59 60 /* <20120914, Kordan> A workarould to resolve 61 * 2480Mhz spur by setting ADC clock as 160M. (Asked by Binson) 62 */ 63 if (band_width == HT_CHANNEL_WIDTH_20 && 64 (channel == 13 || channel == 14)) { 65 rtl_set_bbreg(hw, RRFMOD, 0x300, 0x3); 66 /*0x8AC[9:8] = 2'b11*/ 67 rtl_set_bbreg(hw, RADC_BUF_CLK, BIT(30), 1); 68 /* 0x8C4[30] = 1*/ 69 } else if (band_width == HT_CHANNEL_WIDTH_20_40 && 70 channel == 11) { 71 rtl_set_bbreg(hw, RADC_BUF_CLK, BIT(30), 1); 72 /*0x8C4[30] = 1*/ 73 } else if (band_width != HT_CHANNEL_WIDTH_80) { 74 rtl_set_bbreg(hw, RRFMOD, 0x300, 0x2); 75 /*0x8AC[9:8] = 2'b10*/ 76 rtl_set_bbreg(hw, RADC_BUF_CLK, BIT(30), 0); 77 /*0x8C4[30] = 0*/ 78 } 79 } else if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE) { 80 /* <20120914, Kordan> A workarould to resolve 81 * 2480Mhz spur by setting ADC clock as 160M. 82 */ 83 if (band_width == HT_CHANNEL_WIDTH_20 && 84 (channel == 13 || channel == 14)) 85 rtl_set_bbreg(hw, RRFMOD, 0x300, 0x3); 86 /*0x8AC[9:8] = 11*/ 87 else if (channel <= 14) /*2.4G only*/ 88 rtl_set_bbreg(hw, RRFMOD, 0x300, 0x2); 89 /*0x8AC[9:8] = 10*/ 90 } 91 } 92 93 u32 rtl8821ae_phy_query_bb_reg(struct ieee80211_hw *hw, u32 regaddr, 94 u32 bitmask) 95 { 96 struct rtl_priv *rtlpriv = rtl_priv(hw); 97 u32 returnvalue, originalvalue, bitshift; 98 99 RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE, 100 "regaddr(%#x), bitmask(%#x)\n", 101 regaddr, bitmask); 102 originalvalue = rtl_read_dword(rtlpriv, regaddr); 103 bitshift = _rtl8821ae_phy_calculate_bit_shift(bitmask); 104 returnvalue = (originalvalue & bitmask) >> bitshift; 105 106 RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE, 107 "BBR MASK=0x%x Addr[0x%x]=0x%x\n", 108 bitmask, regaddr, originalvalue); 109 return returnvalue; 110 } 111 112 void rtl8821ae_phy_set_bb_reg(struct ieee80211_hw *hw, 113 u32 regaddr, u32 bitmask, u32 data) 114 { 115 struct rtl_priv *rtlpriv = rtl_priv(hw); 116 u32 originalvalue, bitshift; 117 118 RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE, 119 "regaddr(%#x), bitmask(%#x), data(%#x)\n", 120 regaddr, bitmask, data); 121 122 if (bitmask != MASKDWORD) { 123 originalvalue = rtl_read_dword(rtlpriv, regaddr); 124 bitshift = _rtl8821ae_phy_calculate_bit_shift(bitmask); 125 data = ((originalvalue & (~bitmask)) | 126 ((data << bitshift) & bitmask)); 127 } 128 129 rtl_write_dword(rtlpriv, regaddr, data); 130 131 RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE, 132 "regaddr(%#x), bitmask(%#x), data(%#x)\n", 133 regaddr, bitmask, data); 134 } 135 136 u32 rtl8821ae_phy_query_rf_reg(struct ieee80211_hw *hw, 137 enum radio_path rfpath, u32 regaddr, 138 u32 bitmask) 139 { 140 struct rtl_priv *rtlpriv = rtl_priv(hw); 141 u32 original_value, readback_value, bitshift; 142 143 RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE, 144 "regaddr(%#x), rfpath(%#x), bitmask(%#x)\n", 145 regaddr, rfpath, bitmask); 146 147 spin_lock(&rtlpriv->locks.rf_lock); 148 149 original_value = _rtl8821ae_phy_rf_serial_read(hw, rfpath, regaddr); 150 bitshift = _rtl8821ae_phy_calculate_bit_shift(bitmask); 151 readback_value = (original_value & bitmask) >> bitshift; 152 153 spin_unlock(&rtlpriv->locks.rf_lock); 154 155 RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE, 156 "regaddr(%#x), rfpath(%#x), bitmask(%#x), original_value(%#x)\n", 157 regaddr, rfpath, bitmask, original_value); 158 159 return readback_value; 160 } 161 162 void rtl8821ae_phy_set_rf_reg(struct ieee80211_hw *hw, 163 enum radio_path rfpath, 164 u32 regaddr, u32 bitmask, u32 data) 165 { 166 struct rtl_priv *rtlpriv = rtl_priv(hw); 167 u32 original_value, bitshift; 168 169 RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE, 170 "regaddr(%#x), bitmask(%#x), data(%#x), rfpath(%#x)\n", 171 regaddr, bitmask, data, rfpath); 172 173 spin_lock(&rtlpriv->locks.rf_lock); 174 175 if (bitmask != RFREG_OFFSET_MASK) { 176 original_value = 177 _rtl8821ae_phy_rf_serial_read(hw, rfpath, regaddr); 178 bitshift = _rtl8821ae_phy_calculate_bit_shift(bitmask); 179 data = ((original_value & (~bitmask)) | (data << bitshift)); 180 } 181 182 _rtl8821ae_phy_rf_serial_write(hw, rfpath, regaddr, data); 183 184 spin_unlock(&rtlpriv->locks.rf_lock); 185 186 RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE, 187 "regaddr(%#x), bitmask(%#x), data(%#x), rfpath(%#x)\n", 188 regaddr, bitmask, data, rfpath); 189 } 190 191 static u32 _rtl8821ae_phy_rf_serial_read(struct ieee80211_hw *hw, 192 enum radio_path rfpath, u32 offset) 193 { 194 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw)); 195 bool is_pi_mode = false; 196 u32 retvalue = 0; 197 198 /* 2009/06/17 MH We can not execute IO for power 199 save or other accident mode.*/ 200 if (RT_CANNOT_IO(hw)) { 201 pr_err("return all one\n"); 202 return 0xFFFFFFFF; 203 } 204 /* <20120809, Kordan> CCA OFF(when entering), 205 asked by James to avoid reading the wrong value. 206 <20120828, Kordan> Toggling CCA would affect RF 0x0, skip it!*/ 207 if (offset != 0x0 && 208 !((rtlhal->hw_type == HARDWARE_TYPE_RTL8821AE) || 209 (IS_VENDOR_8812A_C_CUT(rtlhal->version)))) 210 rtl_set_bbreg(hw, RCCAONSEC, 0x8, 1); 211 offset &= 0xff; 212 213 if (rfpath == RF90_PATH_A) 214 is_pi_mode = (bool)rtl_get_bbreg(hw, 0xC00, 0x4); 215 else if (rfpath == RF90_PATH_B) 216 is_pi_mode = (bool)rtl_get_bbreg(hw, 0xE00, 0x4); 217 218 rtl_set_bbreg(hw, RHSSIREAD_8821AE, 0xff, offset); 219 220 if ((rtlhal->hw_type == HARDWARE_TYPE_RTL8821AE) || 221 (IS_VENDOR_8812A_C_CUT(rtlhal->version))) 222 udelay(20); 223 224 if (is_pi_mode) { 225 if (rfpath == RF90_PATH_A) 226 retvalue = 227 rtl_get_bbreg(hw, RA_PIREAD_8821A, BLSSIREADBACKDATA); 228 else if (rfpath == RF90_PATH_B) 229 retvalue = 230 rtl_get_bbreg(hw, RB_PIREAD_8821A, BLSSIREADBACKDATA); 231 } else { 232 if (rfpath == RF90_PATH_A) 233 retvalue = 234 rtl_get_bbreg(hw, RA_SIREAD_8821A, BLSSIREADBACKDATA); 235 else if (rfpath == RF90_PATH_B) 236 retvalue = 237 rtl_get_bbreg(hw, RB_SIREAD_8821A, BLSSIREADBACKDATA); 238 } 239 240 /*<20120809, Kordan> CCA ON(when exiting), 241 * asked by James to avoid reading the wrong value. 242 * <20120828, Kordan> Toggling CCA would affect RF 0x0, skip it! 243 */ 244 if (offset != 0x0 && 245 !((rtlhal->hw_type == HARDWARE_TYPE_RTL8821AE) || 246 (IS_VENDOR_8812A_C_CUT(rtlhal->version)))) 247 rtl_set_bbreg(hw, RCCAONSEC, 0x8, 0); 248 return retvalue; 249 } 250 251 static void _rtl8821ae_phy_rf_serial_write(struct ieee80211_hw *hw, 252 enum radio_path rfpath, u32 offset, 253 u32 data) 254 { 255 struct rtl_priv *rtlpriv = rtl_priv(hw); 256 struct rtl_phy *rtlphy = &rtlpriv->phy; 257 struct bb_reg_def *pphyreg = &rtlphy->phyreg_def[rfpath]; 258 u32 data_and_addr; 259 u32 newoffset; 260 261 if (RT_CANNOT_IO(hw)) { 262 pr_err("stop\n"); 263 return; 264 } 265 offset &= 0xff; 266 newoffset = offset; 267 data_and_addr = ((newoffset << 20) | 268 (data & 0x000fffff)) & 0x0fffffff; 269 rtl_set_bbreg(hw, pphyreg->rf3wire_offset, MASKDWORD, data_and_addr); 270 RT_TRACE(rtlpriv, COMP_RF, DBG_TRACE, 271 "RFW-%d Addr[0x%x]=0x%x\n", 272 rfpath, pphyreg->rf3wire_offset, data_and_addr); 273 } 274 275 static u32 _rtl8821ae_phy_calculate_bit_shift(u32 bitmask) 276 { 277 u32 i; 278 279 for (i = 0; i <= 31; i++) { 280 if (((bitmask >> i) & 0x1) == 1) 281 break; 282 } 283 return i; 284 } 285 286 bool rtl8821ae_phy_mac_config(struct ieee80211_hw *hw) 287 { 288 bool rtstatus = 0; 289 290 rtstatus = _rtl8821ae_phy_config_mac_with_headerfile(hw); 291 292 return rtstatus; 293 } 294 295 bool rtl8821ae_phy_bb_config(struct ieee80211_hw *hw) 296 { 297 bool rtstatus = true; 298 struct rtl_priv *rtlpriv = rtl_priv(hw); 299 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw)); 300 struct rtl_phy *rtlphy = &rtlpriv->phy; 301 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw)); 302 u8 regval; 303 u8 crystal_cap; 304 305 phy_init_bb_rf_register_definition(hw); 306 307 regval = rtl_read_byte(rtlpriv, REG_SYS_FUNC_EN); 308 regval |= FEN_PCIEA; 309 rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN, regval); 310 rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN, 311 regval | FEN_BB_GLB_RSTN | FEN_BBRSTB); 312 313 rtl_write_byte(rtlpriv, REG_RF_CTRL, 0x7); 314 rtl_write_byte(rtlpriv, REG_OPT_CTRL + 2, 0x7); 315 316 rtstatus = _rtl8821ae_phy_bb8821a_config_parafile(hw); 317 318 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE) { 319 crystal_cap = rtlefuse->crystalcap & 0x3F; 320 rtl_set_bbreg(hw, REG_MAC_PHY_CTRL, 0x7FF80000, 321 (crystal_cap | (crystal_cap << 6))); 322 } else { 323 crystal_cap = rtlefuse->crystalcap & 0x3F; 324 rtl_set_bbreg(hw, REG_MAC_PHY_CTRL, 0xFFF000, 325 (crystal_cap | (crystal_cap << 6))); 326 } 327 rtlphy->reg_837 = rtl_read_byte(rtlpriv, 0x837); 328 329 return rtstatus; 330 } 331 332 bool rtl8821ae_phy_rf_config(struct ieee80211_hw *hw) 333 { 334 return rtl8821ae_phy_rf6052_config(hw); 335 } 336 337 static void _rtl8812ae_phy_set_rfe_reg_24g(struct ieee80211_hw *hw) 338 { 339 struct rtl_priv *rtlpriv = rtl_priv(hw); 340 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw)); 341 u8 tmp; 342 343 switch (rtlhal->rfe_type) { 344 case 3: 345 rtl_set_bbreg(hw, RA_RFE_PINMUX, BMASKDWORD, 0x54337770); 346 rtl_set_bbreg(hw, RB_RFE_PINMUX, BMASKDWORD, 0x54337770); 347 rtl_set_bbreg(hw, RA_RFE_INV, BMASKRFEINV, 0x010); 348 rtl_set_bbreg(hw, RB_RFE_INV, BMASKRFEINV, 0x010); 349 rtl_set_bbreg(hw, 0x900, 0x00000303, 0x1); 350 break; 351 case 4: 352 rtl_set_bbreg(hw, RA_RFE_PINMUX, BMASKDWORD, 0x77777777); 353 rtl_set_bbreg(hw, RB_RFE_PINMUX, BMASKDWORD, 0x77777777); 354 rtl_set_bbreg(hw, RA_RFE_INV, BMASKRFEINV, 0x001); 355 rtl_set_bbreg(hw, RB_RFE_INV, BMASKRFEINV, 0x001); 356 break; 357 case 5: 358 rtl_write_byte(rtlpriv, RA_RFE_PINMUX + 2, 0x77); 359 rtl_set_bbreg(hw, RB_RFE_PINMUX, BMASKDWORD, 0x77777777); 360 tmp = rtl_read_byte(rtlpriv, RA_RFE_INV + 3); 361 rtl_write_byte(rtlpriv, RA_RFE_INV + 3, tmp & ~0x1); 362 rtl_set_bbreg(hw, RB_RFE_INV, BMASKRFEINV, 0x000); 363 break; 364 case 1: 365 if (rtlpriv->btcoexist.bt_coexistence) { 366 rtl_set_bbreg(hw, RA_RFE_PINMUX, 0xffffff, 0x777777); 367 rtl_set_bbreg(hw, RB_RFE_PINMUX, BMASKDWORD, 368 0x77777777); 369 rtl_set_bbreg(hw, RA_RFE_INV, 0x33f00000, 0x000); 370 rtl_set_bbreg(hw, RB_RFE_INV, BMASKRFEINV, 0x000); 371 break; 372 } 373 /* fall through */ 374 case 0: 375 case 2: 376 default: 377 rtl_set_bbreg(hw, RA_RFE_PINMUX, BMASKDWORD, 0x77777777); 378 rtl_set_bbreg(hw, RB_RFE_PINMUX, BMASKDWORD, 0x77777777); 379 rtl_set_bbreg(hw, RA_RFE_INV, BMASKRFEINV, 0x000); 380 rtl_set_bbreg(hw, RB_RFE_INV, BMASKRFEINV, 0x000); 381 break; 382 } 383 } 384 385 static void _rtl8812ae_phy_set_rfe_reg_5g(struct ieee80211_hw *hw) 386 { 387 struct rtl_priv *rtlpriv = rtl_priv(hw); 388 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw)); 389 u8 tmp; 390 391 switch (rtlhal->rfe_type) { 392 case 0: 393 rtl_set_bbreg(hw, RA_RFE_PINMUX, BMASKDWORD, 0x77337717); 394 rtl_set_bbreg(hw, RB_RFE_PINMUX, BMASKDWORD, 0x77337717); 395 rtl_set_bbreg(hw, RA_RFE_INV, BMASKRFEINV, 0x010); 396 rtl_set_bbreg(hw, RB_RFE_INV, BMASKRFEINV, 0x010); 397 break; 398 case 1: 399 if (rtlpriv->btcoexist.bt_coexistence) { 400 rtl_set_bbreg(hw, RA_RFE_PINMUX, 0xffffff, 0x337717); 401 rtl_set_bbreg(hw, RB_RFE_PINMUX, BMASKDWORD, 402 0x77337717); 403 rtl_set_bbreg(hw, RA_RFE_INV, 0x33f00000, 0x000); 404 rtl_set_bbreg(hw, RB_RFE_INV, BMASKRFEINV, 0x000); 405 } else { 406 rtl_set_bbreg(hw, RA_RFE_PINMUX, BMASKDWORD, 407 0x77337717); 408 rtl_set_bbreg(hw, RB_RFE_PINMUX, BMASKDWORD, 409 0x77337717); 410 rtl_set_bbreg(hw, RA_RFE_INV, BMASKRFEINV, 0x000); 411 rtl_set_bbreg(hw, RB_RFE_INV, BMASKRFEINV, 0x000); 412 } 413 break; 414 case 3: 415 rtl_set_bbreg(hw, RA_RFE_PINMUX, BMASKDWORD, 0x54337717); 416 rtl_set_bbreg(hw, RB_RFE_PINMUX, BMASKDWORD, 0x54337717); 417 rtl_set_bbreg(hw, RA_RFE_INV, BMASKRFEINV, 0x010); 418 rtl_set_bbreg(hw, RB_RFE_INV, BMASKRFEINV, 0x010); 419 rtl_set_bbreg(hw, 0x900, 0x00000303, 0x1); 420 break; 421 case 5: 422 rtl_write_byte(rtlpriv, RA_RFE_PINMUX + 2, 0x33); 423 rtl_set_bbreg(hw, RB_RFE_PINMUX, BMASKDWORD, 0x77337777); 424 tmp = rtl_read_byte(rtlpriv, RA_RFE_INV + 3); 425 rtl_write_byte(rtlpriv, RA_RFE_INV + 3, tmp | 0x1); 426 rtl_set_bbreg(hw, RB_RFE_INV, BMASKRFEINV, 0x010); 427 break; 428 case 2: 429 case 4: 430 default: 431 rtl_set_bbreg(hw, RA_RFE_PINMUX, BMASKDWORD, 0x77337777); 432 rtl_set_bbreg(hw, RB_RFE_PINMUX, BMASKDWORD, 0x77337777); 433 rtl_set_bbreg(hw, RA_RFE_INV, BMASKRFEINV, 0x010); 434 rtl_set_bbreg(hw, RB_RFE_INV, BMASKRFEINV, 0x010); 435 break; 436 } 437 } 438 439 u32 phy_get_tx_swing_8812A(struct ieee80211_hw *hw, u8 band, 440 u8 rf_path) 441 { 442 struct rtl_priv *rtlpriv = rtl_priv(hw); 443 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw)); 444 struct rtl_dm *rtldm = rtl_dm(rtlpriv); 445 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw)); 446 s8 reg_swing_2g = -1;/* 0xff; */ 447 s8 reg_swing_5g = -1;/* 0xff; */ 448 s8 swing_2g = -1 * reg_swing_2g; 449 s8 swing_5g = -1 * reg_swing_5g; 450 u32 out = 0x200; 451 const s8 auto_temp = -1; 452 453 RT_TRACE(rtlpriv, COMP_SCAN, DBG_LOUD, 454 "===> PHY_GetTXBBSwing_8812A, bbSwing_2G: %d, bbSwing_5G: %d,autoload_failflag=%d.\n", 455 (int)swing_2g, (int)swing_5g, 456 (int)rtlefuse->autoload_failflag); 457 458 if (rtlefuse->autoload_failflag) { 459 if (band == BAND_ON_2_4G) { 460 rtldm->swing_diff_2g = swing_2g; 461 if (swing_2g == 0) { 462 out = 0x200; /* 0 dB */ 463 } else if (swing_2g == -3) { 464 out = 0x16A; /* -3 dB */ 465 } else if (swing_2g == -6) { 466 out = 0x101; /* -6 dB */ 467 } else if (swing_2g == -9) { 468 out = 0x0B6; /* -9 dB */ 469 } else { 470 rtldm->swing_diff_2g = 0; 471 out = 0x200; 472 } 473 } else if (band == BAND_ON_5G) { 474 rtldm->swing_diff_5g = swing_5g; 475 if (swing_5g == 0) { 476 out = 0x200; /* 0 dB */ 477 } else if (swing_5g == -3) { 478 out = 0x16A; /* -3 dB */ 479 } else if (swing_5g == -6) { 480 out = 0x101; /* -6 dB */ 481 } else if (swing_5g == -9) { 482 out = 0x0B6; /* -9 dB */ 483 } else { 484 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8821AE) { 485 rtldm->swing_diff_5g = -3; 486 out = 0x16A; 487 } else { 488 rtldm->swing_diff_5g = 0; 489 out = 0x200; 490 } 491 } 492 } else { 493 rtldm->swing_diff_2g = -3; 494 rtldm->swing_diff_5g = -3; 495 out = 0x16A; /* -3 dB */ 496 } 497 } else { 498 u32 swing = 0, swing_a = 0, swing_b = 0; 499 500 if (band == BAND_ON_2_4G) { 501 if (reg_swing_2g == auto_temp) { 502 efuse_shadow_read(hw, 1, 0xC6, (u32 *)&swing); 503 swing = (swing == 0xFF) ? 0x00 : swing; 504 } else if (swing_2g == 0) { 505 swing = 0x00; /* 0 dB */ 506 } else if (swing_2g == -3) { 507 swing = 0x05; /* -3 dB */ 508 } else if (swing_2g == -6) { 509 swing = 0x0A; /* -6 dB */ 510 } else if (swing_2g == -9) { 511 swing = 0xFF; /* -9 dB */ 512 } else { 513 swing = 0x00; 514 } 515 } else { 516 if (reg_swing_5g == auto_temp) { 517 efuse_shadow_read(hw, 1, 0xC7, (u32 *)&swing); 518 swing = (swing == 0xFF) ? 0x00 : swing; 519 } else if (swing_5g == 0) { 520 swing = 0x00; /* 0 dB */ 521 } else if (swing_5g == -3) { 522 swing = 0x05; /* -3 dB */ 523 } else if (swing_5g == -6) { 524 swing = 0x0A; /* -6 dB */ 525 } else if (swing_5g == -9) { 526 swing = 0xFF; /* -9 dB */ 527 } else { 528 swing = 0x00; 529 } 530 } 531 532 swing_a = (swing & 0x3) >> 0; /* 0xC6/C7[1:0] */ 533 swing_b = (swing & 0xC) >> 2; /* 0xC6/C7[3:2] */ 534 RT_TRACE(rtlpriv, COMP_SCAN, DBG_LOUD, 535 "===> PHY_GetTXBBSwing_8812A, swingA: 0x%X, swingB: 0x%X\n", 536 swing_a, swing_b); 537 538 /* 3 Path-A */ 539 if (swing_a == 0x0) { 540 if (band == BAND_ON_2_4G) 541 rtldm->swing_diff_2g = 0; 542 else 543 rtldm->swing_diff_5g = 0; 544 out = 0x200; /* 0 dB */ 545 } else if (swing_a == 0x1) { 546 if (band == BAND_ON_2_4G) 547 rtldm->swing_diff_2g = -3; 548 else 549 rtldm->swing_diff_5g = -3; 550 out = 0x16A; /* -3 dB */ 551 } else if (swing_a == 0x2) { 552 if (band == BAND_ON_2_4G) 553 rtldm->swing_diff_2g = -6; 554 else 555 rtldm->swing_diff_5g = -6; 556 out = 0x101; /* -6 dB */ 557 } else if (swing_a == 0x3) { 558 if (band == BAND_ON_2_4G) 559 rtldm->swing_diff_2g = -9; 560 else 561 rtldm->swing_diff_5g = -9; 562 out = 0x0B6; /* -9 dB */ 563 } 564 /* 3 Path-B */ 565 if (swing_b == 0x0) { 566 if (band == BAND_ON_2_4G) 567 rtldm->swing_diff_2g = 0; 568 else 569 rtldm->swing_diff_5g = 0; 570 out = 0x200; /* 0 dB */ 571 } else if (swing_b == 0x1) { 572 if (band == BAND_ON_2_4G) 573 rtldm->swing_diff_2g = -3; 574 else 575 rtldm->swing_diff_5g = -3; 576 out = 0x16A; /* -3 dB */ 577 } else if (swing_b == 0x2) { 578 if (band == BAND_ON_2_4G) 579 rtldm->swing_diff_2g = -6; 580 else 581 rtldm->swing_diff_5g = -6; 582 out = 0x101; /* -6 dB */ 583 } else if (swing_b == 0x3) { 584 if (band == BAND_ON_2_4G) 585 rtldm->swing_diff_2g = -9; 586 else 587 rtldm->swing_diff_5g = -9; 588 out = 0x0B6; /* -9 dB */ 589 } 590 } 591 592 RT_TRACE(rtlpriv, COMP_SCAN, DBG_LOUD, 593 "<=== PHY_GetTXBBSwing_8812A, out = 0x%X\n", out); 594 return out; 595 } 596 597 void rtl8821ae_phy_switch_wirelessband(struct ieee80211_hw *hw, u8 band) 598 { 599 struct rtl_priv *rtlpriv = rtl_priv(hw); 600 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw)); 601 struct rtl_dm *rtldm = rtl_dm(rtlpriv); 602 u8 current_band = rtlhal->current_bandtype; 603 u32 txpath, rxpath; 604 s8 bb_diff_between_band; 605 606 txpath = rtl8821ae_phy_query_bb_reg(hw, RTXPATH, 0xf0); 607 rxpath = rtl8821ae_phy_query_bb_reg(hw, RCCK_RX, 0x0f000000); 608 rtlhal->current_bandtype = (enum band_type) band; 609 /* reconfig BB/RF according to wireless mode */ 610 if (rtlhal->current_bandtype == BAND_ON_2_4G) { 611 /* BB & RF Config */ 612 rtl_set_bbreg(hw, ROFDMCCKEN, BOFDMEN|BCCKEN, 0x03); 613 614 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8821AE) { 615 /* 0xCB0[15:12] = 0x7 (LNA_On)*/ 616 rtl_set_bbreg(hw, RA_RFE_PINMUX, 0xF000, 0x7); 617 /* 0xCB0[7:4] = 0x7 (PAPE_A)*/ 618 rtl_set_bbreg(hw, RA_RFE_PINMUX, 0xF0, 0x7); 619 } 620 621 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE) { 622 /*0x834[1:0] = 0x1*/ 623 rtl_set_bbreg(hw, 0x834, 0x3, 0x1); 624 } 625 626 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8821AE) { 627 /* 0xC1C[11:8] = 0 */ 628 rtl_set_bbreg(hw, RA_TXSCALE, 0xF00, 0); 629 } else { 630 /* 0x82C[1:0] = 2b'00 */ 631 rtl_set_bbreg(hw, 0x82c, 0x3, 0); 632 } 633 634 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE) 635 _rtl8812ae_phy_set_rfe_reg_24g(hw); 636 637 rtl_set_bbreg(hw, RTXPATH, 0xf0, 0x1); 638 rtl_set_bbreg(hw, RCCK_RX, 0x0f000000, 0x1); 639 640 rtl_write_byte(rtlpriv, REG_CCK_CHECK, 0x0); 641 } else {/* 5G band */ 642 u16 count, reg_41a; 643 644 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8821AE) { 645 /*0xCB0[15:12] = 0x5 (LNA_On)*/ 646 rtl_set_bbreg(hw, RA_RFE_PINMUX, 0xF000, 0x5); 647 /*0xCB0[7:4] = 0x4 (PAPE_A)*/ 648 rtl_set_bbreg(hw, RA_RFE_PINMUX, 0xF0, 0x4); 649 } 650 /*CCK_CHECK_en*/ 651 rtl_write_byte(rtlpriv, REG_CCK_CHECK, 0x80); 652 653 count = 0; 654 reg_41a = rtl_read_word(rtlpriv, REG_TXPKT_EMPTY); 655 RT_TRACE(rtlpriv, COMP_SCAN, DBG_LOUD, 656 "Reg41A value %d\n", reg_41a); 657 reg_41a &= 0x30; 658 while ((reg_41a != 0x30) && (count < 50)) { 659 udelay(50); 660 RT_TRACE(rtlpriv, COMP_SCAN, DBG_LOUD, "Delay 50us\n"); 661 662 reg_41a = rtl_read_word(rtlpriv, REG_TXPKT_EMPTY); 663 reg_41a &= 0x30; 664 count++; 665 RT_TRACE(rtlpriv, COMP_SCAN, DBG_LOUD, 666 "Reg41A value %d\n", reg_41a); 667 } 668 if (count != 0) 669 RT_TRACE(rtlpriv, COMP_MLME, DBG_LOUD, 670 "PHY_SwitchWirelessBand8812(): Switch to 5G Band. Count = %d reg41A=0x%x\n", 671 count, reg_41a); 672 673 /* 2012/02/01, Sinda add registry to switch workaround 674 without long-run verification for scan issue. */ 675 rtl_set_bbreg(hw, ROFDMCCKEN, BOFDMEN|BCCKEN, 0x03); 676 677 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE) { 678 /*0x834[1:0] = 0x2*/ 679 rtl_set_bbreg(hw, 0x834, 0x3, 0x2); 680 } 681 682 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8821AE) { 683 /* AGC table select */ 684 /* 0xC1C[11:8] = 1*/ 685 rtl_set_bbreg(hw, RA_TXSCALE, 0xF00, 1); 686 } else 687 /* 0x82C[1:0] = 2'b00 */ 688 rtl_set_bbreg(hw, 0x82c, 0x3, 1); 689 690 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE) 691 _rtl8812ae_phy_set_rfe_reg_5g(hw); 692 693 rtl_set_bbreg(hw, RTXPATH, 0xf0, 0); 694 rtl_set_bbreg(hw, RCCK_RX, 0x0f000000, 0xf); 695 696 RT_TRACE(rtlpriv, COMP_SCAN, DBG_LOUD, 697 "==>PHY_SwitchWirelessBand8812() BAND_ON_5G settings OFDM index 0x%x\n", 698 rtlpriv->dm.ofdm_index[RF90_PATH_A]); 699 } 700 701 if ((rtlhal->hw_type == HARDWARE_TYPE_RTL8821AE) || 702 (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE)) { 703 /* 0xC1C[31:21] */ 704 rtl_set_bbreg(hw, RA_TXSCALE, 0xFFE00000, 705 phy_get_tx_swing_8812A(hw, band, RF90_PATH_A)); 706 /* 0xE1C[31:21] */ 707 rtl_set_bbreg(hw, RB_TXSCALE, 0xFFE00000, 708 phy_get_tx_swing_8812A(hw, band, RF90_PATH_B)); 709 710 /* <20121005, Kordan> When TxPowerTrack is ON, 711 * we should take care of the change of BB swing. 712 * That is, reset all info to trigger Tx power tracking. 713 */ 714 if (band != current_band) { 715 bb_diff_between_band = 716 (rtldm->swing_diff_2g - rtldm->swing_diff_5g); 717 bb_diff_between_band = (band == BAND_ON_2_4G) ? 718 bb_diff_between_band : 719 (-1 * bb_diff_between_band); 720 rtldm->default_ofdm_index += bb_diff_between_band * 2; 721 } 722 rtl8821ae_dm_clear_txpower_tracking_state(hw); 723 } 724 725 RT_TRACE(rtlpriv, COMP_SCAN, DBG_TRACE, 726 "<==rtl8821ae_phy_switch_wirelessband():Switch Band OK.\n"); 727 return; 728 } 729 730 static bool _rtl8821ae_check_positive(struct ieee80211_hw *hw, 731 const u32 condition1, 732 const u32 condition2) 733 { 734 struct rtl_priv *rtlpriv = rtl_priv(hw); 735 struct rtl_hal *rtlhal = rtl_hal(rtlpriv); 736 u32 cut_ver = ((rtlhal->version & CHIP_VER_RTL_MASK) 737 >> CHIP_VER_RTL_SHIFT); 738 u32 intf = (rtlhal->interface == INTF_USB ? BIT(1) : BIT(0)); 739 740 u8 board_type = ((rtlhal->board_type & BIT(4)) >> 4) << 0 | /* _GLNA */ 741 ((rtlhal->board_type & BIT(3)) >> 3) << 1 | /* _GPA */ 742 ((rtlhal->board_type & BIT(7)) >> 7) << 2 | /* _ALNA */ 743 ((rtlhal->board_type & BIT(6)) >> 6) << 3 | /* _APA */ 744 ((rtlhal->board_type & BIT(2)) >> 2) << 4; /* _BT */ 745 746 u32 cond1 = condition1, cond2 = condition2; 747 u32 driver1 = cut_ver << 24 | /* CUT ver */ 748 0 << 20 | /* interface 2/2 */ 749 0x04 << 16 | /* platform */ 750 rtlhal->package_type << 12 | 751 intf << 8 | /* interface 1/2 */ 752 board_type; 753 754 u32 driver2 = rtlhal->type_glna << 0 | 755 rtlhal->type_gpa << 8 | 756 rtlhal->type_alna << 16 | 757 rtlhal->type_apa << 24; 758 759 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, 760 "===> [8812A] CheckPositive (cond1, cond2) = (0x%X 0x%X)\n", 761 cond1, cond2); 762 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, 763 "===> [8812A] CheckPositive (driver1, driver2) = (0x%X 0x%X)\n", 764 driver1, driver2); 765 766 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, 767 " (Platform, Interface) = (0x%X, 0x%X)\n", 0x04, intf); 768 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, 769 " (Board, Package) = (0x%X, 0x%X)\n", 770 rtlhal->board_type, rtlhal->package_type); 771 772 /*============== Value Defined Check ===============*/ 773 /*QFN Type [15:12] and Cut Version [27:24] need to do value check*/ 774 775 if (((cond1 & 0x0000F000) != 0) && ((cond1 & 0x0000F000) != 776 (driver1 & 0x0000F000))) 777 return false; 778 if (((cond1 & 0x0F000000) != 0) && ((cond1 & 0x0F000000) != 779 (driver1 & 0x0F000000))) 780 return false; 781 782 /*=============== Bit Defined Check ================*/ 783 /* We don't care [31:28] */ 784 785 cond1 &= 0x00FF0FFF; 786 driver1 &= 0x00FF0FFF; 787 788 if ((cond1 & driver1) == cond1) { 789 u32 mask = 0; 790 791 if ((cond1 & 0x0F) == 0) /* BoardType is DONTCARE*/ 792 return true; 793 794 if ((cond1 & BIT(0)) != 0) /*GLNA*/ 795 mask |= 0x000000FF; 796 if ((cond1 & BIT(1)) != 0) /*GPA*/ 797 mask |= 0x0000FF00; 798 if ((cond1 & BIT(2)) != 0) /*ALNA*/ 799 mask |= 0x00FF0000; 800 if ((cond1 & BIT(3)) != 0) /*APA*/ 801 mask |= 0xFF000000; 802 803 /* BoardType of each RF path is matched*/ 804 if ((cond2 & mask) == (driver2 & mask)) 805 return true; 806 else 807 return false; 808 } else 809 return false; 810 } 811 812 static bool _rtl8821ae_check_condition(struct ieee80211_hw *hw, 813 const u32 condition) 814 { 815 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw)); 816 u32 _board = rtlefuse->board_type; /*need efuse define*/ 817 u32 _interface = 0x01; /* ODM_ITRF_PCIE */ 818 u32 _platform = 0x08;/* ODM_WIN */ 819 u32 cond = condition; 820 821 if (condition == 0xCDCDCDCD) 822 return true; 823 824 cond = condition & 0xFF; 825 if ((_board != cond) && cond != 0xFF) 826 return false; 827 828 cond = condition & 0xFF00; 829 cond = cond >> 8; 830 if ((_interface & cond) == 0 && cond != 0x07) 831 return false; 832 833 cond = condition & 0xFF0000; 834 cond = cond >> 16; 835 if ((_platform & cond) == 0 && cond != 0x0F) 836 return false; 837 return true; 838 } 839 840 static void _rtl8821ae_config_rf_reg(struct ieee80211_hw *hw, 841 u32 addr, u32 data, 842 enum radio_path rfpath, u32 regaddr) 843 { 844 if (addr == 0xfe || addr == 0xffe) { 845 /* In order not to disturb BT music when 846 * wifi init.(1ant NIC only) 847 */ 848 mdelay(50); 849 } else { 850 rtl_set_rfreg(hw, rfpath, regaddr, RFREG_OFFSET_MASK, data); 851 udelay(1); 852 } 853 } 854 855 static void _rtl8821ae_config_rf_radio_a(struct ieee80211_hw *hw, 856 u32 addr, u32 data) 857 { 858 u32 content = 0x1000; /*RF Content: radio_a_txt*/ 859 u32 maskforphyset = (u32)(content & 0xE000); 860 861 _rtl8821ae_config_rf_reg(hw, addr, data, 862 RF90_PATH_A, addr | maskforphyset); 863 } 864 865 static void _rtl8821ae_config_rf_radio_b(struct ieee80211_hw *hw, 866 u32 addr, u32 data) 867 { 868 u32 content = 0x1001; /*RF Content: radio_b_txt*/ 869 u32 maskforphyset = (u32)(content & 0xE000); 870 871 _rtl8821ae_config_rf_reg(hw, addr, data, 872 RF90_PATH_B, addr | maskforphyset); 873 } 874 875 static void _rtl8821ae_config_bb_reg(struct ieee80211_hw *hw, 876 u32 addr, u32 data) 877 { 878 if (addr == 0xfe) 879 mdelay(50); 880 else if (addr == 0xfd) 881 mdelay(5); 882 else if (addr == 0xfc) 883 mdelay(1); 884 else if (addr == 0xfb) 885 udelay(50); 886 else if (addr == 0xfa) 887 udelay(5); 888 else if (addr == 0xf9) 889 udelay(1); 890 else 891 rtl_set_bbreg(hw, addr, MASKDWORD, data); 892 893 udelay(1); 894 } 895 896 static void _rtl8821ae_phy_init_tx_power_by_rate(struct ieee80211_hw *hw) 897 { 898 struct rtl_priv *rtlpriv = rtl_priv(hw); 899 struct rtl_phy *rtlphy = &rtlpriv->phy; 900 u8 band, rfpath, txnum, rate_section; 901 902 for (band = BAND_ON_2_4G; band <= BAND_ON_5G; ++band) 903 for (rfpath = 0; rfpath < TX_PWR_BY_RATE_NUM_RF; ++rfpath) 904 for (txnum = 0; txnum < TX_PWR_BY_RATE_NUM_RF; ++txnum) 905 for (rate_section = 0; 906 rate_section < TX_PWR_BY_RATE_NUM_SECTION; 907 ++rate_section) 908 rtlphy->tx_power_by_rate_offset[band] 909 [rfpath][txnum][rate_section] = 0; 910 } 911 912 static void _rtl8821ae_phy_set_txpower_by_rate_base(struct ieee80211_hw *hw, 913 u8 band, u8 path, 914 u8 rate_section, 915 u8 txnum, u8 value) 916 { 917 struct rtl_priv *rtlpriv = rtl_priv(hw); 918 struct rtl_phy *rtlphy = &rtlpriv->phy; 919 920 if (path > RF90_PATH_D) { 921 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, 922 "Invalid Rf Path %d in phy_SetTxPowerByRatBase()\n", path); 923 return; 924 } 925 926 if (band == BAND_ON_2_4G) { 927 switch (rate_section) { 928 case CCK: 929 rtlphy->txpwr_by_rate_base_24g[path][txnum][0] = value; 930 break; 931 case OFDM: 932 rtlphy->txpwr_by_rate_base_24g[path][txnum][1] = value; 933 break; 934 case HT_MCS0_MCS7: 935 rtlphy->txpwr_by_rate_base_24g[path][txnum][2] = value; 936 break; 937 case HT_MCS8_MCS15: 938 rtlphy->txpwr_by_rate_base_24g[path][txnum][3] = value; 939 break; 940 case VHT_1SSMCS0_1SSMCS9: 941 rtlphy->txpwr_by_rate_base_24g[path][txnum][4] = value; 942 break; 943 case VHT_2SSMCS0_2SSMCS9: 944 rtlphy->txpwr_by_rate_base_24g[path][txnum][5] = value; 945 break; 946 default: 947 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, 948 "Invalid RateSection %d in Band 2.4G,Rf Path %d, %dTx in PHY_SetTxPowerByRateBase()\n", 949 rate_section, path, txnum); 950 break; 951 } 952 } else if (band == BAND_ON_5G) { 953 switch (rate_section) { 954 case OFDM: 955 rtlphy->txpwr_by_rate_base_5g[path][txnum][0] = value; 956 break; 957 case HT_MCS0_MCS7: 958 rtlphy->txpwr_by_rate_base_5g[path][txnum][1] = value; 959 break; 960 case HT_MCS8_MCS15: 961 rtlphy->txpwr_by_rate_base_5g[path][txnum][2] = value; 962 break; 963 case VHT_1SSMCS0_1SSMCS9: 964 rtlphy->txpwr_by_rate_base_5g[path][txnum][3] = value; 965 break; 966 case VHT_2SSMCS0_2SSMCS9: 967 rtlphy->txpwr_by_rate_base_5g[path][txnum][4] = value; 968 break; 969 default: 970 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, 971 "Invalid RateSection %d in Band 5G, Rf Path %d, %dTx in PHY_SetTxPowerByRateBase()\n", 972 rate_section, path, txnum); 973 break; 974 } 975 } else { 976 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, 977 "Invalid Band %d in PHY_SetTxPowerByRateBase()\n", band); 978 } 979 } 980 981 static u8 _rtl8821ae_phy_get_txpower_by_rate_base(struct ieee80211_hw *hw, 982 u8 band, u8 path, 983 u8 txnum, u8 rate_section) 984 { 985 struct rtl_priv *rtlpriv = rtl_priv(hw); 986 struct rtl_phy *rtlphy = &rtlpriv->phy; 987 u8 value = 0; 988 989 if (path > RF90_PATH_D) { 990 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, 991 "Invalid Rf Path %d in PHY_GetTxPowerByRateBase()\n", 992 path); 993 return 0; 994 } 995 996 if (band == BAND_ON_2_4G) { 997 switch (rate_section) { 998 case CCK: 999 value = rtlphy->txpwr_by_rate_base_24g[path][txnum][0]; 1000 break; 1001 case OFDM: 1002 value = rtlphy->txpwr_by_rate_base_24g[path][txnum][1]; 1003 break; 1004 case HT_MCS0_MCS7: 1005 value = rtlphy->txpwr_by_rate_base_24g[path][txnum][2]; 1006 break; 1007 case HT_MCS8_MCS15: 1008 value = rtlphy->txpwr_by_rate_base_24g[path][txnum][3]; 1009 break; 1010 case VHT_1SSMCS0_1SSMCS9: 1011 value = rtlphy->txpwr_by_rate_base_24g[path][txnum][4]; 1012 break; 1013 case VHT_2SSMCS0_2SSMCS9: 1014 value = rtlphy->txpwr_by_rate_base_24g[path][txnum][5]; 1015 break; 1016 default: 1017 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, 1018 "Invalid RateSection %d in Band 2.4G, Rf Path %d, %dTx in PHY_GetTxPowerByRateBase()\n", 1019 rate_section, path, txnum); 1020 break; 1021 } 1022 } else if (band == BAND_ON_5G) { 1023 switch (rate_section) { 1024 case OFDM: 1025 value = rtlphy->txpwr_by_rate_base_5g[path][txnum][0]; 1026 break; 1027 case HT_MCS0_MCS7: 1028 value = rtlphy->txpwr_by_rate_base_5g[path][txnum][1]; 1029 break; 1030 case HT_MCS8_MCS15: 1031 value = rtlphy->txpwr_by_rate_base_5g[path][txnum][2]; 1032 break; 1033 case VHT_1SSMCS0_1SSMCS9: 1034 value = rtlphy->txpwr_by_rate_base_5g[path][txnum][3]; 1035 break; 1036 case VHT_2SSMCS0_2SSMCS9: 1037 value = rtlphy->txpwr_by_rate_base_5g[path][txnum][4]; 1038 break; 1039 default: 1040 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, 1041 "Invalid RateSection %d in Band 5G, Rf Path %d, %dTx in PHY_GetTxPowerByRateBase()\n", 1042 rate_section, path, txnum); 1043 break; 1044 } 1045 } else { 1046 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, 1047 "Invalid Band %d in PHY_GetTxPowerByRateBase()\n", band); 1048 } 1049 1050 return value; 1051 } 1052 1053 static void _rtl8821ae_phy_store_txpower_by_rate_base(struct ieee80211_hw *hw) 1054 { 1055 struct rtl_priv *rtlpriv = rtl_priv(hw); 1056 struct rtl_phy *rtlphy = &rtlpriv->phy; 1057 u16 rawvalue = 0; 1058 u8 base = 0, path = 0; 1059 1060 for (path = RF90_PATH_A; path <= RF90_PATH_B; ++path) { 1061 rawvalue = (u16)(rtlphy->tx_power_by_rate_offset[BAND_ON_2_4G][path][RF_1TX][0] >> 24) & 0xFF; 1062 base = (rawvalue >> 4) * 10 + (rawvalue & 0xF); 1063 _rtl8821ae_phy_set_txpower_by_rate_base(hw, BAND_ON_2_4G, path, CCK, RF_1TX, base); 1064 1065 rawvalue = (u16)(rtlphy->tx_power_by_rate_offset[BAND_ON_2_4G][path][RF_1TX][2] >> 24) & 0xFF; 1066 base = (rawvalue >> 4) * 10 + (rawvalue & 0xF); 1067 _rtl8821ae_phy_set_txpower_by_rate_base(hw, BAND_ON_2_4G, path, OFDM, RF_1TX, base); 1068 1069 rawvalue = (u16)(rtlphy->tx_power_by_rate_offset[BAND_ON_2_4G][path][RF_1TX][4] >> 24) & 0xFF; 1070 base = (rawvalue >> 4) * 10 + (rawvalue & 0xF); 1071 _rtl8821ae_phy_set_txpower_by_rate_base(hw, BAND_ON_2_4G, path, HT_MCS0_MCS7, RF_1TX, base); 1072 1073 rawvalue = (u16)(rtlphy->tx_power_by_rate_offset[BAND_ON_2_4G][path][RF_2TX][6] >> 24) & 0xFF; 1074 base = (rawvalue >> 4) * 10 + (rawvalue & 0xF); 1075 _rtl8821ae_phy_set_txpower_by_rate_base(hw, BAND_ON_2_4G, path, HT_MCS8_MCS15, RF_2TX, base); 1076 1077 rawvalue = (u16)(rtlphy->tx_power_by_rate_offset[BAND_ON_2_4G][path][RF_1TX][8] >> 24) & 0xFF; 1078 base = (rawvalue >> 4) * 10 + (rawvalue & 0xF); 1079 _rtl8821ae_phy_set_txpower_by_rate_base(hw, BAND_ON_2_4G, path, VHT_1SSMCS0_1SSMCS9, RF_1TX, base); 1080 1081 rawvalue = (u16)(rtlphy->tx_power_by_rate_offset[BAND_ON_2_4G][path][RF_2TX][11] >> 8) & 0xFF; 1082 base = (rawvalue >> 4) * 10 + (rawvalue & 0xF); 1083 _rtl8821ae_phy_set_txpower_by_rate_base(hw, BAND_ON_2_4G, path, VHT_2SSMCS0_2SSMCS9, RF_2TX, base); 1084 1085 rawvalue = (u16)(rtlphy->tx_power_by_rate_offset[BAND_ON_5G][path][RF_1TX][2] >> 24) & 0xFF; 1086 base = (rawvalue >> 4) * 10 + (rawvalue & 0xF); 1087 _rtl8821ae_phy_set_txpower_by_rate_base(hw, BAND_ON_5G, path, OFDM, RF_1TX, base); 1088 1089 rawvalue = (u16)(rtlphy->tx_power_by_rate_offset[BAND_ON_5G][path][RF_1TX][4] >> 24) & 0xFF; 1090 base = (rawvalue >> 4) * 10 + (rawvalue & 0xF); 1091 _rtl8821ae_phy_set_txpower_by_rate_base(hw, BAND_ON_5G, path, HT_MCS0_MCS7, RF_1TX, base); 1092 1093 rawvalue = (u16)(rtlphy->tx_power_by_rate_offset[BAND_ON_5G][path][RF_2TX][6] >> 24) & 0xFF; 1094 base = (rawvalue >> 4) * 10 + (rawvalue & 0xF); 1095 _rtl8821ae_phy_set_txpower_by_rate_base(hw, BAND_ON_5G, path, HT_MCS8_MCS15, RF_2TX, base); 1096 1097 rawvalue = (u16)(rtlphy->tx_power_by_rate_offset[BAND_ON_5G][path][RF_1TX][8] >> 24) & 0xFF; 1098 base = (rawvalue >> 4) * 10 + (rawvalue & 0xF); 1099 _rtl8821ae_phy_set_txpower_by_rate_base(hw, BAND_ON_5G, path, VHT_1SSMCS0_1SSMCS9, RF_1TX, base); 1100 1101 rawvalue = (u16)(rtlphy->tx_power_by_rate_offset[BAND_ON_5G][path][RF_2TX][11] >> 8) & 0xFF; 1102 base = (rawvalue >> 4) * 10 + (rawvalue & 0xF); 1103 _rtl8821ae_phy_set_txpower_by_rate_base(hw, BAND_ON_5G, path, VHT_2SSMCS0_2SSMCS9, RF_2TX, base); 1104 } 1105 } 1106 1107 static void _phy_convert_txpower_dbm_to_relative_value(u32 *data, u8 start, 1108 u8 end, u8 base_val) 1109 { 1110 int i; 1111 u8 temp_value = 0; 1112 u32 temp_data = 0; 1113 1114 for (i = 3; i >= 0; --i) { 1115 if (i >= start && i <= end) { 1116 /* Get the exact value */ 1117 temp_value = (u8)(*data >> (i * 8)) & 0xF; 1118 temp_value += ((u8)((*data >> (i * 8 + 4)) & 0xF)) * 10; 1119 1120 /* Change the value to a relative value */ 1121 temp_value = (temp_value > base_val) ? temp_value - 1122 base_val : base_val - temp_value; 1123 } else { 1124 temp_value = (u8)(*data >> (i * 8)) & 0xFF; 1125 } 1126 temp_data <<= 8; 1127 temp_data |= temp_value; 1128 } 1129 *data = temp_data; 1130 } 1131 1132 static void _rtl8812ae_phy_cross_reference_ht_and_vht_txpower_limit(struct ieee80211_hw *hw) 1133 { 1134 struct rtl_priv *rtlpriv = rtl_priv(hw); 1135 struct rtl_phy *rtlphy = &rtlpriv->phy; 1136 u8 regulation, bw, channel, rate_section; 1137 s8 temp_pwrlmt = 0; 1138 1139 for (regulation = 0; regulation < MAX_REGULATION_NUM; ++regulation) { 1140 for (bw = 0; bw < MAX_5G_BANDWIDTH_NUM; ++bw) { 1141 for (channel = 0; channel < CHANNEL_MAX_NUMBER_5G; ++channel) { 1142 for (rate_section = 0; rate_section < MAX_RATE_SECTION_NUM; ++rate_section) { 1143 temp_pwrlmt = rtlphy->txpwr_limit_5g[regulation] 1144 [bw][rate_section][channel][RF90_PATH_A]; 1145 if (temp_pwrlmt == MAX_POWER_INDEX) { 1146 if (bw == 0 || bw == 1) { /*5G 20M 40M VHT and HT can cross reference*/ 1147 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, 1148 "No power limit table of the specified band %d, bandwidth %d, ratesection %d, channel %d, rf path %d\n", 1149 1, bw, rate_section, channel, RF90_PATH_A); 1150 if (rate_section == 2) { 1151 rtlphy->txpwr_limit_5g[regulation][bw][2][channel][RF90_PATH_A] = 1152 rtlphy->txpwr_limit_5g[regulation][bw][4][channel][RF90_PATH_A]; 1153 } else if (rate_section == 4) { 1154 rtlphy->txpwr_limit_5g[regulation][bw][4][channel][RF90_PATH_A] = 1155 rtlphy->txpwr_limit_5g[regulation][bw][2][channel][RF90_PATH_A]; 1156 } else if (rate_section == 3) { 1157 rtlphy->txpwr_limit_5g[regulation][bw][3][channel][RF90_PATH_A] = 1158 rtlphy->txpwr_limit_5g[regulation][bw][5][channel][RF90_PATH_A]; 1159 } else if (rate_section == 5) { 1160 rtlphy->txpwr_limit_5g[regulation][bw][5][channel][RF90_PATH_A] = 1161 rtlphy->txpwr_limit_5g[regulation][bw][3][channel][RF90_PATH_A]; 1162 } 1163 1164 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, "use other value %d\n", temp_pwrlmt); 1165 } 1166 } 1167 } 1168 } 1169 } 1170 } 1171 } 1172 1173 static u8 _rtl8812ae_phy_get_txpower_by_rate_base_index(struct ieee80211_hw *hw, 1174 enum band_type band, u8 rate) 1175 { 1176 struct rtl_priv *rtlpriv = rtl_priv(hw); 1177 u8 index = 0; 1178 if (band == BAND_ON_2_4G) { 1179 switch (rate) { 1180 case MGN_1M: 1181 case MGN_2M: 1182 case MGN_5_5M: 1183 case MGN_11M: 1184 index = 0; 1185 break; 1186 1187 case MGN_6M: 1188 case MGN_9M: 1189 case MGN_12M: 1190 case MGN_18M: 1191 case MGN_24M: 1192 case MGN_36M: 1193 case MGN_48M: 1194 case MGN_54M: 1195 index = 1; 1196 break; 1197 1198 case MGN_MCS0: 1199 case MGN_MCS1: 1200 case MGN_MCS2: 1201 case MGN_MCS3: 1202 case MGN_MCS4: 1203 case MGN_MCS5: 1204 case MGN_MCS6: 1205 case MGN_MCS7: 1206 index = 2; 1207 break; 1208 1209 case MGN_MCS8: 1210 case MGN_MCS9: 1211 case MGN_MCS10: 1212 case MGN_MCS11: 1213 case MGN_MCS12: 1214 case MGN_MCS13: 1215 case MGN_MCS14: 1216 case MGN_MCS15: 1217 index = 3; 1218 break; 1219 1220 default: 1221 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, 1222 "Wrong rate 0x%x to obtain index in 2.4G in PHY_GetTxPowerByRateBaseIndex()\n", 1223 rate); 1224 break; 1225 } 1226 } else if (band == BAND_ON_5G) { 1227 switch (rate) { 1228 case MGN_6M: 1229 case MGN_9M: 1230 case MGN_12M: 1231 case MGN_18M: 1232 case MGN_24M: 1233 case MGN_36M: 1234 case MGN_48M: 1235 case MGN_54M: 1236 index = 0; 1237 break; 1238 1239 case MGN_MCS0: 1240 case MGN_MCS1: 1241 case MGN_MCS2: 1242 case MGN_MCS3: 1243 case MGN_MCS4: 1244 case MGN_MCS5: 1245 case MGN_MCS6: 1246 case MGN_MCS7: 1247 index = 1; 1248 break; 1249 1250 case MGN_MCS8: 1251 case MGN_MCS9: 1252 case MGN_MCS10: 1253 case MGN_MCS11: 1254 case MGN_MCS12: 1255 case MGN_MCS13: 1256 case MGN_MCS14: 1257 case MGN_MCS15: 1258 index = 2; 1259 break; 1260 1261 case MGN_VHT1SS_MCS0: 1262 case MGN_VHT1SS_MCS1: 1263 case MGN_VHT1SS_MCS2: 1264 case MGN_VHT1SS_MCS3: 1265 case MGN_VHT1SS_MCS4: 1266 case MGN_VHT1SS_MCS5: 1267 case MGN_VHT1SS_MCS6: 1268 case MGN_VHT1SS_MCS7: 1269 case MGN_VHT1SS_MCS8: 1270 case MGN_VHT1SS_MCS9: 1271 index = 3; 1272 break; 1273 1274 case MGN_VHT2SS_MCS0: 1275 case MGN_VHT2SS_MCS1: 1276 case MGN_VHT2SS_MCS2: 1277 case MGN_VHT2SS_MCS3: 1278 case MGN_VHT2SS_MCS4: 1279 case MGN_VHT2SS_MCS5: 1280 case MGN_VHT2SS_MCS6: 1281 case MGN_VHT2SS_MCS7: 1282 case MGN_VHT2SS_MCS8: 1283 case MGN_VHT2SS_MCS9: 1284 index = 4; 1285 break; 1286 1287 default: 1288 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, 1289 "Wrong rate 0x%x to obtain index in 5G in PHY_GetTxPowerByRateBaseIndex()\n", 1290 rate); 1291 break; 1292 } 1293 } 1294 1295 return index; 1296 } 1297 1298 static void _rtl8812ae_phy_convert_txpower_limit_to_power_index(struct ieee80211_hw *hw) 1299 { 1300 struct rtl_priv *rtlpriv = rtl_priv(hw); 1301 struct rtl_phy *rtlphy = &rtlpriv->phy; 1302 u8 bw40_pwr_base_dbm2_4G, bw40_pwr_base_dbm5G; 1303 u8 regulation, bw, channel, rate_section; 1304 u8 base_index2_4G = 0; 1305 u8 base_index5G = 0; 1306 s8 temp_value = 0, temp_pwrlmt = 0; 1307 u8 rf_path = 0; 1308 1309 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, 1310 "=====> _rtl8812ae_phy_convert_txpower_limit_to_power_index()\n"); 1311 1312 _rtl8812ae_phy_cross_reference_ht_and_vht_txpower_limit(hw); 1313 1314 for (regulation = 0; regulation < MAX_REGULATION_NUM; ++regulation) { 1315 for (bw = 0; bw < MAX_2_4G_BANDWIDTH_NUM; ++bw) { 1316 for (channel = 0; channel < CHANNEL_MAX_NUMBER_2G; ++channel) { 1317 for (rate_section = 0; rate_section < MAX_RATE_SECTION_NUM; ++rate_section) { 1318 /* obtain the base dBm values in 2.4G band 1319 CCK => 11M, OFDM => 54M, HT 1T => MCS7, HT 2T => MCS15*/ 1320 if (rate_section == 0) { /*CCK*/ 1321 base_index2_4G = 1322 _rtl8812ae_phy_get_txpower_by_rate_base_index(hw, 1323 BAND_ON_2_4G, MGN_11M); 1324 } else if (rate_section == 1) { /*OFDM*/ 1325 base_index2_4G = 1326 _rtl8812ae_phy_get_txpower_by_rate_base_index(hw, 1327 BAND_ON_2_4G, MGN_54M); 1328 } else if (rate_section == 2) { /*HT IT*/ 1329 base_index2_4G = 1330 _rtl8812ae_phy_get_txpower_by_rate_base_index(hw, 1331 BAND_ON_2_4G, MGN_MCS7); 1332 } else if (rate_section == 3) { /*HT 2T*/ 1333 base_index2_4G = 1334 _rtl8812ae_phy_get_txpower_by_rate_base_index(hw, 1335 BAND_ON_2_4G, MGN_MCS15); 1336 } 1337 1338 temp_pwrlmt = rtlphy->txpwr_limit_2_4g[regulation] 1339 [bw][rate_section][channel][RF90_PATH_A]; 1340 1341 for (rf_path = RF90_PATH_A; 1342 rf_path < MAX_RF_PATH_NUM; 1343 ++rf_path) { 1344 if (rate_section == 3) 1345 bw40_pwr_base_dbm2_4G = 1346 rtlphy->txpwr_by_rate_base_24g[rf_path][RF_2TX][base_index2_4G]; 1347 else 1348 bw40_pwr_base_dbm2_4G = 1349 rtlphy->txpwr_by_rate_base_24g[rf_path][RF_1TX][base_index2_4G]; 1350 1351 if (temp_pwrlmt != MAX_POWER_INDEX) { 1352 temp_value = temp_pwrlmt - bw40_pwr_base_dbm2_4G; 1353 rtlphy->txpwr_limit_2_4g[regulation] 1354 [bw][rate_section][channel][rf_path] = 1355 temp_value; 1356 } 1357 1358 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, 1359 "TxPwrLimit_2_4G[regulation %d][bw %d][rateSection %d][channel %d] = %d\n(TxPwrLimit in dBm %d - BW40PwrLmt2_4G[channel %d][rfpath %d] %d)\n", 1360 regulation, bw, rate_section, channel, 1361 rtlphy->txpwr_limit_2_4g[regulation][bw] 1362 [rate_section][channel][rf_path], (temp_pwrlmt == 63) 1363 ? 0 : temp_pwrlmt/2, channel, rf_path, 1364 bw40_pwr_base_dbm2_4G); 1365 } 1366 } 1367 } 1368 } 1369 } 1370 for (regulation = 0; regulation < MAX_REGULATION_NUM; ++regulation) { 1371 for (bw = 0; bw < MAX_5G_BANDWIDTH_NUM; ++bw) { 1372 for (channel = 0; channel < CHANNEL_MAX_NUMBER_5G; ++channel) { 1373 for (rate_section = 0; rate_section < MAX_RATE_SECTION_NUM; ++rate_section) { 1374 /* obtain the base dBm values in 5G band 1375 OFDM => 54M, HT 1T => MCS7, HT 2T => MCS15, 1376 VHT => 1SSMCS7, VHT 2T => 2SSMCS7*/ 1377 if (rate_section == 1) { /*OFDM*/ 1378 base_index5G = 1379 _rtl8812ae_phy_get_txpower_by_rate_base_index(hw, 1380 BAND_ON_5G, MGN_54M); 1381 } else if (rate_section == 2) { /*HT 1T*/ 1382 base_index5G = 1383 _rtl8812ae_phy_get_txpower_by_rate_base_index(hw, 1384 BAND_ON_5G, MGN_MCS7); 1385 } else if (rate_section == 3) { /*HT 2T*/ 1386 base_index5G = 1387 _rtl8812ae_phy_get_txpower_by_rate_base_index(hw, 1388 BAND_ON_5G, MGN_MCS15); 1389 } else if (rate_section == 4) { /*VHT 1T*/ 1390 base_index5G = 1391 _rtl8812ae_phy_get_txpower_by_rate_base_index(hw, 1392 BAND_ON_5G, MGN_VHT1SS_MCS7); 1393 } else if (rate_section == 5) { /*VHT 2T*/ 1394 base_index5G = 1395 _rtl8812ae_phy_get_txpower_by_rate_base_index(hw, 1396 BAND_ON_5G, MGN_VHT2SS_MCS7); 1397 } 1398 1399 temp_pwrlmt = rtlphy->txpwr_limit_5g[regulation] 1400 [bw][rate_section][channel] 1401 [RF90_PATH_A]; 1402 1403 for (rf_path = RF90_PATH_A; 1404 rf_path < MAX_RF_PATH_NUM; 1405 ++rf_path) { 1406 if (rate_section == 3 || rate_section == 5) 1407 bw40_pwr_base_dbm5G = 1408 rtlphy->txpwr_by_rate_base_5g[rf_path] 1409 [RF_2TX][base_index5G]; 1410 else 1411 bw40_pwr_base_dbm5G = 1412 rtlphy->txpwr_by_rate_base_5g[rf_path] 1413 [RF_1TX][base_index5G]; 1414 1415 if (temp_pwrlmt != MAX_POWER_INDEX) { 1416 temp_value = 1417 temp_pwrlmt - bw40_pwr_base_dbm5G; 1418 rtlphy->txpwr_limit_5g[regulation] 1419 [bw][rate_section][channel] 1420 [rf_path] = temp_value; 1421 } 1422 1423 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, 1424 "TxPwrLimit_5G[regulation %d][bw %d][rateSection %d][channel %d] =%d\n(TxPwrLimit in dBm %d - BW40PwrLmt5G[chnl group %d][rfpath %d] %d)\n", 1425 regulation, bw, rate_section, 1426 channel, rtlphy->txpwr_limit_5g[regulation] 1427 [bw][rate_section][channel][rf_path], 1428 temp_pwrlmt, channel, rf_path, bw40_pwr_base_dbm5G); 1429 } 1430 } 1431 } 1432 } 1433 } 1434 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, 1435 "<===== _rtl8812ae_phy_convert_txpower_limit_to_power_index()\n"); 1436 } 1437 1438 static void _rtl8821ae_phy_init_txpower_limit(struct ieee80211_hw *hw) 1439 { 1440 struct rtl_priv *rtlpriv = rtl_priv(hw); 1441 struct rtl_phy *rtlphy = &rtlpriv->phy; 1442 u8 i, j, k, l, m; 1443 1444 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, 1445 "=====> _rtl8821ae_phy_init_txpower_limit()!\n"); 1446 1447 for (i = 0; i < MAX_REGULATION_NUM; ++i) { 1448 for (j = 0; j < MAX_2_4G_BANDWIDTH_NUM; ++j) 1449 for (k = 0; k < MAX_RATE_SECTION_NUM; ++k) 1450 for (m = 0; m < CHANNEL_MAX_NUMBER_2G; ++m) 1451 for (l = 0; l < MAX_RF_PATH_NUM; ++l) 1452 rtlphy->txpwr_limit_2_4g 1453 [i][j][k][m][l] 1454 = MAX_POWER_INDEX; 1455 } 1456 for (i = 0; i < MAX_REGULATION_NUM; ++i) { 1457 for (j = 0; j < MAX_5G_BANDWIDTH_NUM; ++j) 1458 for (k = 0; k < MAX_RATE_SECTION_NUM; ++k) 1459 for (m = 0; m < CHANNEL_MAX_NUMBER_5G; ++m) 1460 for (l = 0; l < MAX_RF_PATH_NUM; ++l) 1461 rtlphy->txpwr_limit_5g 1462 [i][j][k][m][l] 1463 = MAX_POWER_INDEX; 1464 } 1465 1466 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, 1467 "<===== _rtl8821ae_phy_init_txpower_limit()!\n"); 1468 } 1469 1470 static void _rtl8821ae_phy_convert_txpower_dbm_to_relative_value(struct ieee80211_hw *hw) 1471 { 1472 struct rtl_priv *rtlpriv = rtl_priv(hw); 1473 struct rtl_phy *rtlphy = &rtlpriv->phy; 1474 u8 base = 0, rfpath = 0; 1475 1476 for (rfpath = RF90_PATH_A; rfpath <= RF90_PATH_B; ++rfpath) { 1477 base = _rtl8821ae_phy_get_txpower_by_rate_base(hw, BAND_ON_2_4G, rfpath, RF_1TX, CCK); 1478 _phy_convert_txpower_dbm_to_relative_value( 1479 &rtlphy->tx_power_by_rate_offset[BAND_ON_2_4G][rfpath][RF_1TX][0], 1480 0, 3, base); 1481 1482 base = _rtl8821ae_phy_get_txpower_by_rate_base(hw, BAND_ON_2_4G, rfpath, RF_1TX, OFDM); 1483 _phy_convert_txpower_dbm_to_relative_value( 1484 &rtlphy->tx_power_by_rate_offset[BAND_ON_2_4G][rfpath][RF_1TX][1], 1485 0, 3, base); 1486 _phy_convert_txpower_dbm_to_relative_value( 1487 &rtlphy->tx_power_by_rate_offset[BAND_ON_2_4G][rfpath][RF_1TX][2], 1488 0, 3, base); 1489 1490 base = _rtl8821ae_phy_get_txpower_by_rate_base(hw, BAND_ON_2_4G, rfpath, RF_1TX, HT_MCS0_MCS7); 1491 _phy_convert_txpower_dbm_to_relative_value( 1492 &rtlphy->tx_power_by_rate_offset[BAND_ON_2_4G][rfpath][RF_1TX][3], 1493 0, 3, base); 1494 _phy_convert_txpower_dbm_to_relative_value( 1495 &rtlphy->tx_power_by_rate_offset[BAND_ON_2_4G][rfpath][RF_1TX][4], 1496 0, 3, base); 1497 1498 base = _rtl8821ae_phy_get_txpower_by_rate_base(hw, BAND_ON_2_4G, rfpath, RF_2TX, HT_MCS8_MCS15); 1499 1500 _phy_convert_txpower_dbm_to_relative_value( 1501 &rtlphy->tx_power_by_rate_offset[BAND_ON_2_4G][rfpath][RF_2TX][5], 1502 0, 3, base); 1503 1504 _phy_convert_txpower_dbm_to_relative_value( 1505 &rtlphy->tx_power_by_rate_offset[BAND_ON_2_4G][rfpath][RF_2TX][6], 1506 0, 3, base); 1507 1508 base = _rtl8821ae_phy_get_txpower_by_rate_base(hw, BAND_ON_2_4G, rfpath, RF_1TX, VHT_1SSMCS0_1SSMCS9); 1509 _phy_convert_txpower_dbm_to_relative_value( 1510 &rtlphy->tx_power_by_rate_offset[BAND_ON_2_4G][rfpath][RF_1TX][7], 1511 0, 3, base); 1512 _phy_convert_txpower_dbm_to_relative_value( 1513 &rtlphy->tx_power_by_rate_offset[BAND_ON_2_4G][rfpath][RF_1TX][8], 1514 0, 3, base); 1515 _phy_convert_txpower_dbm_to_relative_value( 1516 &rtlphy->tx_power_by_rate_offset[BAND_ON_2_4G][rfpath][RF_1TX][9], 1517 0, 1, base); 1518 1519 base = _rtl8821ae_phy_get_txpower_by_rate_base(hw, BAND_ON_2_4G, rfpath, RF_2TX, VHT_2SSMCS0_2SSMCS9); 1520 _phy_convert_txpower_dbm_to_relative_value( 1521 &rtlphy->tx_power_by_rate_offset[BAND_ON_2_4G][rfpath][RF_1TX][9], 1522 2, 3, base); 1523 _phy_convert_txpower_dbm_to_relative_value( 1524 &rtlphy->tx_power_by_rate_offset[BAND_ON_2_4G][rfpath][RF_2TX][10], 1525 0, 3, base); 1526 _phy_convert_txpower_dbm_to_relative_value( 1527 &rtlphy->tx_power_by_rate_offset[BAND_ON_2_4G][rfpath][RF_2TX][11], 1528 0, 3, base); 1529 1530 base = _rtl8821ae_phy_get_txpower_by_rate_base(hw, BAND_ON_5G, rfpath, RF_1TX, OFDM); 1531 _phy_convert_txpower_dbm_to_relative_value( 1532 &rtlphy->tx_power_by_rate_offset[BAND_ON_5G][rfpath][RF_1TX][1], 1533 0, 3, base); 1534 _phy_convert_txpower_dbm_to_relative_value( 1535 &rtlphy->tx_power_by_rate_offset[BAND_ON_5G][rfpath][RF_1TX][2], 1536 0, 3, base); 1537 1538 base = _rtl8821ae_phy_get_txpower_by_rate_base(hw, BAND_ON_5G, rfpath, RF_1TX, HT_MCS0_MCS7); 1539 _phy_convert_txpower_dbm_to_relative_value( 1540 &rtlphy->tx_power_by_rate_offset[BAND_ON_5G][rfpath][RF_1TX][3], 1541 0, 3, base); 1542 _phy_convert_txpower_dbm_to_relative_value( 1543 &rtlphy->tx_power_by_rate_offset[BAND_ON_5G][rfpath][RF_1TX][4], 1544 0, 3, base); 1545 1546 base = _rtl8821ae_phy_get_txpower_by_rate_base(hw, BAND_ON_5G, rfpath, RF_2TX, HT_MCS8_MCS15); 1547 _phy_convert_txpower_dbm_to_relative_value( 1548 &rtlphy->tx_power_by_rate_offset[BAND_ON_5G][rfpath][RF_2TX][5], 1549 0, 3, base); 1550 _phy_convert_txpower_dbm_to_relative_value( 1551 &rtlphy->tx_power_by_rate_offset[BAND_ON_5G][rfpath][RF_2TX][6], 1552 0, 3, base); 1553 1554 base = _rtl8821ae_phy_get_txpower_by_rate_base(hw, BAND_ON_5G, rfpath, RF_1TX, VHT_1SSMCS0_1SSMCS9); 1555 _phy_convert_txpower_dbm_to_relative_value( 1556 &rtlphy->tx_power_by_rate_offset[BAND_ON_5G][rfpath][RF_1TX][7], 1557 0, 3, base); 1558 _phy_convert_txpower_dbm_to_relative_value( 1559 &rtlphy->tx_power_by_rate_offset[BAND_ON_5G][rfpath][RF_1TX][8], 1560 0, 3, base); 1561 _phy_convert_txpower_dbm_to_relative_value( 1562 &rtlphy->tx_power_by_rate_offset[BAND_ON_5G][rfpath][RF_1TX][9], 1563 0, 1, base); 1564 1565 base = _rtl8821ae_phy_get_txpower_by_rate_base(hw, BAND_ON_5G, rfpath, RF_2TX, VHT_2SSMCS0_2SSMCS9); 1566 _phy_convert_txpower_dbm_to_relative_value( 1567 &rtlphy->tx_power_by_rate_offset[BAND_ON_5G][rfpath][RF_1TX][9], 1568 2, 3, base); 1569 _phy_convert_txpower_dbm_to_relative_value( 1570 &rtlphy->tx_power_by_rate_offset[BAND_ON_5G][rfpath][RF_2TX][10], 1571 0, 3, base); 1572 _phy_convert_txpower_dbm_to_relative_value( 1573 &rtlphy->tx_power_by_rate_offset[BAND_ON_5G][rfpath][RF_2TX][11], 1574 0, 3, base); 1575 } 1576 1577 RT_TRACE(rtlpriv, COMP_POWER, DBG_TRACE, 1578 "<===_rtl8821ae_phy_convert_txpower_dbm_to_relative_value()\n"); 1579 } 1580 1581 static void _rtl8821ae_phy_txpower_by_rate_configuration(struct ieee80211_hw *hw) 1582 { 1583 _rtl8821ae_phy_store_txpower_by_rate_base(hw); 1584 _rtl8821ae_phy_convert_txpower_dbm_to_relative_value(hw); 1585 } 1586 1587 /* string is in decimal */ 1588 static bool _rtl8812ae_get_integer_from_string(char *str, u8 *pint) 1589 { 1590 u16 i = 0; 1591 *pint = 0; 1592 1593 while (str[i] != '\0') { 1594 if (str[i] >= '0' && str[i] <= '9') { 1595 *pint *= 10; 1596 *pint += (str[i] - '0'); 1597 } else { 1598 return false; 1599 } 1600 ++i; 1601 } 1602 1603 return true; 1604 } 1605 1606 static bool _rtl8812ae_eq_n_byte(u8 *str1, u8 *str2, u32 num) 1607 { 1608 if (num == 0) 1609 return false; 1610 while (num > 0) { 1611 num--; 1612 if (str1[num] != str2[num]) 1613 return false; 1614 } 1615 return true; 1616 } 1617 1618 static s8 _rtl8812ae_phy_get_chnl_idx_of_txpwr_lmt(struct ieee80211_hw *hw, 1619 u8 band, u8 channel) 1620 { 1621 struct rtl_priv *rtlpriv = rtl_priv(hw); 1622 s8 channel_index = -1; 1623 u8 i = 0; 1624 1625 if (band == BAND_ON_2_4G) 1626 channel_index = channel - 1; 1627 else if (band == BAND_ON_5G) { 1628 for (i = 0; i < sizeof(channel5g)/sizeof(u8); ++i) { 1629 if (channel5g[i] == channel) 1630 channel_index = i; 1631 } 1632 } else 1633 RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD, "Invalid Band %d in %s\n", 1634 band, __func__); 1635 1636 if (channel_index == -1) 1637 RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD, 1638 "Invalid Channel %d of Band %d in %s\n", channel, 1639 band, __func__); 1640 1641 return channel_index; 1642 } 1643 1644 static void _rtl8812ae_phy_set_txpower_limit(struct ieee80211_hw *hw, u8 *pregulation, 1645 u8 *pband, u8 *pbandwidth, 1646 u8 *prate_section, u8 *prf_path, 1647 u8 *pchannel, u8 *ppower_limit) 1648 { 1649 struct rtl_priv *rtlpriv = rtl_priv(hw); 1650 struct rtl_phy *rtlphy = &rtlpriv->phy; 1651 u8 regulation = 0, bandwidth = 0, rate_section = 0, channel; 1652 u8 channel_index; 1653 s8 power_limit = 0, prev_power_limit, ret; 1654 1655 if (!_rtl8812ae_get_integer_from_string((char *)pchannel, &channel) || 1656 !_rtl8812ae_get_integer_from_string((char *)ppower_limit, 1657 &power_limit)) { 1658 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, 1659 "Illegal index of pwr_lmt table [chnl %d][val %d]\n", 1660 channel, power_limit); 1661 } 1662 1663 power_limit = power_limit > MAX_POWER_INDEX ? 1664 MAX_POWER_INDEX : power_limit; 1665 1666 if (_rtl8812ae_eq_n_byte(pregulation, (u8 *)("FCC"), 3)) 1667 regulation = 0; 1668 else if (_rtl8812ae_eq_n_byte(pregulation, (u8 *)("MKK"), 3)) 1669 regulation = 1; 1670 else if (_rtl8812ae_eq_n_byte(pregulation, (u8 *)("ETSI"), 4)) 1671 regulation = 2; 1672 else if (_rtl8812ae_eq_n_byte(pregulation, (u8 *)("WW13"), 4)) 1673 regulation = 3; 1674 1675 if (_rtl8812ae_eq_n_byte(prate_section, (u8 *)("CCK"), 3)) 1676 rate_section = 0; 1677 else if (_rtl8812ae_eq_n_byte(prate_section, (u8 *)("OFDM"), 4)) 1678 rate_section = 1; 1679 else if (_rtl8812ae_eq_n_byte(prate_section, (u8 *)("HT"), 2) && 1680 _rtl8812ae_eq_n_byte(prf_path, (u8 *)("1T"), 2)) 1681 rate_section = 2; 1682 else if (_rtl8812ae_eq_n_byte(prate_section, (u8 *)("HT"), 2) && 1683 _rtl8812ae_eq_n_byte(prf_path, (u8 *)("2T"), 2)) 1684 rate_section = 3; 1685 else if (_rtl8812ae_eq_n_byte(prate_section, (u8 *)("VHT"), 3) && 1686 _rtl8812ae_eq_n_byte(prf_path, (u8 *)("1T"), 2)) 1687 rate_section = 4; 1688 else if (_rtl8812ae_eq_n_byte(prate_section, (u8 *)("VHT"), 3) && 1689 _rtl8812ae_eq_n_byte(prf_path, (u8 *)("2T"), 2)) 1690 rate_section = 5; 1691 1692 if (_rtl8812ae_eq_n_byte(pbandwidth, (u8 *)("20M"), 3)) 1693 bandwidth = 0; 1694 else if (_rtl8812ae_eq_n_byte(pbandwidth, (u8 *)("40M"), 3)) 1695 bandwidth = 1; 1696 else if (_rtl8812ae_eq_n_byte(pbandwidth, (u8 *)("80M"), 3)) 1697 bandwidth = 2; 1698 else if (_rtl8812ae_eq_n_byte(pbandwidth, (u8 *)("160M"), 4)) 1699 bandwidth = 3; 1700 1701 if (_rtl8812ae_eq_n_byte(pband, (u8 *)("2.4G"), 4)) { 1702 ret = _rtl8812ae_phy_get_chnl_idx_of_txpwr_lmt(hw, 1703 BAND_ON_2_4G, 1704 channel); 1705 1706 if (ret == -1) 1707 return; 1708 1709 channel_index = ret; 1710 1711 prev_power_limit = rtlphy->txpwr_limit_2_4g[regulation] 1712 [bandwidth][rate_section] 1713 [channel_index][RF90_PATH_A]; 1714 1715 if (power_limit < prev_power_limit) 1716 rtlphy->txpwr_limit_2_4g[regulation][bandwidth] 1717 [rate_section][channel_index][RF90_PATH_A] = 1718 power_limit; 1719 1720 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, 1721 "2.4G [regula %d][bw %d][sec %d][chnl %d][val %d]\n", 1722 regulation, bandwidth, rate_section, channel_index, 1723 rtlphy->txpwr_limit_2_4g[regulation][bandwidth] 1724 [rate_section][channel_index][RF90_PATH_A]); 1725 } else if (_rtl8812ae_eq_n_byte(pband, (u8 *)("5G"), 2)) { 1726 ret = _rtl8812ae_phy_get_chnl_idx_of_txpwr_lmt(hw, 1727 BAND_ON_5G, 1728 channel); 1729 1730 if (ret == -1) 1731 return; 1732 1733 channel_index = ret; 1734 1735 prev_power_limit = rtlphy->txpwr_limit_5g[regulation][bandwidth] 1736 [rate_section][channel_index] 1737 [RF90_PATH_A]; 1738 1739 if (power_limit < prev_power_limit) 1740 rtlphy->txpwr_limit_5g[regulation][bandwidth] 1741 [rate_section][channel_index][RF90_PATH_A] = power_limit; 1742 1743 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, 1744 "5G: [regul %d][bw %d][sec %d][chnl %d][val %d]\n", 1745 regulation, bandwidth, rate_section, channel, 1746 rtlphy->txpwr_limit_5g[regulation][bandwidth] 1747 [rate_section][channel_index][RF90_PATH_A]); 1748 } else { 1749 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, 1750 "Cannot recognize the band info in %s\n", pband); 1751 return; 1752 } 1753 } 1754 1755 static void _rtl8812ae_phy_config_bb_txpwr_lmt(struct ieee80211_hw *hw, 1756 u8 *regulation, u8 *band, 1757 u8 *bandwidth, u8 *rate_section, 1758 u8 *rf_path, u8 *channel, 1759 u8 *power_limit) 1760 { 1761 _rtl8812ae_phy_set_txpower_limit(hw, regulation, band, bandwidth, 1762 rate_section, rf_path, channel, 1763 power_limit); 1764 } 1765 1766 static void _rtl8821ae_phy_read_and_config_txpwr_lmt(struct ieee80211_hw *hw) 1767 { 1768 struct rtl_priv *rtlpriv = rtl_priv(hw); 1769 struct rtl_hal *rtlhal = rtl_hal(rtlpriv); 1770 u32 i = 0; 1771 u32 array_len; 1772 u8 **array; 1773 1774 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE) { 1775 array_len = RTL8812AE_TXPWR_LMT_ARRAY_LEN; 1776 array = RTL8812AE_TXPWR_LMT; 1777 } else { 1778 array_len = RTL8821AE_TXPWR_LMT_ARRAY_LEN; 1779 array = RTL8821AE_TXPWR_LMT; 1780 } 1781 1782 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, 1783 "\n"); 1784 1785 for (i = 0; i < array_len; i += 7) { 1786 u8 *regulation = array[i]; 1787 u8 *band = array[i+1]; 1788 u8 *bandwidth = array[i+2]; 1789 u8 *rate = array[i+3]; 1790 u8 *rf_path = array[i+4]; 1791 u8 *chnl = array[i+5]; 1792 u8 *val = array[i+6]; 1793 1794 _rtl8812ae_phy_config_bb_txpwr_lmt(hw, regulation, band, 1795 bandwidth, rate, rf_path, 1796 chnl, val); 1797 } 1798 } 1799 1800 static bool _rtl8821ae_phy_bb8821a_config_parafile(struct ieee80211_hw *hw) 1801 { 1802 struct rtl_priv *rtlpriv = rtl_priv(hw); 1803 struct rtl_phy *rtlphy = &rtlpriv->phy; 1804 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw)); 1805 bool rtstatus; 1806 1807 _rtl8821ae_phy_init_txpower_limit(hw); 1808 1809 /* RegEnableTxPowerLimit == 1 for 8812a & 8821a */ 1810 if (rtlefuse->eeprom_regulatory != 2) 1811 _rtl8821ae_phy_read_and_config_txpwr_lmt(hw); 1812 1813 rtstatus = _rtl8821ae_phy_config_bb_with_headerfile(hw, 1814 BASEBAND_CONFIG_PHY_REG); 1815 if (rtstatus != true) { 1816 pr_err("Write BB Reg Fail!!\n"); 1817 return false; 1818 } 1819 _rtl8821ae_phy_init_tx_power_by_rate(hw); 1820 if (rtlefuse->autoload_failflag == false) { 1821 rtstatus = _rtl8821ae_phy_config_bb_with_pgheaderfile(hw, 1822 BASEBAND_CONFIG_PHY_REG); 1823 } 1824 if (rtstatus != true) { 1825 pr_err("BB_PG Reg Fail!!\n"); 1826 return false; 1827 } 1828 1829 _rtl8821ae_phy_txpower_by_rate_configuration(hw); 1830 1831 /* RegEnableTxPowerLimit == 1 for 8812a & 8821a */ 1832 if (rtlefuse->eeprom_regulatory != 2) 1833 _rtl8812ae_phy_convert_txpower_limit_to_power_index(hw); 1834 1835 rtstatus = _rtl8821ae_phy_config_bb_with_headerfile(hw, 1836 BASEBAND_CONFIG_AGC_TAB); 1837 1838 if (rtstatus != true) { 1839 pr_err("AGC Table Fail\n"); 1840 return false; 1841 } 1842 rtlphy->cck_high_power = (bool)(rtl_get_bbreg(hw, 1843 RFPGA0_XA_HSSIPARAMETER2, 0x200)); 1844 return true; 1845 } 1846 1847 static bool 1848 __rtl8821ae_phy_config_with_headerfile(struct ieee80211_hw *hw, 1849 u32 *array_table, u16 arraylen, 1850 void (*set_reg)(struct ieee80211_hw *hw, 1851 u32 regaddr, u32 data)) 1852 { 1853 #define COND_ELSE 2 1854 #define COND_ENDIF 3 1855 1856 int i = 0; 1857 u8 cond; 1858 bool matched = true, skipped = false; 1859 1860 while ((i + 1) < arraylen) { 1861 u32 v1 = array_table[i]; 1862 u32 v2 = array_table[i + 1]; 1863 1864 if (v1 & (BIT(31) | BIT(30))) {/*positive & negative condition*/ 1865 if (v1 & BIT(31)) {/* positive condition*/ 1866 cond = (u8)((v1 & (BIT(29) | BIT(28))) >> 28); 1867 if (cond == COND_ENDIF) {/*end*/ 1868 matched = true; 1869 skipped = false; 1870 } else if (cond == COND_ELSE) /*else*/ 1871 matched = skipped ? false : true; 1872 else {/*if , else if*/ 1873 if (skipped) { 1874 matched = false; 1875 } else { 1876 if (_rtl8821ae_check_positive( 1877 hw, v1, v2)) { 1878 matched = true; 1879 skipped = true; 1880 } else { 1881 matched = false; 1882 skipped = false; 1883 } 1884 } 1885 } 1886 } else if (v1 & BIT(30)) { /*negative condition*/ 1887 /*do nothing*/ 1888 } 1889 } else { 1890 if (matched) 1891 set_reg(hw, v1, v2); 1892 } 1893 i = i + 2; 1894 } 1895 1896 return true; 1897 } 1898 1899 static bool _rtl8821ae_phy_config_mac_with_headerfile(struct ieee80211_hw *hw) 1900 { 1901 struct rtl_priv *rtlpriv = rtl_priv(hw); 1902 struct rtl_hal *rtlhal = rtl_hal(rtlpriv); 1903 u32 arraylength; 1904 u32 *ptrarray; 1905 1906 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, "Read MAC_REG_Array\n"); 1907 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8821AE) { 1908 arraylength = RTL8821AE_MAC_1T_ARRAYLEN; 1909 ptrarray = RTL8821AE_MAC_REG_ARRAY; 1910 } else { 1911 arraylength = RTL8812AE_MAC_1T_ARRAYLEN; 1912 ptrarray = RTL8812AE_MAC_REG_ARRAY; 1913 } 1914 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, 1915 "Img: MAC_REG_ARRAY LEN %d\n", arraylength); 1916 1917 return __rtl8821ae_phy_config_with_headerfile(hw, 1918 ptrarray, arraylength, rtl_write_byte_with_val32); 1919 } 1920 1921 static bool _rtl8821ae_phy_config_bb_with_headerfile(struct ieee80211_hw *hw, 1922 u8 configtype) 1923 { 1924 struct rtl_priv *rtlpriv = rtl_priv(hw); 1925 struct rtl_hal *rtlhal = rtl_hal(rtlpriv); 1926 u32 *array_table; 1927 u16 arraylen; 1928 1929 if (configtype == BASEBAND_CONFIG_PHY_REG) { 1930 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE) { 1931 arraylen = RTL8812AE_PHY_REG_1TARRAYLEN; 1932 array_table = RTL8812AE_PHY_REG_ARRAY; 1933 } else { 1934 arraylen = RTL8821AE_PHY_REG_1TARRAYLEN; 1935 array_table = RTL8821AE_PHY_REG_ARRAY; 1936 } 1937 1938 return __rtl8821ae_phy_config_with_headerfile(hw, 1939 array_table, arraylen, 1940 _rtl8821ae_config_bb_reg); 1941 } else if (configtype == BASEBAND_CONFIG_AGC_TAB) { 1942 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE) { 1943 arraylen = RTL8812AE_AGC_TAB_1TARRAYLEN; 1944 array_table = RTL8812AE_AGC_TAB_ARRAY; 1945 } else { 1946 arraylen = RTL8821AE_AGC_TAB_1TARRAYLEN; 1947 array_table = RTL8821AE_AGC_TAB_ARRAY; 1948 } 1949 1950 return __rtl8821ae_phy_config_with_headerfile(hw, 1951 array_table, arraylen, 1952 rtl_set_bbreg_with_dwmask); 1953 } 1954 return true; 1955 } 1956 1957 static u8 _rtl8821ae_get_rate_section_index(u32 regaddr) 1958 { 1959 u8 index = 0; 1960 regaddr &= 0xFFF; 1961 if (regaddr >= 0xC20 && regaddr <= 0xC4C) 1962 index = (u8)((regaddr - 0xC20) / 4); 1963 else if (regaddr >= 0xE20 && regaddr <= 0xE4C) 1964 index = (u8)((regaddr - 0xE20) / 4); 1965 else 1966 WARN_ONCE(true, 1967 "rtl8821ae: Invalid RegAddr 0x%x\n", regaddr); 1968 return index; 1969 } 1970 1971 static void _rtl8821ae_store_tx_power_by_rate(struct ieee80211_hw *hw, 1972 u32 band, u32 rfpath, 1973 u32 txnum, u32 regaddr, 1974 u32 bitmask, u32 data) 1975 { 1976 struct rtl_priv *rtlpriv = rtl_priv(hw); 1977 struct rtl_phy *rtlphy = &rtlpriv->phy; 1978 u8 rate_section = _rtl8821ae_get_rate_section_index(regaddr); 1979 1980 if (band != BAND_ON_2_4G && band != BAND_ON_5G) { 1981 RT_TRACE(rtlpriv, COMP_INIT, DBG_WARNING, "Invalid Band %d\n", band); 1982 band = BAND_ON_2_4G; 1983 } 1984 if (rfpath >= MAX_RF_PATH) { 1985 RT_TRACE(rtlpriv, COMP_INIT, DBG_WARNING, "Invalid RfPath %d\n", rfpath); 1986 rfpath = MAX_RF_PATH - 1; 1987 } 1988 if (txnum >= MAX_RF_PATH) { 1989 RT_TRACE(rtlpriv, COMP_INIT, DBG_WARNING, "Invalid TxNum %d\n", txnum); 1990 txnum = MAX_RF_PATH - 1; 1991 } 1992 rtlphy->tx_power_by_rate_offset[band][rfpath][txnum][rate_section] = data; 1993 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, 1994 "TxPwrByRateOffset[Band %d][RfPath %d][TxNum %d][RateSection %d] = 0x%x\n", 1995 band, rfpath, txnum, rate_section, 1996 rtlphy->tx_power_by_rate_offset[band][rfpath][txnum][rate_section]); 1997 } 1998 1999 static bool _rtl8821ae_phy_config_bb_with_pgheaderfile(struct ieee80211_hw *hw, 2000 u8 configtype) 2001 { 2002 struct rtl_priv *rtlpriv = rtl_priv(hw); 2003 struct rtl_hal *rtlhal = rtl_hal(rtlpriv); 2004 int i; 2005 u32 *array; 2006 u16 arraylen; 2007 u32 v1, v2, v3, v4, v5, v6; 2008 2009 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE) { 2010 arraylen = RTL8812AE_PHY_REG_ARRAY_PGLEN; 2011 array = RTL8812AE_PHY_REG_ARRAY_PG; 2012 } else { 2013 arraylen = RTL8821AE_PHY_REG_ARRAY_PGLEN; 2014 array = RTL8821AE_PHY_REG_ARRAY_PG; 2015 } 2016 2017 if (configtype != BASEBAND_CONFIG_PHY_REG) { 2018 RT_TRACE(rtlpriv, COMP_SEND, DBG_TRACE, 2019 "configtype != BaseBand_Config_PHY_REG\n"); 2020 return true; 2021 } 2022 for (i = 0; i < arraylen; i += 6) { 2023 v1 = array[i]; 2024 v2 = array[i+1]; 2025 v3 = array[i+2]; 2026 v4 = array[i+3]; 2027 v5 = array[i+4]; 2028 v6 = array[i+5]; 2029 2030 if (v1 < 0xCDCDCDCD) { 2031 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8812AE && 2032 (v4 == 0xfe || v4 == 0xffe)) { 2033 msleep(50); 2034 continue; 2035 } 2036 2037 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8821AE) { 2038 if (v4 == 0xfe) 2039 msleep(50); 2040 else if (v4 == 0xfd) 2041 mdelay(5); 2042 else if (v4 == 0xfc) 2043 mdelay(1); 2044 else if (v4 == 0xfb) 2045 udelay(50); 2046 else if (v4 == 0xfa) 2047 udelay(5); 2048 else if (v4 == 0xf9) 2049 udelay(1); 2050 } 2051 _rtl8821ae_store_tx_power_by_rate(hw, v1, v2, v3, 2052 v4, v5, v6); 2053 continue; 2054 } else { 2055 /*don't need the hw_body*/ 2056 if (!_rtl8821ae_check_condition(hw, v1)) { 2057 i += 2; /* skip the pair of expression*/ 2058 v1 = array[i]; 2059 v2 = array[i+1]; 2060 v3 = array[i+2]; 2061 while (v2 != 0xDEAD) { 2062 i += 3; 2063 v1 = array[i]; 2064 v2 = array[i+1]; 2065 v3 = array[i+2]; 2066 } 2067 } 2068 } 2069 } 2070 2071 return true; 2072 } 2073 2074 bool rtl8812ae_phy_config_rf_with_headerfile(struct ieee80211_hw *hw, 2075 enum radio_path rfpath) 2076 { 2077 u32 *radioa_array_table_a, *radioa_array_table_b; 2078 u16 radioa_arraylen_a, radioa_arraylen_b; 2079 struct rtl_priv *rtlpriv = rtl_priv(hw); 2080 2081 radioa_arraylen_a = RTL8812AE_RADIOA_1TARRAYLEN; 2082 radioa_array_table_a = RTL8812AE_RADIOA_ARRAY; 2083 radioa_arraylen_b = RTL8812AE_RADIOB_1TARRAYLEN; 2084 radioa_array_table_b = RTL8812AE_RADIOB_ARRAY; 2085 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, 2086 "Radio_A:RTL8821AE_RADIOA_ARRAY %d\n", radioa_arraylen_a); 2087 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "Radio No %x\n", rfpath); 2088 switch (rfpath) { 2089 case RF90_PATH_A: 2090 return __rtl8821ae_phy_config_with_headerfile(hw, 2091 radioa_array_table_a, radioa_arraylen_a, 2092 _rtl8821ae_config_rf_radio_a); 2093 break; 2094 case RF90_PATH_B: 2095 return __rtl8821ae_phy_config_with_headerfile(hw, 2096 radioa_array_table_b, radioa_arraylen_b, 2097 _rtl8821ae_config_rf_radio_b); 2098 break; 2099 case RF90_PATH_C: 2100 case RF90_PATH_D: 2101 pr_err("switch case %#x not processed\n", rfpath); 2102 break; 2103 } 2104 return true; 2105 } 2106 2107 bool rtl8821ae_phy_config_rf_with_headerfile(struct ieee80211_hw *hw, 2108 enum radio_path rfpath) 2109 { 2110 u32 *radioa_array_table; 2111 u16 radioa_arraylen; 2112 struct rtl_priv *rtlpriv = rtl_priv(hw); 2113 2114 radioa_arraylen = RTL8821AE_RADIOA_1TARRAYLEN; 2115 radioa_array_table = RTL8821AE_RADIOA_ARRAY; 2116 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, 2117 "Radio_A:RTL8821AE_RADIOA_ARRAY %d\n", radioa_arraylen); 2118 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "Radio No %x\n", rfpath); 2119 switch (rfpath) { 2120 case RF90_PATH_A: 2121 return __rtl8821ae_phy_config_with_headerfile(hw, 2122 radioa_array_table, radioa_arraylen, 2123 _rtl8821ae_config_rf_radio_a); 2124 break; 2125 2126 case RF90_PATH_B: 2127 case RF90_PATH_C: 2128 case RF90_PATH_D: 2129 pr_err("switch case %#x not processed\n", rfpath); 2130 break; 2131 } 2132 return true; 2133 } 2134 2135 void rtl8821ae_phy_get_hw_reg_originalvalue(struct ieee80211_hw *hw) 2136 { 2137 struct rtl_priv *rtlpriv = rtl_priv(hw); 2138 struct rtl_phy *rtlphy = &rtlpriv->phy; 2139 2140 rtlphy->default_initialgain[0] = 2141 (u8)rtl_get_bbreg(hw, ROFDM0_XAAGCCORE1, MASKBYTE0); 2142 rtlphy->default_initialgain[1] = 2143 (u8)rtl_get_bbreg(hw, ROFDM0_XBAGCCORE1, MASKBYTE0); 2144 rtlphy->default_initialgain[2] = 2145 (u8)rtl_get_bbreg(hw, ROFDM0_XCAGCCORE1, MASKBYTE0); 2146 rtlphy->default_initialgain[3] = 2147 (u8)rtl_get_bbreg(hw, ROFDM0_XDAGCCORE1, MASKBYTE0); 2148 2149 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, 2150 "Default initial gain (c50=0x%x, c58=0x%x, c60=0x%x, c68=0x%x\n", 2151 rtlphy->default_initialgain[0], 2152 rtlphy->default_initialgain[1], 2153 rtlphy->default_initialgain[2], 2154 rtlphy->default_initialgain[3]); 2155 2156 rtlphy->framesync = (u8)rtl_get_bbreg(hw, 2157 ROFDM0_RXDETECTOR3, MASKBYTE0); 2158 rtlphy->framesync_c34 = rtl_get_bbreg(hw, 2159 ROFDM0_RXDETECTOR2, MASKDWORD); 2160 2161 RT_TRACE(rtlpriv, COMP_INIT, DBG_TRACE, 2162 "Default framesync (0x%x) = 0x%x\n", 2163 ROFDM0_RXDETECTOR3, rtlphy->framesync); 2164 } 2165 2166 static void phy_init_bb_rf_register_definition(struct ieee80211_hw *hw) 2167 { 2168 struct rtl_priv *rtlpriv = rtl_priv(hw); 2169 struct rtl_phy *rtlphy = &rtlpriv->phy; 2170 2171 rtlphy->phyreg_def[RF90_PATH_A].rfintfs = RFPGA0_XAB_RFINTERFACESW; 2172 rtlphy->phyreg_def[RF90_PATH_B].rfintfs = RFPGA0_XAB_RFINTERFACESW; 2173 2174 rtlphy->phyreg_def[RF90_PATH_A].rfintfo = RFPGA0_XA_RFINTERFACEOE; 2175 rtlphy->phyreg_def[RF90_PATH_B].rfintfo = RFPGA0_XB_RFINTERFACEOE; 2176 2177 rtlphy->phyreg_def[RF90_PATH_A].rfintfe = RFPGA0_XA_RFINTERFACEOE; 2178 rtlphy->phyreg_def[RF90_PATH_B].rfintfe = RFPGA0_XB_RFINTERFACEOE; 2179 2180 rtlphy->phyreg_def[RF90_PATH_A].rf3wire_offset = RA_LSSIWRITE_8821A; 2181 rtlphy->phyreg_def[RF90_PATH_B].rf3wire_offset = RB_LSSIWRITE_8821A; 2182 2183 rtlphy->phyreg_def[RF90_PATH_A].rfhssi_para2 = RHSSIREAD_8821AE; 2184 rtlphy->phyreg_def[RF90_PATH_B].rfhssi_para2 = RHSSIREAD_8821AE; 2185 2186 rtlphy->phyreg_def[RF90_PATH_A].rf_rb = RA_SIREAD_8821A; 2187 rtlphy->phyreg_def[RF90_PATH_B].rf_rb = RB_SIREAD_8821A; 2188 2189 rtlphy->phyreg_def[RF90_PATH_A].rf_rbpi = RA_PIREAD_8821A; 2190 rtlphy->phyreg_def[RF90_PATH_B].rf_rbpi = RB_PIREAD_8821A; 2191 } 2192 2193 void rtl8821ae_phy_get_txpower_level(struct ieee80211_hw *hw, long *powerlevel) 2194 { 2195 struct rtl_priv *rtlpriv = rtl_priv(hw); 2196 struct rtl_phy *rtlphy = &rtlpriv->phy; 2197 u8 txpwr_level; 2198 long txpwr_dbm; 2199 2200 txpwr_level = rtlphy->cur_cck_txpwridx; 2201 txpwr_dbm = _rtl8821ae_phy_txpwr_idx_to_dbm(hw, 2202 WIRELESS_MODE_B, txpwr_level); 2203 txpwr_level = rtlphy->cur_ofdm24g_txpwridx; 2204 if (_rtl8821ae_phy_txpwr_idx_to_dbm(hw, 2205 WIRELESS_MODE_G, 2206 txpwr_level) > txpwr_dbm) 2207 txpwr_dbm = 2208 _rtl8821ae_phy_txpwr_idx_to_dbm(hw, WIRELESS_MODE_G, 2209 txpwr_level); 2210 txpwr_level = rtlphy->cur_ofdm24g_txpwridx; 2211 if (_rtl8821ae_phy_txpwr_idx_to_dbm(hw, 2212 WIRELESS_MODE_N_24G, 2213 txpwr_level) > txpwr_dbm) 2214 txpwr_dbm = 2215 _rtl8821ae_phy_txpwr_idx_to_dbm(hw, WIRELESS_MODE_N_24G, 2216 txpwr_level); 2217 *powerlevel = txpwr_dbm; 2218 } 2219 2220 static bool _rtl8821ae_phy_get_chnl_index(u8 channel, u8 *chnl_index) 2221 { 2222 u8 i = 0; 2223 bool in_24g = true; 2224 2225 if (channel <= 14) { 2226 in_24g = true; 2227 *chnl_index = channel - 1; 2228 } else { 2229 in_24g = false; 2230 2231 for (i = 0; i < CHANNEL_MAX_NUMBER_5G; ++i) { 2232 if (channel5g[i] == channel) { 2233 *chnl_index = i; 2234 return in_24g; 2235 } 2236 } 2237 } 2238 return in_24g; 2239 } 2240 2241 static s8 _rtl8821ae_phy_get_ratesection_intxpower_byrate(u8 path, u8 rate) 2242 { 2243 s8 rate_section = 0; 2244 switch (rate) { 2245 case DESC_RATE1M: 2246 case DESC_RATE2M: 2247 case DESC_RATE5_5M: 2248 case DESC_RATE11M: 2249 rate_section = 0; 2250 break; 2251 case DESC_RATE6M: 2252 case DESC_RATE9M: 2253 case DESC_RATE12M: 2254 case DESC_RATE18M: 2255 rate_section = 1; 2256 break; 2257 case DESC_RATE24M: 2258 case DESC_RATE36M: 2259 case DESC_RATE48M: 2260 case DESC_RATE54M: 2261 rate_section = 2; 2262 break; 2263 case DESC_RATEMCS0: 2264 case DESC_RATEMCS1: 2265 case DESC_RATEMCS2: 2266 case DESC_RATEMCS3: 2267 rate_section = 3; 2268 break; 2269 case DESC_RATEMCS4: 2270 case DESC_RATEMCS5: 2271 case DESC_RATEMCS6: 2272 case DESC_RATEMCS7: 2273 rate_section = 4; 2274 break; 2275 case DESC_RATEMCS8: 2276 case DESC_RATEMCS9: 2277 case DESC_RATEMCS10: 2278 case DESC_RATEMCS11: 2279 rate_section = 5; 2280 break; 2281 case DESC_RATEMCS12: 2282 case DESC_RATEMCS13: 2283 case DESC_RATEMCS14: 2284 case DESC_RATEMCS15: 2285 rate_section = 6; 2286 break; 2287 case DESC_RATEVHT1SS_MCS0: 2288 case DESC_RATEVHT1SS_MCS1: 2289 case DESC_RATEVHT1SS_MCS2: 2290 case DESC_RATEVHT1SS_MCS3: 2291 rate_section = 7; 2292 break; 2293 case DESC_RATEVHT1SS_MCS4: 2294 case DESC_RATEVHT1SS_MCS5: 2295 case DESC_RATEVHT1SS_MCS6: 2296 case DESC_RATEVHT1SS_MCS7: 2297 rate_section = 8; 2298 break; 2299 case DESC_RATEVHT1SS_MCS8: 2300 case DESC_RATEVHT1SS_MCS9: 2301 case DESC_RATEVHT2SS_MCS0: 2302 case DESC_RATEVHT2SS_MCS1: 2303 rate_section = 9; 2304 break; 2305 case DESC_RATEVHT2SS_MCS2: 2306 case DESC_RATEVHT2SS_MCS3: 2307 case DESC_RATEVHT2SS_MCS4: 2308 case DESC_RATEVHT2SS_MCS5: 2309 rate_section = 10; 2310 break; 2311 case DESC_RATEVHT2SS_MCS6: 2312 case DESC_RATEVHT2SS_MCS7: 2313 case DESC_RATEVHT2SS_MCS8: 2314 case DESC_RATEVHT2SS_MCS9: 2315 rate_section = 11; 2316 break; 2317 default: 2318 WARN_ONCE(true, "rtl8821ae: Rate_Section is Illegal\n"); 2319 break; 2320 } 2321 2322 return rate_section; 2323 } 2324 2325 static s8 _rtl8812ae_phy_get_world_wide_limit(s8 *limit_table) 2326 { 2327 s8 min = limit_table[0]; 2328 u8 i = 0; 2329 2330 for (i = 0; i < MAX_REGULATION_NUM; ++i) { 2331 if (limit_table[i] < min) 2332 min = limit_table[i]; 2333 } 2334 return min; 2335 } 2336 2337 static s8 _rtl8812ae_phy_get_txpower_limit(struct ieee80211_hw *hw, 2338 u8 band, 2339 enum ht_channel_width bandwidth, 2340 enum radio_path rf_path, 2341 u8 rate, u8 channel) 2342 { 2343 struct rtl_priv *rtlpriv = rtl_priv(hw); 2344 struct rtl_efuse *rtlefuse = rtl_efuse(rtlpriv); 2345 struct rtl_phy *rtlphy = &rtlpriv->phy; 2346 short band_temp = -1, regulation = -1, bandwidth_temp = -1, 2347 rate_section = -1, channel_temp = -1; 2348 u16 regu, bdwidth, sec, chnl; 2349 s8 power_limit = MAX_POWER_INDEX; 2350 2351 if (rtlefuse->eeprom_regulatory == 2) 2352 return MAX_POWER_INDEX; 2353 2354 regulation = TXPWR_LMT_WW; 2355 2356 if (band == BAND_ON_2_4G) 2357 band_temp = 0; 2358 else if (band == BAND_ON_5G) 2359 band_temp = 1; 2360 2361 if (bandwidth == HT_CHANNEL_WIDTH_20) 2362 bandwidth_temp = 0; 2363 else if (bandwidth == HT_CHANNEL_WIDTH_20_40) 2364 bandwidth_temp = 1; 2365 else if (bandwidth == HT_CHANNEL_WIDTH_80) 2366 bandwidth_temp = 2; 2367 2368 switch (rate) { 2369 case DESC_RATE1M: 2370 case DESC_RATE2M: 2371 case DESC_RATE5_5M: 2372 case DESC_RATE11M: 2373 rate_section = 0; 2374 break; 2375 case DESC_RATE6M: 2376 case DESC_RATE9M: 2377 case DESC_RATE12M: 2378 case DESC_RATE18M: 2379 case DESC_RATE24M: 2380 case DESC_RATE36M: 2381 case DESC_RATE48M: 2382 case DESC_RATE54M: 2383 rate_section = 1; 2384 break; 2385 case DESC_RATEMCS0: 2386 case DESC_RATEMCS1: 2387 case DESC_RATEMCS2: 2388 case DESC_RATEMCS3: 2389 case DESC_RATEMCS4: 2390 case DESC_RATEMCS5: 2391 case DESC_RATEMCS6: 2392 case DESC_RATEMCS7: 2393 rate_section = 2; 2394 break; 2395 case DESC_RATEMCS8: 2396 case DESC_RATEMCS9: 2397 case DESC_RATEMCS10: 2398 case DESC_RATEMCS11: 2399 case DESC_RATEMCS12: 2400 case DESC_RATEMCS13: 2401 case DESC_RATEMCS14: 2402 case DESC_RATEMCS15: 2403 rate_section = 3; 2404 break; 2405 case DESC_RATEVHT1SS_MCS0: 2406 case DESC_RATEVHT1SS_MCS1: 2407 case DESC_RATEVHT1SS_MCS2: 2408 case DESC_RATEVHT1SS_MCS3: 2409 case DESC_RATEVHT1SS_MCS4: 2410 case DESC_RATEVHT1SS_MCS5: 2411 case DESC_RATEVHT1SS_MCS6: 2412 case DESC_RATEVHT1SS_MCS7: 2413 case DESC_RATEVHT1SS_MCS8: 2414 case DESC_RATEVHT1SS_MCS9: 2415 rate_section = 4; 2416 break; 2417 case DESC_RATEVHT2SS_MCS0: 2418 case DESC_RATEVHT2SS_MCS1: 2419 case DESC_RATEVHT2SS_MCS2: 2420 case DESC_RATEVHT2SS_MCS3: 2421 case DESC_RATEVHT2SS_MCS4: 2422 case DESC_RATEVHT2SS_MCS5: 2423 case DESC_RATEVHT2SS_MCS6: 2424 case DESC_RATEVHT2SS_MCS7: 2425 case DESC_RATEVHT2SS_MCS8: 2426 case DESC_RATEVHT2SS_MCS9: 2427 rate_section = 5; 2428 break; 2429 default: 2430 RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD, 2431 "Wrong rate 0x%x\n", rate); 2432 break; 2433 } 2434 2435 if (band_temp == BAND_ON_5G && rate_section == 0) 2436 RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD, 2437 "Wrong rate 0x%x: No CCK in 5G Band\n", rate); 2438 2439 /*workaround for wrong index combination to obtain tx power limit, 2440 OFDM only exists in BW 20M*/ 2441 if (rate_section == 1) 2442 bandwidth_temp = 0; 2443 2444 /*workaround for wrong index combination to obtain tx power limit, 2445 *HT on 80M will reference to HT on 40M 2446 */ 2447 if ((rate_section == 2 || rate_section == 3) && band == BAND_ON_5G && 2448 bandwidth_temp == 2) 2449 bandwidth_temp = 1; 2450 2451 if (band == BAND_ON_2_4G) 2452 channel_temp = _rtl8812ae_phy_get_chnl_idx_of_txpwr_lmt(hw, 2453 BAND_ON_2_4G, channel); 2454 else if (band == BAND_ON_5G) 2455 channel_temp = _rtl8812ae_phy_get_chnl_idx_of_txpwr_lmt(hw, 2456 BAND_ON_5G, channel); 2457 else if (band == BAND_ON_BOTH) 2458 ;/* BAND_ON_BOTH don't care temporarily */ 2459 2460 if (band_temp == -1 || regulation == -1 || bandwidth_temp == -1 || 2461 rate_section == -1 || channel_temp == -1) { 2462 RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD, 2463 "Wrong index value to access power limit table [band %d][regulation %d][bandwidth %d][rf_path %d][rate_section %d][chnl %d]\n", 2464 band_temp, regulation, bandwidth_temp, rf_path, 2465 rate_section, channel_temp); 2466 return MAX_POWER_INDEX; 2467 } 2468 2469 regu = regulation; 2470 bdwidth = bandwidth_temp; 2471 sec = rate_section; 2472 chnl = channel_temp; 2473 2474 if (band == BAND_ON_2_4G) { 2475 s8 limits[10] = {0}; 2476 u8 i; 2477 2478 for (i = 0; i < 4; ++i) 2479 limits[i] = rtlphy->txpwr_limit_2_4g[i][bdwidth] 2480 [sec][chnl][rf_path]; 2481 2482 power_limit = (regulation == TXPWR_LMT_WW) ? 2483 _rtl8812ae_phy_get_world_wide_limit(limits) : 2484 rtlphy->txpwr_limit_2_4g[regu][bdwidth] 2485 [sec][chnl][rf_path]; 2486 } else if (band == BAND_ON_5G) { 2487 s8 limits[10] = {0}; 2488 u8 i; 2489 2490 for (i = 0; i < MAX_REGULATION_NUM; ++i) 2491 limits[i] = rtlphy->txpwr_limit_5g[i][bdwidth] 2492 [sec][chnl][rf_path]; 2493 2494 power_limit = (regulation == TXPWR_LMT_WW) ? 2495 _rtl8812ae_phy_get_world_wide_limit(limits) : 2496 rtlphy->txpwr_limit_5g[regu][chnl] 2497 [sec][chnl][rf_path]; 2498 } else { 2499 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, 2500 "No power limit table of the specified band\n"); 2501 } 2502 return power_limit; 2503 } 2504 2505 static s8 _rtl8821ae_phy_get_txpower_by_rate(struct ieee80211_hw *hw, 2506 u8 band, u8 path, u8 rate) 2507 { 2508 struct rtl_priv *rtlpriv = rtl_priv(hw); 2509 struct rtl_phy *rtlphy = &rtlpriv->phy; 2510 u8 shift = 0, rate_section, tx_num; 2511 s8 tx_pwr_diff = 0; 2512 s8 limit = 0; 2513 2514 rate_section = _rtl8821ae_phy_get_ratesection_intxpower_byrate(path, rate); 2515 tx_num = RF_TX_NUM_NONIMPLEMENT; 2516 2517 if (tx_num == RF_TX_NUM_NONIMPLEMENT) { 2518 if ((rate >= DESC_RATEMCS8 && rate <= DESC_RATEMCS15) || 2519 (rate >= DESC_RATEVHT2SS_MCS2 && rate <= DESC_RATEVHT2SS_MCS9)) 2520 tx_num = RF_2TX; 2521 else 2522 tx_num = RF_1TX; 2523 } 2524 2525 switch (rate) { 2526 case DESC_RATE1M: 2527 case DESC_RATE6M: 2528 case DESC_RATE24M: 2529 case DESC_RATEMCS0: 2530 case DESC_RATEMCS4: 2531 case DESC_RATEMCS8: 2532 case DESC_RATEMCS12: 2533 case DESC_RATEVHT1SS_MCS0: 2534 case DESC_RATEVHT1SS_MCS4: 2535 case DESC_RATEVHT1SS_MCS8: 2536 case DESC_RATEVHT2SS_MCS2: 2537 case DESC_RATEVHT2SS_MCS6: 2538 shift = 0; 2539 break; 2540 case DESC_RATE2M: 2541 case DESC_RATE9M: 2542 case DESC_RATE36M: 2543 case DESC_RATEMCS1: 2544 case DESC_RATEMCS5: 2545 case DESC_RATEMCS9: 2546 case DESC_RATEMCS13: 2547 case DESC_RATEVHT1SS_MCS1: 2548 case DESC_RATEVHT1SS_MCS5: 2549 case DESC_RATEVHT1SS_MCS9: 2550 case DESC_RATEVHT2SS_MCS3: 2551 case DESC_RATEVHT2SS_MCS7: 2552 shift = 8; 2553 break; 2554 case DESC_RATE5_5M: 2555 case DESC_RATE12M: 2556 case DESC_RATE48M: 2557 case DESC_RATEMCS2: 2558 case DESC_RATEMCS6: 2559 case DESC_RATEMCS10: 2560 case DESC_RATEMCS14: 2561 case DESC_RATEVHT1SS_MCS2: 2562 case DESC_RATEVHT1SS_MCS6: 2563 case DESC_RATEVHT2SS_MCS0: 2564 case DESC_RATEVHT2SS_MCS4: 2565 case DESC_RATEVHT2SS_MCS8: 2566 shift = 16; 2567 break; 2568 case DESC_RATE11M: 2569 case DESC_RATE18M: 2570 case DESC_RATE54M: 2571 case DESC_RATEMCS3: 2572 case DESC_RATEMCS7: 2573 case DESC_RATEMCS11: 2574 case DESC_RATEMCS15: 2575 case DESC_RATEVHT1SS_MCS3: 2576 case DESC_RATEVHT1SS_MCS7: 2577 case DESC_RATEVHT2SS_MCS1: 2578 case DESC_RATEVHT2SS_MCS5: 2579 case DESC_RATEVHT2SS_MCS9: 2580 shift = 24; 2581 break; 2582 default: 2583 WARN_ONCE(true, "rtl8821ae: Rate_Section is Illegal\n"); 2584 break; 2585 } 2586 2587 tx_pwr_diff = (u8)(rtlphy->tx_power_by_rate_offset[band][path] 2588 [tx_num][rate_section] >> shift) & 0xff; 2589 2590 /* RegEnableTxPowerLimit == 1 for 8812a & 8821a */ 2591 if (rtlpriv->efuse.eeprom_regulatory != 2) { 2592 limit = _rtl8812ae_phy_get_txpower_limit(hw, band, 2593 rtlphy->current_chan_bw, path, rate, 2594 rtlphy->current_channel); 2595 2596 if (rate == DESC_RATEVHT1SS_MCS8 || rate == DESC_RATEVHT1SS_MCS9 || 2597 rate == DESC_RATEVHT2SS_MCS8 || rate == DESC_RATEVHT2SS_MCS9) { 2598 if (limit < 0) { 2599 if (tx_pwr_diff < (-limit)) 2600 tx_pwr_diff = -limit; 2601 } 2602 } else { 2603 if (limit < 0) 2604 tx_pwr_diff = limit; 2605 else 2606 tx_pwr_diff = tx_pwr_diff > limit ? limit : tx_pwr_diff; 2607 } 2608 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD, 2609 "Maximum power by rate %d, final power by rate %d\n", 2610 limit, tx_pwr_diff); 2611 } 2612 2613 return tx_pwr_diff; 2614 } 2615 2616 static u8 _rtl8821ae_get_txpower_index(struct ieee80211_hw *hw, u8 path, 2617 u8 rate, u8 bandwidth, u8 channel) 2618 { 2619 struct rtl_priv *rtlpriv = rtl_priv(hw); 2620 struct rtl_hal *rtlhal = rtl_hal(rtlpriv); 2621 struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw)); 2622 u8 index = (channel - 1); 2623 u8 txpower = 0; 2624 bool in_24g = false; 2625 s8 powerdiff_byrate = 0; 2626 2627 if (((rtlhal->current_bandtype == BAND_ON_2_4G) && 2628 (channel > 14 || channel < 1)) || 2629 ((rtlhal->current_bandtype == BAND_ON_5G) && (channel <= 14))) { 2630 index = 0; 2631 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD, 2632 "Illegal channel!!\n"); 2633 } 2634 2635 in_24g = _rtl8821ae_phy_get_chnl_index(channel, &index); 2636 if (in_24g) { 2637 if (RTL8821AE_RX_HAL_IS_CCK_RATE(rate)) 2638 txpower = rtlefuse->txpwrlevel_cck[path][index]; 2639 else if (DESC_RATE6M <= rate) 2640 txpower = rtlefuse->txpwrlevel_ht40_1s[path][index]; 2641 else 2642 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_LOUD, "invalid rate\n"); 2643 2644 if (DESC_RATE6M <= rate && rate <= DESC_RATE54M && 2645 !RTL8821AE_RX_HAL_IS_CCK_RATE(rate)) 2646 txpower += rtlefuse->txpwr_legacyhtdiff[path][TX_1S]; 2647 2648 if (bandwidth == HT_CHANNEL_WIDTH_20) { 2649 if ((DESC_RATEMCS0 <= rate && rate <= DESC_RATEMCS15) || 2650 (DESC_RATEVHT1SS_MCS0 <= rate && rate <= DESC_RATEVHT2SS_MCS9)) 2651 txpower += rtlefuse->txpwr_ht20diff[path][TX_1S]; 2652 if ((DESC_RATEMCS8 <= rate && rate <= DESC_RATEMCS15) || 2653 (DESC_RATEVHT2SS_MCS0 <= rate && rate <= DESC_RATEVHT2SS_MCS9)) 2654 txpower += rtlefuse->txpwr_ht20diff[path][TX_2S]; 2655 } else if (bandwidth == HT_CHANNEL_WIDTH_20_40) { 2656 if ((DESC_RATEMCS0 <= rate && rate <= DESC_RATEMCS15) || 2657 (DESC_RATEVHT1SS_MCS0 <= rate && rate <= DESC_RATEVHT2SS_MCS9)) 2658 txpower += rtlefuse->txpwr_ht40diff[path][TX_1S]; 2659 if ((DESC_RATEMCS8 <= rate && rate <= DESC_RATEMCS15) || 2660 (DESC_RATEVHT2SS_MCS0 <= rate && rate <= DESC_RATEVHT2SS_MCS9)) 2661 txpower += rtlefuse->txpwr_ht40diff[path][TX_2S]; 2662 } else if (bandwidth == HT_CHANNEL_WIDTH_80) { 2663 if ((DESC_RATEMCS0 <= rate && rate <= DESC_RATEMCS15) || 2664 (DESC_RATEVHT1SS_MCS0 <= rate && 2665 rate <= DESC_RATEVHT2SS_MCS9)) 2666 txpower += rtlefuse->txpwr_ht40diff[path][TX_1S]; 2667 if ((DESC_RATEMCS8 <= rate && rate <= DESC_RATEMCS15) || 2668 (DESC_RATEVHT2SS_MCS0 <= rate && 2669 rate <= DESC_RATEVHT2SS_MCS9)) 2670 txpower += rtlefuse->txpwr_ht40diff[path][TX_2S]; 2671 } 2672 } else { 2673 if (DESC_RATE6M <= rate) 2674 txpower = rtlefuse->txpwr_5g_bw40base[path][index]; 2675 else 2676 RT_TRACE(rtlpriv, COMP_POWER_TRACKING, DBG_WARNING, 2677 "INVALID Rate.\n"); 2678 2679 if (DESC_RATE6M <= rate && rate <= DESC_RATE54M && 2680 !RTL8821AE_RX_HAL_IS_CCK_RATE(rate)) 2681 txpower += rtlefuse->txpwr_5g_ofdmdiff[path][TX_1S]; 2682 2683 if (bandwidth == HT_CHANNEL_WIDTH_20) { 2684 if ((DESC_RATEMCS0 <= rate && rate <= DESC_RATEMCS15) || 2685 (DESC_RATEVHT1SS_MCS0 <= rate && 2686 rate <= DESC_RATEVHT2SS_MCS9)) 2687 txpower += rtlefuse->txpwr_5g_bw20diff[path][TX_1S]; 2688 if ((DESC_RATEMCS8 <= rate && rate <= DESC_RATEMCS15) || 2689 (DESC_RATEVHT2SS_MCS0 <= rate && 2690 rate <= DESC_RATEVHT2SS_MCS9)) 2691 txpower += rtlefuse->txpwr_5g_bw20diff[path][TX_2S]; 2692 } else if (bandwidth == HT_CHANNEL_WIDTH_20_40) { 2693 if ((DESC_RATEMCS0 <= rate && rate <= DESC_RATEMCS15) || 2694 (DESC_RATEVHT1SS_MCS0 <= rate && 2695 rate <= DESC_RATEVHT2SS_MCS9)) 2696 txpower += rtlefuse->txpwr_5g_bw40diff[path][TX_1S]; 2697 if ((DESC_RATEMCS8 <= rate && rate <= DESC_RATEMCS15) || 2698 (DESC_RATEVHT2SS_MCS0 <= rate && 2699 rate <= DESC_RATEVHT2SS_MCS9)) 2700 txpower += rtlefuse->txpwr_5g_bw40diff[path][TX_2S]; 2701 } else if (bandwidth == HT_CHANNEL_WIDTH_80) { 2702 u8 i; 2703 2704 for (i = 0; i < sizeof(channel5g_80m) / sizeof(u8); ++i) 2705 if (channel5g_80m[i] == channel) 2706 index = i; 2707 2708 if ((DESC_RATEMCS0 <= rate && rate <= DESC_RATEMCS15) || 2709 (DESC_RATEVHT1SS_MCS0 <= rate && 2710 rate <= DESC_RATEVHT2SS_MCS9)) 2711 txpower = rtlefuse->txpwr_5g_bw80base[path][index] 2712 + rtlefuse->txpwr_5g_bw80diff[path][TX_1S]; 2713 if ((DESC_RATEMCS8 <= rate && rate <= DESC_RATEMCS15) || 2714 (DESC_RATEVHT2SS_MCS0 <= rate && 2715 rate <= DESC_RATEVHT2SS_MCS9)) 2716 txpower = rtlefuse->txpwr_5g_bw80base[path][index] 2717 + rtlefuse->txpwr_5g_bw80diff[path][TX_1S] 2718 + rtlefuse->txpwr_5g_bw80diff[path][TX_2S]; 2719 } 2720 } 2721 if (rtlefuse->eeprom_regulatory != 2) 2722 powerdiff_byrate = 2723 _rtl8821ae_phy_get_txpower_by_rate(hw, (u8)(!in_24g), 2724 path, rate); 2725 2726 if (rate == DESC_RATEVHT1SS_MCS8 || rate == DESC_RATEVHT1SS_MCS9 || 2727 rate == DESC_RATEVHT2SS_MCS8 || rate == DESC_RATEVHT2SS_MCS9) 2728 txpower -= powerdiff_byrate; 2729 else 2730 txpower += powerdiff_byrate; 2731 2732 if (rate > DESC_RATE11M) 2733 txpower += rtlpriv->dm.remnant_ofdm_swing_idx[path]; 2734 else 2735 txpower += rtlpriv->dm.remnant_cck_idx; 2736 2737 if (txpower > MAX_POWER_INDEX) 2738 txpower = MAX_POWER_INDEX; 2739 2740 return txpower; 2741 } 2742 2743 static void _rtl8821ae_phy_set_txpower_index(struct ieee80211_hw *hw, 2744 u8 power_index, u8 path, u8 rate) 2745 { 2746 struct rtl_priv *rtlpriv = rtl_priv(hw); 2747 2748 if (path == RF90_PATH_A) { 2749 switch (rate) { 2750 case DESC_RATE1M: 2751 rtl_set_bbreg(hw, RTXAGC_A_CCK11_CCK1, 2752 MASKBYTE0, power_index); 2753 break; 2754 case DESC_RATE2M: 2755 rtl_set_bbreg(hw, RTXAGC_A_CCK11_CCK1, 2756 MASKBYTE1, power_index); 2757 break; 2758 case DESC_RATE5_5M: 2759 rtl_set_bbreg(hw, RTXAGC_A_CCK11_CCK1, 2760 MASKBYTE2, power_index); 2761 break; 2762 case DESC_RATE11M: 2763 rtl_set_bbreg(hw, RTXAGC_A_CCK11_CCK1, 2764 MASKBYTE3, power_index); 2765 break; 2766 case DESC_RATE6M: 2767 rtl_set_bbreg(hw, RTXAGC_A_OFDM18_OFDM6, 2768 MASKBYTE0, power_index); 2769 break; 2770 case DESC_RATE9M: 2771 rtl_set_bbreg(hw, RTXAGC_A_OFDM18_OFDM6, 2772 MASKBYTE1, power_index); 2773 break; 2774 case DESC_RATE12M: 2775 rtl_set_bbreg(hw, RTXAGC_A_OFDM18_OFDM6, 2776 MASKBYTE2, power_index); 2777 break; 2778 case DESC_RATE18M: 2779 rtl_set_bbreg(hw, RTXAGC_A_OFDM18_OFDM6, 2780 MASKBYTE3, power_index); 2781 break; 2782 case DESC_RATE24M: 2783 rtl_set_bbreg(hw, RTXAGC_A_OFDM54_OFDM24, 2784 MASKBYTE0, power_index); 2785 break; 2786 case DESC_RATE36M: 2787 rtl_set_bbreg(hw, RTXAGC_A_OFDM54_OFDM24, 2788 MASKBYTE1, power_index); 2789 break; 2790 case DESC_RATE48M: 2791 rtl_set_bbreg(hw, RTXAGC_A_OFDM54_OFDM24, 2792 MASKBYTE2, power_index); 2793 break; 2794 case DESC_RATE54M: 2795 rtl_set_bbreg(hw, RTXAGC_A_OFDM54_OFDM24, 2796 MASKBYTE3, power_index); 2797 break; 2798 case DESC_RATEMCS0: 2799 rtl_set_bbreg(hw, RTXAGC_A_MCS03_MCS00, 2800 MASKBYTE0, power_index); 2801 break; 2802 case DESC_RATEMCS1: 2803 rtl_set_bbreg(hw, RTXAGC_A_MCS03_MCS00, 2804 MASKBYTE1, power_index); 2805 break; 2806 case DESC_RATEMCS2: 2807 rtl_set_bbreg(hw, RTXAGC_A_MCS03_MCS00, 2808 MASKBYTE2, power_index); 2809 break; 2810 case DESC_RATEMCS3: 2811 rtl_set_bbreg(hw, RTXAGC_A_MCS03_MCS00, 2812 MASKBYTE3, power_index); 2813 break; 2814 case DESC_RATEMCS4: 2815 rtl_set_bbreg(hw, RTXAGC_A_MCS07_MCS04, 2816 MASKBYTE0, power_index); 2817 break; 2818 case DESC_RATEMCS5: 2819 rtl_set_bbreg(hw, RTXAGC_A_MCS07_MCS04, 2820 MASKBYTE1, power_index); 2821 break; 2822 case DESC_RATEMCS6: 2823 rtl_set_bbreg(hw, RTXAGC_A_MCS07_MCS04, 2824 MASKBYTE2, power_index); 2825 break; 2826 case DESC_RATEMCS7: 2827 rtl_set_bbreg(hw, RTXAGC_A_MCS07_MCS04, 2828 MASKBYTE3, power_index); 2829 break; 2830 case DESC_RATEMCS8: 2831 rtl_set_bbreg(hw, RTXAGC_A_MCS11_MCS08, 2832 MASKBYTE0, power_index); 2833 break; 2834 case DESC_RATEMCS9: 2835 rtl_set_bbreg(hw, RTXAGC_A_MCS11_MCS08, 2836 MASKBYTE1, power_index); 2837 break; 2838 case DESC_RATEMCS10: 2839 rtl_set_bbreg(hw, RTXAGC_A_MCS11_MCS08, 2840 MASKBYTE2, power_index); 2841 break; 2842 case DESC_RATEMCS11: 2843 rtl_set_bbreg(hw, RTXAGC_A_MCS11_MCS08, 2844 MASKBYTE3, power_index); 2845 break; 2846 case DESC_RATEMCS12: 2847 rtl_set_bbreg(hw, RTXAGC_A_MCS15_MCS12, 2848 MASKBYTE0, power_index); 2849 break; 2850 case DESC_RATEMCS13: 2851 rtl_set_bbreg(hw, RTXAGC_A_MCS15_MCS12, 2852 MASKBYTE1, power_index); 2853 break; 2854 case DESC_RATEMCS14: 2855 rtl_set_bbreg(hw, RTXAGC_A_MCS15_MCS12, 2856 MASKBYTE2, power_index); 2857 break; 2858 case DESC_RATEMCS15: 2859 rtl_set_bbreg(hw, RTXAGC_A_MCS15_MCS12, 2860 MASKBYTE3, power_index); 2861 break; 2862 case DESC_RATEVHT1SS_MCS0: 2863 rtl_set_bbreg(hw, RTXAGC_A_NSS1INDEX3_NSS1INDEX0, 2864 MASKBYTE0, power_index); 2865 break; 2866 case DESC_RATEVHT1SS_MCS1: 2867 rtl_set_bbreg(hw, RTXAGC_A_NSS1INDEX3_NSS1INDEX0, 2868 MASKBYTE1, power_index); 2869 break; 2870 case DESC_RATEVHT1SS_MCS2: 2871 rtl_set_bbreg(hw, RTXAGC_A_NSS1INDEX3_NSS1INDEX0, 2872 MASKBYTE2, power_index); 2873 break; 2874 case DESC_RATEVHT1SS_MCS3: 2875 rtl_set_bbreg(hw, RTXAGC_A_NSS1INDEX3_NSS1INDEX0, 2876 MASKBYTE3, power_index); 2877 break; 2878 case DESC_RATEVHT1SS_MCS4: 2879 rtl_set_bbreg(hw, RTXAGC_A_NSS1INDEX7_NSS1INDEX4, 2880 MASKBYTE0, power_index); 2881 break; 2882 case DESC_RATEVHT1SS_MCS5: 2883 rtl_set_bbreg(hw, RTXAGC_A_NSS1INDEX7_NSS1INDEX4, 2884 MASKBYTE1, power_index); 2885 break; 2886 case DESC_RATEVHT1SS_MCS6: 2887 rtl_set_bbreg(hw, RTXAGC_A_NSS1INDEX7_NSS1INDEX4, 2888 MASKBYTE2, power_index); 2889 break; 2890 case DESC_RATEVHT1SS_MCS7: 2891 rtl_set_bbreg(hw, RTXAGC_A_NSS1INDEX7_NSS1INDEX4, 2892 MASKBYTE3, power_index); 2893 break; 2894 case DESC_RATEVHT1SS_MCS8: 2895 rtl_set_bbreg(hw, RTXAGC_A_NSS2INDEX1_NSS1INDEX8, 2896 MASKBYTE0, power_index); 2897 break; 2898 case DESC_RATEVHT1SS_MCS9: 2899 rtl_set_bbreg(hw, RTXAGC_A_NSS2INDEX1_NSS1INDEX8, 2900 MASKBYTE1, power_index); 2901 break; 2902 case DESC_RATEVHT2SS_MCS0: 2903 rtl_set_bbreg(hw, RTXAGC_A_NSS2INDEX1_NSS1INDEX8, 2904 MASKBYTE2, power_index); 2905 break; 2906 case DESC_RATEVHT2SS_MCS1: 2907 rtl_set_bbreg(hw, RTXAGC_A_NSS2INDEX1_NSS1INDEX8, 2908 MASKBYTE3, power_index); 2909 break; 2910 case DESC_RATEVHT2SS_MCS2: 2911 rtl_set_bbreg(hw, RTXAGC_A_NSS2INDEX5_NSS2INDEX2, 2912 MASKBYTE0, power_index); 2913 break; 2914 case DESC_RATEVHT2SS_MCS3: 2915 rtl_set_bbreg(hw, RTXAGC_A_NSS2INDEX5_NSS2INDEX2, 2916 MASKBYTE1, power_index); 2917 break; 2918 case DESC_RATEVHT2SS_MCS4: 2919 rtl_set_bbreg(hw, RTXAGC_A_NSS2INDEX5_NSS2INDEX2, 2920 MASKBYTE2, power_index); 2921 break; 2922 case DESC_RATEVHT2SS_MCS5: 2923 rtl_set_bbreg(hw, RTXAGC_A_NSS2INDEX5_NSS2INDEX2, 2924 MASKBYTE3, power_index); 2925 break; 2926 case DESC_RATEVHT2SS_MCS6: 2927 rtl_set_bbreg(hw, RTXAGC_A_NSS2INDEX9_NSS2INDEX6, 2928 MASKBYTE0, power_index); 2929 break; 2930 case DESC_RATEVHT2SS_MCS7: 2931 rtl_set_bbreg(hw, RTXAGC_A_NSS2INDEX9_NSS2INDEX6, 2932 MASKBYTE1, power_index); 2933 break; 2934 case DESC_RATEVHT2SS_MCS8: 2935 rtl_set_bbreg(hw, RTXAGC_A_NSS2INDEX9_NSS2INDEX6, 2936 MASKBYTE2, power_index); 2937 break; 2938 case DESC_RATEVHT2SS_MCS9: 2939 rtl_set_bbreg(hw, RTXAGC_A_NSS2INDEX9_NSS2INDEX6, 2940 MASKBYTE3, power_index); 2941 break; 2942 default: 2943 RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD, 2944 "Invalid Rate!!\n"); 2945 break; 2946 } 2947 } else if (path == RF90_PATH_B) { 2948 switch (rate) { 2949 case DESC_RATE1M: 2950 rtl_set_bbreg(hw, RTXAGC_B_CCK11_CCK1, 2951 MASKBYTE0, power_index); 2952 break; 2953 case DESC_RATE2M: 2954 rtl_set_bbreg(hw, RTXAGC_B_CCK11_CCK1, 2955 MASKBYTE1, power_index); 2956 break; 2957 case DESC_RATE5_5M: 2958 rtl_set_bbreg(hw, RTXAGC_B_CCK11_CCK1, 2959 MASKBYTE2, power_index); 2960 break; 2961 case DESC_RATE11M: 2962 rtl_set_bbreg(hw, RTXAGC_B_CCK11_CCK1, 2963 MASKBYTE3, power_index); 2964 break; 2965 case DESC_RATE6M: 2966 rtl_set_bbreg(hw, RTXAGC_B_OFDM18_OFDM6, 2967 MASKBYTE0, power_index); 2968 break; 2969 case DESC_RATE9M: 2970 rtl_set_bbreg(hw, RTXAGC_B_OFDM18_OFDM6, 2971 MASKBYTE1, power_index); 2972 break; 2973 case DESC_RATE12M: 2974 rtl_set_bbreg(hw, RTXAGC_B_OFDM18_OFDM6, 2975 MASKBYTE2, power_index); 2976 break; 2977 case DESC_RATE18M: 2978 rtl_set_bbreg(hw, RTXAGC_B_OFDM18_OFDM6, 2979 MASKBYTE3, power_index); 2980 break; 2981 case DESC_RATE24M: 2982 rtl_set_bbreg(hw, RTXAGC_B_OFDM54_OFDM24, 2983 MASKBYTE0, power_index); 2984 break; 2985 case DESC_RATE36M: 2986 rtl_set_bbreg(hw, RTXAGC_B_OFDM54_OFDM24, 2987 MASKBYTE1, power_index); 2988 break; 2989 case DESC_RATE48M: 2990 rtl_set_bbreg(hw, RTXAGC_B_OFDM54_OFDM24, 2991 MASKBYTE2, power_index); 2992 break; 2993 case DESC_RATE54M: 2994 rtl_set_bbreg(hw, RTXAGC_B_OFDM54_OFDM24, 2995 MASKBYTE3, power_index); 2996 break; 2997 case DESC_RATEMCS0: 2998 rtl_set_bbreg(hw, RTXAGC_B_MCS03_MCS00, 2999 MASKBYTE0, power_index); 3000 break; 3001 case DESC_RATEMCS1: 3002 rtl_set_bbreg(hw, RTXAGC_B_MCS03_MCS00, 3003 MASKBYTE1, power_index); 3004 break; 3005 case DESC_RATEMCS2: 3006 rtl_set_bbreg(hw, RTXAGC_B_MCS03_MCS00, 3007 MASKBYTE2, power_index); 3008 break; 3009 case DESC_RATEMCS3: 3010 rtl_set_bbreg(hw, RTXAGC_B_MCS03_MCS00, 3011 MASKBYTE3, power_index); 3012 break; 3013 case DESC_RATEMCS4: 3014 rtl_set_bbreg(hw, RTXAGC_B_MCS07_MCS04, 3015 MASKBYTE0, power_index); 3016 break; 3017 case DESC_RATEMCS5: 3018 rtl_set_bbreg(hw, RTXAGC_B_MCS07_MCS04, 3019 MASKBYTE1, power_index); 3020 break; 3021 case DESC_RATEMCS6: 3022 rtl_set_bbreg(hw, RTXAGC_B_MCS07_MCS04, 3023 MASKBYTE2, power_index); 3024 break; 3025 case DESC_RATEMCS7: 3026 rtl_set_bbreg(hw, RTXAGC_B_MCS07_MCS04, 3027 MASKBYTE3, power_index); 3028 break; 3029 case DESC_RATEMCS8: 3030 rtl_set_bbreg(hw, RTXAGC_B_MCS11_MCS08, 3031 MASKBYTE0, power_index); 3032 break; 3033 case DESC_RATEMCS9: 3034 rtl_set_bbreg(hw, RTXAGC_B_MCS11_MCS08, 3035 MASKBYTE1, power_index); 3036 break; 3037 case DESC_RATEMCS10: 3038 rtl_set_bbreg(hw, RTXAGC_B_MCS11_MCS08, 3039 MASKBYTE2, power_index); 3040 break; 3041 case DESC_RATEMCS11: 3042 rtl_set_bbreg(hw, RTXAGC_B_MCS11_MCS08, 3043 MASKBYTE3, power_index); 3044 break; 3045 case DESC_RATEMCS12: 3046 rtl_set_bbreg(hw, RTXAGC_B_MCS15_MCS12, 3047 MASKBYTE0, power_index); 3048 break; 3049 case DESC_RATEMCS13: 3050 rtl_set_bbreg(hw, RTXAGC_B_MCS15_MCS12, 3051 MASKBYTE1, power_index); 3052 break; 3053 case DESC_RATEMCS14: 3054 rtl_set_bbreg(hw, RTXAGC_B_MCS15_MCS12, 3055 MASKBYTE2, power_index); 3056 break; 3057 case DESC_RATEMCS15: 3058 rtl_set_bbreg(hw, RTXAGC_B_MCS15_MCS12, 3059 MASKBYTE3, power_index); 3060 break; 3061 case DESC_RATEVHT1SS_MCS0: 3062 rtl_set_bbreg(hw, RTXAGC_B_NSS1INDEX3_NSS1INDEX0, 3063 MASKBYTE0, power_index); 3064 break; 3065 case DESC_RATEVHT1SS_MCS1: 3066 rtl_set_bbreg(hw, RTXAGC_B_NSS1INDEX3_NSS1INDEX0, 3067 MASKBYTE1, power_index); 3068 break; 3069 case DESC_RATEVHT1SS_MCS2: 3070 rtl_set_bbreg(hw, RTXAGC_B_NSS1INDEX3_NSS1INDEX0, 3071 MASKBYTE2, power_index); 3072 break; 3073 case DESC_RATEVHT1SS_MCS3: 3074 rtl_set_bbreg(hw, RTXAGC_B_NSS1INDEX3_NSS1INDEX0, 3075 MASKBYTE3, power_index); 3076 break; 3077 case DESC_RATEVHT1SS_MCS4: 3078 rtl_set_bbreg(hw, RTXAGC_B_NSS1INDEX7_NSS1INDEX4, 3079 MASKBYTE0, power_index); 3080 break; 3081 case DESC_RATEVHT1SS_MCS5: 3082 rtl_set_bbreg(hw, RTXAGC_B_NSS1INDEX7_NSS1INDEX4, 3083 MASKBYTE1, power_index); 3084 break; 3085 case DESC_RATEVHT1SS_MCS6: 3086 rtl_set_bbreg(hw, RTXAGC_B_NSS1INDEX7_NSS1INDEX4, 3087 MASKBYTE2, power_index); 3088 break; 3089 case DESC_RATEVHT1SS_MCS7: 3090 rtl_set_bbreg(hw, RTXAGC_B_NSS1INDEX7_NSS1INDEX4, 3091 MASKBYTE3, power_index); 3092 break; 3093 case DESC_RATEVHT1SS_MCS8: 3094 rtl_set_bbreg(hw, RTXAGC_B_NSS2INDEX1_NSS1INDEX8, 3095 MASKBYTE0, power_index); 3096 break; 3097 case DESC_RATEVHT1SS_MCS9: 3098 rtl_set_bbreg(hw, RTXAGC_B_NSS2INDEX1_NSS1INDEX8, 3099 MASKBYTE1, power_index); 3100 break; 3101 case DESC_RATEVHT2SS_MCS0: 3102 rtl_set_bbreg(hw, RTXAGC_B_NSS2INDEX1_NSS1INDEX8, 3103 MASKBYTE2, power_index); 3104 break; 3105 case DESC_RATEVHT2SS_MCS1: 3106 rtl_set_bbreg(hw, RTXAGC_B_NSS2INDEX1_NSS1INDEX8, 3107 MASKBYTE3, power_index); 3108 break; 3109 case DESC_RATEVHT2SS_MCS2: 3110 rtl_set_bbreg(hw, RTXAGC_B_NSS2INDEX5_NSS2INDEX2, 3111 MASKBYTE0, power_index); 3112 break; 3113 case DESC_RATEVHT2SS_MCS3: 3114 rtl_set_bbreg(hw, RTXAGC_B_NSS2INDEX5_NSS2INDEX2, 3115 MASKBYTE1, power_index); 3116 break; 3117 case DESC_RATEVHT2SS_MCS4: 3118 rtl_set_bbreg(hw, RTXAGC_B_NSS2INDEX5_NSS2INDEX2, 3119 MASKBYTE2, power_index); 3120 break; 3121 case DESC_RATEVHT2SS_MCS5: 3122 rtl_set_bbreg(hw, RTXAGC_B_NSS2INDEX5_NSS2INDEX2, 3123 MASKBYTE3, power_index); 3124 break; 3125 case DESC_RATEVHT2SS_MCS6: 3126 rtl_set_bbreg(hw, RTXAGC_B_NSS2INDEX9_NSS2INDEX6, 3127 MASKBYTE0, power_index); 3128 break; 3129 case DESC_RATEVHT2SS_MCS7: 3130 rtl_set_bbreg(hw, RTXAGC_B_NSS2INDEX9_NSS2INDEX6, 3131 MASKBYTE1, power_index); 3132 break; 3133 case DESC_RATEVHT2SS_MCS8: 3134 rtl_set_bbreg(hw, RTXAGC_B_NSS2INDEX9_NSS2INDEX6, 3135 MASKBYTE2, power_index); 3136 break; 3137 case DESC_RATEVHT2SS_MCS9: 3138 rtl_set_bbreg(hw, RTXAGC_B_NSS2INDEX9_NSS2INDEX6, 3139 MASKBYTE3, power_index); 3140 break; 3141 default: 3142 RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD, 3143 "Invalid Rate!!\n"); 3144 break; 3145 } 3146 } else { 3147 RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD, 3148 "Invalid RFPath!!\n"); 3149 } 3150 } 3151 3152 static void _rtl8821ae_phy_set_txpower_level_by_path(struct ieee80211_hw *hw, 3153 u8 *array, u8 path, 3154 u8 channel, u8 size) 3155 { 3156 struct rtl_priv *rtlpriv = rtl_priv(hw); 3157 struct rtl_phy *rtlphy = &rtlpriv->phy; 3158 u8 i; 3159 u8 power_index; 3160 3161 for (i = 0; i < size; i++) { 3162 power_index = 3163 _rtl8821ae_get_txpower_index(hw, path, array[i], 3164 rtlphy->current_chan_bw, 3165 channel); 3166 _rtl8821ae_phy_set_txpower_index(hw, power_index, path, 3167 array[i]); 3168 } 3169 } 3170 3171 static void _rtl8821ae_phy_txpower_training_by_path(struct ieee80211_hw *hw, 3172 u8 bw, u8 channel, u8 path) 3173 { 3174 struct rtl_priv *rtlpriv = rtl_priv(hw); 3175 struct rtl_phy *rtlphy = &rtlpriv->phy; 3176 3177 u8 i; 3178 u32 power_level, data, offset; 3179 3180 if (path >= rtlphy->num_total_rfpath) 3181 return; 3182 3183 data = 0; 3184 if (path == RF90_PATH_A) { 3185 power_level = 3186 _rtl8821ae_get_txpower_index(hw, RF90_PATH_A, 3187 DESC_RATEMCS7, bw, channel); 3188 offset = RA_TXPWRTRAING; 3189 } else { 3190 power_level = 3191 _rtl8821ae_get_txpower_index(hw, RF90_PATH_B, 3192 DESC_RATEMCS7, bw, channel); 3193 offset = RB_TXPWRTRAING; 3194 } 3195 3196 for (i = 0; i < 3; i++) { 3197 if (i == 0) 3198 power_level = power_level - 10; 3199 else if (i == 1) 3200 power_level = power_level - 8; 3201 else 3202 power_level = power_level - 6; 3203 3204 data |= (((power_level > 2) ? (power_level) : 2) << (i * 8)); 3205 } 3206 rtl_set_bbreg(hw, offset, 0xffffff, data); 3207 } 3208 3209 void rtl8821ae_phy_set_txpower_level_by_path(struct ieee80211_hw *hw, 3210 u8 channel, u8 path) 3211 { 3212 /* struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw)); */ 3213 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw)); 3214 struct rtl_priv *rtlpriv = rtl_priv(hw); 3215 struct rtl_phy *rtlphy = &rtlpriv->phy; 3216 u8 cck_rates[] = {DESC_RATE1M, DESC_RATE2M, DESC_RATE5_5M, 3217 DESC_RATE11M}; 3218 u8 sizes_of_cck_retes = 4; 3219 u8 ofdm_rates[] = {DESC_RATE6M, DESC_RATE9M, DESC_RATE12M, 3220 DESC_RATE18M, DESC_RATE24M, DESC_RATE36M, 3221 DESC_RATE48M, DESC_RATE54M}; 3222 u8 sizes_of_ofdm_retes = 8; 3223 u8 ht_rates_1t[] = {DESC_RATEMCS0, DESC_RATEMCS1, DESC_RATEMCS2, 3224 DESC_RATEMCS3, DESC_RATEMCS4, DESC_RATEMCS5, 3225 DESC_RATEMCS6, DESC_RATEMCS7}; 3226 u8 sizes_of_ht_retes_1t = 8; 3227 u8 ht_rates_2t[] = {DESC_RATEMCS8, DESC_RATEMCS9, 3228 DESC_RATEMCS10, DESC_RATEMCS11, 3229 DESC_RATEMCS12, DESC_RATEMCS13, 3230 DESC_RATEMCS14, DESC_RATEMCS15}; 3231 u8 sizes_of_ht_retes_2t = 8; 3232 u8 vht_rates_1t[] = {DESC_RATEVHT1SS_MCS0, DESC_RATEVHT1SS_MCS1, 3233 DESC_RATEVHT1SS_MCS2, DESC_RATEVHT1SS_MCS3, 3234 DESC_RATEVHT1SS_MCS4, DESC_RATEVHT1SS_MCS5, 3235 DESC_RATEVHT1SS_MCS6, DESC_RATEVHT1SS_MCS7, 3236 DESC_RATEVHT1SS_MCS8, DESC_RATEVHT1SS_MCS9}; 3237 u8 vht_rates_2t[] = {DESC_RATEVHT2SS_MCS0, DESC_RATEVHT2SS_MCS1, 3238 DESC_RATEVHT2SS_MCS2, DESC_RATEVHT2SS_MCS3, 3239 DESC_RATEVHT2SS_MCS4, DESC_RATEVHT2SS_MCS5, 3240 DESC_RATEVHT2SS_MCS6, DESC_RATEVHT2SS_MCS7, 3241 DESC_RATEVHT2SS_MCS8, DESC_RATEVHT2SS_MCS9}; 3242 u8 sizes_of_vht_retes = 10; 3243 3244 if (rtlhal->current_bandtype == BAND_ON_2_4G) 3245 _rtl8821ae_phy_set_txpower_level_by_path(hw, cck_rates, path, channel, 3246 sizes_of_cck_retes); 3247 3248 _rtl8821ae_phy_set_txpower_level_by_path(hw, ofdm_rates, path, channel, 3249 sizes_of_ofdm_retes); 3250 _rtl8821ae_phy_set_txpower_level_by_path(hw, ht_rates_1t, path, channel, 3251 sizes_of_ht_retes_1t); 3252 _rtl8821ae_phy_set_txpower_level_by_path(hw, vht_rates_1t, path, channel, 3253 sizes_of_vht_retes); 3254 3255 if (rtlphy->num_total_rfpath >= 2) { 3256 _rtl8821ae_phy_set_txpower_level_by_path(hw, ht_rates_2t, path, 3257 channel, 3258 sizes_of_ht_retes_2t); 3259 _rtl8821ae_phy_set_txpower_level_by_path(hw, vht_rates_2t, path, 3260 channel, 3261 sizes_of_vht_retes); 3262 } 3263 3264 _rtl8821ae_phy_txpower_training_by_path(hw, rtlphy->current_chan_bw, 3265 channel, path); 3266 } 3267 3268 /*just in case, write txpower in DW, to reduce time*/ 3269 void rtl8821ae_phy_set_txpower_level(struct ieee80211_hw *hw, u8 channel) 3270 { 3271 struct rtl_priv *rtlpriv = rtl_priv(hw); 3272 struct rtl_phy *rtlphy = &rtlpriv->phy; 3273 u8 path = 0; 3274 3275 for (path = RF90_PATH_A; path < rtlphy->num_total_rfpath; ++path) 3276 rtl8821ae_phy_set_txpower_level_by_path(hw, channel, path); 3277 } 3278 3279 static long _rtl8821ae_phy_txpwr_idx_to_dbm(struct ieee80211_hw *hw, 3280 enum wireless_mode wirelessmode, 3281 u8 txpwridx) 3282 { 3283 long offset; 3284 long pwrout_dbm; 3285 3286 switch (wirelessmode) { 3287 case WIRELESS_MODE_B: 3288 offset = -7; 3289 break; 3290 case WIRELESS_MODE_G: 3291 case WIRELESS_MODE_N_24G: 3292 offset = -8; 3293 break; 3294 default: 3295 offset = -8; 3296 break; 3297 } 3298 pwrout_dbm = txpwridx / 2 + offset; 3299 return pwrout_dbm; 3300 } 3301 3302 void rtl8821ae_phy_scan_operation_backup(struct ieee80211_hw *hw, u8 operation) 3303 { 3304 struct rtl_priv *rtlpriv = rtl_priv(hw); 3305 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw)); 3306 enum io_type iotype = IO_CMD_PAUSE_BAND0_DM_BY_SCAN; 3307 3308 if (!is_hal_stop(rtlhal)) { 3309 switch (operation) { 3310 case SCAN_OPT_BACKUP_BAND0: 3311 iotype = IO_CMD_PAUSE_BAND0_DM_BY_SCAN; 3312 rtlpriv->cfg->ops->set_hw_reg(hw, 3313 HW_VAR_IO_CMD, 3314 (u8 *)&iotype); 3315 3316 break; 3317 case SCAN_OPT_BACKUP_BAND1: 3318 iotype = IO_CMD_PAUSE_BAND1_DM_BY_SCAN; 3319 rtlpriv->cfg->ops->set_hw_reg(hw, 3320 HW_VAR_IO_CMD, 3321 (u8 *)&iotype); 3322 3323 break; 3324 case SCAN_OPT_RESTORE: 3325 iotype = IO_CMD_RESUME_DM_BY_SCAN; 3326 rtlpriv->cfg->ops->set_hw_reg(hw, 3327 HW_VAR_IO_CMD, 3328 (u8 *)&iotype); 3329 break; 3330 default: 3331 pr_err("Unknown Scan Backup operation.\n"); 3332 break; 3333 } 3334 } 3335 } 3336 3337 static void _rtl8821ae_phy_set_reg_bw(struct rtl_priv *rtlpriv, u8 bw) 3338 { 3339 u16 reg_rf_mode_bw, tmp = 0; 3340 3341 reg_rf_mode_bw = rtl_read_word(rtlpriv, REG_TRXPTCL_CTL); 3342 switch (bw) { 3343 case HT_CHANNEL_WIDTH_20: 3344 rtl_write_word(rtlpriv, REG_TRXPTCL_CTL, reg_rf_mode_bw & 0xFE7F); 3345 break; 3346 case HT_CHANNEL_WIDTH_20_40: 3347 tmp = reg_rf_mode_bw | BIT(7); 3348 rtl_write_word(rtlpriv, REG_TRXPTCL_CTL, tmp & 0xFEFF); 3349 break; 3350 case HT_CHANNEL_WIDTH_80: 3351 tmp = reg_rf_mode_bw | BIT(8); 3352 rtl_write_word(rtlpriv, REG_TRXPTCL_CTL, tmp & 0xFF7F); 3353 break; 3354 default: 3355 RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING, "unknown Bandwidth: 0x%x\n", bw); 3356 break; 3357 } 3358 } 3359 3360 static u8 _rtl8821ae_phy_get_secondary_chnl(struct rtl_priv *rtlpriv) 3361 { 3362 struct rtl_phy *rtlphy = &rtlpriv->phy; 3363 struct rtl_mac *mac = rtl_mac(rtlpriv); 3364 u8 sc_set_40 = 0, sc_set_20 = 0; 3365 3366 if (rtlphy->current_chan_bw == HT_CHANNEL_WIDTH_80) { 3367 if (mac->cur_80_prime_sc == PRIME_CHNL_OFFSET_LOWER) 3368 sc_set_40 = VHT_DATA_SC_40_LOWER_OF_80MHZ; 3369 else if (mac->cur_80_prime_sc == PRIME_CHNL_OFFSET_UPPER) 3370 sc_set_40 = VHT_DATA_SC_40_UPPER_OF_80MHZ; 3371 else 3372 pr_err("SCMapping: Not Correct Primary40MHz Setting\n"); 3373 3374 if ((mac->cur_40_prime_sc == PRIME_CHNL_OFFSET_LOWER) && 3375 (mac->cur_80_prime_sc == HAL_PRIME_CHNL_OFFSET_LOWER)) 3376 sc_set_20 = VHT_DATA_SC_20_LOWEST_OF_80MHZ; 3377 else if ((mac->cur_40_prime_sc == PRIME_CHNL_OFFSET_UPPER) && 3378 (mac->cur_80_prime_sc == HAL_PRIME_CHNL_OFFSET_LOWER)) 3379 sc_set_20 = VHT_DATA_SC_20_LOWER_OF_80MHZ; 3380 else if ((mac->cur_40_prime_sc == PRIME_CHNL_OFFSET_LOWER) && 3381 (mac->cur_80_prime_sc == HAL_PRIME_CHNL_OFFSET_UPPER)) 3382 sc_set_20 = VHT_DATA_SC_20_UPPER_OF_80MHZ; 3383 else if ((mac->cur_40_prime_sc == PRIME_CHNL_OFFSET_UPPER) && 3384 (mac->cur_80_prime_sc == HAL_PRIME_CHNL_OFFSET_UPPER)) 3385 sc_set_20 = VHT_DATA_SC_20_UPPERST_OF_80MHZ; 3386 else 3387 pr_err("SCMapping: Not Correct Primary40MHz Setting\n"); 3388 } else if (rtlphy->current_chan_bw == HT_CHANNEL_WIDTH_20_40) { 3389 if (mac->cur_40_prime_sc == PRIME_CHNL_OFFSET_UPPER) 3390 sc_set_20 = VHT_DATA_SC_20_UPPER_OF_80MHZ; 3391 else if (mac->cur_40_prime_sc == PRIME_CHNL_OFFSET_LOWER) 3392 sc_set_20 = VHT_DATA_SC_20_LOWER_OF_80MHZ; 3393 else 3394 pr_err("SCMapping: Not Correct Primary40MHz Setting\n"); 3395 } 3396 return (sc_set_40 << 4) | sc_set_20; 3397 } 3398 3399 void rtl8821ae_phy_set_bw_mode_callback(struct ieee80211_hw *hw) 3400 { 3401 struct rtl_priv *rtlpriv = rtl_priv(hw); 3402 struct rtl_phy *rtlphy = &rtlpriv->phy; 3403 u8 sub_chnl = 0; 3404 u8 l1pk_val = 0; 3405 3406 RT_TRACE(rtlpriv, COMP_SCAN, DBG_TRACE, 3407 "Switch to %s bandwidth\n", 3408 (rtlphy->current_chan_bw == HT_CHANNEL_WIDTH_20 ? 3409 "20MHz" : 3410 (rtlphy->current_chan_bw == HT_CHANNEL_WIDTH_20_40 ? 3411 "40MHz" : "80MHz"))); 3412 3413 _rtl8821ae_phy_set_reg_bw(rtlpriv, rtlphy->current_chan_bw); 3414 sub_chnl = _rtl8821ae_phy_get_secondary_chnl(rtlpriv); 3415 rtl_write_byte(rtlpriv, 0x0483, sub_chnl); 3416 3417 switch (rtlphy->current_chan_bw) { 3418 case HT_CHANNEL_WIDTH_20: 3419 rtl_set_bbreg(hw, RRFMOD, 0x003003C3, 0x00300200); 3420 rtl_set_bbreg(hw, RADC_BUF_CLK, BIT(30), 0); 3421 3422 if (rtlphy->rf_type == RF_2T2R) 3423 rtl_set_bbreg(hw, RL1PEAKTH, 0x03C00000, 7); 3424 else 3425 rtl_set_bbreg(hw, RL1PEAKTH, 0x03C00000, 8); 3426 break; 3427 case HT_CHANNEL_WIDTH_20_40: 3428 rtl_set_bbreg(hw, RRFMOD, 0x003003C3, 0x00300201); 3429 rtl_set_bbreg(hw, RADC_BUF_CLK, BIT(30), 0); 3430 rtl_set_bbreg(hw, RRFMOD, 0x3C, sub_chnl); 3431 rtl_set_bbreg(hw, RCCAONSEC, 0xf0000000, sub_chnl); 3432 3433 if (rtlphy->reg_837 & BIT(2)) 3434 l1pk_val = 6; 3435 else { 3436 if (rtlphy->rf_type == RF_2T2R) 3437 l1pk_val = 7; 3438 else 3439 l1pk_val = 8; 3440 } 3441 /* 0x848[25:22] = 0x6 */ 3442 rtl_set_bbreg(hw, RL1PEAKTH, 0x03C00000, l1pk_val); 3443 3444 if (sub_chnl == VHT_DATA_SC_20_UPPER_OF_80MHZ) 3445 rtl_set_bbreg(hw, RCCK_SYSTEM, BCCK_SYSTEM, 1); 3446 else 3447 rtl_set_bbreg(hw, RCCK_SYSTEM, BCCK_SYSTEM, 0); 3448 break; 3449 3450 case HT_CHANNEL_WIDTH_80: 3451 /* 0x8ac[21,20,9:6,1,0]=8'b11100010 */ 3452 rtl_set_bbreg(hw, RRFMOD, 0x003003C3, 0x00300202); 3453 /* 0x8c4[30] = 1 */ 3454 rtl_set_bbreg(hw, RADC_BUF_CLK, BIT(30), 1); 3455 rtl_set_bbreg(hw, RRFMOD, 0x3C, sub_chnl); 3456 rtl_set_bbreg(hw, RCCAONSEC, 0xf0000000, sub_chnl); 3457 3458 if (rtlphy->reg_837 & BIT(2)) 3459 l1pk_val = 5; 3460 else { 3461 if (rtlphy->rf_type == RF_2T2R) 3462 l1pk_val = 6; 3463 else 3464 l1pk_val = 7; 3465 } 3466 rtl_set_bbreg(hw, RL1PEAKTH, 0x03C00000, l1pk_val); 3467 3468 break; 3469 default: 3470 pr_err("unknown bandwidth: %#X\n", 3471 rtlphy->current_chan_bw); 3472 break; 3473 } 3474 3475 rtl8812ae_fixspur(hw, rtlphy->current_chan_bw, rtlphy->current_channel); 3476 3477 rtl8821ae_phy_rf6052_set_bandwidth(hw, rtlphy->current_chan_bw); 3478 rtlphy->set_bwmode_inprogress = false; 3479 3480 RT_TRACE(rtlpriv, COMP_SCAN, DBG_LOUD, "\n"); 3481 } 3482 3483 void rtl8821ae_phy_set_bw_mode(struct ieee80211_hw *hw, 3484 enum nl80211_channel_type ch_type) 3485 { 3486 struct rtl_priv *rtlpriv = rtl_priv(hw); 3487 struct rtl_phy *rtlphy = &rtlpriv->phy; 3488 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw)); 3489 u8 tmp_bw = rtlphy->current_chan_bw; 3490 3491 if (rtlphy->set_bwmode_inprogress) 3492 return; 3493 rtlphy->set_bwmode_inprogress = true; 3494 if ((!is_hal_stop(rtlhal)) && !(RT_CANNOT_IO(hw))) 3495 rtl8821ae_phy_set_bw_mode_callback(hw); 3496 else { 3497 RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING, 3498 "FALSE driver sleep or unload\n"); 3499 rtlphy->set_bwmode_inprogress = false; 3500 rtlphy->current_chan_bw = tmp_bw; 3501 } 3502 } 3503 3504 void rtl8821ae_phy_sw_chnl_callback(struct ieee80211_hw *hw) 3505 { 3506 struct rtl_priv *rtlpriv = rtl_priv(hw); 3507 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw)); 3508 struct rtl_phy *rtlphy = &rtlpriv->phy; 3509 u8 channel = rtlphy->current_channel; 3510 u8 path; 3511 u32 data; 3512 3513 RT_TRACE(rtlpriv, COMP_SCAN, DBG_TRACE, 3514 "switch to channel%d\n", rtlphy->current_channel); 3515 if (is_hal_stop(rtlhal)) 3516 return; 3517 3518 if (36 <= channel && channel <= 48) 3519 data = 0x494; 3520 else if (50 <= channel && channel <= 64) 3521 data = 0x453; 3522 else if (100 <= channel && channel <= 116) 3523 data = 0x452; 3524 else if (118 <= channel) 3525 data = 0x412; 3526 else 3527 data = 0x96a; 3528 rtl_set_bbreg(hw, RFC_AREA, 0x1ffe0000, data); 3529 3530 for (path = RF90_PATH_A; path < rtlphy->num_total_rfpath; path++) { 3531 if (36 <= channel && channel <= 64) 3532 data = 0x101; 3533 else if (100 <= channel && channel <= 140) 3534 data = 0x301; 3535 else if (140 < channel) 3536 data = 0x501; 3537 else 3538 data = 0x000; 3539 rtl8821ae_phy_set_rf_reg(hw, path, RF_CHNLBW, 3540 BIT(18)|BIT(17)|BIT(16)|BIT(9)|BIT(8), data); 3541 3542 rtl8821ae_phy_set_rf_reg(hw, path, RF_CHNLBW, 3543 BMASKBYTE0, channel); 3544 3545 if (channel > 14) { 3546 if (rtlhal->hw_type == HARDWARE_TYPE_RTL8821AE) { 3547 if (36 <= channel && channel <= 64) 3548 data = 0x114E9; 3549 else 3550 data = 0x110E9; 3551 rtl8821ae_phy_set_rf_reg(hw, path, RF_APK, 3552 BRFREGOFFSETMASK, data); 3553 } 3554 } 3555 } 3556 RT_TRACE(rtlpriv, COMP_SCAN, DBG_TRACE, "\n"); 3557 } 3558 3559 u8 rtl8821ae_phy_sw_chnl(struct ieee80211_hw *hw) 3560 { 3561 struct rtl_priv *rtlpriv = rtl_priv(hw); 3562 struct rtl_phy *rtlphy = &rtlpriv->phy; 3563 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw)); 3564 u32 timeout = 1000, timecount = 0; 3565 u8 channel = rtlphy->current_channel; 3566 3567 if (rtlphy->sw_chnl_inprogress) 3568 return 0; 3569 if (rtlphy->set_bwmode_inprogress) 3570 return 0; 3571 3572 if ((is_hal_stop(rtlhal)) || (RT_CANNOT_IO(hw))) { 3573 RT_TRACE(rtlpriv, COMP_CHAN, DBG_LOUD, 3574 "sw_chnl_inprogress false driver sleep or unload\n"); 3575 return 0; 3576 } 3577 while (rtlphy->lck_inprogress && timecount < timeout) { 3578 mdelay(50); 3579 timecount += 50; 3580 } 3581 3582 if (rtlphy->current_channel > 14 && rtlhal->current_bandtype != BAND_ON_5G) 3583 rtl8821ae_phy_switch_wirelessband(hw, BAND_ON_5G); 3584 else if (rtlphy->current_channel <= 14 && rtlhal->current_bandtype != BAND_ON_2_4G) 3585 rtl8821ae_phy_switch_wirelessband(hw, BAND_ON_2_4G); 3586 3587 rtlphy->sw_chnl_inprogress = true; 3588 if (channel == 0) 3589 channel = 1; 3590 3591 RT_TRACE(rtlpriv, COMP_SCAN, DBG_TRACE, 3592 "switch to channel%d, band type is %d\n", 3593 rtlphy->current_channel, rtlhal->current_bandtype); 3594 3595 rtl8821ae_phy_sw_chnl_callback(hw); 3596 3597 rtl8821ae_dm_clear_txpower_tracking_state(hw); 3598 rtl8821ae_phy_set_txpower_level(hw, rtlphy->current_channel); 3599 3600 RT_TRACE(rtlpriv, COMP_SCAN, DBG_TRACE, "\n"); 3601 rtlphy->sw_chnl_inprogress = false; 3602 return 1; 3603 } 3604 3605 u8 _rtl8812ae_get_right_chnl_place_for_iqk(u8 chnl) 3606 { 3607 static const u8 channel_all[TARGET_CHNL_NUM_2G_5G_8812] = { 3608 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 3609 14, 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 3610 56, 58, 60, 62, 64, 100, 102, 104, 106, 108, 3611 110, 112, 114, 116, 118, 120, 122, 124, 126, 3612 128, 130, 132, 134, 136, 138, 140, 149, 151, 3613 153, 155, 157, 159, 161, 163, 165}; 3614 u8 place; 3615 3616 if (chnl > 14) { 3617 for (place = 14; place < sizeof(channel_all); place++) 3618 if (channel_all[place] == chnl) 3619 return place-13; 3620 } 3621 3622 return 0; 3623 } 3624 3625 #define MACBB_REG_NUM 10 3626 #define AFE_REG_NUM 14 3627 #define RF_REG_NUM 3 3628 3629 static void _rtl8821ae_iqk_backup_macbb(struct ieee80211_hw *hw, 3630 u32 *macbb_backup, 3631 u32 *backup_macbb_reg, u32 mac_bb_num) 3632 { 3633 struct rtl_priv *rtlpriv = rtl_priv(hw); 3634 u32 i; 3635 3636 rtl_set_bbreg(hw, 0x82c, BIT(31), 0x0); /*[31] = 0 --> Page C*/ 3637 /*save MACBB default value*/ 3638 for (i = 0; i < mac_bb_num; i++) 3639 macbb_backup[i] = rtl_read_dword(rtlpriv, backup_macbb_reg[i]); 3640 3641 RT_TRACE(rtlpriv, COMP_IQK, DBG_LOUD, "BackupMacBB Success!!!!\n"); 3642 } 3643 3644 static void _rtl8821ae_iqk_backup_afe(struct ieee80211_hw *hw, u32 *afe_backup, 3645 u32 *backup_afe_REG, u32 afe_num) 3646 { 3647 struct rtl_priv *rtlpriv = rtl_priv(hw); 3648 u32 i; 3649 3650 rtl_set_bbreg(hw, 0x82c, BIT(31), 0x0); /*[31] = 0 --> Page C*/ 3651 /*Save AFE Parameters */ 3652 for (i = 0; i < afe_num; i++) 3653 afe_backup[i] = rtl_read_dword(rtlpriv, backup_afe_REG[i]); 3654 RT_TRACE(rtlpriv, COMP_IQK, DBG_LOUD, "BackupAFE Success!!!!\n"); 3655 } 3656 3657 static void _rtl8821ae_iqk_backup_rf(struct ieee80211_hw *hw, u32 *rfa_backup, 3658 u32 *rfb_backup, u32 *backup_rf_reg, 3659 u32 rf_num) 3660 { 3661 struct rtl_priv *rtlpriv = rtl_priv(hw); 3662 u32 i; 3663 3664 rtl_set_bbreg(hw, 0x82c, BIT(31), 0x0); /*[31] = 0 --> Page C*/ 3665 /*Save RF Parameters*/ 3666 for (i = 0; i < rf_num; i++) { 3667 rfa_backup[i] = rtl_get_rfreg(hw, RF90_PATH_A, backup_rf_reg[i], 3668 BMASKDWORD); 3669 rfb_backup[i] = rtl_get_rfreg(hw, RF90_PATH_B, backup_rf_reg[i], 3670 BMASKDWORD); 3671 } 3672 RT_TRACE(rtlpriv, COMP_IQK, DBG_LOUD, "BackupRF Success!!!!\n"); 3673 } 3674 3675 static void _rtl8821ae_iqk_configure_mac( 3676 struct ieee80211_hw *hw 3677 ) 3678 { 3679 struct rtl_priv *rtlpriv = rtl_priv(hw); 3680 /* ========MAC register setting========*/ 3681 rtl_set_bbreg(hw, 0x82c, BIT(31), 0x0); /*[31] = 0 --> Page C*/ 3682 rtl_write_byte(rtlpriv, 0x522, 0x3f); 3683 rtl_set_bbreg(hw, 0x550, BIT(11) | BIT(3), 0x0); 3684 rtl_write_byte(rtlpriv, 0x808, 0x00); /*RX ante off*/ 3685 rtl_set_bbreg(hw, 0x838, 0xf, 0xc); /*CCA off*/ 3686 } 3687 3688 static void _rtl8821ae_iqk_tx_fill_iqc(struct ieee80211_hw *hw, 3689 enum radio_path path, u32 tx_x, u32 tx_y) 3690 { 3691 struct rtl_priv *rtlpriv = rtl_priv(hw); 3692 switch (path) { 3693 case RF90_PATH_A: 3694 /* [31] = 1 --> Page C1 */ 3695 rtl_set_bbreg(hw, 0x82c, BIT(31), 0x1); 3696 rtl_write_dword(rtlpriv, 0xc90, 0x00000080); 3697 rtl_write_dword(rtlpriv, 0xcc4, 0x20040000); 3698 rtl_write_dword(rtlpriv, 0xcc8, 0x20000000); 3699 rtl_set_bbreg(hw, 0xccc, 0x000007ff, tx_y); 3700 rtl_set_bbreg(hw, 0xcd4, 0x000007ff, tx_x); 3701 RT_TRACE(rtlpriv, COMP_IQK, DBG_LOUD, 3702 "TX_X = %x;;TX_Y = %x =====> fill to IQC\n", 3703 tx_x, tx_y); 3704 RT_TRACE(rtlpriv, COMP_IQK, DBG_LOUD, 3705 "0xcd4 = %x;;0xccc = %x ====>fill to IQC\n", 3706 rtl_get_bbreg(hw, 0xcd4, 0x000007ff), 3707 rtl_get_bbreg(hw, 0xccc, 0x000007ff)); 3708 break; 3709 default: 3710 break; 3711 } 3712 } 3713 3714 static void _rtl8821ae_iqk_rx_fill_iqc(struct ieee80211_hw *hw, 3715 enum radio_path path, u32 rx_x, u32 rx_y) 3716 { 3717 struct rtl_priv *rtlpriv = rtl_priv(hw); 3718 switch (path) { 3719 case RF90_PATH_A: 3720 rtl_set_bbreg(hw, 0x82c, BIT(31), 0x0); /* [31] = 0 --> Page C */ 3721 rtl_set_bbreg(hw, 0xc10, 0x000003ff, rx_x>>1); 3722 rtl_set_bbreg(hw, 0xc10, 0x03ff0000, rx_y>>1); 3723 RT_TRACE(rtlpriv, COMP_IQK, DBG_LOUD, 3724 "rx_x = %x;;rx_y = %x ====>fill to IQC\n", 3725 rx_x>>1, rx_y>>1); 3726 RT_TRACE(rtlpriv, COMP_IQK, DBG_LOUD, 3727 "0xc10 = %x ====>fill to IQC\n", 3728 rtl_read_dword(rtlpriv, 0xc10)); 3729 break; 3730 default: 3731 break; 3732 } 3733 } 3734 3735 #define cal_num 10 3736 3737 static void _rtl8821ae_iqk_tx(struct ieee80211_hw *hw, enum radio_path path) 3738 { 3739 struct rtl_priv *rtlpriv = rtl_priv(hw); 3740 struct rtl_phy *rtlphy = &rtlpriv->phy; 3741 struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw)); 3742 3743 u32 tx_fail, rx_fail, delay_count, iqk_ready, cal_retry, cal = 0, temp_reg65; 3744 int tx_x = 0, tx_y = 0, rx_x = 0, rx_y = 0, tx_average = 0, rx_average = 0; 3745 int tx_x0[cal_num], tx_y0[cal_num], tx_x0_rxk[cal_num], 3746 tx_y0_rxk[cal_num], rx_x0[cal_num], rx_y0[cal_num], 3747 tx_dt[cal_num], rx_dt[cal_num]; 3748 bool tx0iqkok = false, rx0iqkok = false; 3749 bool vdf_enable = false; 3750 int i, k, vdf_y[3], vdf_x[3], 3751 ii, dx = 0, dy = 0, tx_finish = 0, rx_finish = 0; 3752 3753 RT_TRACE(rtlpriv, COMP_IQK, DBG_LOUD, 3754 "BandWidth = %d.\n", 3755 rtlphy->current_chan_bw); 3756 if (rtlphy->current_chan_bw == HT_CHANNEL_WIDTH_80) 3757 vdf_enable = true; 3758 3759 while (cal < cal_num) { 3760 switch (path) { 3761 case RF90_PATH_A: 3762 temp_reg65 = rtl_get_rfreg(hw, path, 0x65, 0xffffffff); 3763 /* Path-A LOK */ 3764 rtl_set_bbreg(hw, 0x82c, BIT(31), 0x0); /*[31] = 0 --> Page C*/ 3765 /*========Path-A AFE all on========*/ 3766 /*Port 0 DAC/ADC on*/ 3767 rtl_write_dword(rtlpriv, 0xc60, 0x77777777); 3768 rtl_write_dword(rtlpriv, 0xc64, 0x77777777); 3769 rtl_write_dword(rtlpriv, 0xc68, 0x19791979); 3770 rtl_write_dword(rtlpriv, 0xc6c, 0x19791979); 3771 rtl_write_dword(rtlpriv, 0xc70, 0x19791979); 3772 rtl_write_dword(rtlpriv, 0xc74, 0x19791979); 3773 rtl_write_dword(rtlpriv, 0xc78, 0x19791979); 3774 rtl_write_dword(rtlpriv, 0xc7c, 0x19791979); 3775 rtl_write_dword(rtlpriv, 0xc80, 0x19791979); 3776 rtl_write_dword(rtlpriv, 0xc84, 0x19791979); 3777 3778 rtl_set_bbreg(hw, 0xc00, 0xf, 0x4); /*hardware 3-wire off*/ 3779 3780 /* LOK Setting */ 3781 /* ====== LOK ====== */ 3782 /*DAC/ADC sampling rate (160 MHz)*/ 3783 rtl_set_bbreg(hw, 0xc5c, BIT(26) | BIT(25) | BIT(24), 0x7); 3784 3785 /* 2. LoK RF Setting (at BW = 20M) */ 3786 rtl_set_rfreg(hw, path, 0xef, RFREG_OFFSET_MASK, 0x80002); 3787 rtl_set_rfreg(hw, path, 0x18, 0x00c00, 0x3); /* BW 20M */ 3788 rtl_set_rfreg(hw, path, 0x30, RFREG_OFFSET_MASK, 0x20000); 3789 rtl_set_rfreg(hw, path, 0x31, RFREG_OFFSET_MASK, 0x0003f); 3790 rtl_set_rfreg(hw, path, 0x32, RFREG_OFFSET_MASK, 0xf3fc3); 3791 rtl_set_rfreg(hw, path, 0x65, RFREG_OFFSET_MASK, 0x931d5); 3792 rtl_set_rfreg(hw, path, 0x8f, RFREG_OFFSET_MASK, 0x8a001); 3793 rtl_set_bbreg(hw, 0xcb8, 0xf, 0xd); 3794 rtl_write_dword(rtlpriv, 0x90c, 0x00008000); 3795 rtl_write_dword(rtlpriv, 0xb00, 0x03000100); 3796 rtl_set_bbreg(hw, 0xc94, BIT(0), 0x1); 3797 rtl_write_dword(rtlpriv, 0x978, 0x29002000);/* TX (X,Y) */ 3798 rtl_write_dword(rtlpriv, 0x97c, 0xa9002000);/* RX (X,Y) */ 3799 rtl_write_dword(rtlpriv, 0x984, 0x00462910);/* [0]:AGC_en, [15]:idac_K_Mask */ 3800 3801 rtl_set_bbreg(hw, 0x82c, BIT(31), 0x1); /* [31] = 1 --> Page C1 */ 3802 rtl_write_dword(rtlpriv, 0xc88, 0x821403f4); 3803 3804 if (rtlhal->current_bandtype) 3805 rtl_write_dword(rtlpriv, 0xc8c, 0x68163e96); 3806 else 3807 rtl_write_dword(rtlpriv, 0xc8c, 0x28163e96); 3808 3809 rtl_write_dword(rtlpriv, 0xc80, 0x18008c10);/* TX_TONE_idx[9:0], TxK_Mask[29] TX_Tone = 16 */ 3810 rtl_write_dword(rtlpriv, 0xc84, 0x38008c10);/* RX_TONE_idx[9:0], RxK_Mask[29] */ 3811 rtl_write_dword(rtlpriv, 0xcb8, 0x00100000);/* cb8[20] \B1N SI/PI \A8ϥ\CE\C5v\A4\C1\B5\B9 iqk_dpk module */ 3812 rtl_write_dword(rtlpriv, 0x980, 0xfa000000); 3813 rtl_write_dword(rtlpriv, 0x980, 0xf8000000); 3814 3815 mdelay(10); /* Delay 10ms */ 3816 rtl_write_dword(rtlpriv, 0xcb8, 0x00000000); 3817 3818 rtl_set_bbreg(hw, 0x82c, BIT(31), 0x0); /* [31] = 0 --> Page C */ 3819 rtl_set_rfreg(hw, path, 0x58, 0x7fe00, rtl_get_rfreg(hw, path, 0x8, 0xffc00)); /* Load LOK */ 3820 3821 switch (rtlphy->current_chan_bw) { 3822 case 1: 3823 rtl_set_rfreg(hw, path, 0x18, 0x00c00, 0x1); 3824 break; 3825 case 2: 3826 rtl_set_rfreg(hw, path, 0x18, 0x00c00, 0x0); 3827 break; 3828 default: 3829 break; 3830 } 3831 3832 rtl_set_bbreg(hw, 0x82c, BIT(31), 0x1); /* [31] = 1 --> Page C1 */ 3833 3834 /* 3. TX RF Setting */ 3835 rtl_set_bbreg(hw, 0x82c, BIT(31), 0x0); /* [31] = 0 --> Page C */ 3836 rtl_set_rfreg(hw, path, 0xef, RFREG_OFFSET_MASK, 0x80000); 3837 rtl_set_rfreg(hw, path, 0x30, RFREG_OFFSET_MASK, 0x20000); 3838 rtl_set_rfreg(hw, path, 0x31, RFREG_OFFSET_MASK, 0x0003f); 3839 rtl_set_rfreg(hw, path, 0x32, RFREG_OFFSET_MASK, 0xf3fc3); 3840 rtl_set_rfreg(hw, path, 0x65, RFREG_OFFSET_MASK, 0x931d5); 3841 rtl_set_rfreg(hw, path, 0x8f, RFREG_OFFSET_MASK, 0x8a001); 3842 rtl_set_rfreg(hw, path, 0xef, RFREG_OFFSET_MASK, 0x00000); 3843 /* ODM_SetBBReg(pDM_Odm, 0xcb8, 0xf, 0xd); */ 3844 rtl_write_dword(rtlpriv, 0x90c, 0x00008000); 3845 rtl_write_dword(rtlpriv, 0xb00, 0x03000100); 3846 rtl_set_bbreg(hw, 0xc94, BIT(0), 0x1); 3847 rtl_write_dword(rtlpriv, 0x978, 0x29002000);/* TX (X,Y) */ 3848 rtl_write_dword(rtlpriv, 0x97c, 0xa9002000);/* RX (X,Y) */ 3849 rtl_write_dword(rtlpriv, 0x984, 0x0046a910);/* [0]:AGC_en, [15]:idac_K_Mask */ 3850 3851 rtl_set_bbreg(hw, 0x82c, BIT(31), 0x1); /* [31] = 1 --> Page C1 */ 3852 rtl_write_dword(rtlpriv, 0xc88, 0x821403f1); 3853 if (rtlhal->current_bandtype) 3854 rtl_write_dword(rtlpriv, 0xc8c, 0x40163e96); 3855 else 3856 rtl_write_dword(rtlpriv, 0xc8c, 0x00163e96); 3857 3858 if (vdf_enable == 1) { 3859 RT_TRACE(rtlpriv, COMP_IQK, DBG_LOUD, "VDF_enable\n"); 3860 for (k = 0; k <= 2; k++) { 3861 switch (k) { 3862 case 0: 3863 rtl_write_dword(rtlpriv, 0xc80, 0x18008c38);/* TX_TONE_idx[9:0], TxK_Mask[29] TX_Tone = 16 */ 3864 rtl_write_dword(rtlpriv, 0xc84, 0x38008c38);/* RX_TONE_idx[9:0], RxK_Mask[29] */ 3865 rtl_set_bbreg(hw, 0xce8, BIT(31), 0x0); 3866 break; 3867 case 1: 3868 rtl_set_bbreg(hw, 0xc80, BIT(28), 0x0); 3869 rtl_set_bbreg(hw, 0xc84, BIT(28), 0x0); 3870 rtl_set_bbreg(hw, 0xce8, BIT(31), 0x0); 3871 break; 3872 case 2: 3873 RT_TRACE(rtlpriv, COMP_IQK, DBG_LOUD, 3874 "vdf_y[1] = %x;;;vdf_y[0] = %x\n", vdf_y[1]>>21 & 0x00007ff, vdf_y[0]>>21 & 0x00007ff); 3875 RT_TRACE(rtlpriv, COMP_IQK, DBG_LOUD, 3876 "vdf_x[1] = %x;;;vdf_x[0] = %x\n", vdf_x[1]>>21 & 0x00007ff, vdf_x[0]>>21 & 0x00007ff); 3877 tx_dt[cal] = (vdf_y[1]>>20)-(vdf_y[0]>>20); 3878 tx_dt[cal] = ((16*tx_dt[cal])*10000/15708); 3879 tx_dt[cal] = (tx_dt[cal] >> 1)+(tx_dt[cal] & BIT(0)); 3880 rtl_write_dword(rtlpriv, 0xc80, 0x18008c20);/* TX_TONE_idx[9:0], TxK_Mask[29] TX_Tone = 16 */ 3881 rtl_write_dword(rtlpriv, 0xc84, 0x38008c20);/* RX_TONE_idx[9:0], RxK_Mask[29] */ 3882 rtl_set_bbreg(hw, 0xce8, BIT(31), 0x1); 3883 rtl_set_bbreg(hw, 0xce8, 0x3fff0000, tx_dt[cal] & 0x00003fff); 3884 break; 3885 default: 3886 break; 3887 } 3888 rtl_write_dword(rtlpriv, 0xcb8, 0x00100000);/* cb8[20] \B1N SI/PI \A8ϥ\CE\C5v\A4\C1\B5\B9 iqk_dpk module */ 3889 cal_retry = 0; 3890 while (1) { 3891 /* one shot */ 3892 rtl_write_dword(rtlpriv, 0x980, 0xfa000000); 3893 rtl_write_dword(rtlpriv, 0x980, 0xf8000000); 3894 3895 mdelay(10); /* Delay 10ms */ 3896 rtl_write_dword(rtlpriv, 0xcb8, 0x00000000); 3897 delay_count = 0; 3898 while (1) { 3899 iqk_ready = rtl_get_bbreg(hw, 0xd00, BIT(10)); 3900 if ((~iqk_ready) || (delay_count > 20)) 3901 break; 3902 else{ 3903 mdelay(1); 3904 delay_count++; 3905 } 3906 } 3907 3908 if (delay_count < 20) { /* If 20ms No Result, then cal_retry++ */ 3909 /* ============TXIQK Check============== */ 3910 tx_fail = rtl_get_bbreg(hw, 0xd00, BIT(12)); 3911 3912 if (~tx_fail) { 3913 rtl_write_dword(rtlpriv, 0xcb8, 0x02000000); 3914 vdf_x[k] = rtl_get_bbreg(hw, 0xd00, 0x07ff0000)<<21; 3915 rtl_write_dword(rtlpriv, 0xcb8, 0x04000000); 3916 vdf_y[k] = rtl_get_bbreg(hw, 0xd00, 0x07ff0000)<<21; 3917 tx0iqkok = true; 3918 break; 3919 } else { 3920 rtl_set_bbreg(hw, 0xccc, 0x000007ff, 0x0); 3921 rtl_set_bbreg(hw, 0xcd4, 0x000007ff, 0x200); 3922 tx0iqkok = false; 3923 cal_retry++; 3924 if (cal_retry == 10) 3925 break; 3926 } 3927 } else { 3928 tx0iqkok = false; 3929 cal_retry++; 3930 if (cal_retry == 10) 3931 break; 3932 } 3933 } 3934 } 3935 if (k == 3) { 3936 tx_x0[cal] = vdf_x[k-1]; 3937 tx_y0[cal] = vdf_y[k-1]; 3938 } 3939 } else { 3940 rtl_write_dword(rtlpriv, 0xc80, 0x18008c10);/* TX_TONE_idx[9:0], TxK_Mask[29] TX_Tone = 16 */ 3941 rtl_write_dword(rtlpriv, 0xc84, 0x38008c10);/* RX_TONE_idx[9:0], RxK_Mask[29] */ 3942 rtl_write_dword(rtlpriv, 0xcb8, 0x00100000);/* cb8[20] \B1N SI/PI \A8ϥ\CE\C5v\A4\C1\B5\B9 iqk_dpk module */ 3943 cal_retry = 0; 3944 while (1) { 3945 /* one shot */ 3946 rtl_write_dword(rtlpriv, 0x980, 0xfa000000); 3947 rtl_write_dword(rtlpriv, 0x980, 0xf8000000); 3948 3949 mdelay(10); /* Delay 10ms */ 3950 rtl_write_dword(rtlpriv, 0xcb8, 0x00000000); 3951 delay_count = 0; 3952 while (1) { 3953 iqk_ready = rtl_get_bbreg(hw, 0xd00, BIT(10)); 3954 if ((~iqk_ready) || (delay_count > 20)) 3955 break; 3956 else{ 3957 mdelay(1); 3958 delay_count++; 3959 } 3960 } 3961 3962 if (delay_count < 20) { /* If 20ms No Result, then cal_retry++ */ 3963 /* ============TXIQK Check============== */ 3964 tx_fail = rtl_get_bbreg(hw, 0xd00, BIT(12)); 3965 3966 if (~tx_fail) { 3967 rtl_write_dword(rtlpriv, 0xcb8, 0x02000000); 3968 tx_x0[cal] = rtl_get_bbreg(hw, 0xd00, 0x07ff0000)<<21; 3969 rtl_write_dword(rtlpriv, 0xcb8, 0x04000000); 3970 tx_y0[cal] = rtl_get_bbreg(hw, 0xd00, 0x07ff0000)<<21; 3971 tx0iqkok = true; 3972 break; 3973 } else { 3974 rtl_set_bbreg(hw, 0xccc, 0x000007ff, 0x0); 3975 rtl_set_bbreg(hw, 0xcd4, 0x000007ff, 0x200); 3976 tx0iqkok = false; 3977 cal_retry++; 3978 if (cal_retry == 10) 3979 break; 3980 } 3981 } else { 3982 tx0iqkok = false; 3983 cal_retry++; 3984 if (cal_retry == 10) 3985 break; 3986 } 3987 } 3988 } 3989 3990 if (tx0iqkok == false) 3991 break; /* TXK fail, Don't do RXK */ 3992 3993 if (vdf_enable == 1) { 3994 rtl_set_bbreg(hw, 0xce8, BIT(31), 0x0); /* TX VDF Disable */ 3995 RT_TRACE(rtlpriv, COMP_IQK, DBG_LOUD, "RXVDF Start\n"); 3996 for (k = 0; k <= 2; k++) { 3997 /* ====== RX mode TXK (RXK Step 1) ====== */ 3998 rtl_set_bbreg(hw, 0x82c, BIT(31), 0x0); /* [31] = 0 --> Page C */ 3999 /* 1. TX RF Setting */ 4000 rtl_set_rfreg(hw, path, 0xef, RFREG_OFFSET_MASK, 0x80000); 4001 rtl_set_rfreg(hw, path, 0x30, RFREG_OFFSET_MASK, 0x30000); 4002 rtl_set_rfreg(hw, path, 0x31, RFREG_OFFSET_MASK, 0x00029); 4003 rtl_set_rfreg(hw, path, 0x32, RFREG_OFFSET_MASK, 0xd7ffb); 4004 rtl_set_rfreg(hw, path, 0x65, RFREG_OFFSET_MASK, temp_reg65); 4005 rtl_set_rfreg(hw, path, 0x8f, RFREG_OFFSET_MASK, 0x8a001); 4006 rtl_set_rfreg(hw, path, 0xef, RFREG_OFFSET_MASK, 0x00000); 4007 4008 rtl_set_bbreg(hw, 0xcb8, 0xf, 0xd); 4009 rtl_write_dword(rtlpriv, 0x978, 0x29002000);/* TX (X,Y) */ 4010 rtl_write_dword(rtlpriv, 0x97c, 0xa9002000);/* RX (X,Y) */ 4011 rtl_write_dword(rtlpriv, 0x984, 0x0046a910);/* [0]:AGC_en, [15]:idac_K_Mask */ 4012 rtl_write_dword(rtlpriv, 0x90c, 0x00008000); 4013 rtl_write_dword(rtlpriv, 0xb00, 0x03000100); 4014 rtl_set_bbreg(hw, 0x82c, BIT(31), 0x1); /* [31] = 1 --> Page C1 */ 4015 switch (k) { 4016 case 0: 4017 { 4018 rtl_write_dword(rtlpriv, 0xc80, 0x18008c38);/* TX_TONE_idx[9:0], TxK_Mask[29] TX_Tone = 16 */ 4019 rtl_write_dword(rtlpriv, 0xc84, 0x38008c38);/* RX_TONE_idx[9:0], RxK_Mask[29] */ 4020 rtl_set_bbreg(hw, 0xce8, BIT(30), 0x0); 4021 } 4022 break; 4023 case 1: 4024 { 4025 rtl_write_dword(rtlpriv, 0xc80, 0x08008c38);/* TX_TONE_idx[9:0], TxK_Mask[29] TX_Tone = 16 */ 4026 rtl_write_dword(rtlpriv, 0xc84, 0x28008c38);/* RX_TONE_idx[9:0], RxK_Mask[29] */ 4027 rtl_set_bbreg(hw, 0xce8, BIT(30), 0x0); 4028 } 4029 break; 4030 case 2: 4031 { 4032 RT_TRACE(rtlpriv, COMP_IQK, DBG_LOUD, 4033 "VDF_Y[1] = %x;;;VDF_Y[0] = %x\n", 4034 vdf_y[1]>>21 & 0x00007ff, vdf_y[0]>>21 & 0x00007ff); 4035 RT_TRACE(rtlpriv, COMP_IQK, DBG_LOUD, 4036 "VDF_X[1] = %x;;;VDF_X[0] = %x\n", 4037 vdf_x[1]>>21 & 0x00007ff, vdf_x[0]>>21 & 0x00007ff); 4038 rx_dt[cal] = (vdf_y[1]>>20)-(vdf_y[0]>>20); 4039 RT_TRACE(rtlpriv, COMP_IQK, DBG_LOUD, "Rx_dt = %d\n", rx_dt[cal]); 4040 rx_dt[cal] = ((16*rx_dt[cal])*10000/13823); 4041 rx_dt[cal] = (rx_dt[cal] >> 1)+(rx_dt[cal] & BIT(0)); 4042 rtl_write_dword(rtlpriv, 0xc80, 0x18008c20);/* TX_TONE_idx[9:0], TxK_Mask[29] TX_Tone = 16 */ 4043 rtl_write_dword(rtlpriv, 0xc84, 0x38008c20);/* RX_TONE_idx[9:0], RxK_Mask[29] */ 4044 rtl_set_bbreg(hw, 0xce8, 0x00003fff, rx_dt[cal] & 0x00003fff); 4045 } 4046 break; 4047 default: 4048 break; 4049 } 4050 rtl_write_dword(rtlpriv, 0xc88, 0x821603e0); 4051 rtl_write_dword(rtlpriv, 0xc8c, 0x68163e96); 4052 rtl_write_dword(rtlpriv, 0xcb8, 0x00100000);/* cb8[20] \B1N SI/PI \A8ϥ\CE\C5v\A4\C1\B5\B9 iqk_dpk module */ 4053 cal_retry = 0; 4054 while (1) { 4055 /* one shot */ 4056 rtl_write_dword(rtlpriv, 0x980, 0xfa000000); 4057 rtl_write_dword(rtlpriv, 0x980, 0xf8000000); 4058 4059 mdelay(10); /* Delay 10ms */ 4060 rtl_write_dword(rtlpriv, 0xcb8, 0x00000000); 4061 delay_count = 0; 4062 while (1) { 4063 iqk_ready = rtl_get_bbreg(hw, 0xd00, BIT(10)); 4064 if ((~iqk_ready) || (delay_count > 20)) 4065 break; 4066 else{ 4067 mdelay(1); 4068 delay_count++; 4069 } 4070 } 4071 4072 if (delay_count < 20) { /* If 20ms No Result, then cal_retry++ */ 4073 /* ============TXIQK Check============== */ 4074 tx_fail = rtl_get_bbreg(hw, 0xd00, BIT(12)); 4075 4076 if (~tx_fail) { 4077 rtl_write_dword(rtlpriv, 0xcb8, 0x02000000); 4078 tx_x0_rxk[cal] = rtl_get_bbreg(hw, 0xd00, 0x07ff0000)<<21; 4079 rtl_write_dword(rtlpriv, 0xcb8, 0x04000000); 4080 tx_y0_rxk[cal] = rtl_get_bbreg(hw, 0xd00, 0x07ff0000)<<21; 4081 tx0iqkok = true; 4082 break; 4083 } else{ 4084 tx0iqkok = false; 4085 cal_retry++; 4086 if (cal_retry == 10) 4087 break; 4088 } 4089 } else { 4090 tx0iqkok = false; 4091 cal_retry++; 4092 if (cal_retry == 10) 4093 break; 4094 } 4095 } 4096 4097 if (tx0iqkok == false) { /* If RX mode TXK fail, then take TXK Result */ 4098 tx_x0_rxk[cal] = tx_x0[cal]; 4099 tx_y0_rxk[cal] = tx_y0[cal]; 4100 tx0iqkok = true; 4101 RT_TRACE(rtlpriv, 4102 COMP_IQK, 4103 DBG_LOUD, 4104 "RXK Step 1 fail\n"); 4105 } 4106 4107 /* ====== RX IQK ====== */ 4108 rtl_set_bbreg(hw, 0x82c, BIT(31), 0x0); /* [31] = 0 --> Page C */ 4109 /* 1. RX RF Setting */ 4110 rtl_set_rfreg(hw, path, 0xef, RFREG_OFFSET_MASK, 0x80000); 4111 rtl_set_rfreg(hw, path, 0x30, RFREG_OFFSET_MASK, 0x30000); 4112 rtl_set_rfreg(hw, path, 0x31, RFREG_OFFSET_MASK, 0x0002f); 4113 rtl_set_rfreg(hw, path, 0x32, RFREG_OFFSET_MASK, 0xfffbb); 4114 rtl_set_rfreg(hw, path, 0x8f, RFREG_OFFSET_MASK, 0x88001); 4115 rtl_set_rfreg(hw, path, 0x65, RFREG_OFFSET_MASK, 0x931d8); 4116 rtl_set_rfreg(hw, path, 0xef, RFREG_OFFSET_MASK, 0x00000); 4117 4118 rtl_set_bbreg(hw, 0x978, 0x03FF8000, (tx_x0_rxk[cal])>>21&0x000007ff); 4119 rtl_set_bbreg(hw, 0x978, 0x000007FF, (tx_y0_rxk[cal])>>21&0x000007ff); 4120 rtl_set_bbreg(hw, 0x978, BIT(31), 0x1); 4121 rtl_set_bbreg(hw, 0x97c, BIT(31), 0x0); 4122 rtl_set_bbreg(hw, 0xcb8, 0xF, 0xe); 4123 rtl_write_dword(rtlpriv, 0x90c, 0x00008000); 4124 rtl_write_dword(rtlpriv, 0x984, 0x0046a911); 4125 4126 rtl_set_bbreg(hw, 0x82c, BIT(31), 0x1); /* [31] = 1 --> Page C1 */ 4127 rtl_set_bbreg(hw, 0xc80, BIT(29), 0x1); 4128 rtl_set_bbreg(hw, 0xc84, BIT(29), 0x0); 4129 rtl_write_dword(rtlpriv, 0xc88, 0x02140119); 4130 4131 rtl_write_dword(rtlpriv, 0xc8c, 0x28160d00); /* pDM_Odm->SupportInterface == 1 */ 4132 4133 if (k == 2) 4134 rtl_set_bbreg(hw, 0xce8, BIT(30), 0x1); /* RX VDF Enable */ 4135 rtl_write_dword(rtlpriv, 0xcb8, 0x00100000);/* cb8[20] \B1N SI/PI \A8ϥ\CE\C5v\A4\C1\B5\B9 iqk_dpk module */ 4136 4137 cal_retry = 0; 4138 while (1) { 4139 /* one shot */ 4140 rtl_write_dword(rtlpriv, 0x980, 0xfa000000); 4141 rtl_write_dword(rtlpriv, 0x980, 0xf8000000); 4142 4143 mdelay(10); /* Delay 10ms */ 4144 rtl_write_dword(rtlpriv, 0xcb8, 0x00000000); 4145 delay_count = 0; 4146 while (1) { 4147 iqk_ready = rtl_get_bbreg(hw, 0xd00, BIT(10)); 4148 if ((~iqk_ready) || (delay_count > 20)) 4149 break; 4150 else{ 4151 mdelay(1); 4152 delay_count++; 4153 } 4154 } 4155 4156 if (delay_count < 20) { /* If 20ms No Result, then cal_retry++ */ 4157 /* ============RXIQK Check============== */ 4158 rx_fail = rtl_get_bbreg(hw, 0xd00, BIT(11)); 4159 if (rx_fail == 0) { 4160 rtl_write_dword(rtlpriv, 0xcb8, 0x06000000); 4161 vdf_x[k] = rtl_get_bbreg(hw, 0xd00, 0x07ff0000)<<21; 4162 rtl_write_dword(rtlpriv, 0xcb8, 0x08000000); 4163 vdf_y[k] = rtl_get_bbreg(hw, 0xd00, 0x07ff0000)<<21; 4164 rx0iqkok = true; 4165 break; 4166 } else { 4167 rtl_set_bbreg(hw, 0xc10, 0x000003ff, 0x200>>1); 4168 rtl_set_bbreg(hw, 0xc10, 0x03ff0000, 0x0>>1); 4169 rx0iqkok = false; 4170 cal_retry++; 4171 if (cal_retry == 10) 4172 break; 4173 4174 } 4175 } else{ 4176 rx0iqkok = false; 4177 cal_retry++; 4178 if (cal_retry == 10) 4179 break; 4180 } 4181 } 4182 4183 } 4184 if (k == 3) { 4185 rx_x0[cal] = vdf_x[k-1]; 4186 rx_y0[cal] = vdf_y[k-1]; 4187 } 4188 rtl_set_bbreg(hw, 0xce8, BIT(31), 0x1); /* TX VDF Enable */ 4189 } 4190 4191 else{ 4192 /* ====== RX mode TXK (RXK Step 1) ====== */ 4193 rtl_set_bbreg(hw, 0x82c, BIT(31), 0x0); /* [31] = 0 --> Page C */ 4194 /* 1. TX RF Setting */ 4195 rtl_set_rfreg(hw, path, 0xef, RFREG_OFFSET_MASK, 0x80000); 4196 rtl_set_rfreg(hw, path, 0x30, RFREG_OFFSET_MASK, 0x30000); 4197 rtl_set_rfreg(hw, path, 0x31, RFREG_OFFSET_MASK, 0x00029); 4198 rtl_set_rfreg(hw, path, 0x32, RFREG_OFFSET_MASK, 0xd7ffb); 4199 rtl_set_rfreg(hw, path, 0x65, RFREG_OFFSET_MASK, temp_reg65); 4200 rtl_set_rfreg(hw, path, 0x8f, RFREG_OFFSET_MASK, 0x8a001); 4201 rtl_set_rfreg(hw, path, 0xef, RFREG_OFFSET_MASK, 0x00000); 4202 rtl_write_dword(rtlpriv, 0x90c, 0x00008000); 4203 rtl_write_dword(rtlpriv, 0xb00, 0x03000100); 4204 rtl_write_dword(rtlpriv, 0x984, 0x0046a910);/* [0]:AGC_en, [15]:idac_K_Mask */ 4205 4206 rtl_set_bbreg(hw, 0x82c, BIT(31), 0x1); /* [31] = 1 --> Page C1 */ 4207 rtl_write_dword(rtlpriv, 0xc80, 0x18008c10);/* TX_TONE_idx[9:0], TxK_Mask[29] TX_Tone = 16 */ 4208 rtl_write_dword(rtlpriv, 0xc84, 0x38008c10);/* RX_TONE_idx[9:0], RxK_Mask[29] */ 4209 rtl_write_dword(rtlpriv, 0xc88, 0x821603e0); 4210 /* ODM_Write4Byte(pDM_Odm, 0xc8c, 0x68163e96); */ 4211 rtl_write_dword(rtlpriv, 0xcb8, 0x00100000);/* cb8[20] \B1N SI/PI \A8ϥ\CE\C5v\A4\C1\B5\B9 iqk_dpk module */ 4212 cal_retry = 0; 4213 while (1) { 4214 /* one shot */ 4215 rtl_write_dword(rtlpriv, 0x980, 0xfa000000); 4216 rtl_write_dword(rtlpriv, 0x980, 0xf8000000); 4217 4218 mdelay(10); /* Delay 10ms */ 4219 rtl_write_dword(rtlpriv, 0xcb8, 0x00000000); 4220 delay_count = 0; 4221 while (1) { 4222 iqk_ready = rtl_get_bbreg(hw, 0xd00, BIT(10)); 4223 if ((~iqk_ready) || (delay_count > 20)) 4224 break; 4225 else{ 4226 mdelay(1); 4227 delay_count++; 4228 } 4229 } 4230 4231 if (delay_count < 20) { /* If 20ms No Result, then cal_retry++ */ 4232 /* ============TXIQK Check============== */ 4233 tx_fail = rtl_get_bbreg(hw, 0xd00, BIT(12)); 4234 4235 if (~tx_fail) { 4236 rtl_write_dword(rtlpriv, 0xcb8, 0x02000000); 4237 tx_x0_rxk[cal] = rtl_get_bbreg(hw, 0xd00, 0x07ff0000)<<21; 4238 rtl_write_dword(rtlpriv, 0xcb8, 0x04000000); 4239 tx_y0_rxk[cal] = rtl_get_bbreg(hw, 0xd00, 0x07ff0000)<<21; 4240 tx0iqkok = true; 4241 break; 4242 } else { 4243 tx0iqkok = false; 4244 cal_retry++; 4245 if (cal_retry == 10) 4246 break; 4247 } 4248 } else{ 4249 tx0iqkok = false; 4250 cal_retry++; 4251 if (cal_retry == 10) 4252 break; 4253 } 4254 } 4255 4256 if (tx0iqkok == false) { /* If RX mode TXK fail, then take TXK Result */ 4257 tx_x0_rxk[cal] = tx_x0[cal]; 4258 tx_y0_rxk[cal] = tx_y0[cal]; 4259 tx0iqkok = true; 4260 RT_TRACE(rtlpriv, COMP_IQK, 4261 DBG_LOUD, "1"); 4262 } 4263 4264 /* ====== RX IQK ====== */ 4265 rtl_set_bbreg(hw, 0x82c, BIT(31), 0x0); /* [31] = 0 --> Page C */ 4266 /* 1. RX RF Setting */ 4267 rtl_set_rfreg(hw, path, 0xef, RFREG_OFFSET_MASK, 0x80000); 4268 rtl_set_rfreg(hw, path, 0x30, RFREG_OFFSET_MASK, 0x30000); 4269 rtl_set_rfreg(hw, path, 0x31, RFREG_OFFSET_MASK, 0x0002f); 4270 rtl_set_rfreg(hw, path, 0x32, RFREG_OFFSET_MASK, 0xfffbb); 4271 rtl_set_rfreg(hw, path, 0x8f, RFREG_OFFSET_MASK, 0x88001); 4272 rtl_set_rfreg(hw, path, 0x65, RFREG_OFFSET_MASK, 0x931d8); 4273 rtl_set_rfreg(hw, path, 0xef, RFREG_OFFSET_MASK, 0x00000); 4274 4275 rtl_set_bbreg(hw, 0x978, 0x03FF8000, (tx_x0_rxk[cal])>>21&0x000007ff); 4276 rtl_set_bbreg(hw, 0x978, 0x000007FF, (tx_y0_rxk[cal])>>21&0x000007ff); 4277 rtl_set_bbreg(hw, 0x978, BIT(31), 0x1); 4278 rtl_set_bbreg(hw, 0x97c, BIT(31), 0x0); 4279 /* ODM_SetBBReg(pDM_Odm, 0xcb8, 0xF, 0xe); */ 4280 rtl_write_dword(rtlpriv, 0x90c, 0x00008000); 4281 rtl_write_dword(rtlpriv, 0x984, 0x0046a911); 4282 4283 rtl_set_bbreg(hw, 0x82c, BIT(31), 0x1); /* [31] = 1 --> Page C1 */ 4284 rtl_write_dword(rtlpriv, 0xc80, 0x38008c10);/* TX_TONE_idx[9:0], TxK_Mask[29] TX_Tone = 16 */ 4285 rtl_write_dword(rtlpriv, 0xc84, 0x18008c10);/* RX_TONE_idx[9:0], RxK_Mask[29] */ 4286 rtl_write_dword(rtlpriv, 0xc88, 0x02140119); 4287 4288 rtl_write_dword(rtlpriv, 0xc8c, 0x28160d00); /*pDM_Odm->SupportInterface == 1*/ 4289 4290 rtl_write_dword(rtlpriv, 0xcb8, 0x00100000);/* cb8[20] \B1N SI/PI \A8ϥ\CE\C5v\A4\C1\B5\B9 iqk_dpk module */ 4291 4292 cal_retry = 0; 4293 while (1) { 4294 /* one shot */ 4295 rtl_write_dword(rtlpriv, 0x980, 0xfa000000); 4296 rtl_write_dword(rtlpriv, 0x980, 0xf8000000); 4297 4298 mdelay(10); /* Delay 10ms */ 4299 rtl_write_dword(rtlpriv, 0xcb8, 0x00000000); 4300 delay_count = 0; 4301 while (1) { 4302 iqk_ready = rtl_get_bbreg(hw, 0xd00, BIT(10)); 4303 if ((~iqk_ready) || (delay_count > 20)) 4304 break; 4305 else{ 4306 mdelay(1); 4307 delay_count++; 4308 } 4309 } 4310 4311 if (delay_count < 20) { /* If 20ms No Result, then cal_retry++ */ 4312 /* ============RXIQK Check============== */ 4313 rx_fail = rtl_get_bbreg(hw, 0xd00, BIT(11)); 4314 if (rx_fail == 0) { 4315 rtl_write_dword(rtlpriv, 0xcb8, 0x06000000); 4316 rx_x0[cal] = rtl_get_bbreg(hw, 0xd00, 0x07ff0000)<<21; 4317 rtl_write_dword(rtlpriv, 0xcb8, 0x08000000); 4318 rx_y0[cal] = rtl_get_bbreg(hw, 0xd00, 0x07ff0000)<<21; 4319 rx0iqkok = true; 4320 break; 4321 } else{ 4322 rtl_set_bbreg(hw, 0xc10, 0x000003ff, 0x200>>1); 4323 rtl_set_bbreg(hw, 0xc10, 0x03ff0000, 0x0>>1); 4324 rx0iqkok = false; 4325 cal_retry++; 4326 if (cal_retry == 10) 4327 break; 4328 4329 } 4330 } else{ 4331 rx0iqkok = false; 4332 cal_retry++; 4333 if (cal_retry == 10) 4334 break; 4335 } 4336 } 4337 } 4338 4339 if (tx0iqkok) 4340 tx_average++; 4341 if (rx0iqkok) 4342 rx_average++; 4343 rtl_set_bbreg(hw, 0x82c, BIT(31), 0x0); /* [31] = 0 --> Page C */ 4344 rtl_set_rfreg(hw, path, 0x65, RFREG_OFFSET_MASK, temp_reg65); 4345 break; 4346 default: 4347 break; 4348 } 4349 cal++; 4350 } 4351 4352 /* FillIQK Result */ 4353 switch (path) { 4354 case RF90_PATH_A: 4355 RT_TRACE(rtlpriv, COMP_IQK, DBG_LOUD, 4356 "========Path_A =======\n"); 4357 if (tx_average == 0) 4358 break; 4359 4360 for (i = 0; i < tx_average; i++) { 4361 RT_TRACE(rtlpriv, COMP_IQK, DBG_LOUD, 4362 "TX_X0_RXK[%d] = %x ;; TX_Y0_RXK[%d] = %x\n", i, 4363 (tx_x0_rxk[i])>>21&0x000007ff, i, 4364 (tx_y0_rxk[i])>>21&0x000007ff); 4365 RT_TRACE(rtlpriv, COMP_IQK, DBG_LOUD, 4366 "TX_X0[%d] = %x ;; TX_Y0[%d] = %x\n", i, 4367 (tx_x0[i])>>21&0x000007ff, i, 4368 (tx_y0[i])>>21&0x000007ff); 4369 } 4370 for (i = 0; i < tx_average; i++) { 4371 for (ii = i+1; ii < tx_average; ii++) { 4372 dx = (tx_x0[i]>>21) - (tx_x0[ii]>>21); 4373 if (dx < 3 && dx > -3) { 4374 dy = (tx_y0[i]>>21) - (tx_y0[ii]>>21); 4375 if (dy < 3 && dy > -3) { 4376 tx_x = ((tx_x0[i]>>21) + (tx_x0[ii]>>21))/2; 4377 tx_y = ((tx_y0[i]>>21) + (tx_y0[ii]>>21))/2; 4378 tx_finish = 1; 4379 break; 4380 } 4381 } 4382 } 4383 if (tx_finish == 1) 4384 break; 4385 } 4386 4387 if (tx_finish == 1) 4388 _rtl8821ae_iqk_tx_fill_iqc(hw, path, tx_x, tx_y); /* ? */ 4389 else 4390 _rtl8821ae_iqk_tx_fill_iqc(hw, path, 0x200, 0x0); 4391 4392 if (rx_average == 0) 4393 break; 4394 4395 for (i = 0; i < rx_average; i++) 4396 RT_TRACE(rtlpriv, COMP_IQK, DBG_LOUD, 4397 "RX_X0[%d] = %x ;; RX_Y0[%d] = %x\n", i, 4398 (rx_x0[i])>>21&0x000007ff, i, 4399 (rx_y0[i])>>21&0x000007ff); 4400 for (i = 0; i < rx_average; i++) { 4401 for (ii = i+1; ii < rx_average; ii++) { 4402 dx = (rx_x0[i]>>21) - (rx_x0[ii]>>21); 4403 if (dx < 4 && dx > -4) { 4404 dy = (rx_y0[i]>>21) - (rx_y0[ii]>>21); 4405 if (dy < 4 && dy > -4) { 4406 rx_x = ((rx_x0[i]>>21) + (rx_x0[ii]>>21))/2; 4407 rx_y = ((rx_y0[i]>>21) + (rx_y0[ii]>>21))/2; 4408 rx_finish = 1; 4409 break; 4410 } 4411 } 4412 } 4413 if (rx_finish == 1) 4414 break; 4415 } 4416 4417 if (rx_finish == 1) 4418 _rtl8821ae_iqk_rx_fill_iqc(hw, path, rx_x, rx_y); 4419 else 4420 _rtl8821ae_iqk_rx_fill_iqc(hw, path, 0x200, 0x0); 4421 break; 4422 default: 4423 break; 4424 } 4425 } 4426 4427 static void _rtl8821ae_iqk_restore_rf(struct ieee80211_hw *hw, 4428 enum radio_path path, 4429 u32 *backup_rf_reg, 4430 u32 *rf_backup, u32 rf_reg_num) 4431 { 4432 struct rtl_priv *rtlpriv = rtl_priv(hw); 4433 u32 i; 4434 4435 rtl_set_bbreg(hw, 0x82c, BIT(31), 0x0); /* [31] = 0 --> Page C */ 4436 for (i = 0; i < RF_REG_NUM; i++) 4437 rtl_set_rfreg(hw, path, backup_rf_reg[i], RFREG_OFFSET_MASK, 4438 rf_backup[i]); 4439 4440 switch (path) { 4441 case RF90_PATH_A: 4442 RT_TRACE(rtlpriv, COMP_IQK, DBG_LOUD, 4443 "RestoreRF Path A Success!!!!\n"); 4444 break; 4445 default: 4446 break; 4447 } 4448 } 4449 4450 static void _rtl8821ae_iqk_restore_afe(struct ieee80211_hw *hw, 4451 u32 *afe_backup, u32 *backup_afe_reg, 4452 u32 afe_num) 4453 { 4454 u32 i; 4455 struct rtl_priv *rtlpriv = rtl_priv(hw); 4456 4457 rtl_set_bbreg(hw, 0x82c, BIT(31), 0x0); /* [31] = 0 --> Page C */ 4458 /* Reload AFE Parameters */ 4459 for (i = 0; i < afe_num; i++) 4460 rtl_write_dword(rtlpriv, backup_afe_reg[i], afe_backup[i]); 4461 rtl_set_bbreg(hw, 0x82c, BIT(31), 0x1); /* [31] = 1 --> Page C1 */ 4462 rtl_write_dword(rtlpriv, 0xc80, 0x0); 4463 rtl_write_dword(rtlpriv, 0xc84, 0x0); 4464 rtl_write_dword(rtlpriv, 0xc88, 0x0); 4465 rtl_write_dword(rtlpriv, 0xc8c, 0x3c000000); 4466 rtl_write_dword(rtlpriv, 0xc90, 0x00000080); 4467 rtl_write_dword(rtlpriv, 0xc94, 0x00000000); 4468 rtl_write_dword(rtlpriv, 0xcc4, 0x20040000); 4469 rtl_write_dword(rtlpriv, 0xcc8, 0x20000000); 4470 rtl_write_dword(rtlpriv, 0xcb8, 0x0); 4471 RT_TRACE(rtlpriv, COMP_IQK, DBG_LOUD, "RestoreAFE Success!!!!\n"); 4472 } 4473 4474 static void _rtl8821ae_iqk_restore_macbb(struct ieee80211_hw *hw, 4475 u32 *macbb_backup, 4476 u32 *backup_macbb_reg, 4477 u32 macbb_num) 4478 { 4479 u32 i; 4480 struct rtl_priv *rtlpriv = rtl_priv(hw); 4481 4482 rtl_set_bbreg(hw, 0x82c, BIT(31), 0x0); /* [31] = 0 --> Page C */ 4483 /* Reload MacBB Parameters */ 4484 for (i = 0; i < macbb_num; i++) 4485 rtl_write_dword(rtlpriv, backup_macbb_reg[i], macbb_backup[i]); 4486 RT_TRACE(rtlpriv, COMP_IQK, DBG_LOUD, "RestoreMacBB Success!!!!\n"); 4487 } 4488 4489 #undef MACBB_REG_NUM 4490 #undef AFE_REG_NUM 4491 #undef RF_REG_NUM 4492 4493 #define MACBB_REG_NUM 11 4494 #define AFE_REG_NUM 12 4495 #define RF_REG_NUM 3 4496 4497 static void _rtl8821ae_phy_iq_calibrate(struct ieee80211_hw *hw) 4498 { 4499 u32 macbb_backup[MACBB_REG_NUM]; 4500 u32 afe_backup[AFE_REG_NUM]; 4501 u32 rfa_backup[RF_REG_NUM]; 4502 u32 rfb_backup[RF_REG_NUM]; 4503 u32 backup_macbb_reg[MACBB_REG_NUM] = { 4504 0xb00, 0x520, 0x550, 0x808, 0x90c, 0xc00, 0xc50, 4505 0xe00, 0xe50, 0x838, 0x82c 4506 }; 4507 u32 backup_afe_reg[AFE_REG_NUM] = { 4508 0xc5c, 0xc60, 0xc64, 0xc68, 0xc6c, 0xc70, 0xc74, 4509 0xc78, 0xc7c, 0xc80, 0xc84, 0xcb8 4510 }; 4511 u32 backup_rf_reg[RF_REG_NUM] = {0x65, 0x8f, 0x0}; 4512 4513 _rtl8821ae_iqk_backup_macbb(hw, macbb_backup, backup_macbb_reg, 4514 MACBB_REG_NUM); 4515 _rtl8821ae_iqk_backup_afe(hw, afe_backup, backup_afe_reg, AFE_REG_NUM); 4516 _rtl8821ae_iqk_backup_rf(hw, rfa_backup, rfb_backup, backup_rf_reg, 4517 RF_REG_NUM); 4518 4519 _rtl8821ae_iqk_configure_mac(hw); 4520 _rtl8821ae_iqk_tx(hw, RF90_PATH_A); 4521 _rtl8821ae_iqk_restore_rf(hw, RF90_PATH_A, backup_rf_reg, rfa_backup, 4522 RF_REG_NUM); 4523 4524 _rtl8821ae_iqk_restore_afe(hw, afe_backup, backup_afe_reg, AFE_REG_NUM); 4525 _rtl8821ae_iqk_restore_macbb(hw, macbb_backup, backup_macbb_reg, 4526 MACBB_REG_NUM); 4527 } 4528 4529 static void _rtl8821ae_phy_set_rfpath_switch(struct ieee80211_hw *hw, bool main) 4530 { 4531 struct rtl_priv *rtlpriv = rtl_priv(hw); 4532 /* struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw)); */ 4533 /* struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw)); */ 4534 RT_TRACE(rtlpriv, COMP_INIT, DBG_LOUD, "\n"); 4535 4536 if (main) 4537 rtl_set_bbreg(hw, RA_RFE_PINMUX + 4, BIT(29) | BIT(28), 0x1); 4538 else 4539 rtl_set_bbreg(hw, RA_RFE_PINMUX + 4, BIT(29) | BIT(28), 0x2); 4540 } 4541 4542 #undef IQK_ADDA_REG_NUM 4543 #undef IQK_DELAY_TIME 4544 4545 void rtl8812ae_phy_iq_calibrate(struct ieee80211_hw *hw, bool b_recovery) 4546 { 4547 } 4548 4549 void rtl8812ae_do_iqk(struct ieee80211_hw *hw, u8 delta_thermal_index, 4550 u8 thermal_value, u8 threshold) 4551 { 4552 struct rtl_dm *rtldm = rtl_dm(rtl_priv(hw)); 4553 4554 rtldm->thermalvalue_iqk = thermal_value; 4555 rtl8812ae_phy_iq_calibrate(hw, false); 4556 } 4557 4558 void rtl8821ae_phy_iq_calibrate(struct ieee80211_hw *hw, bool b_recovery) 4559 { 4560 struct rtl_priv *rtlpriv = rtl_priv(hw); 4561 struct rtl_phy *rtlphy = &rtlpriv->phy; 4562 4563 if (!rtlphy->lck_inprogress) { 4564 spin_lock(&rtlpriv->locks.iqk_lock); 4565 rtlphy->lck_inprogress = true; 4566 spin_unlock(&rtlpriv->locks.iqk_lock); 4567 4568 _rtl8821ae_phy_iq_calibrate(hw); 4569 4570 spin_lock(&rtlpriv->locks.iqk_lock); 4571 rtlphy->lck_inprogress = false; 4572 spin_unlock(&rtlpriv->locks.iqk_lock); 4573 } 4574 } 4575 4576 void rtl8821ae_reset_iqk_result(struct ieee80211_hw *hw) 4577 { 4578 struct rtl_priv *rtlpriv = rtl_priv(hw); 4579 struct rtl_phy *rtlphy = &rtlpriv->phy; 4580 u8 i; 4581 4582 RT_TRACE(rtlpriv, COMP_IQK, DBG_LOUD, 4583 "rtl8812ae_dm_reset_iqk_result:: settings regs %d default regs %d\n", 4584 (int)(sizeof(rtlphy->iqk_matrix) / 4585 sizeof(struct iqk_matrix_regs)), 4586 IQK_MATRIX_SETTINGS_NUM); 4587 4588 for (i = 0; i < IQK_MATRIX_SETTINGS_NUM; i++) { 4589 rtlphy->iqk_matrix[i].value[0][0] = 0x100; 4590 rtlphy->iqk_matrix[i].value[0][2] = 0x100; 4591 rtlphy->iqk_matrix[i].value[0][4] = 0x100; 4592 rtlphy->iqk_matrix[i].value[0][6] = 0x100; 4593 4594 rtlphy->iqk_matrix[i].value[0][1] = 0x0; 4595 rtlphy->iqk_matrix[i].value[0][3] = 0x0; 4596 rtlphy->iqk_matrix[i].value[0][5] = 0x0; 4597 rtlphy->iqk_matrix[i].value[0][7] = 0x0; 4598 4599 rtlphy->iqk_matrix[i].iqk_done = false; 4600 } 4601 } 4602 4603 void rtl8821ae_do_iqk(struct ieee80211_hw *hw, u8 delta_thermal_index, 4604 u8 thermal_value, u8 threshold) 4605 { 4606 struct rtl_dm *rtldm = rtl_dm(rtl_priv(hw)); 4607 4608 rtl8821ae_reset_iqk_result(hw); 4609 4610 rtldm->thermalvalue_iqk = thermal_value; 4611 rtl8821ae_phy_iq_calibrate(hw, false); 4612 } 4613 4614 void rtl8821ae_phy_lc_calibrate(struct ieee80211_hw *hw) 4615 { 4616 } 4617 4618 void rtl8821ae_phy_ap_calibrate(struct ieee80211_hw *hw, s8 delta) 4619 { 4620 } 4621 4622 void rtl8821ae_phy_set_rfpath_switch(struct ieee80211_hw *hw, bool bmain) 4623 { 4624 _rtl8821ae_phy_set_rfpath_switch(hw, bmain); 4625 } 4626 4627 bool rtl8821ae_phy_set_io_cmd(struct ieee80211_hw *hw, enum io_type iotype) 4628 { 4629 struct rtl_priv *rtlpriv = rtl_priv(hw); 4630 struct rtl_phy *rtlphy = &rtlpriv->phy; 4631 bool postprocessing = false; 4632 4633 RT_TRACE(rtlpriv, COMP_CMD, DBG_TRACE, 4634 "-->IO Cmd(%#x), set_io_inprogress(%d)\n", 4635 iotype, rtlphy->set_io_inprogress); 4636 do { 4637 switch (iotype) { 4638 case IO_CMD_RESUME_DM_BY_SCAN: 4639 RT_TRACE(rtlpriv, COMP_CMD, DBG_TRACE, 4640 "[IO CMD] Resume DM after scan.\n"); 4641 postprocessing = true; 4642 break; 4643 case IO_CMD_PAUSE_BAND0_DM_BY_SCAN: 4644 case IO_CMD_PAUSE_BAND1_DM_BY_SCAN: 4645 RT_TRACE(rtlpriv, COMP_CMD, DBG_TRACE, 4646 "[IO CMD] Pause DM before scan.\n"); 4647 postprocessing = true; 4648 break; 4649 default: 4650 pr_err("switch case %#x not processed\n", 4651 iotype); 4652 break; 4653 } 4654 } while (false); 4655 if (postprocessing && !rtlphy->set_io_inprogress) { 4656 rtlphy->set_io_inprogress = true; 4657 rtlphy->current_io_type = iotype; 4658 } else { 4659 return false; 4660 } 4661 rtl8821ae_phy_set_io(hw); 4662 RT_TRACE(rtlpriv, COMP_CMD, DBG_TRACE, "IO Type(%#x)\n", iotype); 4663 return true; 4664 } 4665 4666 static void rtl8821ae_phy_set_io(struct ieee80211_hw *hw) 4667 { 4668 struct rtl_priv *rtlpriv = rtl_priv(hw); 4669 struct dig_t *dm_digtable = &rtlpriv->dm_digtable; 4670 struct rtl_phy *rtlphy = &rtlpriv->phy; 4671 4672 RT_TRACE(rtlpriv, COMP_CMD, DBG_TRACE, 4673 "--->Cmd(%#x), set_io_inprogress(%d)\n", 4674 rtlphy->current_io_type, rtlphy->set_io_inprogress); 4675 switch (rtlphy->current_io_type) { 4676 case IO_CMD_RESUME_DM_BY_SCAN: 4677 if (rtlpriv->mac80211.opmode == NL80211_IFTYPE_ADHOC) 4678 _rtl8821ae_resume_tx_beacon(hw); 4679 rtl8821ae_dm_write_dig(hw, rtlphy->initgain_backup.xaagccore1); 4680 rtl8821ae_dm_write_cck_cca_thres(hw, 4681 rtlphy->initgain_backup.cca); 4682 break; 4683 case IO_CMD_PAUSE_BAND0_DM_BY_SCAN: 4684 if (rtlpriv->mac80211.opmode == NL80211_IFTYPE_ADHOC) 4685 _rtl8821ae_stop_tx_beacon(hw); 4686 rtlphy->initgain_backup.xaagccore1 = dm_digtable->cur_igvalue; 4687 rtl8821ae_dm_write_dig(hw, 0x17); 4688 rtlphy->initgain_backup.cca = dm_digtable->cur_cck_cca_thres; 4689 rtl8821ae_dm_write_cck_cca_thres(hw, 0x40); 4690 break; 4691 case IO_CMD_PAUSE_BAND1_DM_BY_SCAN: 4692 break; 4693 default: 4694 pr_err("switch case %#x not processed\n", 4695 rtlphy->current_io_type); 4696 break; 4697 } 4698 rtlphy->set_io_inprogress = false; 4699 RT_TRACE(rtlpriv, COMP_CMD, DBG_TRACE, 4700 "(%#x)\n", rtlphy->current_io_type); 4701 } 4702 4703 static void rtl8821ae_phy_set_rf_on(struct ieee80211_hw *hw) 4704 { 4705 struct rtl_priv *rtlpriv = rtl_priv(hw); 4706 4707 rtl_write_byte(rtlpriv, REG_SPS0_CTRL, 0x2b); 4708 rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN, 0xE3); 4709 rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN, 0xE2); 4710 rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN, 0xE3); 4711 rtl_write_byte(rtlpriv, REG_TXPAUSE, 0x00); 4712 } 4713 4714 static bool _rtl8821ae_phy_set_rf_power_state(struct ieee80211_hw *hw, 4715 enum rf_pwrstate rfpwr_state) 4716 { 4717 struct rtl_priv *rtlpriv = rtl_priv(hw); 4718 struct rtl_pci_priv *pcipriv = rtl_pcipriv(hw); 4719 struct rtl_mac *mac = rtl_mac(rtl_priv(hw)); 4720 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw)); 4721 bool bresult = true; 4722 u8 i, queue_id; 4723 struct rtl8192_tx_ring *ring = NULL; 4724 4725 switch (rfpwr_state) { 4726 case ERFON: 4727 if ((ppsc->rfpwr_state == ERFOFF) && 4728 RT_IN_PS_LEVEL(ppsc, RT_RF_OFF_LEVL_HALT_NIC)) { 4729 bool rtstatus = false; 4730 u32 initializecount = 0; 4731 4732 do { 4733 initializecount++; 4734 RT_TRACE(rtlpriv, COMP_RF, DBG_DMESG, 4735 "IPS Set eRf nic enable\n"); 4736 rtstatus = rtl_ps_enable_nic(hw); 4737 } while (!rtstatus && (initializecount < 10)); 4738 RT_CLEAR_PS_LEVEL(ppsc, 4739 RT_RF_OFF_LEVL_HALT_NIC); 4740 } else { 4741 RT_TRACE(rtlpriv, COMP_RF, DBG_DMESG, 4742 "Set ERFON sleeped:%d ms\n", 4743 jiffies_to_msecs(jiffies - 4744 ppsc-> 4745 last_sleep_jiffies)); 4746 ppsc->last_awake_jiffies = jiffies; 4747 rtl8821ae_phy_set_rf_on(hw); 4748 } 4749 if (mac->link_state == MAC80211_LINKED) { 4750 rtlpriv->cfg->ops->led_control(hw, 4751 LED_CTL_LINK); 4752 } else { 4753 rtlpriv->cfg->ops->led_control(hw, 4754 LED_CTL_NO_LINK); 4755 } 4756 break; 4757 case ERFOFF: 4758 for (queue_id = 0, i = 0; 4759 queue_id < RTL_PCI_MAX_TX_QUEUE_COUNT;) { 4760 ring = &pcipriv->dev.tx_ring[queue_id]; 4761 if (queue_id == BEACON_QUEUE || 4762 skb_queue_len(&ring->queue) == 0) { 4763 queue_id++; 4764 continue; 4765 } else { 4766 RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING, 4767 "eRf Off/Sleep: %d times TcbBusyQueue[%d] =%d before doze!\n", 4768 (i + 1), queue_id, 4769 skb_queue_len(&ring->queue)); 4770 4771 udelay(10); 4772 i++; 4773 } 4774 if (i >= MAX_DOZE_WAITING_TIMES_9x) { 4775 RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING, 4776 "\n ERFSLEEP: %d times TcbBusyQueue[%d] = %d !\n", 4777 MAX_DOZE_WAITING_TIMES_9x, 4778 queue_id, 4779 skb_queue_len(&ring->queue)); 4780 break; 4781 } 4782 } 4783 4784 if (ppsc->reg_rfps_level & RT_RF_OFF_LEVL_HALT_NIC) { 4785 RT_TRACE(rtlpriv, COMP_RF, DBG_DMESG, 4786 "IPS Set eRf nic disable\n"); 4787 rtl_ps_disable_nic(hw); 4788 RT_SET_PS_LEVEL(ppsc, RT_RF_OFF_LEVL_HALT_NIC); 4789 } else { 4790 if (ppsc->rfoff_reason == RF_CHANGE_BY_IPS) { 4791 rtlpriv->cfg->ops->led_control(hw, 4792 LED_CTL_NO_LINK); 4793 } else { 4794 rtlpriv->cfg->ops->led_control(hw, 4795 LED_CTL_POWER_OFF); 4796 } 4797 } 4798 break; 4799 default: 4800 pr_err("switch case %#x not processed\n", 4801 rfpwr_state); 4802 bresult = false; 4803 break; 4804 } 4805 if (bresult) 4806 ppsc->rfpwr_state = rfpwr_state; 4807 return bresult; 4808 } 4809 4810 bool rtl8821ae_phy_set_rf_power_state(struct ieee80211_hw *hw, 4811 enum rf_pwrstate rfpwr_state) 4812 { 4813 struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw)); 4814 4815 bool bresult = false; 4816 4817 if (rfpwr_state == ppsc->rfpwr_state) 4818 return bresult; 4819 bresult = _rtl8821ae_phy_set_rf_power_state(hw, rfpwr_state); 4820 return bresult; 4821 } 4822