162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0 262306a36Sopenharmony_ci/* Copyright(c) 2009-2014 Realtek Corporation.*/ 362306a36Sopenharmony_ci 462306a36Sopenharmony_ci#include "../wifi.h" 562306a36Sopenharmony_ci#include "../pci.h" 662306a36Sopenharmony_ci#include "../ps.h" 762306a36Sopenharmony_ci#include "reg.h" 862306a36Sopenharmony_ci#include "def.h" 962306a36Sopenharmony_ci#include "phy.h" 1062306a36Sopenharmony_ci#include "rf.h" 1162306a36Sopenharmony_ci#include "dm.h" 1262306a36Sopenharmony_ci#include "table.h" 1362306a36Sopenharmony_ci 1462306a36Sopenharmony_cistatic u32 _rtl92ee_phy_rf_serial_read(struct ieee80211_hw *hw, 1562306a36Sopenharmony_ci enum radio_path rfpath, u32 offset); 1662306a36Sopenharmony_cistatic void _rtl92ee_phy_rf_serial_write(struct ieee80211_hw *hw, 1762306a36Sopenharmony_ci enum radio_path rfpath, u32 offset, 1862306a36Sopenharmony_ci u32 data); 1962306a36Sopenharmony_cistatic bool _rtl92ee_phy_bb8192ee_config_parafile(struct ieee80211_hw *hw); 2062306a36Sopenharmony_cistatic bool _rtl92ee_phy_config_mac_with_headerfile(struct ieee80211_hw *hw); 2162306a36Sopenharmony_cistatic bool phy_config_bb_with_hdr_file(struct ieee80211_hw *hw, 2262306a36Sopenharmony_ci u8 configtype); 2362306a36Sopenharmony_cistatic bool phy_config_bb_with_pghdrfile(struct ieee80211_hw *hw, 2462306a36Sopenharmony_ci u8 configtype); 2562306a36Sopenharmony_cistatic void phy_init_bb_rf_register_def(struct ieee80211_hw *hw); 2662306a36Sopenharmony_cistatic bool _rtl92ee_phy_set_sw_chnl_cmdarray(struct swchnlcmd *cmdtable, 2762306a36Sopenharmony_ci u32 cmdtableidx, u32 cmdtablesz, 2862306a36Sopenharmony_ci enum swchnlcmd_id cmdid, 2962306a36Sopenharmony_ci u32 para1, u32 para2, 3062306a36Sopenharmony_ci u32 msdelay); 3162306a36Sopenharmony_cistatic bool _rtl92ee_phy_sw_chnl_step_by_step(struct ieee80211_hw *hw, 3262306a36Sopenharmony_ci u8 channel, u8 *stage, 3362306a36Sopenharmony_ci u8 *step, u32 *delay); 3462306a36Sopenharmony_cistatic long _rtl92ee_phy_txpwr_idx_to_dbm(struct ieee80211_hw *hw, 3562306a36Sopenharmony_ci enum wireless_mode wirelessmode, 3662306a36Sopenharmony_ci u8 txpwridx); 3762306a36Sopenharmony_cistatic void rtl92ee_phy_set_rf_on(struct ieee80211_hw *hw); 3862306a36Sopenharmony_cistatic void rtl92ee_phy_set_io(struct ieee80211_hw *hw); 3962306a36Sopenharmony_ci 4062306a36Sopenharmony_ciu32 rtl92ee_phy_query_bb_reg(struct ieee80211_hw *hw, u32 regaddr, u32 bitmask) 4162306a36Sopenharmony_ci{ 4262306a36Sopenharmony_ci struct rtl_priv *rtlpriv = rtl_priv(hw); 4362306a36Sopenharmony_ci u32 returnvalue, originalvalue, bitshift; 4462306a36Sopenharmony_ci 4562306a36Sopenharmony_ci rtl_dbg(rtlpriv, COMP_RF, DBG_TRACE, 4662306a36Sopenharmony_ci "regaddr(%#x), bitmask(%#x)\n", regaddr, bitmask); 4762306a36Sopenharmony_ci originalvalue = rtl_read_dword(rtlpriv, regaddr); 4862306a36Sopenharmony_ci bitshift = calculate_bit_shift(bitmask); 4962306a36Sopenharmony_ci returnvalue = (originalvalue & bitmask) >> bitshift; 5062306a36Sopenharmony_ci 5162306a36Sopenharmony_ci rtl_dbg(rtlpriv, COMP_RF, DBG_TRACE, 5262306a36Sopenharmony_ci "BBR MASK=0x%x Addr[0x%x]=0x%x\n", 5362306a36Sopenharmony_ci bitmask, regaddr, originalvalue); 5462306a36Sopenharmony_ci 5562306a36Sopenharmony_ci return returnvalue; 5662306a36Sopenharmony_ci} 5762306a36Sopenharmony_ci 5862306a36Sopenharmony_civoid rtl92ee_phy_set_bb_reg(struct ieee80211_hw *hw, u32 regaddr, 5962306a36Sopenharmony_ci u32 bitmask, u32 data) 6062306a36Sopenharmony_ci{ 6162306a36Sopenharmony_ci struct rtl_priv *rtlpriv = rtl_priv(hw); 6262306a36Sopenharmony_ci u32 originalvalue, bitshift; 6362306a36Sopenharmony_ci 6462306a36Sopenharmony_ci rtl_dbg(rtlpriv, COMP_RF, DBG_TRACE, 6562306a36Sopenharmony_ci "regaddr(%#x), bitmask(%#x), data(%#x)\n", 6662306a36Sopenharmony_ci regaddr, bitmask, data); 6762306a36Sopenharmony_ci 6862306a36Sopenharmony_ci if (bitmask != MASKDWORD) { 6962306a36Sopenharmony_ci originalvalue = rtl_read_dword(rtlpriv, regaddr); 7062306a36Sopenharmony_ci bitshift = calculate_bit_shift(bitmask); 7162306a36Sopenharmony_ci data = ((originalvalue & (~bitmask)) | (data << bitshift)); 7262306a36Sopenharmony_ci } 7362306a36Sopenharmony_ci 7462306a36Sopenharmony_ci rtl_write_dword(rtlpriv, regaddr, data); 7562306a36Sopenharmony_ci 7662306a36Sopenharmony_ci rtl_dbg(rtlpriv, COMP_RF, DBG_TRACE, 7762306a36Sopenharmony_ci "regaddr(%#x), bitmask(%#x), data(%#x)\n", 7862306a36Sopenharmony_ci regaddr, bitmask, data); 7962306a36Sopenharmony_ci} 8062306a36Sopenharmony_ci 8162306a36Sopenharmony_ciu32 rtl92ee_phy_query_rf_reg(struct ieee80211_hw *hw, 8262306a36Sopenharmony_ci enum radio_path rfpath, u32 regaddr, u32 bitmask) 8362306a36Sopenharmony_ci{ 8462306a36Sopenharmony_ci struct rtl_priv *rtlpriv = rtl_priv(hw); 8562306a36Sopenharmony_ci u32 original_value, readback_value, bitshift; 8662306a36Sopenharmony_ci 8762306a36Sopenharmony_ci rtl_dbg(rtlpriv, COMP_RF, DBG_TRACE, 8862306a36Sopenharmony_ci "regaddr(%#x), rfpath(%#x), bitmask(%#x)\n", 8962306a36Sopenharmony_ci regaddr, rfpath, bitmask); 9062306a36Sopenharmony_ci 9162306a36Sopenharmony_ci spin_lock(&rtlpriv->locks.rf_lock); 9262306a36Sopenharmony_ci 9362306a36Sopenharmony_ci original_value = _rtl92ee_phy_rf_serial_read(hw , rfpath, regaddr); 9462306a36Sopenharmony_ci bitshift = calculate_bit_shift(bitmask); 9562306a36Sopenharmony_ci readback_value = (original_value & bitmask) >> bitshift; 9662306a36Sopenharmony_ci 9762306a36Sopenharmony_ci spin_unlock(&rtlpriv->locks.rf_lock); 9862306a36Sopenharmony_ci 9962306a36Sopenharmony_ci rtl_dbg(rtlpriv, COMP_RF, DBG_TRACE, 10062306a36Sopenharmony_ci "regaddr(%#x),rfpath(%#x),bitmask(%#x),original_value(%#x)\n", 10162306a36Sopenharmony_ci regaddr, rfpath, bitmask, original_value); 10262306a36Sopenharmony_ci 10362306a36Sopenharmony_ci return readback_value; 10462306a36Sopenharmony_ci} 10562306a36Sopenharmony_ci 10662306a36Sopenharmony_civoid rtl92ee_phy_set_rf_reg(struct ieee80211_hw *hw, 10762306a36Sopenharmony_ci enum radio_path rfpath, 10862306a36Sopenharmony_ci u32 addr, u32 bitmask, u32 data) 10962306a36Sopenharmony_ci{ 11062306a36Sopenharmony_ci struct rtl_priv *rtlpriv = rtl_priv(hw); 11162306a36Sopenharmony_ci u32 original_value, bitshift; 11262306a36Sopenharmony_ci 11362306a36Sopenharmony_ci rtl_dbg(rtlpriv, COMP_RF, DBG_TRACE, 11462306a36Sopenharmony_ci "regaddr(%#x), bitmask(%#x), data(%#x), rfpath(%#x)\n", 11562306a36Sopenharmony_ci addr, bitmask, data, rfpath); 11662306a36Sopenharmony_ci 11762306a36Sopenharmony_ci spin_lock(&rtlpriv->locks.rf_lock); 11862306a36Sopenharmony_ci 11962306a36Sopenharmony_ci if (bitmask != RFREG_OFFSET_MASK) { 12062306a36Sopenharmony_ci original_value = _rtl92ee_phy_rf_serial_read(hw, rfpath, addr); 12162306a36Sopenharmony_ci bitshift = calculate_bit_shift(bitmask); 12262306a36Sopenharmony_ci data = (original_value & (~bitmask)) | (data << bitshift); 12362306a36Sopenharmony_ci } 12462306a36Sopenharmony_ci 12562306a36Sopenharmony_ci _rtl92ee_phy_rf_serial_write(hw, rfpath, addr, data); 12662306a36Sopenharmony_ci 12762306a36Sopenharmony_ci spin_unlock(&rtlpriv->locks.rf_lock); 12862306a36Sopenharmony_ci 12962306a36Sopenharmony_ci rtl_dbg(rtlpriv, COMP_RF, DBG_TRACE, 13062306a36Sopenharmony_ci "regaddr(%#x), bitmask(%#x), data(%#x), rfpath(%#x)\n", 13162306a36Sopenharmony_ci addr, bitmask, data, rfpath); 13262306a36Sopenharmony_ci} 13362306a36Sopenharmony_ci 13462306a36Sopenharmony_cistatic u32 _rtl92ee_phy_rf_serial_read(struct ieee80211_hw *hw, 13562306a36Sopenharmony_ci enum radio_path rfpath, u32 offset) 13662306a36Sopenharmony_ci{ 13762306a36Sopenharmony_ci struct rtl_priv *rtlpriv = rtl_priv(hw); 13862306a36Sopenharmony_ci struct rtl_phy *rtlphy = &rtlpriv->phy; 13962306a36Sopenharmony_ci struct bb_reg_def *pphyreg = &rtlphy->phyreg_def[rfpath]; 14062306a36Sopenharmony_ci u32 newoffset; 14162306a36Sopenharmony_ci u32 tmplong, tmplong2; 14262306a36Sopenharmony_ci u8 rfpi_enable = 0; 14362306a36Sopenharmony_ci u32 retvalue; 14462306a36Sopenharmony_ci 14562306a36Sopenharmony_ci offset &= 0xff; 14662306a36Sopenharmony_ci newoffset = offset; 14762306a36Sopenharmony_ci if (RT_CANNOT_IO(hw)) { 14862306a36Sopenharmony_ci pr_err("return all one\n"); 14962306a36Sopenharmony_ci return 0xFFFFFFFF; 15062306a36Sopenharmony_ci } 15162306a36Sopenharmony_ci tmplong = rtl_get_bbreg(hw, RFPGA0_XA_HSSIPARAMETER2, MASKDWORD); 15262306a36Sopenharmony_ci if (rfpath == RF90_PATH_A) 15362306a36Sopenharmony_ci tmplong2 = tmplong; 15462306a36Sopenharmony_ci else 15562306a36Sopenharmony_ci tmplong2 = rtl_get_bbreg(hw, pphyreg->rfhssi_para2, MASKDWORD); 15662306a36Sopenharmony_ci tmplong2 = (tmplong2 & (~BLSSIREADADDRESS)) | 15762306a36Sopenharmony_ci (newoffset << 23) | BLSSIREADEDGE; 15862306a36Sopenharmony_ci rtl_set_bbreg(hw, RFPGA0_XA_HSSIPARAMETER2, MASKDWORD, 15962306a36Sopenharmony_ci tmplong & (~BLSSIREADEDGE)); 16062306a36Sopenharmony_ci rtl_set_bbreg(hw, pphyreg->rfhssi_para2, MASKDWORD, tmplong2); 16162306a36Sopenharmony_ci udelay(20); 16262306a36Sopenharmony_ci if (rfpath == RF90_PATH_A) 16362306a36Sopenharmony_ci rfpi_enable = (u8)rtl_get_bbreg(hw, RFPGA0_XA_HSSIPARAMETER1, 16462306a36Sopenharmony_ci BIT(8)); 16562306a36Sopenharmony_ci else if (rfpath == RF90_PATH_B) 16662306a36Sopenharmony_ci rfpi_enable = (u8)rtl_get_bbreg(hw, RFPGA0_XB_HSSIPARAMETER1, 16762306a36Sopenharmony_ci BIT(8)); 16862306a36Sopenharmony_ci if (rfpi_enable) 16962306a36Sopenharmony_ci retvalue = rtl_get_bbreg(hw, pphyreg->rf_rbpi, 17062306a36Sopenharmony_ci BLSSIREADBACKDATA); 17162306a36Sopenharmony_ci else 17262306a36Sopenharmony_ci retvalue = rtl_get_bbreg(hw, pphyreg->rf_rb, 17362306a36Sopenharmony_ci BLSSIREADBACKDATA); 17462306a36Sopenharmony_ci rtl_dbg(rtlpriv, COMP_RF, DBG_TRACE, 17562306a36Sopenharmony_ci "RFR-%d Addr[0x%x]=0x%x\n", 17662306a36Sopenharmony_ci rfpath, pphyreg->rf_rb, retvalue); 17762306a36Sopenharmony_ci return retvalue; 17862306a36Sopenharmony_ci} 17962306a36Sopenharmony_ci 18062306a36Sopenharmony_cistatic void _rtl92ee_phy_rf_serial_write(struct ieee80211_hw *hw, 18162306a36Sopenharmony_ci enum radio_path rfpath, u32 offset, 18262306a36Sopenharmony_ci u32 data) 18362306a36Sopenharmony_ci{ 18462306a36Sopenharmony_ci u32 data_and_addr; 18562306a36Sopenharmony_ci u32 newoffset; 18662306a36Sopenharmony_ci struct rtl_priv *rtlpriv = rtl_priv(hw); 18762306a36Sopenharmony_ci struct rtl_phy *rtlphy = &rtlpriv->phy; 18862306a36Sopenharmony_ci struct bb_reg_def *pphyreg = &rtlphy->phyreg_def[rfpath]; 18962306a36Sopenharmony_ci 19062306a36Sopenharmony_ci if (RT_CANNOT_IO(hw)) { 19162306a36Sopenharmony_ci pr_err("stop\n"); 19262306a36Sopenharmony_ci return; 19362306a36Sopenharmony_ci } 19462306a36Sopenharmony_ci offset &= 0xff; 19562306a36Sopenharmony_ci newoffset = offset; 19662306a36Sopenharmony_ci data_and_addr = ((newoffset << 20) | (data & 0x000fffff)) & 0x0fffffff; 19762306a36Sopenharmony_ci rtl_set_bbreg(hw, pphyreg->rf3wire_offset, MASKDWORD, data_and_addr); 19862306a36Sopenharmony_ci rtl_dbg(rtlpriv, COMP_RF, DBG_TRACE, 19962306a36Sopenharmony_ci "RFW-%d Addr[0x%x]=0x%x\n", rfpath, 20062306a36Sopenharmony_ci pphyreg->rf3wire_offset, data_and_addr); 20162306a36Sopenharmony_ci} 20262306a36Sopenharmony_ci 20362306a36Sopenharmony_cibool rtl92ee_phy_mac_config(struct ieee80211_hw *hw) 20462306a36Sopenharmony_ci{ 20562306a36Sopenharmony_ci return _rtl92ee_phy_config_mac_with_headerfile(hw); 20662306a36Sopenharmony_ci} 20762306a36Sopenharmony_ci 20862306a36Sopenharmony_cibool rtl92ee_phy_bb_config(struct ieee80211_hw *hw) 20962306a36Sopenharmony_ci{ 21062306a36Sopenharmony_ci struct rtl_priv *rtlpriv = rtl_priv(hw); 21162306a36Sopenharmony_ci bool rtstatus = true; 21262306a36Sopenharmony_ci u16 regval; 21362306a36Sopenharmony_ci u32 tmp; 21462306a36Sopenharmony_ci u8 crystal_cap; 21562306a36Sopenharmony_ci 21662306a36Sopenharmony_ci phy_init_bb_rf_register_def(hw); 21762306a36Sopenharmony_ci regval = rtl_read_word(rtlpriv, REG_SYS_FUNC_EN); 21862306a36Sopenharmony_ci rtl_write_word(rtlpriv, REG_SYS_FUNC_EN, 21962306a36Sopenharmony_ci regval | BIT(13) | BIT(0) | BIT(1)); 22062306a36Sopenharmony_ci 22162306a36Sopenharmony_ci rtl_write_byte(rtlpriv, REG_RF_CTRL, RF_EN | RF_RSTB | RF_SDMRSTB); 22262306a36Sopenharmony_ci rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN, 22362306a36Sopenharmony_ci FEN_PPLL | FEN_PCIEA | FEN_DIO_PCIE | 22462306a36Sopenharmony_ci FEN_BB_GLB_RSTN | FEN_BBRSTB); 22562306a36Sopenharmony_ci 22662306a36Sopenharmony_ci rtl_write_byte(rtlpriv, REG_AFE_XTAL_CTRL + 1, 0x80); 22762306a36Sopenharmony_ci 22862306a36Sopenharmony_ci tmp = rtl_read_dword(rtlpriv, 0x4c); 22962306a36Sopenharmony_ci rtl_write_dword(rtlpriv, 0x4c, tmp | BIT(23)); 23062306a36Sopenharmony_ci 23162306a36Sopenharmony_ci rtstatus = _rtl92ee_phy_bb8192ee_config_parafile(hw); 23262306a36Sopenharmony_ci 23362306a36Sopenharmony_ci crystal_cap = rtlpriv->efuse.eeprom_crystalcap & 0x3F; 23462306a36Sopenharmony_ci rtl_set_bbreg(hw, REG_MAC_PHY_CTRL, 0xFFF000, 23562306a36Sopenharmony_ci (crystal_cap | (crystal_cap << 6))); 23662306a36Sopenharmony_ci return rtstatus; 23762306a36Sopenharmony_ci} 23862306a36Sopenharmony_ci 23962306a36Sopenharmony_cibool rtl92ee_phy_rf_config(struct ieee80211_hw *hw) 24062306a36Sopenharmony_ci{ 24162306a36Sopenharmony_ci return rtl92ee_phy_rf6052_config(hw); 24262306a36Sopenharmony_ci} 24362306a36Sopenharmony_ci 24462306a36Sopenharmony_cistatic bool _check_condition(struct ieee80211_hw *hw, 24562306a36Sopenharmony_ci const u32 condition) 24662306a36Sopenharmony_ci{ 24762306a36Sopenharmony_ci struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw)); 24862306a36Sopenharmony_ci struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw)); 24962306a36Sopenharmony_ci u32 _board = rtlefuse->board_type; /*need efuse define*/ 25062306a36Sopenharmony_ci u32 _interface = rtlhal->interface; 25162306a36Sopenharmony_ci u32 _platform = 0x08;/*SupportPlatform */ 25262306a36Sopenharmony_ci u32 cond = condition; 25362306a36Sopenharmony_ci 25462306a36Sopenharmony_ci if (condition == 0xCDCDCDCD) 25562306a36Sopenharmony_ci return true; 25662306a36Sopenharmony_ci 25762306a36Sopenharmony_ci cond = condition & 0xFF; 25862306a36Sopenharmony_ci if ((_board != cond) && (cond != 0xFF)) 25962306a36Sopenharmony_ci return false; 26062306a36Sopenharmony_ci 26162306a36Sopenharmony_ci cond = condition & 0xFF00; 26262306a36Sopenharmony_ci cond = cond >> 8; 26362306a36Sopenharmony_ci if ((_interface & cond) == 0 && cond != 0x07) 26462306a36Sopenharmony_ci return false; 26562306a36Sopenharmony_ci 26662306a36Sopenharmony_ci cond = condition & 0xFF0000; 26762306a36Sopenharmony_ci cond = cond >> 16; 26862306a36Sopenharmony_ci if ((_platform & cond) == 0 && cond != 0x0F) 26962306a36Sopenharmony_ci return false; 27062306a36Sopenharmony_ci 27162306a36Sopenharmony_ci return true; 27262306a36Sopenharmony_ci} 27362306a36Sopenharmony_ci 27462306a36Sopenharmony_cistatic void _rtl92ee_config_rf_reg(struct ieee80211_hw *hw, u32 addr, u32 data, 27562306a36Sopenharmony_ci enum radio_path rfpath, u32 regaddr) 27662306a36Sopenharmony_ci{ 27762306a36Sopenharmony_ci if (addr == 0xfe || addr == 0xffe) { 27862306a36Sopenharmony_ci mdelay(50); 27962306a36Sopenharmony_ci } else { 28062306a36Sopenharmony_ci rtl_set_rfreg(hw, rfpath, regaddr, RFREG_OFFSET_MASK, data); 28162306a36Sopenharmony_ci udelay(1); 28262306a36Sopenharmony_ci 28362306a36Sopenharmony_ci if (addr == 0xb6) { 28462306a36Sopenharmony_ci u32 getvalue; 28562306a36Sopenharmony_ci u8 count = 0; 28662306a36Sopenharmony_ci 28762306a36Sopenharmony_ci getvalue = rtl_get_rfreg(hw, rfpath, addr, MASKDWORD); 28862306a36Sopenharmony_ci udelay(1); 28962306a36Sopenharmony_ci 29062306a36Sopenharmony_ci while ((getvalue >> 8) != (data >> 8)) { 29162306a36Sopenharmony_ci count++; 29262306a36Sopenharmony_ci rtl_set_rfreg(hw, rfpath, regaddr, 29362306a36Sopenharmony_ci RFREG_OFFSET_MASK, data); 29462306a36Sopenharmony_ci udelay(1); 29562306a36Sopenharmony_ci getvalue = rtl_get_rfreg(hw, rfpath, addr, 29662306a36Sopenharmony_ci MASKDWORD); 29762306a36Sopenharmony_ci if (count > 5) 29862306a36Sopenharmony_ci break; 29962306a36Sopenharmony_ci } 30062306a36Sopenharmony_ci } 30162306a36Sopenharmony_ci 30262306a36Sopenharmony_ci if (addr == 0xb2) { 30362306a36Sopenharmony_ci u32 getvalue; 30462306a36Sopenharmony_ci u8 count = 0; 30562306a36Sopenharmony_ci 30662306a36Sopenharmony_ci getvalue = rtl_get_rfreg(hw, rfpath, addr, MASKDWORD); 30762306a36Sopenharmony_ci udelay(1); 30862306a36Sopenharmony_ci 30962306a36Sopenharmony_ci while (getvalue != data) { 31062306a36Sopenharmony_ci count++; 31162306a36Sopenharmony_ci rtl_set_rfreg(hw, rfpath, regaddr, 31262306a36Sopenharmony_ci RFREG_OFFSET_MASK, data); 31362306a36Sopenharmony_ci udelay(1); 31462306a36Sopenharmony_ci rtl_set_rfreg(hw, rfpath, 0x18, 31562306a36Sopenharmony_ci RFREG_OFFSET_MASK, 0x0fc07); 31662306a36Sopenharmony_ci udelay(1); 31762306a36Sopenharmony_ci getvalue = rtl_get_rfreg(hw, rfpath, addr, 31862306a36Sopenharmony_ci MASKDWORD); 31962306a36Sopenharmony_ci if (count > 5) 32062306a36Sopenharmony_ci break; 32162306a36Sopenharmony_ci } 32262306a36Sopenharmony_ci } 32362306a36Sopenharmony_ci } 32462306a36Sopenharmony_ci} 32562306a36Sopenharmony_ci 32662306a36Sopenharmony_cistatic void _rtl92ee_config_rf_radio_a(struct ieee80211_hw *hw, 32762306a36Sopenharmony_ci u32 addr, u32 data) 32862306a36Sopenharmony_ci{ 32962306a36Sopenharmony_ci u32 content = 0x1000; /*RF Content: radio_a_txt*/ 33062306a36Sopenharmony_ci u32 maskforphyset = (u32)(content & 0xE000); 33162306a36Sopenharmony_ci 33262306a36Sopenharmony_ci _rtl92ee_config_rf_reg(hw, addr, data, RF90_PATH_A, 33362306a36Sopenharmony_ci addr | maskforphyset); 33462306a36Sopenharmony_ci} 33562306a36Sopenharmony_ci 33662306a36Sopenharmony_cistatic void _rtl92ee_config_rf_radio_b(struct ieee80211_hw *hw, 33762306a36Sopenharmony_ci u32 addr, u32 data) 33862306a36Sopenharmony_ci{ 33962306a36Sopenharmony_ci u32 content = 0x1001; /*RF Content: radio_b_txt*/ 34062306a36Sopenharmony_ci u32 maskforphyset = (u32)(content & 0xE000); 34162306a36Sopenharmony_ci 34262306a36Sopenharmony_ci _rtl92ee_config_rf_reg(hw, addr, data, RF90_PATH_B, 34362306a36Sopenharmony_ci addr | maskforphyset); 34462306a36Sopenharmony_ci} 34562306a36Sopenharmony_ci 34662306a36Sopenharmony_cistatic void _rtl92ee_config_bb_reg(struct ieee80211_hw *hw, 34762306a36Sopenharmony_ci u32 addr, u32 data) 34862306a36Sopenharmony_ci{ 34962306a36Sopenharmony_ci if (addr == 0xfe) 35062306a36Sopenharmony_ci mdelay(50); 35162306a36Sopenharmony_ci else if (addr == 0xfd) 35262306a36Sopenharmony_ci mdelay(5); 35362306a36Sopenharmony_ci else if (addr == 0xfc) 35462306a36Sopenharmony_ci mdelay(1); 35562306a36Sopenharmony_ci else if (addr == 0xfb) 35662306a36Sopenharmony_ci udelay(50); 35762306a36Sopenharmony_ci else if (addr == 0xfa) 35862306a36Sopenharmony_ci udelay(5); 35962306a36Sopenharmony_ci else if (addr == 0xf9) 36062306a36Sopenharmony_ci udelay(1); 36162306a36Sopenharmony_ci else 36262306a36Sopenharmony_ci rtl_set_bbreg(hw, addr, MASKDWORD , data); 36362306a36Sopenharmony_ci 36462306a36Sopenharmony_ci udelay(1); 36562306a36Sopenharmony_ci} 36662306a36Sopenharmony_ci 36762306a36Sopenharmony_cistatic void _rtl92ee_phy_init_tx_power_by_rate(struct ieee80211_hw *hw) 36862306a36Sopenharmony_ci{ 36962306a36Sopenharmony_ci struct rtl_priv *rtlpriv = rtl_priv(hw); 37062306a36Sopenharmony_ci struct rtl_phy *rtlphy = &rtlpriv->phy; 37162306a36Sopenharmony_ci 37262306a36Sopenharmony_ci u8 band = BAND_ON_2_4G, rf = 0, txnum = 0, sec = 0; 37362306a36Sopenharmony_ci 37462306a36Sopenharmony_ci for (; band <= BAND_ON_5G; ++band) 37562306a36Sopenharmony_ci for (; rf < TX_PWR_BY_RATE_NUM_RF; ++rf) 37662306a36Sopenharmony_ci for (; txnum < TX_PWR_BY_RATE_NUM_RF; ++txnum) 37762306a36Sopenharmony_ci for (; sec < TX_PWR_BY_RATE_NUM_SECTION; ++sec) 37862306a36Sopenharmony_ci rtlphy->tx_power_by_rate_offset 37962306a36Sopenharmony_ci [band][rf][txnum][sec] = 0; 38062306a36Sopenharmony_ci} 38162306a36Sopenharmony_ci 38262306a36Sopenharmony_cistatic void _rtl92ee_phy_set_txpower_by_rate_base(struct ieee80211_hw *hw, 38362306a36Sopenharmony_ci u8 band, u8 path, 38462306a36Sopenharmony_ci u8 rate_section, u8 txnum, 38562306a36Sopenharmony_ci u8 value) 38662306a36Sopenharmony_ci{ 38762306a36Sopenharmony_ci struct rtl_priv *rtlpriv = rtl_priv(hw); 38862306a36Sopenharmony_ci struct rtl_phy *rtlphy = &rtlpriv->phy; 38962306a36Sopenharmony_ci 39062306a36Sopenharmony_ci if (path > RF90_PATH_D) { 39162306a36Sopenharmony_ci rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD, 39262306a36Sopenharmony_ci "Invalid Rf Path %d\n", path); 39362306a36Sopenharmony_ci return; 39462306a36Sopenharmony_ci } 39562306a36Sopenharmony_ci 39662306a36Sopenharmony_ci if (band == BAND_ON_2_4G) { 39762306a36Sopenharmony_ci switch (rate_section) { 39862306a36Sopenharmony_ci case CCK: 39962306a36Sopenharmony_ci rtlphy->txpwr_by_rate_base_24g[path][txnum][0] = value; 40062306a36Sopenharmony_ci break; 40162306a36Sopenharmony_ci case OFDM: 40262306a36Sopenharmony_ci rtlphy->txpwr_by_rate_base_24g[path][txnum][1] = value; 40362306a36Sopenharmony_ci break; 40462306a36Sopenharmony_ci case HT_MCS0_MCS7: 40562306a36Sopenharmony_ci rtlphy->txpwr_by_rate_base_24g[path][txnum][2] = value; 40662306a36Sopenharmony_ci break; 40762306a36Sopenharmony_ci case HT_MCS8_MCS15: 40862306a36Sopenharmony_ci rtlphy->txpwr_by_rate_base_24g[path][txnum][3] = value; 40962306a36Sopenharmony_ci break; 41062306a36Sopenharmony_ci default: 41162306a36Sopenharmony_ci rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD, 41262306a36Sopenharmony_ci "Invalid RateSection %d in 2.4G,Rf %d,%dTx\n", 41362306a36Sopenharmony_ci rate_section, path, txnum); 41462306a36Sopenharmony_ci break; 41562306a36Sopenharmony_ci } 41662306a36Sopenharmony_ci } else { 41762306a36Sopenharmony_ci rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD, 41862306a36Sopenharmony_ci "Invalid Band %d\n", band); 41962306a36Sopenharmony_ci } 42062306a36Sopenharmony_ci} 42162306a36Sopenharmony_ci 42262306a36Sopenharmony_cistatic u8 _rtl92ee_phy_get_txpower_by_rate_base(struct ieee80211_hw *hw, 42362306a36Sopenharmony_ci u8 band, u8 path, u8 txnum, 42462306a36Sopenharmony_ci u8 rate_section) 42562306a36Sopenharmony_ci{ 42662306a36Sopenharmony_ci struct rtl_priv *rtlpriv = rtl_priv(hw); 42762306a36Sopenharmony_ci struct rtl_phy *rtlphy = &rtlpriv->phy; 42862306a36Sopenharmony_ci u8 value = 0; 42962306a36Sopenharmony_ci 43062306a36Sopenharmony_ci if (path > RF90_PATH_D) { 43162306a36Sopenharmony_ci rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD, 43262306a36Sopenharmony_ci "Invalid Rf Path %d\n", path); 43362306a36Sopenharmony_ci return 0; 43462306a36Sopenharmony_ci } 43562306a36Sopenharmony_ci 43662306a36Sopenharmony_ci if (band == BAND_ON_2_4G) { 43762306a36Sopenharmony_ci switch (rate_section) { 43862306a36Sopenharmony_ci case CCK: 43962306a36Sopenharmony_ci value = rtlphy->txpwr_by_rate_base_24g[path][txnum][0]; 44062306a36Sopenharmony_ci break; 44162306a36Sopenharmony_ci case OFDM: 44262306a36Sopenharmony_ci value = rtlphy->txpwr_by_rate_base_24g[path][txnum][1]; 44362306a36Sopenharmony_ci break; 44462306a36Sopenharmony_ci case HT_MCS0_MCS7: 44562306a36Sopenharmony_ci value = rtlphy->txpwr_by_rate_base_24g[path][txnum][2]; 44662306a36Sopenharmony_ci break; 44762306a36Sopenharmony_ci case HT_MCS8_MCS15: 44862306a36Sopenharmony_ci value = rtlphy->txpwr_by_rate_base_24g[path][txnum][3]; 44962306a36Sopenharmony_ci break; 45062306a36Sopenharmony_ci default: 45162306a36Sopenharmony_ci rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD, 45262306a36Sopenharmony_ci "Invalid RateSection %d in 2.4G,Rf %d,%dTx\n", 45362306a36Sopenharmony_ci rate_section, path, txnum); 45462306a36Sopenharmony_ci break; 45562306a36Sopenharmony_ci } 45662306a36Sopenharmony_ci } else { 45762306a36Sopenharmony_ci rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD, 45862306a36Sopenharmony_ci "Invalid Band %d()\n", band); 45962306a36Sopenharmony_ci } 46062306a36Sopenharmony_ci return value; 46162306a36Sopenharmony_ci} 46262306a36Sopenharmony_ci 46362306a36Sopenharmony_cistatic void _rtl92ee_phy_store_txpower_by_rate_base(struct ieee80211_hw *hw) 46462306a36Sopenharmony_ci{ 46562306a36Sopenharmony_ci struct rtl_priv *rtlpriv = rtl_priv(hw); 46662306a36Sopenharmony_ci struct rtl_phy *rtlphy = &rtlpriv->phy; 46762306a36Sopenharmony_ci u16 raw = 0; 46862306a36Sopenharmony_ci u8 base = 0, path = 0; 46962306a36Sopenharmony_ci 47062306a36Sopenharmony_ci for (path = RF90_PATH_A; path <= RF90_PATH_B; ++path) { 47162306a36Sopenharmony_ci if (path == RF90_PATH_A) { 47262306a36Sopenharmony_ci raw = (u16)(rtlphy->tx_power_by_rate_offset 47362306a36Sopenharmony_ci [BAND_ON_2_4G][path][RF_1TX][3] >> 24) & 47462306a36Sopenharmony_ci 0xFF; 47562306a36Sopenharmony_ci base = (raw >> 4) * 10 + (raw & 0xF); 47662306a36Sopenharmony_ci _rtl92ee_phy_set_txpower_by_rate_base(hw, BAND_ON_2_4G, 47762306a36Sopenharmony_ci path, CCK, RF_1TX, 47862306a36Sopenharmony_ci base); 47962306a36Sopenharmony_ci } else if (path == RF90_PATH_B) { 48062306a36Sopenharmony_ci raw = (u16)(rtlphy->tx_power_by_rate_offset 48162306a36Sopenharmony_ci [BAND_ON_2_4G][path][RF_1TX][3] >> 0) & 48262306a36Sopenharmony_ci 0xFF; 48362306a36Sopenharmony_ci base = (raw >> 4) * 10 + (raw & 0xF); 48462306a36Sopenharmony_ci _rtl92ee_phy_set_txpower_by_rate_base(hw, BAND_ON_2_4G, 48562306a36Sopenharmony_ci path, CCK, RF_1TX, 48662306a36Sopenharmony_ci base); 48762306a36Sopenharmony_ci } 48862306a36Sopenharmony_ci raw = (u16)(rtlphy->tx_power_by_rate_offset 48962306a36Sopenharmony_ci [BAND_ON_2_4G][path][RF_1TX][1] >> 24) & 0xFF; 49062306a36Sopenharmony_ci base = (raw >> 4) * 10 + (raw & 0xF); 49162306a36Sopenharmony_ci _rtl92ee_phy_set_txpower_by_rate_base(hw, BAND_ON_2_4G, path, 49262306a36Sopenharmony_ci OFDM, RF_1TX, base); 49362306a36Sopenharmony_ci 49462306a36Sopenharmony_ci raw = (u16)(rtlphy->tx_power_by_rate_offset 49562306a36Sopenharmony_ci [BAND_ON_2_4G][path][RF_1TX][5] >> 24) & 0xFF; 49662306a36Sopenharmony_ci base = (raw >> 4) * 10 + (raw & 0xF); 49762306a36Sopenharmony_ci _rtl92ee_phy_set_txpower_by_rate_base(hw, BAND_ON_2_4G, path, 49862306a36Sopenharmony_ci HT_MCS0_MCS7, RF_1TX, 49962306a36Sopenharmony_ci base); 50062306a36Sopenharmony_ci 50162306a36Sopenharmony_ci raw = (u16)(rtlphy->tx_power_by_rate_offset 50262306a36Sopenharmony_ci [BAND_ON_2_4G][path][RF_2TX][7] >> 24) & 0xFF; 50362306a36Sopenharmony_ci base = (raw >> 4) * 10 + (raw & 0xF); 50462306a36Sopenharmony_ci _rtl92ee_phy_set_txpower_by_rate_base(hw, BAND_ON_2_4G, path, 50562306a36Sopenharmony_ci HT_MCS8_MCS15, RF_2TX, 50662306a36Sopenharmony_ci base); 50762306a36Sopenharmony_ci } 50862306a36Sopenharmony_ci} 50962306a36Sopenharmony_ci 51062306a36Sopenharmony_cistatic void _phy_convert_txpower_dbm_to_relative_value(u32 *data, u8 start, 51162306a36Sopenharmony_ci u8 end, u8 base) 51262306a36Sopenharmony_ci{ 51362306a36Sopenharmony_ci s8 i = 0; 51462306a36Sopenharmony_ci u8 tmp = 0; 51562306a36Sopenharmony_ci u32 temp_data = 0; 51662306a36Sopenharmony_ci 51762306a36Sopenharmony_ci for (i = 3; i >= 0; --i) { 51862306a36Sopenharmony_ci if (i >= start && i <= end) { 51962306a36Sopenharmony_ci /* Get the exact value */ 52062306a36Sopenharmony_ci tmp = (u8)(*data >> (i * 8)) & 0xF; 52162306a36Sopenharmony_ci tmp += ((u8)((*data >> (i * 8 + 4)) & 0xF)) * 10; 52262306a36Sopenharmony_ci 52362306a36Sopenharmony_ci /* Change the value to a relative value */ 52462306a36Sopenharmony_ci tmp = (tmp > base) ? tmp - base : base - tmp; 52562306a36Sopenharmony_ci } else { 52662306a36Sopenharmony_ci tmp = (u8)(*data >> (i * 8)) & 0xFF; 52762306a36Sopenharmony_ci } 52862306a36Sopenharmony_ci temp_data <<= 8; 52962306a36Sopenharmony_ci temp_data |= tmp; 53062306a36Sopenharmony_ci } 53162306a36Sopenharmony_ci *data = temp_data; 53262306a36Sopenharmony_ci} 53362306a36Sopenharmony_ci 53462306a36Sopenharmony_cistatic void phy_convert_txpwr_dbm_to_rel_val(struct ieee80211_hw *hw) 53562306a36Sopenharmony_ci{ 53662306a36Sopenharmony_ci struct rtl_priv *rtlpriv = rtl_priv(hw); 53762306a36Sopenharmony_ci struct rtl_phy *rtlphy = &rtlpriv->phy; 53862306a36Sopenharmony_ci u8 base = 0, rf = 0, band = BAND_ON_2_4G; 53962306a36Sopenharmony_ci 54062306a36Sopenharmony_ci for (rf = RF90_PATH_A; rf <= RF90_PATH_B; ++rf) { 54162306a36Sopenharmony_ci if (rf == RF90_PATH_A) { 54262306a36Sopenharmony_ci base = _rtl92ee_phy_get_txpower_by_rate_base(hw, band, 54362306a36Sopenharmony_ci rf, RF_1TX, 54462306a36Sopenharmony_ci CCK); 54562306a36Sopenharmony_ci _phy_convert_txpower_dbm_to_relative_value( 54662306a36Sopenharmony_ci &rtlphy->tx_power_by_rate_offset 54762306a36Sopenharmony_ci [band][rf][RF_1TX][2], 54862306a36Sopenharmony_ci 1, 1, base); 54962306a36Sopenharmony_ci _phy_convert_txpower_dbm_to_relative_value( 55062306a36Sopenharmony_ci &rtlphy->tx_power_by_rate_offset 55162306a36Sopenharmony_ci [band][rf][RF_1TX][3], 55262306a36Sopenharmony_ci 1, 3, base); 55362306a36Sopenharmony_ci } else if (rf == RF90_PATH_B) { 55462306a36Sopenharmony_ci base = _rtl92ee_phy_get_txpower_by_rate_base(hw, band, 55562306a36Sopenharmony_ci rf, RF_1TX, 55662306a36Sopenharmony_ci CCK); 55762306a36Sopenharmony_ci _phy_convert_txpower_dbm_to_relative_value( 55862306a36Sopenharmony_ci &rtlphy->tx_power_by_rate_offset 55962306a36Sopenharmony_ci [band][rf][RF_1TX][3], 56062306a36Sopenharmony_ci 0, 0, base); 56162306a36Sopenharmony_ci _phy_convert_txpower_dbm_to_relative_value( 56262306a36Sopenharmony_ci &rtlphy->tx_power_by_rate_offset 56362306a36Sopenharmony_ci [band][rf][RF_1TX][2], 56462306a36Sopenharmony_ci 1, 3, base); 56562306a36Sopenharmony_ci } 56662306a36Sopenharmony_ci base = _rtl92ee_phy_get_txpower_by_rate_base(hw, band, rf, 56762306a36Sopenharmony_ci RF_1TX, OFDM); 56862306a36Sopenharmony_ci _phy_convert_txpower_dbm_to_relative_value( 56962306a36Sopenharmony_ci &rtlphy->tx_power_by_rate_offset[band][rf][RF_1TX][0], 57062306a36Sopenharmony_ci 0, 3, base); 57162306a36Sopenharmony_ci _phy_convert_txpower_dbm_to_relative_value( 57262306a36Sopenharmony_ci &rtlphy->tx_power_by_rate_offset[band][rf][RF_1TX][1], 57362306a36Sopenharmony_ci 0, 3, base); 57462306a36Sopenharmony_ci 57562306a36Sopenharmony_ci base = _rtl92ee_phy_get_txpower_by_rate_base(hw, band, rf, 57662306a36Sopenharmony_ci RF_1TX, 57762306a36Sopenharmony_ci HT_MCS0_MCS7); 57862306a36Sopenharmony_ci _phy_convert_txpower_dbm_to_relative_value( 57962306a36Sopenharmony_ci &rtlphy->tx_power_by_rate_offset[band][rf][RF_1TX][4], 58062306a36Sopenharmony_ci 0, 3, base); 58162306a36Sopenharmony_ci _phy_convert_txpower_dbm_to_relative_value( 58262306a36Sopenharmony_ci &rtlphy->tx_power_by_rate_offset[band][rf][RF_1TX][5], 58362306a36Sopenharmony_ci 0, 3, base); 58462306a36Sopenharmony_ci 58562306a36Sopenharmony_ci base = _rtl92ee_phy_get_txpower_by_rate_base(hw, band, rf, 58662306a36Sopenharmony_ci RF_2TX, 58762306a36Sopenharmony_ci HT_MCS8_MCS15); 58862306a36Sopenharmony_ci _phy_convert_txpower_dbm_to_relative_value( 58962306a36Sopenharmony_ci &rtlphy->tx_power_by_rate_offset[band][rf][RF_2TX][6], 59062306a36Sopenharmony_ci 0, 3, base); 59162306a36Sopenharmony_ci 59262306a36Sopenharmony_ci _phy_convert_txpower_dbm_to_relative_value( 59362306a36Sopenharmony_ci &rtlphy->tx_power_by_rate_offset[band][rf][RF_2TX][7], 59462306a36Sopenharmony_ci 0, 3, base); 59562306a36Sopenharmony_ci } 59662306a36Sopenharmony_ci 59762306a36Sopenharmony_ci rtl_dbg(rtlpriv, COMP_POWER, DBG_TRACE, 59862306a36Sopenharmony_ci "<==%s\n", __func__); 59962306a36Sopenharmony_ci} 60062306a36Sopenharmony_ci 60162306a36Sopenharmony_cistatic void _rtl92ee_phy_txpower_by_rate_configuration(struct ieee80211_hw *hw) 60262306a36Sopenharmony_ci{ 60362306a36Sopenharmony_ci _rtl92ee_phy_store_txpower_by_rate_base(hw); 60462306a36Sopenharmony_ci phy_convert_txpwr_dbm_to_rel_val(hw); 60562306a36Sopenharmony_ci} 60662306a36Sopenharmony_ci 60762306a36Sopenharmony_cistatic bool _rtl92ee_phy_bb8192ee_config_parafile(struct ieee80211_hw *hw) 60862306a36Sopenharmony_ci{ 60962306a36Sopenharmony_ci struct rtl_priv *rtlpriv = rtl_priv(hw); 61062306a36Sopenharmony_ci struct rtl_phy *rtlphy = &rtlpriv->phy; 61162306a36Sopenharmony_ci struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw)); 61262306a36Sopenharmony_ci bool rtstatus; 61362306a36Sopenharmony_ci 61462306a36Sopenharmony_ci rtstatus = phy_config_bb_with_hdr_file(hw, BASEBAND_CONFIG_PHY_REG); 61562306a36Sopenharmony_ci if (!rtstatus) { 61662306a36Sopenharmony_ci pr_err("Write BB Reg Fail!!\n"); 61762306a36Sopenharmony_ci return false; 61862306a36Sopenharmony_ci } 61962306a36Sopenharmony_ci 62062306a36Sopenharmony_ci _rtl92ee_phy_init_tx_power_by_rate(hw); 62162306a36Sopenharmony_ci if (!rtlefuse->autoload_failflag) { 62262306a36Sopenharmony_ci rtlphy->pwrgroup_cnt = 0; 62362306a36Sopenharmony_ci rtstatus = 62462306a36Sopenharmony_ci phy_config_bb_with_pghdrfile(hw, BASEBAND_CONFIG_PHY_REG); 62562306a36Sopenharmony_ci } 62662306a36Sopenharmony_ci _rtl92ee_phy_txpower_by_rate_configuration(hw); 62762306a36Sopenharmony_ci if (!rtstatus) { 62862306a36Sopenharmony_ci pr_err("BB_PG Reg Fail!!\n"); 62962306a36Sopenharmony_ci return false; 63062306a36Sopenharmony_ci } 63162306a36Sopenharmony_ci rtstatus = phy_config_bb_with_hdr_file(hw, BASEBAND_CONFIG_AGC_TAB); 63262306a36Sopenharmony_ci if (!rtstatus) { 63362306a36Sopenharmony_ci pr_err("AGC Table Fail\n"); 63462306a36Sopenharmony_ci return false; 63562306a36Sopenharmony_ci } 63662306a36Sopenharmony_ci rtlphy->cck_high_power = (bool)(rtl_get_bbreg(hw, 63762306a36Sopenharmony_ci RFPGA0_XA_HSSIPARAMETER2, 63862306a36Sopenharmony_ci 0x200)); 63962306a36Sopenharmony_ci 64062306a36Sopenharmony_ci return true; 64162306a36Sopenharmony_ci} 64262306a36Sopenharmony_ci 64362306a36Sopenharmony_cistatic bool _rtl92ee_phy_config_mac_with_headerfile(struct ieee80211_hw *hw) 64462306a36Sopenharmony_ci{ 64562306a36Sopenharmony_ci struct rtl_priv *rtlpriv = rtl_priv(hw); 64662306a36Sopenharmony_ci u32 i; 64762306a36Sopenharmony_ci u32 arraylength; 64862306a36Sopenharmony_ci u32 *ptrarray; 64962306a36Sopenharmony_ci 65062306a36Sopenharmony_ci rtl_dbg(rtlpriv, COMP_INIT, DBG_TRACE, "Read Rtl8192EMACPHY_Array\n"); 65162306a36Sopenharmony_ci arraylength = RTL8192EE_MAC_ARRAY_LEN; 65262306a36Sopenharmony_ci ptrarray = RTL8192EE_MAC_ARRAY; 65362306a36Sopenharmony_ci rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD, 65462306a36Sopenharmony_ci "Img:RTL8192EE_MAC_ARRAY LEN %d\n", arraylength); 65562306a36Sopenharmony_ci for (i = 0; i < arraylength; i = i + 2) 65662306a36Sopenharmony_ci rtl_write_byte(rtlpriv, ptrarray[i], (u8)ptrarray[i + 1]); 65762306a36Sopenharmony_ci return true; 65862306a36Sopenharmony_ci} 65962306a36Sopenharmony_ci 66062306a36Sopenharmony_ci#define READ_NEXT_PAIR(v1, v2, i) \ 66162306a36Sopenharmony_ci do { \ 66262306a36Sopenharmony_ci i += 2; \ 66362306a36Sopenharmony_ci v1 = array[i]; \ 66462306a36Sopenharmony_ci v2 = array[i+1]; \ 66562306a36Sopenharmony_ci } while (0) 66662306a36Sopenharmony_ci 66762306a36Sopenharmony_cistatic bool phy_config_bb_with_hdr_file(struct ieee80211_hw *hw, 66862306a36Sopenharmony_ci u8 configtype) 66962306a36Sopenharmony_ci{ 67062306a36Sopenharmony_ci int i; 67162306a36Sopenharmony_ci u32 *array; 67262306a36Sopenharmony_ci u16 len; 67362306a36Sopenharmony_ci struct rtl_priv *rtlpriv = rtl_priv(hw); 67462306a36Sopenharmony_ci u32 v1 = 0, v2 = 0; 67562306a36Sopenharmony_ci 67662306a36Sopenharmony_ci if (configtype == BASEBAND_CONFIG_PHY_REG) { 67762306a36Sopenharmony_ci len = RTL8192EE_PHY_REG_ARRAY_LEN; 67862306a36Sopenharmony_ci array = RTL8192EE_PHY_REG_ARRAY; 67962306a36Sopenharmony_ci 68062306a36Sopenharmony_ci for (i = 0; i < len; i = i + 2) { 68162306a36Sopenharmony_ci v1 = array[i]; 68262306a36Sopenharmony_ci v2 = array[i+1]; 68362306a36Sopenharmony_ci if (v1 < 0xcdcdcdcd) { 68462306a36Sopenharmony_ci _rtl92ee_config_bb_reg(hw, v1, v2); 68562306a36Sopenharmony_ci } else {/*This line is the start line of branch.*/ 68662306a36Sopenharmony_ci /* to protect READ_NEXT_PAIR not overrun */ 68762306a36Sopenharmony_ci if (i >= len - 2) 68862306a36Sopenharmony_ci break; 68962306a36Sopenharmony_ci 69062306a36Sopenharmony_ci if (!_check_condition(hw , array[i])) { 69162306a36Sopenharmony_ci /*Discard the following pairs*/ 69262306a36Sopenharmony_ci READ_NEXT_PAIR(v1, v2, i); 69362306a36Sopenharmony_ci while (v2 != 0xDEAD && 69462306a36Sopenharmony_ci v2 != 0xCDEF && 69562306a36Sopenharmony_ci v2 != 0xCDCD && i < len - 2) { 69662306a36Sopenharmony_ci READ_NEXT_PAIR(v1, v2, i); 69762306a36Sopenharmony_ci } 69862306a36Sopenharmony_ci i -= 2; /* prevent from for-loop += 2*/ 69962306a36Sopenharmony_ci } else { 70062306a36Sopenharmony_ci /* Configure matched pairs and 70162306a36Sopenharmony_ci * skip to end of if-else. 70262306a36Sopenharmony_ci */ 70362306a36Sopenharmony_ci READ_NEXT_PAIR(v1, v2, i); 70462306a36Sopenharmony_ci while (v2 != 0xDEAD && 70562306a36Sopenharmony_ci v2 != 0xCDEF && 70662306a36Sopenharmony_ci v2 != 0xCDCD && i < len - 2) { 70762306a36Sopenharmony_ci _rtl92ee_config_bb_reg(hw, v1, 70862306a36Sopenharmony_ci v2); 70962306a36Sopenharmony_ci READ_NEXT_PAIR(v1, v2, i); 71062306a36Sopenharmony_ci } 71162306a36Sopenharmony_ci 71262306a36Sopenharmony_ci while (v2 != 0xDEAD && i < len - 2) 71362306a36Sopenharmony_ci READ_NEXT_PAIR(v1, v2, i); 71462306a36Sopenharmony_ci } 71562306a36Sopenharmony_ci } 71662306a36Sopenharmony_ci } 71762306a36Sopenharmony_ci } else if (configtype == BASEBAND_CONFIG_AGC_TAB) { 71862306a36Sopenharmony_ci len = RTL8192EE_AGC_TAB_ARRAY_LEN; 71962306a36Sopenharmony_ci array = RTL8192EE_AGC_TAB_ARRAY; 72062306a36Sopenharmony_ci 72162306a36Sopenharmony_ci for (i = 0; i < len; i = i + 2) { 72262306a36Sopenharmony_ci v1 = array[i]; 72362306a36Sopenharmony_ci v2 = array[i+1]; 72462306a36Sopenharmony_ci if (v1 < 0xCDCDCDCD) { 72562306a36Sopenharmony_ci rtl_set_bbreg(hw, array[i], MASKDWORD, 72662306a36Sopenharmony_ci array[i + 1]); 72762306a36Sopenharmony_ci udelay(1); 72862306a36Sopenharmony_ci continue; 72962306a36Sopenharmony_ci } else{/*This line is the start line of branch.*/ 73062306a36Sopenharmony_ci /* to protect READ_NEXT_PAIR not overrun */ 73162306a36Sopenharmony_ci if (i >= len - 2) 73262306a36Sopenharmony_ci break; 73362306a36Sopenharmony_ci 73462306a36Sopenharmony_ci if (!_check_condition(hw , array[i])) { 73562306a36Sopenharmony_ci /*Discard the following pairs*/ 73662306a36Sopenharmony_ci READ_NEXT_PAIR(v1, v2, i); 73762306a36Sopenharmony_ci while (v2 != 0xDEAD && 73862306a36Sopenharmony_ci v2 != 0xCDEF && 73962306a36Sopenharmony_ci v2 != 0xCDCD && 74062306a36Sopenharmony_ci i < len - 2) { 74162306a36Sopenharmony_ci READ_NEXT_PAIR(v1, v2, i); 74262306a36Sopenharmony_ci } 74362306a36Sopenharmony_ci i -= 2; /* prevent from for-loop += 2*/ 74462306a36Sopenharmony_ci } else { 74562306a36Sopenharmony_ci /* Configure matched pairs and 74662306a36Sopenharmony_ci * skip to end of if-else. 74762306a36Sopenharmony_ci */ 74862306a36Sopenharmony_ci READ_NEXT_PAIR(v1, v2, i); 74962306a36Sopenharmony_ci while (v2 != 0xDEAD && 75062306a36Sopenharmony_ci v2 != 0xCDEF && 75162306a36Sopenharmony_ci v2 != 0xCDCD && 75262306a36Sopenharmony_ci i < len - 2) { 75362306a36Sopenharmony_ci rtl_set_bbreg(hw, 75462306a36Sopenharmony_ci array[i], 75562306a36Sopenharmony_ci MASKDWORD, 75662306a36Sopenharmony_ci array[i + 1]); 75762306a36Sopenharmony_ci udelay(1); 75862306a36Sopenharmony_ci READ_NEXT_PAIR(v1 , v2 , i); 75962306a36Sopenharmony_ci } 76062306a36Sopenharmony_ci 76162306a36Sopenharmony_ci while (v2 != 0xDEAD && 76262306a36Sopenharmony_ci i < len - 2) { 76362306a36Sopenharmony_ci READ_NEXT_PAIR(v1 , v2 , i); 76462306a36Sopenharmony_ci } 76562306a36Sopenharmony_ci } 76662306a36Sopenharmony_ci } 76762306a36Sopenharmony_ci rtl_dbg(rtlpriv, COMP_INIT, DBG_TRACE, 76862306a36Sopenharmony_ci "The agctab_array_table[0] is %x Rtl818EEPHY_REGArray[1] is %x\n", 76962306a36Sopenharmony_ci array[i], 77062306a36Sopenharmony_ci array[i + 1]); 77162306a36Sopenharmony_ci } 77262306a36Sopenharmony_ci } 77362306a36Sopenharmony_ci return true; 77462306a36Sopenharmony_ci} 77562306a36Sopenharmony_ci 77662306a36Sopenharmony_cistatic u8 _rtl92ee_get_rate_section_index(u32 regaddr) 77762306a36Sopenharmony_ci{ 77862306a36Sopenharmony_ci u8 index = 0; 77962306a36Sopenharmony_ci 78062306a36Sopenharmony_ci switch (regaddr) { 78162306a36Sopenharmony_ci case RTXAGC_A_RATE18_06: 78262306a36Sopenharmony_ci case RTXAGC_B_RATE18_06: 78362306a36Sopenharmony_ci index = 0; 78462306a36Sopenharmony_ci break; 78562306a36Sopenharmony_ci case RTXAGC_A_RATE54_24: 78662306a36Sopenharmony_ci case RTXAGC_B_RATE54_24: 78762306a36Sopenharmony_ci index = 1; 78862306a36Sopenharmony_ci break; 78962306a36Sopenharmony_ci case RTXAGC_A_CCK1_MCS32: 79062306a36Sopenharmony_ci case RTXAGC_B_CCK1_55_MCS32: 79162306a36Sopenharmony_ci index = 2; 79262306a36Sopenharmony_ci break; 79362306a36Sopenharmony_ci case RTXAGC_B_CCK11_A_CCK2_11: 79462306a36Sopenharmony_ci index = 3; 79562306a36Sopenharmony_ci break; 79662306a36Sopenharmony_ci case RTXAGC_A_MCS03_MCS00: 79762306a36Sopenharmony_ci case RTXAGC_B_MCS03_MCS00: 79862306a36Sopenharmony_ci index = 4; 79962306a36Sopenharmony_ci break; 80062306a36Sopenharmony_ci case RTXAGC_A_MCS07_MCS04: 80162306a36Sopenharmony_ci case RTXAGC_B_MCS07_MCS04: 80262306a36Sopenharmony_ci index = 5; 80362306a36Sopenharmony_ci break; 80462306a36Sopenharmony_ci case RTXAGC_A_MCS11_MCS08: 80562306a36Sopenharmony_ci case RTXAGC_B_MCS11_MCS08: 80662306a36Sopenharmony_ci index = 6; 80762306a36Sopenharmony_ci break; 80862306a36Sopenharmony_ci case RTXAGC_A_MCS15_MCS12: 80962306a36Sopenharmony_ci case RTXAGC_B_MCS15_MCS12: 81062306a36Sopenharmony_ci index = 7; 81162306a36Sopenharmony_ci break; 81262306a36Sopenharmony_ci default: 81362306a36Sopenharmony_ci regaddr &= 0xFFF; 81462306a36Sopenharmony_ci if (regaddr >= 0xC20 && regaddr <= 0xC4C) 81562306a36Sopenharmony_ci index = (u8)((regaddr - 0xC20) / 4); 81662306a36Sopenharmony_ci else if (regaddr >= 0xE20 && regaddr <= 0xE4C) 81762306a36Sopenharmony_ci index = (u8)((regaddr - 0xE20) / 4); 81862306a36Sopenharmony_ci break; 81962306a36Sopenharmony_ci } 82062306a36Sopenharmony_ci return index; 82162306a36Sopenharmony_ci} 82262306a36Sopenharmony_ci 82362306a36Sopenharmony_cistatic void _rtl92ee_store_tx_power_by_rate(struct ieee80211_hw *hw, 82462306a36Sopenharmony_ci enum band_type band, 82562306a36Sopenharmony_ci enum radio_path rfpath, 82662306a36Sopenharmony_ci u32 txnum, u32 regaddr, 82762306a36Sopenharmony_ci u32 bitmask, u32 data) 82862306a36Sopenharmony_ci{ 82962306a36Sopenharmony_ci struct rtl_priv *rtlpriv = rtl_priv(hw); 83062306a36Sopenharmony_ci struct rtl_phy *rtlphy = &rtlpriv->phy; 83162306a36Sopenharmony_ci u8 section = _rtl92ee_get_rate_section_index(regaddr); 83262306a36Sopenharmony_ci 83362306a36Sopenharmony_ci if (band != BAND_ON_2_4G && band != BAND_ON_5G) { 83462306a36Sopenharmony_ci rtl_dbg(rtlpriv, FPHY, PHY_TXPWR, "Invalid Band %d\n", band); 83562306a36Sopenharmony_ci return; 83662306a36Sopenharmony_ci } 83762306a36Sopenharmony_ci 83862306a36Sopenharmony_ci if (rfpath > MAX_RF_PATH - 1) { 83962306a36Sopenharmony_ci rtl_dbg(rtlpriv, FPHY, PHY_TXPWR, 84062306a36Sopenharmony_ci "Invalid RfPath %d\n", rfpath); 84162306a36Sopenharmony_ci return; 84262306a36Sopenharmony_ci } 84362306a36Sopenharmony_ci if (txnum > MAX_RF_PATH - 1) { 84462306a36Sopenharmony_ci rtl_dbg(rtlpriv, FPHY, PHY_TXPWR, "Invalid TxNum %d\n", txnum); 84562306a36Sopenharmony_ci return; 84662306a36Sopenharmony_ci } 84762306a36Sopenharmony_ci 84862306a36Sopenharmony_ci rtlphy->tx_power_by_rate_offset[band][rfpath][txnum][section] = data; 84962306a36Sopenharmony_ci} 85062306a36Sopenharmony_ci 85162306a36Sopenharmony_cistatic bool phy_config_bb_with_pghdrfile(struct ieee80211_hw *hw, 85262306a36Sopenharmony_ci u8 configtype) 85362306a36Sopenharmony_ci{ 85462306a36Sopenharmony_ci struct rtl_priv *rtlpriv = rtl_priv(hw); 85562306a36Sopenharmony_ci int i; 85662306a36Sopenharmony_ci u32 *phy_regarray_table_pg; 85762306a36Sopenharmony_ci u16 phy_regarray_pg_len; 85862306a36Sopenharmony_ci u32 v1 = 0, v2 = 0, v3 = 0, v4 = 0, v5 = 0, v6 = 0; 85962306a36Sopenharmony_ci 86062306a36Sopenharmony_ci phy_regarray_pg_len = RTL8192EE_PHY_REG_ARRAY_PG_LEN; 86162306a36Sopenharmony_ci phy_regarray_table_pg = RTL8192EE_PHY_REG_ARRAY_PG; 86262306a36Sopenharmony_ci 86362306a36Sopenharmony_ci if (configtype == BASEBAND_CONFIG_PHY_REG) { 86462306a36Sopenharmony_ci for (i = 0; i < phy_regarray_pg_len; i = i + 6) { 86562306a36Sopenharmony_ci v1 = phy_regarray_table_pg[i]; 86662306a36Sopenharmony_ci v2 = phy_regarray_table_pg[i+1]; 86762306a36Sopenharmony_ci v3 = phy_regarray_table_pg[i+2]; 86862306a36Sopenharmony_ci v4 = phy_regarray_table_pg[i+3]; 86962306a36Sopenharmony_ci v5 = phy_regarray_table_pg[i+4]; 87062306a36Sopenharmony_ci v6 = phy_regarray_table_pg[i+5]; 87162306a36Sopenharmony_ci 87262306a36Sopenharmony_ci if (v1 < 0xcdcdcdcd) { 87362306a36Sopenharmony_ci _rtl92ee_store_tx_power_by_rate(hw, v1, v2, v3, 87462306a36Sopenharmony_ci v4, v5, v6); 87562306a36Sopenharmony_ci continue; 87662306a36Sopenharmony_ci } 87762306a36Sopenharmony_ci } 87862306a36Sopenharmony_ci } else { 87962306a36Sopenharmony_ci rtl_dbg(rtlpriv, COMP_SEND, DBG_TRACE, 88062306a36Sopenharmony_ci "configtype != BaseBand_Config_PHY_REG\n"); 88162306a36Sopenharmony_ci } 88262306a36Sopenharmony_ci return true; 88362306a36Sopenharmony_ci} 88462306a36Sopenharmony_ci 88562306a36Sopenharmony_ci#define READ_NEXT_RF_PAIR(v1, v2, i) \ 88662306a36Sopenharmony_ci do { \ 88762306a36Sopenharmony_ci i += 2; \ 88862306a36Sopenharmony_ci v1 = array[i]; \ 88962306a36Sopenharmony_ci v2 = array[i+1]; \ 89062306a36Sopenharmony_ci } while (0) 89162306a36Sopenharmony_ci 89262306a36Sopenharmony_cibool rtl92ee_phy_config_rf_with_headerfile(struct ieee80211_hw *hw, 89362306a36Sopenharmony_ci enum radio_path rfpath) 89462306a36Sopenharmony_ci{ 89562306a36Sopenharmony_ci struct rtl_priv *rtlpriv = rtl_priv(hw); 89662306a36Sopenharmony_ci int i; 89762306a36Sopenharmony_ci u32 *array; 89862306a36Sopenharmony_ci u16 len; 89962306a36Sopenharmony_ci u32 v1 = 0, v2 = 0; 90062306a36Sopenharmony_ci 90162306a36Sopenharmony_ci switch (rfpath) { 90262306a36Sopenharmony_ci case RF90_PATH_A: 90362306a36Sopenharmony_ci len = RTL8192EE_RADIOA_ARRAY_LEN; 90462306a36Sopenharmony_ci array = RTL8192EE_RADIOA_ARRAY; 90562306a36Sopenharmony_ci rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD, 90662306a36Sopenharmony_ci "Radio_A:RTL8192EE_RADIOA_ARRAY %d\n", len); 90762306a36Sopenharmony_ci rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD, "Radio No %x\n", rfpath); 90862306a36Sopenharmony_ci for (i = 0; i < len; i = i + 2) { 90962306a36Sopenharmony_ci v1 = array[i]; 91062306a36Sopenharmony_ci v2 = array[i+1]; 91162306a36Sopenharmony_ci if (v1 < 0xcdcdcdcd) { 91262306a36Sopenharmony_ci _rtl92ee_config_rf_radio_a(hw, v1, v2); 91362306a36Sopenharmony_ci continue; 91462306a36Sopenharmony_ci } else {/*This line is the start line of branch.*/ 91562306a36Sopenharmony_ci /* to protect READ_NEXT_PAIR not overrun */ 91662306a36Sopenharmony_ci if (i >= len - 2) 91762306a36Sopenharmony_ci break; 91862306a36Sopenharmony_ci 91962306a36Sopenharmony_ci if (!_check_condition(hw , array[i])) { 92062306a36Sopenharmony_ci /*Discard the following pairs*/ 92162306a36Sopenharmony_ci READ_NEXT_RF_PAIR(v1, v2, i); 92262306a36Sopenharmony_ci while (v2 != 0xDEAD && 92362306a36Sopenharmony_ci v2 != 0xCDEF && 92462306a36Sopenharmony_ci v2 != 0xCDCD && i < len - 2) { 92562306a36Sopenharmony_ci READ_NEXT_RF_PAIR(v1, v2, i); 92662306a36Sopenharmony_ci } 92762306a36Sopenharmony_ci i -= 2; /* prevent from for-loop += 2*/ 92862306a36Sopenharmony_ci } else { 92962306a36Sopenharmony_ci /* Configure matched pairs and 93062306a36Sopenharmony_ci * skip to end of if-else. 93162306a36Sopenharmony_ci */ 93262306a36Sopenharmony_ci READ_NEXT_RF_PAIR(v1, v2, i); 93362306a36Sopenharmony_ci while (v2 != 0xDEAD && 93462306a36Sopenharmony_ci v2 != 0xCDEF && 93562306a36Sopenharmony_ci v2 != 0xCDCD && i < len - 2) { 93662306a36Sopenharmony_ci _rtl92ee_config_rf_radio_a(hw, 93762306a36Sopenharmony_ci v1, 93862306a36Sopenharmony_ci v2); 93962306a36Sopenharmony_ci READ_NEXT_RF_PAIR(v1, v2, i); 94062306a36Sopenharmony_ci } 94162306a36Sopenharmony_ci 94262306a36Sopenharmony_ci while (v2 != 0xDEAD && i < len - 2) 94362306a36Sopenharmony_ci READ_NEXT_RF_PAIR(v1, v2, i); 94462306a36Sopenharmony_ci } 94562306a36Sopenharmony_ci } 94662306a36Sopenharmony_ci } 94762306a36Sopenharmony_ci break; 94862306a36Sopenharmony_ci 94962306a36Sopenharmony_ci case RF90_PATH_B: 95062306a36Sopenharmony_ci len = RTL8192EE_RADIOB_ARRAY_LEN; 95162306a36Sopenharmony_ci array = RTL8192EE_RADIOB_ARRAY; 95262306a36Sopenharmony_ci rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD, 95362306a36Sopenharmony_ci "Radio_A:RTL8192EE_RADIOB_ARRAY %d\n", len); 95462306a36Sopenharmony_ci rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD, "Radio No %x\n", rfpath); 95562306a36Sopenharmony_ci for (i = 0; i < len; i = i + 2) { 95662306a36Sopenharmony_ci v1 = array[i]; 95762306a36Sopenharmony_ci v2 = array[i+1]; 95862306a36Sopenharmony_ci if (v1 < 0xcdcdcdcd) { 95962306a36Sopenharmony_ci _rtl92ee_config_rf_radio_b(hw, v1, v2); 96062306a36Sopenharmony_ci continue; 96162306a36Sopenharmony_ci } else {/*This line is the start line of branch.*/ 96262306a36Sopenharmony_ci /* to protect READ_NEXT_PAIR not overrun */ 96362306a36Sopenharmony_ci if (i >= len - 2) 96462306a36Sopenharmony_ci break; 96562306a36Sopenharmony_ci 96662306a36Sopenharmony_ci if (!_check_condition(hw , array[i])) { 96762306a36Sopenharmony_ci /*Discard the following pairs*/ 96862306a36Sopenharmony_ci READ_NEXT_RF_PAIR(v1, v2, i); 96962306a36Sopenharmony_ci while (v2 != 0xDEAD && 97062306a36Sopenharmony_ci v2 != 0xCDEF && 97162306a36Sopenharmony_ci v2 != 0xCDCD && i < len - 2) { 97262306a36Sopenharmony_ci READ_NEXT_RF_PAIR(v1, v2, i); 97362306a36Sopenharmony_ci } 97462306a36Sopenharmony_ci i -= 2; /* prevent from for-loop += 2*/ 97562306a36Sopenharmony_ci } else { 97662306a36Sopenharmony_ci /* Configure matched pairs and 97762306a36Sopenharmony_ci * skip to end of if-else. 97862306a36Sopenharmony_ci */ 97962306a36Sopenharmony_ci READ_NEXT_RF_PAIR(v1, v2, i); 98062306a36Sopenharmony_ci while (v2 != 0xDEAD && 98162306a36Sopenharmony_ci v2 != 0xCDEF && 98262306a36Sopenharmony_ci v2 != 0xCDCD && i < len - 2) { 98362306a36Sopenharmony_ci _rtl92ee_config_rf_radio_b(hw, 98462306a36Sopenharmony_ci v1, 98562306a36Sopenharmony_ci v2); 98662306a36Sopenharmony_ci READ_NEXT_RF_PAIR(v1, v2, i); 98762306a36Sopenharmony_ci } 98862306a36Sopenharmony_ci 98962306a36Sopenharmony_ci while (v2 != 0xDEAD && i < len - 2) 99062306a36Sopenharmony_ci READ_NEXT_RF_PAIR(v1, v2, i); 99162306a36Sopenharmony_ci } 99262306a36Sopenharmony_ci } 99362306a36Sopenharmony_ci } 99462306a36Sopenharmony_ci break; 99562306a36Sopenharmony_ci case RF90_PATH_C: 99662306a36Sopenharmony_ci case RF90_PATH_D: 99762306a36Sopenharmony_ci break; 99862306a36Sopenharmony_ci } 99962306a36Sopenharmony_ci return true; 100062306a36Sopenharmony_ci} 100162306a36Sopenharmony_ci 100262306a36Sopenharmony_civoid rtl92ee_phy_get_hw_reg_originalvalue(struct ieee80211_hw *hw) 100362306a36Sopenharmony_ci{ 100462306a36Sopenharmony_ci struct rtl_priv *rtlpriv = rtl_priv(hw); 100562306a36Sopenharmony_ci struct rtl_phy *rtlphy = &rtlpriv->phy; 100662306a36Sopenharmony_ci 100762306a36Sopenharmony_ci rtlphy->default_initialgain[0] = 100862306a36Sopenharmony_ci (u8)rtl_get_bbreg(hw, ROFDM0_XAAGCCORE1, MASKBYTE0); 100962306a36Sopenharmony_ci rtlphy->default_initialgain[1] = 101062306a36Sopenharmony_ci (u8)rtl_get_bbreg(hw, ROFDM0_XBAGCCORE1, MASKBYTE0); 101162306a36Sopenharmony_ci rtlphy->default_initialgain[2] = 101262306a36Sopenharmony_ci (u8)rtl_get_bbreg(hw, ROFDM0_XCAGCCORE1, MASKBYTE0); 101362306a36Sopenharmony_ci rtlphy->default_initialgain[3] = 101462306a36Sopenharmony_ci (u8)rtl_get_bbreg(hw, ROFDM0_XDAGCCORE1, MASKBYTE0); 101562306a36Sopenharmony_ci 101662306a36Sopenharmony_ci rtl_dbg(rtlpriv, COMP_INIT, DBG_TRACE, 101762306a36Sopenharmony_ci "Default initial gain (c50=0x%x, c58=0x%x, c60=0x%x, c68=0x%x\n", 101862306a36Sopenharmony_ci rtlphy->default_initialgain[0], 101962306a36Sopenharmony_ci rtlphy->default_initialgain[1], 102062306a36Sopenharmony_ci rtlphy->default_initialgain[2], 102162306a36Sopenharmony_ci rtlphy->default_initialgain[3]); 102262306a36Sopenharmony_ci 102362306a36Sopenharmony_ci rtlphy->framesync = (u8)rtl_get_bbreg(hw, 102462306a36Sopenharmony_ci ROFDM0_RXDETECTOR3, MASKBYTE0); 102562306a36Sopenharmony_ci rtlphy->framesync_c34 = rtl_get_bbreg(hw, 102662306a36Sopenharmony_ci ROFDM0_RXDETECTOR2, MASKDWORD); 102762306a36Sopenharmony_ci 102862306a36Sopenharmony_ci rtl_dbg(rtlpriv, COMP_INIT, DBG_TRACE, 102962306a36Sopenharmony_ci "Default framesync (0x%x) = 0x%x\n", 103062306a36Sopenharmony_ci ROFDM0_RXDETECTOR3, rtlphy->framesync); 103162306a36Sopenharmony_ci} 103262306a36Sopenharmony_ci 103362306a36Sopenharmony_cistatic void phy_init_bb_rf_register_def(struct ieee80211_hw *hw) 103462306a36Sopenharmony_ci{ 103562306a36Sopenharmony_ci struct rtl_priv *rtlpriv = rtl_priv(hw); 103662306a36Sopenharmony_ci struct rtl_phy *rtlphy = &rtlpriv->phy; 103762306a36Sopenharmony_ci 103862306a36Sopenharmony_ci rtlphy->phyreg_def[RF90_PATH_A].rfintfs = RFPGA0_XAB_RFINTERFACESW; 103962306a36Sopenharmony_ci rtlphy->phyreg_def[RF90_PATH_B].rfintfs = RFPGA0_XAB_RFINTERFACESW; 104062306a36Sopenharmony_ci 104162306a36Sopenharmony_ci rtlphy->phyreg_def[RF90_PATH_A].rfintfo = RFPGA0_XA_RFINTERFACEOE; 104262306a36Sopenharmony_ci rtlphy->phyreg_def[RF90_PATH_B].rfintfo = RFPGA0_XB_RFINTERFACEOE; 104362306a36Sopenharmony_ci 104462306a36Sopenharmony_ci rtlphy->phyreg_def[RF90_PATH_A].rfintfe = RFPGA0_XA_RFINTERFACEOE; 104562306a36Sopenharmony_ci rtlphy->phyreg_def[RF90_PATH_B].rfintfe = RFPGA0_XB_RFINTERFACEOE; 104662306a36Sopenharmony_ci 104762306a36Sopenharmony_ci rtlphy->phyreg_def[RF90_PATH_A].rf3wire_offset = 104862306a36Sopenharmony_ci RFPGA0_XA_LSSIPARAMETER; 104962306a36Sopenharmony_ci rtlphy->phyreg_def[RF90_PATH_B].rf3wire_offset = 105062306a36Sopenharmony_ci RFPGA0_XB_LSSIPARAMETER; 105162306a36Sopenharmony_ci 105262306a36Sopenharmony_ci rtlphy->phyreg_def[RF90_PATH_A].rfhssi_para2 = RFPGA0_XA_HSSIPARAMETER2; 105362306a36Sopenharmony_ci rtlphy->phyreg_def[RF90_PATH_B].rfhssi_para2 = RFPGA0_XB_HSSIPARAMETER2; 105462306a36Sopenharmony_ci 105562306a36Sopenharmony_ci rtlphy->phyreg_def[RF90_PATH_A].rf_rb = RFPGA0_XA_LSSIREADBACK; 105662306a36Sopenharmony_ci rtlphy->phyreg_def[RF90_PATH_B].rf_rb = RFPGA0_XB_LSSIREADBACK; 105762306a36Sopenharmony_ci 105862306a36Sopenharmony_ci rtlphy->phyreg_def[RF90_PATH_A].rf_rbpi = TRANSCEIVEA_HSPI_READBACK; 105962306a36Sopenharmony_ci rtlphy->phyreg_def[RF90_PATH_B].rf_rbpi = TRANSCEIVEB_HSPI_READBACK; 106062306a36Sopenharmony_ci} 106162306a36Sopenharmony_ci 106262306a36Sopenharmony_civoid rtl92ee_phy_get_txpower_level(struct ieee80211_hw *hw, long *powerlevel) 106362306a36Sopenharmony_ci{ 106462306a36Sopenharmony_ci struct rtl_priv *rtlpriv = rtl_priv(hw); 106562306a36Sopenharmony_ci struct rtl_phy *rtlphy = &rtlpriv->phy; 106662306a36Sopenharmony_ci u8 txpwr_level; 106762306a36Sopenharmony_ci long txpwr_dbm; 106862306a36Sopenharmony_ci 106962306a36Sopenharmony_ci txpwr_level = rtlphy->cur_cck_txpwridx; 107062306a36Sopenharmony_ci txpwr_dbm = _rtl92ee_phy_txpwr_idx_to_dbm(hw, WIRELESS_MODE_B, 107162306a36Sopenharmony_ci txpwr_level); 107262306a36Sopenharmony_ci txpwr_level = rtlphy->cur_ofdm24g_txpwridx; 107362306a36Sopenharmony_ci if (_rtl92ee_phy_txpwr_idx_to_dbm(hw, WIRELESS_MODE_G, txpwr_level) > 107462306a36Sopenharmony_ci txpwr_dbm) 107562306a36Sopenharmony_ci txpwr_dbm = _rtl92ee_phy_txpwr_idx_to_dbm(hw, WIRELESS_MODE_G, 107662306a36Sopenharmony_ci txpwr_level); 107762306a36Sopenharmony_ci txpwr_level = rtlphy->cur_ofdm24g_txpwridx; 107862306a36Sopenharmony_ci if (_rtl92ee_phy_txpwr_idx_to_dbm(hw, WIRELESS_MODE_N_24G, 107962306a36Sopenharmony_ci txpwr_level) > txpwr_dbm) 108062306a36Sopenharmony_ci txpwr_dbm = _rtl92ee_phy_txpwr_idx_to_dbm(hw, 108162306a36Sopenharmony_ci WIRELESS_MODE_N_24G, 108262306a36Sopenharmony_ci txpwr_level); 108362306a36Sopenharmony_ci *powerlevel = txpwr_dbm; 108462306a36Sopenharmony_ci} 108562306a36Sopenharmony_ci 108662306a36Sopenharmony_cistatic u8 _rtl92ee_phy_get_ratesection_intxpower_byrate(enum radio_path path, 108762306a36Sopenharmony_ci u8 rate) 108862306a36Sopenharmony_ci{ 108962306a36Sopenharmony_ci u8 rate_section = 0; 109062306a36Sopenharmony_ci 109162306a36Sopenharmony_ci switch (rate) { 109262306a36Sopenharmony_ci case DESC92C_RATE1M: 109362306a36Sopenharmony_ci rate_section = 2; 109462306a36Sopenharmony_ci break; 109562306a36Sopenharmony_ci case DESC92C_RATE2M: 109662306a36Sopenharmony_ci case DESC92C_RATE5_5M: 109762306a36Sopenharmony_ci if (path == RF90_PATH_A) 109862306a36Sopenharmony_ci rate_section = 3; 109962306a36Sopenharmony_ci else if (path == RF90_PATH_B) 110062306a36Sopenharmony_ci rate_section = 2; 110162306a36Sopenharmony_ci break; 110262306a36Sopenharmony_ci case DESC92C_RATE11M: 110362306a36Sopenharmony_ci rate_section = 3; 110462306a36Sopenharmony_ci break; 110562306a36Sopenharmony_ci case DESC92C_RATE6M: 110662306a36Sopenharmony_ci case DESC92C_RATE9M: 110762306a36Sopenharmony_ci case DESC92C_RATE12M: 110862306a36Sopenharmony_ci case DESC92C_RATE18M: 110962306a36Sopenharmony_ci rate_section = 0; 111062306a36Sopenharmony_ci break; 111162306a36Sopenharmony_ci case DESC92C_RATE24M: 111262306a36Sopenharmony_ci case DESC92C_RATE36M: 111362306a36Sopenharmony_ci case DESC92C_RATE48M: 111462306a36Sopenharmony_ci case DESC92C_RATE54M: 111562306a36Sopenharmony_ci rate_section = 1; 111662306a36Sopenharmony_ci break; 111762306a36Sopenharmony_ci case DESC92C_RATEMCS0: 111862306a36Sopenharmony_ci case DESC92C_RATEMCS1: 111962306a36Sopenharmony_ci case DESC92C_RATEMCS2: 112062306a36Sopenharmony_ci case DESC92C_RATEMCS3: 112162306a36Sopenharmony_ci rate_section = 4; 112262306a36Sopenharmony_ci break; 112362306a36Sopenharmony_ci case DESC92C_RATEMCS4: 112462306a36Sopenharmony_ci case DESC92C_RATEMCS5: 112562306a36Sopenharmony_ci case DESC92C_RATEMCS6: 112662306a36Sopenharmony_ci case DESC92C_RATEMCS7: 112762306a36Sopenharmony_ci rate_section = 5; 112862306a36Sopenharmony_ci break; 112962306a36Sopenharmony_ci case DESC92C_RATEMCS8: 113062306a36Sopenharmony_ci case DESC92C_RATEMCS9: 113162306a36Sopenharmony_ci case DESC92C_RATEMCS10: 113262306a36Sopenharmony_ci case DESC92C_RATEMCS11: 113362306a36Sopenharmony_ci rate_section = 6; 113462306a36Sopenharmony_ci break; 113562306a36Sopenharmony_ci case DESC92C_RATEMCS12: 113662306a36Sopenharmony_ci case DESC92C_RATEMCS13: 113762306a36Sopenharmony_ci case DESC92C_RATEMCS14: 113862306a36Sopenharmony_ci case DESC92C_RATEMCS15: 113962306a36Sopenharmony_ci rate_section = 7; 114062306a36Sopenharmony_ci break; 114162306a36Sopenharmony_ci default: 114262306a36Sopenharmony_ci WARN_ONCE(true, "rtl8192ee: Rate_Section is Illegal\n"); 114362306a36Sopenharmony_ci break; 114462306a36Sopenharmony_ci } 114562306a36Sopenharmony_ci return rate_section; 114662306a36Sopenharmony_ci} 114762306a36Sopenharmony_ci 114862306a36Sopenharmony_cistatic u8 _rtl92ee_get_txpower_by_rate(struct ieee80211_hw *hw, 114962306a36Sopenharmony_ci enum band_type band, 115062306a36Sopenharmony_ci enum radio_path rf, u8 rate) 115162306a36Sopenharmony_ci{ 115262306a36Sopenharmony_ci struct rtl_priv *rtlpriv = rtl_priv(hw); 115362306a36Sopenharmony_ci struct rtl_phy *rtlphy = &rtlpriv->phy; 115462306a36Sopenharmony_ci u8 shift = 0, sec, tx_num; 115562306a36Sopenharmony_ci s8 diff = 0; 115662306a36Sopenharmony_ci 115762306a36Sopenharmony_ci sec = _rtl92ee_phy_get_ratesection_intxpower_byrate(rf, rate); 115862306a36Sopenharmony_ci tx_num = RF_TX_NUM_NONIMPLEMENT; 115962306a36Sopenharmony_ci 116062306a36Sopenharmony_ci if (tx_num == RF_TX_NUM_NONIMPLEMENT) { 116162306a36Sopenharmony_ci if ((rate >= DESC92C_RATEMCS8 && rate <= DESC92C_RATEMCS15)) 116262306a36Sopenharmony_ci tx_num = RF_2TX; 116362306a36Sopenharmony_ci else 116462306a36Sopenharmony_ci tx_num = RF_1TX; 116562306a36Sopenharmony_ci } 116662306a36Sopenharmony_ci 116762306a36Sopenharmony_ci switch (rate) { 116862306a36Sopenharmony_ci case DESC92C_RATE1M: 116962306a36Sopenharmony_ci case DESC92C_RATE6M: 117062306a36Sopenharmony_ci case DESC92C_RATE24M: 117162306a36Sopenharmony_ci case DESC92C_RATEMCS0: 117262306a36Sopenharmony_ci case DESC92C_RATEMCS4: 117362306a36Sopenharmony_ci case DESC92C_RATEMCS8: 117462306a36Sopenharmony_ci case DESC92C_RATEMCS12: 117562306a36Sopenharmony_ci shift = 0; 117662306a36Sopenharmony_ci break; 117762306a36Sopenharmony_ci case DESC92C_RATE2M: 117862306a36Sopenharmony_ci case DESC92C_RATE9M: 117962306a36Sopenharmony_ci case DESC92C_RATE36M: 118062306a36Sopenharmony_ci case DESC92C_RATEMCS1: 118162306a36Sopenharmony_ci case DESC92C_RATEMCS5: 118262306a36Sopenharmony_ci case DESC92C_RATEMCS9: 118362306a36Sopenharmony_ci case DESC92C_RATEMCS13: 118462306a36Sopenharmony_ci shift = 8; 118562306a36Sopenharmony_ci break; 118662306a36Sopenharmony_ci case DESC92C_RATE5_5M: 118762306a36Sopenharmony_ci case DESC92C_RATE12M: 118862306a36Sopenharmony_ci case DESC92C_RATE48M: 118962306a36Sopenharmony_ci case DESC92C_RATEMCS2: 119062306a36Sopenharmony_ci case DESC92C_RATEMCS6: 119162306a36Sopenharmony_ci case DESC92C_RATEMCS10: 119262306a36Sopenharmony_ci case DESC92C_RATEMCS14: 119362306a36Sopenharmony_ci shift = 16; 119462306a36Sopenharmony_ci break; 119562306a36Sopenharmony_ci case DESC92C_RATE11M: 119662306a36Sopenharmony_ci case DESC92C_RATE18M: 119762306a36Sopenharmony_ci case DESC92C_RATE54M: 119862306a36Sopenharmony_ci case DESC92C_RATEMCS3: 119962306a36Sopenharmony_ci case DESC92C_RATEMCS7: 120062306a36Sopenharmony_ci case DESC92C_RATEMCS11: 120162306a36Sopenharmony_ci case DESC92C_RATEMCS15: 120262306a36Sopenharmony_ci shift = 24; 120362306a36Sopenharmony_ci break; 120462306a36Sopenharmony_ci default: 120562306a36Sopenharmony_ci WARN_ONCE(true, "rtl8192ee: Rate_Section is Illegal\n"); 120662306a36Sopenharmony_ci break; 120762306a36Sopenharmony_ci } 120862306a36Sopenharmony_ci 120962306a36Sopenharmony_ci diff = (u8)(rtlphy->tx_power_by_rate_offset[band][rf][tx_num][sec] >> 121062306a36Sopenharmony_ci shift) & 0xff; 121162306a36Sopenharmony_ci 121262306a36Sopenharmony_ci return diff; 121362306a36Sopenharmony_ci} 121462306a36Sopenharmony_ci 121562306a36Sopenharmony_cistatic u8 _rtl92ee_get_txpower_index(struct ieee80211_hw *hw, 121662306a36Sopenharmony_ci enum radio_path rfpath, u8 rate, 121762306a36Sopenharmony_ci u8 bw, u8 channel) 121862306a36Sopenharmony_ci{ 121962306a36Sopenharmony_ci struct rtl_priv *rtlpriv = rtl_priv(hw); 122062306a36Sopenharmony_ci struct rtl_efuse *rtlefuse = rtl_efuse(rtlpriv); 122162306a36Sopenharmony_ci u8 index = (channel - 1); 122262306a36Sopenharmony_ci u8 tx_power = 0; 122362306a36Sopenharmony_ci u8 diff = 0; 122462306a36Sopenharmony_ci 122562306a36Sopenharmony_ci if (channel < 1 || channel > 14) { 122662306a36Sopenharmony_ci index = 0; 122762306a36Sopenharmony_ci rtl_dbg(rtlpriv, COMP_POWER_TRACKING, DBG_DMESG, 122862306a36Sopenharmony_ci "Illegal channel!!\n"); 122962306a36Sopenharmony_ci } 123062306a36Sopenharmony_ci 123162306a36Sopenharmony_ci if (IS_CCK_RATE((s8)rate)) 123262306a36Sopenharmony_ci tx_power = rtlefuse->txpwrlevel_cck[rfpath][index]; 123362306a36Sopenharmony_ci else if (DESC92C_RATE6M <= rate) 123462306a36Sopenharmony_ci tx_power = rtlefuse->txpwrlevel_ht40_1s[rfpath][index]; 123562306a36Sopenharmony_ci 123662306a36Sopenharmony_ci /* OFDM-1T*/ 123762306a36Sopenharmony_ci if (DESC92C_RATE6M <= rate && rate <= DESC92C_RATE54M && 123862306a36Sopenharmony_ci !IS_CCK_RATE((s8)rate)) 123962306a36Sopenharmony_ci tx_power += rtlefuse->txpwr_legacyhtdiff[rfpath][TX_1S]; 124062306a36Sopenharmony_ci 124162306a36Sopenharmony_ci /* BW20-1S, BW20-2S */ 124262306a36Sopenharmony_ci if (bw == HT_CHANNEL_WIDTH_20) { 124362306a36Sopenharmony_ci if (DESC92C_RATEMCS0 <= rate && rate <= DESC92C_RATEMCS15) 124462306a36Sopenharmony_ci tx_power += rtlefuse->txpwr_ht20diff[rfpath][TX_1S]; 124562306a36Sopenharmony_ci if (DESC92C_RATEMCS8 <= rate && rate <= DESC92C_RATEMCS15) 124662306a36Sopenharmony_ci tx_power += rtlefuse->txpwr_ht20diff[rfpath][TX_2S]; 124762306a36Sopenharmony_ci } else if (bw == HT_CHANNEL_WIDTH_20_40) {/* BW40-1S, BW40-2S */ 124862306a36Sopenharmony_ci if (DESC92C_RATEMCS0 <= rate && rate <= DESC92C_RATEMCS15) 124962306a36Sopenharmony_ci tx_power += rtlefuse->txpwr_ht40diff[rfpath][TX_1S]; 125062306a36Sopenharmony_ci if (DESC92C_RATEMCS8 <= rate && rate <= DESC92C_RATEMCS15) 125162306a36Sopenharmony_ci tx_power += rtlefuse->txpwr_ht40diff[rfpath][TX_2S]; 125262306a36Sopenharmony_ci } 125362306a36Sopenharmony_ci 125462306a36Sopenharmony_ci if (rtlefuse->eeprom_regulatory != 2) 125562306a36Sopenharmony_ci diff = _rtl92ee_get_txpower_by_rate(hw, BAND_ON_2_4G, 125662306a36Sopenharmony_ci rfpath, rate); 125762306a36Sopenharmony_ci 125862306a36Sopenharmony_ci tx_power += diff; 125962306a36Sopenharmony_ci 126062306a36Sopenharmony_ci if (tx_power > MAX_POWER_INDEX) 126162306a36Sopenharmony_ci tx_power = MAX_POWER_INDEX; 126262306a36Sopenharmony_ci 126362306a36Sopenharmony_ci return tx_power; 126462306a36Sopenharmony_ci} 126562306a36Sopenharmony_ci 126662306a36Sopenharmony_cistatic void _rtl92ee_set_txpower_index(struct ieee80211_hw *hw, u8 pwr_idx, 126762306a36Sopenharmony_ci enum radio_path rfpath, u8 rate) 126862306a36Sopenharmony_ci{ 126962306a36Sopenharmony_ci struct rtl_priv *rtlpriv = rtl_priv(hw); 127062306a36Sopenharmony_ci 127162306a36Sopenharmony_ci if (rfpath == RF90_PATH_A) { 127262306a36Sopenharmony_ci switch (rate) { 127362306a36Sopenharmony_ci case DESC92C_RATE1M: 127462306a36Sopenharmony_ci rtl_set_bbreg(hw, RTXAGC_A_CCK1_MCS32, MASKBYTE1, 127562306a36Sopenharmony_ci pwr_idx); 127662306a36Sopenharmony_ci break; 127762306a36Sopenharmony_ci case DESC92C_RATE2M: 127862306a36Sopenharmony_ci rtl_set_bbreg(hw, RTXAGC_B_CCK11_A_CCK2_11, MASKBYTE1, 127962306a36Sopenharmony_ci pwr_idx); 128062306a36Sopenharmony_ci break; 128162306a36Sopenharmony_ci case DESC92C_RATE5_5M: 128262306a36Sopenharmony_ci rtl_set_bbreg(hw, RTXAGC_B_CCK11_A_CCK2_11, MASKBYTE2, 128362306a36Sopenharmony_ci pwr_idx); 128462306a36Sopenharmony_ci break; 128562306a36Sopenharmony_ci case DESC92C_RATE11M: 128662306a36Sopenharmony_ci rtl_set_bbreg(hw, RTXAGC_B_CCK11_A_CCK2_11, MASKBYTE3, 128762306a36Sopenharmony_ci pwr_idx); 128862306a36Sopenharmony_ci break; 128962306a36Sopenharmony_ci case DESC92C_RATE6M: 129062306a36Sopenharmony_ci rtl_set_bbreg(hw, RTXAGC_A_RATE18_06, MASKBYTE0, 129162306a36Sopenharmony_ci pwr_idx); 129262306a36Sopenharmony_ci break; 129362306a36Sopenharmony_ci case DESC92C_RATE9M: 129462306a36Sopenharmony_ci rtl_set_bbreg(hw, RTXAGC_A_RATE18_06, MASKBYTE1, 129562306a36Sopenharmony_ci pwr_idx); 129662306a36Sopenharmony_ci break; 129762306a36Sopenharmony_ci case DESC92C_RATE12M: 129862306a36Sopenharmony_ci rtl_set_bbreg(hw, RTXAGC_A_RATE18_06, MASKBYTE2, 129962306a36Sopenharmony_ci pwr_idx); 130062306a36Sopenharmony_ci break; 130162306a36Sopenharmony_ci case DESC92C_RATE18M: 130262306a36Sopenharmony_ci rtl_set_bbreg(hw, RTXAGC_A_RATE18_06, MASKBYTE3, 130362306a36Sopenharmony_ci pwr_idx); 130462306a36Sopenharmony_ci break; 130562306a36Sopenharmony_ci case DESC92C_RATE24M: 130662306a36Sopenharmony_ci rtl_set_bbreg(hw, RTXAGC_A_RATE54_24, MASKBYTE0, 130762306a36Sopenharmony_ci pwr_idx); 130862306a36Sopenharmony_ci break; 130962306a36Sopenharmony_ci case DESC92C_RATE36M: 131062306a36Sopenharmony_ci rtl_set_bbreg(hw, RTXAGC_A_RATE54_24, MASKBYTE1, 131162306a36Sopenharmony_ci pwr_idx); 131262306a36Sopenharmony_ci break; 131362306a36Sopenharmony_ci case DESC92C_RATE48M: 131462306a36Sopenharmony_ci rtl_set_bbreg(hw, RTXAGC_A_RATE54_24, MASKBYTE2, 131562306a36Sopenharmony_ci pwr_idx); 131662306a36Sopenharmony_ci break; 131762306a36Sopenharmony_ci case DESC92C_RATE54M: 131862306a36Sopenharmony_ci rtl_set_bbreg(hw, RTXAGC_A_RATE54_24, MASKBYTE3, 131962306a36Sopenharmony_ci pwr_idx); 132062306a36Sopenharmony_ci break; 132162306a36Sopenharmony_ci case DESC92C_RATEMCS0: 132262306a36Sopenharmony_ci rtl_set_bbreg(hw, RTXAGC_A_MCS03_MCS00, MASKBYTE0, 132362306a36Sopenharmony_ci pwr_idx); 132462306a36Sopenharmony_ci break; 132562306a36Sopenharmony_ci case DESC92C_RATEMCS1: 132662306a36Sopenharmony_ci rtl_set_bbreg(hw, RTXAGC_A_MCS03_MCS00, MASKBYTE1, 132762306a36Sopenharmony_ci pwr_idx); 132862306a36Sopenharmony_ci break; 132962306a36Sopenharmony_ci case DESC92C_RATEMCS2: 133062306a36Sopenharmony_ci rtl_set_bbreg(hw, RTXAGC_A_MCS03_MCS00, MASKBYTE2, 133162306a36Sopenharmony_ci pwr_idx); 133262306a36Sopenharmony_ci break; 133362306a36Sopenharmony_ci case DESC92C_RATEMCS3: 133462306a36Sopenharmony_ci rtl_set_bbreg(hw, RTXAGC_A_MCS03_MCS00, MASKBYTE3, 133562306a36Sopenharmony_ci pwr_idx); 133662306a36Sopenharmony_ci break; 133762306a36Sopenharmony_ci case DESC92C_RATEMCS4: 133862306a36Sopenharmony_ci rtl_set_bbreg(hw, RTXAGC_A_MCS07_MCS04, MASKBYTE0, 133962306a36Sopenharmony_ci pwr_idx); 134062306a36Sopenharmony_ci break; 134162306a36Sopenharmony_ci case DESC92C_RATEMCS5: 134262306a36Sopenharmony_ci rtl_set_bbreg(hw, RTXAGC_A_MCS07_MCS04, MASKBYTE1, 134362306a36Sopenharmony_ci pwr_idx); 134462306a36Sopenharmony_ci break; 134562306a36Sopenharmony_ci case DESC92C_RATEMCS6: 134662306a36Sopenharmony_ci rtl_set_bbreg(hw, RTXAGC_A_MCS07_MCS04, MASKBYTE2, 134762306a36Sopenharmony_ci pwr_idx); 134862306a36Sopenharmony_ci break; 134962306a36Sopenharmony_ci case DESC92C_RATEMCS7: 135062306a36Sopenharmony_ci rtl_set_bbreg(hw, RTXAGC_A_MCS07_MCS04, MASKBYTE3, 135162306a36Sopenharmony_ci pwr_idx); 135262306a36Sopenharmony_ci break; 135362306a36Sopenharmony_ci case DESC92C_RATEMCS8: 135462306a36Sopenharmony_ci rtl_set_bbreg(hw, RTXAGC_A_MCS11_MCS08, MASKBYTE0, 135562306a36Sopenharmony_ci pwr_idx); 135662306a36Sopenharmony_ci break; 135762306a36Sopenharmony_ci case DESC92C_RATEMCS9: 135862306a36Sopenharmony_ci rtl_set_bbreg(hw, RTXAGC_A_MCS11_MCS08, MASKBYTE1, 135962306a36Sopenharmony_ci pwr_idx); 136062306a36Sopenharmony_ci break; 136162306a36Sopenharmony_ci case DESC92C_RATEMCS10: 136262306a36Sopenharmony_ci rtl_set_bbreg(hw, RTXAGC_A_MCS11_MCS08, MASKBYTE2, 136362306a36Sopenharmony_ci pwr_idx); 136462306a36Sopenharmony_ci break; 136562306a36Sopenharmony_ci case DESC92C_RATEMCS11: 136662306a36Sopenharmony_ci rtl_set_bbreg(hw, RTXAGC_A_MCS11_MCS08, MASKBYTE3, 136762306a36Sopenharmony_ci pwr_idx); 136862306a36Sopenharmony_ci break; 136962306a36Sopenharmony_ci case DESC92C_RATEMCS12: 137062306a36Sopenharmony_ci rtl_set_bbreg(hw, RTXAGC_A_MCS15_MCS12, MASKBYTE0, 137162306a36Sopenharmony_ci pwr_idx); 137262306a36Sopenharmony_ci break; 137362306a36Sopenharmony_ci case DESC92C_RATEMCS13: 137462306a36Sopenharmony_ci rtl_set_bbreg(hw, RTXAGC_A_MCS15_MCS12, MASKBYTE1, 137562306a36Sopenharmony_ci pwr_idx); 137662306a36Sopenharmony_ci break; 137762306a36Sopenharmony_ci case DESC92C_RATEMCS14: 137862306a36Sopenharmony_ci rtl_set_bbreg(hw, RTXAGC_A_MCS15_MCS12, MASKBYTE2, 137962306a36Sopenharmony_ci pwr_idx); 138062306a36Sopenharmony_ci break; 138162306a36Sopenharmony_ci case DESC92C_RATEMCS15: 138262306a36Sopenharmony_ci rtl_set_bbreg(hw, RTXAGC_A_MCS15_MCS12, MASKBYTE3, 138362306a36Sopenharmony_ci pwr_idx); 138462306a36Sopenharmony_ci break; 138562306a36Sopenharmony_ci default: 138662306a36Sopenharmony_ci rtl_dbg(rtlpriv, COMP_POWER, DBG_LOUD, 138762306a36Sopenharmony_ci "Invalid Rate!!\n"); 138862306a36Sopenharmony_ci break; 138962306a36Sopenharmony_ci } 139062306a36Sopenharmony_ci } else if (rfpath == RF90_PATH_B) { 139162306a36Sopenharmony_ci switch (rate) { 139262306a36Sopenharmony_ci case DESC92C_RATE1M: 139362306a36Sopenharmony_ci rtl_set_bbreg(hw, RTXAGC_B_CCK1_55_MCS32, MASKBYTE1, 139462306a36Sopenharmony_ci pwr_idx); 139562306a36Sopenharmony_ci break; 139662306a36Sopenharmony_ci case DESC92C_RATE2M: 139762306a36Sopenharmony_ci rtl_set_bbreg(hw, RTXAGC_B_CCK1_55_MCS32, MASKBYTE2, 139862306a36Sopenharmony_ci pwr_idx); 139962306a36Sopenharmony_ci break; 140062306a36Sopenharmony_ci case DESC92C_RATE5_5M: 140162306a36Sopenharmony_ci rtl_set_bbreg(hw, RTXAGC_B_CCK1_55_MCS32, MASKBYTE3, 140262306a36Sopenharmony_ci pwr_idx); 140362306a36Sopenharmony_ci break; 140462306a36Sopenharmony_ci case DESC92C_RATE11M: 140562306a36Sopenharmony_ci rtl_set_bbreg(hw, RTXAGC_B_CCK11_A_CCK2_11, MASKBYTE0, 140662306a36Sopenharmony_ci pwr_idx); 140762306a36Sopenharmony_ci break; 140862306a36Sopenharmony_ci case DESC92C_RATE6M: 140962306a36Sopenharmony_ci rtl_set_bbreg(hw, RTXAGC_B_RATE18_06, MASKBYTE0, 141062306a36Sopenharmony_ci pwr_idx); 141162306a36Sopenharmony_ci break; 141262306a36Sopenharmony_ci case DESC92C_RATE9M: 141362306a36Sopenharmony_ci rtl_set_bbreg(hw, RTXAGC_B_RATE18_06, MASKBYTE1, 141462306a36Sopenharmony_ci pwr_idx); 141562306a36Sopenharmony_ci break; 141662306a36Sopenharmony_ci case DESC92C_RATE12M: 141762306a36Sopenharmony_ci rtl_set_bbreg(hw, RTXAGC_B_RATE18_06, MASKBYTE2, 141862306a36Sopenharmony_ci pwr_idx); 141962306a36Sopenharmony_ci break; 142062306a36Sopenharmony_ci case DESC92C_RATE18M: 142162306a36Sopenharmony_ci rtl_set_bbreg(hw, RTXAGC_B_RATE18_06, MASKBYTE3, 142262306a36Sopenharmony_ci pwr_idx); 142362306a36Sopenharmony_ci break; 142462306a36Sopenharmony_ci case DESC92C_RATE24M: 142562306a36Sopenharmony_ci rtl_set_bbreg(hw, RTXAGC_B_RATE54_24, MASKBYTE0, 142662306a36Sopenharmony_ci pwr_idx); 142762306a36Sopenharmony_ci break; 142862306a36Sopenharmony_ci case DESC92C_RATE36M: 142962306a36Sopenharmony_ci rtl_set_bbreg(hw, RTXAGC_B_RATE54_24, MASKBYTE1, 143062306a36Sopenharmony_ci pwr_idx); 143162306a36Sopenharmony_ci break; 143262306a36Sopenharmony_ci case DESC92C_RATE48M: 143362306a36Sopenharmony_ci rtl_set_bbreg(hw, RTXAGC_B_RATE54_24, MASKBYTE2, 143462306a36Sopenharmony_ci pwr_idx); 143562306a36Sopenharmony_ci break; 143662306a36Sopenharmony_ci case DESC92C_RATE54M: 143762306a36Sopenharmony_ci rtl_set_bbreg(hw, RTXAGC_B_RATE54_24, MASKBYTE3, 143862306a36Sopenharmony_ci pwr_idx); 143962306a36Sopenharmony_ci break; 144062306a36Sopenharmony_ci case DESC92C_RATEMCS0: 144162306a36Sopenharmony_ci rtl_set_bbreg(hw, RTXAGC_B_MCS03_MCS00, MASKBYTE0, 144262306a36Sopenharmony_ci pwr_idx); 144362306a36Sopenharmony_ci break; 144462306a36Sopenharmony_ci case DESC92C_RATEMCS1: 144562306a36Sopenharmony_ci rtl_set_bbreg(hw, RTXAGC_B_MCS03_MCS00, MASKBYTE1, 144662306a36Sopenharmony_ci pwr_idx); 144762306a36Sopenharmony_ci break; 144862306a36Sopenharmony_ci case DESC92C_RATEMCS2: 144962306a36Sopenharmony_ci rtl_set_bbreg(hw, RTXAGC_B_MCS03_MCS00, MASKBYTE2, 145062306a36Sopenharmony_ci pwr_idx); 145162306a36Sopenharmony_ci break; 145262306a36Sopenharmony_ci case DESC92C_RATEMCS3: 145362306a36Sopenharmony_ci rtl_set_bbreg(hw, RTXAGC_B_MCS03_MCS00, MASKBYTE3, 145462306a36Sopenharmony_ci pwr_idx); 145562306a36Sopenharmony_ci break; 145662306a36Sopenharmony_ci case DESC92C_RATEMCS4: 145762306a36Sopenharmony_ci rtl_set_bbreg(hw, RTXAGC_B_MCS07_MCS04, MASKBYTE0, 145862306a36Sopenharmony_ci pwr_idx); 145962306a36Sopenharmony_ci break; 146062306a36Sopenharmony_ci case DESC92C_RATEMCS5: 146162306a36Sopenharmony_ci rtl_set_bbreg(hw, RTXAGC_B_MCS07_MCS04, MASKBYTE1, 146262306a36Sopenharmony_ci pwr_idx); 146362306a36Sopenharmony_ci break; 146462306a36Sopenharmony_ci case DESC92C_RATEMCS6: 146562306a36Sopenharmony_ci rtl_set_bbreg(hw, RTXAGC_B_MCS07_MCS04, MASKBYTE2, 146662306a36Sopenharmony_ci pwr_idx); 146762306a36Sopenharmony_ci break; 146862306a36Sopenharmony_ci case DESC92C_RATEMCS7: 146962306a36Sopenharmony_ci rtl_set_bbreg(hw, RTXAGC_B_MCS07_MCS04, MASKBYTE3, 147062306a36Sopenharmony_ci pwr_idx); 147162306a36Sopenharmony_ci break; 147262306a36Sopenharmony_ci case DESC92C_RATEMCS8: 147362306a36Sopenharmony_ci rtl_set_bbreg(hw, RTXAGC_B_MCS11_MCS08, MASKBYTE0, 147462306a36Sopenharmony_ci pwr_idx); 147562306a36Sopenharmony_ci break; 147662306a36Sopenharmony_ci case DESC92C_RATEMCS9: 147762306a36Sopenharmony_ci rtl_set_bbreg(hw, RTXAGC_B_MCS11_MCS08, MASKBYTE1, 147862306a36Sopenharmony_ci pwr_idx); 147962306a36Sopenharmony_ci break; 148062306a36Sopenharmony_ci case DESC92C_RATEMCS10: 148162306a36Sopenharmony_ci rtl_set_bbreg(hw, RTXAGC_B_MCS11_MCS08, MASKBYTE2, 148262306a36Sopenharmony_ci pwr_idx); 148362306a36Sopenharmony_ci break; 148462306a36Sopenharmony_ci case DESC92C_RATEMCS11: 148562306a36Sopenharmony_ci rtl_set_bbreg(hw, RTXAGC_B_MCS11_MCS08, MASKBYTE3, 148662306a36Sopenharmony_ci pwr_idx); 148762306a36Sopenharmony_ci break; 148862306a36Sopenharmony_ci case DESC92C_RATEMCS12: 148962306a36Sopenharmony_ci rtl_set_bbreg(hw, RTXAGC_B_MCS15_MCS12, MASKBYTE0, 149062306a36Sopenharmony_ci pwr_idx); 149162306a36Sopenharmony_ci break; 149262306a36Sopenharmony_ci case DESC92C_RATEMCS13: 149362306a36Sopenharmony_ci rtl_set_bbreg(hw, RTXAGC_B_MCS15_MCS12, MASKBYTE1, 149462306a36Sopenharmony_ci pwr_idx); 149562306a36Sopenharmony_ci break; 149662306a36Sopenharmony_ci case DESC92C_RATEMCS14: 149762306a36Sopenharmony_ci rtl_set_bbreg(hw, RTXAGC_B_MCS15_MCS12, MASKBYTE2, 149862306a36Sopenharmony_ci pwr_idx); 149962306a36Sopenharmony_ci break; 150062306a36Sopenharmony_ci case DESC92C_RATEMCS15: 150162306a36Sopenharmony_ci rtl_set_bbreg(hw, RTXAGC_B_MCS15_MCS12, MASKBYTE3, 150262306a36Sopenharmony_ci pwr_idx); 150362306a36Sopenharmony_ci break; 150462306a36Sopenharmony_ci default: 150562306a36Sopenharmony_ci rtl_dbg(rtlpriv, COMP_POWER, DBG_LOUD, 150662306a36Sopenharmony_ci "Invalid Rate!!\n"); 150762306a36Sopenharmony_ci break; 150862306a36Sopenharmony_ci } 150962306a36Sopenharmony_ci } else { 151062306a36Sopenharmony_ci rtl_dbg(rtlpriv, COMP_POWER, DBG_LOUD, "Invalid RFPath!!\n"); 151162306a36Sopenharmony_ci } 151262306a36Sopenharmony_ci} 151362306a36Sopenharmony_ci 151462306a36Sopenharmony_cistatic void phy_set_txpower_index_by_rate_array(struct ieee80211_hw *hw, 151562306a36Sopenharmony_ci enum radio_path rfpath, u8 bw, 151662306a36Sopenharmony_ci u8 channel, u8 *rates, u8 size) 151762306a36Sopenharmony_ci{ 151862306a36Sopenharmony_ci u8 i; 151962306a36Sopenharmony_ci u8 power_index; 152062306a36Sopenharmony_ci 152162306a36Sopenharmony_ci for (i = 0; i < size; i++) { 152262306a36Sopenharmony_ci power_index = _rtl92ee_get_txpower_index(hw, rfpath, rates[i], 152362306a36Sopenharmony_ci bw, channel); 152462306a36Sopenharmony_ci _rtl92ee_set_txpower_index(hw, power_index, rfpath, rates[i]); 152562306a36Sopenharmony_ci } 152662306a36Sopenharmony_ci} 152762306a36Sopenharmony_ci 152862306a36Sopenharmony_cistatic void phy_set_txpower_index_by_rate_section(struct ieee80211_hw *hw, 152962306a36Sopenharmony_ci enum radio_path rfpath, 153062306a36Sopenharmony_ci u8 channel, 153162306a36Sopenharmony_ci enum rate_section section) 153262306a36Sopenharmony_ci{ 153362306a36Sopenharmony_ci struct rtl_priv *rtlpriv = rtl_priv(hw); 153462306a36Sopenharmony_ci struct rtl_hal *rtlhal = rtl_hal(rtlpriv); 153562306a36Sopenharmony_ci struct rtl_phy *rtlphy = &rtlpriv->phy; 153662306a36Sopenharmony_ci 153762306a36Sopenharmony_ci if (section == CCK) { 153862306a36Sopenharmony_ci u8 cck_rates[] = {DESC92C_RATE1M, DESC92C_RATE2M, 153962306a36Sopenharmony_ci DESC92C_RATE5_5M, DESC92C_RATE11M}; 154062306a36Sopenharmony_ci if (rtlhal->current_bandtype == BAND_ON_2_4G) 154162306a36Sopenharmony_ci phy_set_txpower_index_by_rate_array(hw, rfpath, 154262306a36Sopenharmony_ci rtlphy->current_chan_bw, 154362306a36Sopenharmony_ci channel, cck_rates, 4); 154462306a36Sopenharmony_ci } else if (section == OFDM) { 154562306a36Sopenharmony_ci u8 ofdm_rates[] = {DESC92C_RATE6M, DESC92C_RATE9M, 154662306a36Sopenharmony_ci DESC92C_RATE12M, DESC92C_RATE18M, 154762306a36Sopenharmony_ci DESC92C_RATE24M, DESC92C_RATE36M, 154862306a36Sopenharmony_ci DESC92C_RATE48M, DESC92C_RATE54M}; 154962306a36Sopenharmony_ci phy_set_txpower_index_by_rate_array(hw, rfpath, 155062306a36Sopenharmony_ci rtlphy->current_chan_bw, 155162306a36Sopenharmony_ci channel, ofdm_rates, 8); 155262306a36Sopenharmony_ci } else if (section == HT_MCS0_MCS7) { 155362306a36Sopenharmony_ci u8 ht_rates1t[] = {DESC92C_RATEMCS0, DESC92C_RATEMCS1, 155462306a36Sopenharmony_ci DESC92C_RATEMCS2, DESC92C_RATEMCS3, 155562306a36Sopenharmony_ci DESC92C_RATEMCS4, DESC92C_RATEMCS5, 155662306a36Sopenharmony_ci DESC92C_RATEMCS6, DESC92C_RATEMCS7}; 155762306a36Sopenharmony_ci phy_set_txpower_index_by_rate_array(hw, rfpath, 155862306a36Sopenharmony_ci rtlphy->current_chan_bw, 155962306a36Sopenharmony_ci channel, ht_rates1t, 8); 156062306a36Sopenharmony_ci } else if (section == HT_MCS8_MCS15) { 156162306a36Sopenharmony_ci u8 ht_rates2t[] = {DESC92C_RATEMCS8, DESC92C_RATEMCS9, 156262306a36Sopenharmony_ci DESC92C_RATEMCS10, DESC92C_RATEMCS11, 156362306a36Sopenharmony_ci DESC92C_RATEMCS12, DESC92C_RATEMCS13, 156462306a36Sopenharmony_ci DESC92C_RATEMCS14, DESC92C_RATEMCS15}; 156562306a36Sopenharmony_ci phy_set_txpower_index_by_rate_array(hw, rfpath, 156662306a36Sopenharmony_ci rtlphy->current_chan_bw, 156762306a36Sopenharmony_ci channel, ht_rates2t, 8); 156862306a36Sopenharmony_ci } else 156962306a36Sopenharmony_ci rtl_dbg(rtlpriv, FPHY, PHY_TXPWR, 157062306a36Sopenharmony_ci "Invalid RateSection %d\n", section); 157162306a36Sopenharmony_ci} 157262306a36Sopenharmony_ci 157362306a36Sopenharmony_civoid rtl92ee_phy_set_txpower_level(struct ieee80211_hw *hw, u8 channel) 157462306a36Sopenharmony_ci{ 157562306a36Sopenharmony_ci struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw)); 157662306a36Sopenharmony_ci struct rtl_phy *rtlphy = &rtl_priv(hw)->phy; 157762306a36Sopenharmony_ci enum radio_path rfpath; 157862306a36Sopenharmony_ci 157962306a36Sopenharmony_ci if (!rtlefuse->txpwr_fromeprom) 158062306a36Sopenharmony_ci return; 158162306a36Sopenharmony_ci for (rfpath = RF90_PATH_A; rfpath < rtlphy->num_total_rfpath; 158262306a36Sopenharmony_ci rfpath++) { 158362306a36Sopenharmony_ci phy_set_txpower_index_by_rate_section(hw, rfpath, 158462306a36Sopenharmony_ci channel, CCK); 158562306a36Sopenharmony_ci phy_set_txpower_index_by_rate_section(hw, rfpath, 158662306a36Sopenharmony_ci channel, OFDM); 158762306a36Sopenharmony_ci phy_set_txpower_index_by_rate_section(hw, rfpath, 158862306a36Sopenharmony_ci channel, 158962306a36Sopenharmony_ci HT_MCS0_MCS7); 159062306a36Sopenharmony_ci 159162306a36Sopenharmony_ci if (rtlphy->num_total_rfpath >= 2) 159262306a36Sopenharmony_ci phy_set_txpower_index_by_rate_section(hw, 159362306a36Sopenharmony_ci rfpath, channel, 159462306a36Sopenharmony_ci HT_MCS8_MCS15); 159562306a36Sopenharmony_ci } 159662306a36Sopenharmony_ci} 159762306a36Sopenharmony_ci 159862306a36Sopenharmony_cistatic long _rtl92ee_phy_txpwr_idx_to_dbm(struct ieee80211_hw *hw, 159962306a36Sopenharmony_ci enum wireless_mode wirelessmode, 160062306a36Sopenharmony_ci u8 txpwridx) 160162306a36Sopenharmony_ci{ 160262306a36Sopenharmony_ci long offset; 160362306a36Sopenharmony_ci long pwrout_dbm; 160462306a36Sopenharmony_ci 160562306a36Sopenharmony_ci switch (wirelessmode) { 160662306a36Sopenharmony_ci case WIRELESS_MODE_B: 160762306a36Sopenharmony_ci offset = -7; 160862306a36Sopenharmony_ci break; 160962306a36Sopenharmony_ci case WIRELESS_MODE_G: 161062306a36Sopenharmony_ci case WIRELESS_MODE_N_24G: 161162306a36Sopenharmony_ci offset = -8; 161262306a36Sopenharmony_ci break; 161362306a36Sopenharmony_ci default: 161462306a36Sopenharmony_ci offset = -8; 161562306a36Sopenharmony_ci break; 161662306a36Sopenharmony_ci } 161762306a36Sopenharmony_ci pwrout_dbm = txpwridx / 2 + offset; 161862306a36Sopenharmony_ci return pwrout_dbm; 161962306a36Sopenharmony_ci} 162062306a36Sopenharmony_ci 162162306a36Sopenharmony_civoid rtl92ee_phy_scan_operation_backup(struct ieee80211_hw *hw, u8 operation) 162262306a36Sopenharmony_ci{ 162362306a36Sopenharmony_ci struct rtl_priv *rtlpriv = rtl_priv(hw); 162462306a36Sopenharmony_ci struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw)); 162562306a36Sopenharmony_ci enum io_type iotype; 162662306a36Sopenharmony_ci 162762306a36Sopenharmony_ci if (!is_hal_stop(rtlhal)) { 162862306a36Sopenharmony_ci switch (operation) { 162962306a36Sopenharmony_ci case SCAN_OPT_BACKUP_BAND0: 163062306a36Sopenharmony_ci iotype = IO_CMD_PAUSE_BAND0_DM_BY_SCAN; 163162306a36Sopenharmony_ci rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_IO_CMD, 163262306a36Sopenharmony_ci (u8 *)&iotype); 163362306a36Sopenharmony_ci 163462306a36Sopenharmony_ci break; 163562306a36Sopenharmony_ci case SCAN_OPT_RESTORE: 163662306a36Sopenharmony_ci iotype = IO_CMD_RESUME_DM_BY_SCAN; 163762306a36Sopenharmony_ci rtlpriv->cfg->ops->set_hw_reg(hw, HW_VAR_IO_CMD, 163862306a36Sopenharmony_ci (u8 *)&iotype); 163962306a36Sopenharmony_ci break; 164062306a36Sopenharmony_ci default: 164162306a36Sopenharmony_ci pr_err("Unknown Scan Backup operation.\n"); 164262306a36Sopenharmony_ci break; 164362306a36Sopenharmony_ci } 164462306a36Sopenharmony_ci } 164562306a36Sopenharmony_ci} 164662306a36Sopenharmony_ci 164762306a36Sopenharmony_civoid rtl92ee_phy_set_bw_mode_callback(struct ieee80211_hw *hw) 164862306a36Sopenharmony_ci{ 164962306a36Sopenharmony_ci struct rtl_priv *rtlpriv = rtl_priv(hw); 165062306a36Sopenharmony_ci struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw)); 165162306a36Sopenharmony_ci struct rtl_phy *rtlphy = &rtlpriv->phy; 165262306a36Sopenharmony_ci struct rtl_mac *mac = rtl_mac(rtl_priv(hw)); 165362306a36Sopenharmony_ci u8 reg_bw_opmode; 165462306a36Sopenharmony_ci u8 reg_prsr_rsc; 165562306a36Sopenharmony_ci 165662306a36Sopenharmony_ci rtl_dbg(rtlpriv, COMP_SCAN, DBG_TRACE, 165762306a36Sopenharmony_ci "Switch to %s bandwidth\n", 165862306a36Sopenharmony_ci rtlphy->current_chan_bw == HT_CHANNEL_WIDTH_20 ? 165962306a36Sopenharmony_ci "20MHz" : "40MHz"); 166062306a36Sopenharmony_ci 166162306a36Sopenharmony_ci if (is_hal_stop(rtlhal)) { 166262306a36Sopenharmony_ci rtlphy->set_bwmode_inprogress = false; 166362306a36Sopenharmony_ci return; 166462306a36Sopenharmony_ci } 166562306a36Sopenharmony_ci 166662306a36Sopenharmony_ci reg_bw_opmode = rtl_read_byte(rtlpriv, REG_BWOPMODE); 166762306a36Sopenharmony_ci reg_prsr_rsc = rtl_read_byte(rtlpriv, REG_RRSR + 2); 166862306a36Sopenharmony_ci 166962306a36Sopenharmony_ci switch (rtlphy->current_chan_bw) { 167062306a36Sopenharmony_ci case HT_CHANNEL_WIDTH_20: 167162306a36Sopenharmony_ci reg_bw_opmode |= BW_OPMODE_20MHZ; 167262306a36Sopenharmony_ci rtl_write_byte(rtlpriv, REG_BWOPMODE, reg_bw_opmode); 167362306a36Sopenharmony_ci break; 167462306a36Sopenharmony_ci case HT_CHANNEL_WIDTH_20_40: 167562306a36Sopenharmony_ci reg_bw_opmode &= ~BW_OPMODE_20MHZ; 167662306a36Sopenharmony_ci rtl_write_byte(rtlpriv, REG_BWOPMODE, reg_bw_opmode); 167762306a36Sopenharmony_ci reg_prsr_rsc = (reg_prsr_rsc & 0x90) | 167862306a36Sopenharmony_ci (mac->cur_40_prime_sc << 5); 167962306a36Sopenharmony_ci rtl_write_byte(rtlpriv, REG_RRSR + 2, reg_prsr_rsc); 168062306a36Sopenharmony_ci break; 168162306a36Sopenharmony_ci default: 168262306a36Sopenharmony_ci pr_err("unknown bandwidth: %#X\n", 168362306a36Sopenharmony_ci rtlphy->current_chan_bw); 168462306a36Sopenharmony_ci break; 168562306a36Sopenharmony_ci } 168662306a36Sopenharmony_ci 168762306a36Sopenharmony_ci switch (rtlphy->current_chan_bw) { 168862306a36Sopenharmony_ci case HT_CHANNEL_WIDTH_20: 168962306a36Sopenharmony_ci rtl_set_bbreg(hw, RFPGA0_RFMOD, BRFMOD, 0x0); 169062306a36Sopenharmony_ci rtl_set_bbreg(hw, RFPGA1_RFMOD, BRFMOD, 0x0); 169162306a36Sopenharmony_ci rtl_set_bbreg(hw, ROFDM0_TXPSEUDONOISEWGT, 169262306a36Sopenharmony_ci (BIT(31) | BIT(30)), 0); 169362306a36Sopenharmony_ci break; 169462306a36Sopenharmony_ci case HT_CHANNEL_WIDTH_20_40: 169562306a36Sopenharmony_ci rtl_set_bbreg(hw, RFPGA0_RFMOD, BRFMOD, 0x1); 169662306a36Sopenharmony_ci rtl_set_bbreg(hw, RFPGA1_RFMOD, BRFMOD, 0x1); 169762306a36Sopenharmony_ci rtl_set_bbreg(hw, RCCK0_SYSTEM, BCCK_SIDEBAND, 169862306a36Sopenharmony_ci (mac->cur_40_prime_sc >> 1)); 169962306a36Sopenharmony_ci rtl_set_bbreg(hw, ROFDM1_LSTF, 0xC00, 170062306a36Sopenharmony_ci mac->cur_40_prime_sc); 170162306a36Sopenharmony_ci 170262306a36Sopenharmony_ci rtl_set_bbreg(hw, 0x818, (BIT(26) | BIT(27)), 170362306a36Sopenharmony_ci (mac->cur_40_prime_sc == 170462306a36Sopenharmony_ci HAL_PRIME_CHNL_OFFSET_LOWER) ? 2 : 1); 170562306a36Sopenharmony_ci break; 170662306a36Sopenharmony_ci default: 170762306a36Sopenharmony_ci pr_err("unknown bandwidth: %#X\n", 170862306a36Sopenharmony_ci rtlphy->current_chan_bw); 170962306a36Sopenharmony_ci break; 171062306a36Sopenharmony_ci } 171162306a36Sopenharmony_ci rtl92ee_phy_rf6052_set_bandwidth(hw, rtlphy->current_chan_bw); 171262306a36Sopenharmony_ci rtlphy->set_bwmode_inprogress = false; 171362306a36Sopenharmony_ci rtl_dbg(rtlpriv, COMP_SCAN, DBG_LOUD, "\n"); 171462306a36Sopenharmony_ci} 171562306a36Sopenharmony_ci 171662306a36Sopenharmony_civoid rtl92ee_phy_set_bw_mode(struct ieee80211_hw *hw, 171762306a36Sopenharmony_ci enum nl80211_channel_type ch_type) 171862306a36Sopenharmony_ci{ 171962306a36Sopenharmony_ci struct rtl_priv *rtlpriv = rtl_priv(hw); 172062306a36Sopenharmony_ci struct rtl_phy *rtlphy = &rtlpriv->phy; 172162306a36Sopenharmony_ci struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw)); 172262306a36Sopenharmony_ci u8 tmp_bw = rtlphy->current_chan_bw; 172362306a36Sopenharmony_ci 172462306a36Sopenharmony_ci if (rtlphy->set_bwmode_inprogress) 172562306a36Sopenharmony_ci return; 172662306a36Sopenharmony_ci rtlphy->set_bwmode_inprogress = true; 172762306a36Sopenharmony_ci if ((!is_hal_stop(rtlhal)) && !(RT_CANNOT_IO(hw))) { 172862306a36Sopenharmony_ci rtl92ee_phy_set_bw_mode_callback(hw); 172962306a36Sopenharmony_ci } else { 173062306a36Sopenharmony_ci rtl_dbg(rtlpriv, COMP_ERR, DBG_WARNING, 173162306a36Sopenharmony_ci "false driver sleep or unload\n"); 173262306a36Sopenharmony_ci rtlphy->set_bwmode_inprogress = false; 173362306a36Sopenharmony_ci rtlphy->current_chan_bw = tmp_bw; 173462306a36Sopenharmony_ci } 173562306a36Sopenharmony_ci} 173662306a36Sopenharmony_ci 173762306a36Sopenharmony_civoid rtl92ee_phy_sw_chnl_callback(struct ieee80211_hw *hw) 173862306a36Sopenharmony_ci{ 173962306a36Sopenharmony_ci struct rtl_priv *rtlpriv = rtl_priv(hw); 174062306a36Sopenharmony_ci struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw)); 174162306a36Sopenharmony_ci struct rtl_phy *rtlphy = &rtlpriv->phy; 174262306a36Sopenharmony_ci u32 delay; 174362306a36Sopenharmony_ci 174462306a36Sopenharmony_ci rtl_dbg(rtlpriv, COMP_SCAN, DBG_TRACE, 174562306a36Sopenharmony_ci "switch to channel%d\n", rtlphy->current_channel); 174662306a36Sopenharmony_ci if (is_hal_stop(rtlhal)) 174762306a36Sopenharmony_ci return; 174862306a36Sopenharmony_ci do { 174962306a36Sopenharmony_ci if (!rtlphy->sw_chnl_inprogress) 175062306a36Sopenharmony_ci break; 175162306a36Sopenharmony_ci if (!_rtl92ee_phy_sw_chnl_step_by_step 175262306a36Sopenharmony_ci (hw, rtlphy->current_channel, &rtlphy->sw_chnl_stage, 175362306a36Sopenharmony_ci &rtlphy->sw_chnl_step, &delay)) { 175462306a36Sopenharmony_ci if (delay > 0) 175562306a36Sopenharmony_ci mdelay(delay); 175662306a36Sopenharmony_ci else 175762306a36Sopenharmony_ci continue; 175862306a36Sopenharmony_ci } else { 175962306a36Sopenharmony_ci rtlphy->sw_chnl_inprogress = false; 176062306a36Sopenharmony_ci } 176162306a36Sopenharmony_ci break; 176262306a36Sopenharmony_ci } while (true); 176362306a36Sopenharmony_ci rtl_dbg(rtlpriv, COMP_SCAN, DBG_TRACE, "\n"); 176462306a36Sopenharmony_ci} 176562306a36Sopenharmony_ci 176662306a36Sopenharmony_ciu8 rtl92ee_phy_sw_chnl(struct ieee80211_hw *hw) 176762306a36Sopenharmony_ci{ 176862306a36Sopenharmony_ci struct rtl_priv *rtlpriv = rtl_priv(hw); 176962306a36Sopenharmony_ci struct rtl_phy *rtlphy = &rtlpriv->phy; 177062306a36Sopenharmony_ci struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw)); 177162306a36Sopenharmony_ci 177262306a36Sopenharmony_ci if (rtlphy->sw_chnl_inprogress) 177362306a36Sopenharmony_ci return 0; 177462306a36Sopenharmony_ci if (rtlphy->set_bwmode_inprogress) 177562306a36Sopenharmony_ci return 0; 177662306a36Sopenharmony_ci WARN_ONCE((rtlphy->current_channel > 14), 177762306a36Sopenharmony_ci "rtl8192ee: WIRELESS_MODE_G but channel>14"); 177862306a36Sopenharmony_ci rtlphy->sw_chnl_inprogress = true; 177962306a36Sopenharmony_ci rtlphy->sw_chnl_stage = 0; 178062306a36Sopenharmony_ci rtlphy->sw_chnl_step = 0; 178162306a36Sopenharmony_ci if (!(is_hal_stop(rtlhal)) && !(RT_CANNOT_IO(hw))) { 178262306a36Sopenharmony_ci rtl92ee_phy_sw_chnl_callback(hw); 178362306a36Sopenharmony_ci rtl_dbg(rtlpriv, COMP_CHAN, DBG_LOUD, 178462306a36Sopenharmony_ci "sw_chnl_inprogress false schedule workitem current channel %d\n", 178562306a36Sopenharmony_ci rtlphy->current_channel); 178662306a36Sopenharmony_ci rtlphy->sw_chnl_inprogress = false; 178762306a36Sopenharmony_ci } else { 178862306a36Sopenharmony_ci rtl_dbg(rtlpriv, COMP_CHAN, DBG_LOUD, 178962306a36Sopenharmony_ci "sw_chnl_inprogress false driver sleep or unload\n"); 179062306a36Sopenharmony_ci rtlphy->sw_chnl_inprogress = false; 179162306a36Sopenharmony_ci } 179262306a36Sopenharmony_ci return 1; 179362306a36Sopenharmony_ci} 179462306a36Sopenharmony_ci 179562306a36Sopenharmony_cistatic bool _rtl92ee_phy_sw_chnl_step_by_step(struct ieee80211_hw *hw, 179662306a36Sopenharmony_ci u8 channel, u8 *stage, u8 *step, 179762306a36Sopenharmony_ci u32 *delay) 179862306a36Sopenharmony_ci{ 179962306a36Sopenharmony_ci struct rtl_priv *rtlpriv = rtl_priv(hw); 180062306a36Sopenharmony_ci struct rtl_phy *rtlphy = &rtlpriv->phy; 180162306a36Sopenharmony_ci struct swchnlcmd precommoncmd[MAX_PRECMD_CNT]; 180262306a36Sopenharmony_ci u32 precommoncmdcnt; 180362306a36Sopenharmony_ci struct swchnlcmd postcommoncmd[MAX_POSTCMD_CNT]; 180462306a36Sopenharmony_ci u32 postcommoncmdcnt; 180562306a36Sopenharmony_ci struct swchnlcmd rfdependcmd[MAX_RFDEPENDCMD_CNT]; 180662306a36Sopenharmony_ci u32 rfdependcmdcnt; 180762306a36Sopenharmony_ci struct swchnlcmd *currentcmd = NULL; 180862306a36Sopenharmony_ci u8 rfpath; 180962306a36Sopenharmony_ci u8 num_total_rfpath = rtlphy->num_total_rfpath; 181062306a36Sopenharmony_ci 181162306a36Sopenharmony_ci precommoncmdcnt = 0; 181262306a36Sopenharmony_ci _rtl92ee_phy_set_sw_chnl_cmdarray(precommoncmd, precommoncmdcnt++, 181362306a36Sopenharmony_ci MAX_PRECMD_CNT, 181462306a36Sopenharmony_ci CMDID_SET_TXPOWEROWER_LEVEL, 0, 0, 0); 181562306a36Sopenharmony_ci _rtl92ee_phy_set_sw_chnl_cmdarray(precommoncmd, precommoncmdcnt++, 181662306a36Sopenharmony_ci MAX_PRECMD_CNT, CMDID_END, 0, 0, 0); 181762306a36Sopenharmony_ci 181862306a36Sopenharmony_ci postcommoncmdcnt = 0; 181962306a36Sopenharmony_ci 182062306a36Sopenharmony_ci _rtl92ee_phy_set_sw_chnl_cmdarray(postcommoncmd, postcommoncmdcnt++, 182162306a36Sopenharmony_ci MAX_POSTCMD_CNT, CMDID_END, 0, 0, 0); 182262306a36Sopenharmony_ci 182362306a36Sopenharmony_ci rfdependcmdcnt = 0; 182462306a36Sopenharmony_ci 182562306a36Sopenharmony_ci WARN_ONCE((channel < 1 || channel > 14), 182662306a36Sopenharmony_ci "rtl8192ee: illegal channel for Zebra: %d\n", channel); 182762306a36Sopenharmony_ci 182862306a36Sopenharmony_ci _rtl92ee_phy_set_sw_chnl_cmdarray(rfdependcmd, rfdependcmdcnt++, 182962306a36Sopenharmony_ci MAX_RFDEPENDCMD_CNT, 183062306a36Sopenharmony_ci CMDID_RF_WRITEREG, 183162306a36Sopenharmony_ci RF_CHNLBW, channel, 10); 183262306a36Sopenharmony_ci 183362306a36Sopenharmony_ci _rtl92ee_phy_set_sw_chnl_cmdarray(rfdependcmd, rfdependcmdcnt++, 183462306a36Sopenharmony_ci MAX_RFDEPENDCMD_CNT, CMDID_END, 183562306a36Sopenharmony_ci 0, 0, 0); 183662306a36Sopenharmony_ci 183762306a36Sopenharmony_ci do { 183862306a36Sopenharmony_ci switch (*stage) { 183962306a36Sopenharmony_ci case 0: 184062306a36Sopenharmony_ci currentcmd = &precommoncmd[*step]; 184162306a36Sopenharmony_ci break; 184262306a36Sopenharmony_ci case 1: 184362306a36Sopenharmony_ci currentcmd = &rfdependcmd[*step]; 184462306a36Sopenharmony_ci break; 184562306a36Sopenharmony_ci case 2: 184662306a36Sopenharmony_ci currentcmd = &postcommoncmd[*step]; 184762306a36Sopenharmony_ci break; 184862306a36Sopenharmony_ci default: 184962306a36Sopenharmony_ci pr_err("Invalid 'stage' = %d, Check it!\n", 185062306a36Sopenharmony_ci *stage); 185162306a36Sopenharmony_ci return true; 185262306a36Sopenharmony_ci } 185362306a36Sopenharmony_ci 185462306a36Sopenharmony_ci if (currentcmd->cmdid == CMDID_END) { 185562306a36Sopenharmony_ci if ((*stage) == 2) 185662306a36Sopenharmony_ci return true; 185762306a36Sopenharmony_ci (*stage)++; 185862306a36Sopenharmony_ci (*step) = 0; 185962306a36Sopenharmony_ci continue; 186062306a36Sopenharmony_ci } 186162306a36Sopenharmony_ci 186262306a36Sopenharmony_ci switch (currentcmd->cmdid) { 186362306a36Sopenharmony_ci case CMDID_SET_TXPOWEROWER_LEVEL: 186462306a36Sopenharmony_ci rtl92ee_phy_set_txpower_level(hw, channel); 186562306a36Sopenharmony_ci break; 186662306a36Sopenharmony_ci case CMDID_WRITEPORT_ULONG: 186762306a36Sopenharmony_ci rtl_write_dword(rtlpriv, currentcmd->para1, 186862306a36Sopenharmony_ci currentcmd->para2); 186962306a36Sopenharmony_ci break; 187062306a36Sopenharmony_ci case CMDID_WRITEPORT_USHORT: 187162306a36Sopenharmony_ci rtl_write_word(rtlpriv, currentcmd->para1, 187262306a36Sopenharmony_ci (u16)currentcmd->para2); 187362306a36Sopenharmony_ci break; 187462306a36Sopenharmony_ci case CMDID_WRITEPORT_UCHAR: 187562306a36Sopenharmony_ci rtl_write_byte(rtlpriv, currentcmd->para1, 187662306a36Sopenharmony_ci (u8)currentcmd->para2); 187762306a36Sopenharmony_ci break; 187862306a36Sopenharmony_ci case CMDID_RF_WRITEREG: 187962306a36Sopenharmony_ci for (rfpath = 0; rfpath < num_total_rfpath; rfpath++) { 188062306a36Sopenharmony_ci rtlphy->rfreg_chnlval[rfpath] = 188162306a36Sopenharmony_ci ((rtlphy->rfreg_chnlval[rfpath] & 188262306a36Sopenharmony_ci 0xfffff00) | currentcmd->para2); 188362306a36Sopenharmony_ci 188462306a36Sopenharmony_ci rtl_set_rfreg(hw, (enum radio_path)rfpath, 188562306a36Sopenharmony_ci currentcmd->para1, 188662306a36Sopenharmony_ci 0x3ff, 188762306a36Sopenharmony_ci rtlphy->rfreg_chnlval[rfpath]); 188862306a36Sopenharmony_ci } 188962306a36Sopenharmony_ci break; 189062306a36Sopenharmony_ci default: 189162306a36Sopenharmony_ci rtl_dbg(rtlpriv, COMP_ERR, DBG_LOUD, 189262306a36Sopenharmony_ci "switch case %#x not processed\n", 189362306a36Sopenharmony_ci currentcmd->cmdid); 189462306a36Sopenharmony_ci break; 189562306a36Sopenharmony_ci } 189662306a36Sopenharmony_ci 189762306a36Sopenharmony_ci break; 189862306a36Sopenharmony_ci } while (true); 189962306a36Sopenharmony_ci 190062306a36Sopenharmony_ci (*delay) = currentcmd->msdelay; 190162306a36Sopenharmony_ci (*step)++; 190262306a36Sopenharmony_ci return false; 190362306a36Sopenharmony_ci} 190462306a36Sopenharmony_ci 190562306a36Sopenharmony_cistatic bool _rtl92ee_phy_set_sw_chnl_cmdarray(struct swchnlcmd *cmdtable, 190662306a36Sopenharmony_ci u32 cmdtableidx, u32 cmdtablesz, 190762306a36Sopenharmony_ci enum swchnlcmd_id cmdid, 190862306a36Sopenharmony_ci u32 para1, u32 para2, u32 msdelay) 190962306a36Sopenharmony_ci{ 191062306a36Sopenharmony_ci struct swchnlcmd *pcmd; 191162306a36Sopenharmony_ci 191262306a36Sopenharmony_ci if (cmdtable == NULL) { 191362306a36Sopenharmony_ci WARN_ONCE(true, "rtl8192ee: cmdtable cannot be NULL.\n"); 191462306a36Sopenharmony_ci return false; 191562306a36Sopenharmony_ci } 191662306a36Sopenharmony_ci 191762306a36Sopenharmony_ci if (cmdtableidx >= cmdtablesz) 191862306a36Sopenharmony_ci return false; 191962306a36Sopenharmony_ci 192062306a36Sopenharmony_ci pcmd = cmdtable + cmdtableidx; 192162306a36Sopenharmony_ci pcmd->cmdid = cmdid; 192262306a36Sopenharmony_ci pcmd->para1 = para1; 192362306a36Sopenharmony_ci pcmd->para2 = para2; 192462306a36Sopenharmony_ci pcmd->msdelay = msdelay; 192562306a36Sopenharmony_ci return true; 192662306a36Sopenharmony_ci} 192762306a36Sopenharmony_ci 192862306a36Sopenharmony_cistatic u8 _rtl92ee_phy_path_a_iqk(struct ieee80211_hw *hw, bool config_pathb) 192962306a36Sopenharmony_ci{ 193062306a36Sopenharmony_ci u32 reg_eac, reg_e94, reg_e9c; 193162306a36Sopenharmony_ci u8 result = 0x00; 193262306a36Sopenharmony_ci /* path-A IQK setting */ 193362306a36Sopenharmony_ci /* PA/PAD controlled by 0x0 */ 193462306a36Sopenharmony_ci rtl_set_bbreg(hw, RFPGA0_IQK, MASKDWORD, 0x00000000); 193562306a36Sopenharmony_ci rtl_set_rfreg(hw, RF90_PATH_A, 0xdf, RFREG_OFFSET_MASK, 0x180); 193662306a36Sopenharmony_ci rtl_set_bbreg(hw, RFPGA0_IQK, MASKDWORD, 0x80800000); 193762306a36Sopenharmony_ci 193862306a36Sopenharmony_ci rtl_set_bbreg(hw, RTX_IQK_TONE_A, MASKDWORD, 0x18008c1c); 193962306a36Sopenharmony_ci rtl_set_bbreg(hw, RRX_IQK_TONE_A, MASKDWORD, 0x38008c1c); 194062306a36Sopenharmony_ci rtl_set_bbreg(hw, RTX_IQK_TONE_B, MASKDWORD, 0x38008c1c); 194162306a36Sopenharmony_ci rtl_set_bbreg(hw, RRX_IQK_TONE_B, MASKDWORD, 0x38008c1c); 194262306a36Sopenharmony_ci 194362306a36Sopenharmony_ci rtl_set_bbreg(hw, RTX_IQK_PI_A, MASKDWORD, 0x82140303); 194462306a36Sopenharmony_ci rtl_set_bbreg(hw, RRX_IQK_PI_A, MASKDWORD, 0x68160000); 194562306a36Sopenharmony_ci 194662306a36Sopenharmony_ci /*LO calibration setting*/ 194762306a36Sopenharmony_ci rtl_set_bbreg(hw, RIQK_AGC_RSP, MASKDWORD, 0x00462911); 194862306a36Sopenharmony_ci 194962306a36Sopenharmony_ci /*One shot, path A LOK & IQK*/ 195062306a36Sopenharmony_ci rtl_set_bbreg(hw, RIQK_AGC_PTS, MASKDWORD, 0xf9000000); 195162306a36Sopenharmony_ci rtl_set_bbreg(hw, RIQK_AGC_PTS, MASKDWORD, 0xf8000000); 195262306a36Sopenharmony_ci 195362306a36Sopenharmony_ci mdelay(IQK_DELAY_TIME); 195462306a36Sopenharmony_ci 195562306a36Sopenharmony_ci reg_eac = rtl_get_bbreg(hw, 0xeac, MASKDWORD); 195662306a36Sopenharmony_ci reg_e94 = rtl_get_bbreg(hw, 0xe94, MASKDWORD); 195762306a36Sopenharmony_ci reg_e9c = rtl_get_bbreg(hw, 0xe9c, MASKDWORD); 195862306a36Sopenharmony_ci 195962306a36Sopenharmony_ci if (!(reg_eac & BIT(28)) && 196062306a36Sopenharmony_ci (((reg_e94 & 0x03FF0000) >> 16) != 0x142) && 196162306a36Sopenharmony_ci (((reg_e9c & 0x03FF0000) >> 16) != 0x42)) 196262306a36Sopenharmony_ci result |= 0x01; 196362306a36Sopenharmony_ci else 196462306a36Sopenharmony_ci return result; 196562306a36Sopenharmony_ci 196662306a36Sopenharmony_ci return result; 196762306a36Sopenharmony_ci} 196862306a36Sopenharmony_ci 196962306a36Sopenharmony_cistatic u8 _rtl92ee_phy_path_b_iqk(struct ieee80211_hw *hw) 197062306a36Sopenharmony_ci{ 197162306a36Sopenharmony_ci u32 reg_eac, reg_eb4, reg_ebc; 197262306a36Sopenharmony_ci u8 result = 0x00; 197362306a36Sopenharmony_ci 197462306a36Sopenharmony_ci /* PA/PAD controlled by 0x0 */ 197562306a36Sopenharmony_ci rtl_set_bbreg(hw, RFPGA0_IQK, MASKDWORD, 0x00000000); 197662306a36Sopenharmony_ci rtl_set_rfreg(hw, RF90_PATH_B, 0xdf, RFREG_OFFSET_MASK, 0x180); 197762306a36Sopenharmony_ci rtl_set_bbreg(hw, RFPGA0_IQK, MASKDWORD, 0x80800000); 197862306a36Sopenharmony_ci 197962306a36Sopenharmony_ci rtl_set_bbreg(hw, 0xe28, MASKDWORD, 0x00000000); 198062306a36Sopenharmony_ci rtl_set_bbreg(hw, 0xe28, MASKDWORD, 0x80800000); 198162306a36Sopenharmony_ci 198262306a36Sopenharmony_ci rtl_set_bbreg(hw, RTX_IQK_TONE_A, MASKDWORD, 0x38008c1c); 198362306a36Sopenharmony_ci rtl_set_bbreg(hw, RRX_IQK_TONE_A, MASKDWORD, 0x38008c1c); 198462306a36Sopenharmony_ci rtl_set_bbreg(hw, RTX_IQK_TONE_B, MASKDWORD, 0x18008c1c); 198562306a36Sopenharmony_ci rtl_set_bbreg(hw, RRX_IQK_TONE_B, MASKDWORD, 0x38008c1c); 198662306a36Sopenharmony_ci 198762306a36Sopenharmony_ci rtl_set_bbreg(hw, RTX_IQK_PI_B, MASKDWORD, 0x821403e2); 198862306a36Sopenharmony_ci rtl_set_bbreg(hw, RRX_IQK_PI_B, MASKDWORD, 0x68160000); 198962306a36Sopenharmony_ci 199062306a36Sopenharmony_ci /* LO calibration setting */ 199162306a36Sopenharmony_ci rtl_set_bbreg(hw, RIQK_AGC_RSP, MASKDWORD, 0x00462911); 199262306a36Sopenharmony_ci 199362306a36Sopenharmony_ci /*One shot, path B LOK & IQK*/ 199462306a36Sopenharmony_ci rtl_set_bbreg(hw, RIQK_AGC_PTS, MASKDWORD, 0xfa000000); 199562306a36Sopenharmony_ci rtl_set_bbreg(hw, RIQK_AGC_PTS, MASKDWORD, 0xf8000000); 199662306a36Sopenharmony_ci 199762306a36Sopenharmony_ci mdelay(IQK_DELAY_TIME); 199862306a36Sopenharmony_ci 199962306a36Sopenharmony_ci reg_eac = rtl_get_bbreg(hw, 0xeac, MASKDWORD); 200062306a36Sopenharmony_ci reg_eb4 = rtl_get_bbreg(hw, 0xeb4, MASKDWORD); 200162306a36Sopenharmony_ci reg_ebc = rtl_get_bbreg(hw, 0xebc, MASKDWORD); 200262306a36Sopenharmony_ci 200362306a36Sopenharmony_ci if (!(reg_eac & BIT(31)) && 200462306a36Sopenharmony_ci (((reg_eb4 & 0x03FF0000) >> 16) != 0x142) && 200562306a36Sopenharmony_ci (((reg_ebc & 0x03FF0000) >> 16) != 0x42)) 200662306a36Sopenharmony_ci result |= 0x01; 200762306a36Sopenharmony_ci else 200862306a36Sopenharmony_ci return result; 200962306a36Sopenharmony_ci 201062306a36Sopenharmony_ci return result; 201162306a36Sopenharmony_ci} 201262306a36Sopenharmony_ci 201362306a36Sopenharmony_cistatic u8 _rtl92ee_phy_path_a_rx_iqk(struct ieee80211_hw *hw, bool config_pathb) 201462306a36Sopenharmony_ci{ 201562306a36Sopenharmony_ci u32 reg_eac, reg_e94, reg_e9c, reg_ea4 , u32temp; 201662306a36Sopenharmony_ci u8 result = 0x00; 201762306a36Sopenharmony_ci 201862306a36Sopenharmony_ci /*Get TXIMR Setting*/ 201962306a36Sopenharmony_ci /*Modify RX IQK mode table*/ 202062306a36Sopenharmony_ci rtl_set_bbreg(hw, RFPGA0_IQK, MASKDWORD, 0x00000000); 202162306a36Sopenharmony_ci 202262306a36Sopenharmony_ci rtl_set_rfreg(hw, RF90_PATH_A, RF_WE_LUT, RFREG_OFFSET_MASK, 0x800a0); 202362306a36Sopenharmony_ci rtl_set_rfreg(hw, RF90_PATH_A, RF_RCK_OS, RFREG_OFFSET_MASK, 0x30000); 202462306a36Sopenharmony_ci rtl_set_rfreg(hw, RF90_PATH_A, RF_TXPA_G1, RFREG_OFFSET_MASK, 0x0000f); 202562306a36Sopenharmony_ci rtl_set_rfreg(hw, RF90_PATH_A, RF_TXPA_G2, RFREG_OFFSET_MASK, 0xf117b); 202662306a36Sopenharmony_ci 202762306a36Sopenharmony_ci /*PA/PAD control by 0x56, and set = 0x0*/ 202862306a36Sopenharmony_ci rtl_set_rfreg(hw, RF90_PATH_A, 0xdf, RFREG_OFFSET_MASK, 0x980); 202962306a36Sopenharmony_ci rtl_set_rfreg(hw, RF90_PATH_A, 0x56, RFREG_OFFSET_MASK, 0x51000); 203062306a36Sopenharmony_ci 203162306a36Sopenharmony_ci /*enter IQK mode*/ 203262306a36Sopenharmony_ci rtl_set_bbreg(hw, RFPGA0_IQK, MASKDWORD, 0x80800000); 203362306a36Sopenharmony_ci 203462306a36Sopenharmony_ci /*IQK Setting*/ 203562306a36Sopenharmony_ci rtl_set_bbreg(hw, RTX_IQK, MASKDWORD, 0x01007c00); 203662306a36Sopenharmony_ci rtl_set_bbreg(hw, RRX_IQK, MASKDWORD, 0x01004800); 203762306a36Sopenharmony_ci 203862306a36Sopenharmony_ci /*path a IQK setting*/ 203962306a36Sopenharmony_ci rtl_set_bbreg(hw, RTX_IQK_TONE_A, MASKDWORD, 0x18008c1c); 204062306a36Sopenharmony_ci rtl_set_bbreg(hw, RRX_IQK_TONE_A, MASKDWORD, 0x38008c1c); 204162306a36Sopenharmony_ci rtl_set_bbreg(hw, RTX_IQK_TONE_B, MASKDWORD, 0x38008c1c); 204262306a36Sopenharmony_ci rtl_set_bbreg(hw, RRX_IQK_TONE_B, MASKDWORD, 0x38008c1c); 204362306a36Sopenharmony_ci 204462306a36Sopenharmony_ci rtl_set_bbreg(hw, RTX_IQK_PI_A, MASKDWORD, 0x82160c1f); 204562306a36Sopenharmony_ci rtl_set_bbreg(hw, RRX_IQK_PI_A, MASKDWORD, 0x68160c1f); 204662306a36Sopenharmony_ci 204762306a36Sopenharmony_ci /*LO calibration Setting*/ 204862306a36Sopenharmony_ci rtl_set_bbreg(hw, RIQK_AGC_RSP, MASKDWORD, 0x0046a911); 204962306a36Sopenharmony_ci 205062306a36Sopenharmony_ci /*one shot,path A LOK & iqk*/ 205162306a36Sopenharmony_ci rtl_set_bbreg(hw, RIQK_AGC_PTS, MASKDWORD, 0xfa000000); 205262306a36Sopenharmony_ci rtl_set_bbreg(hw, RIQK_AGC_PTS, MASKDWORD, 0xf8000000); 205362306a36Sopenharmony_ci 205462306a36Sopenharmony_ci mdelay(IQK_DELAY_TIME); 205562306a36Sopenharmony_ci 205662306a36Sopenharmony_ci /* Check failed */ 205762306a36Sopenharmony_ci reg_eac = rtl_get_bbreg(hw, RRX_POWER_AFTER_IQK_A_2, MASKDWORD); 205862306a36Sopenharmony_ci reg_e94 = rtl_get_bbreg(hw, RTX_POWER_BEFORE_IQK_A, MASKDWORD); 205962306a36Sopenharmony_ci reg_e9c = rtl_get_bbreg(hw, RTX_POWER_AFTER_IQK_A, MASKDWORD); 206062306a36Sopenharmony_ci 206162306a36Sopenharmony_ci if (!(reg_eac & BIT(28)) && 206262306a36Sopenharmony_ci (((reg_e94 & 0x03FF0000) >> 16) != 0x142) && 206362306a36Sopenharmony_ci (((reg_e9c & 0x03FF0000) >> 16) != 0x42)) { 206462306a36Sopenharmony_ci result |= 0x01; 206562306a36Sopenharmony_ci } else { 206662306a36Sopenharmony_ci /* PA/PAD controlled by 0x0 */ 206762306a36Sopenharmony_ci rtl_set_bbreg(hw, RFPGA0_IQK, MASKDWORD, 0x00000000); 206862306a36Sopenharmony_ci rtl_set_rfreg(hw, RF90_PATH_A, 0xdf, RFREG_OFFSET_MASK, 0x180); 206962306a36Sopenharmony_ci return result; 207062306a36Sopenharmony_ci } 207162306a36Sopenharmony_ci 207262306a36Sopenharmony_ci u32temp = 0x80007C00 | (reg_e94 & 0x3FF0000) | 207362306a36Sopenharmony_ci ((reg_e9c & 0x3FF0000) >> 16); 207462306a36Sopenharmony_ci rtl_set_bbreg(hw, RTX_IQK, MASKDWORD, u32temp); 207562306a36Sopenharmony_ci /*RX IQK*/ 207662306a36Sopenharmony_ci /*Modify RX IQK mode table*/ 207762306a36Sopenharmony_ci rtl_set_bbreg(hw, RFPGA0_IQK, MASKDWORD, 0x00000000); 207862306a36Sopenharmony_ci 207962306a36Sopenharmony_ci rtl_set_rfreg(hw, RF90_PATH_A, RF_WE_LUT, RFREG_OFFSET_MASK, 0x800a0); 208062306a36Sopenharmony_ci 208162306a36Sopenharmony_ci rtl_set_rfreg(hw, RF90_PATH_A, RF_RCK_OS, RFREG_OFFSET_MASK, 0x30000); 208262306a36Sopenharmony_ci rtl_set_rfreg(hw, RF90_PATH_A, RF_TXPA_G1, RFREG_OFFSET_MASK, 0x0000f); 208362306a36Sopenharmony_ci rtl_set_rfreg(hw, RF90_PATH_A, RF_TXPA_G2, RFREG_OFFSET_MASK, 0xf7ffa); 208462306a36Sopenharmony_ci 208562306a36Sopenharmony_ci /*PA/PAD control by 0x56, and set = 0x0*/ 208662306a36Sopenharmony_ci rtl_set_rfreg(hw, RF90_PATH_A, 0xdf, RFREG_OFFSET_MASK, 0x980); 208762306a36Sopenharmony_ci rtl_set_rfreg(hw, RF90_PATH_A, 0x56, RFREG_OFFSET_MASK, 0x51000); 208862306a36Sopenharmony_ci 208962306a36Sopenharmony_ci /*enter IQK mode*/ 209062306a36Sopenharmony_ci rtl_set_bbreg(hw, RFPGA0_IQK, MASKDWORD, 0x80800000); 209162306a36Sopenharmony_ci 209262306a36Sopenharmony_ci /*IQK Setting*/ 209362306a36Sopenharmony_ci rtl_set_bbreg(hw, RRX_IQK, MASKDWORD, 0x01004800); 209462306a36Sopenharmony_ci 209562306a36Sopenharmony_ci /*path a IQK setting*/ 209662306a36Sopenharmony_ci rtl_set_bbreg(hw, RTX_IQK_TONE_A, MASKDWORD, 0x38008c1c); 209762306a36Sopenharmony_ci rtl_set_bbreg(hw, RRX_IQK_TONE_A, MASKDWORD, 0x18008c1c); 209862306a36Sopenharmony_ci rtl_set_bbreg(hw, RTX_IQK_TONE_B, MASKDWORD, 0x38008c1c); 209962306a36Sopenharmony_ci rtl_set_bbreg(hw, RRX_IQK_TONE_B, MASKDWORD, 0x38008c1c); 210062306a36Sopenharmony_ci 210162306a36Sopenharmony_ci rtl_set_bbreg(hw, RTX_IQK_PI_A, MASKDWORD, 0x82160c1f); 210262306a36Sopenharmony_ci rtl_set_bbreg(hw, RRX_IQK_PI_A, MASKDWORD, 0x28160c1f); 210362306a36Sopenharmony_ci 210462306a36Sopenharmony_ci /*LO calibration Setting*/ 210562306a36Sopenharmony_ci rtl_set_bbreg(hw, RIQK_AGC_RSP, MASKDWORD, 0x0046a891); 210662306a36Sopenharmony_ci /*one shot,path A LOK & iqk*/ 210762306a36Sopenharmony_ci rtl_set_bbreg(hw, RIQK_AGC_PTS, MASKDWORD, 0xfa000000); 210862306a36Sopenharmony_ci rtl_set_bbreg(hw, RIQK_AGC_PTS, MASKDWORD, 0xf8000000); 210962306a36Sopenharmony_ci 211062306a36Sopenharmony_ci mdelay(IQK_DELAY_TIME); 211162306a36Sopenharmony_ci /*Check failed*/ 211262306a36Sopenharmony_ci reg_eac = rtl_get_bbreg(hw, RRX_POWER_AFTER_IQK_A_2, MASKDWORD); 211362306a36Sopenharmony_ci reg_ea4 = rtl_get_bbreg(hw, RRX_POWER_BEFORE_IQK_A_2, MASKDWORD); 211462306a36Sopenharmony_ci 211562306a36Sopenharmony_ci /*PA/PAD controlled by 0x0*/ 211662306a36Sopenharmony_ci /*leave IQK mode*/ 211762306a36Sopenharmony_ci rtl_set_bbreg(hw, RFPGA0_IQK, MASKDWORD, 0x00000000); 211862306a36Sopenharmony_ci rtl_set_rfreg(hw, RF90_PATH_A, 0xdf, RFREG_OFFSET_MASK, 0x180); 211962306a36Sopenharmony_ci /*if Tx is OK, check whether Rx is OK*/ 212062306a36Sopenharmony_ci if (!(reg_eac & BIT(27)) && 212162306a36Sopenharmony_ci (((reg_ea4 & 0x03FF0000) >> 16) != 0x132) && 212262306a36Sopenharmony_ci (((reg_eac & 0x03FF0000) >> 16) != 0x36)) 212362306a36Sopenharmony_ci result |= 0x02; 212462306a36Sopenharmony_ci 212562306a36Sopenharmony_ci return result; 212662306a36Sopenharmony_ci} 212762306a36Sopenharmony_ci 212862306a36Sopenharmony_cistatic u8 _rtl92ee_phy_path_b_rx_iqk(struct ieee80211_hw *hw, bool config_pathb) 212962306a36Sopenharmony_ci{ 213062306a36Sopenharmony_ci struct rtl_priv *rtlpriv = rtl_priv(hw); 213162306a36Sopenharmony_ci u32 reg_eac, reg_eb4, reg_ebc, reg_ecc, reg_ec4, u32temp; 213262306a36Sopenharmony_ci u8 result = 0x00; 213362306a36Sopenharmony_ci 213462306a36Sopenharmony_ci /*Get TXIMR Setting*/ 213562306a36Sopenharmony_ci /*Modify RX IQK mode table*/ 213662306a36Sopenharmony_ci rtl_set_bbreg(hw, RFPGA0_IQK, MASKDWORD, 0x00000000); 213762306a36Sopenharmony_ci 213862306a36Sopenharmony_ci rtl_set_rfreg(hw, RF90_PATH_B, RF_WE_LUT, RFREG_OFFSET_MASK, 0x800a0); 213962306a36Sopenharmony_ci rtl_set_rfreg(hw, RF90_PATH_B, RF_RCK_OS, RFREG_OFFSET_MASK, 0x30000); 214062306a36Sopenharmony_ci rtl_set_rfreg(hw, RF90_PATH_B, RF_TXPA_G1, RFREG_OFFSET_MASK, 0x0000f); 214162306a36Sopenharmony_ci rtl_set_rfreg(hw, RF90_PATH_B, RF_TXPA_G2, RFREG_OFFSET_MASK, 0xf117b); 214262306a36Sopenharmony_ci 214362306a36Sopenharmony_ci /*PA/PAD all off*/ 214462306a36Sopenharmony_ci rtl_set_rfreg(hw, RF90_PATH_B, 0xdf, RFREG_OFFSET_MASK, 0x980); 214562306a36Sopenharmony_ci rtl_set_rfreg(hw, RF90_PATH_B, 0x56, RFREG_OFFSET_MASK, 0x51000); 214662306a36Sopenharmony_ci 214762306a36Sopenharmony_ci rtl_set_bbreg(hw, RFPGA0_IQK, MASKDWORD, 0x80800000); 214862306a36Sopenharmony_ci 214962306a36Sopenharmony_ci /*IQK Setting*/ 215062306a36Sopenharmony_ci rtl_set_bbreg(hw, RTX_IQK, MASKDWORD, 0x01007c00); 215162306a36Sopenharmony_ci rtl_set_bbreg(hw, RRX_IQK, MASKDWORD, 0x01004800); 215262306a36Sopenharmony_ci 215362306a36Sopenharmony_ci /*path a IQK setting*/ 215462306a36Sopenharmony_ci rtl_set_bbreg(hw, RTX_IQK_TONE_A, MASKDWORD, 0x38008c1c); 215562306a36Sopenharmony_ci rtl_set_bbreg(hw, RRX_IQK_TONE_A, MASKDWORD, 0x38008c1c); 215662306a36Sopenharmony_ci rtl_set_bbreg(hw, RTX_IQK_TONE_B, MASKDWORD, 0x18008c1c); 215762306a36Sopenharmony_ci rtl_set_bbreg(hw, RRX_IQK_TONE_B, MASKDWORD, 0x38008c1c); 215862306a36Sopenharmony_ci 215962306a36Sopenharmony_ci rtl_set_bbreg(hw, RTX_IQK_PI_B, MASKDWORD, 0x82160c1f); 216062306a36Sopenharmony_ci rtl_set_bbreg(hw, RRX_IQK_PI_B, MASKDWORD, 0x68160c1f); 216162306a36Sopenharmony_ci 216262306a36Sopenharmony_ci /*LO calibration Setting*/ 216362306a36Sopenharmony_ci rtl_set_bbreg(hw, RIQK_AGC_RSP, MASKDWORD, 0x0046a911); 216462306a36Sopenharmony_ci 216562306a36Sopenharmony_ci /*one shot,path A LOK & iqk*/ 216662306a36Sopenharmony_ci rtl_set_bbreg(hw, RIQK_AGC_PTS, MASKDWORD, 0xfa000000); 216762306a36Sopenharmony_ci rtl_set_bbreg(hw, RIQK_AGC_PTS, MASKDWORD, 0xf8000000); 216862306a36Sopenharmony_ci 216962306a36Sopenharmony_ci mdelay(IQK_DELAY_TIME); 217062306a36Sopenharmony_ci 217162306a36Sopenharmony_ci /* Check failed */ 217262306a36Sopenharmony_ci reg_eac = rtl_get_bbreg(hw, RRX_POWER_AFTER_IQK_A_2, MASKDWORD); 217362306a36Sopenharmony_ci reg_eb4 = rtl_get_bbreg(hw, RTX_POWER_BEFORE_IQK_B, MASKDWORD); 217462306a36Sopenharmony_ci reg_ebc = rtl_get_bbreg(hw, RTX_POWER_AFTER_IQK_B, MASKDWORD); 217562306a36Sopenharmony_ci 217662306a36Sopenharmony_ci if (!(reg_eac & BIT(31)) && 217762306a36Sopenharmony_ci (((reg_eb4 & 0x03FF0000) >> 16) != 0x142) && 217862306a36Sopenharmony_ci (((reg_ebc & 0x03FF0000) >> 16) != 0x42)) { 217962306a36Sopenharmony_ci result |= 0x01; 218062306a36Sopenharmony_ci } else { 218162306a36Sopenharmony_ci /* PA/PAD controlled by 0x0 */ 218262306a36Sopenharmony_ci rtl_set_bbreg(hw, RFPGA0_IQK, MASKDWORD, 0x00000000); 218362306a36Sopenharmony_ci rtl_set_rfreg(hw, RF90_PATH_B, 0xdf, RFREG_OFFSET_MASK, 0x180); 218462306a36Sopenharmony_ci return result; 218562306a36Sopenharmony_ci } 218662306a36Sopenharmony_ci 218762306a36Sopenharmony_ci u32temp = 0x80007C00 | (reg_eb4 & 0x3FF0000) | 218862306a36Sopenharmony_ci ((reg_ebc & 0x3FF0000) >> 16); 218962306a36Sopenharmony_ci rtl_set_bbreg(hw, RTX_IQK, MASKDWORD, u32temp); 219062306a36Sopenharmony_ci /*RX IQK*/ 219162306a36Sopenharmony_ci /*Modify RX IQK mode table*/ 219262306a36Sopenharmony_ci rtl_set_bbreg(hw, RFPGA0_IQK, MASKDWORD, 0x00000000); 219362306a36Sopenharmony_ci rtl_set_rfreg(hw, RF90_PATH_B, RF_WE_LUT, RFREG_OFFSET_MASK, 0x800a0); 219462306a36Sopenharmony_ci 219562306a36Sopenharmony_ci rtl_set_rfreg(hw, RF90_PATH_B, RF_RCK_OS, RFREG_OFFSET_MASK, 0x30000); 219662306a36Sopenharmony_ci rtl_set_rfreg(hw, RF90_PATH_B, RF_TXPA_G1, RFREG_OFFSET_MASK, 0x0000f); 219762306a36Sopenharmony_ci rtl_set_rfreg(hw, RF90_PATH_B, RF_TXPA_G2, RFREG_OFFSET_MASK, 0xf7ffa); 219862306a36Sopenharmony_ci 219962306a36Sopenharmony_ci /*PA/PAD all off*/ 220062306a36Sopenharmony_ci rtl_set_rfreg(hw, RF90_PATH_B, 0xdf, RFREG_OFFSET_MASK, 0x980); 220162306a36Sopenharmony_ci rtl_set_rfreg(hw, RF90_PATH_B, 0x56, RFREG_OFFSET_MASK, 0x51000); 220262306a36Sopenharmony_ci 220362306a36Sopenharmony_ci /*enter IQK mode*/ 220462306a36Sopenharmony_ci rtl_set_bbreg(hw, RFPGA0_IQK, MASKDWORD, 0x80800000); 220562306a36Sopenharmony_ci 220662306a36Sopenharmony_ci /*IQK Setting*/ 220762306a36Sopenharmony_ci rtl_set_bbreg(hw, RRX_IQK, MASKDWORD, 0x01004800); 220862306a36Sopenharmony_ci 220962306a36Sopenharmony_ci /*path b IQK setting*/ 221062306a36Sopenharmony_ci rtl_set_bbreg(hw, RTX_IQK_TONE_A, MASKDWORD, 0x38008c1c); 221162306a36Sopenharmony_ci rtl_set_bbreg(hw, RRX_IQK_TONE_A, MASKDWORD, 0x38008c1c); 221262306a36Sopenharmony_ci rtl_set_bbreg(hw, RTX_IQK_TONE_B, MASKDWORD, 0x38008c1c); 221362306a36Sopenharmony_ci rtl_set_bbreg(hw, RRX_IQK_TONE_B, MASKDWORD, 0x18008c1c); 221462306a36Sopenharmony_ci 221562306a36Sopenharmony_ci rtl_set_bbreg(hw, RTX_IQK_PI_B, MASKDWORD, 0x82160c1f); 221662306a36Sopenharmony_ci rtl_set_bbreg(hw, RRX_IQK_PI_B, MASKDWORD, 0x28160c1f); 221762306a36Sopenharmony_ci 221862306a36Sopenharmony_ci /*LO calibration Setting*/ 221962306a36Sopenharmony_ci rtl_set_bbreg(hw, RIQK_AGC_RSP, MASKDWORD, 0x0046a891); 222062306a36Sopenharmony_ci /*one shot,path A LOK & iqk*/ 222162306a36Sopenharmony_ci rtl_set_bbreg(hw, RIQK_AGC_PTS, MASKDWORD, 0xfa000000); 222262306a36Sopenharmony_ci rtl_set_bbreg(hw, RIQK_AGC_PTS, MASKDWORD, 0xf8000000); 222362306a36Sopenharmony_ci 222462306a36Sopenharmony_ci mdelay(IQK_DELAY_TIME); 222562306a36Sopenharmony_ci /*Check failed*/ 222662306a36Sopenharmony_ci reg_eac = rtl_get_bbreg(hw, RRX_POWER_AFTER_IQK_A_2, MASKDWORD); 222762306a36Sopenharmony_ci reg_ec4 = rtl_get_bbreg(hw, RRX_POWER_BEFORE_IQK_B_2, MASKDWORD); 222862306a36Sopenharmony_ci reg_ecc = rtl_get_bbreg(hw, RRX_POWER_AFTER_IQK_B_2, MASKDWORD); 222962306a36Sopenharmony_ci /*PA/PAD controlled by 0x0*/ 223062306a36Sopenharmony_ci /*leave IQK mode*/ 223162306a36Sopenharmony_ci rtl_set_bbreg(hw, RFPGA0_IQK, MASKDWORD, 0x00000000); 223262306a36Sopenharmony_ci rtl_set_rfreg(hw, RF90_PATH_B, 0xdf, RFREG_OFFSET_MASK, 0x180); 223362306a36Sopenharmony_ci /*if Tx is OK, check whether Rx is OK*/ 223462306a36Sopenharmony_ci if (!(reg_eac & BIT(30)) && 223562306a36Sopenharmony_ci (((reg_ec4 & 0x03FF0000) >> 16) != 0x132) && 223662306a36Sopenharmony_ci (((reg_ecc & 0x03FF0000) >> 16) != 0x36)) 223762306a36Sopenharmony_ci result |= 0x02; 223862306a36Sopenharmony_ci else 223962306a36Sopenharmony_ci rtl_dbg(rtlpriv, COMP_RF, DBG_LOUD, "Path B Rx IQK fail!!\n"); 224062306a36Sopenharmony_ci 224162306a36Sopenharmony_ci return result; 224262306a36Sopenharmony_ci} 224362306a36Sopenharmony_ci 224462306a36Sopenharmony_cistatic void _rtl92ee_phy_path_a_fill_iqk_matrix(struct ieee80211_hw *hw, 224562306a36Sopenharmony_ci bool b_iqk_ok, long result[][8], 224662306a36Sopenharmony_ci u8 final_candidate, 224762306a36Sopenharmony_ci bool btxonly) 224862306a36Sopenharmony_ci{ 224962306a36Sopenharmony_ci u32 oldval_0, x, tx0_a, reg; 225062306a36Sopenharmony_ci long y, tx0_c; 225162306a36Sopenharmony_ci 225262306a36Sopenharmony_ci if (final_candidate == 0xFF) { 225362306a36Sopenharmony_ci return; 225462306a36Sopenharmony_ci } else if (b_iqk_ok) { 225562306a36Sopenharmony_ci oldval_0 = (rtl_get_bbreg(hw, ROFDM0_XATXIQIMBALANCE, 225662306a36Sopenharmony_ci MASKDWORD) >> 22) & 0x3FF; 225762306a36Sopenharmony_ci x = result[final_candidate][0]; 225862306a36Sopenharmony_ci if ((x & 0x00000200) != 0) 225962306a36Sopenharmony_ci x = x | 0xFFFFFC00; 226062306a36Sopenharmony_ci tx0_a = (x * oldval_0) >> 8; 226162306a36Sopenharmony_ci rtl_set_bbreg(hw, ROFDM0_XATXIQIMBALANCE, 0x3FF, tx0_a); 226262306a36Sopenharmony_ci rtl_set_bbreg(hw, ROFDM0_ECCATHRESHOLD, BIT(31), 226362306a36Sopenharmony_ci ((x * oldval_0 >> 7) & 0x1)); 226462306a36Sopenharmony_ci y = result[final_candidate][1]; 226562306a36Sopenharmony_ci if ((y & 0x00000200) != 0) 226662306a36Sopenharmony_ci y = y | 0xFFFFFC00; 226762306a36Sopenharmony_ci tx0_c = (y * oldval_0) >> 8; 226862306a36Sopenharmony_ci rtl_set_bbreg(hw, ROFDM0_XCTXAFE, 0xF0000000, 226962306a36Sopenharmony_ci ((tx0_c & 0x3C0) >> 6)); 227062306a36Sopenharmony_ci rtl_set_bbreg(hw, ROFDM0_XATXIQIMBALANCE, 0x003F0000, 227162306a36Sopenharmony_ci (tx0_c & 0x3F)); 227262306a36Sopenharmony_ci rtl_set_bbreg(hw, ROFDM0_ECCATHRESHOLD, BIT(29), 227362306a36Sopenharmony_ci ((y * oldval_0 >> 7) & 0x1)); 227462306a36Sopenharmony_ci 227562306a36Sopenharmony_ci if (btxonly) 227662306a36Sopenharmony_ci return; 227762306a36Sopenharmony_ci 227862306a36Sopenharmony_ci reg = result[final_candidate][2]; 227962306a36Sopenharmony_ci rtl_set_bbreg(hw, ROFDM0_XARXIQIMBALANCE, 0x3FF, reg); 228062306a36Sopenharmony_ci 228162306a36Sopenharmony_ci reg = result[final_candidate][3] & 0x3F; 228262306a36Sopenharmony_ci rtl_set_bbreg(hw, ROFDM0_XARXIQIMBALANCE, 0xFC00, reg); 228362306a36Sopenharmony_ci 228462306a36Sopenharmony_ci reg = (result[final_candidate][3] >> 6) & 0xF; 228562306a36Sopenharmony_ci rtl_set_bbreg(hw, ROFDM0_RXIQEXTANTA, 0xF0000000, reg); 228662306a36Sopenharmony_ci } 228762306a36Sopenharmony_ci} 228862306a36Sopenharmony_ci 228962306a36Sopenharmony_cistatic void _rtl92ee_phy_path_b_fill_iqk_matrix(struct ieee80211_hw *hw, 229062306a36Sopenharmony_ci bool b_iqk_ok, long result[][8], 229162306a36Sopenharmony_ci u8 final_candidate, 229262306a36Sopenharmony_ci bool btxonly) 229362306a36Sopenharmony_ci{ 229462306a36Sopenharmony_ci u32 oldval_1, x, tx1_a, reg; 229562306a36Sopenharmony_ci long y, tx1_c; 229662306a36Sopenharmony_ci 229762306a36Sopenharmony_ci if (final_candidate == 0xFF) { 229862306a36Sopenharmony_ci return; 229962306a36Sopenharmony_ci } else if (b_iqk_ok) { 230062306a36Sopenharmony_ci oldval_1 = (rtl_get_bbreg(hw, ROFDM0_XATXIQIMBALANCE, 230162306a36Sopenharmony_ci MASKDWORD) >> 22) & 0x3FF; 230262306a36Sopenharmony_ci x = result[final_candidate][4]; 230362306a36Sopenharmony_ci if ((x & 0x00000200) != 0) 230462306a36Sopenharmony_ci x = x | 0xFFFFFC00; 230562306a36Sopenharmony_ci tx1_a = (x * oldval_1) >> 8; 230662306a36Sopenharmony_ci rtl_set_bbreg(hw, ROFDM0_XATXIQIMBALANCE, 0x3FF, tx1_a); 230762306a36Sopenharmony_ci rtl_set_bbreg(hw, ROFDM0_ECCATHRESHOLD, BIT(27), 230862306a36Sopenharmony_ci ((x * oldval_1 >> 7) & 0x1)); 230962306a36Sopenharmony_ci y = result[final_candidate][5]; 231062306a36Sopenharmony_ci if ((y & 0x00000200) != 0) 231162306a36Sopenharmony_ci y = y | 0xFFFFFC00; 231262306a36Sopenharmony_ci tx1_c = (y * oldval_1) >> 8; 231362306a36Sopenharmony_ci rtl_set_bbreg(hw, ROFDM0_XDTXAFE, 0xF0000000, 231462306a36Sopenharmony_ci ((tx1_c & 0x3C0) >> 6)); 231562306a36Sopenharmony_ci rtl_set_bbreg(hw, ROFDM0_XBTXIQIMBALANCE, 0x003F0000, 231662306a36Sopenharmony_ci (tx1_c & 0x3F)); 231762306a36Sopenharmony_ci rtl_set_bbreg(hw, ROFDM0_ECCATHRESHOLD, BIT(25), 231862306a36Sopenharmony_ci ((y * oldval_1 >> 7) & 0x1)); 231962306a36Sopenharmony_ci 232062306a36Sopenharmony_ci if (btxonly) 232162306a36Sopenharmony_ci return; 232262306a36Sopenharmony_ci 232362306a36Sopenharmony_ci reg = result[final_candidate][6]; 232462306a36Sopenharmony_ci rtl_set_bbreg(hw, ROFDM0_XBRXIQIMBALANCE, 0x3FF, reg); 232562306a36Sopenharmony_ci 232662306a36Sopenharmony_ci reg = result[final_candidate][7] & 0x3F; 232762306a36Sopenharmony_ci rtl_set_bbreg(hw, ROFDM0_XBRXIQIMBALANCE, 0xFC00, reg); 232862306a36Sopenharmony_ci 232962306a36Sopenharmony_ci reg = (result[final_candidate][7] >> 6) & 0xF; 233062306a36Sopenharmony_ci rtl_set_bbreg(hw, ROFDM0_AGCRSSITABLE, 0xF0000000, reg); 233162306a36Sopenharmony_ci } 233262306a36Sopenharmony_ci} 233362306a36Sopenharmony_ci 233462306a36Sopenharmony_cistatic void _rtl92ee_phy_save_adda_registers(struct ieee80211_hw *hw, 233562306a36Sopenharmony_ci u32 *addareg, u32 *addabackup, 233662306a36Sopenharmony_ci u32 registernum) 233762306a36Sopenharmony_ci{ 233862306a36Sopenharmony_ci u32 i; 233962306a36Sopenharmony_ci 234062306a36Sopenharmony_ci for (i = 0; i < registernum; i++) 234162306a36Sopenharmony_ci addabackup[i] = rtl_get_bbreg(hw, addareg[i], MASKDWORD); 234262306a36Sopenharmony_ci} 234362306a36Sopenharmony_ci 234462306a36Sopenharmony_cistatic void _rtl92ee_phy_save_mac_registers(struct ieee80211_hw *hw, 234562306a36Sopenharmony_ci u32 *macreg, u32 *macbackup) 234662306a36Sopenharmony_ci{ 234762306a36Sopenharmony_ci struct rtl_priv *rtlpriv = rtl_priv(hw); 234862306a36Sopenharmony_ci u32 i; 234962306a36Sopenharmony_ci 235062306a36Sopenharmony_ci for (i = 0; i < (IQK_MAC_REG_NUM - 1); i++) 235162306a36Sopenharmony_ci macbackup[i] = rtl_read_byte(rtlpriv, macreg[i]); 235262306a36Sopenharmony_ci 235362306a36Sopenharmony_ci macbackup[i] = rtl_read_dword(rtlpriv, macreg[i]); 235462306a36Sopenharmony_ci} 235562306a36Sopenharmony_ci 235662306a36Sopenharmony_cistatic void _rtl92ee_phy_reload_adda_registers(struct ieee80211_hw *hw, 235762306a36Sopenharmony_ci u32 *addareg, u32 *addabackup, 235862306a36Sopenharmony_ci u32 regiesternum) 235962306a36Sopenharmony_ci{ 236062306a36Sopenharmony_ci u32 i; 236162306a36Sopenharmony_ci 236262306a36Sopenharmony_ci for (i = 0; i < regiesternum; i++) 236362306a36Sopenharmony_ci rtl_set_bbreg(hw, addareg[i], MASKDWORD, addabackup[i]); 236462306a36Sopenharmony_ci} 236562306a36Sopenharmony_ci 236662306a36Sopenharmony_cistatic void _rtl92ee_phy_reload_mac_registers(struct ieee80211_hw *hw, 236762306a36Sopenharmony_ci u32 *macreg, u32 *macbackup) 236862306a36Sopenharmony_ci{ 236962306a36Sopenharmony_ci struct rtl_priv *rtlpriv = rtl_priv(hw); 237062306a36Sopenharmony_ci u32 i; 237162306a36Sopenharmony_ci 237262306a36Sopenharmony_ci for (i = 0; i < (IQK_MAC_REG_NUM - 1); i++) 237362306a36Sopenharmony_ci rtl_write_byte(rtlpriv, macreg[i], (u8)macbackup[i]); 237462306a36Sopenharmony_ci rtl_write_dword(rtlpriv, macreg[i], macbackup[i]); 237562306a36Sopenharmony_ci} 237662306a36Sopenharmony_ci 237762306a36Sopenharmony_cistatic void _rtl92ee_phy_path_adda_on(struct ieee80211_hw *hw, u32 *addareg, 237862306a36Sopenharmony_ci bool is_patha_on, bool is2t) 237962306a36Sopenharmony_ci{ 238062306a36Sopenharmony_ci u32 i; 238162306a36Sopenharmony_ci 238262306a36Sopenharmony_ci for (i = 0; i < IQK_ADDA_REG_NUM; i++) 238362306a36Sopenharmony_ci rtl_set_bbreg(hw, addareg[i], MASKDWORD, 0x0fc01616); 238462306a36Sopenharmony_ci} 238562306a36Sopenharmony_ci 238662306a36Sopenharmony_cistatic void _rtl92ee_phy_mac_setting_calibration(struct ieee80211_hw *hw, 238762306a36Sopenharmony_ci u32 *macreg, u32 *macbackup) 238862306a36Sopenharmony_ci{ 238962306a36Sopenharmony_ci rtl_set_bbreg(hw, 0x520, 0x00ff0000, 0xff); 239062306a36Sopenharmony_ci} 239162306a36Sopenharmony_ci 239262306a36Sopenharmony_cistatic void _rtl92ee_phy_path_a_standby(struct ieee80211_hw *hw) 239362306a36Sopenharmony_ci{ 239462306a36Sopenharmony_ci rtl_set_bbreg(hw, 0xe28, MASKDWORD, 0x0); 239562306a36Sopenharmony_ci rtl_set_rfreg(hw, RF90_PATH_A, 0, RFREG_OFFSET_MASK, 0x10000); 239662306a36Sopenharmony_ci rtl_set_bbreg(hw, 0xe28, MASKDWORD, 0x80800000); 239762306a36Sopenharmony_ci} 239862306a36Sopenharmony_ci 239962306a36Sopenharmony_cistatic bool _rtl92ee_phy_simularity_compare(struct ieee80211_hw *hw, 240062306a36Sopenharmony_ci long result[][8], u8 c1, u8 c2) 240162306a36Sopenharmony_ci{ 240262306a36Sopenharmony_ci u32 i, j, diff, simularity_bitmap, bound; 240362306a36Sopenharmony_ci 240462306a36Sopenharmony_ci u8 final_candidate[2] = { 0xFF, 0xFF }; 240562306a36Sopenharmony_ci bool bresult = true/*, is2t = true*/; 240662306a36Sopenharmony_ci s32 tmp1, tmp2; 240762306a36Sopenharmony_ci 240862306a36Sopenharmony_ci bound = 8; 240962306a36Sopenharmony_ci 241062306a36Sopenharmony_ci simularity_bitmap = 0; 241162306a36Sopenharmony_ci 241262306a36Sopenharmony_ci for (i = 0; i < bound; i++) { 241362306a36Sopenharmony_ci if ((i == 1) || (i == 3) || (i == 5) || (i == 7)) { 241462306a36Sopenharmony_ci if ((result[c1][i] & 0x00000200) != 0) 241562306a36Sopenharmony_ci tmp1 = result[c1][i] | 0xFFFFFC00; 241662306a36Sopenharmony_ci else 241762306a36Sopenharmony_ci tmp1 = result[c1][i]; 241862306a36Sopenharmony_ci 241962306a36Sopenharmony_ci if ((result[c2][i] & 0x00000200) != 0) 242062306a36Sopenharmony_ci tmp2 = result[c2][i] | 0xFFFFFC00; 242162306a36Sopenharmony_ci else 242262306a36Sopenharmony_ci tmp2 = result[c2][i]; 242362306a36Sopenharmony_ci } else { 242462306a36Sopenharmony_ci tmp1 = result[c1][i]; 242562306a36Sopenharmony_ci tmp2 = result[c2][i]; 242662306a36Sopenharmony_ci } 242762306a36Sopenharmony_ci 242862306a36Sopenharmony_ci diff = (tmp1 > tmp2) ? (tmp1 - tmp2) : (tmp2 - tmp1); 242962306a36Sopenharmony_ci 243062306a36Sopenharmony_ci if (diff > MAX_TOLERANCE) { 243162306a36Sopenharmony_ci if ((i == 2 || i == 6) && !simularity_bitmap) { 243262306a36Sopenharmony_ci if (result[c1][i] + result[c1][i + 1] == 0) 243362306a36Sopenharmony_ci final_candidate[(i / 4)] = c2; 243462306a36Sopenharmony_ci else if (result[c2][i] + result[c2][i + 1] == 0) 243562306a36Sopenharmony_ci final_candidate[(i / 4)] = c1; 243662306a36Sopenharmony_ci else 243762306a36Sopenharmony_ci simularity_bitmap |= (1 << i); 243862306a36Sopenharmony_ci } else { 243962306a36Sopenharmony_ci simularity_bitmap |= (1 << i); 244062306a36Sopenharmony_ci } 244162306a36Sopenharmony_ci } 244262306a36Sopenharmony_ci } 244362306a36Sopenharmony_ci 244462306a36Sopenharmony_ci if (simularity_bitmap == 0) { 244562306a36Sopenharmony_ci for (i = 0; i < (bound / 4); i++) { 244662306a36Sopenharmony_ci if (final_candidate[i] != 0xFF) { 244762306a36Sopenharmony_ci for (j = i * 4; j < (i + 1) * 4 - 2; j++) 244862306a36Sopenharmony_ci result[3][j] = 244962306a36Sopenharmony_ci result[final_candidate[i]][j]; 245062306a36Sopenharmony_ci bresult = false; 245162306a36Sopenharmony_ci } 245262306a36Sopenharmony_ci } 245362306a36Sopenharmony_ci return bresult; 245462306a36Sopenharmony_ci } 245562306a36Sopenharmony_ci if (!(simularity_bitmap & 0x03)) {/*path A TX OK*/ 245662306a36Sopenharmony_ci for (i = 0; i < 2; i++) 245762306a36Sopenharmony_ci result[3][i] = result[c1][i]; 245862306a36Sopenharmony_ci } 245962306a36Sopenharmony_ci if (!(simularity_bitmap & 0x0c)) {/*path A RX OK*/ 246062306a36Sopenharmony_ci for (i = 2; i < 4; i++) 246162306a36Sopenharmony_ci result[3][i] = result[c1][i]; 246262306a36Sopenharmony_ci } 246362306a36Sopenharmony_ci if (!(simularity_bitmap & 0x30)) {/*path B TX OK*/ 246462306a36Sopenharmony_ci for (i = 4; i < 6; i++) 246562306a36Sopenharmony_ci result[3][i] = result[c1][i]; 246662306a36Sopenharmony_ci } 246762306a36Sopenharmony_ci if (!(simularity_bitmap & 0xc0)) {/*path B RX OK*/ 246862306a36Sopenharmony_ci for (i = 6; i < 8; i++) 246962306a36Sopenharmony_ci result[3][i] = result[c1][i]; 247062306a36Sopenharmony_ci } 247162306a36Sopenharmony_ci return false; 247262306a36Sopenharmony_ci} 247362306a36Sopenharmony_ci 247462306a36Sopenharmony_cistatic void _rtl92ee_phy_iq_calibrate(struct ieee80211_hw *hw, 247562306a36Sopenharmony_ci long result[][8], u8 t, bool is2t) 247662306a36Sopenharmony_ci{ 247762306a36Sopenharmony_ci struct rtl_priv *rtlpriv = rtl_priv(hw); 247862306a36Sopenharmony_ci struct rtl_phy *rtlphy = &rtlpriv->phy; 247962306a36Sopenharmony_ci u32 i; 248062306a36Sopenharmony_ci u8 patha_ok, pathb_ok; 248162306a36Sopenharmony_ci u8 tmp_0xc50 = (u8)rtl_get_bbreg(hw, 0xc50, MASKBYTE0); 248262306a36Sopenharmony_ci u8 tmp_0xc58 = (u8)rtl_get_bbreg(hw, 0xc58, MASKBYTE0); 248362306a36Sopenharmony_ci u32 adda_reg[IQK_ADDA_REG_NUM] = { 248462306a36Sopenharmony_ci 0x85c, 0xe6c, 0xe70, 0xe74, 248562306a36Sopenharmony_ci 0xe78, 0xe7c, 0xe80, 0xe84, 248662306a36Sopenharmony_ci 0xe88, 0xe8c, 0xed0, 0xed4, 248762306a36Sopenharmony_ci 0xed8, 0xedc, 0xee0, 0xeec 248862306a36Sopenharmony_ci }; 248962306a36Sopenharmony_ci u32 iqk_mac_reg[IQK_MAC_REG_NUM] = { 249062306a36Sopenharmony_ci 0x522, 0x550, 0x551, 0x040 249162306a36Sopenharmony_ci }; 249262306a36Sopenharmony_ci u32 iqk_bb_reg[IQK_BB_REG_NUM] = { 249362306a36Sopenharmony_ci ROFDM0_TRXPATHENABLE, ROFDM0_TRMUXPAR, 249462306a36Sopenharmony_ci RFPGA0_XCD_RFINTERFACESW, 0xb68, 0xb6c, 249562306a36Sopenharmony_ci 0x870, 0x860, 249662306a36Sopenharmony_ci 0x864, 0x800 249762306a36Sopenharmony_ci }; 249862306a36Sopenharmony_ci const u32 retrycount = 2; 249962306a36Sopenharmony_ci 250062306a36Sopenharmony_ci if (t == 0) { 250162306a36Sopenharmony_ci _rtl92ee_phy_save_adda_registers(hw, adda_reg, 250262306a36Sopenharmony_ci rtlphy->adda_backup, 250362306a36Sopenharmony_ci IQK_ADDA_REG_NUM); 250462306a36Sopenharmony_ci _rtl92ee_phy_save_mac_registers(hw, iqk_mac_reg, 250562306a36Sopenharmony_ci rtlphy->iqk_mac_backup); 250662306a36Sopenharmony_ci _rtl92ee_phy_save_adda_registers(hw, iqk_bb_reg, 250762306a36Sopenharmony_ci rtlphy->iqk_bb_backup, 250862306a36Sopenharmony_ci IQK_BB_REG_NUM); 250962306a36Sopenharmony_ci } 251062306a36Sopenharmony_ci 251162306a36Sopenharmony_ci _rtl92ee_phy_path_adda_on(hw, adda_reg, true, is2t); 251262306a36Sopenharmony_ci 251362306a36Sopenharmony_ci /*BB setting*/ 251462306a36Sopenharmony_ci rtl_set_bbreg(hw, RFPGA0_RFMOD, BIT(24), 0x00); 251562306a36Sopenharmony_ci rtl_set_bbreg(hw, ROFDM0_TRXPATHENABLE, MASKDWORD, 0x03a05600); 251662306a36Sopenharmony_ci rtl_set_bbreg(hw, ROFDM0_TRMUXPAR, MASKDWORD, 0x000800e4); 251762306a36Sopenharmony_ci rtl_set_bbreg(hw, RFPGA0_XCD_RFINTERFACESW, MASKDWORD, 0x22208200); 251862306a36Sopenharmony_ci 251962306a36Sopenharmony_ci rtl_set_bbreg(hw, RFPGA0_XAB_RFINTERFACESW, BIT(10), 0x01); 252062306a36Sopenharmony_ci rtl_set_bbreg(hw, RFPGA0_XAB_RFINTERFACESW, BIT(26), 0x01); 252162306a36Sopenharmony_ci rtl_set_bbreg(hw, RFPGA0_XA_RFINTERFACEOE, BIT(10), 0x01); 252262306a36Sopenharmony_ci rtl_set_bbreg(hw, RFPGA0_XB_RFINTERFACEOE, BIT(10), 0x01); 252362306a36Sopenharmony_ci 252462306a36Sopenharmony_ci _rtl92ee_phy_mac_setting_calibration(hw, iqk_mac_reg, 252562306a36Sopenharmony_ci rtlphy->iqk_mac_backup); 252662306a36Sopenharmony_ci /* Page B init*/ 252762306a36Sopenharmony_ci /* IQ calibration setting*/ 252862306a36Sopenharmony_ci rtl_set_bbreg(hw, RFPGA0_IQK, MASKDWORD, 0x80800000); 252962306a36Sopenharmony_ci rtl_set_bbreg(hw, RTX_IQK, MASKDWORD, 0x01007c00); 253062306a36Sopenharmony_ci rtl_set_bbreg(hw, RRX_IQK, MASKDWORD, 0x01004800); 253162306a36Sopenharmony_ci 253262306a36Sopenharmony_ci for (i = 0 ; i < retrycount ; i++) { 253362306a36Sopenharmony_ci patha_ok = _rtl92ee_phy_path_a_iqk(hw, is2t); 253462306a36Sopenharmony_ci 253562306a36Sopenharmony_ci if (patha_ok == 0x01) { 253662306a36Sopenharmony_ci rtl_dbg(rtlpriv, COMP_RF, DBG_LOUD, 253762306a36Sopenharmony_ci "Path A Tx IQK Success!!\n"); 253862306a36Sopenharmony_ci result[t][0] = (rtl_get_bbreg(hw, 253962306a36Sopenharmony_ci RTX_POWER_BEFORE_IQK_A, 254062306a36Sopenharmony_ci MASKDWORD) & 0x3FF0000) 254162306a36Sopenharmony_ci >> 16; 254262306a36Sopenharmony_ci result[t][1] = (rtl_get_bbreg(hw, RTX_POWER_AFTER_IQK_A, 254362306a36Sopenharmony_ci MASKDWORD) & 0x3FF0000) 254462306a36Sopenharmony_ci >> 16; 254562306a36Sopenharmony_ci break; 254662306a36Sopenharmony_ci } 254762306a36Sopenharmony_ci rtl_dbg(rtlpriv, COMP_RF, DBG_LOUD, 254862306a36Sopenharmony_ci "Path A Tx IQK Fail!!, ret = 0x%x\n", 254962306a36Sopenharmony_ci patha_ok); 255062306a36Sopenharmony_ci } 255162306a36Sopenharmony_ci 255262306a36Sopenharmony_ci for (i = 0 ; i < retrycount ; i++) { 255362306a36Sopenharmony_ci patha_ok = _rtl92ee_phy_path_a_rx_iqk(hw, is2t); 255462306a36Sopenharmony_ci 255562306a36Sopenharmony_ci if (patha_ok == 0x03) { 255662306a36Sopenharmony_ci rtl_dbg(rtlpriv, COMP_RF, DBG_LOUD, 255762306a36Sopenharmony_ci "Path A Rx IQK Success!!\n"); 255862306a36Sopenharmony_ci result[t][2] = (rtl_get_bbreg(hw, 255962306a36Sopenharmony_ci RRX_POWER_BEFORE_IQK_A_2, 256062306a36Sopenharmony_ci MASKDWORD) & 0x3FF0000) 256162306a36Sopenharmony_ci >> 16; 256262306a36Sopenharmony_ci result[t][3] = (rtl_get_bbreg(hw, 256362306a36Sopenharmony_ci RRX_POWER_AFTER_IQK_A_2, 256462306a36Sopenharmony_ci MASKDWORD) & 0x3FF0000) 256562306a36Sopenharmony_ci >> 16; 256662306a36Sopenharmony_ci break; 256762306a36Sopenharmony_ci } 256862306a36Sopenharmony_ci rtl_dbg(rtlpriv, COMP_RF, DBG_LOUD, 256962306a36Sopenharmony_ci "Path A Rx IQK Fail!!, ret = 0x%x\n", 257062306a36Sopenharmony_ci patha_ok); 257162306a36Sopenharmony_ci } 257262306a36Sopenharmony_ci 257362306a36Sopenharmony_ci if (0x00 == patha_ok) 257462306a36Sopenharmony_ci rtl_dbg(rtlpriv, COMP_RF, DBG_LOUD, 257562306a36Sopenharmony_ci "Path A IQK failed!!, ret = 0\n"); 257662306a36Sopenharmony_ci if (is2t) { 257762306a36Sopenharmony_ci _rtl92ee_phy_path_a_standby(hw); 257862306a36Sopenharmony_ci /* Turn Path B ADDA on */ 257962306a36Sopenharmony_ci _rtl92ee_phy_path_adda_on(hw, adda_reg, false, is2t); 258062306a36Sopenharmony_ci 258162306a36Sopenharmony_ci /* IQ calibration setting */ 258262306a36Sopenharmony_ci rtl_set_bbreg(hw, RFPGA0_IQK, MASKDWORD, 0x80800000); 258362306a36Sopenharmony_ci rtl_set_bbreg(hw, RTX_IQK, MASKDWORD, 0x01007c00); 258462306a36Sopenharmony_ci rtl_set_bbreg(hw, RRX_IQK, MASKDWORD, 0x01004800); 258562306a36Sopenharmony_ci 258662306a36Sopenharmony_ci for (i = 0 ; i < retrycount ; i++) { 258762306a36Sopenharmony_ci pathb_ok = _rtl92ee_phy_path_b_iqk(hw); 258862306a36Sopenharmony_ci if (pathb_ok == 0x01) { 258962306a36Sopenharmony_ci rtl_dbg(rtlpriv, COMP_RF, DBG_LOUD, 259062306a36Sopenharmony_ci "Path B Tx IQK Success!!\n"); 259162306a36Sopenharmony_ci result[t][4] = (rtl_get_bbreg(hw, 259262306a36Sopenharmony_ci RTX_POWER_BEFORE_IQK_B, 259362306a36Sopenharmony_ci MASKDWORD) & 0x3FF0000) 259462306a36Sopenharmony_ci >> 16; 259562306a36Sopenharmony_ci result[t][5] = (rtl_get_bbreg(hw, 259662306a36Sopenharmony_ci RTX_POWER_AFTER_IQK_B, 259762306a36Sopenharmony_ci MASKDWORD) & 0x3FF0000) 259862306a36Sopenharmony_ci >> 16; 259962306a36Sopenharmony_ci break; 260062306a36Sopenharmony_ci } 260162306a36Sopenharmony_ci rtl_dbg(rtlpriv, COMP_RF, DBG_LOUD, 260262306a36Sopenharmony_ci "Path B Tx IQK Fail!!, ret = 0x%x\n", 260362306a36Sopenharmony_ci pathb_ok); 260462306a36Sopenharmony_ci } 260562306a36Sopenharmony_ci 260662306a36Sopenharmony_ci for (i = 0 ; i < retrycount ; i++) { 260762306a36Sopenharmony_ci pathb_ok = _rtl92ee_phy_path_b_rx_iqk(hw, is2t); 260862306a36Sopenharmony_ci if (pathb_ok == 0x03) { 260962306a36Sopenharmony_ci rtl_dbg(rtlpriv, COMP_RF, DBG_LOUD, 261062306a36Sopenharmony_ci "Path B Rx IQK Success!!\n"); 261162306a36Sopenharmony_ci result[t][6] = (rtl_get_bbreg(hw, 261262306a36Sopenharmony_ci RRX_POWER_BEFORE_IQK_B_2, 261362306a36Sopenharmony_ci MASKDWORD) & 0x3FF0000) 261462306a36Sopenharmony_ci >> 16; 261562306a36Sopenharmony_ci result[t][7] = (rtl_get_bbreg(hw, 261662306a36Sopenharmony_ci RRX_POWER_AFTER_IQK_B_2, 261762306a36Sopenharmony_ci MASKDWORD) & 0x3FF0000) 261862306a36Sopenharmony_ci >> 16; 261962306a36Sopenharmony_ci break; 262062306a36Sopenharmony_ci } 262162306a36Sopenharmony_ci rtl_dbg(rtlpriv, COMP_RF, DBG_LOUD, 262262306a36Sopenharmony_ci "Path B Rx IQK Fail!!, ret = 0x%x\n", 262362306a36Sopenharmony_ci pathb_ok); 262462306a36Sopenharmony_ci } 262562306a36Sopenharmony_ci 262662306a36Sopenharmony_ci if (0x00 == pathb_ok) 262762306a36Sopenharmony_ci rtl_dbg(rtlpriv, COMP_RF, DBG_LOUD, 262862306a36Sopenharmony_ci "Path B IQK failed!!, ret = 0\n"); 262962306a36Sopenharmony_ci } 263062306a36Sopenharmony_ci /* Back to BB mode, load original value */ 263162306a36Sopenharmony_ci rtl_dbg(rtlpriv, COMP_RF, DBG_LOUD, 263262306a36Sopenharmony_ci "IQK:Back to BB mode, load original value!\n"); 263362306a36Sopenharmony_ci rtl_set_bbreg(hw, RFPGA0_IQK, MASKDWORD, 0); 263462306a36Sopenharmony_ci 263562306a36Sopenharmony_ci if (t != 0) { 263662306a36Sopenharmony_ci /* Reload ADDA power saving parameters */ 263762306a36Sopenharmony_ci _rtl92ee_phy_reload_adda_registers(hw, adda_reg, 263862306a36Sopenharmony_ci rtlphy->adda_backup, 263962306a36Sopenharmony_ci IQK_ADDA_REG_NUM); 264062306a36Sopenharmony_ci 264162306a36Sopenharmony_ci /* Reload MAC parameters */ 264262306a36Sopenharmony_ci _rtl92ee_phy_reload_mac_registers(hw, iqk_mac_reg, 264362306a36Sopenharmony_ci rtlphy->iqk_mac_backup); 264462306a36Sopenharmony_ci 264562306a36Sopenharmony_ci _rtl92ee_phy_reload_adda_registers(hw, iqk_bb_reg, 264662306a36Sopenharmony_ci rtlphy->iqk_bb_backup, 264762306a36Sopenharmony_ci IQK_BB_REG_NUM); 264862306a36Sopenharmony_ci 264962306a36Sopenharmony_ci /* Restore RX initial gain */ 265062306a36Sopenharmony_ci rtl_set_bbreg(hw, 0xc50, MASKBYTE0, 0x50); 265162306a36Sopenharmony_ci rtl_set_bbreg(hw, 0xc50, MASKBYTE0, tmp_0xc50); 265262306a36Sopenharmony_ci if (is2t) { 265362306a36Sopenharmony_ci rtl_set_bbreg(hw, 0xc50, MASKBYTE0, 0x50); 265462306a36Sopenharmony_ci rtl_set_bbreg(hw, 0xc58, MASKBYTE0, tmp_0xc58); 265562306a36Sopenharmony_ci } 265662306a36Sopenharmony_ci 265762306a36Sopenharmony_ci /* load 0xe30 IQC default value */ 265862306a36Sopenharmony_ci rtl_set_bbreg(hw, RTX_IQK_TONE_A, MASKDWORD, 0x01008c00); 265962306a36Sopenharmony_ci rtl_set_bbreg(hw, RRX_IQK_TONE_A, MASKDWORD, 0x01008c00); 266062306a36Sopenharmony_ci } 266162306a36Sopenharmony_ci} 266262306a36Sopenharmony_ci 266362306a36Sopenharmony_cistatic void _rtl92ee_phy_lc_calibrate(struct ieee80211_hw *hw, bool is2t) 266462306a36Sopenharmony_ci{ 266562306a36Sopenharmony_ci u8 tmpreg; 266662306a36Sopenharmony_ci u32 rf_a_mode = 0, rf_b_mode = 0, lc_cal; 266762306a36Sopenharmony_ci struct rtl_priv *rtlpriv = rtl_priv(hw); 266862306a36Sopenharmony_ci 266962306a36Sopenharmony_ci tmpreg = rtl_read_byte(rtlpriv, 0xd03); 267062306a36Sopenharmony_ci 267162306a36Sopenharmony_ci if ((tmpreg & 0x70) != 0) 267262306a36Sopenharmony_ci rtl_write_byte(rtlpriv, 0xd03, tmpreg & 0x8F); 267362306a36Sopenharmony_ci else 267462306a36Sopenharmony_ci rtl_write_byte(rtlpriv, REG_TXPAUSE, 0xFF); 267562306a36Sopenharmony_ci 267662306a36Sopenharmony_ci if ((tmpreg & 0x70) != 0) { 267762306a36Sopenharmony_ci rf_a_mode = rtl_get_rfreg(hw, RF90_PATH_A, 0x00, MASK12BITS); 267862306a36Sopenharmony_ci 267962306a36Sopenharmony_ci if (is2t) 268062306a36Sopenharmony_ci rf_b_mode = rtl_get_rfreg(hw, RF90_PATH_B, 0x00, 268162306a36Sopenharmony_ci MASK12BITS); 268262306a36Sopenharmony_ci 268362306a36Sopenharmony_ci rtl_set_rfreg(hw, RF90_PATH_A, 0x00, MASK12BITS, 268462306a36Sopenharmony_ci (rf_a_mode & 0x8FFFF) | 0x10000); 268562306a36Sopenharmony_ci 268662306a36Sopenharmony_ci if (is2t) 268762306a36Sopenharmony_ci rtl_set_rfreg(hw, RF90_PATH_B, 0x00, MASK12BITS, 268862306a36Sopenharmony_ci (rf_b_mode & 0x8FFFF) | 0x10000); 268962306a36Sopenharmony_ci } 269062306a36Sopenharmony_ci lc_cal = rtl_get_rfreg(hw, RF90_PATH_A, 0x18, MASK12BITS); 269162306a36Sopenharmony_ci 269262306a36Sopenharmony_ci rtl_set_rfreg(hw, RF90_PATH_A, 0x18, MASK12BITS, lc_cal | 0x08000); 269362306a36Sopenharmony_ci 269462306a36Sopenharmony_ci mdelay(100); 269562306a36Sopenharmony_ci 269662306a36Sopenharmony_ci if ((tmpreg & 0x70) != 0) { 269762306a36Sopenharmony_ci rtl_write_byte(rtlpriv, 0xd03, tmpreg); 269862306a36Sopenharmony_ci rtl_set_rfreg(hw, RF90_PATH_A, 0x00, MASK12BITS, rf_a_mode); 269962306a36Sopenharmony_ci 270062306a36Sopenharmony_ci if (is2t) 270162306a36Sopenharmony_ci rtl_set_rfreg(hw, RF90_PATH_B, 0x00, MASK12BITS, 270262306a36Sopenharmony_ci rf_b_mode); 270362306a36Sopenharmony_ci } else { 270462306a36Sopenharmony_ci rtl_write_byte(rtlpriv, REG_TXPAUSE, 0x00); 270562306a36Sopenharmony_ci } 270662306a36Sopenharmony_ci} 270762306a36Sopenharmony_ci 270862306a36Sopenharmony_cistatic void _rtl92ee_phy_set_rfpath_switch(struct ieee80211_hw *hw, 270962306a36Sopenharmony_ci bool bmain, bool is2t) 271062306a36Sopenharmony_ci{ 271162306a36Sopenharmony_ci struct rtl_priv *rtlpriv = rtl_priv(hw); 271262306a36Sopenharmony_ci struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw)); 271362306a36Sopenharmony_ci struct rtl_efuse *rtlefuse = rtl_efuse(rtl_priv(hw)); 271462306a36Sopenharmony_ci 271562306a36Sopenharmony_ci rtl_dbg(rtlpriv, COMP_INIT, DBG_LOUD, "\n"); 271662306a36Sopenharmony_ci 271762306a36Sopenharmony_ci if (is_hal_stop(rtlhal)) { 271862306a36Sopenharmony_ci u8 u1btmp; 271962306a36Sopenharmony_ci 272062306a36Sopenharmony_ci u1btmp = rtl_read_byte(rtlpriv, REG_LEDCFG0); 272162306a36Sopenharmony_ci rtl_write_byte(rtlpriv, REG_LEDCFG0, u1btmp | BIT(7)); 272262306a36Sopenharmony_ci rtl_set_bbreg(hw, RFPGA0_XAB_RFPARAMETER, BIT(13), 0x01); 272362306a36Sopenharmony_ci } 272462306a36Sopenharmony_ci if (is2t) { 272562306a36Sopenharmony_ci if (bmain) 272662306a36Sopenharmony_ci rtl_set_bbreg(hw, RFPGA0_XB_RFINTERFACEOE, 272762306a36Sopenharmony_ci BIT(5) | BIT(6), 0x1); 272862306a36Sopenharmony_ci else 272962306a36Sopenharmony_ci rtl_set_bbreg(hw, RFPGA0_XB_RFINTERFACEOE, 273062306a36Sopenharmony_ci BIT(5) | BIT(6), 0x2); 273162306a36Sopenharmony_ci } else { 273262306a36Sopenharmony_ci rtl_set_bbreg(hw, RFPGA0_XAB_RFINTERFACESW, BIT(8) | BIT(9), 0); 273362306a36Sopenharmony_ci rtl_set_bbreg(hw, 0x914, MASKLWORD, 0x0201); 273462306a36Sopenharmony_ci 273562306a36Sopenharmony_ci /* We use the RF definition of MAIN and AUX, 273662306a36Sopenharmony_ci * left antenna and right antenna repectively. 273762306a36Sopenharmony_ci * Default output at AUX. 273862306a36Sopenharmony_ci */ 273962306a36Sopenharmony_ci if (bmain) { 274062306a36Sopenharmony_ci rtl_set_bbreg(hw, RFPGA0_XA_RFINTERFACEOE, 274162306a36Sopenharmony_ci BIT(14) | BIT(13) | BIT(12), 0); 274262306a36Sopenharmony_ci rtl_set_bbreg(hw, RFPGA0_XB_RFINTERFACEOE, 274362306a36Sopenharmony_ci BIT(5) | BIT(4) | BIT(3), 0); 274462306a36Sopenharmony_ci if (rtlefuse->antenna_div_type == CGCS_RX_HW_ANTDIV) 274562306a36Sopenharmony_ci rtl_set_bbreg(hw, RCONFIG_RAM64x16, BIT(31), 0); 274662306a36Sopenharmony_ci } else { 274762306a36Sopenharmony_ci rtl_set_bbreg(hw, RFPGA0_XA_RFINTERFACEOE, 274862306a36Sopenharmony_ci BIT(14) | BIT(13) | BIT(12), 1); 274962306a36Sopenharmony_ci rtl_set_bbreg(hw, RFPGA0_XB_RFINTERFACEOE, 275062306a36Sopenharmony_ci BIT(5) | BIT(4) | BIT(3), 1); 275162306a36Sopenharmony_ci if (rtlefuse->antenna_div_type == CGCS_RX_HW_ANTDIV) 275262306a36Sopenharmony_ci rtl_set_bbreg(hw, RCONFIG_RAM64x16, BIT(31), 1); 275362306a36Sopenharmony_ci } 275462306a36Sopenharmony_ci } 275562306a36Sopenharmony_ci} 275662306a36Sopenharmony_ci 275762306a36Sopenharmony_ci#undef IQK_ADDA_REG_NUM 275862306a36Sopenharmony_ci#undef IQK_DELAY_TIME 275962306a36Sopenharmony_ci 276062306a36Sopenharmony_cistatic u8 rtl92ee_get_rightchnlplace_for_iqk(u8 chnl) 276162306a36Sopenharmony_ci{ 276262306a36Sopenharmony_ci u8 channel_all[59] = { 276362306a36Sopenharmony_ci 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 276462306a36Sopenharmony_ci 36, 38, 40, 42, 44, 46, 48, 50, 52, 54, 56, 58, 276562306a36Sopenharmony_ci 60, 62, 64, 100, 102, 104, 106, 108, 110, 112, 276662306a36Sopenharmony_ci 114, 116, 118, 120, 122, 124, 126, 128, 130, 276762306a36Sopenharmony_ci 132, 134, 136, 138, 140, 149, 151, 153, 155, 276862306a36Sopenharmony_ci 157, 159, 161, 163, 165 276962306a36Sopenharmony_ci }; 277062306a36Sopenharmony_ci u8 place = chnl; 277162306a36Sopenharmony_ci 277262306a36Sopenharmony_ci if (chnl > 14) { 277362306a36Sopenharmony_ci for (place = 14; place < sizeof(channel_all); place++) { 277462306a36Sopenharmony_ci if (channel_all[place] == chnl) 277562306a36Sopenharmony_ci return place - 13; 277662306a36Sopenharmony_ci } 277762306a36Sopenharmony_ci } 277862306a36Sopenharmony_ci 277962306a36Sopenharmony_ci return 0; 278062306a36Sopenharmony_ci} 278162306a36Sopenharmony_ci 278262306a36Sopenharmony_civoid rtl92ee_phy_iq_calibrate(struct ieee80211_hw *hw, bool b_recovery) 278362306a36Sopenharmony_ci{ 278462306a36Sopenharmony_ci struct rtl_priv *rtlpriv = rtl_priv(hw); 278562306a36Sopenharmony_ci struct rtl_phy *rtlphy = &rtlpriv->phy; 278662306a36Sopenharmony_ci long result[4][8]; 278762306a36Sopenharmony_ci u8 i, final_candidate; 278862306a36Sopenharmony_ci bool b_patha_ok, b_pathb_ok; 278962306a36Sopenharmony_ci long reg_e94, reg_e9c, reg_ea4; 279062306a36Sopenharmony_ci long reg_eb4, reg_ebc, reg_ec4; 279162306a36Sopenharmony_ci bool is12simular, is13simular, is23simular; 279262306a36Sopenharmony_ci u8 idx; 279362306a36Sopenharmony_ci u32 iqk_bb_reg[IQK_BB_REG_NUM] = { 279462306a36Sopenharmony_ci ROFDM0_XARXIQIMBALANCE, 279562306a36Sopenharmony_ci ROFDM0_XBRXIQIMBALANCE, 279662306a36Sopenharmony_ci ROFDM0_ECCATHRESHOLD, 279762306a36Sopenharmony_ci ROFDM0_AGCRSSITABLE, 279862306a36Sopenharmony_ci ROFDM0_XATXIQIMBALANCE, 279962306a36Sopenharmony_ci ROFDM0_XBTXIQIMBALANCE, 280062306a36Sopenharmony_ci ROFDM0_XCTXAFE, 280162306a36Sopenharmony_ci ROFDM0_XDTXAFE, 280262306a36Sopenharmony_ci ROFDM0_RXIQEXTANTA 280362306a36Sopenharmony_ci }; 280462306a36Sopenharmony_ci 280562306a36Sopenharmony_ci if (b_recovery) { 280662306a36Sopenharmony_ci _rtl92ee_phy_reload_adda_registers(hw, iqk_bb_reg, 280762306a36Sopenharmony_ci rtlphy->iqk_bb_backup, 9); 280862306a36Sopenharmony_ci return; 280962306a36Sopenharmony_ci } 281062306a36Sopenharmony_ci 281162306a36Sopenharmony_ci for (i = 0; i < 8; i++) { 281262306a36Sopenharmony_ci result[0][i] = 0; 281362306a36Sopenharmony_ci result[1][i] = 0; 281462306a36Sopenharmony_ci result[2][i] = 0; 281562306a36Sopenharmony_ci 281662306a36Sopenharmony_ci if ((i == 0) || (i == 2) || (i == 4) || (i == 6)) 281762306a36Sopenharmony_ci result[3][i] = 0x100; 281862306a36Sopenharmony_ci else 281962306a36Sopenharmony_ci result[3][i] = 0; 282062306a36Sopenharmony_ci } 282162306a36Sopenharmony_ci final_candidate = 0xff; 282262306a36Sopenharmony_ci b_patha_ok = false; 282362306a36Sopenharmony_ci b_pathb_ok = false; 282462306a36Sopenharmony_ci is12simular = false; 282562306a36Sopenharmony_ci is23simular = false; 282662306a36Sopenharmony_ci is13simular = false; 282762306a36Sopenharmony_ci for (i = 0; i < 3; i++) { 282862306a36Sopenharmony_ci _rtl92ee_phy_iq_calibrate(hw, result, i, true); 282962306a36Sopenharmony_ci if (i == 1) { 283062306a36Sopenharmony_ci is12simular = _rtl92ee_phy_simularity_compare(hw, 283162306a36Sopenharmony_ci result, 283262306a36Sopenharmony_ci 0, 1); 283362306a36Sopenharmony_ci if (is12simular) { 283462306a36Sopenharmony_ci final_candidate = 0; 283562306a36Sopenharmony_ci break; 283662306a36Sopenharmony_ci } 283762306a36Sopenharmony_ci } 283862306a36Sopenharmony_ci 283962306a36Sopenharmony_ci if (i == 2) { 284062306a36Sopenharmony_ci is13simular = _rtl92ee_phy_simularity_compare(hw, 284162306a36Sopenharmony_ci result, 284262306a36Sopenharmony_ci 0, 2); 284362306a36Sopenharmony_ci if (is13simular) { 284462306a36Sopenharmony_ci final_candidate = 0; 284562306a36Sopenharmony_ci break; 284662306a36Sopenharmony_ci } 284762306a36Sopenharmony_ci is23simular = _rtl92ee_phy_simularity_compare(hw, 284862306a36Sopenharmony_ci result, 284962306a36Sopenharmony_ci 1, 2); 285062306a36Sopenharmony_ci if (is23simular) 285162306a36Sopenharmony_ci final_candidate = 1; 285262306a36Sopenharmony_ci else 285362306a36Sopenharmony_ci final_candidate = 3; 285462306a36Sopenharmony_ci } 285562306a36Sopenharmony_ci } 285662306a36Sopenharmony_ci 285762306a36Sopenharmony_ci reg_e94 = result[3][0]; 285862306a36Sopenharmony_ci reg_e9c = result[3][1]; 285962306a36Sopenharmony_ci reg_ea4 = result[3][2]; 286062306a36Sopenharmony_ci reg_eb4 = result[3][4]; 286162306a36Sopenharmony_ci reg_ebc = result[3][5]; 286262306a36Sopenharmony_ci reg_ec4 = result[3][6]; 286362306a36Sopenharmony_ci 286462306a36Sopenharmony_ci if (final_candidate != 0xff) { 286562306a36Sopenharmony_ci reg_e94 = result[final_candidate][0]; 286662306a36Sopenharmony_ci rtlphy->reg_e94 = reg_e94; 286762306a36Sopenharmony_ci reg_e9c = result[final_candidate][1]; 286862306a36Sopenharmony_ci rtlphy->reg_e9c = reg_e9c; 286962306a36Sopenharmony_ci reg_ea4 = result[final_candidate][2]; 287062306a36Sopenharmony_ci reg_eb4 = result[final_candidate][4]; 287162306a36Sopenharmony_ci rtlphy->reg_eb4 = reg_eb4; 287262306a36Sopenharmony_ci reg_ebc = result[final_candidate][5]; 287362306a36Sopenharmony_ci rtlphy->reg_ebc = reg_ebc; 287462306a36Sopenharmony_ci reg_ec4 = result[final_candidate][6]; 287562306a36Sopenharmony_ci b_patha_ok = true; 287662306a36Sopenharmony_ci b_pathb_ok = true; 287762306a36Sopenharmony_ci } else { 287862306a36Sopenharmony_ci rtlphy->reg_e94 = 0x100; 287962306a36Sopenharmony_ci rtlphy->reg_eb4 = 0x100; 288062306a36Sopenharmony_ci rtlphy->reg_e9c = 0x0; 288162306a36Sopenharmony_ci rtlphy->reg_ebc = 0x0; 288262306a36Sopenharmony_ci } 288362306a36Sopenharmony_ci 288462306a36Sopenharmony_ci if (reg_e94 != 0) 288562306a36Sopenharmony_ci _rtl92ee_phy_path_a_fill_iqk_matrix(hw, b_patha_ok, result, 288662306a36Sopenharmony_ci final_candidate, 288762306a36Sopenharmony_ci (reg_ea4 == 0)); 288862306a36Sopenharmony_ci 288962306a36Sopenharmony_ci _rtl92ee_phy_path_b_fill_iqk_matrix(hw, b_pathb_ok, result, 289062306a36Sopenharmony_ci final_candidate, 289162306a36Sopenharmony_ci (reg_ec4 == 0)); 289262306a36Sopenharmony_ci 289362306a36Sopenharmony_ci idx = rtl92ee_get_rightchnlplace_for_iqk(rtlphy->current_channel); 289462306a36Sopenharmony_ci 289562306a36Sopenharmony_ci /* To Fix BSOD when final_candidate is 0xff */ 289662306a36Sopenharmony_ci if (final_candidate < 4) { 289762306a36Sopenharmony_ci for (i = 0; i < IQK_MATRIX_REG_NUM; i++) 289862306a36Sopenharmony_ci rtlphy->iqk_matrix[idx].value[0][i] = 289962306a36Sopenharmony_ci result[final_candidate][i]; 290062306a36Sopenharmony_ci 290162306a36Sopenharmony_ci rtlphy->iqk_matrix[idx].iqk_done = true; 290262306a36Sopenharmony_ci } 290362306a36Sopenharmony_ci _rtl92ee_phy_save_adda_registers(hw, iqk_bb_reg, 290462306a36Sopenharmony_ci rtlphy->iqk_bb_backup, 9); 290562306a36Sopenharmony_ci} 290662306a36Sopenharmony_ci 290762306a36Sopenharmony_civoid rtl92ee_phy_lc_calibrate(struct ieee80211_hw *hw) 290862306a36Sopenharmony_ci{ 290962306a36Sopenharmony_ci struct rtl_priv *rtlpriv = rtl_priv(hw); 291062306a36Sopenharmony_ci struct rtl_phy *rtlphy = &rtlpriv->phy; 291162306a36Sopenharmony_ci struct rtl_hal *rtlhal = &rtlpriv->rtlhal; 291262306a36Sopenharmony_ci u32 timeout = 2000, timecount = 0; 291362306a36Sopenharmony_ci 291462306a36Sopenharmony_ci while (rtlpriv->mac80211.act_scanning && timecount < timeout) { 291562306a36Sopenharmony_ci udelay(50); 291662306a36Sopenharmony_ci timecount += 50; 291762306a36Sopenharmony_ci } 291862306a36Sopenharmony_ci 291962306a36Sopenharmony_ci rtlphy->lck_inprogress = true; 292062306a36Sopenharmony_ci RTPRINT(rtlpriv, FINIT, INIT_IQK, 292162306a36Sopenharmony_ci "LCK:Start!!! currentband %x delay %d ms\n", 292262306a36Sopenharmony_ci rtlhal->current_bandtype, timecount); 292362306a36Sopenharmony_ci 292462306a36Sopenharmony_ci _rtl92ee_phy_lc_calibrate(hw, false); 292562306a36Sopenharmony_ci 292662306a36Sopenharmony_ci rtlphy->lck_inprogress = false; 292762306a36Sopenharmony_ci} 292862306a36Sopenharmony_ci 292962306a36Sopenharmony_civoid rtl92ee_phy_ap_calibrate(struct ieee80211_hw *hw, s8 delta) 293062306a36Sopenharmony_ci{ 293162306a36Sopenharmony_ci} 293262306a36Sopenharmony_ci 293362306a36Sopenharmony_civoid rtl92ee_phy_set_rfpath_switch(struct ieee80211_hw *hw, bool bmain) 293462306a36Sopenharmony_ci{ 293562306a36Sopenharmony_ci _rtl92ee_phy_set_rfpath_switch(hw, bmain, false); 293662306a36Sopenharmony_ci} 293762306a36Sopenharmony_ci 293862306a36Sopenharmony_cibool rtl92ee_phy_set_io_cmd(struct ieee80211_hw *hw, enum io_type iotype) 293962306a36Sopenharmony_ci{ 294062306a36Sopenharmony_ci struct rtl_priv *rtlpriv = rtl_priv(hw); 294162306a36Sopenharmony_ci struct rtl_phy *rtlphy = &rtlpriv->phy; 294262306a36Sopenharmony_ci bool postprocessing = false; 294362306a36Sopenharmony_ci 294462306a36Sopenharmony_ci rtl_dbg(rtlpriv, COMP_CMD, DBG_TRACE, 294562306a36Sopenharmony_ci "-->IO Cmd(%#x), set_io_inprogress(%d)\n", 294662306a36Sopenharmony_ci iotype, rtlphy->set_io_inprogress); 294762306a36Sopenharmony_ci do { 294862306a36Sopenharmony_ci switch (iotype) { 294962306a36Sopenharmony_ci case IO_CMD_RESUME_DM_BY_SCAN: 295062306a36Sopenharmony_ci rtl_dbg(rtlpriv, COMP_CMD, DBG_TRACE, 295162306a36Sopenharmony_ci "[IO CMD] Resume DM after scan.\n"); 295262306a36Sopenharmony_ci postprocessing = true; 295362306a36Sopenharmony_ci break; 295462306a36Sopenharmony_ci case IO_CMD_PAUSE_BAND0_DM_BY_SCAN: 295562306a36Sopenharmony_ci rtl_dbg(rtlpriv, COMP_CMD, DBG_TRACE, 295662306a36Sopenharmony_ci "[IO CMD] Pause DM before scan.\n"); 295762306a36Sopenharmony_ci postprocessing = true; 295862306a36Sopenharmony_ci break; 295962306a36Sopenharmony_ci default: 296062306a36Sopenharmony_ci rtl_dbg(rtlpriv, COMP_ERR, DBG_LOUD, 296162306a36Sopenharmony_ci "switch case %#x not processed\n", iotype); 296262306a36Sopenharmony_ci break; 296362306a36Sopenharmony_ci } 296462306a36Sopenharmony_ci } while (false); 296562306a36Sopenharmony_ci if (postprocessing && !rtlphy->set_io_inprogress) { 296662306a36Sopenharmony_ci rtlphy->set_io_inprogress = true; 296762306a36Sopenharmony_ci rtlphy->current_io_type = iotype; 296862306a36Sopenharmony_ci } else { 296962306a36Sopenharmony_ci return false; 297062306a36Sopenharmony_ci } 297162306a36Sopenharmony_ci rtl92ee_phy_set_io(hw); 297262306a36Sopenharmony_ci rtl_dbg(rtlpriv, COMP_CMD, DBG_TRACE, "IO Type(%#x)\n", iotype); 297362306a36Sopenharmony_ci return true; 297462306a36Sopenharmony_ci} 297562306a36Sopenharmony_ci 297662306a36Sopenharmony_cistatic void rtl92ee_phy_set_io(struct ieee80211_hw *hw) 297762306a36Sopenharmony_ci{ 297862306a36Sopenharmony_ci struct rtl_priv *rtlpriv = rtl_priv(hw); 297962306a36Sopenharmony_ci struct rtl_phy *rtlphy = &rtlpriv->phy; 298062306a36Sopenharmony_ci struct dig_t *dm_dig = &rtlpriv->dm_digtable; 298162306a36Sopenharmony_ci 298262306a36Sopenharmony_ci rtl_dbg(rtlpriv, COMP_CMD, DBG_TRACE, 298362306a36Sopenharmony_ci "--->Cmd(%#x), set_io_inprogress(%d)\n", 298462306a36Sopenharmony_ci rtlphy->current_io_type, rtlphy->set_io_inprogress); 298562306a36Sopenharmony_ci switch (rtlphy->current_io_type) { 298662306a36Sopenharmony_ci case IO_CMD_RESUME_DM_BY_SCAN: 298762306a36Sopenharmony_ci rtl92ee_dm_write_dig(hw, rtlphy->initgain_backup.xaagccore1); 298862306a36Sopenharmony_ci rtl92ee_dm_write_cck_cca_thres(hw, rtlphy->initgain_backup.cca); 298962306a36Sopenharmony_ci rtl_dbg(rtlpriv, COMP_CMD, DBG_TRACE, "no set txpower\n"); 299062306a36Sopenharmony_ci rtl92ee_phy_set_txpower_level(hw, rtlphy->current_channel); 299162306a36Sopenharmony_ci break; 299262306a36Sopenharmony_ci case IO_CMD_PAUSE_BAND0_DM_BY_SCAN: 299362306a36Sopenharmony_ci /* 8192eebt */ 299462306a36Sopenharmony_ci rtlphy->initgain_backup.xaagccore1 = dm_dig->cur_igvalue; 299562306a36Sopenharmony_ci rtl92ee_dm_write_dig(hw, 0x17); 299662306a36Sopenharmony_ci rtlphy->initgain_backup.cca = dm_dig->cur_cck_cca_thres; 299762306a36Sopenharmony_ci rtl92ee_dm_write_cck_cca_thres(hw, 0x40); 299862306a36Sopenharmony_ci break; 299962306a36Sopenharmony_ci default: 300062306a36Sopenharmony_ci rtl_dbg(rtlpriv, COMP_ERR, DBG_LOUD, 300162306a36Sopenharmony_ci "switch case %#x not processed\n", 300262306a36Sopenharmony_ci rtlphy->current_io_type); 300362306a36Sopenharmony_ci break; 300462306a36Sopenharmony_ci } 300562306a36Sopenharmony_ci rtlphy->set_io_inprogress = false; 300662306a36Sopenharmony_ci rtl_dbg(rtlpriv, COMP_CMD, DBG_TRACE, 300762306a36Sopenharmony_ci "(%#x)\n", rtlphy->current_io_type); 300862306a36Sopenharmony_ci} 300962306a36Sopenharmony_ci 301062306a36Sopenharmony_cistatic void rtl92ee_phy_set_rf_on(struct ieee80211_hw *hw) 301162306a36Sopenharmony_ci{ 301262306a36Sopenharmony_ci struct rtl_priv *rtlpriv = rtl_priv(hw); 301362306a36Sopenharmony_ci 301462306a36Sopenharmony_ci rtl_write_byte(rtlpriv, REG_SPS0_CTRL, 0x2b); 301562306a36Sopenharmony_ci rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN, 0xE3); 301662306a36Sopenharmony_ci /*rtl_write_byte(rtlpriv, REG_APSD_CTRL, 0x00);*/ 301762306a36Sopenharmony_ci rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN, 0xE2); 301862306a36Sopenharmony_ci rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN, 0xE3); 301962306a36Sopenharmony_ci rtl_write_byte(rtlpriv, REG_TXPAUSE, 0x00); 302062306a36Sopenharmony_ci} 302162306a36Sopenharmony_ci 302262306a36Sopenharmony_cistatic void _rtl92ee_phy_set_rf_sleep(struct ieee80211_hw *hw) 302362306a36Sopenharmony_ci{ 302462306a36Sopenharmony_ci struct rtl_priv *rtlpriv = rtl_priv(hw); 302562306a36Sopenharmony_ci 302662306a36Sopenharmony_ci rtl_write_byte(rtlpriv, REG_TXPAUSE, 0xFF); 302762306a36Sopenharmony_ci rtl_set_rfreg(hw, RF90_PATH_A, 0x00, RFREG_OFFSET_MASK, 0x00); 302862306a36Sopenharmony_ci 302962306a36Sopenharmony_ci rtl_write_byte(rtlpriv, REG_SYS_FUNC_EN, 0xE2); 303062306a36Sopenharmony_ci rtl_write_byte(rtlpriv, REG_SPS0_CTRL, 0x22); 303162306a36Sopenharmony_ci} 303262306a36Sopenharmony_ci 303362306a36Sopenharmony_cistatic bool _rtl92ee_phy_set_rf_power_state(struct ieee80211_hw *hw, 303462306a36Sopenharmony_ci enum rf_pwrstate rfpwr_state) 303562306a36Sopenharmony_ci{ 303662306a36Sopenharmony_ci struct rtl_priv *rtlpriv = rtl_priv(hw); 303762306a36Sopenharmony_ci struct rtl_pci_priv *pcipriv = rtl_pcipriv(hw); 303862306a36Sopenharmony_ci struct rtl_mac *mac = rtl_mac(rtl_priv(hw)); 303962306a36Sopenharmony_ci struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw)); 304062306a36Sopenharmony_ci bool bresult = true; 304162306a36Sopenharmony_ci u8 i, queue_id; 304262306a36Sopenharmony_ci struct rtl8192_tx_ring *ring = NULL; 304362306a36Sopenharmony_ci 304462306a36Sopenharmony_ci switch (rfpwr_state) { 304562306a36Sopenharmony_ci case ERFON: 304662306a36Sopenharmony_ci if ((ppsc->rfpwr_state == ERFOFF) && 304762306a36Sopenharmony_ci RT_IN_PS_LEVEL(ppsc, RT_RF_OFF_LEVL_HALT_NIC)) { 304862306a36Sopenharmony_ci bool rtstatus; 304962306a36Sopenharmony_ci u32 initializecount = 0; 305062306a36Sopenharmony_ci 305162306a36Sopenharmony_ci do { 305262306a36Sopenharmony_ci initializecount++; 305362306a36Sopenharmony_ci rtl_dbg(rtlpriv, COMP_RF, DBG_DMESG, 305462306a36Sopenharmony_ci "IPS Set eRf nic enable\n"); 305562306a36Sopenharmony_ci rtstatus = rtl_ps_enable_nic(hw); 305662306a36Sopenharmony_ci } while (!rtstatus && (initializecount < 10)); 305762306a36Sopenharmony_ci RT_CLEAR_PS_LEVEL(ppsc, RT_RF_OFF_LEVL_HALT_NIC); 305862306a36Sopenharmony_ci } else { 305962306a36Sopenharmony_ci rtl_dbg(rtlpriv, COMP_RF, DBG_DMESG, 306062306a36Sopenharmony_ci "Set ERFON sleeping:%d ms\n", 306162306a36Sopenharmony_ci jiffies_to_msecs(jiffies - 306262306a36Sopenharmony_ci ppsc->last_sleep_jiffies)); 306362306a36Sopenharmony_ci ppsc->last_awake_jiffies = jiffies; 306462306a36Sopenharmony_ci rtl92ee_phy_set_rf_on(hw); 306562306a36Sopenharmony_ci } 306662306a36Sopenharmony_ci if (mac->link_state == MAC80211_LINKED) 306762306a36Sopenharmony_ci rtlpriv->cfg->ops->led_control(hw, LED_CTL_LINK); 306862306a36Sopenharmony_ci else 306962306a36Sopenharmony_ci rtlpriv->cfg->ops->led_control(hw, LED_CTL_NO_LINK); 307062306a36Sopenharmony_ci break; 307162306a36Sopenharmony_ci case ERFOFF: 307262306a36Sopenharmony_ci for (queue_id = 0, i = 0; 307362306a36Sopenharmony_ci queue_id < RTL_PCI_MAX_TX_QUEUE_COUNT;) { 307462306a36Sopenharmony_ci ring = &pcipriv->dev.tx_ring[queue_id]; 307562306a36Sopenharmony_ci if (queue_id == BEACON_QUEUE || 307662306a36Sopenharmony_ci skb_queue_len(&ring->queue) == 0) { 307762306a36Sopenharmony_ci queue_id++; 307862306a36Sopenharmony_ci continue; 307962306a36Sopenharmony_ci } else { 308062306a36Sopenharmony_ci rtl_dbg(rtlpriv, COMP_ERR, DBG_WARNING, 308162306a36Sopenharmony_ci "eRf Off/Sleep: %d times TcbBusyQueue[%d] =%d before doze!\n", 308262306a36Sopenharmony_ci (i + 1), queue_id, 308362306a36Sopenharmony_ci skb_queue_len(&ring->queue)); 308462306a36Sopenharmony_ci 308562306a36Sopenharmony_ci udelay(10); 308662306a36Sopenharmony_ci i++; 308762306a36Sopenharmony_ci } 308862306a36Sopenharmony_ci if (i >= MAX_DOZE_WAITING_TIMES_9x) { 308962306a36Sopenharmony_ci rtl_dbg(rtlpriv, COMP_ERR, DBG_WARNING, 309062306a36Sopenharmony_ci "\n ERFSLEEP: %d times TcbBusyQueue[%d] = %d !\n", 309162306a36Sopenharmony_ci MAX_DOZE_WAITING_TIMES_9x, 309262306a36Sopenharmony_ci queue_id, 309362306a36Sopenharmony_ci skb_queue_len(&ring->queue)); 309462306a36Sopenharmony_ci break; 309562306a36Sopenharmony_ci } 309662306a36Sopenharmony_ci } 309762306a36Sopenharmony_ci 309862306a36Sopenharmony_ci if (ppsc->reg_rfps_level & RT_RF_OFF_LEVL_HALT_NIC) { 309962306a36Sopenharmony_ci rtl_dbg(rtlpriv, COMP_RF, DBG_DMESG, 310062306a36Sopenharmony_ci "IPS Set eRf nic disable\n"); 310162306a36Sopenharmony_ci rtl_ps_disable_nic(hw); 310262306a36Sopenharmony_ci RT_SET_PS_LEVEL(ppsc, RT_RF_OFF_LEVL_HALT_NIC); 310362306a36Sopenharmony_ci } else { 310462306a36Sopenharmony_ci if (ppsc->rfoff_reason == RF_CHANGE_BY_IPS) { 310562306a36Sopenharmony_ci rtlpriv->cfg->ops->led_control(hw, 310662306a36Sopenharmony_ci LED_CTL_NO_LINK); 310762306a36Sopenharmony_ci } else { 310862306a36Sopenharmony_ci rtlpriv->cfg->ops->led_control(hw, 310962306a36Sopenharmony_ci LED_CTL_POWER_OFF); 311062306a36Sopenharmony_ci } 311162306a36Sopenharmony_ci } 311262306a36Sopenharmony_ci break; 311362306a36Sopenharmony_ci case ERFSLEEP: 311462306a36Sopenharmony_ci if (ppsc->rfpwr_state == ERFOFF) 311562306a36Sopenharmony_ci break; 311662306a36Sopenharmony_ci for (queue_id = 0, i = 0; 311762306a36Sopenharmony_ci queue_id < RTL_PCI_MAX_TX_QUEUE_COUNT;) { 311862306a36Sopenharmony_ci ring = &pcipriv->dev.tx_ring[queue_id]; 311962306a36Sopenharmony_ci if (skb_queue_len(&ring->queue) == 0) { 312062306a36Sopenharmony_ci queue_id++; 312162306a36Sopenharmony_ci continue; 312262306a36Sopenharmony_ci } else { 312362306a36Sopenharmony_ci rtl_dbg(rtlpriv, COMP_ERR, DBG_WARNING, 312462306a36Sopenharmony_ci "eRf Off/Sleep: %d times TcbBusyQueue[%d] =%d before doze!\n", 312562306a36Sopenharmony_ci (i + 1), queue_id, 312662306a36Sopenharmony_ci skb_queue_len(&ring->queue)); 312762306a36Sopenharmony_ci udelay(10); 312862306a36Sopenharmony_ci i++; 312962306a36Sopenharmony_ci } 313062306a36Sopenharmony_ci if (i >= MAX_DOZE_WAITING_TIMES_9x) { 313162306a36Sopenharmony_ci rtl_dbg(rtlpriv, COMP_ERR, DBG_WARNING, 313262306a36Sopenharmony_ci "\n ERFSLEEP: %d times TcbBusyQueue[%d] = %d !\n", 313362306a36Sopenharmony_ci MAX_DOZE_WAITING_TIMES_9x, 313462306a36Sopenharmony_ci queue_id, 313562306a36Sopenharmony_ci skb_queue_len(&ring->queue)); 313662306a36Sopenharmony_ci break; 313762306a36Sopenharmony_ci } 313862306a36Sopenharmony_ci } 313962306a36Sopenharmony_ci rtl_dbg(rtlpriv, COMP_RF, DBG_DMESG, 314062306a36Sopenharmony_ci "Set ERFSLEEP awaked:%d ms\n", 314162306a36Sopenharmony_ci jiffies_to_msecs(jiffies - 314262306a36Sopenharmony_ci ppsc->last_awake_jiffies)); 314362306a36Sopenharmony_ci ppsc->last_sleep_jiffies = jiffies; 314462306a36Sopenharmony_ci _rtl92ee_phy_set_rf_sleep(hw); 314562306a36Sopenharmony_ci break; 314662306a36Sopenharmony_ci default: 314762306a36Sopenharmony_ci rtl_dbg(rtlpriv, COMP_ERR, DBG_LOUD, 314862306a36Sopenharmony_ci "switch case %#x not processed\n", rfpwr_state); 314962306a36Sopenharmony_ci bresult = false; 315062306a36Sopenharmony_ci break; 315162306a36Sopenharmony_ci } 315262306a36Sopenharmony_ci if (bresult) 315362306a36Sopenharmony_ci ppsc->rfpwr_state = rfpwr_state; 315462306a36Sopenharmony_ci return bresult; 315562306a36Sopenharmony_ci} 315662306a36Sopenharmony_ci 315762306a36Sopenharmony_cibool rtl92ee_phy_set_rf_power_state(struct ieee80211_hw *hw, 315862306a36Sopenharmony_ci enum rf_pwrstate rfpwr_state) 315962306a36Sopenharmony_ci{ 316062306a36Sopenharmony_ci struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw)); 316162306a36Sopenharmony_ci 316262306a36Sopenharmony_ci bool bresult = false; 316362306a36Sopenharmony_ci 316462306a36Sopenharmony_ci if (rfpwr_state == ppsc->rfpwr_state) 316562306a36Sopenharmony_ci return bresult; 316662306a36Sopenharmony_ci bresult = _rtl92ee_phy_set_rf_power_state(hw, rfpwr_state); 316762306a36Sopenharmony_ci return bresult; 316862306a36Sopenharmony_ci} 3169